mirror of
https://github.com/discourse/discourse.git
synced 2025-06-19 22:23:04 +08:00

* DEV: Fix the function prototype observers deprecation DEPRECATION: Function prototype extensions have been deprecated, please migrate from function(){}.observes('foo') to observer('foo', function() {}). [deprecation id: function-prototype-extensions.observes] See https://deprecations.emberjs.com/v3.x/#toc_function-prototype-extensions-observes for more details. * DEV: Fix the function prototype event listeners deprecation DEPRECATION: Function prototype extensions have been deprecated, please migrate from function(){}.on('foo') to on('foo', function() {}). [deprecation id: function-prototype-extensions.on] See https://deprecations.emberjs.com/v3.x/#toc_function-prototype-extensions-on for more details. * DEV: Simplify `default as` imports Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
182 lines
5.2 KiB
JavaScript
182 lines
5.2 KiB
JavaScript
import { isEmpty } from "@ember/utils";
|
|
import { alias, equal } from "@ember/object/computed";
|
|
import { next } from "@ember/runloop";
|
|
import { inject } from "@ember/controller";
|
|
import Controller from "@ember/controller";
|
|
import ModalFunctionality from "discourse/mixins/modal-functionality";
|
|
import { movePosts, mergeTopic } from "discourse/models/topic";
|
|
import DiscourseURL from "discourse/lib/url";
|
|
import discourseComputed from "discourse-common/utils/decorators";
|
|
import { extractError } from "discourse/lib/ajax-error";
|
|
|
|
export default Controller.extend(ModalFunctionality, {
|
|
topicName: null,
|
|
saving: false,
|
|
categoryId: null,
|
|
tags: null,
|
|
canAddTags: alias("site.can_create_tag"),
|
|
canTagMessages: alias("site.can_tag_pms"),
|
|
selectedTopicId: null,
|
|
newTopic: equal("selection", "new_topic"),
|
|
existingTopic: equal("selection", "existing_topic"),
|
|
newMessage: equal("selection", "new_message"),
|
|
existingMessage: equal("selection", "existing_message"),
|
|
participants: null,
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
this.saveAttrNames = [
|
|
"newTopic",
|
|
"existingTopic",
|
|
"newMessage",
|
|
"existingMessage"
|
|
];
|
|
|
|
this.moveTypes = [
|
|
"newTopic",
|
|
"existingTopic",
|
|
"newMessage",
|
|
"existingMessage"
|
|
];
|
|
},
|
|
|
|
topicController: inject("topic"),
|
|
selectedPostsCount: alias("topicController.selectedPostsCount"),
|
|
selectedAllPosts: alias("topicController.selectedAllPosts"),
|
|
selectedPosts: alias("topicController.selectedPosts"),
|
|
|
|
@discourseComputed("saving", "selectedTopicId", "topicName")
|
|
buttonDisabled(saving, selectedTopicId, topicName) {
|
|
return saving || (isEmpty(selectedTopicId) && isEmpty(topicName));
|
|
},
|
|
|
|
@discourseComputed(
|
|
"saving",
|
|
"newTopic",
|
|
"existingTopic",
|
|
"newMessage",
|
|
"existingMessage"
|
|
)
|
|
buttonTitle(saving, newTopic, existingTopic, newMessage, existingMessage) {
|
|
if (newTopic) {
|
|
return I18n.t("topic.split_topic.title");
|
|
} else if (existingTopic) {
|
|
return I18n.t("topic.merge_topic.title");
|
|
} else if (newMessage) {
|
|
return I18n.t("topic.move_to_new_message.title");
|
|
} else if (existingMessage) {
|
|
return I18n.t("topic.move_to_existing_message.title");
|
|
} else {
|
|
return I18n.t("saving");
|
|
}
|
|
},
|
|
|
|
onShow() {
|
|
this.setProperties({
|
|
"modal.modalClass": "choose-topic-modal",
|
|
saving: false,
|
|
selection: "new_topic",
|
|
categoryId: null,
|
|
topicName: "",
|
|
tags: null,
|
|
participants: null
|
|
});
|
|
|
|
const isPrivateMessage = this.get("model.isPrivateMessage");
|
|
if (isPrivateMessage) {
|
|
this.set(
|
|
"selection",
|
|
this.canSplitToPM ? "new_message" : "existing_message"
|
|
);
|
|
} else if (!this.canSplitTopic) {
|
|
this.set("selection", "existing_topic");
|
|
next(() => $("#choose-topic-title").focus());
|
|
}
|
|
},
|
|
|
|
@discourseComputed("selectedAllPosts", "selectedPosts", "selectedPosts.[]")
|
|
canSplitTopic(selectedAllPosts, selectedPosts) {
|
|
return (
|
|
!selectedAllPosts &&
|
|
selectedPosts.length > 0 &&
|
|
selectedPosts.sort((a, b) => a.post_number - b.post_number)[0]
|
|
.post_type === this.site.get("post_types.regular")
|
|
);
|
|
},
|
|
|
|
@discourseComputed("canSplitTopic")
|
|
canSplitToPM(canSplitTopic) {
|
|
return canSplitTopic && this.currentUser && this.currentUser.admin;
|
|
},
|
|
|
|
actions: {
|
|
performMove() {
|
|
this.moveTypes.forEach(type => {
|
|
if (this.get(type)) {
|
|
this.send("movePostsTo", type);
|
|
}
|
|
});
|
|
},
|
|
|
|
movePostsTo(type) {
|
|
this.set("saving", true);
|
|
const topicId = this.get("model.id");
|
|
let mergeOptions, moveOptions;
|
|
|
|
if (type === "existingTopic") {
|
|
mergeOptions = { destination_topic_id: this.selectedTopicId };
|
|
moveOptions = Object.assign(
|
|
{ post_ids: this.get("topicController.selectedPostIds") },
|
|
mergeOptions
|
|
);
|
|
} else if (type === "existingMessage") {
|
|
mergeOptions = {
|
|
destination_topic_id: this.selectedTopicId,
|
|
participants: this.participants,
|
|
archetype: "private_message"
|
|
};
|
|
moveOptions = Object.assign(
|
|
{ post_ids: this.get("topicController.selectedPostIds") },
|
|
mergeOptions
|
|
);
|
|
} else if (type === "newTopic") {
|
|
mergeOptions = {};
|
|
moveOptions = {
|
|
title: this.topicName,
|
|
post_ids: this.get("topicController.selectedPostIds"),
|
|
category_id: this.categoryId,
|
|
tags: this.tags
|
|
};
|
|
} else {
|
|
mergeOptions = {};
|
|
moveOptions = {
|
|
title: this.topicName,
|
|
post_ids: this.get("topicController.selectedPostIds"),
|
|
tags: this.tags,
|
|
archetype: "private_message"
|
|
};
|
|
}
|
|
|
|
const promise = this.get("topicController.selectedAllPosts")
|
|
? mergeTopic(topicId, mergeOptions)
|
|
: movePosts(topicId, moveOptions);
|
|
|
|
promise
|
|
.then(result => {
|
|
this.send("closeModal");
|
|
this.topicController.send("toggleMultiSelect");
|
|
DiscourseURL.routeTo(result.url);
|
|
})
|
|
.catch(xhr => {
|
|
this.flash(extractError(xhr, I18n.t("topic.move_to.error")));
|
|
})
|
|
.finally(() => {
|
|
this.set("saving", false);
|
|
});
|
|
|
|
return false;
|
|
}
|
|
}
|
|
});
|