/** @class Service 公文编辑器服务。
* @summary 处理公文编辑器与后端服务器的交互。需要重载实现五个方法:getData、saveData、listHistory、getHistory、saveHistory,用于公文编辑器与后端服务交互
* @example
* import DocEditor from '@o2oa/doceditor';
* const service = new DocEditor.Service();
* service.listHistory = function(docid){
* //实现获取历史痕迹列表,返回一个数组列表
* };
* service.getHistory = function(id){
* //实现获取历史痕迹数据
* };
* service.saveHistory = function(data){
* //实现保存历史痕迹数据
* };
* service.getData = function(docid){
* //实现获取编辑器数据
* };
* service.listHistory = function(data){
* //实现保存编辑器数据
* };
* service.listHandwritingLog = function(docid){
* //返回当前文档的手写签批记录(已提交的)列表,返回一个数组列表
* }
* service.getHandwritingImage = function(imageId, stauts){
* //根据图片id获取图片地址或者是图片base64编码后的数据
* //stauts为数字,获取图片的类型,1表示正在编辑的手写签批图片,2表示签批历史记录里不带正文背景的图片,3表示历史记录里带正文背景的图片
* }
* service.getEditedHandwriting = function(options){
* //实现获取当前处理人编辑的手写数据
* }
* service.saveHandwriting = function(data){
* //保存手写签批数据
* }
* service.submitHandwritingWithDoc = function(data){
* //带正文背景提交手写签批
* }
* service.submitHandwritingWithoutDoc = function(data){
* //不带正文背景提交手写签批
* }
* service.htmlToImage = function(data){
* //html转图片, 获取图片地址
* }
*
* const editor = DocEditor.createEditor("#div", options, service);
* editor.load().then(()=>{
* //做一些其他的事情,比如绑定事件
* });
*
* @example
* import DocEditor from '@o2oa/doceditor';
* class MyService extends DocEditor.Service {
* async listHistory(id) {
* //实现获取历史痕迹列表,返回一个数组列表
* }
* async getHistory(id){
* //实现获取历史痕迹数据
* }
* async saveHistory(data){
* //实现保存历史痕迹数据
* }
* async getData(id){
* //实现获取编辑器数据
* }
* async saveData(data){
* //实现保存编辑器数据
* }
* async listHandwritingLog(docid){
* //返回当前文档的手写签批记录(已提交的)列表,返回一个数组列表
* }
* async getHandwritingImage(imageId){
* //根据图片id获取图片地址或者是图片base64编码后的数据
* }
* async getEditedHandwriting(options){
* //实现获取当前处理人编辑的手写数据
* }
* async saveHandwriting(data){
* //保存手写签批数据
* }
* async submitHandwritingWithDoc(data){
* //带正文背景提交手写签批
* }
* async submitHandwritingWithoutDoc(data){
* //不带正文背景提交手写签批
* }
* async htmlToImage(data){
* //html转图片, 获取图片地址
* }
* };
*
* const service = new MyService()
* const editor = DocEditor.createEditor("#div", options, service);
* editor.load().then(()=>{
* //做一些其他的事情,比如绑定事件
* });
*/
class Service{
/**
* @summary 实现获取历史痕迹列表,返回一个数组列表
* @param {String} id 当前文档的唯一标识,创建编辑器时的options中的docId
* @return {Promise<Array>} 返回一个Promise resolve一个存储了痕迹列表的对象数组
* @example
* service.listHistory = function(id){
* //实现获取历史痕迹列表,返回一个数组列表,格式如下:
* return Promise.resolve([
* {
* "id": "f2c17bf6-8d00-4204-97ed-00cc843a01cb", //痕迹内容唯一标识,用于获取具体的痕迹数据,由服务器生成
* "person": "huqi@huqi@P", //痕迹修订的用户
* "category": "documenteditor", //编辑id号,由创建编辑器时的options中id字段提供
* "activityName": "拟稿", //产生痕迹的步骤
* "createTime": "2022-03-14 10:16:05", //保存时由服务器自动生成
* "updateTime": "2022-03-14 10:16:05" //保存时由服务器自动生成
* ... //其他数据由创建编辑器时的options中的processInfo对象提供
* }
* ]);
* };
*/
async listHistory(id) {
// try {
// // const tmp = new URL(DocEditor.base||"", location);
// // const url = new URL('public/test/documentversion/list.json', tmp);
// const url = URL.resolve(this.base, 'public/test/documentversion/list.json');
//
// const res = await whatwgFetch(url);
// const json = await res.json();
// return json.data;
// }catch(err){
// console.error(err);
// }
return null
}
/**
* @summary 实现获取历史痕迹数据
* @param {String} id 历史痕迹的唯一标识,listHistory方法返回列表中的id
* @return {Promise<Object>} 返回一个Promise resolve一个存储了痕迹数据的对象
* @example
* service.listHistory = function(id){
* //实现获取历史痕迹列表,返回一个数组列表,格式如下:
* return Promise.resolve({
* "id": "1746f647-910f-419e-a55a-d07c176a3f87", //痕迹内容唯一标识,用于获取具体的痕迹数据,由服务器生成
* "person": "胡起", //痕迹修订的用户 创建编辑器时的options中的user.name
* "category": "documenteditor", //编辑id号,由创建编辑器时的options中id字段提供
* "data": "...", //修订痕迹数据,保存时的data
* "json": {} //将data中的文本转换为json对象(JSON.parse)
* "activityName": "拟稿", //产生痕迹的步骤 创建编辑器时的options中的activity.name
* "createTime": "2022-03-12 17:23:40", //保存时由服务器自动生成
* "updateTime": "2022-03-12 17:23:40" //保存时由服务器自动生成
* });
* };
*/
async getHistory(id){
// try {
// // const tmp = new URL(DocEditor.base||"", location);
// // const url = new URL(`public/test/documentversion/${id}.json`, tmp);
// const url = URL.resolve(this.base, `public/test/documentversion/${id}.json`);
// const res = await whatwgFetch(url);
// const json = await res.json();
// const patchs = JSON.parse(json.data.data);
// json.data.json = patchs;
// return json.data;
// }catch(err){
// console.error(err);
// }
return null;
}
/**
* @summary 保存历史痕迹
* @example
* service.saveHistory = function(data){
* //data为要保存的数据,格式如下:
* {
* "docId": "aaaaa" //当前文档的唯一标识,创建编辑器时的options中的docId
* "category": "documenteditor", //编辑id号,由创建编辑器时的options中id字段提供
* "data": "...", //修订痕迹数据
* "person": "测试", //修订用户 创建编辑器时的options中的user.name
* "activityName": "核稿" //修订时的活动状态 创建编辑器时的options中的activity.name
* ... //其他数据由创建编辑器时的options中的processInfo对象提供
* }
* };
*/
async saveHistory(data){
return null;
}
/**
* @summary 获取编辑器数据
* @param {String} id 当前文档的唯一标识,创建编辑器时的options中的docId
* @return {Promise<Object>} 返回一个Promise resolve一个编辑器数据对象
* @example
* service.getData = function(data){
* return Promise.resolve({
"copies": "",
"secret": "",
"priority": "",
"redHeader": "文件红头",
"fileno": "[文号]",
"signerTitle": "签发人:",
"signer": "[签发人]",
"subject": "[文件标题]",
"mainSend": "[主送单位:]",
"filetext": "[请在此处编辑正文内容]",
"attachmentTitle": "附件:",
"attachment": "",
"issuanceUnit": "[发文机关]",
"issuanceDate": "[成文日期]",
"annotation": "",
"copytoTitle": "抄送:",
"copyto": "[抄送]",
"copyto2Title": "发:",
"copyto2": "[发]",
"editionUnit": "[印发机关]",
"editionDate": "[印发日期]",
"meetingAttendTitle": "出席:",
"meetingLeaveTitle": "请假:",
"meetingSitTitle": "列席:",
"meetingAttend": "",
"meetingLeave": "",
"meetingSit": "",
"meetingRecord": ""
});
* };
*/
async getData(id, callback){
// const data = {
// "copies": "",
// "secret": "",
// "priority": "",
// "redHeader": "文件红头",
// "fileno": "[文号]",
// "signerTitle": "签发人:",
// "signer": "[签发人]",
// "subject": "[文件标题]",
// "mainSend": "[主送单位:]",
// "filetext": "[请在此处编辑正文内容]",
// "attachmentTitle": "附件:",
// "attachment": "",
// "issuanceUnit": "[发文机关]",
// "issuanceDate": "[成文日期]",
// "annotation": "",
// "copytoTitle": "抄送:",
// "copyto": "[抄送]",
// "copyto2Title": "发:",
// "copyto2": "[发]",
// "editionUnit": "[印发机关]",
// "editionDate": "[印发日期]",
// "meetingAttendTitle": "出席:",
// "meetingLeaveTitle": "请假:",
// "meetingSitTitle": "列席:",
// "meetingAttend": "",
// "meetingLeave": "",
// "meetingSit": "",
// "meetingRecord": ""
// }
// if (callback) callback(data);
// return Promise.resolve(data);
return null;
}
/**
* @summary 保存编辑器数据
* @example
* service.saveData = function(data){
* //data为要保存的数据,格式如下:
* {
* "docId": "aaaaaaaa" //文档的唯一标识
* "copies": "",
* "secret": "",
* "priority": "",
* "redHeader": "文件红头",
* "fileno": "[文号]",
* "signerTitle": "签发人:",
* "signer": "[签发人]",
* "subject": "[文件标题]",
* "mainSend": "[主送单位:]",
* "filetext": "[请在此处编辑正文内容]",
* "attachmentTitle": "附件:",
* "attachment": "",
* "issuanceUnit": "[发文机关]",
* "issuanceDate": "[成文日期]",
* "annotation": "",
* "copytoTitle": "抄送:",
* "copyto": "[抄送]",
* "copyto2Title": "发:",
* "copyto2": "[发]",
* "editionUnit": "[印发机关]",
* "editionDate": "[印发日期]",
* "meetingAttendTitle": "出席:",
* "meetingLeaveTitle": "请假:",
* "meetingSitTitle": "列席:",
* "meetingAttend": "",
* "meetingLeave": "",
* "meetingSit": "",
* "meetingRecord": "",
* ... //其他自定义扩展字段
* }
* };
*/
async saveData(data){
return null;
}
/**
* @summary 返回当前文档的手写签批记录(已提交的)列表,返回一个数组列表
* @param {String} id 当前文档的唯一标识,创建编辑器时的options中的docId
* @return {Promise<Array>} 返回一个Promise resolve一个存储了手写签批记录的对象数组
* @example
* service.listHandwritingLog = async function(docid){
* //手写签批记录列表,返回一个数组列表,格式如下:
* return Promise.resolve([
* //带正文背景保存的记录
* {
* "status": 3, //签批记录的类别,2表示不带背景保存的记录,3表示带正文背景保存的记录
* "image": { //带正文保存的签批图片
* "id": "4b6f4164-2856-44c8-bd0a-4c43f6b34ff8", //签批图片的id, 和src二选一,如果使用id,需要实现 service.getHandwritingImage 方法
* "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA..." //签批图片的base64编码或图片地址, 和id二选一,src优先
* },
* "id": "0d35a43e-8cb5-4af8-ac6a-da681221c350", //签批记录id,由服务器生成
* "activityName": "核稿", //产生签批的步骤
* "person": "张三@zhangsan@P", //签批的用户
* "createTime": "2022-05-30 15:19:13", //保存时由服务器自动生成
* "updateTime": "2022-05-30 15:19:13", //保存时由服务器自动生成
* ... //其他自定义的数据
* },
* //不带正文背景保存的记录
* {
* "status": 2, //签批记录的类别,2表示不带背景保存的记录,3表示带正文背景保存的记录
* "id": "dc3bc8d1-0d2a-43e6-a44e-9036c058cf70", //签批记录id,由服务器生成
* "activityName": "办理", //产生签批的步骤
* "person": "李四@lisi@P", //签批的用户
* "createTime": "2022-05-30 15:20:43", //保存时由服务器自动生成
* "updateTime": "2022-05-30 15:20:43", //保存时由服务器自动生成
* "imageList": [ //不带正文保存的签批图片信息
* {
* "id": "4b6f4164-2856-44c8-bd0a-4c43f6b34ff8", //签批图片的id, 和src二选一,如果使用id,需要实现 service.getHandwritingImage 方法
* "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片的base64编码或图片地址, 和id二选一
* "type": "image", //表示这是一张图片
* "width": "793.671875", //所占宽度
* "height": "1000", //所占高度
* ... //其他自定义的数据
* },
* {
* "type": "placeholder", //表示这个位置没有图片,只占一个位置
* "width": "793.671875", //所占宽度
* "height": "701", //所占高度
* ... //其他自定义的数据
* }
* ]
* }
* ])
*}
*/
async listHandwritingLog(docid){
return null;
}
/**
* @summary 实现获取当前处理人编辑的手写数据
* @param {Object} options 创建编辑器时的options,可以自定义的在这个options设置该手写签批数据的id
* @return {Promise<Object>} 返回一个Promise resolve一个存储了手写签批数据的对象,如果是新建可以返回 null
* @example
*service.getEditedHandwriting = async function( options ){
* return Promise.resolve({
* "id": "bfc6cc5b-e171-4f1a-83a0-78a40cf6a581", //正在编辑的手写签批id
* "activityName": "确认", //手写签批的步骤 创建编辑器时的options中的activity.name
* "person": "张三@zhangsan@P", //签批的用户
* "status": 1, //签批类型,1表示正在编辑中,还未提交(提交后不允许编辑)
* "inputList": [ //用输入法输入的文本框
* {
* "coordinates":{ //用输入法输入的文本框的位置,top\left\right\bottom是相对于编辑器正文内容的位置
* "left":10,
* "top":30,
* "width":200,
* "height":100,
* "right":700,
* "bottom":900
* },
* "styles":{ //用输入法输入的文本的样式
* "color":"#4bacc6",
* "font-size":"32px"
* },
* "html":"手写输入内容" ////用输入法输入的内容
* }
* ],
* "imageList": [ //用笔画画出的图片列表
* {
* "id": "4b6f4164-2856-44c8-bd0a-4c43f6b34ff8", //签批图片的id, 和src二选一,如果使用id,需要实现 service.getHandwritingImage 方法
* "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片的base64编码或图片地址, 和id二选一,src优先
* "width":"793.6875", //图片宽度
* "height":"1000" //图片高度
* },
* {
* "src": "", //src为空及id为空(或无src及id),表示无该页无签批内容
* "width": "793.671875", //占位宽度
* "height":"215" //占位高度
* }
* ]
* })
* }
* */
async getEditedHandwriting(options){
// try {
// // const tmp = new URL(DocEditor.base||"", location);
// // const url = new URL(`public/test/documentversion/${id}.json`, tmp);
// const url = URL.resolve(this.base, `public/test/handwriting/${id}.json`);
// const res = await whatwgFetch(url);
// const json = await res.json();
// const patchs = JSON.parse(json.data.data);
// json.data.json = patchs;
// return json.data;
// }catch(err){
// console.error(err);
// }
return null;
}
/**
* @summary 根据图片id获取图片地址或者是图片base64编码后的数据
* @param {String} imageId 根据getEditedHandwriting或listHandwritingLog方法返回的数据中包含的图片id
* @param {Number} status 获取图片的类型,1表示正在编辑的手写签批图片,2表示签批历史记录里不带正文背景的图片,3表示历史记录里带正文背景的图片
* @return {Promise<Object>} 返回一个Promise resolve 的图片地址或者是图片base64编码后的数据
* @example
*service.getHandwritingImage = async function( imageId, status ) {
* switch (status) {
* case 1:
* return "http://www.o2oa.net/handwriting/edting/"+imageId;
* case 2:
* return "http://www.o2oa.net/handwriting/without/"+imageId;
* case 3:
* return "http://www.o2oa.net/handwriting/with/"+imageId;
* }
*}
* @example
*service.getHandwritingImage = function( imageId, status ) {
* return Promise.resolve( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA..." )
*}
**/
async getHandwritingImage(imageId, status){
return null;
}
/**
* @summary 保存手写签批数据
* @example
* service.saveHandwriting = async function(data){
* //data为要保存的数据,格式如下:
* {
* "docId": "aaaaa", //当前文档的唯一标识,创建编辑器时的options中的docId
* "id": "bbbbbbbb", //当前签批的唯一标识,依赖于getEditedHandwriting获取的数据是否包含id。如果没有,表示新建。
* "activityName": "确认", //手写签批的步骤 创建编辑器时的options中的activity.name
* "person": "张三@zhangsan@P", //签批的用户
* "status": 1, //签批类型,1表示正在编辑中,还未提交(提交后不允许编辑)
* "inputList": [ //用输入法输入的文本框
* {
* "coordinates":{ //用输入法输入的文本框的位置,top\left\right\bottom是相对于编辑器正文内容的位置
* "left":10,
* "top":30,
* "width":200,
* "height":100,
* "right":700,
* "bottom":900
* },
* "styles":{ //用输入法输入的文本的样式
* "color":"#4bacc6",
* "font-size":"32px"
* },
* "html":"手写输入内容" ////用输入法输入的内容
* }
* ],
* "imageList": [ //用笔画画出的图片列表
* {
* "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片base64编码,
* "width":"793.6875", //图片宽度
* "height":"1000" //图片高度
* },
* {
* "src": "", //src为空表示无该页无签批内容
* "width": "793.671875", //占位宽度
* "height":"215" //占位高度
* }
* ]
* }
*}
*/
async saveHandwriting(data){
return null;
}
/**
* @summary 不带正文背景提交手写签批,提交后不允许编辑这份签批
* @example
* service.submitHandwritingWithoutDoc = async function(data){
* //data为要保存的数据,格式如下:
* {
* "docId": "aaaaa", //当前文档的唯一标识,创建编辑器时的options中的docId
* "id": "bbbbbbbb", //当前签批的唯一标识,依赖于getEditedHandwriting获取的数据是否包含id。如果没有,表示新建。
* "activityName": "确认", //手写签批的步骤 创建编辑器时的options中的activity.name
* "person": "张三@zhangsan@P", //签批的用户
* "status": 2, //签批类型,2表示不带背景提交
* "imageList": [ //用笔画画出的图片列表
* {
* "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片base64编码,
* "width":"793.6875", //图片宽度
* "height":"1000" //图片高度
* },
* {
* "src": "", //src为空表示无该页无签批内容
* "width": "793.671875", //占位宽度
* "height":"215" //占位高度
* }
* ]
* }
*}
*/
async submitHandwritingWithoutDoc(data){
return null;
}
/**
* @summary 带正文背景提交手写签批,提交后不允许编辑这份签批。需要后台将html内容转换成图片
* @example
* service.submitHandwritingWithDoc = async function(data){
* //data为要保存的数据,格式如下:
* {
* "docId": "aaaaa", //当前文档的唯一标识,创建编辑器时的options中的docId
* "id": "bbbbbbbb", //当前签批的唯一标识,依赖于getEditedHandwriting获取的数据是否包含id。如果没有,表示新建。
* "activityName": "确认", //手写签批的步骤 创建编辑器时的options中的activity.name
* "person": "张三@zhangsan@P", //签批的用户
* "status": 3, //签批类型,3表示带正文背景提交
* "htmlContent": "<div>....</div>", //包含正文和手写签批图片的html内容,需要后台
* "htmlWidth": "793.671875", //html内容的宽度
* "htmlHeight": "1000" //html内容的高度
* }
*}
*/
async submitHandwritingWithDoc(data){
return null;
}
/**
* @summary html转图片,此方法用在输入法输入的内容。如果不使用输入法,可以不实现该方法
* @param {Object} data 转换的html数据
* <pre><code class='language-js'>
* //格式如下:
* {
* workHtml: div.outerHTML,
* htmlWidth: 200, //html正文宽度,允许为空.
* htmlHeight: 300, //html正文高度,允许为空.
* startX: 10, //html的X轴开始位置,允许为空.
* startY: 20, //html的Y轴开始位置,允许为空.
* omitBackground: true //背景是否透明
* }
* </code></pre>
* @return {Promise<Object>} 返回一个Promise resolve 的图片地址或者是图片base64编码后的数据
* @example
* service.htmlToImage = async function(data){
* return Promise.resolve( "http://www.o2oa.net/handwriting/12345" );
*}
* @example
* service.htmlToImage = function(data){
* return Promise.resolve( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA..." )
*}
*/
async htmlToImage(data){
return null;
}
}
export default Service;