/* Main object */
const ControlErrorLog = function (config) {
config = config || {};
ControlErrorLog.superclass.constructor.call(this, config);
};
Ext.extend(ControlErrorLog, Ext.Component, {
window: {}, combo: {}, config: {},
fileIndex: 0,
isEmpty: function(object) {
for (let key in object)
if (object.hasOwnProperty(key)) return false;
return true;
},
showLog: function() {
if (controlErrorLog.isEmpty(controlErrorLog.window)) {
controlErrorLog.window = new MODx.Window({
id: "errorlog-window",
height: 500,
width: 1000,
closeAction: 'hide',
title: _("error_log") ? _("error_log") : 'Error log',
stateful: false,
buttonAlign: "left",
tbar: [{
xtype: 'controlerrorlog-combo-logfiles',
width: 250,
emptyText: '',
cls: 'cel-files',
id: 'controlerrorlog-logfiles',
listeners: {
select: {
fn: function (combo, rec, index) {
if (index > 0 && controlErrorLog.config.allow_copy_deletion) {
Ext.getCmp('errorlog-clear-btn').setDeleteText();
} else {
Ext.getCmp('errorlog-clear-btn').setDefaultText();
}
controlErrorLog.fileIndex = index;
combo.baseParams.file = combo.value;
controlErrorLog.window._refresh();
}, scope: this
}
}
}, {
// xtype: "button",
text: '',
id: "errorlog-download-btn",
tooltip: _('errorlog_download'),
//hidden: !controlErrorLog.config.tooLarge,
handler: function () {
location.href = controlErrorLog.config.connector_url + "?action=mgr/errorlog/download&HTTP_MODAUTH=" + MODx.siteId + "&file=" + Ext.getCmp('controlerrorlog-logfiles').getValue();
},
scope: this
}, {
xtype: 'label',
id: 'errorlog-filesize-label',
style: 'font-weight: bold'
}],
items: [
{
xtype: "textarea",
name: "log",
hideLabel: true,
id: "window-errorlog-content",
style: 'margin-top: 10px;',
//value: controlErrorLog.config.log,
readOnly: true,
height: "94%",
width: "99%",
hidden: !controlErrorLog.config.tooLarge
}, {
html: _("errorlog_too_large") ? _("errorlog_too_large") : 'The error log is too large to be viewed. You can download it via the button below.',
id: "too-large-text",
style: "margin-top: 10px;",
border: false,
hidden: !controlErrorLog.config.tooLarge
}, {
xtype: 'label',
text: _("errorlog_last_lines") ? _("errorlog_last_lines", {last: controlErrorLog.config.last}) : 'The last '+controlErrorLog.config.last+' lines.',
id: "errorlog-last-lines",
style: "display:block;margin-top: 15px;",
border: false,
hidden: !(controlErrorLog.config.tooLarge && controlErrorLog.config.last > 0)
}, {
xtype: "textarea",
name: "log-last",
hideLabel: true,
id: "errorlog-last-lines-content",
value: controlErrorLog.config.log,
readOnly: true,
width: "99%",
hidden: !(controlErrorLog.config.tooLarge && controlErrorLog.config.last > 0)
}],
buttons: [{
text: ' ' + (_("cel_copy") ? _("cel_copy") : 'Make a copy'),
id: "errorlog-copy-btn",
handler: function () {
controlErrorLog.window._copy();
},
scope: this
}, '->' ,{
text: ' ' + (_("cel_refresh") ? _("cel_refresh") : 'Refresh'),
id: "errorlog-refresh-btn",
handler: function () {
controlErrorLog.window._refresh();
},
scope: this
}, {
text: '',
defaultText: ' ' + (_("cel_clear") ? _("cel_clear") : 'Clear'),
deleteText: ' ' + (_("cel_delete") ? _("cel_delete") : 'Delete'),
id: "errorlog-clear-btn",
disabled: controlErrorLog.config.empty,
setDefaultText: function() {
this.setText(this.defaultText).removeClass('btn-danger');
return this;
},
setDeleteText: function() {
this.setText(this.deleteText).addClass('btn-danger');
return this;
},
listeners: {
beforerender: {
fn: function (btn) {
btn.setText(btn.defaultText);
}, scope: this
}
},
handler: function () {
MODx.Ajax.request({
url: controlErrorLog.config.connector_url,
params: {
action: "mgr/errorlog/clear",
file: Ext.get('controlerrorlog-logfiles').getValue()
},
listeners: {
"success": {
fn: function (r) {
controlErrorLog.window._reset(r.object);
if (r.object.isDeleted) {
const combo = Ext.getCmp('controlerrorlog-logfiles');
combo.setValue('error.log');
combo.store.removeAt(controlErrorLog.fileIndex);
Ext.getCmp('errorlog-clear-btn').setDefaultText();
controlErrorLog.window._refresh();
} else {
Ext.getCmp('errorlog-filesize-label').setText(r.object.size);
}
if (r.object.name == 'error.log') {
document.getElementById("errorlog-link").className = "errorlog-empty";
}
}
},
"failure": {fn: function (r) {} }
}
});
},
scope: this
}, {
text: ' ' + (_("cel_close") ? _("cel_close") : 'Close'),
handler: function (w) {
controlErrorLog.window.hide();
},
scope: this
}],
listeners: {
show: {fn: function(w) {
w._refresh();
}, scope: this}
},
_reset: function(r) {
const log = Ext.getCmp("window-errorlog-content");
log.setValue(r.log);
// controlErrorLog.config.log = r.log;
Ext.getCmp("errorlog-clear-btn").disable();
Ext.getCmp("errorlog-copy-btn").disable();
if (controlErrorLog.config.tooLarge) {
log.show();
Ext.getCmp("too-large-text").hide();
// Ext.getCmp("errorlog-download-btn").hide();
Ext.getCmp("errorlog-last-lines").hide();
Ext.getCmp("errorlog-last-lines-content").hide();
controlErrorLog.config.tooLarge = false;
}
},
_refresh: function() {
MODx.Ajax.request({
url: controlErrorLog.config.connector_url,
params: {
action: "mgr/errorlog/get",
file: Ext.get('controlerrorlog-logfiles').getValue()
},
listeners: {
"success": {
fn: function (r) {
controlErrorLog.config = r.object;
//Ext.getCmp("window-errorlog-content").setValue(r.object.log);
Ext.getCmp("errorlog-copy-btn").disable();
if (controlErrorLog.config.empty) {
Ext.getCmp("errorlog-clear-btn").disable();
if (r.object.name == 'error.log') {
document.getElementById("errorlog-link").className = "errorlog-empty";
} else if (controlErrorLog.config.allow_copy_deletion) {
Ext.getCmp("errorlog-clear-btn").enable();
}
} else {
Ext.getCmp("errorlog-clear-btn").enable();
if (r.object.name == 'error.log') {
document.getElementById("errorlog-link").className = "errorlog-notempty";
Ext.getCmp("errorlog-copy-btn").enable();
}
}
Ext.getCmp('errorlog-filesize-label').setText(r.object.size);
if (controlErrorLog.config.tooLarge) {
const errorlog_last_lines = _("errorlog_last_lines") ? _("errorlog_last_lines", {last: controlErrorLog.config.last}) : 'The last '+controlErrorLog.config.last+' lines.';
Ext.getCmp("window-errorlog-content").hide();
Ext.getCmp("too-large-text").show();
Ext.getCmp("errorlog-last-lines").setText(errorlog_last_lines).show();
Ext.getCmp("errorlog-last-lines-content").setValue(r.object.log).show();
} else {
Ext.getCmp("window-errorlog-content").setValue(r.object.log).show();
Ext.getCmp("too-large-text").hide();
Ext.getCmp("errorlog-last-lines").hide();
Ext.getCmp("errorlog-last-lines-content").hide();
}
delete(controlErrorLog.config.log);
}
}
}
});
},
_copy: function() {
MODx.Ajax.request({
url: controlErrorLog.config.connector_url,
params: {
action: "mgr/errorlog/copy"
},
listeners: {
"success": {
fn: function (r) {
let file = r.object.file,
Record = Ext.data.Record.create([{name: "id"}, {name: "name"}]);
Ext.getCmp('controlerrorlog-logfiles').store.add(new Record({id: file, name: file}));
if (r.message) {
MODx.msg.alert(_('success'), r.message, Ext.emptyFn);
}
}
},
"failure": {fn: function (r) {} }
}
});
}
});
}
controlErrorLog.window.hidden ? controlErrorLog.window.show(Ext.EventObject.target) : controlErrorLog.window.hide();
},
getClass: function(empty) {
return empty ? "errorlog-empty" : "errorlog-notempty";
},
refreshLog: function() {
MODx.Ajax.request({
url: controlErrorLog.config.connector_url,
params: {
action: "mgr/errorlog/get"
},
listeners: {
success: {
fn: function (r) {
controlErrorLog.config.empty = r.object.empty;
document.getElementById("errorlog-link").className = controlErrorLog.getClass(controlErrorLog.config.empty);
}
}
}
});
}
});
// Ext.reg('control-errorlog', controlErrorLog);
controlErrorLog = new ControlErrorLog();
/* Combo */
controlErrorLog.combo.Logfiles = function(config) {
config = config || {};
Ext.applyIf(config,{
hideMode: 'offsets',
autoScroll: true,
maxHeight: 200,
url: controlErrorLog.config.connector_url,
baseParams: {
action: 'mgr/errorlog/getfiles'
},
name: 'logfiles',
hiddenName: 'logfiles',
// editable: false,
value: 'error.log'
});
controlErrorLog.combo.Logfiles.superclass.constructor.call(this,config);
};
Ext.extend(controlErrorLog.combo.Logfiles, MODx.combo.ComboBox);
Ext.reg('controlerrorlog-combo-logfiles', controlErrorLog.combo.Logfiles);
Ext.onReady(function() {
let usermenuUl = document.getElementById("modx-user-menu"),
errorlogLi = document.createElement("LI"),
title = _("errors_title") ? _("errors_title") : 'Open the error log in a modal window';
errorlogLi.innerHTML = "";
errorlogLi.className = "errorlog-li";
usermenuUl.insertBefore(errorlogLi, usermenuUl.firstChild);
if (controlErrorLog.config.auto_refresh) setInterval(controlErrorLog.refreshLog, controlErrorLog.config.refresh_freq);
});