mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-21 15:03:12 +01:00
fix: allow non-mods to crosspost, move crosspost button out of topic tools, in-modal state updates
This commit is contained in:
@@ -36,7 +36,6 @@ define('forum/topic/crosspost', [
|
||||
dropdownEl.addClass('dropup');
|
||||
|
||||
categoryFilter.init($('[component="category/dropdown"]'), {
|
||||
privilege: 'moderate',
|
||||
onHidden: onCategoriesSelected,
|
||||
hideAll: true,
|
||||
hideUncategorized: true,
|
||||
@@ -51,7 +50,6 @@ define('forum/topic/crosspost', [
|
||||
|
||||
function onCategoriesSelected(data) {
|
||||
({ selectedCids } = data);
|
||||
console.log('changed? ', data.changed);
|
||||
if (data.changed) {
|
||||
modal.find('#crosspost_thread_commit').prop('disabled', false);
|
||||
}
|
||||
@@ -107,12 +105,42 @@ define('forum/topic/crosspost', [
|
||||
|
||||
Promise.all(queries).then(async () => {
|
||||
const statsEl = components.get('topic/stats');
|
||||
updateSpinner('progress');
|
||||
const { crossposts } = await api.get(`/topics/${data.tid}/crossposts`);
|
||||
ajaxify.data.crossposts = crossposts;
|
||||
const html = await app.parseAndTranslate('partials/topic/stats', ajaxify.data);
|
||||
statsEl.html(html);
|
||||
closeCrosspostModal();
|
||||
}).catch(alerts.error);
|
||||
updateSpinner('success');
|
||||
}).catch((e) => {
|
||||
updateSpinner('error');
|
||||
alerts.error(e);
|
||||
});
|
||||
}
|
||||
|
||||
const spinnerClasses = new Map(Object.entries({
|
||||
'initial': ['d-none'],
|
||||
'progress': ['fa-spinner', 'text-secondary', 'fa-spin'],
|
||||
'error': ['fa-times', 'text-error'],
|
||||
'success': ['fa-check', 'text-success'],
|
||||
}));
|
||||
function updateSpinner(state) {
|
||||
if (modal) {
|
||||
const spinnerEl = document.getElementById('crosspost_topic_spinner');
|
||||
const remove = [
|
||||
...spinnerClasses.get('initial'),
|
||||
...spinnerClasses.get('progress'),
|
||||
...spinnerClasses.get('error'),
|
||||
...spinnerClasses.get('success'),
|
||||
];
|
||||
spinnerEl.classList.remove(...remove);
|
||||
spinnerEl.classList.add(...spinnerClasses.get(state));
|
||||
|
||||
if (state !== 'initial') {
|
||||
setTimeout(() => {
|
||||
updateSpinner('initial');
|
||||
}, 2500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function closeCrosspostModal() {
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
<!-- IMPORT partials/category/filter-dropdown-right.tpl -->
|
||||
</div>
|
||||
<div class="card-footer text-end">
|
||||
<i class="fa me-2" id="crosspost_topic_spinner"></i>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" id="crosspost_topic_cancel">[[global:buttons.close]]</button>
|
||||
<button type="button" class="btn btn-sm btn-primary" id="crosspost_thread_commit" disabled>[[topic:confirm-crosspost]]</button>
|
||||
</div>
|
||||
|
||||
@@ -21,10 +21,6 @@
|
||||
</li>
|
||||
{{{ end }}}
|
||||
|
||||
<li>
|
||||
<a component="topic/crosspost" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem"><i class="fa fa-fw fa-clone text-secondary"></i> [[topic:thread-tools.crosspost]]</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a component="topic/merge" href="#" class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem"><i class="fa fa-fw fa-code-fork text-secondary"></i> [[topic:thread-tools.merge]]</a>
|
||||
</li>
|
||||
|
||||
Reference in New Issue
Block a user