diff options
| author | Ruin0x11 <ipickering2@gmail.com> | 2020-05-03 19:53:28 -0700 |
|---|---|---|
| committer | Ruin0x11 <ipickering2@gmail.com> | 2020-05-03 19:53:28 -0700 |
| commit | d59ecb8e230a55e6875076824723580bd3f4419b (patch) | |
| tree | 34121668a4abb61fdeff0639d0c9567d0c398692 /client/js/controllers/pool_list_controller.js | |
| parent | 6a95a66f12a5407cfd8ffa7e373f756236bf0bce (diff) | |
Add pool CRUD operations/pages
Diffstat (limited to 'client/js/controllers/pool_list_controller.js')
| -rw-r--r-- | client/js/controllers/pool_list_controller.js | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/client/js/controllers/pool_list_controller.js b/client/js/controllers/pool_list_controller.js new file mode 100644 index 0000000..626dc1e --- /dev/null +++ b/client/js/controllers/pool_list_controller.js @@ -0,0 +1,105 @@ +'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 fields = [ + 'id', + 'names', + /* 'suggestions', + * 'implications', */ + 'creationTime', + 'postCount', + 'category']; + +class PoolListController { + constructor(ctx) { + if (!api.hasPrivilege('pools:list')) { + this._view = new EmptyView(); + this._view.showError('You don\'t have privileges to view pools.'); + return; + } + + topNavigation.activate('pools'); + topNavigation.setTitle('Listing pools'); + + this._ctx = ctx; + this._pageController = new PageController(); + + this._headerView = new PoolsHeaderView({ + hostNode: this._pageController.view.pageHeaderHolderNode, + parameters: ctx.parameters, + canCreate: api.hasPrivilege('pools:create'), + canEditPoolCategories: api.hasPrivilege('poolCategories:edit'), + }); + this._headerView.addEventListener( + 'submit', e => this._evtSubmit(e), + 'navigate', e => this._evtNavigate(e)); + + this._syncPageController(); + } + + showSuccess(message) { + this._pageController.showSuccess(message); + } + + showError(message) { + this._pageController.showError(message); + } + + _evtSubmit(e) { + this._view.clearMessages(); + this._view.disableForm(); + 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'), + null, false); + }, error => { + this._view.showError(error.message); + this._view.enableForm(); + }); + } + + _evtNavigate(e) { + router.showNoDispatch( + uri.formatClientLink('pools', e.detail.parameters)); + Object.assign(this._ctx.parameters, e.detail.parameters); + this._syncPageController(); + } + + _syncPageController() { + this._pageController.run({ + 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); + }, + requestPage: (offset, limit) => { + return PoolList.search( + this._ctx.parameters.query, offset, limit, fields); + }, + pageRenderer: pageCtx => { + return new PoolsPageView(pageCtx); + }, + }); + } +} + +module.exports = router => { + router.enter( + ['pools'], + (ctx, next) => { ctx.controller = new PoolListController(ctx); }); +}; |