Merge remote-tracking branch 'origin/main' into main

main
zhangxiaodi1 9 months ago
commit 5f7f0a87e3

@ -49,7 +49,7 @@
"mitt": "^3.0.1",
"mockjs": "^1.1.0",
"nprogress": "^0.2.0",
"pdfjs-dist": "^2.11.338",
"pdfjs-dist": "2.11.338",
"pinia": "^2.1.7",
"pinia-plugin-persist": "^1.0.0",
"qrcode": "^1.5.3",

@ -47,9 +47,9 @@ export const exportExcelApi = (params: any) => {
return request.doExport({ url: '/RepDataProblem/sdi/reporting/RepDataProblem/RepDataProblemExportXls', params });
};
/** 导出Word */
export const exportWordApi = (params: any) => {
return request.doExport({ url: '/RepDataProblem/sdi/reporting/RepDataProblem/RepDataProblemExportWord', params });
/** 生成WordBytes */
export const saveWordBytes = (tId?: string, organCode?: string, dataDate?: string) : Promise<IResponse> => {
return request.postJson({ url: '/RepDataProblem/sdi/reporting/RepDataProblem/RepDataProblemSaveWordBytes', data:{tId,organCode,dataDate}});
};
/** 获取某个字典 */

@ -1,295 +0,0 @@
<template>
<div class="pdf-viewer">
<div class="fixedToolBar">
<!-- 其中包含的功能有分页页数跳转文件下载 -->
<i @click="downloadFile" class="fa fa-download cursor-pointer download" hover-color="var(--el-color-primary)"></i>
</div>
<div class="sidebar">
<ul>
<li v-for="(page,pageIndex) in pagesInfo" :key="page.number" @click="navigateToPage(page.number)">
<a>
<img :src="page.thumbnail" alt="Page Thumbnail" :class="pageIndex===currentPage?'thumbnail active':'thumbnail'" />
<span>{{ pageIndex+1 }}</span>
</a>
</li>
</ul>
</div>
<div class="pdf-container" @scroll="handleScroll">
<!-- <input type="file" @change="handleFileChange" accept="application/pdf" /> -->
<div ref="pdfContainer" class="pdf-pages"></div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import * as pdfjsLib from 'pdfjs-dist';
import 'pdfjs-dist/build/pdf.worker.entry';
import { useRoute } from 'vue-router';
import { ElMessage } from 'element-plus';
import {queryFileFlowRepTemplateApi,exportTemplateApi} from '@/api/reporting/RepTemplate/RepTemplate';
onMounted(() => {
window.addEventListener('scroll', handleScroll);
});
onUnmounted(() => {
window.removeEventListener('scroll', handleScroll);
});
// worker
pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/build/pdf.worker.entry';
const pdfContainer = ref(null);
const pdfDocument = ref(null);
const pdfInfo = ref({});
const pagesInfo = ref([]);
let currentPage = ref(0);//
let pageHeight = ref(0);//canvas
const route = useRoute();
// 线
//
const pageQuery = ref(route || null);
const params = pageQuery.value?.query?.fileData;
//
const downLoadErrorMsg = {
"1001":"预览失败,文件路径不存在",
"1002":"预览失败,未找到文件信息",
"1003":"预览失败,请联系管理员",
}
//
const generateThumbnails = async () => {
if (!pdfDocument.value) return;
const numPages = pdfDocument.value.numPages;
const thumbnails = [];
for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
const page = await pdfDocument.value.getPage(pageNumber);
const viewport = page.getViewport({ scale: 0.5 }); //
// canvas
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
const renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext).promise;
// canvas base64
const thumbnail = canvas.toDataURL('image/png');
thumbnails.push({ number: pageNumber, thumbnail });
}
pagesInfo.value = thumbnails;
};
//
const renderAllPages = async () => {
if (!pdfDocument.value) return;
const numPages = pdfDocument.value.numPages;
for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
await renderPage(pageNumber);
}
};
//
const renderPage = async (pageNumber) => {
if (!pdfDocument.value) return;
const page = await pdfDocument.value.getPage(pageNumber);
const viewport = page.getViewport({ scale: 1.5 });
// canvas
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
canvas.style.margin = '10px 0';
pageHeight.value = viewport.height + 10;
// canvas
pdfContainer.value.appendChild(canvas);
const renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext).promise;
};
//
const navigateToPage = (pageNumber) => {
const pageElements = pdfContainer.value.querySelectorAll('canvas');
pageElements.forEach((element, index) => {
if (index + 1 === pageNumber) {
element.scrollIntoView({ behavior: 'smooth' });
}
});
//
currentPage.value = pageNumber - 1;
};
//currentPage
const handleScroll = (event) => {
const scrollElement = event.target;
const scrollHeight = scrollElement.scrollHeight;
const scrollTop = scrollElement.scrollTop;
currentPage.value = Math.round((scrollTop) / (pageHeight.value + 70));
};
//blobfile
const TurnBlobForRender = async (data) => {
if(!data){return}
try {
const blob = new Blob([data], { type: 'application/pdf' });
const convertedFile = new File([blob], { type: 'application/pdf' });;
if(convertedFile.size == 0)return;
pdfDocument.value = await pdfjsLib.getDocument({ data: data }).promise;
await generateThumbnails();
renderAllPages();
currentPage.value = 0; //
} catch (error) {
console.error('Error loading PDF:', error);
}
};
//
const fetchDocFile = async () => {
// API DOCX ArrayBuffer
const response = await queryFileFlowRepTemplateApi(params);
const { data, headers } = response;
if(headers['status'] == 500){// WARNERROR
const code = headers['error']?headers['error'].substring(headers['error'].length-4):'1003';
console.log(code)
switch(code){
case "1001":
case "1002":
ElMessage.error(downLoadErrorMsg[code]);
break;
default:
ElMessage.error(downLoadErrorMsg['1003']);
break;
}
return;
}
// const file = await new File([data], 'document.pdf', { type: data.type });
TurnBlobForRender(data);
};
fetchDocFile();//blob
// const handleFileChange = async (event) => {
// const file = event.target.files[0];
// if (file) {
// if (!file.type.startsWith('application/pdf')) {
// console.error('Invalid file type. Only PDF files are allowed.');
// return;
// }
// if (file.size > 5 * 1024 * 1024) { // 5MB
// console.error('File size exceeds the limit of 5MB.');
// return;
// }
// const fileReader = new FileReader();
// fileReader.onload = async (e) => {
// const typedArray = new Uint8Array(e.target.result);
// try {
// pdfDocument.value = await pdfjsLib.getDocument({ data: typedArray }).promise;
// await generateThumbnails();
// renderAllPages();
// currentPage.value = 0;//
// } catch (error) {
// console.error('Error loading PDF:', error);
// }
// };
// fileReader.onerror = (error) => {
// console.error('Error reading file:', error);
// };
// fileReader.readAsArrayBuffer(file);
// }
// };
</script>
<style scoped>
.pdf-viewer {
display: flex;
height: 100vh;
background-color: rgba(0, 0, 0, 0.7);
padding-top:70px;
}
.fixedToolBar{
position: fixed;
top: 0;
left: 0;
width:100%;
height:50px;
line-height:50px;
background-color: #635f5f;
color:#fff;
z-index:999;
}
.download{
position: absolute;
font-size:1.3rem;
top:13px;
right:15px;
}
.sidebar {
width: 250px;
padding: 20px;
border-right: 1px solid #ccc;
overflow-y: auto;
}
.sidebar h3 {
margin-bottom: 10px;
}
.sidebar ul {
list-style-type: none;
padding: 0;
}
.sidebar li {
text-align: center;
width: 120px;
margin:20px auto;
}
.sidebar a {
text-decoration: none;
color: #fff;
cursor: pointer;
display: flex;
align-items: center;
flex-direction: column;
}
.sidebar img.thumbnail {
width: 120px;
border: 1px solid #ddd;
}
.pdf-container {
flex-grow: 1;
padding: 20px;
overflow-y: auto;
}
.pdf-pages {
display: flex;
flex-direction: column;
align-items: center;
}
.sidebar img.active{
border:5px solid rgb(153, 196, 238)!important;
}
</style>

