I am trying to custom sort a grouped AG-Grid on the sport column based on a list SPORT_ORDER = [“Swimming”, “Gymnastics”, “Speed Skating”] but am unable to setup a comparator for it.
If anyone can please help find out the issue with this, would be great.
import dash
from dash import html
import dash_ag_grid as dag
import pandas as pd, json
SPORT_ORDER = ["Swimming", "Gymnastics", "Speed Skating"]
_value_comparator = {
"function": f"""
function(a, b) {{
const order = {json.dumps(SPORT_ORDER)};
const ia = order.indexOf(a), ib = order.indexOf(b);
if (ia < 0 && ib < 0) return 0;
if (ia < 0) return 1;
if (ib < 0) return -1;
return ia - ib;
}}
"""
}
df = pd.DataFrame({
"athlete": ["Michael Phelps","Aleksey Nemov","Cindy Klassen",
"Nastia Liukin","test","test2"],
"sport": ["Swimming","Speed Skating","Gymnastics",
"Gymnastics","Swimming","Swimming"],
"gold": [8,2,1,1,2,3],
})
column_defs = [
{
"field": "sport",
"rowGroup": True,
"hide": True,
"sortable": True,
"sort": "asc", # triggers the comparator
"comparator": _value_comparator,
},
{"field": "athlete", "minWidth": 150},
{"field": "gold", "aggFunc": "sum", "width": 90},
]
auto_group_def = {
"headerName": "Sport (custom order)",
"cellRenderer": "agGroupCellRenderer",
"cellRendererParams": {"suppressCount": True},
}
app = dash.Dash(__name__)
app.layout = html.Div(
dag.AgGrid(
rowData=df.to_dict("records"),
columnDefs=column_defs,
defaultColDef={"resizable": True, "filter": True},
dashGridOptions={
"groupDisplayType": "singleColumn",
"rowGroupPanelShow": "always",
"autoGroupColumnDef": auto_group_def,
},
enableEnterpriseModules=True,
dangerously_allow_code=True,
style={"height": 400, "width": 600},
)
)
if __name__ == "__main__":
app.run_server(debug=True)