Create a new file collaborative.controller.js
in webapp/controller
either using the “File” menu or using the right click menu.
Open the webapp/controller/collaborative.controller.js
file and add the following code:
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/m/MessageToast",
'sap/ui/model/Filter',
'sap/ui/model/FilterOperator'
], function(Controller, MessageToast, Filter, FilterOperator) {
"use strict";
return Controller.extend("mlmovielens.controller.collaborative", {
onInit: function() {
if (typeof sap.ui.getCore().getModel() === 'undefined') {
sap.ui.getCore().setModel(new sap.ui.model.json.JSONModel());
}
this.getView().setModel(new sap.ui.model.json.JSONModel(), "item");
},
onAfterRendering: function() {
this.selectItem("");
},
formatEpoch: function(value) {
if (value !== 'undefined' && this.isNumeric(value)) {
return new Date(value * 1000).toDateString();
} else {
return "";
}
},
formatNumber: function(value) {
if (value !== 'undefined' && this.isNumeric(value)) {
return Number(value).toFixed(2);
} else {
return "";
}
},
formatPercent: function(value) {
if (value !== 'undefined' && this.isNumeric(value)) {
return Number(value * 100).toFixed(2) + "%";
} else {
return "";
}
},
isNumeric: function(oValue) {
var tmp = oValue && oValue.toString();
return !jQuery.isArray(oValue) && (tmp - parseFloat(tmp) + 1) >= 0;
},
selectItem: function(value) {
var oItemModel = this.getView().getModel("item");
var tableFilters = [];
// only allow numeric direct input
if (this.isNumeric(value)) {
// get the current model
var oModel = this.getView().getModel();
var item = oModel.getProperty("/SUMMARY_RATING_USER(" + value + ")", this, true);
if (item !== 'undefined') {
tableFilters = [
new Filter([
new Filter("USERID", FilterOperator.EQ, item.USERID)
], false)
];
oItemModel.setProperty("/selectedItemId", item.USERID);
oItemModel.setProperty("/item", item);
}
} else {
tableFilters = [
new Filter([
new Filter("USERID", FilterOperator.EQ, -1)
], false)
];
}
this.getView().byId("history").getBinding("rows").filter(tableFilters);
this.getView().byId("recommendation_apl").getBinding("rows").filter(tableFilters);
this.getView().byId("recommendation_pal").getBinding("rows").filter(tableFilters);
},
onSubmit: function(oEvent) {
var key = oEvent.getParameter("value");
this.selectItem(key);
},
onSuggestionItemSelected: function(oEvent) {
if (oEvent.getParameter("selectedItem") !== null) {
var key = oEvent.getParameter("selectedItem").getKey();
this.selectItem(key);
}
},
onSuggest: function(oEvent) {
var value = oEvent.getSource().getValue();
var suggestionFilters = [];
if (value) {
// don't search numeric field if the input is not numerci
if (!this.isNumeric(value)) {
suggestionFilters = [
new Filter([
new Filter("tolower(DESCRIPTION)", FilterOperator.Contains, "'" + value.toLowerCase() + "'"),
], false)
];
} else {
suggestionFilters = [
new Filter([
new Filter("tolower(DESCRIPTION)", FilterOperator.Contains, "'" + value.toLowerCase() + "'"),
new Filter("USERID", FilterOperator.EQ, value),
new Filter("RATING_COUNT", FilterOperator.EQ, value)
], false)
];
}
}
this.getView().byId("input").getBinding("suggestionItems").filter(suggestionFilters);
}
});
});
A few details about the controller:
- to provide the number and date values in a nicer format, there are a few format functions
- as we use an OData model, we can play with model filters to simplify our implementation with the input suggestion or the display tables that will be added in the view
Click on the
button (or press CTRL+S)