SapUI5: Рисуем график (VizFrame)
SapUI5 позволяет довольно гибко визуализировать какие-либо бизнес данные. В данном посте посмотрим на то, как нарисовать простой график, как динамически управлять количеством графиков и как кастомизировать всплывающую подсказку.
Пример, который мы будем рассматривать ниже, можно импортировать в свой WebIDE отсюда https://github.com/kannade/sapui5_viz.
В примере будем рисовать колонки (тип графика Stacked Column) с ценой молока:
Определим json модель для графика в manifest.json
Первое, что нам нужно — данные!
Опишем json модель в manifest.json, а сами данные будем брать из обычного json файла:
"sap.app": { … "dataSources": { "graphData": { "uri": "model/json2.json", "type": "JSON" } } … }, "sap.ui5": { … "models": { "graphDataMdl": { "type": "sap.ui.model.json.JSONModel", "dataSource": "graphData" } }, … }, … |
Кстати, просто так получить данные json модели (которая объявлена в manifest.json) в контроллере у Вас не получится, надо использовать следующую конструкцию:
onInit: function () { //получим компонент var oComp = this.getOwnerComponent(); //получим модель var oMdl = oComp.getModel("graphDataMdl"); //как получить содержимое модели, когда она определена через manifest oMdl.attachRequestCompleted(function () { console.log(oMdl.getData()); });… |
Опишем график с определенными свойствами
Перейдем в представление и опишем график (VizFrame):
<viz:vizframe id="idVizFrame" uiConfig="{applicationSet:'fiori'}" height='100%' width="100%" vizType='stacked_column' class="graphPpl" legendVisible="false"> <viz:dataset> <viz .data:FlattenedDataset data="/milk"> </viz><viz .data:dimensions> </viz><viz .data:DimensionDefinition name="Период" value="{Date}"></viz> <viz .data:measures> </viz><viz .data:MeasureDefinition name="Revenue" value="{Revenue}"></viz> <viz .data:MeasureDefinition name="Cost" value="{Cost}"></viz> </viz:dataset> <viz:feeds> <!--<viz.feeds:FeedItem uid="valueAxis" type="Measure" values="Revenue,Cost"/>--> <viz .feeds:FeedItem uid="categoryAxis" type="Dimension" values="Период"></viz> </viz:feeds> </viz:vizframe> |
выше мы указали, что брать данные надо из {/milk} (саму модель мы установим позже), указали, что для оси абсцисс (ось X) мы берем данные из {Date}, а данные для столбцов мы будем брать из {Revenue} и {Cost}:
У представления есть свой контроллер, в котором мы получим график и установим для него ряд свойств (список всех свойств можно получить в документации):
var oVizFrame = this.oVizFrame = this.getView().byId("idVizFrame"); oVizFrame.setVizProperties({ plotArea: { … |
так же установим на график модель, динамически добавим графики и цвета:
//получим компонент var oComp = this.getOwnerComponent(); //получим модель var oMdl = oComp.getModel("graphDataMdl"); … //установим модель oVizFrame.setModel(oMdl); //Динамически добавим графики и цвета var aValuesFeed = []; var aColorPalette = []; aValuesFeed.push("Revenue"); aColorPalette.push("#ff002a"); aValuesFeed.push("Cost"); aColorPalette.push("#019125"); var feed = new sap.viz.ui5.controls.common.feeds.FeedItem({ 'uid': "valueAxis", 'type': "Measure", 'values': aValuesFeed }); //добавляем оси oVizFrame.addFeed(feed); //добавляем цвета для осей oVizFrame.setVizProperties({ plotArea: { colorPalette: aColorPalette } }); |
Кастомизируем (персонализируем) всплывающую подсказку (tooltip)
уберем задержку перед появлением всплывающей подсказки и покажем всплывающую подсказку при наведении мыши:
//Всплывающее окошко по нажатию на элемент графика // var oPopOver = this.getView().byId("idPopOver"); // oPopOver.connect(oVizFrame.getVizUid()); // oPopOver.setFormatString(formatPattern.STANDARDFLOAT); //Всплывающее окошко при наведении мышки на элемент графика var oTooltip = new sap.viz.ui5.controls.VizTooltip({}); oTooltip.connect(oVizFrame.getVizUid()); oTooltip.setFormatString(formatPattern.STANDARDFLOAT); //Уберем задержку перед появлением тултипа: sap.viz.api.env.globalSettings({ disableTooltipTimer: true }); |
Вернемся к заданию свойств для графика и посмотрим на свойство tooltip, в котором мы можем переопределить две функции preRender и postRender:
preRender: function (tooltipDomNode) { // Вызывается перед всплывающей подсказкой. // tooltipDomNode.append('div').text('nickcode.ru').style({ // 'font-weight': 'bold' // }); }, postRender: function (tooltipDomNode) { //Вызывается после всплывающей подсказки. //Определим тип переменной со свойствами группировки var oType = new sap.ui.model.type.Integer({ //maxFractionDigits: 0, groupingEnabled: true, groupingSeparator: "," //decimalSeparator: "." }); //Получим содержимое дива с классом v-body-measure-value var rev = tooltipDomNode.selectAll('.v-body-measure-value').text(); var amt = Number(rev); //Применим формат для числа var oNumFormat = sap.ui.core.format.NumberFormat.getFloatInstance(oType); var amount = oNumFormat.format(parseInt(amt, 10)); //Определим тип "Цена" со свойствами var oCurrency = new sap.ui.model.type.Currency({ showMeasure: true, maxFractionDigits: 0, minFractionDigits: 0, groupingEnabled: true, groupingSeparator: ' ' }); //применим тип "Цена" для содержимого дива var money = oCurrency.formatValue([amt, "₽"], "string"); //Вставим значение в div //tooltipDomNode.selectAll('.v-body-measure-value').html(amount); tooltipDomNode.selectAll('.v-body-measure-value').html(money); //Напишем во всплывающем сообщении слово milk и применим к нему css стиль var message = "milk"; tooltipDomNode.append('div').text(message).style({ 'font-family': 'Arial', 'font-size': '13px', 'font-weight': 'bold', 'white-space': 'normal', 'text-overflow': 'ellipsis', 'overflow': 'hidden', 'padding-left': '0px', 'padding-top': '6px', 'color': '#000', 'max-width': '10rem' }); //tooltipDomNode.selectAll('.v-body-measure-value').attr('style', 'color: red;'); } |
На этом все, простейший график со всплывающей подсказкой и динамическим формированием «осей» нарисован!
Больше примеров в документации https://sapui5.hana.ondemand.com/#/entity/sap.viz.ui5.controls.VizFrame.