@ -0,0 +1,155 @@
<script setup lang="ts">
import {renderAsync,renderDocument} from 'docx-preview';
import { ref } from "vue";
import { useRoute } from 'vue-router';
import { ElMessage } from 'element-plus';
import {queryFileFlowRepTemplateApi,exportTemplateApi} from '@/api/reporting/RepTemplate/RepTemplate';
const route = useRoute();
// 线
//
const pageQuery = ref(route || null);
const fileData = pageQuery.value?.query?.fileData;
//
const downLoadErrorMsg = {
"1001":"预览失败,文件路径不存在",
"1002":"预览失败,未找到文件信息",
"1003":"预览失败,请联系管理员",
}
const docxContainer = ref(null);
// DOCX ArrayBuffer
const fetchDocFile = async () => {
// API DOCX ArrayBuffer
const response = await queryFileFlowRepTemplateApi(fileData);
console.log(response,"response文件流信息");
const { data, headers } = response;
if(headers['status'] == 500){// WARNERROR
const code = headers['error']?headers['error'].substring(headers['error'].length-4):'1003';
console.log(code)
switch(code){
case "1001":
case "1002":
ElMessage.error(downLoadErrorMsg[code]);
break;
default:
ElMessage.error(downLoadErrorMsg['1003']);
break;
}
return;
}
const arrayBuffer = await new File([data], 'document.docx', { type: data.type }).arrayBuffer();
return arrayBuffer;
};
//
const filterEmptyPages = (pages) => {
console.log(pages,"获取到的pages");
return pages.filter(page => {
// page DOM textContent
if (page && page.textContent) {
return page.textContent.trim() !== '';
}
return false;
});
};
//
const addPageNumbers = (pages) => {
pages.forEach((page, index) => {
const pageNumberElement = document.createElement('div');
pageNumberElement.className = 'page-number';
pageNumberElement.textContent = `${index + 1}`;
page.appendChild(pageNumberElement);
});
};
// CSS
const adjustStyles = (container: HTMLElement) => {
// z-index
container.querySelectorAll('img').forEach(img => {
img.style.position = 'relative';
img.style.zIndex = '1';
// img.style.top = '-30px';
});
// z-index
container.querySelectorAll('p, span, div').forEach(textElement => {
textElement.style.position = 'relative';
textElement.style.zIndex = '2';
});
};
//
const downloadFile = () => {
exportTemplateApi({pId:fileData});
};
/**
* 异步函数用于获取并处理DOC文件流
* 此函数首先调用API获取DOC文件流然后根据响应头处理可能的错误情况
* 如果文件流有效它将被转换为ArrayBuffer类型并用于渲染文档
*/
const init = async ()=>{
try {
// DOCX ArrayBuffer
const arrayBuffer = await fetchDocFile();
// APIDOC
if (!(arrayBuffer instanceof ArrayBuffer)) {
throw new Error('Invalid arrayBuffer type');
}
// DOCX
const pages = await renderAsync(arrayBuffer, docxContainer.value);
adjustStyles(docxContainer.value);
// pages
const pagesArray = Array.isArray(pages) ? pages : [pages];
//
const filteredPages = filterEmptyPages(pagesArray);
//
addPageNumbers(filteredPages);
} catch (error) {
console.error('Error rendering DOCX file:', error);
}
}
init();
</script>
<template>
<div class="wrap">
<div class="fixedToolBar">
<!-- 其中包含的功能有分页页数跳转文件下载 -->
<i @click="downloadFile" class="fa fa-download cursor-pointer download" hover-color="var(--el-color-primary)"></i>
</div>
<div id="docx-container" ref="docxContainer"></div>
</div>
</template>
<style scoped>
.fixedToolBar{
position: fixed;
top: 0;
left: 0;
width:100%;
height:50px;
line-height:50px;
background-color: #635f5f;
color:#fff;
z-index:999;
}
.download{
position: absolute;
font-size:1.2rem;
top:15px;
right:15px;
}
#docx-container {
height: 100vh;
overflow: auto;
background-color: #fff;
padding:50px;
}
</style>

