aboutsummaryrefslogtreecommitdiff
path: root/client/js/controllers
diff options
context:
space:
mode:
authorShyam Sunder2020-06-05 18:03:37 -0400
committerShyam Sunder2020-06-06 08:58:23 -0400
commit57193b57157b7a42896c887a2d5930493ac7b290 (patch)
tree9555453a944caae64d8a00e4b073482d9e7fb244 /client/js/controllers
parentc06aaa63af977e64ef08bfba7829214f0f0ed38e (diff)
client+server: implement code autoformatting using prettier and black
Diffstat (limited to 'client/js/controllers')
-rw-r--r--client/js/controllers/auth_controller.js42
-rw-r--r--client/js/controllers/base_post_controller.js16
-rw-r--r--client/js/controllers/comments_controller.js75
-rw-r--r--client/js/controllers/help_controller.js18
-rw-r--r--client/js/controllers/home_controller.js31
-rw-r--r--client/js/controllers/not_found_controller.js14
-rw-r--r--client/js/controllers/page_controller.js8
-rw-r--r--client/js/controllers/password_reset_controller.js68
-rw-r--r--client/js/controllers/pool_categories_controller.js78
-rw-r--r--client/js/controllers/pool_controller.js183
-rw-r--r--client/js/controllers/pool_create_controller.js75
-rw-r--r--client/js/controllers/pool_list_controller.js99
-rw-r--r--client/js/controllers/post_detail_controller.js115
-rw-r--r--client/js/controllers/post_list_controller.js110
-rw-r--r--client/js/controllers/post_main_controller.js304
-rw-r--r--client/js/controllers/post_upload_controller.js190
-rw-r--r--client/js/controllers/settings_controller.js20
-rw-r--r--client/js/controllers/snapshots_controller.js51
-rw-r--r--client/js/controllers/tag_categories_controller.js76
-rw-r--r--client/js/controllers/tag_controller.js180
-rw-r--r--client/js/controllers/tag_list_controller.js76
-rw-r--r--client/js/controllers/top_navigation_controller.js63
-rw-r--r--client/js/controllers/user_controller.js356
-rw-r--r--client/js/controllers/user_list_controller.js63
-rw-r--r--client/js/controllers/user_registration_controller.js73
25 files changed, 1345 insertions, 1039 deletions
diff --git a/client/js/controllers/auth_controller.js b/client/js/controllers/auth_controller.js
index a6ec97d..e01fb9b 100644
--- a/client/js/controllers/auth_controller.js
+++ b/client/js/controllers/auth_controller.js
@@ -1,38 +1,40 @@
-'use strict';
+"use strict";
-const router = require('../router.js');
-const api = require('../api.js');
-const tags = require('../tags.js');
-const pools = require('../pools.js');
-const uri = require('../util/uri.js');
-const topNavigation = require('../models/top_navigation.js');
-const LoginView = require('../views/login_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const tags = require("../tags.js");
+const pools = require("../pools.js");
+const uri = require("../util/uri.js");
+const topNavigation = require("../models/top_navigation.js");
+const LoginView = require("../views/login_view.js");
class LoginController {
constructor() {
api.forget();
- topNavigation.activate('login');
- topNavigation.setTitle('Login');
+ topNavigation.activate("login");
+ topNavigation.setTitle("Login");
this._loginView = new LoginView();
- this._loginView.addEventListener('submit', e => this._evtLogin(e));
+ this._loginView.addEventListener("submit", (e) => this._evtLogin(e));
}
_evtLogin(e) {
this._loginView.clearMessages();
this._loginView.disableForm();
api.forget();
- api.login(e.detail.name, e.detail.password, e.detail.remember)
- .then(() => {
+ api.login(e.detail.name, e.detail.password, e.detail.remember).then(
+ () => {
const ctx = router.show(uri.formatClientLink());
- ctx.controller.showSuccess('Logged in');
+ ctx.controller.showSuccess("Logged in");
// reload tag category color map, this is required when `tag_categories:list` has a permission other than anonymous
tags.refreshCategoryColorMap();
pools.refreshCategoryColorMap();
- }, error => {
+ },
+ (error) => {
this._loginView.showError(error.message);
this._loginView.enableForm();
- });
+ }
+ );
}
}
@@ -41,15 +43,15 @@ class LogoutController {
api.forget();
api.logout();
const ctx = router.show(uri.formatClientLink());
- ctx.controller.showSuccess('Logged out');
+ ctx.controller.showSuccess("Logged out");
}
}
-module.exports = router => {
- router.enter(['login'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["login"], (ctx, next) => {
ctx.controller = new LoginController();
});
- router.enter(['logout'], (ctx, next) => {
+ router.enter(["logout"], (ctx, next) => {
ctx.controller = new LogoutController();
});
};
diff --git a/client/js/controllers/base_post_controller.js b/client/js/controllers/base_post_controller.js
index b86aea7..7a21449 100644
--- a/client/js/controllers/base_post_controller.js
+++ b/client/js/controllers/base_post_controller.js
@@ -1,19 +1,19 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const topNavigation = require('../models/top_navigation.js');
-const EmptyView = require('../views/empty_view.js');
+const api = require("../api.js");
+const topNavigation = require("../models/top_navigation.js");
+const EmptyView = require("../views/empty_view.js");
class BasePostController {
constructor(ctx) {
- if (!api.hasPrivilege('posts:view')) {
+ if (!api.hasPrivilege("posts:view")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view posts.');
+ this._view.showError("You don't have privileges to view posts.");
return;
}
- topNavigation.activate('posts');
- topNavigation.setTitle('Post #' + ctx.parameters.id.toString());
+ topNavigation.activate("posts");
+ topNavigation.setTitle("Post #" + ctx.parameters.id.toString());
}
}
diff --git a/client/js/controllers/comments_controller.js b/client/js/controllers/comments_controller.js
index 67e44ac..d54059e 100644
--- a/client/js/controllers/comments_controller.js
+++ b/client/js/controllers/comments_controller.js
@@ -1,51 +1,55 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const uri = require('../util/uri.js');
-const PostList = require('../models/post_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const PageController = require('../controllers/page_controller.js');
-const CommentsPageView = require('../views/comments_page_view.js');
-const EmptyView = require('../views/empty_view.js');
+const api = require("../api.js");
+const uri = require("../util/uri.js");
+const PostList = require("../models/post_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const PageController = require("../controllers/page_controller.js");
+const CommentsPageView = require("../views/comments_page_view.js");
+const EmptyView = require("../views/empty_view.js");
-const fields = ['id', 'comments', 'commentCount', 'thumbnailUrl'];
+const fields = ["id", "comments", "commentCount", "thumbnailUrl"];
class CommentsController {
constructor(ctx) {
- if (!api.hasPrivilege('comments:list')) {
+ if (!api.hasPrivilege("comments:list")) {
this._view = new EmptyView();
this._view.showError(
- 'You don\'t have privileges to view comments.');
+ "You don't have privileges to view comments."
+ );
return;
}
- topNavigation.activate('comments');
- topNavigation.setTitle('Listing comments');
+ topNavigation.activate("comments");
+ topNavigation.setTitle("Listing comments");
this._pageController = new PageController();
this._pageController.run({
parameters: ctx.parameters,
defaultLimit: 10,
getClientUrlForPage: (offset, limit) => {
- const parameters = Object.assign(
- {}, ctx.parameters, {offset: offset, limit: limit});
- return uri.formatClientLink('comments', parameters);
+ const parameters = Object.assign({}, ctx.parameters, {
+ offset: offset,
+ limit: limit,
+ });
+ return uri.formatClientLink("comments", parameters);
},
requestPage: (offset, limit) => {
return PostList.search(
- 'sort:comment-date comment-count-min:1',
+ "sort:comment-date comment-count-min:1",
offset,
limit,
- fields);
+ fields
+ );
},
- pageRenderer: pageCtx => {
+ pageRenderer: (pageCtx) => {
Object.assign(pageCtx, {
- canViewPosts: api.hasPrivilege('posts:view'),
+ canViewPosts: api.hasPrivilege("posts:view"),
});
const view = new CommentsPageView(pageCtx);
- view.addEventListener('submit', e => this._evtUpdate(e));
- view.addEventListener('score', e => this._evtScore(e));
- view.addEventListener('delete', e => this._evtDelete(e));
+ view.addEventListener("submit", (e) => this._evtUpdate(e));
+ view.addEventListener("score", (e) => this._evtScore(e));
+ view.addEventListener("delete", (e) => this._evtDelete(e));
return view;
},
});
@@ -54,26 +58,27 @@ class CommentsController {
_evtUpdate(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
- });
+ e.detail.comment.save().catch((error) => {
+ e.detail.target.showError(error.message);
+ // TODO: enable form
+ });
}
_evtScore(e) {
- e.detail.comment.setScore(e.detail.score)
- .catch(error => window.alert(error.message));
+ e.detail.comment
+ .setScore(e.detail.score)
+ .catch((error) => window.alert(error.message));
}
_evtDelete(e) {
- e.detail.comment.delete()
- .catch(error => window.alert(error.message));
+ e.detail.comment
+ .delete()
+ .catch((error) => window.alert(error.message));
}
}
-module.exports = router => {
- router.enter(['comments'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["comments"], (ctx, next) => {
new CommentsController(ctx);
});
-}
+};
diff --git a/client/js/controllers/help_controller.js b/client/js/controllers/help_controller.js
index 8e65346..c290a6b 100644
--- a/client/js/controllers/help_controller.js
+++ b/client/js/controllers/help_controller.js
@@ -1,24 +1,24 @@
-'use strict';
+"use strict";
-const topNavigation = require('../models/top_navigation.js');
-const HelpView = require('../views/help_view.js');
+const topNavigation = require("../models/top_navigation.js");
+const HelpView = require("../views/help_view.js");
class HelpController {
constructor(section, subsection) {
- topNavigation.activate('help');
- topNavigation.setTitle('Help');
+ topNavigation.activate("help");
+ topNavigation.setTitle("Help");
this._helpView = new HelpView(section, subsection);
}
}
-module.exports = router => {
- router.enter(['help'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["help"], (ctx, next) => {
new HelpController();
});
- router.enter(['help', ':section'], (ctx, next) => {
+ router.enter(["help", ":section"], (ctx, next) => {
new HelpController(ctx.parameters.section);
});
- router.enter(['help', ':section', ':subsection'], (ctx, next) => {
+ router.enter(["help", ":section", ":subsection"], (ctx, next) => {
new HelpController(ctx.parameters.section, ctx.parameters.subsection);
});
};
diff --git a/client/js/controllers/home_controller.js b/client/js/controllers/home_controller.js
index 590da67..cf56e27 100644
--- a/client/js/controllers/home_controller.js
+++ b/client/js/controllers/home_controller.js
@@ -1,26 +1,26 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const config = require('../config.js');
-const Info = require('../models/info.js');
-const topNavigation = require('../models/top_navigation.js');
-const HomeView = require('../views/home_view.js');
+const api = require("../api.js");
+const config = require("../config.js");
+const Info = require("../models/info.js");
+const topNavigation = require("../models/top_navigation.js");
+const HomeView = require("../views/home_view.js");
class HomeController {
constructor() {
- topNavigation.activate('home');
- topNavigation.setTitle('Home');
+ topNavigation.activate("home");
+ topNavigation.setTitle("Home");
this._homeView = new HomeView({
name: api.getName(),
version: config.meta.version,
buildDate: config.meta.buildDate,
- canListSnapshots: api.hasPrivilege('snapshots:list'),
- canListPosts: api.hasPrivilege('posts:list'),
+ canListSnapshots: api.hasPrivilege("snapshots:list"),
+ canListPosts: api.hasPrivilege("posts:list"),
});
- Info.get()
- .then(info => {
+ Info.get().then(
+ (info) => {
this._homeView.setStats({
diskUsage: info.diskUsage,
postCount: info.postCount,
@@ -31,7 +31,8 @@ class HomeController {
featuringTime: info.featuringTime,
});
},
- error => this._homeView.showError(error.message));
+ (error) => this._homeView.showError(error.message)
+ );
}
showSuccess(message) {
@@ -43,8 +44,8 @@ class HomeController {
}
}
-module.exports = router => {
+module.exports = (router) => {
router.enter([], (ctx, next) => {
ctx.controller = new HomeController();
});
-}
+};
diff --git a/client/js/controllers/not_found_controller.js b/client/js/controllers/not_found_controller.js
index 8ceeef0..c99e308 100644
--- a/client/js/controllers/not_found_controller.js
+++ b/client/js/controllers/not_found_controller.js
@@ -1,18 +1,18 @@
-'use strict';
+"use strict";
-const topNavigation = require('../models/top_navigation.js');
-const NotFoundView = require('../views/not_found_view.js');
+const topNavigation = require("../models/top_navigation.js");
+const NotFoundView = require("../views/not_found_view.js");
class NotFoundController {
constructor(path) {
- topNavigation.activate('');
- topNavigation.setTitle('Not found');
+ topNavigation.activate("");
+ topNavigation.setTitle("Not found");
this._notFoundView = new NotFoundView(path);
}
}
-module.exports = router => {
+module.exports = (router) => {
router.enter(null, (ctx, next) => {
ctx.controller = new NotFoundController(ctx.canonicalPath);
});
-}
+};
diff --git a/client/js/controllers/page_controller.js b/client/js/controllers/page_controller.js
index ae55804..d3ee7e9 100644
--- a/client/js/controllers/page_controller.js
+++ b/client/js/controllers/page_controller.js
@@ -1,8 +1,8 @@
-'use strict';
+"use strict";
-const settings = require('../models/settings.js');
-const EndlessPageView = require('../views/endless_page_view.js');
-const ManualPageView = require('../views/manual_page_view.js');
+const settings = require("../models/settings.js");
+const EndlessPageView = require("../views/endless_page_view.js");
+const ManualPageView = require("../views/manual_page_view.js");
class PageController {
constructor(ctx) {
diff --git a/client/js/controllers/password_reset_controller.js b/client/js/controllers/password_reset_controller.js
index e0a9801..aa66c03 100644
--- a/client/js/controllers/password_reset_controller.js
+++ b/client/js/controllers/password_reset_controller.js
@@ -1,19 +1,20 @@
-'use strict';
+"use strict";
-const router = require('../router.js');
-const api = require('../api.js');
-const uri = require('../util/uri.js');
-const topNavigation = require('../models/top_navigation.js');
-const PasswordResetView = require('../views/password_reset_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const uri = require("../util/uri.js");
+const topNavigation = require("../models/top_navigation.js");
+const PasswordResetView = require("../views/password_reset_view.js");
class PasswordResetController {
constructor() {
- topNavigation.activate('login');
- topNavigation.setTitle('Password reminder');
+ topNavigation.activate("login");
+ topNavigation.setTitle("Password reminder");
this._passwordResetView = new PasswordResetView();
- this._passwordResetView.addEventListener(
- 'submit', e => this._evtReset(e));
+ this._passwordResetView.addEventListener("submit", (e) =>
+ this._evtReset(e)
+ );
}
_evtReset(e) {
@@ -21,15 +22,20 @@ class PasswordResetController {
this._passwordResetView.disableForm();
api.forget();
api.logout();
- api.get(uri.formatApiLink('password-reset', e.detail.userNameOrEmail))
- .then(() => {
+ api.get(
+ uri.formatApiLink("password-reset", e.detail.userNameOrEmail)
+ ).then(
+ () => {
this._passwordResetView.showSuccess(
- 'E-mail has been sent. To finish the procedure, ' +
- 'please click the link it contains.');
- }, error => {
+ "E-mail has been sent. To finish the procedure, " +
+ "please click the link it contains."
+ );
+ },
+ (error) => {
this._passwordResetView.showError(error.message);
this._passwordResetView.enableForm();
- });
+ }
+ );
}
}
@@ -38,26 +44,30 @@ class PasswordResetFinishController {
api.forget();
api.logout();
let password = null;
- api.post(uri.formatApiLink('password-reset', name), {token: token})
- .then(response => {
+ api.post(uri.formatApiLink("password-reset", name), { token: token })
+ .then((response) => {
password = response.password;
return api.login(name, password, false);
- }).then(() => {
- const ctx = router.show(uri.formatClientLink());
- ctx.controller.showSuccess('New password: ' + password);
- }, error => {
- const ctx = router.show(uri.formatClientLink());
- ctx.controller.showError(error.message);
- });
+ })
+ .then(
+ () => {
+ const ctx = router.show(uri.formatClientLink());
+ ctx.controller.showSuccess("New password: " + password);
+ },
+ (error) => {
+ const ctx = router.show(uri.formatClientLink());
+ ctx.controller.showError(error.message);
+ }
+ );
}
}
-module.exports = router => {
- router.enter(['password-reset'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["password-reset"], (ctx, next) => {
ctx.controller = new PasswordResetController();
});
- router.enter(['password-reset', ':descriptor'], (ctx, next) => {
- const [name, token] = ctx.parameters.descriptor.split(':', 2);
+ router.enter(["password-reset", ":descriptor"], (ctx, next) => {
+ const [name, token] = ctx.parameters.descriptor.split(":", 2);
ctx.controller = new PasswordResetFinishController(name, token);
});
};
diff --git a/client/js/controllers/pool_categories_controller.js b/client/js/controllers/pool_categories_controller.js
index 4c2c3b7..4db725c 100644
--- a/client/js/controllers/pool_categories_controller.js
+++ b/client/js/controllers/pool_categories_controller.js
@@ -1,57 +1,69 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const pools = require('../pools.js');
-const PoolCategoryList = require('../models/pool_category_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const PoolCategoriesView = require('../views/pool_categories_view.js');
-const EmptyView = require('../views/empty_view.js');
+const api = require("../api.js");
+const pools = require("../pools.js");
+const PoolCategoryList = require("../models/pool_category_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const PoolCategoriesView = require("../views/pool_categories_view.js");
+const EmptyView = require("../views/empty_view.js");
class PoolCategoriesController {
constructor() {
- if (!api.hasPrivilege('poolCategories:list')) {
+ if (!api.hasPrivilege("poolCategories:list")) {
this._view = new EmptyView();
this._view.showError(
- 'You don\'t have privileges to view pool categories.');
+ "You don't have privileges to view pool categories."
+ );
return;
}
- topNavigation.activate('pools');
- topNavigation.setTitle('Listing pools');
- PoolCategoryList.get().then(response => {
- this._poolCategories = response.results;
- this._view = new PoolCategoriesView({
- poolCategories: this._poolCategories,
- canEditName: api.hasPrivilege('poolCategories:edit:name'),
- canEditColor: api.hasPrivilege('poolCategories:edit:color'),
- canDelete: api.hasPrivilege('poolCategories:delete'),
- canCreate: api.hasPrivilege('poolCategories:create'),
- canSetDefault: api.hasPrivilege('poolCategories:setDefault'),
- });
- this._view.addEventListener('submit', e => this._evtSubmit(e));
- }, error => {
- this._view = new EmptyView();
- this._view.showError(error.message);
- });
+ topNavigation.activate("pools");
+ topNavigation.setTitle("Listing pools");
+ PoolCategoryList.get().then(
+ (response) => {
+ this._poolCategories = response.results;
+ this._view = new PoolCategoriesView({
+ poolCategories: this._poolCategories,
+ canEditName: api.hasPrivilege("poolCategories:edit:name"),
+ canEditColor: api.hasPrivilege(
+ "poolCategories:edit:color"
+ ),
+ canDelete: api.hasPrivilege("poolCategories:delete"),
+ canCreate: api.hasPrivilege("poolCategories:create"),
+ canSetDefault: api.hasPrivilege(
+ "poolCategories:setDefault"
+ ),
+ });
+ this._view.addEventListener("submit", (e) =>
+ this._evtSubmit(e)
+ );
+ },
+ (error) => {
+ this._view = new EmptyView();
+ this._view.showError(error.message);
+ }
+ );
}
_evtSubmit(e) {
this._view.clearMessages();
this._view.disableForm();
- this._poolCategories.save()
- .then(() => {
+ this._poolCategories.save().then(
+ () => {
pools.refreshCategoryColorMap();
this._view.enableForm();
- this._view.showSuccess('Changes saved.');
- }, error => {
+ this._view.showSuccess("Changes saved.");
+ },
+ (error) => {
this._view.enableForm();
this._view.showError(error.message);
- });
+ }
+ );
}
}
-module.exports = router => {
- router.enter(['pool-categories'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["pool-categories"], (ctx, next) => {
ctx.controller = new PoolCategoriesController(ctx, next);
});
};
diff --git a/client/js/controllers/pool_controller.js b/client/js/controllers/pool_controller.js
index a06ba5c..6844171 100644
--- a/client/js/controllers/pool_controller.js
+++ b/client/js/controllers/pool_controller.js
@@ -1,63 +1,76 @@
-'use strict';
+"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');
+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')) {
+ if (!api.hasPrivilege("pools:view")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view pools.');
+ 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;
+ Pool.get(ctx.parameters.id),
+ ]).then(
+ (responses) => {
+ const [poolCategoriesResponse, pool] = responses;
- topNavigation.activate('pools');
- topNavigation.setTitle('Pool #' + pool.names[0]);
+ topNavigation.activate("pools");
+ topNavigation.setTitle("Pool #" + pool.names[0]);
- this._name = ctx.parameters.name;
- pool.addEventListener('change', e => this._evtSaved(e, section));
+ 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;
- }
+ 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 = 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);
- });
+ 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) {
@@ -67,7 +80,11 @@ class PoolController {
_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);
+ router.replace(
+ uri.formatClientLink("pool", e.detail.pool.id, section),
+ null,
+ false
+ );
}
}
@@ -86,62 +103,74 @@ class PoolController {
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.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();
- });
+ 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.');
+ 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'),
+ "pool",
+ e.detail.targetPoolId,
+ "merge"
+ ),
null,
- false);
- }, error => {
+ 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 => {
+ 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');
+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", "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", "delete"], (ctx, next) => {
+ ctx.controller = new PoolController(ctx, "delete");
});
- router.enter(['pool', ':id'], (ctx, next) => {
- ctx.controller = new PoolController(ctx, 'summary');
+ router.enter(["pool", ":id"], (ctx, next) => {
+ ctx.controller = new PoolController(ctx, "summary");
});
};
diff --git a/client/js/controllers/pool_create_controller.js b/client/js/controllers/pool_create_controller.js
index 2b8e7e6..7140aac 100644
--- a/client/js/controllers/pool_create_controller.js
+++ b/client/js/controllers/pool_create_controller.js
@@ -1,58 +1,65 @@
-'use strict';
+"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 PoolCategoryList = require('../models/pool_category_list.js');
-const PoolCreateView = require('../views/pool_create_view.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const misc = require("../util/misc.js");
+const uri = require("../util/uri.js");
+const PoolCategoryList = require("../models/pool_category_list.js");
+const PoolCreateView = require("../views/pool_create_view.js");
+const EmptyView = require("../views/empty_view.js");
class PoolCreateController {
constructor(ctx) {
- if (!api.hasPrivilege('pools:create')) {
+ if (!api.hasPrivilege("pools:create")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to create pools.');
+ this._view.showError("You don't have privileges to create pools.");
return;
}
- PoolCategoryList.get().then(poolCategoriesResponse => {
- const categories = {};
- for (let category of poolCategoriesResponse.results) {
- categories[category.name] = category.name;
- }
+ PoolCategoryList.get().then(
+ (poolCategoriesResponse) => {
+ const categories = {};
+ for (let category of poolCategoriesResponse.results) {
+ categories[category.name] = category.name;
+ }
- this._view = new PoolCreateView({
- canCreate: api.hasPrivilege('pools:create'),
- categories: categories,
- escapeColons: uri.escapeColons,
- });
+ this._view = new PoolCreateView({
+ canCreate: api.hasPrivilege("pools:create"),
+ categories: categories,
+ escapeColons: uri.escapeColons,
+ });
- this._view.addEventListener('submit', e => this._evtCreate(e));
- }, error => {
- this._view = new EmptyView();
- this._view.showError(error.message);
- });
+ this._view.addEventListener("submit", (e) =>
+ this._evtCreate(e)
+ );
+ },
+ (error) => {
+ this._view = new EmptyView();
+ this._view.showError(error.message);
+ }
+ );
}
_evtCreate(e) {
this._view.clearMessages();
this._view.disableForm();
- api.post(uri.formatApiLink('pool'), e.detail)
- .then(() => {
+ api.post(uri.formatApiLink("pool"), e.detail).then(
+ () => {
this._view.clearMessages();
misc.disableExitConfirmation();
- const ctx = router.show(uri.formatClientLink('pools'));
- ctx.controller.showSuccess('Pool created.');
- }, error => {
+ const ctx = router.show(uri.formatClientLink("pools"));
+ ctx.controller.showSuccess("Pool created.");
+ },
+ (error) => {
this._view.showError(error.message);
this._view.enableForm();
- });
+ }
+ );
}
}
-module.exports = router => {
- router.enter(['pool', 'create'], (ctx, next) => {
- ctx.controller = new PoolCreateController(ctx, 'create');
+module.exports = (router) => {
+ router.enter(["pool", "create"], (ctx, next) => {
+ ctx.controller = new PoolCreateController(ctx, "create");
});
};
diff --git a/client/js/controllers/pool_list_controller.js b/client/js/controllers/pool_list_controller.js
index dff649f..91d655c 100644
--- a/client/js/controllers/pool_list_controller.js
+++ b/client/js/controllers/pool_list_controller.js
@@ -1,47 +1,51 @@
-'use strict';
+"use strict";
-const router = require('../router.js');
-const api = require('../api.js');
-const uri = require('../util/uri.js');
-const PoolList = require('../models/pool_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const PageController = require('../controllers/page_controller.js');
-const PoolsHeaderView = require('../views/pools_header_view.js');
-const PoolsPageView = require('../views/pools_page_view.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const uri = require("../util/uri.js");
+const PoolList = require("../models/pool_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const PageController = require("../controllers/page_controller.js");
+const PoolsHeaderView = require("../views/pools_header_view.js");
+const PoolsPageView = require("../views/pools_page_view.js");
+const EmptyView = require("../views/empty_view.js");
const fields = [
- 'id',
- 'names',
- 'posts',
- 'creationTime',
- 'postCount',
- 'category'
+ "id",
+ "names",
+ "posts",
+ "creationTime",
+ "postCount",
+ "category",
];
class PoolListController {
constructor(ctx) {
this._pageController = new PageController();
- if (!api.hasPrivilege('pools:list')) {
+ if (!api.hasPrivilege("pools:list")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view pools.');
+ this._view.showError("You don't have privileges to view pools.");
return;
}
this._ctx = ctx;
- topNavigation.activate('pools');
- topNavigation.setTitle('Listing pools');
+ topNavigation.activate("pools");
+ topNavigation.setTitle("Listing pools");
this._headerView = new PoolsHeaderView({
hostNode: this._pageController.view.pageHeaderHolderNode,
parameters: ctx.parameters,
- canCreate: api.hasPrivilege('pools:create'),
- canEditPoolCategories: api.hasPrivilege('poolCategories:edit'),
+ canCreate: api.hasPrivilege("pools:create"),
+ canEditPoolCategories: api.hasPrivilege("poolCategories:edit"),
});
this._headerView.addEventListener(
- 'submit', e => this._evtSubmit(e), 'navigate', e => this._evtNavigate(e));
+ "submit",
+ (e) => this._evtSubmit(e),
+ "navigate",
+ (e) => this._evtNavigate(e)
+ );
this._syncPageController();
}
@@ -57,24 +61,27 @@ class PoolListController {
_evtSubmit(e) {
this._view.clearMessages();
this._view.disableForm();
- e.detail.pool.save()
- .then(() => {
- this._installView(e.detail.pool, 'edit');
- this._view.showSuccess('Pool created.');
+ e.detail.pool.save().then(
+ () => {
+ this._installView(e.detail.pool, "edit");
+ this._view.showSuccess("Pool created.");
router.replace(
- uri.formatClientLink(
- 'pool', e.detail.pool.id, 'edit'),
+ uri.formatClientLink("pool", e.detail.pool.id, "edit"),
null,
- false);
- }, error => {
+ false
+ );
+ },
+ (error) => {
this._view.showError(error.message);
this._view.enableForm();
- });
+ }
+ );
}
_evtNavigate(e) {
router.showNoDispatch(
- uri.formatClientLink('pools', e.detail.parameters));
+ uri.formatClientLink("pools", e.detail.parameters)
+ );
Object.assign(this._ctx.parameters, e.detail.parameters);
this._syncPageController();
}
@@ -84,25 +91,29 @@ class PoolListController {
parameters: this._ctx.parameters,
defaultLimit: 50,
getClientUrlForPage: (offset, limit) => {
- const parameters = Object.assign(
- {}, this._ctx.parameters, {offset: offset, limit: limit});
- return uri.formatClientLink('pools', parameters);
+ const parameters = Object.assign({}, this._ctx.parameters, {
+ offset: offset,
+ limit: limit,
+ });
+ return uri.formatClientLink("pools", parameters);
},
requestPage: (offset, limit) => {
return PoolList.search(
- this._ctx.parameters.query, offset, limit, fields);
+ this._ctx.parameters.query,
+ offset,
+ limit,
+ fields
+ );
},
- pageRenderer: pageCtx => {
+ pageRenderer: (pageCtx) => {
return new PoolsPageView(pageCtx);
},
});
}
}
-module.exports = router => {
- router.enter(
- ['pools'],
- (ctx, next) => {
- ctx.controller = new PoolListController(ctx);
- });
+module.exports = (router) => {
+ router.enter(["pools"], (ctx, next) => {
+ ctx.controller = new PoolListController(ctx);
+ });
};
diff --git a/client/js/controllers/post_detail_controller.js b/client/js/controllers/post_detail_controller.js
index bd9c2e6..9bab1ce 100644
--- a/client/js/controllers/post_detail_controller.js
+++ b/client/js/controllers/post_detail_controller.js
@@ -1,28 +1,33 @@
-'use strict';
+"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 settings = require('../models/settings.js');
-const Post = require('../models/post.js');
-const PostList = require('../models/post_list.js');
-const PostDetailView = require('../views/post_detail_view.js');
-const BasePostController = require('./base_post_controller.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const misc = require("../util/misc.js");
+const uri = require("../util/uri.js");
+const settings = require("../models/settings.js");
+const Post = require("../models/post.js");
+const PostList = require("../models/post_list.js");
+const PostDetailView = require("../views/post_detail_view.js");
+const BasePostController = require("./base_post_controller.js");
+const EmptyView = require("../views/empty_view.js");
class PostDetailController extends BasePostController {
constructor(ctx, section) {
super(ctx);
- Post.get(ctx.parameters.id).then(post => {
- this._id = ctx.parameters.id;
- post.addEventListener('change', e => this._evtSaved(e, section));
- this._installView(post, section);
- }, error => {
- this._view = new EmptyView();
- this._view.showError(error.message);
- });
+ Post.get(ctx.parameters.id).then(
+ (post) => {
+ this._id = ctx.parameters.id;
+ post.addEventListener("change", (e) =>
+ this._evtSaved(e, section)
+ );
+ this._installView(post, section);
+ },
+ (error) => {
+ this._view = new EmptyView();
+ this._view.showError(error.message);
+ }
+ );
}
showSuccess(message) {
@@ -33,58 +38,68 @@ class PostDetailController extends BasePostController {
this._view = new PostDetailView({
post: post,
section: section,
- canMerge: api.hasPrivilege('posts:merge'),
+ canMerge: api.hasPrivilege("posts:merge"),
});
- this._view.addEventListener('select', e => this._evtSelect(e));
- this._view.addEventListener('merge', e => this._evtMerge(e));
+ this._view.addEventListener("select", (e) => this._evtSelect(e));
+ this._view.addEventListener("merge", (e) => this._evtMerge(e));
}
_evtSelect(e) {
this._view.clearMessages();
this._view.disableForm();
- Post.get(e.detail.postId).then(post => {
- this._view.selectPost(post);
- this._view.enableForm();
- }, error => {
- this._view.showError(error.message);
- this._view.enableForm();
- });
+ Post.get(e.detail.postId).then(
+ (post) => {
+ this._view.selectPost(post);
+ this._view.enableForm();
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
}
_evtSaved(e, section) {
misc.disableExitConfirmation();
if (this._id !== e.detail.post.id) {
router.replace(
- uri.formatClientLink('post', e.detail.post.id, section),
+ uri.formatClientLink("post", e.detail.post.id, section),
null,
- false);
+ false
+ );
}
}
_evtMerge(e) {
this._view.clearMessages();
this._view.disableForm();
- e.detail.post.merge(e.detail.targetPost.id, e.detail.useOldContent)
- .then(() => {
- this._installView(e.detail.post, 'merge');
- this._view.showSuccess('Post merged.');
- router.replace(
- uri.formatClientLink(
- 'post', e.detail.targetPost.id, 'merge'),
- null,
- false);
- }, error => {
- this._view.showError(error.message);
- this._view.enableForm();
- });
+ e.detail.post
+ .merge(e.detail.targetPost.id, e.detail.useOldContent)
+ .then(
+ () => {
+ this._installView(e.detail.post, "merge");
+ this._view.showSuccess("Post merged.");
+ router.replace(
+ uri.formatClientLink(
+ "post",
+ e.detail.targetPost.id,
+ "merge"
+ ),
+ null,
+ false
+ );
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
}
}
-module.exports = router => {
- router.enter(
- ['post', ':id', 'merge'],
- (ctx, next) => {
- ctx.controller = new PostDetailController(ctx, 'merge');
- });
+module.exports = (router) => {
+ router.enter(["post", ":id", "merge"], (ctx, next) => {
+ ctx.controller = new PostDetailController(ctx, "merge");
+ });
};
diff --git a/client/js/controllers/post_list_controller.js b/client/js/controllers/post_list_controller.js
index 357386c..941ea9d 100644
--- a/client/js/controllers/post_list_controller.js
+++ b/client/js/controllers/post_list_controller.js
@@ -1,48 +1,56 @@
-'use strict';
+"use strict";
-const router = require('../router.js');
-const api = require('../api.js');
-const settings = require('../models/settings.js');
-const uri = require('../util/uri.js');
-const PostList = require('../models/post_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const PageController = require('../controllers/page_controller.js');
-const PostsHeaderView = require('../views/posts_header_view.js');
-const PostsPageView = require('../views/posts_page_view.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const settings = require("../models/settings.js");
+const uri = require("../util/uri.js");
+const PostList = require("../models/post_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const PageController = require("../controllers/page_controller.js");
+const PostsHeaderView = require("../views/posts_header_view.js");
+const PostsPageView = require("../views/posts_page_view.js");
+const EmptyView = require("../views/empty_view.js");
const fields = [
- 'id', 'thumbnailUrl', 'type', 'safety',
- 'score', 'favoriteCount', 'commentCount', 'tags', 'version'
+ "id",
+ "thumbnailUrl",
+ "type",
+ "safety",
+ "score",
+ "favoriteCount",
+ "commentCount",
+ "tags",
+ "version",
];
class PostListController {
constructor(ctx) {
this._pageController = new PageController();
- if (!api.hasPrivilege('posts:list')) {
+ if (!api.hasPrivilege("posts:list")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view posts.');
+ this._view.showError("You don't have privileges to view posts.");
return;
}
this._ctx = ctx;
- topNavigation.activate('posts');
- topNavigation.setTitle('Listing posts');
+ topNavigation.activate("posts");
+ topNavigation.setTitle("Listing posts");
this._headerView = new PostsHeaderView({
hostNode: this._pageController.view.pageHeaderHolderNode,
parameters: ctx.parameters,
enableSafety: api.safetyEnabled(),
- canBulkEditTags: api.hasPrivilege('posts:bulk-edit:tags'),
- canBulkEditSafety: api.hasPrivilege('posts:bulk-edit:safety'),
+ canBulkEditTags: api.hasPrivilege("posts:bulk-edit:tags"),
+ canBulkEditSafety: api.hasPrivilege("posts:bulk-edit:safety"),
bulkEdit: {
- tags: this._bulkEditTags
+ tags: this._bulkEditTags,
},
});
- this._headerView.addEventListener(
- 'navigate', e => this._evtNavigate(e));
+ this._headerView.addEventListener("navigate", (e) =>
+ this._evtNavigate(e)
+ );
this._syncPageController();
}
@@ -52,33 +60,35 @@ class PostListController {
}
get _bulkEditTags() {
- return (this._ctx.parameters.tag || '').split(/\s+/).filter(s => s);
+ return (this._ctx.parameters.tag || "").split(/\s+/).filter((s) => s);
}
_evtNavigate(e) {
router.showNoDispatch(
- uri.formatClientLink('posts', e.detail.parameters));
+ uri.formatClientLink("posts", e.detail.parameters)
+ );
Object.assign(this._ctx.parameters, e.detail.parameters);
this._syncPageController();
}
_evtTag(e) {
Promise.all(
- this._bulkEditTags.map(tag => e.detail.post.tags.addByName(tag)))
+ this._bulkEditTags.map((tag) => e.detail.post.tags.addByName(tag))
+ )
.then(e.detail.post.save())
- .catch(error => window.alert(error.message));
+ .catch((error) => window.alert(error.message));
}
_evtUntag(e) {
for (let tag of this._bulkEditTags) {
e.detail.post.tags.removeByName(tag);
}
- e.detail.post.save().catch(error => window.alert(error.message));
+ e.detail.post.save().catch((error) => window.alert(error.message));
}
_evtChangeSafety(e) {
e.detail.post.safety = e.detail.safety;
- e.detail.post.save().catch(error => window.alert(error.message));
+ e.detail.post.save().catch((error) => window.alert(error.message));
}
_syncPageController() {
@@ -86,39 +96,45 @@ class PostListController {
parameters: this._ctx.parameters,
defaultLimit: parseInt(settings.get().postsPerPage),
getClientUrlForPage: (offset, limit) => {
- const parameters = Object.assign(
- {}, this._ctx.parameters, {offset: offset, limit: limit});
- return uri.formatClientLink('posts', parameters);
+ const parameters = Object.assign({}, this._ctx.parameters, {
+ offset: offset,
+ limit: limit,
+ });
+ return uri.formatClientLink("posts", parameters);
},
requestPage: (offset, limit) => {
return PostList.search(
- this._ctx.parameters.query, offset, limit, fields);
+ this._ctx.parameters.query,
+ offset,
+ limit,
+ fields
+ );
},
- pageRenderer: pageCtx => {
+ pageRenderer: (pageCtx) => {
Object.assign(pageCtx, {
- canViewPosts: api.hasPrivilege('posts:view'),
- canBulkEditTags: api.hasPrivilege('posts:bulk-edit:tags'),
- canBulkEditSafety:
- api.hasPrivilege('posts:bulk-edit:safety'),
+ canViewPosts: api.hasPrivilege("posts:view"),
+ canBulkEditTags: api.hasPrivilege("posts:bulk-edit:tags"),
+ canBulkEditSafety: api.hasPrivilege(
+ "posts:bulk-edit:safety"
+ ),
bulkEdit: {
tags: this._bulkEditTags,
},
});
const view = new PostsPageView(pageCtx);
- view.addEventListener('tag', e => this._evtTag(e));
- view.addEventListener('untag', e => this._evtUntag(e));
- view.addEventListener(
- 'changeSafety', e => this._evtChangeSafety(e));
+ view.addEventListener("tag", (e) => this._evtTag(e));
+ view.addEventListener("untag", (e) => this._evtUntag(e));
+ view.addEventListener("changeSafety", (e) =>
+ this._evtChangeSafety(e)
+ );
return view;
},
});
}
}
-module.exports = router => {
- router.enter(
- ['posts'],
- (ctx, next) => {
- ctx.controller = new PostListController(ctx);
- });
+module.exports = (router) => {
+ router.enter(["posts"], (ctx, next) => {
+ ctx.controller = new PostListController(ctx);
+ });
};
diff --git a/client/js/controllers/post_main_controller.js b/client/js/controllers/post_main_controller.js
index 924e918..95cfdb5 100644
--- a/client/js/controllers/post_main_controller.js
+++ b/client/js/controllers/post_main_controller.js
@@ -1,16 +1,16 @@
-'use strict';
+"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');
+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) {
@@ -21,74 +21,107 @@ class PostMainController extends BasePostController {
Post.get(ctx.parameters.id),
PostList.getAround(
ctx.parameters.id,
- parameters ? parameters.query : null),
- ]).then(responses => {
- const [post, aroundResponse] = responses;
+ 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);
- }
+ // 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,
- });
+ 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.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.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));
+ 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);
}
- }, error => {
- this._view = new EmptyView();
- this._view.showError(error.message);
- });
+ );
}
_evtFitModeChange(e) {
@@ -100,32 +133,36 @@ class PostMainController extends BasePostController {
_evtFeaturePost(e) {
this._view.sidebarControl.disableForm();
this._view.sidebarControl.clearMessages();
- e.detail.post.feature()
- .then(() => {
- this._view.sidebarControl.showSuccess('Post featured.');
+ e.detail.post.feature().then(
+ () => {
+ this._view.sidebarControl.showSuccess("Post featured.");
this._view.sidebarControl.enableForm();
- }, error => {
+ },
+ (error) => {
this._view.sidebarControl.showError(error.message);
this._view.sidebarControl.enableForm();
- });
+ }
+ );
}
_evtMergePost(e) {
- router.show(uri.formatClientLink('post', e.detail.post.id, 'merge'));
+ 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(() => {
+ e.detail.post.delete().then(
+ () => {
misc.disableExitConfirmation();
- const ctx = router.show(uri.formatClientLink('posts'));
- ctx.controller.showSuccess('Post deleted.');
- }, error => {
+ 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) {
@@ -150,15 +187,17 @@ class PostMainController extends BasePostController {
if (e.detail.source !== undefined) {
post.source = e.detail.source;
}
- post.save()
- .then(() => {
- this._view.sidebarControl.showSuccess('Post saved.');
+ post.save().then(
+ () => {
+ this._view.sidebarControl.showSuccess("Post saved.");
this._view.sidebarControl.enableForm();
misc.disableExitConfirmation();
- }, error => {
+ },
+ (error) => {
this._view.sidebarControl.showError(error.message);
this._view.sidebarControl.enableForm();
- });
+ }
+ );
}
_evtPostChange(e) {
@@ -173,79 +212,82 @@ class PostMainController extends BasePostController {
this._view.commentControl.disableForm();
const comment = Comment.create(this._post.id);
comment.text = e.detail.text;
- comment.save()
- .then(() => {
+ comment.save().then(
+ () => {
this._post.comments.add(comment);
this._view.commentControl.exitEditMode();
this._view.commentControl.enableForm();
misc.disableExitConfirmation();
- }, error => {
+ },
+ (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
- });
+ 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));
+ 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));
+ e.detail.comment
+ .delete()
+ .catch((error) => window.alert(error.message));
}
_evtScorePost(e) {
- if (!api.hasPrivilege('posts:score')) {
+ if (!api.hasPrivilege("posts:score")) {
return;
}
- e.detail.post.setScore(e.detail.score)
- .catch(error => window.alert(error.message));
+ e.detail.post
+ .setScore(e.detail.score)
+ .catch((error) => window.alert(error.message));
}
_evtFavoritePost(e) {
- if (!api.hasPrivilege('posts:favorite')) {
+ if (!api.hasPrivilege("posts:favorite")) {
return;
}
- e.detail.post.addToFavorites()
- .catch(error => window.alert(error.message));
+ e.detail.post
+ .addToFavorites()
+ .catch((error) => window.alert(error.message));
}
_evtUnfavoritePost(e) {
- if (!api.hasPrivilege('posts:favorite')) {
+ if (!api.hasPrivilege("posts:favorite")) {
return;
}
- e.detail.post.removeFromFavorites()
- .catch(error => window.alert(error.message));
+ 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);
- });
+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);
+ });
};
diff --git a/client/js/controllers/post_upload_controller.js b/client/js/controllers/post_upload_controller.js
index f16aaf0..d317be5 100644
--- a/client/js/controllers/post_upload_controller.js
+++ b/client/js/controllers/post_upload_controller.js
@@ -1,40 +1,40 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const router = require('../router.js');
-const uri = require('../util/uri.js');
-const misc = require('../util/misc.js');
-const progress = require('../util/progress.js');
-const topNavigation = require('../models/top_navigation.js');
-const Post = require('../models/post.js');
-const Tag = require('../models/tag.js');
-const PostUploadView = require('../views/post_upload_view.js');
-const EmptyView = require('../views/empty_view.js');
+const api = require("../api.js");
+const router = require("../router.js");
+const uri = require("../util/uri.js");
+const misc = require("../util/misc.js");
+const progress = require("../util/progress.js");
+const topNavigation = require("../models/top_navigation.js");
+const Post = require("../models/post.js");
+const Tag = require("../models/tag.js");
+const PostUploadView = require("../views/post_upload_view.js");
+const EmptyView = require("../views/empty_view.js");
const genericErrorMessage =
- 'One of the posts needs your attention; ' +
+ "One of the posts needs your attention; " +
'click "resume upload" when you\'re ready.';
class PostUploadController {
constructor() {
this._lastCancellablePromise = null;
- if (!api.hasPrivilege('posts:create')) {
+ if (!api.hasPrivilege("posts:create")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to upload posts.');
+ this._view.showError("You don't have privileges to upload posts.");
return;
}
- topNavigation.activate('upload');
- topNavigation.setTitle('Upload');
+ topNavigation.activate("upload");
+ topNavigation.setTitle("Upload");
this._view = new PostUploadView({
- canUploadAnonymously: api.hasPrivilege('posts:create:anonymous'),
- canViewPosts: api.hasPrivilege('posts:view'),
+ canUploadAnonymously: api.hasPrivilege("posts:create:anonymous"),
+ canViewPosts: api.hasPrivilege("posts:view"),
enableSafety: api.safetyEnabled(),
});
- this._view.addEventListener('change', e => this._evtChange(e));
- this._view.addEventListener('submit', e => this._evtSubmit(e));
- this._view.addEventListener('cancel', e => this._evtCancel(e));
+ this._view.addEventListener("change", (e) => this._evtChange(e));
+ this._view.addEventListener("submit", (e) => this._evtSubmit(e));
+ this._view.addEventListener("cancel", (e) => this._evtCancel(e));
}
_evtChange(e) {
@@ -56,87 +56,109 @@ class PostUploadController {
this._view.disableForm();
this._view.clearMessages();
- e.detail.uploadables.reduce(
- (promise, uploadable) => promise.then(() => this._uploadSinglePost(
- uploadable, e.detail.skipDuplicates)),
- Promise.resolve())
- .then(() => {
- this._view.clearMessages();
- misc.disableExitConfirmation();
- const ctx = router.show(uri.formatClientLink('posts'));
- ctx.controller.showSuccess('Posts uploaded.');
- }, error => {
- if (error.uploadable) {
- if (error.similarPosts) {
- error.uploadable.lookalikes = error.similarPosts;
- this._view.updateUploadable(error.uploadable);
- this._view.showInfo(genericErrorMessage);
- this._view.showInfo(
- error.message, error.uploadable);
+ e.detail.uploadables
+ .reduce(
+ (promise, uploadable) =>
+ promise.then(() =>
+ this._uploadSinglePost(
+ uploadable,
+ e.detail.skipDuplicates
+ )
+ ),
+ Promise.resolve()
+ )
+ .then(
+ () => {
+ this._view.clearMessages();
+ misc.disableExitConfirmation();
+ const ctx = router.show(uri.formatClientLink("posts"));
+ ctx.controller.showSuccess("Posts uploaded.");
+ },
+ (error) => {
+ if (error.uploadable) {
+ if (error.similarPosts) {
+ error.uploadable.lookalikes = error.similarPosts;
+ this._view.updateUploadable(error.uploadable);
+ this._view.showInfo(genericErrorMessage);
+ this._view.showInfo(
+ error.message,
+ error.uploadable
+ );
+ } else {
+ this._view.showError(genericErrorMessage);
+ this._view.showError(
+ error.message,
+ error.uploadable
+ );
+ }
} else {
- this._view.showError(genericErrorMessage);
- this._view.showError(
- error.message, error.uploadable);
+ this._view.showError(error.message);
}
- } else {
- this._view.showError(error.message);
+ this._view.enableForm();
}
- this._view.enableForm();
- });
+ );
}
_uploadSinglePost(uploadable, skipDuplicates) {
progress.start();
let reverseSearchPromise = Promise.resolve();
if (!uploadable.lookalikesConfirmed) {
- reverseSearchPromise =
- Post.reverseSearch(uploadable.url || uploadable.file);
+ reverseSearchPromise = Post.reverseSearch(
+ uploadable.url || uploadable.file
+ );
}
this._lastCancellablePromise = reverseSearchPromise;
- return reverseSearchPromise.then(searchResult => {
- if (searchResult) {
- // notify about exact duplicate
- if (searchResult.exactPost) {
- if (skipDuplicates) {
- this._view.removeUploadable(uploadable);
- return Promise.resolve();
- } else {
- let error = new Error('Post already uploaded ' +
- `(@${searchResult.exactPost.id})`);
+ return reverseSearchPromise
+ .then((searchResult) => {
+ if (searchResult) {
+ // notify about exact duplicate
+ if (searchResult.exactPost) {
+ if (skipDuplicates) {
+ this._view.removeUploadable(uploadable);
+ return Promise.resolve();
+ } else {
+ let error = new Error(
+ "Post already uploaded " +
+ `(@${searchResult.exactPost.id})`
+ );
+ error.uploadable = uploadable;
+ return Promise.reject(error);
+ }
+ }
+
+ // notify about similar posts
+ if (searchResult.similarPosts.length) {
+ let error = new Error(
+ `Found ${searchResult.similarPosts.length} similar ` +
+ "posts.\nYou can resume or discard this upload."
+ );
error.uploadable = uploadable;
+ error.similarPosts = searchResult.similarPosts;
return Promise.reject(error);
}
}
- // notify about similar posts
- if (searchResult.similarPosts.length) {
- let error = new Error(
- `Found ${searchResult.similarPosts.length} similar ` +
- 'posts.\nYou can resume or discard this upload.');
- error.uploadable = uploadable;
- error.similarPosts = searchResult.similarPosts;
- return Promise.reject(error);
- }
- }
-
- // no duplicates, proceed with saving
- let post = this._uploadableToPost(uploadable);
- let savePromise = post.save(uploadable.anonymous)
- .then(() => {
+ // no duplicates, proceed with saving
+ let post = this._uploadableToPost(uploadable);
+ let savePromise = post.save(uploadable.anonymous).then(() => {
this._view.removeUploadable(uploadable);
return Promise.resolve();
});
- this._lastCancellablePromise = savePromise;
- return savePromise;
- }).then(result => {
- progress.done();
- return Promise.resolve(result);
- }, error => {
- error.uploadable = uploadable;
- progress.done();
- return Promise.reject(error);
- });
+ this._lastCancellablePromise = savePromise;
+ return savePromise;
+ })
+ .then(
+ (result) => {
+ progress.done();
+ return Promise.resolve(result);
+ },
+ (error) => {
+ error.uploadable = uploadable;
+ progress.done();
+ return Promise.reject(error);
+ }
+ );
}
_uploadableToPost(uploadable) {
@@ -159,8 +181,8 @@ class PostUploadController {
}
}
-module.exports = router => {
- router.enter(['upload'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["upload"], (ctx, next) => {
ctx.controller = new PostUploadController();
});
};
diff --git a/client/js/controllers/settings_controller.js b/client/js/controllers/settings_controller.js
index 7765143..8cf2c1c 100644
--- a/client/js/controllers/settings_controller.js
+++ b/client/js/controllers/settings_controller.js
@@ -1,28 +1,28 @@
-'use strict';
+"use strict";
-const settings = require('../models/settings.js');
-const topNavigation = require('../models/top_navigation.js');
-const SettingsView = require('../views/settings_view.js');
+const settings = require("../models/settings.js");
+const topNavigation = require("../models/top_navigation.js");
+const SettingsView = require("../views/settings_view.js");
class SettingsController {
constructor() {
- topNavigation.activate('settings');
- topNavigation.setTitle('Browsing settings');
+ topNavigation.activate("settings");
+ topNavigation.setTitle("Browsing settings");
this._view = new SettingsView({
settings: settings.get(),
});
- this._view.addEventListener('submit', e => this._evtSubmit(e));
+ this._view.addEventListener("submit", (e) => this._evtSubmit(e));
}
_evtSubmit(e) {
this._view.clearMessages();
settings.save(e.detail);
- this._view.showSuccess('Settings saved.');
+ this._view.showSuccess("Settings saved.");
}
}
-module.exports = router => {
- router.enter(['settings'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["settings"], (ctx, next) => {
ctx.controller = new SettingsController();
});
};
diff --git a/client/js/controllers/snapshots_controller.js b/client/js/controllers/snapshots_controller.js
index 0e9b773..120b6cb 100644
--- a/client/js/controllers/snapshots_controller.js
+++ b/client/js/controllers/snapshots_controller.js
@@ -1,41 +1,43 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const uri = require('../util/uri.js');
-const SnapshotList = require('../models/snapshot_list.js');
-const PageController = require('../controllers/page_controller.js');
-const topNavigation = require('../models/top_navigation.js');
-const SnapshotsPageView = require('../views/snapshots_page_view.js');
-const EmptyView = require('../views/empty_view.js');
+const api = require("../api.js");
+const uri = require("../util/uri.js");
+const SnapshotList = require("../models/snapshot_list.js");
+const PageController = require("../controllers/page_controller.js");
+const topNavigation = require("../models/top_navigation.js");
+const SnapshotsPageView = require("../views/snapshots_page_view.js");
+const EmptyView = require("../views/empty_view.js");
class SnapshotsController {
constructor(ctx) {
- if (!api.hasPrivilege('snapshots:list')) {
+ if (!api.hasPrivilege("snapshots:list")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view history.');
+ this._view.showError("You don't have privileges to view history.");
return;
}
- topNavigation.activate('');
- topNavigation.setTitle('History');
+ topNavigation.activate("");
+ topNavigation.setTitle("History");
this._pageController = new PageController();
this._pageController.run({
parameters: ctx.parameters,
defaultLimit: 25,
getClientUrlForPage: (offset, limit) => {
- const parameters = Object.assign(
- {}, ctx.parameters, {offset: offset, limit: limit});
- return uri.formatClientLink('history', parameters);
+ const parameters = Object.assign({}, ctx.parameters, {
+ offset: offset,
+ limit: limit,
+ });
+ return uri.formatClientLink("history", parameters);
},
requestPage: (offset, limit) => {
- return SnapshotList.search('', offset, limit);
+ return SnapshotList.search("", offset, limit);
},
- pageRenderer: pageCtx => {
+ pageRenderer: (pageCtx) => {
Object.assign(pageCtx, {
- canViewPosts: api.hasPrivilege('posts:view'),
- canViewUsers: api.hasPrivilege('users:view'),
- canViewTags: api.hasPrivilege('tags:view'),
+ canViewPosts: api.hasPrivilege("posts:view"),
+ canViewUsers: api.hasPrivilege("users:view"),
+ canViewTags: api.hasPrivilege("tags:view"),
});
return new SnapshotsPageView(pageCtx);
},
@@ -43,9 +45,8 @@ class SnapshotsController {
}
}
-module.exports = router => {
- router.enter(['history'],
- (ctx, next) => {
- ctx.controller = new SnapshotsController(ctx);
- });
+module.exports = (router) => {
+ router.enter(["history"], (ctx, next) => {
+ ctx.controller = new SnapshotsController(ctx);
+ });
};
diff --git a/client/js/controllers/tag_categories_controller.js b/client/js/controllers/tag_categories_controller.js
index 49600cf..2470edb 100644
--- a/client/js/controllers/tag_categories_controller.js
+++ b/client/js/controllers/tag_categories_controller.js
@@ -1,57 +1,67 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const tags = require('../tags.js');
-const TagCategoryList = require('../models/tag_category_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const TagCategoriesView = require('../views/tag_categories_view.js');
-const EmptyView = require('../views/empty_view.js');
+const api = require("../api.js");
+const tags = require("../tags.js");
+const TagCategoryList = require("../models/tag_category_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const TagCategoriesView = require("../views/tag_categories_view.js");
+const EmptyView = require("../views/empty_view.js");
class TagCategoriesController {
constructor() {
- if (!api.hasPrivilege('tagCategories:list')) {
+ if (!api.hasPrivilege("tagCategories:list")) {
this._view = new EmptyView();
this._view.showError(
- 'You don\'t have privileges to view tag categories.');
+ "You don't have privileges to view tag categories."
+ );
return;
}
- topNavigation.activate('tags');
- topNavigation.setTitle('Listing tags');
- TagCategoryList.get().then(response => {
- this._tagCategories = response.results;
- this._view = new TagCategoriesView({
- tagCategories: this._tagCategories,
- canEditName: api.hasPrivilege('tagCategories:edit:name'),
- canEditColor: api.hasPrivilege('tagCategories:edit:color'),
- canDelete: api.hasPrivilege('tagCategories:delete'),
- canCreate: api.hasPrivilege('tagCategories:create'),
- canSetDefault: api.hasPrivilege('tagCategories:setDefault'),
- });
- this._view.addEventListener('submit', e => this._evtSubmit(e));
- }, error => {
- this._view = new EmptyView();
- this._view.showError(error.message);
- });
+ topNavigation.activate("tags");
+ topNavigation.setTitle("Listing tags");
+ TagCategoryList.get().then(
+ (response) => {
+ this._tagCategories = response.results;
+ this._view = new TagCategoriesView({
+ tagCategories: this._tagCategories,
+ canEditName: api.hasPrivilege("tagCategories:edit:name"),
+ canEditColor: api.hasPrivilege("tagCategories:edit:color"),
+ canDelete: api.hasPrivilege("tagCategories:delete"),
+ canCreate: api.hasPrivilege("tagCategories:create"),
+ canSetDefault: api.hasPrivilege(
+ "tagCategories:setDefault"
+ ),
+ });
+ this._view.addEventListener("submit", (e) =>
+ this._evtSubmit(e)
+ );
+ },
+ (error) => {
+ this._view = new EmptyView();
+ this._view.showError(error.message);
+ }
+ );
}
_evtSubmit(e) {
this._view.clearMessages();
this._view.disableForm();
- this._tagCategories.save()
- .then(() => {
+ this._tagCategories.save().then(
+ () => {
tags.refreshCategoryColorMap();
this._view.enableForm();
- this._view.showSuccess('Changes saved.');
- }, error => {
+ this._view.showSuccess("Changes saved.");
+ },
+ (error) => {
this._view.enableForm();
this._view.showError(error.message);
- });
+ }
+ );
}
}
-module.exports = router => {
- router.enter(['tag-categories'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["tag-categories"], (ctx, next) => {
ctx.controller = new TagCategoriesController(ctx, next);
});
};
diff --git a/client/js/controllers/tag_controller.js b/client/js/controllers/tag_controller.js
index 71405dc..0928b3f 100644
--- a/client/js/controllers/tag_controller.js
+++ b/client/js/controllers/tag_controller.js
@@ -1,63 +1,80 @@
-'use strict';
+"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 Tag = require('../models/tag.js');
-const TagCategoryList = require('../models/tag_category_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const TagView = require('../views/tag_view.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const misc = require("../util/misc.js");
+const uri = require("../util/uri.js");
+const Tag = require("../models/tag.js");
+const TagCategoryList = require("../models/tag_category_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const TagView = require("../views/tag_view.js");
+const EmptyView = require("../views/empty_view.js");
class TagController {
constructor(ctx, section) {
- if (!api.hasPrivilege('tags:view')) {
+ if (!api.hasPrivilege("tags:view")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view tags.');
+ this._view.showError("You don't have privileges to view tags.");
return;
}
Promise.all([
TagCategoryList.get(),
Tag.get(ctx.parameters.name),
- ]).then(responses => {
- const [tagCategoriesResponse, tag] = responses;
+ ]).then(
+ (responses) => {
+ const [tagCategoriesResponse, tag] = responses;
- topNavigation.activate('tags');
- topNavigation.setTitle('Tag #' + tag.names[0]);
+ topNavigation.activate("tags");
+ topNavigation.setTitle("Tag #" + tag.names[0]);
- this._name = ctx.parameters.name;
- tag.addEventListener('change', e => this._evtSaved(e, section));
+ this._name = ctx.parameters.name;
+ tag.addEventListener("change", (e) =>
+ this._evtSaved(e, section)
+ );
- const categories = {};
- for (let category of tagCategoriesResponse.results) {
- categories[category.name] = category.name;
- }
+ const categories = {};
+ for (let category of tagCategoriesResponse.results) {
+ categories[category.name] = category.name;
+ }
- this._view = new TagView({
- tag: tag,
- section: section,
- canEditAnything: api.hasPrivilege('tags:edit'),
- canEditNames: api.hasPrivilege('tags:edit:names'),
- canEditCategory: api.hasPrivilege('tags:edit:category'),
- canEditImplications: api.hasPrivilege('tags:edit:implications'),
- canEditSuggestions: api.hasPrivilege('tags:edit:suggestions'),
- canEditDescription: api.hasPrivilege('tags:edit:description'),
- canMerge: api.hasPrivilege('tags:merge'),
- canDelete: api.hasPrivilege('tags:delete'),
- categories: categories,
- escapeColons: uri.escapeColons,
- });
+ this._view = new TagView({
+ tag: tag,
+ section: section,
+ canEditAnything: api.hasPrivilege("tags:edit"),
+ canEditNames: api.hasPrivilege("tags:edit:names"),
+ canEditCategory: api.hasPrivilege("tags:edit:category"),
+ canEditImplications: api.hasPrivilege(
+ "tags:edit:implications"
+ ),
+ canEditSuggestions: api.hasPrivilege(
+ "tags:edit:suggestions"
+ ),
+ canEditDescription: api.hasPrivilege(
+ "tags:edit:description"
+ ),
+ canMerge: api.hasPrivilege("tags:merge"),
+ canDelete: api.hasPrivilege("tags: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);
- });
+ 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) {
@@ -68,9 +85,10 @@ class TagController {
misc.disableExitConfirmation();
if (this._name !== e.detail.tag.names[0]) {
router.replace(
- uri.formatClientLink('tag', e.detail.tag.names[0], section),
+ uri.formatClientLink("tag", e.detail.tag.names[0], section),
null,
- false);
+ false
+ );
}
}
@@ -86,59 +104,69 @@ class TagController {
if (e.detail.description !== undefined) {
e.detail.tag.description = e.detail.description;
}
- e.detail.tag.save().then(() => {
- this._view.showSuccess('Tag saved.');
- this._view.enableForm();
- }, error => {
- this._view.showError(error.message);
- this._view.enableForm();
- });
+ e.detail.tag.save().then(
+ () => {
+ this._view.showSuccess("Tag saved.");
+ this._view.enableForm();
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
}
_evtMerge(e) {
this._view.clearMessages();
this._view.disableForm();
- e.detail.tag
- .merge(e.detail.targetTagName, e.detail.addAlias)
- .then(() => {
- this._view.showSuccess('Tag merged.');
+ e.detail.tag.merge(e.detail.targetTagName, e.detail.addAlias).then(
+ () => {
+ this._view.showSuccess("Tag merged.");
this._view.enableForm();
router.replace(
uri.formatClientLink(
- 'tag', e.detail.targetTagName, 'merge'),
+ "tag",
+ e.detail.targetTagName,
+ "merge"
+ ),
null,
- false);
- }, error => {
+ false
+ );
+ },
+ (error) => {
this._view.showError(error.message);
this._view.enableForm();
- });
+ }
+ );
}
_evtDelete(e) {
this._view.clearMessages();
this._view.disableForm();
- e.detail.tag.delete()
- .then(() => {
- const ctx = router.show(uri.formatClientLink('tags'));
- ctx.controller.showSuccess('Tag deleted.');
- }, error => {
+ e.detail.tag.delete().then(
+ () => {
+ const ctx = router.show(uri.formatClientLink("tags"));
+ ctx.controller.showSuccess("Tag deleted.");
+ },
+ (error) => {
this._view.showError(error.message);
this._view.enableForm();
- });
+ }
+ );
}
}
-module.exports = router => {
- router.enter(['tag', ':name', 'edit'], (ctx, next) => {
- ctx.controller = new TagController(ctx, 'edit');
+module.exports = (router) => {
+ router.enter(["tag", ":name", "edit"], (ctx, next) => {
+ ctx.controller = new TagController(ctx, "edit");
});
- router.enter(['tag', ':name', 'merge'], (ctx, next) => {
- ctx.controller = new TagController(ctx, 'merge');
+ router.enter(["tag", ":name", "merge"], (ctx, next) => {
+ ctx.controller = new TagController(ctx, "merge");
});
- router.enter(['tag', ':name', 'delete'], (ctx, next) => {
- ctx.controller = new TagController(ctx, 'delete');
+ router.enter(["tag", ":name", "delete"], (ctx, next) => {
+ ctx.controller = new TagController(ctx, "delete");
});
- router.enter(['tag', ':name'], (ctx, next) => {
- ctx.controller = new TagController(ctx, 'summary');
+ router.enter(["tag", ":name"], (ctx, next) => {
+ ctx.controller = new TagController(ctx, "summary");
});
};
diff --git a/client/js/controllers/tag_list_controller.js b/client/js/controllers/tag_list_controller.js
index 34ff8b2..010c556 100644
--- a/client/js/controllers/tag_list_controller.js
+++ b/client/js/controllers/tag_list_controller.js
@@ -1,46 +1,47 @@
-'use strict';
+"use strict";
-const router = require('../router.js');
-const api = require('../api.js');
-const uri = require('../util/uri.js');
-const TagList = require('../models/tag_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const PageController = require('../controllers/page_controller.js');
-const TagsHeaderView = require('../views/tags_header_view.js');
-const TagsPageView = require('../views/tags_page_view.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const uri = require("../util/uri.js");
+const TagList = require("../models/tag_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const PageController = require("../controllers/page_controller.js");
+const TagsHeaderView = require("../views/tags_header_view.js");
+const TagsPageView = require("../views/tags_page_view.js");
+const EmptyView = require("../views/empty_view.js");
const fields = [
- 'names',
- 'suggestions',
- 'implications',
- 'creationTime',
- 'usages',
- 'category'
+ "names",
+ "suggestions",
+ "implications",
+ "creationTime",
+ "usages",
+ "category",
];
class TagListController {
constructor(ctx) {
this._pageController = new PageController();
- if (!api.hasPrivilege('tags:list')) {
+ if (!api.hasPrivilege("tags:list")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view tags.');
+ this._view.showError("You don't have privileges to view tags.");
return;
}
this._ctx = ctx;
- topNavigation.activate('tags');
- topNavigation.setTitle('Listing tags');
+ topNavigation.activate("tags");
+ topNavigation.setTitle("Listing tags");
this._headerView = new TagsHeaderView({
hostNode: this._pageController.view.pageHeaderHolderNode,
parameters: ctx.parameters,
- canEditTagCategories: api.hasPrivilege('tagCategories:edit'),
+ canEditTagCategories: api.hasPrivilege("tagCategories:edit"),
});
- this._headerView.addEventListener(
- 'navigate', e => this._evtNavigate(e));
+ this._headerView.addEventListener("navigate", (e) =>
+ this._evtNavigate(e)
+ );
this._syncPageController();
}
@@ -55,7 +56,8 @@ class TagListController {
_evtNavigate(e) {
router.showNoDispatch(
- uri.formatClientLink('tags', e.detail.parameters));
+ uri.formatClientLink("tags", e.detail.parameters)
+ );
Object.assign(this._ctx.parameters, e.detail.parameters);
this._syncPageController();
}
@@ -65,25 +67,29 @@ class TagListController {
parameters: this._ctx.parameters,
defaultLimit: 50,
getClientUrlForPage: (offset, limit) => {
- const parameters = Object.assign(
- {}, this._ctx.parameters, {offset: offset, limit: limit});
- return uri.formatClientLink('tags', parameters);
+ const parameters = Object.assign({}, this._ctx.parameters, {
+ offset: offset,
+ limit: limit,
+ });
+ return uri.formatClientLink("tags", parameters);
},
requestPage: (offset, limit) => {
return TagList.search(
- this._ctx.parameters.query, offset, limit, fields);
+ this._ctx.parameters.query,
+ offset,
+ limit,
+ fields
+ );
},
- pageRenderer: pageCtx => {
+ pageRenderer: (pageCtx) => {
return new TagsPageView(pageCtx);
},
});
}
}
-module.exports = router => {
- router.enter(
- ['tags'],
- (ctx, next) => {
- ctx.controller = new TagListController(ctx);
- });
+module.exports = (router) => {
+ router.enter(["tags"], (ctx, next) => {
+ ctx.controller = new TagListController(ctx);
+ });
};
diff --git a/client/js/controllers/top_navigation_controller.js b/client/js/controllers/top_navigation_controller.js
index 9cd70c1..d9bb276 100644
--- a/client/js/controllers/top_navigation_controller.js
+++ b/client/js/controllers/top_navigation_controller.js
@@ -1,19 +1,20 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const topNavigation = require('../models/top_navigation.js');
-const TopNavigationView = require('../views/top_navigation_view.js');
+const api = require("../api.js");
+const topNavigation = require("../models/top_navigation.js");
+const TopNavigationView = require("../views/top_navigation_view.js");
class TopNavigationController {
constructor() {
api.fetchConfig().then(() => {
this._topNavigationView = new TopNavigationView();
- topNavigation.addEventListener(
- 'activate', e => this._evtActivate(e));
+ topNavigation.addEventListener("activate", (e) =>
+ this._evtActivate(e)
+ );
- api.addEventListener('login', e => this._evtAuthChange(e));
- api.addEventListener('logout', e => this._evtAuthChange(e));
+ api.addEventListener("login", (e) => this._evtAuthChange(e));
+ api.addEventListener("logout", (e) => this._evtAuthChange(e));
this._render();
});
@@ -28,37 +29,38 @@ class TopNavigationController {
}
_updateNavigationFromPrivileges() {
- topNavigation.get('account').url = 'user/' + api.userName;
- topNavigation.get('account').imageUrl =
- api.user ? api.user.avatarUrl : null;
+ topNavigation.get("account").url = "user/" + api.userName;
+ topNavigation.get("account").imageUrl = api.user
+ ? api.user.avatarUrl
+ : null;
topNavigation.showAll();
- if (!api.hasPrivilege('posts:list')) {
- topNavigation.hide('posts');
+ if (!api.hasPrivilege("posts:list")) {
+ topNavigation.hide("posts");
}
- if (!api.hasPrivilege('posts:create')) {
- topNavigation.hide('upload');
+ if (!api.hasPrivilege("posts:create")) {
+ topNavigation.hide("upload");
}
- if (!api.hasPrivilege('comments:list')) {
- topNavigation.hide('comments');
+ if (!api.hasPrivilege("comments:list")) {
+ topNavigation.hide("comments");
}
- if (!api.hasPrivilege('tags:list')) {
- topNavigation.hide('tags');
+ if (!api.hasPrivilege("tags:list")) {
+ topNavigation.hide("tags");
}
- if (!api.hasPrivilege('users:list')) {
- topNavigation.hide('users');
+ if (!api.hasPrivilege("users:list")) {
+ topNavigation.hide("users");
}
if (api.isLoggedIn()) {
- if (!api.hasPrivilege('users:create:any')) {
- topNavigation.hide('register');
+ if (!api.hasPrivilege("users:create:any")) {
+ topNavigation.hide("register");
}
- topNavigation.hide('login');
+ topNavigation.hide("login");
} else {
- if (!api.hasPrivilege('users:create:self')) {
- topNavigation.hide('register');
+ if (!api.hasPrivilege("users:create:self")) {
+ topNavigation.hide("register");
}
- topNavigation.hide('account');
- topNavigation.hide('logout');
+ topNavigation.hide("account");
+ topNavigation.hide("logout");
}
}
@@ -66,10 +68,11 @@ class TopNavigationController {
this._updateNavigationFromPrivileges();
this._topNavigationView.render({
items: topNavigation.getAll(),
- name: api.getName()
+ name: api.getName(),
});
this._topNavigationView.activate(
- topNavigation.activeItem ? topNavigation.activeItem.key : '');
+ topNavigation.activeItem ? topNavigation.activeItem.key : ""
+ );
}
}
diff --git a/client/js/controllers/user_controller.js b/client/js/controllers/user_controller.js
index e192d87..326736b 100644
--- a/client/js/controllers/user_controller.js
+++ b/client/js/controllers/user_controller.js
@@ -1,23 +1,25 @@
-'use strict';
+"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 views = require('../util/views.js');
-const User = require('../models/user.js');
-const UserToken = require('../models/user_token.js');
-const topNavigation = require('../models/top_navigation.js');
-const UserView = require('../views/user_view.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const uri = require("../util/uri.js");
+const misc = require("../util/misc.js");
+const views = require("../util/views.js");
+const User = require("../models/user.js");
+const UserToken = require("../models/user_token.js");
+const topNavigation = require("../models/top_navigation.js");
+const UserView = require("../views/user_view.js");
+const EmptyView = require("../views/empty_view.js");
class UserController {
constructor(ctx, section) {
const userName = ctx.parameters.name;
- if (!api.hasPrivilege('users:view') &&
- !api.isLoggedIn({name: userName})) {
+ if (
+ !api.hasPrivilege("users:view") &&
+ !api.isLoggedIn({ name: userName })
+ ) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view users.');
+ this._view.showError("You don't have privileges to view users.");
return;
}
@@ -25,100 +27,129 @@ class UserController {
this._errorMessages = [];
let userTokenPromise = Promise.resolve([]);
- if (section === 'list-tokens') {
- userTokenPromise = UserToken.get(userName)
- .then(userTokens => {
- return userTokens.map(token => {
- token.isCurrentAuthToken = api.isCurrentAuthToken(token);
+ if (section === "list-tokens") {
+ userTokenPromise = UserToken.get(userName).then(
+ (userTokens) => {
+ return userTokens.map((token) => {
+ token.isCurrentAuthToken = api.isCurrentAuthToken(
+ token
+ );
return token;
});
- }, error => {
+ },
+ (error) => {
return [];
- });
+ }
+ );
}
- topNavigation.setTitle('User ' + userName);
- Promise.all([
- userTokenPromise,
- User.get(userName)
- ]).then(responses => {
- const [userTokens, user] = responses;
- const isLoggedIn = api.isLoggedIn(user);
- const infix = isLoggedIn ? 'self' : 'any';
+ topNavigation.setTitle("User " + userName);
+ Promise.all([userTokenPromise, User.get(userName)]).then(
+ (responses) => {
+ const [userTokens, user] = responses;
+ const isLoggedIn = api.isLoggedIn(user);
+ const infix = isLoggedIn ? "self" : "any";
- this._name = userName;
- user.addEventListener('change', e => this._evtSaved(e, section));
+ this._name = userName;
+ user.addEventListener("change", (e) =>
+ this._evtSaved(e, section)
+ );
- const myRankIndex = api.user ?
- api.allRanks.indexOf(api.user.rank) :
- 0;
- let ranks = {};
- for (let [rankIdx, rankIdentifier] of api.allRanks.entries()) {
- if (rankIdentifier === 'anonymous') {
- continue;
+ const myRankIndex = api.user
+ ? api.allRanks.indexOf(api.user.rank)
+ : 0;
+ let ranks = {};
+ for (let [rankIdx, rankIdentifier] of api.allRanks.entries()) {
+ if (rankIdentifier === "anonymous") {
+ continue;
+ }
+ if (rankIdx > myRankIndex) {
+ continue;
+ }
+ ranks[rankIdentifier] = api.rankNames.get(rankIdentifier);
}
- if (rankIdx > myRankIndex) {
- continue;
- }
- ranks[rankIdentifier] = api.rankNames.get(rankIdentifier);
- }
- if (isLoggedIn) {
- topNavigation.activate('account');
- } else {
- topNavigation.activate('users');
- }
+ if (isLoggedIn) {
+ topNavigation.activate("account");
+ } else {
+ topNavigation.activate("users");
+ }
- this._view = new UserView({
- user: user,
- section: section,
- isLoggedIn: isLoggedIn,
- canEditName: api.hasPrivilege(`users:edit:${infix}:name`),
- canEditPassword: api.hasPrivilege(`users:edit:${infix}:pass`),
- canEditEmail: api.hasPrivilege(`users:edit:${infix}:email`),
- canEditRank: api.hasPrivilege(`users:edit:${infix}:rank`),
- canEditAvatar: api.hasPrivilege(`users:edit:${infix}:avatar`),
- canEditAnything: api.hasPrivilege(`users:edit:${infix}`),
- canListTokens: api.hasPrivilege(`userTokens:list:${infix}`),
- canCreateToken: api.hasPrivilege(`userTokens:create:${infix}`),
- canEditToken: api.hasPrivilege(`userTokens:edit:${infix}`),
- canDeleteToken: api.hasPrivilege(`userTokens:delete:${infix}`),
- canDelete: api.hasPrivilege(`users:delete:${infix}`),
- ranks: ranks,
- tokens: userTokens,
- });
- this._view.addEventListener('change', e => this._evtChange(e));
- this._view.addEventListener('submit', e => this._evtUpdate(e));
- this._view.addEventListener('delete', e => this._evtDelete(e));
- this._view.addEventListener('create-token', e => this._evtCreateToken(e));
- this._view.addEventListener('delete-token', e => this._evtDeleteToken(e));
- this._view.addEventListener('update-token', e => this._evtUpdateToken(e));
+ this._view = new UserView({
+ user: user,
+ section: section,
+ isLoggedIn: isLoggedIn,
+ canEditName: api.hasPrivilege(`users:edit:${infix}:name`),
+ canEditPassword: api.hasPrivilege(
+ `users:edit:${infix}:pass`
+ ),
+ canEditEmail: api.hasPrivilege(
+ `users:edit:${infix}:email`
+ ),
+ canEditRank: api.hasPrivilege(`users:edit:${infix}:rank`),
+ canEditAvatar: api.hasPrivilege(
+ `users:edit:${infix}:avatar`
+ ),
+ canEditAnything: api.hasPrivilege(`users:edit:${infix}`),
+ canListTokens: api.hasPrivilege(
+ `userTokens:list:${infix}`
+ ),
+ canCreateToken: api.hasPrivilege(
+ `userTokens:create:${infix}`
+ ),
+ canEditToken: api.hasPrivilege(`userTokens:edit:${infix}`),
+ canDeleteToken: api.hasPrivilege(
+ `userTokens:delete:${infix}`
+ ),
+ canDelete: api.hasPrivilege(`users:delete:${infix}`),
+ ranks: ranks,
+ tokens: userTokens,
+ });
+ this._view.addEventListener("change", (e) =>
+ this._evtChange(e)
+ );
+ this._view.addEventListener("submit", (e) =>
+ this._evtUpdate(e)
+ );
+ this._view.addEventListener("delete", (e) =>
+ this._evtDelete(e)
+ );
+ this._view.addEventListener("create-token", (e) =>
+ this._evtCreateToken(e)
+ );
+ this._view.addEventListener("delete-token", (e) =>
+ this._evtDeleteToken(e)
+ );
+ this._view.addEventListener("update-token", (e) =>
+ this._evtUpdateToken(e)
+ );
- for (let message of this._successMessages) {
- this.showSuccess(message);
- }
+ for (let message of this._successMessages) {
+ this.showSuccess(message);
+ }
- for (let message of this._errorMessages) {
- this.showError(message);
+ for (let message of this._errorMessages) {
+ this.showError(message);
+ }
+ },
+ (error) => {
+ this._view = new EmptyView();
+ this._view.showError(error.message);
}
-
- }, error => {
- this._view = new EmptyView();
- this._view.showError(error.message);
- });
+ );
}
showSuccess(message) {
- if (typeof this._view === 'undefined') {
- this._successMessages.push(message)
+ if (typeof this._view === "undefined") {
+ this._successMessages.push(message);
} else {
this._view.showSuccess(message);
}
}
showError(message) {
- if (typeof this._view === 'undefined') {
- this._errorMessages.push(message)
+ if (typeof this._view === "undefined") {
+ this._errorMessages.push(message);
} else {
this._view.showError(message);
}
@@ -132,9 +163,10 @@ class UserController {
misc.disableExitConfirmation();
if (this._name !== e.detail.user.name) {
router.replace(
- uri.formatClientLink('user', e.detail.user.name, section),
+ uri.formatClientLink("user", e.detail.user.name, section),
null,
- false);
+ false
+ );
}
}
@@ -142,7 +174,7 @@ class UserController {
this._view.clearMessages();
this._view.disableForm();
const isLoggedIn = api.isLoggedIn(e.detail.user);
- const infix = isLoggedIn ? 'self' : 'any';
+ const infix = isLoggedIn ? "self" : "any";
if (e.detail.name !== undefined) {
e.detail.user.name = e.detail.name;
@@ -165,72 +197,105 @@ class UserController {
}
}
- e.detail.user.save().then(() => {
- return isLoggedIn ?
- api.login(
- e.detail.name || api.userName,
- e.detail.password || api.userPassword,
- false) :
- Promise.resolve();
- }).then(() => {
- this._view.showSuccess('Settings updated.');
- this._view.enableForm();
- }, error => {
- this._view.showError(error.message);
- this._view.enableForm();
- });
+ e.detail.user
+ .save()
+ .then(() => {
+ return isLoggedIn
+ ? api.login(
+ e.detail.name || api.userName,
+ e.detail.password || api.userPassword,
+ false
+ )
+ : Promise.resolve();
+ })
+ .then(
+ () => {
+ this._view.showSuccess("Settings updated.");
+ this._view.enableForm();
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
}
_evtDelete(e) {
this._view.clearMessages();
this._view.disableForm();
const isLoggedIn = api.isLoggedIn(e.detail.user);
- e.detail.user.delete()
- .then(() => {
+ e.detail.user.delete().then(
+ () => {
if (isLoggedIn) {
api.forget();
api.logout();
}
- if (api.hasPrivilege('users:list')) {
- const ctx = router.show(uri.formatClientLink('users'));
- ctx.controller.showSuccess('Account deleted.');
+ if (api.hasPrivilege("users:list")) {
+ const ctx = router.show(uri.formatClientLink("users"));
+ ctx.controller.showSuccess("Account deleted.");
} else {
const ctx = router.show(uri.formatClientLink());
- ctx.controller.showSuccess('Account deleted.');
+ ctx.controller.showSuccess("Account deleted.");
}
- }, error => {
+ },
+ (error) => {
this._view.showError(error.message);
this._view.enableForm();
- });
+ }
+ );
}
_evtCreateToken(e) {
this._view.clearMessages();
this._view.disableForm();
- UserToken.create(e.detail.user.name, e.detail.note, e.detail.expirationTime)
- .then(response => {
- const ctx = router.show(uri.formatClientLink('user', e.detail.user.name, 'list-tokens'));
- ctx.controller.showSuccess('Token ' + response.token + ' created.');
- }, error => {
+ UserToken.create(
+ e.detail.user.name,
+ e.detail.note,
+ e.detail.expirationTime
+ ).then(
+ (response) => {
+ const ctx = router.show(
+ uri.formatClientLink(
+ "user",
+ e.detail.user.name,
+ "list-tokens"
+ )
+ );
+ ctx.controller.showSuccess(
+ "Token " + response.token + " created."
+ );
+ },
+ (error) => {
this._view.showError(error.message);
this._view.enableForm();
- });
+ }
+ );
}
_evtDeleteToken(e) {
this._view.clearMessages();
this._view.disableForm();
if (api.isCurrentAuthToken(e.detail.userToken)) {
- router.show(uri.formatClientLink('logout'));
+ router.show(uri.formatClientLink("logout"));
} else {
- e.detail.userToken.delete(e.detail.user.name)
- .then(() => {
- const ctx = router.show(uri.formatClientLink('user', e.detail.user.name, 'list-tokens'));
- ctx.controller.showSuccess('Token ' + e.detail.userToken.token + ' deleted.');
- }, error => {
+ e.detail.userToken.delete(e.detail.user.name).then(
+ () => {
+ const ctx = router.show(
+ uri.formatClientLink(
+ "user",
+ e.detail.user.name,
+ "list-tokens"
+ )
+ );
+ ctx.controller.showSuccess(
+ "Token " + e.detail.userToken.token + " deleted."
+ );
+ },
+ (error) => {
this._view.showError(error.message);
this._view.enableForm();
- });
+ }
+ );
}
}
@@ -242,27 +307,38 @@ class UserController {
e.detail.userToken.note = e.detail.note;
}
- e.detail.userToken.save(e.detail.user.name).then(response => {
- const ctx = router.show(uri.formatClientLink('user', e.detail.user.name, 'list-tokens'));
- ctx.controller.showSuccess('Token ' + response.token + ' updated.');
- }, error => {
- this._view.showError(error.message);
- this._view.enableForm();
- });
+ e.detail.userToken.save(e.detail.user.name).then(
+ (response) => {
+ const ctx = router.show(
+ uri.formatClientLink(
+ "user",
+ e.detail.user.name,
+ "list-tokens"
+ )
+ );
+ ctx.controller.showSuccess(
+ "Token " + response.token + " updated."
+ );
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
}
}
-module.exports = router => {
- router.enter(['user', ':name'], (ctx, next) => {
- ctx.controller = new UserController(ctx, 'summary');
+module.exports = (router) => {
+ router.enter(["user", ":name"], (ctx, next) => {
+ ctx.controller = new UserController(ctx, "summary");
});
- router.enter(['user', ':name', 'edit'], (ctx, next) => {
- ctx.controller = new UserController(ctx, 'edit');
+ router.enter(["user", ":name", "edit"], (ctx, next) => {
+ ctx.controller = new UserController(ctx, "edit");
});
- router.enter(['user', ':name', 'list-tokens'], (ctx, next) => {
- ctx.controller = new UserController(ctx, 'list-tokens');
+ router.enter(["user", ":name", "list-tokens"], (ctx, next) => {
+ ctx.controller = new UserController(ctx, "list-tokens");
});
- router.enter(['user', ':name', 'delete'], (ctx, next) => {
- ctx.controller = new UserController(ctx, 'delete');
+ router.enter(["user", ":name", "delete"], (ctx, next) => {
+ ctx.controller = new UserController(ctx, "delete");
});
};
diff --git a/client/js/controllers/user_list_controller.js b/client/js/controllers/user_list_controller.js
index 9860de4..d6c4fe5 100644
--- a/client/js/controllers/user_list_controller.js
+++ b/client/js/controllers/user_list_controller.js
@@ -1,27 +1,27 @@
-'use strict';
+"use strict";
-const api = require('../api.js');
-const router = require('../router.js');
-const uri = require('../util/uri.js');
-const UserList = require('../models/user_list.js');
-const topNavigation = require('../models/top_navigation.js');
-const PageController = require('../controllers/page_controller.js');
-const UsersHeaderView = require('../views/users_header_view.js');
-const UsersPageView = require('../views/users_page_view.js');
-const EmptyView = require('../views/empty_view.js');
+const api = require("../api.js");
+const router = require("../router.js");
+const uri = require("../util/uri.js");
+const UserList = require("../models/user_list.js");
+const topNavigation = require("../models/top_navigation.js");
+const PageController = require("../controllers/page_controller.js");
+const UsersHeaderView = require("../views/users_header_view.js");
+const UsersPageView = require("../views/users_page_view.js");
+const EmptyView = require("../views/empty_view.js");
class UserListController {
constructor(ctx) {
this._pageController = new PageController();
- if (!api.hasPrivilege('users:list')) {
+ if (!api.hasPrivilege("users:list")) {
this._view = new EmptyView();
- this._view.showError('You don\'t have privileges to view users.');
+ this._view.showError("You don't have privileges to view users.");
return;
}
- topNavigation.activate('users');
- topNavigation.setTitle('Listing users');
+ topNavigation.activate("users");
+ topNavigation.setTitle("Listing users");
this._ctx = ctx;
@@ -29,8 +29,9 @@ class UserListController {
hostNode: this._pageController.view.pageHeaderHolderNode,
parameters: ctx.parameters,
});
- this._headerView.addEventListener(
- 'navigate', e => this._evtNavigate(e));
+ this._headerView.addEventListener("navigate", (e) =>
+ this._evtNavigate(e)
+ );
this._syncPageController();
}
@@ -41,7 +42,8 @@ class UserListController {
_evtNavigate(e) {
router.showNoDispatch(
- uri.formatClientLink('users', e.detail.parameters));
+ uri.formatClientLink("users", e.detail.parameters)
+ );
Object.assign(this._ctx.parameters, e.detail.parameters);
this._syncPageController();
}
@@ -51,17 +53,22 @@ class UserListController {
parameters: this._ctx.parameters,
defaultLimit: 30,
getClientUrlForPage: (offset, limit) => {
- const parameters = Object.assign(
- {}, this._ctx.parameters, {offset: offset, limit: limit});
- return uri.formatClientLink('users', parameters);
+ const parameters = Object.assign({}, this._ctx.parameters, {
+ offset: offset,
+ limit: limit,
+ });
+ return uri.formatClientLink("users", parameters);
},
requestPage: (offset, limit) => {
return UserList.search(
- this._ctx.parameters.query, offset, limit);
+ this._ctx.parameters.query,
+ offset,
+ limit
+ );
},
- pageRenderer: pageCtx => {
+ pageRenderer: (pageCtx) => {
Object.assign(pageCtx, {
- canViewUsers: api.hasPrivilege('users:view'),
+ canViewUsers: api.hasPrivilege("users:view"),
});
return new UsersPageView(pageCtx);
},
@@ -69,10 +76,8 @@ class UserListController {
}
}
-module.exports = router => {
- router.enter(
- ['users'],
- (ctx, next) => {
- ctx.controller = new UserListController(ctx);
- });
+module.exports = (router) => {
+ router.enter(["users"], (ctx, next) => {
+ ctx.controller = new UserListController(ctx);
+ });
};
diff --git a/client/js/controllers/user_registration_controller.js b/client/js/controllers/user_registration_controller.js
index 78b9402..89cfd8c 100644
--- a/client/js/controllers/user_registration_controller.js
+++ b/client/js/controllers/user_registration_controller.js
@@ -1,25 +1,25 @@
-'use strict';
+"use strict";
-const router = require('../router.js');
-const api = require('../api.js');
-const uri = require('../util/uri.js');
-const User = require('../models/user.js');
-const topNavigation = require('../models/top_navigation.js');
-const RegistrationView = require('../views/registration_view.js');
-const EmptyView = require('../views/empty_view.js');
+const router = require("../router.js");
+const api = require("../api.js");
+const uri = require("../util/uri.js");
+const User = require("../models/user.js");
+const topNavigation = require("../models/top_navigation.js");
+const RegistrationView = require("../views/registration_view.js");
+const EmptyView = require("../views/empty_view.js");
class UserRegistrationController {
constructor() {
- if (!api.hasPrivilege('users:create:self')) {
+ if (!api.hasPrivilege("users:create:self")) {
this._view = new EmptyView();
- this._view.showError('Registration is closed.');
+ this._view.showError("Registration is closed.");
return;
}
- topNavigation.activate('register');
- topNavigation.setTitle('Registration');
+ topNavigation.activate("register");
+ topNavigation.setTitle("Registration");
this._view = new RegistrationView();
- this._view.addEventListener('submit', e => this._evtRegister(e));
+ this._view.addEventListener("submit", (e) => this._evtRegister(e));
}
_evtRegister(e) {
@@ -30,30 +30,35 @@ class UserRegistrationController {
user.email = e.detail.email;
user.password = e.detail.password;
const isLoggedIn = api.isLoggedIn();
- user.save().then(() => {
- if (isLoggedIn) {
- return Promise.resolve();
- } else {
- api.forget();
- return api.login(e.detail.name, e.detail.password, false);
- }
- }).then(() => {
- if (isLoggedIn) {
- const ctx = router.show(uri.formatClientLink('users'));
- ctx.controller.showSuccess('User added!');
- } else {
- const ctx = router.show(uri.formatClientLink());
- ctx.controller.showSuccess('Welcome aboard!');
- }
- }, error => {
- this._view.showError(error.message);
- this._view.enableForm();
- });
+ user.save()
+ .then(() => {
+ if (isLoggedIn) {
+ return Promise.resolve();
+ } else {
+ api.forget();
+ return api.login(e.detail.name, e.detail.password, false);
+ }
+ })
+ .then(
+ () => {
+ if (isLoggedIn) {
+ const ctx = router.show(uri.formatClientLink("users"));
+ ctx.controller.showSuccess("User added!");
+ } else {
+ const ctx = router.show(uri.formatClientLink());
+ ctx.controller.showSuccess("Welcome aboard!");
+ }
+ },
+ (error) => {
+ this._view.showError(error.message);
+ this._view.enableForm();
+ }
+ );
}
}
-module.exports = router => {
- router.enter(['register'], (ctx, next) => {
+module.exports = (router) => {
+ router.enter(["register"], (ctx, next) => {
new UserRegistrationController();
});
};

© 2015 - 2026 Jakob L. Kreuze