vant
Version:
Mobile UI Components built on Vue
285 lines (248 loc) • 7.59 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _utils = require("../utils");
var _tab = _interopRequireDefault(require("../tab"));
var _tabs = _interopRequireDefault(require("../tabs"));
var _icon = _interopRequireDefault(require("../icon"));
var _createNamespace = (0, _utils.createNamespace)('cascader'),
createComponent = _createNamespace[0],
bem = _createNamespace[1],
t = _createNamespace[2];
var _default2 = createComponent({
props: {
title: String,
value: [Number, String],
fieldNames: Object,
placeholder: String,
activeColor: String,
options: {
type: Array,
default: function _default() {
return [];
}
},
closeable: {
type: Boolean,
default: true
}
},
data: function data() {
return {
tabs: [],
activeTab: 0
};
},
computed: {
textKey: function textKey() {
var _this$fieldNames;
return ((_this$fieldNames = this.fieldNames) == null ? void 0 : _this$fieldNames.text) || 'text';
},
valueKey: function valueKey() {
var _this$fieldNames2;
return ((_this$fieldNames2 = this.fieldNames) == null ? void 0 : _this$fieldNames2.value) || 'value';
},
childrenKey: function childrenKey() {
var _this$fieldNames3;
return ((_this$fieldNames3 = this.fieldNames) == null ? void 0 : _this$fieldNames3.children) || 'children';
}
},
watch: {
options: {
deep: true,
handler: 'updateTabs'
},
value: function value(_value) {
var _this = this;
if (_value || _value === 0) {
var values = this.tabs.map(function (tab) {
var _tab$selectedOption;
return (_tab$selectedOption = tab.selectedOption) == null ? void 0 : _tab$selectedOption[_this.valueKey];
});
if (values.indexOf(_value) !== -1) {
return;
}
}
this.updateTabs();
}
},
created: function created() {
this.updateTabs();
},
methods: {
getSelectedOptionsByValue: function getSelectedOptionsByValue(options, value) {
for (var i = 0; i < options.length; i++) {
var option = options[i];
if (option[this.valueKey] === value) {
return [option];
}
if (option[this.childrenKey]) {
var selectedOptions = this.getSelectedOptionsByValue(option[this.childrenKey], value);
if (selectedOptions) {
return [option].concat(selectedOptions);
}
}
}
},
updateTabs: function updateTabs() {
var _this2 = this;
if (this.value || this.value === 0) {
var selectedOptions = this.getSelectedOptionsByValue(this.options, this.value);
if (selectedOptions) {
var optionsCursor = this.options;
this.tabs = selectedOptions.map(function (option) {
var tab = {
options: optionsCursor,
selectedOption: option
};
var next = optionsCursor.filter(function (item) {
return item[_this2.valueKey] === option[_this2.valueKey];
});
if (next.length) {
optionsCursor = next[0][_this2.childrenKey];
}
return tab;
});
if (optionsCursor) {
this.tabs.push({
options: optionsCursor,
selectedOption: null
});
}
this.$nextTick(function () {
_this2.activeTab = _this2.tabs.length - 1;
});
return;
}
}
this.tabs = [{
options: this.options,
selectedOption: null
}];
},
onSelect: function onSelect(option, tabIndex) {
var _this3 = this;
this.tabs[tabIndex].selectedOption = option;
if (this.tabs.length > tabIndex + 1) {
this.tabs = this.tabs.slice(0, tabIndex + 1);
}
if (option[this.childrenKey]) {
var nextTab = {
options: option[this.childrenKey],
selectedOption: null
};
if (this.tabs[tabIndex + 1]) {
this.$set(this.tabs, tabIndex + 1, nextTab);
} else {
this.tabs.push(nextTab);
}
this.$nextTick(function () {
_this3.activeTab++;
});
}
var selectedOptions = this.tabs.map(function (tab) {
return tab.selectedOption;
}).filter(function (item) {
return !!item;
});
var eventParams = {
value: option[this.valueKey],
tabIndex: tabIndex,
selectedOptions: selectedOptions
};
this.$emit('input', option[this.valueKey]);
this.$emit('change', eventParams);
if (!option[this.childrenKey]) {
this.$emit('finish', eventParams);
}
},
onClose: function onClose() {
this.$emit('close');
},
renderHeader: function renderHeader() {
var h = this.$createElement;
return h("div", {
"class": bem('header')
}, [h("h2", {
"class": bem('title')
}, [this.slots('title') || this.title]), this.closeable ? h(_icon.default, {
"attrs": {
"name": "cross"
},
"class": bem('close-icon'),
"on": {
"click": this.onClose
}
}) : null]);
},
renderOptions: function renderOptions(options, selectedOption, tabIndex) {
var _this4 = this;
var h = this.$createElement;
var renderOption = function renderOption(option) {
var isSelected = selectedOption && option[_this4.valueKey] === selectedOption[_this4.valueKey];
return h("li", {
"class": bem('option', {
selected: isSelected
}),
"style": {
color: isSelected ? _this4.activeColor : null
},
"on": {
"click": function click() {
_this4.onSelect(option, tabIndex);
}
}
}, [h("span", [option[_this4.textKey]]), isSelected ? h(_icon.default, {
"attrs": {
"name": "success"
},
"class": bem('selected-icon')
}) : null]);
};
return h("ul", {
"class": bem('options')
}, [options.map(renderOption)]);
},
renderTab: function renderTab(item, tabIndex) {
var h = this.$createElement;
var options = item.options,
selectedOption = item.selectedOption;
var title = selectedOption ? selectedOption[this.textKey] : this.placeholder || t('select');
return h(_tab.default, {
"attrs": {
"title": title,
"titleClass": bem('tab', {
unselected: !selectedOption
})
}
}, [this.renderOptions(options, selectedOption, tabIndex)]);
},
renderTabs: function renderTabs() {
var _this5 = this;
var h = this.$createElement;
return h(_tabs.default, {
"attrs": {
"animated": true,
"swipeable": true,
"swipeThreshold": 0,
"color": this.activeColor
},
"class": bem('tabs'),
"model": {
value: _this5.activeTab,
callback: function callback($$v) {
_this5.activeTab = $$v;
}
}
}, [this.tabs.map(this.renderTab)]);
}
},
render: function render() {
var h = arguments[0];
return h("div", {
"class": bem()
}, [this.renderHeader(), this.renderTabs()]);
}
});
exports.default = _default2;