How do I drag and drop with in one table in UI5? - sapui5

I noticed on the documentation you can drag and drop between two tables https://sapui5.hana.ondemand.com/#/entity/sap.m.Table/sample/sap.m.sample.TableDnD.
But is there a way to drag and drop on the one table (same table). I have written the code for drag and drop but the drag and drop event isn't triggered when I try to drop in the same table.
<mvc:View controllerName="ariba.cso.kaarecommendation.controller.Recommendation" xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc"
xmlns:core="sap.ui.core" xmlns:f="sap.f" xmlns:dnd="sap.ui.core.dnd">
<f:DynamicPage id="dynamicPageId">
<f:title>
<f:DynamicPageTitle>
<f:heading>
<Title text="{i18n>appSubTitle}"/>
</f:heading>
<f:actions>
<Button text="{i18n>presentation}" press="onPress"></Button>
<Link id="linkid" visible="false" text="{i18n>download}" href="{/powerpoint}" press="linkPress"/>
</f:actions>
</f:DynamicPageTitle>
</f:title>
<f:content>
<Table id="tableid" items="{private}" width="auto" mode="MultiSelect">
<columns>
<Column demandPopin="false" width="auto" hAlign="Begin">
<Text text="{i18n>recommendation}"/>
</Column>
<Column minScreenWidth="Small" demandPopin="true" popinDisplay="Inline" hAlign="Begin">
<Text text="{i18n>itemid}"/>
</Column>
<Column minScreenWidth="Small" demandPopin="true" popinDisplay="Inline" hAlign="Begin">
<Text text="{i18n>areas}"/>
</Column>
<Column minScreenWidth="Small" demandPopin="true" popinDisplay="Inline" hAlign="Begin">
<Text text="{i18n>regions}"/>
</Column>
<Column minScreenWidth="Small" demandPopin="true" popinDisplay="Inline" hAlign="Begin">
<Text text="{i18n>url}"/>
</Column>
</columns>
<dragDropConfig>
<dnd:DragInfo groupName="itemsgroup" sourceAggregation="items"/>
<dnd:DropInfo groupName="dragdrop" drop="onDragDrop"/>
</dragDropConfig>
<items>
<ColumnListItem>
<cells>
<Text text="{private}"/>
<Text text="{private}"/>
<Text text="{private}"/>
<Text text="{private}"/>
<Link href="{private}" text="{i18n>urltext}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</f:content>
</f:DynamicPage>
</mvc:View>
onDragDrop: function () {
var oSwap = this.byId("tableid").getSelectedItems()
if (oSwap.length !== 2) {
var bCompact = !!this.getView().$().closest(".sapUiSizeCompact").length;
MessageBox.error(
"Please pick two items.", {
styleClass: bCompact ? "sapUiSizeCompact" : ""
}
);
}
else{
var jObject = JSON.parse(this.getModel("table").getJSON());
var first = JObject.indexOf()
var second = JObject.indexOf()
jObject[first] =
jObject[second] =
this.setModel(new JSONModel(jObject), "table");
}
}

Try this:
<dnd:DragInfo sourceAggregation="items"/>
<dnd:DropInfo drop="onDragDrop" targetAggregation="items" dropPosition="Between" dropLayout="Vertical"/>
You can refer to this example in the SDK for further info

Related

SAPUI5: How can display the navigation property of an entity which multiple records in a table

