123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <template>
- <el-dialog v-model="state.showDialog" destroy-on-close :title="title" append-to-body draggable width="780px">
- <div style="padding: 0px 0px 8px 8px; background-color: var(--ba-bg-color)">
- <el-row :gutter="8" style="width: 100%">
- <el-col :xs="24" :sm="9">
- <div class="my-flex-column h100">
- <org-menu @node-click="onOrgNodeClick" class="my-flex-fill"></org-menu>
- </div>
- </el-col>
- <el-col :xs="24" :sm="15">
- <el-card shadow="never" :body-style="{ paddingBottom: '0' }" style="margin-top: 8px">
- <el-form :model="state.filterModel" :inline="true">
- <el-form-item label="姓名" prop="name">
- <el-input v-model="state.filterModel.name" placeholder="姓名" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
- </el-form-item>
- </el-form>
- </el-card>
- <el-card shadow="never" style="margin-top: 8px">
- <el-table
- ref="userTableRef"
- :data="state.userListData"
- style="width: 100%"
- v-loading="state.loading"
- row-key="id"
- default-expand-all
- :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
- :highlight-current-row="!multiple"
- @row-click="onRowClick"
- @row-dblclick="onRowDbClick"
- >
- <el-table-column v-if="multiple" type="selection" width="55" />
- <el-table-column prop="name" label="姓名" min-width="80" show-overflow-tooltip />
- <el-table-column prop="mobile" label="手机号" min-width="120" show-overflow-tooltip />
- <!-- <el-table-column prop="email" label="邮箱" min-width="120" show-overflow-tooltip /> -->
- </el-table>
- <div class="my-flex my-flex-end" style="margin-top: 20px">
- <el-pagination
- v-model:currentPage="state.pageInput.currentPage"
- v-model:page-size="state.pageInput.pageSize"
- :total="state.total"
- :page-sizes="[10, 20, 50, 100]"
- small
- background
- @size-change="onSizeChange"
- @current-change="onCurrentChange"
- layout="total, sizes, prev, pager, next"
- />
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="onCancel" size="default">取 消</el-button>
- <el-button type="primary" @click="onSure" size="default" :loading="sureLoading">确 定</el-button>
- </span>
- </template>
- </el-dialog>
- </template>
- <script lang="ts" setup>
- import { ref, reactive, defineAsyncComponent } from 'vue'
- import { ElTable } from 'element-plus'
- import { UserGetPageOutput, PageInputUserGetPageDto, OrgListOutput } from '/@/api/admin/data-contracts'
- import { UserApi } from '/@/api/admin/User'
- // 引入组件
- const OrgMenu = defineAsyncComponent(() => import('/@/views/admin/org/components/org-menu.vue'))
- const props = defineProps({
- title: {
- type: String,
- default: '',
- },
- multiple: {
- type: Boolean,
- default: false,
- },
- sureLoading: {
- type: Boolean,
- default: false,
- },
- })
- const emits = defineEmits(['sure'])
- const userTableRef = ref<InstanceType<typeof ElTable>>()
- const state = reactive({
- showDialog: false,
- loading: false,
- filterModel: {
- name: '',
- },
- total: 0,
- pageInput: {
- currentPage: 1,
- pageSize: 20,
- filter: {
- orgId: null,
- },
- } as PageInputUserGetPageDto,
- userListData: [] as Array<UserGetPageOutput>,
- })
- // 打开对话框
- const open = () => {
- state.showDialog = true
- if (state.pageInput.filter) {
- state.pageInput.filter.orgId = null
- }
- onQuery()
- }
- // 关闭对话框
- const close = () => {
- state.showDialog = false
- }
- const onQuery = async () => {
- state.loading = true
- const res = await new UserApi().getPage(state.pageInput)
- state.userListData = res?.data?.list ?? []
- state.total = res.data?.total ?? 0
- state.loading = false
- }
- const onSizeChange = (val: number) => {
- state.pageInput.pageSize = val
- onQuery()
- }
- const onCurrentChange = (val: number) => {
- state.pageInput.currentPage = val
- onQuery()
- }
- const onOrgNodeClick = (node: OrgListOutput | null) => {
- if (state.pageInput.filter) {
- state.pageInput.filter.orgId = node?.id
- }
- onQuery()
- }
- const onRowClick = (row: UserGetPageOutput) => {
- // TODO: improvement typing when refactor table
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-expect-error
- userTableRef.value!.toggleRowSelection(row, props.multiple ? undefined : true)
- }
- const onRowDbClick = () => {
- if (!props.multiple) {
- onSure()
- }
- }
- // 取消
- const onCancel = () => {
- state.showDialog = false
- }
- // 确定
- const onSure = () => {
- const selectionRows = userTableRef.value!.getSelectionRows() as UserGetPageOutput[]
- emits('sure', props.multiple ? selectionRows : selectionRows.length > 0 ? selectionRows[0] : null)
- }
- defineExpose({
- open,
- close,
- })
- </script>
- <script lang="ts">
- import { defineComponent } from 'vue'
- export default defineComponent({
- name: 'admin/user/components/user-select',
- })
- </script>
- <style scoped lang="scss">
- :deep(.el-dialog__body) {
- padding: 5px 10px;
- }
- </style>
|