https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/User-Interface-blog-posts.xml SAP Community - User Interface 2024-05-09T23:14:32.305249+00:00 python-feedgen User Interface blog posts in SAP Community https://community.sap.com/t5/technology-blogs-by-sap/designing-with-code-part-3-sap-web-components/ba-p/13578404 Designing with Code (Part 3) – SAP Web Components 2023-11-13T07:24:15+01:00 Kai_Richter https://community.sap.com/t5/user/viewprofilepage/user-id/180533 <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Part-3-teaser.png" /></P><BR /> Our daily work is busy and usually there is a long list of tasks lining up: there are designs to be completed, discussions to be held, and reviews to be conducted, and so on...<BR /> <BR /> <EM>...there is no time to take a step back and think.</EM><BR /> <BR /> Even if we know that some tasks could be done more efficiently, we often stick to the existing patterns because we lack the time to explore something different.<BR /> <BR /> In the <A href="https://blogs.sap.com/2023/10/29/designing-with-code/" target="_blank" rel="noopener noreferrer">first part of this article series</A>, I described that my time as a fellow in one of our product areas gave me the possibility to take this step back and learn how to create prototypes using our major UI technologies. I used this new skill to complement and complete my design workflow, rather than to replace the design phase. In the <A href="https://blogs.sap.com/2023/11/05/designing-with-code-part-2-crossing-the-bridge/" target="_blank" rel="noopener noreferrer">second article</A>, I described, how design tools like Figma can be used in a way that already prepares your designs for implementation by using component libraries, styles, and layouts.<BR /> <BR /> In this article, I want to give you an easy start into the development of prototypes using SAP Web Components. Even if you have no idea of HTML, JavaScript, or CSS, this will help you understand how things belong together. If you have a basic understanding of web development, this might open you the path into your own prototypes by offering you a simple and portable setup.<BR /> <BR /> <STRONG>All code examples, the full article text, and additional detailed explanations on how to set up the text editor and other topics can be found on the GitHub page for this series: <A href="https://github.com/design-with-code" target="_blank" rel="nofollow noopener noreferrer">Design with Code</A>.</STRONG><BR /> <H1 id="toc-hId-834992325">Web Components</H1><BR /> Web components are UI elements that you can embed into regular HTML. With them you can extend the predefined set of UI elements (input, button, etc.) that HTML offers. By using web components, you don’t have to care about the internals of the components as they are hidden away from you. The web component, like any other HTML element, offers you a tag name and a set of properties to control its behavior and appearance.<BR /> <BR /> Web components are restricted to the presentation and behavior of the user interface element and purposely don’t include methods to handle data or communicate with a server. This functionality is added manually via JavaScript or by wrapping web components for use in JavaScript frameworks like React, Angular, Vue or SAPUI5.<BR /> <BR /> As web components are so targeted, they can be used to provide a consistent presentation layer for various implementation frameworks, i.e., build the component once and then use it in several technologies, which you can see in the following figure.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Using-Web-Components.png" />Figure 1 – Web components are restricted to presentation and component behavior. To use it in an application, data and logic must be implemented using plain JavaScript or by wrapping the web component for use in one of the JavaScript frameworks like React, Angular, Vue or SAPUI5.</P><BR /> SAP offers a <A href="https://sap.github.io/ui5-webcomponents/" target="_blank" rel="nofollow noopener noreferrer">web component library</A> with more than 60 components that implement SAP’s design language and that can be used to build applications following the SAP Fiori design system for business applications. This component library including code is publicly available and can be extended based on individual needs using the same infrastructure. Wrappers for <A href="https://github.com/SAP/ui5-webcomponents-react" target="_blank" rel="nofollow noopener noreferrer">React</A> and <A href="https://github.com/SAP/ui5-webcomponents-ngx" target="_blank" rel="nofollow noopener noreferrer">Angular</A> are also available.<BR /> <BR /> For this first example, we will use a setup with the plain web components without any framework.<BR /> <H1 id="toc-hId-638478820">Simple Prototyping Setup</H1><BR /> To set up your first prototyping environment, it is enough to create an empty folder on your hard drive. In this folder, create a file called index.html and open it in an editor.<BR /> To make your life easier, you should use a dedicated code editor like VSCode from Microsoft, but even notepad will do for the start.<BR /> <BR /> You now need to create the basic elements of an HTML file and add a reference to the web components library.<BR /> <PRE class="language-markup"><CODE>&lt;!DOCTYPE html&gt;<BR /> &lt;html&gt;<BR /> &lt;head&gt;<BR /> &lt;meta charset="UTF-8"&gt;<BR /> &lt;script type="module" src="https://sap.github.io/ui5-webcomponents/assets/js/ui5-webcomponents/bundle.esm.js"&gt;&lt;/script&gt;<BR /> &lt;/head&gt;<BR /> &lt;body&gt;<BR /> &lt;!-- Content goes here --&gt;<BR /> &lt;/body&gt;<BR /> &lt;/html&gt;<BR /> </CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 1 - The basic HTML page with a reference to the web components library.</EM></P><BR /> In Listing 1 you can see the basic elements of an HTML page without any contents in the body yet. What is important here is that we include the web component library as a JavaScript module into our page. Now, the browser is aware of all web components published by SAP in this bundle on GitHub. This link always points to the latest stable version of the web components.<BR /> <BR /> <STRONG>It is important to note that this approach is not recommended if you want to develop productive applications. This bundle contains a lot of resources that your application eventually will not need, and this will slow down the performance. For a proper development setup, you should <A href="https://sap.github.io/ui5-webcomponents/playground/?path=/docs/docs-getting-started-first-steps--doc" target="_blank" rel="nofollow noopener noreferrer">follow the instructions provided in the documentation</A>.</STRONG><BR /> <BR /> As we are not planning to release our prototype as a productive application, we are safe to use this bundle to benefit from the simple setup at the cost of performance.<BR /> <BR /> Now you can add your first web component into the page. We will use the ui5-button as one of the simpler components.<BR /> <PRE class="language-markup"><CODE>...<BR /> &lt;body&gt;<BR /> &lt;ui5-button&gt;My First Button&lt;/ui5-button&gt;<BR /> &lt;/body&gt;<BR /> ...<BR /> </CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 2 - Adding a button web component to the page.</EM></P><BR /> As a result, you should be able to see a button on an empty page if you open your <CODE>index.html</CODE> in a browser.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Figure-2.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 2 - The empty page with a button.</P><BR /> You will see that this button already is interactive and will react on hover and click. But of course, nothing will happen outside of this component-internal behavior. As described above, web components don't contain any logic outside of the component behavior. This will have to be added by us later.<BR /> <BR /> Another thing catches your eye right away: the button doesn't look as it should according to the latest designs using the Horizon theme. In fact, what we see here, is that it still uses the old Quartz theme, which is set as default by the web components.<BR /> <BR /> This means we need to switch to the new horizon theme.<BR /> <PRE class="language-markup"><CODE>...<BR /> <BR /> &lt;head&gt;<BR /> &lt;meta charset="UTF-8"&gt;<BR /> &lt;script type="module" <BR /> src="https://sap.github.io/ui5-webcomponents/assets/js/ui5-webcomponents/bundle.esm.js"&gt;&lt;/script&gt;<BR /> &lt;script data-ui5-config type="application/json"&gt;<BR /> {<BR /> "theme": "sap_horizon"<BR /> }<BR /> &lt;/script&gt;<BR /> &lt;/head&gt;<BR /> <BR /> ...</CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 3 - Setting the theme as a configuration parameter in the HTML header.</EM></P><BR /> Including this script into the header of the HTML document tells the web components library to load the Horizon theme instead of the default. This is a configuration that is applied to the entire application. You can also experiment by setting other valid themes like <CODE>sap_horizon_dark</CODE> or <CODE>sap_horizon_hcb</CODE>. You will find a <A href="https://sap.github.io/ui5-webcomponents/playground/?path=/docs/docs-advanced-configuration--docs" target="_blank" rel="nofollow noopener noreferrer">list of all themes</A> as well as other configuration parameters in the documentation. If you reload your browser, the button should now show in the right design.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Figure-3.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 3 - The button with the Horizon theme.</P><BR /> <STRONG>You can find the <A href="https://github.com/design-with-code/web-components/blob/main/Part-03-SAP-Web-Components/01_button/index.html" target="_blank" rel="nofollow noopener noreferrer">source code for this example on GitHub</A> in the design-with-code project.</STRONG><BR /> <BR /> We have now created a very simple setup that allows you to display web components in a plain HTML page. This is a good start, but we now need to see what is needed to create an application prototype.<BR /> <H1 id="toc-hId-441965315">Using Web Components</H1><BR /> All available SAP web components can be found in the [official documentation](<A href="https://sap.github.io/ui5-webcomponents/" target="_blank" rel="nofollow noopener noreferrer">https://sap.github.io/ui5-webcomponents/</A>). In the left navigation bar, all available components are listed. The tag name for the components is prefixed with ui5- as a namespace to avoid naming conflicts when components from different libraries are used (for example, to differentiate the ui5-button from the standard HTML button).<BR /> <H2 id="toc-hId-374534529">Properties</H2><BR /> The appearance and the behavior of web components can be controlled by the properties they expose. You find the properties of each SAP Web Component in the documentation.<BR /> <BR /> The documentation for the button for instance lists the design property, which allows the following values: <CODE>Default</CODE>,<CODE>Emphasized</CODE>, <CODE>Positive</CODE>, <CODE>Negative</CODE>, <CODE>Transparent</CODE>, <CODE>Attention</CODE>. If the property is not actively set, <CODE>Default</CODE> will be applied automatically.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Figure-4.jpg" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 4 - Documentation of the design property with the available options, the default value and the possibility to set a value in the interactive example on top of the table.</P><BR /> The documentation of the web components is interactive, so that you can explore the properties right in the documentation which is great to understand the purpose if you are not certain.<BR /> <BR /> <STRONG>It is important to note that the properties in the documentation are written in camel case (e.g., <CODE>colorScheme</CODE>), which is the convention in JavaScript. The same property is written with a <EM>hyphen</EM> in the HTML-tag (e.g., <CODE>color-scheme</CODE>), the camel case notation will not be recognized.</STRONG><BR /> <BR /> Let's now try out how the different values of the button's design property work.<BR /> <PRE class="language-markup"><CODE>...<BR /> <BR /> &lt;body&gt; <BR /> &lt;ui5-button&gt;Default&lt;/ui5-button&gt;<BR /> &lt;ui5-button design="Emphasized"&gt;Emphasized&lt;/ui5-button&gt;<BR /> &lt;ui5-button design="Positive"&gt;Positive&lt;/ui5-button&gt;<BR /> &lt;ui5-button design="Negative"&gt;Negative&lt;/ui5-button&gt;<BR /> &lt;ui5-button design="Transparent"&gt;Transparent&lt;/ui5-button&gt;<BR /> &lt;ui5-button design="Attention"&gt;Attention&lt;/ui5-button&gt;<BR /> &lt;/body&gt;<BR /> <BR /> ...</CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 4 - Adding buttons with all different design options into the document's body.</EM></P><BR /> This should now display the button in all different designs as shown in the next figure.<BR /> <BR /> &nbsp;<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Figure-5.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 5 - The different button designs shown in the browser.</P><BR /> <STRONG>You can find the <A href="https://github.com/design-with-code/web-components/blob/main/Part-03-SAP-Web-Components/02_button-designs/index.html" target="_blank" rel="nofollow noopener noreferrer">source code for this example</A> in the GitHub project design-with-code.</STRONG><BR /> <H2 id="toc-hId-178021024">Slots</H2><BR /> Some web components allow other components to be placed inside of them by offering so-called <STRONG>slots</STRONG>. The available slots are listed in the documentation. Slots can also have names, which is important if a component offers multiple slots. One of the slots usually is the default slot, and any component placed inside without being assigned to a specific slot will be placed there.<BR /> <BR /> The most basic slot is used for text. The ui5-button for instance takes its label as text inside of the start and end tag: <CODE>&lt;ui5-button&gt;Label&lt;/ui5-button&gt;</CODE>. This is equivalent to placing a text element in the default slot. This also means that you could also place more complex structures in this slot like the icon on top of the text shown in the figure below.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Figure-6.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 6 – Using the default slot of the button to create a button with more complex content.</P><BR /> <STRONG>You can find the <A href="https://github.com/design-with-code/web-components/blob/main/Part-03-SAP-Web-Components/03_button-complex-content/index.html" target="_blank" rel="nofollow noopener noreferrer">source code for this example</A> in the GitHub project design-with-code.</STRONG><BR /> <H2 id="toc-hId--18492481">First Application Page</H2><BR /> We will now add a page component to our HTML page. You will find the documentation of the page at the bottom of the navigation in the Fiori section, which contains more complex components that are more specific to the design system.<BR /> <BR /> <STRONG>The <A href="https://github.com/design-with-code/web-components/blob/main/Part-03-SAP-Web-Components/04_application-page/index.html" target="_blank" rel="nofollow noopener noreferrer">source code for this example</A> can be found on GitHub in the project design-with-code. </STRONG><BR /> <BR /> The example shows the final code and not each step in between, so that you can follow the examples here and then compare to the example on the repository.<BR /> <PRE class="language-markup"><CODE>...<BR /> &lt;body style="height: 100%; margin: 0;"&gt;<BR /> &lt;ui5-page style="height:100%" background-design="Solid"&gt;<BR /> &lt;ui5-bar slot="header" design="Header"&gt;<BR /> &lt;ui5-title slot="startContent" level="H4"&gt;My App&lt;/ui5-title&gt;<BR /> &lt;/ui5-bar&gt;<BR /> &lt;ui5-label&gt;Default Content&lt;/ui5-label&gt;<BR /> &lt;ui5-bar slot="footer" design="Footer"&gt;<BR /> &lt;ui5-button slot="endContent" design="Emphasized"&gt;OK&lt;/ui5-button&gt;<BR /> &lt;ui5-button slot="endContent" design="Transparent"&gt;Cancel&lt;/ui5-button&gt;<BR /> &lt;/ui5-bar&gt;<BR /> &lt;/ui5-page&gt;<BR /> &lt;/body&gt;<BR /> ...</CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 5 - Adding a page with a header and footer bar.</EM></P><BR /> In the listing above we made the following changes:<BR /> <OL><BR /> <LI>We added the ui5-page component and set the background to solid.</LI><BR /> <LI>We want the page to use 100% of the available screen height. To achieve this, we need to set the <CODE>height</CODE> of the <CODE>body</CODE> and of the <CODE>ui5-page</CODE> to 100% using the CSS <CODE>style</CODE> attribute. If you don't set the body height, the page will appear empty, because the page will assume a height of 0. If this isn't sufficient, you can try to set the height of the <CODE>html</CODE> element to 100% in addition.</LI><BR /> <LI>Setting the <CODE>margin</CODE> to 0 will remove the white border that appears in some browsers.</LI><BR /> <LI>The <CODE>ui5-page</CODE> has three slots. As you see in the example, elements are assigned to slot using the slot attribute:<BR /> <OL><BR /> <LI><STRONG><CODE>header</CODE></STRONG> - here we place a ui5-bar with a ui5-title element as application title. The bar also has slots, and we use the startContent slot to make the title appear on the left.</LI><BR /> <LI><STRONG><CODE>default</CODE></STRONG> - this will hold the contents of the app. We just place a label as a placeholder for now.</LI><BR /> <LI><STRONG><CODE>footer</CODE></STRONG> - here we place another ui5-bar and move two of our buttons into the endContent slot. The other buttons can be removed again. Following our standards, we use the emphasized button as primary action and the transparent button as the negative path action.</LI><BR /> </OL><BR /> </LI><BR /> </OL><BR /> The result should now look like the figure below with a title bar, a footer bar with two buttons and a label in the content area. Layout and style are handled by the component for you.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Figure-7.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 7 - The application with the page component, a title, and a footer.</P><BR /> <BR /> <H2 id="toc-hId--215005986">Layout</H2><BR /> While the page takes care of the overall page structure, you will have to take care of the layout yourself in order to define the page contents. At this point, you will need to make yourself familiar with some basic layout mechanisms in CSS. In this example, we will use the CSS flex box, which is a very powerful and flexible mechanism that also corresponds closely with the auto layout in Figma as discussed in the second article of this series (<A href="https://blogs.sap.com/2023/11/05/designing-with-code-part-2-crossing-the-bridge/" target="_blank" rel="noopener noreferrer">Designing with Code (Part 2) – Crossing the Bridge</A>).<BR /> <BR /> We want to create a simple form in our application. As there is no form component, we will make use of the flex box to lay out the form fields.<BR /> <PRE class="language-markup"><CODE>...<BR /> <BR /> &lt;ui5-panel class="margin-top" header-text="Address" fixed&gt;<BR /> &lt;div class="form"&gt;<BR /> &lt;div class="form-element"&gt;<BR /> &lt;ui5-label show-colon&gt;Name&lt;/ui5-label&gt;<BR /> &lt;div class="text"&gt;John Doe&lt;/div&gt;<BR /> &lt;/div&gt;<BR /> &lt;div class="form-element"&gt;<BR /> &lt;ui5-label show-colon&gt;Street&lt;/ui5-label&gt;<BR /> &lt;div class="text"&gt;Main Street 1&lt;/div&gt;<BR /> &lt;/div&gt;<BR /> &lt;div class="form-element"&gt;<BR /> &lt;ui5-label show-colon&gt;City&lt;/ui5-label&gt;<BR /> &lt;div class="text"&gt;Big City&lt;/div&gt;<BR /> &lt;/div&gt;<BR /> &lt;div class="form-element"&gt;<BR /> &lt;ui5-label show-colon&gt;ZIP Code&lt;/ui5-label&gt;<BR /> &lt;div class="text"&gt;12345&lt;/div&gt;<BR /> &lt;/div&gt;<BR /> &lt;/div&gt;<BR /> &lt;/ui5-panel&gt;<BR /> ...</CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 6 - A panel with a form inside, created out of div elements.</EM></P><BR /> We replaced the label in the content area with a panel that contains a form. As there is no form component, we constructed the form from div elements. The class attributes refer to style definitions that were placed in a style element in the header of the page. We are going to discuss them later.<BR /> <OL><BR /> <LI>The <CODE>ui5-panel</CODE> is used as container for the form. It comes with a header text, and we can disable the collapse feature that is by default enabled by setting the flag <CODE>fixed</CODE>, which is equivalent to saying <CODE>fixed=true</CODE>.</LI><BR /> <LI>Inside of the panel we create the structure of the form using <CODE>div</CODE> elements. A <CODE>div</CODE> is like a frame in Figma and can be used as a container to structure and lay out elements.<BR /> <OL><BR /> <LI>The outmost <CODE>div</CODE> serves as a form container to hold the form elements. We will use the flex layout to arrange the form elements underneath each other.</LI><BR /> <LI>Inside the form, we have several <CODE>div</CODE> as form elements that hold a combination of label and field. They will be arranged vertically using a flex box.</LI><BR /> <LI>Inside the form element container, we place a <CODE>ui5-label</CODE> where the colon is shown, and another <CODE>div</CODE> displaying the text content. As there is no text component available in the web components library, we need to use our own text class apply the proper styles to format the text. In the listing below you can see the CSS classes that we use in order to create the right layout. The measures are taken from the specification of the form. We are also referencing CSS variables that are provided by the library using the <CODE>var()</CODE> reference. The components in the library are also styled using these variables that come from the theme definition. It is highly recommended to use theme variables instead of fix values to ensure the styles are always compatible when switching themes. We will discuss this more in detail in a later article. For now, it is enough for you to know that <CODE>var(--sapFontFamily)</CODE> refers to the font family defined by the theme.</LI><BR /> </OL><BR /> </LI><BR /> </OL><BR /> <PRE class="language-markup"><CODE>&lt;head&gt;<BR /> ...<BR /> <BR /> &lt;style&gt;<BR /> .margin-top{<BR /> margin-top: 1rem;<BR /> }<BR /> <BR /> .form{<BR /> display:flex; <BR /> flex-direction: column; <BR /> gap: 1rem;<BR /> }<BR /> <BR /> .form-element{<BR /> display:flex; <BR /> flex-direction: column; <BR /> gap: 0.25rem;<BR /> }<BR /> <BR /> .text{<BR /> font-family: var(--sapFontFamily);<BR /> font-size: var(--sapFontSize);<BR /> color: var(--sapTextColor);<BR /> }<BR /> <BR /> &lt;/style&gt;<BR /> <BR /> &lt;/head&gt;<BR /> ...</CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 7 - Styles defined for the layout of the form and for the formatting of the text element.</EM></P><BR /> We placed the style definition in a style tag in the header element of the page to be able to reuse classes and to keep the code readable. If you are not familiar with CSS stylesheets, the <CODE>.</CODE> in front of the names indicates that this is a class name.<BR /> <UL><BR /> <LI><STRONG><CODE>.margin-top</CODE></STRONG>&nbsp;defines a margin on top of the panel to separate the panel from the page title bar.</LI><BR /> <LI><STRONG><CODE>.form</CODE></STRONG> defines the form layout as flex box with a vertical arrangement. Between the elements contained in the form layout there is a gap of 1 rem (=16px).</LI><BR /> <LI><STRONG><CODE>.form-element</CODE></STRONG> defines the vertical layout of a label / value pair with a distance between the two of 0.25 rem (=4px).</LI><BR /> <LI><STRONG><CODE>.text</CODE></STRONG>&nbsp;defines the format of the text that displays the value in the form element. There is no text component in the library, so the styles must be applied manually, otherwise the text would be displayed in the browser's default font. As mentioned above, we use the reference to the theme variables to obtain the styles directly from the currently selected theme.</LI><BR /> </UL><BR /> The result should now look like the following figure.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Figure-8.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 8 - The application with panel and form as described by the listings above.</P><BR /> If you are struggling with the layout using div elements and flex layouts, I want to quickly show you how this resembles the auto layout feature in Figma:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Flex-Box-vs-Auto-Layout.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 9 - Auto layout of the form frame in Figma; in the design view and in the code view.</P><BR /> Above you see the same form layout created with frames and auto layout in Figma. On the top right, you see the auto layout settings in the design perspective and below you see the CSS styles that are generated in the code view. These are the exact same CSS properties that we have defined above (the align-items and align-self property that are generated are redundant as they describe the default behavior). Figma frames are equivalent to div elements, and the auto layout behaves like the flex layout in CSS.<BR /> <H1 id="toc-hId--540602210">Summary and Outlook</H1><BR /> In this article you have learned to create your own simple prototype using SAP Web Components.<BR /> As you have seen, setting up such a prototype can be as easy as creating a single HTML page.<BR /> <BR /> A lot of what we have done was just putting together existing components and setting their properties. With that you can already explore and combine existing components, and by adding some basic layout and styling you can take it even a step further.<BR /> <BR /> To create more complex interactive prototypes, you will need to learn how to work with events and how to connect the components to a data model using JavaScript. We will look into these topics in the <A href="https://blogs.sap.com/2023/11/20/designing-with-code-part-4-data-document-object-model-and-events/" target="_blank" rel="noopener noreferrer">next article of this series</A>.<BR /> <BR /> <STRONG>Remember, you find all code examples in this series as well as the full text and additional information on the GitHub page for this series: <A href="https://github.com/design-with-code" target="_blank" rel="nofollow noopener noreferrer">Design with Code</A>.</STRONG> 2023-11-13T07:24:15+01:00 https://community.sap.com/t5/technology-blogs-by-sap/designing-with-code-part-4-data-document-object-model-and-events/ba-p/13572250 Designing with Code (Part 4) - Data, Document Object Model, and Events 2023-11-20T08:44:37+01:00 Kai_Richter https://community.sap.com/t5/user/viewprofilepage/user-id/180533 <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Part-4-teaser.png" /></P><BR /> Creating prototypes in code allows designers to gain a deeper understanding of the way user interfaces are constructed. This can help us become more sensitive towards concerns from engineers, but it can also strengthen the designer's position in discussions with development.<BR /> <BR /> In the <A href="https://blogs.sap.com/2023/11/13/designing-with-code-part-3-sap-web-components" target="_blank" rel="noopener noreferrer">previous article of this series</A>, we created a first simple static prototype. We created a very simple setup with no installation required, and we added all parts of our simple application in a single HTML file. This allowed us to combine web components and place them into layouts we created using flex layouts.<BR /> <BR /> The important thing about prototypes of course is that the display of components isn’t static, and that we can add interactivity much more easily to it with our design tools.<BR /> <BR /> This article will address the most important aspects that are required to add interactivity. It is helpful if you already have some experience with web technologies, but I will attempt to add sufficient information for everyone to follow.<BR /> <BR /> The following topics are necessary to create interactive prototypes:<BR /> <UL><BR /> <LI><STRONG>Data model</STRONG>: our prototype will display a list of addresses with a flag indicating whether we are allowed to send ads to that address. We will allow the user to change this flag and store this in the data model. To make sure the data is consistent, we will encapsulate the data model in a single class that is used by the application to read and change the data.</LI><BR /> <LI><STRONG>Document object model</STRONG>: we will create the table rows dynamically from the list of addresses. For this purpose, we will add, remove, and change elements in the HTML document using the document object model operations.</LI><BR /> <LI><STRONG>Events</STRONG>: to make the user interface interactive and react to user input, we must listen to the events initiated by the interface components. If a user for instance clicks a button, the button initiates a click event to which we register a method that is then called on click. Event handling is the basis for making user interfaces interactive.</LI><BR /> </UL><BR /> In this article, we will shed some light on each of these aspects.<BR /> <BR /> <STRONG>All code examples, the full article text, and additional detailed explanations on how to set up the text editor and other topics can be found on the GitHub page for this series:&nbsp;<A href="https://github.com/design-with-code" target="_blank" rel="noopener nofollow noreferrer">Design with Code</A>.</STRONG><BR /> <H1 id="toc-hId-834811808">Application</H1><BR /> Let's first look at the application we want to build. We want to create a simple application that displays a list of addresses. Each address will have a flag that indicates whether we are allowed to send ads to that address. When the user selects an address from the list, they will see the address details in a dialog. In this dialog, the flag whether ads are allowed or not will be displayed as a checkbox. The user can change this flag by clicking the checkbox and the change is saved.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/01-Screen-Flow.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 1 - Screen-flow of our simple address application. The application shows a list of addresses. When selecting an entry, the details are shown in a dialog. In the dialog, the user can change the ads flag which will then be saved back into the data model.</P><BR /> As we can see, the application is about displaying and manipulating the address data. The first step therefore will be to define the address data model.<BR /> <H2 id="toc-hId-767381022">Setup</H2><BR /> For the examples in this article, we will create four empty files:<BR /> <UL><BR /> <LI><CODE>index.html</CODE> - The main entry point of the application containing the HTML document and the references to the other resources.</LI><BR /> <LI><CODE>style.css</CODE> - Contains the CSS styles that were in the main document in the styles tag. Putting it in a separate file allows for reuse and better readability.</LI><BR /> <LI><CODE>data.js</CODE> – The JavaScript file that contains the data structure and all methods to access and modify the data.</LI><BR /> <LI><CODE>index.js</CODE> – The JavaScript file that controls the lifecycle and interactivity of the application.</LI><BR /> </UL><BR /> The <CODE>index.html</CODE> looks almost like the one we created in the previous article. We only remove the form elements from the panel, extract the styles into the <CODE>style.css</CODE>, and we add additional references to the related files in the header as shown below. It is important to reference the <CODE>data.js</CODE> <STRONG>before</STRONG> the <CODE>index.js</CODE> to make sure the data model is available to application logic.<BR /> <PRE class="language-markup"><CODE>&lt;head&gt;<BR /> ...<BR /> &lt;link rel="stylesheet" href="style.css"/&gt;<BR /> &lt;script src="data.js"&gt;&lt;/script&gt;<BR /> &lt;script src="index.js"&gt;&lt;/script&gt;<BR /> ...<BR /> &lt;/head&gt;<BR /> </CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 1 - Links to the related files in the header element of the HTML document.</EM></P><BR /> <BR /> <H1 id="toc-hId-441784798">Data</H1><BR /> The data model is the basis for every application. All information displayed in the application and all interaction in the application is related to this data model. It is good practice to encapsulate all functionality used to retrieve or manipulate data in a single class which exists only once in the application.<BR /> <BR /> All examples in this chapter can be found in the <A href="https://github.com/design-with-code/web-components/tree/main/Part-04-Data-DOM-And-Events/01_data" target="_blank" rel="nofollow noopener noreferrer">GitHub repository</A> on "Design with Code".<BR /> <BR /> As you are starting to work with JavaScript now, you might want to make sure that the right information is processed in your application or you need to identify errors in your code. This process is called <EM>debugging</EM> and there are various tools built into your browser to support this. Have a look at the <A href="https://github.com/design-with-code/general/blob/main/A3-Debugging.md" target="_blank" rel="nofollow noopener noreferrer">article on debugging</A> on the GitHub repository.<BR /> <H2 id="toc-hId-374354012">Defining the Model</H2><BR /> We will now open the <CODE>data.js</CODE> to create the data model. In our application, we want to display a list of addresses and a flag showing whether we are allowed to send advertisements to these addresses or not.<BR /> <PRE class="language-javascript"><CODE>{<BR /> id: 1, <BR /> name:"Anna Arendt", <BR /> street:"Kleine Strasse 12", <BR /> city:"Walldorf", <BR /> zip: "69190", <BR /> advertisment: true<BR /> }<BR /> </CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 2 - A single address shown as a JSON structure.</EM></P><BR /> Above, you can see an example of a single address as a JSON structure. Our address list will contain an array of multiple such addresses. JSON stands for Java Script Object Notation and is a way to represent JavaScript objects as a string (serialization) and convert them back into an object (deserialization) again.<BR /> <BR /> To separate the data model from the rest of the application, we are going to create a class that contains all functions to access and modify the data. This class will be instantiated by the application, and the application will only use these functions to access or modify the data to make sure that the data remains consistent and that no invalid changes are applied. We could use these functions to validate or format the changes before writing them into the data structure.<BR /> <BR /> Below, you will find the signature of the <CODE>AddressList</CODE> class. The implementation details can be found in the example code.<BR /> <PRE class="language-javascript"><CODE>class AddressList{<BR /> static getInstance() // Get an instance of the data model AddressList<BR /> getList() // Get the actual address list as array [ ] <BR /> getSortedList(ascending) // Get list sorted ascending (true) <BR /> getAddress(id). // Retrieve a specific address by id<BR /> addAddress(name, street, city, zip, ads)<BR /> // Create a new address by providing the required fields<BR /> removeAddress(id). // Removing an address from the list<BR /> updateAddress(address) // Change an existing address<BR /> }<BR /> </CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 3 - Signature of the AddressList class that is used to encapsulate data access.</EM></P><BR /> As you can see above, the <CODE>AddressList</CODE> class implements all basic access functions to the data. Apart from that, we don't have to take any care that the data is correct because it is all taken care of by the data model itself. The application can only call these functions and rely on them to work.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/02-Data-Model-Test.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 2 - Data model test. To make sure the data model and all accessor methods work properly, it is helpful to include a little test routine. This is the output in Chrome developer tools console.</P><BR /> This is very similar to how data access in backend systems can be wrapped by data access objects. The great thing about this is that the consumer of the data doesn't have to know where the data comes from. The access is always the same through the same interface.<BR /> <BR /> If you create such a data model, it is also helpful to create test cases to see whether the methods work in the way you expect them to. In the example code, you also find multiple test cases in the <CODE>index.js</CODE>.<BR /> <H2 id="toc-hId-177840507">Singleton</H2><BR /> To avoid that there are multiple instances of the <CODE>AddressList</CODE> in your application, each with different address lists, we use a <EM>singleton</EM> pattern. Instead of calling the constructor directly with <CODE>new AddressList()</CODE>, we use the static <CODE>AddressList.getInstance()</CODE> method, which will always return the same instance with the same data, no matter when and from where we call it in the application. You will see examples for this in the test cases.<BR /> <H2 id="toc-hId--18672998">Copy vs. Reference</H2><BR /> You will want to make sure that the data in the model is only accessed via the functions of the data model. Therefore, you must ensure that the data that is given out never contains references to the original variables but only copies. In JavaScript as in other programming languages, there is a difference whether you give access to the variable by handing over the reference to it or whether you create a copy of the data and hand over only that.<BR /> <BR /> In the first example, if you call the function <CODE>getList()</CODE> you get a reference to the list. This means that if you change something in the list, it is also changed inside of the <CODE>AddressList</CODE> class by passing the accessor functions, making it hard to control which changes are applied when.<BR /> <PRE class="language-javascript"><CODE>class AddressList{<BR /> list = []; // The list array<BR /> <BR /> getList(){<BR /> return this.list; // Returns a reference to the list<BR /> }<BR /> }<BR /> </CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 4 - The getList function returns a reference to the list. This allows every consumer to modify the list directly.</EM></P><BR /> Therefore, it is important that we hand over a copy of the original list instead. Now, any change the caller makes on the list only affects their local copy. The spread operator <CODE>[...array]</CODE> can be used to copy the values of an array into a new array.<BR /> <PRE class="language-javascript"><CODE>class AddressList{<BR /> list = [];<BR /> <BR /> getList(){<BR /> return [...this.list]; // Returns a copy of the list<BR /> }<BR /> }<BR /> </CODE></PRE><BR /> <P style="text-align: center"><EM>Listing 5 - The spread operator copies the contents of the list into a new object and create a copy. Then a consumer modifies its copy of the list, this does not affect the original list.</EM></P><BR /> <BR /> <H2 id="toc-hId--215186503">Summary</H2><BR /> Above, we have discussed some important aspects of the data model that is used to hold the application data. The application doesn't access this data directly but uses the access functions provided by the model to ensure consistency. By encapsulating all data into a single model, we can also test the access functions and apply corrections in a single place which makes it much easier to maintain.<BR /> <BR /> Now, as we have the data defined, we can take a look at the user interface elements and how they can be handled in the document object model.<BR /> <H1 id="toc-hId--540782727">Document Object Model</H1><BR /> Inside the browser, an HTML document is represented as a hierarchical element structure. All elements displayed in the browser are part of the document body. Each element has different properties that determine their appearance and behavior depending on the type of element. Our web components are part of this structure just as any standard HTML elements (e.g., <CODE>div</CODE>). Each element is added as a child of another element, and the parent of all elements is the document's <CODE>body</CODE>.<BR /> <BR /> All examples in this chapter can be found in the <A href="https://github.com/design-with-code/web-components/tree/main/Part-04-Data-DOM-And-Events/02_dom" target="_blank" rel="nofollow noopener noreferrer">GitHub repository</A> on "Design with Code".<BR /> <H2 id="toc-hId--608213513">Setting Element Properties</H2><BR /> Inside of the JavaScript code, we can reference elements in the document a function like <CODE>document.getElementById(id)</CODE>. On this reference we can now access and change all properties this element has.<BR /> <BR /> Let’s assume you have an empty <CODE>span</CODE> element in your document.<BR /> <PRE class="language-markup"><CODE>&lt;span id="myText"&gt;&lt;/span&gt;</CODE></PRE><BR /> You can get a reference to this element via its id. Then you set the element content via the property <CODE>innerHTML</CODE>.<BR /> <PRE class="language-javascript"><CODE>// Get the html element with the id myText<BR /> const span = document.getElementById("myText");<BR /> <BR /> // Set the text between the start and element to Hello<BR /> span.innerHTML = "Hello"; </CODE></PRE><BR /> If you now look at this element in the browser, you will see that the element has been changed containing the text.<BR /> <PRE class="language-markup"><CODE>&lt;span id="myText"&gt;Hello&lt;/span&gt;</CODE></PRE><BR /> It is important to know that this doesn't change any file permanently, but just changes the document model at runtime in the browser. If you reload the page, all changes will be gone.<BR /> <BR /> We can use the same mechanism to access the properties of the web components.<BR /> <PRE class="language-markup"><CODE>&lt;ui5-checkbox id="adsCB" checked="false" text="Allow ads"&gt;&lt;/ui5-checkbox&gt;</CODE></PRE><BR /> We can now get a reference to this element in our code and set the checkbox to checked.<BR /> <PRE class="language-javascript"><CODE>// Get the checkbox in the html document<BR /> const cb = document.getElementById("adsCB");<BR /> <BR /> // Set the checked attribute to true<BR /> cb.checked = true;</CODE></PRE><BR /> This way, we can programmatically control all elements on the page and change labels, contents, or functionality as we need it.<BR /> <H2 id="toc-hId--804727018">Accessing Element Methods</H2><BR /> We can also access methods of an element to execute some internal logic. For instance, calling the function <CODE>myDialog.show()</CODE> on a reference to a dialog element, will open the dialog overlaying the other contents on the screen. Please note that in JavaScript we access properties and functions using camelCase (e.g., <CODE>headerText</CODE>) that is shown in the documentation and not the hyphenated style (e.g., <CODE>header-text</CODE> used in HTML).<BR /> <H2 id="toc-hId--653986166">Adding and Removing Elements</H2><BR /> We can't only access existing elements in the document, but we can also create new elements or remove existing elements from the document. We use this to populate a table with the addresses from our data model.<BR /> <BR /> First, let’s create an empty table with the id "<EM>addressTable</EM>" in our application and define columns for the different data fields.<BR /> <PRE class="language-markup"><CODE>...<BR /> &lt;ui5-table id="addressTable"&gt;<BR /> &lt;ui5-table-column slot="columns"&gt;Name&lt;/ui5-table-column&gt;<BR /> &lt;ui5-table-column slot="columns"&gt;Street&lt;/ui5-table-column&gt;<BR /> &lt;ui5-table-column slot="columns"&gt;City&lt;/ui5-table-column&gt;<BR /> &lt;ui5-table-column slot="columns"&gt;ZIP&lt;/ui5-table-column&gt;<BR /> &lt;ui5-table-column slot="columns"&gt;Ads&lt;/ui5-table-column&gt;<BR /> &lt;/ui5-table&gt;<BR /> ...<BR /> </CODE></PRE><BR /> When we open this table in the browser, it will be empty and just display the column headers. We could manually create the table rows by adding a <CODE>ui5-table-row</CODE> for each address in the address list. But as we want to be able to change the contents, we will create these rows using code.<BR /> <BR /> In the <CODE>index.js</CODE> we create the logic that generates the rows. You will find the commented code in the example files.<BR /> <BR /> First, as the document is loaded completely and all static parts of the document are available, the <CODE>onload</CODE> event will be triggered. We use this event to initialize our table with the sorted address list.<BR /> <PRE class="language-javascript"><CODE>// When the document is loaded this lifecycle hook is called<BR /> onload = () =&gt; {<BR /> <BR /> // We use this to update the data rows in the table.<BR /> <BR /> // Instead of using the list as is, we use the sorted list<BR /> const sortedList = addressList.getSortedList(true);<BR /> <BR /> // We now call the update function<BR /> updateAddressTable(sortedList);<BR /> } </CODE></PRE><BR /> In the <CODE>updateAddressTable(list) </CODE>function, we iterate over the list of addresses and add a new row for each address as a child to the table.<BR /> <PRE class="language-javascript"><CODE>// Function to update the table contents<BR /> function updateAddressTable(list) {<BR /> // Do some clean up first<BR /> ...<BR /> <BR /> // Retrieve the table element from the html document<BR /> const table = document.getElementById("addressTable");<BR /> <BR /> // Iterate the list and create a row for each item<BR /> list.forEach((address) =&gt; {<BR /> <BR /> // Call the function that creates the row<BR /> const row = createTableRow(address);<BR /> // Append the row to the table<BR /> table.appendChild(row);<BR /> });<BR /> }</CODE></PRE><BR /> New elements are created using the <CODE>document.createElement(elementName)</CODE> function. Here, a new <CODE>ui5-table-row</CODE> is created for each address.<BR /> <PRE class="language-javascript"><CODE>// Function to create a new table row for an address<BR /> function createTableRow(address){<BR /> <BR /> // Creating the html element with the name ui5-table-row<BR /> const row = document.createElement("ui5-table-row");<BR /> row.id = address.id; // Set the id<BR /> row.type = "Active"; // Set the active property to be able to trigger events<BR /> ...<BR /> <BR /> // Create the table cells for the address fields<BR /> const nameCell = document.createElement("ui5-table-cell");<BR /> nameCell.innerHTML = address.name; // The cell content is the address name<BR /> <BR /> // Append the cell to the row<BR /> row.appendChild(nameCell);<BR /> ...<BR /> <BR /> // Return the row that has been create to the caller<BR /> return row;<BR /> }<BR /> </CODE></PRE><BR /> Inside of this function we create the <CODE>ui5-table-cells</CODE> that contain the actual data. The cells are added as children to the row so that in the end we have created a table row for each address and a table cell for each field within the address.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/03-Table.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 3 - The application with a row appended to the address table for each address.</P><BR /> Now, as we begin to generate the UI from the data instead of manually adding table rows, it is not important how many rows we want to display anymore. Also, we can adjust and enhance the way we render our information in one place, and this change will become effective everywhere.<BR /> <BR /> For instance, if we want to display whether ads are allowed or not as a checkbox instead of a string, we just need to adjust the way this cell is rendered in one place, and it will be available everywhere.<BR /> <PRE class="language-javascript"><CODE>// Inside of the create table row function<BR /> ...<BR /> <BR /> const adsCell = document.createElement("ui5-table-cell");<BR /> <BR /> // Create a check box <BR /> const cb = document.createElement("ui5-checkbox");<BR /> cb.checked = address.advertisment; // Is checked if advertiment is true<BR /> cb.readonly = true; // We don't want to change this value<BR /> adsCell.appendChild(cb); // Add the checkbox into the cell<BR /> <BR /> row.appendChild(adsCell);<BR /> ...<BR /> </CODE></PRE><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/04-Table-with-Checkbox.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 4 - The flag indicating whether ads are allowed is now displayed as a read-only checkbox.</P><BR /> &nbsp;<BR /> <BR /> &nbsp;<BR /> <H2 id="toc-hId--850499671">Shadow DOM</H2><BR /> Web components hide their internal structure by placing it in a so-called shadow DOM. This hidden part of the document is protected from access via the document object model, and you normally shouldn’t have to care about it. In some cases, a web component offers access to specific elements of the hidden structure using the parts so that you can apply certain styles. We use this for instance in the <CODE>style.css</CODE> to remove the padding from the panel content area for the table.<BR /> <H2 id="toc-hId--1047013176">Summary</H2><BR /> We have added logic to our application that generates parts of the user interface based on the data model. This means that we can also adjust the user interface when the data model changes. In the first two parts of this article, we have laid the foundation for an interactive prototype. Now, we need to add event handling to make the prototype interactive by responding to user input.<BR /> <H1 id="toc-hId--950123674">Events</H1><BR /> User interface elements are designed to display data as well as to offer means to interact with the data. Each user interface element has a specific purpose (e.g., button -&gt; initiate action) and according to that purpose offers certain events. Most events are based on user input (e.g., <CODE>click</CODE>) but can also be based on system events (e.g., <CODE>onload</CODE>).<BR /> <BR /> All examples in this chapter can be found in the <A href="https://github.com/design-with-code/web-components/tree/main/Part-04-Data-DOM-And-Events/03_events" target="_blank" rel="nofollow noopener noreferrer">GitHub repository</A> on "Design with Code".<BR /> <BR /> If we want a certain function to be initiated by a user input, we must register this function as an event listener in the element. The element will then inform every event listener if the event is triggered.<BR /> <PRE class="language-javascript"><CODE>// Get the button from the document<BR /> const btn = document.getElementById("myButton");<BR /> <BR /> // Use the addEventListener method to tell the button which function should<BR /> // be called when the user clicks. Here, we use an anonymous function that is<BR /> // declared inline. Here, the handleClick function will be called.<BR /> btn.addEventListener("click", (event) =&gt; handleClick(event)); </CODE></PRE><BR /> We have now registered the <CODE>handleClick()</CODE> function to be called when the <CODE>event</CODE> is caused. The event parameter that is handed to the <CODE>handleClick()</CODE> function contains the event context, e.g., what control has caused the event or what row in the table has been clicked. In this example, the <CODE>event.target</CODE> property is a reference to the button that initiated the event.<BR /> <PRE class="language-javascript"><CODE>// Function called on click<BR /> function handleClick(event){<BR /> const btn = event.target; // getting a reference to the button<BR /> }</CODE></PRE><BR /> In many cases, we don't need the information of the event in the event handler function, because the purpose of the function is clear.<BR /> <H2 id="toc-hId--1440040186">Button Event</H2><BR /> We could for instance offer a button that switches the form factor between cozy and compact mode.<BR /> <PRE class="language-javascript"><CODE>// Getting a reference to the button element from the document<BR /> const formFactorButton = document.getElementById(“formFactorButton”);<BR /> <BR /> // Register an event listener to the buttons click event<BR /> formFactorButton.addEventListener(“click”, (e) =&gt; toggleFormFactor(e));<BR /> // On click, the toggleFormFactor function will be called<BR /> </CODE></PRE><BR /> As the user clicks the button, the event handler function is called and either sets or removes the <CODE>ui5-content-density-compact</CODE> class from the document body element.<BR /> <PRE class="language-javascript"><CODE>// Function holding the functionality to toggle between cozy and compact mode<BR /> function toggleFormFactor(e){<BR /> <BR /> // By adding the content density class to the HTML body, the entire<BR /> // application will be displayed in compact mode (using less space)<BR /> document.body.classList.toggle("ui5-content-density-compact");<BR /> }<BR /> </CODE></PRE><BR /> As we can see in the figure below, the dimensions of some elements are adjusted and optimized for either touch (cozy) or desktop (compact) devices.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/05-Cozy-Compact.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 5 - Application switched from cozy to compact form factor.</P><BR /> <BR /> <H2 id="toc-hId--1636553691">Table Event</H2><BR /> In our address list application, we want to display a dialog with the address details when a user selects a table row. To allow the table row to create an event on click, we need to set the mode to "active", otherwise, we will not receive any events, even if we set an event listener. Then, we add and event listener to the table, which collects the events from all rows.<BR /> <PRE class="language-javascript"><CODE>// Getting a reference to the table<BR /> const table = document.getElementById("addressTable");<BR /> <BR /> // Adding an event listener for the row-click event<BR /> table.addEventListener("row-click", (e) =&gt; showDetails(e));</CODE></PRE><BR /> In this event handler function we then open and populate the data into the details dialog. We use the event context to find out which table row has been selected using the <CODE>event.detail.row.id</CODE>. As the row id is the same as the id of the address display in this row, we can get the address from the data model and set the address values in the dialog.<BR /> <PRE class="language-javascript"><CODE>// This function is called when a user clicked a table row<BR /> function showDetails(e){<BR /> // Get a reference to the dialog element, which currently still is hidden<BR /> const dialog = document.getElementById("detailsDialog");<BR /> <BR /> // Get the row id that has been clicked from the event context<BR /> const selectedId = e.detail.row.id;<BR /> <BR /> // Get the address for the id from the data model<BR /> selectedAddress = AddressList.getInstance().getAddress(selectedId);<BR /> <BR /> // Set the respective texts and values in the dialog<BR /> ...<BR /> <BR /> dialog.show();<BR /> }<BR /> </CODE></PRE><BR /> Before that, we have already added the dialog to the <CODE>index.html</CODE>, so that here we only need to show it.<BR /> <BR /> To complete the functionality of the application, we make sure that when the user closes the dialog, we compare whether they have changed the state of some of the checkboxes and update the data model if this is the case. If the data model has been updated, we also update the table and show a message toast.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/06-Interaction.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 6 - Final application flow where the user can select an address, sees the details, changes the agreement and where changes are applied and confirmed by a message toast.</P><BR /> <BR /> <H2 id="toc-hId--1833067196">Summary</H2><BR /> With events, our application can now react to user input and is finally interactive. Based on the user input, we can change the user interface and the data model and with that, cover a large part of what an interactive prototype is supposed to do.<BR /> <H1 id="toc-hId--1736177694">Summary and Outlook</H1><BR /> This article addressed some of the most important concepts of web-based frontend development:<BR /> <UL><BR /> <LI>How to handle <STRONG>data</STRONG> that we want to display in the application. Having a single data model is important to allow for interactivity and user input as the prototype progresses. Initially, if you only want to assemble components to a static prototype, this is not necessary.</LI><BR /> <LI>How to manipulate the<STRONG> document object model (DOM)</STRONG> of the application, which in the end is just an HTML document. This is important to dynamically create contents or react to user interaction. If you want to construct parts of the prototype based on the data model, like for instance the table we used, this is a very powerful way.</LI><BR /> <LI>How to make the application interactive by registering <STRONG>event</STRONG> listener methods that run code based on user input like a button click or a table selection. This is crucial to make a prototype interactive and requires both, understanding of the DOM-handling and a data model to work efficiently.</LI><BR /> </UL><BR /> There are other things that you will need as you want to create more and more detailed and powerful prototypes like using stylesheets with CSS and using the <A href="https://github.com/design-with-code/general/blob/main/A2-Theme-Variables.md" target="_blank" rel="nofollow noopener noreferrer">theme variables</A> but for now, the most important thing is that you try to get an understanding of these basic concepts that you will need going forward. If it is too overwhelming for a start, just play around with the code you can download from the <A href="https://github.com/design-with-code/web-components/tree/main/Part-04-Data-DOM-And-Events" target="_blank" rel="nofollow noopener noreferrer">GitHub repository</A> and apply smaller changes to see what happens. Take your time!<BR /> <BR /> In the <A href="https://blogs.sap.com/2023/11/13/designing-with-code-part-3-sap-web-components" target="_blank" rel="noopener noreferrer">previous article</A> of this series, you learned how to set up a simple prototyping environment for <A href="https://sap.github.io/ui5-webcomponents/" target="_blank" rel="nofollow noopener noreferrer">SAP web components</A>. In this article, you have learned how you can make an interactive prototype using a data model, the document object model, and event handling to react to user input and programmatically control all elements of your application.<BR /> <BR /> While the articles can't go into all the details, you can find detailed listings and comments in the <A href="https://github.com/design-with-code" target="_blank" rel="nofollow noopener noreferrer">GitHub repository "Design with Code"</A>. You can download the examples from there and run them on your own computer. You can use the examples as a basis for your own prototypes and explorations.<BR /> <BR /> Acquaint yourself more deeply with the <A href="https://experience.sap.com/fiori-design/" target="_blank" rel="noopener noreferrer">SAP Fiori Design Guidelines</A> and the <A href="https://sap.github.io/ui5-webcomponents/" target="_blank" rel="nofollow noopener noreferrer">SAP Web Component documentation</A> to get more information about how to design SAP Fiori applications using the web component library. For all the other topics that you need there is plenty of documentation and tutorial guidance available, so that it will be easy for you to find some that best serves your needs. I can recommend the <A href="https://developer.mozilla.org/en-US/" target="_blank" rel="nofollow noopener noreferrer">Mozilla Developer Network</A> documentation for every question related to JavaScript and CSS. In many cases, it can also be useful to ask <A href="https://openai.com/" target="_blank" rel="nofollow noopener noreferrer">ChatGPT</A>, which can create detailed listings and instructions for your specific questions.<BR /> <BR /> In the <A href="https://blogs.sap.com/2023/11/26/designing-with-code-part-5-team-player/" target="_blank" rel="noopener noreferrer">upcoming articles</A>, we will describe prototyping with other UI technologies offered by SAP, such as SAPUI5 and SAP Web Components for Angular, and how these frameworks add complexity, but also support to your prototyping efforts. We will also take a look at specific topics related to prototyping and interactivity. 2023-11-20T08:44:37+01:00 https://community.sap.com/t5/technology-blogs-by-sap/designing-with-code-part-5-team-player/ba-p/13574157 Designing with Code (Part 5) - Team Player 2023-11-26T19:12:55+01:00 Kai_Richter https://community.sap.com/t5/user/viewprofilepage/user-id/180533 <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/Part-5-teaser.png" /></P><BR /> This is the fifth part of the article series <EM>Designing with Code</EM> , which has the goal to make a case for designers to get more deeply involved with prototyping their designs with the actual UI technologies at hand. Getting some hands-on experience is so important to understand what it is that you are designing for. To put it in <A href="https://www.linkedin.com/in/christophermconnors/" target="_blank" rel="nofollow noopener noreferrer">Chris Connors</A>’ words: “Someone designing a chair wouldn’t attempt it without deep understanding of wood, plastic, steel, how they are made, joined, shaped. Code is no different.”<BR /> <BR /> In the past articles, I presented the <A href="https://blogs.sap.com/2023/11/13/designing-with-code-part-3-sap-web-components/" target="_blank" rel="noopener noreferrer">first steps using web components</A> including <A href="https://blogs.sap.com/2023/11/20/designing-with-code-part-4-data-document-object-model-and-events/" target="_blank" rel="noopener noreferrer">some basics of data handling and interactivity.</A> As already described in the <A href="https://blogs.sap.com/2023/10/29/designing-with-code/" target="_blank" rel="noopener noreferrer">first article</A>, during my fellowship in a product design team, the web components were my door opener into prototyping:<BR /> <BR /> While working on the design for a content-heavy application, I soon got frustrated by the redundant work that was necessary to keep screen flows and variations up to date to reflect changes. Especially the table, which formed the main part of my application (of course <span class="lia-unicode-emoji" title=":winking_face:">😉</span> ) was a nightmare for me to handle. Looking for ways to speed things up, I started using web components. After some initial frustration, I became much faster at creating the interactive application using code than any of my design tools. In many cases, the turn-around time from feedback to revised prototype took minutes rather than hours, as often the change had to be applied in a single function rather than in multiple frames or components. That was extremely powerful.<BR /> <BR /> Also, getting a much better feeling of what the design changes meant in terms of UI implementation helped me to better anticipate the questions that inevitably would come from development when starting to work on it.<BR /> <BR /> As I already had a basic understanding of HTML, JavaScript, and CSS, it was much easier for me to integrate web components than learning a complete framework like Angular, React, or even SAPUI5. And this is the actual beauty of web components:<BR /> <BR /> <STRONG>Web components are team players.</STRONG><BR /> <BR /> They integrate into existing HTML applications effortlessly. You can decide to include individual components or you can build up an entire application using web components as well as anything in between, and you can change your opinion at any time during the process.<BR /> <BR /> Web components are forgiving to sloppy code and lack of architecture; they are just right for every level of proficiency because they let you choose the strictness of the implementation around them.<BR /> <BR /> There is no decision that can’t be revisited along the way, and that’s extremely powerful when you know as little as I did at the time.<BR /> <H1 id="toc-hId-834870436">Lowering Expectations</H1><BR /> And this is one of the most important learnings that I took away from my first time of trial and error:<BR /> <BR /> <STRONG>Being an experienced designer doesn’t mean I am a good UI developer, and that’s okay.</STRONG><BR /> <BR /> I made a lot of mistakes (and I still do), and I was frustrated by the fact that I was not able to lean on the professional experience I normally can when acting as a designer.<BR /> <BR /> In fact, I was afraid of asking for help because my code was so terrible that I would rather search forever in documentation than ask one of my development colleagues and risk to show them my spaghetti code. But after a while, I noticed that instead of bursting out in laughter, they appreciated my efforts and responded with friendly support. The way our discussions went changed, and I noticed that I started to understand aspects I hadn’t been aware of before.<BR /> <BR /> I was so used to being the design expert with the mandate to fight for the interests of the user that reacting to push back from development already had become a reflex. And that’s not unjustified, because often we demand additional efforts and create complexity from our engineers to make life easier for our users. Challenging development is part of our profession and so is the suspicion: <EM>don’t they build it because it’s not feasible or because they don’t want to?</EM><BR /> <BR /> I will never reach the level of our engineering colleagues, but the more I learn, the more I understand. My questions become more targeted, my suggestions become more valuable, and the discussions happen more on eye-level.<BR /> <BR /> I don’t expect ever to become a good UI developer, but I can already tell that I have become a better designer by better understanding the technical side of what we do.<BR /> <H1 id="toc-hId-638356931">Overdo</H1><BR /> Another thing I noticed was that I started bypassing the actual design phase. As it was so easy to iterate on the coded prototype, I hardly opened my design tool anymore. That’s both a risk and an opportunity, since it also opens this perspective to you. Have you ever wondered why an implementation seemed short-sighted and not fitting to the rest? Have you ever seen an implementation where things didn’t fit together?<BR /> <BR /> You just have to overdo it and skip the design phase, et voilá!<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/02-designer-coder-copy.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 1 – If you don’t find your Figma shortcut anymore you should be concerned. (Image generated by DALL-E-3)</P><BR /> Finding myself stuck in the implementation of my prototype taught me the lesson of how important it is to regularly take a step back and look at my work from a distance. Freeing yourself from the “how can I solve this” mindset and getting into the thought process of “what is needed” again reflects the exact same conversation you usually have with development.<BR /> <BR /> <STRONG>Don’t give up being a designer just because you started enjoying to code.</STRONG><BR /> <BR /> During the refinement phase, I forced myself into this by regularly updating the design specification, and in that way having to take this more holistic perspective. Describing what I did in code often made me rethink and rework the design and then feed that back in. I also think you shouldn’t open the code editor before you have the first design iteration finished to avoid getting into the solution space right away.<BR /> <H1 id="toc-hId-441843426">One Step at a Time</H1><BR /> An important learning from working my way into the world of coding was that most setup instructions are targeting developers. As a designer who simply wants to create prototypes, I can keep it simple.<BR /> <BR /> <STRONG>Don’t let complex setup get into your way.</STRONG><BR /> <BR /> Setting up a development environment requires the orchestration of several independent tools and projects into a single development pipeline. A professional developer spends a lot of time on writing test cases, documentation, and so on, and many of the tools are designed to run those tests, control code quality, and detect issues.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/02-tools.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 2 – Overview of build tools for HTML and Javascript</P><BR /> In other words, much of this is not relevant when creating design prototypes. Now, the setup instructions for UI libraries such as SAP Web Components are not meant for nosy designers but for developers building products. For many, this already means an insurmountable hurdle.<BR /> <BR /> Same here. Getting access to web components wasn’t as easy as I had hoped. Seeing the potential, I wanted to get started with examples that I took from the web components playground (the old non-storybook version). But I was intimidated by the setup instructions that included things that I had never heard of and of which I didn’t understand the purpose. There are only few things as frustrating as spending hours on setting up and installing things you don’t understand and then not being able to change anything because you don’t understand what you are doing and if things don’t work… see above. Learning how to use something is already hard enough, who wants to spend even more effort on the setup?<BR /> <BR /> I learned to avoid any complexity I couldn’t handle. Instead, it is better to start with the simplest setup possible and then slowly add any additions needed. A proper code editor can save a lot of time with code completion and formatting. I also learned to value GitHub, which took me a long time to understand and use. I still didn’t see a need to go for the full setup recommended for application developers, and I will stay away from it until I understand it and understand why I should use it.<BR /> <H1 id="toc-hId-245329921">Motivation</H1><BR /> Of course, I am passionate about creating business applications, as they hold the hardest design challenges to solve, but many of these challenges are not so much UI challenges rather than process, data, or integration challenges. Solving such challenges is just not as straight forward as fixing the design and can take much more time. In other words, our everyday work as designers often doesn’t give us enough opportunity to spend time working on prototypes and exploring options.<BR /> <BR /> <STRONG>So where can we purposefully practice our skills?</STRONG><BR /> <BR /> Having meaningful side projects that allow you practicing your skills at your own pace can help a lot. They give you the freedom to try out things without pressure and without limitations. Depending on the type of project, seeing the results of your work immediately and being able to iterate fast can be very rewarding.<BR /> <BR /> For me, this is a home automation application I use to optimize our energy consumption with my family as an extremely critical user group.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/03-openhab.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Figure 3 – UI for my home automation system built with SAP web components.</P><BR /> Now, in version 7, I have implemented the entire application using our web components library enjoying the capabilities of the components and the polished design in both light and dark mode (charts are created with Grafana).<BR /> <BR /> If you want to get deeper into the different aspects of development, I can only recommend looking for such a side project you can use to motivate and challenge yourself, be it a Raspberry Pi project or building on a smart home platform like OpenHAB, this can easily grow into a time-consuming hobby.<BR /> <H1 id="toc-hId-48816416">Summary and Outlook</H1><BR /> In the first set of articles in this series, I have explained why it might pay off for designers to get a deeper understanding of the UI technologies they use. I have tried to show how modern design tools like Figma already prepare you for this step and how discipline in using components and layout can help bridging the gap. In the last two articles I gave you some help to set up a simple development environment and create a first application using our web components library.<BR /> <BR /> What you have seen is that web components are open and flexible, but at the same time they leave a lot to the developer. Currently, there is very little support regarding layout and even component-internal behaviors, manipulating table contents, for example, requires a lot of scripting. If you want to focus on prototyping certain screen flows and interactions without going too deep on the development side, this can be inefficient.<BR /> <BR /> This is, where a more opinionated framework such as SAPUI5 can be more suitable for you. SAPUI5 is optimized to build SAP Fiori applications and provides a lot of out-of-the-box functionality that takes this burden off your shoulders. Even though it appears extremely intimidating in the beginning, once you have understood how things belong together, you can be much faster with much less effort if you stick with the predefined options. In the next part of this series, which will start after the Holidays, I will introduce SAPUI5 and how it can be easily set up for prototyping.<BR /> <BR /> &nbsp; 2023-11-26T19:12:55+01:00 https://community.sap.com/t5/information-architecture-blog-posts/what-s-a-great-information-experience-for-users/ba-p/294573 What's a Great Information Experience for Users? 2023-11-30T05:28:40.605000+01:00 SophsterM https://community.sap.com/t5/user/viewprofilepage/user-id/5568 <H2 id="toc-hId-1653017028">What is information experience?</H2><P>Information experience helps users learn the software, navigate a website, and find help, so that they have a delightful experience. Or at least one that's not entirely frustrating! User Assistance Developers collaborate with design and development to create a wonderful information experience.</P><H3 id="toc-hId--1095653438">Types of information</H3><P>Here are a few examples of types of information that you'd typically find in software, help content, or website design.</P><H4 id="toc-hId-450643392">User interface text&nbsp;</H4><P>This includes buttons, menus, field labels, messages, and on-screen text, like errors, instructions, and more. In this example, the Display settings in Microsoft Word have texts to help you decide which ones to pick.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_0-1698275351438.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48198i388D1E94AA795291/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_0-1698275351438.png" alt="SophsterM_0-1698275351438.png" /></span></P><H4 id="toc-hId--2101513569">User interactions</H4><P>Interactions are how the user uses or interacts with the software or website - how they navigate, which buttons they select, how they search, etc. In this example, the user is interacting with Microsoft Word to save a file with certain settings. The text on this page guides the user to save the file.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_1-1698275617419.png" style="width: 342px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48199iF784984CF8F8502A/image-dimensions/342x344?v=v2" width="342" height="344" role="button" title="SophsterM_1-1698275617419.png" alt="SophsterM_1-1698275617419.png" /></span></P><H4 id="toc-hId--358703234">User assistance (aka "help")</H4><P>Software can have embedded in-app help, help portal and support content, or on-screen text to help users navigate the software. Interactions can have some built-in help, but when a user needs more information, this comes in the form of user assistance (or what the lay people call "help"). How do I add a delegate for my travel expense report? Here's an example of SAP Help Portal content.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_2-1698276490499.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48202i41EAEEDD39D75257/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_2-1698276490499.png" alt="SophsterM_2-1698276490499.png" /></span></P><H2 id="toc-hId-1777134111">Why is a good information experience important?</H2><P>The goal is to design an intuitive and clear user interface to reduce the need for enormous amounts of documentation and frustration. We all know that a certain amount of help is needed for more complex tasks. For example, setting up a server, or setting user permissions. To ensure a good (or even great!) information experience for our users, we use our professional experience to apply known principles of how users read and consume information. This helps to simplify user tasks, increase productivity, and reduce frustration among users.</P><H3 id="toc-hId--971536355">Let's check out this example</H3><P>Imagine you’re driving in your brand-new Acura TL. It’s your first car, and you love how it drives. An icon appears on the dash with a bright orange exclamation mark.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="tirepressureicon.jpeg" style="width: 108px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/47090i98457BC3F0B47440/image-dimensions/108x101?v=v2" width="108" height="101" role="button" title="SophsterM_0-1697059317728.jpeg" alt="SophsterM_0-1697059317728.jpeg" /></span></P><P>You’re confused, worried, panicked. Is something overheated? Is the engine going to die? Should I pull over? Or should I ignore it and hope for the best?&nbsp;</P><P>&nbsp;</P><P>Maybe if you had a more-detailed icon, like this one, your mind would be more at ease. A minor addition of a text stating that the car requires service at 10,000 miles (or is it kilometers?) adds to the clarity of the message and ensures that the user knows it is important but not urgent.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="serviceat10kicon.png" style="width: 114px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/47093i0FA110954FDA686B/image-dimensions/114x114?v=v2" width="114" height="114" role="button" title="SophsterM_0-1697060586312.png" alt="SophsterM_0-1697060586312.png" /></span></P><P>So what does this mysterious icon actually mean? It's about your tire pressure!! How's this for clarity?</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="checktirepressureicon.png" style="width: 121px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/47094iDEAE3033DDFBE2FD/image-dimensions/121x120?v=v2" width="121" height="120" role="button" title="SophsterM_1-1697061005980.png" alt="SophsterM_1-1697061005980.png" /></span></P><H2 id="toc-hId-967787485">What do User Assistance Developers contribute?</H2><P>User Assistance Developers collaborate with design and development teams to give users an exceptional and intuitive information experience in the user interface. We apply proven principles of how users read and consume information to<SPAN>&nbsp;simplify user tasks, increase productivity, and reduce frustration.</SPAN><SPAN>&nbsp;Users rely on this information to complete a task quickly and easily.</SPAN></P><P>Here are a few rules to keep in mind when creating an enjoyable and effective information experience.</P><H3 id="toc-hId--1780882981"><STRONG>Know your users</STRONG></H3><P>Determine the type and amount of information users need, depending on their role and what they need to get done (personas).</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="The Trulia mobile app is for users looking for homes for sale, apartments for rent, and open houses." style="width: 176px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/47095i9B77D56441F956DF/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_0-1697061305657.jpeg" alt="The Trulia mobile app is for users looking for homes for sale, apartments for rent, and open houses." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">The Trulia mobile app is for users looking for homes for sale, apartments for rent, and open houses.</span></span></P><H3 id="toc-hId--38072646"><STRONG>Integrate information</STRONG></H3><P>Develop and implement information (embedded assistance) into the&nbsp;application as part of the feature, instead of adding it on after the fact. Integrate information in the user interface to help users complete their tasks.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_6-1698278005021.png" style="width: 232px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48210iC8E643C3702FB99A/image-dimensions/232x306?v=v2" width="232" height="306" role="button" title="SophsterM_6-1698278005021.png" alt="SophsterM_6-1698278005021.png" /></span></P><H3 id="toc-hId-989576400">Introduce new features</H3><P>Show users that there's a new feature and tell them how to use it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_7-1698278116936.png" style="width: 275px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48211iDD63EAA12B301B4E/image-dimensions/275x315?v=v2" width="275" height="315" role="button" title="SophsterM_7-1698278116936.png" alt="SophsterM_7-1698278116936.png" /></span></P><H3 id="toc-hId--1562580561">Create content guidelines</H3><P>Set guidelines for tone, language, terminology, and typography to ensure the information experience is consistent across the application. This improves the user’s ability to scan, read, and understand how to interact with the app.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_4-1697062898241.png" style="width: 371px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/47101i7F70A1B14189FB84/image-dimensions/371x107?v=v2" width="371" height="107" role="button" title="SophsterM_4-1697062898241.png" alt="SophsterM_4-1697062898241.png" /></span></P><H3 id="toc-hId-180229774">Create task-based content</H3><P>Focus on providing the right content for an entire workflow and for each single task. Break multi-part procedures into shorter, manageable individual topics so that users don’t get lost in a sea of steps. Three separate 10-step tasks are easier to follow than a single 30-step task.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Waze mobile app clearly displays the tasks the user wants to do" style="width: 226px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/47102iCEECC74DA96C8CE5/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_5-1697063055017.png" alt="Waze mobile app clearly displays the tasks the user wants to do" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Waze mobile app clearly displays the tasks the user wants to do</span></span></P><H3 id="toc-hId-1923040109">Provide solutions</H3><P>Don't just give users a well written error. Tell them what to do. Give them a way out of this problem. Amazon's adorable dogs are a clever way to provide a Page Not Found message. But they also give you a link to get back to Amazon's home page.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_8-1698278261087.png" style="width: 200px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48212i61186A630C1DECCF/image-size/small?v=v2&amp;px=200" role="button" title="SophsterM_8-1698278261087.png" alt="SophsterM_8-1698278261087.png" /></span></P><H2 id="toc-hId-1167834507">The good, the bad, and the ugly</H2><P>If you're interested in what's NOT a good information experience, here are a few examples. Can you spot what's wrong in these examples?</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="This error isn't helpful at all. What does this mean? What do I do?" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48204iA657C7BCD34F55AD/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_0-1698277587259.png" alt="This error isn't helpful at all. What does this mean? What do I do?" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">This error isn't helpful at all. What does this mean? What do I do?</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Not useful. And no, it's not OK." style="width: 346px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48206iC22852A583DA7FD1/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_2-1698277612542.png" alt="Not useful. And no, it's not OK." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Not useful. And no, it's not OK.</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Where do I begin? This interface is so busy, I don't know where to start." style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48207i9DD68144BC3F4724/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_3-1698277636948.png" alt="Where do I begin? This interface is so busy, I don't know where to start." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Where do I begin? This interface is so busy, I don't know where to start.</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Very wordy, yet totally useless. Get to the point." style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48208i701435018149B4D4/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_4-1698277679576.png" alt="Very wordy, yet totally useless. Get to the point." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Very wordy, yet totally useless. Get to the point.</span></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Uh-oh doesn't make it cute. It's still an error. Help me resolve it." style="width: 253px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/48209i3215BB4CE5E84BF9/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_5-1698277755651.png" alt="Uh-oh doesn't make it cute. It's still an error. Help me resolve it." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Uh-oh doesn't make it cute. It's still an error. Help me resolve it.</span></span></P><H2 id="toc-hId--1384322454">Workarounds to bad interface</H2><P>Sometimes the interface can’t (or won’t) be fixed and someone needs to come up with a solution to decipher car dashboard or laundry symbols. It’s not the best solution, but seems like it works.</P><H4 id="toc-hId-1059552459">Here are two workarounds to bad interface</H4><UL><LI>The iPhone has a new feature where you can use the phone camera to look up car dash symbols and meanings. A cheat sheet to avoid redesigning unclear icons?</LI></UL><P style=" padding-left : 60px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_0-1699390213286.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/49185iFC089E84BC2565A9/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_0-1699390213286.png" alt="SophsterM_0-1699390213286.png" /></span></P><P style=" padding-left : 60px; "><STRONG>Image Source:</STRONG>&nbsp;GoMechanic website.</P><UL><LI>Create an app so that people can scan obscure icons and symbols and look them up with your iPhone. for example, there's the Laundry Lens app for this purpose. Easier than having more intuitive icons?&nbsp;</LI></UL><P style=" padding-left : 60px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SophsterM_1-1699390213296.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/49184iADF7975CCEB57C4A/image-size/medium?v=v2&amp;px=400" role="button" title="SophsterM_1-1699390213296.png" alt="SophsterM_1-1699390213296.png" /></span></P><P style=" padding-left : 60px; "><STRONG>Image Source:</STRONG>&nbsp;UX Collective website.&nbsp;</P><H2 id="toc-hId-2101298216">So, what now?</H2><UL><LI>Work with design and development early and often to ensure a wonderful user experience.</LI><LI>Review and influence the user interface and any content the user will see in an application.</LI><LI>Make sure any content the user sees is helpful, accurate, consistent, and helps them complete their task.</LI><LI>Help users by adding on-screen text/help, proper labels, helpful error messages, and introducing new features.</LI><LI>Are the application interactions intuitive? Use the application and complete the tasks yourself. YOU are the first end-user.</LI><LI>Know who your users are. What is their knowledge? What previous knowledge do they have an what tasks do they want to complete.</LI><LI>Help users complete their task and be productive. If the content doesn’t help the user, consider removing or changing it.</LI></UL> 2023-11-30T05:28:40.605000+01:00 https://community.sap.com/t5/enterprise-resource-planning-blogs-by-members/third-party-system-approvals-substitution-to-s4-system-through-interface/ba-p/13578916 Third party system approvals substitution to S4 System through interface 2023-12-14T22:07:28+01:00 suryag https://community.sap.com/t5/user/viewprofilepage/user-id/775700 <STRONG>Introduction:</STRONG><BR /> <BR /> The development of this interface will facilitate the entry of delegation values into the standard SAP table HRUS_D2. 3PL system will provide a file that will be sent to SAP nightly utilizing PI for processing. The&nbsp;file will be tab delimited in format and will be placed in be placed in a SAPIN folder: \\saptest\\sapin\erp\\folder<BR /> <BR /> <STRONG>Overview:-</STRONG><BR /> <BR /> <STRONG>1)&nbsp;3PL system will provide a file.</STRONG><BR /> <BR /> <STRONG>2) The file will be tab delimited in format and will be placed in be placed in a SAPIN folder.</STRONG><BR /> <BR /> <STRONG>3) Path \\saptest\\sapin\\erp\\folder</STRONG><BR /> <BR /> <STRONG>4) Check conditions. If yes, based on conditions data will be created or updated or modified&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;in HRUS_D2 table. Send log information through email.</STRONG><BR /> <BR /> <STRONG>5) If no, continue business process.</STRONG><BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>Step By Step Procedure for Creating Proxy</STRONG><BR /> <BR /> 1.The Proxy Service Interface has to be created by PI consultant from PI side. This will further reflect in ABAP side in T-Code “SPROXY”.<BR /> <BR /> 2.Create the Proxy from T-Code “SPROXY”.<BR /> <BR /> 3.The Proxy created from PI side will be reflected with following details in SPROXY.<BR /> Software Component: Service_1.0_of_erp.com<BR /> Namespace:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <A href="http://erp.com//3PLtoSAPService" target="test_blank" rel="nofollow noopener noreferrer">http://erp.com//3PLtoSAPService</A><BR /> Service Interfaces:&nbsp; &nbsp; &nbsp; Service_Async_Out<BR /> <BR /> 4. Proxy Name will be available once we generate the Proxy.<BR /> <BR /> To generate proxy we need to right click on Service Interface “Service_Async_Out” for Outbound and&nbsp; &nbsp; &nbsp;click on “Create Proxy”.<BR /> <BR /> 5.We need to give the “Package” and “Transport Request” to which the Proxy needs to be saved.<BR /> <BR /> 6.Once the proxy is created for a service interface then that Interface will be marked as Green.<BR /> <BR /> 7. we can find the Proxy Name when we double click on the generated Service Interface. In this case since the Outbound Proxy was already generated we can find the Proxy name of that.<BR /> <BR /> 8 .The objects created when we generate a Proxy is as follows<BR /> I. Data Type<BR /> ii. Message Type<BR /> iii. Proxy Class.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>Implement proxy class method</STRONG><BR /> <BR /> Switch to the&nbsp;<STRONG>Properties</STRONG> tab. Double-click the implementing class. and then double-click the method.<BR /> <BR /> Maintain the implementation of the method.<BR /> <BR /> <STRONG>Purpose:</STRONG> Upload data into HRUS_D2 table(Substituted by User).using below function modules in our interface.<BR /> <BR /> SAP_WAPI_SUBSTITUTE_DELETE<BR /> SAP_WAPI_SUBSTITUTE_MAINTAIN<BR /> RH_UPDATE_SUBST_LIST_SERVER<BR /> <BR /> Total 3 scenarios are there<BR /> <BR /> Once the file triggers proxy then checking the conditions. Based on conditions data will be created or updated or modified.<BR /> <BR /> <STRONG>Scenario1:</STRONG> If file data not in a table, then it inserts a new record same as in file.<BR /> <BR /> <STRONG>Scenario2:</STRONG> If file data in a table, then it updates existing record same as in file.<BR /> <BR /> <STRONG>Scenario3:</STRONG> Table data not in a file then need to update end date and active with ‘space’.<BR /> <BR /> After file execution sent an email with log information (which email is maintained in ZEMAIL table).<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>METHOD zclii_service_async_in~service_async_in.</STRONG><BR /> <BR /> */ Structure declarations<BR /> TYPES: BEGIN OF ty_input,<BR /> us_name TYPE xubname,<BR /> rep_name TYPE xubname,<BR /> begda TYPE begdatum,<BR /> endda TYPE enddatum,<BR /> reppr TYPE hr_rep_prf,<BR /> active TYPE hs_rep_act,<BR /> END OF ty_input.<BR /> TYPES: BEGIN OF ty_final,<BR /> us_name TYPE xubname,<BR /> rep_name TYPE xubname,<BR /> begda TYPE begdatum,<BR /> endda TYPE enddatum,<BR /> reppr TYPE hr_rep_prf,<BR /> active TYPE hs_rep_act,<BR /> message(100) TYPE c,<BR /> END OF ty_final.<BR /> <BR /> DATA: substituted_obj TYPE swragent,<BR /> substitute TYPE swragent,<BR /> sub_beg TYPE swr_substbegin,<BR /> sub_end TYPE swr_substend,<BR /> sub_pfile TYPE swr_substprof,<BR /> sub_act TYPE swr_substactive,<BR /> lang TYPE sylangu,<BR /> ext_badi TYPE xfeld,<BR /> ret_code TYPE sysubrc,<BR /> msg_lines TYPE TABLE OF swr_messag,<BR /> msg_str TYPE TABLE OF swr_mstruc,<BR /> subs_tab TYPE TABLE OF swragent,<BR /> date(2) TYPE c,<BR /> month(2) TYPE c,<BR /> year(4) TYPE c,<BR /> lv_datum(8) TYPE c,<BR /> lv_dat(8) TYPE c.<BR /> <BR /> */ Data declarations<BR /> DATA:<BR /> */ Internal Tables<BR /> lt_input TYPE TABLE OF ty_input,<BR /> lt_output TYPE TABLE OF ty_input,<BR /> lt_modify TYPE TABLE OF ty_input,<BR /> lt_temp TYPE TABLE OF ty_input,<BR /> lt_insert TYPE TABLE OF ty_input,<BR /> lt_update TYPE TABLE OF ty_input,<BR /> lt_updatex TYPE TABLE OF ty_input,<BR /> lt_deletex TYPE TABLE OF ty_input,<BR /> lt_email_address TYPE ifp_tab_address,<BR /> lt_binary_content TYPE solix_tab,<BR /> lt_email_body TYPE TABLE OF tline,<BR /> <BR /> */ Local Reference<BR /> lo_email TYPE REF TO zcl_gen_utilities,<BR /> <BR /> */ Local Structures<BR /> ls_output TYPE ty_input,<BR /> ls_insert TYPE ty_input,<BR /> ls_update TYPE ty_input,<BR /> ls_updatex TYPE ty_input,<BR /> ls_deletex TYPE ty_input,<BR /> ls_email_body TYPE tline,<BR /> ls_email_address TYPE ifp_str_address,<BR /> <BR /> */ Local Variables<BR /> lv_string TYPE string,<BR /> lv_size TYPE so_obj_len,<BR /> lv_subject(50),<BR /> lv_enddate TYPE sy-datum,<BR /> lv_err TYPE c,<BR /> lc_tab TYPE c VALUE cl_bcs_convert=&gt;lc_tab,<BR /> lc_crlf TYPE c VALUE cl_bcs_convert=&gt;lc_crlf.<BR /> <BR /> DATA:<BR /> subst_tab TYPE STANDARD TABLE OF hrus_d2, "TABLES PARAM<BR /> wa_subst_tab LIKE LINE OF subst_tab,<BR /> err_tab TYPE STANDARD TABLE OF hrscmperr, "TABLES PARAM<BR /> wa_err_tab LIKE LINE OF err_tab.<BR /> <BR /> DATA: lt_final TYPE TABLE OF ty_final,<BR /> ls_final TYPE ty_final,<BR /> lt_hrus TYPE TABLE OF hrus_d2,<BR /> lt_temp TYPE TABLE OF hrus_d2.<BR /> <BR /> */ Constants Declarations<BR /> <BR /> CONSTANTS: lc_eamt_parameters TYPE string VALUE 'ZEMAIL', "<BR /> lc_ricefid_1234 TYPE zparam_name VALUE 'EMAIL1234', "<BR /> lc_param_name TYPE zmaptype1 VALUE 'Z1234_EMAIL'. "<BR /> "lc_eamt_parameters TYPE string VALUE 'ZEAMT_PARAMETERS', "<BR /> <BR /> REFRESH: lt_input, lt_output, lt_update, gt_insert, lt_updatex,<BR /> lt_final, lt_hrus, lt_temp, lt_temp, subst_tab, err_tab, gt_deletex.<BR /> CLEAR: ls_final, ls_output, ls_insert, gs_update, ls_updatex, ls_deletex.<BR /> <BR /> IF input-delegation_update_sap IS NOT INITIAL.<BR /> MOVE-CORRESPONDING input-delegation_update_sap-record TO lt_input.<BR /> <BR /> LOOP AT lt_input INTO DATA(ls_input).<BR /> ls_output-us_name = ls_input-us_name.<BR /> ls_output-rep_name = ls_input-rep_name.<BR /> ls_output-begda = ls_input-begda.<BR /> ls_output-endda = ls_input-endda.<BR /> ls_output-reppr = ls_input-reppr.<BR /> ls_output-active = ls_input-active.<BR /> APPEND ls_output TO lt_output.<BR /> CLEAR:ls_output,<BR /> ls_input.<BR /> ENDLOOP.<BR /> <BR /> LOOP AT lt_output INTO DATA(ls_output) WHERE reppr = '0003'.<BR /> month = ls_output-begda+0(2).<BR /> date = ls_output-begda+2(2).<BR /> year = ls_output-begda+4(4).<BR /> CONCATENATE year month date INTO ls_output-begda.<BR /> <BR /> month = ls_output-endda+0(2).<BR /> date = ls_output-endda+2(2).<BR /> year = ls_output-endda+4(4).<BR /> CONCATENATE year month date INTO ls_output-endda.<BR /> <BR /> SELECT SINGLE * FROM hrus_d2 INTO <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1407137">@DATA</a>(ls_hrus) WHERE us_name = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1398583">@LieneS</a>_output-us_name<BR /> AND rep_name = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1398583">@LieneS</a>_output-rep_name<BR /> AND begda = <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1398583">@LieneS</a>_output-begda.<BR /> "Case1 File data not in a table then insert a record<BR /> IF sy-subrc &lt;&gt; 0 AND ls_hrus IS INITIAL.<BR /> MOVE-CORRESPONDING ls_output TO ls_insert.<BR /> APPEND ls_insert TO gt_insert.<BR /> "Case2 File data in a table then update a record<BR /> ELSEIF ls_hrus IS NOT INITIAL.<BR /> <BR /> IF ls_output-endda = ls_hrus-endda. "It triggers Maintain Function module<BR /> MOVE-CORRESPONDING ls_output TO gs_update.<BR /> APPEND ls_update TO lt_update.<BR /> ELSEIF ls_output-endda &lt;&gt; ls_hrus-endda.. "It triggers delete FM and insert a record<BR /> MOVE-CORRESPONDING ls_output TO ls_updatex.<BR /> APPEND ls_updatex TO lt_updatex.<BR /> <BR /> MOVE-CORRESPONDING ls_output TO ls_deletex.<BR /> ls_deletex-endda = ls_hrus-endda. "need<BR /> APPEND ls_deletex TO gt_deletex.<BR /> ENDIF.<BR /> <BR /> ENDIF.<BR /> CLEAR: ls_insert, ls_output, ls_hrus, gs_update, ls_updatex, ls_deletex.<BR /> ENDLOOP.<BR /> <BR /> "Case3 Table data not in a file then need to update enddate and active<BR /> LOOP AT lt_output INTO DATA(gs_modify).<BR /> month = gs_modify-begda+0(2).<BR /> date = gs_modify-begda+2(2).<BR /> year = gs_modify-begda+4(4).<BR /> CONCATENATE year month date INTO gs_modify-begda.<BR /> <BR /> month = gs_modify-endda+0(2).<BR /> date = gs_modify-endda+2(2).<BR /> year = gs_modify-endda+4(4).<BR /> CONCATENATE year month date INTO gs_modify-endda.<BR /> <BR /> APPEND gs_modify TO lt_temp.<BR /> CLEAR: gs_modify.<BR /> ENDLOOP.<BR /> <BR /> IF lt_temp IS NOT INITIAL.<BR /> SELECT * FROM hrus_d2 INTO TABLE lt_temp WHERE reppr = '0003'.<BR /> <BR /> LOOP AT lt_temp INTO DATA(gs_temp).<BR /> DELETE lt_temp WHERE us_name = gs_temp-us_name<BR /> AND rep_name = gs_temp-rep_name<BR /> AND begda = gs_temp-begda.<BR /> CLEAR: gs_temp.<BR /> ENDLOOP.<BR /> lt_hrus = lt_temp.<BR /> <BR /> "Delete the records<BR /> LOOP AT lt_temp INTO DATA(ls_temp) WHERE active = 'X'.<BR /> substituted_obj-otype = 'US'.<BR /> substituted_obj-objid = ls_temp-us_name.<BR /> <BR /> substitute-otype = 'US'.<BR /> substitute-objid = ls_temp-rep_name.<BR /> APPEND substitute TO subs_tab.<BR /> <BR /> sub_beg = ls_temp-begda.<BR /> sub_end = ls_temp-endda.<BR /> <BR /> CALL FUNCTION 'SAP_WAPI_SUBSTITUTE_DELETE'<BR /> EXPORTING<BR /> substituted_obj = substituted_obj<BR /> start_date = sub_beg<BR /> end_date = sub_end<BR /> delete_without_date = 'X'<BR /> lang = sy-langu<BR /> ext_badi = ' '<BR /> IMPORTING<BR /> ret_code = ret_code<BR /> TABLES<BR /> substitutes = subs_tab<BR /> msg_lines = msg_lines<BR /> msg_str = msg_str.<BR /> CLEAR: ls_temp.<BR /> REFRESH: subs_tab.<BR /> ENDLOOP.<BR /> <BR /> "Change end date and active with space<BR /> LOOP AT lt_hrus INTO ls_hrus.<BR /> IF ls_hrus-active = 'X'.<BR /> gs_modify-us_name = ls_hrus-us_name.<BR /> gs_modify-rep_name = ls_hrus-rep_name.<BR /> gs_modify-begda = ls_hrus-begda.<BR /> lv_datum = sy-datum.<BR /> lv_dat = lv_datum - 1.<BR /> year = lv_dat+0(4).<BR /> month = lv_dat+4(2).<BR /> date = lv_dat+6(2).<BR /> CONCATENATE year month date INTO gs_modify-endda. "need to modify<BR /> gs_modify-reppr = ls_hrus-reppr.<BR /> gs_modify-active = ls_hrus-active.<BR /> APPEND gs_modify TO lt_modify.<BR /> CLEAR: gs_modify, ls_hrus, lv_dat.<BR /> ELSE.<BR /> MOVE-CORRESPONDING ls_hrus TO gs_modify.<BR /> APPEND gs_modify TO lt_modify.<BR /> CLEAR: gs_modify, ls_hrus.<BR /> ENDIF.<BR /> ENDLOOP.<BR /> ENDIF.<BR /> <BR /> LOOP AT lt_deletex INTO ls_deletex.<BR /> substituted_obj-otype = 'US'.<BR /> substituted_obj-objid = ls_deletex-us_name.<BR /> substitute-otype = 'US'.<BR /> substitute-objid = ls_deletex-rep_name.<BR /> APPEND substitute TO subs_tab.<BR /> sub_beg = ls_deletex-begda.<BR /> sub_end = ls_deletex-endda.<BR /> <BR /> CALL FUNCTION 'SAP_WAPI_SUBSTITUTE_DELETE'<BR /> EXPORTING<BR /> substituted_obj = substituted_obj<BR /> start_date = sub_beg<BR /> end_date = sub_end<BR /> delete_without_date = 'X'<BR /> lang = sy-langu<BR /> ext_badi = ' '<BR /> IMPORTING<BR /> ret_code = ret_code<BR /> TABLES<BR /> substitutes = subs_tab<BR /> msg_lines = msg_lines<BR /> msg_str = msg_str.<BR /> CLEAR: ls_deletex.<BR /> REFRESH: subs_tab.<BR /> ENDLOOP.<BR /> <BR /> "Case1 Create a new record<BR /> IF lt_insert IS NOT INITIAL.<BR /> <BR /> LOOP AT lt_insert INTO ls_insert.<BR /> substituted_obj-otype = 'US'.<BR /> substituted_obj-objid = ls_insert-us_name.<BR /> substitute-otype = 'US'.<BR /> substitute-objid = ls_insert-rep_name.<BR /> sub_beg = ls_insert-begda.<BR /> sub_end = ls_insert-endda.<BR /> sub_pfile = ls_insert-reppr.<BR /> sub_act = ls_insert-active.<BR /> <BR /> CALL FUNCTION 'SAP_WAPI_SUBSTITUTE_MAINTAIN'<BR /> EXPORTING<BR /> substituted_obj = substituted_obj<BR /> substitute = substitute<BR /> sub_beg = sub_beg<BR /> sub_end = sub_end<BR /> sub_pfile = sub_pfile<BR /> sub_act = sub_act<BR /> lang = sy-langu<BR /> ext_badi = ' '<BR /> IMPORTING<BR /> ret_code = ret_code<BR /> TABLES<BR /> msg_lines = msg_lines<BR /> msg_str = msg_str.<BR /> <BR /> IF ret_code = 0.<BR /> ls_final-us_name = ls_insert-us_name.<BR /> ls_final-rep_name = ls_insert-rep_name.<BR /> ls_final-begda = ls_insert-begda.<BR /> ls_final-endda = ls_insert-endda.<BR /> ls_final-reppr = ls_insert-reppr.<BR /> ls_final-active = ls_insert-active.<BR /> ls_final-message = 'Create a new record'.<BR /> APPEND ls_final TO lt_final.<BR /> ELSE.<BR /> ls_final-us_name = ls_insert-us_name.<BR /> ls_final-rep_name = ls_insert-rep_name.<BR /> ls_final-begda = ls_insert-begda.<BR /> ls_final-endda = ls_insert-endda.<BR /> ls_final-reppr = ls_insert-reppr.<BR /> ls_final-active = ls_insert-active.<BR /> ls_final-message = 'Record is already existed'.<BR /> APPEND ls_final TO lt_final.<BR /> ENDIF.<BR /> <BR /> CLEAR: ls_insert, ls_final.<BR /> ENDLOOP.<BR /> ENDIF.<BR /> "Case2 Update a existing record<BR /> IF lt_update IS NOT INITIAL. "It triggers update a existing record<BR /> LOOP AT lt_update INTO gs_update.<BR /> substituted_obj-otype = 'US'.<BR /> substituted_obj-objid = gs_update-us_name.<BR /> substitute-otype = 'US'.<BR /> substitute-objid = gs_update-rep_name.<BR /> sub_beg = gs_update-begda.<BR /> sub_end = gs_update-endda.<BR /> sub_pfile = gs_update-reppr.<BR /> sub_act = gs_update-active.<BR /> <BR /> CALL FUNCTION 'SAP_WAPI_SUBSTITUTE_MAINTAIN'<BR /> EXPORTING<BR /> substituted_obj = substituted_obj<BR /> substitute = substitute<BR /> sub_beg = sub_beg<BR /> sub_end = sub_end<BR /> sub_pfile = sub_pfile<BR /> sub_act = sub_act<BR /> lang = sy-langu<BR /> ext_badi = ' '<BR /> IMPORTING<BR /> ret_code = ret_code<BR /> TABLES<BR /> msg_lines = msg_lines<BR /> msg_str = msg_str.<BR /> <BR /> IF ret_code = 0.<BR /> ls_final-us_name = gs_update-us_name.<BR /> ls_final-rep_name = gs_update-rep_name.<BR /> ls_final-begda = gs_update-begda.<BR /> ls_final-endda = gs_update-endda.<BR /> ls_final-reppr = gs_update-reppr.<BR /> ls_final-active = gs_update-active.<BR /> ls_final-message = 'Modified Existing Record'.<BR /> APPEND ls_final TO lt_final.<BR /> ELSE.<BR /> ls_final-us_name = gs_update-us_name.<BR /> ls_final-rep_name = gs_update-rep_name.<BR /> ls_final-begda = gs_update-begda.<BR /> ls_final-endda = gs_update-endda.<BR /> ls_final-reppr = gs_update-reppr.<BR /> ls_final-active = gs_update-active.<BR /> ls_final-message = 'Record is already existed'.<BR /> APPEND ls_final TO lt_final.<BR /> ENDIF.<BR /> <BR /> CLEAR: gs_update, ls_final.<BR /> ENDLOOP.<BR /> ENDIF.<BR /> <BR /> IF lt_updatex IS NOT INITIAL. "It triggers delete FM and insert a new record<BR /> <BR /> LOOP AT lt_updatex INTO ls_updatex.<BR /> wa_subst_tab-us_name = ls_updatex-us_name.<BR /> wa_subst_tab-rep_name = ls_updatex-rep_name.<BR /> wa_subst_tab-begda = ls_updatex-begda.<BR /> wa_subst_tab-endda = ls_updatex-endda.<BR /> wa_subst_tab-reppr = ls_updatex-reppr.<BR /> wa_subst_tab-active = ls_updatex-active.<BR /> APPEND wa_subst_tab TO subst_tab.<BR /> <BR /> CALL FUNCTION 'RH_UPDATE_SUBST_LIST_SERVER'<BR /> TABLES<BR /> subst_tab = subst_tab<BR /> err_tab = err_tab<BR /> EXCEPTIONS<BR /> no_wf_plvar = 1<BR /> . " RH_UPDATE_SUBST_LIST_SERVER<BR /> <BR /> IF sy-subrc EQ 0.<BR /> "All OK<BR /> ELSEIF sy-subrc EQ 1. "Exception<BR /> "Add code for exception here<BR /> ENDIF.<BR /> CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'<BR /> EXPORTING<BR /> wait = '1'<BR /> * IMPORTING<BR /> * RETURN =<BR /> .<BR /> WAIT UP TO 1 SECONDS.<BR /> IF sy-subrc = 0.<BR /> ls_final-us_name = ls_updatex-us_name.<BR /> ls_final-rep_name = ls_updatex-rep_name.<BR /> ls_final-begda = ls_updatex-begda.<BR /> ls_final-endda = ls_updatex-endda.<BR /> ls_final-reppr = ls_updatex-reppr.<BR /> ls_final-active = ls_updatex-active.<BR /> ls_final-message = 'Modified Existing Record'.<BR /> APPEND ls_final TO lt_final.<BR /> ELSE.<BR /> ls_final-us_name = ls_updatex-us_name.<BR /> ls_final-rep_name = ls_updatex-rep_name.<BR /> ls_final-begda = ls_updatex-begda.<BR /> ls_final-endda = ls_updatex-endda.<BR /> ls_final-reppr = ls_updatex-reppr.<BR /> ls_final-active = ls_updatex-active.<BR /> ls_final-message = 'Record is already existed'.<BR /> APPEND ls_final TO lt_final.<BR /> ENDIF.<BR /> CLEAR: ls_final, ls_updatex, wa_subst_tab.<BR /> REFRESH: subst_tab.<BR /> ENDLOOP.<BR /> <BR /> ENDIF.<BR /> "Case3 modify a existing record<BR /> IF lt_modify IS NOT INITIAL.<BR /> LOOP AT lt_modify INTO gs_modify WHERE active = 'X'.<BR /> wa_subst_tab-us_name = gs_modify-us_name.<BR /> wa_subst_tab-rep_name = gs_modify-rep_name.<BR /> wa_subst_tab-begda = gs_modify-begda.<BR /> wa_subst_tab-endda = gs_modify-endda.<BR /> wa_subst_tab-reppr = gs_modify-reppr.<BR /> wa_subst_tab-active = ''.<BR /> APPEND wa_subst_tab TO subst_tab.<BR /> CALL FUNCTION 'RH_UPDATE_SUBST_LIST_SERVER'<BR /> TABLES<BR /> subst_tab = subst_tab<BR /> err_tab = err_tab<BR /> EXCEPTIONS<BR /> no_wf_plvar = 1<BR /> . " RH_UPDATE_SUBST_LIST_SERVER<BR /> <BR /> IF sy-subrc EQ 0.<BR /> "All OK<BR /> ELSEIF sy-subrc EQ 1. "Exception<BR /> "Add code for exception here<BR /> ENDIF.<BR /> CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'<BR /> EXPORTING<BR /> wait = '1'<BR /> * IMPORTING<BR /> * RETURN =<BR /> .<BR /> WAIT UP TO 1 SECONDS.<BR /> IF sy-subrc = 0.<BR /> ls_final-us_name = gs_modify-us_name.<BR /> ls_final-rep_name = gs_modify-rep_name.<BR /> ls_final-begda = gs_modify-begda.<BR /> ls_final-endda = gs_modify-endda.<BR /> ls_final-reppr = gs_modify-reppr.<BR /> ls_final-active = ''.<BR /> ls_final-message = 'Modified Existing Record'.<BR /> APPEND ls_final TO lt_final.<BR /> ELSE.<BR /> ls_final-us_name = gs_modify-us_name.<BR /> ls_final-rep_name = gs_modify-rep_name.<BR /> ls_final-begda = gs_modify-begda.<BR /> ls_final-endda = gs_modify-endda.<BR /> ls_final-reppr = gs_modify-reppr.<BR /> ls_final-active = ''.<BR /> ls_final-message = 'Record is already existed'.<BR /> APPEND ls_final TO lt_final.<BR /> ENDIF.<BR /> <BR /> CLEAR: gs_modify, ls_final, wa_subst_tab.<BR /> REFRESH: subst_tab.<BR /> ENDLOOP.<BR /> "table data not in a file then need to update end date and active with ‘space’.<BR /> LOOP AT lt_modify INTO gs_modify WHERE active = ''.<BR /> ls_final-us_name = gs_modify-us_name.<BR /> ls_final-rep_name = gs_modify-rep_name.<BR /> ls_final-begda = gs_modify-begda.<BR /> ls_final-endda = gs_modify-endda.<BR /> ls_final-reppr = gs_modify-reppr.<BR /> ls_final-active = ''.<BR /> ls_final-message = 'Activate with set to space'.<BR /> APPEND ls_final TO lt_final.<BR /> CLEAR: gs_modify, ls_final.<BR /> ENDLOOP.<BR /> <BR /> ENDIF.<BR /> <BR /> */Sending email notification<BR /> <BR /> IF lt_final IS NOT INITIAL. "Email<BR /> <BR /> CREATE OBJECT lo_email.<BR /> <BR /> lv_string = lv_string &amp;&amp;<BR /> 'User Name'(012) &amp;&amp; lc_tab &amp;&amp;<BR /> 'User Name'(013) &amp;&amp; lc_tab &amp;&amp;<BR /> 'Start Date'(014) &amp;&amp; lc_tab &amp;&amp;<BR /> 'End Date'(015) &amp;&amp; lc_tab &amp;&amp;<BR /> 'Substitute Profile'(016) &amp;&amp; lc_tab &amp;&amp;<BR /> 'Substitution Active'(017) &amp;&amp; lc_tab &amp;&amp;<BR /> 'Message'(018) &amp;&amp; lc_crlf.<BR /> <BR /> LOOP AT lt_final ASSIGNING FIELD-SYMBOL(&lt;fs_output&gt;).<BR /> <BR /> lv_string = lv_string &amp;&amp;<BR /> &lt;fs_output&gt;-us_name &amp;&amp; lc_tab &amp;&amp;<BR /> &lt;fs_output&gt;-rep_name &amp;&amp; lc_tab &amp;&amp;<BR /> &lt;fs_output&gt;-begda &amp;&amp; lc_tab &amp;&amp;<BR /> &lt;fs_output&gt;-endda &amp;&amp; lc_tab &amp;&amp;<BR /> &lt;fs_output&gt;-reppr &amp;&amp; lc_tab &amp;&amp;<BR /> &lt;fs_output&gt;-active &amp;&amp; lc_tab &amp;&amp;<BR /> &lt;fs_output&gt;-message &amp;&amp; lc_crlf .<BR /> <BR /> ENDLOOP.<BR /> <BR /> ls_email_body-tdline = 'Hi'.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> ls_email_body-tdline = ''.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> ls_email_body-tdline = ''.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> ls_email_body-tdline = 'Pleae see the attached file for the 3PL Substitution to S4'.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> ls_email_body-tdline = 'Can you please check the records'.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> ls_email_body-tdline = ''.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> ls_email_body-tdline = ''.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> ls_email_body-tdline = 'Thank you'.<BR /> APPEND ls_email_body TO lt_email_body.<BR /> CLEAR ls_email_body.<BR /> <BR /> * Convert the inernal table data into binary format.<BR /> IF lv_string IS NOT INITIAL.<BR /> lo_email-&gt;create_excel_content( EXPORTING<BR /> email_data = lv_string<BR /> IMPORTING<BR /> binary_content = lt_binary_content<BR /> size = lv_size ).<BR /> ENDIF.<BR /> <BR /> * Append all the emails<BR /> DATA(l_util) = NEW zcl_gen_utilities( ).<BR /> l_util-&gt;read_parameters_table( EXPORTING table = lc_eamt_parameters<BR /> name = lc_ricefid_1234<BR /> maptype1 = lc_param_name<BR /> IMPORTING data = DATA(lt_param_tab) ).<BR /> <BR /> CLEAR lt_email_address.<BR /> <BR /> LOOP AT lt_param_tab INTO DATA(lw_param_tab).<BR /> CLEAR ls_email_address.<BR /> ls_email_address-address = lw_param_tab-param1.<BR /> APPEND ls_email_address TO lt_email_address.<BR /> CLEAR ls_email_address.<BR /> ENDLOOP.<BR /> <BR /> CLEAR lv_subject.<BR /> lv_subject = '3PL Substitution to S4'.<BR /> <BR /> IF lt_email_address IS NOT INITIAL.<BR /> <BR /> lo_email-&gt;send_email_with_xls_attachment( EXPORTING<BR /> subject = lv_subject<BR /> email_address = lt_email_address<BR /> binary_content = lt_binary_content<BR /> size = lv_size<BR /> email_body_tab = lt_email_body ).<BR /> <BR /> ENDIF.<BR /> ENDIF. "Email<BR /> <BR /> ENDIF.<BR /> <BR /> <STRONG>ENDMETHOD.</STRONG><BR /> <BR /> &nbsp;<BR /> <BR /> &nbsp; 2023-12-14T22:07:28+01:00 https://community.sap.com/t5/open-source-blogs/introducing-openui5-2-x/ba-p/13580633 Introducing OpenUI5 2.x 2023-12-21T13:06:14+01:00 OliverGraeff https://community.sap.com/t5/user/viewprofilepage/user-id/4124 <P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/12/OpenUI5_blue_hotizontal.png" border="0" width="248" height="87" /></P><P><STRONG>Update 13.3.2024</STRONG>: On tool support for adapting an app, see a new blog post '<A href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-ui5-linter/ba-p/13633898" target="_blank">Introducing UI5 linter</A>'</P><H2 id="toc-hId-964762251">Where is OpenUI5 today?</H2><P>OpenUI5 is SAP’s open-source Web UI framework, supporting the <A href="https://www.sap.com/products/technology-platform/fiori.html" target="_blank" rel="noopener noreferrer">SAP Fiori design system</A> for products. It celebrates its <A href="https://openui5.org/anniversary/" target="_blank" rel="noopener nofollow noreferrer">10th anniversary</A>, with many highlights that have shaped an incredible developer community. OpenUI5 will continue to innovate, ensuring a consistent and modern user experience for web applications.<BR /><BR />The size of OpenUI5 grew with its capabilities, with its APIs and with its number of controls, especially as old features were not removed for compatibility reasons, to stay upgrade compatible. This compatibility is a challenge in Web development: Web development standards evolve, new security gaps continuously appear and need to be closed, Web browsers evolve and have new features to take advantage of (e.g. for better performance). Therefore, it is not an option for modern UI technologies to rest on a status quo. As many developers rely on a stable and secure UI technology, OpenUI5 needs to innovate in time to stay competitive and future proof in this dynamic environment. On the other hand, the evolution of Web technologies also brings great value and opportunities to innovate, both for developers and well as with an improved and faster user experience for business users.</P><H2 id="toc-hId-768248746">The next step: OpenUI5 2.x</H2><P>To be able to continue with this successful journey, we need to make sure that:</P><UL><UL><LI>UIs are staying interactive with less code to be loaded and by avoiding synchronous JavaScript.</LI></UL></UL><UL><UL><LI>Security can be ensured with the strict Content Security Policy (CSP).</LI></UL></UL><UL><UL><LI>Development of OpenUI5 framework as well as application developers remain efficient.</LI></UL></UL><UL><UL><LI>Applications are compliant with the evolution of browsers (and restrictions they introduce).</LI></UL></UL><P><BR />For this the UI5 team needs to remove non-compliant, deprecated libraries and functionality from the OpenUI5 framework. In doing so, we need to find the right balance between upgrade stability and agility for innovations.</P><BLOCKQUOTE><BR /><P><STRONG>OpenUI5 2.x is renewing OpenUI5</STRONG><BR /><STRONG>by removing everything not required to comply with OpenUI5 best practices.</STRONG></P></BLOCKQUOTE><P>&nbsp;</P><H2 id="toc-hId-571735241">The value of OpenUI5 2.x</H2><P>OpenUI5 2.x allows to evolve in these areas:</P><UL><UL><LI><STRONG>Security</STRONG>: OpenUI5 2.x enforces an improved security with strict Content Security Policy (CSP).</LI></UL></UL><UL><UL><LI><STRONG>Smooth UI performance</STRONG>: OpenUI5 2.x assists with an improved UI performance by using fine granular tasks and asynchronous JavaScript only.</LI></UL></UL><UL><UL><LI><STRONG>General performance</STRONG>: With the modular core, new bootstrap and additional opportunities to improve performance we expect to see a better experience when launching and using OpenUI5 apps.</LI></UL></UL><UL><UL><LI><STRONG>Micro frontends</STRONG>: The removal of Globals simplifies the orchestration of micro frontends.</LI></UL></UL><UL><UL><LI><STRONG>App development</STRONG>: With streamlined APIs application developers learn and develop with OpenUI5 more easily.</LI></UL></UL><UL><UL><LI><STRONG>Best practices</STRONG>: OpenUI5 2.x means less effort for application developers to follow OpenUI5 best practices.</LI></UL></UL><UL><UL><LI><STRONG>Browser</STRONG>: OpenUI5 2.x makes it easier to stay up to date with the browser evolution.</LI></UL></UL><UL><UL><LI><STRONG>Web standards</STRONG>: OpenUI5 2.x enables a simple adoption of latest Web standards, e.g. CSS custom properties.</LI></UL></UL><UL><UL><LI><STRONG>Pace of innovation</STRONG>: It becomes easier for the UI5 team as well as for application developers to make progress. At the same time, less resources are needed for maintenance, shifting the focus towards innovative, yet stable capabilities.</LI></UL></UL><P>&nbsp;</P><H2 id="toc-hId-375221736">Recommendation for moving from OpenUI5 1.x to 2.x</H2><BLOCKQUOTE><BR /><P><STRONG>Follow the latest <A href="https://sdk.openui5.org/topic/28fcd55b04654977b63dacbee0552712" target="_blank" rel="noopener nofollow noreferrer">Best Practices for App Developers</A> of OpenUI5 1.x</STRONG><BR /><STRONG>Applications following these best practices will run smoothly with OpenUI5 2.x, no migration effort needed.</STRONG></P></BLOCKQUOTE><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/12/299599_Checklist_R.png" border="0" width="125" height="125" /></P><H2 id="toc-hId-178708231">Call to Action</H2><P>The UI5 team now offers a first version of OpenUI5 2.x <A href="https://sdk.openui5.org/nightly/2/index.html" target="_blank" rel="noopener nofollow noreferrer">https://sdk.openui5.org/nightly/2/index.html</A>&nbsp;for testing purposes (Disclaimer: This is a version with daily updates, possible API changes and temporary bugs.)</P><OL><LI>Make yourself familiar with the <A href="https://sdk.openui5.org/topic/28fcd55b04654977b63dacbee0552712" target="_blank" rel="noopener nofollow noreferrer">Best Practices</A>. (Updated instructions will follow.)</LI><LI>Review your application code, e.g. by removing of any usage of deprecated APIs. Test your custom OpenUI5 apps for OpenUI5 2.x compatibility by simply pointing the bootstrap to <A href="https://sdk.openui5.org/nightly/2/resources/sap-ui-core.js" target="_blank" rel="noopener nofollow noreferrer">https://sdk.openui5.org/nightly/2/resources/sap-ui-core.js</A></LI></OL><P>The team continues working on OpenUI5 2.x and the best practices for application development. To support the process of moving an app from 1.x to 2.x. the UI5 team is currently looking into which documentation and tool support can help with the manual migration of custom code.<BR /><BR /><STRONG>Your feedback is highly appreciated:</STRONG> Please add feedback to GitHub by reporting an issue at <A href="https://github.com/SAP/openui5/issues/new" target="_blank" rel="noopener nofollow noreferrer">https://github.com/SAP/openui5/issues/new</A> and prefix the title with "[UI5 2.x]".</P> 2023-12-21T13:06:14+01:00 https://community.sap.com/t5/technology-blogs-by-sap/design-systems-the-heart-of-sap-s-user-experience/ba-p/13573625 Design Systems: The Heart of SAP's User Experience 2024-01-04T01:41:59+01:00 marina_sarkisyan https://community.sap.com/t5/user/viewprofilepage/user-id/275412 Much like an artist's signature touch on their masterpiece, design systems lend a distinctive voice to products, making them immediately recognizable. It's this consistency, both visually and functionally, that drives memorable user experiences. This is where SAP's Fiori design system shines, serving as a beacon of familiarity and trust across our diverse range of products.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="/legacyfs/online/storage/blog_attachments/2024/01/Screenshot-2024-01-03-at-7.22.35 PM.png" height="226" width="392" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Typical Fiori Object Page Screen</P><BR /> Fiori stands as a testament to SAP's dedication to clean, efficient, and intuitive design. It's not just about following a set of rules; it's about embracing a philosophy that places the user at the heart of the software experience. Fiori's language, with its minimalist aesthetics and responsive layouts, goes beyond visuals; it's about crafting an intuitive user journey.<BR /> <BLOCKQUOTE><STRONG><EM>A Guide to Using Fiori Design Guidelines</EM></STRONG><BR /> <BR /> <EM>Before delving deeper into the essence of Fiori, let's explore some practical insights that could enhance your design process:</EM><EM>&nbsp;</EM><BR /> <BR /> <STRONG><EM>Start with Layout and Floorplan:</EM></STRONG><BR /> <BR /> <EM>Begin by mapping out your screens at a high level. Use the Fiori design guidelines to determine the best layout and floorplan for your specific task. </EM><EM>&nbsp;</EM><BR /> <BR /> <STRONG><EM>Self-Check for Flow:</EM></STRONG><BR /> <BR /> <EM>Assess the user flow across screens. A disjointed flow indicates gaps in UI Architecture that need addressing.</EM><BR /> <BR /> <STRONG><EM>Content Building Blocks:</EM></STRONG><BR /> <BR /> <EM>After establishing your floorplan, choose the right compound elements like tables, forms, and containers. The guidelines can help you select the most suitable components for your needs.</EM><BR /> <BR /> <STRONG><EM>Attention to Detail: </EM></STRONG><BR /> <BR /> <EM>Finally, focus on the finer details like button types, input selections, and other elements. Refer back to the guidelines to inform these choices.</EM><BR /> <BR /> <EM>Remember, structured thinking can significantly streamline your design process. Avoid diving into specifics too early and maintain focus on the overall user journey.</EM></BLOCKQUOTE><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/Picture1-1.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Reflective Questions</P><BR /> In our SAP universe, Fiori is the constant star. It’s our promise of a familiar, intuitive user experience across all SAP products. This isn't just about maintaining visual cohesion; it's about delivering predictable, reliable functionality that users can count on.<BR /> <BR /> An app's visual identity – from its button placements, color scheme, to its typography – often becomes its signature. It's these meticulous design choices, informed by a robust design system, that make products instantly identifiable. It's akin to recognizing a song from its first few notes.<BR /> <BR /> But mastery of a design system is a journey. Even after nearly a decade of immersion in Fiori designs, I still find myself revisiting guidelines, seeking clarity, and striving for perfection. This journey is both challenging and rewarding, as it ensures that our products not only look like they belong to the SAP family but also function with the excellence our users expect.<BR /> <BR /> Navigating Fiori's complexities is a team effort. In our experience, a collaborative approach has been instrumental in upholding Fiori's high standards. By leveraging collective knowledge and perspectives, we ensure that every Fiori application we deliver is not just a solitary piece of software, but part of a larger, cohesive user experience.<BR /> <BR /> In the tech space, evolution is a given. SAP's commitment to staying ahead of the curve means our design systems, though mature, are always in flux.<BR /> <BR /> For every designer or developer: if the term "Fiori app" resonates with your creation, delve deep into the guidelines. Consistency is Fiori's hallmark. Embrace it, and every app you craft will echo SAP's commitment to excellence. <A href="https://experience.sap.com/fiori-design-web/" target="_blank" rel="noopener noreferrer">Dive deeper into our design system</A> and discover the potential.<BR /> <BR /> But don't stop there. Join the SAP design community and contribute to the evolving Fiori landscape. Share your experiences, seek feedback, and be part of the continuous dialogue that shapes our products. Your voice is vital in crafting a user experience that not only meets but exceeds expectations.<BR /> <BR /> Explore more about Fiori and its intricacies, and join us in shaping the future of SAP's user experience.<BR /> <BR /> &nbsp; 2024-01-04T01:41:59+01:00 https://community.sap.com/t5/technology-blogs-by-members/create-cbo-custom-business-object-tile-using-bas-in-sap-ui5/ba-p/13574466 Create CBO (Custom Business Object) Tile using BAS in SAP UI5 2024-01-08T09:14:55+01:00 kuldeep2813 https://community.sap.com/t5/user/viewprofilepage/user-id/736775 Hello,<BR /> <BR /> In this blog we will learn How to create <A href="https://help.sap.com/docs/SAP_EXTENSIBILITY_EXPLORER/b0e8d558ba2f47f5b02a3fc0ac9edc34/6bd534db33694eba9ddde788ef717dfd.html?q=Custom%20Business%20Object" target="_blank" rel="noopener noreferrer">CBO Tile (Custom Business Object Tile )</A> with BAS , also learn about fiori app tile creation in launchpad designer, and Git.<BR /> <BR /> &nbsp;<BR /> <H2 id="toc-hId-963956068">What is CBO ?</H2><BR /> <P style="text-align: left">CBO (Custom Business Object) is a SAP ui5 fiori application in which we can define the custom business object as per the requirement.</P><BR /> <P class="p" style="text-align: left">Custom business objects can be accessed from outside SAP S/4HANA via an automatically generated OData service. You can use this app to create custom business objects and to generate database tables, services, UIs, and applications based on custom business objects. The fields can be used as table columns on the initial page of a custom application that you create based on a custom business object.</P><BR /> &nbsp;<BR /> <H2 id="toc-hId-767442563">What we can do in Custom Business Object:</H2><BR /> <UL><BR /> <LI>Create your own business objects and the corresponding database tables</LI><BR /> <LI>Copy already published custom business objects</LI><BR /> <LI>Add fields to business objects</LI><BR /> <LI>Generate UIs based on custom business objects</LI><BR /> <LI>Create associations between custom business objects for reuse</LI><BR /> <LI>Track changes in a custom business object with change documents</LI><BR /> <LI>Generate OData services for custom business objects to work with and modify custom business objects from externally</LI><BR /> <LI>Publish business objects</LI><BR /> <LI>Edit business objects that have already been published</LI><BR /> <LI>Create multiple sub nodes for one business object</LI><BR /> <LI>Implement custom logic on node level</LI><BR /> <LI>Reset business objects to their last published version</LI><BR /> <LI>Delete custom business objects that have not yet been transported to your production system</LI><BR /> <LI>Refer to custom libraries and custom code lists</LI><BR /> </UL><BR /> &nbsp;<BR /> <H3 id="toc-hId-700011777">Steps to create CBO tile in SAP <A href="https://www.sapstore.com/solutions/45318/SAP-Business-Application-Studio---the-evolution-of-SAP-Web-IDE" target="_blank" rel="nofollow noopener noreferrer">BAS</A> :<BR /> 1. Launch the SAP Business Application Studio from the <A href="https://cockpit.hanatrial.ondemand.com/trial/#/home/trial" target="_blank" rel="nofollow noopener noreferrer">Cloud Cockpit</A></H3><BR /> <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/02/BAS-1.png" /><BR /> <BR /> &nbsp;<BR /> <H4 id="toc-hId-632580991">2. To create a Tile, select new Project from Template. --&gt; Select Template and Target location.</H4><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/1-8.png" /></P><BR /> <BR /> <H4 id="toc-hId-436067486">Select the worklist type template.</H4><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/2-7.png" /></P><BR /> <BR /> <H4 id="toc-hId-239553981">3. Select the Data source, system and OData service.</H4><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/4-5.png" /></P><BR /> <BR /> <H4 id="toc-hId-43040476">4. Select the Entityset (Main Entity) and Navigation Entity (Navigation Entity: When you click on the table row, it will navigate to another page, where you can see the information of the selected row.)</H4><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/5-5.png" height="337" width="609" /></P><BR /> &nbsp;<BR /> <H4 style="overflow: hidden;margin-bottom: 0px" id="toc-hId--153473029">5. Provide the required information for Project attributes and finish.<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/6-6.png" /></H4><BR /> &nbsp;<BR /> <H4 id="toc-hId--349986534">6. Run the Fiori app using command: npm run start</H4><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/7-5.png" /></P><BR /> <BR /> <H4 id="toc-hId--546500039">7. Deploy the CBO Tile :</H4><BR /> To deploy the CBO Tile follow the below attached sap blog.<BR /> <BR /> <A href="https://blogs.sap.com/2023/02/24/deploy-the-ui5-fiori-app-on-sap-abap-repository-with-bas-webide-create-fiori-app-tile-using-launchpad-designer/" target="_blank" rel="noopener noreferrer">https://blogs.sap.com/2023/02/24/deploy-the-ui5-fiori-app-on-sap-abap-repository-with-bas-webide-create-fiori-app-tile-using-launchpad-designer/</A><BR /> <H4 id="toc-hId--1240730639">8. how to create git repository and push the code on <A href="https://gitlab.com/users/sign_in" target="_blank" rel="nofollow noopener noreferrer">GIT</A>.</H4><BR /> 8.1. Login your account<BR /> <BR /> 8.2. Click on New Project and select Blank Project.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/8-5.png" /></P><BR /> &nbsp;<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/9-5.png" /></P><BR /> &nbsp;<BR /> <BR /> 8.3. To upload the Ui5 project follow the below steps.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/10-6.png" /></P><BR /> &nbsp;<BR /> <BR /> 9. Steps to create a Tile and Target mapping in Fiori launchpad Designer<BR /> <BR /> <A href="https://blogs.sap.com/2023/02/24/deploy-the-ui5-fiori-app-on-sap-abap-repository-with-bas-webide-create-fiori-app-tile-using-launchpad-designer/" target="test_blank" rel="noopener noreferrer">https://blogs.sap.com/2023/02/24/deploy-the-ui5-fiori-app-on-sap-abap-repository-with-bas-webide-create-fiori-app-tile-using-launchpad-designer/</A><BR /> <BR /> &nbsp;<BR /> <BR /> To learn more about the CBO, read below attached Links.<BR /> <OL><BR /> <LI><A href="https://blogs.sap.com/2023/02/24/deploy-the-ui5-fiori-app-on-sap-abap-repository-with-bas-webide-create-fiori-app-tile-using-launchpad-designer/" target="test_blank" rel="noopener noreferrer">https://blogs.sap.com/2023/02/24/deploy-the-ui5-fiori-app-on-sap-abap-repository-with-bas-webide-create-fiori-app-tile-using-launchpad-designer/</A></LI><BR /> <LI><A href="https://blogs.sap.com/2019/06/24/fiori-elements-object-page-table-items-context-based-edit-ability/" target="test_blank" rel="noopener noreferrer">https://blogs.sap.com/2019/06/24/fiori-elements-object-page-table-items-context-based-edit-ability/</A></LI><BR /> <LI><A href="https://help.sap.com/docs/SAP_EXTENSIBILITY_EXPLORER/b0e8d558ba2f47f5b02a3fc0ac9edc34/6bd534db33694eba9ddde788ef717dfd.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP&amp;q=Custom%20Business%20object" target="test_blank" rel="noopener noreferrer">https://help.sap.com/docs/SAP_EXTENSIBILITY_EXPLORER/b0e8d558ba2f47f5b02a3fc0ac9edc34/6bd534db33694eba9ddde788ef717dfd.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP&amp;q=Custom%20Business%20object</A></LI><BR /> <LI><A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/b45696ca0d9143cba040797e9c71aa44.html?locale=en-US&amp;state=PRODUCTION&amp;version=2308.504&amp;q=Custom%20Business%20object" target="test_blank" rel="noopener noreferrer">https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/b45696ca0d9143cba040797e9c71aa44.html?locale=en-US&amp;state=PRODUCTION&amp;version=2308.504&amp;q=Custom%20Business%20object</A></LI><BR /> </OL><BR /> &nbsp;<BR /> <H3 id="toc-hId--1143841137">Conclusion</H3><BR /> The Custom business application tile has been created using Fiori. The Fiori app tile has been created on Fiori Launchpad.<BR /> <BR /> &nbsp;<BR /> <BR /> With this we come to an end of this blog. Hope you find it useful.<BR /> <BR /> Keep learning &amp; Keep Sharing!! 2024-01-08T09:14:55+01:00 https://community.sap.com/t5/technology-blogs-by-sap/team-fpm-how-to-render-an-fpm-overview-page-to-look-like-a-sap-fiori-object/ba-p/13574743 ** Team FPM ** How to render an FPM Overview Page to look like a SAP Fiori Object Page 2024-01-10T10:39:20+01:00 simon_hoeg https://community.sap.com/t5/user/viewprofilepage/user-id/194084 <P>Dear SAP Community,<BR /><BR />Today, I will demonstrate how you can render an Overview Page (OVP) Floorplan to look like a <A href="https://experience.sap.com/fiori-design-web/object-page/" target="_blank" rel="noopener noreferrer">SAP Fiori Object Page Floorplan</A>. If you have a new or existing FPM application based on the OVP floorplan, it can be rendered to appear as one based on the SAP Fiori Object Page floorplan.</P><H3 id="toc-hId-1093041605">The new Floorplan Modes</H3><P>With SAP_UI 758 (ABAP Platform 2023) and SAP_BASIS 7.94 (S/4H Cloud 2308), the OVP offers multiple modes of an Object Page floorplan, which can be used to control its appearance, functionality, and behavior. The mode of the OVP can be specified by using the URL or application parameter FPM_FLOORPLAN_MODE or at the configuration level, using the FPM configuration editor, FLUID (screen area <EM>General Settings</EM> &gt; dropdown list box <EM>Floorplan Mode</EM>).</P><P><SPAN>The modes for the FPM Floorplan Mode are as follows:</SPAN></P><TABLE border="1"><TBODY><TR><TD>&lt; (Space)&gt;</TD><TD>Classic Mode (default)</TD></TR><TR><TD>OA1</TD><TD>Object Page With 1-Level Anchor Bar Navigation</TD></TR><TR><TD>OA1P</TD><TD>Object Page With 1-Level Anchor Bar Navigation (Power User)</TD></TR><TR><TD>OA2</TD><TD>Object Page With 2-Level Anchor Bar Navigation</TD></TR><TR><TD>OA2P</TD><TD>Object Page With 2-Level Anchor Bar Navigation (Power User)</TD></TR><TR><TD>OT1</TD><TD>Object Page With 1-Level Tab Bar Navigation</TD></TR><TR><TD>OT1P</TD><TD>Object Page With 1-Level Tab Bar Navigation (Power User)</TD></TR><TR><TD>OT2</TD><TD>Object Page With 2-Level Tab Bar Navigation</TD></TR><TR><TD>OT2P</TD><TD>Object Page With 2-Level Tab Bar Navigation (Power User)</TD></TR></TBODY></TABLE><P><BR />In Figure 1, I have taken demo application S_EPM_FPM_PO and Floorplan Mode OA1 to demonstrate the necessary adaptations, for instance, on the customizing level</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/FLUID_OVP_GeneralSettings-1.png" border="0" /><SPAN><STRONG>Figure 1</STRONG>: Changing the Floorplan Mode of OVP component configuration S_EPM_UX_PO_OVP</SPAN></P><P>In addition, I have added the title <EM>Result List</EM> on the Initial Page for the List UIBB EPM_PO_OVP_SEARCH_LIST_CFG, see Figure 2. In Floorplan Mode OA1, the respective UIBB titles are displayed above the UIBBs and in the anchor bar.</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/FLUID_List_TitleSearchUIBB.png" border="0" /><STRONG>Figure 2</STRONG>: Adding a title for the result list on the Search Page</P><P><FONT size="4"><STRONG>Dynamic Page Header</STRONG></FONT></P><P class="">The above adjustments enable the page header areas to automatically collapse or expand as you scroll down or up, as illustrated in Figure 3. Conversely, the header toolbar maintains a fixed position.</P><P><BR /><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/SearchPurchaseOrder-1.png" border="0" /><SPAN><STRONG>Figure 3</STRONG>: Floorplan Mode OA1 - Search Page of EPM Purchase Order Application showing the expanded and collapsed page header</SPAN></P><H3 id="toc-hId-896528100">Navigation Bar</H3><P>The anchor bar and the tab bar are variants of the navigation bar in the OVP header. They have distinct differences in terms of the UIBBs displayed and navigation functionality. For example, in Floorplan Mode OA1 the anchor bar represents the <SPAN class="">UIBBs</SPAN> of the current page and the respective UIBB titles are displayed in the anchor bar (see Figure 4), while a tab bar represents the <SPAN class="">sections</SPAN> of the current page and the section titles are displayed in the tab bar.</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/MainPagePurchaseOrder-1.png" border="0" /></P><P class=""><STRONG>Figure 4</STRONG>: Main page of <SPAN>EPM Purchase Order Application showing</SPAN> the new anchor bar of Floorplan Mode OA1</P><P><FONT size="4"><STRONG>Additional Remarks</STRONG></FONT></P><P>Some features of the OVP floorplan may behave differently when rendered in Object Page modes. These differences may impact aspects such as the header, UIBB selector UI control, page master splitter UI control, UIBB height, section column resizing, sections and UIBB stacking, UIBB stacking, panels, drag-and-drop of UIBBs, panels and panel stacks, UIBB collapse/expand, and personalization. However, the <STRONG>Power User Modes</STRONG> allow you to override some of the constraints imposed by Object Page rendering. You can enable drag-and-drop for moving UIBBs, panels, and panel stacks around the UI. You can also expand and collapse UIBBs.<BR /><BR />Stay tuned for more insights and updates <span class="lia-unicode-emoji" title=":winking_face:">😉</span> Happy coding!</P> 2024-01-10T10:39:20+01:00 https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/getting-familiar-with-spaces-and-pages-in-sap-s-4hana-cloud-public-edition/ba-p/13575120 Getting Familiar with Spaces and Pages in SAP S/4HANA Cloud Public Edition 2024-01-12T11:20:20+01:00 maria_silipo https://community.sap.com/t5/user/viewprofilepage/user-id/805536 Happy New Year 2024! To start off the year right, I'd like to remind you to switch from groups to spaces and pages, our go-to approach for visualization and layout in the SAP Fiori launchpad.<BR /> <BR /> Why switch to spaces and pages? The groups setup on the SAP Fiori launchpad is <STRONG>officially outdated</STRONG> with the SAP S/4HANA Cloud Public Edition 2402 release. Get ready for the next release and switch to spaces and pages now! Please note that the switch is mandatory and has to be done manually.<BR /> <BR /> In the meantime, watch the videos below to get familiar with spaces and pages and the new <EM>My Home</EM> in SAP S/4HANA Cloud Public Edition:<BR /> <H3 id="toc-hId-1093065565"><STRONG>Switching from Groups to Spaces and Pages</STRONG></H3><BR /> SAP introduced spaces and pages in SAP S/4HANA Cloud Public Edition in Q2/2020 already, accompanied by the announcement to deprecate the group-based visualization.<BR /> <BR /> Click on the image below to watch the video:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_5phrht35" target="_blank" rel="nofollow noopener noreferrer"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/MicrosoftTeams-image-13.png" /></A></P><BR /> &nbsp;<BR /> <BR /> Read more on how to switch from groups to spaces and pages in <A href="https://blogs.sap.com/2023/11/06/deactivation-of-groups-in-the-sap-fiori-launchpad-in-sap-s-4hana-cloud-public-edition-2402-switching-to-spaces-and-pages-mandatory/" target="_blank" rel="noopener noreferrer">my blog post</A>.<BR /> <H3 id="toc-hId-896552060"></H3><BR /> <H3 id="toc-hId-700038555"><STRONG>Using Predefined Spaces Out-of-the-Box</STRONG></H3><BR /> With SAP S/4HANA Cloud Public Edition 2302, SAP introduced the option to use predefined spaces and pages out-of-the-box. The benefits here are clear: Fast implementation without the need of investing time and resources in designing own spaces and pages. Direct consumption of SAP enhancements to predefined spaces and pages with an upgrade.<BR /> <BR /> Click on the image below to watch the video:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_mlszqgz1" target="_blank" rel="nofollow noopener noreferrer"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/SAP-S4HANA-Cloud-Public-Edition-Spaces-and-Pages-2308-PNK-Admin-Using-predefined-spaces-out-of-the-box-Thumbnail2.png" /></A></P><BR /> <BR /> <H3 id="toc-hId-503525050"></H3><BR /> <H3 id="toc-hId-307011545"><STRONG>Importing Personalized Groups</STRONG></H3><BR /> Learn how to work with the new <EM>My Home</EM> in SAP S/4HANA Cloud Public Edition. Import your personalized groups from the classic home page, customize your favorite apps, and stay organized with spaces and pages.<BR /> <BR /> Click on the image below to watch the video:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_6xsm9hcm" target="_blank" rel="nofollow noopener noreferrer"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/MicrosoftTeams-image-10.png" /></A></P><BR /> &nbsp;<BR /> <H3 id="toc-hId-110498040"><STRONG>Using the Navigation Bar</STRONG></H3><BR /> Learn how to easily arrange your spaces in the new <EM>My&nbsp;Home</EM> in SAP S/4HANA Cloud Public Edition according to your needs and preferences. Optimize your workflow by pinning and rearranging spaces.<BR /> <BR /> Click on the image below to watch the video:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_98uitnu4" target="_blank" rel="nofollow noopener noreferrer"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/MicrosoftTeams-image-11.png" /></A></P><BR /> &nbsp;<BR /> <H3 id="toc-hId--86015465"><STRONG>Personalizing the Page</STRONG></H3><BR /> Learn how to personalize your pages in SAP S/4HANA Cloud Public Edition. Easily customize your favorite pages and arrange them according to your preferences.<BR /> <BR /> Click on the image below to watch the video:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_oo5fq3qt" target="_blank" rel="nofollow noopener noreferrer"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/MicrosoftTeams-image-12.png" /></A></P><BR /> <BR /> <H3 id="toc-hId--282528970"></H3><BR /> Follow us on&nbsp;<A href="https://twitter.com/sap" target="_blank" rel="noopener nofollow noreferrer">@SAP</A>&nbsp;and #S4HANA, and myself on&nbsp;<SPAN class="mention-scrubbed">maria.silipo</SPAN>,&nbsp;<A href="https://www.linkedin.com/in/maria-silipo-0111b7177/" target="_blank" rel="noopener nofollow noreferrer">LinkedIn</A>&nbsp;and&nbsp;<A href="https://twitter.com/m_silipo" target="_blank" rel="noopener nofollow noreferrer">X</A>.<BR /> <H3 id="toc-hId--479042475"></H3><BR /> &nbsp;<BR /> <H3 id="toc-hId--675555980"><STRONG>Other SAP S/4HANA Cloud Enablement Assets</STRONG></H3><BR /> SAP S/4HANA Cloud is the foundation of the intelligent enterprise and is an innovative, robust, and scalable ERP. We at Cloud ERP Product Success and Cloud Co-Innovation offer a service as versatile as our product itself. Click on the image below to check out the numerous offerings our Enablement team has created for you:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><A href="https://chart-bdmaicr0au.dispatcher.eu2.hana.ondemand.com/index.html?hc_reset" target="_blank" rel="nofollow noopener noreferrer"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/EnablementWheel-1.png" height="551" width="456" /></A></P><BR /> <BR /> <H3 id="toc-hId--947300854"><STRONG>Inside SAP S/4HANA Podcast</STRONG></H3><BR /> <P class="paragraph"><SPAN class="normaltextrun"><SPAN lang="EN-US">Subscribe to our podcast “<A href="https://open.sap.com/static/inside-sap/index.php?p=archive" target="_blank" rel="noopener noreferrer">Inside SAP S/4HANA</A>“! This podcast leverages the unique knowledge and expertise of SAP S/4HANA Cloud product experts, partners and customers to address objects of interest by sharing product insights and project best practice. There is no customer success without product success and project success; we share all ingredients with you to get to the next level and make your SAP S/4HANA Cloud, public edition project a success. Subscribe now and benefit from the shared knowledge.</SPAN></SPAN></P><BR /> &nbsp;<BR /> <H3 id="toc-hId--1143814359"><STRONG>openSAP Microlearnings for SAP S/4HANA Cloud</STRONG></H3><BR /> <P class="paragraph"><SPAN class="normaltextrun"><SPAN lang="EN-US">Our openSAP microlearnings for SAP S/4HANA Cloud offer an exciting new learning opportunity. What began with a small batch of 20 videos, has now become a channel with more than 50 microlearnings that have generated over 20,000 views. Today we cover multiple lines of business such as finance, manufacturing, and supply chain management, and key technology topics like Master Data Management, extensibility, SAP User Experience, and upgrade management. We are continuously adding new microlearnings to the&nbsp;<A href="https://blogs.sap.com/2020/05/07/boost-your-knowledge-with-sap-s-4hana-microlearnings/" target="_blank" rel="noopener noreferrer">SAP S/4HANA Cloud channel</A>, so make sure you check them out.</SPAN></SPAN></P><BR /> &nbsp;<BR /> <H3 id="toc-hId--1340327864"><STRONG>Your Voice Matters!</STRONG></H3><BR /> <P class="paragraph"><SPAN class="normaltextrun"><SPAN lang="EN-US">If you want to learn more and actively engage with SAP subject matter experts on SAP S/4HANA Cloud, public edition, join our&nbsp;<A href="https://community.sap.com/topics/s4hana-cloud" target="_blank">SAP S/4HANA Cloud Public Edition topic page on SAP Community</A>. The community brings together customers, partners, and SAP experts and has a clear mission: deliver an interactive community to engage with one another about best practices and product solutions. We invite you to explore our ‘one-stop shop’ as the central place for all resources, tools, content questions, answers and connect with experts to guide you through your journey to SAP S/4HANA Cloud Public Edition.</SPAN></SPAN></P><BR /> &nbsp;<BR /> <H3 id="toc-hId--1536841369"><STRONG>More Information:</STRONG></H3><BR /> <DIV><BR /> <UL><BR /> <LI><A href="https://blogs.sap.com/2023/08/09/sap-user-experience-in-sap-s-4hana-cloud-public-edition-2308" target="_blank" rel="noopener noreferrer">SAP User Experience in SAP S/4HANA Cloud Public Edition 2308</A></LI><BR /> <LI><A href="https://blogs.sap.com/2023/11/06/deactivation-of-groups-in-the-sap-fiori-launchpad-in-sap-s-4hana-cloud-public-edition-2402-switching-to-spaces-and-pages-mandatory/" target="_blank" rel="noopener noreferrer">Deactivation of Groups in the SAP Fiori Launchpad in SAP S/4HANA Cloud Public Edition: Switching to Spaces and Pages Mandatory</A></LI><BR /> <LI><A href="https://blogs.sap.com/2023/12/14/register-now-for-our-exclusive-sap-s-4hana-cloud-public-edition-2402-early-release-series/" target="_blank" rel="noopener noreferrer">Upcoming SAP User Experience Live Session</A></LI><BR /> <LI><A href="https://community.sap.com/topics/s4hana-cloud/product-releases" target="_blank">SAP S/4HANA Cloud Public Edition Release Info</A></LI><BR /> <LI><A href="https://blogs.sap.com/tag/pscc_enablement/" target="_blank" rel="noopener noreferrer">Release Blog Posts</A></LI><BR /> <LI><A href="https://www.youtube.com/playlist?list=PLWV533hWWvDnnyN2j-CcUheNN-GaNCb3H" target="_blank" rel="noopener nofollow noreferrer">YouTube Playlist for SAP S/4HANA Cloud Public Edition</A></LI><BR /> <LI><A href="https://chart-bdmaicr0au.dispatcher.eu2.hana.ondemand.com/index.html?hc_reset" target="_blank" rel="noopener nofollow noreferrer">SAP S/4HANA PSCC Digital Enablement Wheel</A></LI><BR /> <LI><A href="https://open.sap.com/static/inside-sap/index.php?p=archive" target="_blank" rel="noopener noreferrer">Inside SAP S/4HANA Podcast</A></LI><BR /> <LI><A href="https://microlearning.opensap.com/" target="_blank" rel="noopener noreferrer">openSAP Microlearnings for SAP S/4HANA Cloud</A></LI><BR /> <LI><A href="https://me.sap.com/processnavigator/SolS/EARL_SolS-013/2308?region=DE" target="_blank" rel="noopener noreferrer">Best Practices for SAP S/4HANA Cloud Public Edition</A></LI><BR /> <LI><A href="https://community.sap.com/topics/s4hana-cloud" target="_blank">SAP Community</A></LI><BR /> <LI><A href="https://help.sap.com/doc/7c9e0bbbd1664c2581b2038a1c7ae4b3/latest/" target="_blank" rel="noopener noreferrer">Feature Scope Description</A></LI><BR /> <LI><A href="https://help.sap.com/doc/ce01d82756b947a1a043a5d5a3204226/latest/" target="_blank" rel="noopener noreferrer">What’s New</A></LI><BR /> <LI><A href="https://help.sap.com/viewer/p/SAP_S4HANA_CLOUD" target="_blank" rel="noopener noreferrer">Help Portal Product Page<BR /> </A></LI><BR /> </UL><BR /> </DIV> 2024-01-12T11:20:20+01:00 https://community.sap.com/t5/technology-blogs-by-sap/team-fpm-abap-push-channel-for-fpm-events-enhancing-the-user-experience/ba-p/13575332 ** Team FPM ** ABAP Push Channel for FPM Events - Enhancing the user experience with a delivery type 2024-01-12T15:12:19+01:00 simon_hoeg https://community.sap.com/t5/user/viewprofilepage/user-id/194084 <P>Dear SAP Community,<BR /><BR />our team continues to provide new features to enhance user experience and productivity. One such improvement is introduced with <A href="https://me.sap.com/notes/3406803" target="_blank" rel="noopener noreferrer">SAP Note 3406803</A>, available from SAP_UI 757, which focuses on the <A href="https://blogs.sap.com/2016/09/23/team-fpm-abap-push-channel-for-fpm-events/" target="_blank" rel="noopener noreferrer">FPM ABAP Push Channel for Events</A> and the new delivery type <EM>Do Not Disturb Receiver</EM>. In this blog post, I will demonstrate how this new feature empowers application developers to prevent immediate roundtrips on the application user interface, thus improving the overall user experience.<BR /><BR />When users interact with an application, they may place the cursor in an input field to provide input or make changes, for instance, in a filter bar. As a result, any event triggered via ABAP Push Channel during this time would result in an immediate roundtrip on the user interface, interrupting the user's workflow. This interruption can be frustrating and hinder efficiency, therefore we addressed this problem by introducing a new parameter, IV_DELIVERY_TYPE, in the method SEND of class CL_FPM_CHANNEL_MANAGER, respectively interface IF_FPM_CHANNEL_MANAGER.<BR /><BR />The parameter IV_DELIVERY_TYPE can have two kind of values:</P><TABLE border="1" width="100%"><TBODY><TR><TD width="10%" height="30px">0</TD><TD width="90%" height="30px">IF_FPM_CHANNEL_MANAGER=&gt;GC_DELIVERY_TYPE-STANDARD (default)</TD></TR><TR><TD width="10%" height="30px">1</TD><TD width="90%" height="30px">IF_FPM_CHANNEL_MANAGER=&gt;GC_DELIVERY_TYPE-DO_NOT_DISTURB_RECEIVER</TD></TR></TBODY></TABLE><P>In addition, we have prepared test application FPM_TEST_APC_OVP such that you can try the new feature right after implementing SAP Note 3406803, see Figure 1.</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/testApplicationFPM_TEST_APC_OVP.png" border="0" /></P><P class=""><STRONG>Figure 1</STRONG>: Test application FPM_TEST_APC_OVP showing a filterbar, result list and chart</P><P>By running ABAP report FPM_APC_MULTIPLE_TEST you will trigger fifty FPM events, for instance, with ID FPM_REFRESH and further defined properties, see Figure 2. When using the new delivery type, the application ensures a smooth and uninterrupted user experience. You can continue your work without unnecessary interruptions caused by events triggered during input field interactions. In the meantime, the events are queued on the client, and are forwarded to the ABAP backend once you leave the input field or trigger any roundtrip on the user interface, e.g. by pressing the button "Go" in the test application.</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/FPM_APC_MULTIPLE_TEST-1.png" border="0" /></P><P class=""><STRONG>Figure 2</STRONG>: Initial Screen of ABAP Report FPM_APC_MULTIPLE_TEST</P><P>One final remark: The above sample application is using also the <A href="https://blogs.sap.com/2018/02/28/team-fpm-apc-for-fpm-events-tracking-of-sent-events/" target="_blank" rel="noopener noreferrer">event tracker</A> introduced with ABAP interface IF_FPM_CHANNEL_MANAGER. The defined tracking time is 20 seconds, and the event handler of event FAILED_DELIVERY (class CL_FPM_CHANNEL_MANAGER_TEST) is sending an FPM Event of delivery type STANDARD, such the event queue is being resolved at the client. As an application developer, you can of course implement, extend or combine this as you like.<BR /><BR />Bye bye&nbsp;<span class="lia-unicode-emoji" title=":winking_face:">😉</span></P> 2024-01-12T15:12:19+01:00 https://community.sap.com/t5/technology-blogs-by-members/basis-monitoring-amp-tcodes-with-key-notes/ba-p/13591678 Basis Monitoring & Tcodes with Key notes 2024-02-05T14:25:53.980000+01:00 Williams43 https://community.sap.com/t5/user/viewprofilepage/user-id/779356 <P>Hi All,&nbsp;</P><P>I am thrilled to have the opportunity to connect with all of you through this blog.</P><P>The purpose of this blog is to aid newcomers in Basis in gaining knowledge about Basis-related Tcodes, including key notes and their usage and frequency.</P><P>I believe this will be beneficial for those who are beginning their careers in SAP Basis.</P><P>I wish you good luck and welcome to SAP Basis Team</P><P>The Daily Monitoring Basis-related Tcodes, their uses, and their related Tcodes are utilised for any future investigation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Williams43_0-1706804899073.png" style="width: 744px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/58793i4CB3310AB78C7F03/image-dimensions/744x591?v=v2" width="744" height="591" role="button" title="Williams43_0-1706804899073.png" alt="Williams43_0-1706804899073.png" /></span></P><P>Tcodes that pertain to operating systems and databases, their usage, and any future process.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Williams43_1-1706804947991.png" style="width: 742px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/58794i7E5F56EA3241CB97/image-dimensions/742x365?v=v2" width="742" height="365" role="button" title="Williams43_1-1706804947991.png" alt="Williams43_1-1706804947991.png" /></span></P><P>The SAP Basis Admin is accountable for tuning performance. These Tcodes are associated with performance analysis at the application level.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Williams43_2-1706805022361.png" style="width: 746px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/58795i8A61F0C50689AC15/image-dimensions/746x389?v=v2" width="746" height="389" role="button" title="Williams43_2-1706805022361.png" alt="Williams43_2-1706805022361.png" /></span></P><P>Ticketing tools vary widely between organizations, including SAP ITSM (SOLMAN), Non SAP (ServiceNow, Zendesk), and others.</P><P>User Management, Role Management, and Transport Management will receive the majority of daily ticketing. Here are the Tcodes that pertain to these areas.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Williams43_3-1706805139574.png" style="width: 744px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/58796i2E0110DFFF1343D9/image-dimensions/744x331?v=v2" width="744" height="331" role="button" title="Williams43_3-1706805139574.png" alt="Williams43_3-1706805139574.png" /></span></P><P>Tcodes that pertain to SAP Software Maintenance and related OS and other tasks.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Williams43_4-1706805213692.png" style="width: 744px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/58797i9884C518C59B06AB/image-dimensions/744x536?v=v2" width="744" height="536" role="button" title="Williams43_4-1706805213692.png" alt="Williams43_4-1706805213692.png" /></span></P><P>Programs that are useful for administrative tasks related to Basis.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Williams43_5-1706805251462.png" style="width: 742px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/58798i23076894A6D415DC/image-dimensions/742x407?v=v2" width="742" height="407" role="button" title="Williams43_5-1706805251462.png" alt="Williams43_5-1706805251462.png" /></span></P><P>Thank you for taking the time to read the blog.</P><P>&nbsp;</P><P>#SAPBasis #Basis <a href="https://community.sap.com/t5/c-khhcw49343/Basis+Technology/pd-p/7bf2eaed-4604-44ae-bad7-d2d2d5c58c54" class="lia-product-mention" data-product="1129-1">Basis Technology</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/EWM+-+Basis/pd-p/192798129450263425409096799593312" class="lia-product-mention" data-product="941-1">EWM - Basis</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/NW+ABAP+Monitoring+Tools/pd-p/a414317d-3ddc-487c-9d84-af75d27c65f6" class="lia-product-mention" data-product="1010-1">NW ABAP Monitoring Tools</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+EarlyWatch+Alert/pd-p/f811a31e-b1e7-42ac-9f17-9051d8410d93" class="lia-product-mention" data-product="1192-1">SAP EarlyWatch Alert</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+HANA+Cloud%25252C+SAP+HANA+database/pd-p/ada66f4e-5d7f-4e6d-a599-6b9a78023d84" class="lia-product-mention" data-product="40-1">SAP HANA Cloud, SAP HANA database</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+Advantage+Database+Server/pd-p/67838200100800005437" class="lia-product-mention" data-product="393-1">SAP Advantage Database Server</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/Oracle+Database/pd-p/266216885309448000234589693334884" class="lia-product-mention" data-product="258-1">Oracle Database</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA/pd-p/73554900100800000266" class="lia-product-mention" data-product="799-1">SAP S/4HANA</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+NetWeaver+Application+Server+for+SAP+S%25252F4HANA/pd-p/73554900100800000376" class="lia-product-mention" data-product="736-1">SAP NetWeaver Application Server for SAP S/4HANA</a>&nbsp; #Dailymonitoring <a href="https://community.sap.com/t5/c-khhcw49343/NW+Java+Security+and+User+Management/pd-p/837756977247372160663651537216525" class="lia-product-mention" data-product="1021-1">NW Java Security and User Management</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/Defense+and+Security/pd-p/159367983329805292011158" class="lia-product-mention" data-product="275-1">Defense and Security</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SOLMAN+Setup%25252FConfiguration%25252FLMDB/pd-p/773921536755532122004239005965168" class="lia-product-mention" data-product="1098-1">SOLMAN Setup/Configuration/LMDB</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/NW+ABAP+Monitoring+Tools/pd-p/a414317d-3ddc-487c-9d84-af75d27c65f6" class="lia-product-mention" data-product="1010-2">NW ABAP Monitoring Tools</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SOLMAN+System+Monitoring/pd-p/212358834767912649313917434384826" class="lia-product-mention" data-product="1099-1">SOLMAN System Monitoring</a>&nbsp;</P> 2024-02-05T14:25:53.980000+01:00 https://community.sap.com/t5/crm-and-cx-blogs-by-sap/newly-released-the-much-awaited-sap-sales-cloud-v2-course-and-certification/ba-p/13601096 Newly released! The much awaited SAP Sales Cloud V2 course and certification 2024-02-09T22:30:29.271000+01:00 DeepaliJohnson https://community.sap.com/t5/user/viewprofilepage/user-id/124577 <P>Greetings, Knowledge Seekers!</P><P>I am thrilled to broadcast the much-anticipated launch of the free e-learning course and its related certification for <SPAN><STRONG>SAP Sales Cloud Version 2</STRONG>.</SPAN></P><P>Introducing our <A href="https://learning.sap.com/learning-journeys/exploring-and-configuring-sap-sales-cloud-version-2" target="_blank" rel="noopener noreferrer">Digital First Course - Exploring and Configuring SAP Sales Cloud Version 2</A>, tailored specifically for Consultants.</P><P>This all-inclusive course grants participants the chance to dive headfirst into the innovative features of our newest solution - SAP Sales Cloud Version 2. Whether you're a beginner administrator, functional consultant, or an individual thirsting to master the application, consider this interactive course your ultimate roadmap. The course covers a multitude of features, including advanced lead management, dynamic selling guides, strategic pipeline &amp; forecast management, efficient activity tracking, MS teams integration, AI features powered by machine learning – to name just a few!</P><P>I am also excited to present the <A href="https://learning.sap.com/certifications/sap-certified-application-associate-sap-sales-cloud-version-2" target="_blank" rel="noopener noreferrer">Certification - SAP Certified Application Associate – SAP Sales Cloud Version 2</A>. This certification has 80 questions. It tests and validates that the candidate truly masters the fundamentals of SAP Sales Cloud Version 2 and possesses the essential knowledge expected of a consultant.</P><P>Note: You will need a license for SAP Learning Hub to take the certification.</P><P>Jump on this opportunity to enhance your knowledge and validate your skills with SAP Learning!</P><P><a href="https://community.sap.com/t5/c-khhcw49343/SAP+Sales+Cloud/pd-p/73554900100700002221" class="lia-product-mention" data-product="811-1">SAP Sales Cloud</a>&nbsp; <a href="https://community.sap.com/t5/c-khhcw49343/Customer+Experience/pd-p/cae17fd6-917e-483d-881a-502155cade3c" class="lia-product-mention" data-product="1152-1">Customer Experience</a>&nbsp; <a href="https://community.sap.com/t5/c-khhcw49343/Training/pd-p/676305042803066886656318788802663" class="lia-product-mention" data-product="1167-1">Training</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/Certification/pd-p/222877341567121072788807155782117" class="lia-product-mention" data-product="1149-1">Certification</a>&nbsp;</P> 2024-02-09T22:30:29.271000+01:00 https://community.sap.com/t5/artificial-intelligence-and-machine-learning-blogs/when-will-we-leave-cave-painting-behind-us/ba-p/308393 When will we leave cave painting behind us? 2024-02-14T11:00:55.309000+01:00 alexfinger https://community.sap.com/t5/user/viewprofilepage/user-id/178637 <P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AdobeStock_274471312.jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/51581i495143DD7F13D85C/image-size/large?v=v2&amp;px=999" role="button" title="AdobeStock_274471312.jpeg" alt="AdobeStock_274471312.jpeg" /></span></P><P>More then 17'000 years ago our ancestors in the French region of Perigord allowed themselves the luxury of art. They had the time to allow people to create cave paintings instead of engaging into the hunt for nutrition. That alone is striking, given that we think of the stone age as a period in which people were busy with anything but art. The oldest reported cave paintings go much further back, up to 39'000 years.</P><P>But what strikes me more than the level of freedom to create art is how it was created. With fingertips and brushes on a wall. We already translated a three-dimensional world into a two-dimensional representation of what we saw or wanted to express.</P><P>Looking at our today's world, I wonder if we have really progressed in that regard.</P><div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content">What's next..</div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">What's next..</div></div></noscript></div></div><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="dalle_cave.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/51582i69D26191965612BE/image-size/large?v=v2&amp;px=999" role="button" title="dalle_cave.png" alt="dalle_cave.png" /></span></P><P>However, upcoming technologies will offer us the opportunity to leave the cave walls behind and move our user experiences into a three-dimensional world or even directly into the brain:</P><P><STRONG>Augmented Reality</STRONG> can already today be used with mobile phone cameras and handsets to display real-time information in a real-world, starting from directions going to system status or runtime information for machinery.</P><P><STRONG>Virtual Reality</STRONG> is still clumsy to use but nonetheless impressive and the advancement of the technologies used in the VR-Glasses and handsets will make them smaller or even disappear because..</P><P>..reading the <STRONG>feedback</STRONG> of a human becomes affordable. Cameras, sensors and the computing power to analyze those signals are becoming a commodity and the..</P><P>..<STRONG>algorithms, including AI models</STRONG>, are available to a general public. Generative AI can be used to create on the fly scenes, interactions and settings in which we can interact with machines.&nbsp;</P><P>And if you remember the scene out of the first Matrix movie in which Neo is connected directly from his brain to the computer - scientists are working on these type of interfaces to <STRONG>read as directly as possible from the brain</STRONG> what we would like to express.</P><P>With these advancements, we will see new types of user interfaces emerge which wil allow us to link what we think to what happens in the machine without going through the <STRONG>bottleneck of speech</STRONG>:</P><P>Speech as a communication tool is a compromise, slow and full of possibilities for error and misunderstanding. I'm curious to see what will emerge as a solution as alternative to language and speech and how we will adopt these solutions.</P><P>&nbsp;</P> 2024-02-14T11:00:55.309000+01:00 https://community.sap.com/t5/artificial-intelligence-and-machine-learning-blogs/navigating-the-ai-landscape-a-ux-designer-s-guide/ba-p/13582520 Navigating the AI Landscape: A UX Designer's Guide 2024-02-14T11:01:22.387000+01:00 ArshAshok https://community.sap.com/t5/user/viewprofilepage/user-id/176073 <P><STRONG>Introduction</STRONG></P><P>As we stand on the brink of a technological revolution, AI is reshaping the way we interact with the digital world. I'm here to&nbsp;share my insights&nbsp;regarding this evolving landscape, offering observations into how AI, machine learning, and other related technologies can enhance our work in UX design.</P><P><STRONG>Brief Overview of AI and ML</STRONG></P><P>Artificial Intelligence (AI) is the overarching concept of machines carrying out tasks in ways that we consider 'smart'. It's a broad discipline aimed at creating systems that can simulate various aspects of human intelligence. Machine Learning (ML) is a subset of AI, focused on algorithms that enable machines to improve at tasks with experience. Think of AI as the universe of intelligent computation, with ML being a planet within it.</P><P>Deep Learning, in turn, is a subset of ML. It involves neural networks with many layers (hence 'deep') that can learn and make intelligent decisions on their own. Deep Learning has been instrumental in achieving significant breakthroughs in areas like image and speech recognition.</P><P>Then come Foundation Models, a recent development in AI. These are large-scale models (like GPT-3) that are trained on vast amounts of data and can be adapted to a wide range of tasks without being specifically trained for them. They are called 'foundations' because they provide a base layer of understanding that can be built upon for various applications.</P><P>These technologies are interrelated, forming a hierarchy from broad to specific. AI encompasses everything intelligent that a machine might do. Under AI, ML is the method through which machines learn from data. Deep Learning is a further specialization of ML with a focus on complex, layered neural networks. And Foundation Models are the cutting-edge, versatile systems pushing the boundaries of what AI can achieve.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Arsh_0-1706283040223.png" style="width: 504px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53132i7653F341B368869E/image-dimensions/504x254?v=v2" width="504" height="254" role="button" title="Arsh_0-1706283040223.png" alt="Arsh_0-1706283040223.png" /></span></P><P><STRONG>Generative Pretrained Transformer (GPT) and Transformer Architecture</STRONG></P><P>GPT, or Generative Pretrained Transformer, is a type of language processing AI. It's built on the Transformer architecture, which is revolutionary in the way it handles data. Traditional models processed data sequentially, one piece after another. The Transformer, however, allows for parallel processing, looking at entire sequences of data at once. This is done through mechanisms called 'attention' and 'self-attention,' letting the model weigh the importance of different parts of the input data and learn the context more effectively.</P><P>GPT takes this architecture and applies it to language, learning to predict the next word in a sentence. It's trained on a vast corpus of text and then fine-tuned for specific tasks. This pretraining is what makes it 'generative' - it can generate text, not just understand or classify it.</P><P><STRONG>Inception of Generative AI</STRONG></P><P>Generative AI came into existence as a natural progression from earlier AI models that were primarily discriminative. While discriminative models could classify and understand data, they couldn't create new data. The inception of Generative AI marked a shift from understanding to creation.</P><P>This shift was fueled by advancements in neural networks and an exponential increase in computational power and data availability. Researchers began exploring how neural networks could not only recognize patterns but also use those patterns to generate new, similar data. This exploration led to the development of models like Generative Adversarial Networks (GANs) and Variational Autoencoders (VAEs), and eventually to large-scale models like GPT.</P><P><STRONG>Integrating Reinforcement Learning with Human Feedback</STRONG></P><P>Adding to this is the concept of Reinforcement Learning with Human Feedback (RLHF). This approach trains AI systems not just on static datasets but on dynamic feedback loops. It’s akin to teaching a pet new tricks: the AI tries different strategies and, based on human feedback, learns which actions are desirable or undesirable. This human-in-the-loop methodology ensures that the AI’s learning trajectory aligns more closely with human values and preferences, making it particularly potent for personalization and adaptive learning scenarios.</P><P>Incorporating RLHF into the design of AI systems compels us to consider not just the initial user interaction but the ongoing relationship between the user and the AI as they adapt and learn from each other over time.</P><P><STRONG>Various Approaches to AI</STRONG></P><P>Understanding the various approaches to AI can be daunting, but it's crucial for harnessing its full potential:</P><UL><LI><STRONG>Symbolic AI</STRONG>: Based on the manipulation of symbols and rules, this approach tries to mimic human reasoning.</LI><LI><STRONG>Probabilistic AI</STRONG>: Focuses on using probabilities to make predictions and decisions.</LI><LI><STRONG>Statistical AI</STRONG>: Uses statistical methods to infer patterns and make predictions.</LI><LI><STRONG>Large Language Models (LLMs)</STRONG>: These are trained on vast datasets to understand and generate human-like text.</LI></UL><P>Each approach has its strengths, and knowing which to apply can significantly impact the success of a project.</P><P><STRONG>How Are Models Trained?</STRONG></P><P>AI models are trained using large datasets. They learn by recognising patterns and making associations. For instance, an image recognition model might learn to identify cats by being shown thousands of pictures of cats and not-cats. Over time, it improves its accuracy through a process called backpropagation, where it adjusts its internal parameters to minimize errors.</P><P><STRONG>AI and Design</STRONG></P><P>In the realm of AI, as designers, we're tasked with shaping a human-machine relationship that is continually evolving. Unlike traditional design, where interactions are fixed, AI-based design involves a fluid, ever-changing dynamic. Non-AI systems interact in a consistent, unchanging manner. However, AI systems learn and adapt over time, leading to a constantly developing relationship.</P><P>As both the machine and humans learn and adapt, they engage in a reciprocal learning process, forming a dynamic feedback loop. This loop is characterized by an ongoing exchange of information, with both parties growing and adjusting to the interaction. Our role as AI designers is to foster effective communication within this vibrant human-machine relationship.</P><P>In this context, data becomes the pivotal element. Previously, data interaction was straightforward — a user command followed by a machine response. With AI, data is the foundation of learned behaviours, informing the machine and shaping its growth. Here, data inputs are about educating the machine with information, not just instructing it. Conversely, machine outputs are no longer fixed; they have generated responses that necessitate explanations of how the data led to a particular conclusion.</P><P>As designers, we are charged with orchestrating these interactions throughout the entire data lifecycle. This includes the initial data capture, guiding the machine's learning process, designing clear and understandable data outputs, and ensuring a seamless flow of information back into the system for continued learning. Our responsibility extends beyond creating interfaces; it's about crafting experiences that support this rich, ongoing dialogue between humans and AI, ensuring clarity, transparency, and a mutual growth trajectory.</P><P>A comparison can be drawn from the days when selecting a movie at a DVD store involved browsing aisles for a favoured title or relying on a recommendation from a salesperson. In contrast, platforms like Netflix now curate suggestions tailored to our tastes, informed by our viewing history.</P><P><STRONG>Designers find themselves at the intersection of innovation, with three distinct yet interconnected realms to explore:</STRONG></P><P><STRONG>1. Designing with AI: Crafting Alongside AI</STRONG></P><P>Designers are now partnering with AI in a collaborative dance of creation, where the output is a fusion of human ingenuity and machine efficiency. Imagine the synergy of a designer working with AI to conjure up ground-breaking architectural structures, much like Autodesk's venture in utilizing generative design principles to conceive their Toronto office. Here, AI becomes an ally in the creative process, providing new perspectives and solutions that push the boundaries of traditional design.</P><P>Moreover, designers harness AI to streamline repetitive tasks, freeing up creative energy for more complex challenges. Tools like Airbnb's system for transforming sketches into digital wireframes or Netflix's algorithm for adapting graphics across different cultures exemplify this trend. These innovations signify a new era where AI does not replace the designer but rather amplifies their capabilities.</P><P><STRONG>2. Designing for AI: The Human-Centric Design Approach</STRONG></P><P>Designing for AI requires a human-centred lens, focusing on crafting systems that prioritize user needs and experiences. It's about spotting those unique opportunities where AI can not only function but flourish in addressing real-world problems. Here, the designer's role transcends aesthetics, venturing into the realm of functionality and utility, transforming user needs into data-driven AI solutions.</P><P>Human-centered design makes AI effective. These are some ways:</P><P style=" padding-left : 60px; "><STRONG>1. </STRONG><STRONG>Beyond Interfaces: Embracing Human-Centered Design in AI Algorithm Development</STRONG></P><P style=" padding-left : 60px; ">UX can aid in designing algorithms that mirror the decision-making processes humans employ, by considering their information, goals, and constraints. It can ensure that the decision environment, which encompasses both the algorithm and its human users should be thoughtfully constructed. Users should comprehend their AI tools well enough to use them effectively. Designers also aid in establishing guidelines and business protocols that translate algorithmic predictions into actionable insights, advising when human intervention is appropriate to supplement or override the AI.</P><P style=" padding-left : 60px; "><STRONG>2. To Translate User Needs into Data Requirements:</STRONG> &nbsp;A designer can aid in identifying the type of data necessary for training the model, considering various factors like predictive power (<EM>A percentage that refers to an ML model’s ability to predict outcomes given a certain input correctly</EM>), relevance, fairness, privacy, and security. Ensure the training dataset is comprehensive, reflecting the real-world scenarios the AI will encounter, and free from biases.</P><P style=" padding-left : 60px; "><STRONG>3. Knowing the source of the data &amp; Tuning the Model:</STRONG> Evaluating data sourcing and collection methods for their suitability of the project is critical. Once deployed, A designer will assess if the AI meets the target user’s needs as per predefined success metrics. Provide feedback on adjusting the model’s parameters as needed to enhance its performance, focusing on metrics that reflect user experience, such as customer satisfaction or the frequency of users following the AI’s recommendations.</P><P style=" padding-left : 60px; "><STRONG>4. Addressing Bias, Fairness, and Transparency</STRONG>: UX designers can help analyze data with an understanding of the domain, Goal definition, possible and required outcomes and the process that generated it. This leads to designers being a crucial part of designing algorithms that are mindful of the environment they will operate in, avoiding controversial predictors. They aid in conducting usability tests or audits to detect and eliminate unintended biases.</P><P style=" padding-left : 60px; "><STRONG>5. Managing the Handoff in AI Systems:</STRONG> Designing for smooth transitions between AI and human control in situations demanding common sense or contextual understanding is very important. The accountability for any action in the real world still lies with human users as over-reliance on technology can leave users unprepared for instances where AI fails, necessitating more skilled human intervention. A UX designer can analyse such situations and will aid in designing smooth handoff processes.</P><P style=" padding-left : 60px; "><STRONG>6. Designing Reward Functions</STRONG> <STRONG>and leveraging User Feedback for Model Improvement:</STRONG> Designing the AI’s reward function is critical as it influences the user experience significantly. User feedback is essential in refining AI models and enhancing user experience. Designers analyse and optimize the reward data to enhance the model for long-term user benefits and anticipate the downstream effects of your product. This also allows users to contribute to the personalization of their experiences, thereby increasing their trust in the system.</P><P style=" padding-left : 60px; "><STRONG>7. Anticipating Errors and Designing Response Pathways:</STRONG> A Human-centred design prepares your AI system to facilitate user responses to inevitable errors, turning them into opportunities for learning and improvement.</P><P style=" padding-left : 60px; "><STRONG>8. Educating Users and Setting Realistic Expectations</STRONG>: Designers help communicate the capabilities and limitations of your AI product to customers. Help users develop accurate mental models and understand how their interactions train the system. It’s essential to balance user trust, avoiding both undue scepticism and over-reliance on AI.</P><P style=" padding-left : 60px; "><STRONG>9. Guiding User Trust in AI Systems: Users need to adjust</STRONG> their trust in AI systems appropriately, rather than relying on them implicitly in every situation. The phenomenon of 'algorithm aversion' is well-documented, where users may be sceptical of software systems. Conversely, there are instances where users place excessive trust in AI capabilities, expecting more than what the system can deliver. Designers help users develop a balanced level of trust, aligning with the system's actual capabilities and limitations by taking a human-centred approach.</P><P>For instance, openly acknowledging the potential inaccuracies in AI predictions can temporarily reduce trust in those specific outcomes. However, this honesty can foster a more sustainable trust in the long term. Users become more judicious in their reliance on the system, reducing the likelihood of disappointment due to misplaced expectations."</P><P><STRONG>3. Designing of AI: The User Experience Frontier</STRONG></P><P>When it comes to the design of AI, it's about envisioning and sculpting the interactions between AI systems and their human users. It's a space where new forms of engagement, like voice-activated assistants or image recognition software, become gateways to enhanced user experiences. The key challenge here is transparency: designing interfaces that not only serve but also educate. Users should be able to grasp, with just the right level of detail, how AI systems make decisions and learn over time.</P><P>An example could be the intuitive dashboards in our cars that provide real-time insights into the vehicle's AI, or the smart home devices that learn our preferences and conversationally explain their actions. These are no longer scenarios from a sci-fi novel; they are today's design challenges that call for a blend of technical knowledge, user empathy, and creative foresight.</P><P>In essence, the designer's canvas has expanded, not just in size but in dimensionality. As AI continues to intertwine with our daily lives, it invites designers to step into roles that are as diverse as they are dynamic, shaping not only how AI looks but also how it behaves and interacts in the fabric of human experience.</P><P><STRONG>Understanding the Limitations of AI in UX Design</STRONG></P><P>Incorporating AI into UX design comes with distinct limitations that underscore the irreplaceable value of human insight and direction.</P><P><STRONG>1. Hallucinations and Reliability</STRONG></P><P>AI "hallucinations" refer to instances where a model confidently generates an incorrect response. These can be caused by inconsistencies within a large data set or errors in the model's training methodology. In fields where precision is critical, such as financial reporting or legal documentation, these inaccuracies can introduce significant risks. Combatting this requires robust document structuring and advanced prompt design techniques to direct AI towards more dependable outcomes.</P><P><STRONG>2. Prompt Sensitivity </STRONG></P><P><STRONG>&nbsp;</STRONG>Large Language Models (LLMs) are highly sensitive to user input. The nuances of how a prompt is phrased can lead to varied and unpredictable responses. This sensitivity necessitates a careful and strategic approach to prompt engineering, ensuring that the AI's responses align with user intentions. The evolving role of "Prompt Engineer" is a testament to the significance of crafting prompts that steer AI toward delivering consistent and accurate results.</P><P><STRONG>3. Context Window</STRONG></P><P>Limits The context window, the amount of information an AI can consider when generating a response, is a notable constraint. As the context window expands, so does the computational complexity. Despite improvements like GPT-4's extended context window, there remains a ceiling to the volume of data an AI can process at a time. This limitation is particularly challenging in tasks that require the review of extensive documents, where the AI must understand and analyze large quantities of text. Designing for AI in UX thus requires a thoughtful balance between the AI's capabilities and the complexity of the tasks it is expected to perform<STRONG>.</STRONG></P><P><STRONG>Things Designers Should Know Before Designing for AI</STRONG></P><P><STRONG>Technical Knowledge</STRONG></P><UL><LI>Grasping the basics of data science and AI techniques like NLP and deep learning.</LI><LI>Basic Understanding of the AI toolchain and DevOps processes for AI development.</LI><LI>Access to clean data set.</LI></UL><P><STRONG>Ethics in AI</STRONG></P><UL><LI>Integrate ethical standards into the design and development process, ensuring accountability, fairness, and transparency.</LI><LI>Navigate GDPR/compliance mandates and be mindful of the financial and human impacts of design decisions.</LI></UL><P><STRONG>Collaboration is Key: </STRONG></P><UL><LI>Work closely with data scientists and engineers to understand the technical aspects and constraints.</LI><LI>Foster a shared vision across multidisciplinary teams and participate actively in the AI development lifecycle.</LI><LI>Engage in design thinking activities tailored to AI and address the needs of diverse users.</LI></UL><P><STRONG>AI Strategy</STRONG></P><UL><LI>Develop and communicate a user-focused AI strategy, explaining barriers to adoption and the business and user benefits.</LI><LI>Articulate your company's AI strategy, differentiators, and the journey toward AI success.</LI></UL><P><STRONG>Designing AI Interactions</STRONG></P><UL><LI>Translate AI model outputs into understandable insights for users and design interactions that capture human input for machine learning.</LI><LI>Prototype and test AI solutions frequently, and design for various stages of the AI lifecycle, such as model maintenance and data collection methods.</LI></UL><P><STRONG>User Trust and Transparency</STRONG></P><UL><LI>Build trust by making your AI interactions transparent and understandable.</LI></UL><P>In conclusion, AI is not just a tool but a new frontier in design. By embracing it, we can create more personalized, efficient, and engaging user experiences. Let's embark on this journey together, continuously learning and adapting to ensure technology serves humanity in the most beneficial ways.</P><P>&nbsp;</P><P>Resources to Refer :</P><OL><LI>Generative AI at SAP: <A href="https://open.sap.com/courses/genai1" target="_blank" rel="noopener noreferrer">https://open.sap.com/courses/genai1</A></LI><LI>AI Ethics at SAP: <A href="https://open.sap.com/courses/aie1-1" target="_blank" rel="noopener noreferrer">https://open.sap.com/courses/aie1-1</A></LI><LI>Designing for Generative AI: <A href="https://experience.sap.com/internal/fiori-design-web/generative-ai-design/" target="_blank" rel="noopener noreferrer">https://experience.sap.com/internal/fiori-design-web/generative-ai-design/</A></LI><LI>Designing for Intelligent Systems: <A href="https://experience.sap.com/internal/fiori-design-web/designing-intelligent-systems/" target="_blank" rel="noopener noreferrer">https://experience.sap.com/internal/fiori-design-web/designing-intelligent-systems/</A></LI><LI>SAP AI community file: <A href="https://www.figma.com/file/SJh2Eb5KrBIbaK3Bo2wqtq/AI-UX-Pattern-Community-Explorations?type=design&amp;node-id=737-200772&amp;mode=design" target="_blank" rel="noopener nofollow noreferrer">https://www.figma.com/file/SJh2Eb5KrBIbaK3Bo2wqtq/AI-UX-Pattern-Community-Explorations?type=design&amp;node-id=737-200772&amp;mode=design</A></LI><LI><A href="https://teams.microsoft.com/l/channel/19%3a3beb9faf0d144622a649e4eddb97d152%40thread.tacv2/AI%2520Design%2520Guidelines%2520and%2520Patterns%2520Community?groupId=ead6a857-cde8-4c1c-abc4-cbd2751ae3a9&amp;tenantId=42f7676c-f455-423c-82f6-dc2d99791af7" target="_blank" rel="noopener nofollow noreferrer">AI Design Community Teams Channel</A></LI><LI><A href="https://www.figma.com/file/SJh2Eb5KrBIbaK3Bo2wqtq/AI-UX-Pattern-Community-Explorations?type=design&amp;node-id=737-200772&amp;mode=design" target="_blank" rel="noopener nofollow noreferrer">AI Design Community Exploration File</A>&nbsp;</LI><LI><A href="https://www.figma.com/file/Nf6HYsfOJGMH8jEl0QbuRh/AI-Prompting-Community-Feedback?type=whiteboard&amp;node-id=0%3A1&amp;t=NSDrZCXJS2kZf6iB-1" target="_blank" rel="noopener nofollow noreferrer">Prompt Pattern Presentation Figjam</A></LI></OL><P>&nbsp;</P> 2024-02-14T11:01:22.387000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/card-ui-design-in-a-business-context-a-new-system-for-mobile-apps-by-sap/ba-p/13607928 Card UI Design in a Business Context: A New System for Mobile Apps by SAP 2024-02-16T17:13:40.669000+01:00 ch_salwitzek https://community.sap.com/t5/user/viewprofilepage/user-id/687116 <P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="CardSystem_Blog_Intro1.1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66566i7B9394F6815B5953/image-size/large?v=v2&amp;px=999" role="button" title="CardSystem_Blog_Intro1.1.png" alt="CardSystem_Blog_Intro1.1.png" /></span></P><P><SPAN class="">When </SPAN><SPAN class="">I asked my mother </SPAN><SPAN class="">what comes to her mind when I say</SPAN><SPAN class="">,</SPAN><SPAN class=""> “card </SPAN><SPAN class="">components in</SPAN><SPAN class=""> mobile apps</SPAN><SPAN class="">”,</SPAN><SPAN class=""> she first </SPAN><SPAN class="">gave me a </SPAN><SPAN class="">puzzled</SPAN><SPAN class=""> look</SPAN><SPAN class="">,</SPAN><SPAN class=""> as if I had just asked her to solve a </SPAN><SPAN class="">Rubik’s cube blindfolded</SPAN><SPAN class="">. With a hint of confusion in her voice, she </SPAN><SPAN class="">replied</SPAN><SPAN class="">, "Cards? Like a deck of cards on your smartphone? I thought we were done with the whole '</SPAN><SPAN class="">S</SPAN><SPAN class="">olitaire' phase</SPAN><SPAN class="">.</SPAN><SPAN class="">"</SPAN></P><H3 id="toc-hId-1115297347"><SPAN class=""><SPAN class="">What is so special about </SPAN><SPAN class="">c</SPAN><SPAN class="">ard</SPAN><SPAN class=""> UI</SPAN> <SPAN class="">d</SPAN><SPAN class="">esign</SPAN><SPAN class="">?</SPAN></SPAN></H3><P><SPAN class=""><SPAN class="">In her defense, </SPAN><SPAN class="">it's</SPAN><SPAN class=""> not every day someone asks</SPAN> <SPAN class="">about card </SPAN><SPAN class="">UI </SPAN><SPAN class="">components</SPAN><SPAN class="">. </SPAN><SPAN class="">But while my mother </SPAN><SPAN class="">may </SPAN><SPAN class="">have initially misunderstood the concept, </SPAN><SPAN class="">there is a little bit of</SPAN><SPAN class=""> truth in </SPAN><SPAN class="">her </SPAN><SPAN class="">answer:</SPAN> <SPAN class="">Cards in apps </SPAN><SPAN class="">resemble </SPAN><SPAN class="">physical cards</SPAN><SPAN class="">, like </SPAN><SPAN class="">those found in a deck</SPAN><SPAN class="">. </SPAN><SPAN class="">This familiarity can </SPAN><SPAN class="">actually </SPAN><SPAN class="">help</SPAN> <SPAN class="">users quickly understand the purpose of each card within an app. In fact, </SPAN><SPAN class="">even </SPAN><SPAN class="">Apple</SPAN> <SPAN class="">used </SPAN><SPAN class="">a design approach called "skeuomorphism" in the early versions of iOS, which aimed to make digital interfaces mimic real-world objects.</SPAN></SPAN></P><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">M</SPAN><SPAN class="">any consumer apps </SPAN><SPAN class="">are using </SPAN><SPAN class="">card</SPAN><SPAN class=""> components </SPAN><SPAN class="">to </SPAN><SPAN class="">provide</SPAN><SPAN class=""> a clear visual hierarchy, organizing information into brief, self-contained units.</SPAN><SPAN class=""> This </SPAN><SPAN class="">makes it easier for users to scan the</SPAN><SPAN class=""> app content</SPAN><SPAN class="">.</SPAN><SPAN class=""> Cards are also well-suited for responsive design, enabling adaptation to different screen sizes</SPAN><SPAN class="">, </SPAN><SPAN class="">screen </SPAN><SPAN class="">orientations</SPAN><SPAN class=""> and device</SPAN><SPAN class=""> types</SPAN><SPAN class="">,</SPAN> <SPAN class="">such as </SPAN><SPAN class="">phones </SPAN><SPAN class="">or</SPAN><SPAN class=""> tablets</SPAN><SPAN class="">.</SPAN></SPAN></SPAN></SPAN></P><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">And of course</SPAN><SPAN class="">,</SPAN><SPAN class=""> there are </SPAN><SPAN class="">those</SPAN> <SPAN class="">nice, rounded corners that soften the overall look of the </SPAN><SPAN class="">app</SPAN><SPAN class="">, </SPAN><SPAN class="">making</SPAN> <SPAN class="">it more friendly and approachable</SPAN> <SPAN class="">– w</SPAN><SPAN class="">ho knew geometry could be so charming?</SPAN></SPAN></SPAN></SPAN></SPAN></P><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="CardSystem_Blog_2.1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66569i5A04674DB003A220/image-size/large?v=v2&amp;px=999" role="button" title="CardSystem_Blog_2.1.png" alt="CardSystem_Blog_2.1.png" /></span></SPAN></SPAN></SPAN></SPAN></P><P style=" text-align: center; "><FONT color="#808080"><EM><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">C</SPAN><SPAN class="">ards </SPAN><SPAN class="">make it easier to scan the app content</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></EM></FONT></P><H3 id="toc-hId-918783842"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Using cards in an enterprise context</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></H3><P><SPAN class=""><SPAN class="">T</SPAN><SPAN class="">he </SPAN><SPAN class="">benefits</SPAN> <SPAN class="">I just mentioned</SPAN> <SPAN class="">go</SPAN> <SPAN class="">far </SPAN><SPAN class="">beyond </SPAN><SPAN class="">consumer</SPAN><SPAN class=""> apps. </SPAN><SPAN class="">In the world of </SPAN><SPAN class="">multifaceted</SPAN><SPAN class=""> software products, where users </SPAN><SPAN class="">sometimes</SPAN><SPAN class=""> struggle with </SPAN><SPAN class="">large amounts</SPAN><SPAN class=""> of information and features, </SPAN><SPAN class="">the </SPAN><SPAN class="">us</SPAN><SPAN class="">e</SPAN> <SPAN class="">of </SPAN><SPAN class="">cards </SPAN><SPAN class="">can improve</SPAN> <SPAN class="">the user </SPAN><SPAN class="">e</SPAN><SPAN class="">xperience</SPAN> </SPAN><SPAN class=""><SPAN class="">as content becomes more structured and modular.</SPAN></SPAN></P><P data-unlink="true"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">However, incorporating cards in the context of large software companies </SPAN><SPAN class="">just </SPAN><SPAN class="">like SAP</SPAN><SPAN class=""> can</SPAN><SPAN class=""> also</SPAN><SPAN class=""> be a challenge as there are </SPAN><SPAN class="">many </SPAN><SPAN class="">different products</SPAN><SPAN class=""> with a wide variety of use cases. </SPAN><SPAN class="">To address this</SPAN><SPAN class="">, the teams for the SAP Mobile Design System and&nbsp;SAP </SPAN><SPAN class="">BTP</SPAN> <SPAN class="">SDK</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN><SPAN class="">ha</SPAN><SPAN class="">ve </SPAN><SPAN class="">supported</SPAN> <SPAN class="">app teams</SPAN><SPAN class=""> by offering </SPAN><SPAN class="">several </SPAN><SPAN class="">card types</SPAN><SPAN class="">.</SPAN><SPAN class="">&nbsp;</SPAN><SPAN class="">These card types include object cards, list cards, and chart cards, among others</SPAN><SPAN class=""> that </SPAN><SPAN class="">can be </SPAN><SPAN class="">utilized</SPAN><SPAN class=""> when developing </SPAN><SPAN class="">apps</SPAN><SPAN class="">.</SPAN></SPAN></SPAN></SPAN></P><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">For example, </SPAN><SPAN class="">a</SPAN> <SPAN class="">maintenance app</SPAN><SPAN class=""> ca</SPAN><SPAN class="">n use object cards that display </SPAN><SPAN class="">important information</SPAN><SPAN class="">,</SPAN> <SPAN class="">such as </SPAN><SPAN class="">work order </SPAN><SPAN class="">name, description</SPAN><SPAN class="">,</SPAN><SPAN class=""> and priority</SPAN><SPAN class="">. T</SPAN><SPAN class="">he </SPAN><SPAN class="">object cards</SPAN><SPAN class=""> allow</SPAN> <SPAN class="">users </SPAN><SPAN class="">to </SPAN><SPAN class="">efficiently manage maintenance activities</SPAN><SPAN class=""> and </SPAN><SPAN class="">monitor</SPAN><SPAN class=""> progress.</SPAN> <SPAN class="">Or</SPAN><SPAN class="">,</SPAN><SPAN class=""> i</SPAN><SPAN class="">n a procurement app</SPAN><SPAN class="">,</SPAN><SPAN class=""> list cards can be used </SPAN><SPAN class="">to display the top three </SPAN><SPAN class="">pending </SPAN><SPAN class="">purchases with </SPAN><SPAN class="">additional</SPAN><SPAN class=""> information </SPAN><SPAN class="">such as </SPAN><SPAN class="">purchase</SPAN><SPAN class=""> price and d</SPAN><SPAN class="">ue dat</SPAN><SPAN class="">e</SPAN><SPAN class=""> that </SPAN><SPAN class="">help users prioritize and manage their workload more effectively.</SPAN></SPAN></SPAN></SPAN></SPAN></P><P><SPAN>Unfortunately, these card types are not flexibly adaptable or extendable, so that many app teams are forced to design and develop custom cards, which not only adds additional development efforts, but also creates inconsistent cards across SAP mobile apps.</SPAN></P><P><SPAN>So how can we ensure that our SAP Mobile Design System and SAP BTP SDKs provide reusable card components that are flexible enough to adapt to any use case while maintaining a consistent design?</SPAN></P><H3 id="toc-hId-722270337"><SPAN><SPAN class=""><SPAN class="">A new appr</SPAN><SPAN class="">oach</SPAN><SPAN class=""> to display </SPAN><SPAN class="">your </SPAN><SPAN class="">business app</SPAN><SPAN class="">’s</SPAN><SPAN class=""> content</SPAN></SPAN></SPAN></H3><P><SPAN>Our solution is a sophisticated “card system” that provides a toolkit of so-called nested components that reside in the card container. These nested components include lists, charts, calendars, KPIs, and many more components to fulfil the needs of any SAP product. Moreover, the card system offers improved customization, flexibility, and adaptable sizing options to fit different layouts, such as a masonry or a carousel layout into which cards can be placed.</SPAN></P><P><SPAN>The core of this card component approach is the modular structure of three flexible containers that exist in the card: the card header, the card body, and the card footer. Each of these containers can be separately controlled, adjusted, and switched on or off.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="CardSystem_Blog_3.1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66570i4EB9033F02F91D30/image-size/large?v=v2&amp;px=999" role="button" title="CardSystem_Blog_3.1.png" alt="CardSystem_Blog_3.1.png" /></span></SPAN></P><P style=" text-align: center; "><FONT color="#808080"><EM>Three separate containers in the card ensure maximum flexibility</EM></FONT></P><P><SPAN class=""><SPAN class=""><SPAN class="">But like Solitaire, every good card game also needs a couple of rules.</SPAN> <SPAN class="">To</SPAN> <SPAN class="">ensure </SPAN><SPAN class="">consistency </SPAN><SPAN class="">despite </SPAN><SPAN class="">the</SPAN><SPAN class=""> flexibility</SPAN><SPAN class=""> of the new card</SPAN> <SPAN class="">component</SPAN><SPAN class="">, </SPAN><SPAN class="">we</SPAN><SPAN class="">’ve</SPAN> <SPAN class="">also </SPAN><SPAN class="">defined </SPAN><SPAN class="">“Do’s and Don’ts”</SPAN> <SPAN class="">as well as</SPAN><SPAN class=""> design recommendations within our <A href="https://experience.sap.com/fiori-design-ios/article/cards-overview/" target="_blank" rel="noopener noreferrer">design guidelines</A></SPAN></SPAN><SPAN class=""><SPAN class="">.</SPAN></SPAN></SPAN></P><P><SPAN>The card header displays only key details, such as a title and a subtitle. The card body can show additional information alongside the content of the card header, such as in-depth details, KPIs, or relevant graphics. The card footer is used for important or routine actions that affect the content of the card.</SPAN></P><P><SPAN>In addition to the card itself, card layouts, such as a carousel or masonry layout can be used to facilitate a quick and modular overview of information across different content resources. Using cards together with card layouts can enable a holistic information approach and ensure an intuitive and frictionless app experience.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="CardSystem_Blog_Masonry.1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66572i1131D51A95BDBEEF/image-size/large?v=v2&amp;px=999" role="button" title="CardSystem_Blog_Masonry.1.png" alt="CardSystem_Blog_Masonry.1.png" /></span></SPAN></P><P style=" text-align: center; "><FONT color="#808080"><EM>Card layouts&nbsp;such as a masonry layout provide a quick overview of various information</EM></FONT></P><H3 id="toc-hId-525756832"><SPAN><SPAN class=""><SPAN class="">Design along various </SPAN><SPAN class="">u</SPAN><SPAN class="">se </SPAN><SPAN class="">c</SPAN><SPAN class="">ases</SPAN></SPAN></SPAN></H3><P><SPAN><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Before developing the card system, we prioritized gaining a comprehensive understanding of </SPAN><SPAN class="">SAPs</SPAN> <SPAN class="">mobile</SPAN><SPAN class=""> apps and their specific needs. </SPAN><SPAN class="">This</SPAN> <SPAN class="">included</SPAN> <SPAN class="">interviews with all app teams and extensive research. Our goal was to </SPAN><SPAN class="">identify</SPAN><SPAN class=""> the common elements found in </SPAN><SPAN class="">already </SPAN><SPAN class="">existing cards and </SPAN><SPAN class="">determine</SPAN><SPAN class=""> their frequency of occurrence.</SPAN></SPAN></SPAN></SPAN></SPAN></P><P><SPAN><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Through this analysis, we discovered</SPAN><SPAN class="">,</SPAN><SPAN class=""> for example</SPAN><SPAN class="">,</SPAN><SPAN class=""> that the </SPAN><SPAN class="">existing </SPAN><SPAN class="">cards heavily emphasize</SPAN><SPAN class="">d</SPAN><SPAN class=""> the </SPAN><SPAN class="">uppermost part of the card</SPAN> <SPAN class="">and </SPAN><SPAN class="">often</SPAN> <SPAN class="">included </SPAN><SPAN class="">a title, </SPAN><SPAN class="">a subtitle,</SPAN><SPAN class=""> and a thumbnail</SPAN><SPAN class="">.</SPAN> <SPAN class="">With </SPAN><SPAN class="">the insights</SPAN><SPAN class=""> gained</SPAN><SPAN class=""> from this research</SPAN><SPAN class="">, we </SPAN><SPAN class="">began</SPAN><SPAN class=""> to develop the card system</SPAN><SPAN class=""> and </SPAN><SPAN class="">the above-mentioned </SPAN><SPAN class="">header, body, and footer</SPAN> <SPAN class="">structure</SPAN><SPAN class="">,</SPAN> <SPAN class="">along</SPAN> <SPAN class="">with a set of </SPAN><SPAN class="">recommended </SPAN><SPAN class="">components for each part.</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><P><SPAN><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="CardSystem_Blog_4.1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66573i19DA7BF6133CDF8A/image-size/large?v=v2&amp;px=999" role="button" title="CardSystem_Blog_4.1.png" alt="CardSystem_Blog_4.1.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><P style=" text-align: center; "><FONT color="#808080"><EM><SPAN class="">Business c</SPAN><SPAN class="">ard</SPAN> <SPAN class="">UIs</SPAN><SPAN class=""> often emphasize the uppermost part</SPAN><SPAN class=""> of the card</SPAN></EM></FONT></P><P><SPAN class=""><SPAN class="">Of course, there were also elements that were only used by one single app within card</SPAN><SPAN class="">s</SPAN><SPAN class="">, such as </SPAN><SPAN class="">a</SPAN><SPAN class=""> QR code. </SPAN><SPAN class="">As much as we would have loved to accommodate these </SPAN><SPAN class="">special cases</SPAN><SPAN class=""> (people love QR codes!)</SPAN><SPAN class="">, we had to stay focused on our main </SPAN><SPAN class="">objective</SPAN><SPAN class="">: prioritizing the </SPAN><SPAN class="">most widely used </SPAN><SPAN class="">features.</SPAN></SPAN></P><H3 id="toc-hId-329243327"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Test</SPAN><SPAN class="">ing</SPAN><SPAN class=""> it</SPAN><SPAN class=""> regularly</SPAN></SPAN></SPAN></SPAN></H3><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">To </SPAN><SPAN class="">improve and refine the new card</SPAN> <SPAN class="">component</SPAN><SPAN class="">, we used regular evaluation cycles to test the card system's design and implementation. </SPAN><SPAN class="">Getting feedback </SPAN><SPAN class="">on</SPAN><SPAN class=""> our de</SPAN><SPAN class="">sign was real</SPAN><SPAN class="">ly important </SPAN><SPAN class="">as</SPAN><SPAN class=""> it helped us to make </SPAN><SPAN class="">necessary </SPAN><SPAN class="">modifications </SPAN><SPAN class="">and enhan</SPAN><SPAN class="">ce the overall functionality</SPAN><SPAN class="">.</SPAN> <SPAN class="">For example, we incorporated the icon stack </SPAN><SPAN class="">component</SPAN><SPAN class=""> into the card header based on a feedback session with our stakeholders.</SPAN><SPAN class="">&nbsp;</SPAN><SPAN class="">Furthermor</SPAN><SPAN class="">e</SPAN><SPAN class="">, we plan to </SPAN><SPAN class="">continue to </SPAN><SPAN class="">gather feedback on a regular basis</SPAN><SPAN class=""> and </SPAN><SPAN class="">to </SPAN><SPAN class="">expand </SPAN><SPAN class="">the card system</SPAN><SPAN class=""> in the future.</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><H3 id="toc-hId-132729822"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">How to u</SPAN><SPAN class="">se it</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></H3><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Our card system is now available for designers us</SPAN><SPAN class="">ing</SPAN><SPAN class=""> our Figma UI Kit of the <A href="https://experience.sap.com/fiori-design-android/resources/#ui-kit" target="_blank" rel="noopener noreferrer">SAP </A></SPAN><A href="https://experience.sap.com/fiori-design-android/resources/#ui-kit" target="_blank" rel="noopener noreferrer"><SPAN class="">Mobile </SPAN></A><SPAN class=""><A href="https://experience.sap.com/fiori-design-android/resources/#ui-kit" target="_blank" rel="noopener noreferrer">Design System for Android</A> and <A href="https://experience.sap.com/fiori-design-ios/article/ui-kit-10-0-0/" target="_blank" rel="noopener noreferrer">SAP Mobile Design System for iOS</A>, as well as for developers us</SPAN><SPAN class="">ing</SPAN><SPAN class=""> the <A href="https://pages.community.sap.com/topics/mobile-technology/btp-sdk-android" target="_blank" rel="noopener noreferrer">SAP BTP SDK for Android</A> and <A href="https://developers.sap.com/topics/sap-btp-sdk-for-ios.html" target="_blank" rel="noopener noreferrer">SAP BTP SDK for iOS</A>. </SPAN><SPAN class="">This is our </SPAN><SPAN class="">initial</SPAN> <SPAN class="">release </SPAN><SPAN class="">of the card system, and we are committed to actively working on enhancing it in future releases. </SPAN><SPAN class="">We encourage you to try it out and provide feedback on your experiences</SPAN><SPAN class="">!&nbsp;<span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="CardSystem_Blog_5.1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66574i3721403B30DA6BEE/image-size/large?v=v2&amp;px=999" role="button" title="CardSystem_Blog_5.1.png" alt="CardSystem_Blog_5.1.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></P><P style=" text-align: center; "><FONT color="#808080"><EM><SPAN class="">The card system </SPAN><SPAN class="">allows creating a wide variety of card UIs</SPAN></EM></FONT></P><P><SPAN>For more information, explore the card system in our design guidelines for <A href="https://experience.sap.com/fiori-design-ios/article/cards-overview/" target="_blank" rel="noopener noreferrer">SAP Fiori for iOS</A> or <A href="https://experience.sap.com/fiori-design-android/cards-overview/" target="_self" rel="noopener noreferrer">SAP Fiori for Android</A>,</SPAN><SPAN>&nbsp;</SPAN><SPAN>and our technical documentation for the <A href="https://help.sap.com/doc/978e4f6c968c4cc5a30f9d324aa4b1d7/Latest/en-US/Documents/Frameworks/SAPFiori/Classes/FUICardView.html" target="_self" rel="noopener noreferrer">SAP BTP SDK for iOS</A> and SAP BTP SDK for Android</SPAN><SPAN>&nbsp;card component.</SPAN></P><H3 id="toc-hId--63783683"><SPAN><SPAN class=""><SPAN class="">Epilog</SPAN><SPAN class="">ue</SPAN></SPAN></SPAN></H3><P><SPAN>Of course, I also read this blog post to my mother. What begins with initial enthusiasm ends 32 seconds later with her picking up her phone and no longer listening. I wondered: Is it because it's my first blog post and I still need to optimize my skills? Is UX design just not interesting enough for a woman who works in elderly care? Or is it simply because she doesn't really understand English...?</SPAN></P><P><SPAN>After all, the fact that she reached for her phone first shows me one thing: mobile design is relevant. It’s not just my generation or the generation after me that is literally addicted to their phone and would like to perform every activity with it. By pursuing innovative approaches, such as a flexible card system, we can enhance the experience also for business users and simplify digital business processes by using these beautifully rounded corners.</SPAN></P><P><SPAN>And who knows, maybe one day apps will become “old-fashioned data silos”, thanks to artificial intelligence. AI might be able to condense app content to the point where we will only need to display a widget, a notification, or just one single card.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="epilogue2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66564i9C677EA5BCA109E4/image-size/large?v=v2&amp;px=999" role="button" title="epilogue2.png" alt="epilogue2.png" /></span></SPAN></P><P><FONT color="#000000"><SPAN class=""><SPAN class="">Special thanks to Janin Stoess, Eva Artinger, Natalie Stainton, Huy Ngo, Cara Stallone, </SPAN><SPAN class="">Yuepei</SPAN><SPAN class=""> Guo, Diana Klukas, Michael </SPAN><SPAN class="">Krenkler</SPAN><SPAN class="">, Marisa Wollner, Emil </SPAN><SPAN class="">Voutta</SPAN><SPAN class="">,</SPAN><SPAN class=""> and all the other colleagues who have contributed to this</SPAN><SPAN class=""> project</SPAN></SPAN></FONT><SPAN class=""><SPAN class=""><FONT color="#000000"> at SAP&nbsp;<span class="lia-unicode-emoji" title=":blue_heart:">💙</span></FONT></SPAN></SPAN></P> 2024-02-16T17:13:40.669000+01:00 https://community.sap.com/t5/human-capital-management-blogs-by-sap/latest-benefits-enrollment-experience-in-sap-successfactors-employee/ba-p/13613729 Latest benefits enrollment experience in SAP SuccessFactors Employee Central 2024-02-20T23:17:10.887000+01:00 SimarK https://community.sap.com/t5/user/viewprofilepage/user-id/1400902 <P class="">In the dynamic and ever advancing realm of HR technology, evolution is not just a choice, but a mandate to successfully compete.</P><P class="">We at SAP SuccessFactors are very excited to unveil a new chapter in our journey – reimagining our SAP SuccessFactors Employee Central Global Benefits solution.</P><P class="">We started our revamp journey about one year ago with focus on <STRONG>“</STRONG><STRONG><EM>enhancing the user experience to make benefits management seamless, simplified and far more intuitive”.</EM></STRONG></P><P class=""><EM>Our goal is to build a platform that goes beyond functionality, one that meets the level of intuitiveness and just-in-time help that employees have come to expect from business and consumer software nowadays.</EM></P><P class="">We understand that Total Rewards teams must offer competitive benefits that are based on local market trends and prevailing practices. Therefore, we are delivering a user experience designed to meet the benefits needs of the North America market, with plans to ultimately cover all countries globally.</P><P class="">Our latest benefits experience supports administration of open enrollment processes, exception cycles due to employee work or life events (such as child birth, promotion, etc.).</P><P class="">We currently cover the following benefit types: Insurances (including health, dental, vision, life), Section 125 savings plans (including HSA, FSA, LPFSA, DCRA) and pensions. Support for additional benefit types is planned for future releases.</P><P class=""><STRONG>Here are some key highlights of the latest enrollment experience: </STRONG></P><UL><LI><STRONG><EM>Personalized UX</EM></STRONG><EM>: </EM>Personalized text and instructions enable you to deliver a tailored enrollment experience aligned with your organizational needs.</LI><LI><STRONG><EM>Guided enrollment</EM></STRONG><EM>:</EM>An intuitive, step-by-step guided enrollment experience makes sure employees never lose track of their progress. Real-time benefits eligibility updates help your employees continually understand the choices and options available by presenting them with all the benefits for which they are eligible to enroll.</LI></UL><P>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="1.png" style="width: 371px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/68506i62396E3E521CAA70/image-size/medium?v=v2&amp;px=400" role="button" title="1.png" alt="1.png" /></span></P><UL><LI><STRONG><EM>Smart system</EM></STRONG><EM>: </EM>Solution detects when proof of good health is required for a benefit coverage; Also, based on number and age of dependents, the system assigns employees to the appropriate insurance coverage tiers, reducing employee efforts in matching the right coverage tier.</LI></UL><P style=" text-align: center; "><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="5 creenshot 2024-02-16 at 3.39.51 PM.png" style="width: 663px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/68507i6F037BEBC13CC270/image-dimensions/663x413?v=v2" width="663" height="413" role="button" title="5 creenshot 2024-02-16 at 3.39.51 PM.png" alt="5 creenshot 2024-02-16 at 3.39.51 PM.png" /></span></P><UL><LI><P>&nbsp;&nbsp;<STRONG><EM>Informed decision-making</EM></STRONG><EM>: </EM>Side by side benefit plan comparison allows employees to see difference in coverage, costs and other important factors, making it easier to assess plan options to select the best-fit plan. Employees can also view how much they spend on benefits per pay period and annually, which further promotes informed decision-making.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2024-02-19 at 2.22.50 PM.png" style="width: 371px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/68508iA9DE04CA01ABCB51/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2024-02-19 at 2.22.50 PM.png" alt="Screenshot 2024-02-19 at 2.22.50 PM.png" /></span></P></LI><LI><STRONG><EM>Increased transparency</EM></STRONG><EM>:</EM>Organizations have the option to share how much they are spending on their employee’s benefits, which promotes transparency.</LI></UL><P>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2.png" style="width: 371px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/68509i123EB2D5DBBFF684/image-size/medium?v=v2&amp;px=400" role="button" title="2.png" alt="2.png" /></span></P><UL><LI><STRONG><EM>Employee education resources: </EM></STRONG>Embedded informational text and simplified on-screen “help and resources” interface helps to educate employees and provides more clarity into their benefits options.</LI><LI><STRONG><EM>Mobile -enabled:</EM></STRONG> Employees can complete their benefits enrollment from any location using our SAP SuccessFactors native mobile application.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="3.png" style="width: 197px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/68513i45E9593AF530C67C/image-size/medium?v=v2&amp;px=400" role="button" title="3.png" alt="3.png" /></span></LI></UL><P class=""><STRONG>The latest benefits experience will provide significant value to both employers and employees, but don’t just take our word for it.&nbsp; Here is what some of our customers have said about the new benefits experience: </STRONG></P><P class=""><EM>“The New Enrollment experience is a game changer”&nbsp;</EM></P><P class=""><FONT face="georgia,palatino" size="2">-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; An International European-based company with 300,000 employees</FONT></P><P class=""><EM>“Latest Benefits Experience is a major improvement”</EM></P><P class=""><FONT face="georgia,palatino" size="2">-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A 40,000 employee US-based company</FONT></P><P class=""><EM>“We are putting EC Global Benefits back on our roadmap”</EM></P><P class=""><FONT face="georgia,palatino" size="2">-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A large global software company</FONT></P><P class=""><EM>"I love that employees must make an enrollment decision for each benefit"</EM></P><P class=""><FONT face="georgia,palatino" size="2">-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A mid west company live on the Legacy experience</FONT></P><P class=""><STRONG>Interested in learning more?</STRONG></P><P class="">Our new Enrollment Experience will be available through an Early Adopter Care Program starting February 29th, 2024 for those customers using insurance and savings plan benefit types. The latest enrollment experience is planned for general availability with the 1H 2024 release (May 17, 2024).</P><P class="">If you are an SAP SuccessFactors Employee Central customer and are interested in our joining the early adopter care program or learning more about the new Benefits enrollment experience, please send me an email at <A class="" href="mailto:simar.kaur@sap.com" target="_self" rel="nofollow noopener noreferrer">simar.kaur@sap.com</A>.</P><P class="">I look forward to hearing from you!</P> 2024-02-20T23:17:10.887000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/new-asynchronous-export-to-spreadsheet-feature-for-the-multidimensional/ba-p/13619049 New Asynchronous Export to Spreadsheet Feature for the Multidimensional Data Grid Apps 2024-02-27T11:20:25.612000+01:00 Jan-Ole https://community.sap.com/t5/user/viewprofilepage/user-id/1401786 <P>Dear SAP Community,</P><P>In 2021, the <A href="https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/six-reasons-why-web-dynpro-is-better-than-design-studio-in-sap-s-4hana/ba-p/13520602" target="_blank">Web Dynpro Multidimensional Data Grid App replaced</A>&nbsp;the SAP Design Studio app as default reporting tool for drill-down reporting in SAP S/4HANA.</P><P><BR />Initially designed for human interaction, this web application offers an export feature that has been continuously improved and streamlined over time:</P><UL><LI>Export of PDF files</LI><LI>Streamlining of export to improve performance</LI><LI>Google workspace integration with the possibility to export spreadsheets to Google directly</LI><LI>etc.</LI></UL><P>However, there always was the possibility that the amount of data cells simply was too large, and the system would run out of memory, or into a timeout. SAP Note&nbsp;<A href="https://me.sap.com/notes/0002547776" target="_blank" rel="noopener noreferrer">2547776</A> introduced a popup message that warned a user of these risks in case more than 100.000 cells would be exported.</P><P>Now the next step in terms of performance optimization has been taken by offering to export large amounts of data in a background task. Furthermore, the user can trigger the export in the background (see Figure 1), and continue working in the application without having to wait until the export has finished, with or without the application still alive and running.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 1: “Export to Spreadsheet” popup with a new function to trigger the export in the background." style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/71086i051BF28942404AB0/image-size/medium?v=v2&amp;px=400" role="button" title="JanOle_0-1708943178529.png" alt="Figure 1: “Export to Spreadsheet” popup with a new function to trigger the export in the background." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 1: “Export to Spreadsheet” popup with a new function to trigger the export in the background.</span></span></P><P>&nbsp;</P><P>Once the background task has finished, if the application that has triggered it is still running, the user is informed of the success (or failure) of the export. The exported file is then available for download for the next 72 hours. Expired files will be deleted automatically from the database table.</P><P>The files can be accessed either in a new tab “Downloads” (e.g. in the generic FPM_BICS_OVP apps), or in a dialog window that can be accessed via the download button choice for applications that do not offer the new tab directly (see Figure 2). In both cases, the same component is used, and the layout is the same.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Figure 2: List of downloads to monitor the status and access the result of the asynchronous exports." style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/71087i3E7C09909947AE62/image-size/large?v=v2&amp;px=999" role="button" title="JanOle_1-1708943178533.png" alt="Figure 2: List of downloads to monitor the status and access the result of the asynchronous exports." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 2: List of downloads to monitor the status and access the result of the asynchronous exports.</span></span></P><P>In the list of downloads in this example, the first file “export.xlsx” already has been exported successfully, while the second file “demo_export” is currently being exported. Download is possible only for successfully exported files, while deletion is possible also for entries where the export has failed or is currently in progress. However, deleting an unfinished export does not abort the background process.</P><P>During a single user session, only one background export can be executed at any given time. If you start an export in background while there is still another process running, the new process will not be started, and an error message will be displayed.</P><P>It should be noted that this does not mean that unlimited amounts of data can be exported from the grid now. There are still scenarios where the amount of data required to export a file is outside the boundaries of memory allocation for a work process. This depends not only on the number of cells in the grid, but also on their (conditional) formatting and merging, variables, and filters, down to the definition of the query and the used database tables. Even the database technology may have an influence on how much data can be processed at once.</P><P>The feature is available with SAP Note <A href="https://me.sap.com/notes/0003427386" target="_blank" rel="noopener noreferrer">3427386</A> for SAP_BW 757 and 758, and SAP Note <A href="https://me.sap.com/notes/0003434831" target="_blank" rel="noopener noreferrer">3434831</A> for BW/4HANA 400, and it is planned to be contained in the 2408 updates of SAP S/4HANA Cloud Public Edition and SAP BW/4HANA Cloud Public Edition.<BR /><EM>[A previous version of this blog stated that it will be contained in the 2408 update. Since this is current state of planning and may be changed by SAP at any time without notice, the wording has been adopted.]</EM></P><P>With this new feature, you can more easily export data from a Multidimensional Data Grid Apps <SPAN>without blocking the application and reduce the risk of running into error situations.</SPAN></P> 2024-02-27T11:20:25.612000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/sap-fiori-for-sap-s-4hana-empowering-your-homepage-enabling-my-home-for-sap/ba-p/13672904 SAP Fiori for SAP S/4HANA - Empowering Your Homepage: Enabling My Home for SAP S/4HANA 2023 FPS01 2024-04-26T11:34:59.906000+02:00 Setu_Saxena https://community.sap.com/t5/user/viewprofilepage/user-id/1414456 <P>Good news! The new <EM><STRONG>My Home</STRONG></EM>&nbsp;page is finally available with the SAP S/4HANA Private Cloud Edition (and on-premise) solution with the SAP S/4HANA 2023 FPS01 release. So it’s time to explore more about the sections and features that it contains.<BR /><BR />The new <EM><STRONG>My Home </STRONG></EM>is like your personal command center for work. It provides you with a super easy way to find all the important information that you need to get your job done faster. With the new <EM><STRONG>My Home </STRONG></EM>entry page, you can keep track of your tasks and situations, check out key insights via analytical tiles and cards, and you can access your favorite pages and apps from any device. It offers a space of your own space with enhanced personalization capabilities and a better user experience! Plus, it builds on the features of the SAP Fiori Launchpad, using spaces and pages to make everything run smoothly.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="New My Home available with SAP S/4HANA 2023 FPS01" style="width: 770px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98517iB16901D6C2D637D9/image-size/large?v=v2&amp;px=999" role="button" title="My_Home_RIGpng.png" alt="New My Home available with SAP S/4HANA 2023 FPS01" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">New My Home available with SAP S/4HANA 2023 FPS01</span></span></P><P>&nbsp;</P><P>As a part of this blog post, you will:</P><UL><LI>Get familiar with the <STRONG>structure of the new <EM>My Home</EM></STRONG></LI><LI>Explore the various <STRONG>building blocks / technical components</STRONG> necessary for My Home</LI><LI>Learn <STRONG>how to enable</STRONG> My Home functionality step-by-step</LI><LI>Discover <STRONG>how to assign</STRONG> My Home to your business users&nbsp;</LI></UL><P>If you are interested in learning about the features and functionality about the new <STRONG><EM>My Home in SAP S/4HANA</EM> </STRONG>from an end user's perspective, you are recommended to refer to this blog from Thomas Reiss <A href="https://community.sap.com/t5/technology-blogs-by-sap/user-experience-advances-with-sap-s-4hana-2023-fps01-private-cloud-and-on/ba-p/13634354" target="_blank">User Experience Advances with SAP S/4HANA 2023 FPS01 (Private Cloud and On-Premise)</A><U>.</U></P><P><FONT color="#FF0000"><STRONG>IMPORTANT</STRONG> </FONT>: Please keep in mind that to enable My Home on SAP S/4HANA 2023 (as of March 2024), you need to have at least the first feature pack stack installed for this product version, that is SAP S/4HANA 2023 FPS01.</P><P><FONT color="#FF0000"><STRONG>IMPORTANT</STRONG> </FONT>: In this blog post, for brevity, the abbreviation FLP = Fiori launchpad and My Home = <EM>My Home</EM> in SAP S/4HANA.&nbsp;</P><H1 id="toc-hId-863447535">&nbsp;</H1><H1 id="toc-hId-666934030"><FONT color="#000080">Structure of the <STRONG>My Home - main components</STRONG></FONT></H1><P>Let’s get started by understanding its structure and components briefly before we deep dive into configurations and the other technicalities.</P><P>The standard entry page contains the following sections and functionality.<BR /><BR /></P><TABLE width="100%"><TBODY><TR><TD width="4%"><STRONG>#</STRONG></TD><TD width="8%"><STRONG>Section</STRONG></TD><TD width="88%"><STRONG>Functionality</STRONG></TD></TR><TR><TD width="4%"><P>1</P></TD><TD width="8%"><P>To-Dos</P></TD><TD width="88%"><P>This section contains two parts:</P><OL><LI><STRONG>Tasks</STRONG> - That are populated from the <SPAN><A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F0862')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Inbox</STRONG></A></SPAN> App<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img_table_1_todo.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98467i05D91E2B0531EFCE/image-size/large?v=v2&amp;px=999" role="button" title="Img_table_1_todo.png" alt="Img_table_1_todo.png" /></span></LI><LI><STRONG>&nbsp;Situations</STRONG> - That are populated from the <SPAN><A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F4154')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Situations</STRONG></A></SPAN> App<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img_table_2_todo.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98468i9A29AEC1A95718B6/image-size/large?v=v2&amp;px=999" role="button" title="Img_table_2_todo.png" alt="Img_table_2_todo.png" /></span><BR /><STRONG>Note</STRONG>: At the time of writing the blog, the <A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F4537')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Situations Extended</STRONG></A> App was not integrated with the view</LI></OL><P>You also have an option (depending upon your release) to either see a contact card or to directly send an email to the concerned Task Owner or Situation Owner from the Task / Situation tiles.</P></TD></TR><TR><TD width="4%"><P>2</P></TD><TD width="8%"><P>Pages</P></TD><TD width="88%"><P>This section can be personalized by the user with their favorite Launchpad Pages. However, at the beginning (without any user personalization) it shows up to the first 8 pages that are assigned to the user.<BR />For these 8 Pages, you see 8 different colors which are assigned automatically from the color palette.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_3_Pages.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98492iE28A0A0D8BC3F071/image-size/large?v=v2&amp;px=999" role="button" title="img_table_3_Pages.png" alt="img_table_3_Pages.png" /></span><BR />Each colored Page would have a title and a subtitle that corresponds to the Page title and Space title respectively from the Page they belong.</P><P>In case both the Space and Page titles are the same, you would just see a title without any subtitle. For example the <STRONG>Fiori Launchpad</STRONG> page in the below screenshot.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img_table_4_pages_highlight.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98506i2FED99109063DC15/image-size/large?v=v2&amp;px=999" role="button" title="Img_table_4_pages_highlight.png" alt="Img_table_4_pages_highlight.png" /></span></P></TD></TR><TR><TD width="4%"><P>3</P></TD><TD width="8%"><P>Apps</P></TD><TD width="88%"><P>This section is comprised of the following parts:</P><OL><LI><STRONG>Favorites</STRONG>- Under this tab, you can add Tiles from various other Spaces and Pages.&nbsp; You can also group these applications together under a custom group with a custom name. For example, the group <STRONG>My Sales Analytics</STRONG> in the following screenshot is a customized app group.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_5_favt.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98507i5126BBF6D3E1025E/image-size/large?v=v2&amp;px=999" role="button" title="img_table_5_favt.png" alt="img_table_5_favt.png" /></span><BR />If you navigate to a page from the&nbsp;<STRONG>Pages</STRONG> section (of <STRONG>My Home</STRONG>) described above and you add a tile as a favorite (from <STRONG>User Action Menu</STRONG> --&gt; <STRONG>Edit current Page</STRONG>, and from a tile menu --&gt;<STRONG> Add to My Home</STRONG>). You will see that the app gets added to the favorites tab, with the same color as the original Page.<BR /><BR />For example <STRONG>Manage Sales Order</STRONG>, <STRONG>My Inbox</STRONG> and <STRONG>Sales Order Fulfillment</STRONG> apps in the following screenshot were added via&nbsp;<STRONG>Overview – Internal Sales</STRONG> Page,<STRONG> Manage Sales Quotation</STRONG>, <STRONG>Manage Credit Memo Requests</STRONG>, and <STRONG>Manage Debit Memo Requests</STRONG> from <STRONG>Sales Processing – Internal Sales</STRONG> and so on.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_5_favt_crosswire.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98508i570F28013AA9F365/image-size/large?v=v2&amp;px=999" role="button" title="img_table_5_favt_crosswire.png" alt="img_table_5_favt_crosswire.png" /></span><BR />However, If you perform the same action on any other page (other than these 8 colored pages, from the <STRONG>Pages</STRONG> section), the app that you mark as a favorite is displayed in a random color that can be customized by the end user.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_5_favt_color_selector.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98509i922E51F3184ACBBC/image-size/large?v=v2&amp;px=999" role="button" title="img_table_5_favt_color_selector.png" alt="img_table_5_favt_color_selector.png" /></span><BR />You can also add an App tile via the <STRONG>App Finder </STRONG>(by choosing the <STRONG>My Home</STRONG> Page under <STRONG>My Home</STRONG> space), and if that application is not a part of your favorite pages, then a random color is applied to the marked favorite App, which is usually the grey color. For example,&nbsp;<STRONG>Manage Workflows</STRONG> App in the following screenshot is grey in color.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_5_default_color.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98510iC4986FF4151A3CF9/image-size/large?v=v2&amp;px=999" role="button" title="img_table_5_default_color.png" alt="img_table_5_default_color.png" /></span></LI><LI><STRONG>Most Used</STRONG> - This list gets populated from the system and is based on the most used applications in terms of their frequency.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_6_most_used.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98511i9B069F9810474A19/image-size/large?v=v2&amp;px=999" role="button" title="img_table_6_most_used.png" alt="img_table_6_most_used.png" /></span><BR /><STRONG>Note</STRONG> : For the Most Used and Recent Used tabs to appear, the business users must enable <A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/a7b390faab1140c087b8926571e942b7/5bc5a24e86a14feea5f2d223d4abf1a4.html" target="_blank" rel="noopener noreferrer">User Activities</A> tracking in their Fiori launchpad &gt; User Actions &gt; Settings dialog.&nbsp;</LI><LI><STRONG>Recently Used</STRONG> - This list gets populated from the system and is based on the recently used apps (i.e., based on a descending timestamp order).<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_7_recenetly_used.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98512i7C1A75F4B1C05CAA/image-size/large?v=v2&amp;px=999" role="button" title="img_table_7_recenetly_used.png" alt="img_table_7_recenetly_used.png" /></span><BR />One very cool feature supported by the <STRONG>Recently Used</STRONG> tab support is the "<STRONG>Resume Last Activity</STRONG>" option, where you can return to the same application state (i.e., same filters variants, same table variants etc.) from where you last left the application.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_7_resume_last_activity.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98513i3199EF12917F0185/image-size/large?v=v2&amp;px=999" role="button" title="img_table_7_resume_last_activity.png" alt="img_table_7_resume_last_activity.png" /></span></LI></OL></TD></TR><TR><TD width="4%"><P>4</P></TD><TD width="8%"><P>Insights</P></TD><TD width="88%"><P>This comprises of two parts (which while populated, splits up into two different sections):</P><OL><LI><STRONG>Insights Tiles</STRONG>: You can use the <STRONG>Add Tiles</STRONG> option from the Insights section to add <STRONG>Dynamic</STRONG> tiles as your content.<BR />The system would typically propose Dynamic Tiles (such as KPI tiles) as a part of this section. However, just like other areas, you could jump to <STRONG>App Finder</STRONG> and include any tile here). The primary purpose of this section is to place analytical tile content in it for quick insights.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_8_insight_tiles.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98514i2718AD2BCDE3D4E1/image-size/large?v=v2&amp;px=999" role="button" title="img_table_8_insight_tiles.png" alt="img_table_8_insight_tiles.png" /></span></LI><LI><STRONG>Insights Cards</STRONG>: Here you can add cards from SAP Fiori Elements based Overview Pages(OVP) and List/Table cards from List Reports(LR) and charts from Analytical List Pages(ALP).<BR />You also have options to add filters and change the chart type of the standard content while adding them from an OVP / LR / ALP page.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="img_table_9_insight_cards.png" style="width: 100%px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98515i66C3568B3CC5698C/image-size/large?v=v2&amp;px=999" role="button" title="img_table_9_insight_cards.png" alt="img_table_9_insight_cards.png" /></span></LI></OL></TD></TR></TBODY></TABLE><H1 id="toc-hId-470420525">&nbsp;</H1><H1 id="toc-hId-273907020">&nbsp;</H1><H1 id="toc-hId-77393515"><FONT color="#000080">My Home - Building Blocks and Technical Components</FONT></H1><P>Now that you are familiar with a basic structure of <STRONG>My Home</STRONG>, let's look at some of the technical components involved as part of it.<SPAN><BR /><BR /></SPAN></P><OL><LI><STRONG>Spaces and Pages Layout:&nbsp; </STRONG>This entry page is based on the Spaces and Pages layout, which is a must to enable the <EM><STRONG>My Home</STRONG> </EM>capability.</LI><LI><STRONG>SAPUI5 Home Component</STRONG>: Available as a part of SAP FIORI FES FOR S/4HANA 2023 FPS01 (SAP S/4HANA 2023 FPS01), This component contains the user interface for <EM><STRONG>My Home in SAP S/4HANA</STRONG></EM>. Just like other UI5 applications, this is based on a BSP application (a SAPUI5 Component) <STRONG>PRODUCT_HOMES1</STRONG>.</LI><LI><STRONG>SAP Fiori Launchpad Configuration</STRONG> : By default the <STRONG>My Home</STRONG> is disabled in S/4HANA 2023 FPS01 and you need to do some Fiori Launchpad configurations using <SPAN><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/a7b390faab1140c087b8926571e942b7/6107ee41f89a43c9af0aa279fe039cca.html" target="_blank" rel="noopener noreferrer">Launchpad Configuration Parameters</A></SPAN> in order to enable <EM>My Home in SAP S/4HANA</EM>.</LI><LI><STRONG>Required App Authorizations</STRONG>: The <STRONG>To-Dos</STRONG> section only displays the <STRONG>Tasks</STRONG> and <STRONG>Situations</STRONG> if you have the target mappings for the&nbsp;<SPAN><A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F0862')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Inbox</STRONG></A></SPAN> App and the&nbsp;<SPAN><A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F4154')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Situations</STRONG></A></SPAN> App assigned to the Fiori User (i.e. if you have authorizations to access these applications)</LI><LI>Various <STRONG>OData Services</STRONG> involved: The following table summarizes various OData services required to use the<STRONG> My Home in SAP S/4HANA</STRONG>, based on its various components.</LI></OL><TABLE width="100%"><TBODY><TR><TD width="3%"><P><STRONG>#</STRONG></P></TD><TD width="9%"><P><STRONG>Section</STRONG></P></TD><TD width="48%"><P><STRONG>OData Service</STRONG></P></TD><TD width="11%"><P><STRONG>OData Version</STRONG></P></TD><TD width="29%"><P><STRONG>Description</STRONG></P></TD></TR><TR><TD width="3%"><P>1</P></TD><TD width="9%"><P>To-Dos</P></TD><TD width="48%"><UL><LI><STRONG>For Tasks</STRONG>:<BR />TASKPROCESSING (Namespace:&nbsp; /IWPGW/ )</LI></UL></TD><TD width="11%"><P>V2</P></TD><TD width="29%"><P>Task Gateway Service, required for My Inbox Tasks</P></TD></TR><TR><TD width="3%"><P>&nbsp;</P></TD><TD width="9%"><P>&nbsp;</P></TD><TD width="48%"><UL><LI><STRONG>For Situations</STRONG> (Standard Situations):<BR />C_SITNMYSITUATION_CDS</LI></UL></TD><TD width="11%"><P>V2</P></TD><TD width="29%"><P>RAP: C_SITNMYSITUATION_CDS, required for Situations</P></TD></TR><TR><TD width="3%"><P>2</P></TD><TD width="9%"><P>Pages</P></TD><TD width="48%"><P>Pages are read as a part of FLP service itself and require no additional OData service.</P><P><BR />For personalization of the pages INTEROP service is used (see point 3)</P></TD><TD width="11%"><P>NA</P></TD><TD width="29%"><P>This should be available by default.</P></TD></TR><TR><TD width="3%"><P>3</P></TD><TD width="9%"><P>Apps</P></TD><TD width="48%"><P>Apps are read via the INTEROP (Namespace: /UI2/)</P></TD><TD width="11%"><P>V2</P></TD><TD width="29%"><P>Gateway Service of Interoperability, required for Personalization (This should also be already active, by default)</P></TD></TR><TR><TD width="3%"><P>4</P></TD><TD width="9%"><P>Insights</P></TD><TD width="48%"><UL><LI><STRONG>For Insights Cards</STRONG>: /UI2/INSIGHTS_CARDS_READ_SRV<BR />(belongs to Service Group /UI2/INSIGHTS_SRV)</LI></UL></TD><TD width="11%"><P>V4</P></TD><TD width="29%"><P>Insights Cards Repository Service Definition, required for reading Insight Cards.</P></TD></TR><TR><TD width="3%"><P>&nbsp;</P></TD><TD width="9%"><P>&nbsp;</P></TD><TD width="48%"><UL><LI><STRONG>For insights Tiles</STRONG>: INTEROP service is used, where the tiles added to this section are stored as users personalization</LI></UL></TD><TD width="11%"><P>V2</P></TD><TD width="29%"><P>This should also be already active, by default</P></TD></TR></TBODY></TABLE><P><STRONG>Note</STRONG>: The other OData services like FDM_PAGE_RUNTIME_SRV, PAGE_BUILDER_PERS, OData v4 /iwngw/notification , ESH_SEARCH_SRV etc. that are required by the FLP, are out of the scope of this blog.</P><P>The Image below summarizes the OData services, Target Mappings and the BSP required:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="NEW_Summary Of Components.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/102324i7EF618C357397088/image-size/large?v=v2&amp;px=999" role="button" title="NEW_Summary Of Components.jpg" alt="NEW_Summary Of Components.jpg" /></span></P><H1 id="toc-hId--119119990">&nbsp;</H1><H1 id="toc-hId--315633495"><FONT color="#000080">How to enable My Home</FONT></H1><P>Now that you have a good understanding of all the basic building blocks of <EM><STRONG>My Home in SAP S/4HANA</STRONG></EM>, let’s get started. After activating the necessary components, you shall also create a Role <STRONG>Z_MY_HOME </STRONG>and add all the relevant authorizations to that.<SPAN><BR /></SPAN></P><P>You would do the <STRONG>My Home</STRONG> enablement in the following 5 steps.</P><UL><LI><STRONG>Step1</STRONG>: Enabling Spaces and Pages Layout</LI><LI><STRONG>Step 2</STRONG>: Activating the My Home UI5 Component</LI><LI><STRONG>Step 3</STRONG>: Activating the required OData V2 and V4 services</LI><LI><STRONG>Step 4</STRONG>: Configuring Launchpad Parameters</LI><LI><STRONG>Step 5</STRONG>: Adding relevant authorizations i.e. Target Mapping and OData Authorizations via a PFCG Role</LI></UL><P>&nbsp;So, let’s get started…</P><H2 id="toc-hId--383064281"><FONT color="#000080"><STRONG>Step 1: Enabling Spaces and Pages Layout</STRONG></FONT></H2><P>The first prerequisite is to check if the Spaces and Pages Layout is already enabled. Please note that the classical Home Page Layout has been already deprecated as of ABAP Platform 2021 and we strongly encourage you to move to the new layout i.e., Spaces and Pages if you haven't.</P><P>To validate the enablement, click on the <STRONG>User Actions Menu</STRONG> (your profile picture icon) --&gt; and then click on <STRONG>Settings</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Img 1. UserAction Menu Settings.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97786i88FF659094F00AFB/image-size/large?v=v2&amp;px=999" role="button" title="Img 1. UserAction Menu Settings.png" alt="Img 1. UserAction Menu Settings.png" /></span></P><P>&nbsp;</P><P>On the <STRONG>Settings</STRONG> Dialog, you would find a menu option <STRONG>Spaces and Pages</STRONG>. If you see this menu, the new layout is already configured. Click on it, to reveal the Spaces and Pages settings. Ensure that you have both the <STRONG>Use Spaces</STRONG> and <STRONG>Show My Home </STRONG>check boxes enabled, as shown below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Img3_RIG_Spaces_Pages.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97882iC9E75596555E3B11/image-size/large?v=v2&amp;px=999" role="button" title="Img3_RIG_Spaces_Pages.png" alt="Img3_RIG_Spaces_Pages.png" /></span></P><P><SPAN>If you see this&nbsp;</SPAN><STRONG>Spaces and Pages</STRONG><SPAN> menu option, you can </SPAN><STRONG>skip this step</STRONG><SPAN> and move to the next one after checking both the boxes and clicking on </SPAN><STRONG>Save</STRONG><SPAN>.</SPAN></P><P>If in case you <STRONG>DO NOT</STRONG> see the&nbsp;<STRONG>Spaces and Pages&nbsp;</STRONG>menu option&nbsp;at all, and instead you only see the&nbsp;<STRONG>Home Page </STRONG>menu option (as shown in the following screenshot)<STRONG>, </STRONG>you must activate and configure the new Spaces and Pages Layout.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Img4_RIG_Home_Settings.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97883iA1F40FA5D0646856/image-size/large?v=v2&amp;px=999" role="button" title="Img4_RIG_Home_Settings.png" alt="Img4_RIG_Home_Settings.png" /></span></P><P>To activate the new <STRONG>Spaces and Pages</STRONG> Layout use the following steps.</P><OL><LI>Navigate to the transaction <STRONG>STC01</STRONG> (Task Manager for Technical Configuration).<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img3. Task List Tcode.png" style="width: 987px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97797iE27973ED5552C535/image-dimensions/987x120?v=v2" width="987" height="120" role="button" title="Img3. Task List Tcode.png" alt="Img3. Task List Tcode.png" /></span></LI><LI>Enter the Task List name as <STRONG>SAP_FIORI_FOUNDATION_S4</STRONG> (which is used to activate Fiori foundation) and click on the <STRONG>Generate Task List Run (F8)</STRONG> button.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Enter Task list name.png" style="width: 988px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97798iA5CC21F997D7DCDA/image-dimensions/988x185?v=v2" width="988" height="185" role="button" title="Enter Task list name.png" alt="Enter Task list name.png" /></span></LI><LI>On the next screen with generated task list, uncheck all the tasks using <STRONG>Skip All Tasks (F7)</STRONG> button and then only Select the task <STRONG>Activate and Configure FLP for Spaces and Pages (/UI2/FLP_CUS_CONF)</STRONG>. You will get an Information popup that the activation step has dependencies on other steps like creating transports, activating services etc., click <STRONG>Continue</STRONG> for all.</LI><LI>Finally, Click on <STRONG>Start/Resume Task List Run In Dialog (F8)</STRONG>.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img4. Task lists select task.png" style="width: 986px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97799iF405EBC6056B02EE/image-dimensions/986x450?v=v2" width="986" height="450" role="button" title="Img4. Task lists select task.png" alt="Img4. Task lists select task.png" /></span><BR /><P>This step is just creating some entries in the /UI2/FLP_CUS_CONF transaction and activating the required OData services, therefore it should typically not take much time to end up in a successful state.</P><P>If in case you are interested in knowing about the entries that it creates in the Launchpad Configuration, below is a screenshot of the customizing.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Effect of task list.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97800iD99E2BACD2CED3EA/image-size/large?v=v2&amp;px=999" role="button" title="Effect of task list.png" alt="Effect of task list.png" /></span></P></LI><LI><P>Once you have performed the configuration mentioned in the previous step, <STRONG>Spaces and Pages</STRONG> menu option becomes available in the Settings dialog (from the <STRONG>User Actions Menu</STRONG>). Check the&nbsp;<STRONG>Use Spaces</STRONG> and <STRONG>Show My Home </STRONG>check boxes as explained above, and you are good to move to the <STRONG>Step 2</STRONG>.</P><SPAN><BR /></SPAN><STRONG>Note</STRONG>: that sometimes you may have to enable these two check boxes one by one, by opening the <STRONG>Settings</STRONG> dialog twice, as the former has a dependency on the latter.</LI></OL><H2 id="toc-hId--579577786">&nbsp;</H2><H2 id="toc-hId--776091291"><FONT color="#000080"><STRONG>Step 2: Activating the My Home UI5 Component </STRONG></FONT></H2><P>After ensuring that you have the Spaces and Pages Layout enabled for our Launchpad, you can move on to the next steps of activating the services that are required to enable <EM><STRONG>My Home in SAP S/4HANA</STRONG></EM>. You first start with activating the UI5 component for My Home i.e., the BSP application.</P><P>The standard SAPUI5 component that is available for the My Home (shipped with S/4HANA2023 FPS01) has its component id as <STRONG>ux.eng.s4producthomes1</STRONG> and the BSP name is&nbsp;<STRONG>PRODUCT_HOMES1</STRONG>.</P><OL><LI>To activate the ICF Node, go to the transaction code <STRONG>SICF</STRONG>, Enter the BSP name <STRONG>PRODUCT_HOMES1</STRONG> (which is also the ICF Node name) in the field <STRONG>Service Name </STRONG>and click&nbsp;<STRONG>Execute.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img5_RIG_SICF_BSP_ACTIVATE.png" style="width: 987px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98063i6B5DB9E56EE3C192/image-dimensions/987x517?v=v2" width="987" height="517" role="button" title="Img5_RIG_SICF_BSP_ACTIVATE.png" alt="Img5_RIG_SICF_BSP_ACTIVATE.png" /></span><BR /></STRONG></LI><LI>Right click on the service node and click&nbsp;<STRONG>Activate Service</STRONG>. Select the first <STRONG>Yes</STRONG> button on the confirmation dialog.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img6_RIG_Activate_ICF_NODe.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98093iF6DCEF3255DA89A4/image-size/large?v=v2&amp;px=999" role="button" title="Img6_RIG_Activate_ICF_NODe.png" alt="Img6_RIG_Activate_ICF_NODe.png" /></span></LI></OL><H2 id="toc-hId--625350439">&nbsp;</H2><H2 id="toc-hId--821863944"><FONT color="#000080"><STRONG>Step 3: Activating the required OData V2 and V4 <FONT color="#000080">services</FONT></STRONG></FONT></H2><P>After the BSP, it's time for you to activate the Back-end services of the <EM><STRONG>My Home</STRONG></EM>&nbsp;entry page i.e., the required OData services.&nbsp;</P><P>As a part of this step, you will activate the following OData services, that have been described above:</P><UL><LI><STRONG>TASKPROCESSING</STRONG>&nbsp; (namespace /IWPGW/) for My Inbox</LI><LI><STRONG>C_SITNMYSITUATION_CDS</STRONG> - for My Situations (Standard only supported for now)</LI><LI><STRONG>INTEROP</STRONG> - for personalization service. (But don’t worry too much about this, as it is always available with the basic launchpad setup).</LI><LI>&nbsp;<STRONG>/UI2/INSIGHTS_CARDS_READ_SRV</STRONG> - (Service Group /UI2/INSIGHTS_SRV) for viewing the Insights Cards</LI></UL><P>Typically for an OData V2, the transaction <STRONG>/n/IWFND/MAINT_SERVICE </STRONG>(<SPAN><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/cc0c305d2fab47bd808adcad3ca7ee9d/1b023c1cad774eeb8b85b25c86d94f87.html" target="_blank" rel="noopener noreferrer">help doc</A></SPAN>) is used, and to publish an OData V4 service, we use <STRONG>/n/IWFND/V4_ADMIN </STRONG>(<SPAN><A href="https://help.sap.com/docs/SAP_NETWEAVER_AS_ABAP_752/68bf513362174d54b58cddec28794093/97abd231f89a40169aaaad017439531e.html" target="_blank" rel="noopener noreferrer">help doc</A></SPAN>).</P><P>Refer to: the section&nbsp;<A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/cc0c305d2fab47bd808adcad3ca7ee9d/1b023c1cad774eeb8b85b25c86d94f87.html" target="_self" rel="noopener noreferrer">Activate OData Service in the SAP Gateway Hub</A> in the&nbsp;<STRONG>ABAP Programming Model for SAP Fiori</STRONG> guide.</P><P>However, since these OData services are also Fiori foundation services. This task of OData service activation can be done by using the task lists <STRONG>SAP_FIORI_LAUNCHPAD_INIT_SETUP</STRONG> and <STRONG>SAP_FIORI_FOUNDATION_S4</STRONG>.</P><P>But before you go ahead and activate these services, let's do a quick test to validate if they are already active on your system. In order to do so, use the following 4 URLS</P><UL><LI><STRONG>TASKPROCESSING</STRONG>&nbsp; (namespace /IWPGW/) <SPAN><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer">https://<STRONG><FONT color="#993300">hostname:portnumber</FONT></STRONG>/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata</A></SPAN></LI><LI><STRONG>C_SITNMYSITUATION_CDS</STRONG> - <SPAN><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer">https://</A><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer"><STRONG><FONT color="#993300">hostname:portnumber</FONT></STRONG></A>/<A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/sap/C_SITNMYSITUATION_CDS/$metadata" target="_blank" rel="noopener nofollow noreferrer">sap/opu/odata/sap/C_SITNMYSITUATION_CDS/$metadata</A></SPAN></LI><LI><STRONG>INTEROP</STRONG> - <SPAN><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer">https://</A><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer"><STRONG><FONT color="#993300">hostname:portnumber</FONT></STRONG></A>/<A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/UI2/INTEROP/$metadata" target="_blank" rel="noopener nofollow noreferrer">sap/opu/odata/UI2/INTEROP/$metadata</A></SPAN></LI><LI>&nbsp;<STRONG>/UI2/INSIGHTS_CARDS_READ_SRV</STRONG> - <SPAN><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer">https://</A><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer"><STRONG><FONT color="#993300">hostname:portnumber</FONT></STRONG></A>/<A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata4/ui2/insights_srv/srvd/ui2/insights_cards_read_srv/0001/$metadata" target="_blank" rel="noopener nofollow noreferrer">sap/opu/odata4/ui2/insights_srv/srvd/ui2/insights_cards_read_srv/0001/$metadata</A></SPAN></LI></UL><P><FONT color="#FF0000"><STRONG>IMPORTANT</STRONG></FONT>: Replace the <STRONG><FONT color="#800000">hostname</FONT></STRONG> and <STRONG><FONT color="#800000">portnumber</FONT> </STRONG>with your application server from your FLP URL.<SPAN><BR /></SPAN>For example, if your FLP URL is <SPAN><A href="https://mydummycompany:443/sap/bc/ui2/flp?sap-client=100&amp;sap-language=EN#Shell-home" target="_blank" rel="noopener nofollow noreferrer">https://<STRONG><FONT color="#003300">mydummycompany:443</FONT></STRONG>/sap/bc/ui2/flp?sap-client=100&amp;sap-language=EN#Shell-home</A></SPAN> the first link becomes <SPAN><A href="https://2023fps01-sandbox.s4hana.only.sap:44301/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata" target="_blank" rel="noopener nofollow noreferrer">&nbsp;https://</A><A href="https://mydummycompany:443/sap/bc/ui2/flp?sap-client=100&amp;sap-language=EN#Shell-home" target="_blank" rel="noopener nofollow noreferrer"><STRONG><FONT color="#003300">mydummycompany:443</FONT></STRONG></A>/sap/opu/odata/IWPGW/TASKPROCESSING;mo;v=2/$metadata</SPAN></P><P>If a service is active, you will see an XML returned with entities in its response. The response would start with <STRONG>&lt;edmx: Edmx xmlns</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img7_RIG_SUCCESS.png" style="width: 985px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98124iE3A115937E65CDC1/image-dimensions/985x146?v=v2" width="985" height="146" role="button" title="Img7_RIG_SUCCESS.png" alt="Img7_RIG_SUCCESS.png" /></span></P><P>However, if a service is inactive, you will see an error. The response in this case, would start with <STRONG>&lt;error xmlns</STRONG>.<STRONG><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img8_RIG_Error.png" style="width: 988px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98125iEC25E33A36DD5ED8/image-dimensions/988x163?v=v2" width="988" height="163" role="button" title="Img8_RIG_Error.png" alt="Img8_RIG_Error.png" /></span><BR /></STRONG></P><P>In case you find all the services to be active, please skip this step and move to Step 4. <SPAN><BR /></SPAN>However, if you find some URLs are returning error code, follow the bellow mentioned steps based on the services that don’t work.</P><P>Now let's take a step-by-step look at how you can activate these services in case if they are not active on your SAP S/4HANA system.<SPAN><BR /></SPAN></P><OL><LI><STRONG>TASKPROCESSING</STRONG>: Task Processing is an OData V2 service related to the <SPAN><A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F0862')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Inbox</STRONG></A>&nbsp;</SPAN>Application. And this service requires some additional customizing. <SPAN><BR /></SPAN>Refer to SAP Notes <SPAN><A href="https://me.sap.com/notes/2676990" target="_blank" rel="noopener noreferrer">2676990 - Release Information note for SAP Fiori My Inbox</A></SPAN> and <SPAN><A href="https://me.sap.com/notes/2424054" target="_blank" rel="noopener noreferrer">2424054</A></SPAN> for more info on How to setup the My Inbox app.</LI><LI><STRONG>C_SITNMYSITUATION_CDS: </STRONG>This is an OData V2 service and must be activated via the transaction /IWFND/MAINT_SERVICE. Follow the steps mentioned in the SAP Help doc :&nbsp; <SPAN><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/cc0c305d2fab47bd808adcad3ca7ee9d/1b023c1cad774eeb8b85b25c86d94f87.html" target="_blank" rel="noopener noreferrer">Activate OData Service in the SAP Gateway Hub</A></SPAN> to activate the OData service.</LI><LI><STRONG>INTEROP</STRONG>: As mentioned above, this should be already up and running for you as it’s a part of the Launchpad itself. <SPAN><BR /></SPAN>However, in case you still do not see this, please ensure that you run the task list <STRONG>SAP_FIORI_LAUNCHPAD_INIT_SETUP</STRONG> to verify the launchpad configurations and the Task '<STRONG>Activate Gateway OData Services for Launchpad (/IWFND/MAINT_SERVICE)</STRONG>' should take care of activating this service.</LI><LI><STRONG>/UI2/INSIGHTS_CARDS_READ_SRV: </STRONG>This OData&nbsp;V4 service is a part of Service group <STRONG>/UI2/INSIGHTS_SRV</STRONG>, which is published via the Task <STRONG>Publish Service Groups Foundation (/IWFND/V4_ADMIN)</STRONG> of the Foundation Task list <STRONG>SAP_FIORI_FOUNDATION_S4.</STRONG></LI></OL><P><STRONG><U>Note</U></STRONG> : For <STRONG>INTEROP</STRONG> and <STRONG>/UI2/INSIGHTS_CARDS_READ_SRV</STRONG>, In case if you have never run the task list before, please refer to the Step 1, where we explained the steps required to execute a single task <STRONG>Activate and Configure FLP for Spaces and Pages (/UI2/FLP_CUS_CONF) </STRONG>of the task list <STRONG>SAP_FIORI_FOUNDATION_S4</STRONG>.<BR />Repeat the same steps for your desired task in the desired task list.</P><H2 id="toc-hId--1018377449">&nbsp;</H2><H2 id="toc-hId--1214890954"><FONT color="#000080"><STRONG>Step 4: Configuring Launchpad Parameters</STRONG></FONT></H2><P>After ensuring that all the underlying services required to run the <STRONG>My Home</STRONG> are in place, it’s time to configure the Launchpad Configuration Parameters.</P><UL><LI><STRONG>SPACES</STRONG></LI><LI><STRONG>SPACES_MYHOME</STRONG></LI><LI>SPACES_CUSTOM_HOME</LI><LI>SPACES_CUSTOM_HOME_COMPONENT_ID</LI><LI>UI5_INSIGHTS</LI></UL><P>The first two parameters should be already in place. In case if you don’t find them, please execute the task <STRONG>Activate and Configure FLP for Spaces and Pages (/UI2/FLP_CUS_CONF) </STRONG>of the task list <STRONG>SAP_FIORI_FOUNDATION_S4 </STRONG>as described in the Step 1.</P><P>To maintain the other configuration parameters, process as following.</P><OL><LI>Navigate to the transaction code <STRONG>/UI2/FLP_CUS_CONF</STRONG> (Client Specific Launchpad Configuration Settings), and click on <STRONG>New Entries</STRONG>.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img9_RIG_New_Entries_FLP_CONFIG.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98164iEBAA12D33E373272/image-size/large?v=v2&amp;px=999" role="button" title="Img9_RIG_New_Entries_FLP_CONFIG.png" alt="Img9_RIG_New_Entries_FLP_CONFIG.png" /></span></LI><LI>To enable the <EM><STRONG>My Home</STRONG></EM>, you must use the FLP config parameters: <STRONG>SPACES_CUSTOM_HOME</STRONG> and <STRONG>SPACES_CUSTOM_HOME_COMPONENT_ID</STRONG>.<BR />The former parameter is used to declare that you have a custom home page to be enabled and the latter parameter is used to provide the component info (a SAPUI5 Component) for this custom home page. This is same UI5 Component which you activated as a part of Step 2 , i.e., <STRONG>ux.eng.s4producthomes1</STRONG><SPAN> having the BSP name as </SPAN><STRONG>PRODUCT_HOMES1</STRONG><SPAN>.</SPAN><P>This <STRONG>My Home</STRONG> SAPUI5 component delivered by SAP also requires an FLP configuration parameter which would be used to enable the Insights Cards i.e., <STRONG>UI5_INSIGHTS</STRONG>.</P><P>Enter the following values on the "<STRONG>New Entries: Overview of Added Entries</STRONG>" screen, that opened after clicking&nbsp;<STRONG>New Entries</STRONG>. Then click <STRONG>Save</STRONG>.</P><TABLE width="75%"><TBODY><TR><TD width="50%"><P><STRONG>Launchpad Property ID</STRONG></P></TD><TD width="50%"><P><STRONG>Property Value</STRONG></P></TD></TR><TR><TD width="50%"><P>SPACES_CUSTOM_HOME</P></TD><TD width="50%"><P>true</P></TD></TR><TR><TD width="50%"><P>SPACES_CUSTOM_HOME_COMPONENT_ID</P></TD><TD width="50%"><P>ux.eng.s4producthomes1</P></TD></TR><TR><TD width="50%"><P>UI5_INSIGHTS</P></TD><TD width="50%"><P>true</P></TD></TR></TBODY></TABLE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img10_RIG_Config_Param.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98165iB080BEFC1751D420/image-size/large?v=v2&amp;px=999" role="button" title="Img10_RIG_Config_Param.png" alt="Img10_RIG_Config_Param.png" /></span><BR /><BR />After creating these 3 new entries, confirm that you have all the 5 configuration parameters (including <STRONG>SPACES</STRONG> and <STRONG>SPACES_MYHOME</STRONG>) setup correctly.</P></LI></OL><H2 id="toc-hId--1411404459">&nbsp;</H2><H2 id="toc-hId--1607917964"><FONT color="#000080"><STRONG>Step 5: Adding relevant authorizations i.e., Target Mapping and OData Authorizations via a PFCG Role </STRONG></FONT></H2><P>This is the final step and as a part of this process, you will include authorizations to these <STRONG>My Home</STRONG> building blocks (including the OData services and the Target Mapping) to a PFCG Role that will be used to provide complete access to My Home to users.</P><OL><LI>Navigate to transaction PFCG, enter a role name, for example <STRONG>Z_MY_HOME</STRONG> and click on the Create <STRONG>Single Role</STRONG> button.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img11_RIG_PFCG.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98427i87D79C179AF9A563/image-size/large?v=v2&amp;px=999" role="button" title="Img11_RIG_PFCG.png" alt="Img11_RIG_PFCG.png" /></span></LI><LI>Document the role description and click on the <STRONG>Menu</STRONG> tab. Save the role if prompted. Click on <STRONG>Insert node</STRONG> button and choose <STRONG>Authorizations Default</STRONG>.<BR /><BR />Now you will add the authorizations for the above-discussed OData services to this role.<UL><LI><STRONG>TASKPROCESSING</STRONG>&nbsp; (namespace /IWPGW/) for My Inbox</LI><LI><STRONG>C_SITNMYSITUATION_CDS</STRONG> - for My Situations (Standard only supported for now)</LI><LI><STRONG>INTEROP</STRONG> - for personalization service. (But don’t worry too much about this as it is always available with the basic role required to run the launchpad ex SAP_FLP_USER or classical SAP_UI2_USER_700 ).</LI><LI><STRONG>/UI2/INSIGHTS_CARDS_READ_SRV</STRONG> (Service Group <STRONG>/UI2/INSIGHTS_SRV</STRONG>)</LI></UL><P>Start by adding the OData V2 services by using the menu<STRONG> Insert Node</STRONG> --&gt; <STRONG>Authorization Default<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img12_RIG_document_role.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98429i7BD7F688A87868D5/image-size/large?v=v2&amp;px=999" role="button" title="Img12_RIG_document_role.png" alt="Img12_RIG_document_role.png" /></span><BR /></STRONG></P></LI><LI>Choose the option <STRONG>SAP Gateway Business Suite Enablement - Service</STRONG> from the <STRONG>Authorization Default</STRONG> drop down. Use the value help to add TASKPROCESSING V2 Service to the same.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img13_RIG_TASKPROCESSING.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98430i74938B9D37B957FD/image-size/large?v=v2&amp;px=999" role="button" title="Img13_RIG_TASKPROCESSING.png" alt="Img13_RIG_TASKPROCESSING.png" /></span><BR /><P>Although you just need Version 0002 for <EM><STRONG>My Home</STRONG></EM> to work, you can add both the versions (0001 and 0002) of the service for now. The view of Role Menu should look something like the following screenshot.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2nodesIWSV added.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98433i8C46A26D1B839693/image-size/large?v=v2&amp;px=999" role="button" title="2nodesIWSV added.png" alt="2nodesIWSV added.png" /></span></P></LI><LI>Repeat the steps for menu <STRONG>Insert Node</STRONG> --&gt; <STRONG>Authorization Default</STRONG>, but this time select the <STRONG>Authorization Default</STRONG> type object as <STRONG>Service Gateway: Service Groups Metadata </STRONG>i.e., <STRONG>IWSG</STRONG>, after adding the authorization default, the Role Menu should look something like below.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img15_RIG_before_5.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98448iAC68AD54131A17D0/image-size/large?v=v2&amp;px=999" role="button" title="Img15_RIG_before_5.png" alt="Img15_RIG_before_5.png" /></span></LI><LI>Similarly add the Authorization Defaults for other OData V2 services as well i.e., <STRONG>C_SITNMYSITUATION_CDS </STRONG>and<STRONG> INTEROP.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img15_RIG_after_5.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98447i53349CA8F2E491D6/image-size/large?v=v2&amp;px=999" role="button" title="Img15_RIG_after_5.png" alt="Img15_RIG_after_5.png" /></span><BR /></STRONG></LI><LI>In case of a OData V4 service, the entire service group needs to be authorized. Therefore, for the OData V4 service <STRONG>/UI2/INSIGHTS_CARDS_READ_SRV</STRONG>, you must add the authorizations to Service Group <STRONG>/UI2/INSIGHTS_SRV</STRONG>. <SPAN><BR /></SPAN>This is done by using the menu<STRONG> Insert Node</STRONG> --&gt; <STRONG>Authorization Default </STRONG>and selecting the option <STRONG>SAP Gateway OData V4 Backend Service Group &amp; Assignments.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img15_rig_after 6.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98446i9B59DD001485A277/image-size/large?v=v2&amp;px=999" role="button" title="Img15_rig_after 6.png" alt="Img15_rig_after 6.png" /></span></STRONG><STRONG><STRONG><BR /></STRONG></STRONG><P>After adding the Insights service group, the role menu should appear as the following screenshot.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img15_RIG_just_before_7.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98445iA74F1FCC9645C1A7/image-size/large?v=v2&amp;px=999" role="button" title="Img15_RIG_just_before_7.png" alt="Img15_RIG_just_before_7.png" /></span></P><P>With this step, the backend set up is complete and now must perform the front-end configuration. For this you must provide authorizations to <SPAN><A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F0862')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Inbox</STRONG></A></SPAN> and <SPAN><A href="https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F4154')/S28OP" target="_blank" rel="noopener nofollow noreferrer"><STRONG>My Situations</STRONG></A></SPAN> apps. You can assign these authorizations by creating a <STRONG>Launchpad Catalog</STRONG> and assigning it to your <STRONG>Z_MY_HOME&nbsp;</STRONG>role.</P></LI><LI>Navigate to the <STRONG>SAP Fiori Launchpad Content Manager: Client Specific</STRONG> (transaction /n/UI2/FLPCM_CUST). Click on the <STRONG>Catalogs</STRONG> Tab (that should be preselected) and then click&nbsp;<STRONG>Create.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img16_rig_soon_after_8.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98444i9C99FF22B907A696/image-size/large?v=v2&amp;px=999" role="button" title="Img16_rig_soon_after_8.png" alt="Img16_rig_soon_after_8.png" /></span><BR /></STRONG></LI><LI>Enter a new Catalog ID and title (in the <STRONG>New ID</STRONG> and the&nbsp;<STRONG>New Title</STRONG> fields) and click <STRONG>Continue</STRONG>.Enter a customizing request if prompted for.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img17_RIG_Just before 8.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98443i1BB7576CF53CEF76/image-size/large?v=v2&amp;px=999" role="button" title="Img17_RIG_Just before 8.png" alt="Img17_RIG_Just before 8.png" /></span></LI><LI>Now&nbsp;switch to the <STRONG>Tiles/Target Mappings</STRONG> tab and search for the following two Fiori Apps using their IDs, one by one:<UL><LI>My Inbox: F0862</LI><LI>My Situations: F4154</LI></UL><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img18_RIG_step9.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98450i4B98B773B31EC4F9/image-size/large?v=v2&amp;px=999" role="button" title="Img18_RIG_step9.png" alt="Img18_RIG_step9.png" /></span><BR />After finding the <STRONG>Tile + TM </STRONG><SPAN>for</SPAN><STRONG> My Inbox</STRONG><SPAN>, select the row and click on </SPAN><STRONG>Add TM Reference</STRONG><SPAN> (text: Add Reference to Catalog).<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img17_RIG_Just before 10.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98442i970278A62DFF49A7/image-size/large?v=v2&amp;px=999" role="button" title="Img17_RIG_Just before 10.png" alt="Img17_RIG_Just before 10.png" /></span><BR /></SPAN></LI><LI>On the <STRONG>Add Tiles/Target Mappings as Reference</STRONG> screen, Search for the catalog (Created in subset 8 above) i.e., <STRONG>ZC_MY_HOME,</STRONG> and click on the&nbsp;<STRONG>Add TM Reference</STRONG> button.</LI><LI>Repeat the steps for the <STRONG>My Situations: F4154</STRONG> to add the Target Mapping to our catalog <STRONG>ZC_MY_HOME<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Im18_RIG_11.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98441iE07D1993DD88FEFA/image-size/large?v=v2&amp;px=999" role="button" title="Im18_RIG_11.png" alt="Im18_RIG_11.png" /></span><BR /></STRONG></LI><LI>Finally, you can assign this Catalog ZC_MY_HOME to our business role.<BR /><BR />Navigate to the transaction code PFCG, Enter the Role name <STRONG>Z_MY_HOME</STRONG><SPAN> click on </SPAN><STRONG>Change</STRONG><SPAN>.&nbsp;<BR /><BR /></SPAN>In the <STRONG>Menu</STRONG>&nbsp;tab, Click on <STRONG>Insert Node</STRONG> button, choose <STRONG>SAP Fiori Launchpad</STRONG> and select <STRONG>Launchpad Catalog</STRONG><SPAN><BR /></SPAN><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img19_RIG_12_ign.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98440i730031769D0C0DA8/image-size/large?v=v2&amp;px=999" role="button" title="Img19_RIG_12_ign.png" alt="Img19_RIG_12_ign.png" /></span></P></LI><LI>Enter the Catalog name on the screen Assign <STRONG>SAP Fiori Launchpad Catalog</STRONG> and click&nbsp;<STRONG>Continue</STRONG>.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IMg_RIG_13.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98439iAB487801F3010DD0/image-size/large?v=v2&amp;px=999" role="button" title="IMg_RIG_13.png" alt="IMg_RIG_13.png" /></span></LI><LI>Finally <STRONG>Save</STRONG> your role, and you are done.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img_RIG_14.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98438i7C3F9996D4859E44/image-size/large?v=v2&amp;px=999" role="button" title="Img_RIG_14.png" alt="Img_RIG_14.png" /></span></LI><LI>Assign the role to the desired user master record and you can see the <STRONG>My Home.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Img_RIG_15.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98437i194117E9DE6FCF2F/image-size/large?v=v2&amp;px=999" role="button" title="Img_RIG_15.png" alt="Img_RIG_15.png" /></span><BR /></STRONG></LI></OL><P><STRONG>Note</STRONG>: Please ensure that sufficient Business Roles are added to the user and that these roles contain spaces and pages.</P><H1 id="toc-hId--1511028462">&nbsp;</H1><H1 id="toc-hId--1707541967"><FONT color="#000080"><SPAN>Becoming a SAP Fiori for SAP S/4HANA guru</SPAN></FONT></H1><P>You’ll find much more on our&nbsp;<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/topics/fiori/s4hana" target="_blank">SAP Fiori for SAP S/4HANA topic page</A></P><P>Other helpful links:</P><UL><LI>See all questions and answers about<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/c-khhcw49343/SAP+Fiori+for+SAP+S%25252F4HANA/pd-p/73555000100800000131" target="_blank">SAP Fiori for SAP S/4HANA&nbsp;</A></LI><LI>Follow<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/c-khhcw49343/SAP+Fiori+for+SAP+S%25252F4HANA/pd-p/73555000100800000131" target="_blank">SAP Fiori for SAP S/4HANA</A><SPAN>&nbsp;</SPAN>for more blogs and updates&nbsp;</LI><LI><A href="https://community.sap.com/t5/forums/postpage/choose-node/true/board-id/technology-questions?primaryTagId=73555000100800000131" target="_blank">Ask a Question about SAP Fiori for SAP S/4HANA</A></LI></UL><P><EM>Brought to you by the SAP S/4HANA RIG and Customer Care team.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="5Steps2Fiori_V2.png" style="width: 216px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98660i86285B999C4C7CDA/image-size/medium?v=v2&amp;px=400" role="button" title="5Steps2Fiori_V2.png" alt="5Steps2Fiori_V2.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="10Steps2SAPS4HANA_V2.png" style="width: 216px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/98661iEE77DFEA3B9D48EA/image-size/medium?v=v2&amp;px=400" role="button" title="10Steps2SAPS4HANA_V2.png" alt="10Steps2SAPS4HANA_V2.png" /></span><BR /></EM></P><P>&nbsp;</P> 2024-04-26T11:34:59.906000+02:00 https://community.sap.com/t5/technology-blogs-by-members/configuring-sap-ci-cd-pipeline-for-deploying-reactjs-application-in-cloud/ba-p/13692318 Configuring SAP CI/CD pipeline for Deploying ReactJS application in Cloud Foundry 2024-05-07T09:59:07.961000+02:00 Nivedha_T https://community.sap.com/t5/user/viewprofilepage/user-id/1443428 <P><SPAN>In this blog, we will discuss how to integrate SAP CI/CD pipeline for deploying ReactJS application on SAP Cloud Foundry environment.</SPAN></P><P><STRONG>You will learn,</STRONG></P><UL><LI>How to create and build a ReactJS application.</LI><LI>How to configure and run SAP CI/CD Pipeline service.</LI><LI>How to create GitHub Webhook for automatically build, test and deploying the code changes.</LI></UL><P><STRONG>Prerequisites</STRONG></P><UL><LI>You have an SAP BTP Global or trial account.</LI><LI>Node installed in your system.</LI><LI>You have a GitHub account.</LI></UL><P><STRONG>Setting up React Application</STRONG></P><P><STRONG>step 1:&nbsp;</STRONG>Create your react application using the <STRONG>create-react-app</STRONG>. The&nbsp;create-react-app&nbsp;is an excellent tool which allows you to create and run React project very quickly by wrapping all the required dependencies.</P><P>&nbsp;</P><pre class="lia-code-sample language-bash"><code>npx create-react-app reactcicd</code></pre><P>&nbsp;</P><P><STRONG>step 2:&nbsp;</STRONG>To ensure that the application is running as expected, open the terminal and navigate to the application folder and type the below command. The application gets automatically hosted in the default server localhost:3000 and you’ll get the following screen.</P><P>&nbsp;</P><pre class="lia-code-sample language-bash"><code>npm start</code></pre><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_0-1714980501769.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106102i5AB94CF66B6D0585/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_0-1714980501769.png" alt="Nivedha_T_0-1714980501769.png" /></span></P><P><STRONG>step 3:&nbsp;</STRONG><SPAN>&nbsp;</SPAN>Now&nbsp;create<SPAN>&nbsp;</SPAN><STRONG>manifest.yml</STRONG><SPAN>&nbsp;</SPAN>file for determining the Cloud Foundry app configurations and paste the below contents.</P><P>&nbsp;</P><pre class="lia-code-sample language-bash"><code> --- applications: - name: your-app-name path: build/ instances: 1 buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git memory: 256M</code></pre><P>&nbsp;</P><P>&nbsp;<STRONG>step 4:&nbsp;</STRONG>Build the application using the below command,&nbsp;you will see the build folder getting added to your&nbsp; project.&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-bash"><code>npm run build</code></pre><P>&nbsp;</P><P>&nbsp;Also create a<SPAN>&nbsp;<STRONG>Staticfile&nbsp;</STRONG>with the following content in the build folder as shown below</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_1-1714980671736.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106107i65AF153FB2EB646A/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_1-1714980671736.png" alt="Nivedha_T_1-1714980671736.png" /></span></P><P><STRONG>step 5:&nbsp;</STRONG>Now create a repository in your GitHub and push the changes. Make sure to remove build folder from the<SPAN>&nbsp;</SPAN><STRONG>gitignore</STRONG><SPAN>&nbsp;</SPAN>file since it is added default while creating the react project, we require it for deployment.&nbsp;For more details on how to deploy react application refer this link&nbsp;<A href="https://community.sap.com/t5/technology-blogs-by-sap/deploy-your-reactjs-application-in-cloud-foundry/ba-p/13464100" target="_blank">react-CF-deploy</A></P><P>&nbsp;</P><P><STRONG>Enable SAP Continuous integration and Delivery Service</STRONG></P><P><STRONG>step 1:&nbsp;</STRONG>Login into SAP BTP Cockpit and choose the subaccount to which you want to deploy your application.</P><P><STRONG>step 2:&nbsp;</STRONG>Select Service Marketplace from the side pane and search for Continuous Integration and Delivery service. Click the create button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_2-1714980874176.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106111i9D35AD0ECC3EFCE5/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_2-1714980874176.png" alt="Nivedha_T_2-1714980874176.png" /></span></P><P><STRONG>step 3:&nbsp;</STRONG>Create popup will appear then choose the plan you want to and click create button at the bottom. Choose View Subscription and wait until the status changes to Subscribed.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_3-1714980898759.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106112i397B4F5AAEDA52F7/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_3-1714980898759.png" alt="Nivedha_T_3-1714980898759.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_4-1714980898775.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106113i30606F8B3B768430/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_4-1714980898775.png" alt="Nivedha_T_4-1714980898775.png" /></span></P><P><STRONG>step 4:&nbsp;</STRONG>Once the status is changed to subscribed navigate to<SPAN>&nbsp;</SPAN><STRONG>Security → Role Collections</STRONG><SPAN>&nbsp;</SPAN>from the left-hand pane. Choose role collection<SPAN>&nbsp;</SPAN><STRONG>CICD Service Administrator</STRONG><SPAN>&nbsp;</SPAN>and click edit.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_5-1714980933234.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106114i8BECA5B62510FD65/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_5-1714980933234.png" alt="Nivedha_T_5-1714980933234.png" /></span></P><P><STRONG>step 5:&nbsp;</STRONG>Navigate to users section click edit then Add a new row <SPAN>in the Users section table, enter your user id, Keep the identity provider as default and click save.</SPAN></P><P>&nbsp;</P><P><STRONG>Configure your credentials</STRONG></P><P><STRONG>step 1:<SPAN>&nbsp;</SPAN></STRONG>Go to<SPAN>&nbsp;</SPAN><STRONG>Services → Instances and Subscriptions</STRONG>&nbsp;from the pane. Choose the application icon located next to the Continuous Integration &amp; Delivery subscription. Now we need to add credentials for GitHub, CF and Webhook.</P><P><STRONG>step 2:&nbsp;</STRONG>Let’s first go with GitHub credentials. If your GitHub repository is private, you will need to provide with the necessary credentials to access it. You can skip this in case of public repository.</P><P><STRONG>step 3:&nbsp;</STRONG>In Create Credentials popup make sure you give unique name within the subaccount. Select the type as basic authentication and provide your git credentials. Use<SPAN>&nbsp;</SPAN><STRONG>personal access token</STRONG><SPAN>&nbsp;</SPAN>as a password. Then choose create.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_8-1714981085288.png" style="width: 274px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106121i45FB7B7F5CD360CC/image-dimensions/274x335?v=v2" width="274" height="335" role="button" title="Nivedha_T_8-1714981085288.png" alt="Nivedha_T_8-1714981085288.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_9-1714981085304.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106122iACA724E2C111F465/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_9-1714981085304.png" alt="Nivedha_T_9-1714981085304.png" /></span></P><P><STRONG>step 4:&nbsp;</STRONG>Now repeat the same steps for adding CF credentials. Here you have to provide your SAP BTP cockpit username and password.</P><P><STRONG>step 5:&nbsp;</STRONG>For configuring webhook credentials change the type from Basic Authentication to<SPAN>&nbsp;</SPAN><STRONG>Webhook Secret</STRONG>. Then generate the webhook secret copy it somewhere safe and finally choose Create.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_10-1714981130073.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106123i8044A5F853431BF5/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_10-1714981130073.png" alt="Nivedha_T_10-1714981130073.png" /></span></P><P>&nbsp;</P><P>&nbsp;<STRONG>Add a CI/CD job</STRONG></P><P><STRONG>step 1:&nbsp;</STRONG>Navigate to the&nbsp;Jobs&nbsp;tab and choose the icon to add a new job. Provide unique name for the job.</P><P><STRONG>step 2:&nbsp;</STRONG>Click on the icon inside the Repository input field. You will get a popup then choose add repository., Enter your git repository clone URL. You can add any name of your choice. It need not to be matched with your repo. Choose your saved credentials for git and webhook.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_11-1714981173201.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106126i2F2B4F0BC69988FE/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_11-1714981173201.png" alt="Nivedha_T_11-1714981173201.png" /></span></P><P><STRONG>step 3:&nbsp;</STRONG>For Branch, enter the GitHub branch of your repository from which you want to receive push events. In this example, master. Select&nbsp;Cloud Foundry Environment from the dropdown in the&nbsp;Pipeline&nbsp;field.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_12-1714981202052.png" style="width: 231px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106129i5C9A8B7C46CC1B2F/image-dimensions/231x333?v=v2" width="231" height="333" role="button" title="Nivedha_T_12-1714981202052.png" alt="Nivedha_T_12-1714981202052.png" /></span></P><P><STRONG>step 4:&nbsp;</STRONG>In the BUILD section choose <STRONG>npm</STRONG> as your build tool. For Build Tool Version, select the latest node version.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_13-1714981258865.png" style="width: 230px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106131iD237EABD621B572D/image-dimensions/230x276?v=v2" width="230" height="276" role="button" title="Nivedha_T_13-1714981258865.png" alt="Nivedha_T_13-1714981258865.png" /></span></P><P><STRONG>step 5:&nbsp;</STRONG>Under the Release section, switch on the execution of the Deploy to Cloud Foundry Space. Since we have already given name in the manifest file, we can skip the name field.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_14-1714981258886.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106130i8F134CBD4894D948/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_14-1714981258886.png" alt="Nivedha_T_14-1714981258886.png" /></span></P><P>Replace the placeholders<SPAN>&nbsp;</SPAN><STRONG>API</STRONG><SPAN>&nbsp;</SPAN><STRONG>Endpoint</STRONG>,<SPAN>&nbsp;</SPAN><STRONG>Org Name</STRONG><SPAN>&nbsp;</SPAN>and<SPAN>&nbsp;</SPAN><STRONG>Space</STRONG><SPAN>&nbsp;</SPAN>with the values in the Cloud Foundry environment to which you want to deploy. You can get the values from your subaccount overview in the SAP BTP cockpit.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_15-1714981259131.png" style="width: 448px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106133iD8DDBAE76DEC1B67/image-dimensions/448x179?v=v2" width="448" height="179" role="button" title="Nivedha_T_15-1714981259131.png" alt="Nivedha_T_15-1714981259131.png" /></span></P><P><STRONG>step 6:&nbsp;</STRONG>For Deploy Type, choose standard and select your previously created CF credentials. Leave remaining fields default then finally choose create.</P><P>&nbsp;</P><P><STRONG>Create a GitHub Webhook</STRONG></P><P>GitHub webhooks allow you to automate CI/CD builds. Whenever you push changes to your GitHub repository, a webhook push event is sent to the service to trigger a build of the connected job.</P><P><STRONG>step 1:&nbsp;</STRONG>To create a webhook in GitHub, you need payload URL. Select your repository and choose Webhook Data from the right pane. You will see a below popup:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_16-1714981344476.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106136i5972BD058A1C2C70/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_16-1714981344476.png" alt="Nivedha_T_16-1714981344476.png" /></span></P><P><STRONG>step 2:&nbsp;</STRONG>Now sign in into your GitHub account. In your project, go to the Settings tab.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_17-1714981371239.png" style="width: 414px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106137i26BBC09733BEFD59/image-dimensions/414x176?v=v2" width="414" height="176" role="button" title="Nivedha_T_17-1714981371239.png" alt="Nivedha_T_17-1714981371239.png" /></span></P><P><STRONG>step 3:&nbsp;</STRONG>From the left pane, choose Webhooks then Add webhook. Enter the Payload URL, Content type from the popup and &nbsp;the Secret that you had saved previously. For all other settings, leave the default values and add.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_18-1714981371260.png" style="width: 418px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106138iE1AFAD5DC98A2905/image-dimensions/418x203?v=v2" width="418" height="203" role="button" title="Nivedha_T_18-1714981371260.png" alt="Nivedha_T_18-1714981371260.png" /></span></P><P>&nbsp;</P><P><STRONG>Verify your Build</STRONG></P><P>You have to trigger your job manually the first time after creation.</P><P><STRONG>step 1:&nbsp;</STRONG>In Jobs tab, select your job and choose Run. Verify that a new tile appears in the Builds view. This tile should be marked as running.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_19-1714981408610.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106139i842382DFCFBFB9E4/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_19-1714981408610.png" alt="Nivedha_T_19-1714981408610.png" /></span></P><P><STRONG>step 2:&nbsp;</STRONG>Wait until the job has finished and verify that the build tile is marked as successful.</P><P><STRONG>step 3:&nbsp;</STRONG>Navigate to your space in the SAP BTP cockpit and check the list of installed applications. Now you can see your application got added.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_20-1714981431389.png" style="width: 502px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106140i26C4A503E284121C/image-dimensions/502x166?v=v2" width="502" height="166" role="button" title="Nivedha_T_20-1714981431389.png" alt="Nivedha_T_20-1714981431389.png" /></span></P><P><STRONG>step 4:&nbsp;</STRONG>Select your application and launch it with the application route. You can see the react application deployed.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_21-1714981464703.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106141i23A2E344C33B413E/image-size/medium?v=v2&amp;px=400" role="button" title="Nivedha_T_21-1714981464703.png" alt="Nivedha_T_21-1714981464703.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Nivedha_T_22-1714981464718.png" style="width: 261px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/106142iA7CA9286785DCDED/image-dimensions/261x286?v=v2" width="261" height="286" role="button" title="Nivedha_T_22-1714981464718.png" alt="Nivedha_T_22-1714981464718.png" /></span></P><P>You have now successfully created a CI/CD pipeline and deployed your ReactJS application to SAP BTP. From now on for every commit you can see the job getting triggered with commit id displayed under builds section.</P> 2024-05-07T09:59:07.961000+02:00