I have a table with many rows, based on the selected item, it should populate the associated navigation property which also has many records in another table.
I have handled the selectionChange event in my controller to trigger this behavior and I see that it returns the record(s) in my response but it doesn't show the binding in my table. Please help in this regard. This is my code
Controller.js
this.subsystemList.setEnabled(true);
this.manageDistribution.setEnabled(true);
var sourceSystem = oEvt.getSource().getSelectedItem().getBindingContext("pcsdModel").getPath();
var path = sourceSystem +"/"+"SubSystems";
var oItemTemplate = new sap.m.ColumnListItem();
this.getView().byId("idSubsystemListTable").bindItems({
path:path,
parameters:{
expand:"SubSystems"
},
length: 1,
template: oItemTemplate
});
},
This is my table
<Table id="idSubsystemListTable" inset="false">
<columns>
<Column minScreenWidth="Tablet" demandPopin="true">
<Text text="Source System Level"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true">
<Text text="Due Date Reminder"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true">
<Text text="Cutoff Date Reminder"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true">
<Text text="Actions"/>
</Column>
</columns>
<items>
<ColumnListItem vAlign="Middle">
<cells>
<Text text="{SourceSystemLevel}"/>
<Text text="{DueDateReminder}"/>
<Text text="{CutoffDateReminder}"/>
<HBox>
<Button icon="sap-icon://edit"/>
<Button icon="sap-icon://delete"/>
</HBox>
</cells>
</ColumnListItem>
</items>
</Table>
This is the response from the serverenter image description here

Highlight selected row of table in SAP UI5

