Appian Community and Appian Academy are being upgraded. From July 24–August 3, the Appian Community will be in read-only mode. During this time, the site will be read-only and user registration will be disabled. We apologize for any inconvenience this may cause, but a more secure, stable, and performant Community experience is coming soon!
The new Appian Community launches August 3, followed by Appian Academy on August 7. During the migration, Appian Community Edition, Appian Academy, Documentation, Certifications, Instructor-led Customer Training, Partner Sales Training & Accreditation, and Forum (for Appian Partners and Customers only) will remain available.
Hi, I just wonder how the winner do this any idea?community.appian.com/.../split-grid
Discussion posts and replies are publicly visible
This dashboard might not use Appian's native grid components. Instead, it likely mimics a grid-like UI by combining layout tools like columnsLayout or sectionLayout with read-only fields.This simplifies mixed-content layouts while keeping a structured design.
It's just combination of multiple components and Visibility conditions.Having consistent use of layouts and clean UI makes Screen Intuitive & Attractive
It seems ColumnLayout is used to render the grid and the dynamic link is used to show the related details in a cardLayout. Other layout like side by side etc are used to display the details in intuitive manner.
Thanks for the brief response, any idea how the code will be?
This can be achieved using two grid fields separated by a section layout.
First a!gridField()
a!sectionLayout()
Second a!gridField()
Hi. I tried to replicate it. Refer this code.
a!localVariables( local!data: { { "first_name": "Grata", "last_name": "Sprigging", "age": 19, "gender": "Female", "email": "gsprigging0@webnode.com", "phone_number": "591-489-7807", "address": "1147 Springs Center", "city": "Moshiyi", "state": null, "country": "China", "birthdate": "4/9/1972", "occupation": "Biostatistician IV", "education_level": "PhD" }, { "first_name": "Becca", "last_name": "Backen", "age": 38, "gender": "Female", "email": "bbacken1@aol.com", "phone_number": "516-801-6756", "address": "75976 Brentwood Drive", "city": "Dalarik", "state": null, "country": "Armenia", "birthdate": "3/11/1977", "occupation": "Marketing Assistant", "education_level": "High School" }, { "first_name": "Bernete", "last_name": "Shaylor", "age": 56, "gender": "Female", "email": "bshaylor2@tuttocitta.it", "phone_number": "665-166-6231", "address": "3 Westport Lane", "city": "Tangxi", "state": null, "country": "China", "birthdate": "9/13/1961", "occupation": "Recruiter", "education_level": "Associate's Degree" }, { "first_name": "Elbertina", "last_name": "Zuann", "age": 22, "gender": "Female", "email": "ezuann3@zimbio.com", "phone_number": "469-480-1524", "address": "9756 Judy Park", "city": "Brudzew", "state": null, "country": "Poland", "birthdate": "1/17/1982", "occupation": "Pharmacist", "education_level": "High School" }, { "first_name": "Davin", "last_name": "Medcalf", "age": 24, "gender": "Male", "email": "dmedcalf4@mysql.com", "phone_number": "923-661-2407", "address": "67996 Forest Run Circle", "city": "Ganyi", "state": null, "country": "China", "birthdate": "1/23/1985", "occupation": "Engineer IV", "education_level": "Associate's Degree" }, { "first_name": "Sandy", "last_name": "Penwright", "age": 81, "gender": "Female", "email": "spenwright5@ed.gov", "phone_number": "151-768-3300", "address": "63 Cardinal Lane", "city": "Faaone", "state": null, "country": "French Polynesia", "birthdate": "6/18/1982", "occupation": "Automation Specialist I", "education_level": "High School" }, { "first_name": "Chrysa", "last_name": "Macilhench", "age": 67, "gender": "Female", "email": "cmacilhench6@miitbeian.gov.cn", "phone_number": "172-720-0782", "address": "878 Menomonie Center", "city": "Kufayrit", "state": null, "country": "Palestinian Territory", "birthdate": "7/13/1982", "occupation": "Project Manager", "education_level": "Master's Degree" }, { "first_name": "Gayel", "last_name": "Painter", "age": 38, "gender": "Female", "email": "gpainter7@archive.org", "phone_number": "542-334-4340", "address": "987 Lerdahl Parkway", "city": "Ochër", "state": null, "country": "Russia", "birthdate": "8/17/1964", "occupation": "Executive Secretary", "education_level": "PhD" }, { "first_name": "Evanne", "last_name": "Norway", "age": 43, "gender": "Female", "email": "enorway8@buzzfeed.com", "phone_number": "227-304-1738", "address": "402 Warrior Street", "city": "Cañasgordas", "state": null, "country": "Colombia", "birthdate": "8/5/1980", "occupation": "Recruiting Manager", "education_level": "PhD" }, { "first_name": "Letti", "last_name": "Haydon", "age": 27, "gender": "Bigender", "email": "lhaydon9@chron.com", "phone_number": "562-850-5581", "address": "3 Crest Line Drive", "city": "Wudian", "state": null, "country": "China", "birthdate": "6/27/1968", "occupation": "Physical Therapy Assistant", "education_level": "Associate's Degree" }, { "first_name": "Claiborne", "last_name": "Balk", "age": 24, "gender": "Male", "email": "cbalka@desdev.cn", "phone_number": "427-904-2405", "address": "90264 Union Park", "city": "Bulihan", "state": null, "country": "Philippines", "birthdate": "8/12/1974", "occupation": "Operator", "education_level": "Associate's Degree" }, { "first_name": "Hansiain", "last_name": "Guiett", "age": 18, "gender": "Genderqueer", "email": "hguiettb@house.gov", "phone_number": "113-672-2759", "address": "62018 Sundown Road", "city": "Senglea", "state": null, "country": "Malta", "birthdate": "6/22/1972", "occupation": "Food Chemist", "education_level": "PhD" }, { "first_name": "Fax", "last_name": "Birchenough", "age": 73, "gender": "Male", "email": "fbirchenoughc@cbsnews.com", "phone_number": "441-797-6950", "address": "2349 Dexter Avenue", "city": "ShashĹ«bay", "state": null, "country": "Kazakhstan", "birthdate": "6/8/1958", "occupation": "Project Manager", "education_level": "Master's Degree" }, { "first_name": "Sigfrid", "last_name": "Verdun", "age": 85, "gender": "Male", "email": "sverdund@techcrunch.com", "phone_number": "639-450-7393", "address": "66 Walton Circle", "city": "Ipatinga", "state": null, "country": "Brazil", "birthdate": "1/13/1987", "occupation": "Speech Pathologist", "education_level": "Master's Degree" }, { "first_name": "Erinn", "last_name": "Carl", "age": 72, "gender": "Female", "email": "ecarle@webmd.com", "phone_number": "374-587-9504", "address": "562 Armistice Pass", "city": "Talabaan", "state": null, "country": "Philippines", "birthdate": "12/31/1975", "occupation": "Human Resources Manager", "education_level": "High School" }, { "first_name": "Mamie", "last_name": "Atto", "age": 48, "gender": "Genderfluid", "email": "mattof@ifeng.com", "phone_number": "562-471-4576", "address": "26070 Waxwing Alley", "city": "Banjar Tegal Belodan", "state": null, "country": "Indonesia", "birthdate": "10/23/1988", "occupation": "Structural Engineer", "education_level": "Associate's Degree" }, { "first_name": "Barbabas", "last_name": "Gateland", "age": 30, "gender": "Male", "email": "bgatelandg@homestead.com", "phone_number": "731-946-6786", "address": "125 Wayridge Trail", "city": "Ô Môn", "state": null, "country": "Vietnam", "birthdate": "9/14/1956", "occupation": "Research Nurse", "education_level": "High School" }, { "first_name": "Dot", "last_name": "Millberg", "age": 29, "gender": "Agender", "email": "dmillbergh@google.nl", "phone_number": "423-990-2042", "address": "3164 Bartelt Trail", "city": "Mont-de-Marsan", "state": "Aquitaine", "country": "France", "birthdate": "7/24/1959", "occupation": "Programmer Analyst II", "education_level": "Associate's Degree" }, { "first_name": "Ivett", "last_name": "Hosby", "age": 32, "gender": "Female", "email": "ihosbyi@ox.ac.uk", "phone_number": "831-498-8244", "address": "98 High Crossing Road", "city": "Daidaon", "state": null, "country": "China", "birthdate": "4/5/1969", "occupation": "Electrical Engineer", "education_level": "PhD" }, { "first_name": "Barthel", "last_name": "Norvel", "age": 54, "gender": "Male", "email": "bnorvelj@cdc.gov", "phone_number": "273-397-2673", "address": "41881 Westport Place", "city": "Druzhny", "state": null, "country": "Belarus", "birthdate": "12/8/1984", "occupation": "Electrical Engineer", "education_level": "Master's Degree" } }, local!paging: a!pagingInfo(startIndex: 1, batchSize: 10), local!dataSubsetTemp: todatasubset( arrayToPage: local!data, pagingConfiguration: local!paging ), local!selectionId: tointeger(null), { a!cardLayout( contents: { a!columnsLayout( columns: { a!columnLayout( contents: { a!dropdownField( choiceLabels: {"Option 1", "Option 2", "Option 3", "Option 4", "Option 5", "Option 6", "Option 7", "Option 8", "Option 9", "Option 10", "Option 11", "Option 12"}, choiceValues: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, label: "City", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) } ), a!columnLayout( contents: { a!dropdownField( choiceLabels: {"Option 1", "Option 2", "Option 3", "Option 4", "Option 5", "Option 6", "Option 7", "Option 8", "Option 9", "Option 10", "Option 11", "Option 12"}, choiceValues: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, label: "Country", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) } ), a!columnLayout( contents: {} ), a!columnLayout( contents: {} ), a!columnLayout( contents: {} ), a!columnLayout( contents: {} ) } ) }, height: "AUTO", style: "NAVY_SCHEME", marginBelow: "STANDARD" ), a!columnsLayout( columns: { a!columnLayout( contents: { }, width: "EXTRA_NARROW" ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: { "Name" }, style: { "STRONG" } ) } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Email" }, style: "STRONG") } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Address" }, style: "STRONG") } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "City" }, style: "STRONG") } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Country" }, style: "STRONG") } ) } ) } ), a!forEach( items: local!dataSubsetTemp.data, expression: { a!horizontalLine(marginAbove: "NONE", marginBelow: "LESS"), a!columnsLayout( columns: { a!columnLayout( contents: { a!imageField( images: { a!userImage() }, size: "ICON_PLUS", style: "AVATAR", align: "CENTER" ) }, width: "EXTRA_NARROW" ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: { concat( fv!item.first_name, " ", fv!item.last_name ) }, link: a!dynamicLink( saveInto: { a!save(local!selectionId, fv!index) } ), linkStyle: "STANDALONE", style: { "STRONG" } ) } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { fv!item.email }) } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { fv!item.address }) } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { fv!item.city }) } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { fv!item.country }) } ) } ) }, alignVertical: "MIDDLE" ), if( fv!index = local!selectionId, { a!cardLayout( contents: { a!sideBySideLayout( items: { a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: { concat(fv!item.first_name, " ", fv!item.last_name) }, size: "MEDIUM_PLUS", style: { "STRONG" } ) } ), width: "MINIMIZE" ), a!sideBySideItem( item: a!tagField( labelPosition: "COLLAPSED", tags: { a!tagItem( text: "Active", backgroundColor: "POSITIVE" ) } ) ) } ), a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: { fv!item.occupation }, size: "STANDARD", style: { "STRONG" } ), " | Staff" } ), a!horizontalLine(), a!cardLayout( contents: { a!columnsLayout( columns: { a!columnLayout( contents: { a!imageField( label: "", labelPosition: "COLLAPSED", images: { a!userImage(user: null) }, size: "SMALL_PLUS", isThumbnail: false, style: "STANDARD" ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Field" }, style: { "STRONG" }), char(10), "test" } ), a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Field" }, style: { "STRONG" }), char(10), "test" } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Field" }, style: { "STRONG" }), char(10), "test" } ), a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Field" }, style: { "STRONG" }), char(10), "test" } ) } ), a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Field" }, style: { "STRONG" }), char(10), "test" } ), a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem(text: { "Field" }, style: { "STRONG" }), char(10), "test" } ) } ) }, alignVertical: "MIDDLE" ) }, height: "AUTO", style: "NONE", marginBelow: "STANDARD" ), a!cardLayout( contents: { a!columnsLayout( columns: { a!columnLayout( contents: { a!cardLayout( contents: { a!sideBySideLayout( items: { a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { "Total Awards", char(10), a!richTextItem( text: { "12" }, size: "MEDIUM_PLUS", style: { "STRONG" } ), char(10), a!richTextItem( text: { "20% Higher Last Year" }, size: "STANDARD" ) } ) ), a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextIcon(icon: "medal", size: "MEDIUM_PLUS") } ), width: "MINIMIZE" ) } ) }, height: "AUTO", style: "NONE", marginBelow: "STANDARD", showBorder: false ) } ), a!columnLayout( contents: { a!cardLayout( contents: { a!sideBySideLayout( items: { a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { "Total Awards", char(10), a!richTextItem( text: { "12" }, size: "MEDIUM_PLUS", style: { "STRONG" } ), char(10), a!richTextItem( text: { "20% Higher Last Year" }, size: "STANDARD" ) } ) ), a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextIcon(icon: "medal", size: "MEDIUM_PLUS") } ), width: "MINIMIZE" ) } ) }, height: "AUTO", style: "NONE", marginBelow: "STANDARD", showBorder: false ) } ), a!columnLayout( contents: { a!cardLayout( contents: { a!sideBySideLayout( items: { a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { "Total Awards", char(10), a!richTextItem( text: { "12" }, size: "MEDIUM_PLUS", style: { "STRONG" } ), char(10), a!richTextItem( text: { "20% Higher Last Year" }, size: "STANDARD" ) } ) ), a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextIcon(icon: "medal", size: "MEDIUM_PLUS") } ), width: "MINIMIZE" ) } ) }, height: "AUTO", style: "NONE", shape: "SEMI_ROUNDED", marginBelow: "STANDARD", showBorder: false ) } ), a!columnLayout( contents: { a!cardLayout( contents: { a!sideBySideLayout( items: { a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { "Total Awards", char(10), a!richTextItem( text: { "12" }, size: "MEDIUM_PLUS", style: { "STRONG" } ), char(10), a!richTextItem( text: { "20% Higher Last Year" }, size: "STANDARD" ) } ) ), a!sideBySideItem( item: a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextIcon(icon: "medal", size: "MEDIUM_PLUS") } ), width: "MINIMIZE" ) } ) }, height: "AUTO", style: "NONE", shape: "SEMI_ROUNDED", marginBelow: "STANDARD" ) } ) }, alignVertical: "MIDDLE" ) }, height: "AUTO", style: "TRANSPARENT", padding: "NONE", marginBelow: "NONE", showBorder: false ) }, height: "AUTO", style: "#e8e6e6", shape: "SEMI_ROUNDED", marginBelow: "STANDARD", showBorder: false ) }, {} ) } ), a!sideBySideLayout( items: { a!sideBySideItem(), a!sideBySideItem( item: a!richTextDisplayField( value: { a!richTextIcon( icon: "angle-double-left", link: a!dynamicLink( saveInto: { a!save(local!paging.startIndex, 1), a!save( local!dataSubsetTemp, /* Since we're retrieving users from an Appian group instead of a query, we make our own datasubset */ todatasubset(arrayToPage: local!data, pagingConfiguration: local!paging) ), a!save(local!selectionId, tointeger(null)) }, showWhen: local!paging.startIndex <> 1 ), linkStyle: "STANDALONE", color: if( local!paging.startIndex <> 1, "STANDARD", "SECONDARY" ) ), a!richTextIcon( icon: "angle-left", link: a!dynamicLink( saveInto: { a!save( local!paging.startIndex, if( local!paging.startIndex - local!paging.batchSize < 1, 1, local!paging.startIndex - local!paging.batchSize ) ), a!save(local!selectionId, tointeger(null)) }, showWhen: local!paging.startIndex <> 1 ), linkStyle: "STANDALONE", color: if( local!paging.startIndex <> 1, "STANDARD", "SECONDARY" ) ), " ", a!richTextItem( text: { local!paging.startIndex, " - ", if( local!paging.startIndex + local!paging.batchSize - 1 > local!dataSubsetTemp.totalCount, local!dataSubsetTemp.totalCount, local!paging.startIndex + local!paging.batchSize - 1 ) }, style: "STRONG" ), a!richTextItem( text: { " of ", fixed(local!dataSubsetTemp.totalCount, 0) } ), " ", a!richTextIcon( icon: "angle-right", link: a!dynamicLink( saveInto: { a!save( local!paging, a!pagingInfo( startIndex: local!paging.startIndex + local!paging.batchSize, batchSize: local!paging.batchSize ) ), a!save(local!selectionId, tointeger(null)) }, showWhen: local!paging.startIndex + local!paging.batchSize - 1 < local!dataSubsetTemp.totalCount ), linkStyle: "STANDALONE", color: if( local!paging.startIndex + local!paging.batchSize - 1 < local!dataSubsetTemp.totalCount, "STANDARD", "SECONDARY" ) ), a!richTextIcon( icon: "angle-double-right", link: a!dynamicLink( saveInto: { a!save( local!paging.startIndex, /* When jumping to the last page, make sure that the startIndex is an even multiple of batch size. * * This ensures that you have the same last page as if you had gotten there one page at a time. */ if( mod(local!dataSubsetTemp.totalCount, local!paging.batchSize) = 0, local!dataSubsetTemp.totalCount - local!paging.batchSize + 1, local!dataSubsetTemp.totalCount - mod(local!dataSubsetTemp.totalCount, local!paging.batchSize) + 1 ) ), a!save(local!selectionId, tointeger(null)) }, showWhen: local!paging.startIndex + local!paging.batchSize - 1 < local!dataSubsetTemp.totalCount ), linkStyle: "STANDALONE", color: if( local!paging.startIndex + local!paging.batchSize - 1 < local!dataSubsetTemp.totalCount, "STANDARD", "SECONDARY" ) ) } ), width: "MINIMIZE" ) } ) } )
Hi AbduI,
I have created something similar which uses card layouts and custom paging. This will render a grid which allows you to split rows, make individual selection and also has the ability to select or deselect all. You can add sort as shown in the shared split grid example and feed that value to the sort info of query record or entity which populates the grid data.
RSA_customGridFromColumnAndCardLayouts: a!localVariables( local!mainHeaders: if( a!isNullOrEmpty(ri!gridHeaders), {}, ri!gridHeaders ), local!cardData: if( a!isNullOrEmpty(ri!gridData), {}, ri!gridData ), local!selectedRow, local!viewDetails, local!pagingInfo: a!pagingInfo(startIndex: 1, batchSize: 3), local!data: todatasubset(local!cardData, local!pagingInfo), local!cardDataKeys: if( a!isNullOrEmpty(local!cardData), {}, a!keys(index(local!cardData, 1, {})) ), { a!columnsLayout( columns: { a!columnLayout( contents: { a!sideBySideLayout( items: { a!sideBySideItem( item: a!richTextDisplayField( value: { a!richTextItem( text: "Select All (" & if( a!isNullOrEmpty(local!selectedRow), 0, count(local!selectedRow) ) & ")", link: a!dynamicLink( value: index(local!cardData, "a", {}), saveInto: local!selectedRow, showWhen: if( a!isNullOrEmpty(local!cardData), false, count(local!cardData) <> count(local!selectedRow) ) ) ), a!richTextItem(text: " | "), a!richTextItem( text: "Deselect All (" & if( a!isNullOrEmpty(local!selectedRow), 0, count(local!selectedRow) ) & ")", link: a!dynamicLink( value: null, saveInto: local!selectedRow, showWhen: if( a!isNullOrEmpty(local!cardData), false, or( if( a!isNullOrEmpty(local!selectedRow), false, count(local!selectedRow) > 0 ), count(local!cardData) = count(local!selectedRow) ) ) ) ) }, align: "LEFT" ) ) } ) } ), a!columnLayout(contents: {}), a!columnLayout(contents: {}) } ), a!columnsLayout( columns: { a!forEach( items: local!mainHeaders, expression: a!columnLayout( contents: { a!cardLayout( contents: { a!richTextDisplayField( value: a!richTextItem(text: fv!item, style: "STRONG") ) }, height: "AUTO" ) } ) ) }, marginAbove: "NONE", marginBelow: "NONE", spacing: "NONE" ), a!cardLayout( contents: { a!richTextDisplayField( value: a!richTextItem(text: "No items available"), align: "CENTER", marginAbove: "NONE" ) }, showWhen: a!isNullOrEmpty(local!data.data) ), a!forEach( items: local!data.data, expression: { a!columnsLayout( columns: { a!localVariables( local!externalItem: fv!item, a!forEach( items: touniformstring( fn!apply( index(local!externalItem, _, null), local!cardDataKeys ) ), expression: { a!columnLayout( contents: { a!cardLayout( contents: { a!richTextDisplayField(value: a!richTextItem(text: fv!item)) }, link: a!dynamicLink( label: "Dynamic Link", value: local!externalItem.a, saveInto: { a!save( local!selectedRow, if( contains( { touniformstring(local!selectedRow) }, tostring(local!externalItem.a) ), difference( local!selectedRow, { local!externalItem.a } ), fn!append(local!selectedRow, local!externalItem.a) ) ) } ), height: "AUTO", style: if( contains( { touniformstring(local!selectedRow) }, tostring(local!externalItem.a) ), "ACCENT", "NONE" ) ) }, showWhen: fv!index <= 10 ), a!columnLayout( contents: { a!cardLayout( contents: { a!richTextDisplayField( value: a!richTextIcon( icon: if( a!isNullOrEmpty(local!viewDetails), "caret-square-right", if( contains( { touniformstring(local!viewDetails) }, tostring(local!externalItem.a) ), "caret-square-down", "caret-square-right" ) ), link: a!dynamicLink( value: local!externalItem.a, saveInto: { a!save( local!viewDetails, if( contains( { touniformstring(local!viewDetails) }, tostring(local!externalItem.a) ), difference( touniformstring(local!viewDetails), { tostring(local!externalItem.a) } ), local!externalItem.a ) ) } ) ) ) }, height: "AUTO", style: if( contains( { touniformstring(local!selectedRow) }, tostring(local!externalItem.a) ), "ACCENT", "NONE" ) ) }, showWhen: fv!index = 10 ) } ) ) }, showWhen: a!isNotNullOrEmpty(local!cardData), marginAbove: "NONE", marginBelow: "NONE", spacing: "NONE" ), a!columnsLayout( columns: { a!columnLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextIcon( icon: "level-down", color: "ACCENT" ) }, align: "CENTER" ) }, width: "EXTRA_NARROW" ), a!columnLayout( contents: { a!boxLayout( label: "This section is part of grid row : " & tostring(fv!item.a), contents: { a!richTextDisplayField( value: a!richTextBulletedList( items: tostring(fv!item.a) ) ), a!richTextDisplayField( value: a!richTextItem( text: "Close", link: a!dynamicLink( value: null, saveInto: local!viewDetails ) ), align: "RIGHT" ) }, style: "INFO", shape: "SEMI_ROUNDED" ) } ) }, showWhen: and( contains( { touniformstring(local!viewDetails) }, tostring(fv!item.a) ), a!isNotNullOrEmpty(local!cardData) ), marginBelow: "NONE", spacing: "NONE" ) } ), rule!RSA_customPaginationComponent( gridData: local!data, gridPagingInfo: local!pagingInfo ) } ) ======================================================================================== RSA_customPaginationComponent a!richTextDisplayField( value: { a!richTextItem( text: "<<", link: if( ri!gridPagingInfo.startIndex = 1, {}, a!dynamicLink( value: 1, saveInto: ri!gridPagingInfo.startIndex ) ), showWhen: and( ri!gridData.totalCount > 0, ri!gridPagingInfo.startIndex > 1 ), size: "MEDIUM", style: "STRONG" ), a!richTextItem(text: " "), a!richTextItem( text: "<", link: if( ri!gridPagingInfo.startIndex = 1, {}, a!dynamicLink( value: if( ri!gridPagingInfo.startIndex - ri!gridPagingInfo.batchSize < 1, 1, ri!gridPagingInfo.startIndex - ri!gridPagingInfo.batchSize ), saveInto: ri!gridPagingInfo.startIndex ) ), showWhen: and( ri!gridData.totalCount > 0, ri!gridPagingInfo.startIndex > 1 ), size: "MEDIUM", style: "STRONG" ), a!richTextItem(text: " "), a!richTextItem(text: "Showing "), a!richTextItem( text: ri!gridPagingInfo.startIndex & " - " & if( ri!gridPagingInfo.startIndex + ri!gridPagingInfo.batchSize > ri!gridData.totalCount, ri!gridData.totalCount, ri!gridPagingInfo.startIndex + ri!gridPagingInfo.batchSize - 1 ), style: "STRONG" ), a!richTextItem(text: " of " & ri!gridData.totalCount), a!richTextItem(text: " "), a!richTextItem( text: ">", link: if( ri!gridPagingInfo.startIndex + ri!gridPagingInfo.batchSize > ri!gridData.totalCount, {}, a!dynamicLink( value: ri!gridPagingInfo.startIndex + ri!gridPagingInfo.batchSize, saveInto: ri!gridPagingInfo.startIndex ) ), showWhen: and( ri!gridData.totalCount > 0, ri!gridPagingInfo.startIndex + ri!gridPagingInfo.batchSize <= ri!gridData.totalCount ), size: "MEDIUM", style: "STRONG" ), a!richTextItem(text: " "), a!richTextItem( text: ">>", link: if( ri!gridPagingInfo.startIndex + ri!gridPagingInfo.batchSize > ri!gridData.totalCount, {}, a!dynamicLink( value: ( fn!quotient( ri!gridData.totalCount, ri!gridPagingInfo.batchSize ) * ri!gridPagingInfo.batchSize ) + 1, saveInto: ri!gridPagingInfo.startIndex ) ), showWhen: and( ri!gridData.totalCount > 0, ri!gridPagingInfo.startIndex + ri!gridPagingInfo.batchSize <= ri!gridData.totalCount ), size: "MEDIUM", style: "STRONG" ), a!richTextItem(text: " ") }, showWhen: AND( a!isNotNullOrEmpty(ri!gridData), ri!gridData.totalCount > 0 ), align: "RIGHT" ) ======================================================================================== gridHeaders (List of Text String): { "Header1", "Header2", "Header3", "Header4", "Header5", "Header6", "Header7", "Header8", "Header9", "Header10", "Expand" } gridData (Any Type): { { a: "AAA", b: 1, c: "BBB", d: "AB1", e: "AB2", f: "AB3", g: "AB4", h: "AB5", i: "AB6", j: "AB7", k: "AB8", l: "AB9", m: "AB10", n: "AB11", o: "AB12", p: "AB13", q: "AB14", r: "AB15", s: "AB16", t: "AB17" }, { a: "CCC", b: 2, c: "DDD", d: "CD1", e: "CD2", f: "CD3", g: "CD4", h: "CD5", i: "CD6", j: "CD7", k: "CD8", l: "CD9", m: "CD10", n: "CD11", o: "CD12", p: "CD13", q: "CD14", r: "CD15", s: "CD16", t: "CD17" }, { a: "EEE", b: 3, c: "FFF", d: "EF1", e: "EF2", f: "EF3", g: "EF4", h: "EF5", i: "EF6", j: "EF7", k: "EF8", l: "EF9", m: "EF10", n: "EF11", o: "EF12", p: "EF13", q: "EF14", r: "EF15", s: "EF16", t: "EF17" }, { a: "GGG", b: 4, c: "HHH", d: "GH1", e: "GH2", f: "GH3", g: "GH4", h: "GH5", i: "GH6", j: "GH7", k: "GH8", l: "GH9", m: "GH10", n: "GH11", o: "GH12", p: "GH13", q: "GH14", r: "GH15", s: "GH16", t: "GH17" }, { a: "III", b: 5, c: "JJJ", d: "IJ1", e: "IJ2", f: "IJ3", g: "IJ4", h: "IJ5", i: "IJ6", j: "IJ7", k: "IJ8", l: "IJ9", m: "IJ10", n: "IJ11", o: "IJ12", p: "IJ13", q: "IJ14", r: "IJ15", s: "IJ16", t: "IJ17" }, { a: "KKK", b: 6, c: "LLL", d: "KL1", e: "KL2", f: "KL3", g: "KL4", h: "KL5", i: "KL6", j: "KL7", k: "KL8", l: "KL9", m: "KL10", n: "KL11", o: "KL12", p: "KL13", q: "KL14", r: "KL15", s: "KL16", t: "KL17" }, { a: "MMM", b: 7, c: "NNN", d: "MN1", e: "MN2", f: "MN3", g: "MN4", h: "MN5", i: "MN6", j: "MN7", k: "MN8", l: "MN9", m: "MN10", n: "MN11", o: "MN12", p: "MN13", q: "MN14", r: "MN15", s: "MN16", t: "MN17" }, { a: "OOO", b: 8, c: "PPP", d: "OP1", e: "OP2", f: "OP3", g: "OP4", h: "OP5", i: "OP6", j: "OP7", k: "OP8", l: "OP9", m: "OP10", n: "OP11", o: "OP12", p: "OP13", q: "OP14", r: "OP15", s: "OP16", t: "OP17" }, { a: "QQQ", b: 9, c: "RRR", d: "QR1", e: "QR2", f: "QR3", g: "QR4", h: "QR5", i: "QR6", j: "QR7", k: "QR8", l: "QR9", m: "QR10", n: "QR11", o: "QR12", p: "QR13", q: "QR14", r: "QR15", s: "QR16", t: "QR17" }, { a: "SSS", b: 10, c: "TTT", d: "ST1", e: "ST2", f: "ST3", g: "ST4", h: "ST5", i: "ST6", j: "ST7", k: "ST8", l: "ST9", m: "ST10", n: "ST11", o: "ST12", p: "ST13", q: "ST14", r: "ST15", s: "ST16", t: "ST17" } }