md->html
var Vacancies = {
$tpl: elem.content,
$item_changed: 'changed',
$time: 800,
init: function () {
this.getData();
},
// Получаем данные
getData: function () {
$.ajax({
url: 'vacancies_src.md',
success: function (res) {
this.parseData(res);
}.bind(this)
});
},
// Обрабатываем данные
parseData: function (data) {
var items = data.split('<!-- cut -->'),
arr = [];
for (var i = 0; i < items.length; i++) {
var tpl = this.$tpl.cloneNode(true);
tpl.querySelector('input').value = /^##\s(.+)/gm.exec(items[i])[1];
tpl.querySelector('textarea').value = /^##\s(.+)([\s\S]+)$/gm.exec(items[i])[2].replace(/^###/gm, '#').replace(/^\s/g, '');
arr.push(tpl)
}
this.renderData(arr);
},
// Отображаем данные
renderData: function (arr) {
var wrapper = document.createElement('ul');
wrapper.className = 'list';
for (var i = 0; i < arr.length; i++) {
wrapper.appendChild(arr[i]);
}
Sortable.create(wrapper, {
handle: ".item__drag",
onSort: function () {
Vacancies.stringifyData();
}
});
document.querySelector('.vacancies-tool').appendChild(wrapper);
},
// Готовим к отправке на сервер
stringifyData: function (el) {
var _this = this;
window.removeEventListener('beforeunload', this.beforeUnload);
if (el) {
var cb = function () {
el.closest('.item').classList.add('saved');
setTimeout(function () {
el.closest('.item').classList.remove('saved')
}, _this.$time);
};
}
var items = document.querySelectorAll('.list .item'),
content = '',
layout = '';
for (var i = 0; i < items.length; i++) {
var title = items[i].querySelector('input').value,
text = items[i].querySelector('textarea').value.replace(/^\s/g, '');
if (items[i].classList.contains(_this.$item_changed)) {
items[i].classList.remove(_this.$item_changed);
_this.textAreaAdjust().collapse(items[i].querySelector('textarea'));
}
content += title.replace(/^/, '## ') + '\n' + text.replace(/^#\s/gm, '### ') + (i + 1 >= items.length ? '' : '<!-- cut -->');
var tempLayout = '* \n\t' + title.replace(/^/, '## ') + '\n' + text.replace(/^#\s/gm, '### ').replace(/^/gm, '\t') + '\n\tРезюме присылайте на hr@ivi.ru с темой «' + items[i].querySelector('input').value + '».\t';
layout += tempLayout + '\n';
}
this.saveData({
content: content,
layout: layout
}, cb)
},
// Сохраняем на сервере
saveData: function (data, callback) {
$.ajax({
method: "POST",
url: 'vacancies.php',
data: {
data: data.content,
layout: data.layout
},
error: function (err) {
alert('Произошла неизвестная ошибка на сервере.');
console.log(err);
},
success: function (res) {
console.log(res);
if (callback) {
callback();
}
}
})
},
addItem: function () {
var list = document.querySelector('.vacancies-tool .list');
list.insertBefore(this.$tpl, list.childNodes[0]);
list.children[0].querySelector('.item input').focus();
},
removeItem: function (event) {
var result = confirm('Вы уверены?');
if (result) {
event.target.closest('.item').remove();
this.stringifyData();
}
},
// Предупреждаем пользователя, что данные поменялись, но не были сохранены
onDataChange: function (el) {
window.addEventListener("beforeunload", this.beforeUnload);
var $item = el.closest('.item');
if (!$item.classList.contains(this.$item_changed)) {
$item.classList.add(this.$item_changed)
}
},
// Не даём покинуть страницу, если внесены изменения
beforeUnload: function (e) {
var confirmationMessage = "Данные не сохранены. Точно перейти?";
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage;
},
// Работаем с высотой textarea
textAreaAdjust: function (el) {
var _this = this;
var fn = {};
fn.open = function (el) {
el.style.height = (el.scrollHeight) + "px";
};
fn.collapse = function (el) {
if (!el.closest('.item').classList.contains(_this.$item_changed)) {
el.style.height = '';
}
};
return fn;
}
};