discourse/app/assets/javascripts/discourse/controllers/history.js.es6

312 lines
8.6 KiB
JavaScript

import ModalFunctionality from "discourse/mixins/modal-functionality";
import { categoryBadgeHTML } from "discourse/helpers/category-link";
import computed from "ember-addons/ember-computed-decorators";
import { propertyGreaterThan, propertyLessThan } from "discourse/lib/computed";
import { on, observes } from "ember-addons/ember-computed-decorators";
import { sanitizeAsync } from "discourse/lib/text";
function customTagArray(fieldName) {
return function() {
var val = this.get(fieldName);
if (!val) {
return val;
}
if (!Array.isArray(val)) {
val = [val];
}
return val;
}.property(fieldName);
}
// This controller handles displaying of history
export default Ember.Controller.extend(ModalFunctionality, {
loading: true,
viewMode: "side_by_side",
@on("init")
_changeViewModeOnMobile() {
if (this.site && this.site.mobileView) {
this.set("viewMode", "inline");
}
},
previousFeaturedLink: Em.computed.alias(
"model.featured_link_changes.previous"
),
currentFeaturedLink: Em.computed.alias("model.featured_link_changes.current"),
previousTagChanges: customTagArray("model.tags_changes.previous"),
currentTagChanges: customTagArray("model.tags_changes.current"),
@computed("previousVersion", "model.current_version", "model.version_count")
revisionsText(previous, current, total) {
return I18n.t(
"post.revisions.controls.comparing_previous_to_current_out_of_total",
{
previous,
current,
total
}
);
},
refresh(postId, postVersion) {
this.set("loading", true);
Discourse.Post.loadRevision(postId, postVersion).then(result => {
this.setProperties({ loading: false, model: result });
});
},
hide(postId, postVersion) {
Discourse.Post.hideRevision(postId, postVersion).then(() =>
this.refresh(postId, postVersion)
);
},
show(postId, postVersion) {
Discourse.Post.showRevision(postId, postVersion).then(() =>
this.refresh(postId, postVersion)
);
},
revert(post, postVersion) {
post
.revertToRevision(postVersion)
.then(result => {
this.refresh(post.get("id"), postVersion);
if (result.topic) {
post.set("topic.slug", result.topic.slug);
post.set("topic.title", result.topic.title);
post.set("topic.fancy_title", result.topic.fancy_title);
}
if (result.category_id) {
post.set(
"topic.category",
Discourse.Category.findById(result.category_id)
);
}
this.send("closeModal");
})
.catch(function(e) {
if (
e.jqXHR.responseJSON &&
e.jqXHR.responseJSON.errors &&
e.jqXHR.responseJSON.errors[0]
) {
bootbox.alert(e.jqXHR.responseJSON.errors[0]);
}
});
},
@computed("model.created_at")
createdAtDate(createdAt) {
return moment(createdAt).format("LLLL");
},
@computed("model.current_version")
previousVersion(current) {
return current - 1;
},
@computed("model.current_revision", "model.previous_revision")
displayGoToPrevious(current, prev) {
return prev && current > prev;
},
displayRevisions: Ember.computed.gt("model.version_count", 2),
displayGoToFirst: propertyGreaterThan(
"model.current_revision",
"model.first_revision"
),
displayGoToNext: propertyLessThan(
"model.current_revision",
"model.next_revision"
),
displayGoToLast: propertyLessThan(
"model.current_revision",
"model.next_revision"
),
hideGoToFirst: Ember.computed.not("displayGoToFirst"),
hideGoToPrevious: Ember.computed.not("displayGoToPrevious"),
hideGoToNext: Ember.computed.not("displayGoToNext"),
hideGoToLast: Ember.computed.not("displayGoToLast"),
loadFirstDisabled: Ember.computed.or("loading", "hideGoToFirst"),
loadPreviousDisabled: Ember.computed.or("loading", "hideGoToPrevious"),
loadNextDisabled: Ember.computed.or("loading", "hideGoToNext"),
loadLastDisabled: Ember.computed.or("loading", "hideGoToLast"),
@computed("model.previous_hidden")
displayShow(prevHidden) {
return prevHidden && this.currentUser && this.currentUser.get("staff");
},
@computed("model.previous_hidden")
displayHide(prevHidden) {
return !prevHidden && this.currentUser && this.currentUser.get("staff");
},
@computed("model.last_revision", "model.current_revision", "model.can_edit")
displayEdit(lastRevision, currentRevision, canEdit) {
return canEdit && lastRevision === currentRevision;
},
@computed("model.wiki")
editButtonLabel(wiki) {
return `post.revisions.controls.${wiki ? "edit_wiki" : "edit_post"}`;
},
@computed()
displayRevert() {
return this.currentUser && this.currentUser.get("staff");
},
isEitherRevisionHidden: Ember.computed.or(
"model.previous_hidden",
"model.current_hidden"
),
@computed("model.previous_hidden", "model.current_hidden", "displayingInline")
hiddenClasses(prevHidden, currentHidden, displayingInline) {
if (displayingInline) {
return this.get("isEitherRevisionHidden")
? "hidden-revision-either"
: null;
} else {
var result = [];
if (prevHidden) {
result.push("hidden-revision-previous");
}
if (currentHidden) {
result.push("hidden-revision-current");
}
return result.join(" ");
}
},
displayingInline: Em.computed.equal("viewMode", "inline"),
displayingSideBySide: Em.computed.equal("viewMode", "side_by_side"),
displayingSideBySideMarkdown: Em.computed.equal(
"viewMode",
"side_by_side_markdown"
),
@computed("displayingInline")
inlineClass(displayingInline) {
return displayingInline ? "btn-primary" : "";
},
@computed("displayingSideBySide")
sideBySideClass(displayingSideBySide) {
return displayingSideBySide ? "btn-primary" : "";
},
@computed("displayingSideBySideMarkdown")
sideBySideMarkdownClass(displayingSideBySideMarkdown) {
return displayingSideBySideMarkdown ? "btn-primary" : "";
},
@computed("model.category_id_changes")
previousCategory(changes) {
if (changes) {
var category = Discourse.Category.findById(changes["previous"]);
return categoryBadgeHTML(category, { allowUncategorized: true });
}
},
@computed("model.category_id_changes")
currentCategory(changes) {
if (changes) {
var category = Discourse.Category.findById(changes["current"]);
return categoryBadgeHTML(category, { allowUncategorized: true });
}
},
@computed("model.wiki_changes")
wikiDisabled(changes) {
return changes && !changes["current"];
},
@computed("model.post_type_changes")
postTypeDisabled(changes) {
return (
changes &&
changes["current"] !== this.site.get("post_types.moderator_action")
);
},
@computed("viewMode", "model.title_changes")
titleDiff(viewMode) {
if (viewMode === "side_by_side_markdown") {
viewMode = "side_by_side";
}
return this.get("model.title_changes." + viewMode);
},
@observes("viewMode", "model.body_changes")
bodyDiffChanged() {
const viewMode = this.get("viewMode");
const html = this.get(`model.body_changes.${viewMode}`);
if (viewMode === "side_by_side_markdown") {
this.set("bodyDiff", html);
} else {
const opts = {
features: { editHistory: true },
whiteListed: {
editHistory: { custom: (tag, attr) => attr === "class" }
}
};
return sanitizeAsync(html, opts).then(result =>
this.set("bodyDiff", result)
);
}
},
actions: {
loadFirstVersion() {
this.refresh(this.get("model.post_id"), this.get("model.first_revision"));
},
loadPreviousVersion() {
this.refresh(
this.get("model.post_id"),
this.get("model.previous_revision")
);
},
loadNextVersion() {
this.refresh(this.get("model.post_id"), this.get("model.next_revision"));
},
loadLastVersion() {
this.refresh(this.get("model.post_id"), this.get("model.last_revision"));
},
hideVersion() {
this.hide(this.get("model.post_id"), this.get("model.current_revision"));
},
showVersion() {
this.show(this.get("model.post_id"), this.get("model.current_revision"));
},
editPost() {
this.get("topicController").send("editPost", this.get("post"));
this.send("closeModal");
},
revertToVersion() {
this.revert(this.get("post"), this.get("model.current_revision"));
},
displayInline() {
this.set("viewMode", "inline");
},
displaySideBySide() {
this.set("viewMode", "side_by_side");
},
displaySideBySideMarkdown() {
this.set("viewMode", "side_by_side_markdown");
}
}
});