Skip to content

Commit

Permalink
Fix/reference data (#3246)
Browse files Browse the repository at this point in the history
* [se] Update external references for desktop
  • Loading branch information
GoshaZotov committed Jan 21, 2023
1 parent 8fde318 commit e73edb7
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 64 deletions.
6 changes: 3 additions & 3 deletions cell/model/WorkbookElems.js
Original file line number Diff line number Diff line change
Expand Up @@ -13969,11 +13969,11 @@ QueryTableField.prototype.clone = function() {

OleSizeSelectionRange.prototype.getFirstFromLocalHistory = function () {
return this.localHistory[0].clone();
}
};

OleSizeSelectionRange.prototype.getLastFromLocalHistory = function () {
return this.localHistory[this.localHistory.length - 1].clone();
}
};

OleSizeSelectionRange.prototype.resetHistory = function () {
this.localHistory = [];
Expand All @@ -13993,7 +13993,7 @@ QueryTableField.prototype.clone = function() {
this.ranges = [oRange.clone()];
this.activeCellId = 0;
this.activeCell = new AscCommon.CellBase(oRange.r1, oRange.c1);
}
};

OleSizeSelectionRange.prototype.clean = function () {
this.ranges = [new Asc.Range(0, 0, 10, 10)];
Expand Down
122 changes: 72 additions & 50 deletions cell/view/WorkbookView.js
Original file line number Diff line number Diff line change
Expand Up @@ -5053,36 +5053,39 @@

this.model.handlers.trigger("asc_onStartUpdateExternalReference", true);

let doPromise = function (data) {
//создаём запросы
var arrAfterPromise = [];

var aRequests = [];
t._getPromiseRequestsArr(data, aRequests, externalReferences, function (_stream, externalReferenceId, oData) {
arrAfterPromise.push({stream: _stream, externalReferenceId: externalReferenceId, data: oData});
if (aRequests.length === arrAfterPromise.length) {
doUpdateData(arrAfterPromise);
}
});

if (!aRequests.length) {
t.model.handlers.trigger("asc_onStartUpdateExternalReference", false);
return;
}

var _promise = Promise.resolve();
for (let i in aRequests) {
_promise = _promise.then(aRequests[i]);
}
};

if (window["AscDesktopEditor"]) {
//TODO для декстопа необходима функция получения файлов + при копипасте нужно записывать путь файла(и знать путь текущего файла, чтобы вычислить относительный)
//десктоп
//var arrAfterPromise = getFilesContent(externalReferences);
//doUpdateData(arrAfterPromise);
doPromise();
} else {
//портал
//получаем ссылку на файл через asc_onUpdateExternalReference от портала
t._getExternalReferenceData(externalReferences, function (data) {
//создаём запросы
var arrAfterPromise = [];

var aRequests = [];
t._getPromiseRequestsArr(data, aRequests, externalReferences, function (_stream, externalReferenceId, oData) {
arrAfterPromise.push({stream: _stream, externalReferenceId: externalReferenceId, data: oData});
if (aRequests.length === arrAfterPromise.length) {
doUpdateData(arrAfterPromise);
}
});

if (!aRequests.length) {
t.model.handlers.trigger("asc_onStartUpdateExternalReference", false);
return;
}

var _promise = Promise.resolve();
for (let i in aRequests) {
_promise = _promise.then(aRequests[i]);
}
});
t._getExternalReferenceData(externalReferences, doPromise);
}
}
};
Expand All @@ -5106,13 +5109,6 @@
return function () {

return new Promise(function (resolve) {
let sFileUrl = oData && !oData["error"] ? oData["url"] : null;
let isExternalLink = eR.isExternalLink();

//если ссылка на внешний источник, пробуем получить контент
if (!sFileUrl && oData["error"] && isExternalLink) {
sFileUrl = eR.data;
}

let resolveStream = function (stream) {
resolve(_resolve(stream, eR.externalReference.Id, oData));
Expand All @@ -5131,32 +5127,58 @@
}, "arraybuffer");
};

//если открыть на клиенте не можем, то запрашиваем бинарник
let isXlsx = eR.externalReference && eR.externalReference.isXlsx();
let outputFormat = t.Api["asc_isSupportFeature"]("ooxml") ? Asc.c_oAscFileType.XLSX : Asc.c_oAscFileType.XLSY;
let fileType = oData["fileType"];
let token = oData["token"];
let directUrl = oData["directUrl"];

//если внешняя ссылка, то конвертируем в xlsx
if (sFileUrl && (isExternalLink || !isXlsx) || !t.Api["asc_isSupportFeature"]("ooxml")) {
t.Api._getFileFromUrl(sFileUrl, fileType, token, outputFormat,
function (fileUrlAfterConvert) {
if (fileUrlAfterConvert) {
successfulLoadFileMap[sFileUrl] = 1;
loadFile(fileUrlAfterConvert);
} else if (!successfulLoadFileMap[sFileUrl]) {
resolve(_resolve(null, eR.externalReference.Id, oData));

let sFileUrl = window["AscDesktopEditor"] ? eR.externalReference && eR.externalReference.Id : (oData && !oData["error"] ? oData["url"] : null);
let isExternalLink = eR.isExternalLink();

if (window["AscDesktopEditor"]) {
//TODO isExternalLink
if (sFileUrl) {
//resolveStream(stream);
window["AscDesktopEditor"]["convertFile"](sFileUrl, 0x2002, function (_file) {
let stream = null;
if (_file) {
stream = _file["get"](/*Editor.bin*/);
}
});
} else {
if (directUrl || sFileUrl) {
t.Api._downloadOriginalFile(directUrl, sFileUrl, fileType, token, function(stream){
resolveStream(stream);
});

} else {
resolve(_resolve(null, eR.externalReference.Id, oData));
}
} else {
//если ссылка на внешний источник, пробуем получить контент
if (!sFileUrl && oData["error"] && isExternalLink) {
sFileUrl = eR.data;
}

//если открыть на клиенте не можем, то запрашиваем бинарник
let isXlsx = eR.externalReference && eR.externalReference.isXlsx();
let outputFormat = t.Api["asc_isSupportFeature"]("ooxml") ? Asc.c_oAscFileType.XLSX : Asc.c_oAscFileType.XLSY;
let fileType = oData["fileType"];
let token = oData["token"];
let directUrl = oData["directUrl"];

//если внешняя ссылка, то конвертируем в xlsx
if (sFileUrl && (isExternalLink || !isXlsx) || !t.Api["asc_isSupportFeature"]("ooxml")) {
t.Api._getFileFromUrl(sFileUrl, fileType, token, outputFormat,
function (fileUrlAfterConvert) {
if (fileUrlAfterConvert) {
successfulLoadFileMap[sFileUrl] = 1;
loadFile(fileUrlAfterConvert);
} else if (!successfulLoadFileMap[sFileUrl]) {
resolve(_resolve(null, eR.externalReference.Id, oData));
}
});
} else {
if (directUrl || sFileUrl) {
t.Api._downloadOriginalFile(directUrl, sFileUrl, fileType, token, function(stream){
resolveStream(stream);
});
} else {
resolve(_resolve(null, eR.externalReference.Id, oData));
}
}
}
});
}
Expand All @@ -5168,7 +5190,7 @@
let _oData = data && data[i];
let _eR = externalReferences[i];

if (_oData && _eR && (_eR.isExternalLink() || !_oData["error"])) {
if (window["AscDesktopEditor"] || (_oData && _eR && (_eR.isExternalLink() || !_oData["error"]))) {
requests.push(getPromise(_oData, _eR, resolveFunc));
}
}
Expand Down
28 changes: 17 additions & 11 deletions cell/view/WorksheetView.js
Original file line number Diff line number Diff line change
Expand Up @@ -17035,17 +17035,23 @@
}
}

var bRes = t._saveCellValueAfterEdit(c, val, flags, /*isNotHistory*/false, /*lockDraw*/false);

var tempCell;
c._foreachNoEmpty(function (cell) {
tempCell = cell;
});
if (tempCell) {
let _compare = function (_oldReferenceIds, _newReferenceIds) {
if (_oldReferenceIds && _newReferenceIds && _oldReferenceIds.length === _newReferenceIds.length) {
for (let i = 0; i < _newReferenceIds.length; i++) {
if (_oldReferenceIds[i] !== _newReferenceIds[i]) {
return false;
}
}
return true;
}
return false;
};

}
let beforeExternalReferences = t.getExternalReferencesByCell(c, null, true);
let bRes = t._saveCellValueAfterEdit(c, val, flags, /*isNotHistory*/false, /*lockDraw*/false);

if (t.getExternalReferencesByCell(c, true)) {
let afterExternalReferences = t.getExternalReferencesByCell(c, true, true);
if (afterExternalReferences && !_compare(afterExternalReferences, beforeExternalReferences)) {
t.model.workbook.handlers.trigger("asc_onNeedUpdateExternalReference");
}

Expand Down Expand Up @@ -24282,7 +24288,7 @@
this.workbook.doUpdateExternalReference(externalReferences);
};

WorksheetView.prototype.getExternalReferencesByCell = function (c, initStructure) {
WorksheetView.prototype.getExternalReferencesByCell = function (c, initStructure, opt_get_only_ids) {
let t = this;
let externalReferences = [];
t.model._getCell(c.bbox.r1, c.bbox.c1, function (cell) {
Expand All @@ -24293,7 +24299,7 @@
if ((AscCommonExcel.cElementType.cellsRange3D === fP.outStack[i].type || AscCommonExcel.cElementType.cell3D === fP.outStack[i].type) && fP.outStack[i].externalLink) {
let eR = t.model.workbook.getExternalWorksheet(fP.outStack[i].externalLink);
if (eR) {
externalReferences.push(eR.getAscLink());
externalReferences.push(opt_get_only_ids ? eR.Id : eR.getAscLink());
if (initStructure) {
eR.initRows(fP.outStack[i].getRange());
}
Expand Down

0 comments on commit e73edb7

Please sign in to comment.