|
|
@@ -4,101 +4,111 @@
|
|
|
<div class="table-title-btn" v-if="$slots['table-title-btn']">
|
|
|
<slot name="table-title-btn"></slot>
|
|
|
</div>
|
|
|
- <el-table ref="multipleTableRef" :row-key="rowKey"
|
|
|
- :header-cell-style="{ 'background-color': '#F7F7F9', 'border-bottom': '1px solid #EEF1F6', 'font-size': '15px', 'color': '#333', 'padding': '10px 0' }"
|
|
|
- :data="props.tableData" :height="tableHeight" :max-height="maxHeight" table-layout="fixed" style="width: 100%;"
|
|
|
- @selection-change="selectionChange" @select-all="selectAllChange" @cell-mouse-enter="handleMouseEnter"
|
|
|
- @cell-mouse-leave="handleMouseLeave" :highlight-current-row="highlightCurrentRow"
|
|
|
- @current-change="currentChange" v-loading="loading" :show-summary='props.showSummary' border>
|
|
|
- <!-- 空内容自定义 -->
|
|
|
- <template #empty>
|
|
|
- <div class="flex f-c a-c ">
|
|
|
- <img src="../../assets/images/empty.png" alt="">
|
|
|
- <span style="font-size: 14px;color: #909399;">暂无数据</span>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <el-table-column type="selection" v-if="showSelect" :selectable="selectable" width="55" fixed="left" />
|
|
|
- <el-table-column type="expand" v-if="secondaryTable">
|
|
|
- <template #default="props">
|
|
|
- <div>
|
|
|
- <el-table :data="props.row.children">
|
|
|
- <el-table-column v-for="column in secondaryColumns" :key="column.prop" :prop="column.prop"
|
|
|
- :label="column.label" :sortable="column.sortable ? 'custom' : false" :width="column.width">
|
|
|
- <template #header>
|
|
|
- <slot name="search" :slotData="column"></slot>
|
|
|
- </template>
|
|
|
- <template #default="scope">
|
|
|
- <RouterLink v-if="column.component === 'RouterLink'" :to="getRouterLinkTo(scope.row, column)"
|
|
|
- class="custom-link">
|
|
|
- {{ scope.row[column.prop] }}
|
|
|
- </RouterLink>
|
|
|
- <el-tag v-else-if="column.component === 'Tag'" :type="getTagTypeAndText(scope.row, column).type">
|
|
|
- {{ getTagTypeAndText(scope.row, column).text }}
|
|
|
- </el-tag>
|
|
|
- <ImagePreview v-else-if="column.component === 'Image'" :src="getImgTo(scope.row, column)"
|
|
|
- width="50px" height="50px"></ImagePreview>
|
|
|
- <template v-else>
|
|
|
- {{ getDisplayText(scope.row, column) }}
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作" fixed="right" :width="props.columnwidth">
|
|
|
- <template #default="scope">
|
|
|
- <slot name="secondary" :secondaryData="scope.row"></slot>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
+ <!-- <OverlayScrollbarsComponent defer :options="{
|
|
|
+ scrollbars: {
|
|
|
+ autoHide: 'leave', // 鼠标离开时自动隐藏
|
|
|
+ clickScroll: true, // 允许点击轨道滚动
|
|
|
+ theme: 'my-theme', // 自定义主题
|
|
|
+ }
|
|
|
+ }"> -->
|
|
|
+ <el-table ref="multipleTableRef" :row-key="rowKey"
|
|
|
+ :header-cell-style="{ 'background-color': '#F7F7F9', 'border-bottom': '1px solid #EEF1F6', 'font-size': '15px', 'color': '#333', 'padding': '10px 0' }"
|
|
|
+ :data="props.tableData" :height="tableHeight" :max-height="maxHeight" table-layout="fixed"
|
|
|
+ style="width: 100%;" @selection-change="selectionChange" @select-all="selectAllChange"
|
|
|
+ @cell-mouse-enter="handleMouseEnter" @cell-mouse-leave="handleMouseLeave"
|
|
|
+ :highlight-current-row="highlightCurrentRow" @current-change="currentChange" v-loading="loading"
|
|
|
+ :show-summary='props.showSummary' border>
|
|
|
+ <!-- 空内容自定义 -->
|
|
|
+ <template #empty>
|
|
|
+ <div class="flex f-c a-c ">
|
|
|
+ <img src="../../assets/images/empty.png" alt="">
|
|
|
+ <span style="font-size: 14px;color: #909399;">暂无数据</span>
|
|
|
</div>
|
|
|
-
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column v-if="showIndex" type="index" label="序号" width="55" />
|
|
|
- <el-table-column v-for="column in columns" :key="column.prop" :prop="column.prop" :label="column.label"
|
|
|
- :sortable="column.sortable ? 'custom' : false" :width="column.width" :filters="column.filters"
|
|
|
- :filter-method="column.filters ? (value, row) => row[column.prop] === value : undefined"
|
|
|
- :filtered-value="column.filteredValue ? column.filteredValue : undefined" :fixed="column.fixed || false"
|
|
|
- :align="column.align ? column.align : 'center'" show-overflow-tooltip>
|
|
|
- <template #header>
|
|
|
- <slot name="search" :slotData="column"></slot>
|
|
|
</template>
|
|
|
- <template #default="scope" v-if="column.component === 'customSlot'">
|
|
|
- <slot name="customSlot" :data="scope.row" :bodyCell="{ scope, column }"></slot>
|
|
|
- <slot :name="column.prop" :data="scope.row" :bodyCell="{ scope, column }"></slot>
|
|
|
- </template>
|
|
|
- <template #default="scope" v-else>
|
|
|
- <RouterLink v-if="column.component === 'RouterLink'" :to="getRouterLinkTo(scope.row, column)"
|
|
|
- class="custom-link">
|
|
|
- {{ scope.row[column.prop] }}
|
|
|
- </RouterLink>
|
|
|
- <div v-else-if="column.component === 'html'">
|
|
|
- <span v-html="htmlEvent(scope.row, column).html"></span>
|
|
|
- </div>
|
|
|
- <el-tag v-else-if="column.component === 'Tag'" :type="getTagTypeAndText(scope.row, column).type">
|
|
|
- {{ getTagTypeAndText(scope.row, column).text }}
|
|
|
- </el-tag>
|
|
|
- <ImagePreview v-else-if="column.component === 'Image'" :src="getImgTo(scope.row, column)" width="50px"
|
|
|
- height="50px"></ImagePreview>
|
|
|
- <span v-else>
|
|
|
- <div
|
|
|
- v-if="typeof getDisplayText(scope.row, column) === 'string' && getDisplayText(scope.row, column).includes('\n')"
|
|
|
- class="flex f-c ">
|
|
|
- <span v-for="(line, index) in getDisplayText(scope.row, column).split('\n')" :key="index">{{ line
|
|
|
- }}</span>
|
|
|
+ <el-table-column type="selection" v-if="showSelect" :selectable="selectable" width="55" fixed="left" />
|
|
|
+ <el-table-column type="expand" v-if="secondaryTable">
|
|
|
+ <template #default="props">
|
|
|
+ <div>
|
|
|
+ <el-table :data="props.row.children">
|
|
|
+ <el-table-column v-for="column in secondaryColumns" :key="column.prop" :prop="column.prop"
|
|
|
+ :label="column.label" :sortable="column.sortable ? 'custom' : false" :width="column.width">
|
|
|
+ <template #header>
|
|
|
+ <slot name="search" :slotData="column"></slot>
|
|
|
+ </template>
|
|
|
+ <template #default="scope">
|
|
|
+ <RouterLink v-if="column.component === 'RouterLink'" :to="getRouterLinkTo(scope.row, column)"
|
|
|
+ class="custom-link">
|
|
|
+ {{ scope.row[column.prop] }}
|
|
|
+ </RouterLink>
|
|
|
+ <el-tag v-else-if="column.component === 'Tag'" :type="getTagTypeAndText(scope.row, column).type">
|
|
|
+ {{ getTagTypeAndText(scope.row, column).text }}
|
|
|
+ </el-tag>
|
|
|
+ <ImagePreview v-else-if="column.component === 'Image'" :src="getImgTo(scope.row, column)"
|
|
|
+ width="50px" height="50px"></ImagePreview>
|
|
|
+ <template v-else>
|
|
|
+ {{ getDisplayText(scope.row, column) }}
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" fixed="right" :width="props.columnwidth">
|
|
|
+ <template #default="scope">
|
|
|
+ <slot name="secondary" :secondaryData="scope.row"></slot>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
</div>
|
|
|
+
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="showIndex" type="index" label="序号" width="55" />
|
|
|
+ <el-table-column v-for="column in columns" :key="column.prop" :prop="column.prop" :label="column.label"
|
|
|
+ :sortable="column.sortable ? 'custom' : false" :width="column.width" :filters="column.filters"
|
|
|
+ :filter-method="column.filters ? (value, row) => row[column.prop] === value : undefined"
|
|
|
+ :filtered-value="column.filteredValue ? column.filteredValue : undefined" :fixed="column.fixed || false"
|
|
|
+ :align="column.align ? column.align : 'center'" show-overflow-tooltip>
|
|
|
+ <template #header>
|
|
|
+ <slot name="search" :slotData="column"></slot>
|
|
|
+ </template>
|
|
|
+ <template #default="scope" v-if="column.component === 'customSlot'">
|
|
|
+ <slot name="customSlot" :data="scope.row" :bodyCell="{ scope, column }"></slot>
|
|
|
+ <slot :name="column.prop" :data="scope.row" :bodyCell="{ scope, column }"></slot>
|
|
|
+ </template>
|
|
|
+ <template #default="scope" v-else>
|
|
|
+ <RouterLink v-if="column.component === 'RouterLink'" :to="getRouterLinkTo(scope.row, column)"
|
|
|
+ class="custom-link">
|
|
|
+ {{ scope.row[column.prop] }}
|
|
|
+ </RouterLink>
|
|
|
+ <div v-else-if="column.component === 'html'">
|
|
|
+ <span v-html="htmlEvent(scope.row, column).html"></span>
|
|
|
+ </div>
|
|
|
+ <el-tag v-else-if="column.component === 'Tag'" :type="getTagTypeAndText(scope.row, column).type">
|
|
|
+ {{ getTagTypeAndText(scope.row, column).text }}
|
|
|
+ </el-tag>
|
|
|
+ <ImagePreview v-else-if="column.component === 'Image'" :src="getImgTo(scope.row, column)" width="50px"
|
|
|
+ height="50px"></ImagePreview>
|
|
|
<span v-else>
|
|
|
- {{ getDisplayText(scope.row, column) }}
|
|
|
+ <div
|
|
|
+ v-if="typeof getDisplayText(scope.row, column) === 'string' && getDisplayText(scope.row, column).includes('\n')"
|
|
|
+ class="flex f-c ">
|
|
|
+ <span v-for="(line, index) in getDisplayText(scope.row, column).split('\n')" :key="index">{{ line
|
|
|
+ }}</span>
|
|
|
+ </div>
|
|
|
+ <span v-else>
|
|
|
+ {{ getDisplayText(scope.row, column) }}
|
|
|
+ </span>
|
|
|
</span>
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作" fixed="right" :width="props.columnwidth" v-if="props.showOperation" align="center">
|
|
|
- <template #default="scope">
|
|
|
- <div class="flex a-c j-c">
|
|
|
- <slot name="operation" :operationData="scope.row"></slot>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" fixed="right" :width="props.columnwidth" v-if="props.showOperation"
|
|
|
+ align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <div class="flex a-c j-c">
|
|
|
+ <slot name="operation" :operationData="scope.row"></slot>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <!-- </OverlayScrollbarsComponent> -->
|
|
|
</div>
|
|
|
<div class="page_box" v-if="props.pageInfo">
|
|
|
<el-pagination v-model:current-page="props.pageInfo.pageNum" v-model:page-size="props.pageInfo.pageSize"
|
|
|
@@ -109,6 +119,8 @@
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
+import { OverlayScrollbarsComponent } from 'overlayscrollbars-vue';
|
|
|
+
|
|
|
import { defineProps, ref, onMounted, defineEmits } from "vue";
|
|
|
import type { TableInstance } from "element-plus";
|
|
|
|