DS.ready(function() {
DS.page.registerModule('task', function() {
var elWrapper = null;
var elMainScreen = null;
var elTaskScreen = null;
var elChatScreen = null;
var _listSubjects = {};
var _listTasks = [];
var _listTools = {};
var _selectedListType = 0;
var _selectedListRenderer = null;
var _isInitialized = false;
var elTaskProcessName = null;
var elTaskProcessSubject = null;
var elTaskProcessTeacher = null;
var elTaskProcessUnsaved = null;
var btnCloseTask;
var btnExportTask;
var _taskStatusNames = [
'',
'Не выполнено',
'На проверке',
'Доработать',
'Сдано',
'Доработать (оценено)',
'На проверке (оценено)',
'У куратора'
];
var elPanelLeftBottom;
var fnInitTaskTool;
var fnFinishTools;
var _taskData = null;
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);
}
}
DS.page.getTaskField = function(key) {
return (_taskData[key]);
};
DS.page.setTaskField = function(key, val) {
if ((key in _taskData) && _taskData[key] == val) {
return;
}
_taskData[key] = val;
elTaskProcessUnsaved.style.display = '';
var key = 'task_' + DS.page.getTaskField('id');
try {
_taskData.__lastSaved = parseInt(Date.now() / 1000);
localStorage.setItem(key, DS.JSON.encode(_taskData));
} catch (e) {
localStorage.removeItem(key);
console.error(e);
}
};
var showComment = function(name, comment) {
DS.create({
DStype: 'window',
reqWidth: 400,
destroyOnClose: true,
items: [
[
'title', 'Комментарий к заданию ' + DS.util.htmlescape(name), '->', {
DStype: 'window-button-close'
}
], '
', /* DS.util.htmlescape( */ comment /* ) */ /* .replace(/\n/g, '
') */ , '
'
]
}).open();
};
var showTheory = function(name, id) {
DS.ARM.getTaskTheory(id, function(d) {
if (d.success) {
DS.create({
DStype: 'window',
reqWidth: 600,
reqNative: true,
items: [
[
'title', 'Введение к заданию ' + DS.util.htmlescape(name), '->', {
DStype: 'window-button-close'
}
], '', /* DS.util.htmlescape( */ d.data.text /* ) */ /* .replace(/\n/g, '
') */ , '
'
]
}).open();
}
});
};
var _saveInterval = null;
var endTask = function(cb, skipSave) {
if (_saveInterval) {
clearInterval(_saveInterval);
}
if (!_taskData) {
cb && cb();
return;
}
DS.progressWindow('Сохранение...');
DS.page.topMenu.removeButton(btnExportTask);
btnExportTask = null;
DS.page.topMenu.removeButton(btnCloseTask);
btnCloseTask = null;
delete DS.page.endTask;
fnFinishTools(function() {
var fn = function() {
DS.progressWindow();
DS.css(elTaskScreen, 'display', 'none');
_taskData = null;
loadTasks();
cb && cb();
};
if (skipSave) {
fn();
} else {
DS.ARM.saveTask(_taskData, fn);
}
});
};
var showTask = function(idTask) {
DS.progressWindow('Загрузка задачи');
elTaskProcessUnsaved.style.display = 'none';
DS.ARM.getTask(idTask, function(d) {
// DS.progressWindow();
if (d.success && !_taskData) {
var task = d.data;
_taskData = task;
var fn = function() {
elTaskProcessName.innerText = DS.page.getTaskField('name');
elTaskProcessSubject.innerText = _listSubjects[DS.page.getTaskField('subject_id')] || 'н/д';
elTaskProcessTeacher.innerText = DS.page.getTaskField('teacher_name') + ' ' + DS.page.getTaskField('teacher_patronymic') + ' ' + DS.page.getTaskField('teacher_surname').substr(0, 1) + '.';
var i = 0;
var loadNext = function() {
if (i < task.tools.length) {
var idTool = task.tools[i].id;
var toolStatus = task.tools[i].status;
++i;
fnInitTaskTool(idTool, toolStatus, loadNext);
} else {
DS.progressWindow();
/* _saveInterval = setInterval(function(){
if(elTaskProcessUnsaved.style.display == ''){
DS.page.taskSave();
}
}, 60000); */
}
};
loadNext();
/* for(var i = 0, l = task.tools.length; i < l; ++i){
fnInitTaskTool(task.tools[i].id);
} */
DS.css(elTaskScreen, 'display', '');
btnCloseTask = DS.page.topMenu.addButton('Закрыть задачу');
DS.css(btnCloseTask, 'float', 'right');
DS.addEvent(btnCloseTask, 'click', function() {
endTask();
});
btnExportTask = DS.page.topMenu.addButton('Экспорт');
DS.css(btnExportTask, 'float', 'right');
DS.addEvent(btnExportTask, 'click', function() {
DS.ARM.getTaskFiles(idTask, function(d) {
if (d.success) {
var export_ = {
'task': {
'algo2': _taskData.algo2,
'graph_svg': _taskData.graph_svg,
'algo_text': _taskData.algo_text,
'algo_graph': _taskData.algo_graph,
'method_description': _taskData.method_description
},
'code': DS.JSON.encode(d.data)
};
download(DS.JSON.encode(export_), DS.page.getTaskField('name') + '_export.json', '', false);
}
});
});
DS.page.endTask = endTask;
};
var key = 'task_' + DS.page.getTaskField('id');
var savedData = localStorage.getItem(key);
if (savedData && (savedData = DS.JSON.decode(savedData))) {
var str = '';
if (savedData.__lastSaved) {
if (savedData.__lastSaved < _taskData.__lastSaved) {
fn();
return;
}
str = ' за ' + (new Date(savedData.__lastSaved * 1000)).toLocaleFormat('%d.%m.%Y %H:%M') + '';
}
DS.confirm('Обнаружен факт некорректного завершения предыдущей работы. Желаете загрузить восстановленные данные' + str + '?', function() {
for (var i in savedData) {
if (savedData[i] && ((i == 'algo_graph') ? (savedData[i].length > 261) : (savedData[i].length > 0)) && i != 'tools') {
DS.page.setTaskField(i, savedData[i]);
}
}
// _taskData = DS.util.merge(_taskData, savedData);
fn();
}, function() {
fn();
});
} else {
fn();
}
}
});
};
var showTaskReport = function(idTask) {
DS.ARM.getTaskReport(idTask, function(d) {
if (d.success) {
var DOMURL = window.URL || window.webkitURL || window;
if (!d.data.report_pdf) {
DS.msg('Отчета нет', 'red');
return;
}
var pdf = new Blob([DS.base64.decode(d.data.report_pdf, true)], {
type: 'application/pdf'
});
var reportUrl = DOMURL.createObjectURL(pdf);
// window.open('js/pdf.js/web/viewer.html?file='+reportUrl);
//
DS.page.showPdf(reportUrl, 'Отчет');
//DS.create({
// DStype: 'window'
// ,destroyOnClose: true
// // ,width: parseInt(document.documentElement.clientWidth * 0.8)+'px'
// // ,height: parseInt(document.documentElement.clientHeight * 0.8)+'px'
// ,listeners: {
// close: function(){
// DOMURL.revokeObjectURL(reportUrl);
// }
// }
// ,items: [
// [
// 'title'
// ,'Отчет'
// ,'->'
// ,{
// DStype: 'window-button-close'
// }
// ]
// ,''
// ]
//}).open();
}
});
};
var runTrainer = function(idGroup) {
DS.ARM.getTestsList(idGroup, function(d) {
if (d.success && d.data.length) {
var row = d.data[parseInt(Math.random() * 142156) % d.data.length];
DS.page.pushModule('test', {
testId: row.id
});
}
});
// DS.page.pushModule('test', {timeLimit: 60, testId: 2})
};
var showFile = function(idFile) {
DS.page.pushModule('lecture-recorded', idFile);
//$videoPlayer
/* DS.ARM.getAttachmentInfo(idFile, function(d){
if(d.success){
idPlayingAttachment = idFile;
DS.ARM.syncLecture(idStream, [{a: 'open', id: idPlayingAttachment}], null, function(d){});
$videoPlayer.setSrc([{url:d.data.url, ctype: 'video/webm; codecs="vp8, opus"', pri: 0}]);
$videoPlayer.play();
$videoPlayer.SetTime(0);
}
}); */
};
var renderTaskList = async function() {
localStorage.removeItem('IMPORT');
localStorage.removeItem('IMPORT_ENTER');
elPanelLeftBottom.innerHTML = '';
localStorage.setItem('TASK_LIST', DS.JSON.encode(_listTasks));
if (_selectedListRenderer) {
switch (_selectedListRenderer) {
case 'trainers':
DS.ARM.getTestsGroupList(function(d) {
if (d.success) {
var grp = document.createElement('div');
grp.className = 'task_group';
for (var i = 0, l = d.data.length; i < l; ++i) {
var row = d.data[i];
var div = document.createElement('div');
div.className = 'task_item';
var tmp = document.createElement('div');
tmp.className = 'task_item_name';
tmp.innerHTML = DS.util.htmlescape(row.name);
div.appendChild(tmp);
tmp = document.createElement('div');
tmp.style.cssText = 'clear: both;';
div.appendChild(tmp);
DS.addEvent(div, 'click', (function(idGroup) {
return (function() {
runTrainer(idGroup);
});
})(row.id));
grp.appendChild(div);
}
elPanelLeftBottom.appendChild(grp);
}
});
break;
case 'lectures':
DS.ARM.getListAttachments(function(d) {
if (d.success) {
var grp = document.createElement('div');
grp.className = 'task_group';
for (var i = 0, l = d.data.length; i < l; ++i) {
var row = d.data[i];
var div = document.createElement('div');
div.className = 'task_item';
var tmp = document.createElement('div');
tmp.className = 'task_item_name';
tmp.innerHTML = row.name;
div.appendChild(tmp);
tmp = document.createElement('div');
tmp.style.cssText = 'clear: both;';
div.appendChild(tmp);
if (row.preview_url) {
tmp = document.createElement('img');
tmp.className = 'task_item_preview';
tmp.src = row.preview_url;
div.appendChild(tmp);
}
tmp = document.createElement('div');
tmp.className = 'task_item_description';
tmp.innerHTML = row.description;
div.appendChild(tmp);
DS.addEvent(div, 'click', (function(idFile) {
return (function() {
showFile(idFile);
});
})(row.rowid));
grp.appendChild(div);
}
elPanelLeftBottom.appendChild(grp);
}
});
break;
}
return;
}
var byStatus = {};
for (var i = 0, l = _listTasks.length; i < l; ++i) {
var task = _listTasks[i];
if (task.type == _selectedListType) {
var div = document.createElement('div');
div.className = 'task_item' + (task.status == 4 ? ' scored' : '');
var tmp = document.createElement('div');
tmp.className = 'task_item_name';
tmp.innerHTML = DS.util.htmlescape('id' + task.id + ': ' + task.name);
div.appendChild(tmp);
tmp = document.createElement('div');
tmp.style.cssText = 'clear: both;';
div.appendChild(tmp);
tmp = document.createElement('div');
tmp.className = 'task_item_buttons';
div.appendChild(tmp);
btn = document.createElement('button');
btn.id = 'download_link' + task.id;
btn.innerHTML = 'Скопировать ссылку на решение';
btn.className = '-comment';
btn.style.display = 'none';
tmp.appendChild(btn);
tmp = document.createElement('div');
tmp.style.cssText = 'clear: both;';
tmp.id = 'empty1' + task.id;
tmp.style.display = 'none';
div.appendChild(tmp);
var importFunction = function(text, idTask) {
let import_solution_method = false;
let import_algorithm = false;
let import_block_diagram = false;
let import_source_code = false;
let content = DS.JSON.decode(text);
let task_data = DS.JSON.encode(content.task);
let code_data = content.code;
var openImportFunc = function() {
DS.progressWindow('Загрузка импорта');
elTaskProcessUnsaved.style.display = 'none';
DS.ARM.getTask(idTask, function(d) {
if (d.success && !_taskData) {
let task = d.data;
_taskData = task;
let fn = function() {
elTaskProcessName.innerText = DS.page.getTaskField('name');
elTaskProcessSubject.innerText = _listSubjects[DS.page.getTaskField('subject_id')] || 'н/д';
elTaskProcessTeacher.innerText = DS.page.getTaskField('teacher_name') + ' ' + DS.page.getTaskField('teacher_patronymic') + ' ' + DS.page.getTaskField('teacher_surname').substr(0, 1) + '.';
let i = 0;
let loadNext = function() {
if (i < task.tools.length) {
let idTool = task.tools[i].id;
let toolStatus = task.tools[i].status;
++i;
fnInitTaskTool(idTool, toolStatus, loadNext);
} else {
DS.progressWindow();
}
};
loadNext();
DS.css(elTaskScreen, 'display', '');
btnCloseTask = DS.page.topMenu.addButton('Закрыть задачу');
DS.css(btnCloseTask, 'float', 'right');
DS.addEvent(btnCloseTask, 'click',
function() {
endTask();
});
btnExportTask = DS.page.topMenu.addButton('Экспорт');
DS.css(btnExportTask, 'float', 'right');
DS.addEvent(btnExportTask, 'click', function() {
DS.ARM.getTaskFiles(idTask, function(d) {
if (d.success) {
var export_ = {
'task': {
'algo2': _taskData.algo2,
'graph_svg': _taskData.graph_svg,
'algo_text': _taskData.algo_text,
'algo_graph': _taskData.algo_graph,
'method_description': _taskData.method_description
},
'code': DS.JSON.encode(d.data)
};
download(DS.JSON.encode(export_), DS.page.getTaskField('name') + '_export.json', '', false);
}
});
});
DS.page.endTask = endTask;
DS.ARM.saveTask(_taskData, function(d) {
if (d.success) {
DS.msg('Сохранено', 'green');
} else {
DS.msg('Ошибка сохранения', 'red');
}
});
};
if(import_source_code) {
localStorage.setItem('IMPORT', code_data);
localStorage.setItem('IMPORT_ENTER', true);
}
if (task_data && (task_data = DS.JSON.decode(task_data))) {
for (let i in task_data) {
if (!((i == 'algo2' && import_algorithm) || (i == 'graph_svg' && import_block_diagram) ||
(i == 'algo_text' && import_algorithm) || (i == 'algo_graph' && import_block_diagram) || (i == 'method_description' && import_solution_method))) continue;
if (task_data[i] && ((i == 'algo_graph') ? (task_data[i].length > 261) : (task_data[i].length > 0))) {
DS.page.setTaskField(i, task_data[i]);
}
}
fn();
} else {
fn();
}
}
});
};
DS.create({
DStype: 'window',
destroyOnClose: true,
reqWidth: 400,
height: '282px',
items: [
['title', 'Выберите что импортировать'],
,{
DStype: 'form-panel',
items: [{
DStype: 'list-layout',
items: [{
DStype: 'checkbox',
value: true,
label: 'Метод решения',
name: 'solution_method_checkbox'
},
'
',
{
DStype: 'checkbox',
value: true,
label: 'Алгоритм',
name: 'algorithm_checkbox'
},
'
',
{
DStype: 'checkbox',
value: true,
label: 'Блок схема',
name: 'block_diagram_checkbox'
},
'
',
{
DStype: 'checkbox',
value: true,
label: 'Исходный код',
name: 'source_code_checkbox'
},
'
',
{
DStype: 'button',
label: 'Принять',
listeners: {
click: function() {
var $form = this.getForm();
var data = $form.getFields();
import_solution_method = data.solution_method_checkbox;
import_algorithm = data.algorithm_checkbox;
import_block_diagram = data.block_diagram_checkbox;
import_source_code = data.source_code_checkbox;
this.parent().parent().parent().close();
openImportFunc();
}
}
},
{
DStype: 'button',
label: 'Отмена',
listeners: {
click: function() {
var $form = this.getForm();
var data = $form.getFields();
this.parent().parent().parent().close();
}
}
}]
}]
},
]
}).open();
};
if (task.status == 1 || task.status == 3 || task.status == 5) {
tmp = document.createElement('div');
tmp.className = 'task_item_buttons';
div.appendChild(tmp);
btn = document.createElement('button');
btn.innerHTML = 'Импорт из банка решений';
btn.className = '-comment';
btn.id = 'import_from_bank' + task.id;
btn.style.display = 'none';
tmp.appendChild(btn);
DS.addEvent(btn, 'click', (function(name, idTask) {
return (async function(e) {
e.stopPropagation();
let response = await fetch('https://trivia1.ru/get_all_solutions?task_name=' + encodeURI(name));
if (response.ok) {
let solutions = await response.json();
let items_ = []
for (let _i = 0; _i < solutions.length; _i++) {
items_.push('');
items_.push('' + String(_i) + ' | ');
items_.push('' + solutions[_i].name + ' | ');
items_.push('' + String(solutions[_i].size) + ' | ');
items_.push('');
items_.push({
DStype: 'button',
label: 'Импорт',
listeners: {
click: async function() {
let solutionName = solutions[_i].name;
let taskName = encodeURI(name);
let solution = await fetch('https://trivia1.ru/get_solution?task_name=' + taskName + '&solution_name=' + solutionName);
if (solution.ok) {
let text = await solution.text();
this.parent().close()
importFunction(text, idTask);
}
}
}
});
items_.push(' | ');
items_.push('
');
}
DS.create({
DStype: 'window',
destroyOnClose: true,
reqWidth: 850,
height: '300px',
items: [
[
'title', 'Общий банк решений', '->', {
DStype: 'window-button-close'
}
], '