var dragging = false var playing = [] var rowTemplate = $("#row-template").html() var controlsTemplate = $("#controls-template").html() var pairs = [] function init(){ $.getJSON('/api/list', build) } function build(data){ $("#lists").empty() pairs = data.order.pairs var pair_lists = pairs.reduce((a,b) => { for (var i = 0; i < b.length; i++) { a[i] = a[i] || [] a[i].push(b[i]) } return a }, [[]]) data.list.forEach((dir, i) => { const pair_list = pair_lists[i] var initial_pairs = pair_list.map(fn => { var t = rowTemplate.replace(/{src}/g, fn).replace('{className}', 'row pair') return t }).join('') var files = dir.files.map(f => { var fn = '/data/' + dir.name + '/' + f if (pair_list.indexOf(fn) !== -1) return var t = rowTemplate.replace(/{src}/g, fn).replace('{className}', 'row') return t }).join('') var $el = $("

" + dir.name + "

" + initial_pairs + files + "
") $('#lists').append($el) }) var buttons = [] for (var i = 0, _len = data.list[0].files.length; i < _len; i++) { buttons.push(controlsTemplate.replace('{className}', i < pairs.length ? 'pair' : '' )) } $("#lists").append("

 

" + buttons.join('') + "
") bind() } function bind(){ window.addEventListener('keydown', keydown) $('#save').click(save) $("#lists .sort").sortable({ start: drag_start, stop: drag_stop }) $("#lists").disableSelection() selectAll('audio').forEach((el) => { el.addEventListener('loadedmetadata', () => { // console.log('loaded', el.duration) $(el).next('span').html(el.duration.toFixed(2)) }) el.parentNode.querySelector('.play').addEventListener('click', e => { el.currentTime = 0 el.play() playing = [el] }) }) selectAll('.play-row').forEach((button, i) => { button.addEventListener('click', e => play_row(i)) }) selectAll('.save-pair').forEach((button, i) => { button.addEventListener('click', e => save_pair(i)) }) } function stop(){ playing.forEach(tag => tag.pause()) } function play_row(i) { stop() playing = selectAll('.sort').map(col => { var audio = col.children[i].querySelector('audio') audio.currentTime = 0 audio.play() return audio }) } function save_pair(i){ const pair = selectAll('.sort').map(col => { const el = col.children[i] el.className = 'row pair' col.removeChild(el) $(col).prepend(el) return $(el).data('src') }) var buttons = selectAll('.row-controls div div') buttons[pairs.length].className = 'pair' pairs.unshift(pair) save() } function keydown(e){ // console.log(e.keyCode) const isMeta = (e.metaKey || e.altKey || e.ctrlKey) switch(e.keyCode){ case 32: // space stop() break case 83: // S if (isMeta) { e.preventDefault() save() } break default: break } } function drag_start(){ dragging = true $(this).addClass("dragging") } function drag_stop(){ dragging = false $(".dragging").removeClass("dragging") } function selectAll(q) { return toArray(document.querySelectorAll(q)) } function toArray(a){ return Array.prototype.slice.apply(a) } function save(){ console.log('saving', pairs.length, 'pairs') $.ajax({ type: 'POST', url: '/api/save', contentType: "application/json", dataType: "json", data: JSON.stringify({ date: Date.now(), pairs: pairs, }), }) } init()