https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/members/developer-advocates/nicoschoenteich.xml SAP Community - Nicolai Schoenteich 2025-05-14T11:30:17.056088+00:00 python-feedgen Nicolai Schoenteich in SAP Community https://community.sap.com/t5/technology-q-a/re-can-we-deploy-sapui5-web-components-app-onto-s-4-hana/qaq-p/13934291/comment-id/4891930#M4891930 Re: Can we deploy sapui5 web components app onto S/4 HANA... 2024-11-11T15:31:21.385000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Is this what you are looking for?</P><P><A href="https://www.npmjs.com/package/@sap/abap-deploy" target="_blank" rel="nofollow noopener noreferrer">https://www.npmjs.com/package/@sap/abap-deploy</A></P> 2024-11-11T15:31:21.385000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/on-what-makes-a-great-frontend-framework-and-why-ui5-is-one/ba-p/13936047 On what makes a great frontend framework and why UI5 is one 2024-11-12T17:32:10.336000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <H1 id="toc-hId-945751546">On what makes a great frontend framework and why UI5 is one</H1><P><EM>This blog post is about the qualities of an effective frontend framework and highlights UI5 as the best choice for modern, scalable, and future-proof web applications in the enterprise context. The purpose of this post is not to help you decide which frontend framework to choose for your next project, be it <A href="https://ui5.sap.com/" target="_blank" rel="noopener noreferrer">UI5</A>, <A href="https://react.dev/" target="_blank" rel="noopener nofollow noreferrer">React</A>, <A href="https://vuejs.org/" target="_blank" rel="noopener nofollow noreferrer">Vue.js</A>, <A href="https://svelte.dev/" target="_blank" rel="noopener nofollow noreferrer">Svelte</A>, or any combination of these (<A href="https://astro.build/" target="_blank" rel="noopener nofollow noreferrer">Astro</A>). It's purpose is more to highlight the strengths of UI5 based on my personal experience. Therefore, any examples, details or explanations I present are not (meant to be) exhaustive and are presented from my personal point of view.</EM></P><P><EM>I originally presented the content of this blog post at the <A href="https://community.sap.com/t5/sap-community/flexso-tech-day-2024/ev-p/13897666" target="_self">Flexso Tech Day 2024</A>.</EM></P><H2 id="toc-hId-878320760">Qualities of a great frontend framework</H2><P>When we think about what makes a great frontend framework (or any programming framework for that matter), we usually think along the lines of the following criteria:</P><UL><LI>performance</LI><LI>scalability</LI><LI>flexibility</LI><LI>stability</LI><LI>libraries</LI><LI>documentation</LI><LI>community</LI><LI>dev experience</LI></UL><P>These are all very important and valid aspects. In fact, a lot of frameworks have already checked those boxes. A few shine more in certain areas than others, but there is wide range frameworks that are great in these regards. However, there is one central aspect, that is by far the most important one (in my humble opinion):</P><P><STRONG>Getting things done.</STRONG></P><P>Even more importantly:</P><P><STRONG>Getting things done, fast. And make them last.</STRONG></P><P>In that regard, no other frameworks comes close to UI5. Let me explain.</P><H2 id="toc-hId-681807255">(1) The controls libraries vs. (2) the framework</H2><P>I like to categorize UI5's capabilities and features in two main areas. One the one hand, there is the (1) control libraries. With more than 1000 controls available out-of-the-box, it is incredibly easy to build complex applications containing different layouts, tables, forms, charts, and more with little to no custom coding. Because of these controls, theming (SAP Fiori) and accessibility are also a breeze. Controls are well designed and simply enterprise ready. On the other hand, there is the (2) framework itself, with all its integrations, service connections, tooling, i18n features, and (closeness to the) core technology. See this quick list of built-in framework features (not exhaustive and in no particular order):</P><UL><LI>integration into Fiori Launchpad</LI><LI>service connections: OData(!), REST, you name it</LI><LI>i18n</LI><LI>p13n</LI><LI>routing</LI><LI>grow-as-you-go</LI><LI>custom controls</LI><LI>close to the core technologies: HTML, CSS, JavaScript</LI></UL><P>I will focus on this second area in this blog post and will now go into detail.</P><H2 id="toc-hId-485293750">The framework</H2><H3 id="toc-hId-417862964">Grow-as-you-go</H3><P>Unlike many other frontend frameworks, UI5 makes it very easy to get started. Essentially you only need two files: an <FONT color="#339966">index.html</FONT> and one JavaScript file. An application like this doesn't even require a web server to work, because it is that simple (we will cover the aspect "closeness to core technologies" later). Of course, this kind of application doesn't make use of all the UI5 goodies available, nor does it follow its best practices, but it works - and that shows UI5's great design. Let's take a look at this simple example:</P><P>index.html</P><PRE>&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;title&gt;UI5 Walkthrough&lt;/title&gt; &lt;script id="sap-ui-bootstrap" src="https://ui5.sap.com/resources/sap-ui-core.js" data-sap-ui-async="true" data-sap-ui-on-init="module:ui5/walkthrough/index" data-sap-ui-resource-roots='{ "ui5.walkthrough": "./" }'&gt; &lt;/script&gt; &lt;/head&gt; &lt;body class="sapUiBody" id="content"&gt; &lt;/body&gt; &lt;/html&gt;</PRE><P>index.js</P><PRE>sap.ui.define([ "sap/m/IllustratedMessage", ], (IllustratedMessage) =&gt; { "use strict" new IllustratedMessage({ title: "Welcome to Flexso Tech Day 2024!", illustrationType: "sapIllus-SuccessHighFive" }).placeAt("content") })</PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="screen-shot0.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/190077iEE97C2DBA211C00C/image-size/large?v=v2&amp;px=999" role="button" title="screen-shot0.png" alt="screen-shot0.png" /></span></P><P>As you can see in the screen shot above, I simply opened the <FONT color="#339966">index.html</FONT> file in my browser and the UI5 application was up and running. This is of course not how you would build "real" applications, but it does demonstrate how easy it is to get started. And I personally love starting with simple project setups like this and following a grow-as-you-go approach. It's just a nice feeling to actually know what each individual file is doing, instead of having 100 files and not knowing what half of them are for. And let's admit it, we've all been there.</P><H3 id="toc-hId-221349459">Custom controls</H3><P>One of the great things about UI5 is that you can build your own custom controls. This sounds trivial, but it's actually a big deal, since you can operate within the UI5 framework and get all of its great features for free (see list above), while still being able to build anything you (or your customers) ever dreamed of. There is zero lock-in and you get the expensive part (in terms of coding effort) for free, like communicating with the backend. Fantastic, isn't it? Possibilities are endless. This is also due to the fact that UI5 itself is very close to its core technologies, namely HTML, CSS, and JavaScript. It means you can build your custom controls the same way, with technology you already know. Technically speaking, custom controls extend the <FONT color="#339966">sap.ui.core.Control</FONT> class (or any higher level class that itself extends the base class), which is how they become part of the framework and its lifecycle. Let's create a simple custom control to really show how flexible and powerful at the same time UI5 is.</P><P>I generated a little starter project using the <A href="https://github.com/ui5-community/generator-ui5-project/" target="_blank" rel="noopener nofollow noreferrer">easy-ui5 project generator</A>, which support a monorepo approach. This way, we can keep our whole project (frontend, backend, and everything in between) in one well-managed (thanks to <A href="https://docs.npmjs.com/cli/v8/using-npm/workspaces" target="_blank" rel="noopener nofollow noreferrer">npm workspaces</A>) project. I ran the following commands and selected all default options. For the custom controls I created one "BasicList" and one "BasicListItem":</P><PRE>yo easy-ui5 project project cd com.myorg.myui5project/ yo easy-ui5 project cap yo easy-ui5 project customcontrol yo easy-ui5 project customcontrol</PRE><P>The generated project structure looks like this (some artifacts omitted for brevity):</P><PRE>- myui5app/ - webapp/ - control/ - BasicList.js - BasicListItem.js - controller/ - css/ - i18n/ - model/ - test/ - view/ - Component.js - index.html - manifest.json - package.json - ui5.yaml - server/ - db/ - data/ - my.bookshop-Books.csv - schema.cds + srv/ - package.json - xs-security.json - mta.yaml - package.json</PRE><P>The backend of the project is based on the SAP Cloud Application Programming Model and came with a tiny sample, the bookshop. I changed the data model to represent a session catalog (for the event this content was originally presented at) and added corresponding sample data. Since this blog post is about UI5, I will just show the new <FONT color="#339966">schema.cds</FONT>, but not go into any more detail about building the backend:</P><PRE>namespace my.sessions; using {cuid} from '@sap/cds/common'; entity Sessions : cuid { title : String; abstract : String; speaker : String; }</PRE><P>Now for the frontend, we want to build a list of sessions that renders into simple HTML elements. Not just because it's simple, but because it shows that UI5 (and the underlying core technologies) is a blank canvas. <STRONG><EM>If you can use UI5 to write HTML, CSS, and JavaScript, you can use it to write anything.</EM> </STRONG>See it as your entry door to building frontend applications in the enterprise context. I know I am repeating myself, but with UI5 you have this flexibility <STRONG><EM>on top</EM></STRONG> of the (1) control libraries and (2) the framework.</P><P>Let's start with the <FONT color="#339966">BasicList.js</FONT>:</P><PRE>sap.ui.define([ "sap/ui/core/Control" ], function(Control) { "use strict" return Control.extend("myui5app.control.BasicList", { metadata: { properties: { editable: { type: "boolean" } }, aggregations: { items: { type: "sap.ui.core.Control" }, }, defaultAggregation: "items" }, renderer(oRm, oControl) { oRm.write("&lt;ul") oRm.writeControlData(oControl) // adds UI5 specific attributes to the HTML element oRm.write("&gt;") oControl.getItems().forEach(item =&gt; { oRm.renderControl(item) }) oRm.write("&lt;/ul&gt;") }, }) })</PRE><P>As already mentioned, this custom control extends the <FONT color="#339966">sap.ui.core.Control</FONT> class. We define some metadata, like the control's properties and aggregations (a fancy word for "its children"). These properties and aggregations can be used when consuming the control, for example in an XML view. Probably the most interesting part in the code above is the <FONT color="#339966">renderer()</FONT> method, where we essentially use the render manager (<FONT color="#339966">oRm</FONT> - opinions about hungarian notation anyone? <span class="lia-unicode-emoji" title=":winking_face:">😉</span>) to write our HTML. We open an unordered list (<FONT color="#339966">&lt;ul&gt;</FONT>), loop over all items (aggregations/children), call their respective renderer, and close the list. The great thing here is that we can combine UI5 internal methods (like <FONT color="#339966">getItems()</FONT>) with (more or less) plain HTML - again, we have great flexibility <STRONG><EM>on top</EM></STRONG> of the framework.</P><P>Let's now continue with the <FONT color="#339966">BasicListItem.js</FONT>:</P><PRE>sap.ui.define([ "sap/ui/core/Control" ], function(Control) { "use strict" return Control.extend("myui5app.control.BasicListItem", { metadata: { properties: { title: { type: "string" }, detail1: { type: "string" }, detail2: { type: "string" } } }, renderer(oRm, oControl) { oRm.write("&lt;li") oRm.writeControlData(oControl) oRm.write("&gt;") if (oControl.getParent().getEditable()) { oRm.write("&lt;input") oRm.addStyle("width", "calc(100vw - 100px)") oRm.writeStyles() oRm.writeAttribute("value", oControl.getTitle()) oRm.write("'&gt;&lt;/input&gt;") } else { oRm.write(oControl.getTitle()) } oRm.write("&lt;ul&gt;") oRm.write("&lt;li&gt;") oRm.writeEscaped(oControl.getDetail1()) oRm.write("&lt;/li&gt;") oRm.write("&lt;li&gt;") oRm.writeEscaped(oControl.getDetail2()) oRm.write("&lt;/li&gt;") oRm.write("&lt;/ul&gt;") oRm.write("&lt;/li&gt;") }, onchange(e) { this.setProperty("title", e.target.value) } }) })</PRE><P>This implementation is arguably a little more complex, but only because we call the <FONT color="#339966">oControl.getParent().getEditable()</FONT> method to check whether the outer list is editable or not. If it is editable, we render an input element, if not, we render an simple text. Regarding that, did you notice that we never actually defined a <FONT color="#339966">getEditable()</FONT> method? UI5 created that for us automatically when we defined the property editable for the <FONT color="#339966">BasicList</FONT> - nice! Another nice thing is that we can use the <FONT color="#339966">oRm.addStyle()</FONT> method to essentially add CSS to our custom control. We now got all pieces of the puzzle: HTML, CSS, JavaScript.</P><P>Let's now use our custom controls in the <FONT color="#339966">MainView.view.xml</FONT>:</P><PRE>&lt;mvc:View controllerName="myui5app.controller.MainView" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m" xmlns:cc="myui5app.control"&gt; &lt;VBox&gt; &lt;Title text="Flexso Tech Day 2024" /&gt; &lt;Button text="Edit" press=".edit" /&gt; &lt;/VBox&gt; &lt;cc:BasicList id="sessions" items="{/Sessions}" editable="false"&gt; &lt;cc:BasicListItem title="{title}" detail1="{abstract}" detail2="{speaker}"/&gt; &lt;/cc:BasicList&gt; &lt;/mvc:View&gt;</PRE><P>We make use of the data binding syntax to bind our default OData V4 model to our custom controls. This model was added to our application when we ran the <FONT color="#339966">cap</FONT> subgenerator of the easy-ui5 project generator. We will get back to this in just a second. Notice how we import our custom controls by defining a new <FONT color="#339966">cc</FONT> namespace pointing to the <FONT color="#339966">control/</FONT> directory within our application. Also notice how we combine our custom controls with standard UI5 controls like the <FONT color="#339966">Title</FONT> and <FONT color="#339966">Button</FONT>. Again, flexibility <STRONG><EM>on top</EM></STRONG> of the framework.</P><P>This is what the application now looks like:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="screen-shot1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/190092iABA966A7C0E8BC57/image-size/large?v=v2&amp;px=999" role="button" title="screen-shot1.png" alt="screen-shot1.png" /></span></P><P>To further undermine the tight integration of our custom controls with the rest of our UI5 application, let's add some logic to the <FONT color="#339966">MainView.controller.js</FONT> to make the custom list editable:</P><PRE>sap.ui.define(["sap/ui/core/mvc/Controller"], function(Controller) { "use strict" return Controller.extend("myui5app.controller.MainView", { edit: function() { const basicList = this.byId("sessions") basicList.setEditable(!basicList.getEditable()) } }) })</PRE><P>The <FONT color="#339966">edit</FONT> method was previously added to the press event of the <FONT color="#339966">Button</FONT> in the <FONT color="#339966">MainView.view.xml</FONT>. It simply toggles the <FONT color="#339966">editable</FONT> property of the <FONT color="#339966">BasicList</FONT> control. This is a very simple example, but it shows how easy it is to interact with your custom controls from somewhere else in your application.</P><P>Now comes my favorite part. If we press the "Edit" button and edit a title of a session, UI5 will actually submit the change to the backend. It will compose the correspoding OData batch request for us and the backend is automatically updated. This is what the OData V4 model as part of UI5 does for us, on top of custom controls! How great is that?! See the below screen shots for proof:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="screen-shot2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/190093iE8DF318968B279A9/image-size/large?v=v2&amp;px=999" role="button" title="screen-shot2.png" alt="screen-shot2.png" /></span><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="screen-shot3.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/190082i8146E80EFCC1E58D/image-size/large?v=v2&amp;px=999" role="button" title="screen-shot3.png" alt="screen-shot3.png" /></span></P><H2 id="toc-hId--104246765">UI5 2.x</H2><P>UI5 is currently still in major version 1, despite it being released in 2013. However, this doesn't mean that the framework is outdated. Over 130 minor versions have already been released. If anything, this shows the stability and maturity of the framework, as well as SAP's commitment to backwards compatibility, which is very important in the enterprise context.<BR />The next major version, UI5 2.x, is already in the works and will bring a lot of new features and improvements. One of the most anticipated features (for me) is the native support for web components, which will allow you to use your own web components within the UI5 framework. This will bring even greater flexibility and compatibility to UI5, especially in the context of "custom controls".</P><P>To conclude, I don't know of any other frontend framework that offers such great flexibility on top of a being enterprise-ready out-of-the-box and having 1000+ built-in controls (which I barely touched here). This is what I mean when I say "Getting things done, fast. And make them last.".</P><P>I am looking forward to hearing your thoughts/input/experiences in the comments below. Happy coding!</P> 2024-11-12T17:32:10.336000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/on-what-makes-a-great-frontend-framework-and-why-ui5-is-one/bc-p/13936627#M176971 Re: On what makes a great frontend framework and why UI5 is one 2024-11-13T08:56:22.081000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/25802">@frankmeertens</a>, thanks for the feedback. And I agree!&nbsp;</P> 2024-11-13T08:56:22.081000+01:00 https://community.sap.com/t5/technology-q-a/re-can-we-deploy-sapui5-web-components-app-onto-s-4-hana/qaq-p/13937175/comment-id/4892278#M4892278 Re: Can we deploy sapui5 web components app onto S/4 HANA... 2024-11-13T16:38:23.525000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1734257">@ThaaraSoft</a> have you had a chance to try it? 2024-11-13T16:38:23.525000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/creating-a-personal-development-environment-3-vim-keybindings/ba-p/13938067 Creating a personal development environment #3 - Vim keybindings 2024-11-14T12:42:21.722000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <OL><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/creating-a-personal-development-environment-1-why-neovim/ba-p/13733533" target="_blank">#1 - Why Neovim?</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/creating-a-personal-development-environment-2-miscellaneous-status-line-and/ba-p/13922474" target="_blank">#2 - Miscellaneous, status line, and color scheme</A></LI><LI>#3 - Vim keybindings (this blog post)</LI></OL><P><EM>Building on top of the previous two blog posts, this blog post will focus learning Vim keybindings, which is very central for using any Vim-based editor, let alone be productive with it.</EM></P><P>Before we get started with the keybindings though, let's do a quick recap of what my Neovim configuration, located at <FONT color="#339966">~/.config/nvim/</FONT>, looked like a this point:</P><PRE>- lua/ - plugins/ - filetree.lua - theme.lua - misc.lua - statusline.lua - init.lua - lazy-lock.json</PRE><P>What I did so far:</P><UL><LI>configured <A href="https://github.com/folke/lazy.nvim" target="_blank" rel="noopener nofollow noreferrer">lazy.nvim</A> as a plugin manager</LI><LI>added <A href="https://github.com/nvim-tree/nvim-tree.lua" target="_blank" rel="noopener nofollow noreferrer">nvim-tree</A> as a file explorer</LI><LI>customized the status line</LI><LI>added a nice color scheme</LI><LI>other miscellaneous settings</LI></UL><P>Now while doing all of this, we implicitly already talked about keybindings. After all, Neovim is a keyboard-first editor. You shouldn't really be using the mouse at all (although you can if you want to), which is why you have to use keybindings. However, we only really talked about custom keybindings - the ones that relate to a plugin and where you define the shortcut and the associated operation. But the most important keybindings are the ones that are built into Neovim itself, and since Neovim is a fork of Vim (did I already mention that? <span class="lia-unicode-emoji" title=":thinking_face:">🤔</span>), we can simply refer to them as Vim keybindings (also when googling <span class="lia-unicode-emoji" title=":winking_face:">😉</span>). These are the ones you will use the most for moving around, switching modes, editing text, and so on. Vim keybindings can seem quite odd at first (from a modern perspective), but they are incredibly powerful and well though-out.</P><P><EM>Regarding all my custom keybindings I mentioned that I like to group my keybindings by the category they fall into (in my understanding) and prefix them with the corresponding letter. For example, all keybinding related to the file system start with the letter <FONT color="#339966">f</FONT>, like <FONT color="#339966">fe</FONT> for opening the file explorer. Another example are all bindings related to the language server start with the letter <FONT color="#339966">l</FONT>, like <FONT color="#339966">ld</FONT> for "go to definition". This system helps me remembering them all. It somewhat different to what other people mostly do, which is prefixing all keybindings with a defined leader key, for example space.</EM></P><H2 id="toc-hId-1074893909">Vim keybindings</H2><P>I will not even try to <A href="https://vim.rtorr.com/" target="_blank" rel="noopener nofollow noreferrer">list</A> or <A href="https://world.hey.com/dhh/wonderful-vi-a1d034d3" target="_blank" rel="noopener nofollow noreferrer">explain the structure</A> of all Vim keybindings in this blog post - others can do that better. I will also not extensively talk about <A href="https://www.warp.dev/terminus/vim-modes" target="_blank" rel="noopener nofollow noreferrer">modes</A>, I only really use normal, insert, and visual mode. But I can give you an insight into the keybindings I use on a daily basis and how I personally make sense of them. Hopefully this helps you prioritize which keybindings to learn first and how to remember them. The keybindings listed here work in normal and visual mode, but not in insert mode, where your keystrokes will obviously be interpreted as text input.</P><P>For navigating in a file, I use the following keybindings:</P><UL><LI><FONT color="#339966">G</FONT>: Go to the end of the file</LI><LI><FONT color="#339966">gg</FONT>: Go to the beginning of the file</LI><LI><FONT color="#339966">$</FONT>: Go to the end of the line</LI><LI><FONT color="#339966">0</FONT>: Go to the beginning of the line</LI><LI><FONT color="#339966">e</FONT>: Move to the end of the current word</LI><LI><FONT color="#339966">b</FONT>: Move to the beginning of the current word</LI></UL><P>And I do have to confess I am one of the few Vim users who actually uses the arrow keys to move around (I know, I know), instead of <FONT color="#339966">h</FONT>, <FONT color="#339966">j</FONT>, <FONT color="#339966">k</FONT>, and <FONT color="#339966">l</FONT>. I have to reasons for that: First of all, I just couldn't get used to them. Second of all, I often find myself wanting to navigate around in insert mode, and the arrow keys are just more convenient in that situation than switching modes.</P><P>For editing text, I use the following keybindings:</P><UL><LI><FONT color="#339966">i</FONT>: Enter insert mode</LI><LI><FONT color="#339966">a</FONT>: Enter insert mode after the current cursor position (one character further right than with i)</LI><LI><FONT color="#339966">A</FONT>: Enter insert mode at the end of the line</LI><LI><FONT color="#339966">u</FONT>: Undo the last change</LI><LI><FONT color="#339966">Ctrl-r</FONT>: Redo the last change</LI><LI><FONT color="#339966">dw</FONT>: Delete the current word</LI><LI><FONT color="#339966">dd</FONT>: Delete the current line</LI><LI><FONT color="#339966">D</FONT>: Delete from the current cursor position to the end of the line</LI></UL><P>For selecting text and copy-pasta magic, I use the following keybindings:</P><UL><LI><FONT color="#339966">v</FONT>: Enter visual mode</LI><LI><FONT color="#339966">V</FONT>: Enter visual line mode (visually select whole line)</LI><LI><FONT color="#339966">y</FONT>: Yank (copy) the selected text (in visual mode)</LI><LI><FONT color="#339966">d</FONT>: Delete the selected text (in visual mode)</LI><LI><FONT color="#339966">c</FONT>: Change the selected text (in visual mode, delete and enter insert mode)</LI><LI><FONT color="#339966">p</FONT>: Paste the yanked text after the cursor</LI></UL><P>With this set of keybindings (that barely scratches the surface of what's possible) you can actually accomplish a lot of things, especially when combining them. For example, for navigating to the end of the file and going into insert mode at the end of the last line, you can simply use <FONT color="#339966">GA</FONT>. There are probably more efficient ways to get certain things done, but this "minimalistic" set of keybindings works well for me and most importantly, I can remember them. This is just the start and there is a lot more to learn, but that takes time and practice. I will try and add more keybindings to my repertoire as I go along. It's a fun journey.</P><P>And that's it for this blog post. Let's talk about the language server and how you can tailor it to your liking next time - arguably the most important and coolest part of a modern development environment.</P> 2024-11-14T12:42:21.722000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-use-destinations-during-local-development-cloud-foundry/bc-p/13948582#M177278 Re: SAP Tech Bytes: Use Destinations During Local Development - Cloud Foundry Basics #4 2024-11-26T10:54:45.361000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/15456">@AdilBasha1SAP</a>,&nbsp;these links work for me. Not sure why you can't access them. Maybe try another browser or a private window.</P> 2024-11-26T10:54:45.361000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/on-what-makes-a-great-frontend-framework-and-why-ui5-is-one/bc-p/13950700#M177338 Re: On what makes a great frontend framework and why UI5 is one 2024-11-28T09:49:53.786000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/14806">@akuller</a>, unfortunately not. There is a nightly build available though for OpenUI5 2.0: <A href="https://sdk.openui5.org/nightly/2/resources/sap-ui-core.js" target="_blank" rel="nofollow noopener noreferrer">https://sdk.openui5.org/nightly/2/resources/sap-ui-core.js</A></P> 2024-11-28T09:49:53.786000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-use-destinations-during-local-development-cloud-foundry/bc-p/13950706#M177339 Re: SAP Tech Bytes: Use Destinations During Local Development - Cloud Foundry Basics #4 2024-11-28T09:56:29.198000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/15456">@AdilBasha1SAP</a>,</P><P>if you run your CAP server and UI5 (or Fiori elements) app in the same process, make sure to use the <A href="https://www.npmjs.com/package/cds-plugin-ui5" target="_self" rel="nofollow noopener noreferrer">cds-plugin-ui5</A>. This way, the UI5 Tooling will be hooked into your CAP server, so that the ui5.yaml configuration is being used as well.</P><P>The xs-app.json is the configuration file the approuter, it has nothing to do with the CAP server per se - it's a separate application. You can run the approuter locally as well. To have the full service connectivity (that you have on SAP BTP) you will need to add the respective environment variables to the approuter's default-env.json. I did a video about that:&nbsp;<A href="https://www.youtube.com/watch?v=Jbq6zaKEUyY" target="_blank" rel="nofollow noopener noreferrer">https://www.youtube.com/watch?v=Jbq6zaKEUyY</A><BR /><BR />Hope this helps.</P><P>Best, Nico</P> 2024-11-28T09:56:29.198000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-using-the-sap-approuter-at-dev-time-a-full-stack-journey/bc-p/13977698#M178011 Re: SAP Tech Bytes: Using the SAP Approuter at dev time - a full-stack journey with UI5 and SAP CAP 2025-01-06T13:43:04.120000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/868461">@ahmetdik</a>,</P><P>maybe this helps:&nbsp;<A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-tech-bytes-using-the-sap-approuter-at-dev-time-a-full-stack-journey/bc-p/13577420/highlight/true#M167050" target="_blank">https://community.sap.com/t5/technology-blogs-by-sap/sap-tech-bytes-using-the-sap-approuter-at-dev-time-a-full-stack-journey/bc-p/13577420/highlight/true#M167050</A></P><P>Best, Nico</P> 2025-01-06T13:43:04.120000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-using-the-sap-approuter-at-dev-time-a-full-stack-journey/bc-p/13977791#M178015 Re: SAP Tech Bytes: Using the SAP Approuter at dev time - a full-stack journey with UI5 and SAP CAP 2025-01-06T15:14:05.016000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/868461">@ahmetdik</a>,&nbsp;which CAP version are you using?</P> 2025-01-06T15:14:05.016000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-using-the-sap-approuter-at-dev-time-a-full-stack-journey/bc-p/13979402#M178063 Re: SAP Tech Bytes: Using the SAP Approuter at dev time - a full-stack journey with UI5 and SAP CAP 2025-01-07T16:39:41.834000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/868461">@ahmetdik</a>,</P><P>Did you do a proper cds bind in the CAP server root before running the dev-approuter?</P> 2025-01-07T16:39:41.834000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-developer-challenge-sap-community-escape-house-ui5/ba-p/13982639 SAP Developer Challenge - SAP Community Escape House - UI5 2025-01-13T00:00:00.016000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P><EM>The new year starts with a brand new SAP Developer Challenge! The Developer Advocates have created the <A href="https://sap-community-escape-house.cfapps.us10.hana.ondemand.com" target="_blank" rel="noopener noreferrer">SAP Community Escape House</A> - a virtual escape house (consisting of multiple rooms) that you can play in your browser. Read on for all the details.</EM></P><P>SAP Developer Challenges are all about having fun, trying new things, and learning along the way. You can also earn a badge in the SAP Community upon successful completion. For this year, all SAP Developer Challenges will happen in the <A href="https://sap-community-escape-house.cfapps.us10.hana.ondemand.com" target="_blank" rel="noopener noreferrer">SAP Community Escape House</A>. For each challenge we will unlock a new room in the house, and they all have a specific focus topic. Completing a challenge means successfully escaping the room by solving a series of coding-related tasks. The first room we unlocked for January (see schedule below) is about <A href="https://ui5.sap.com/" target="_self" rel="noopener noreferrer">UI5</A>, more specifically about how to scaffold a UI5 application using the command line.<EM><BR /></EM></P><P>&nbsp;</P><H1 id="toc-hId-950255724">How to participate</H1><P>Visit the <A href="https://sap-community-escape-house.cfapps.us10.hana.ondemand.com" target="_blank" rel="noopener noreferrer">SAP Community Escape House</A> and enter your numeric SAP Community user ID. If you don't know your user ID, go to your SAP Community profile. You can find the numeric ID at the end of the URL.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2025-01-10_12-59-37.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210644i6A8DE5105EF0BDD3/image-size/large?v=v2&amp;px=999" role="button" title="2025-01-10_12-59-37.png" alt="2025-01-10_12-59-37.png" /></span></P><P>&nbsp;Once you see the SAP Community Escape House, select the UI5 room and start exploring it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2025-01-10_13-01-57.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210649i59D0107F614B54E0/image-size/large?v=v2&amp;px=999" role="button" title="2025-01-10_13-01-57.png" alt="2025-01-10_13-01-57.png" /></span></P><P><SPAN>The user interface of an escape room includes the room itself as well as a terminal. You can click the objects in the room to receive tips. Like in a real (physical) escape room, you will have to try out a few things and explore the room until you receive helpful tips and eventually instructions. These tips and instructions are printed in the terminal next to the room. The terminal is also used to submit solutions to tasks. Read the instructions you receive carefully to understand how.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2025-01-10_13-02-11.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/210648i3DE9E1555455519A/image-size/large?v=v2&amp;px=999" role="button" title="2025-01-10_13-02-11.png" alt="2025-01-10_13-02-11.png" /></span></P><P><SPAN>If you successfully escape the room (you will know when that happens), you will receive a badge in the SAP Community. We will assign the badges once the challenge closes.</SPAN></P><P>&nbsp;</P><H1 id="toc-hId-753742219">The schedule</H1><P>The UI5 room was unlocked on January 13th and will stay unlocked until the end of the year. However, the challenge closes on January 31st, so you will have to escape the room until then to qualify for a badge. Unlike the previous year, this SAP Developer Challenge does not consist of weekly sub-challenges. The next room (next challenge) will be unlocked in February.</P><P><STRONG>Good luck and happy escaping!</STRONG></P> 2025-01-13T00:00:00.016000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-developer-challenge-sap-community-escape-house-ui5/bc-p/13983957#M178255 Re: SAP Developer Challenge - SAP Community Escape House - UI5 2025-01-13T11:03:39.549000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/61">@Marian_Zeis</a>,&nbsp;I'm glad you like it <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span> You know I love my terminal and half-force everyone to try it too <span class="lia-unicode-emoji" title=":winking_face:">😉</span></P> 2025-01-13T11:03:39.549000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-developer-challenge-sap-community-escape-house-ui5/bc-p/13983962#M178256 Re: SAP Developer Challenge - SAP Community Escape House - UI5 2025-01-13T11:04:40.172000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/6779">@Henning</a>,&nbsp;thanks for that - it can be confusing with the two distinct profile sections...</P> 2025-01-13T11:04:40.172000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-using-the-sap-approuter-at-dev-time-a-full-stack-journey/bc-p/13998077#M178590 Re: SAP Tech Bytes: Using the SAP Approuter at dev time - a full-stack journey with UI5 and SAP CAP 2025-01-27T15:03:23.996000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/868461">@ahmetdik</a>,</P><P>hm, I can't seem to wrap my head around this atm. But sounds like you have the CAP server all set up with XSUAA and HANA Cloud, that together with the cds-plugin-ui5 might even be the better alternative (unless you want to test your untranspiled TS UI5 app with real auth at dev time).</P><P>I will try to find the time to dig deeper into why the CDS_ENV doesn't seem to take effect when launching the CAP server through the dev-approuter.</P><P>Best, Nico</P> 2025-01-27T15:03:23.996000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-ui-theme-designer-applying-custom-theme-to-ui5-application/bc-p/14000531#M178671 Re: SAP Tech Bytes: UI Theme Designer - Applying Custom Theme to UI5 Application 2025-01-29T15:32:47.156000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/885561">@aditi01</a>&nbsp;, does your exported directory contain the SAP-icons font face somewhere?</P> 2025-01-29T15:32:47.156000+01:00 https://community.sap.com/t5/integration-blog-posts/february-s-developer-challenge-in-sap-community-integration/bc-p/14006437#M1745 Re: February's Developer Challenge in SAP Community - Integration 🧩 2025-02-04T09:56:07.480000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/175626">@Jwan_</a>&nbsp;, yours is&nbsp;175626.</P> 2025-02-04T09:56:07.480000+01:00 https://community.sap.com/t5/integration-blog-posts/february-s-developer-challenge-in-sap-community-integration/bc-p/14021200#M1788 Re: February's Developer Challenge in SAP Community - Integration 🧩 2025-02-19T10:02:03.147000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/6934">@SRudra</a>&nbsp;, have you to tried clicking on the integration suite logo on the fridge?</P> 2025-02-19T10:02:03.147000+01:00 https://community.sap.com/t5/artificial-intelligence-and-machine-learning-blogs/sap-developer-challenge-march-sap-community-escape-house-ai/bc-p/14046782#M657 Re: SAP Developer Challenge March - SAP Community Escape House - AI 🤖🧠 2025-03-17T09:02:39.336000+01:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/163296">@Markus_Hapke</a>,</P><P><SPAN>Can you please try runing a manual npm install in the "/Users/&lt;user&gt;/.npm/_generator-easy-ui5/plugin-generators/generator-ui5-project/" directory and then run the original command again?</SPAN></P><P>Hope this helps.<BR /><BR />Best, Nico</P> 2025-03-17T09:02:39.336000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-tech-bytes-using-the-sap-approuter-at-dev-time-a-full-stack-journey/bc-p/14084558#M180902 Re: SAP Tech Bytes: Using the SAP Approuter at dev time - a full-stack journey with UI5 and SAP CAP 2025-04-23T13:52:23.095000+02:00 nicoschoenteich https://community.sap.com/t5/user/viewprofilepage/user-id/898 <P>Hi <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/868461">@ahmetdik</a>,<BR /><BR />probably too late now, but after some more digging I found a way to force CAP to use XSUAA when started in hybrid mode through the dev-approuter: <A href="https://github.com/SAP-samples/sap-tech-bytes/blob/cloud-foundry-basics/post6/packages/cap-server/srv/server.js" target="_blank" rel="noopener nofollow noreferrer">https://github.com/SAP-samples/sap-tech-bytes/blob/cloud-foundry-basics/post6/packages/cap-server/srv/server.js</A></P><P>It's not pretty by any means, but it works. And since it's a dev time thing, I guess that's ok.</P><P>Please refer to this repo for the comprehensive sample.</P><P>Best, Nico&nbsp;</P> 2025-04-23T13:52:23.095000+02:00