| /******************************************************************************* |
| * Copyright (c) 2014-2018 BSI Business Systems Integration AG. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * BSI Business Systems Integration AG - initial API and implementation |
| ******************************************************************************/ |
| /** |
| * This class is used differently in online and JS-only case. In the online case we only have instances |
| * of Page in an outline. The server sets the property <code>nodeType</code> which is used to distinct |
| * between pages with tables and pages with nodes in some cases. In the JS only case, Page is an abstract |
| * class and is never instantiated directly, instead we always use subclasses of PageWithTable or PageWithNodes. |
| * Implementations of these classes contain code which loads table data or child nodes. |
| * |
| * @class |
| * @extends scout.TreeNode |
| */ |
| scout.Page = function() { |
| scout.Page.parent.call(this); |
| |
| /** |
| * This property is set by the server, see: JsonOutline#putNodeType. |
| */ |
| this.nodeType = null; |
| this.detailTable = null; |
| this.detailTableVisible = true; |
| this.detailForm = null; |
| this.detailFormVisible = true; |
| this.detailFormVisibleByUi = true; |
| |
| /** |
| * This property contains the class-name of the form to be instantiated, when createDetailForm() is called. |
| */ |
| this.detailFormType = null; |
| this.tableStatusVisible = true; |
| /** |
| * True to select the page linked with the selected row when the row was selected. May be useful on touch devices. |
| */ |
| this.drillDownOnRowClick = false; |
| /** |
| * The icon id which is used for icons in the tile outline overview. |
| */ |
| this.overviewIconId = null; |
| }; |
| scout.inherits(scout.Page, scout.TreeNode); |
| |
| /** |
| * This enum defines a node-type. This is basically used for the online case where we only have instances |
| * of scout.Page, but never instances of PageWithTable or PageWithNodes. The server simply sets a nodeType |
| * instead. |
| * |
| * @type {{NODES: string, TABLE: string}} |
| */ |
| scout.Page.NodeType = { |
| NODES: 'nodes', |
| TABLE: 'table' |
| }; |
| |
| /** |
| * Override this function to return a detail form which is displayed in the outline when this page is selected. |
| * The default impl. returns null. |
| */ |
| scout.Page.prototype.createDetailForm = function() { |
| return null; |
| }; |
| |
| /** |
| * @override TreeNode.js |
| */ |
| scout.Page.prototype._init = function(model) { |
| scout.Page.parent.prototype._init.call(this, model); |
| scout.icons.resolveIconProperty(this, 'overviewIconId'); |
| this._internalInitTable(); |
| this._internalInitDetailForm(); |
| }; |
| |
| /** |
| * @override TreeNode.js |
| */ |
| scout.Page.prototype._destroy = function() { |
| scout.Page.parent.prototype._destroy.call(this); |
| if (this.detailTable) { |
| this.detailTable.destroy(); |
| } |
| if (this.detailForm) { |
| this.detailForm.destroy(); |
| } |
| }; |
| |
| scout.Page.prototype._internalInitTable = function() { |
| var table = this.detailTable; |
| if (table) { |
| // this case is used for Scout classic |
| table = this.getOutline()._createChild(table); |
| } else { |
| table = this._createTable(); |
| } |
| |
| this.setDetailTable(table); |
| }; |
| |
| scout.Page.prototype._internalInitDetailForm = function() { |
| var detailForm = this.detailForm; |
| if (detailForm) { |
| detailForm = this.getOutline()._createChild(detailForm); |
| } |
| |
| this.setDetailForm(detailForm); |
| }; |
| |
| /** |
| * Override this function to create the internal table. Default impl. returns null. |
| */ |
| scout.Page.prototype._createTable = function() { |
| return null; |
| }; |
| |
| /** |
| * Override this function to initialize the internal (detail) table. Default impl. delegates |
| * <code>filter</code> events to the outline mediator. |
| */ |
| scout.Page.prototype._initTable = function(table) { |
| table.on('filter', this._onTableFilter.bind(this)); |
| if (this.drillDownOnRowClick) { |
| table.on('rowClick', this._onTableRowClick.bind(this)); |
| table.setMultiSelect(false); |
| } |
| }; |
| |
| scout.Page.prototype._ensureDetailForm = function() { |
| if (this.detailForm) { |
| return; |
| } |
| var form = this.createDetailForm(); |
| if (form && !form.displayParent) { |
| form.setDisplayParent(this.getOutline()); |
| } |
| this.setDetailForm(form); |
| }; |
| |
| // see Java: AbstractPage#pageActivatedNotify |
| scout.Page.prototype.activate = function() { |
| this._ensureDetailForm(); |
| }; |
| |
| // see Java: AbstractPage#pageDeactivatedNotify |
| scout.Page.prototype.deactivate = function() { |
| }; |
| |
| /** |
| * @returns {scout.Outline} the tree / outline / parent instance. it's all the same, |
| * but it's more intuitive to work with the 'outline' when we deal with pages. |
| */ |
| scout.Page.prototype.getOutline = function() { |
| return this.parent; |
| }; |
| |
| /** |
| * @returns {Array.<scout.Page>} an array of pages linked with the given rows. |
| * The order of the returned pages will be the same as the order of the rows. |
| */ |
| scout.Page.prototype.pagesForTableRows = function(rows) { |
| return rows.map(this.pageForTableRow); |
| }; |
| |
| scout.Page.prototype.pageForTableRow = function(row) { |
| if (!row.page) { |
| throw new Error('Table-row is not linked to a page'); |
| } |
| return row.page; |
| }; |
| |
| scout.Page.prototype.setDetailForm = function(form) { |
| this.detailForm = form; |
| if (this.detailForm) { |
| this.detailForm.setModal(false); |
| } |
| }; |
| |
| scout.Page.prototype.setDetailTable = function(table) { |
| if (table) { |
| this._initTable(table); |
| table.setTableStatusVisible(this.tableStatusVisible); |
| } |
| this.detailTable = table; |
| }; |
| |
| /** |
| * Updates relevant properties from the pages linked with the given rows using the method updatePageFromTableRow and returns the pages. |
| * |
| * @returns {Array.<scout.Page>} pages linked with the given rows. |
| */ |
| scout.Page.prototype.updatePagesFromTableRows = function(rows) { |
| return rows.map(function(row) { |
| var page = row.page; |
| page.updatePageFromTableRow(row); |
| return page; |
| }); |
| }; |
| |
| /** |
| * Updates relevant properties (text, enabled, htmlEnabled) from the page linked with the given row. |
| * |
| * @returns {scout.Page} page linked with the given row. |
| */ |
| scout.Page.prototype.updatePageFromTableRow = function(row) { |
| var page = row.page; |
| page.enabled = row.enabled; |
| page.text = page.computeTextForRow(row); |
| if (row.cells.length >= 1) { |
| page.htmlEnabled = row.cells[0].htmlEnabled; |
| page.cssClass = row.cells[0].cssClass; |
| } |
| return page; |
| }; |
| |
| /** |
| * This function creates the text property of this page. The default implementation returns the |
| * text from the first cell of the given row. It's allowed to ignore the given row entirely, when you override |
| * this function. |
| * |
| * @param {scout.TableRow} row |
| */ |
| scout.Page.prototype.computeTextForRow = function(row) { |
| var text = ''; |
| if (row.cells.length >= 1) { |
| text = row.cells[0].text; |
| } |
| return text; |
| }; |
| |
| /** |
| * @returns {object} a page parameter object used to pass to newly created child pages. Sets the parent |
| * to our outline instance and adds optional other properties. Typically you'll pass an |
| * object (entity-key or arbitrary data) to a child page. |
| */ |
| scout.Page.prototype._pageParam = function(paramProperties) { |
| var param = { |
| parent: this.getOutline() |
| }; |
| $.extend(param, paramProperties); |
| return param; |
| }; |
| |
| scout.Page.prototype.reloadPage = function () { |
| var outline = this.getOutline(); |
| if (outline) { |
| this.loadChildren(); |
| } |
| }; |
| |
| scout.Page.prototype.linkWithRow = function(row) { |
| this.row = row; |
| row.page = this; |
| this.getOutline().trigger('pageRowLink', { |
| page: this, |
| row: row |
| }); |
| }; |
| |
| scout.Page.prototype.unlinkWithRow = function(row) { |
| delete this.row; |
| delete row.page; |
| }; |
| |
| scout.Page.prototype._onTableFilter = function(event) { |
| this.getOutline().mediator.onTableFilter(event, this); |
| }; |
| |
| scout.Page.prototype._onTableRowClick = function(event) { |
| if (!this.drillDownOnRowClick) { |
| return; |
| } |
| var row = event.row; |
| var drillNode = this.pageForTableRow(row); |
| this.getOutline().selectNode(drillNode); |
| this.detailTable.deselectRow(row); |
| }; |