Comparison Pattern
The pattern allows users to select multiple items from an sap.m.Table and display information about them in a structured way - all items are displayed next to each other for easy comparison, based on their specifics.
Z2UI5_CL_SMPC_APP_012
The facts
- Repository
- abap2UI5/samples-controls
- Class
Z2UI5_CL_SMPC_APP_012- Source file
z2ui5_cl_smpc_app_012.clas.abap↗- Library
- sap.m
- UI5 entity
sap.m.ComparisonPattern- Demo kit sample
sap.m.sample.ComparisonPattern- SAP's own sample
- running at sdk.openui5.org ↗
- Minimum UI5
- 1.71 — the floor abap2UI5 holds its samples to
- In the playground
- runs in the browser, with no system and nothing installed
Keywords: comparisonpattern, comparison, pattern, sap.m, compare, items, side, app, table, toolbar, title, toolbarspacer
Controls it builds
- sap.f.Card
- sap.f.DynamicPage
- sap.f.DynamicPageHeader
- sap.f.DynamicPageTitle
- sap.f.cards.Header
- sap.m.App
- sap.m.Button
- sap.m.Carousel
- sap.m.CarouselLayout
- sap.m.Column
- sap.m.ColumnListItem
- sap.m.CustomListItem
- sap.m.FlexItemData
- sap.m.FormattedText
- sap.m.HBox
- sap.m.Input
- sap.m.Label
- sap.m.List
- sap.m.ObjectIdentifier
- sap.m.ObjectNumber
- sap.m.Page
- sap.m.Panel
- sap.m.Table
- sap.m.Text
- sap.m.Title
- sap.m.Toolbar
- sap.m.ToolbarSpacer
- sap.m.VBox
- sap.ui.core.mvc.View
- sap.ui.layout.BlockLayout
- sap.ui.layout.BlockLayoutCell
- sap.ui.layout.BlockLayoutRow
- sap.ui.layout.VerticalLayout
Read out of the builder chain by the abap2UI5 linter, not from the category this sample is filed under — which is what makes “which samples build one of these” a question the catalogue can answer at all.
Libraries
Run it here
Nothing is installed and nothing is sent anywhere: the ABAP is compiled to JavaScript in this browser and runs against abap2UI5 itself.
The ABAP
" @keywords comparisonpattern comparison pattern sap.m compare items side app table toolbar title toolbarspacer
" @summary The pattern allows users to select multiple items from an sap.m.Table and display information about them in a structured way - all items are displayed next to each other for easy comparison, based on their specifics.
CLASS z2ui5_cl_smpc_app_012 DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
TYPES:
BEGIN OF ty_s_product,
product_id TYPE string,
category TYPE string,
main_category TYPE string,
tax_tarif_code TYPE string,
supplier_name TYPE string,
weight_measure TYPE string,
weight_unit TYPE string,
description TYPE string,
name TYPE string,
date_of_sale TYPE string,
product_pic_url TYPE string,
status TYPE string,
quantity TYPE string,
uom TYPE string,
currency_code TYPE string,
price TYPE p LENGTH 8 DECIMALS 2,
width TYPE string,
depth TYPE string,
height TYPE string,
dim_unit TYPE string,
selected TYPE abap_bool,
END OF ty_s_product.
TYPES ty_t_product TYPE STANDARD TABLE OF ty_s_product WITH EMPTY KEY.
TYPES:
BEGIN OF ty_s_comp_value,
text TYPE string,
description TYPE string,
visible TYPE abap_bool,
END OF ty_s_comp_value.
TYPES ty_t_comp_value TYPE STANDARD TABLE OF ty_s_comp_value WITH EMPTY KEY.
TYPES:
BEGIN OF ty_s_comp_prop,
key TYPE string,
values TYPE ty_t_comp_value,
END OF ty_s_comp_prop.
TYPES ty_t_comp_prop TYPE STANDARD TABLE OF ty_s_comp_prop WITH EMPTY KEY.
DATA t_products TYPE ty_t_product.
DATA t_comp_products TYPE ty_t_product.
DATA t_comp_props TYPE ty_t_comp_prop.
DATA pages_count TYPE i.
DATA is_desktop TYPE abap_bool.
DATA compare_text TYPE string.
DATA compare_visible TYPE abap_bool.
PROTECTED SECTION.
TYPES:
BEGIN OF ty_s_key,
key TYPE string,
field TYPE string,
END OF ty_s_key.
TYPES ty_t_key TYPE STANDARD TABLE OF ty_s_key WITH EMPTY KEY.
DATA client TYPE REF TO z2ui5_if_client.
DATA first_item TYPE i.
DATA check_page2 TYPE abap_bool.
METHODS view_display.
METHODS on_event.
METHODS comparison_build.
METHODS comparison_props_build.
METHODS model_init.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_smpc_app_012 IMPLEMENTATION.
METHOD z2ui5_if_app~main.
me->client = client.
IF client->check_on_init( ).
model_init( ).
view_display( ).
ELSEIF client->check_on_navigated( ).
view_display( ).
ELSEIF client->check_on_event( ).
on_event( ).
ENDIF.
ENDMETHOD.
METHOD view_display.
" the original's router matches #/Page2 directly (a deep link, a reload):
" the live hash rides in s_config-hash on every request, so a render whose
" hash carries it enters the comparison - with nothing selected it stays
" empty, exactly the original's cold #/Page2
IF check_page2 = abap_false AND contains( val = client->get( )-s_config-hash sub = `/Page2` ).
comparison_build( ).
check_page2 = abap_true.
ENDIF.
DATA(view) = z2ui5_cl_ui5_view_builder=>factory( ).
" the sample's App/Main/Comparison views merged into one view: the App hosts both pages, the router's navTo becomes a NavContainer `to` frontend action
view->ele( n = `View` ns = `mvc`
)->a( n = `height` v = `100%`
)->a( n = `xmlns` v = `sap.m`
)->a( n = `xmlns:mvc` v = `sap.ui.core.mvc`
)->a( n = `xmlns:f` v = `sap.f`
)->a( n = `xmlns:cards` v = `sap.f.cards`
)->a( n = `xmlns:l` v = `sap.ui.layout`
)->ele( `App`
)->a( n = `id` v = `rootControl`
)->ele( `Page`
)->a( n = `title` v = `First Page`
)->ele( `content`
)->ele( `Table`
)->a( n = `id` v = `idProductsTable`
)->a( n = `selectionChange` v = client->_event( `SELECTION` )
)->a( n = `mode` v = `MultiSelect`
)->a( n = `inset` v = `false`
)->a( n = `items` v = |\{ path: '{ client->_bind_path( t_products ) }', sorter: \{ path: 'NAME' \} \}|
)->ele( `headerToolbar`
)->ele( `Toolbar`
)->tag( `Title`
)->a( n = `text` v = `Laptops`
)->a( n = `level` v = `H2`
)->tag( `ToolbarSpacer`
" the controller's setText/setVisible on selection replaced by bound model properties
)->tag( `Button`
)->a( n = `id` v = `compareBtn`
)->a( n = `text` v = client->_bind( compare_text )
)->a( n = `visible` v = client->_bind( compare_visible )
)->a( n = `press` v = client->_event( `COMPARE` )
)->end(
)->end(
)->ele( `columns`
)->ele( `Column`
)->tag( `Text`
)->a( n = `text` v = `Product`
)->end(
)->ele( `Column`
)->a( n = `hAlign` v = `Center`
)->a( n = `width` v = `12em`
)->a( n = `minScreenWidth` v = `Tablet`
)->a( n = `demandPopin` v = `true`
)->tag( `Text`
)->a( n = `text` v = `Quantity`
)->end(
)->ele( `Column`
)->a( n = `minScreenWidth` v = `Tablet`
)->a( n = `demandPopin` v = `true`
)->a( n = `hAlign` v = `Center`
)->tag( `Text`
)->a( n = `text` v = `Weight`
)->end(
)->ele( `Column`
)->a( n = `hAlign` v = `End`
)->tag( `Text`
)->a( n = `text` v = `Unit Price`
)->end(
)->end(
)->ele( `items`
" selected two-way binding added to read the multi-selection in the SELECTION handler (getSelectedContextPaths equivalent)
)->ele( `ColumnListItem`
)->a( n = `vAlign` v = `Middle`
)->a( n = `type` v = `Inactive`
)->a( n = `selected` v = `{SELECTED}`
)->ele( `cells`
)->tag( `ObjectIdentifier`
)->a( n = `title` v = `{NAME}`
)->a( n = `text` v = `{PRODUCT_ID}`
)->tag( `Input`
)->a( n = `value` v = `{QUANTITY}`
" the ORIGINAL writes type="{Text}" (Main.view.xml): it meant the
" literal enum value and wrote a binding, so the property falls back
" to its default. Ported verbatim rather than repaired
" abap2ui5lint-disable-next-line unknown-binding-path -- the sample's own quirk
)->a( n = `type` v = `{Text}`
)->a( n = `description` v = `{UOM}`
)->a( n = `fieldWidth` v = `{60%}`
)->tag( `ObjectNumber`
)->a( n = `number` v = `{WEIGHT_MEASURE}`
)->a( n = `unit` v = `{WEIGHT_UNIT}`
)->tag( `ObjectNumber`
)->a( n = `number` v = |\{ parts:[\{path:'PRICE'\},\{path:'CURRENCY_CODE'\}], type: 'sap.ui.model.type.Currency', formatOptions: \{showMeasure: false\} \}|
)->a( n = `unit` v = `{CURRENCY_CODE}`
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->ele( n = `DynamicPage` ns = `f`
)->a( n = `id` v = `page-comparison`
)->a( n = `class` v = `sapUiComparisonContainer`
)->ele( n = `title` ns = `f`
" the original's stateChange handler (add/removeSnappedContent Carousel animation workaround) is dropped - imperative aggregation surgery
)->ele( n = `DynamicPageTitle` ns = `f`
)->a( n = `id` v = `dynamic-page`
)->a( n = `backgroundDesign` v = `Transparent`
)->ele( n = `heading` ns = `f`
)->tag( `Title`
)->a( n = `text` v = `Second Page`
)->end(
)->ele( n = `snappedContent` ns = `f`
)->ele( `Carousel`
)->a( n = `height` v = `auto`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->a( n = `id` v = `carousel-snapped`
)->a( n = `pageChanged` v = client->_event( val = `PAGE_CHANGED` arg = `${$parameters>/activePages/0}` )
)->a( n = `pageIndicatorPlacement` v = `Top`
)->a( n = `showPageIndicator` v = |\{= !${ client->_bind( is_desktop ) } \}|
)->a( n = `pages` v = client->_bind( t_comp_products )
)->ele( `customLayout`
)->tag( `CarouselLayout`
)->a( n = `visiblePagesCount` v = client->_bind( pages_count )
)->end(
)->ele( n = `Card` ns = `f`
)->a( n = `class` v = `sapUiTinyMarginTop`
)->ele( n = `header` ns = `f`
" iconSrc formatter .formatter.url flattened to absolute image URLs in the model
)->tag( n = `Header` ns = `cards`
)->a( n = `title` v = `{NAME}`
)->a( n = `subtitle` v = `{STATUS}`
)->a( n = `iconSrc` v = `{PRODUCT_PIC_URL}`
)->a( n = `iconDisplayShape` v = `Square`
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->ele( n = `header` ns = `f`
)->ele( n = `DynamicPageHeader` ns = `f`
)->a( n = `backgroundDesign` v = `Transparent`
)->ele( `Carousel`
)->a( n = `height` v = `auto`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->a( n = `id` v = `carousel-expanded`
)->a( n = `pageChanged` v = client->_event( val = `PAGE_CHANGED` arg = `${$parameters>/activePages/0}` )
)->a( n = `pageIndicatorPlacement` v = `Top`
)->a( n = `showPageIndicator` v = |\{= !${ client->_bind( is_desktop ) } \}|
)->a( n = `pages` v = client->_bind( t_comp_products )
)->ele( `customLayout`
)->tag( `CarouselLayout`
)->a( n = `visiblePagesCount` v = client->_bind( pages_count )
)->end(
)->ele( n = `Card` ns = `f`
)->a( n = `class` v = `sapUiTinyMarginTop`
)->ele( n = `header` ns = `f`
)->tag( n = `Header` ns = `cards`
)->a( n = `title` v = `{NAME}`
)->a( n = `subtitle` v = `{STATUS}`
)->a( n = `iconSrc` v = `{PRODUCT_PIC_URL}`
)->a( n = `iconDisplayShape` v = `Square`
)->end(
)->ele( n = `content` ns = `f`
)->ele( n = `VerticalLayout` ns = `l`
)->a( n = `width` v = `100%`
)->ele( n = `BlockLayout` ns = `l`
)->ele( n = `BlockLayoutRow` ns = `l`
)->ele( n = `BlockLayoutCell` ns = `l`
)->ele( `HBox`
)->tag( `Label`
)->a( n = `text` v = `Supplier:`
)->end(
)->ele( `HBox`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->tag( `Text`
)->a( n = `text` v = `{SUPPLIER_NAME}`
)->end(
)->ele( `HBox`
)->tag( `Label`
)->a( n = `text` v = `Main Category:`
)->end(
)->ele( `HBox`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->tag( `Text`
)->a( n = `text` v = `{MAIN_CATEGORY}`
)->end(
)->ele( `HBox`
)->tag( `Label`
)->a( n = `text` v = `Category:`
)->end(
)->ele( `HBox`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->tag( `Text`
)->a( n = `text` v = `{CATEGORY}`
)->end(
)->end(
)->ele( n = `BlockLayoutCell` ns = `l`
)->ele( `HBox`
)->tag( `Label`
)->a( n = `text` v = `Width (cm)`
)->end(
)->ele( `HBox`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->tag( `Text`
)->a( n = `text` v = `{WIDTH}`
)->end(
)->ele( `HBox`
)->tag( `Label`
)->a( n = `text` v = `Height (cm)`
)->end(
)->ele( `HBox`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->tag( `Text`
)->a( n = `text` v = `{HEIGHT}`
)->end(
)->ele( `HBox`
)->tag( `Label`
)->a( n = `text` v = `Weight (kg)`
)->end(
)->ele( `HBox`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->tag( `Text`
)->a( n = `text` v = `{WEIGHT_MEASURE}`
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->ele( n = `content` ns = `f`
)->ele( `List`
)->a( n = `id` v = `listItems`
)->a( n = `backgroundDesign` v = `Transparent`
)->a( n = `class` v = `sapUiSmallMarginBottom`
)->a( n = `items` v = client->_bind( t_comp_props )
)->ele( `items`
)->ele( `CustomListItem`
)->a( n = `class` v = `sapUiComparisonContent`
)->tag( `Panel`
)->a( n = `expandable` v = `true`
)->a( n = `expanded` v = `false`
)->a( n = `headerText` v = `{KEY}`
)->a( n = `height` v = `2.75rem`
)->a( n = `expand` v = client->_event( val = `PANEL_EXPANDED`
t_arg = VALUE #( ( `${KEY}` ) ( `${$parameters>/expand}` ) ) )
)->ele( `HBox`
)->a( n = `class` v = `sapUiTinyMarginTop`
)->a( n = `alignItems` v = `Start`
)->a( n = `backgroundDesign` v = `Solid`
)->a( n = `items` v = |\{ path: 'VALUES', templateShareable : true \}|
)->ele( `items`
)->ele( `VBox`
)->a( n = `class` v = `sapUiTinyMarginTopBottom sapUiComparisonItem`
)->ele( `layoutData`
)->tag( `FlexItemData`
)->a( n = `growFactor` v = `1`
)->a( n = `baseSize` v = `0`
)->end(
)->ele( `HBox`
)->tag( `FormattedText`
)->a( n = `htmlText` v = `{TEXT}`
)->end(
" the controller's onPanelExpanded setVisible replaced by the bound VISIBLE flag per value row
)->ele( `HBox`
)->a( n = `class` v = `sapUiSmallMarginTop`
)->a( n = `visible` v = `{VISIBLE}`
)->tag( `Text`
)->a( n = `text` v = `{DESCRIPTION}`
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end(
)->end( ).
" the original controller's onAfterRendering binding filter: only Laptops are compared
client->follow_up_action( val = client->cs_event-binding_call
t_arg = VALUE #( ( `idProductsTable` ) ( `items` ) ( `filter` ) ( `CATEGORY` ) ( `EQ` ) ( `Laptops` ) ) ).
" the original's manifest router, app-owned: the hash stays the app's own
" (#/Page2, no route prefix), and a hash change the app did not write -
" browser Back/Forward, a manual edit - round-trips as HASH_CHANGED.
" Re-asserted per render, since the registration dies with an app switch
client->follow_up_action( val = client->cs_event-hash_attach_changed
t_arg = VALUE #( ( `HASH_CHANGED` ) ) ).
client->view_display( view->stringify( ) ).
" A Carousel's active page is live control state a rebuilt view resets to
" page 0, while first_item survives as class state AND drives the bound
" comparison rows - so after a rebuild the two Carousels show item 0 next to
" props for items first_item.. Re-issued positionally, the same form the
" event branch uses (the pages are aggregation-template clones with no id
" the backend can spell). Guarded, because page 0 is where a fresh view
" already is. Found by the linter's control-state-lost-on-rebuild rule
IF first_item > 0.
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `carousel-snapped` )
( `setActivePage` )
( |carousel-snapped/pages/{ first_item }| ) ) ).
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `carousel-expanded` )
( `setActivePage` )
( |carousel-expanded/pages/{ first_item }| ) ) ).
ENDIF.
" the NavContainer's active page is the same class of live control state:
" a rebuilt view (a restored draft, a return from a called app) is back on
" the first page while check_page2 survives as class state
IF check_page2 = abap_true.
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `rootControl` ) ( `to` ) ( `page-comparison` ) ) ).
ENDIF.
ENDMETHOD.
METHOD on_event.
CASE client->get_event( ).
WHEN `SELECTION`.
DATA(selected_count) = 0.
LOOP AT t_products TRANSPORTING NO FIELDS WHERE selected = abap_true.
selected_count = selected_count + 1.
ENDLOOP.
IF selected_count > 1.
compare_text = |Compare ({ selected_count })|.
compare_visible = abap_true.
ELSE.
compare_visible = abap_false.
ENDIF.
WHEN `COMPARE`.
comparison_build( ).
check_page2 = abap_true.
" the router's navTo("page2") mapped to the NavContainer `to` frontend action
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `rootControl` ) ( `to` ) ( `page-comparison` ) ) ).
" navTo also writes the router's hash: with the hash listener
" registered this pushes the app-owned `#/Page2` - the original's URL
" 1:1 - as a real history entry, so browser Back has somewhere to go
client->hash_set( `/Page2` ).
WHEN `HASH_CHANGED`.
" browser Back/Forward (or a manual edit) moved the app-owned hash -
" the router's routeMatched: show the page the hash now names. The
" hash rides in s_config-hash with this very request; the app
" instance is untouched, so the selection survives like with the
" original's client-side router
IF contains( val = client->get( )-s_config-hash sub = `/Page2` ).
IF check_page2 = abap_false.
comparison_build( ).
check_page2 = abap_true.
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `rootControl` ) ( `to` ) ( `page-comparison` ) ) ).
ENDIF.
ELSEIF check_page2 = abap_true.
check_page2 = abap_false.
" NavContainer `back` pops the page the `to` above pushed
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `rootControl` ) ( `back` ) ) ).
ENDIF.
WHEN `PAGE_CHANGED`.
DATA(page_arg) = client->get_event_arg( ).
IF page_arg CO `0123456789`.
first_item = page_arg.
ELSE.
first_item = 0.
ENDIF.
comparison_props_build( ).
" _updateCarouselsActivePage: the original keeps the two Carousels in
" step by handing each its own page AT THE SAME INDEX
" (carousel.setActivePage( carousel.getPages()[ iFirstItem ] )). Those
" pages are aggregation-template CLONES with no id the backend can
" spell, so they are addressed positionally since 2026-08-06
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `carousel-snapped` )
( `setActivePage` )
( |carousel-snapped/pages/{ first_item }| ) ) ).
client->follow_up_action( val = client->cs_event-control_by_id
t_arg = VALUE #( ( `carousel-expanded` )
( `setActivePage` )
( |carousel-expanded/pages/{ first_item }| ) ) ).
WHEN `PANEL_EXPANDED`.
DATA(prop_key) = client->get_event_arg( ).
DATA(expanded) = client->get_event_arg( 2 ).
READ TABLE t_comp_props ASSIGNING FIELD-SYMBOL(<s_prop>) WITH KEY key = prop_key.
IF sy-subrc = 0.
LOOP AT <s_prop>-values ASSIGNING FIELD-SYMBOL(<s_value>).
<s_value>-visible = expanded.
ENDLOOP.
ENDIF.
ENDCASE.
ENDMETHOD.
METHOD comparison_build.
t_comp_products = VALUE #( ).
LOOP AT t_products INTO DATA(s_product) WHERE selected = abap_true.
APPEND s_product TO t_comp_products.
ENDLOOP.
" the original's ResizeHandler-driven _getPagesCount (600/1024 thresholds), computed once from the reported device width
DATA(width) = client->get( )-s_device-resize-width.
IF width > 0 AND width <= 600.
pages_count = 1.
ELSEIF width > 0 AND width <= 1024.
pages_count = 2.
ELSE.
pages_count = 4.
ENDIF.
IF pages_count > lines( t_comp_products ).
pages_count = lines( t_comp_products ).
ENDIF.
" a cold #/Page2 (deep link, reload) has no selection: the original's
" settings model is then empty and visiblePagesCount falls back to its
" UI5 default 1 - a computed 0 would be an invalid CarouselLayout count
IF pages_count < 1.
pages_count = 1.
ENDIF.
is_desktop = xsdbool( pages_count = 4 ).
first_item = 0.
comparison_props_build( ).
ENDMETHOD.
METHOD comparison_props_build.
" the original iterates the first selected product's JSON keys (except ProductPicUrl); here the same keys as a fixed list
DATA(t_keys) = VALUE ty_t_key(
( key = `ProductId` field = `PRODUCT_ID` )
( key = `Category` field = `CATEGORY` )
( key = `MainCategory` field = `MAIN_CATEGORY` )
( key = `TaxTarifCode` field = `TAX_TARIF_CODE` )
( key = `SupplierName` field = `SUPPLIER_NAME` )
( key = `WeightMeasure` field = `WEIGHT_MEASURE` )
( key = `WeightUnit` field = `WEIGHT_UNIT` )
( key = `Description` field = `DESCRIPTION` )
( key = `Name` field = `NAME` )
( key = `DateOfSale` field = `DATE_OF_SALE` )
( key = `Status` field = `STATUS` )
( key = `Quantity` field = `QUANTITY` )
( key = `UoM` field = `UOM` )
( key = `CurrencyCode` field = `CURRENCY_CODE` )
( key = `Price` field = `PRICE` )
( key = `Width` field = `WIDTH` )
( key = `Depth` field = `DEPTH` )
( key = `Height` field = `HEIGHT` )
( key = `DimUnit` field = `DIM_UNIT` ) ).
DATA(from_item) = first_item + 1.
DATA(last_item) = first_item + pages_count.
IF last_item > lines( t_comp_products ).
last_item = lines( t_comp_products ).
ENDIF.
t_comp_props = VALUE #( ).
" the original's cold #/Page2 renders BOTH lists empty ('no data') - its
" Props are built per selected product, so no product means no rows, not
" nineteen property panels with empty value lists
IF t_comp_products IS INITIAL.
RETURN.
ENDIF.
LOOP AT t_keys INTO DATA(s_key).
DATA(s_prop) = VALUE ty_s_comp_prop( key = s_key-key ).
LOOP AT t_comp_products FROM from_item TO last_item INTO DATA(s_product).
ASSIGN COMPONENT s_key-field OF STRUCTURE s_product TO FIELD-SYMBOL(<value>).
IF sy-subrc = 0.
APPEND VALUE #( text = |<strong>{ <value> }</strong>|
description = `Some description of the property here`
visible = abap_false ) TO s_prop-values.
ENDIF.
ENDLOOP.
APPEND s_prop TO t_comp_props.
ENDLOOP.
ENDMETHOD.
METHOD model_init.
" the full mock /ProductCollection (sap/ui/demo/mock/products.json); the table binding filters to Category = Laptops (onAfterRendering), as the original loads all rows and filters client-side
" ProductPicUrl resolved to absolute OpenUI5 URLs (the sample's .formatter.url)
t_products = VALUE #(
( product_id = `HT-1000` category = `Laptops` main_category = `Computer Systems` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `4.2` weight_unit = `KG`
description = `Notebook Basic 15 with 2,80 GHz quad core, 15" LCD, 4 GB DDR3 RAM, 500 GB Hard Disc, Windows 8 Pro` name = `Notebook Basic 15` date_of_sale = `2017-03-26`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1000.jpg`
status = `Available` quantity = `10` uom = `PC` currency_code = `EUR` price = `956.00` width = `30` depth = `18` height = `3` dim_unit = `cm` )
( product_id = `HT-1001` category = `Laptops` main_category = `Computer Systems` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `4.5` weight_unit = `KG`
description = `Notebook Basic 17 with 2,80 GHz quad core, 17" LCD, 4 GB DDR3 RAM, 500 GB Hard Disc, Windows 8 Pro` name = `Notebook Basic 17` date_of_sale = `2017-04-17`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1001.jpg`
status = `Available` quantity = `20` uom = `PC` currency_code = `EUR` price = `1249.00` width = `29` depth = `17` height = `3.1` dim_unit = `cm` )
( product_id = `HT-1002` category = `Laptops` main_category = `Computer Systems` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `4.2` weight_unit = `KG`
description = `Notebook Basic 18 with 2,80 GHz quad core, 18" LCD, 8 GB DDR3 RAM, 1000 GB Hard Disc, Windows 8 Pro` name = `Notebook Basic 18` date_of_sale = `2017-01-07`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1002.jpg`
status = `Available` quantity = `10` uom = `PC` currency_code = `EUR` price = `1570.00` width = `28` depth = `19` height = `2.5` dim_unit = `cm` )
( product_id = `HT-1003` category = `Laptops` main_category = `Computer Systems` tax_tarif_code = `1` supplier_name = `Smartcards` weight_measure = `4.2` weight_unit = `KG`
description = `Notebook Basic 19 with 2,80 GHz quad core, 19" LCD, 8 GB DDR3 RAM, 1000 GB Hard Disc, Windows 8 Pro` name = `Notebook Basic 19` date_of_sale = `2017-04-09`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1003.jpg`
status = `Out of Stock` quantity = `15` uom = `PC` currency_code = `EUR` price = `1650.00` width = `32` depth = `21` height = `4` dim_unit = `cm` )
( product_id = `HT-1007` category = `Accessories` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Technocom` weight_measure = `0.2` weight_unit = `KG`
description = `Digital Organizer with State-of-the-Art Storage Encryption` name = `ITelO Vault` date_of_sale = `2017-05-17`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1007.jpg`
status = `Out of Stock` quantity = `15` uom = `PC` currency_code = `EUR` price = `299.00` width = `32` depth = `22` height = `3` dim_unit = `cm` )
( product_id = `HT-1010` category = `Accessories` main_category = `Computer Systems` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `4.3` weight_unit = `KG`
description = `Notebook Professional 15 with 2,80 GHz quad core, 15" Multitouch LCD, 8 GB DDR3 RAM, 500 GB SSD - DVD-Writer (DVD-R/+R/-RW/-RAM),Windows 8 Pro` name = `Notebook Professional 15` date_of_sale = `2017-02-22`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1010.jpg`
status = `Out of Stock` quantity = `16` uom = `PC` currency_code = `EUR` price = `1999.00` width = `33` depth = `20` height = `3` dim_unit = `cm` )
( product_id = `HT-1011` category = `Laptops` main_category = `Computer Systems` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `4.1` weight_unit = `KG`
description = `Notebook Professional 17 with 2,80 GHz quad core, 17" Multitouch LCD, 8 GB DDR3 RAM, 500 GB SSD - DVD-Writer (DVD-R/+R/-RW/-RAM),Windows 8 Pro` name = `Notebook Professional 17` date_of_sale = `2017-01-02`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1011.jpg`
status = `Out of Stock` quantity = `17` uom = `PC` currency_code = `EUR` price = `2299.00` width = `33` depth = `23` height = `2` dim_unit = `cm` )
( product_id = `HT-1020` category = `Accessories` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Technocom` weight_measure = `0.16` weight_unit = `KG`
description = `Digital Organizer with State-of-the-Art Encryption for Storage and Network Communications` name = `ITelO Vault Net` date_of_sale = `2017-05-08`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1020.jpg`
status = `Discontinued` quantity = `14` uom = `PC` currency_code = `EUR` price = `459.00` width = `10` depth = `1.8` height = `17` dim_unit = `cm` )
( product_id = `HT-1021` category = `Accessories` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Technocom` weight_measure = `0.18` weight_unit = `KG`
description = `Digital Organizer with State-of-the-Art Encryption for Storage and Secure Stellite Link` name = `ITelO Vault SAT` date_of_sale = `2017-06-30`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1021.jpg`
status = `Available` quantity = `50` uom = `PC` currency_code = `EUR` price = `149.00` width = `11` depth = `1.7` height = `18` dim_unit = `cm` )
( product_id = `HT-1022` category = `Accessories` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Technocom` weight_measure = `0.2` weight_unit = `KG`
description = `32 GB Digital Assistant with high-resolution color screen` name = `Comfort Easy` date_of_sale = `2017-03-02`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1022.jpg`
status = `Out of Stock` quantity = `30` uom = `PC` currency_code = `EUR` price = `1679.00` width = `84` depth = `1.5` height = `14` dim_unit = `cm` )
( product_id = `HT-1023` category = `Accessories` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Technocom` weight_measure = `0.8` weight_unit = `KG`
description = `64 GB Digital Assistant with high-resolution color screen and synthesized voice output` name = `Comfort Senior` date_of_sale = `2017-02-25`
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1023.jpg`
status = `Available` quantity = `24` uom = `PC` currency_code = `EUR` price = `512.00` width = `80` depth = `1.6` height = `13` dim_unit = `cm` )
( product_id = `HT-1030` category = `Flat Screen Monitors` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `21` weight_unit = `KG`
description = `Optimum Hi-Resolution max. 1920 x 1080 @ 85Hz, Dot Pitch: 0.27mm` name = `Ergo Screen E-I` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1030.jpg`
status = `Available` quantity = `14` uom = `PC` currency_code = `EUR` price = `230.00` width = `37` depth = `12` height = `36` dim_unit = `cm` )
( product_id = `HT-1031` category = `Flat Screen Monitors` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `21` weight_unit = `KG`
description = `Optimum Hi-Resolution max. 1920 x 1200 @ 85Hz, Dot Pitch: 0.26mm` name = `Ergo Screen E-II` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1031.jpg`
status = `Available` quantity = `24` uom = `PC` currency_code = `EUR` price = `285.00` width = `40.8` depth = `19` height = `43` dim_unit = `cm` )
( product_id = `HT-1032` category = `Flat Screen Monitors` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `21` weight_unit = `KG`
description = `Optimum Hi-Resolution max. 2560 x 1440 @ 85Hz, Dot Pitch: 0.25mm` name = `Ergo Screen E-III` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1032.jpg`
status = `Out of Stock` quantity = `50` uom = `PC` currency_code = `EUR` price = `345.00` width = `40.8` depth = `19` height = `43` dim_unit = `cm` )
( product_id = `HT-1035` category = `Flat Screen Monitors` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `14` weight_unit = `KG`
description = `Optimum Hi-Resolution max. 1600 x 1200 @ 85Hz, Dot Pitch: 0.24mm` name = `Flat Basic` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1035.jpg`
status = `Available` quantity = `23` uom = `PC` currency_code = `EUR` price = `399.00` width = `39` depth = `20` height = `41` dim_unit = `cm` )
( product_id = `HT-1036` category = `Flat Screen Monitors` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `15` weight_unit = `KG`
description = `Optimum Hi-Resolution max. 2048 x 1080 @ 85Hz, Dot Pitch: 0.26mm` name = `Flat Future` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1036.jpg`
status = `Available` quantity = `22` uom = `PC` currency_code = `EUR` price = `430.00` width = `45` depth = `26` height = `46` dim_unit = `cm` )
( product_id = `HT-1037` category = `Flat Screen Monitors` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Very Best Screens` weight_measure = `17` weight_unit = `KG`
description = `Optimum Hi-Resolution max. 2016 x 1512 @ 85Hz, Dot Pitch: 0.24mm` name = `Flat XL` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1037.jpg`
status = `Available` quantity = `23` uom = `PC` currency_code = `EUR` price = `1230.00` width = `54.5` depth = `22.1` height = `39.1` dim_unit = `cm` )
( product_id = `HT-1040` category = `Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Alpha Printers` weight_measure = `32` weight_unit = `KG`
description = `Print 2400 dpi image quality color documents at speeds of up to 32 ppm (color) or 36 ppm (monochrome), letter/A4. Powerful 500 MHz processor, 512MB of memory` name = `Laser Professional Eco` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1040.jpg`
status = `Available` quantity = `21` uom = `PC` currency_code = `EUR` price = `830.00` width = `51` depth = `46` height = `30` dim_unit = `cm` )
( product_id = `HT-1041` category = `Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Alpha Printers` weight_measure = `23` weight_unit = `KG`
description = `Up to 22 ppm color or 24 ppm monochrome A4/letter, powerful 500 MHz processor and 128MB of memory` name = `Laser Basic` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1041.jpg`
status = `Available` quantity = `8` uom = `PC` currency_code = `EUR` price = `490.00` width = `48` depth = `42` height = `26` dim_unit = `cm` )
( product_id = `HT-1042` category = `Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Alpha Printers` weight_measure = `17` weight_unit = `KG`
description = `Print up to 25 ppm letter and 24 ppm A4 color or monochrome, with Available first-page-out-time of less than 13 seconds for monochrome and less than 15 seconds for color` name = `Laser Allround` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1042.jpg`
status = `Available` quantity = `9` uom = `PC` currency_code = `EUR` price = `349.00` width = `53` depth = `50` height = `65` dim_unit = `cm` )
( product_id = `HT-1050` category = `Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Alpha Printers` weight_measure = `3` weight_unit = `KG`
description = `4800 dpi x 1200 dpi - up to 35 ppm (mono) / up to 34 ppm (color) - capacity: 250 sheets - Hi-Speed USB, Ethernet` name = `Ultra Jet Super Color` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1050.jpg`
status = `Discontinued` quantity = `17` uom = `PC` currency_code = `EUR` price = `139.00` width = `41` depth = `41` height = `28` dim_unit = `cm` )
( product_id = `HT-1051` category = `Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `1.9` weight_unit = `KG`
description = `1000 dpi x 1000 dpi - up to 35 ppm (mono) / up to 34 ppm (color) - capacity: 250 sheets - Hi-Speed USB - excellent dimensions for the small office` name = `Ultra Jet Mobile` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1051.jpg`
status = `Discontinued` quantity = `18` uom = `PC` currency_code = `EUR` price = `99.00` width = `46` depth = `32` height = `25` dim_unit = `cm` )
( product_id = `HT-1052` category = `Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `18` weight_unit = `KG`
description = `4800 dpi x 1200 dpi - up to 35 ppm (mono) / up to 34 ppm (color) - capacity: 250 sheets - Hi-Speed USB2.0, Ethernet` name = `Ultra Jet Super Highspeed` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1052.jpg`
status = `Available` quantity = `25` uom = `PC` currency_code = `EUR` price = `170.00` width = `41` depth = `41` height = `28` dim_unit = `cm` )
( product_id = `HT-1055` category = `Multifunction Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `6.3` weight_unit = `KG`
description = `1000 dpi x 1000 dpi - up to 16 ppm (mono) / up to 15 ppm (color)- capacity 80 sheets - scanner (216 x 297 mm, 1200dpi x 2400dpi)` name = `Multi Print` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1055.jpg`
status = `Available` quantity = `16` uom = `PC` currency_code = `EUR` price = `99.00` width = `55` depth = `45` height = `29` dim_unit = `cm` )
( product_id = `HT-1056` category = `Multifunction Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `4.3` weight_unit = `KG`
description = `1200 dpi x 1200 dpi - up to 25 ppm (mono) / up to 24 ppm (color)- capacity 80 sheets - scanner (216 x 297 mm, 2400dpi x 4800dpi, high resolution)` name = `Multi Color` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1056.jpg`
status = `Available` quantity = `5` uom = `PC` currency_code = `EUR` price = `119.00` width = `51` depth = `41.3` height = `22` dim_unit = `cm` )
( product_id = `HT-1060` category = `Mice` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `0.09` weight_unit = `KG`
description = `Cordless Optical USB Mice, Laptop, Color: Black, Plug&Play` name = `Cordless Mouse` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1060.jpg`
status = `Available` quantity = `25` uom = `PC` currency_code = `EUR` price = `9.00` width = `6` depth = `14.5` height = `3.5` dim_unit = `cm` )
( product_id = `HT-1061` category = `Mice` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `0.09` weight_unit = `KG`
description = `Optical USB, PS/2 Mouse, Color: Blue, 3-button-functionality (incl. Scroll wheel)` name = `Speed Mouse` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1061.jpg`
status = `Available` quantity = `12` uom = `PC` currency_code = `EUR` price = `7.00` width = `7` depth = `15` height = `3.1` dim_unit = `cm` )
( product_id = `HT-1062` category = `Mice` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `0.03` weight_unit = `KG`
description = `Optical USB Mouse, Color: Red, 5-button-functionality(incl. Scroll wheel), Plug&Play` name = `Track Mouse` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1062.jpg`
status = `Discontinued` quantity = `12` uom = `PC` currency_code = `EUR` price = `11.00` width = `3` depth = `7` height = `4` dim_unit = `cm` )
( product_id = `HT-1063` category = `Keyboards` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `2.1` weight_unit = `KG`
description = `Ergonomic USB Keyboard for Desktop, Plug&Play` name = `Ergonomic Keyboard` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1063.jpg`
status = `Available` quantity = `50` uom = `PC` currency_code = `EUR` price = `14.00` width = `50` depth = `21` height = `3.5` dim_unit = `cm` )
( product_id = `HT-1064` category = `Keyboards` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `1.8` weight_unit = `KG`
description = `Corded Keyboard with special keys for Internet Usability, USB` name = `Internet Keyboard` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1064.jpg`
status = `Out of Stock` quantity = `35` uom = `PC` currency_code = `EUR` price = `16.00` width = `52` depth = `25` height = `3` dim_unit = `cm` )
( product_id = `HT-1065` category = `Keyboards` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `2.3` weight_unit = `KG`
description = `Corded Ergonomic Keyboard with special keys for Media Usability, USB` name = `Media Keyboard` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1065.jpg`
status = `Available` quantity = `26` uom = `PC` currency_code = `EUR` price = `26.00` width = `51.4` depth = `23` height = `4` dim_unit = `cm` )
( product_id = `HT-1066` category = `Mousepads` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `80` weight_unit = `G`
description = `Nice mouse pad with ITelO Logo` name = `Mousepad` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1066.jpg`
status = `Available` quantity = `12` uom = `PC` currency_code = `EUR` price = `6.99` width = `15` depth = `6` height = `0.2` dim_unit = `cm` )
( product_id = `HT-1067` category = `Mousepads` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Oxynum` weight_measure = `80` weight_unit = `G`
description = `Ergonomic mouse pad with ITelO Logo` name = `Ergo Mousepad` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1067.jpg`
status = `Out of Stock` quantity = `16` uom = `PC` currency_code = `EUR` price = `8.99` width = `15` depth = `6` height = `0.2` dim_unit = `cm` )
( product_id = `HT-1068` category = `Mousepads` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Fasttech` weight_measure = `90` weight_unit = `G`
description = `ITelO Mousepad Special Edition` name = `Designer Mousepad` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1068.jpg`
status = `Available` quantity = `26` uom = `PC` currency_code = `EUR` price = `12.99` width = `24` depth = `24` height = `0.6` dim_unit = `cm` )
( product_id = `HT-1069` category = `Computer System Accessories` main_category = `Computer Systems` tax_tarif_code = `1` supplier_name = `Fasttech` weight_measure = `45` weight_unit = `G`
description = `Universal card reader` name = `Universal card reader` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1069.jpg`
status = `Available` quantity = `22` uom = `PC` currency_code = `EUR` price = `14.00` width = `6` depth = `6` height = `3` dim_unit = `cm` )
( product_id = `HT-1070` category = `Graphic Cards` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Ultrasonic United` weight_measure = `0.255` weight_unit = `KG`
description = `Proctra X: PCI-E GDDR5 3072MB` name = `Proctra X` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1070.jpg`
status = `Out of Stock` quantity = `15` uom = `PC` currency_code = `EUR` price = `70.90` width = `22` depth = `35` height = `17` dim_unit = `cm` )
( product_id = `HT-1071` category = `Graphic Cards` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Ultrasonic United` weight_measure = `0.3` weight_unit = `KG`
description = `Gladiator XLN: PCI-E GDDR5 3072MB DVI Out, TV Out low-noise` name = `Gladiator MX` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1071.jpg`
status = `Discontinued` quantity = `16` uom = `PC` currency_code = `EUR` price = `81.70` width = `22` depth = `35` height = `17` dim_unit = `cm` )
( product_id = `HT-1072` category = `Graphic Cards` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Ultrasonic United` weight_measure = `0.4` weight_unit = `KG`
description = `Hurricane GX: PCI-E 691 GFLOPS game-optimized` name = `Hurricane GX` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1072.jpg`
status = `Available` quantity = `13` uom = `PC` currency_code = `EUR` price = `101.20` width = `22` depth = `35` height = `17` dim_unit = `cm` )
( product_id = `HT-1073` category = `Graphic Cards` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Smartcards` weight_measure = `0.4` weight_unit = `KG`
description = `Hurricane GX/LN: PCI-E 691 GFLOPS game-optimized, low-noise.` name = `Hurricane GX/LN` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1073.jpg`
status = `Out of Stock` quantity = `5` uom = `PC` currency_code = `EUR` price = `139.99` width = `22` depth = `35` height = `17` dim_unit = `cm` )
( product_id = `HT-1080` category = `Scanners` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `2.3` weight_unit = `KG`
description = `Flatbed scanner - 9.600 × 9.600 dpi - 216 x 297 mm - Hi-Speed USB - Bluetooth` name = `Photo Scan` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1080.jpg`
status = `Out of Stock` quantity = `8` uom = `PC` currency_code = `EUR` price = `129.00` width = `34` depth = `48` height = `5` dim_unit = `cm` )
( product_id = `HT-1081` category = `Scanners` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `2.4` weight_unit = `KG`
description = `Flatbed scanner - 9.600 × 9.600 dpi - 216 x 297 mm - SCSI for backward compatibility` name = `Power Scan` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1081.jpg`
status = `Out of Stock` quantity = `11` uom = `PC` currency_code = `EUR` price = `89.00` width = `31` depth = `43` height = `7` dim_unit = `cm` )
( product_id = `HT-1082` category = `Scanners` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `3.2` weight_unit = `KG`
description = `Flatbed scanner - Letter - 2400 dpi x 2400 dpi - 216 x 297 mm - add-on module` name = `Jet Scan Professional` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1082.jpg`
status = `Out of Stock` quantity = `13` uom = `PC` currency_code = `EUR` price = `169.00` width = `33` depth = `41` height = `12` dim_unit = `cm` )
( product_id = `HT-1083` category = `Scanners` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Printer for All` weight_measure = `3.2` weight_unit = `KG`
description = `Flatbed scanner - A4 - 2400 dpi x 2400 dpi - 216 x 297 mm - add-on module` name = `Jet Scan Professional` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1083.jpg`
status = `Available` quantity = `10` uom = `PC` currency_code = `EUR` price = `189.00` width = `35` depth = `40` height = `10` dim_unit = `cm` )
( product_id = `HT-1085` category = `Multifunction Printers` main_category = `Printers & Scanners` tax_tarif_code = `1` supplier_name = `Alpha Printers` weight_measure = `23.2` weight_unit = `KG`
description = `Copymaster` name = `Copymaster` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1085.jpg`
status = `Available` quantity = `10` uom = `PC` currency_code = `EUR` price = `1499.00` width = `45` depth = `42` height = `22` dim_unit = `cm` )
( product_id = `HT-1090` category = `Speakers` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Speaker Experts` weight_measure = `3` weight_unit = `KG`
description = `PC multimedia speakers - 5 Watt (Total)` name = `Surround Sound` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1090.jpg`
status = `Available` quantity = `20` uom = `PC` currency_code = `EUR` price = `39.00` width = `12` depth = `10` height = `16` dim_unit = `cm` )
( product_id = `HT-1091` category = `Speakers` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Speaker Experts` weight_measure = `1.4` weight_unit = `KG`
description = `PC multimedia speakers - 10 Watt (Total) - 2-way` name = `Blaster Extreme` date_of_sale = ``
product_pic_url = `https://sdk.openui5.org/test-resources/sap/ui/documentation/sdk/images/HT-1091.jpg`
status = `Available` quantity = `15` uom = `PC` currency_code = `EUR` price = `26.00` width = `13` depth = `11` height = `17.5` dim_unit = `cm` )
( product_id = `HT-1092` category = `Speakers` main_category = `Computer Components` tax_tarif_code = `1` supplier_name = `Speaker Experts` weight_measure = `2.1` weight_unit = `KG`
The first 837 lines of 1151 — the whole class is on GitHub.
More in sap.m
- Carousel with Controls — With the Carousel a user can browse through multi-page content by swiping left or right.
- Tri-State Check Box — In this sample, the CheckBox reflects the selection states of its dependent input fields…
- Color Palette in a form — The standalone ColorPalette in a container (sap.ui.layout.SimpleForm).
- Table - Columns — The table shares many features with the list and, in addition, introduces columns. The ta…
- Table Test with OPA — The following example simulates a click on a list item in a table.
- Combo box — The combo box control provides a list box with items and a text field allowing the user t…
- Cookie Settings Dialog Pattern — The Cookie Settings Dialog allows you to easily manage the cookie settings according to t…
- Custom List Item — With the Custom List Item you can add any kind of content to lists.
- Custom Tree Item — With the Custom Tree Item you can add any kind of content to Tree.
- Date Picker - Open by Another Control — This example shows Date Picker which is opened by another control.
- Date Range Selection — The Date Range Selection is an extension of the Date Picker Control and enables the user…
- Date Time Picker — With the DateTimePicker a Date can be entered or selected including the time part.