La estructura de archivos de esta interfaz será simple ya que no es el foco de este tutorial. Crea una carpeta llamada exerciseChat
en tu módulo web, resources
:
Crea una carpeta llamada view
dentro de esa carpeta. Habrá un archivo, con el siguiente nombre y código:
view/App.view.xml
<mvc:View controllerName="sap.xs.chat.controller.App" xmlns="sap.m" xmlns:l="sap.ui.layout" xmlns:mvc="sap.ui.core.mvc" height="100%">
<Page title="{i18n>appTitle}">
<content>
<ScrollContainer height="100%" width="100%" horizontal="true" vertical="true">
<Panel headerText="Node.js WebSocket Chat" expandable="true" expanded="true">
<l:VerticalLayout class="sapUiContentPadding" width="100%">
<l:content>
<Input id="uName" value="{chatModel>/user}"/>
</l:content>
<l:content>
<TextArea id="chatInfo" value="{chatModel>/chat}" cols="60" rows="8" editable="false"/>
</l:content>
<l:content>
<Input id="message" value="{chatModel>/message}" placeholder="Enter Chat Text Here..."/>
</l:content>
</l:VerticalLayout>
<Button text="Send" press="sendMsg"/>
</Panel>
</ScrollContainer>
</content>
</Page>
</mvc:View>
Ahora crea una carpeta llamada controller
. Crearemos dos archivos dentro de esta carpeta.
controller/App.controller.js
/*eslint no-console: 0, no-unused-vars: 0, no-use-before-define: 0, no-redeclare: 0, no-undef: 0, no-sequences: 0, no-unused-expressions: 0*/
//To use a javascript controller its name must end with .controller.js
sap.ui.define([
"sap/xs/chat/controller/BaseController",
"sap/ui/model/json/JSONModel"
], function(BaseController, JSONModel) {
"use strict";
jQuery.sap.require("sap.ui.core.ws.WebSocket");
var connection = new sap.ui.core.ws.WebSocket("/node/chatServer");
return BaseController.extend("sap.xs.chat.controller.App", {
onInit: function() {
this.getView().addStyleClass("sapUiSizeCompact"); // make everything inside this View appear in Compact mode
// server messages
connection.attachMessage(function(oControlEvent) {
var oModel = sap.ui.getCore().getComponent("comp").getModel("chatModel");
var result = oModel.getData();
var data = jQuery.parseJSON(oControlEvent.getParameter("data"));
var msg = data.user + ": " + data.text,
lastInfo = result.chat;
if (lastInfo.length > 0) {
lastInfo += "rn";
}
oModel.setData({
chat: lastInfo + msg
}, true);
// scroll to textarea bottom to show new messages
// $("#comp---app--chatInfo-inner").scrollTop($("#comp---app--chatInfo-inner")[0].scrollHeight);
});
// error handling
connection.attachError(function(oControlEvent) {
sap.m.MessageToast.show("Websocket connection error");
});
// onConnectionClose
connection.attachClose(function(oControlEvent) {
sap.m.MessageToast.show("Websocket connection closed");
});
sap.ui.getCore().byId("comp---app--message").onsapenter = function(e) {
if (sap.m.InputBase.prototype.onsapenter) {
sap.m.InputBase.prototype.onsapenter.apply(this, arguments);
}
var oController = sap.ui.getCore().byId("comp---app").getController();
oController.sendMsg();
};
},
// send message
sendMsg: function() {
var oModel = this.getOwnerComponent().getModel("chatModel");
var result = oModel.getData();
var msg = result.message;
if (msg.length > 0) {
connection.send(JSON.stringify({
user: result.user,
text: result.message
}));
oModel.setData({
message: ""
}, true);
}
},
onErrorCall: function(oError) {
if (oError.statusCode === 500 || oError.statusCode === 400 || oError.statusCode === "500" || oError.statusCode === "400") {
var errorRes = JSON.parse(oError.responseText);
if (!errorRes.error.innererror) {
sap.m.MessageBox.alert(errorRes.error.message.value);
} else {
if (!errorRes.error.innererror.message) {
sap.m.MessageBox.alert(errorRes.error.innererror.toString());
} else {
sap.m.MessageBox.alert(errorRes.error.innererror.message);
}
}
return;
} else {
sap.m.MessageBox.alert(oError.response.statusText);
return;
}
}
});
});
controller/BaseController.js
/*global history */
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/core/routing/History"
], function (Controller, History) {
"use strict";
return Controller.extend("sap.xs.chat.controller.BaseController", {
/**
* Convenience method for accessing the router in every controller of the application.
* @public
* @returns {sap.ui.core.routing.Router} the router for this component
*/
getRouter : function () {
return this.getOwnerComponent().getRouter();
},
/**
* Convenience method for getting the view model by name in every controller of the application.
* @public
* @param {string} sName the model name
* @returns {sap.ui.model.Model} the model instance
*/
getModel : function (sName) {
return this.getView().getModel(sName);
},
/**
* Convenience method for setting the view model in every controller of the application.
* @public
* @param {sap.ui.model.Model} oModel the model instance
* @param {string} sName the model name
* @returns {sap.ui.mvc.View} the view instance
*/
setModel : function (oModel, sName) {
return this.getView().setModel(oModel, sName);
},
/**
* Convenience method for getting the resource bundle.
* @public
* @returns {sap.ui.model.resource.ResourceModel} the resourceModel of the component
*/
getResourceBundle : function () {
return this.getOwnerComponent().getModel("i18n").getResourceBundle();
},
/**
* Event handler for navigating back.
* It there is a history entry we go one step back in the browser history
* If not, it will replace the current entry of the browser history with the master route.
* @public
*/
onNavBack : function() {
var sPreviousHash = History.getInstance().getPreviousHash();
if (sPreviousHash !== undefined) {
history.go(-1);
} else {
this.getRouter().navTo("master", {}, true);
}
}
});
}
);
Fuera de esta carpeta, en el exerciseChat
carpeta, agregue el index.html
archivo con el siguiente código para llamar a su opinión:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<!-- <script id="sap-ui-bootstrap" src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js" -->
<script id="sap-ui-bootstrap" src="{{{sapui5_sb.url}}}/resources/sap-ui-core.js"
data-sap-ui-theme="sap_belize_plus"
data-sap-ui-xx-bindingSyntax="complex"
data-sap-ui-compatVersion="edge"
data-sap-ui-preload="async"
data-sap-ui-language="en"
data-sap-ui-resourceroots='{
"sap.xs.chat": "./",
"view": "./view" }'
data-sap-ui-libs="sap.m,sap.ui.comp,sap.ui.core,sap.ui.layout,sap.ui.unified">
</script>
<script type="text/javascript" src="../common/startup.js"></script>
<script>
localShellStartup("sap.xs.chat");
</script>
</head>
<body class="sapUiBody" role="application">
<div id="content"></div>
</body>
</html>
Crear un Component.js
archivo con el siguiente código:
/*eslint no-console: 0, no-unused-vars: 0, no-use-before-define: 0, no-redeclare: 0*/
sap.ui.define([
"sap/ui/core/UIComponent"
], function(UIComponent) {
"use strict";
return UIComponent.extend("sap.xs.chat.Component", {
metadata: {
manifest: "json"
},
init: function(){
jQuery.sap.require("sap.m.MessageBox");
jQuery.sap.require("sap.m.MessageToast");
sap.ui.core.UIComponent.prototype.init.apply(
this, arguments);
// Chat Model
var oModel = this.getModel("chatModel");
var names = ["Student1","Student2","Student3","Student4","Student5","Student6"];
oModel.setData({
user: names[Math.floor(names.length * Math.random())],
chat: "",
message: ""
});
},
destroy: function() {
// call the base component's destroy function
UIComponent.prototype.destroy.apply(this, arguments);
}
});
});
Finalmente crea un archivo llamado manifest.json
sa exerciseChat
carpeta. Aquí está su contenido.
{
"_version": "1.4.0",
"start_url": "index.html",
"sap.app": {
"_version": "1.4.0",
"type": "application",
"resources": "resources.json",
"i18n": "i18n/i18n.properties",
"id": "exerciseChat",
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"applicationVersion": {
"version": "${project.version}"
}
},
"sap.fiori": {
"_version": "2.0.0",
"registrationIds": [],
"archeType": "transactional"
},
"sap.ui": {
"_version": "1.40.0",
"technology": "UI5",
"icons": {
"icon": "/images/favicon.ico",
"favIcon": "/images/favicon.ico"
},
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
},
"supportedThemes": [
"sap_hcb",
"sap_bluecrystal",
"sap_belize"
]
},
"sap.ui5": {
"config": {
"sapFiori2Adaptation": true
},
"rootView": {
"viewName": "sap.xs.chat.view.App",
"type": "XML",
"id": "app"
},
"dependencies": {
"minUI5Version": "1.40.0",
"libs": {
"sap.ui.core": {
"minVersion": "1.40.0"
},
"sap.ui.comp": {
"minVersion": "1.40.0"
},
"sap.m": {
"minVersion": "1.40.0"
},
"sap.ui.layout": {
"minVersion": "1.40.0"
}
}
},
"contentDensities": {
"compact": true,
"cozy": true
},
"handleValidation": true,
"models": {
"chatModel": {
"type": "sap.ui.model.json.JSONModel",
"settings": {
"defaultBindingMode": "TwoWay"
}
},
"config": {
"type": "sap.ui.model.json.JSONModel"
},
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleUrl": "./i18n/i18n.properties"
}
}
}
}
}