@beisen/ethos
Version:
beisencloud pc react components
566 lines (487 loc) • 19.2 kB
JavaScript
'use strict';
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _class, _temp;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _bread = require('./bread.js');
var _bread2 = _interopRequireDefault(_bread);
var _resultsTip = require('./results-tip.js');
var _resultsTip2 = _interopRequireDefault(_resultsTip);
var _optionsItem = require('./options-item.js');
var _optionsItem2 = _interopRequireDefault(_optionsItem);
var _resultsItem = require('./results-item.js');
var _resultsItem2 = _interopRequireDefault(_resultsItem);
var _tabComponent = require('../tab-component');
var _tabComponent2 = _interopRequireDefault(_tabComponent);
var _commonFunc = require('../common-func');
require('./index.scss');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// 模拟空回调
function emptyFunc() {}
var defaultTranslation = {
nationWide: '全国省市',
foreignWide: '国外地区',
confirmText: '确定',
cancelText: '取消',
clearSelected: '清空已选',
AreaSelected: '已选地区'
};
var AreaSelect = (_temp = _class = function (_Component) {
(0, _inherits3.default)(AreaSelect, _Component);
function AreaSelect(props) {
(0, _classCallCheck3.default)(this, AreaSelect);
var _this = (0, _possibleConstructorReturn3.default)(this, (AreaSelect.__proto__ || (0, _getPrototypeOf2.default)(AreaSelect)).call(this, props));
_this.handleDefaultResults = function (data) {
// 判断id是否是国内id
var isChina = function isChina(id) {
var type = { "CHINA": 1 };
// id等于1代表全国, 国内id组成全部为偶数位, 判断id长度来判断是否是国内id
if (id === type.CHINA || id.toString().length % 2 === 0) {
return true;
}
return false;
};
/*
由于外部传入的已选数据仅包含id和name,在多级交互时会出现问题
所以在此处找到全数据中每一个已选数据并抛出
*/
try {
var arr = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)(data), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var i = _step.value;
var assignData = void 0,
//国内/国外城市信息
subIndex = void 0;
//国内国外都走一套逻辑, 但是参数有所不同. 不同的国家由三位数字判断, 但是国内不同城市由两位数字判断, 所以对应的 subIndex 不同
if (isChina(i.id)) {
assignData = (0, _commonFunc.deepClone)(_this.chinaData);
subIndex = 2;
} else {
assignData = (0, _commonFunc.deepClone)(_this.foreignData);
subIndex = 3;
}
var allLevelName = '';
for (var m = 0; m < assignData.length; m++) {
var item = assignData[m];
var subId = i.id.toString().substring(0, subIndex);
if (item.id == i.id) {
if (allLevelName.length > 0) item.name = allLevelName + item.name;
arr.push(item);
} else if (item.id.toString().length > 1 && item.id.toString().indexOf(subId) == 0 && item.childList) {
if (_this.props.allLevelDisplay) allLevelName += item.name + '/'; //全路径显示名称
assignData = item.childList; //循环遍历子集
m = -1; //当进入子集时会执行m++,如果是0的话会变成1
subIndex += 2; //每进入下一级,id长度会加2,所以此处subString的index也需加2
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return arr;
} catch (e) {
console.error("地区已选数据处理有误", e);
}
};
_this.sortData = function (data, isForeign) {
var _newData = [];
var _sortfunc = function _sortfunc(data, pIndex, isForeign) {
return data && data.map(function (item, index) {
var _pIndex = pIndex || '';
var _data = {
id: parseInt(item[0]),
name: item[1],
isChecked: false,
index: index,
isForeign: isForeign,
pIndex: _pIndex + index,
isMore: item.length > 2 ? true : false
};
_data.childList = item[2] && _sortfunc(item[2], _data.pIndex + '/', isForeign) || null;
return _data;
});
};
_newData = _sortfunc(data, null, isForeign);
return _newData;
};
_this.setResultsData = function (data) {
var _resultsData = _this.state.resultsData;
if (_this.props.isSingleSelect) {
_resultsData = data;
} else {
//合并数据,清空包含的子集数据,仅显示父级数据
if (_this.props.allowContainsChildren) {
var newData = [];
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = (0, _getIterator3.default)(_resultsData), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var i = _step2.value;
if (i.isForeign == data.isForeign) {
if (i.pIndex && i.pIndex.indexOf(data.pIndex + '/') != 0) {
newData.push(i);
}
} else {
newData.push(i);
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
_resultsData = newData;
// _resultsData = _resultsData.filter(item => item.pIndex && item.pIndex.indexOf(data.pIndex)!=0)
}
_resultsData.push(data);
}
_this.setState({
resultsData: _resultsData
}, _this.forceUpdate());
};
_this.clearResultsData = function (index) {
var breadlist = _this.state.breadlist;
var _resultsData = _this.state.resultsData;
if (index == undefined) {
_resultsData.length = 0;
breadlist.map(function (item) {
return item.isChecked = false;
});
} else {
//重置导航状态
if (_this.props.allowContainsChildren && !_this.props.isSingleSelect) {
breadlist.map(function (item) {
if (item.index.toString().split("/")[0] == _resultsData[index].pIndex.split("/")[0]) item.isChecked = false;
});
}
_resultsData.splice(index, 1);
}
_this.setState({ resultsData: _resultsData, breadlist: breadlist });
};
_this._findIndex = function () {
if (!Array.prototype.findIndex) {
Array.prototype.findIndex = function (predicate) {
if (this === null) {
throw new TypeError('Array.prototype.findIndex called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(this);
var length = list.length >>> 0;
var thisArg = arguments[1];
var value;
for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return i;
}
}
return -1;
};
}
};
_this.clearRSDataFromList = function (id, pIndex) {
var _index = _this.state.resultsData.findIndex(function (val, index, arr) {
return val.id == id;
});
if (_index != -1) {
_this.clearResultsData(_index, pIndex);
}
};
_this.getCurrentData = function () {
var _areaData = _this.state.currentAreaTab === 0 ? _this.chinaData : _this.foreignData;
var _lastBread = _this.state.breadlist[_this.state.breadlist.length - 1];
var _currentData = [];
switch (_this.state.breadlist.length) {
case 1:
_currentData = _areaData;
break;
case 2:
_currentData = _areaData[parseInt(_lastBread['index'])]['childList'];
if (_this.props.allLevelDisplay) {
_currentData.forEach(function (item) {
item.province = _areaData[parseInt(_lastBread['index'])].name;
});
}
break;
case 3:
var _pIndexArr = _lastBread.index.split('/');
_currentData = _areaData[parseInt(_pIndexArr[0])]['childList'][parseInt(_pIndexArr[1])]['childList'];
if (_this.props.allLevelDisplay) {
_currentData.forEach(function (item) {
item.province = _areaData[parseInt(_pIndexArr[0])].name;
item.area = _areaData[parseInt(_pIndexArr[0])]['childList'][parseInt(_pIndexArr[1])].name;
});
}
default:
break;
}
_this.setItemActive(_currentData, _lastBread);
};
_this.setItemActive = function (currentData, _lastBread) {
var _resultdIdArr = [];
_this.state.resultsData.forEach(function (item, index) {
_resultdIdArr.push(item.id);
});
currentData.forEach(function (item, index) {
item.isChecked = false;
if (_this.props.allowContainsChildren && !_this.props.isSingleSelect) item.disabled = false;
if (_resultdIdArr.length && _this.contains(_resultdIdArr, item.id)) {
item.isChecked = true;
}
});
// if(_lastBread.isChecked){
// currentData.map(item => {
// item.isChecked = true
// })
// }
_this.currentData = currentData;
};
_this.contains = function (arr, value) {
var _func = Array.prototype.includes ? function (_arr, _value) {
return _arr.includes(_value);
} : function (_arr, _value) {
return _arr.some(function (el) {
return el === _value;
});
};
return _func(arr, value);
};
_this.goNextLevel = function (name, id, pIndex, isChecked) {
var _breadData = _this.state.breadlist;
_breadData.push({ name: name, index: pIndex, isChecked: isChecked, id: id });
_this.setState({ breadlist: _breadData });
};
_this.changeLevel = function (index) {
var _breadData = _this.state.breadlist;
_breadData.length = index + 1;
_this.setState({ breadlist: _breadData });
};
_this.sureClick = function () {
_this.props.sureClick(_this.state.resultsData);
};
_this.cancelClick = function () {
_this.props.cancelClick();
};
_this.componentDidMount = function () {
_this._findIndex();
};
_this.handleAreaTabChange = function (key) {
_this.setState({
currentAreaTab: key,
breadlist: [{
name: key === 0 ? _this.translation.nationWide : _this.translation.foreignWide,
index: 0
}]
});
};
_this.translation = (0, _extends3.default)({}, defaultTranslation, props.translation);
var chinaData = void 0,
foreignData = void 0;
// 当数据源中有国外数据时,设置国外数据的值
if (props.data[1][0] === '2') {
chinaData = props.data.filter(function (_, i) {
return i !== 1;
});
// 切割国外数据,将国外与其他地区整理为并列的结构然后格式化数据
foreignData = _this.sortData([[props.data[1][0], props.data[1][1]]].concat((0, _toConsumableArray3.default)(props.data[1][2])), true);
} else {
chinaData = props.data;
}
chinaData = _this.sortData(chinaData);
_this.chinaData = chinaData; // 中国数据
_this.foreignData = foreignData || []; // 国外数据
_this.currentData = chinaData; // 当前需要渲染数据
_this.state = {
currentAreaTab: 0,
resultsData: props.defaultResults.length ? _this.handleDefaultResults(props.defaultResults) : [],
breadlist: [{
name: _this.translation.nationWide,
index: 0
}]
};
return _this;
}
// 对数据进行处理, 添加需要字段
// 将选中数据添加到results中
// 清空results
// 反向清除results item 从 地区列表中
// 获取currentData 根据Breaddata
// 每次渲染时根据 已选中数据 控制item状态
// 方法 判断某数据中是否存在某个值
// 进入子级 地区
// 面包屑跳转
// 确定按钮点击
(0, _createClass3.default)(AreaSelect, [{
key: 'render',
value: function render() {
var _this2 = this;
var data = this.props.data;
var currentAreaTab = this.state.currentAreaTab;
this.getCurrentData();
// 面包屑数据
var _breadListData = {
breadlist: this.state.breadlist,
changeLevel: this.changeLevel
};
var _tabComponentData = {
bsStyle: 'tabs',
activeKey: currentAreaTab,
tabItems: [{
idx: 'tab0',
eventKey: 0,
title: data[0][1],
active: currentAreaTab === 0
}],
callBack: this.handleAreaTabChange
};
if (this.foreignData.length > 0) {
_tabComponentData.tabItems.push({
idx: 'tab1',
eventKey: 1,
title: data[1][1],
active: currentAreaTab === 1
});
}
//选中父级,子集也选中
if (this.props.allowContainsChildren && !this.props.isSingleSelect) {
var pIndex = "";
for (var i = 0; i < this.state.breadlist.length - 1; i++) {
//根据面包屑数据获取pIndex
pIndex = pIndex + (pIndex == "" ? "" : "/") + this.currentData[0].pIndex.split("/")[i];
}
var lastBreadData = this.state.breadlist[this.state.breadlist.length - 1];
//判断进入下一级时父级是否被选中
if (this.state.resultsData.filter(function (item) {
return (_this2.state.currentAreaTab ? item.isForeign : !item.isForeign) && item.pIndex == pIndex;
}).length > 0 || lastBreadData.isChecked && lastBreadData.index == pIndex) {
this.currentData.map(function (item) {
item.isChecked = true;
item.disabled = true;
});
}
}
// 地区列表 数据
var _optionsItemData = {
isSingleSelect: this.props.isSingleSelect,
totalCount: this.props.totalCount,
resultsData: this.state.resultsData,
currentData: this.currentData,
goNextLevel: this.goNextLevel,
setResultsData: this.setResultsData,
clearRSDataFromList: this.clearRSDataFromList,
hiddenTip: this.props.hiddenTip,
sideTip: this.props.sideTip,
allLevelDisplay: this.props.allLevelDisplay
// 已选地区提示 数据
};var _resultTipData = {
totalCount: this.props.totalCount,
hasCount: this.state.resultsData.length,
clearResultsData: this.clearResultsData,
translation: this.translation
// 已选地区列表 数据
};var _resultItemData = {
resultsData: this.state.resultsData,
clearResultsData: this.clearResultsData,
hiddenTip: this.props.hiddenTip,
sideTip: this.props.sideTip,
translation: this.translation
};
return _react2.default.createElement(
'div',
{ className: 'area-select', style: this.props.offset },
_react2.default.createElement(
'div',
{ className: 'area-select__container' },
_react2.default.createElement(
'div',
{ className: 'area-select__content_left' },
_react2.default.createElement(_tabComponent2.default, _tabComponentData),
_react2.default.createElement(_bread2.default, _breadListData),
_react2.default.createElement(
'div',
{ className: 'area-select__select-container' },
_react2.default.createElement(_optionsItem2.default, _optionsItemData)
)
),
_react2.default.createElement(
'div',
{ className: 'area-select__content_right' },
_react2.default.createElement(_resultsTip2.default, _resultTipData),
_react2.default.createElement(
'div',
{ className: 'area-select__results-content' },
_react2.default.createElement(_resultsItem2.default, _resultItemData)
)
)
),
_react2.default.createElement(
'div',
{ className: 'btn-group area-select__footer' },
_react2.default.createElement(
'button',
{ className: 'btn btn_weaken btn_sm', onClick: this.cancelClick },
this.translation.cancelText
),
_react2.default.createElement(
'button',
{ className: 'btn btn_default btn_sm', onClick: this.sureClick },
this.translation.confirmText
)
)
);
}
}]);
return AreaSelect;
}(_react.Component), _class.defaultProps = {
isSingleSelect: false,
totalCount: 1,
offset: {},
defaultResults: [],
sureClick: emptyFunc,
cancelClick: emptyFunc,
hiddenTip: false,
sideTip: false
}, _temp);
module.exports = AreaSelect;