Issue in editable grid bulk selection

Certified Senior Developer

Hi All,

I am having editable grid with selection and implemented pagination also for that grid. For selection given primary key for id in gridRowLayout.

but issue is if I selected all records in first page by click on header level checkbox and and go to next page and select all rows there also in same manner then my first page all selected primary keys is replacing with second page selected primary keys instead of appending all the selected primary key.

Please help in this

  Discussion posts and replies are publicly visible

  • This is another possible solution:

    a!localVariables(
      local!items: {
        a!map(id: 1, summary: "Item 1", qty: 1, unitPrice: 10, dept: "Sales",   due: today() + 10),
        a!map(id: 2, summary: "Item 2", qty: 2, unitPrice: 20, dept: "Finance", due: today() + 20),
        a!map(id: 3, summary: "Item 3", qty: 3, unitPrice: 30, dept: "Sales",   due: today() + 30),
        a!map(id: 4, summary: "Item 4", qty: 1, unitPrice: 10, dept: "Sales",   due: today() + 10),
        a!map(id: 5, summary: "Item 5", qty: 2, unitPrice: 20, dept: "Finance", due: today() + 20),
        a!map(id: 6, summary: "Item 6", qty: 3, unitPrice: 30, dept: "Sales",   due: today() + 30),
        a!map(id: 7, summary: "Item 7", qty: 1, unitPrice: 10, dept: "Sales",   due: today() + 10),
        a!map(id: 8, summary: "Item 8", qty: 2, unitPrice: 20, dept: "Finance", due: today() + 20),
        a!map(id: 9, summary: "Item 9", qty: 3, unitPrice: 30, dept: "Sales",   due: today() + 30),
        a!map(id: 10, summary: "Item 10", qty: 1, unitPrice: 10, dept: "Sales",   due: today() + 10),
        a!map(id: 11, summary: "Item 11", qty: 2, unitPrice: 20, dept: "Finance", due: today() + 20),
        a!map(id: 12, summary: "Item 13", qty: 3, unitPrice: 30, dept: "Sales",   due: today() + 30)
    
      },
      local!pagingInfo:a!pagingInfo(startIndex: 1,batchSize: 5),
      local!data: todatasubset(
        arrayToPage: local!items,
        pagingConfiguration: local!pagingInfo
      ),
      local!selectedIndices: tointeger({}),
      a!formLayout(
        label: "",
        contents: {
          a!gridLayout(
            headerCells: {
              a!gridLayoutHeaderCell(label: "Summary"),
              a!gridLayoutHeaderCell(label: "Qty", align: "RIGHT"),
              a!gridLayoutHeaderCell(label: "U/P", align: "RIGHT"),
              a!gridLayoutHeaderCell(label: "Amount", align: "RIGHT"),
              a!gridLayoutHeaderCell(label: "Department"),
              a!gridLayoutHeaderCell(label: "Due", align: "RIGHT"),
              a!gridLayoutHeaderCell(label: "Decision"),
              a!gridLayoutHeaderCell(label: "Reason")
            },
            columnConfigs: {
              a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 5),
              a!gridLayoutColumnConfig(width: "DISTRIBUTE"),
              a!gridLayoutColumnConfig(width: "DISTRIBUTE"),
              a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 2),
              a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3),
              a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3),
              a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3),
              a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3)
            },
            rows: a!forEach(
              /*items:todatasubset(arrayToPage: local!items,pagingConfiguration: local!pagingInfo),*/
              items: local!data.data,
              expression:{
                a!gridRowLayout(
                  id: fv!item.id,
                  contents: {
                    a!textField(
                      /* Labels are not visible in grid cells but are necessary to meet accessibility requirements */
                      label: "summary " & fv!index,
                      value: fv!item.summary,
                      readOnly: true
                    ),
                    a!integerField(
                      label: "qty " & fv!index,
                      value: fv!item.qty,
                      readOnly: true,
                      align: "RIGHT"
                    ),
                    a!floatingPointField(
                      label: "unitPrice " & fv!index,
                      value: fv!item.unitPrice,
                      readOnly: true,
                      align: "RIGHT"
                    ),
                    a!textField(
                      label: "amount " & fv!index,
                      value: if(
                        or(isnull(fv!item.qty), isnull(fv!item.unitPrice)),
                        null,
                        a!currency(
                          isoCode: "USD",
                          value: fv!item.qty * fv!item.unitPrice
                        )
                      ),
                      readOnly: true,
                      align: "RIGHT"
                    ),
                    a!dropdownField(
                      choiceLabels: {"Finance", "Sales"},
                      choiceValues: {"Finance", "Sales"},
                      label: "dept " & fv!index,
                      placeholder: "--Select-- ",
                      value: fv!item.dept,
                      disabled: true
                    ),
                    a!dateField(
                      label: "due " & fv!index,
                      value: fv!item.due,
                      readOnly: true,
                      align: "RIGHT"
                    ),
                    a!dropdownField(
                      choiceLabels: {"Approve", "Reject", "Need More Info"},
                      choiceValues: {"Approve", "Reject", "Need More Info"},
                      label: "decision " & fv!index,
                      placeholder: "--Select-- ",
                      value: fv!item.decision,
                      saveInto: fv!item.decision,
                      required: true
                    ),
                    a!textField(
                      label: "reason" & fv!index,
                      value: fv!item.reason,
                      saveInto: fv!item.reason,
                      required: and(
                        not(isnull(fv!item.decision)),
                        fv!item.decision <> "Approve"
                      ),
                      requiredMessage: "A reason is required for items that are not approved"
                    )
                  }
                )
              }
            ),
            selectionValue: local!selectedIndices,
            selectionSaveInto: {
              a!save(
                local!selectedIndices,
                a!localVariables(
                  local!currentPageIds: enumerate(length(local!data.data))+ local!pagingInfo.startIndex,
                  if(
                    a!isNullOrEmpty(
                      difference(
                        local!currentPageIds,
                        tointeger(a!flatten(save!value))
                      )
                    ),
                    union(
                      tointeger({}),
                      a!flatten(append(local!selectedIndices,a!flatten(save!value)))
                    ),
                    if(
                      a!isNullOrEmpty(a!flatten(save!value)),
                      difference(local!selectedIndices,local!currentPageIds),
                      a!flatten(save!value)
                    )
                  )
                )
              )
            },
            selectable: true,
            rowHeader: 2
          ),
          a!richTextDisplayField(
            labelPosition: "COLLAPSED",
            value: {
              a!richTextIcon(
                icon: "angle-left-bold",
                link: if(
                  local!pagingInfo.startIndex = 1,
                  null,
                  a!dynamicLink(
                    saveInto: a!save(local!pagingInfo.startIndex,local!pagingInfo.startIndex-local!pagingInfo.batchSize)
                  )
                )
              ),
              local!pagingInfo.startIndex&" to "&sum(tointeger(local!pagingInfo.startIndex),tointeger(local!pagingInfo.batchSize))-1,
              a!richTextIcon(
                icon: "angle-right-bold",
                link: a!dynamicLink(
                  saveInto: a!save(local!pagingInfo.startIndex,tointeger(local!pagingInfo.startIndex)+tointeger(local!pagingInfo.batchSize))
                )
              )
            },
            align: "LEFT"
          )
    
        },
      )
    )