summaryrefslogtreecommitdiff
path: root/client/js/controllers/pool_controller.js
diff options
context:
space:
mode:
authorShyam Sunder <sgsunder1@gmail.com>2020-06-04 21:01:28 -0400
committerShyam Sunder <sgsunder1@gmail.com>2020-06-04 21:01:28 -0400
commitc5358f7f83ef49f51d5ba557dde1b16ce2c83d1d (patch)
tree253e0be234540c266202993567d998a5c951947d /client/js/controllers/pool_controller.js
parent4329b1620fe38c2a7bf44615cfb176daa2837590 (diff)
parentb0f1b8c2309277a7b170972d463b4e8d16a79ecc (diff)
client+server: add post pools feature
Diffstat (limited to 'client/js/controllers/pool_controller.js')
-rw-r--r--client/js/controllers/pool_controller.js147
1 files changed, 147 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..a06ba5c
--- /dev/null
+++ b/client/js/controllers/pool_controller.js
@@ -0,0 +1,147 @@
+'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');
+ });
+};