@ -1,29 +1,168 @@
<script setup lang="ts">
import {renderAsync,renderDocument} from 'docx-preview';
import { ref } from "vue";
<template>
<div class="pdf-viewer">
<div class="fixedToolBar">
<!-- 其中包含的功能有分页页数跳转文件下载 -->
<i @click="downloadFile" class="fa fa-download cursor-pointer download" hover-color="var(--el-color-primary)"></i>
</div>
<div class="sidebar">
<ul>
<li v-for="(page,pageIndex) in pagesInfo" :key="page.number" @click="navigateToPage(page.number)">
<a>
<img :src="page.thumbnail" alt="Page Thumbnail" :class="pageIndex===currentPage?'thumbnail active':'thumbnail'" />
<span>{{ pageIndex+1 }}</span>
</a>
</li>
</ul>
</div>
<div class="pdf-container" @scroll="handleScroll">
<!-- <input type="file" @change="handleFileChange" accept="application/pdf" /> -->
<div ref="pdfContainer" class="pdf-pages"></div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import * as pdfjsLib from 'pdfjs-dist';
import 'pdfjs-dist/build/pdf.worker.entry';
import { useRoute } from 'vue-router';
import { ElMessage } from 'element-plus';
import {queryFileFlowRepTemplateApi,exportTemplateApi} from '@/api/reporting/RepTemplate/RepTemplate';
onMounted(() => {
window.addEventListener('scroll', handleScroll);
});
onUnmounted(() => {
window.removeEventListener('scroll', handleScroll);
});
// worker
pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/build/pdf.worker.entry';
const pdfContainer = ref(null);
const pdfDocument = ref(null);
const pdfInfo = ref({});
const pagesInfo = ref([]);
let currentPage = ref(0);//
let pageHeight = ref(0);//canvas
const route = useRoute();
// 线
//
//
const pageQuery = ref(route || null);
const fileData = pageQuery.value?.query?.fileData;
//
const params = pageQuery.value?.query?.fileData;
//
const downLoadErrorMsg = {
"1001":"预览失败,文件路径不存在",
"1002":"预览失败,未找到文件信息",
"1003":"预览失败,请联系管理员",
}
const docxContainer = ref(null);
//
const generateThumbnails = async () => {
if (!pdfDocument.value) return;
const numPages = pdfDocument.value.numPages;
const thumbnails = [];
for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
const page = await pdfDocument.value.getPage(pageNumber);
const viewport = page.getViewport({ scale: 0.5 }); //
// canvas
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
// DOCX ArrayBuffer
canvas.height = viewport.height;
canvas.width = viewport.width;
const renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext).promise;
// canvas base64
const thumbnail = canvas.toDataURL('image/png');
thumbnails.push({ number: pageNumber, thumbnail });
}
pagesInfo.value = thumbnails;
};
//
const renderAllPages = async () => {
if (!pdfDocument.value) return;
const numPages = pdfDocument.value.numPages;
for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
await renderPage(pageNumber);
}
};
//
const renderPage = async (pageNumber) => {
if (!pdfDocument.value) return;
const page = await pdfDocument.value.getPage(pageNumber);
const viewport = page.getViewport({ scale: 1.5 });
// canvas
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
canvas.style.margin = '10px 0';
pageHeight.value = viewport.height + 10;
// canvas
pdfContainer.value.appendChild(canvas);
const renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext).promise;
};
//
const navigateToPage = (pageNumber) => {
const pageElements = pdfContainer.value.querySelectorAll('canvas');
pageElements.forEach((element, index) => {
if (index + 1 === pageNumber) {
element.scrollIntoView({ behavior: 'smooth' });
}
});
//
currentPage.value = pageNumber - 1;
};
//currentPage
const handleScroll = (event) => {
const scrollElement = event.target;
const scrollHeight = scrollElement.scrollHeight;
const scrollTop = scrollElement.scrollTop;
currentPage.value = Math.round((scrollTop) / (pageHeight.value + 70));
};
//blobfile
const TurnBlobForRender = async (data) => {
if(!data){return}
try {
const blob = new Blob([data], { type: 'application/pdf' });
const convertedFile = new File([blob], { type: 'application/pdf' });;
if(convertedFile.size == 0)return;
pdfDocument.value = await pdfjsLib.getDocument({ data: data }).promise;
await generateThumbnails();
renderAllPages();
currentPage.value = 0; //
} catch (error) {
console.error('Error loading PDF:', error);
}
};
//
const fetchDocFile = async () => {
// API DOCX ArrayBuffer
const response = await queryFileFlowRepTemplateApi(fileData);
console.log(response,"response文件流信息");
const response = await queryFileFlowRepTemplateApi(params);
const { data, headers } = response;
if(headers['status'] == 500){// WARNERROR
const code = headers['error']?headers['error'].substring(headers['error'].length-4):'1003';
@ -39,94 +178,53 @@ const fetchDocFile = async () => {
}
return;
}
const arrayBuffer = await new File([data], 'document.docx', { type: data.type }).arrayBuffer();
return arrayBuffer;
// const file = await new File([data], 'document.pdf', { type: data.type });
TurnBlobForRender(data);
};
fetchDocFile();//blob
//
const filterEmptyPages = (pages) => {
console.log(pages,"获取到的pages");
return pages.filter(page => {
// page DOM textContent
if (page && page.textContent) {
return page.textContent.trim() !== '';
const handleFileChange = async (event) => {
const file = event.target.files[0];
if (file) {
if (!file.type.startsWith('application/pdf')) {
console.error('Invalid file type. Only PDF files are allowed.');
return;
}
return false;
});
};
//
const addPageNumbers = (pages) => {
pages.forEach((page, index) => {
const pageNumberElement = document.createElement('div');
pageNumberElement.className = 'page-number';
pageNumberElement.textContent = `${index + 1}`;
page.appendChild(pageNumberElement);
});
};
// CSS
const adjustStyles = (container: HTMLElement) => {
// z-index
container.querySelectorAll('img').forEach(img => {
img.style.position = 'relative';
img.style.zIndex = '1';
// img.style.top = '-30px';
});
// z-index
container.querySelectorAll('p, span, div').forEach(textElement => {
textElement.style.position = 'relative';
textElement.style.zIndex = '2';
});
};
//
const downloadFile = () => {
exportTemplateApi({pId:fileData});
};
/**
* 异步函数用于获取并处理DOC文件流
* 此函数首先调用API获取DOC文件流然后根据响应头处理可能的错误情况
* 如果文件流有效它将被转换为ArrayBuffer类型并用于渲染文档
*/
const init = async ()=>{
if (file.size > 5 * 1024 * 1024) { // 5MB
console.error('File size exceeds the limit of 5MB.');
return;
}
const fileReader = new FileReader();
fileReader.onload = async (e) => {
const typedArray = new Uint8Array(e.target.result);
try {
// DOCX ArrayBuffer
const arrayBuffer = await fetchDocFile();
// APIDOC
if (!(arrayBuffer instanceof ArrayBuffer)) {
throw new Error('Invalid arrayBuffer type');
}
// DOCX
const pages = await renderAsync(arrayBuffer, docxContainer.value);
adjustStyles(docxContainer.value);
// pages
const pagesArray = Array.isArray(pages) ? pages : [pages];
//
const filteredPages = filterEmptyPages(pagesArray);
//
addPageNumbers(filteredPages);
pdfDocument.value = await pdfjsLib.getDocument({ data: typedArray }).promise;
await generateThumbnails();
renderAllPages();
currentPage.value = 0;//
} catch (error) {
console.error('Error rendering DOCX file:', error);
console.error('Error loading PDF:', error);
}
};
fileReader.onerror = (error) => {
console.error('Error reading file:', error);
};
fileReader.readAsArrayBuffer(file);
}
init();
</script>
};
<template>
<div class="wrap">
<div class="fixedToolBar">
<!-- 其中包含的功能有分页页数跳转文件下载 -->
<i @click="downloadFile" class="fa fa-download cursor-pointer download" hover-color="var(--el-color-primary)"></i>
</div>
<div id="docx-container" ref="docxContainer"></div>
</div>
</template>
</script>
<style scoped>
.pdf-viewer {
display: flex;
height: 100vh;
background-color: rgba(0, 0, 0, 0.7);
padding-top:70px;
}
.fixedToolBar{
position: fixed;
top: 0;
@ -140,16 +238,58 @@ init();
}
.download{
position: absolute;
font-size:1.2rem;
top:15px;
font-size:1.3rem;
top:13px;
right:15px;
}
#docx-container {
height: 100vh;
overflow: auto;
background-color: #fff;
padding:50px;
.sidebar {
width: 250px;
padding: 20px;
border-right: 1px solid #ccc;
overflow-y: auto;
}
.sidebar h3 {
margin-bottom: 10px;
}
.sidebar ul {
list-style-type: none;
padding: 0;
}
</style>
.sidebar li {
text-align: center;
width: 120px;
margin:20px auto;
}
.sidebar a {
text-decoration: none;
color: #fff;
cursor: pointer;
display: flex;
align-items: center;
flex-direction: column;
}
.sidebar img.thumbnail {
width: 120px;
border: 1px solid #ddd;
}
.pdf-container {
flex-grow: 1;
padding: 20px;
overflow-y: auto;
}
.pdf-pages {
display: flex;
flex-direction: column;
align-items: center;
}
.sidebar img.active{
border:5px solid rgb(153, 196, 238)!important;
}
</style>

@ -176,7 +176,7 @@ const searchSchema = reactive<FormSchema[]>([
nodeKey: 'key',
props: { children: 'childrens', label: 'value' },
filterable: true,
multiple: true,
multiple: false,
collapseTags: true,
showCheckbox: true,
// style: { minWidth: '200px' },
@ -213,7 +213,7 @@ const searchSchema = reactive<FormSchema[]>([
field: 'tCategory',
label: '指标代码',
componentProps: {},
component: 'Select',
component: 'Input',
formItemProps: {
rules: [required()],
},

@ -6,7 +6,7 @@ import {
delRepDataProblemListApi,
delRepDataProblemApi,
queryRepDataProblemApi,
exportWordApi,
saveWordBytes,
} from '@/api/reporting/RepDataProblem/RepDataProblem'
import { TableData } from '@/api/reporting/RepDataProblem/RepDataProblem/types'
import { useTable } from '@/hooks/web/useTable'
@ -35,9 +35,9 @@ const loginOrganCode = getLoginOrganCodeByUserInfo();
const ids = ref<string[]>([])
/** 生成word */
const exportWord = async (row: TableData) => {
const data = { tid: row.tId};
exportWordApi(data);
const generatorWord = async (row: TableData) => {
saveWordBytes(row.tId,'666','20240303');
getList();
};
const { tableRegister, tableState, tableMethods } = useTable({
@ -68,14 +68,7 @@ const tableColumns = reactive<TableColumn[]>([
type: 'selection',
fixed: true
},
{
field: 'dataDate',
label: '数据日期'
},
{
field: 'createTime',
label: '生成时间'
},
,
{
field: 'tName',
label: '报告名称'
@ -84,6 +77,14 @@ const tableColumns = reactive<TableColumn[]>([
field: 'tCategory',
label: '报告分类'
},
{
field: 'dataDate',
label: '数据日期'
},
{
field: 'createTime',
label: '生成时间'
},
{
field: 'action',
label: t('tableDemo.action'),
@ -93,7 +94,7 @@ const tableColumns = reactive<TableColumn[]>([
default: (data: any) => {
return (
<>
<ElLink type="primary" underline={false} onClick={() => exportWord(data.row)}>
<ElLink type="primary" underline={false} onClick={() => generatorWord(data.row)}>
{'生成'}
</ElLink>
<ElLink type="primary" disabled={data.row.status=='true'} underline={false} onClick={() => ShowPreViewFile(data.row)}>

Loading…
Cancel
Save