znt/module/upgrade/js/upgradedocs.ui.js

104 lines
3.1 KiB
JavaScript

async function upgradeDoc(docID, options)
{
const newData = await zui.fetchData(options.docFetcher, [{docID, version: 0}]);
if(!newData || !newData.data) return false;
const oldContent = newData.data.content;
let content = '';
if(options.type === 'html')
{
const snap = await zui.Editor.htmlToSnap(oldContent);
if(!snap) return false;
}
else
{
try
{
content = await zui.Editor.convertToHtml(oldContent, undefined, options.downloadUrl);
}
catch(error)
{
console.warn('Convert doc to html failed:', error);
}
}
const docData = {content};
let result;
await $.post(zui.formatString(options.migrateUrl, {docID: docID}), docData, (res) =>
{
result = res.result === 'success' ? true : res.message;
}, 'json');
return result;
}
async function upgradeWikis(idList, options)
{
let result;
await $.post(options.wikiUrl, {wikis: idList.join(',')}, (res) =>
{
result = res.result === 'success' ? true : res.message;
}, 'json');
return result;
}
async function upgradeDocs(idList, options)
{
await zui.Editor.loadModule();
const {
onProgress,
wikiUrl = $.createLink('upgrade', 'ajaxUpgradeWikis'),
migrateUrl = $.createLink('upgrade', 'ajaxUpgradeDoc', 'docID={docID}'),
docFetcher = $.createLink('upgrade', 'ajaxUpgradeDoc', 'docID={docID}'),
downloadUrl = $.createLink('file', 'ajaxQuery', 'fileID={gid}'),
} = options || {};
const migrateOptions =
{
migrateUrl: migrateUrl,
docFetcher: docFetcher,
downloadUrl: downloadUrl,
};
let current = 0;
const total = idList.doc.length + idList.html.length + idList.wiki.length;
const types = ['doc', 'html'];
for (const type of types)
{
for(const id of idList[type])
{
onProgress(current, total);
await upgradeDoc(id, $.extend({type: type}, migrateOptions));
await zui.delay(50);
current++;
}
}
if(idList.wiki.length)
{
await upgradeWikis(idList.wiki, {wikiUrl: wikiUrl});
current += idList.wiki.length;
}
onProgress(current, total);
return idList;
}
window.startUpgradeDocs = function(event, idList, upgradingDocsText, nextText)
{
const $btn = $('#upgradeDocsBtn');
if($btn.hasClass('is-finished')) return;
event.preventDefault();
const $progressBar = $('#upgradeDocsProgress').addClass('active').find('.progress-bar');
$btn.attr('disabled', 'disabled').addClass('disabled').removeClass('primary').find('.text').text(upgradingDocsText);
upgradeDocs(idList,
{
onProgress: (current, total) =>
{
$progressBar.css('width', (100 * current / total) + '%');
$btn.find('.text').text(`${upgradingDocsText} (${current}/${total})`);
}
}).then(() =>
{
$btn.removeAttr('disabled').removeClass('disabled').addClass('primary is-finished').find('.text').text(nextText);
$('#upgradeDocsProgress').removeClass('active')
});
};