forked from mengyxu/noob-components
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.7 KiB
102 lines
2.7 KiB
<template> |
|
<el-container> |
|
<el-main> |
|
<ListTable |
|
page |
|
border |
|
:data="tableData.rows" |
|
:props="propsWithSelection" |
|
:row-key="rowKey" |
|
:example="tableData.example" |
|
@query="tableData.query()" |
|
> |
|
<template v-for="{ code } in propsWithSlot" #[code]="{ row }"> |
|
<slot :name="code" :row /> |
|
</template> |
|
<template #ui_selection="{ row }"> |
|
<el-checkbox |
|
:value="selection.get(row[rowKey])" |
|
@update:model-value=" |
|
(val) => { |
|
if (val) { |
|
selection.set(row[rowKey], row); |
|
} else { |
|
selection.delete(row[rowKey]); |
|
} |
|
} |
|
" |
|
/> |
|
</template> |
|
</ListTable> |
|
</el-main> |
|
<el-footer> |
|
<ConfirmCancel @confirm="handleConfirm" @cancel="handleCancel" /> |
|
</el-footer> |
|
</el-container> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import { ListTable, Element, AsyncHandler, useAsyncEmits, useListTable, useSysDict, ConfirmCancel } from "noob-mengyxu"; |
|
import { computed, onMounted, reactive, ref } from "vue"; |
|
import { useStore } from "vuex"; |
|
import { useI18n } from "vue3-i18n"; |
|
import { ListTableProps } from "../../../plugs/element/listTableDialog"; |
|
import { PageResponse } from "../../../plugs/http"; |
|
const { showMessage } = Element; |
|
const { t } = useI18n(); |
|
|
|
defineOptions({ inheritAttrs: false }); |
|
|
|
type Row = Record<string, any>; |
|
|
|
const p = defineProps<ListTableProps>(); |
|
|
|
type Emits = { |
|
query: [handler: AsyncHandler<PageResponse<Row>>, example: Record<string, any>]; |
|
confirm: [handler: AsyncHandler<void>, rows: Row[]]; |
|
close: [handler: AsyncHandler<void>]; |
|
}; |
|
const emits = defineEmits<Emits>(); |
|
const emitsAsync = useAsyncEmits<Emits>(emits); |
|
|
|
const propsWithSelection = computed(() => [ |
|
{ code: "ui_selection", slot: true, i18n: "common.select", width: 80 }, |
|
...p.props, |
|
]); |
|
const propsWithSlot = computed(() => p.props.filter((col) => col.slot)); |
|
|
|
const store = useStore(); |
|
|
|
const { sysDict, updateDict } = useSysDict(); |
|
|
|
const tableData = useListTable({ |
|
query: (example) => emitsAsync("query", example), |
|
initialPage: p.initialPage, |
|
initialPageSize: p.initialPageSize, |
|
initExample: p.initExample, |
|
disableAutoQuery: true, |
|
}); |
|
|
|
const selection = reactive(new Map()); |
|
|
|
const handleConfirm = async () => { |
|
try { |
|
await emitsAsync("confirm", Array.from(selection.values())); |
|
await emitsAsync("close"); |
|
} catch { |
|
showMessage("error", t("common.errors.submitError")); |
|
} |
|
}; |
|
|
|
const handleCancel = async () => { |
|
await emitsAsync("close"); |
|
}; |
|
|
|
onMounted(async () => { |
|
if (p.useDicts) { |
|
await updateDict(p.useDicts); |
|
} |
|
|
|
await tableData.query(); |
|
}); |
|
</script>
|
|
|