CommentsView.prototype.oncancelremove = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a.cancel-remove'); var comment = closest(target, 'li[data-id]'); classes(comment).remove('remove'); };
CommentsRepliesView.prototype.onconfirmremove = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a.cancel-remove'); var replyEl = closest(target, 'li[data-id]'); var id = replyEl.getAttribute('data-id'); var view = this; request .del('/api/comment/:commentId/reply/:replyId'.replace(':commentId', this.comment.id).replace(':replyId', id)) .end(function(err, res) { if (err) return log('Fetch error: %s', err); if (!res.ok) err = res.error, log('Fetch error: %s', err); if (res.body && res.body.error) err = res.body.error, log('Fetch response error: %s', err); classes(replyEl).remove('remove'); var messageEl = o('.onreply.message', replyEl); messageEl.style.display = 'block'; if (err) { return messageEl.innerHTML = err; } else { log('successfull reply removed %s', id); messageEl.innerHTML = t('The argument was removed'); setTimeout(function () { replyEl.remove(); }, 1000); view.emit('remove', { commentId: view.comment.id, replyId: id }); } }); };
CommentsView.prototype.ondislike = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a'); var comment = closest(target,'li[data-id]'); var id = comment.getAttribute('data-id'); var liked = classes(o('a.like', comment)).has('selected'); var disliked = classes(o('a.dislike', comment)).has('selected'); classes(target).add('selected'); classes(o('a.like', comment)).remove('selected'); var counter = o('.comment-counter', comment); var count = parseInt(counter.innerHTML, 10) || 0; count -= liked ? 2 : (disliked ? 0 : 1); counter.innerHTML = count; request .post('/api/comment/:id/downvote'.replace(':id', id)) .end(function(err, res) { if (err) return log('Fetch error: %s', err), classes(target).remove('selected'); if (!res.ok) return log('Fetch error: %s', res.error), classes(target).remove('selected'); if (res.body && res.body.error) return log('Fetch response error: %s', res.body.error), classes(target).remove('selected'); log('successfull downvote %s', id); }); }
CommentsFilter.prototype.onsortclick = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a'); var li = closest(target, 'li'); var sort = li.getAttribute('data-sort'); this.set(sort); }
CommentsView.prototype.onremove = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a'); var comment = closest(target, 'li[data-id]'); classes(comment).add('remove'); var btnEdit = o('.btn-edit', comment); classes(btnEdit).remove('hide'); var mediaBody = o('.media-body', comment); classes(mediaBody).remove('edit'); };
CommentsView.prototype.onshowspam = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a'); var comment = closest(target,'li[data-id]'); var id = comment.getAttribute('data-id'); var flagged = classes(target).has('selected'); flagged ? target.title=t('Spam') : target.title=t('Not spam'); classes(comment).remove('spam'); }
on(document.body, '.data-table-cell-editor-action .okButton', 'click', function(e) { var editContainer = parents(e.target, '.data-table-cell-editor') var editor = dom(editContainer).select('.data-table-cell-editor-editor') var updated = editor.val() var tr = parents(editContainer, 'tr') var td = parents(editContainer, 'td') var key = dom(tr).attr('data-key') var column = dom(td).attr('data-header') var row = state.rows[key] row[column] = updated closeCellEdit(editContainer) post(row, function(err) { if (err) notify(err.message) }) })
return function (e) { e.delegateTarget = closest(e.target, selector, true); if (e.delegateTarget) { callback.call(element, e); } }
on(document.body, '.uploadBlob', 'change', function(e) { e.preventDefault() var files = Array.prototype.slice.call(e.target.files) var first = files[0] var container = parents(e.target, '.inspectContainer') var key = dom(container).attr('data-key') var row = state.rows[key] var uploaderEl = dom('.blobUploader') uploaderEl.html('<progress max="100" value="0"></progress>') var progressBar = uploaderEl.select('progress') var uri = state.remote + '/api/' + row.key + '/' + first.name + '?version=' + row.version var req = xhr({uri: uri, method: "POST", timeout: 0, body: first, cors: true, onUploadProgress: onProgress}, function(err, resp, body) { if (err) notify(err) var updated = JSON.parse(body) state.rows[updated.key] = updated showInspector(updated) }) function onProgress(e) { if (e.lengthComputable) { var progress = ((e.loaded / e.total) * 100) progressBar.attr('value', progress) } } })
CommentsView.prototype.onhidemessage = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, '.message'); target.innerHTML = ''; target.style.display = 'none'; };
on(document.body, '.json-paste-import .okButton', 'click', function(e) { var container = parents(e.target, '.json-paste-import') var textarea = dom(container).select('.data-table-cell-copypaste-editor') var input = textarea.val() if (input.length === 0) return notify('No JSON in input!') try { var rows = input.split(/\r?\n/) var objects = [] rows.map(function(r) { if (r.length > 0) objects.push(JSON.parse(r)) }) } catch(e) { return notify('Could not parse newline separated JSON --- Invalid JSON') } notify('Uploading data...') xhr({uri: state.remote + '/api/bulk?results=true', method: "POST", body: input, cors: true, headers: {"content-type": "application/json"}}, function(err, resp, body) { if (err) return notify(err) var lines = body.split(/\r?\n/) var created = [] var updated = [] var conflicts = [] lines.map(function(r) { if (r.length === 0) return var row = JSON.parse(r) if (row.conflict) conflicts.push(row) else if (row.version === 1) created.push(row) else updated.push(row) }) notify("New: " + created.length + ' rows, updated: ' + updated.length + ' rows, conflicts: ' + conflicts.length + ' rows') refreshTable() }) dialog.hide() dialogOverlay.hide() })
ProposalOptions.prototype.vote = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, '[data-proposal]') var id = target.getAttribute('data-proposal'); var self = this; var value; if (classes(target).has('vote-no')) { value = 'negative'; } else if (classes(target).has('vote-yes')) { value = 'positive'; } else if (classes(target).has('vote-abstain')) { value = 'neutral'; } if (this.citizen.id) { log('casting vote %s for %s', value, id); this.post( '/api/law/:id/vote'.replace(':id', id), { value: value }, function (err, res) { if (err || !res.ok) return log('Failed cast %s for %s with error: %j', value, id, err || res.error); bus.emit('vote', id, value); self.emit('vote', value); } ); } else { classes(o('.proposal-options p.text-mute', this.el)).remove('hide'); } }
FilterView.prototype.onsortclick = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, '[data-sort]', true); var sort = target.getAttribute('data-sort'); filter.set('sort', sort); }
on(document.body, '.project-actions .button', 'click', function(e) { var el = e.target if (!dom(el).hasClass('button')) el = parents(el, '.button') var action = dom(el).attr('data-action') render(action + 'Actions', '.menu') position(menu, el, {left: -60, top: 0}) menuOverlay.show() })
on(document.body, '#sign-in-form', 'submit', function(e) { var container = parents(e.target, '.signInContainer') e.preventDefault() var button = dom(container).select('.okButton')[0] var click = document.createEvent('HTMLEvents') click.initEvent('click', true, false) button.dispatchEvent(click) })
FilterView.prototype.onhidevotedclick = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, '[type=checkbox]', true); var checked = !!target.checked; filter.set('hide-voted', checked); }
FilterView.prototype.onstatusclick = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, '[data-status]', true); var status = target.getAttribute('data-status'); filter.set('status', status); }
CommentsView.prototype.newreply = function(reply) { var replyEl = o('li[data-id=' + reply.id + ']', this.el); var commentEl = closest(replyEl, 'li.comment-item'); var replyCounter = o('.reply-counter', commentEl); var counter = replyCounter.innerHTML != '' ? parseInt(replyCounter.innerHTML) : 0; var btnRemove = o('.comment-action.btn-remove', commentEl); classes(btnRemove).add('hide'); counter++; replyCounter.innerHTML = counter; }
CommentsView.prototype.readmore = function(ev) { ev.preventDefault(); var commentContainer = closest(ev.target,'li[data-id]'); var id = commentContainer.getAttribute('data-id'); var comment = get(this.comments, 'id === "%id"'.replace('%id', id)); var commentText = o('.comment-text', commentContainer); commentText.innerHTML = new Paragraphs(comment.text).split(); }
Section.prototype.readmore = function(ev) { ev.preventDefault(); var commentContainer = closest(ev.target,'li[data-comment-id]'); var id = commentContainer.getAttribute('data-comment-id'); var comment = get(this.comments, 'id === "%id"'.replace('%id', id)); var commentText = o('p.comment', commentContainer); commentText.html(comment.text); }
document.addEventListener('click', function (ev) { if (open) { open.classList.remove('open'); open = undefined; } var cell = closest(ev.target, 'th, td', true); if (!cell) return; cell.classList.add('open'); open = cell; });
Controller.prototype._getTargetUser = function(event) { var target = event.target; if (!target) { return false; } var userEl = closest(target, '.' + COMMON.USER_CLASS, false); return userEl; };
return function(e) { var delegateTarget = closest(e.target, selector, true); if (delegateTarget) { Object.defineProperty(e, 'target', { value: delegateTarget }); callback.call(element, e); } }
CommentsView.prototype.ondislike = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a'); var commentEl = closest(target,'li[data-id]'); var id = commentEl.getAttribute('data-id'); var comment = get(this.comments, 'id === "%id"'.replace('%id', id)); if (!comment) { comment = get(this.myArguments, 'id === "%id"'.replace('%id', id)); } var liked = classes(o('a.like', commentEl)).has('selected'); var disliked = classes(o('a.dislike', commentEl)).has('selected'); var error = o('.error', commentEl); if (comment.author.id == citizen.id) { return error.innerHTML = t('You\'re not allowed to vote your own argument'); } else if (!citizen.id) { return error.innerHTML = t('comments.sign-in-required-to-vote-comments'); } else { error.innerHTML = ''; } classes(target).add('selected'); classes(o('a.like', commentEl)).remove('selected'); var counter = o('.comment-counter', commentEl); var count = parseInt(counter.innerHTML, 10) || 0; count -= liked ? 2 : (disliked ? 0 : 1); counter.innerHTML = count; request .post('/api/comment/:id/downvote'.replace(':id', id)) .end(function(err, res) { if (err) return log('Fetch error: %s', err), classes(target).remove('selected'); if (res.status == 401) return error.innerHTML = t(res.body.error); if (!res.ok) return log('Fetch error: %s', res.error), classes(target).remove('selected'); if (res.body && res.body.error) return log('Fetch response error: %s', res.body.error), classes(target).remove('selected'); log('successfull downvote %s', id); }); }
CommentsView.prototype.onflag = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a'); var commentEl = closest(target,'li[data-id]'); var id = commentEl.getAttribute('data-id'); var comment = get(this.comments, 'id === "%id"'.replace('%id', id)); var flagged = classes(target).has('selected'); var alreadyFlagged = classes(commentEl).has('spam'); classes(target).toggle('selected'); flagged ? target.title=t('Spam') : target.title=t('Not spam'); var flags = comment.flags.length + (flagged ? -1 : 1); if (config['spam limit']) { var spam = flags > config['spam limit']; } else { var spam = flags > (comment.upvotes.length - comment.downvotes.length) } spam ? classes(commentEl).add('spam') : classes(commentEl).remove('spam'); request .post('/api/comment/:id/:action'.replace(':id', id).replace(':action', flagged ? 'unflag' : 'flag')) .end(function(err, res) { if (err) return handleError(err); if (!res.ok) return handleError(res.error); if (res.body && res.body.error) return handleError(res.body.error); log('successfull %s as spam %s', flagged ? 'unflag' : 'flag', id); var count = o('.count', target); var innerCount = count.innerHTML != '' ? parseInt(count.innerHTML) : 0; innerCount += (flagged ? -1 : 1) count.innerHTML = innerCount ? innerCount : ''; function handleError(error) { log('Fetch response error: %s', error) if (alreadyFlagged) classes(commentEl).remove('spam'); return classes(target).remove('selected'); } }); }
const keyDownListener = on(el, 'keydown', keyPressed(13, { ctrlKey: true }, event => { event.preventDefault() const submitEvent = new window.Event('submit', { bubbles: true, cancelable: true }) const form = closest(el, 'form') const submitter = form.querySelector('button[type="submit"], input[type="submit"]') if (submitter) { submitter.click() } else { form.dispatchEvent(submitEvent) } }))
CommentsView.prototype.readmore = function(ev) { ev.preventDefault(); var commentContainer = closest(ev.target,'li[data-id]'); var id = commentContainer.getAttribute('data-id'); var comment = get(this.comments, 'id === "%id"'.replace('%id', id)); if (!comment) { comment = get(this.myArguments, 'id === "%id"'.replace('%id', id)); } var commentText = o('.comment-text', commentContainer); commentText.innerHTML = markdown(comment.text); }
on(document.body, '.signInContainer .okButton', 'click', function(e) { var container = parents(e.target, '.signInContainer') var user = dom(container).select('#username-input').val() var pass = dom(container).select('#password-input').val() var headers = {authorization: 'Basic ' + btoa(user + ':' + pass)} xhr({ uri: state.remote + '/api/session', json: true, headers: headers, cors: true }, function (err, resp, json) { if (err) return notify('Login error! ' + err.message) if (json.loggedOut) return notify('Invalid username or password') notify('Logged in') render('controls', '.project-controls', {text: 'Sign out'}) dialog.hide() dialogOverlay.hide() }) })
updateComponentData: function () { var el = this.getDOMNode(), baseContainer = closest(el, 'rs-base-container'), contentContainer = el, baseContainerHeight = baseContainer.clientHeight, contentContainerHeight = contentContainer.clientHeight, // == onePercent = contentContainerHeight / 100, realPercent = (baseContainerHeight / onePercent) * 0.01, // == verticalToddleHeight = Math.ceil(realPercent * baseContainerHeight); ScrollActions.changeVerticalToggleHeight(verticalToddleHeight, realPercent); },
CommentsView.prototype.onreplyclick = function(ev) { ev.preventDefault(); var target = ev.delegateTarget || closest(ev.target, 'a'); var commentEl = closest(target,'li[data-id]'); var id = commentEl.getAttribute('data-id'); var comment = get(this.comments, 'id === "%id"'.replace('%id', id)); if (!comment) { comment = get(this.myArguments, 'id === "%id"'.replace('%id', id)); } var repliesContainer = o('.replies-container', commentEl); if (repliesContainer.firstChild) { empty(repliesContainer); classes(target).remove('no-hide') } else { var commentsRepliesView = new CommentsRepliesView(comment); classes(target).add('no-hide') commentsRepliesView.render(repliesContainer); commentsRepliesView.on('post', this.newreply.bind(this)) commentsRepliesView.on('remove', this.removereply.bind(this)) } }