Files
DocumentServer-v-9.2.0/sdkjs/common/externalChartCollector.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

303 lines
11 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(/**
* @param {Window} window
* @param {undefined} undefined
*/
function (window, undefined) {
function CExternalChartCollector() {
this.mapChartReferences = {};
this.api = null;
this.logicDocument = null;
this.isInit = false;
this.isNeedSend = false;
}
CExternalChartCollector.prototype.init = function (oApi) {
this.api = oApi;
this.logicDocument = this.api.getLogicDocument();
if (this.api && this.logicDocument) {
this.isInit = true;
}
};
CExternalChartCollector.prototype.onUpdateExternalList = function () {
if (this.isNeedSend) {
this.api.sendEvent("asc_onUpdateExternalReferenceList");
this.isNeedSend = false;
}
};
CExternalChartCollector.prototype.checkChart = function (oChart) {
if (!oChart.bDeleted && oChart.isExternal()) {
this.mapChartReferences[oChart.GetId()] = oChart;
} else {
delete this.mapChartReferences[oChart.GetId()];
}
this.isNeedSend = true;
}
CExternalChartCollector.prototype.getExternalReferences = function () {
const arrReferences = [];
const arrDelete = [];
for (let sId in this.mapChartReferences) {
const oChart = this.mapChartReferences[sId];
if (oChart.IsUseInDocument()) {
const oReference = oChart.getExternalReference();
if (oReference) {
arrReferences.push(oReference.getAscLink());
}
} else {
arrDelete.push(sId);
}
}
for (let i = 0; i < arrDelete.length; i += 1) {
delete this.mapChartReferences[arrDelete[i]];
}
return arrReferences;
};
CExternalChartCollector.prototype.getCharts = function (arrExternalReferences) {
const arrResult = [];
if (arrExternalReferences) {
if (this.logicDocument.IsDocumentEditor()) {
for (let i = 0; i < arrExternalReferences.length; i += 1) {
const oReference = arrExternalReferences[i];
const oParaDrawing = oReference.externalReference.chart.GetParaDrawing();
if (oParaDrawing) {
arrResult.push(oParaDrawing);
}
}
} else {
for (let i = 0; i < arrExternalReferences.length; i += 1) {
const oReference = arrExternalReferences[i];
arrResult.push(oReference.externalReference.chart);
}
}
}
return arrResult;
}
CExternalChartCollector.prototype.isLocked = function (arrCharts) {
if (!this.isInit) {
return true;
}
return this.logicDocument.Document_Is_SelectionLocked(AscCommon.changestype_None, {Type: AscCommon.changestype_2_ElementsArray_and_Type, CheckType: AscCommon.changestype_Drawing_Props, Elements:arrCharts});
}
CExternalChartCollector.prototype.startLongLock = function () {
this.api.asc_onOpenFrameEditor();
};
CExternalChartCollector.prototype.endLongLock = function () {
this.api.asc_onCloseFrameEditor();
};
CExternalChartCollector.prototype.updateExternalReferences = function (arrExternalReferences, fCallback) {
if (!this.isInit) {
return;
}
const oThis = this;
const oLogicDocument = this.logicDocument;
const oApi = this.api;
const mapExternalReferences = {};
const arrCharts = this.getCharts(arrExternalReferences);
if (this.isLocked(arrCharts)) {
return;
}
this.startLongLock();
if (arrExternalReferences && arrExternalReferences.length) {
let isLocalDesktop = window["AscDesktopEditor"] && window["AscDesktopEditor"]["IsLocalFile"]();
const doUpdateData = function (_arrAfterPromise) {
if (!_arrAfterPromise.length) {
fCallback && fCallback(true);
oApi.sendEvent("asc_onStartUpdateExternalReference", false);
oThis.endLongLock();
oThis.isLocked(arrCharts);
return;
}
oLogicDocument.StartAction(AscDFH.historydescription_Document_UpdateCharts);
for (let i = 0; i < _arrAfterPromise.length; i++) {
let externalReferenceId = _arrAfterPromise[i].externalReferenceId;
let stream = _arrAfterPromise[i].stream;
const arrExternalChartReferences = mapExternalReferences[externalReferenceId];
if (stream && arrExternalChartReferences) {
let wb = new AscCommonExcel.Workbook(undefined, undefined, false);
wb.dependencyFormulas.lockRecal();
wb.DrawingDocument = oLogicDocument.DrawingDocument;
wb.theme = oLogicDocument.theme ? oLogicDocument.theme : oLogicDocument.Get_Theme();
Asc.getBinaryOtherTableGVar(wb);
AscCommonExcel.g_DefNameWorksheet = new AscCommonExcel.Worksheet(wb, -1);
let nEditor;
if (!(oApi)["asc_isSupportFeature"]("ooxml") || isLocalDesktop) {
let binaryData = stream;
if (!isLocalDesktop) {
binaryData = null;
let jsZlib = new AscCommon.ZLib();
if (!jsZlib.open(stream)) {
oApi.sendEvent("asc_onErrorUpdateExternalReference", externalReferenceId);
continue;
}
if (jsZlib.files && jsZlib.files.length) {
binaryData = jsZlib.getFile(jsZlib.files[0]);
}
}
if (binaryData) {
nEditor = AscCommon.getEditorByBinSignature(binaryData);
if (nEditor !== AscCommon.c_oEditorId.Spreadsheet) {
continue;
}
AscFormat.ExecuteNoHistory(function () {
const oBinaryFileReader = new AscCommonExcel.BinaryFileReader(true);
oBinaryFileReader.InitOpenManager.copyPasteObj = {
isCopyPaste: true, activeRange: null, selectAllSheet: true
};
AscCommon.pptx_content_loader.Start_UseFullUrl();
AscCommon.pptx_content_loader.Reader.ClearConnectedObjects();
oBinaryFileReader.Read(binaryData, wb);
AscCommon.pptx_content_loader.Reader.AssignConnectedObjects();
wb.dependencyFormulas.initOpen();
});
for (let j = 0; j < arrExternalChartReferences.length; j += 1) {
const oExternalReference = arrExternalChartReferences[j].externalReference;
if (oExternalReference && !oExternalReference.chart.bDeleted && (oExternalReference.chart.getExternalReference() === oExternalReference)) {
oExternalReference.updateData(wb, _arrAfterPromise[i].data);
}
}
}
} else {
nEditor = AscCommon.getEditorByOOXMLSignature(stream);
if (nEditor !== AscCommon.c_oEditorId.Spreadsheet) {
continue;
}
let updatedData = wb.getExternalReferenceSheetsFromZip(stream);
wb.aWorksheets = updatedData;
wb._updateWorksheetIndexes();
wb.dependencyFormulas.initOpen();
wb.externalReferences.forEach(function(elem){
elem.initPostOpen();
});
if (updatedData) {
for (let j = 0; j < arrExternalChartReferences.length; j += 1) {
const oExternalReference = arrExternalChartReferences[j].externalReference;
if (oExternalReference && !oExternalReference.chart.bDeleted && (oExternalReference.chart.getExternalReference() === oExternalReference)) {
oExternalReference.updateData(wb, _arrAfterPromise[i].data);
}
}
}
}
AscCommonExcel.g_DefNameWorksheet = null;
} else {
if (arrExternalChartReferences) {
oApi.sendEvent("asc_onErrorUpdateExternalReference", externalReferenceId);
}
}
}
fCallback && fCallback(true);
oApi.sendEvent("asc_onStartUpdateExternalReference", false);
if (oLogicDocument.IsDocumentEditor()) {
oLogicDocument.Recalculate();
}
oLogicDocument.FinalizeAction(true);
oThis.onUpdateExternalList();
oThis.endLongLock();
oLogicDocument.UpdateInterface();
oThis.isLocked(arrCharts);
};
oApi.sendEvent("asc_onStartUpdateExternalReference", true);
const arrUniqueExternalReferences = [];
for (let i = 0; i < arrExternalReferences.length; i++) {
const sId = arrExternalReferences[i].asc_getId();
if (!mapExternalReferences[sId]) {
mapExternalReferences[sId] = [];
arrUniqueExternalReferences.push(arrExternalReferences[i]);
}
mapExternalReferences[sId].push(arrExternalReferences[i]);
}
const oDataUpdater = new AscCommon.CExternalDataLoader(arrUniqueExternalReferences, oApi, doUpdateData);
oDataUpdater.updateExternalData();
}
};
CExternalChartCollector.prototype.removeExternalReferences = function (arrReferences) {
if (!this.isInit || this.isLocked(this.getCharts(arrReferences))) {
return;
}
this.logicDocument.StartAction(AscDFH.historydescription_Document_RemoveExternalChartReferences);
for (let i = 0; i < arrReferences.length; i++) {
const oChart = arrReferences[i].externalReference.chart;
oChart.setExternalReference(null);
}
this.logicDocument.FinalizeAction();
this.logicDocument.UpdateInterface();
this.onUpdateExternalList();
};
CExternalChartCollector.prototype.changeExternalReference = function (oAscExternalReference, oExternalInfo) {
if (!this.isInit || this.isLocked(this.getCharts([oAscExternalReference]))) {
return;
}
const oReference = oAscExternalReference.externalReference;
const oChart = oReference && oReference.chart;
if (oChart && !oChart.bDeleted) {
this.logicDocument.StartAction(AscDFH.historydescription_Document_ChangeExternalChartReference);
const oNewReference = new AscCommonExcel.CChartExternalReference(oChart);
oNewReference.initFromObj(oExternalInfo);
oChart.setExternalReference(oNewReference);
if (oChart.XlSX && oChart.XlSX.length) {
oChart.setXLSX(new Uint8Array(0));
}
this.logicDocument.FinalizeAction();
this.logicDocument.UpdateInterface();
this.onUpdateExternalList();
}
};
AscCommon.CExternalChartCollector = CExternalChartCollector;
})(window);