<template>
  <PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
    <LeftTree v-if="!pathDivShow" ref="childRef" class="w-1/5 xl:w-1/6" @select="handleSelect" />
    <div v-if="!pathDivShow" class="w-4/5 xl:w-5/6">
      <BasicTable @register="registerTable" :searchInfo="searchInfo">
        <template #toolbar>
          <span v-for="(f, index) in floders" :key="f.id" class="floderTitle">
            <span v-if="f.name != '全部文件'" style="margin-right: 10px"> / </span>
            <a-tooltip placement="top">
              <template #title>
                <span>{{ f.name }}</span>
              </template>
              <span class="flodersname" @click="getChildrenByProp(f, index)"> {{ f.name }}</span>
            </a-tooltip>
          </span>
          <div class="floderOtherButton">
            <a-button :icon="h(BorderHorizontalOutlined)" @click="openComparisonModal">
              变化检测
            </a-button>
            <a-button :icon="h(PlusOutlined)" type="primary" @click="addFolder">
              新建文件夹
            </a-button>
            <a-button :icon="h(ColumnHeightOutlined)" @click="moveFolderOrFile">移动</a-button>
            <a-button :icon="h(DeleteOutlined)" @click="deleteFolderOrFile">删除 </a-button>
            <!-- <a-button :icon="h(DownloadOutlined)" @click="compressFolderOrFile">压缩</a-button> -->
            <a-radio-group v-model:value="tableType">
              <a-radio-button value="table"><BarsOutlined /></a-radio-button>
              <a-radio-button value="store"><AppstoreOutlined /></a-radio-button>
            </a-radio-group>
          </div>
        </template>
        <template #bodyCell="{ column, record }">
          <div v-if="tableTypeAfterShow == 'table'">
            <template v-if="column.key === 'name'">
              <!-- 文件夹 -->
              <FolderOpenOutlined v-if="!record.objectKey" style="font-size: 20px" />
              <!-- 图片 -->
              <img
                v-if="record.objectKey && record.objectKey.includes('jpeg')"
                :src="`${VITE_GLOB_MEDIALIBRARY_IMAGE_URL + (record.minipic ? record.minipic : record.objectKey)}`"
                :width="30"
                :height="20"
              />
              <!-- 视频 -->
              <PlaySquareTwoTone
                v-if="record.objectKey && record.objectKey.includes('mp4')"
                style="font-size: 20px"
              />
              <!-- 文件夹或者图片、视频 -->
              <span
                v-if="
                  !record.objectKey ||
                  (record.objectKey &&
                    (record.objectKey.includes('jpeg') || record.objectKey.includes('mp4')))
                "
                @click="lookRecord(record)"
                @mouseover="record.isHovered = true"
                @mouseout="record.isHovered = false"
                :style="{
                  textDecoration: record.isHovered ? 'underline' : 'none',
                  cursor: record.isHovered ? 'pointer' : 'default',
                  marginLeft: '5px',
                }"
              >
                {{ record.name }}
              </span>
              <!-- 其他文件 -->
              <FileOutlined
                v-if="
                  record.objectKey &&
                  !record.objectKey.includes('jpeg') &&
                  !record.objectKey.includes('mp4')
                "
                style="font-size: 20px"
              />
              <span
                v-if="
                  record.objectKey &&
                  !record.objectKey.includes('jpeg') &&
                  !record.objectKey.includes('mp4')
                "
                :style="{
                  marginLeft: '5px',
                }"
              >
                {{ record.name }}
              </span>
            </template>
            <template v-if="column.key === 'createTime'">
              <span
                style="width: 100%; display: flex; align-items: center; justify-content: center"
              >
                {{ record.createTime ? record.createTime : '-' }}
              </span>
            </template>
            <template v-if="column.key === 'size'">
              <span
                style="width: 100%; display: flex; align-items: center; justify-content: center"
              >
                {{ record.size ? record.size : '-' }}
              </span>
            </template>
            <template v-if="column.key === 'fileTags'">
              <div v-if="record.fileTags && record.fileTags.length > 0">
                <a-tag color="success" v-for="la in record.fileTags" :key="la">{{ la }}</a-tag>
              </div>
            </template>
            <template v-if="column.key === 'action'">
              <div class="svg-container">
                <a-tooltip placement="top">
                  <template #title>
                    <span>重命名</span>
                  </template>
                  <a-button type="text">
                    <EditOutlined @click="renameRecord(record)" />
                  </a-button>
                </a-tooltip>
                <a-tooltip placement="top">
                  <template #title>
                    <div>查看地图图片历史路径</div>
                    <!-- <div>只展示在地图上加载的图片</div> -->
                  </template>
                  <a-button
                    type="text"
                    v-if="record.objectKey && record.objectKey.includes('.jpeg')"
                  >
                    <BorderInnerOutlined @click="showPathDiv(record)" />
                  </a-button>
                </a-tooltip>
              </div>
            </template>
          </div>
        </template>
      </BasicTable>
      <div v-if="tableTypeAfterShow == 'store'" class="storeDivsAllChoose">
        <a-checkbox v-model:checked="checkNameChecked" @change="changeStore($event, 'allChoose')">
          全选
        </a-checkbox>
      </div>
      <div v-if="tableTypeAfterShow == 'store'" class="storeDivList">
        <div
          v-for="record in showTableData"
          :key="record.id"
          class="storeDiv"
          :style="{ background: record.isHovered ? '#D5E8FC' : '#ffffff' }"
          @mouseover="record.isHovered = true"
          @mouseout="record.isHovered = false"
        >
          <!-- 选中 -->
          <div style="position: absolute; top: 0px; left: 5px">
            <a-checkbox v-model:checked="record.checked" @change="changeStore($event, record)" />
          </div>
          <!-- 文件夹 -->
          <FolderOpenOutlined
            v-if="!record.objectKey"
            style="font-size: 40px"
            @click="lookRecord(record)"
          />
          <!-- 图片 -->
          <img
            v-if="record.objectKey && record.objectKey.includes('jpeg')"
            :src="`${VITE_GLOB_MEDIALIBRARY_IMAGE_URL + (record.minipic ? record.minipic : record.objectKey)}`"
            :width="100"
            :height="60"
            style="position: absolute; top: 10px; left: 32.5px"
            @click="lookRecord(record)"
          />
          <!-- 视频 -->
          <PlaySquareTwoTone
            v-if="record.objectKey && record.objectKey.includes('mp4')"
            style="font-size: 40px"
          />
          <!-- 文件夹或者图片、视频 -->
          <span
            v-if="
              !record.objectKey ||
              (record.objectKey &&
                (record.objectKey.includes('jpeg') || record.objectKey.includes('mp4')))
            "
            class="storeDivSpanName"
            :style="{
              textDecoration: record.isHovered ? 'underline' : 'none',
              cursor: record.isHovered ? 'pointer' : 'default',
            }"
            @click="lookRecord(record)"
          >
            {{ record.name }}
          </span>
          <!-- 其他文件 -->
          <FileOutlined
            v-if="
              record.objectKey &&
              !record.objectKey.includes('jpeg') &&
              !record.objectKey.includes('mp4')
            "
            style="font-size: 40px"
          />
          <span
            v-if="
              record.objectKey &&
              !record.objectKey.includes('jpeg') &&
              !record.objectKey.includes('mp4')
            "
            class="storeDivSpanName"
          >
            {{ record.name }}
          </span>
        </div>
      </div>
    </div>

    <!-- 新建文件夹弹窗 -->
    <AddFolderModal @register="addFolderModal" @handleSuccess="handleSuccess" />
    <!-- 移动弹窗 -->
    <MoveFileModal @register="moveFileModal" @handleSuccess="handleSuccess" />
    <!-- 压缩弹窗 -->
    <CompressFileModal @register="compressFileModal" @handleSuccess="handleSuccess" />
    <!-- 重命名弹窗 -->
    <RenameModal @register="renameModal" @handleSuccess="handleSuccess" />
    <!-- 预览弹窗 -->
    <a-modal
      v-model:open="open"
      width="100%"
      wrap-class-name="full-modal"
      :centered="true"
      :closable="false"
      :footer="null"
      :destroyOnClose="true"
      :keyboard="false"
      :mask="false"
      :maskClosable="false"
    >
      <Preview
        v-if="nowPreviewRecord.objectKey"
        :nowPreviewRecord="nowPreviewRecord"
        :previewRecordList="previewRecordList"
        @chooseNowPreviewRecord="chooseNowPreviewRecord"
        @closeModal="closeModal"
        @handleSuccessPreview="handleSuccessPreview"
        @openPathModal="openPathModal"
      />
    </a-modal>
    <!-- 变化检测弹窗 -->
    <a-modal
      v-model:open="comparisonOpen"
      width="100%"
      wrap-class-name="full-modal"
      :centered="true"
      :closable="false"
      :footer="null"
      :destroyOnClose="true"
      :keyboard="false"
      :mask="false"
      :maskClosable="false"
    >
      <Comparison @closeComparisonModal="closeComparisonModal" />
    </a-modal>

    <Path
      v-if="pathDivShow"
      :pathDivShow="pathDivShow"
      :allImageDataList="allImageDataList"
      :nowShowImageData="nowShowImageData"
      :floderName="floderName"
      @closePathModal="closePathModal"
      @handleSuccessPath="handleSuccessPath"
    />
  </PageWrapper>
