vxe-table-select-area
Version:
一个基于 vxe-table 的可区域选中复制、粘贴的组件
426 lines (424 loc) • 16.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _xeUtils = _interopRequireDefault(require("xe-utils"));
var _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf"));
var _utils = require("../../tools/utils");
var _dom = _interopRequireDefault(require("../../tools/dom"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
/**
* 校验规则
*/
var Rule = /*#__PURE__*/function () {
function Rule(rule) {
_classCallCheck(this, Rule);
Object.assign(this, {
$options: rule,
required: rule.required,
min: rule.min,
max: rule.max,
type: rule.type,
pattern: rule.pattern,
validator: rule.validator,
trigger: rule.trigger,
maxWidth: rule.maxWidth
});
}
/**
* 获取校验不通过的消息
* 支持国际化翻译
*/
_createClass(Rule, [{
key: "content",
get: function get() {
return (0, _utils.getFuncText)(this.$options.content || this.$options.message);
}
}, {
key: "message",
get: function get() {
return this.content;
}
}]);
return Rule;
}();
function validErrorRuleValue(rule, val) {
var type = rule.type,
min = rule.min,
max = rule.max,
pattern = rule.pattern;
var isNumType = type === 'number';
var numVal = isNumType ? _xeUtils["default"].toNumber(val) : _xeUtils["default"].getSize(val);
// 判断数值
if (isNumType && isNaN(val)) {
return true;
}
// 如果存在 min,判断最小值
if (!_xeUtils["default"].eqNull(min) && numVal < _xeUtils["default"].toNumber(min)) {
return true;
}
// 如果存在 max,判断最大值
if (!_xeUtils["default"].eqNull(max) && numVal > _xeUtils["default"].toNumber(max)) {
return true;
}
// 如果存在 pattern,正则校验
if (pattern && !(_xeUtils["default"].isRegExp(pattern) ? pattern : new RegExp(pattern)).test(val)) {
return true;
}
return false;
}
var _default = {
methods: {
/**
* 完整校验,和 validate 的区别就是会给有效数据中的每一行进行校验
*/
_fullValidate: function _fullValidate(rows, cb) {
return this.beginValidate(rows, cb, true);
},
/**
* 快速校验,如果存在记录不通过的记录,则返回不再继续校验(异步校验除外)
*/
_validate: function _validate(rows, cb) {
return this.beginValidate(rows, cb);
},
/**
* 聚焦到校验通过的单元格并弹出校验错误提示
*/
handleValidError: function handleValidError(params) {
var _this = this;
return new Promise(function (resolve) {
if (_this.validOpts.autoPos === false) {
_this.emitEvent('valid-error', params);
resolve();
} else {
_this.handleActived(params, {
type: 'valid-error',
trigger: 'call'
}).then(function () {
setTimeout(function () {
resolve(_this.showValidTooltip(params));
}, 10);
});
}
});
},
/**
* 对表格数据进行校验
* 如果不指定数据,则默认只校验临时变动的数据,例如新增或修改
* 如果传 true 则校验当前表格数据
* 如果传 row 指定行记录,则只验证传入的行
* 如果传 rows 为多行记录,则只验证传入的行
* 如果只传 callback 否则默认验证整个表格数据
* 返回 Promise 对象,或者使用回调方式
*/
beginValidate: function beginValidate(rows, cb, isFull) {
var _this2 = this;
var validRest = {};
var editRules = this.editRules,
afterFullData = this.afterFullData,
treeConfig = this.treeConfig,
treeOpts = this.treeOpts;
var vaildDatas;
if (rows === true) {
vaildDatas = afterFullData;
} else if (rows) {
if (_xeUtils["default"].isFunction(rows)) {
cb = rows;
} else {
vaildDatas = _xeUtils["default"].isArray(rows) ? rows : [rows];
}
}
if (!vaildDatas) {
vaildDatas = this.getInsertRecords().concat(this.getUpdateRecords());
}
var rowValids = [];
this.lastCallTime = Date.now();
this.validRuleErr = false; // 如果为快速校验,当存在某列校验不通过时将终止执行
this.clearValidate();
if (editRules) {
var columns = this.getColumns();
var handleVaild = function handleVaild(row) {
if (isFull || !_this2.validRuleErr) {
var colVailds = [];
columns.forEach(function (column) {
if ((isFull || !_this2.validRuleErr) && _xeUtils["default"].has(editRules, column.property)) {
colVailds.push(_this2.validCellRules('all', row, column)["catch"](function (_ref) {
var rule = _ref.rule,
rules = _ref.rules;
var rest = {
rule: rule,
rules: rules,
rowIndex: _this2.getRowIndex(row),
row: row,
columnIndex: _this2.getColumnIndex(column),
column: column,
field: column.property,
$table: _this2
};
if (!validRest[column.property]) {
validRest[column.property] = [];
}
validRest[column.property].push(rest);
if (!isFull) {
_this2.validRuleErr = true;
return Promise.reject(rest);
}
}));
}
});
rowValids.push(Promise.all(colVailds));
}
};
if (treeConfig) {
_xeUtils["default"].eachTree(vaildDatas, handleVaild, treeOpts);
} else {
vaildDatas.forEach(handleVaild);
}
return Promise.all(rowValids).then(function () {
var ruleProps = Object.keys(validRest);
return _this2.$nextTick().then(function () {
if (ruleProps.length) {
return Promise.reject(validRest[ruleProps[0]][0]);
}
if (cb) {
cb();
}
});
})["catch"](function (firstErrParams) {
return new Promise(function (resolve, reject) {
var finish = function finish() {
_this2.$nextTick(function () {
if (cb) {
cb(validRest);
resolve();
} else {
if (_conf["default"].validToReject === 'obsolete') {
// 已废弃,校验失败将不会执行catch
reject(validRest);
} else {
resolve(validRest);
}
}
});
};
var posAndFinish = function posAndFinish() {
firstErrParams.cell = _this2.getCell(firstErrParams.row, firstErrParams.column);
_dom["default"].scrollToView(firstErrParams.cell);
_this2.handleValidError(firstErrParams).then(finish);
};
/**
* 当校验不通过时
* 将表格滚动到可视区
* 由于提示信息至少需要占一行,定位向上偏移一行
*/
var row = firstErrParams.row;
var rowIndex = afterFullData.indexOf(row);
var locatRow = rowIndex > 0 ? afterFullData[rowIndex - 1] : row;
if (_this2.validOpts.autoPos === false) {
finish();
} else {
if (treeConfig) {
_this2.scrollToTreeRow(locatRow).then(posAndFinish);
} else {
_this2.scrollToRow(locatRow).then(posAndFinish);
}
}
});
});
}
return this.$nextTick().then(function () {
if (cb) {
cb();
}
});
},
hasCellRules: function hasCellRules(type, row, column) {
var editRules = this.editRules;
var property = column.property;
if (property && editRules) {
var rules = _xeUtils["default"].get(editRules, property);
return rules && _xeUtils["default"].find(rules, function (rule) {
return type === 'all' || !rule.trigger || type === rule.trigger;
});
}
return false;
},
/**
* 校验数据
* 按表格行、列顺序依次校验(同步或异步)
* 校验规则根据索引顺序依次校验,如果是异步则会等待校验完成才会继续校验下一列
* 如果校验失败则,触发回调或者Promise<不通过列的错误消息>
* 如果是传回调方式这返回一个校验不通过列的错误消息
*
* rule 配置:
* required=Boolean 是否必填
* min=Number 最小长度
* max=Number 最大长度
* validator=Function({ cellValue, rule, rules, row, column, rowIndex, columnIndex }) 自定义校验,接收一个 Promise
* trigger=blur|change 触发方式(除非特殊场景,否则默认为空就行)
*/
validCellRules: function validCellRules(validType, row, column, val) {
var _this3 = this;
var editRules = this.editRules;
var property = column.property;
var errorRules = [];
var syncVailds = [];
if (property && editRules) {
var rules = _xeUtils["default"].get(editRules, property);
if (rules) {
var cellValue = _xeUtils["default"].isUndefined(val) ? _xeUtils["default"].get(row, property) : val;
rules.forEach(function (rule) {
var type = rule.type,
trigger = rule.trigger,
required = rule.required;
if (validType === 'all' || !trigger || validType === trigger) {
if (_xeUtils["default"].isFunction(rule.validator)) {
var customValid = rule.validator({
cellValue: cellValue,
rule: rule,
rules: rules,
row: row,
rowIndex: _this3.getRowIndex(row),
column: column,
columnIndex: _this3.getColumnIndex(column),
field: column.property,
$table: _this3
});
if (customValid) {
if (_xeUtils["default"].isError(customValid)) {
_this3.validRuleErr = true;
errorRules.push(new Rule({
type: 'custom',
trigger: trigger,
content: customValid.message,
rule: new Rule(rule)
}));
} else if (customValid["catch"]) {
// 如果为异步校验(注:异步校验是并发无序的)
syncVailds.push(customValid["catch"](function (e) {
_this3.validRuleErr = true;
errorRules.push(new Rule({
type: 'custom',
trigger: trigger,
content: e && e.message ? e.message : rule.content || rule.message,
rule: new Rule(rule)
}));
}));
}
}
} else {
var isArrType = type === 'array';
var hasEmpty = isArrType || _xeUtils["default"].isArray(cellValue) ? !_xeUtils["default"].isArray(cellValue) || !cellValue.length : (0, _utils.eqEmptyValue)(cellValue);
if (required ? hasEmpty || validErrorRuleValue(rule, cellValue) : !hasEmpty && validErrorRuleValue(rule, cellValue)) {
_this3.validRuleErr = true;
errorRules.push(new Rule(rule));
}
}
}
});
}
}
return Promise.all(syncVailds).then(function () {
if (errorRules.length) {
var rest = {
rules: errorRules,
rule: errorRules[0]
};
return Promise.reject(rest);
}
});
},
_clearValidate: function _clearValidate() {
var validTip = this.$refs.validTip;
Object.assign(this.validStore, {
visible: false,
row: null,
column: null,
content: '',
rule: null
});
if (validTip && validTip.visible) {
validTip.close();
}
return this.$nextTick();
},
/**
* 触发校验
*/
triggerValidate: function triggerValidate(type) {
var _this4 = this;
var editConfig = this.editConfig,
editStore = this.editStore,
editRules = this.editRules,
validStore = this.validStore;
var actived = editStore.actived;
if (actived.row && editRules) {
var _actived$args = actived.args,
row = _actived$args.row,
column = _actived$args.column,
cell = _actived$args.cell;
if (this.hasCellRules(type, row, column)) {
return this.validCellRules(type, row, column).then(function () {
if (editConfig.mode === 'row') {
if (validStore.visible && validStore.row === row && validStore.column === column) {
_this4.clearValidate();
}
}
})["catch"](function (_ref2) {
var rule = _ref2.rule;
// 如果校验不通过与触发方式一致,则聚焦提示错误,否则跳过并不作任何处理
if (!rule.trigger || type === rule.trigger) {
var rest = {
rule: rule,
row: row,
column: column,
cell: cell
};
_this4.showValidTooltip(rest);
return Promise.reject(rest);
}
return Promise.resolve();
});
}
}
return Promise.resolve();
},
/**
* 弹出校验错误提示
*/
showValidTooltip: function showValidTooltip(params) {
var _this5 = this;
var $refs = this.$refs,
height = this.height,
tableData = this.tableData,
validOpts = this.validOpts;
var rule = params.rule,
row = params.row,
column = params.column,
cell = params.cell;
var validTip = $refs.validTip;
var content = rule.content;
return this.$nextTick(function () {
Object.assign(_this5.validStore, {
row: row,
column: column,
rule: rule,
content: content,
visible: true
});
_this5.emitEvent('valid-error', params);
if (validTip && (validOpts.message === 'tooltip' || validOpts.message === 'default' && !height && tableData.length < 2)) {
return validTip.open(cell, content);
}
});
}
}
};
exports["default"] = _default;