From 3baaad59171ded6aca17340fcc907acbeeb45b7b Mon Sep 17 00:00:00 2001 From: zhuguifei <zhuguifei@zhuguifeideiMac.local> Date: 星期二, 08 四月 2025 08:14:43 +0800 Subject: [PATCH] Merge branch 'main' of http://lanpucloud.cn:1111/r/eims-master --- eims-ui/apps/web-antd/src/views/eims/spare/spare-type-tree.vue | 121 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 121 insertions(+), 0 deletions(-) diff --git a/eims-ui/apps/web-antd/src/views/eims/spare/spare-type-tree.vue b/eims-ui/apps/web-antd/src/views/eims/spare/spare-type-tree.vue new file mode 100644 index 0000000..0ea4fa3 --- /dev/null +++ b/eims-ui/apps/web-antd/src/views/eims/spare/spare-type-tree.vue @@ -0,0 +1,121 @@ +<script setup lang="ts"> +import type { SpareTypeTree } from '#/api/eims/spare-type/model.d.ts'; + +import { onMounted, type PropType, ref } from 'vue'; + +import { SyncOutlined } from '@ant-design/icons-vue'; +import { Empty, InputSearch, Skeleton, Tree } from 'ant-design-vue'; + +import { getSpareTypeTree } from '#/api/eims/spare-type'; + +defineOptions({ inheritAttrs: false }); + +const emit = defineEmits<{ + /** + * 鐐瑰嚮鍒锋柊鎸夐挳鐨勪簨浠� + */ + reload: []; + /** + * 鐐瑰嚮鑺傜偣鐨勪簨浠� + */ + select: []; +}>(); + +const selectTypeId = defineModel('selectTypeId', { + required: true, + type: Array as PropType<string[]>, +}); + +const searchValue = defineModel('searchValue', { + type: String, + default: '', +}); + +/** 閮ㄩ棬鏁版嵁婧� */ +type TypeTreeArray = SpareTypeTree[]; +const spareTypeTreeArray = ref<TypeTreeArray>([]); +/** 楠ㄦ灦灞忓姞杞� */ +const showTreeSkeleton = ref<boolean>(true); + +async function loadTree() { + showTreeSkeleton.value = true; + searchValue.value = ''; + selectTypeId.value = []; + + const ret = await getSpareTypeTree(); + + spareTypeTreeArray.value = ret; + showTreeSkeleton.value = false; +} + +async function handleReload() { + await loadTree(); + emit('reload'); +} + +onMounted(loadTree); +</script> + +<template> + <div :class="$attrs.class"> + <Skeleton + :loading="showTreeSkeleton" + :paragraph="{ rows: 8 }" + active + class="p-[8px]" + > + <div + class="bg-background flex h-full flex-col overflow-y-auto rounded-lg" + > + <!-- 鍥哄畾鍦ㄩ《閮� 蹇呴』鍔犱笂bg-background鑳屾櫙鑹� 鍚﹀垯浼氫骇鐢�'绌块��'鏁堟灉 --> + <div class="bg-background z-100 sticky left-0 top-0 p-[8px]"> + <InputSearch + v-model:value="searchValue" + :placeholder="$t('pages.common.search')" + size="small" + > + <template #enterButton> + <a-button @click="handleReload"> + <SyncOutlined class="text-primary" /> + </a-button> + </template> + </InputSearch> + </div> + <div class="h-full overflow-x-hidden px-[8px]"> + <Tree + v-bind="$attrs" + v-if="spareTypeTreeArray.length > 0" + v-model:selected-keys="selectTypeId" + :class="$attrs.class" + :field-names="{ title: 'label', key: 'id' }" + :show-line="{ showLeafIcon: false }" + :tree-data="spareTypeTreeArray" + :virtual="false" + default-expand-all + @select="$emit('select')" + > + <template #title="{ label }"> + <span v-if="label.indexOf(searchValue) > -1"> + {{ label.substring(0, label.indexOf(searchValue)) }} + <span style="color: #f50">{{ searchValue }}</span> + {{ + label.substring( + label.indexOf(searchValue) + searchValue.length, + ) + }} + </span> + <span v-else>{{ label }}</span> + </template> + </Tree> + <!-- 浠呮湰浜烘暟鎹潈闄� 鍙互鑰冭檻鐩存帴涓嶆樉绀� --> + <div v-else class="mt-5"> + <Empty + :image="Empty.PRESENTED_IMAGE_SIMPLE" + description="鏃犺澶囩被鍨嬫暟鎹�" + /> + </div> + </div> + </div> + </Skeleton> + </div> +</template> -- Gitblit v1.9.3