</template>
<script lang="ts" setup>
  import { reactive, ref, watch, h } from 'vue';
  import { BasicTable, useTable, TableAction } from '@/components/Table';
  import { PageWrapper } from '@/components/Page';
  import { useModal } from '@/components/Modal';
  import {
    EditOutlined,
    DeleteOutlined,
    BorderHorizontalOutlined,
    PlusOutlined,
    ColumnHeightOutlined,
    DownloadOutlined,
    AppstoreOutlined,
    BarsOutlined,
    FolderOutlined,
    FolderOpenOutlined,
    EyeOutlined,
    PlaySquareTwoTone,
    FileOutlined,
    BorderInnerOutlined,
  } from '@ant-design/icons-vue';
  import {
    GetMediaFile,
    UpdatePicStatus,
    Deletepic,
    UpdatePicName,
    UpdatePicParentKey,
  } from '@/api/demo/mediaLibrary';
  import LeftTree from './LeftTree.vue';
  import Preview from './preview/index.vue';
  import Comparison from './comparison/index.vue';
  import Path from './path/index.vue';
  import { AddFolderModal, MoveFileModal, CompressFileModal, RenameModal } from './modal/modal';
  import { PermissionBtn } from '@/components/PermissionBtn/index';
  import { getAppEnvConfig } from '@/utils/env';
  import { useMessage } from '@/hooks/web/useMessage';
  import { columns, searchFormSchema, svg_showOnMap_0, svg_showOnMap_1 } from './modal.data';
  import dayjs from 'dayjs';
  import { cloneDeep } from 'lodash-es';

  const { VITE_GLOB_MEDIALIBRARY_IMAGE_URL } = getAppEnvConfig();
  const { createConfirm, createMessage } = useMessage();

  // 表格数据--------------------------------------------------------------------
  // 展示数据
  const showTableData = ref();
  // 表格还是文件夹
  const tableType = ref('table');
  const tableTypeAfterShow = ref('table');
  const tableHeight: any = ref(0);
  watch(
    () => tableType.value,
    (newval) => {
      // 格子
      if (newval === 'store') {
        // 数据
        GetMediaFile({
          parentKey: nowParentKey.value,
          page: 1,
          limit: 1000,
        }).then((res) => {
          showTableData.value = res.items;
          tableTypeAfterShow.value = newval;
          // 表格-隐藏
          const containers = document.querySelectorAll('.ant-table-container');
          tableHeight.value = containers[0] ? containers[0]?.scrollHeight : 0;
          if (containers) {
            containers.forEach((container) => {
              container.style.display = 'none';
            });
          }
          // 分页-隐藏
          const paginations = document.querySelectorAll('.ant-pagination');
          if (paginations) {
            paginations.forEach((pagination) => {
              pagination.style.display = 'none';
            });
          }
          // 选中：表格→格子
          let selectRowsIdArray = getSelectRows().map((item) => item.id);
          showTableData.value.forEach((item) => {
            if (selectRowsIdArray.includes(item.id)) {
              item.checked = true;
              changeStore(
                {
                  target: {
                    checked: true,
                  },
                },
                item,
              );
            }
          });
        });
      }
      // 表格
      if (newval === 'table') {
        reload().then((res) => {
          tableTypeAfterShow.value = newval;
          // 表格-显示
          const containers = document.querySelectorAll('.ant-table-container');
          tableHeight.value = containers[0] ? containers[0]?.scrollHeight : 0;
          if (containers) {
            containers.forEach((container) => {
              container.style.display = 'block';
            });
          }
          // 分页-显示
          const paginations = document.querySelectorAll('.ant-pagination');
          if (paginations) {
            paginations.forEach((pagination) => {
              pagination.style.display = 'block';
            });
          }
          // 选中：格子→表格
          let selectRowsIdArray = showTableData.value.filter((item) => item.checked);
          setSelectedRows(selectRowsIdArray);
        });
      }
    },
  );

  // 单选框选择
  const checkNameChecked = ref(false);
  // 表格or文件夹切换
  function changeStore(e, record) {
    if (typeof record == 'string') {
      if (e.target.checked) {
        checkNameChecked.value = true;
        showTableData.value = showTableData.value.map((item) => ({
          ...item,
          checked: true,
        }));
      } else {
        checkNameChecked.value = false;
        showTableData.value = showTableData.value.map((item) => ({
          ...item,
          checked: false,
        }));
      }
    } else {
      if (showTableData.value.filter((item) => item.checked).length == showTableData.value.length) {
        checkNameChecked.value = true;
      } else {
        checkNameChecked.value = false;
      }
    }
  }

  // 表格
  // 目录
  const floders = ref([
    {
      id: '0',
      name: '全部文件',
    },
  ]);
  const nowParentKey = ref('0');
  const searchInfo = reactive<Recordable>({});
  const searchParams = ref();
  const [
    registerTable,
    { reload, getDataSource, getSelectRows, setSelectedRows, clearSelectedRowKeys },
  ] = useTable({
    api: GetMediaFile,
    rowKey: 'id',
    columns,
    formConfig: {
      labelWidth: 120,
      schemas: searchFormSchema,
    },
    rowSelection: {
      type: 'checkbox',
    },
    isTreeTable: false,
    striped: false,
    bordered: false,
    inset: false,
    tableSetting: {
      redo: false,
      size: false,
      setting: false,
    },
    useSearchForm: true,
    showIndexColumn: false,
    showTableSetting: true,
    beforeFetch: (data) => {
      // 接口请求前 参数处理
      let temp = {
        ...data,
        page: tableTypeAfterShow.value == 'table' ? data.page : 1,
        limit: tableTypeAfterShow.value == 'table' ? data.limit : 1000,
        parentKey: nowParentKey.value,
      };
      return temp;
    },
    handleSearchInfoFn(info) {
      if (info.startTime && info.endTime) {
        info = {
          ...info,
          startTime: dayjs(info.startTime).format('YYYY-MM-DD') + ' 00:00:00',
          endTime: dayjs(info.endTime).format('YYYY-MM-DD') + ' 23:59:59',
        };
      }
      searchParams.value = info;
      return info;
    },
    afterFetch: (res) => {
      res.forEach((arr) => {
        if (arr.fileTags) {
          arr.fileTags = JSON.parse(arr.fileTags);
        } else {
          arr.fileTags = [];
        }
        if (arr.graffitiJson) {
          arr.graffitiJson = JSON.parse(arr.graffitiJson);
        } else {
          arr.graffitiJson = [];
        }
      });
      return res;
    },
  });

  // 目录跳跃
  function getChildrenByProp(f, index) {
    nowParentKey.value = f.id;
    floders.value = floders.value.splice(0, index + 1);
    clearSelectedRowKeys();
    reload().then((res) => {
      showTableData.value = res;
    });
  }

  // 弹窗----------------------------------------------------------------------
  // 左侧目录选择
  function handleSelect(orgId = '') {
    searchInfo.orgId = orgId;
    reload();
  }
  // 刷新表格
  const childRef = ref<any>();
  function handleSuccessPreview(record = null) {
    clearSelectedRowKeys();
    childRef.value.fetch();
    reload();
    setTimeout(() => {
      if (record) {
        // 删除后-刷新当前查看项
        previewRecordList.value.forEach((item, index) => {
          if (record.id == item.id) {
            previewRecordList.value.splice(index, 1);
            if (previewRecordList.value.length != 0) {
              nowPreviewRecord.value = previewRecordList.value[index];
            } else {
              open.value = false;
            }
          }
        });
      } else {
        // 刷新当前查看项
        GetMediaFile({
          ...searchParams.value,
          parentKey: nowParentKey.value,
          page: 1,
          limit: 1000,
        }).then((res) => {
          previewRecordList.value = uniqueByKey(res.items, nowPreviewRecord.value).sort((a, b) => {
            return dayjs(a.createTime) - dayjs(b.createTime);
          });
          nowPreviewRecord.value = getDataSource().find(
            (item) => item.id == nowPreviewRecord.value.id,
          );
        });
      }
    }, 500);
  }
  // 新建文件夹
  const [addFolderModal, { openModal: openAddFolderModal }] = useModal();
  // 移动
  const [moveFileModal, { openModal: openMoveFileModal }] = useModal();
  // 压缩
  const [compressFileModal, { openModal: openCompressFileModal }] = useModal();
  // 重命名
  const [renameModal, { openModal: openRenameModal }] = useModal();
  // 刷新
  function handleSuccess(record = null) {
    clearSelectedRowKeys();
    childRef.value.fetch();
    reload();
  }
  // 新建文件夹
  function addFolder() {
    openAddFolderModal(true, {
      parentKey: nowParentKey.value,
    });
  }
  // 移动文件
  function moveFolderOrFile() {
    let rows = getSelectRows();
    if (rows.length > 0) {
      if (rows.some((item) => item.parentKey == '0' && !item.objectKey)) {
        return createMessage.warn('根目录的文件夹不能移动!');
      }
      const records = rows;
      openMoveFileModal(true, {
        records,
      });
    } else {
      return createMessage.warn('请选择一个或者多个文件/文件夹进行移动');
    }
  }
  // 重命名
  function renameRecord(record) {
    openRenameModal(true, {
      record,
    });
  }
  // 删除
  async function deleteFolderOrFile() {
    let rows = getSelectRows();
    if (rows.length == 0) {
      return createMessage.warn('请选择一个或者多个文件/文件夹进行删除');
    }
    createConfirm({
      iconType: 'info',
      title: '删除',
      content: '确定要删除选择的文件/文件夹吗？',
      onOk: async () => {
        let ids = '';
        rows.forEach((row) => {
          if (!ids) {
            ids = row.id;
          } else {
            ids = ids + ',' + row.id;
          }
        });
        Deletepic({
          ids: ids,
        }).then((res) => {
          handleSuccess();
          createMessage.success(res);
        });
      },
    });
  }

  // 查看弹窗----------------------------------------------------------------------------
  const open = ref(false);
  // 目前展示图片
  const nowPreviewRecord: any = ref();
  // 目前展示图片的列表
  const previewRecordList: any = ref([]);
  // 查看-打开这个文件夹或者展示这个图片
  async function lookRecord(record) {
    // 展示这个图片后者视频
    if (record.objectKey) {
      GetMediaFile({
        ...searchParams.value,
        parentKey: nowParentKey.value,
        page: 1,
        limit: 100,
      }).then((res) => {
        nowPreviewRecord.value = record;
        // 同文件下的图片或者视频
        previewRecordList.value = uniqueByKey(res.items, record).sort((a, b) => {
          return dayjs(a.createTime) - dayjs(b.createTime);
        });
        open.value = true;
      });
    }
    // 文件夹
    if (!record.objectKey) {
      nowParentKey.value = record.id;
      floders.value.push({
        id: nowParentKey.value,
        name: record.name,
      });
      reload().then((res) => {
        showTableData.value = res;
      });
    }
  }
  function uniqueByKey(arrlist, record) {
    let resultList: any = [];
    if (record.objectKey.includes('.jpeg')) {
      arrlist
        .filter((item) => item.objectKey && item.objectKey.includes('jpeg'))
        .forEach((item) => {
          if (!item.fileTags) {
            item.fileTags = [];
          } else {
            item.fileTags = JSON.parse(item.fileTags);
          }
          if (!item.graffitiJson) {
            item.graffitiJson = [];
          } else {
            item.graffitiJson = JSON.parse(item.graffitiJson);
          }
          resultList.push(item);
        });
    }
    if (record.objectKey.includes('mp4')) {
      arrlist
        .filter((item) => item.objectKey && item.objectKey.includes('mp4'))
        .forEach((item) => {
          if (!item.fileTags) {
            item.fileTags = [];
          } else {
            item.fileTags = JSON.parse(item.fileTags);
          }
          if (!item.graffitiJson) {
            item.graffitiJson = [];
          } else {
            item.graffitiJson = JSON.parse(item.graffitiJson);
          }
          resultList.push(item);
        });
    }
    return resultList;
  }
  // 图片选择
  function chooseNowPreviewRecord(value) {
    nowPreviewRecord.value = value;
  }
  // 关闭
  function closeModal() {
    document.body.style.cursor = 'auto';
    open.value = false;
  }

  // 变化检测弹窗----------------------------------------------------------------------
  const comparisonOpen = ref(false);
  // 打开变化检测弹窗
  function openComparisonModal() {
    comparisonOpen.value = true;
  }
  // 关闭变化检测弹窗
  function closeComparisonModal() {
    comparisonOpen.value = false;
  }

  // 路径地图----------------------------------------------------------------------
  // 打开路径地图
  const floderName = ref('');
  const nowShowImageData = ref({});
  const allImageDataList: any = ref([]);
  // 展示路径地图部分
  const pathDivShow = ref(false);
  function showPathDiv(record) {
    GetMediaFile({
      parentKey: record.parentKey,
      page: 1,
      limit: 1000,
    }).then((res) => {
      allImageDataList.value = res.items.filter(
        (item) => item.objectKey && item.objectKey.includes('.jpeg'),
      );
      allImageDataList.value = allImageDataList.value.sort((a, b) => {
        return dayjs(a.createTime) - dayjs(b.createTime);
      });
      allImageDataList.value.forEach((arr) => {
        if (arr.fileTags) {
          arr.fileTags = JSON.parse(arr.fileTags);
        } else {
          arr.fileTags = [];
        }
        if (arr.graffitiJson) {
          arr.graffitiJson = JSON.parse(arr.graffitiJson);
        } else {
          arr.graffitiJson = [];
        }
      });
      nowShowImageData.value = allImageDataList.value.find((item) => item.id == record.id);
      floderName.value = floders.value[floders.value.length - 1].name;
      pathDivShow.value = true;
    });
  }
  // 关闭路径地图弹窗
  function closePathModal() {
    nowShowImageData.value = {};
    pathDivShow.value = false;
  }
  // 刷新
  function handleSuccessPath(value) {
    setTimeout(() => {
      showPathDiv(value);
      reload();
    }, 500);
  }
