</div>
</div>
<div class="card bg-light shadow my-3">
- <div class="card-header text-secondary py-2">
+ <div class="card-header text-secondary py-2 d-flex">
<span class="icon mr-3"><i class="fas fa-list"></i></span>
<span class="h6 font-weight-bolder my-2">Lists</span>
+ <div class="form-inline card-header-form input-group-sm align-self-center ml-auto mr-1">
+ Editor:
+ <div id="btnGroupEditor" class="btn-group btn-group-toggle btn-group-xs ml-1" data-toggle="buttons">
+ <label class="btn btn-outline-secondary form-check-label">
+ <input type="radio" class="form-check-input" name="editorMode" autocomplete="off" value="basic">
+ Basic
+ </label>
+ <label class="btn btn-outline-secondary form-check-label active">
+ <input type="radio" class="form-check-input" name="editorMode" autocomplete="off" value="advanced" checked>
+ Advanced
+ </label>
+ </div>
+ </div>
</div>
<div class="card-body p-0">
<table class="table table-sm table-hover mb-0" id="listMaps">
ui.setup = function (rspamd) {
var jar = {};
- // CodeJar requires ES6
- var editor = window.CodeJar &&
- // Required to restore cursor position
- (typeof window.getSelection().setBaseAndExtent === "function")
- ? {
+ const editor = {
+ advanced: {
codejar: true,
elt: "div",
class: "editor language-clike",
readonly_attr: {contenteditable: false},
- }
- // Fallback to textarea if the browser does not support ES6
- : {
+ },
+ basic: {
elt: "textarea",
class: "form-control map-textarea",
readonly_attr: {readonly: true},
- };
+ }
+ };
+ let mode = "advanced";
+
+ // CodeJar requires ES6
+ if (!window.CodeJar ||
+ // Required to restore cursor position
+ (typeof window.getSelection().setBaseAndExtent !== "function")) {
+ mode = "basic";
+ $("input[name=editorMode][value='basic']").closest(".btn").button("toggle");
+ $("input[name=editorMode][value='advanced']").closest(".btn").addClass("disabled").prop("title", "Not supported by web browser");
+ }
// Modal form for maps
$(document).on("click", "[data-toggle=\"modal\"]", function () {
Map: item.map
},
success: function (data) {
- $("<" + editor.elt + ' id="editor" class="' + editor.class + '" data-id="' + item.map + '">' +
+ // Highlighting a large amount of text is unresponsive
+ mode = (new Blob([data[0].data]).size > 5120) ? "basic" : $("input[name=editorMode]:checked").val();
+
+ $("<" + editor[mode].elt + ' id="editor" class="' + editor[mode].class + '" data-id="' + item.map + '">' +
rspamd.escapeHTML(data[0].data) +
- "</" + editor.elt + ">").appendTo("#modalBody");
+ "</" + editor[mode].elt + ">").appendTo("#modalBody");
- if (editor.codejar) {
+ if (editor[mode].codejar) {
jar = new CodeJar(
document.querySelector("#editor"),
withLineNumbers(Prism.highlightElement)
var icon = "fa-edit";
if (item.editable === false || rspamd.read_only) {
- $("#editor").attr(editor.readonly_attr);
+ $("#editor").attr(editor[mode].readonly_attr);
icon = "fa-eye";
$("#modalSaveGroup").hide();
} else {
return false;
});
$("#modalDialog").on("hidden.bs.modal", function () {
- if (editor.codejar) {
+ if (editor[mode].codejar) {
jar.destroy();
$(".codejar-wrap").remove();
} else {
Map: $("#editor").data("id"),
},
params: {
- data: editor.codejar ? jar.toString() : $("#editor").val(),
+ data: editor[mode].codejar ? jar.toString() : $("#editor").val(),
dataType: "text",
},
server: server