Please have a look 
This is a py function that generates the grid, there are also columns and records here:
def create_table_journal(df):
df_columns = ['log_dtime', 'log_dtime_', 'who_fixes',
'jira_link', 'comment_', 'fixed_at',
'error', 'process_name', 'info', 'launch_id_']
columns_edit = ['who_fixes', 'jira_link', 'comment_']
columns = []
for c in df_columns:
column = {
'headerName': c,
'field': c,
'editable': False if c not in columns_edit else True,
'hide': True if c in ['log_dtime', 'process_name'] else False,
'flex': 0.7,
'cellStyle': {
'white-space': 'pre-wrap'
}
}
if c == 'error':
column['flex'] = 5
if c == 'info':
column['flex'] = 3
columns.append(column)
columns.insert(2, {
"field": "multiStack",
"cellRenderer": "multiStack"
})
df_records = [
{'log_dtime': '2024-01-19 14:46:08.338183', 'log_dtime_': '2024-01-19\n14:02:08', 'who_fixes': '@gulimaster',
'jira_link': 'some_link', 'comment_': 'reset', 'fixed_at': None, 'error': 'rejected rows: 204',
'process_name': 'microservice', 'info': 'microservice:SOURCE\n\n--extract\n\n', 'launch_id_': 23125},
{'log_dtime': '2024-01-19 14:46:08.338183', 'log_dtime_': '2024-01-19\n14:03:58', 'who_fixes': None,
'jira_link': None, 'comment_': None, 'fixed_at': None, 'error': 'rejected rows: 204',
'process_name': 'microservice', 'info': 'microservice:SOURCE\n\n--extract\n\n', 'launch_id_': 23126},
{'log_dtime': '2024-01-19 14:46:08.338183', 'log_dtime_': '2024-01-19\n14:05:36', 'who_fixes': None,
'jira_link': None, 'comment_': None, 'fixed_at': None, 'error': 'rejected rows: 204',
'process_name': 'microservice', 'info': 'microservice:SOURCE\n\n--extract\n\n', 'launch_id_': 23127},
{'log_dtime': '2024-01-19 14:46:08.338183', 'log_dtime_': '2024-01-19\n14:06:38', 'who_fixes': '@gulimaster',
'jira_link': None, 'comment_': 'reset', 'fixed_at': '2024-01-19\n14:06:38', 'error': 'rejected rows: 204',
'process_name': 'microservice', 'info': 'microservice:SOURCE\n\n--extract\n\n', 'launch_id_': 23128},
{'log_dtime': '2024-01-19 14:46:08.338183', 'log_dtime_': '2024-01-19\n14:06:47', 'who_fixes': '@gulimaster',
'jira_link': None, 'comment_': 'reset', 'fixed_at': '2024-01-19\n14:06:38', 'error': 'rejected rows: 204',
'process_name': 'microservice', 'info': 'microservice:SOURCE\n\n--extract\n\n', 'launch_id_': 23129}]
table = html.Div(
[dag.AgGrid(
id='dash_table-journal',
rowData=df_records,
columnDefs=columns,
defaultColDef={
"resizable": True,
"sortable": True,
"filter": True,
'wrapText': True,
'autoHeight': True,
'singleClickEdit': True,
"cellStyle": {
'display': 'flex',
'justifyContent': 'flex-start',
'alignItems': 'center',
'fontSize': '13px',
'fontWeight': '400',
'padding': '10px',
'lineHeight': 'normal',
'border': '0.5px solid rgba(0,0,0,0.1)',
}
},
dashGridOptions={
"enableCellTextSelection": True,
"ensureDomOrder": True,
"domLayout": "autoHeight"
},
style={
'height': None
}
)]
)
return table
And cellRenderer js function:
var dagcomponentfuncs = window.dashAgGridComponentFunctions = window.dashAgGridComponentFunctions || {};
dagcomponentfuncs.multiStack = (props) => {
if (!props.data) {
return null
}
createColumn = (column) => {
return React.createElement('div',
{
style: {display: 'flex', justifyContent: 'center', alignItems: 'center'},
colId: column
}, [props.data[column]])
}
return React.createElement('div', {style: {display: 'flex', flexDirection: 'column'}},
[createColumn('who_fixes'), createColumn('jira_link'), createColumn('comment_')])
}