<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.appian.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Separating rows with specific data</title><link>https://community.appian.com/discussions/f/user-interface/39733/separating-rows-with-specific-data</link><description>Hi Team, 
 We have a requirement from the regarding a read-only grid. The grid is sorted first by Meeting Name, and then by Supplier Name. The client expects a visual indicator (like a bottom line or separator) between different suppliers to help users</description><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>RE: Separating rows with specific data</title><link>https://community.appian.com/thread/151616?ContentTypeID=1</link><pubDate>Thu, 18 Sep 2025 06:30:29 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:82c3705a-0c16-4708-b112-0d6bb105406e</guid><dc:creator>Shubham Aware</dc:creator><description>&lt;p&gt;Agree with you!&lt;br /&gt;Use the original data directly in the grid and add minimal visual indicators that work with fv!row.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Separating rows with specific data</title><link>https://community.appian.com/thread/151612?ContentTypeID=1</link><pubDate>Thu, 18 Sep 2025 03:48:06 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:23b1ded1-a54c-4b54-830b-b56548bd1ba7</guid><dc:creator>Goddati Venkatesh</dc:creator><description>&lt;p&gt;Hello&amp;nbsp;&amp;nbsp;&lt;a href="/members/harshk1671"&gt;Harsh Kumar Agarwal&lt;/a&gt;&amp;nbsp;,Thank you for your time. Yes, going for customization can really break the existing functionalities of OOTB features.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Separating rows with specific data</title><link>https://community.appian.com/thread/151611?ContentTypeID=1</link><pubDate>Thu, 18 Sep 2025 03:45:07 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:041eafbe-cfe0-4101-aca1-f09f364cc623</guid><dc:creator>Goddati Venkatesh</dc:creator><description>&lt;p&gt;Hello &lt;a href="/members/shubhama926776"&gt;Shubham Aware&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thank you for your efforts and time. The interface is really looking good. However, if we use this, the default features of the grid like search and user filter will not work.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Separating rows with specific data</title><link>https://community.appian.com/thread/151577?ContentTypeID=1</link><pubDate>Wed, 17 Sep 2025 08:12:11 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:94066113-03c2-475b-b3bf-b863a3c3c47b</guid><dc:creator>Harsh Kumar Agarwal</dc:creator><description>&lt;p&gt;There&amp;rsquo;s always an ongoing debate between using &lt;strong&gt;customization&lt;/strong&gt; versus &lt;strong&gt;out-of-the-box (OOTB)&lt;/strong&gt; features. In my opinion, customization is sometimes necessary. it can enhance usability and make the application more intuitive and visually appealing for the end user.&lt;/p&gt;
