Files
fe_service_ebtp_frontend/src/pages/webOffice/weboffice0609.tsx

299 lines
9.4 KiB
TypeScript
Raw Normal View History

2022-03-10 14:24:13 +08:00
/*
* @Author: zhoujianlong
* @Date: 2021-06-09 15:29:07
* @Last Modified by: zhoujianlong
* @Last Modified time: 2021-08-16 16:09:49
*/
import { getFileBidList, SnowflakeID } from '@/services/untilService';
import { Button, Modal } from 'antd';
import { LoadingOutlined } from '@ant-design/icons';
import React, { useEffect, useState, useImperativeHandle } from 'react';
interface WebOfficeProps {
DOCFileCode?: string; //word 文件id *必填*
PDFFileCode?: string; //PDF 文件id
HTMLFileCode?: string; //HTML 文件id
savePDF?: boolean; //是否保存为PDF true-保存 false-不保存 可以不传默认为false
saveHTML?: boolean; //是否保存为HTML true-保存 false-不保存 可以不传默认为false
readOnly?: boolean; //只读 true-查看 false-可编辑 *必填*
webOfficeRef?: React.MutableRefObject<WebOfficeRefProps | undefined>; //父组件传入的ref参数 用于实时调取子组件内部参数 *必填*
afterSaveFunc?: () => void //weboffice保存成功后执行的方法
}
export interface WebOfficeRefProps {
DocFileCode: string;
PDFFileCode: string;
HTMLFileCode: string;
uploadDocType: boolean;
uploadPDFType: boolean;
uploadHTMLType: boolean;
}
const WebOffice0609: React.FC<WebOfficeProps> = (props) => {
const { DOCFileCode, PDFFileCode, HTMLFileCode, savePDF, saveHTML, readOnly, webOfficeRef, afterSaveFunc } = {
DOCFileCode: '',
PDFFileCode: '',
HTMLFileCode: '',
savePDF: false,
saveHTML: false,
readOnly: false,
afterSaveFunc: () => {},
...props,
};
//存储weboffice渲染状态
const [renderCode, setRenderCode] = useState<number>(-1);
//按钮显示文字
const [btnName, setBtnName] = useState<string>('');
//按钮前提示文字
const [beforeBtnText, setBeforeBtnText] = useState<string>('');
//存储docFileCode
const [docFileCode_, setDocFileCode_] = useState<string>(DOCFileCode);
//存储pdfFileCode
const [pdfFileCode_, setPdfFileCode_] = useState<string>(PDFFileCode);
//存储htmlFileCode
const [htmlFileCode_, setHtmlFileCode_] = useState<string>(HTMLFileCode);
//word上传状态
const [uploadDocType_, setUploadDocType_] = useState<boolean>(false);
//pdf上传状态
const [uploadPDFType_, setUploadPDFType_] = useState<boolean>(false);
//html上传状态
const [uploadHTMLType_, setUploadHTMLType_] = useState<boolean>(false);
//选择暴露给父组件的参数或方法
useImperativeHandle(
webOfficeRef,
() => ({
DocFileCode: uploadDocType_ ? docFileCode_ : '',
PDFFileCode: uploadPDFType_ ? pdfFileCode_ : '',
HTMLFileCode: uploadHTMLType_ ? htmlFileCode_ : '',
uploadDocType: uploadDocType_,
uploadPDFType: uploadPDFType_,
uploadHTMLType: uploadHTMLType_,
}),
[docFileCode_, pdfFileCode_, htmlFileCode_, uploadDocType_, uploadPDFType_, uploadHTMLType_],
);
useEffect(() => {
updateWebOffice();
}, [DOCFileCode]);
useEffect(() => {
window.addEventListener('message', receiveMessage, false); // 监听message事件,用于接收从子页面返回的参数
return () => window.removeEventListener('message', receiveMessage);
}, [docFileCode_, pdfFileCode_, htmlFileCode_]);
//获取雪花id方法新建状态的文档id
const getSnowflakeId = async () => {
let id: string = '';
let status: number = 0; //与父级的状态码参数一致
await SnowflakeID()
.then((res) => {
id = res?.id;
})
.catch((item) => {
status = 3;
});
return {
id: id,
status: status,
};
};
//点击按钮后的弹窗遮罩
const editLoading = () => {
let text = '编辑';
text = readOnly ? '查看' : '编辑';
Modal.info({
title: `文档编辑器打开中,请在弹出窗口${text}正文`,
okText: <></>,
okButtonProps: { hidden: true },
cancelButtonProps: { hidden: true },
centered: true,
});
};
/**
* fileCode存储
*/
const updateWebOffice = async () => {
let errorStatus = 0; //错误状态码参数 0-正常 1-未安装控件提示下载 2-状态为查看但未获取到docFileCode 3-获取雪花id接口报错
//判断安装环境
if (!window.ntkoBrowser.ExtensionInstalled()) {
setRenderCode(1); //错误类型为1即未安装控件
return;
}
//WORD文档部分
if (
DOCFileCode == '' ||
DOCFileCode == null ||
DOCFileCode == undefined ||
DOCFileCode == 'null' ||
DOCFileCode == 'undefined'
) {
if (readOnly) {
setBtnName('查看');
setRenderCode(2); //错误类型为2即状态为查看但未获取到docFileCode
return;
} else {
setBtnName('新建');
setBeforeBtnText('无正文内容,点击');
//无doc文档id,获取雪花id
await getSnowflakeId().then((res) => {
setDocFileCode_(res?.id);
errorStatus = res?.status;
});
}
} else {
let name = readOnly ? '查看' : '编辑';
setBtnName(name);
setBeforeBtnText('已保存正文内容,点击');
//doc状态更新
await getFileBidList(DOCFileCode).then((res) => {
if (res?.length > 0) {
setUploadDocType_(true);
} else {
setUploadDocType_(false);
}
});
}
//PDF文档部分
if (savePDF) {
if (
PDFFileCode == '' ||
PDFFileCode == null ||
PDFFileCode == undefined ||
PDFFileCode == 'null' ||
PDFFileCode == 'undefined'
) {
//无pdf文档id,获取雪花id
await getSnowflakeId().then((res) => {
setPdfFileCode_(res?.id);
errorStatus = res?.status;
});
} else {
//pdf状态更新
await getFileBidList(PDFFileCode).then((res) => {
if (res?.length > 0) {
setUploadPDFType_(true);
} else {
setUploadPDFType_(false);
}
});
}
}
//HTML文档部分
if (saveHTML) {
if (
HTMLFileCode == '' ||
HTMLFileCode == null ||
HTMLFileCode == undefined ||
HTMLFileCode == 'null' ||
HTMLFileCode == 'undefined'
) {
//无html文档id,获取雪花id
await getSnowflakeId().then((res) => {
setHtmlFileCode_(res?.id);
errorStatus = res?.status;
});
} else {
//pdf状态更新
await getFileBidList(HTMLFileCode).then((res) => {
if (res?.length > 0) {
setUploadHTMLType_(true);
} else {
setUploadHTMLType_(false);
}
});
}
}
//最终渲染规则
setRenderCode(errorStatus);
};
//接收子页面返回参数方法
const receiveMessage = async (event: any) => {
if (event !== undefined && event?.data) {
/*文件保存状态*/
if (event?.data != null && event?.data != undefined) {
let FileMsg = event?.data;
if (FileMsg?.type == 'FROM_RETURN_DOC' && FileMsg?.text == docFileCode_) {
//回调参数DOC专用标记
setUploadDocType_(true);
//调用回调方法(可能没有)
afterSaveFunc();
setBeforeBtnText('已保存正文内容,点击');
setBtnName('编辑');
} else if (FileMsg?.type == 'FROM_RETURN_HTML' && FileMsg?.text == htmlFileCode_) {
//回调参数HTML专用标记
setUploadHTMLType_(true);
} else if (FileMsg?.type == 'FROM_RETURN_PDF' && FileMsg?.text == pdfFileCode_) {
//回调参数PDF专用标记
setUploadPDFType_(true);
} else if (
FileMsg?.type == 'FROM_NTKO_CLOSE' &&
FileMsg?.text == window.ntkoBrowser.thisNTKOGUID
) {
Modal.destroyAll();
}
}
}
};
return (
<div>
{renderCode == 0 ? (
<>
<span>{beforeBtnText}</span>&nbsp;&nbsp;
<Button
size="small"
key="openWebOffice"
onClick={() => {
editLoading();
let openUrl = '/webofficeIeComponent';
if (window.ntkoBrowser.NtkoBrower()) {
//判断浏览器
openUrl = '/webofficeComponent';
}
openUrl += `.html?readonly=${readOnly}&DocfileCode=${docFileCode_}&PDFfileCode=${pdfFileCode_}&HTMLfileCode=${htmlFileCode_}&savePDF=${savePDF}&saveHTML=${saveHTML}`;
window.ntkoBrowser.openWindow(openUrl);
}}
>
{btnName}
</Button>
</>
) : renderCode == 1 ? (
<div>
<span>
&nbsp;
<Button
key="download"
size="small"
onClick={() =>
(window.location.href = '/officecontrol/NTKO控件安装程序-联通数字科技有限公司.exe')
}
>
</Button>
&nbsp;访
</span>
</div>
) : renderCode == 2 ? (
<div>
<span></span>
</div>
) : renderCode == 3 ? (
<div>
<span></span>
</div>
) : (
<div style={{ height: '24px' }}>
<LoadingOutlined />
&nbsp;&nbsp;···
</div>
)}
</div>
);
};
export default WebOffice0609;