From b782a77389d6c9cec9644e1af7467d8e4cc2e5d2 Mon Sep 17 00:00:00 2001 From: KirillovIlya Date: Fri, 23 Dec 2022 15:18:27 +0300 Subject: [PATCH] [oform] Write users/userMasters/fieldMaster to zip package Serialize all of these classes to xml if no other classes are related to them --- oform/format/Document.js | 42 +++++++++++++++++++++++-- oform/format/FieldGroup.js | 20 ++++++++++-- oform/format/FieldMaster.js | 1 + oform/xml/XmlContext.js | 62 ++++++++++++++++++++++++++++++++++--- 4 files changed, 115 insertions(+), 10 deletions(-) diff --git a/oform/format/Document.js b/oform/format/Document.js index e54f23e..fb666ca 100644 --- a/oform/format/Document.js +++ b/oform/format/Document.js @@ -220,11 +220,47 @@ }; CDocument.prototype.toPkg = function(xmlPkg) { - let xmlWriter = xmlPkg.getXmlWriter(); - let main = xmlPkg.addPart(AscCommon.openXml.Types.oformMain); + // TODO: default.xml + + let xmlContext = xmlPkg.getContext(); + let xmlWriter = xmlPkg.getXmlWriter(); + let main = xmlPkg.addPart(AscCommon.openXml.Types.oformMain).part; xmlWriter.Seek(0); - main.part.setDataXml(this, xmlWriter); + main.setDataXml(this, xmlWriter); + + this.Users.forEach(function(user) + { + if (!xmlContext.haveUserPart(user)) + { + xmlWriter.Seek(0); + let part = main.addPartWithoutRels(AscCommon.openXml.Types.oformUser); + if (part) + part.setDataXml(user, xmlWriter); + } + }); + + this.UserMasters.forEach(function(userMaster) + { + if (!xmlContext.haveUserMasterPart(userMaster)) + { + xmlWriter.Seek(0); + let part = main.addPartWithoutRels(AscCommon.openXml.Types.oformUserMaster); + if (part) + part.setDataXml(userMaster, xmlWriter); + } + }); + + this.FieldMasters.forEach(function(fieldMaster) + { + if (!xmlContext.haveFieldMasterPart(fieldMaster)) + { + xmlWriter.Seek(0); + let part = main.addPartWithoutRels(AscCommon.openXml.Types.oformFieldMaster); + if (part) + part.setDataXml(fieldMaster, xmlWriter); + } + }); }; CDocument.prototype.fromXml = function(reader) { diff --git a/oform/format/FieldGroup.js b/oform/format/FieldGroup.js index be46641..4777179 100644 --- a/oform/format/FieldGroup.js +++ b/oform/format/FieldGroup.js @@ -189,20 +189,34 @@ } return user; }; - CFieldGroup.prototype.toXml = function(writer, xmlFormat) + CFieldGroup.prototype.toXml = function(writer) { + let context = writer.context; + writer.WriteXmlNodeStart("fieldGroup"); writer.WriteXmlNullableAttributeInt("weight", this.getWeight()); writer.WriteXmlAttributesEnd(); for (let userIndex = 0, userCount = this.Users.length; userIndex < userCount; ++userIndex) { - + let part = context.getUserMasterPart(this.Users[userIndex]); + if (!part) + continue; + + writer.WriteXmlNodeStart("user"); + writer.WriteXmlNullableAttributeString("r:id", part.rId); + writer.WriteXmlAttributesEnd(true); } for (let fieldIndex = 0, fieldCount = this.Fields.length; fieldIndex < fieldCount; ++fieldIndex) { - + // let part = context.getFieldMasterPart(this.Fields[fieldIndex]); + // if (!part) + // continue; + // + // writer.WriteXmlNodeStart("field"); + // writer.WriteXmlNullableAttributeString("r:id", part.rId); + // writer.WriteXmlAttributesEnd(true); } writer.WriteXmlNodeEnd("fieldGroup"); diff --git a/oform/format/FieldMaster.js b/oform/format/FieldMaster.js index c2bf315..890728a 100644 --- a/oform/format/FieldMaster.js +++ b/oform/format/FieldMaster.js @@ -180,6 +180,7 @@ }; CFieldMaster.prototype.toXml = function(writer) { + return; writer.WriteXmlString(AscCommonWord.g_sXmlHeader); writer.WriteXmlNodeStart("FieldMaster"); writer.WriteXmlAttributeString("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); diff --git a/oform/xml/XmlContext.js b/oform/xml/XmlContext.js index 59123df..12a483b 100644 --- a/oform/xml/XmlContext.js +++ b/oform/xml/XmlContext.js @@ -182,11 +182,65 @@ { this.pkg = pkg; - this.userToPath = {}; - this.userMasterToPath = {}; - this.fieldToPath = {}; - this.fieldMasterToPath = {}; + this.userToPart = {}; + this.userMasterToPart = {}; + this.fieldToPart = {}; + this.fieldMasterToPart = {}; } + XmlWriterContext.prototype.clearCurrentPartDataMaps = function() + { + }; + XmlWriterContext.prototype.getUserPart = function(user, part) + { + return this.getPart(this.userToPart, user, AscCommon.openXml.Types.oformUser); + }; + XmlWriterContext.prototype.haveUserPart = function(user) + { + return !!this.userToPart[user.GetId()]; + }; + XmlWriterContext.prototype.getUserMasterPart = function(userMaster) + { + return this.getPart(this.userMasterToPart, userMaster, AscCommon.openXml.Types.oformUserMaster); + }; + XmlWriterContext.prototype.haveUserMasterPart = function(userMaster) + { + return !!this.userMasterToPart[userMaster.GetId()]; + }; + XmlWriterContext.prototype.getFieldPart = function(field) + { + return this.getPart(this.fieldToPart, field, AscCommon.openXml.Types.oformField); + }; + XmlWriterContext.prototype.haveFieldPart = function(field) + { + return !!this.fieldToPart[field.GetId()]; + }; + XmlWriterContext.prototype.getFieldMasterPart = function(fieldMaster) + { + return this.getPart(this.fieldMasterToPart, fieldMaster, AscCommon.openXml.Types.oformFieldMaster); + }; + XmlWriterContext.prototype.haveFieldMasterPart = function(fieldMaster) + { + return !!this.fieldMasterToPart[fieldMaster]; + }; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Private area + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + XmlWriterContext.prototype.getPart = function(map, object, contentType, curPart) + { + let objectId = object.GetId(); + if (map[objectId]) + return map[objectId]; + + let part = curPart.addPart(contentType); + + let xmlWriter = new AscCommon.CMemory(); + xmlWriter.context = this; + + part.part.setDataXml(object, xmlWriter); + + map[objectId] = part; + return part; + }; //--------------------------------------------------------export---------------------------------------------------- AscOForm.XmlWriterContext = XmlWriterContext;