I am using sap.m.table with mode "SingleSelectLeft" and with Aggregation ColumnListItem of type "Navigation".
On clicking of any of the items from the table, I want to show another page in split-app(detail page). I have put the routing code in the press event of ColumnListItem but this is leading to an issue as :
The selected item goes off(not appearing selected) when I click on the detail page.
Here is the snippet I am working with:
<Table inset="false" noDataText="{i18n>noDataMasterTable}" mode="SingleSelectLeft" selectionChange="onLineItemSelected" id="s2-table"
updateFinished="onListUpdateFinished" items="{mainService>/Bp}" busyIndicatorDelay="{detailView>/lineItemTableDelay}"
itemPress="handleMasterPress" width="100%" >
<headerToolbar>
<OverflowToolbar>
<SearchField id="s2-searchfield-search" tooltip="{i18n>searchToolTip}" liveChange="onSearch" width="auto"></SearchField>
<Button id="s2-table-activate" text="Activate" press="handleActivateBusinessPurpose" enabled="false"/>
<Button id="s2-table-delete" text="{i18n>delete}" press="handleDelete" enabled="false"/>
<Button id="s2-table-add" icon="sap-icon://add" press="handleCreatePress" tooltip="{i18n>addToolTip}"/>
</OverflowToolbar>
</headerToolbar>
<columns>
<Column >
<Text text="{i18n>Name}"/>
</Column>
<Column>
<Text text="{i18n>ApplicationGroupName}"/>
</Column>
<Column demandPopin="true" minScreenWidth="Tablet">
<Text text="{i18n>DataSubjectType}"/>
</Column>
<Column demandPopin="true" minScreenWidth="Tablet">
<Text text="{i18n>LegalEntity}"/>
</Column>
<Column demandPopin="true" minScreenWidth="Tablet">
<Text text="{i18n>Status}"/>
</Column>
</columns>
<items>
<ColumnListItem type="Navigation" press="handleMasterPress">
<!--<ColumnListItem >-->
<cells>
<ObjectIdentifier title="{mainService>BusinessPurposeName}"/>
<ObjectIdentifier text="{mainService>ApplicationGroupName}"/>
<ObjectIdentifier text="{mainService>DataSubjectType}"/>
<ObjectIdentifier text="{mainService>LegalEntityValue}"/>
<ObjectStatus text="{path:'mainService>Status', formatter:'.formatPurposeStatus'}"
state="{path:'mainService>Status', formatter:'.formatStatusColor'}"/>
</cells>
</ColumnListItem>
</items>
</Table>
Please let me know how can I show the selected item highlighted in the table.
First, you are firing 2 event on pressing and handling them with the same function. So, delete itemPress="handleMasterPress" or use another funtion.
Then, handleMasterPress() will be executed by the <ColumnListItem type="Navigation" press="handleMasterPress">
So in the handler, get the source from the event object and pass it to the table in the setSelectedItem() function
handleMasterPress: function(oEvent){
var oColumnListItem = oEvent.getSource();
var oTable = oColumnListItem.getParent();
oTable.setSelectedItem(oColumnListItem);
}
Here a working snippet
// define a new (simple) Controller type
sap.ui.controller("my.own.controller", {
handleMasterPress: function(oEvent){
var oColumnListItem = oEvent.getSource();
console.log(oColumnListItem.getMetadata())
var oTable = oColumnListItem.getParent();
oTable.setSelectedItem(oColumnListItem);
}
});
// instantiate the View
var myView = sap.ui.xmlview({viewContent:jQuery('#view1').html()}); // accessing the HTML inside the script tag above
// create some dummy JSON data
var data = {
WaybillsPlaces: [{
CoNumber: "Item 1",
},{
CoNumber: "Item 2",
},{
CoNumber: "Item 3",
}]
};
// create a Model and assign it to the View
var oModel = new sap.ui.model.json.JSONModel();
oModel.setData(data);
myView.setModel(oModel, "mainService");
// put the View onto the screen
myView.placeAt('content');
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<meta charset="utf-8">
<title>MVC with XmlView</title>
<!-- Load UI5, select "blue crystal" theme and the "sap.m" control library -->
<script id='sap-ui-bootstrap'
src='https://sapui5.hana.ondemand.com/resources/sap-ui-core.js'
data-sap-ui-theme='sap_bluecrystal'
data-sap-ui-libs='sap.m'
data-sap-ui-xx-bindingSyntax='complex'></script>
<!-- DEFINE RE-USE COMPONENTS - NORMALLY DONE IN SEPARATE FILES -->
<!-- define a new (simple) View type as an XmlView
- using data binding for the Button text
- binding a controller method to the Button's "press" event
- also mixing in some plain HTML
note: typically this would be a standalone file -->
<script id="view1" type="sapui5/xmlview">
<mvc:View
controllerName="my.own.controller"
xmlns:mvc="sap.ui.core.mvc"
xmlns="sap.m">
<Panel headerText="Table Panel">
<Table inset="false" noDataText="{i18n>noDataMasterTable}" mode="SingleSelectLeft" selectionChange="onLineItemSelected" id="s2-table"
updateFinished="onListUpdateFinished" items="{mainService>/WaybillsPlaces}" busyIndicatorDelay="{detailView>/lineItemTableDelay}"
width="100%" >
<headerToolbar>
<OverflowToolbar>
<SearchField id="s2-searchfield-search" tooltip="{i18n>searchToolTip}" liveChange="onSearch" width="auto"></SearchField>
<Button id="s2-table-activate" text="Activate" press="handleActivateBusinessPurpose" enabled="false"/>
<Button id="s2-table-delete" text="{i18n>delete}" press="handleDelete" enabled="false"/>
<Button id="s2-table-add" icon="sap-icon://add" press="handleCreatePress" tooltip="{i18n>addToolTip}"/>
</OverflowToolbar>
</headerToolbar>
<columns>
<Column >
<Text text="{i18n>Name}"/>
</Column>
<Column>
<Text text="{i18n>ApplicationGroupName}"/>
</Column>
<Column demandPopin="true" minScreenWidth="Tablet">
<Text text="{i18n>DataSubjectType}"/>
</Column>
<Column demandPopin="true" minScreenWidth="Tablet">
<Text text="{i18n>LegalEntity}"/>
</Column>
<Column demandPopin="true" minScreenWidth="Tablet">
<Text text="{i18n>Status}"/>
</Column>
</columns>
<items>
<ColumnListItem type="Active" press="handleMasterPress">
<!--<ColumnListItem >-->
<cells>
<ObjectIdentifier title="{mainService>CoNumber}"/>
<ObjectIdentifier text="{mainService>CoNumber}"/>
<ObjectIdentifier text="{mainService>CoNumber}"/>
<ObjectIdentifier text="{mainService>CoNumber}"/>
<ObjectStatus text="{path:'mainService>Status', formatter:'.formatPurposeStatus'}"
state="{path:'mainService>Status', formatter:'.formatStatusColor'}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</Panel>
</mvc:View>
</script>
</head>
<body id='content' class='sapUiBody'>
</body>
</html>
Add the following attribute to the items element within the Table element:
items="{
path: '{mainService>/Bp}',
type : 'sap.m.ListType.Active'
}"
Refer
sap.m.ListType.Active
Indicates that the item is clickable via active feedback when item is pressed.
Source: https://openui5.hana.ondemand.com/#/api/sap.m.ListType/overview

