UNPKG

@openui5/sap.m

Version:

OpenUI5 UI Library sap.m

490 lines (422 loc) 13.5 kB
/*! * OpenUI5 * (c) Copyright 2009-2023 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ // Provides control sap.m.QuickView. sap.ui.define([ "./library", "sap/ui/Device", "sap/ui/core/IconPool", "./QuickViewBase", "./ResponsivePopover", "./NavContainer", "./Page", "./Bar", "./Button" ], function ( library, Device, IconPool, QuickViewBase, ResponsivePopover, NavContainer, Page, Bar, Button ) { "use strict"; // shortcut for sap.m.PlacementType var PlacementType = library.PlacementType; /** * Constructor for a new QuickView. * * @param {string} [sId] ID for the new control, generated automatically if no ID is given * @param {object} [mSettings] Initial settings for the new control * * @class A responsive popover that displays information on an object in a business-card format. * <h3>Overview</h3> * The quick view is used to show business information on either a person or an entity (e.g. a company). It uses a set of pre-defined controls. * Objects can be linked together and you can navigate between several objects. An unlimited number of objects can be linked. * <h3>Structure</h3> * Each card is represented by a {@link sap.m.QuickViewPage} which holds all the information (avatar, title, header, description) for the object. * A single quick view can hold multiple objects, each showing information on a single entity. * <h3>Usage</h3> * <h4>When to use</h4> * <ul> * <li>You want to display a concise overview of an object (an employee or a company).</li> * <li>Information on the object can be split into concrete groups.</li> * </ul> * <h4>When not to use</h4> * <ul> * <li>You want to display complex information about an object.</li> * </ul> * <h3>Responsive Behavior</h3> * The quick view is displayed in a {@link sap.m.Popover popover} on desktop and a full-screen {@link sap.m.Dialog dialog} on mobile devices. * @extends sap.m.QuickViewBase * * @author SAP SE * @version 1.117.4 * * @constructor * @public * @since 1.28.11 * @alias sap.m.QuickView * @see {@link fiori:https://experience.sap.com/fiori-design-web/quickview/ Quick View} */ var QuickView = QuickViewBase.extend("sap.m.QuickView", /** @lends sap.m.QuickView.prototype */ { metadata: { library: "sap.m", properties: { /** * This property is reused from sap.m.Popover and only takes effect when running on desktop or tablet. Please refer the documentation of the placement property of sap.m.Popover. */ placement : { type : "sap.m.PlacementType", group : "Misc", defaultValue : PlacementType.Right }, /** * The width of the QuickView. The property takes effect only when running on desktop or tablet. */ width : { type : 'sap.ui.core.CSSSize', group : 'Dimension', defaultValue : '320px' } }, aggregations: {}, designtime: "sap/m/designtime/QuickView.designtime", events: { /** * This event fires after the QuickView is opened. */ afterOpen: { parameters: { /** * This parameter refers to the control, which opens the QuickView. */ openBy: { type: "sap.ui.core.Control" } } }, /** * This event fires after the QuickView is closed. */ afterClose: { parameters: { /** * This parameter refers to the control, which opens the QuickView. */ openBy: { type: "sap.ui.core.Control" }, /** * This parameter contains the control, * which triggers the close of the QuickView. * It is undefined when running on desktop or tablet. */ origin : { type : "sap.m.Button" } } }, /** * This event fires before the QuickView is opened. */ beforeOpen: { parameters: { /** * This parameter refers to the control, which opens the QuickView. */ openBy: { type: "sap.ui.core.Control" } } }, /** * This event fires before the QuickView is closed. */ beforeClose: { parameters: { /** * This parameter refers to the control, which opens the QuickView. */ openBy: { type: "sap.ui.core.Control" }, /** * This parameter contains the control, * which triggers the close of the QuickView. * It is undefined when running on desktop or tablet. */ origin : { type : "sap.m.Button" } } } } }, renderer: { apiVersion: 2, render: function () {} } }); /** * Initialize the control. * * @private */ QuickView.prototype.init = function() { var oNavConfig = { pages: [new Page()], navigate: this._navigate.bind(this), afterNavigate: this._afterNavigate.bind(this) }; this._oNavContainer = new NavContainer(oNavConfig); var that = this; this._oPopover = new ResponsivePopover(this.getId() + '-quickView', { placement: this.getPlacement(), content: [this._oNavContainer], contentWidth: this.getWidth(), showHeader: false, showCloseButton : false, afterOpen: function (oEvent) { that._afterOpen(oEvent); that.fireAfterOpen({ openBy: oEvent.getParameter("openBy") }); }, afterClose: function (oEvent) { that.fireAfterClose({ openBy: oEvent.getParameter("openBy"), origin: that.getCloseButton() }); }, beforeOpen: function (oEvent) { that.fireBeforeOpen({ openBy: oEvent.getParameter("openBy") }); }, beforeClose: function (oEvent) { that.fireBeforeClose({ openBy: oEvent.getParameter("openBy"), origin: that.getCloseButton() }); that._bRendered = false; } }); this._oPopover.addStyleClass("sapMQuickView"); var oPopupControl = this._oPopover.getAggregation("_popup"); oPopupControl.addEventDelegate({ onBeforeRendering: this._initializeQuickView, onAfterRendering: this._setLinkWidth, onkeydown: this._onPopupKeyDown }, this); var that = this; var fnSetArrowPosition = oPopupControl._fnAdjustPositionAndArrow; if (fnSetArrowPosition) { oPopupControl._fnAdjustPositionAndArrow = function () { fnSetArrowPosition.apply(oPopupControl, arguments); that._adjustContainerHeight(); }; } this._bItemsChanged = true; }; /** * Initialize the QuickView. * @private */ QuickView.prototype._initializeQuickView = function() { this._bRendered = true; // Update pages only if items aggregation is changed if (this._bItemsChanged) { this._clearContainerHeight(); this._initPages(); var oPage = this._oNavContainer.getCurrentPage(); if (oPage) { var oHeader = oPage.getCustomHeader(); if (oHeader && oHeader.getContentMiddle()[0]) { this._oPopover.addAriaLabelledBy(oHeader.getContentMiddle()[0].getId()); } } // add a close button on phone devices when there are no pages var aPages = this.getAggregation("pages"); if (!aPages && Device.system.phone) { this._addEmptyPage(); } this._bItemsChanged = false; } }; QuickView.prototype.exit = function() { this._bRendered = false; this._bItemsChanged = true; if (this._oPopover) { this._oPopover.destroy(); this._oPopover = null; } }; /** * Invalidates the control. */ QuickView.prototype.invalidate = function() { // nothing this control should do here // changes are handled manually }; /** * Creates a new {@link sap.m.Page} that can be inserted in a QuickView. * @param {sap.m.QuickViewPage} oQuickViewPage The object that contains the data to be displayed. * @returns {sap.m.Page} The created page * @private */ QuickView.prototype._createPage = function(oQuickViewPage) { return oQuickViewPage._createPage(); }; /** * Keyboard handling function when the down arrow is pressed. * @param {sap.ui.base.Event} oEvent The event object for this event. * @private */ QuickView.prototype._onPopupKeyDown = function(oEvent) { this._processKeyboard(oEvent); }; /** * Helper function to restore the focus to the proper element after the QuickView is opened on phone. * @private */ QuickView.prototype._afterOpen = function(oEvent) { if (Device.system.phone) { this._restoreFocus(); } }; /** * Creates a new empty {@link sap.m.Page} and adds it to the QuickView. * @private */ QuickView.prototype._addEmptyPage = function() { var oPage = new Page({ customHeader : new Bar().addStyleClass("sapMQuickViewHeader") }); var that = this; var oCustomHeader = oPage.getCustomHeader(); oCustomHeader.addContentRight( new Button({ icon : IconPool.getIconURI("decline"), press : function() { that._oPopover.close(); } }) ); oPage.addStyleClass('sapMQuickViewPage'); this._oNavContainer.addPage(oPage); }; QuickView.prototype._clearContainerHeight = function() { var oPopupControl = this._oPopover.getAggregation("_popup"); var $container = oPopupControl.$().find('.sapMPopoverCont'); if ($container[0] && $container[0].style.height) { $container[0].style.height = ''; } }; /** * Adjusts the popup height based on the QuickView's content. * @private */ QuickView.prototype._adjustContainerHeight = function() { if (this.getPages().length <= 1) { return; } var oPopupControl = this._oPopover.getAggregation("_popup"); var $container = oPopupControl.$().find('.sapMPopoverCont'); if ($container[0] && !$container[0].style.height) { $container[0].style.height = $container.outerHeight() + 'px'; } }; /** * Sets the correct length of the links inside the QuickView. This is done to overwrite the styles set by the ResponsiveGridLayout * @private */ QuickView.prototype._setLinkWidth = function() { this._oPopover.$().find(".sapMLnk").css("width", "auto"); }; /** * Returns the button, which closes the QuickView. * On desktop or tablet, this method returns undefined. * @returns {sap.ui.core.Control|undefined} The close button of the QuickView on phone or undefined on desktop and tablet. * @private */ QuickView.prototype.getCloseButton = function() { if (!Device.system.phone) { return undefined; } var oPage = this._oNavContainer.getCurrentPage(); var oButton = oPage.getCustomHeader().getContentRight()[0]; return oButton; }; /** * The method sets placement position of the QuickView. * * @param {sap.m.PlacementType} sPlacement The side from which the QuickView appears relative to the control that opens it. * @returns {this} Pointer to the control instance for chaining. * @public */ QuickView.prototype.setPlacement = function (sPlacement) { this.setProperty("placement", sPlacement, true); // no re-rendering this._oPopover.setPlacement(sPlacement); return this; }; /** * The method sets the width of the QuickView. * Works only on desktop or tablet. * @param {sap.ui.core.CSSSize} sWidth The new width of the QuickView. * @returns {this} Pointer to the control instance for chaining * @public */ QuickView.prototype.setWidth = function (sWidth) { if (this._oPopover) { this._oPopover.setContentWidth(sWidth); this.setProperty('width', sWidth, true); } return this; }; /** * Opens the QuickView. * @param {sap.ui.core.Control} oControl The control which opens the QuickView. * @returns {this} Pointer to the control instance for chaining * @public */ QuickView.prototype.openBy = function(oControl) { this._bItemsChanged = true; this._oPopover.openBy(oControl); return this; }; /** * Closes the QuickView. * @returns {this} Pointer to the control instance for chaining * @public */ QuickView.prototype.close = function() { this._oPopover.close(); return this; }; QuickView.prototype.getDomRef = function (sSuffix) { return this._oPopover && this._oPopover.getAggregation("_popup").getDomRef(sSuffix); }; ["addStyleClass", "removeStyleClass", "toggleStyleClass", "hasStyleClass", "getBusyIndicatorDelay", "setBusyIndicatorDelay", "getVisible", "setVisible", "getFieldGroupIds", "setFieldGroupIds", "getBusy", "setBusy", "setTooltip", "getTooltip"].forEach(function(sName){ QuickView.prototype[sName] = function() { if (this._oPopover && this._oPopover[sName]) { var res = this._oPopover.getAggregation("_popup")[sName].apply(this._oPopover.getAggregation("_popup"), arguments); return res === this._oPopover.getAggregation("_popup") ? this : res; } }; }); ["setModel", "bindAggregation", "setAggregation", "insertAggregation", "addAggregation", "removeAggregation", "removeAllAggregation", "destroyAggregation"].forEach(function (sFuncName) { QuickView.prototype[sFuncName] = function () { var newArgs = Array.prototype.slice.call(arguments), result; // suppress invalidation if (["setModel", "bindAggregation"].indexOf(sFuncName) === -1) { newArgs.push(true); } result = QuickViewBase.prototype[sFuncName].apply(this, newArgs); // Marks items aggregation as changed and invalidate popover to trigger rendering this._bItemsChanged = true; if (this._oPopover) { if (arguments[0] !== "pages") { this._oPopover[sFuncName].apply(this._oPopover, arguments); } if (this._bRendered) { this._initializeQuickView(); } } if (["removeAggregation", "removeAllAggregation"].indexOf(sFuncName) !== -1) { return result; } return this; }; }); return QuickView; });