7f95b312 by Ean Schuessler

Add nextCursor pagination to grid responses

- FTL: Capture Moqui pagination vars (pageIndex, pageSize, pageMaxIndex, listCount)
- Compact mode: Add nextCursor object with pageIndex, pageSize, hasMore
- ARIA mode: Add nextCursor to grid nodes
- Add totalCount to show full result size

Usage: Pass nextCursor values as parameters to get next page:
  parameters: {pageIndex: 1, pageSize: 20}

Response format:
  nextCursor: {pageIndex: 1, pageSize: 20, hasMore: true}
  totalCount: 29
1 parent 0153ca18
......@@ -266,11 +266,18 @@
<#assign formListColumnList = formListInfo.getAllColInfo()>
<#assign listObject = formListInfo.getListObject(false)!>
<#assign totalItems = (listObject?size)!0>
<#-- Get pagination variables from context (set by Moqui's XmlActions) -->
<#assign listName = formNode["@list"]!"">
<#assign pageIndex = (ec.context[listName + "PageIndex"])!0>
<#assign pageSize = (ec.context[listName + "PageSize"])!20>
<#assign listCount = (ec.context[listName + "Count"])!totalItems>
<#assign pageMaxIndex = (ec.context[listName + "PageMaxIndex"])!0>
<#if mcpSemanticData??>
<#assign formName = (.node["@name"]!"")?string>
<#assign displayedItems = (totalItems > 50)?then(50, totalItems)>
<#assign isTruncated = (totalItems > 50)>
<#assign hasMorePages = (pageIndex < pageMaxIndex)>
<#assign columnNames = []>
<#list formListColumnList as columnFieldList>
<#assign fieldNode = columnFieldList[0]>
......@@ -395,7 +402,7 @@
<#assign dummy = ec.context.put("tempListObject", listObject)!>
<#assign dummy = ec.context.put("tempColumnNames", columnNames)!>
<#assign dummy = ec.context.put("tempFieldMetaList", fieldMetaList)!>
<#assign dummy = ec.resource.expression("mcpSemanticData.put('" + formName?js_string + "', tempListObject); if (mcpSemanticData.formMetadata == null) mcpSemanticData.formMetadata = [:]; mcpSemanticData.formMetadata.put('" + formName?js_string + "', [name: '" + formName?js_string + "', type: 'form-list', map: '', fields: tempFieldMetaList]); if (mcpSemanticData.listMetadata == null) mcpSemanticData.listMetadata = [:]; mcpSemanticData.listMetadata.put('" + formName?js_string + "', [name: '" + formName?js_string + "', totalItems: " + totalItems + ", displayedItems: " + displayedItems + ", truncated: " + isTruncated?string + ", columns: tempColumnNames])", "")!>
<#assign dummy = ec.resource.expression("mcpSemanticData.put('" + formName?js_string + "', tempListObject); if (mcpSemanticData.formMetadata == null) mcpSemanticData.formMetadata = [:]; mcpSemanticData.formMetadata.put('" + formName?js_string + "', [name: '" + formName?js_string + "', type: 'form-list', map: '', fields: tempFieldMetaList, pageIndex: " + pageIndex + ", pageSize: " + pageSize + ", pageMaxIndex: " + pageMaxIndex + ", listCount: " + listCount + "]); if (mcpSemanticData.listMetadata == null) mcpSemanticData.listMetadata = [:]; mcpSemanticData.listMetadata.put('" + formName?js_string + "', [name: '" + formName?js_string + "', totalItems: " + totalItems + ", displayedItems: " + displayedItems + ", truncated: " + isTruncated?string + ", columns: tempColumnNames])", "")!>
</#if>
<#-- Header Row -->
......
......@@ -944,12 +944,27 @@ def convertToAriaTree = { semanticState, targetScreenPath ->
children << searchNode
}
// Get pagination info from formData
def pageIndex = formData.pageIndex ?: 0
def pageSize = formData.pageSize ?: 20
def pageMaxIndex = formData.pageMaxIndex ?: 0
def listCount = formData.listCount ?: itemCount
def gridNode = [
role: "grid",
name: formData.name ?: formName,
ref: formName,
rowcount: itemCount
rowcount: listCount
]
// Add pagination cursor if there are more pages
if (pageIndex < pageMaxIndex) {
gridNode.nextCursor = [
pageIndex: pageIndex + 1,
pageSize: pageSize,
hasMore: (pageIndex + 1) < pageMaxIndex
]
}
// Add column info (only non-searchable display columns)
def displayColumns = formData.fields?.findAll { !it.searchable }?.collect { it.title ?: it.name }
......@@ -1260,9 +1275,21 @@ def convertToCompactFormat = { semanticState, targetScreenPath ->
rowInfo
}
if (listData.size() > 10) {
gridInfo.more = listData.size() - 10
// Add pagination cursor if there are more pages
def gridPageIndex = formData.pageIndex ?: 0
def gridPageSize = formData.pageSize ?: 20
def gridPageMaxIndex = formData.pageMaxIndex ?: 0
def gridListCount = formData.listCount ?: listData.size()
if (gridPageIndex < gridPageMaxIndex) {
// There are more pages - provide nextCursor
gridInfo.nextCursor = [
pageIndex: gridPageIndex + 1,
pageSize: gridPageSize,
hasMore: (gridPageIndex + 1) < gridPageMaxIndex
]
}
gridInfo.totalCount = gridListCount
} else {
gridInfo.rowCount = 0
}
......