var markupArea = $('#markuparea'); var previewArea = $('#preview'); var btnPreview = $("#switchPreview"); var btnMarkup = $("#switchMarkup"); var btnPrint = $('#printReport'); var btnSave = $('#saveMarkupButton'); var btnFilename = $('#getFilename'); var reportId = $("#idInput").val(); var filename = $("#filename").val().replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ""); var isDirty = false; $(document).ready(function() { textAreaAdjust(document.getElementById("markuparea")); markupArea.keyup(function() { isDirty = true; }); // Сохранение по кнопке btnSave.click(function(e) { saveMarkup(); }); // Сохранение на Ctrl+S document.addEventListener("keydown", function(e) { if (e.keyCode === 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) { e.preventDefault(); saveMarkup(); } }, false); // Вставка картинок на Ctrl+V // https://stackoverflow.com/a/6338207 markupArea.on('paste', function (e) { let items = (e.clipboardData || e.originalEvent.clipboardData).items; for (let index in items) { let item = items[index]; if (item.kind === 'file') { // Загрузка файла через jQuery AJAX // https://stackoverflow.com/a/13333478 var fd = new FormData(); fd.append('file', item.getAsFile()); $.ajax({ url: "/autogost/upload-image", type: "post", data: fd, processData: false, contentType: false, success: function (response) { response = JSON.parse(response); if (response.ok) { const line = "\n@img:"+response.filename+":Изображение"; insertAtCursor(document.getElementById("markuparea"), line); } } }); } } }); btnPreview.click(function() { $("#switchMarkup").removeClass('selected'); $("#switchPreview").addClass('selected'); previewArea.html('
'); markupArea.hide(); previewArea.show(); saveMarkup(); updatePreview(); }); btnMarkup.click(function() { $("#switchMarkup").addClass('selected'); $("#switchPreview").removeClass('selected'); textAreaAdjust(markupArea); markupArea.show(); previewArea.hide(); saveMarkup(); }); // Скопировать текст в буфер обмена btnFilename.click(async function() { await navigator.clipboard.writeText(filename); btnFilename.text("Название скопировано"); btnFilename.blur(); }); btnFilename.mouseleave(function () { btnFilename.text("Получить название файла"); }); btnPrint.click(function() { saveMarkup(); updatePreview(true); }); }); // Заставляет textarea расширяться так, чтобы был текст в ней был полностью // виден function textAreaAdjust(element) { if (element.scrollHeight > element.clientHeight) { // Содержимое полностью не вмещается element.style.height = "calc(1lh + " + element.scrollHeight +"px)"; } } // Обновляет #preview на странице, отсылая запрос на получение HTML function updatePreview(thenPrint=false) { $.ajax({ url: "/autogost/gethtml", type: "post", data: { report_id: reportId }, success: function (data, textStatus, xhr) { previewArea.html(data); if (thenPrint) { window.print(); } } }); } // Сохраняет разметку для данного отчёта function saveMarkup() { $.ajax({ url: "/reports/update", type: "post", data: { id: reportId, markup: markupArea.val() }, success: function() { isDirty = false; btnSave.blur(); } }); } // Вставка текста на текущую позицию курсора // https://stackoverflow.com/a/11077016 function insertAtCursor(myField, myValue) { //IE support if (document.selection) { myField.focus(); sel = document.selection.createRange(); sel.text = myValue; } //MOZILLA and others else if (myField.selectionStart || myField.selectionStart == '0') { var startPos = myField.selectionStart; var endPos = myField.selectionEnd; myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length); } else { myField.value += myValue; } textAreaAdjust(myField); isDirty = true; } // https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event const beforeUnloadHandler = (event) => { if (isDirty == false) { return true; } // Recommended event.preventDefault(); // Included for legacy support, e.g. Chrome/Edge < 119 event.returnValue = true; }; window.addEventListener("beforeunload", beforeUnloadHandler);