&lt;p&gt;However, we must also consider important factors such as &lt;strong&gt;scalability&lt;/strong&gt; and &lt;strong&gt;maintainability&lt;/strong&gt;. For example, if you implement a custom feature in one place, users may start expecting the same functionality across all similar components, like every grid in the application. This can quickly become difficult to manage and maintain.&lt;/p&gt;
&lt;p&gt;If there&amp;rsquo;s no OOTB feature that exactly meets the requirement, I would generally recommend &lt;strong&gt;avoiding customization&lt;/strong&gt; unless absolutely necessary. Instead, consider &lt;strong&gt;workarounds&lt;/strong&gt;. For instance, you could use a &lt;strong&gt;rich text display field&lt;/strong&gt; to show the supplier name and apply &lt;strong&gt;distinct colors&lt;/strong&gt; to each supplier to make them visually distinguishable. This approach keeps things simple, avoids heavy customization, and still improves the user experience.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Separating rows with specific data</title><link>https://community.appian.com/thread/151575?ContentTypeID=1</link><pubDate>Wed, 17 Sep 2025 07:05:06 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:51cd9546-72cb-4a15-ac8f-f65e54bbdd16</guid><dc:creator>Shubham Aware</dc:creator><description>&lt;p&gt;You can achieve this with multiple approach i tried 2 approach.&lt;br /&gt;Let&amp;#39;s have a look at it.&lt;br /&gt;&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;a!localVariables(
  /* Sample data matching your structure */
  local!data: {
    a!map(meetingName: &amp;quot;Meeting A&amp;quot;, supplierName: &amp;quot;Supplier A&amp;quot;, data: 23),
    a!map(meetingName: &amp;quot;Meeting A&amp;quot;, supplierName: &amp;quot;Supplier A&amp;quot;, data: 87),
    a!map(meetingName: &amp;quot;Meeting A&amp;quot;, supplierName: &amp;quot;Supplier B&amp;quot;, data: 56),
    a!map(meetingName: &amp;quot;Meeting A&amp;quot;, supplierName: &amp;quot;Supplier B&amp;quot;, data: 7),
    a!map(meetingName: &amp;quot;Meeting B&amp;quot;, supplierName: &amp;quot;Supplier A&amp;quot;, data: 45),
    a!map(meetingName: &amp;quot;Meeting B&amp;quot;, supplierName: &amp;quot;Supplier A&amp;quot;, data: 456),
    a!map(meetingName: &amp;quot;Meeting B&amp;quot;, supplierName: &amp;quot;Supplier B&amp;quot;, data: 56),
    a!map(meetingName: &amp;quot;Meeting B&amp;quot;, supplierName: &amp;quot;Supplier B&amp;quot;, data: 56)
  },

  /* Sort data by Meeting Name, then Supplier Name */
  local!sortedData: todatasubset(
    local!data,
    a!pagingInfo(
      startIndex: 1,
      batchSize: -1,
      sort: {
        a!sortInfo(field: &amp;quot;meetingName&amp;quot;, ascending: true),
        a!sortInfo(field: &amp;quot;supplierName&amp;quot;, ascending: true)
      }
    )
  ).data,

  /* Add index and previous supplier info to each row */
  local!dataWithIndex: a!forEach(
    items: local!sortedData,
    expression: a!map(
      meetingName: fv!item.meetingName,
      supplierName: fv!item.supplierName,
      data: fv!item.data,
      index: fv!index,
      isNewSupplier: or(
        fv!index = 1,
        fv!item.supplierName &amp;lt;&amp;gt; index(local!sortedData, fv!index - 1, {}).supplierName
      )
    )
  ),

  {
    a!sectionLayout(
      label: &amp;quot;&amp;quot;,
      contents: {
        /* Approach 1: Using Horizontal Line Separators */
        a!cardLayout(
          contents: {
            a!richTextDisplayField(
              label: &amp;quot;Approach 1: Line Separators&amp;quot;,
              labelPosition: &amp;quot;ABOVE&amp;quot;,
              value:{}
            ),
            a!gridField(
              label: &amp;quot;&amp;quot;,
              labelPosition: &amp;quot;COLLAPSED&amp;quot;,
              data: local!dataWithIndex,
              columns: {
                a!gridColumn(
                  label: &amp;quot;Meeting Name&amp;quot;,
                  value: a!richTextDisplayField(
                    value: {
                      if(
                        and(
                          fv!row.index &amp;gt; 1,
                          fv!row.isNewSupplier
                        ),
                        {
                          a!richTextItem(
                            text: &amp;quot;────────────────────&amp;quot;,
                            color: &amp;quot;SECONDARY&amp;quot;,
                            size: &amp;quot;SMALL&amp;quot;
                          ),
                          a!richTextItem(
                            text: char(10),
                            size: &amp;quot;SMALL&amp;quot;
                          )
                        },
                        {}
                      ),
                      a!richTextItem(
                        text: fv!row.meetingName,
                        style: if(
                          fv!row.isNewSupplier,
                          &amp;quot;STRONG&amp;quot;,
                          &amp;quot;PLAIN&amp;quot;
                        )
                      )
                    }
                  ),
                  width: &amp;quot;AUTO&amp;quot;
                ),
                a!gridColumn(
                  label: &amp;quot;Supplier Name&amp;quot;,
                  value: a!richTextDisplayField(
                    value: {
                      if(
                        and(
                          fv!row.index &amp;gt; 1,
                          fv!row.isNewSupplier
                        ),
                        {
                          a!richTextItem(
                            text: &amp;quot;────────────────────&amp;quot;,
                            color: &amp;quot;SECONDARY&amp;quot;,
                            size: &amp;quot;SMALL&amp;quot;
                          ),
                          a!richTextItem(
                            text: char(10),
                            size: &amp;quot;SMALL&amp;quot;
                          )
                        },
                        {}
                      ),
                      if(
                        fv!row.isNewSupplier,
                        {
                          a!richTextItem(
                            text: &amp;quot;▼ &amp;quot;,
                            color: &amp;quot;ACCENT&amp;quot;,
                            size: &amp;quot;MEDIUM&amp;quot;
                          ),
                          a!richTextItem(
                            text: fv!row.supplierName,
                            style: &amp;quot;STRONG&amp;quot;,
                            color: &amp;quot;ACCENT&amp;quot;
                          )
                        },
                        a!richTextItem(
                          text: &amp;quot;   &amp;quot; &amp;amp; fv!row.supplierName,
                          size: &amp;quot;STANDARD&amp;quot;
                        )
                      )
                    }
                  ),
                  width: &amp;quot;AUTO&amp;quot;
                ),
                a!gridColumn(
                  label: &amp;quot;Data&amp;quot;,
                  value: a!richTextDisplayField(
                    value: {
                      if(
                        and(
                          fv!row.index &amp;gt; 1,
                          fv!row.isNewSupplier
                        ),
                        {
                          a!richTextItem(
                            text: &amp;quot;────────&amp;quot;,
                            color: &amp;quot;SECONDARY&amp;quot;,
                            size: &amp;quot;SMALL&amp;quot;
                          ),
                          a!richTextItem(
                            text: char(10),
                            size: &amp;quot;SMALL&amp;quot;
                          )
                        },
                        {}
                      ),
                      a!richTextItem(
                        text: fv!row.data,
                        style: if(
                          fv!row.isNewSupplier,
                          &amp;quot;STRONG&amp;quot;,
                          &amp;quot;PLAIN&amp;quot;
                        )
                      )
                    }
                  ),
                  width: &amp;quot;AUTO&amp;quot;,
                  align: &amp;quot;END&amp;quot;
                )
              },
              rowHeader: 1,
              height: &amp;quot;AUTO&amp;quot;,
              borderStyle: &amp;quot;LIGHT&amp;quot;,
              shadeAlternateRows: false,
              spacing: &amp;quot;DENSE&amp;quot;
            )
          },
          style: &amp;quot;NONE&amp;quot;,
          padding: &amp;quot;STANDARD&amp;quot;,
          marginBelow: &amp;quot;STANDARD&amp;quot;
        ),

        /* Approach 2: Using Colored Text and Icons */
        a!cardLayout(
          contents: {
            a!richTextDisplayField(
              label: &amp;quot;Approach 2: Colored Indicators&amp;quot;,
              labelPosition: &amp;quot;ABOVE&amp;quot;,
              value: {}
            ),
            a!gridField(
              label: &amp;quot;&amp;quot;,
              labelPosition: &amp;quot;COLLAPSED&amp;quot;,
              data: local!dataWithIndex,
              columns: {
                a!gridColumn(
                  label: &amp;quot;&amp;quot;,
                  value: a!richTextDisplayField(
                    value: {
                      a!richTextItem(
                        text: if(
                          fv!row.isNewSupplier,
                          &amp;quot;●&amp;quot;,
                          &amp;quot;&amp;quot;
                        ),
                        color: &amp;quot;POSITIVE&amp;quot;,
                        size: &amp;quot;LARGE&amp;quot;,
                        style: &amp;quot;STRONG&amp;quot;
                      )
                    }
                  ),
                  width: &amp;quot;ICON&amp;quot;
                ),
                a!gridColumn(
                  label: &amp;quot;Meeting Name&amp;quot;,
                  value: a!richTextDisplayField(
                    value: a!richTextItem(
                      text: fv!row.meetingName,
                      style: if(
                        fv!row.isNewSupplier,
                        &amp;quot;STRONG&amp;quot;,
                        &amp;quot;PLAIN&amp;quot;
                      ),
                      size: if(
                        fv!row.isNewSupplier,
                        &amp;quot;MEDIUM&amp;quot;,
                        &amp;quot;STANDARD&amp;quot;
                      )
                    )
                  ),
                  width: &amp;quot;AUTO&amp;quot;
                ),
                a!gridColumn(
                  label: &amp;quot;Supplier Name&amp;quot;,
                  value: a!richTextDisplayField(
                    value: {
                      if(
                        fv!row.isNewSupplier,
                        {
                          a!richTextItem(
                            text: &amp;quot;► &amp;quot;,
                            color: &amp;quot;POSITIVE&amp;quot;,
                            style: &amp;quot;STRONG&amp;quot;,
                            size: &amp;quot;MEDIUM&amp;quot;
                          ),
                          a!richTextItem(
                            text: fv!row.supplierName,
                            style: &amp;quot;STRONG&amp;quot;,
                            color: &amp;quot;POSITIVE&amp;quot;,
                            size: &amp;quot;MEDIUM&amp;quot;
                          )
                        },
                        a!richTextItem(
                          text: fv!row.supplierName,
                          color: &amp;quot;SECONDARY&amp;quot;
                        )
                      )
                    }
                  ),
                  width: &amp;quot;AUTO&amp;quot;
                ),
                a!gridColumn(
                  label: &amp;quot;Data&amp;quot;,
                  value: a!richTextDisplayField(
                    value: a!richTextItem(
                      text: fv!row.data,
                      style: if(
                        fv!row.isNewSupplier,
                        &amp;quot;STRONG&amp;quot;,
                        &amp;quot;PLAIN&amp;quot;
                      ),
                      size: if(
                        fv!row.isNewSupplier,
                        &amp;quot;MEDIUM&amp;quot;,
                        &amp;quot;STANDARD&amp;quot;
                      )
                    )
                  ),
                  width: &amp;quot;AUTO&amp;quot;,
                  align: &amp;quot;END&amp;quot;
                )
              },
              rowHeader: 1,
              height: &amp;quot;AUTO&amp;quot;,
              borderStyle: &amp;quot;LIGHT&amp;quot;,
              shadeAlternateRows: true,
              spacing: &amp;quot;DENSE&amp;quot;
            )
          },
          style: &amp;quot;NONE&amp;quot;,
          padding: &amp;quot;STANDARD&amp;quot;,
          marginBelow: &amp;quot;STANDARD&amp;quot;
        ),

      }
    )
  }
)&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>