mirror of
https://github.com/cool-team-official/cool-admin-vue.git
synced 2024-11-01 22:20:27 +08:00
98 lines
1.5 KiB
Vue
98 lines
1.5 KiB
Vue
|
<template>
|
||
|
<el-cascader
|
||
|
:options="options"
|
||
|
:props="{ multiple: true }"
|
||
|
separator=":"
|
||
|
clearable
|
||
|
filterable
|
||
|
v-model="newValue"
|
||
|
@change="onChange"
|
||
|
></el-cascader>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
export default {
|
||
|
name: "cl-menu-perms",
|
||
|
|
||
|
props: {
|
||
|
value: [String, Number, Array]
|
||
|
},
|
||
|
|
||
|
data() {
|
||
|
return {
|
||
|
options: [],
|
||
|
newValue: []
|
||
|
};
|
||
|
},
|
||
|
|
||
|
watch: {
|
||
|
value() {
|
||
|
this.parse();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
created() {
|
||
|
let options = [];
|
||
|
let list = [];
|
||
|
|
||
|
const flat = (obj) => {
|
||
|
for (let i in obj) {
|
||
|
let { permission } = obj[i];
|
||
|
|
||
|
if (permission) {
|
||
|
list = [...list, Object.values(permission)].flat();
|
||
|
} else {
|
||
|
flat(obj[i]);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
flat(this.$service);
|
||
|
|
||
|
list.filter((e) => e.includes(":"))
|
||
|
.map((e) => e.split(":"))
|
||
|
.forEach((arr) => {
|
||
|
const col = (i, d) => {
|
||
|
let key = arr[i];
|
||
|
|
||
|
let index = d.findIndex((e) => e.label == key);
|
||
|
|
||
|
if (index >= 0) {
|
||
|
col(i + 1, d[index].children);
|
||
|
} else {
|
||
|
let isLast = i == arr.length - 1;
|
||
|
|
||
|
d.push({
|
||
|
label: key,
|
||
|
value: key,
|
||
|
children: isLast ? null : []
|
||
|
});
|
||
|
|
||
|
if (!isLast) {
|
||
|
col(i + 1, d[d.length - 1].children || []);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
col(0, options);
|
||
|
});
|
||
|
|
||
|
this.options = options;
|
||
|
},
|
||
|
|
||
|
mounted() {
|
||
|
this.parse();
|
||
|
},
|
||
|
|
||
|
methods: {
|
||
|
parse() {
|
||
|
this.newValue = this.value ? this.value.split(",").map((e) => e.split(":")) : [];
|
||
|
},
|
||
|
|
||
|
onChange(row) {
|
||
|
this.$emit("input", row.map((e) => e.join(":")).join(","));
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
</script>
|