"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", "posts", "creationTime", "postCount", "category", ]; class PoolListController { constructor(ctx) { this._pageController = new PageController(); if (!api.hasPrivilege("pools:list")) { this._view = new EmptyView(); this._view.showError("You don't have privileges to view pools."); return; } this._ctx = ctx; 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"), }); 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); }); };