shell bypass 403
class CodeEditor {
constructor(editor, opts = {}) {
this.editor = editor;
this.opts = opts;
this.codeEditor = this.buildCodeEditor();
this.codePopup = this.buildCodePopup();
}
// Build codeEditor (CodeMirror instance)
buildCodeEditor() {
let codeEditor = this.editor.CodeManager.getViewer('CodeMirror').clone();
codeEditor.set({
codeName: 'htmlmixed',
readOnly: false,
theme: 'hopscotch',
autoBeautify: true,
autoCloseTags: true,
autoCloseBrackets: true,
lineWrapping: true,
styleActiveLine: true,
smartIndent: true,
indentWithTabs: true,
});
return codeEditor;
}
// Build popup content, codeEditor area and buttons
buildCodePopup() {
const cfg = this.editor.getConfig();
let codePopup = document.createElement('div');
let btnEdit = document.createElement('button');
let btnCancel = document.createElement('button');
let textarea = document.createElement('textarea');
btnEdit.innerHTML = this.opts.sourceEditBtnLabel;
btnEdit.className = cfg.stylePrefix + 'btn-prim ' + cfg.stylePrefix + 'btn-code-edit';
btnEdit.onclick = this.updateCode.bind(this);
codePopup.appendChild(textarea);
codePopup.appendChild(btnEdit);
this.codeEditor.init(textarea);
return codePopup;
}
// Load content and show popup
showCodePopup() {
this.updateEditorContents();
this.codeEditor.editor.refresh();
this.editor.Modal.setContent('');
this.editor.Modal.setContent(this.codePopup);
this.editor.Modal.setTitle(this.opts.sourceEditModalTitle);
this.editor.Modal.open();
}
// Update GrapesJs content
updateCode() {
let code = this.codeEditor.editor.getValue();
let codeSave = this.getEditorContent();
// Catch error of code
try {
this.editor.DomComponents.getWrapper().set('content', '');
this.editor.setComponents(code.trim());
this.editor.Modal.close();
} catch (e) {
window.alert('Template error, you should fix your code before save! \n' + e.message);
this.editor.DomComponents.getWrapper().set('content', '');
this.editor.setComponents(codeSave.trim());
}
}
// Close popup
cancelCode() {
this.editor.Modal.close();
}
// Update CodeMirror content
updateEditorContents() {
this.codeEditor.setContent(this.getEditorContent());
}
// Get formated GrapesJs code
getEditorContent() {
const cfg = this.editor.getConfig();
let content;
// Check if MJML plugin is on
if ('grapesjsmjml' in cfg.pluginsOpts) {
content = this.editor.getHtml();
} else {
content =
this.editor.getHtml() +
'<style>' +
this.editor.getCss({ avoidProtected: true }) +
'</style>';
}
return content;
}
}
export default CodeEditor;