|
@@ -15,14 +15,31 @@
|
|
|
<p class="header-desc">
|
|
|
已选择数据<span>( {{ rowSelection.selectedRowKeys.length }} )</span>
|
|
|
</p>
|
|
|
- <Search
|
|
|
- v-if="Object.keys(allData).length"
|
|
|
- className="content-header-search"
|
|
|
- placeholder="输入名称搜索"
|
|
|
- v-model:value="params.name"
|
|
|
- allow-clear
|
|
|
- style="width: 244px"
|
|
|
- />
|
|
|
+ <div class="up-se">
|
|
|
+ <span class="upload fun-ctrls">
|
|
|
+ <ui-input
|
|
|
+ class="input"
|
|
|
+ :accept="ft"
|
|
|
+ :maxSize="maxSize"
|
|
|
+ @update:modelValue="addMaterial"
|
|
|
+ type="file"
|
|
|
+ >
|
|
|
+ <template v-slot:replace>
|
|
|
+ <Button type="primary" ghost>
|
|
|
+ <ui-icon type="add" class="icon" />上传文件
|
|
|
+ </Button>
|
|
|
+ </template>
|
|
|
+ </ui-input>
|
|
|
+ </span>
|
|
|
+ <Search
|
|
|
+ v-if="Object.keys(allData).length"
|
|
|
+ className="content-header-search"
|
|
|
+ placeholder="输入名称搜索"
|
|
|
+ v-model:value="params.name"
|
|
|
+ allow-clear
|
|
|
+ style="width: 244px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
<div class="table-layout">
|
|
@@ -39,6 +56,11 @@
|
|
|
<template v-if="column.key === 'size'">
|
|
|
{{ getSizeStr(record.size) }}
|
|
|
</template>
|
|
|
+ <template v-else-if="column.key === 'action'">
|
|
|
+ <span>
|
|
|
+ <a @click="delHandler(column.id)">删除</a>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
</template>
|
|
|
</Table>
|
|
|
<div style="padding: 1px" v-else>
|
|
@@ -54,11 +76,13 @@
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-import { Modal, Input, Table, Empty, TableProps } from "ant-design-vue";
|
|
|
+import { Modal, Input, Table, Empty, TableProps, Button } from "ant-design-vue";
|
|
|
import { computed, reactive, ref, watch } from "vue";
|
|
|
-import { createLoadPack, debounce, debounceStack, getSizeStr } from "@/utils";
|
|
|
-import type { PagingResult, Scene } from "@/api";
|
|
|
+import { createLoadPack, debounceStack, getSizeStr } from "@/utils";
|
|
|
+import type { PagingResult } from "@/api";
|
|
|
import {
|
|
|
+ addMaterial,
|
|
|
+ delMaterial,
|
|
|
fetchMaterialGroups,
|
|
|
fetchMaterialPage,
|
|
|
Material,
|
|
@@ -66,8 +90,10 @@ import {
|
|
|
MaterialPageProps,
|
|
|
} from "@/api/material";
|
|
|
import Message from "bill/components/message/message.vue";
|
|
|
+import { Dialog } from "bill/expose-common";
|
|
|
|
|
|
const props = defineProps<{
|
|
|
+ uploadFormat?: string[];
|
|
|
format?: string[];
|
|
|
maxSize?: number;
|
|
|
visible: boolean;
|
|
@@ -80,6 +106,12 @@ const emit = defineEmits<{
|
|
|
(e: "selectMaterials", v: Material[]): void;
|
|
|
}>();
|
|
|
|
|
|
+const ft = computed(() => {
|
|
|
+ const ft = props.uploadFormat || props.format;
|
|
|
+ if (!ft) return void 0;
|
|
|
+ return ft.map((t) => `.${t}`).join(",");
|
|
|
+});
|
|
|
+
|
|
|
const Search = Input.Search;
|
|
|
const params = reactive({ pageNum: 1, pageSize: 12 }) as MaterialPageProps;
|
|
|
const origin = ref<PagingResult<Material[]>>({
|
|
@@ -139,25 +171,38 @@ const cloumns = computed(() => [
|
|
|
value: g.id,
|
|
|
})),
|
|
|
},
|
|
|
+ {
|
|
|
+ title: "操作",
|
|
|
+ key: "action",
|
|
|
+ },
|
|
|
]);
|
|
|
|
|
|
const fetchData = createLoadPack(() =>
|
|
|
Promise.all([fetchMaterialGroups(), fetchMaterialPage(params)])
|
|
|
);
|
|
|
-watch(
|
|
|
- params,
|
|
|
- debounceStack(
|
|
|
- fetchData,
|
|
|
- ([group, pag]) => {
|
|
|
- groups.value = group;
|
|
|
- origin.value = pag;
|
|
|
- pag.list.forEach((item) => (allData[item.id] = item));
|
|
|
- },
|
|
|
- 160
|
|
|
- ),
|
|
|
- { immediate: true, deep: true }
|
|
|
+const refresh = debounceStack(
|
|
|
+ fetchData,
|
|
|
+ ([group, pag]) => {
|
|
|
+ groups.value = group;
|
|
|
+ origin.value = pag;
|
|
|
+ pag.list.forEach((item) => (allData[item.id] = item));
|
|
|
+ },
|
|
|
+ 160
|
|
|
);
|
|
|
|
|
|
+watch(params, refresh, { immediate: true, deep: true });
|
|
|
+
|
|
|
+const addHandler = async (file: File) => {
|
|
|
+ await addMaterial(file);
|
|
|
+ refresh();
|
|
|
+};
|
|
|
+const delHandler = async (id: Material["id"]) => {
|
|
|
+ if (await Dialog.confirm("确定要删除此数据吗?")) {
|
|
|
+ await delMaterial(id);
|
|
|
+ refresh();
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
const okHandler = () => {
|
|
|
emit(
|
|
|
"selectMaterials",
|
|
@@ -183,12 +228,23 @@ const handleTableChange: TableProps["onChange"] = (pag, filters) => {
|
|
|
max-height: 500px;
|
|
|
overflow-y: auto;
|
|
|
}
|
|
|
+.up-se {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .upload {
|
|
|
+ margin-right: 10px;
|
|
|
+ width: 100px;
|
|
|
+ // overflow: hidden;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|
|
|
|
|
|
<style lang="less">
|
|
|
.model-header .header-desc {
|
|
|
margin-bottom: 0;
|
|
|
}
|
|
|
+
|
|
|
.ant-modal-root .ant-table-tbody > tr > td {
|
|
|
word-break: break-all;
|
|
|
}
|