vxe-table-select-area
Version:
一个基于 vxe-table 的可区域选中复制、粘贴的组件
692 lines (691 loc) • 24.8 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 _size = _interopRequireDefault(require("../../mixins/size"));
var _vXETable = _interopRequireDefault(require("../../v-x-e-table"));
var _utils = require("../../tools/utils");
var _dom = _interopRequireWildcard(require("../../tools/dom"));
var _util = require("./util");
var _log = require("../../tools/log");
var _formConfigItem = _interopRequireDefault(require("./form-config-item"));
var _index = _interopRequireDefault(require("../../loading/index"));
var _vn = require("../../tools/vn");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return 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.min,
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;
}
function getResetValue(value, resetValue) {
if (_xeUtils["default"].isArray(value)) {
resetValue = [];
}
return resetValue;
}
var _default2 = {
name: 'VxeForm',
mixins: [_size["default"]],
props: {
collapseStatus: {
type: Boolean,
"default": true
},
loading: Boolean,
data: Object,
size: {
type: String,
"default": function _default() {
return _conf["default"].form.size || _conf["default"].size;
}
},
span: {
type: [String, Number],
"default": function _default() {
return _conf["default"].form.span;
}
},
align: {
type: String,
"default": function _default() {
return _conf["default"].form.align;
}
},
titleAlign: {
type: String,
"default": function _default() {
return _conf["default"].form.titleAlign;
}
},
titleWidth: {
type: [String, Number],
"default": function _default() {
return _conf["default"].form.titleWidth;
}
},
titleColon: {
type: Boolean,
"default": function _default() {
return _conf["default"].form.titleColon;
}
},
titleAsterisk: {
type: Boolean,
"default": function _default() {
return _conf["default"].form.titleAsterisk;
}
},
titleOverflow: {
type: [Boolean, String],
"default": null
},
className: [String, Function],
readonly: Boolean,
items: Array,
rules: Object,
preventSubmit: {
type: Boolean,
"default": function _default() {
return _conf["default"].form.preventSubmit;
}
},
validConfig: Object,
tooltipConfig: Object,
customLayout: {
type: Boolean,
"default": function _default() {
return _conf["default"].form.customLayout;
}
}
},
inject: {
$xegrid: {
"default": null
}
},
data: function data() {
return {
collapseAll: this.collapseStatus,
staticItems: [],
formItems: [],
tooltipTimeout: null,
tooltipStore: {
item: null,
visible: false
}
};
},
provide: function provide() {
return {
$xeform: this,
$xeformgather: null,
$xeformitem: null,
$xeformiteminfo: null
};
},
computed: {
xegrid: function xegrid() {
return this.$xegrid;
},
validOpts: function validOpts() {
return Object.assign({}, _conf["default"].form.validConfig, this.validConfig);
},
tooltipOpts: function tooltipOpts() {
return Object.assign({}, _conf["default"].tooltip, _conf["default"].form.tooltipConfig, this.tooltipConfig);
}
},
watch: {
staticItems: function staticItems(value) {
this.formItems = value;
},
items: function items(value) {
this.loadItem(value);
},
collapseStatus: function collapseStatus(value) {
this.collapseAll = !!value;
}
},
created: function created() {
var _this = this;
this.$nextTick(function () {
var items = _this.items;
if (process.env.NODE_ENV === 'development') {
if (_this.customLayout && _this.items) {
(0, _log.errLog)('vxe.error.errConflicts', ['custom-layout', 'items']);
}
}
if (items) {
_this.loadItem(items);
}
});
},
render: function render(h) {
var _ref;
var _e = this._e,
loading = this.loading,
className = this.className,
data = this.data,
vSize = this.vSize,
tooltipOpts = this.tooltipOpts,
formItems = this.formItems,
customLayout = this.customLayout;
var hasUseTooltip = _vXETable["default"]._tooltip;
var defaultSlot = this.$scopedSlots["default"];
return h('form', {
"class": ['vxe-form', className ? _xeUtils["default"].isFunction(className) ? className({
items: formItems,
data: data,
$form: this
}) : className : '', (_ref = {}, _defineProperty(_ref, "size--".concat(vSize), vSize), _defineProperty(_ref, 'is--loading', loading), _ref)],
on: {
submit: this.submitEvent,
reset: this.resetEvent
}
}, [h('div', {
"class": 'vxe-form--wrapper vxe-row'
}, customLayout ? defaultSlot ? defaultSlot.call(this, h, {}) : [] : formItems.map(function (item, index) {
return h(_formConfigItem["default"], {
key: index,
props: {
itemConfig: item
}
});
})), h('div', {
"class": 'vxe-form-slots',
ref: 'hideItem'
}, customLayout ? [] : defaultSlot ? defaultSlot.call(this, h, {}) : []),
/**
* 加载中
*/
h(_index["default"], {
"class": 'vxe-form--loading',
props: {
value: loading
}
}),
/**
* 工具提示
*/
hasUseTooltip ? h('vxe-tooltip', {
ref: 'tooltip',
props: tooltipOpts
}) : _e()]);
},
methods: {
dispatchEvent: function dispatchEvent(type, params, evnt) {
this.$emit(type, Object.assign({
$form: this,
$grid: this.xegrid,
$event: evnt
}, params));
},
callSlot: function callSlot(slotFunc, params, h) {
if (slotFunc) {
var $scopedSlots = this.$scopedSlots;
if (_xeUtils["default"].isString(slotFunc)) {
slotFunc = $scopedSlots[slotFunc] || null;
}
if (_xeUtils["default"].isFunction(slotFunc)) {
return (0, _vn.getSlotVNs)(slotFunc.call(this, params, h));
}
}
return [];
},
loadItem: function loadItem(list) {
var _this2 = this;
if (process.env.NODE_ENV === 'development') {
var $scopedSlots = this.$scopedSlots;
list.forEach(function (item) {
if (item.slots) {
_xeUtils["default"].each(item.slots, function (func) {
if (!_xeUtils["default"].isFunction(func)) {
if (!$scopedSlots[func]) {
(0, _log.errLog)('vxe.error.notSlot', [func]);
}
}
});
}
});
}
this.staticItems = _xeUtils["default"].mapTree(list, function (item) {
return (0, _util.createItem)(_this2, item);
}, {
children: 'children'
});
return this.$nextTick();
},
getItems: function getItems() {
var itemList = [];
_xeUtils["default"].eachTree(this.formItems, function (item) {
itemList.push(item);
}, {
children: 'children'
});
return itemList;
},
getItemByField: function getItemByField(field) {
var rest = _xeUtils["default"].findTree(this.formItems, function (item) {
return item.field === field;
}, {
children: 'children'
});
return rest ? rest.item : null;
},
toggleCollapse: function toggleCollapse() {
var status = !this.collapseAll;
this.collapseAll = status;
this.$emit('update:collapseStatus', status);
return this.$nextTick();
},
toggleCollapseEvent: function toggleCollapseEvent(evnt) {
this.toggleCollapse();
var status = this.collapseAll;
this.dispatchEvent('toggle-collapse', {
status: status,
collapse: status,
data: this.data
}, evnt);
this.dispatchEvent('collapse', {
status: status,
collapse: status,
data: this.data
}, evnt);
},
submitEvent: function submitEvent(evnt) {
var _this3 = this;
evnt.preventDefault();
if (!this.preventSubmit) {
this.clearValidate();
this.beginValidate(this.getItems()).then(function (errMap) {
if (errMap) {
_this3.dispatchEvent('submit-invalid', {
data: _this3.data,
errMap: errMap
}, evnt);
} else {
_this3.dispatchEvent('submit', {
data: _this3.data
}, evnt);
}
});
}
},
reset: function reset() {
var _this4 = this;
var data = this.data;
if (data) {
var itemList = this.getItems();
itemList.forEach(function (item) {
var field = item.field,
resetValue = item.resetValue,
itemRender = item.itemRender;
if ((0, _utils.isEnableConf)(itemRender)) {
var compConf = _vXETable["default"].renderer.get(itemRender.name);
if (compConf && compConf.itemResetMethod) {
compConf.itemResetMethod({
data: data,
field: field,
property: field,
item: item,
$form: _this4,
$grid: _this4.xegrid
});
} else if (field) {
_xeUtils["default"].set(data, field, resetValue === null ? getResetValue(_xeUtils["default"].get(data, field), undefined) : _xeUtils["default"].clone(resetValue, true));
}
}
});
}
return this.clearValidate();
},
resetEvent: function resetEvent(evnt) {
evnt.preventDefault();
this.reset();
this.dispatchEvent('reset', {
data: this.data
}, evnt);
},
closeTooltip: function closeTooltip() {
var tooltipStore = this.tooltipStore;
var $tooltip = this.$refs.tooltip;
if (tooltipStore.visible) {
Object.assign(tooltipStore, {
item: null,
visible: false
});
if ($tooltip) {
$tooltip.close();
}
}
return this.$nextTick();
},
triggerTitleTipEvent: function triggerTitleTipEvent(evnt, params) {
var item = params.item;
var tooltipStore = this.tooltipStore;
var $tooltip = this.$refs.tooltip;
var overflowElem = evnt.currentTarget.children[0];
var content = (overflowElem.textContent || '').trim();
var isCellOverflow = overflowElem.scrollWidth > overflowElem.clientWidth;
clearTimeout(this.tooltipTimeout);
if (tooltipStore.item !== item) {
this.closeTooltip();
}
if (content && isCellOverflow) {
Object.assign(tooltipStore, {
item: item,
visible: true
});
if ($tooltip) {
$tooltip.open(overflowElem, content);
}
}
},
handleTitleTipLeaveEvent: function handleTitleTipLeaveEvent() {
var _this5 = this;
var tooltipOpts = this.tooltipOpts;
var $tooltip = this.$refs.tooltip;
if ($tooltip) {
$tooltip.setActived(false);
}
if (tooltipOpts.enterable) {
this.tooltipTimeout = setTimeout(function () {
$tooltip = _this5.$refs.tooltip;
if ($tooltip && !$tooltip.isActived()) {
_this5.closeTooltip();
}
}, tooltipOpts.leaveDelay);
} else {
this.closeTooltip();
}
},
clearValidate: function clearValidate(fieldOrItem) {
if (fieldOrItem) {
var item = (0, _util.handleFieldOrItem)(this, fieldOrItem);
if (item) {
item.showError = false;
}
} else {
this.getItems().forEach(function (item) {
item.showError = false;
});
}
return this.$nextTick();
},
validate: function validate(callback) {
this.clearValidate();
return this.beginValidate(this.getItems(), '', callback);
},
validateField: function validateField(fieldOrItem, callback) {
var item = (0, _util.handleFieldOrItem)(this, fieldOrItem);
return this.beginValidate(item ? [item] : [], '', callback);
},
beginValidate: function beginValidate(itemList, type, callback) {
var _this6 = this;
var data = this.data,
formRules = this.rules,
validOpts = this.validOpts;
var validRest = {};
var validFields = [];
var itemValids = [];
clearTimeout(this.showErrTime);
if (data && formRules) {
itemList.forEach(function (item) {
var field = item.field;
if (field && !(0, _util.isHiddenItem)(_this6, item) && (0, _util.isActivetem)(_this6, item)) {
itemValids.push(_this6.validItemRules(type || 'all', field).then(function () {
item.errRule = null;
})["catch"](function (_ref2) {
var rule = _ref2.rule,
rules = _ref2.rules;
var rest = {
rule: rule,
rules: rules,
data: data,
field: field,
property: field,
$form: _this6
};
if (!validRest[field]) {
validRest[field] = [];
}
validRest[field].push(rest);
validFields.push(field);
item.errRule = rule;
return Promise.reject(rest);
}));
}
});
return Promise.all(itemValids).then(function () {
if (callback) {
callback();
}
})["catch"](function () {
return new Promise(function (resolve) {
_this6.showErrTime = setTimeout(function () {
itemList.forEach(function (item) {
if (item.errRule) {
item.showError = true;
}
});
}, 20);
if (validOpts.autoPos) {
_this6.$nextTick(function () {
_this6.handleFocus(validFields);
});
}
if (callback) {
callback(validRest);
resolve();
} else {
resolve(validRest);
}
});
});
}
if (callback) {
callback();
}
return Promise.resolve();
},
/**
* 校验数据
* 按表格行、列顺序依次校验(同步或异步)
* 校验规则根据索引顺序依次校验,如果是异步则会等待校验完成才会继续校验下一列
* 如果校验失败则,触发回调或者 Promise<(ErrMap 校验不通过列的信息)>
* 如果是传回调方式这返回一个 (ErrMap 校验不通过列的信息)
*
* rule 配置:
* required=Boolean 是否必填
* min=Number 最小长度
* max=Number 最大长度
* validator=Function({ itemValue, rule, rules, data, property }) 自定义校验,接收一个 Promise
* trigger=change 触发方式
*/
validItemRules: function validItemRules(validType, property, val) {
var _this7 = this;
var data = this.data,
formRules = this.rules;
var errorRules = [];
var syncVailds = [];
if (property && formRules) {
var rules = _xeUtils["default"].get(formRules, property);
if (rules) {
var itemValue = _xeUtils["default"].isUndefined(val) ? _xeUtils["default"].get(data, property) : val;
rules.forEach(function (rule) {
var type = rule.type,
trigger = rule.trigger,
required = rule.required;
if (validType === 'all' || !trigger || validType === rule.trigger) {
if (_xeUtils["default"].isFunction(rule.validator)) {
var customValid = rule.validator({
itemValue: itemValue,
rule: rule,
rules: rules,
data: data,
field: property,
property: property,
$form: _this7
});
if (customValid) {
if (_xeUtils["default"].isError(customValid)) {
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) {
errorRules.push(new Rule({
type: 'custom',
trigger: trigger,
content: e ? e.message : rule.content || rule.message,
rule: new Rule(rule)
}));
}));
}
}
} else {
var isArrType = type === 'array';
var hasEmpty = isArrType || _xeUtils["default"].isArray(itemValue) ? !_xeUtils["default"].isArray(itemValue) || !itemValue.length : (0, _utils.eqEmptyValue)(itemValue);
if (required ? hasEmpty || validErrorRuleValue(rule, itemValue) : !hasEmpty && validErrorRuleValue(rule, itemValue)) {
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);
}
});
},
handleFocus: function handleFocus(fields) {
var $el = this.$el;
for (var i = 0; i < fields.length; i++) {
var property = fields[i];
var item = this.getItemByField(property);
if (item && (0, _utils.isEnableConf)(item.itemRender)) {
var itemRender = item.itemRender;
var compConf = _vXETable["default"].renderer.get(itemRender.name);
var inputElem = void 0;
// 定位到第一个
if (!i) {
_dom["default"].scrollToView($el.querySelector(".".concat(item.id)));
}
// 如果指定了聚焦 class
if (itemRender.autofocus) {
inputElem = $el.querySelector(".".concat(item.id, " ").concat(itemRender.autofocus));
}
// 渲染器的聚焦处理
if (!inputElem && compConf && compConf.autofocus) {
inputElem = $el.querySelector(".".concat(item.id, " ").concat(compConf.autofocus));
}
if (inputElem) {
inputElem.focus();
// 保持一致行为,光标移到末端
if (_dom.browse.msie) {
var textRange = inputElem.createTextRange();
textRange.collapse(false);
textRange.select();
}
break;
}
}
}
},
triggerItemEvent: function triggerItemEvent(evnt, field, itemValue) {
var _this8 = this;
if (field) {
return this.validItemRules(evnt ? ['blur'].includes(evnt.type) ? 'blur' : 'change' : 'all', field, itemValue).then(function () {
_this8.clearValidate(field);
})["catch"](function (_ref3) {
var rule = _ref3.rule;
var item = _this8.getItemByField(field);
if (item) {
item.showError = true;
item.errRule = rule;
}
});
}
return this.$nextTick();
},
/**
* 更新项状态
* 如果组件值 v-model 发生 change 时,调用改函数用于更新某一项编辑状态
* 如果单元格配置了校验规则,则会进行校验
*/
updateStatus: function updateStatus(scope, itemValue) {
var field = scope.field;
return this.triggerItemEvent(new Event('change'), field, itemValue);
}
}
};
exports["default"] = _default2;