/*
* ! UI development toolkit for HTML5 (OpenUI5)
* (c) Copyright 2009-2018 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
// Provides control sap.m.QuickViewPage
sap.ui.define([
'./library',
'sap/ui/core/Control',
'sap/ui/core/IconPool',
'sap/ui/layout/form/SimpleForm',
'sap/ui/layout/VerticalLayout',
'sap/ui/layout/HorizontalLayout',
'./Page',
'./Button',
'./Bar',
'./Title',
'./Image',
'./Link',
'./Text',
'./Label',
'./HBox',
'sap/ui/core/Icon',
'sap/ui/core/Title',
'sap/ui/core/CustomData',
'sap/ui/core/library',
'sap/ui/layout/library',
'sap/ui/Device',
'sap/ui/layout/form/ResponsiveGridLayout',
'./QuickViewPageRenderer',
"sap/base/security/encodeURL"
],
function(
library,
Control,
IconPool,
SimpleForm,
VerticalLayout,
HorizontalLayout,
Page,
Button,
Bar,
Title,
Image,
Link,
Text,
Label,
HBox,
Icon,
CoreTitle,
//SimpleForm is loading ResponsiveGridLayout too late, only need as a dependency
CustomData,
coreLibrary,
layoutLibrary,
Device,
ResponsiveGridLayout,
QuickViewPageRenderer,
encodeURL
) {
"use strict";
// shortcut for sap.m.URLHelper
var URLHelper = library.URLHelper;
// shortcut for sap.ui.layout.form.SimpleFormLayout
var SimpleFormLayout = layoutLibrary.form.SimpleFormLayout;
// shortcut for sap.ui.core.TitleLevel
var CoreTitleLevel = coreLibrary.TitleLevel;
// shortcut for sap.m.QuickViewGroupElementType
var QuickViewGroupElementType = library.QuickViewGroupElementType;
// shortcut for sap.m.ButtonType
var ButtonType = library.ButtonType;
/**
* Constructor for a new QuickViewPage.
*
* @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 QuickViewPage consists of a page header, an object icon or image,
* an object name with short description, and an object information divided in groups.
* The control uses the sap.m.SimpleForm control to display information.
*
* @extends sap.ui.core.Control
*
* @author SAP SE
* @version 1.60.23
*
* @constructor
* @public
* @since 1.28.11
* @alias sap.m.QuickViewPage
* @ui5-metamodel This control/element also will be described in the UI5 (legacy) designtime metamodel
*/
var QuickViewPage = Control.extend("sap.m.QuickViewPage", /** @lends sap.m.QuickViewPage.prototype */ {
metadata: {
library: "sap.m",
properties: {
/**
* Page id
*/
pageId: {
type: "string",
group: "Misc",
defaultValue: ""
},
/**
* Specifies the text displayed in the header of the control.
*/
header: {
type: "string",
group: "Misc",
defaultValue: ""
},
/**
* Specifies the text displayed in the header of the content section of the control.
*/
title: {
type: "string",
group: "Misc",
defaultValue: ""
},
/**
* Specifies the URL which opens when the title or the thumbnail is clicked.
*/
titleUrl: {
type: "string",
group: "Misc",
defaultValue: ""
},
/**
* Specifies the application which provides target and param configuration for cross-application navigation from the 'page header'.
*/
crossAppNavCallback : {
type: "object",
group: "Misc"
},
/**
* Specifies the text displayed under the header of the content section
*/
description: {
type: "string",
group: "Misc",
defaultValue: ""
},
/**
* Specifies the URL of the icon displayed under the header of the page
*/
icon: {
type: "string",
group: "Misc",
defaultValue: ""
}
},
defaultAggregation: "groups",
aggregations: {
/**
* QuickViewGroup consists of a title (optional) and an entity of group elements.
*/
groups: {
type: "sap.m.QuickViewGroup",
multiple: true,
singularName: "group",
bindable: "bindable"
}
}
}
});
QuickViewPage.prototype.init = function() {
this._oResourceBundle = sap.ui.getCore().getLibraryResourceBundle('sap.m');
//see API docu for sap.ushell.services.CrossApplicationNavigation
var fGetService = sap.ushell && sap.ushell.Container && sap.ushell.Container.getService;
if (fGetService) {
this.oCrossAppNavigator = fGetService("CrossApplicationNavigation");
}
};
/**
* Called before the control is rendered.
* @private
*/
QuickViewPage.prototype.onBeforeRendering = function() {
this._destroyPageContent();
this._createPageContent();
};
/**
* Returns page content containing the header and the form.
* @private
* @returns {Object} Object containing the header and the form
*/
QuickViewPage.prototype.getPageContent = function() {
return this._mPageContent;
};
/**
* Sets context containing navigation information.
* @param {Object} context Object containing specific navigation data.
* @private
*/
QuickViewPage.prototype.setNavContext = function (context) {
this._mNavContext = context;
};
/**
* Returns context containing navigation information.
* @private
* @returns {Object} Object containing specific navigation data
*/
QuickViewPage.prototype.getNavContext = function () {
return this._mNavContext;
};
/**
* Sets page title control.
* @param {sap.ui.core.Control} title The control that is displayed in the title of the page.
* @private
*/
QuickViewPage.prototype.setPageTitleControl = function (title) {
this._oPageTitle = title;
};
/**
* Returns page title control.
* @private
* @returns {sap.ui.core.Control} The control displayed in the title
*/
QuickViewPage.prototype.getPageTitleControl = function () {
return this._oPageTitle;
};
/**
* Helper function that creates a new {@link sap.m.Page} and adds content to it.
* @returns {sap.m.Page} The created page
* @private
*/
QuickViewPage.prototype._createPage = function () {
var mPageContent = this._createPageContent();
var mNavContext = this.getNavContext();
var oPage;
if (this._oPage) {
oPage = this._oPage;
oPage.destroyContent();
oPage.setCustomHeader(new Bar());
} else {
oPage = this._oPage = new Page(mNavContext.quickViewId + '-' + this.getPageId(), {
customHeader : new Bar()
});
oPage.addEventDelegate({
onAfterRendering: this.onAfterRenderingPage
}, this);
}
//When there is only a single page in QuickView and no header set the header should be removed and device is not a phone
if (this.getHeader() === "" && mNavContext.quickView.getPages().length === 1 && !Device.system.phone) {
oPage.setShowHeader(false);
oPage.addStyleClass('sapMQuickViewPageWithoutHeader');
}
if (mPageContent.header) {
oPage.addContent(mPageContent.header);
}
oPage.addContent(mPageContent.form);
var oCustomHeader = oPage.getCustomHeader();
oCustomHeader.addContentMiddle(
new Title({
text : this.getHeader()
}).addStyleClass("sapMQuickViewTitle")
);
if (mNavContext.hasBackButton) {
oCustomHeader.addContentLeft(
new Button({
type : ButtonType.Back,
tooltip : this._oResourceBundle.getText("PAGE_NAVBUTTON_TEXT"),
press : function() {
if (mNavContext.navContainer) {
mNavContext.quickView._setNavOrigin(null);
mNavContext.navContainer.back();
}
}
})
);
}
if (mNavContext.popover && Device.system.phone) {
oCustomHeader.addContentRight(
new Button({
icon : IconPool.getIconURI("decline"),
press : function() {
mNavContext.popover.close();
}
})
);
}
oPage.addStyleClass('sapMQuickViewPage');
return oPage;
};
QuickViewPage.prototype.onAfterRenderingPage = function () {
if (this._bItemsChanged) {
var mNavContext = this.getNavContext();
if (mNavContext) {
mNavContext.quickView._restoreFocus();
}
this._bItemsChanged = false;
}
};
/**
* Helper function that creates the content of a QuickViewPage and returns it as an object
* with form and header properties.
* @returns {{form: sap.ui.layout.form.SimpleForm, header: sap.ui.layout.HorizontalLayout}}
* @private
*/
QuickViewPage.prototype._createPageContent = function () {
var oForm = this._createForm();
var oHeader = this._getPageHeaderContent();
// add ARIA title to the form
var oPageTitleControl = this.getPageTitleControl();
if (oHeader && oPageTitleControl) {
oForm.addAriaLabelledBy(oPageTitleControl);
}
this._mPageContent = {
form: oForm,
header: oHeader
};
return this._mPageContent;
};
/**
* Helper function that creates a form object based on the data in the groups of the QuickViewPage
* @returns {sap.ui.layout.form.SimpleForm} The form created based on the groups of the QuickViewPage
* @private
*/
QuickViewPage.prototype._createForm = function () {
var aGroups = this.getAggregation("groups"),
oForm = new SimpleForm({
maxContainerCols: 1,
editable: false,
layout: SimpleFormLayout.ResponsiveGridLayout
});
if (aGroups) {
for (var j = 0; j < aGroups.length; j++) {
if (aGroups[j].getVisible()) {
this._renderGroup(aGroups[j], oForm);
}
}
}
return oForm;
};
/**
* Helper function that creates the header of the QuickViewPage.
* @returns {sap.ui.layout.HorizontalLayout} The header of the QuickViewPage
* @private
*/
QuickViewPage.prototype._getPageHeaderContent = function() {
var oIcon,
oVLayout = new VerticalLayout(),
oHLayout = new HorizontalLayout(),
sIcon = this.getIcon(),
sTitle = this.getTitle(),
sDescription = this.getDescription(),
sTitleUrl = this.getTitleUrl();
if (!sIcon && !sTitle && !sDescription) {
return null;
}
if (sIcon) {
if (this.getIcon().indexOf("sap-icon") == 0) {
oIcon = new Icon({
src: sIcon,
decorative: !sTitleUrl,
useIconTooltip: false,
tooltip: sTitle
});
} else {
oIcon = new Image({
src: sIcon,
decorative: false,
tooltip: sTitle
}).addStyleClass("sapUiIcon");
}
oIcon.addStyleClass("sapMQuickViewThumbnail");
if (sTitleUrl) {
oIcon.attachPress(this._crossApplicationNavigation(this));
}
oHLayout.addContent(oIcon);
}
var oTitle;
if (sTitleUrl) {
oTitle = new Link({
text : sTitle,
href : sTitleUrl,
target : "_blank"
});
} else if (this.getCrossAppNavCallback()) {
oTitle = new Link({
text : sTitle
});
oTitle.attachPress(this._crossApplicationNavigation(this));
} else {
oTitle = new Title({
text : sTitle,
level : CoreTitleLevel.H1
});
}
this.setPageTitleControl(oTitle);
var oDescription = new Text({
text : sDescription
});
oVLayout.addContent(oTitle);
oVLayout.addContent(oDescription);
oHLayout.addContent(oVLayout);
return oHLayout;
};
/**
* Helper function that renders a QuickViewGroup in the QuickViewPage.
* @param {sap.m.QuickViewGroup} oGroup The group to be rendered.
* @param {sap.ui.layout.form.SimpleForm} oForm The form in which the group is rendered
* @private
*/
QuickViewPage.prototype._renderGroup = function(oGroup, oForm) {
var aElements = oGroup.getAggregation("elements");
var oCurrentGroupElement,
oCurrentGroupElementValue,
oLabel;
if (oGroup.getHeading()) {
oForm.addContent(new CoreTitle({
text : oGroup.getHeading(),
level : CoreTitleLevel.H2
}));
}
if (!aElements) {
return;
}
var mNavContext = this.getNavContext();
for (var k = 0; k < aElements.length; k++) {
oCurrentGroupElement = aElements[k];
if (!oCurrentGroupElement.getVisible()) {
continue;
}
oLabel = new Label({
text: oCurrentGroupElement.getLabel()
});
var sQuickViewId;
if (mNavContext) {
sQuickViewId = mNavContext.quickViewId;
}
oCurrentGroupElementValue = oCurrentGroupElement._getGroupElementValue(sQuickViewId);
oForm.addContent(oLabel);
if (!oCurrentGroupElementValue) {
// Add dummy text element so that the form renders the oLabel
oForm.addContent(new Text({text : ""}));
continue;
}
oLabel.setLabelFor(oCurrentGroupElementValue.getId());
if (oCurrentGroupElement.getType() == QuickViewGroupElementType.pageLink) {
oCurrentGroupElementValue.attachPress(this._attachPressLink(this));
}
if (oCurrentGroupElement.getType() == QuickViewGroupElementType.mobile &&
!Device.system.desktop) {
var oSmsLink = new Icon({
src: IconPool.getIconURI("post"),
tooltip : this._oResourceBundle.getText("QUICKVIEW_SEND_SMS"),
decorative : false,
customData: [new CustomData({
key: "phoneNumber",
value: oCurrentGroupElement.getValue()
})],
press: this._mobilePress
});
var oBox = new HBox({
items: [oCurrentGroupElementValue, oSmsLink]
});
oForm.addContent(oBox);
} else {
oForm.addContent(oCurrentGroupElementValue);
}
}
};
/**
* Helper function used to navigate to another Fiori application (intent based navigation) or
* to an external link.
* This will be applicable only for the header link.
* @param {sap.m.QuickViewPage} that - The page from which the navigation starts
* @returns {Function} A function that executes the navigation
* @private
*/
QuickViewPage.prototype._crossApplicationNavigation = function (that) {
return function () {
if (that.getCrossAppNavCallback() && that.oCrossAppNavigator) {
var targetConfigCallback = that.getCrossAppNavCallback();
if (typeof targetConfigCallback == "function") {
var targetConfig = targetConfigCallback();
var href = that.oCrossAppNavigator.hrefForExternal(
{
target : {
semanticObject : targetConfig.target.semanticObject,
action : targetConfig.target.action
},
params : targetConfig.params
}
);
URLHelper.redirect(href);
}
} else if (that.getTitleUrl()) {
window.open(that.getTitleUrl(), "_blank");
}
};
};
QuickViewPage.prototype._destroyPageContent = function() {
if (!this._mPageContent) {
return;
}
if (this._mPageContent.form) {
this._mPageContent.form.destroy();
}
if (this._mPageContent.header) {
this._mPageContent.header.destroy();
}
this._mPageContent = null;
};
QuickViewPage.prototype.exit = function() {
this._oResourceBundle = null;
if (this._oPage) {
this._oPage.destroy();
this._oPage = null;
} else {
this._destroyPageContent();
}
this._mNavContext = null;
};
/**
* Helper function used to attach click handler to links in the QuickViewPage
* that should lead to another QuickViewPage.
* @param {sap.m.QuickViewPage} that The page from which the navigation occurs.
* @returns {Function} A function executed when the link is clicked
* @private
*/
QuickViewPage.prototype._attachPressLink = function (that) {
var mNavContext = that.getNavContext();
return function (e) {
e.preventDefault();
var sPageId = this.getCustomData()[0].getValue();
if (mNavContext.navContainer && sPageId) {
mNavContext.quickView._setNavOrigin(this);
mNavContext.navContainer.to(sPageId);
}
};
};
/**
* Function executed when the sms icon in the QuickViewPage is clicked.
* @private
*/
QuickViewPage.prototype._mobilePress = function () {
var sms = "sms://" + encodeURL(this.getCustomData()[0].getValue());
window.location.replace(sms);
};
/**
* Updates the contents of the page and sets the focus on the last focused element or
* on the first focusable element.
* @private
*/
QuickViewPage.prototype._updatePage = function () {
var mNavContext = this.getNavContext();
if (mNavContext && mNavContext.quickView._bRendered) {
this._bItemsChanged = true;
mNavContext.popover.focus();
if (mNavContext.quickView.indexOfPage(this) == 0) {
mNavContext.quickView._clearContainerHeight();
}
this._createPage();
// in some cases the popover has display:none style here,
// which delays the simple form re-arranging and an unwanted scrollbar might appear.
mNavContext.popover.$().css('display', 'block');
mNavContext.quickView._adjustContainerHeight();
mNavContext.quickView._restoreFocus();
}
};
["setModel", "bindAggregation", "setAggregation", "insertAggregation", "addAggregation",
"removeAggregation", "removeAllAggregation", "destroyAggregation"].forEach(function (sFuncName) {
QuickViewPage.prototype["_" + sFuncName + "Old"] = QuickViewPage.prototype[sFuncName];
QuickViewPage.prototype[sFuncName] = function () {
var result = QuickViewPage.prototype["_" + sFuncName + "Old"].apply(this, arguments);
this._updatePage();
if (["removeAggregation", "removeAllAggregation"].indexOf(sFuncName) !== -1) {
return result;
}
return this;
};
});
QuickViewPage.prototype.setProperty = function (sName, oValue) {
Control.prototype.setProperty.call(this, sName, oValue, true);
this._updatePage();
};
return QuickViewPage;
});