const getters = { levels: state => state.levels, userlevels: state => state.userlevels }
newlevels: function () {
return this.levels.map(level => {
return this.userlevels.reduce((acc, userlevel) => {
// если честно, меня еще дико смущает, что происходит тут... но автору виднее
if (level.id === userlevel.level) {
acc['favorite'] = userlevel.favorite
acc['complete'] = userlevel.complete
acc['progress'] = userlevel.progress
acc['userlevel_id'] = userlevel.id
} else {
acc['favorite'] = acc.favorite || false
acc['complete'] = userlevel.complete
acc['progress'] = userlevel.progress || 0;
}
return acc;
}, {...level});
});
}
const checkbox2tabMap = {
link5: 'tab1',
link6: 'tab2'
// ... продолжите сами
};
function onCheckboxChange(event) {
const tab = document.getElementById(checkbox2tabMap[event.target.id]);
if(!tab) { return; }
tab.style.display = event.target.checked ? 'block' : 'none';
}
Object.keys(checkbox2tabMap).forEach(
id => document.getElementById(id).addEventListener('change', onCheckboxChange)
);
connection.query('SELECT * FROM menu', (err, result) => {
if(err) {
console.error(err);
return;
}
const index = result.reduce((acc, row) => ({...acc, [row.id]: row}), {});
const menu = [];
for(const row of result) {
if(row.parent_id === 0) {
menu.push(row);
continue;
}
const parent = index[row.parent_id];
if(!parent) {
console.warn(`Undefined parent with id ${row.parent_id}`);
continue;
}
if(!parent.children) {
parent.children = [];
}
parent.children.push(row);
}
console.log(menu);
});
function onLinkClick(event) {
event.preventDefault(); // выключаем стандартный функционал браузера (переход)
const {href} = event.target; // извлекли полный адрес из ссылки (даже для относительных ссылок вернет абсолютный адрес)
const hrefAsInHTML = event.target.getAttribute('href'); // извлекли href таким какой он есть в html
// любая Ваша логика
}
for(const link of document.getElementsByTagName('a')) {
link.addEventListener('click', onLinkClick);
}
file_load.onsubmit = function(){ var file = this.elements.myfile.files[0]; var xhr = new XMLHttpRequest(); xhr.open("POST", "upload", true); xhr.send(file); return false; }
const server = require('http').createServer();
const fs = require('fs');
const nodeStatic = require('node-static');
const file = new nodeStatic.Server('.', {
cache: 0
});
server.listen(3000, () => console.log("сервер запущен"));
server.on('request', (req, res) => {
if (req.url == '/upload') {
req.pipe(
fs.createWriteStream('file2.jpg')
).on('finish', () => res.end('ok'));
return;
}
file.serve(req, res);
});
function setRandomInterval(cb, minDelay, maxDelay, ...args) {
let timeoutID;
(function next() {
const delay = Math.floor(Math.random() * (maxDelay - minDelay) + minDelay);
timeoutID = setTimeout(() => {
cb(...args);
next();
}, delay);
})();
return function cancel() {
clearTimeout(timeoutID);
};
}
// использование:
setRandomInterval(func, 500, 2500); // просто запускаем с интервалом от 0.5с до 2.5с
const cancelInteraval = setRandomInterval(() => {
console.log('it work');
if(Math.random() > 0.7) {
cancelInteraval(); // таймаут можно отменить если вызвать возвращенную функцию
}
}, 200, 500);
setRandomInterval((arg1, arg2, arg3) => {
console.log(arg1, arg2, arg3);
}, 1000, 3000, 'arg1', 'arg2', 'arg3'); // подобно setTimeout и setInterval можно передать аргументы в колбэк