summaryrefslogtreecommitdiff
path: root/client/js/controllers/pool_controller.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/js/controllers/pool_controller.js')
-rw-r--r--client/js/controllers/pool_controller.js176
1 files changed, 176 insertions, 0 deletions
diff --git a/client/js/controllers/pool_controller.js b/client/js/controllers/pool_controller.js
new file mode 100644
index 0000000..6844171
--- /dev/null
+++ b/client/js/controllers/pool_controller.js
@@ -0,0 +1,176 @@
+"use strict";
+
+const router = require("../router.js");
+const api = require("../api.js");
+const misc = require("../util/misc.js");
+const uri = require("../util/uri.js");
+const Pool = require("../models/pool.js");
+const Post = require("../models/post.js");
+const PoolCategoryList = require("../models/pool_category_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const PoolView = require("../views/pool_view.js");
+const EmptyView = require("../views/empty_view.js");
+
+class PoolController {
+ constructor(ctx, section) {
+ if (!api.hasPrivilege("pools:view")) {
+ this._view = new EmptyView();
+ this._view.showError("You don't have privileges to view pools.");
+ return;
+ }
+
+ Promise.all([
+ PoolCategoryList.get(),
+ Pool.get(ctx.parameters.id),
+ ]).then(
+ (responses) => {
+ const [poolCategoriesResponse, pool] = responses;
+
+ topNavigation.activate("pools");
+ topNavigation.setTitle("Pool #" + pool.names[0]);
+
+ this._name = ctx.parameters.name;
+ pool.addEventListener("change", (e) =>
+ this._evtSaved(e, section)
+ );
+
+ const categories = {};
+ for (let category of poolCategoriesResponse.results) {
+ categories[category.name] = category.name;
+ }
+
+ this._view = new PoolView({
+ pool: pool,
+ section: section,
+ canEditAnything: api.hasPrivilege("pools:edit"),
+ canEditNames: api.hasPrivilege("pools:edit:names"),
+ canEditCategory: api.hasPrivilege("pools:edit:category"),
+ canEditDescription: api.hasPrivilege(
+ "pools:edit:description"
+ ),
+ canEditPosts: api.hasPrivilege("pools:edit:posts"),
+ canMerge: api.hasPrivilege("pools:merge"),
+ canDelete: api.hasPrivilege("pools:delete"),
+ categories: categories,
+ escapeColons: uri.escapeColons,
+ });
+
+ this._view.addEventListener("change", (e) =>
+ this._evtChange(e)
+ );
+ this._view.addEventListener("submit", (e) =>
+ this._evtUpdate(e)
+ );
+ this._view.addEventListener("merge", (e) => this._evtMerge(e));
+ this._view.addEventListener("delete", (e) =>
+ this._evtDelete(e)
+ );
+ },
+ (error) => {
+ this._view = new EmptyView();
+ this._view.showError(error.message);
+ }
+ );
+ }
+
+ _evtChange(e) {
+ misc.enableExitConfirmation();
+ }
+
+ _evtSaved(e, section) {
+ misc.disableExitConfirmation();
+ if (this._name !== e.detail.pool.names[0]) {
+ router.replace(
+ uri.formatClientLink("pool", e.detail.pool.id, section),
+ null,
+ false
+ );
+ }
+ }
+
+ _evtUpdate(e) {
+ this._view.clearMessages();
+ this._view.disableForm();
+ if (e.detail.names !== undefined) {
+ e.detail.pool.names = e.detail.names;
+ }
+ if (e.detail.category !== undefined) {
+ e.detail.pool.category = e.detail.category;
+ }
+ if (e.detail.description !== undefined) {
+ e.detail.pool.description = e.detail.description;
+ }
+ if (e.detail.posts !== undefined) {
+ e.detail.pool.posts.clear();
+ for (let postId of e.detail.posts) {
+ e.detail.pool.posts.add(
+ Post.fromResponse({ id: parseInt(postId) })
+ );
+ }
+ }
+ e.detail.pool.save().then(
+ () => {
+ this._view.showSuccess("Pool saved.");
+ this._view.enableForm();
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
+ }
+
+ _evtMerge(e) {
+ this._view.clearMessages();
+ this._view.disableForm();
+ e.detail.pool.merge(e.detail.targetPoolId, e.detail.addAlias).then(
+ () => {
+ this._view.showSuccess("Pool merged.");
+ this._view.enableForm();
+ router.replace(
+ uri.formatClientLink(
+ "pool",
+ e.detail.targetPoolId,
+ "merge"
+ ),
+ null,
+ false
+ );
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
+ }
+
+ _evtDelete(e) {
+ this._view.clearMessages();
+ this._view.disableForm();
+ e.detail.pool.delete().then(
+ () => {
+ const ctx = router.show(uri.formatClientLink("pools"));
+ ctx.controller.showSuccess("Pool deleted.");
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
+ }
+}
+
+module.exports = (router) => {
+ router.enter(["pool", ":id", "edit"], (ctx, next) => {
+ ctx.controller = new PoolController(ctx, "edit");
+ });
+ router.enter(["pool", ":id", "merge"], (ctx, next) => {
+ ctx.controller = new PoolController(ctx, "merge");
+ });
+ router.enter(["pool", ":id", "delete"], (ctx, next) => {
+ ctx.controller = new PoolController(ctx, "delete");
+ });
+ router.enter(["pool", ":id"], (ctx, next) => {
+ ctx.controller = new PoolController(ctx, "summary");
+ });
+};