This repository has been archived on 2025-02-26. You can view files and clone it, but cannot push or open issues or pull requests.
szurubooru/client/js/controllers/post_main_controller.js
Eva 7972c34448 client/posts: make discard thumbnail link delete existing custom thumb
I can see the intent, sadly this was always broken in the case where the
post already has a custom thumbnail from initial load, and we don't drag
any new files. It did not actually remove the existing thumbnail.
Before 12c4542bb2482fac89aae9a04b15984a56bb8fb0 it would actually crash,
but this now makes it behave as expected.
Also properly syncs internal state with what's displayed to the user.
2024-03-28 13:18:02 +01:00

289 lines
10 KiB
JavaScript

"use strict";
const router = require("../router.js");
const api = require("../api.js");
const uri = require("../util/uri.js");
const misc = require("../util/misc.js");
const settings = require("../models/settings.js");
const Comment = require("../models/comment.js");
const Post = require("../models/post.js");
const PostList = require("../models/post_list.js");
const PostMainView = require("../views/post_main_view.js");
const BasePostController = require("./base_post_controller.js");
const EmptyView = require("../views/empty_view.js");
class PostMainController extends BasePostController {
constructor(ctx, editMode) {
super(ctx);
let parameters = ctx.parameters;
Promise.all([
Post.get(ctx.parameters.id),
PostList.getAround(
ctx.parameters.id,
parameters ? parameters.query : null
),
]).then(
(responses) => {
const [post, aroundResponse] = responses;
// remove junk from query, but save it into history so that it can
// be still accessed after history navigation / page refresh
if (parameters.query) {
ctx.state.parameters = parameters;
const url = editMode
? uri.formatClientLink(
"post",
ctx.parameters.id,
"edit"
)
: uri.formatClientLink("post", ctx.parameters.id);
router.replace(url, ctx.state, false);
}
this._post = post;
this._view = new PostMainView({
post: post,
editMode: editMode,
prevPostId: aroundResponse.prev
? aroundResponse.prev.id
: null,
nextPostId: aroundResponse.next
? aroundResponse.next.id
: null,
canEditPosts: api.hasPrivilege("posts:edit"),
canDeletePosts: api.hasPrivilege("posts:delete"),
canFeaturePosts: api.hasPrivilege("posts:feature"),
canListComments: api.hasPrivilege("comments:list"),
canCreateComments: api.hasPrivilege("comments:create"),
parameters: parameters,
});
if (this._view.sidebarControl) {
this._view.sidebarControl.addEventListener(
"favorite",
(e) => this._evtFavoritePost(e)
);
this._view.sidebarControl.addEventListener(
"unfavorite",
(e) => this._evtUnfavoritePost(e)
);
this._view.sidebarControl.addEventListener("score", (e) =>
this._evtScorePost(e)
);
this._view.sidebarControl.addEventListener(
"fitModeChange",
(e) => this._evtFitModeChange(e)
);
this._view.sidebarControl.addEventListener("change", (e) =>
this._evtPostChange(e)
);
this._view.sidebarControl.addEventListener("submit", (e) =>
this._evtUpdatePost(e)
);
this._view.sidebarControl.addEventListener(
"feature",
(e) => this._evtFeaturePost(e)
);
this._view.sidebarControl.addEventListener("delete", (e) =>
this._evtDeletePost(e)
);
this._view.sidebarControl.addEventListener("merge", (e) =>
this._evtMergePost(e)
);
}
if (this._view.commentControl) {
this._view.commentControl.addEventListener("change", (e) =>
this._evtCommentChange(e)
);
this._view.commentControl.addEventListener("submit", (e) =>
this._evtCreateComment(e)
);
}
if (this._view.commentListControl) {
this._view.commentListControl.addEventListener(
"submit",
(e) => this._evtUpdateComment(e)
);
this._view.commentListControl.addEventListener(
"score",
(e) => this._evtScoreComment(e)
);
this._view.commentListControl.addEventListener(
"delete",
(e) => this._evtDeleteComment(e)
);
}
},
(error) => {
this._view = new EmptyView();
this._view.showError(error.message);
}
);
}
_evtFitModeChange(e) {
const browsingSettings = settings.get();
browsingSettings.fitMode = e.detail.mode;
settings.save(browsingSettings);
}
_evtFeaturePost(e) {
this._view.sidebarControl.disableForm();
this._view.sidebarControl.clearMessages();
e.detail.post.feature().then(
() => {
this._view.sidebarControl.showSuccess("Post featured.");
this._view.sidebarControl.enableForm();
},
(error) => {
this._view.sidebarControl.showError(error.message);
this._view.sidebarControl.enableForm();
}
);
}
_evtMergePost(e) {
router.show(uri.formatClientLink("post", e.detail.post.id, "merge"));
}
_evtDeletePost(e) {
this._view.sidebarControl.disableForm();
this._view.sidebarControl.clearMessages();
e.detail.post.delete().then(
() => {
misc.disableExitConfirmation();
const ctx = router.show(uri.formatClientLink("posts"));
ctx.controller.showSuccess("Post deleted.");
},
(error) => {
this._view.sidebarControl.showError(error.message);
this._view.sidebarControl.enableForm();
}
);
}
_evtUpdatePost(e) {
this._view.sidebarControl.disableForm();
this._view.sidebarControl.clearMessages();
const post = e.detail.post;
if (e.detail.safety !== undefined) {
post.safety = e.detail.safety;
}
if (e.detail.flags !== undefined) {
post.flags = e.detail.flags;
}
if (e.detail.relations !== undefined) {
post.relations = e.detail.relations;
}
if (e.detail.source !== undefined) {
post.source = e.detail.source;
}
post.newContent = e.detail.content;
post.newThumbnail = e.detail.thumbnail;
post.save().then(
() => {
this._view.sidebarControl.showSuccess("Post saved.");
this._view.sidebarControl.enableForm();
misc.disableExitConfirmation();
},
(error) => {
this._view.sidebarControl.showError(error.message);
this._view.sidebarControl.enableForm();
}
);
}
_evtPostChange(e) {
misc.enableExitConfirmation();
}
_evtCommentChange(e) {
misc.enableExitConfirmation();
}
_evtCreateComment(e) {
this._view.commentControl.disableForm();
const comment = Comment.create(this._post.id);
comment.text = e.detail.text;
comment.save().then(
() => {
this._post.comments.add(comment);
this._view.commentControl.exitEditMode();
this._view.commentControl.enableForm();
misc.disableExitConfirmation();
},
(error) => {
this._view.commentControl.showError(error.message);
this._view.commentControl.enableForm();
}
);
}
_evtUpdateComment(e) {
// TODO: disable form
e.detail.comment.text = e.detail.text;
e.detail.comment.save().catch((error) => {
e.detail.target.showError(error.message);
// TODO: enable form
});
}
_evtScoreComment(e) {
e.detail.comment
.setScore(e.detail.score)
.catch((error) => window.alert(error.message));
}
_evtDeleteComment(e) {
e.detail.comment
.delete()
.catch((error) => window.alert(error.message));
}
_evtScorePost(e) {
if (!api.hasPrivilege("posts:score")) {
return;
}
e.detail.post
.setScore(e.detail.score)
.catch((error) => window.alert(error.message));
}
_evtFavoritePost(e) {
if (!api.hasPrivilege("posts:favorite")) {
return;
}
e.detail.post
.addToFavorites()
.catch((error) => window.alert(error.message));
}
_evtUnfavoritePost(e) {
if (!api.hasPrivilege("posts:favorite")) {
return;
}
e.detail.post
.removeFromFavorites()
.catch((error) => window.alert(error.message));
}
}
module.exports = (router) => {
router.enter(["post", ":id", "edit"], (ctx, next) => {
// restore parameters from history state
if (ctx.state.parameters) {
Object.assign(ctx.parameters, ctx.state.parameters);
}
ctx.controller = new PostMainController(ctx, true);
});
router.enter(["post", ":id"], (ctx, next) => {
// restore parameters from history state
if (ctx.state.parameters) {
Object.assign(ctx.parameters, ctx.state.parameters);
}
ctx.controller = new PostMainController(ctx, false);
});
};