From 6063ffa7d1d0f414e670b0ac109fbde6b8e6da18 Mon Sep 17 00:00:00 2001 From: Dan Cameron Date: Wed, 8 Mar 2023 09:19:12 +0100 Subject: [PATCH 1/3] Prevent failure on some start-up cases, when 'index_columns' are not present --- ipyaggrid/grid.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/ipyaggrid/grid.py b/ipyaggrid/grid.py index 16ba5d6..cef0d1d 100644 --- a/ipyaggrid/grid.py +++ b/ipyaggrid/grid.py @@ -227,13 +227,14 @@ def export(self, change): if(len(data_up['index_rows']['names']) != 0): to_df['index'] = pd.MultiIndex.from_tuples( *[data_up['index_rows']['values']], names=data_up['index_rows']['names']) - if len(data_up['index_columns'][0]) == 1: - index_columns = [elem[0] - for elem in data_up['index_columns']] - to_df['columns'] = index_columns - else: - to_df['columns'] = pd.MultiIndex.from_tuples( - *[data_up['index_columns']]) + if data_up['index_columns']: + if len(data_up['index_columns'][0]) == 1: + index_columns = [elem[0] + for elem in data_up['index_columns']] + to_df['columns'] = index_columns + else: + to_df['columns'] = pd.MultiIndex.from_tuples( + *[data_up['index_columns']]) to_df['data'] = data_up['data'] if self.export_to_df: self.grid_data_out['range'] = pd.DataFrame(**to_df) @@ -246,13 +247,14 @@ def export(self, change): if(len(data_up['index_rows']['names']) != 0): to_df['index'] = pd.MultiIndex.from_tuples( *[data_up['index_rows']['values']], names=data_up['index_rows']['names']) - if len(data_up['index_columns'][0]) == 1: - index_columns = [elem[0] - for elem in data_up['index_columns']] - to_df['columns'] = index_columns - else: - to_df['columns'] = pd.MultiIndex.from_tuples( - *[data_up['index_columns']]) + if data_up['index_columns']: + if len(data_up['index_columns'][0]) == 1: + index_columns = [elem[0] + for elem in data_up['index_columns']] + to_df['columns'] = index_columns + else: + to_df['columns'] = pd.MultiIndex.from_tuples( + *[data_up['index_columns']]) to_df['data'] = data_up['data'] if self.export_to_df: self.grid_data_out['cols'] = pd.DataFrame(**to_df) From f8869215435444ea1b8be406820dde31d4f9d839 Mon Sep 17 00:00:00 2001 From: Dan Cameron Date: Wed, 8 Mar 2023 09:44:58 +0100 Subject: [PATCH 2/3] Allow export of grouped column definitions to ('groups') _grid_data_up --- ipyaggrid/grid.py | 20 ++++++++++++++++++++ js/src/widget_builder.js | 9 +++++++++ js/src/widget_export.js | 30 +++++++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/ipyaggrid/grid.py b/ipyaggrid/grid.py index cef0d1d..1c4587f 100644 --- a/ipyaggrid/grid.py +++ b/ipyaggrid/grid.py @@ -261,6 +261,26 @@ def export(self, change): else: self.grid_data_out['cols'] = pd.DataFrame( **to_df).to_dict(orient='records') + if ('groups' in self._grid_data_up.keys()): + data_up = self._grid_data_up['groups'] + to_df = {} + if(len(data_up['index_rows']['names']) != 0): + to_df['index'] = pd.MultiIndex.from_tuples( + *[data_up['index_rows']['values']], names=data_up['index_rows']['names']) + if data_up['index_columns']: + if len(data_up['index_columns'][0]) == 1: + index_columns = [elem[0] + for elem in data_up['index_columns']] + to_df['columns'] = index_columns + else: + to_df['columns'] = pd.MultiIndex.from_tuples( + *[data_up['index_columns']]) + to_df['data'] = data_up['data'] + if self.export_to_df: + self.grid_data_out['groups'] = pd.DataFrame(**to_df) + else: + self.grid_data_out['groups'] = pd.DataFrame( + **to_df).to_dict(orient='records') x = 0 if 'counter' in self.grid_data_out: x = self.grid_data_out['counter'] diff --git a/js/src/widget_builder.js b/js/src/widget_builder.js index 3fcaf66..23ae8d0 100644 --- a/js/src/widget_builder.js +++ b/js/src/widget_builder.js @@ -140,6 +140,7 @@ const buildAgGrid = (view, gridData, gridOptions_str, div, sheet, dropdownMulti gridOptions.api.updateRowData({ remove: rows }); if (view.model.get('sync_grid')) { exportFunc.exportGrid(gridOptions, view); + exportFunc.exportGroupColumns(gridOptions, view); } } if (view.model.get('_export_mode') === 'rows') { @@ -148,6 +149,7 @@ const buildAgGrid = (view, gridData, gridOptions_str, div, sheet, dropdownMulti } if (view.model.get('_export_mode') === 'grid') { exportFunc.exportGrid(gridOptions, view); + exportFunc.exportGroupColumns(gridOptions, view); } if (view.model.get('_export_mode') === 'columns') { if (gridOptions.enableRangeSelection) exportFunc.exportColumns(gridOptions, view); @@ -161,6 +163,12 @@ const buildAgGrid = (view, gridData, gridOptions_str, div, sheet, dropdownMulti // console.log(params); exportFunc.exportGrid(gridOptions, view); }); + gridOptions.api.addEventListener('columnRowGroupChanged', params => { + exportFunc.exportGroupColumns(gridOptions, view); + }); + gridOptions.api.addEventListener('rowGroupOpened', params => { // forces sync of state + exportFunc.exportGroupColumns(gridOptions, view); + }); } // listen to _grid_data_down @@ -179,6 +187,7 @@ const buildAgGrid = (view, gridData, gridOptions_str, div, sheet, dropdownMulti exportFunc.exportRangeData(gridOptions, view); exportFunc.exportColumns(gridOptions, view); exportFunc.exportRowsOfRange(gridOptions, view); + exportFunc.exportGroupColumns(gridOptions, view); // } }); } diff --git a/js/src/widget_export.js b/js/src/widget_export.js index 123f6b4..1d1fd20 100644 --- a/js/src/widget_export.js +++ b/js/src/widget_export.js @@ -181,7 +181,35 @@ exportFunc.exportColumns = (options, view) => { index_columns: res.columns, }, }; - console.log(toUp); + //console.log(toUp); + view.model.set('_grid_data_up', toUp); + view.touch(); +}; +// Export current group columns +exportFunc.exportGroupColumns = (options, view) => { + const columns = [['Group']]; + const names = ['Index']; + const data = []; + const values = []; + let i = 0; + options.columnApi.getRowGroupColumns().forEach(col => { + data.push(col.colId); + values.push([i++]); + }); + const res = { + names, + values, + data, + columns, + }; + const toUp = { + groups: { + data: res.data, + index_rows: { names: res.names, values: res.values }, + index_columns: res.columns, + }, + }; + //console.log(toUp); view.model.set('_grid_data_up', toUp); view.touch(); }; From 0595319527077294c625c37637bff4c5fcb001c2 Mon Sep 17 00:00:00 2001 From: Dan Cameron Date: Wed, 8 Mar 2023 09:51:06 +0100 Subject: [PATCH 3/3] Also trap errors when getting unavailable columns; reduce some logging --- js/src/widget_export.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/js/src/widget_export.js b/js/src/widget_export.js index 1d1fd20..6116395 100644 --- a/js/src/widget_export.js +++ b/js/src/widget_export.js @@ -9,20 +9,16 @@ const exportFunc = {}; */ exportFunc.exportRangeData = (options, view) => { let rangeSelection; + let cols; try { - console.log(options.api.getCellRanges()) + //console.log(options.api.getCellRanges()) rangeSelection = options.api.getCellRanges(); + rangeSelection = rangeSelection[0]; + cols = findCorrectColumns(rangeSelection.columns, options); } catch (e) { console.log('No cells selected.'); return; } - - console.log(rangeSelection) - console.log(rangeSelection[0].startRow) - console.log(rangeSelection[0].endRow) - rangeSelection = rangeSelection[0]; - console.log(rangeSelection) - const cols = findCorrectColumns(rangeSelection.columns, options); const rows = []; const id1 = rangeSelection.startRow.rowIndex; @@ -52,7 +48,7 @@ exportFunc.exportRangeData = (options, view) => { index_columns: res.columns, }, }; - console.log(toUp); + //console.log(toUp); view.model.set('_grid_data_up', toUp); view.touch(); }; @@ -87,7 +83,7 @@ const exportRowsFunc = (options, view, rows) => { index_columns: res.columns, }, }; - console.log(toUp); + //console.log(toUp); view.model.set('_grid_data_up', toUp); view.touch(); }; @@ -149,13 +145,14 @@ function getCol(col, options) { exportFunc.exportColumns = (options, view) => { let rangeSelection; + let cols; try { rangeSelection = options.api.getCellRanges()[0]; + cols = findCorrectColumns(rangeSelection.columns, options); } catch (e) { console.log('No cells selected.'); return; } - const cols = findCorrectColumns(rangeSelection.columns, options); const rows = []; options.api.forEachNodeAfterFilterAndSort(node => rows.push(node)); @@ -255,7 +252,7 @@ exportFunc.exportGrid = function(options, view, level = 0) { index_columns: res.columns, }, }; - console.log(toUp); + //console.log(toUp); view.model.set('_grid_data_up', toUp); view.touch(); };