diff --git a/public/src/client/topic/fork.js b/public/src/client/topic/fork.js index c0e67b6adf..0a70b7e931 100644 --- a/public/src/client/topic/fork.js +++ b/public/src/client/topic/fork.js @@ -1,14 +1,18 @@ 'use strict'; -define('forum/topic/fork', ['components', 'postSelect', 'alerts'], function (components, postSelect, alerts) { +define('forum/topic/fork', [ + 'components', 'postSelect', 'alerts', 'categorySelector', +], function (components, postSelect, alerts, categorySelector) { const Fork = {}; let forkModal; let forkCommit; let fromTid; + let selectedCategory; Fork.init = function () { fromTid = ajaxify.data.tid; + selectedCategory = ajaxify.data.category; $(window).off('action:ajaxify.end', onAjaxifyEnd).on('action:ajaxify.end', onAjaxifyEnd); @@ -16,13 +20,22 @@ define('forum/topic/fork', ['components', 'postSelect', 'alerts'], function (com return; } - app.parseAndTranslate('modals/fork-topic', {}, function (html) { + app.parseAndTranslate('modals/fork-topic', { + selectedCategory: selectedCategory, + }, function (html) { forkModal = html; forkCommit = forkModal.find('#fork_thread_commit'); $('body').append(forkModal); + categorySelector.init(forkModal.find('[component="category-selector"]'), { + onSelect: function (category) { + selectedCategory = category; + }, + privilege: 'moderate', + }); + forkModal.find('#fork_thread_cancel').on('click', closeForkModal); forkModal.find('#fork-title').on('keyup', checkForkButtonEnable); @@ -44,11 +57,15 @@ define('forum/topic/fork', ['components', 'postSelect', 'alerts'], function (com } function createTopicFromPosts() { + if (!selectedCategory) { + return; + } forkCommit.attr('disabled', true); socket.emit('topics.createTopicFromPosts', { title: forkModal.find('#fork-title').val(), pids: postSelect.pids, fromTid: fromTid, + cid: selectedCategory.cid, }, function (err, newTopic) { function fadeOutAndRemove(pid) { components.get('post', 'pid', pid).fadeOut(500, function () { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index b0a4fd3abc..3df9cdc1a2 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -50,7 +50,7 @@ SocketTopics.createTopicFromPosts = async function (socket, data) { throw new Error('[[error:invalid-data]]'); } - const result = await topics.createTopicFromPosts(socket.uid, data.title, data.pids, data.fromTid); + const result = await topics.createTopicFromPosts(socket.uid, data.title, data.pids, data.fromTid, data.cid); await events.log({ type: `topic-fork`, uid: socket.uid, diff --git a/src/topics/fork.js b/src/topics/fork.js index 4693d4afcc..8ab87b9130 100644 --- a/src/topics/fork.js +++ b/src/topics/fork.js @@ -9,7 +9,7 @@ const plugins = require('../plugins'); const meta = require('../meta'); module.exports = function (Topics) { - Topics.createTopicFromPosts = async function (uid, title, pids, fromTid) { + Topics.createTopicFromPosts = async function (uid, title, pids, fromTid, cid) { if (title) { title = title.trim(); } @@ -27,7 +27,9 @@ module.exports = function (Topics) { pids.sort((a, b) => a - b); const mainPid = pids[0]; - const cid = await posts.getCidByPid(mainPid); + if (!cid) { + cid = await posts.getCidByPid(mainPid); + } const [postData, isAdminOrMod] = await Promise.all([ posts.getPostData(mainPid), diff --git a/src/views/modals/fork-topic.tpl b/src/views/modals/fork-topic.tpl index 5fce825aa8..d98a438e05 100644 --- a/src/views/modals/fork-topic.tpl +++ b/src/views/modals/fork-topic.tpl @@ -10,7 +10,13 @@ <label class="form-label" for="fork-title"><strong>[[topic:title]]</strong></label> <input id="fork-title" type="text" class="form-control" placeholder="[[topic:enter-new-topic-title]]"> </div> - <strong><span id="fork-pids"></span></strong> + <div class="mb-3"> + <label class="form-label"><strong>[[category:category]]</strong></label> + <div> + <!-- IMPORT partials/category/selector-dropdown-right.tpl --> + </div> + </div> + <strong id="fork-pids"></strong> </div> <div class="card-footer text-end"> <button class="btn btn-link btn-sm" id="fork_thread_cancel">[[global:buttons.close]]</button>