</script>
<style lang="less" scoped>
  .floderTitle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: fit-content;
    cursor: pointer;
  }

  ::v-deep .vben-basic-table-header__toolbar {
    display: flex !important;
    justify-content: flex-start !important;
  }
  .floderOtherButton {
    position: absolute;
    right: 0px;
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
  }
  .flodersname {
    max-width: 120px;
    white-space: nowrap; /* 禁止换行 */
    overflow: hidden; /* 超出部分隐藏 */
    text-overflow: ellipsis; /* 超出显示省略号 */
  }

  ::v-deep .floderTitle .ant-btn {
    padding-left: 0px !important;
    padding-right: 0px !important;
  }
  ::v-deep .floderTitle .ant-btn-text {
    padding-left: 0px !important;
    padding-right: 0px !important;
  }

  ::v-deep .ant-table-row-expand-icon {
    display: none !important;
  }
  ::v-deep .ant-table-row-expand-icon-collapsed {
    display: none !important;
  }

  .storeDivsAllChoose {
    width: 100%;
    height: 40px;
    margin: 0px 0px 16px 16px;
    padding-left: 16px;
    background: #ffffff;
    display: flex;
    align-items: center;
    justify-content: flex-start;
  }

  .storeDivList {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    align-items: flex-start;

    width: 100%;
    height: 72.5%;
    background: #ffffff;
    margin: 0px 16px 16px 16px;
    overflow-y: auto;

    .storeDiv {
      position: relative;
      width: 165px;
      height: 130px;
      outline: 1px solid #000000;
      margin: 16px;

      display: flex;
      align-items: center;
      justify-content: center;

      .storeDivSpanName {
        position: absolute;
        bottom: 16px;
        left: 0px;
        width: 100%;
        height: 30px;
        cursor: pointer;

        white-space: pre-wrap;
        word-break: break-all;
        overflow-wrap: break-word;
        max-width: 100%;
        display: block;
      }
    }
  }

  .svg-container {
    display: flex;
    align-items: center;
    justify-content: center;
  }

  ::v-deep .vben-basic-table {
    height: fit-content !important;
  }
  ::v-deep .full-modal {
    height: 100% !important;
  }
  ::v-deep .ant-modal-body {
    height: 100% !important;
  }
</style>
