Aggregate nonnegative totals into Items with unique keys. For a single partition, use Nested = False, leave Rings empty and Items.RingKey blank. For nested charts, fill Rings and set every Items.RingKey to a Rings.Key, then set Nested = True. Item keys must remain unique across all rings. IsMissing = True means unavailable, while zero is a real value.
Create your own GetChartData Data Action or Server Action, authorize its query and return the typed Lists above. If an Aggregate returns entity records, map them explicitly into these public Structures using a For Each, Assign and ListAppend. Only bind a query result directly when its type already matches. The chart does not query your database.
Items · BluChartCircularItem List · sample records and mapping
Create a screen local Items of type BluChartCircularItem List. In your mapping action, use a temporary RowItems of type BluChartCircularItem. Fill every field used by this chart before appending each row.
ListClear(List: Items)
For Each source record in your ordered query result:
Assign RowItems fields from that record
ListAppend(List: Items, Element: RowItems)
Example Assign values for the first sample row:
RowItems.Key = "platform"
RowItems.Label = "Platform"
RowItems.Value = 420
RowItems.Color.Mode = Entities.ChartColorMode.Automatic
RowItems.Color.ThemeColor = Entities.ComponentColor.Primary
RowItems.Color.Hex = ""
RowItems.IsMissing = False
The loop describes your action flow, not code to paste into a JavaScript node. Replace the sample literals with your query fields. Reset optional fields on every iteration so values do not carry over from the previous row.
For a quick fixture, use JSON Deserialize with Data Type BluChartCircularItem List, then assign its Data output to Items. In the JSONString expression editor, wrap the copied JSON in a Text literal and double embedded quotes, or read it from a Text variable. The resulting Block input remains a typed List.
[
{
"Key": "platform",
"Label": "Platform",
"Value": 420,
"Color": {
"Mode": "Automatic",
"ThemeColor": "Primary",
"Hex": ""
},
"IsMissing": false
},
{
"Key": "services",
"Label": "Services",
"Value": 260,
"Color": {
"Mode": "Automatic",
"ThemeColor": "Primary",
"Hex": ""
},
"IsMissing": false
},
{
"Key": "support",
"Label": "Support",
"Value": 180,
"Color": {
"Mode": "Automatic",
"ThemeColor": "Primary",
"Hex": ""
},
"IsMissing": false
},
{
"Key": "training",
"Label": "Training",
"Value": 90,
"Color": {
"Mode": "Automatic",
"ThemeColor": "Primary",
"Hex": ""
},
"IsMissing": false
},
{
"Key": "other",
"Label": "Other",
"Value": 50,
"Color": {
"Mode": "Automatic",
"ThemeColor": "Primary",
"Hex": ""
},
"IsMissing": false
}
]
Rings · BluChartRing List · sample records and mapping
Create a screen local Rings of type BluChartRing List. In your mapping action, use a temporary RowRings of type BluChartRing. Fill every field used by this chart before appending each row.
Leave Rings as an empty BluChartRing List for this example.
The loop describes your action flow, not code to paste into a JavaScript node. Replace the sample literals with your query fields. Reset optional fields on every iteration so values do not carry over from the previous row.