@arco-design/web-react
Version:
Arco Design React UI Library.
112 lines (111 loc) • 4.04 kB
JavaScript
import { isArray } from '../_util/is';
import Store from './base/store';
export var ValueSeparator = '__arco_cascader__';
export var SHOW_PARENT = 'parent';
export var SHOW_CHILD = 'child';
export var PANEL_MODE = {
cascader: 'cascader',
select: 'select',
};
export function isEmptyValue(value) {
return !value || (isArray(value) && value.length === 0);
}
export function getConfig(props) {
return {
showEmptyChildren: props.showEmptyChildren,
changeOnSelect: props.changeOnSelect,
lazyload: !!props.loadMore,
fieldNames: props.fieldNames,
filterOption: props.filterOption,
showParent: props.mode === 'multiple' && !props.changeOnSelect && props.checkedStrategy === SHOW_PARENT,
};
}
export function getStore(props, value) {
var tmp = value ? (Array.isArray(value[0]) ? value : [value]) : [];
return new Store(props.options || [], tmp, getConfig(props));
}
export var transformValuesToSet = function (values) {
var _values = values || [];
var valuesSet = _values.reduce(function (set, next) {
// 'next' could be a string.
set.add([].concat(next).join(ValueSeparator));
return set;
}, new Set());
return valuesSet;
};
export var valueInSet = function (set, value) {
var _value = value || [];
return set.has(_value.join(ValueSeparator));
};
export var removeValueFromSet = function (set, value) {
var _value = value || [];
return set.delete(_value.join(ValueSeparator));
};
export var formatValue = function (value, isMultiple, store) {
var _value = [];
if (value === undefined) {
_value = [];
}
else if (isMultiple) {
_value = value;
}
else {
_value = [value];
}
if (store && store.config.showParent) {
var checkedNodes = store.getCheckedNodes();
var valuesSet_1 = transformValuesToSet(checkedNodes.map(function (node) { return node.pathValue; }));
var result_1 = [];
var temp_1 = {};
_value.map(function (v) {
v.some(function (_, index, arr) {
var curVal = arr.slice(0, index + 1);
var pass = valueInSet(valuesSet_1, curVal);
if (pass && !temp_1[curVal.join(ValueSeparator)]) {
result_1.push(curVal);
temp_1[curVal.join(ValueSeparator)] = 1;
}
return pass;
});
});
return result_1;
}
return _value;
};
// change check status to false
var deny2Checked = function (option) {
var deny = function (options) {
return !Array.isArray(options)
? false
: options.every(function (item) {
if (item._checked || item.disabled) {
return true;
}
return deny(item.children);
});
};
return option._halfChecked && deny(option === null || option === void 0 ? void 0 : option.children);
};
export var getMultipleCheckValue = function (propsValue, store, option, _checked) {
var checked = _checked && deny2Checked(option) ? false : _checked;
var beforeValueSet = store.getCheckedNodes().reduce(function (set, node) {
set.add(node.pathValue.join(ValueSeparator));
return set;
}, new Set());
option.setCheckedState(checked);
var checkedNodes = store.getCheckedNodes();
var currentValue = checkedNodes.map(function (node) { return node.pathValue; });
var currentValueSet = transformValuesToSet(currentValue);
var newValueSet = new Set();
return propsValue
.filter(function (v) {
// v 不在 beforeValueSet 中,说明 v 不包含对应的option。直接返回true,不应该清除掉。
if (!valueInSet(beforeValueSet, v) || valueInSet(currentValueSet, v)) {
newValueSet.add(v.join(ValueSeparator));
return true;
}
})
.concat(currentValue.filter(function (v) {
return !valueInSet(newValueSet, v);
}));
};