How to Bind the Property of an Instance?

I created an array of objects:
buildPayerModel: function() {
return [
new SalesPayer("000", "2333", "033.433", "CHF"),
new SalesPayer("000", "2333", "033.433", "CHF"),
new SalesPayer("000", "2333", "033.433", "CHF")
];
}
and as a model:
this.getView().setModel(this.buildPayerModel(), "Sales")
Now I want to show the data in Table as the following:
<Table id="SalesView" inset="false" items="{ path: '/Sales' }">
<headerToolbar>
<Toolbar>
<Title text="Statistics" level="H2"/>
</Toolbar>
</headerToolbar>
<columns>
<Column width="12em">
<Text text="Payer"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true">
<Text text="Name"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true" hAlign="End">
<Text text="Net Value"/>
</Column>
<Column hAlign="End">
<Text text="Currency"/>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<ObjectIdentifier title="{Sales.id}"/>
<Text text="{Sales.name}"/>
<Text text="{Sales.name}"/>
<Text text="{Sales.name}"/>
</cells>
</ColumnListItem>
</items>
</Table>
How to access the property of the instance?
Your buildPayerModel() is not building a model.
The API setModel awaits a "subclass" of sap.ui.model.Model (not an array), and a corresponding model name ("Sales" in your case).
A short binding syntax looks as follows: "{modelName>/propertyName}".
The binding is defined inside the curly brackets: { ... }
The > is needed when there is a model name.
The / at the beginning (right after possible >) indicates absolute binding syntax
Without / at the beginning --> "{modelName>childPropertyName}" indicates relative binding syntax. It is relative because such binding cannot be resolved without given context.
Given JSONModel for the "Sales", and a SalesPayer instance contains direct properties such as name and id, here is a fix for you:
buildPayerModel: function() {
return new /*sap.ui.model.json.*/JSONModel([
new SalesPayer("000", "2333", "033.433", "CHF"),
new SalesPayer("000", "2333", "033.433", "CHF"),
new SalesPayer("000", "2333", "033.433", "CHF")
]);
},
Somewhere in the same controller:
this.getView().setModel(this.buildPayerModel(), "Sales")
XMLView:
<Table id="SalesView" inset="false" items="{Sales>/}">
<headerToolbar>
<Toolbar>
<Title text="Statistics" level="H2"/>
</Toolbar>
</headerToolbar>
<columns>
<Column width="12em">
<Text text="Payer"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true">
<Text text="Name"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true" hAlign="End">
<Text text="Net Value"/>
</Column>
<Column hAlign="End">
<Text text="Currency"/>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<ObjectIdentifier title="{Sales>id}"/>
<Text text="{Sales>name}"/>
<Text text="{Sales>name}"/>
<Text text="{Sales>name}"/>
</cells>
</ColumnListItem>
</items>
</Table>
setModel() gets a model as first parameter, not a plain JSON Object or Array. Furthermore, the second parameter is the model name, if you name it as "Sales", you must use "Sales>" in your bindings. Then, remember:
1. Use the "/" at the begining when building a path from the root of the model.
2. Avoid the "/" at the begining if you are binding a path relative to another context (Let's say the context of each row of the table)
Try something like this:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<meta charset="utf-8">
<title>MVC with XmlView</title>
<!-- Load UI5, select "blue crystal" theme and the "sap.m" control library -->
<script id='sap-ui-bootstrap'
src='https://sapui5.hana.ondemand.com/resources/sap-ui-core.js'
data-sap-ui-theme='sap_belize_plus'
data-sap-ui-libs='sap.m'
data-sap-ui-xx-bindingSyntax='complex'></script>
<!-- DEFINE RE-USE COMPONENTS - NORMALLY DONE IN SEPARATE FILES -->
<!-- define a new (simple) View type as an XmlView
- using data binding for the Button text
- binding a controller method to the Button's "press" event
- also mixing in some plain HTML
note: typically this would be a standalone file -->
<script id="view1" type="sapui5/xmlview">
<mvc:View xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc" controllerName="my.own.controller">
<Table id="SalesView" inset="false" items="{ path: 'Sales>/players' }">
<headerToolbar>
<Toolbar>
<Title text="Statistics" level="H2"/>
</Toolbar>
</headerToolbar>
<columns>
<Column width="12em">
<Text text="Payer"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true">
<Text text="Name"/>
</Column>
<Column minScreenWidth="Tablet" demandPopin="true" hAlign="End">
<Text text="Net Value"/>
</Column>
<Column hAlign="End">
<Text text="Currency"/>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<ObjectIdentifier title="{Sales>id}"/>
<Text text="{Sales>name}"/>
<Text text="{Sales>name}"/>
<Text text="{Sales>name}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</mvc:View>
</script>
<script>
// define a new (simple) Controller type
sap.ui.controller("my.own.controller", {
onInit: function(){
this.getView().setModel(this.buildPayerModel(), "Sales")
},
buildPayerModel: function() {
var oModelData = {
"players": [
{"id": 001, "name": "Michael Jordan"},
{"id": 002, "name": "Kobe Bryant"},
{"id": 003, "name": "LeBron James"}
]
};
var oModel = new sap.ui.model.json.JSONModel(oModelData)
return oModel;
}
});
// instantiate the View
var myView = sap.ui.xmlview({viewContent:jQuery('#view1').html()}); // accessing the HTML inside the script tag above
// put the View onto the screen
myView.placeAt('content');
</script>
</head>
<body id='content' class='sapUiBody'>
</body>
</html>

fetch certain amount of records and show in table

how to fetch records from database.I have 500 records i the database i want to fetch 200 records initlally and after user press more than i want to fetch another 200 records...I have done like below but am getting only 200 records if i use top=200..
if am not using top=200..then getting all records..
var url = "/sap/opu/odata/sap/ZODATA_CRUD_OPR_SRV/";
//Service Url
var oModel1 = new sap.ui.model.odata.ODataModel(url);
var oUrlParams = "$top=" + '200' + "&$skip=" +'0' ;
oModel1.read("/EmpDetails1Set", null,oUrlParams,true, function(oData){ //read method
oODataJSONModel.setData(oData);
that.getView().setModel(oODataJSONModel,"emp");
},
function(error) {
});
<Table id="table" width="auto" growingScrollToLoad="false" growingThreshold="100" items="{emp>/results}" growing="true">
<columns>
<Column id="nameColumn">
<Text text="" id="nameColnTitle"/>
</Column>
<Column id="namolumn">
<Text text="" id="nameCumnTitle"/>
</Column>
</columns>
<items>
<ColumnListItem type="Navigation" press="onPress">
<cells>
<Text id="ob" text="{emp>Name}"/>
<Text text="{emp>Address}"/>
</cells>
</ColumnListItem>
</items>
</Table>
Setting items="{/EmpDetails1Set}" is important by which it will call OData collection. I hope you have set /sap/opu/odata/sap/ZODATA_CRUD_OPR_SRV/ as your OData Service url of the application.
By this method you don't need to set model data from controller to the view.
<?xml version="1.0" encoding="UTF-8"?>
<Table id="table" width="auto" growingScrollToLoad="false" growingThreshold="100" items="{/EmpDetails1Set}" growing="true">
<columns>
<Column id="nameColumn">
<Text text="" id="nameColnTitle" />
</Column>
<Column id="namolumn">
<Text text="" id="nameCumnTitle" />
</Column>
</columns>
<items>
<ColumnListItem type="Navigation" press="onPress">
<cells>
<Text id="ob" text="{Name}" />
<Text text="{Address}" />
</cells>
</ColumnListItem>
<items>
</Table>

getBindingContext() is undefined

I'm making a little program for a school assignment, but I encounter a problem.
I need to make a program in SAPUI5 that loads JSON data in a table. On each row there is a function (onItemSelected) attached. So when I press on a row, I need to get the ID of the weekday.
This is how the program looks like now:
When I press on a row, it says that my getBindingContext() is undefined.
In my index.html
sap.ui.getCore().attachInit(function(){
var oWeekdagModel = new sap.ui.model.json.JSONModel();
oWeekdagModel.loadData("./model/weekdagen.json");
sap.ui.getCore().setModel(oWeekdagModel, "week");
});
var oResourceModel = new sap.ui.model.resource.ResourceModel({
bundleName : "sap.ui.demo.db.i18n.i18n"
});
sap.ui.getCore().setModel(oResourceModel, "i18n");
new sap.ui.core.mvc.XMLView({
viewName: "sap.ui.demo.db.view.App"
}).placeAt("content");
App.view.xml
<mvc:View
xmlns:l="sap.ui.layout"
xmlns:mvc="sap.ui.core.mvc"
xmlns="sap.m"
controllerName="sap.ui.demo.db.controller.App"
>
<Table id="idWeekdagenTable"
inset="false"
items="{week>/weekdays}"
>
<headerToolbar>
<!-- ... -->
</headerToolbar>
<columns>
<Column width="20%">
<Text text="Id" />
</Column>
<Column width="20%">
<Text text="Weekdag" />
</Column>
<Column width="20%">
<Text text="Aantal gewoon eten" />
</Column>
</columns>
<items>
<ColumnListItem
press=".onItemSelected"
type="Active"
>
<Text id="id" text="{week>id}" />
<Text id="day" text="{week>day}" />
<Text text="{week>no_meals}" />
</ColumnListItem>
</items>
</Table>
<Table id="idMaaltijdenTable"
inset="false"
items="{maaltijd>/meals}"
>
<headerToolbar>
<!-- ... -->
</headerToolbar>
<columns>
<Column width="20%">
<Text text="Maaltijd" />
</Column>
<Column width="20%">
<Text text="Descriptie"/>
</Column>
</columns>
<items>
<ColumnListItem
press=".onItemSelected"
type="Active"
>
<Text text="{maaltijd>MealNo}" />
<Text text="{maaltijd>items}" />
</ColumnListItem>
</items>
</Table>
</mvc:View>
App.controller.js
sap.ui.define([
"sap/ui/core/mvc/Controller"
], function (Controller){
"use strict";
return Controller.extend("sap.ui.demo.db.controller.App", {
onInit: function() {
var oWeekdagModel = new sap.ui.model.json.JSONModel();
oWeekdagModel.loadData("weekdagen.json");
//binding op view
sap.ui.getCore().setModel(oWeekdagModel);
},
onItemSelected: function(oEvent) {
var oItem, oCtx;
oItem = oEvent.getSource();
oCtx = oItem.getBindingContext();
alert(oCtx); // is undefined
}
});
});
You can pull out the day's ID from the model using binding path. Here is a relevant part of your onItemSelected() function:
...
oCtx = oItem.getBindingContext();
var oPressedItem = sap.ui.getCore().getModel().getProperty(oCtx.getPath());
...
and then oPressedItem.id will give you the ID of the day from the top table and oPressedItem.dayId - from the bottom table.
Here is a working example.