Skip to content

Commit b105034

Browse files
author
Tim Shawver
committed
Disable grouping when we're filtered by any other column other than level 0 of the multiindex. Fix for converting PeriodIndex values to strings in pandas 0.18.x. Don't get the _primary_key from the generated json anymore, because it seems it's often not included and we already have code that figures it out.
1 parent 75f49d0 commit b105034

4 files changed

Lines changed: 36 additions & 31 deletions

File tree

js/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "qgrid",
3-
"version": "1.0.5",
3+
"version": "1.0.6-beta.3",
44
"description": "An Interactive Grid for Sorting and Filtering DataFrames in Jupyter Notebook",
55
"author": "Quantopian Inc.",
66
"main": "src/index.js",

js/src/qgrid.widget.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ class QgridModel extends widgets.DOMWidgetModel {
3636
_view_name : 'QgridView',
3737
_model_module : 'qgrid',
3838
_view_module : 'qgrid',
39-
_model_module_version : '^1.0.5',
40-
_view_module_version : '^1.0.5',
39+
_model_module_version : '^1.0.6-beta.3',
40+
_view_module_version : '^1.0.6-beta.3',
4141
_df_json: '',
4242
_columns: {}
4343
});
@@ -643,6 +643,7 @@ class QgridView extends widgets.DOMWidgetView {
643643
this.update_timeout = setTimeout(() => {
644644
var df_json = JSON.parse(this.model.get('_df_json'));
645645
this.row_styles = this.model.get("_row_styles");
646+
this.multi_index = this.model.get("_multi_index");
646647
var data_view = this.create_data_view(df_json.data);
647648

648649
if (msg.triggered_by == 'sort_changed' && this.sort_indicator){
@@ -661,7 +662,23 @@ class QgridView extends widgets.DOMWidgetView {
661662
}
662663

663664
this.set_data_view(data_view);
664-
this.slick_grid.setCellCssStyles("grouping", this.row_styles);
665+
666+
var skip_grouping = false;
667+
if (this.multi_index) {
668+
for (var i=1; i < this.filter_list.length; i++) {
669+
var cur_filter = this.filter_list[i];
670+
if (cur_filter.is_active()) {
671+
skip_grouping = true;
672+
}
673+
}
674+
}
675+
676+
if (skip_grouping) {
677+
this.slick_grid.removeCellCssStyles("grouping");
678+
} else {
679+
this.slick_grid.setCellCssStyles("grouping", this.row_styles);
680+
}
681+
665682
this.slick_grid.render();
666683

667684
if ((msg.triggered_by == 'add_row' ||

qgrid/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version_info = (1, 0, 5, 'final')
1+
version_info = (1, 0, 6, 'beta', 3)
22

33
_specifier_ = {'alpha': 'a', 'beta': 'b', 'candidate': 'rc', 'final': ''}
44

qgrid/grid.py

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,8 @@ class QgridWidget(widgets.DOMWidget):
472472
_model_name = Unicode('QgridModel').tag(sync=True)
473473
_view_module = Unicode('qgrid').tag(sync=True)
474474
_model_module = Unicode('qgrid').tag(sync=True)
475-
_view_module_version = Unicode('1.0.5').tag(sync=True)
476-
_model_module_version = Unicode('1.0.5').tag(sync=True)
475+
_view_module_version = Unicode('1.0.6-beta.3').tag(sync=True)
476+
_model_module_version = Unicode('1.0.6-beta.3').tag(sync=True)
477477

478478
_df = Instance(pd.DataFrame)
479479
_df_json = Unicode('', sync=True)
@@ -493,7 +493,7 @@ class QgridWidget(widgets.DOMWidget):
493493
_unfiltered_df = Instance(pd.DataFrame)
494494
_index_col_name = Unicode('qgrid_unfiltered_index', sync=True)
495495
_sort_col_suffix = Unicode('_qgrid_sort_column')
496-
_multi_index = Bool(False)
496+
_multi_index = Bool(False, sync=True)
497497
_edited = Bool(False)
498498
_selected_rows = List([])
499499
_viewport_range = Tuple(Integer(), Integer(), default_value=(0, 100))
@@ -766,7 +766,8 @@ def _update_table(self,
766766

767767
def should_be_stringified(col_series):
768768
return col_series.dtype == np.dtype('O') or \
769-
hasattr(col_series, 'cat')
769+
hasattr(col_series, 'cat') or \
770+
isinstance(col_series, pd.PeriodIndex)
770771

771772
if type(df.index) == pd.core.index.MultiIndex:
772773
self._multi_index = True
@@ -809,10 +810,9 @@ def should_be_stringified(col_series):
809810
not self._disable_grouping:
810811
previous_value = None
811812
row_styles = {}
812-
row_styles_idx = 0
813+
row_loc = from_index
813814
for index, row in df.iterrows():
814815
row_style = {}
815-
row_loc = self._df.index.get_loc(index)
816816
last_row = row_loc == (len(self._df) - 1)
817817
prev_idx = row_loc - 1
818818
for idx, index_val in enumerate(index):
@@ -844,7 +844,7 @@ def should_be_stringified(col_series):
844844
row_styles[prev_idx][col_name] = 'group-single'
845845
previous_value = index
846846
row_styles[row_loc] = row_style
847-
row_styles_idx += 1
847+
row_loc += 1
848848

849849
self._row_styles = row_styles
850850
else:
@@ -865,17 +865,6 @@ def should_be_stringified(col_series):
865865
parsed_json = json.loads(df_json)
866866
df_schema = parsed_json['schema']
867867

868-
if ('primaryKey' in df_schema):
869-
self._primary_key = df_schema['primaryKey']
870-
else:
871-
# for some reason, 'primaryKey' isn't set in certain cases,
872-
# like when we have an interval index. that's why this case
873-
# is here.
874-
if df.index.name is not None:
875-
self._primary_key = [df.index.name]
876-
else:
877-
self._primary_key = ['index']
878-
879868
columns = {}
880869
for i, cur_column in enumerate(df_schema['fields']):
881870
col_name = cur_column['name']
@@ -896,7 +885,7 @@ def should_be_stringified(col_series):
896885
level = self._primary_key.index(col_name)
897886
if level == 0:
898887
cur_column['first_index'] = True
899-
if level == (len(self._primary_key) - 1):
888+
if self._multi_index and level == (len(self._primary_key) - 1):
900889
cur_column['last_index'] = True
901890

902891
cur_column['position'] = i
@@ -965,12 +954,9 @@ def _update_sort(self):
965954
inplace=True
966955
)
967956
else:
968-
level_id = self._sort_field
969-
level_index = self._primary_key.index(level_id)
970-
if self._sort_field.startswith('level_'):
971-
level_id = int(self._sort_field[6:])
957+
level_index = self._primary_key.index(self._sort_field)
972958
self._df.sort_index(
973-
level=level_id,
959+
level=level_index,
974960
ascending=self._sort_ascending,
975961
inplace=True
976962
)
@@ -1215,11 +1201,13 @@ def _set_col_series_on_df(self, col_name, df, col_series):
12151201
if col_name in self._primary_key:
12161202
if len(self._primary_key) > 1:
12171203
key_index = self._primary_key.index(col_name)
1218-
col_series.name = df.index.levels[key_index].name
1204+
prev_name = df.index.levels[key_index].name
12191205
df.index.set_levels(col_series, level=key_index, inplace=True)
1206+
df.index.rename(prev_name, level=key_index, inplace=True)
12201207
else:
1221-
col_series.name = df.index.name
1208+
prev_name = df.index.name
12221209
df.set_index(col_series, inplace=True)
1210+
df.index.rename(prev_name)
12231211
else:
12241212
df[col_name] = col_series
12251213

0 commit comments

Comments
 (0)