mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
refactor: update dom after diff deletion better
This commit is contained in:
@@ -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 }));
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user