render: function () { Emitter.trigger('overlay:show'); this.setElement($(this.template(this.model.toJSON()))); this.$el.appendTo('body').center(); return this }
var onProgress = function(evt) { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); Emitter.trigger('progress:update', {percent: percentComplete + '%'}); } };
drop: function(e) { e.stopPropagation(); e.preventDefault(); var self = this; var onProgress = function(evt) { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); Emitter.trigger('progress:update', {percent: percentComplete + '%'}); } }; var files = e.originalEvent.dataTransfer.files; if (files && files.length) { // Only upload one file for now // make sure file is an image var file = files[0]; var formData = new FormData(); formData.append('image', file); var req = $.ajax({ url: '/api/upload', type: 'POST', data: formData, contentType: false, processData: false, xhr: function() { var xhr = $.ajaxSettings.xhr(); // add progress event xhr.addEventListener('progress', onProgress, false); // show the progress bar Emitter.trigger('progress:show'); return xhr }, always: function() { Emitter.trigger('progress:hide'); } }); req.done(function(data) { console.log(data); // update the note with the new image url var note = self.model.get('note'); note += "\n![]("+ location + "uploads/" + data.path +")"; self.model.set('note', note); }); req.always(function() { Emitter.trigger('progress:hide'); }); return false } else { Emitter.trigger('error:error', {errors: [{message: 'Please select a file.'}]}); } },
xhr: function() { var xhr = $.ajaxSettings.xhr(); // add progress event xhr.addEventListener('progress', onProgress, false); // show the progress bar Emitter.trigger('progress:show'); return xhr },
destroy: function() { this.trigger('destroy'); this.undelegateEvents(); this.unbind(); this.$el.removeData().unbind(); this.remove(); Emitter.trigger('overlay:hide'); console.log('action view destroyed.'); },
updateOrder: function (e) { e.stopImmediatePropagation(); // how to get the new parent_id var parentLi = this.$el.parents(".node:first"), cid = parentLi.data('cid') || null, that = this; // how to sort // 1. get the model just before this one // 2. get the model just after this one // 3. generate a random date between the two // 4. save the date. var index = lists.indexOf(this.model), prevNodeEl = this.$el.prev('li.node'), nextNodeEl = this.$el.next('li.node'), prevNode = lists.get(prevNodeEl.data('cid')), // change this to use events nextNode = lists.get(nextNodeEl.data('cid')), order_date = null; if (prevNode && nextNode) { var prevNodeDate = new Date(prevNode.get('order_date')); var nextNodeDate = new Date(nextNode.get('order_date')); //order_date = randomDate(prevNodeDate, nextNodeDate); } else if (!prevNode && nextNode) { console.log('it has no prev node'); var nextNodeDate = new Date(nextNode.get('order_date')); var prevNodeDate = new Date(nextNodeDate.getTime()); moment(prevNodeDate).subtract('ms', 2); } else if (!nextNode && prevNode){ console.log('it has no next node'); var prevNodeDate = new Date(prevNode.get('order_date')); var nextNodeDate = new Date(prevNodeDate.getTime()); moment(nextNodeDate).add('ms', 2); } order_date = randomDate(prevNodeDate, nextNodeDate); console.log(prevNodeDate.getTime()) console.log(order_date.getTime()) console.log(nextNodeDate.getTime()) if (cid) { Emitter.trigger('collection:lists:get', {cid: cid}, function (model) { that.model.set({parent_id: model.get('_id'), order_date: order_date}); }); } else { that.model.set({parent_id: null, order_date: order_date}); } },
decideLink: function(e) { e.stopImmediatePropagation() var href = $(e.currentTarget).attr('href'); if (href && href.indexOf('search') !== 0) { var tag = href .replace('/search/', "") .replace('%23', "#"); // should search the document Emitter.trigger('search:search', tag); } return false }
$('body').ajaxError(function(e, xhr, settings, exception) { var vent = {}; try { // erorr is json vent.errors = JSON.parse(xhr.responseText).errors; } catch (e) { // error is just a text, just display it vent.errors = [{message: xhr.responseText}]; } if (xhr.status > 399) { console.log(vent) Emitter.trigger('error:ajax', vent); } });
create: function(e) { e.stopImmediatePropagation(); var titleInput = this.$('>.edit-input'); var create = function(model) { var list = new List({ parent_id: model.get('_id') || model.get('id'), }); return list }; // if key is backspace and title is empty // delete it if (e.keyCode === 8 && !titleInput.val()) { // move the focus to the one before it var prev = this.$el.prev('.node').find('>.title'); if (!prev.length) { var prev = this.$el.parents('.node:first').find('>.title'); } prev.trigger('click'); this.model.destroy(); return false }; switch (e.keyCode) { // enter case 13: // update this model then create a new one and focus on it this.model.set('title', this.$('>.edit-input').val()); if (this.model.get('state') === 'open') { // just create a new node var list = new List({ parent_id: this.model.get('_id') }); var after = null; } else if (this.model.get('state') === 'collapsed') { var parent_id = this.model.get('parent_id') || null; var list = new List({ parent_id: parent_id }); var after = this.$el; }; // save the model list.save(list.toJSON(), {wait:true}) // emit event to add the model to the collection Emitter.trigger('collection:lists:add', {model: list, insertAfter: after}); break; // Top arrow key case 38: // find sibling if sibgling, use else find parent var prevNode = this.$el.prev('.node'); if (prevNode.length) { this.$el.prev('.node').find('>.title').trigger('click'); } else { this.$el.parents('.node:first').find('>.title').trigger('click'); } break; // Bottom arrow key case 40: var nextNode = this.$el.next('.node'); if (nextNode.length) { this.$el.next('.node').find('>.title').trigger('click'); } else { this.$('>.children >.node:first').find('>.title').trigger('click'); } } },
req.always(function() { Emitter.trigger('progress:hide'); });
always: function() { Emitter.trigger('progress:hide'); }