refactor: update dom after diff deletion better

v1.18.x
gasoved 4 years ago committed by Julian Lam
parent eaf9d2e44a
commit a2a7557cc0

@ -1,17 +1,52 @@
'use strict'; 'use strict';
define('forum/topic/diffs', ['api', 'bootbox', 'forum/topic/images'], function (api, bootbox) { define('forum/topic/diffs', ['api', 'bootbox', 'forum/topic/images'], function (api, bootbox) {
var Diffs = {}; const Diffs = {};
const localeStringOpts = { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' };
Diffs.open = function (pid) { Diffs.open = function (pid) {
if (!config.enablePostHistory) { if (!config.enablePostHistory) {
return; return;
} }
openModal(pid); api.get(`/posts/${pid}/diffs`, {}).then((data) => {
parsePostHistory(data).then(($html) => {
const $modal = bootbox.dialog({ title: '[[topic:diffs.title]]', message: $html, size: 'large' });
if (!data.timestamps.length) {
return;
}
const $selectEl = $modal.find('select');
const $revertEl = $modal.find('button[data-action="restore"]');
const $deleteEl = $modal.find('button[data-action="delete"]');
const $postContainer = $modal.find('ul.posts-list');
const $numberOfDiffCon = $modal.find('.number-of-diffs strong');
$selectEl.on('change', function () {
Diffs.load(pid, this.value, $postContainer);
$revertEl.prop('disabled', data.timestamps.indexOf(this.value) === 0);
$deleteEl.prop('disabled', data.timestamps.indexOf(this.value) === 0);
});
$revertEl.on('click', function () {
Diffs.restore(pid, $selectEl.val(), $modal);
});
$deleteEl.on('click', function () {
Diffs.delete(pid, $selectEl.val(), $selectEl, $numberOfDiffCon);
});
$modal.on('shown.bs.modal', function () {
Diffs.load(pid, $selectEl.val(), $postContainer);
$revertEl.prop('disabled', true);
$deleteEl.prop('disabled', true);
});
});
}).catch(app.alertError);
}; };
Diffs.load = function (pid, since, postContainer) { Diffs.load = function (pid, since, $postContainer) {
if (!config.enablePostHistory) { if (!config.enablePostHistory) {
return; return;
} }
@ -21,37 +56,40 @@ define('forum/topic/diffs', ['api', 'bootbox', 'forum/topic/images'], function (
app.parseAndTranslate('partials/posts_list', 'posts', { app.parseAndTranslate('partials/posts_list', 'posts', {
posts: [data], posts: [data],
}, function (html) { }, function ($html) {
postContainer.empty().append(html); $postContainer.empty().append($html);
}); });
}).catch(app.alertError); }).catch(app.alertError);
}; };
Diffs.restore = function (pid, since, modal) { Diffs.restore = function (pid, since, $modal) {
if (!config.enablePostHistory) { if (!config.enablePostHistory) {
return; return;
} }
api.put(`/posts/${pid}/diffs/${since}`, {}).then(() => { api.put(`/posts/${pid}/diffs/${since}`, {}).then(() => {
modal.modal('hide'); $modal.modal('hide');
app.alertSuccess('[[topic:diffs.post-restored]]'); app.alertSuccess('[[topic:diffs.post-restored]]');
}).catch(app.alertError); }).catch(app.alertError);
}; };
Diffs.delete = function (pid, timestamp, modal) { Diffs.delete = function (pid, timestamp, $selectEl, $numberOfDiffCon) {
api.del(`/posts/${pid}/diffs/${timestamp}`).then(() => { api.del(`/posts/${pid}/diffs/${timestamp}`).then((data) => {
openModal(pid, modal); parsePostHistory(data, 'diffs').then(($html) => {
app.alertSuccess('[[topic:diffs.deleted]]'); $selectEl.empty().append($html);
$selectEl.trigger('change');
const numberOfDiffs = $selectEl.find('option').length;
$numberOfDiffCon.text(numberOfDiffs);
app.alertSuccess('[[topic:diffs.deleted]]');
});
}).catch(app.alertError); }).catch(app.alertError);
}; };
function openModal(pid, modal) { function parsePostHistory(data, blockName) {
var localeStringOpts = { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' }; return new Promise((resolve) => {
const params = [{
api.get(`/posts/${pid}/diffs`, {}).then((data) => {
app.parseAndTranslate('partials/modals/post_history', {
diffs: data.revisions.map(function (revision) { diffs: data.revisions.map(function (revision) {
var timestamp = parseInt(revision.timestamp, 10); const timestamp = parseInt(revision.timestamp, 10);
return { return {
username: revision.username, username: revision.username,
@ -62,48 +100,16 @@ define('forum/topic/diffs', ['api', 'bootbox', 'forum/topic/images'], function (
numDiffs: data.timestamps.length, numDiffs: data.timestamps.length,
editable: data.editable, editable: data.editable,
deletable: data.deletable, deletable: data.deletable,
}, function (html) { }, function ($html) {
const modalExists = !!modal; resolve($html);
if (modalExists) { }];
modal.find('.modal-body').html(html);
} else {
modal = bootbox.dialog({ title: '[[topic:diffs.title]]', message: html, size: 'large' });
}
if (!data.timestamps.length) { if (blockName) {
return; params.unshift(blockName);
} }
var selectEl = modal.find('select'); app.parseAndTranslate('partials/modals/post_history', ...params);
var revertEl = modal.find('button[data-action="restore"]'); });
var deleteEl = modal.find('button[data-action="delete"]');
var postContainer = modal.find('ul.posts-list');
selectEl.on('change', function () {
Diffs.load(pid, this.value, postContainer);
revertEl.prop('disabled', data.timestamps.indexOf(this.value) === 0);
deleteEl.prop('disabled', data.timestamps.indexOf(this.value) === 0);
});
revertEl.on('click', function () {
Diffs.restore(pid, selectEl.val(), modal);
});
deleteEl.on('click', function () {
Diffs.delete(pid, selectEl.val(), modal);
});
modal.on('shown.bs.modal', function () {
Diffs.load(pid, selectEl.val(), postContainer);
revertEl.prop('disabled', true);
deleteEl.prop('disabled', true);
});
if (modalExists) {
modal.trigger('shown.bs.modal');
}
});
}).catch(app.alertError);
} }
return Diffs; return Diffs;

@ -109,5 +109,5 @@ Posts.deleteDiff = async (req, res) => {
await posts.diffs.delete(req.params.pid, req.params.timestamp, req.uid); await posts.diffs.delete(req.params.pid, req.params.timestamp, req.uid);
helpers.formatApiResponse(200, res); helpers.formatApiResponse(200, res, await api.posts.getDiffs(req, { ...req.params }));
}; };

Loading…
Cancel
Save