From 2826381b20f4af5b4fb3f12fda0cebee4fa9210f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 12 Mar 2014 14:08:55 -0400 Subject: [PATCH] draft saving in composer -- resolved #1197 --- public/src/modules/composer.js | 108 ++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 3 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index c9457aa38a..01538a6275 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -1,7 +1,8 @@ define(['taskbar'], function(taskbar) { var composer = { active: undefined, - posts: {} + posts: {}, + saving: undefined }; function initialise() { @@ -47,8 +48,80 @@ define(['taskbar'], function(taskbar) { return true; } + function alreadyOpen(post) { + // If a composer for the same cid/tid/pid is already open, return the uuid, else return bool false + var type, id; + + if (post.hasOwnProperty('cid')) { + type = 'cid'; + } else if (post.hasOwnProperty('tid')) { + type = 'tid'; + } else if (post.hasOwnProperty('pid')) { + type = 'pid'; + } + + id = post[type]; + + // Find a match + for(uuid in composer.posts) { + if (composer.posts[uuid].hasOwnProperty(type) && id === composer.posts[uuid][type]) { + return uuid; + } + } + + // No matches... + return false; + } + + function canSave() { + // Check for localStorage support + if (composer.saving) { + return composer.saving; + } + + try { + localStorage.setItem('test', 'test'); + localStorage.removeItem('test'); + composer.saving = true; + return true; + } catch(e) { + composer.saving = false; + return false; + } + } + + function getDraft(save_id) { + return localStorage.getItem(save_id); + } + + function saveDraft(post_uuid) { + var postData = composer.posts[post_uuid], + postContainer = $('#cmp-uuid-' + post_uuid), + raw; + + if (canSave() && postData && postData.save_id && postContainer.length) { + raw = postContainer.find('textarea').val(); + if (raw.length) { + localStorage.setItem(postData.save_id, raw); + } else { + removeDraft(postData.save_id); + } + } + } + + function removeDraft(save_id) { + console.log('removing draft'); + return localStorage.removeItem(save_id); + } + function push(post) { - var uuid = utils.generateUUID(); + var uuid = utils.generateUUID(), + existingUUID = alreadyOpen(post); + + if (existingUUID) { + taskbar.updateActive(existingUUID); + return composer.load(existingUUID); + } translator.translate('[[topic:composer.new_topic]]', function(newTopicStr) { taskbar.push('composer', uuid, { @@ -57,6 +130,17 @@ define(['taskbar'], function(taskbar) { }); }); + // Construct a save_id + if (0 !== parseInt(app.uid, 10)) { + if (post.hasOwnProperty('cid')) { + post.save_id = ['composer', app.uid, 'cid', post.cid].join(':'); + } else if (post.hasOwnProperty('tid')) { + post.save_id = ['composer', app.uid, 'tid', post.tid].join(':'); + } else if (post.hasOwnProperty('pid')) { + post.save_id = ['composer', app.uid, 'pid', post.pid].join(':'); + } + } + composer.posts[uuid] = post; composer.posts[uuid].uploadsInProgress = []; @@ -427,6 +511,7 @@ define(['taskbar'], function(taskbar) { titleEl = postContainer.find('.title'), bodyEl = postContainer.find('textarea'), thumbToggleBtnEl = postContainer.find('.topic-thumb-toggle-btn'), + draft = getDraft(postData.save_id) toggleThumbEls = function(){ if (config.allowTopicsThumbnail && composer.posts[post_uuid].isMain) { @@ -459,7 +544,11 @@ define(['taskbar'], function(taskbar) { toggleThumbEls(); } - bodyEl.val(postData.body); + if (draft) { + bodyEl.val(draft); + } else { + bodyEl.val(postData.body); + } thumbToggleBtnEl.on('click', function() { var container = postContainer.find('.topic-thumb-container'); @@ -629,6 +718,17 @@ define(['taskbar'], function(taskbar) { }); }); + // Draft Saving + var saveThrottle; + bodyEl.on('keyup', function() { + if (saveThrottle) { + clearTimeout(saveThrottle); + } + + saveThrottle = setTimeout(function() { + saveDraft(post_uuid); + }, 1000); + }); var resizeActive = false, resizeCenterY = 0, @@ -820,6 +920,7 @@ define(['taskbar'], function(taskbar) { $('.action-bar button').removeAttr('disabled'); if(!err) { composer.discard(post_uuid); + removeDraft(postData.save_id); } } }; @@ -827,6 +928,7 @@ define(['taskbar'], function(taskbar) { composer.discard = function(post_uuid) { if (composer.posts[post_uuid]) { $('#cmp-uuid-' + post_uuid).remove(); + removeDraft(composer.posts[post_uuid].save_id); delete composer.posts[post_uuid]; composer.active = undefined; taskbar.discard('composer', post_uuid);