1

See, I have a table where duplicate entries are highlighted using the highlight property of sap.m.Table. Now im trying to implement a toggle button that lets the user decide whether he wants the duplicates highlighted or not.

In my controller, I created the toggle button function which toggles the model property "compare" of the client-side model "compareModel" which is bound to my table.

My default model is the model for the table items. The bound "dupe" property either contains "Success" or "Error".

This works:

<ColumnListItem highlight="{dupe}">
  <Text text="{myItemText}" />
  <!-- ... -->
</ColumnListItem>

Now for my problem:

I want to set the highlight property based on whether the toggle button is pressed or not. So far, my expression binding attempts looked something like this:

<ColumnListItem highlight="{= ${compareModel>/compare} ? ${dupe} : false }">

I tried putting quotation marks here and there but so far no luck. Hoping somebody can help me out!

Boghyon Hoffmann
  • 17,103
  • 12
  • 72
  • 170
doostaay
  • 71
  • 2
  • 12

1 Answers1

1

Try with highlight="{= ${compareModel>/compare} ? ${dupe} : undefined }.

Working sample:

globalThis.onUI5Init = () => sap.ui.require([
  "sap/ui/core/mvc/XMLView",
  "sap/ui/model/json/JSONModel", // sample model. Applies also to ODataModel
], async function (XMLView, JSONModel) {
  "use strict";

  const control = await XMLView.create({
    definition: `<mvc:View xmlns:mvc="sap.ui.core.mvc"
      xmlns="sap.m"
      displayBlock="true"
      height="100%"
    >
      <App>
        <Page title="Toggle Highlight">
          <headerContent>
            <Switch
              state="{compareModel>/compare}"
              customTextOn=" "
              customTextOff=" "
            />
          </headerContent>
          <List items="{/items}">
            <StandardListItem
              title="{myItemText}"
              highlight="{= %{compareModel>/compare} ? %{dupe} : undefined }"
            />
          </List>
        </Page>
      </App>
    </mvc:View>`,
    models: {
      "compareModel": new JSONModel({ "compare": true }),
      undefined: new JSONModel({
        "items": [
          {
            "myItemKey": 1,
            "myItemText": "A",
            "dupe": "Error"
          },
          {
            "myItemKey": 2,
            "myItemText": "B",
            "dupe": "Success"
          },
          {
            "myItemKey": 3,
            "myItemText": "A",
            "dupe": "Error"
          }
        ]
      }),
    },
  });
  control.placeAt("content");
});
<script id="sap-ui-bootstrap" src="https://sdk.openui5.org/resources/sap-ui-core.js"
  data-sap-ui-libs="sap.ui.core,sap.m,sap.ui.layout,sap.ui.unified"
  data-sap-ui-async="true"
  data-sap-ui-oninit="onUI5Init"
  data-sap-ui-theme="sap_horizon"
  data-sap-ui-compatversion="edge"
  data-sap-ui-excludejquerycompat="true"
  data-sap-ui-xx-waitfortheme="init"
></script>
<body id="content" class="sapUiBody"></body>

The issue with highlight="{= ... ? ... : false }" is that false is not a valid value from the enum sap.ui.core.MessageType/.IndicationColor for the list item's highlight property. You should see a console error reporting a similar issue.

With undefined, however, the default value of highlight will be applied which is "None" for sap.m.ListBase controls.

Boghyon Hoffmann
  • 17,103
  • 12
  • 72
  • 170