draft saving in composer -- resolved #1197

v1.18.x
Julian Lam 11 years ago
parent da0793c011
commit 2826381b20

@ -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);

Loading…
Cancel
Save