|
@@ -19,7 +19,6 @@
|
|
|
:value-mode="valueMode"
|
|
|
hover
|
|
|
@change="onChange"
|
|
|
- @click="onClick"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="foot-container" v-if="isShowFoot">
|
|
@@ -45,18 +44,27 @@ const props = defineProps({
|
|
|
type: Array,
|
|
|
default: [],
|
|
|
},
|
|
|
+ showSetPermission: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ isSearch: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
});
|
|
|
// emit事件
|
|
|
-const emit = defineEmits(['close', 'setPermission']);
|
|
|
+const emit = defineEmits(['close', 'setPermission', 'getSearch']);
|
|
|
const searchTxt = ref('');
|
|
|
|
|
|
// tree相关
|
|
|
const treeList = ref([]);
|
|
|
const tree = ref();
|
|
|
-const valueMode = ref('onlyLeaf');
|
|
|
+const valueMode = ref('all');
|
|
|
const checkable = ref(true);
|
|
|
-const checkStrictly = ref(false);
|
|
|
+const checkStrictly = ref(true);
|
|
|
const allChecked = ref([]);
|
|
|
+const actuallyAllChecked = ref([]);
|
|
|
const treeKeys = reactive({
|
|
|
value: 'ChartClassifyId',
|
|
|
children: 'Children',
|
|
@@ -67,33 +75,81 @@ const treeKeys = reactive({
|
|
|
watch(
|
|
|
() => props.PermissionList,
|
|
|
(newValue) => {
|
|
|
- if (newValue.length > 0) {
|
|
|
- treeList.value = newValue;
|
|
|
- allChecked.value = props.allCheckedList;
|
|
|
+ treeList.value = newValue;
|
|
|
+ if (!props.isSearch) { // 如果不是搜索,则直接把后端返回的赋值为选中项
|
|
|
+ allChecked.value = props.allCheckedList;
|
|
|
+ actuallyAllChecked.value = props.allCheckedList;
|
|
|
+ } else { // 如果是搜索,则把本地选中项赋值为实际上选中的值
|
|
|
+ allChecked.value = actuallyAllChecked.value
|
|
|
+ }
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+);
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => props.showSetPermission,
|
|
|
+ (newValue) => {
|
|
|
+ if (newValue) {
|
|
|
+ searchTxt.value = '';
|
|
|
}
|
|
|
},
|
|
|
{ immediate: true }
|
|
|
);
|
|
|
|
|
|
// tree相关
|
|
|
-const onClick = (context) => {
|
|
|
- console.info('onClick context:', context);
|
|
|
- const { node } = context;
|
|
|
- console.info(node.value, 'onClick context.node.checked:', node.checked);
|
|
|
-};
|
|
|
const onChange = (checked, context) => {
|
|
|
- console.info('onChange checked:', checked, 'context:', context);
|
|
|
+ // console.info('onChange checked:', checked, 'context:', context);
|
|
|
const { node } = context;
|
|
|
- console.info(node.value, 'onChange context.node.checked:', node.checked);
|
|
|
+ if (node.checked) {
|
|
|
+ if (node.data.Children.length) { // 如果当前节点有子节点,则把所有子节点的id都加上去
|
|
|
+ allChecked.value = [...new Set([...allChecked.value, node.value, ...getAllChildIds(node.data.Children)])];
|
|
|
+ actuallyAllChecked.value = [...new Set([...actuallyAllChecked.value, node.value, ...getAllChildIds(node.data.Children)])];
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (node.data.Children.length) { // 如果当前节点有子节点,则直接去掉该节点和子节点的所有id
|
|
|
+ const temp = [...getAllChildIds(node.data.Children), node.value];
|
|
|
+ allChecked.value = removeChildren(allChecked.value, temp);
|
|
|
+ actuallyAllChecked.value = removeChildren(actuallyAllChecked.value, temp);
|
|
|
+ } else { // 如果当前节点没有子节点,则直接去掉该节点的id
|
|
|
+ actuallyAllChecked.value = actuallyAllChecked.value.filter(item => item !== node.value);
|
|
|
+ }
|
|
|
+ }
|
|
|
};
|
|
|
+// 获取所有子节点和子节点的id(递归) --用来实现勾选父节点时,子节点的勾选状态也跟随变化
|
|
|
+const getAllChildIds = (arr) => {
|
|
|
+ const ids = [];
|
|
|
+ function traverse(current) {
|
|
|
+ if (!Array.isArray(current) || !current.length) return;
|
|
|
+ current.forEach(item => {
|
|
|
+ if (item.ChartClassifyId) {
|
|
|
+ ids.push(item.ChartClassifyId);
|
|
|
+ }
|
|
|
+ if (item.Children && Array.isArray(item.Children)) {
|
|
|
+ item.Children.forEach(child => {
|
|
|
+ if (child.ChartClassifyId) {
|
|
|
+ ids.push(child.ChartClassifyId);
|
|
|
+ }
|
|
|
+ traverse(child.Children); // 递归遍历子元素
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ traverse(arr);
|
|
|
+ return ids;
|
|
|
+}
|
|
|
+const removeChildren = (arrayA, arrayB) => {
|
|
|
+ const setB = new Set(arrayB);
|
|
|
+ return arrayA.filter(item => !setB.has(item));
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
// 保存按钮
|
|
|
const handleSave = async () => {
|
|
|
- emit('setPermission', allChecked.value);
|
|
|
+ emit('setPermission', actuallyAllChecked.value);
|
|
|
};
|
|
|
// 搜索
|
|
|
const changeSearchTxt = () => {
|
|
|
-
|
|
|
+ emit('getSearch', searchTxt.value);
|
|
|
}
|
|
|
// 关闭弹窗
|
|
|
const handleClose = () => {
|
|
@@ -101,7 +157,7 @@ const handleClose = () => {
|
|
|
};
|
|
|
|
|
|
defineExpose({
|
|
|
- allChecked,
|
|
|
+ actuallyAllChecked
|
|
|
})
|
|
|
</script>
|
|
|
<style scoped lang="scss">
|