@openui5/sap.m
Version:
OpenUI5 UI Library sap.m
498 lines (430 loc) • 13.7 kB
JavaScript
/*
* ! UI development toolkit for HTML5 (OpenUI5)
* (c) Copyright 2009-2022 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',
'./QuickViewRenderer'
],
function(
library,
Device,
IconPool,
QuickViewBase,
ResponsivePopover,
NavContainer,
Page,
Bar,
Button,
QuickViewRenderer
) {
"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 (icon, 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.60.39
*
* @constructor
* @public
* @since 1.28.11
* @alias sap.m.QuickView
* @see {@link fiori:https://experience.sap.com/fiori-design-web/quickview/ Quick View}
* @ui5-metamodel This control/element also will be described in the UI5 (legacy) designtime metamodel
*/
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"
}
}
}
}
}
});
/**
* 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;
this._oPopover.addStyleClass("sapMQuickView");
};
/**
* 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();
// 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.height() + '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} 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 {sap.m.QuickView} 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 {sap.m.QuickView} 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 {sap.m.QuickView} Pointer to the control instance for chaining
* @public
*/
QuickView.prototype.openBy = function(oControl) {
this._bItemsChanged = true;
this._oPopover.openBy(oControl);
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 + "Old"] = QuickView.prototype[sFuncName];
QuickView.prototype[sFuncName] = function () {
var newArgs,
result;
if (["removeAggregation", "removeAllAggregation", "destroyAggregation"].indexOf(sFuncName) !== -1) {
newArgs = [arguments[0], true];
} else {
newArgs = [arguments[0], arguments[1], true];
}
result = QuickView.prototype["_" + sFuncName + "Old"].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;
});