332 lines
11 KiB
JavaScript
332 lines
11 KiB
JavaScript
"use strict";
|
||
const common_vendor = require("../../../../common/vendor.js");
|
||
const _sfc_main = {
|
||
name: "up-cascader",
|
||
props: {
|
||
// 通过双向绑定控制组件的弹出与收起
|
||
show: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 级联数据
|
||
data: {
|
||
type: Array,
|
||
default() {
|
||
return [];
|
||
}
|
||
},
|
||
// 默认选中的值
|
||
modelValue: {
|
||
type: Array,
|
||
default() {
|
||
return [];
|
||
}
|
||
},
|
||
// 指定选项的值为选项对象中的哪个属性值
|
||
valueKey: {
|
||
type: String,
|
||
default: "value"
|
||
},
|
||
// 指定选项标签为选项对象中的哪个属性值
|
||
labelKey: {
|
||
type: String,
|
||
default: "label"
|
||
},
|
||
// 指定选项的子选项为选项对象中的哪个属性值
|
||
childrenKey: {
|
||
type: String,
|
||
default: "children"
|
||
},
|
||
// 是否允许通过点击遮罩关闭Picker
|
||
maskCloseAble: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
// 弹出的z-index值
|
||
zIndex: {
|
||
type: [String, Number],
|
||
default: 0
|
||
},
|
||
// 是否在选择最后一级时自动关闭并触发confirm
|
||
autoClose: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 选中项目的展示方向direction垂直方向适合文字长度过长
|
||
headerDirection: {
|
||
type: String,
|
||
default: "row"
|
||
},
|
||
// 选项区域列数,支持1列和2列,默认为2列
|
||
optionsCols: {
|
||
type: [Number],
|
||
default: 2
|
||
},
|
||
// 是否显示关闭图标
|
||
closeable: {
|
||
type: Boolean,
|
||
default: true
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
// 存储每一级的数据
|
||
levelList: [],
|
||
// 存储每一级选中的索引
|
||
selectedValueIndexs: [],
|
||
tabsIndex: 0,
|
||
popupShow: false,
|
||
// 新增confirmValues用于存储确认的值
|
||
confirmValues: []
|
||
};
|
||
},
|
||
watch: {
|
||
data: {
|
||
handler() {
|
||
this.initLevelList();
|
||
this.setDefaultValue();
|
||
},
|
||
immediate: true
|
||
},
|
||
show() {
|
||
this.popupShow = this.show;
|
||
},
|
||
modelValue: {
|
||
handler() {
|
||
this.setDefaultValue();
|
||
},
|
||
immediate: true
|
||
}
|
||
},
|
||
computed: {
|
||
isChange() {
|
||
return this.tabsIndex > 1;
|
||
},
|
||
genTabsList() {
|
||
let tabsList = [{
|
||
name: "请选择"
|
||
}];
|
||
for (let i = 0; i < this.selectedValueIndexs.length; i++) {
|
||
if (this.selectedValueIndexs[i] !== void 0 && this.levelList[i]) {
|
||
const selectedItem = this.levelList[i][this.selectedValueIndexs[i]];
|
||
if (selectedItem) {
|
||
tabsList[i] = {
|
||
name: selectedItem[this.labelKey]
|
||
};
|
||
if (i === this.selectedValueIndexs.length - 1 && selectedItem[this.childrenKey] && selectedItem[this.childrenKey].length > 0) {
|
||
tabsList.push({
|
||
name: "请选择"
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return tabsList;
|
||
},
|
||
uZIndex() {
|
||
return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
|
||
}
|
||
},
|
||
// 新增confirm事件
|
||
emits: ["update:modelValue", "update:show", "change", "confirm", "cancel"],
|
||
methods: {
|
||
t: common_vendor.t$1,
|
||
initLevelList() {
|
||
if (this.data && this.data.length > 0) {
|
||
this.levelList = [this.data];
|
||
this.selectedValueIndexs = [];
|
||
}
|
||
},
|
||
setDefaultValue() {
|
||
if (!this.data || this.data.length == 0)
|
||
return;
|
||
if (!this.modelValue || this.modelValue.length == 0)
|
||
return;
|
||
this.selectedValueIndexs = [];
|
||
this.levelList = [];
|
||
let currentLevelData = this.data;
|
||
for (let i = 0; i < this.modelValue.length; i++) {
|
||
const value = this.modelValue[i];
|
||
const index = currentLevelData.findIndex((item) => item[this.valueKey] === value);
|
||
this.levelList[i] = currentLevelData;
|
||
if (index !== -1) {
|
||
this.selectedValueIndexs.push(index);
|
||
if (currentLevelData[index][this.childrenKey]) {
|
||
currentLevelData = currentLevelData[index][this.childrenKey];
|
||
} else {
|
||
break;
|
||
}
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
},
|
||
close() {
|
||
this.$emit("cancel");
|
||
this.$emit("update:show", false);
|
||
},
|
||
tabsChange(item) {
|
||
},
|
||
levelChange(levelIndex, index) {
|
||
this.$set(this.selectedValueIndexs, levelIndex, index);
|
||
this.selectedValueIndexs.splice(levelIndex + 1);
|
||
this.tabsIndex = Math.min(this.tabsIndex, levelIndex);
|
||
this.levelList.splice(levelIndex + 1);
|
||
const currentItem = this.levelList[levelIndex][index];
|
||
if (currentItem && currentItem[this.childrenKey] && currentItem[this.childrenKey].length > 0) {
|
||
if (this.levelList.length <= levelIndex + 1) {
|
||
this.levelList.push(currentItem[this.childrenKey]);
|
||
} else {
|
||
this.$set(this.levelList, levelIndex + 1, currentItem[this.childrenKey]);
|
||
}
|
||
this.tabsIndex = levelIndex + 1;
|
||
} else {
|
||
if (this.autoClose) {
|
||
this.emitChange();
|
||
this.handleConfirm();
|
||
} else {
|
||
this.emitChange(false);
|
||
}
|
||
}
|
||
},
|
||
// 修改emitChange方法,增加closePopup参数
|
||
emitChange(closePopup = true) {
|
||
const result = [];
|
||
for (let i = 0; i < this.selectedValueIndexs.length; i++) {
|
||
if (this.selectedValueIndexs[i] !== void 0 && this.levelList[i]) {
|
||
result.push(this.levelList[i][this.selectedValueIndexs[i]][this.valueKey]);
|
||
}
|
||
}
|
||
this.confirmValues = [...result];
|
||
this.$emit("change", this.confirmValues);
|
||
if (closePopup) {
|
||
this.close();
|
||
}
|
||
},
|
||
handleCancel() {
|
||
this.close();
|
||
},
|
||
handleConfirm() {
|
||
this.$emit("update:modelValue", this.confirmValues);
|
||
this.$emit("confirm", this.confirmValues);
|
||
this.close();
|
||
}
|
||
}
|
||
};
|
||
if (!Array) {
|
||
const _easycom_up_steps_item2 = common_vendor.resolveComponent("up-steps-item");
|
||
const _easycom_up_steps2 = common_vendor.resolveComponent("up-steps");
|
||
const _easycom_up_tabs2 = common_vendor.resolveComponent("up-tabs");
|
||
const _easycom_up_icon2 = common_vendor.resolveComponent("up-icon");
|
||
const _easycom_up_cell2 = common_vendor.resolveComponent("up-cell");
|
||
const _easycom_up_cell_group2 = common_vendor.resolveComponent("up-cell-group");
|
||
const _easycom_up_button2 = common_vendor.resolveComponent("up-button");
|
||
const _easycom_up_popup2 = common_vendor.resolveComponent("up-popup");
|
||
(_easycom_up_steps_item2 + _easycom_up_steps2 + _easycom_up_tabs2 + _easycom_up_icon2 + _easycom_up_cell2 + _easycom_up_cell_group2 + _easycom_up_button2 + _easycom_up_popup2)();
|
||
}
|
||
const _easycom_up_steps_item = () => "../u-steps-item/u-steps-item.js";
|
||
const _easycom_up_steps = () => "../u-steps/u-steps.js";
|
||
const _easycom_up_tabs = () => "../u-tabs/u-tabs.js";
|
||
const _easycom_up_icon = () => "../u-icon/u-icon.js";
|
||
const _easycom_up_cell = () => "../u-cell/u-cell.js";
|
||
const _easycom_up_cell_group = () => "../u-cell-group/u-cell-group.js";
|
||
const _easycom_up_button = () => "../u-button/u-button.js";
|
||
const _easycom_up_popup = () => "../u-popup/u-popup.js";
|
||
if (!Math) {
|
||
(_easycom_up_steps_item + _easycom_up_steps + _easycom_up_tabs + _easycom_up_icon + _easycom_up_cell + _easycom_up_cell_group + _easycom_up_button + _easycom_up_popup)();
|
||
}
|
||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||
return common_vendor.e({
|
||
a: $props.headerDirection == "column"
|
||
}, $props.headerDirection == "column" ? common_vendor.e({
|
||
b: $data.popupShow
|
||
}, $data.popupShow ? {
|
||
c: common_vendor.f($options.genTabsList, (item, index, i0) => {
|
||
return {
|
||
a: common_vendor.o(($event) => $data.tabsIndex = index),
|
||
b: "2b4d73a7-2-" + i0 + ",2b4d73a7-1",
|
||
c: common_vendor.p({
|
||
title: item.name
|
||
})
|
||
};
|
||
}),
|
||
d: common_vendor.o(($event) => $data.tabsIndex = $event),
|
||
e: common_vendor.p({
|
||
dot: true,
|
||
direction: "column",
|
||
current: $data.tabsIndex
|
||
})
|
||
} : {}) : common_vendor.e({
|
||
f: $data.popupShow
|
||
}, $data.popupShow ? {
|
||
g: common_vendor.sr("tabs", "2b4d73a7-3,2b4d73a7-0"),
|
||
h: common_vendor.o($options.tabsChange),
|
||
i: common_vendor.o(($event) => $data.tabsIndex = $event),
|
||
j: common_vendor.p({
|
||
list: $options.genTabsList,
|
||
scrollable: true,
|
||
current: $data.tabsIndex
|
||
})
|
||
} : {}), {
|
||
k: common_vendor.f($data.levelList, (levelData, levelIndex, i0) => {
|
||
return common_vendor.e({
|
||
a: $props.optionsCols == 2 || levelIndex == $data.tabsIndex
|
||
}, $props.optionsCols == 2 || levelIndex == $data.tabsIndex ? common_vendor.e({
|
||
b: levelIndex === 0 || $data.selectedValueIndexs[levelIndex - 1] !== void 0
|
||
}, levelIndex === 0 || $data.selectedValueIndexs[levelIndex - 1] !== void 0 ? {
|
||
c: common_vendor.f(levelData, (item, index, i1) => {
|
||
return common_vendor.e({
|
||
a: $data.selectedValueIndexs[levelIndex] === index
|
||
}, $data.selectedValueIndexs[levelIndex] === index ? {
|
||
b: "2b4d73a7-6-" + i0 + "-" + i1 + "," + ("2b4d73a7-5-" + i0 + "-" + i1),
|
||
c: common_vendor.p({
|
||
size: "17",
|
||
name: "checkbox-mark"
|
||
})
|
||
} : {}, {
|
||
d: index,
|
||
e: common_vendor.o(($event) => $options.levelChange(levelIndex, index), index),
|
||
f: "2b4d73a7-5-" + i0 + "-" + i1 + "," + ("2b4d73a7-4-" + i0),
|
||
g: common_vendor.p({
|
||
title: item[$props.labelKey],
|
||
arrow: false,
|
||
index
|
||
})
|
||
});
|
||
}),
|
||
d: "2b4d73a7-4-" + i0 + ",2b4d73a7-0"
|
||
} : {}, {
|
||
e: $props.optionsCols == 2 ? "33.33333%" : "750rpx"
|
||
}) : {}, {
|
||
f: levelIndex
|
||
});
|
||
}),
|
||
l: $options.isChange ? 1 : "",
|
||
m: $props.optionsCols == 2 && $options.isChange ? "translateX(-33.3333333%)" : "",
|
||
n: common_vendor.t($options.t("up.common.cancel")),
|
||
o: common_vendor.o($options.handleCancel),
|
||
p: common_vendor.p({
|
||
type: "default"
|
||
}),
|
||
q: common_vendor.t($options.t("up.common.confirm")),
|
||
r: common_vendor.o($options.handleConfirm),
|
||
s: common_vendor.p({
|
||
type: "primary"
|
||
}),
|
||
t: common_vendor.o($options.close),
|
||
v: common_vendor.p({
|
||
show: $data.popupShow,
|
||
mode: "bottom",
|
||
popup: false,
|
||
mask: true,
|
||
closeable: $props.closeable,
|
||
["safe-area-inset-bottom"]: true,
|
||
["close-icon-color"]: "#ffffff",
|
||
["z-index"]: $options.uZIndex,
|
||
maskCloseAble: $props.maskCloseAble
|
||
})
|
||
});
|
||
}
|
||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/Users/zsq/Sources/github/2025property-pay/pay-employee/node_modules/uview-plus/components/u-cascader/u-cascader.vue"]]);
|
||
wx.createComponent(Component);
|