Skip to content

Commit

Permalink
Tabulator: simplify event row calculation (#3841)
Browse files Browse the repository at this point in the history
* record and use an index mapping

* clean up
  • Loading branch information
maximlt authored Sep 15, 2022
1 parent 23b061b commit 7b2ad21
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 20 deletions.
14 changes: 6 additions & 8 deletions panel/models/tabulator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -798,8 +798,8 @@ export class DataTabulatorView extends PanelHTMLBoxView {
tab_column.headerSortStartingDir = sort.dir
}
tab_column.cellClick = (_: any, cell: any) => {
const index_processed = cell.getRow().getPosition()-1
this.model.trigger_event(new CellClickEvent(column.field, index_processed))
const index = cell.getData()._index
this.model.trigger_event(new CellClickEvent(column.field, index))
}
if (config_columns == null)
columns.push(tab_column)
Expand All @@ -812,8 +812,8 @@ export class DataTabulatorView extends PanelHTMLBoxView {
formatter: button_formatter,
hozAlign: "center",
cellClick: (_: any, cell: any) => {
const index_processed = cell.getRow().getPosition()-1
this.model.trigger_event(new CellClickEvent(col, index_processed))
const index = cell.getData()._index
this.model.trigger_event(new CellClickEvent(col, index))
}
}
columns.push(button_column)
Expand Down Expand Up @@ -1126,9 +1126,7 @@ export class DataTabulatorView extends PanelHTMLBoxView {

cellEdited(cell: any): void {
const field = cell._cell.column.field;
// true to get the position of the filtered/sorted row index
const index_processed = cell.getRow().getPosition()-1
const index = cell._cell.row.data._index
const index = cell.getData()._index
const value = cell._cell.value
this._tabulator_cell_updating = true
comm_settings.debounce = false
Expand All @@ -1138,7 +1136,7 @@ export class DataTabulatorView extends PanelHTMLBoxView {
comm_settings.debounce = true
this._tabulator_cell_updating = false
}
this.model.trigger_event(new TableEditEvent(field, index_processed))
this.model.trigger_event(new TableEditEvent(field, index))
this.tabulator.scrollToRow(index, "top", false)
}
}
Expand Down
28 changes: 16 additions & 12 deletions panel/widgets/tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ class BaseTable(ReactiveData, Widget):
def __init__(self, value=None, **params):
self._renamed_cols = {}
self._filters = []
self._index_mapping = {}
super().__init__(value=value, **params)

@param.depends('value', watch=True, on_init=True)
Expand Down Expand Up @@ -233,6 +234,13 @@ def _get_column_definitions(self, col_names: List[str], df: DataFrameType) -> Li
def _update_cds(self, *events: param.parameterized.Event):
old_processed = self._processed
self._processed, data = self._get_data()
if self._processed is not None and not (isinstance(self._processed, list) and not self._processed):
self._index_mapping = {
i: index
for i, index in enumerate(self._processed.index)
}
else:
self._index_mapping = {}
# If there is a selection we have to compute new index
if self.selection and old_processed is not None:
indexes = list(self._processed.index)
Expand Down Expand Up @@ -1135,22 +1143,18 @@ def _process_event(self, event):
if not self._on_click_callbacks and not self._on_edit_callbacks:
return
event_col = self._renamed_cols.get(event.column, event.column)
processed = self._sort_df(self._processed)
if self.pagination in ['local', 'remote']:
if self.pagination in ['remote']:
nrows = self.page_size
event.row = event.row+(self.page-1)*nrows
event_row = event.row
idx = self._index_mapping[event.row]
iloc = self.value.index.get_loc(idx)
self._validate_iloc(idx, iloc)
event.row = iloc
if event_col not in self.buttons:
if event_col not in processed.columns:
event.value = processed.index[event_row]
if event_col not in self.value.columns:
event.value = self.value.index[event.row]
else:
event.value = processed[event_col].iloc[event_row]
# We want to return the index of the original `value` dataframe.
if self._filters or self.filters or self.sorters:
idx = processed.index[event.row]
iloc = self.value.index.get_loc(idx)
self._validate_iloc(idx, iloc)
event.row = iloc
event.value = self.value[event_col].iloc[event.row]
# Set the old attribute on a table edit event
if event.event_name == 'table-edit' and self._old_value is not None:
event.old = self._old_value[event_col].iloc[event.row]
Expand Down

0 comments on commit 7b2ad21

Please sign in to comment.