299 lines
9.4 KiB
TypeScript
299 lines
9.4 KiB
TypeScript
![]() |
/*
|
|||
|
* @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>
|
|||
|
<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>
|
|||
|
您尚未安装文档控件,请您点击
|
|||
|
<Button
|
|||
|
key="download"
|
|||
|
size="small"
|
|||
|
onClick={() =>
|
|||
|
(window.location.href = '/officecontrol/NTKO控件安装程序-联通数字科技有限公司.exe')
|
|||
|
}
|
|||
|
>
|
|||
|
下载
|
|||
|
</Button>
|
|||
|
并安装后,重新访问当前页面
|
|||
|
</span>
|
|||
|
</div>
|
|||
|
) : renderCode == 2 ? (
|
|||
|
<div>
|
|||
|
<span>无正文内容</span>
|
|||
|
</div>
|
|||
|
) : renderCode == 3 ? (
|
|||
|
<div>
|
|||
|
<span>新建正文内容参数获取失败,请联系管理员</span>
|
|||
|
</div>
|
|||
|
) : (
|
|||
|
<div style={{ height: '24px' }}>
|
|||
|
<LoadingOutlined />
|
|||
|
文档控件加载中,请稍等···
|
|||
|
</div>
|
|||
|
)}
|
|||
|
</div>
|
|||
|
);
|
|||
|
};
|
|||
|
|
|||
|
export default WebOffice0609;
|