UNPKG

@openui5/sap.ui.demokit

Version:

OpenUI5 UI Library sap.ui.demokit

160 lines (141 loc) 5.5 kB
/*! * OpenUI5 * (c) Copyright 2009-2021 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define([ 'jquery.sap.global', 'sap/ui/demokit/library' ],function (jQuery, library) { "use strict"; // function to compute the app objects for a demo object function createDemoAppData(oDemoAppMetadata, sLibUrl, sLibNamespace) { // transform simple demo app link to a configuration object var aLinks = []; // transform link object to a bindable array of objects if (jQuery.isPlainObject(oDemoAppMetadata.links)) { aLinks = Object.keys(oDemoAppMetadata.links).map(function (sKey) { return { name: sKey, ref: oDemoAppMetadata.links[sKey] }; }); } var oApp = { lib : oDemoAppMetadata.namespace || sLibNamespace, name : oDemoAppMetadata.text, icon : oDemoAppMetadata.icon, desc : oDemoAppMetadata.desc, config : oDemoAppMetadata.config, teaser : oDemoAppMetadata.teaser, category : oDemoAppMetadata.category, ref : (oDemoAppMetadata.resolve === "lib" ? sLibUrl : "") + oDemoAppMetadata.ref, links : aLinks }; return oApp; } /** * Creates a JSON model structure for both all demo apps in a flat list and demo apps by category * Each library contains a metadata section for demo apps with the following structure (example): * demo: { * text: "sap.m", // legacy entry, name of the library * links: { * icon: an index of the icon font * text: the name of the app * description: a short description text * ref: a link to the demo app entry point * links: an object of links with a key (title) and value (link) each * category: one of the demo app categories (Showcase/Tool/Tutorial/Template/RTA/Misc) * config: the URL to the demo app configuration for downloading the app * } * * Under path /demoApps the following properties can be found: lib, name, icon, desc, type, ref * Under path /demoApps by category the apps are structured by the entry "category" and grouped in batches * of 4 items so that they can be bound to the BlockLayoutRow control directly * @param {array} aLibs an array of the currently loaded UI5 libraries * @param {object} oDocIndicies an object of the currently loaded UI5 library docu metadata * @private */ function createModelData (aLibs, oDocIndicies) { // generate the global model structure var aCategories = ["Showcase", "Tool", "Tutorial", "Template", "RTA", "Misc"]; var oDemoAppsByCategory = {}; // create a helper structure for demo apps by category aCategories.forEach(function (sCategoryName) { oDemoAppsByCategory[sCategoryName] = []; }); // create a model structure that can be bound in the view var oData = { // all demo apps in the order they were read by the metadata demoApps: [], // generated rows and cells matching for for the BlockLayout demoAppsByCategory: [] }; // loop over all libraries and add model data for each demo app for (var i = 0; i < aLibs.length; i++) { var oDemo = oDocIndicies[aLibs[i]].demo; if (!oDemo) { continue; } if (oDemo.links && oDemo.links.length > 0) { for (var j = 0; j < oDemo.links.length; j++) { var oDemoAppData = createDemoAppData(oDemo.links[j], oDocIndicies[aLibs[i]].libraryUrl, oDemo.text); oData.demoApps.push(oDemoAppData); // push demo app into helper structure if (aCategories.indexOf(oDemoAppData.category) < 0) { jQuery.sap.log.warning("Demo app category \"" + oDemoAppData.category + "\" not found, correcting demo app \"" + oDemoAppData.name + "\" to \"Misc\""); oDemoAppData.category = "Misc"; } oDemoAppsByCategory[oDemoAppData.category].push(oDemoAppData); } } } // create a structure in the model data that can be bound to the block layout (an array of rows) // each row contains an array with a headline or a maximum of 4 demo apps Object.keys(oDemoAppsByCategory).forEach(function (sKey) { // early out if category is empty if (oDemoAppsByCategory[sKey].length === 0) { return; } // push a row for the headline oData.demoAppsByCategory.push([{ categoryId : sKey }]); // push n rows for the demo apps itself (start a new row every 4 cells) var iCurrentLength = oData.demoAppsByCategory.push([]); var iCellCounter = 0; for (var i = 0; i < oDemoAppsByCategory[sKey].length; i++) { iCellCounter++; if (oDemoAppsByCategory[sKey][i].teaser) { // teaser apps take two cells iCellCounter++; } if (iCellCounter > 4) { iCurrentLength = oData.demoAppsByCategory.push([]); iCellCounter = 0; } oData.demoAppsByCategory[iCurrentLength - 1].push(oDemoAppsByCategory[sKey][i]); } }); return oData; } return { /** * Fills a JSON model with the demo apps metadata of all available libraries * under path /demoApps the following properties can be found: lib, name, icon, desc, config, category, refs * @param {sap.ui.model.json.JSONModel} oModel the helper JSON model passed in as a reference * @public */ fillJSONModel: function (oModel) { function fnHandleLibInfoLoaded (aLibs, oDocIndicies) { if (!aLibs) { return; } // set model var oModelData = oModel.getData(); oModel.setData(jQuery.extend(oModelData, createModelData(aLibs, oDocIndicies))); } // load and process all lib info library._loadAllLibInfo("", "_getDocuIndex", fnHandleLibInfoLoaded); } }; });