Files
2018-08-07 20:43:49 +08:00

677 lines
22 KiB
JavaScript

let actualAdapter;
function Core(main) {
$('.modal').modal();
$('.dropdown-trigger').dropdown();
$('.tabs').tabs();
$('select').formSelect();
$('.tooltipped').tooltip();
$('#btnCreate').click(() => {
createAdapter();
});
$('#ddExpert').click(() => {
let ddIcon = $('#ddIcon').text();
if(ddIcon == 'arrow_drop_down'){
$('#expert-settings').removeClass('hide');
$('#ddIcon').text('arrow_drop_up');
}else{
$('#expert-settings').addClass('hide');
$('#ddIcon').text('arrow_drop_down');
}
});
$('#sMode').change((obj) => {
console.log(obj.target.value);
if(obj.target.value === 'schedule'){
$('#cron-input').removeClass('hide');
}else{
$('#cron-input').addClass('hide');
}
});
$('#liEditor').click(() => {
$('#chooseAdapter').empty();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', 'getAdapterList', (result) => {
for(x in result){
$('#chooseAdapter').append('<li><a href="#!" class="black-text">'+result[x]+'</a></li>')
}
});
});
$('#chooseAdapter').click((obj) => {
actualAdapter = obj.target.innerText;
localStorage.lastEditedAdapter = actualAdapter;
$('#fTree').empty();
$('#selectedAdapter').text(actualAdapter);
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "getAdapterFiles", "folder": actualAdapter}, (result) => {
for(x in result){
if(result[x].type === 'folder') {
$('#fTree').append('<a id="f-'+result[x].name+'" href="#!" class="collection-item black-text as-folder" data-parent='+ result[x].parent + '><i class="tiny material-icons">folder</i> '+result[x].name+'</a>')
}else if(result[x].type === 'file') {
$('#fTree').append('<a id="f-'+result[x].name+'" href="#!" class="collection-item black-text as-file" data-parent='+ result[x].parent + '><i class="tiny material-icons">insert_drive_file</i> '+result[x].name+'</a>')
}
}
let elem = $('#fTree').find('a').sort(sortMe);
function sortMe(a, b) {
return a.className < b.className;
}
$('#fTree').append(elem);
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "getRunningState", "adapterName": actualAdapter.replace('yunkong2.', '')}, (result) => {
if(result === false){
$('#ssAdapter i').text('play_arrow');
}else if(result === true){
$('#ssAdapter i').text('stop');
}
})
});
});
$('#fTree').click((obj) => {
let folder = obj.target.dataset.parent;
let text = obj.target.innerText;
const pattFolder = new RegExp('as-folder');
const pattFile = new RegExp('as-file');
if(pattFolder.test(obj.target.className) === true){
if($('#' + obj.target.id + ' > a').length >0){
$('#' + obj.target.id + ' > a').remove();
}else{
let name = text.replace('folder ', '');
let folder = obj.target.dataset.parent;
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "getAdapterFiles", "folder": `${folder}/${name}`}, (result) => {
for(x in result){
if(result[x].type === 'folder') {
$('#' + obj.target.id).append('<a id="f-'+result[x].name+'" href="#!" class="collection-item black-text as-folder" data-parent='+ result[x].parent + '><i class="tiny material-icons">folder</i> '+result[x].name+'</a>')
}else if(result[x].type === 'file') {
$('#' + obj.target.id).append('<a id="f-'+result[x].name+'" href="#!" class="collection-item black-text as-file" data-parent='+ result[x].parent + '><i class="tiny material-icons">insert_drive_file</i> '+result[x].name+'</a>')
}
}
let elem = $('#' + obj.target.id).find('a').sort(sortMe);
function sortMe(a, b) {
return a.className < b.className;
}
$('#' + obj.target.id).append(elem);
$('#' + obj.target.id).addClass('as-open');
});
}
//Open File
}else if(pattFile.test(obj.target.className) === true){
let name = text.replace('insert_drive_file ', '');
localStorage.lastOpenFile = `${folder}/${name}`;
localStorage.lastOpenFileID = obj.target.id;
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "openFile", "file": `${folder}/${name}`}, (result) => {
let enc = new TextDecoder();
const pattType = new RegExp(/\.\w*$/);
let testRes = name.match(pattType);
loadToEditor(testRes, result, (data)=> {
if (data) {
$('#imageViewer').attr("src",data)
}
});
$('#fTree .collection-item').removeClass('active grey');
obj.target.className += ' active grey';
})
}
});
if(localStorage.lastEditedAdapter !== null && localStorage.lastEditedAdapter !== '' && localStorage.lastEditedAdapter !== undefined){
$('#chooseAdapter').text(localStorage.lastEditedAdapter);
$('#chooseAdapter').trigger('click');
if(localStorage.lastOpenFile !== null && localStorage.lastOpenFile !== '' && localStorage.lastOpenFile !== undefined){
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "openFile", "file": `${localStorage.lastOpenFile}`}, (result) => {
let enc = new TextDecoder();
const pattType = new RegExp(/\.\w*$/);
let x = localStorage.lastOpenFile;
let testRes;
if(x !== undefined && x !== '' && x !== null){
testRes = x.match(pattType);
}
loadToEditor(testRes, result, (data)=>{
if(data){
$('#imageViewer img').attr("src",data)
}
});
})
}
}
$('#chooseAdapter').empty();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', 'getAdapterList', function (result) {
for(x in result){
$('#chooseAdapter').append('<li><a href="#!" class="black-text">'+result[x]+'</a></li>')
}
});
$(window).bind('beforeunload', () => {
localStorage.fTree = $('div#fTree').html();
let cL = editor.session.getValue().length;
if(cl <5){
}else{
$('#saveFile').trigger('click');
}
});
$('#saveFile').click((obj) => {
/*
let text = $('a.as-file.active').text();
let name = text.replace('insert_drive_file ', '');
let folder = $('a.as-file.active').attr("data-parent");
*/
let file = localStorage.lastOpenFile;
let data = editor.session.getValue();
let instance = M.Modal.getInstance(document.getElementById('savedModal'));
instance.open();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "saveFile", "file": `${file}`, "data": data}, (result) => {
setTimeout(() => {
instance.close()
}, 1000);
});
});
$('#uploadFiles').click((obj) => {
let adapterName = actualAdapter.replace('yunkong2.', '');
let instance = M.Modal.getInstance(document.getElementById('waitModal'));
instance.open();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "uploadFiles", "adapterName": `${adapterName}`}, (result) => {
instance.close()
});
});
$('#ssAdapter').click((obj) => {
let adapterName = actualAdapter.replace('yunkong2.', '');
let iWaitModal = M.Modal.getInstance(document.getElementById('waitModal'));
let iErrorModal = M.Modal.getInstance(document.getElementById('errorModal'));
let x = obj.target.innerText;
let cmd;
if(x === 'play_arrow'){
cmd = 'start';
}else if(x === 'stop'){
cmd = 'stop';
}
iWaitModal.open();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "ssAdapter", "adapterName": `${adapterName}`, "cmd": `${cmd}`}, (result) => {
iWaitModal.close();
if(cmd === 'start'){
$('#ssAdapter i').text('stop');
console.log('TEST stop');
}else if(cmd === 'stop'){
$('#ssAdapter i').text('play_arrow');
console.log('TEST start');
}
if(result === 'Error'){
iErrorModal.open();
}
});
});
$('#rsAdapter').click((obj) => {
let adapterName = actualAdapter.replace('yunkong2.', '');
let iWaitModal = M.Modal.getInstance(document.getElementById('waitModal'));
let iErrorModal = M.Modal.getInstance(document.getElementById('errorModal'));
let x = obj.target.innerText;
let cmd = 'restart';
iWaitModal.open();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": "ssAdapter", "adapterName": `${adapterName}`, "cmd": `${cmd}`}, (result) => {
iWaitModal.close();
$('#ssAdapter i').text('stop');
if(result === 'Error'){
iErrorModal.open();
}
});
});
$('#publishTo').click((obj) => {
let to = obj.target.innerText;
let cmd;
if(to === 'npm'){
cmd = 'npmPublish'
}else if(to === 'github'){
cmd = 'githubPublish'
}
let iWaitModal = M.Modal.getInstance(document.getElementById('waitModal'));
let iErrorModal = M.Modal.getInstance(document.getElementById('errorModal'));
let iNpmLoginModal = M.Modal.getInstance(document.getElementById('npmLoginModal'));
iWaitModal.open();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": `${cmd}`, "adapterName": `${actualAdapter}`}, (result) => {
iWaitModal.close();
if(result === 'Error'){
iErrorModal.open();
}else if(result === 'Login required'){
iNpmLoginModal.open();
}
});
});
$('#npmLogin').click((obj) => {
let user = $('#npmUser').val();
let password = $('#npmPassword').val();
let email = $('#npmEmail').val();
let iWaitModal = M.Modal.getInstance(document.getElementById('waitModal'));
let iErrorModal = M.Modal.getInstance(document.getElementById('errorModal'));
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": `npmAddUser`, "user": `${user}`, "password": `${password}`, "email": `${email}`}, (result) => {
if(result === 'Error'){
iErrorModal.open();
}else if(result === 'Done'){
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": `npm publish`, "adapterName": `${actualAdapter}`}, (result) => {
iWaitModal.close();
if(result === 'Error'){
iErrorModal.open();
}else if(result === 'Login required'){
iNpmLoginModal.open();
$('#publishTo').trigger('click');
}
});
}
})
});
$('#gitLink').click(function(){
let link = $('#urlRepo').val();
let iWaitModal = M.Modal.getInstance(document.getElementById('waitModal'));
let iErrorModal = M.Modal.getInstance(document.getElementById('errorModal'));
iWaitModal.open();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {"command": `checkoutGithub`, "link": `${link}`}, (result) => {
if(result === 'Error'){
iErrorModal.open();
}else if(result === 'Done'){
iWaitModal.close();
}
})
});
}
function loadToEditor(fileType, content, callback){
let enc = new TextDecoder();
let type;
if(fileType === null){
type = '';
}else{
type = fileType[0];
}
switch(type){
case '.md':
case '.MD':
case 'md':
case 'MD':
editor.session.setMode("ace/mode/markdown");
break;
case '.json':
case '.JSON':
case 'json':
case 'JSON':
editor.session.setMode("ace/mode/json");
break;
case '.html':
case '.HTML':
case 'html':
case 'HTML':
editor.session.setMode("ace/mode/html");
break;
case '.css':
case '.CSS':
case 'CSS':
case 'css':
editor.session.setMode("ace/mode/css");
break;
case '.js':
case '.JS':
case 'js':
case 'JS':
editor.session.setMode("ace/mode/javascript");
break;
case '':
case 'null':
case '.txt':
case '.TXT':
case 'txt':
case 'TXT':
editor.session.setMode("ace/mode/text");
break;
case '.yaml':
case '.YAML':
case '.yml':
case '.YML':
case 'yaml':
case 'YAML':
case 'yml':
case 'YML':
editor.session.setMode("ace/mode/yaml");
break;
}
if(type !== '.png' && type !== '.PNG' && type !== '.jpg' && type !== '.JPG' && type !== '.jpeg' && type !== '.JPEG'){
$('#imageViewer').addClass('hide');
$('#editor').removeClass('hide');
editor.session.setValue(enc.decode(content));
}else{
$('#editor').addClass('hide');
$('#imageViewer').removeClass('hide');
let newPic = `data:image/png;base64,${content}`;
callback(newPic);
}
}
function createAdapter(){
let iWaitModal = M.Modal.getInstance(document.getElementById('waitModal'));
let iErrorModal = M.Modal.getInstance(document.getElementById('errorModal'));
iWaitModal.open();
main.socket.emit('sendTo', 'adapter-studio.0', 'send', {
command: 'createAdapter',
name: $('#adapter-name').val(),
author: $('#author-name').val(),
email: $('#author-email').val(),
keywords: $('#keywords').val(),
license: $('#sLicense').val(),
type: $('#sType').val(),
mode: $('#sMode').val(),
cron: $('#cron').val(),
logLevel: $('#sLogLevel').val(),
dependencies: $('#dependencies').val(),
enabled: $('#cbEnabled').prop('checked'),
widgets: $('#cbWidgets').prop('checked'),
webpage: $('#cbWWW').prop('checked'),
tab: $('#cbAdmTab').prop('checked'),
adminv2: $('#cbAdminV2').prop('checked'),
messagebox: $('#cbMessageBox').prop('checked'),
depAdapters: $('#depAdapters').val()
}, (result) => {
console.log(result);
iWaitModal.open();
if(result === 'Error'){
iErrorModal.open();
}else if(result === 'Done'){
iWaitModal.close();
let name = $('#adapter-name').val();
name = name.toLowerCase();
actualAdapter = `yunkong2.${name}`;
localStorage.lastOpenFile = '';
setTimeout(() => {
$('#liEditor')[0].click();
}, 500);
}
});
}
let firstConnect = true;
//Definition für socket.io Verbindung
let main = {
socket: io.connect(location.protocol + '//' + location.host, {
query: 'ws=true'
}),
saveConfig: (attr, value) => {
if (!main.config) return;
if (attr) main.config[attr] = value;
if (typeof storage !== 'undefined') {
storage.set('adminConfig', JSON.stringify(main.config));
}
},
showError: (error, cb) => {
main.showMessage(_(error), _('Error'), 'alert', cb);
},
showMessage: (message, title, icon, cb) => {
if (typeof title === 'function') {
cb = title;
title = null;
icon = null;
}
if (typeof icon === 'function') {
cb = icon;
icon = null;
}
$dialogMessage.dialog('option', 'title', title || _('Message'));
$('#dialog-message-text').html(message);
if (icon) {
if (!icon.match(/^ui\-icon\-/)) icon = 'ui-icon-' + icon;
$('#dialog-message-icon')
.show()
.attr('class', '')
.addClass('ui-icon ' + icon);
} else {
$('#dialog-message-icon').hide();
}
$dialogMessage.data('callback', cb);
$dialogMessage.dialog('open');
},
confirmMessage: (message, title, icon, buttons, callback) => {
if (typeof buttons === 'function') {
callback = buttons;
$dialogConfirm.dialog('option', 'buttons', [
{
text: _('Ok'),
click: () => {
let cb = $(this).data('callback');
$(this).dialog('close');
if (cb) cb(true);
}
},
{
text: _('Cancel'),
click: () => {
let cb = $(this).data('callback');
$(this).dialog('close');
if (cb) cb(false);
}
}
]);
} else if (typeof buttons === 'object') {
for (let b = 0; b < buttons.length; b++) {
buttons[b] = {
text: buttons[b],
id: 'dialog-confirm-button-' + b,
click: (e) => {
let id = parseInt(e.currentTarget.id.substring('dialog-confirm-button-'.length), 10);
let cb = $(this).data('callback');
$(this).dialog('close');
if (cb) cb(id);
}
}
}
$dialogConfirm.dialog('option', 'buttons', buttons);
}
$dialogConfirm.dialog('option', 'title', title || _('Message'));
$('#dialog-confirm-text').html(message);
if (icon) {
$('#dialog-confirm-icon')
.show()
.attr('class', '')
.addClass('ui-icon ui-icon-' + icon);
} else {
$('#dialog-confirm-icon').hide();
}
$dialogConfirm.data('callback', callback);
$dialogConfirm.dialog('open');
},
initSelectId: () => {
if (main.selectId) return main.selectId;
main.selectId = $('#dialog-select-member').selectId('init', {
objects: main.objects,
states: main.states,
noMultiselect: true,
imgPath: '../../lib/css/fancytree/',
filter: {type: 'state'},
getObjects: getObjects,
texts: {
select: _('Select'),
cancel: _('Cancel'),
all: _('All'),
id: _('ID'),
name: _('Name'),
role: _('Role'),
room: _('Room'),
value: _('Value'),
selectid: _('Select ID'),
from: _('From'),
lc: _('Last changed'),
ts: _('Time stamp'),
wait: _('Processing...'),
ack: _('Acknowledged')
},
columns: ['image', 'name', 'role', 'room', 'value']
});
return main.selectId;
},
subscribe: (isSubscribe) => {
if (!main.socket) return;
if (isSubscribe) {
main.socket.emit('subscribeObjects', 'script.*');
main.socket.emit('subscribeObjects', 'system.adapter.*');
main.socket.emit('requireLog', true);
} else {
main.socket.emit('unsubscribeObjects', 'script.*');
main.socket.emit('unsubscribeObjects', 'system.adapter.*');
main.socket.emit('requireLog', false);
}
},
objects: {},
states: {},
currentHost: '',
instances: [],
objectsLoaded: false,
waitForRestart: false,
selectId: null
};
main.socket.on('permissionError', (err) => {
main.showMessage(_('Has no permission to %s %s %s', err.operation, err.type, (err.id || '')));
});
main.socket.on('objectChange', (id, obj) => {
//setTimeout(objectChange, 0, id, obj);
console.log(id);
});
main.socket.on('stateChange', (id, obj) => {
console.log(id);
});
main.socket.on('connect',() => {
$('#connecting').hide();
if (firstConnect) {
firstConnect = false;
main.socket.emit('getUserPermissions', (err, acl) => {
main.acl = acl;
// Read system configuration
main.socket.emit('getObject', 'system.config', (err, data) => {
main.systemConfig = data;
if (!err && main.systemConfig && main.systemConfig.common) {
systemLang = main.systemConfig.common.language;
} else {
systemLang = window.navigator.userLanguage || window.navigator.language;
if (systemLang !== 'en' && systemLang !== 'de' && systemLang !== 'ru') {
main.systemConfig.common.language = 'en';
systemLang = 'en';
}
}
});
});
}
main.subscribe(true);
if (main.waitForRestart) {
location.reload();
}
});
main.socket.on('disconnect', () => {
$('#connecting').show();
});
main.socket.on('reconnect', () => {
$('#connecting').hide();
if (main.waitForRestart) {
location.reload();
}
});
main.socket.on('reauthenticate', () => {
location.reload();
});
main.socket.on('log', (message) => {
//setTimeout(onLog, 0, message);
console.log(message);
});
let core = new Core(main);