mirror of
https://github.com/ONLYOFFICE/onlyoffice.github.io.git
synced 2026-02-10 18:05:06 +08:00
339 lines
10 KiB
JavaScript
339 lines
10 KiB
JavaScript
/**
|
||
*
|
||
* (c) Copyright Ascensio System SIA 2020
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*
|
||
*/
|
||
(function(window, undefined) {
|
||
const isLocal = ( (window.AscDesktopEditor !== undefined) && (window.location.protocol.indexOf('file') !== -1) );
|
||
let interval = null;
|
||
let errTimeout = null;
|
||
let loader = null;
|
||
let loaderTimeout = null;
|
||
|
||
// create iframe
|
||
const iframe = document.createElement('iframe');
|
||
|
||
let warningWindow = null;
|
||
let developerWindow = null;
|
||
let removeGuid = null;
|
||
let BFrameReady = false;
|
||
let BPluginReady = false;
|
||
let editorVersion = null;
|
||
let marketplaceURl = null;
|
||
const OOMarketplaceUrl = isLocal ? './store/index.html' : 'https://onlyoffice.github.io/store/index.html';
|
||
try {
|
||
// for incognito mode
|
||
marketplaceURl = localStorage.getItem('DeveloperMarketplaceUrl') || OOMarketplaceUrl;
|
||
} catch (err) {
|
||
marketplaceURl = OOMarketplaceUrl;
|
||
}
|
||
|
||
window.Asc.plugin.init = function() {
|
||
window.Asc.plugin.executeMethod('ShowButton',['developer', true, 'right']);
|
||
// resize window
|
||
window.Asc.plugin.resizeWindow(608, 600, 608, 600, 0, 0);
|
||
if (!isLocal) {
|
||
checkInternet(true);
|
||
loaderTimeout = setTimeout(createLoader, 500);
|
||
} else {
|
||
initPlugin();
|
||
}
|
||
};
|
||
|
||
function postMessage(message) {
|
||
iframe.contentWindow.postMessage(JSON.stringify(message), '*');
|
||
};
|
||
|
||
function initPlugin() {
|
||
document.body.appendChild(iframe);
|
||
if (marketplaceURl !== OOMarketplaceUrl)
|
||
document.getElementById('notification').classList.remove('hidden');
|
||
|
||
// send message that plugin is ready
|
||
window.Asc.plugin.executeMethod('GetVersion', null, function(version) {
|
||
editorVersion = version;
|
||
BPluginReady = true;
|
||
if (BFrameReady)
|
||
postMessage( { type: 'PluginReady', version: editorVersion } );
|
||
});
|
||
|
||
let divNoInt = document.getElementById('div_noIternet');
|
||
let style = document.getElementsByTagName('head')[0].lastChild;
|
||
let pageUrl = marketplaceURl;
|
||
iframe.src = pageUrl + window.location.search;
|
||
iframe.onload = function() {
|
||
BFrameReady = true;
|
||
if (BPluginReady) {
|
||
if (!divNoInt.classList.contains('hidden')) {
|
||
divNoInt.classList.add('hidden');
|
||
clearInterval(interval);
|
||
interval = null;
|
||
}
|
||
postMessage( { type: 'Theme', theme: window.Asc.plugin.theme, style : style.innerHTML } );
|
||
postMessage( { type: 'PluginReady', version: editorVersion } );
|
||
}
|
||
};
|
||
};
|
||
|
||
window.Asc.plugin.button = function(id, windowID) {
|
||
if (warningWindow && warningWindow.id == windowID) {
|
||
switch (id) {
|
||
case 0:
|
||
removePlugin(false);
|
||
break;
|
||
case 1:
|
||
removePlugin(true);
|
||
break;
|
||
default:
|
||
postMessage( {type: 'Removed', guid: ''} );
|
||
break;
|
||
}
|
||
window.Asc.plugin.executeMethod('CloseWindow', [windowID]);
|
||
} else if (developerWindow && developerWindow.id == windowID) {
|
||
if (id == 0)
|
||
developerWindow.command('onClickBtn');
|
||
else
|
||
window.Asc.plugin.executeMethod('CloseWindow', [windowID]);
|
||
} else if (id == 'back') {
|
||
window.Asc.plugin.executeMethod('ShowButton',['back', false]);
|
||
if (iframe && iframe.contentWindow)
|
||
postMessage( { type: 'onClickBack' } );
|
||
} else if (id == 'developer') {
|
||
createWindow('developer');
|
||
} else {
|
||
this.executeCommand('close', '');
|
||
}
|
||
};
|
||
|
||
window.addEventListener('message', function(message) {
|
||
// getting messages from marketplace
|
||
let data = JSON.parse(message.data);
|
||
|
||
switch (data.type) {
|
||
case 'getInstalled':
|
||
// данное сообщение используется только при инициализации плагина и по умолчанию идёт парсинг и отрисовка плагинов из стора
|
||
// добавлен флаг updateInstalled - в этом случае не загружаем плагины из стора повторно, работаем только с установленными
|
||
|
||
window.Asc.plugin.executeMethod('GetInstalledPlugins', null, function(result) {
|
||
postMessage({ type: 'InstalledPlugins', data: result, updateInstalled: data.updateInstalled } );
|
||
});
|
||
break;
|
||
case 'install':
|
||
window.Asc.plugin.executeMethod('InstallPlugin', [data.config, data.guid], function(result) {
|
||
postMessage(result);
|
||
});
|
||
break;
|
||
case 'remove':
|
||
removeGuid = data.guid;
|
||
if ( Number( editorVersion.split('.').join('') < 740) )
|
||
removePlugin(true);
|
||
else if ( !data.backup )
|
||
removePlugin(data.backup);
|
||
else
|
||
createWindow('warning');
|
||
break;
|
||
case 'update':
|
||
window.Asc.plugin.executeMethod('UpdatePlugin', [data.config, data.guid], function(result) {
|
||
postMessage(result);
|
||
});
|
||
break;
|
||
case 'showButton' :
|
||
window.Asc.plugin.executeMethod('ShowButton',['back', true]);
|
||
break;
|
||
}
|
||
|
||
}, false);
|
||
|
||
window.Asc.plugin.onExternalMouseUp = function() {
|
||
// mouse up event outside the plugin window
|
||
if (iframe && iframe.contentWindow) {
|
||
postMessage( { type: 'onExternalMouseUp' } );
|
||
}
|
||
};
|
||
|
||
window.Asc.plugin.onThemeChanged = function(theme) {
|
||
// theme changed event
|
||
if ( theme.type.indexOf('light') !== -1 ) {
|
||
theme['background-toolbar'] = '#fff';
|
||
}
|
||
window.Asc.plugin.onThemeChangedBase(theme);
|
||
let style = document.getElementsByTagName('head')[0].lastChild;
|
||
if (iframe && iframe.contentWindow)
|
||
postMessage( { type: 'Theme', theme: theme, style : style.innerHTML } );
|
||
};
|
||
|
||
window.Asc.plugin.onTranslate = function() {
|
||
let label = document.getElementById('lb_notification');
|
||
if (label)
|
||
label.innerHTML = window.Asc.plugin.tr(label.innerHTML);
|
||
|
||
label = document.getElementById('lb_noInternet');
|
||
if (label)
|
||
label.innerHTML = window.Asc.plugin.tr(label.innerHTML);
|
||
};
|
||
|
||
function checkInternet(bSetTimeout) {
|
||
try {
|
||
let xhr = new XMLHttpRequest();
|
||
let url = 'https://onlyoffice.github.io/store/translations/langs.json';
|
||
xhr.open('GET', url, true);
|
||
|
||
xhr.onload = function () {
|
||
if (this.readyState == 4) {
|
||
if (this.status >= 200 && this.status < 300) {
|
||
endInternetChecking(true);
|
||
}
|
||
}
|
||
};
|
||
|
||
xhr.onerror = function (err) {
|
||
endInternetChecking(false);
|
||
};
|
||
|
||
xhr.send(null);
|
||
} catch (error) {
|
||
endInternetChecking(false);
|
||
}
|
||
if (bSetTimeout) {
|
||
errTimeout = setTimeout(function() {
|
||
// if loading is too long show the error (because sometimes requests can not send error)
|
||
endInternetChecking(false);
|
||
}, 15000);
|
||
}
|
||
};
|
||
|
||
function endInternetChecking(isOnline) {
|
||
clearTimeout(errTimeout);
|
||
errTimeout = null;
|
||
destroyLoader();
|
||
if (isOnline) {
|
||
initPlugin();
|
||
} else {
|
||
document.getElementById('div_noIternet').classList.remove('hidden');
|
||
if (!interval) {
|
||
interval = setInterval(function() {
|
||
checkInternet(false);
|
||
}, 5000);
|
||
}
|
||
}
|
||
};
|
||
|
||
function createWindow(type) {
|
||
let fileName = type + '.html';
|
||
let description = window.Asc.plugin.tr('Warning');
|
||
let size = [350, 100];
|
||
let buttons = [
|
||
{
|
||
'text': window.Asc.plugin.tr('Yes'),
|
||
'primary': true
|
||
},
|
||
{
|
||
'text': window.Asc.plugin.tr('No'),
|
||
'primary': false
|
||
}
|
||
];
|
||
if (type == 'developer') {
|
||
fileName = 'developer.html';
|
||
description = window.Asc.plugin.tr('Developer Mode');
|
||
size = [500, 150];
|
||
buttons = [
|
||
{
|
||
'text': window.Asc.plugin.tr('Ok'),
|
||
'primary': true
|
||
},
|
||
{
|
||
'text': window.Asc.plugin.tr('Cancel'),
|
||
'primary': false
|
||
}
|
||
];
|
||
}
|
||
let location = window.location;
|
||
let start = location.pathname.lastIndexOf('/') + 1;
|
||
let file = location.pathname.substring(start);
|
||
|
||
let variation = {
|
||
url : location.href.replace(file, fileName),
|
||
description : description,
|
||
isVisual : true,
|
||
isModal : true,
|
||
isViewer: true,
|
||
EditorsSupport : ['word', 'cell', 'slide', 'pdf'],
|
||
size : size,
|
||
buttons : buttons
|
||
};
|
||
|
||
if (type == 'warning') {
|
||
if (!warningWindow) {
|
||
warningWindow = new window.Asc.PluginWindow();
|
||
}
|
||
warningWindow.show(variation);
|
||
} else {
|
||
if (!developerWindow) {
|
||
developerWindow = new window.Asc.PluginWindow();
|
||
developerWindow.attachEvent('onWindowMessage', function(message) {
|
||
if (message.type == 'SetURL') {
|
||
if (message.url.length) {
|
||
marketplaceURl = message.url;
|
||
localStorage.setItem('DeveloperMarketplaceUrl', marketplaceURl);
|
||
document.getElementById('notification').classList.remove('hidden');
|
||
} else {
|
||
marketplaceURl = OOMarketplaceUrl;
|
||
localStorage.removeItem('DeveloperMarketplaceUrl');
|
||
document.getElementById('notification').classList.add('hidden');
|
||
}
|
||
iframe.src = marketplaceURl + window.location.search;
|
||
}
|
||
window.Asc.plugin.executeMethod('CloseWindow', [developerWindow.id]);
|
||
});
|
||
}
|
||
developerWindow.show(variation);
|
||
}
|
||
|
||
};
|
||
|
||
function removePlugin(backup) {
|
||
if (removeGuid)
|
||
window.Asc.plugin.executeMethod('RemovePlugin', [removeGuid, backup], function(result) {
|
||
postMessage(result);
|
||
});
|
||
|
||
removeGuid = null;
|
||
};
|
||
|
||
window.onresize = function() {
|
||
// zoom for all elements in plugin window
|
||
let zoom = 1;
|
||
if (window.devicePixelRatio < 1)
|
||
zoom = 1 / window.devicePixelRatio;
|
||
|
||
document.getElementsByTagName('html')[0].style.zoom = zoom;
|
||
};
|
||
|
||
function createLoader() {
|
||
$('#loader-container').removeClass( 'hidden' );
|
||
loader && (loader.remove ? loader.remove() : $('#loader-container')[0].removeChild(loader));
|
||
loader = showLoader($('#loader-container')[0], window.Asc.plugin.tr('Checking internet connection...'));
|
||
};
|
||
|
||
function destroyLoader() {
|
||
clearTimeout(loaderTimeout);
|
||
loaderTimeout = null;
|
||
$('#loader-container').addClass( 'hidden' )
|
||
loader && (loader.remove ? loader.remove() : $('#loader-container')[0].removeChild(loader));
|
||
loader = undefined;
|
||
};
|
||
|
||
})(window, undefined);
|