342 lines
10 KiB
JavaScript
342 lines
10 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
|
|
|
|
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
|
|
|
|
var _extends2 = require('babel-runtime/helpers/extends');
|
|
|
|
var _extends3 = _interopRequireDefault(_extends2);
|
|
|
|
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
|
|
|
|
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
|
|
|
var _createClass2 = require('babel-runtime/helpers/createClass');
|
|
|
|
var _createClass3 = _interopRequireDefault(_createClass2);
|
|
|
|
exports['default'] = createFieldsStore;
|
|
|
|
var _set = require('lodash/set');
|
|
|
|
var _set2 = _interopRequireDefault(_set);
|
|
|
|
var _createFormField = require('./createFormField');
|
|
|
|
var _createFormField2 = _interopRequireDefault(_createFormField);
|
|
|
|
var _utils = require('./utils');
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
function partOf(a, b) {
|
|
return b.indexOf(a) === 0 && ['.', '['].indexOf(b[a.length]) !== -1;
|
|
}
|
|
|
|
function internalFlattenFields(fields) {
|
|
return (0, _utils.flattenFields)(fields, function (_, node) {
|
|
return (0, _createFormField.isFormField)(node);
|
|
}, 'You must wrap field data with `createFormField`.');
|
|
}
|
|
|
|
var FieldsStore = function () {
|
|
function FieldsStore(fields) {
|
|
(0, _classCallCheck3['default'])(this, FieldsStore);
|
|
|
|
_initialiseProps.call(this);
|
|
|
|
this.fields = internalFlattenFields(fields);
|
|
this.fieldsMeta = {};
|
|
}
|
|
|
|
(0, _createClass3['default'])(FieldsStore, [{
|
|
key: 'updateFields',
|
|
value: function updateFields(fields) {
|
|
this.fields = internalFlattenFields(fields);
|
|
}
|
|
}, {
|
|
key: 'flattenRegisteredFields',
|
|
value: function flattenRegisteredFields(fields) {
|
|
var validFieldsName = this.getAllFieldsName();
|
|
return (0, _utils.flattenFields)(fields, function (path) {
|
|
return validFieldsName.indexOf(path) >= 0;
|
|
}, 'You cannot set a form field before rendering a field associated with the value. You can use `getFieldDecorator(id, options)` instead `v-decorator="[id, options]"` to register it before render.');
|
|
}
|
|
}, {
|
|
key: 'setFields',
|
|
value: function setFields(fields) {
|
|
var _this = this;
|
|
|
|
var fieldsMeta = this.fieldsMeta;
|
|
var nowFields = (0, _extends3['default'])({}, this.fields, fields);
|
|
var nowValues = {};
|
|
Object.keys(fieldsMeta).forEach(function (f) {
|
|
nowValues[f] = _this.getValueFromFields(f, nowFields);
|
|
});
|
|
Object.keys(nowValues).forEach(function (f) {
|
|
var value = nowValues[f];
|
|
var fieldMeta = _this.getFieldMeta(f);
|
|
if (fieldMeta && fieldMeta.normalize) {
|
|
var nowValue = fieldMeta.normalize(value, _this.getValueFromFields(f, _this.fields), nowValues);
|
|
if (nowValue !== value) {
|
|
nowFields[f] = (0, _extends3['default'])({}, nowFields[f], {
|
|
value: nowValue
|
|
});
|
|
}
|
|
}
|
|
});
|
|
this.fields = nowFields;
|
|
}
|
|
}, {
|
|
key: 'resetFields',
|
|
value: function resetFields(ns) {
|
|
var fields = this.fields;
|
|
|
|
var names = ns ? this.getValidFieldsFullName(ns) : this.getAllFieldsName();
|
|
return names.reduce(function (acc, name) {
|
|
var field = fields[name];
|
|
if (field && 'value' in field) {
|
|
acc[name] = {};
|
|
}
|
|
return acc;
|
|
}, {});
|
|
}
|
|
}, {
|
|
key: 'setFieldMeta',
|
|
value: function setFieldMeta(name, meta) {
|
|
this.fieldsMeta[name] = meta;
|
|
}
|
|
}, {
|
|
key: 'setFieldsAsDirty',
|
|
value: function setFieldsAsDirty() {
|
|
var _this2 = this;
|
|
|
|
Object.keys(this.fields).forEach(function (name) {
|
|
var field = _this2.fields[name];
|
|
var fieldMeta = _this2.fieldsMeta[name];
|
|
if (field && fieldMeta && (0, _utils.hasRules)(fieldMeta.validate)) {
|
|
_this2.fields[name] = (0, _extends3['default'])({}, field, {
|
|
dirty: true
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}, {
|
|
key: 'getFieldMeta',
|
|
value: function getFieldMeta(name) {
|
|
this.fieldsMeta[name] = this.fieldsMeta[name] || {};
|
|
return this.fieldsMeta[name];
|
|
}
|
|
}, {
|
|
key: 'getValueFromFields',
|
|
value: function getValueFromFields(name, fields) {
|
|
var field = fields[name];
|
|
if (field && 'value' in field) {
|
|
return field.value;
|
|
}
|
|
var fieldMeta = this.getFieldMeta(name);
|
|
return fieldMeta && fieldMeta.initialValue;
|
|
}
|
|
}, {
|
|
key: 'getValidFieldsName',
|
|
value: function getValidFieldsName() {
|
|
var _this3 = this;
|
|
|
|
var fieldsMeta = this.fieldsMeta;
|
|
|
|
return fieldsMeta ? Object.keys(fieldsMeta).filter(function (name) {
|
|
return !_this3.getFieldMeta(name).hidden;
|
|
}) : [];
|
|
}
|
|
}, {
|
|
key: 'getAllFieldsName',
|
|
value: function getAllFieldsName() {
|
|
var fieldsMeta = this.fieldsMeta;
|
|
|
|
return fieldsMeta ? Object.keys(fieldsMeta) : [];
|
|
}
|
|
}, {
|
|
key: 'getValidFieldsFullName',
|
|
value: function getValidFieldsFullName(maybePartialName) {
|
|
var maybePartialNames = Array.isArray(maybePartialName) ? maybePartialName : [maybePartialName];
|
|
return this.getValidFieldsName().filter(function (fullName) {
|
|
return maybePartialNames.some(function (partialName) {
|
|
return fullName === partialName || (0, _utils.startsWith)(fullName, partialName) && ['.', '['].indexOf(fullName[partialName.length]) >= 0;
|
|
});
|
|
});
|
|
}
|
|
}, {
|
|
key: 'getFieldValuePropValue',
|
|
value: function getFieldValuePropValue(fieldMeta) {
|
|
var name = fieldMeta.name,
|
|
getValueProps = fieldMeta.getValueProps,
|
|
valuePropName = fieldMeta.valuePropName;
|
|
|
|
var field = this.getField(name);
|
|
var fieldValue = 'value' in field ? field.value : fieldMeta.initialValue;
|
|
if (getValueProps) {
|
|
return getValueProps(fieldValue);
|
|
}
|
|
return (0, _defineProperty3['default'])({}, valuePropName, fieldValue);
|
|
}
|
|
}, {
|
|
key: 'getField',
|
|
value: function getField(name) {
|
|
return (0, _extends3['default'])({}, this.fields[name], {
|
|
name: name
|
|
});
|
|
}
|
|
}, {
|
|
key: 'getNotCollectedFields',
|
|
value: function getNotCollectedFields() {
|
|
var _this4 = this;
|
|
|
|
var fieldsName = this.getValidFieldsName();
|
|
return fieldsName.filter(function (name) {
|
|
return !_this4.fields[name];
|
|
}).map(function (name) {
|
|
return {
|
|
name: name,
|
|
dirty: false,
|
|
value: _this4.getFieldMeta(name).initialValue
|
|
};
|
|
}).reduce(function (acc, field) {
|
|
return (0, _set2['default'])(acc, field.name, (0, _createFormField2['default'])(field));
|
|
}, {});
|
|
}
|
|
}, {
|
|
key: 'getNestedAllFields',
|
|
value: function getNestedAllFields() {
|
|
var _this5 = this;
|
|
|
|
return Object.keys(this.fields).reduce(function (acc, name) {
|
|
return (0, _set2['default'])(acc, name, (0, _createFormField2['default'])(_this5.fields[name]));
|
|
}, this.getNotCollectedFields());
|
|
}
|
|
}, {
|
|
key: 'getFieldMember',
|
|
value: function getFieldMember(name, member) {
|
|
return this.getField(name)[member];
|
|
}
|
|
}, {
|
|
key: 'getNestedFields',
|
|
value: function getNestedFields(names, getter) {
|
|
var fields = names || this.getValidFieldsName();
|
|
return fields.reduce(function (acc, f) {
|
|
return (0, _set2['default'])(acc, f, getter(f));
|
|
}, {});
|
|
}
|
|
}, {
|
|
key: 'getNestedField',
|
|
value: function getNestedField(name, getter) {
|
|
var fullNames = this.getValidFieldsFullName(name);
|
|
if (fullNames.length === 0 || // Not registered
|
|
fullNames.length === 1 && fullNames[0] === name // Name already is full name.
|
|
) {
|
|
return getter(name);
|
|
}
|
|
var isArrayValue = fullNames[0][name.length] === '[';
|
|
var suffixNameStartIndex = isArrayValue ? name.length : name.length + 1;
|
|
return fullNames.reduce(function (acc, fullName) {
|
|
return (0, _set2['default'])(acc, fullName.slice(suffixNameStartIndex), getter(fullName));
|
|
}, isArrayValue ? [] : {});
|
|
}
|
|
}, {
|
|
key: 'isValidNestedFieldName',
|
|
|
|
|
|
// @private
|
|
// BG: `a` and `a.b` cannot be use in the same form
|
|
value: function isValidNestedFieldName(name) {
|
|
var names = this.getAllFieldsName();
|
|
return names.every(function (n) {
|
|
return !partOf(n, name) && !partOf(name, n);
|
|
});
|
|
}
|
|
}, {
|
|
key: 'clearField',
|
|
value: function clearField(name) {
|
|
delete this.fields[name];
|
|
delete this.fieldsMeta[name];
|
|
}
|
|
}]);
|
|
return FieldsStore;
|
|
}();
|
|
|
|
var _initialiseProps = function _initialiseProps() {
|
|
var _this6 = this;
|
|
|
|
this.setFieldsInitialValue = function (initialValues) {
|
|
var flattenedInitialValues = _this6.flattenRegisteredFields(initialValues);
|
|
var fieldsMeta = _this6.fieldsMeta;
|
|
Object.keys(flattenedInitialValues).forEach(function (name) {
|
|
if (fieldsMeta[name]) {
|
|
_this6.setFieldMeta(name, (0, _extends3['default'])({}, _this6.getFieldMeta(name), {
|
|
initialValue: flattenedInitialValues[name]
|
|
}));
|
|
}
|
|
});
|
|
};
|
|
|
|
this.getAllValues = function () {
|
|
var fieldsMeta = _this6.fieldsMeta,
|
|
fields = _this6.fields;
|
|
|
|
return Object.keys(fieldsMeta).reduce(function (acc, name) {
|
|
return (0, _set2['default'])(acc, name, _this6.getValueFromFields(name, fields));
|
|
}, {});
|
|
};
|
|
|
|
this.getFieldsValue = function (names) {
|
|
return _this6.getNestedFields(names, _this6.getFieldValue);
|
|
};
|
|
|
|
this.getFieldValue = function (name) {
|
|
var fields = _this6.fields;
|
|
|
|
return _this6.getNestedField(name, function (fullName) {
|
|
return _this6.getValueFromFields(fullName, fields);
|
|
});
|
|
};
|
|
|
|
this.getFieldsError = function (names) {
|
|
return _this6.getNestedFields(names, _this6.getFieldError);
|
|
};
|
|
|
|
this.getFieldError = function (name) {
|
|
return _this6.getNestedField(name, function (fullName) {
|
|
return (0, _utils.getErrorStrs)(_this6.getFieldMember(fullName, 'errors'));
|
|
});
|
|
};
|
|
|
|
this.isFieldValidating = function (name) {
|
|
return _this6.getFieldMember(name, 'validating');
|
|
};
|
|
|
|
this.isFieldsValidating = function (ns) {
|
|
var names = ns || _this6.getValidFieldsName();
|
|
return names.some(function (n) {
|
|
return _this6.isFieldValidating(n);
|
|
});
|
|
};
|
|
|
|
this.isFieldTouched = function (name) {
|
|
return _this6.getFieldMember(name, 'touched');
|
|
};
|
|
|
|
this.isFieldsTouched = function (ns) {
|
|
var names = ns || _this6.getValidFieldsName();
|
|
return names.some(function (n) {
|
|
return _this6.isFieldTouched(n);
|
|
});
|
|
};
|
|
};
|
|
|
|
function createFieldsStore(fields) {
|
|
return new FieldsStore(fields);
|
|
} |