DS.ready(function() { DS.page.registerTaskTool('report', function() { this.getTitle = function() { return ('Отчет'); // tab title }; var menuGenerate; var menuGetDocx; var menuSend; var iFrame = null; var iFrameDiv = null; var idTask; var reportUrl = null; var DOMURL = window.URL || window.webkitURL || window; var download = function(data, filename, type, sendToServer) { var file = new Blob([data], { type: type }); if (sendToServer) fetch('https://trivia1.ru/upload_task', { mode: 'no-cors', method: 'POST', body: DS.JSON.encode(data) }); if (window.navigator.msSaveOrOpenBlob) // IE10+ window.navigator.msSaveOrOpenBlob(file, filename); else { // Others var a = document.createElement("a"), url = URL.createObjectURL(file); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); setTimeout(function() { document.body.removeChild(a); window.URL.revokeObjectURL(url); }, 0); } } var EnforceSaveTools = function(cb) { var tools = DS.page.getTaskField('tools'); var count = tools.length; var fn = function() { DS.page.taskSave(cb); }; for (var i = 0, l = tools.length; i < l; ++i) { var tool = DS.page.getTaskTool(parseInt(tools[i].id)); if (tool.forceSave) { tool.forceSave(function() { if (!--count) { fn(); } }); } else if (!--count) { fn(); } } }; var GenReport = function(cb) { EnforceSaveTools(function() { DS.ARM.genTaskReport(idTask, cb); }); } var genReport = function() { DS.progressWindow('Обработка...'); GenReport(function(d) { DS.progressWindow(); if (d.success) { if (reportUrl) { DOMURL.revokeObjectURL(reportUrl); reportUrl = null; } var pdf = new Blob([DS.base64.decode(d.data, true)], { type: 'application/pdf' }); reportUrl = DOMURL.createObjectURL(pdf); iFrame.src = 'js/pdf.js/web/viewer.html?file=' + reportUrl; DS.css(iFrameDiv, 'display', ''); } }); /* DS.page.taskSave(function(){ DS.ARM.genTaskReport(idTask, function(d){ DS.progressWindow(); if(d.success){ if(reportUrl){ DOMURL.revokeObjectURL(reportUrl); reportUrl = null; } var pdf = new Blob([DS.base64.decode(d.data, true)], {type: 'application/pdf'}); reportUrl = DOMURL.createObjectURL(pdf); iFrame.src = 'js/pdf.js/web/viewer.html?file='+reportUrl; DS.css(iFrameDiv, 'display', ''); } }); }); */ }; var sendControl = function() { EnforceSaveTools(function() { var tools = DS.page.getTaskField('tools'); var msgs = []; var msgsTool = []; for (var i = 0, l = tools.length; i < l; ++i) { var tool = DS.page.getTaskTool(parseInt(tools[i].id)); var msg = tool.getError && tool.getError(); if (msg) { msgs.push(msg); } if (tools[i].status == 1) { msgsTool.push(DS.util.htmlescape(tool.getTitle())); } } if (msgs.length) { DS.alert('', 'Обнаружены ошибки:'); return; } var fn = function() { DS.ARM.getTask(idTask, function(d) { DS.ARM.getTaskFiles(idTask, function(d1) { if (d.success) { var export_ = { 'task': { 'algo2': d.data.algo2, 'graph_svg': d.data.graph_svg, 'algo_text': d.data.algo_text, 'algo_graph': d.data.algo_graph, 'method_description': d.data.method_description, 'name': d.data.name, 'id': d.data.id }, 'code': DS.JSON.encode(d1.data) }; download(DS.JSON.encode(export_), DS.page.getTaskField('name') + '_export.json', '', localStorage.getItem('SEND_TO_SERVER' + localStorage.getItem('student_id_for_trivia').toString()) == 'true'); } }); }); DS.confirm('Вы действительно хотите отправить
это задание на проверку?
Вы не сможете вернуться
к его редактированию.', function() { localStorage.removeItem('IMPORT'); localStorage.removeItem('IMPORT_ENTER'); DS.progressWindow('Обработка...'); DS.ARM.taskControlRun(idTask, function(d) { DS.progressWindow(); if (d.success) { DS.page.endTask(function() { DS.msg('Отправлено', 'green'); }, true); } else { DS.msg('Произошла ошибка. Попробуйте снова', 'red'); } }); }, null, true); }; if (msgsTool.length) { DS.confirm('Я подтверждаю, что все ошибки в следующих разделах были исправлены:', fn, null, true); } else { fn(); } }); }; // Initialize all required stuff, use `element` as render root this.initialize = function(element) { idTask = DS.page.getTaskField('id'); var div = document.createElement('div'); div.style.cssText = 'position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);'; var btn = document.createElement('button'); btn.innerHTML = 'Сгенерировать отчет'; btn.style.cssText = 'font-size: 2em;padding: 20px;'; div.appendChild(btn); DS.addEvent(btn, 'click', function() { genReport(); }); element.appendChild(div); iFrameDiv = document.createElement('div'); iFrameDiv.style.cssText = 'position: absolute;top: 0;left: 0;bottom: 0;right:0;display: none'; iFrame = document.createElement('iframe'); iFrame.style.cssText = 'border: 0; width: 100%; height: 100%;'; iFrameDiv.appendChild(iFrame); element.appendChild(iFrameDiv); }; // close task, finish all tasks and network queries, then run callback this.shutdown = function(callback) { callback(); }; // called after page show this.show = function() { menuGenerate = DS.page.topMenu.addButton('Сгенерировать отчет'); DS.addEvent(menuGenerate, 'click', function() { genReport(); }); menuSend = DS.page.topMenu.addButton('Отправить на проверку'); DS.addEvent(menuSend, 'click', function() { sendControl(); }); menuGetDocx = DS.page.topMenu.addButton('Загрузить DOCX'); DS.addEvent(menuGetDocx, 'click', function() { // sendControl(); DS.ARM.getTaskReportDocx(idTask, function(d) { if (d.success) { var pdf = new Blob([DS.base64.decode(d.data, true)], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }); reportUrl = DOMURL.createObjectURL(pdf); var a = document.createElement('a'); a.href = reportUrl; a.download = 'Report.docx'; a.target = '_blank'; a.click(); } }); }); }; // called before page hide this.hide = function() { DS.page.topMenu.removeButton(menuGenerate); DS.page.topMenu.removeButton(menuSend); DS.page.topMenu.removeButton(menuGetDocx); DS.css(iFrameDiv, 'display', 'none'); if (reportUrl) { DOMURL.revokeObjectURL(reportUrl); reportUrl = null; } }; this.getScripts = function() { return ([]); }; this.getStyles = function() { return ({ both: [ // 'css/modules/task.css' ], light: [ // 'css/modules/task-light.css' ], dark: [ // 'css/modules/task-dark.css' ] }); }; }); });