Skip to content

Commit 91bb456

Browse files
Issue 147 - Derived virtual/viewport selected rows (#227)
1 parent e8112b6 commit 91bb456

File tree

13 files changed

+406
-17
lines changed

13 files changed

+406
-17
lines changed

Diff for: packages/dash-table/CHANGELOG.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
All notable changes to this project will be documented in this file.
33
This project adheres to [Semantic Versioning](http://semver.org/).
44

5-
## [3.1.4-rc6] - 2018-11-06
5+
## [3.1.4] - 2018-11-06
66
### Added
7+
- New derived props for `selected_rows` [#147](https://github.com/plotly/dash-table/issues/147)
78
- Package library the UMD way [#212](https://github.com/plotly/dash-table/issues/212)
89

910
## [3.1.3] - 2018-11-05

Diff for: packages/dash-table/dash_table/bundle.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: packages/dash-table/dash_table/demo.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: packages/dash-table/dash_table/metadata.json

+28
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,20 @@
956956
"computed": false
957957
}
958958
},
959+
"derived_viewport_selected_rows": {
960+
"type": {
961+
"name": "arrayOf",
962+
"value": {
963+
"name": "number"
964+
}
965+
},
966+
"required": false,
967+
"description": "`derived_viewport_selected_rows` represents the indices of the\n `selected_rows` from the perspective of the `derived_viewport_indices`.",
968+
"defaultValue": {
969+
"value": "[]",
970+
"computed": false
971+
}
972+
},
959973
"derived_virtual_data": {
960974
"type": {
961975
"name": "arrayOf",
@@ -984,6 +998,20 @@
984998
"computed": false
985999
}
9861000
},
1001+
"derived_virtual_selected_rows": {
1002+
"type": {
1003+
"name": "arrayOf",
1004+
"value": {
1005+
"name": "number"
1006+
}
1007+
},
1008+
"required": false,
1009+
"description": "`derived_virtual_selected_rows` represents the indices of the\n `selected_rows` from the perspective of the `derived_virtual_indices`.",
1010+
"defaultValue": {
1011+
"value": "[]",
1012+
"computed": false
1013+
}
1014+
},
9871015
"dropdown_properties": {
9881016
"type": {
9891017
"name": "any"

Diff for: packages/dash-table/dash_table/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dash-table",
3-
"version": "3.1.4-rc6",
3+
"version": "3.1.4",
44
"description": "Dash table",
55
"main": "lib/bundle.js",
66
"scripts": {
@@ -10,9 +10,11 @@
1010
"postprivate::build": "cp -R lib/* dash_table",
1111
"private::host_dash8081": "python tests/cypress/dash/v_be_page.py",
1212
"private::host_dash8082": "python tests/cypress/dash/v_copy_paste.py",
13+
"private::host_dash8083": "python tests/cypress/dash/v_fe_page.py",
1314
"private::host_js": "http-server ./dash_table -c-1 --silent",
1415
"private::wait_dash8081": "wait-on http://localhost:8081",
1516
"private::wait_dash8082": "wait-on http://localhost:8082",
17+
"private::wait_dash8083": "wait-on http://localhost:8083",
1618
"private::wait_js": "wait-on http://localhost:8080",
1719
"private::lint.js": "eslint src",
1820
"private::lint.ts": "tslint --project . src/**/*.ts",

Diff for: packages/dash-table/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dash-table",
3-
"version": "3.1.4-rc6",
3+
"version": "3.1.4",
44
"description": "Dash table",
55
"main": "lib/bundle.js",
66
"scripts": {
@@ -10,9 +10,11 @@
1010
"postprivate::build": "cp -R lib/* dash_table",
1111
"private::host_dash8081": "python tests/cypress/dash/v_be_page.py",
1212
"private::host_dash8082": "python tests/cypress/dash/v_copy_paste.py",
13+
"private::host_dash8083": "python tests/cypress/dash/v_fe_page.py",
1314
"private::host_js": "http-server ./dash_table -c-1 --silent",
1415
"private::wait_dash8081": "wait-on http://localhost:8081",
1516
"private::wait_dash8082": "wait-on http://localhost:8082",
17+
"private::wait_dash8083": "wait-on http://localhost:8083",
1618
"private::wait_js": "wait-on http://localhost:8080",
1719
"private::lint.js": "eslint src",
1820
"private::lint.ts": "tslint --project . src/**/*.ts",

Diff for: packages/dash-table/src/dash-table/DataTable.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,10 @@ export const defaultProps = {
6464

6565
derived_viewport_data: [],
6666
derived_viewport_indices: [],
67+
derived_viewport_selected_rows: [],
6768
derived_virtual_data: [],
6869
derived_virtual_indices: [],
70+
derived_virtual_selected_rows: [],
6971

7072
column_conditional_dropdowns: [],
7173
column_static_dropdown: [],
@@ -702,6 +704,12 @@ export const propTypes = {
702704
*/
703705
derived_viewport_indices: PropTypes.arrayOf(PropTypes.number),
704706

707+
/**
708+
* `derived_viewport_selected_rows` represents the indices of the
709+
* `selected_rows` from the perspective of the `derived_viewport_indices`.
710+
*/
711+
derived_viewport_selected_rows: PropTypes.arrayOf(PropTypes.number),
712+
705713
/**
706714
* This property represents the visible state of `data`
707715
* across all pages after the front-end sorting and filtering
@@ -717,7 +725,13 @@ export const propTypes = {
717725
*/
718726
derived_virtual_indices: PropTypes.arrayOf(PropTypes.number),
719727

720-
/**
728+
/**
729+
* `derived_virtual_selected_rows` represents the indices of the
730+
* `selected_rows` from the perspective of the `derived_virtual_indices`.
731+
*/
732+
derived_virtual_selected_rows: PropTypes.arrayOf(PropTypes.number),
733+
734+
/**
721735
* DEPRECATED
722736
* Subscribe to [https://github.com/plotly/dash-table/issues/168](https://github.com/plotly/dash-table/issues/168)
723737
* for updates on the dropdown API.

Diff for: packages/dash-table/src/dash-table/components/Table/index.tsx

+46-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { memoizeOne, memoizeOneWithFlag } from 'core/memoizer';
66
import ControlledTable from 'dash-table/components/ControlledTable';
77

88
import derivedPaginator from 'dash-table/derived/paginator';
9+
import derivedSelectedRows from 'dash-table/derived/selectedRows';
910
import derivedViewportData from 'dash-table/derived/data/viewport';
1011
import derivedVirtualData from 'dash-table/derived/data/virtual';
1112
import derivedVisibleColumns from 'dash-table/derived/column/visible';
@@ -60,6 +61,7 @@ export default class Table extends Component<PropsWithDefaultsAndDerived> {
6061
filtering_settings,
6162
pagination_mode,
6263
pagination_settings,
64+
selected_rows,
6365
sorting,
6466
sorting_settings,
6567
sorting_treat_empty_string_as_none
@@ -81,6 +83,16 @@ export default class Table extends Component<PropsWithDefaultsAndDerived> {
8183
virtual.indices
8284
);
8385

86+
const virtual_selected_rows = this.virtualSelectedRows(
87+
virtual.indices,
88+
selected_rows
89+
);
90+
91+
const viewport_selected_rows = this.viewportSelectedRows(
92+
viewport.indices,
93+
selected_rows
94+
);
95+
8496
const paginator = this.paginator(
8597
pagination_mode,
8698
pagination_settings,
@@ -97,17 +109,33 @@ export default class Table extends Component<PropsWithDefaultsAndDerived> {
97109
paginator,
98110
setProps,
99111
viewport,
100-
virtual
112+
viewport_selected_rows,
113+
virtual,
114+
virtual_selected_rows
101115
}
102116
]);
103117
}
104118

105119
private updateDerivedProps() {
106-
const { filtering, filtering_settings, pagination_mode, pagination_settings, sorting, sorting_settings, viewport, virtual } = this.controlled;
120+
const {
121+
filtering,
122+
filtering_settings,
123+
pagination_mode,
124+
pagination_settings,
125+
sorting,
126+
sorting_settings,
127+
viewport,
128+
viewport_selected_rows,
129+
virtual,
130+
virtual_selected_rows
131+
} = this.controlled;
107132

108133
const viewportCached = this.viewportCache(viewport).cached;
109134
const virtualCached = this.virtualCache(virtual).cached;
110135

136+
const viewportSelectedRowsCached = this.viewportSelectedRowsCache(viewport_selected_rows).cached;
137+
const virtualSelectedRowsCached = this.virtualSelectedRowsCache(virtual_selected_rows).cached;
138+
111139
const invalidatedFilter = this.filterCache(filtering_settings);
112140
const invalidatedPagination = this.paginationCache(pagination_settings);
113141
const invalidatedSort = this.sortCache(sorting_settings);
@@ -117,10 +145,6 @@ export default class Table extends Component<PropsWithDefaultsAndDerived> {
117145
(!invalidatedPagination.cached && !invalidatedPagination.first && pagination_mode === 'be') ||
118146
(!invalidatedSort.cached && !invalidatedSort.first && sorting === 'be');
119147

120-
if (virtualCached && viewportCached && !invalidateSelection) {
121-
return;
122-
}
123-
124148
const { setProps } = this;
125149
let newProps: Partial<PropsWithDefaultsAndDerived> = {};
126150

@@ -134,12 +158,24 @@ export default class Table extends Component<PropsWithDefaultsAndDerived> {
134158
newProps.derived_viewport_indices = viewport.indices;
135159
}
136160

161+
if (!virtualSelectedRowsCached) {
162+
newProps.derived_virtual_selected_rows = virtual_selected_rows;
163+
}
164+
165+
if (!viewportSelectedRowsCached) {
166+
newProps.derived_viewport_selected_rows = viewport_selected_rows;
167+
}
168+
137169
if (invalidateSelection) {
138170
newProps.active_cell = undefined;
139171
newProps.selected_cells = undefined;
140172
newProps.selected_rows = undefined;
141173
}
142174

175+
if (!R.keys(newProps).length) {
176+
return;
177+
}
178+
143179
setTimeout(() => setProps(newProps), 0);
144180
}
145181

@@ -162,12 +198,16 @@ export default class Table extends Component<PropsWithDefaultsAndDerived> {
162198

163199
private readonly paginator = derivedPaginator();
164200
private readonly viewport = derivedViewportData();
201+
private readonly viewportSelectedRows = derivedSelectedRows();
165202
private readonly virtual = derivedVirtualData();
203+
private readonly virtualSelectedRows = derivedSelectedRows();
166204
private readonly visibleColumns = derivedVisibleColumns();
167205

168206
private readonly filterCache = memoizeOneWithFlag(filter => filter);
169207
private readonly paginationCache = memoizeOneWithFlag(pagination => pagination);
170208
private readonly sortCache = memoizeOneWithFlag(sort => sort);
171209
private readonly viewportCache = memoizeOneWithFlag(viewport => viewport);
210+
private readonly viewportSelectedRowsCache = memoizeOneWithFlag(viewport => viewport);
172211
private readonly virtualCache = memoizeOneWithFlag(virtual => virtual);
212+
private readonly virtualSelectedRowsCache = memoizeOneWithFlag(virtual => virtual);
173213
}

Diff for: packages/dash-table/src/dash-table/components/Table/props.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ interface IProps {
130130
row_deletable?: boolean;
131131
row_selectable?: RowSelection;
132132
selected_cells?: SelectedCells;
133-
selected_rows?: number[];
133+
selected_rows?: Indices;
134134
setProps?: SetProps;
135135
sorting?: Sorting;
136136
sorting_settings?: SortSettings;
@@ -198,8 +198,10 @@ interface IDefaultProps {
198198
interface IDerivedProps {
199199
derived_viewport_data: Data;
200200
derived_viewport_indices: Indices;
201+
derived_viewport_selected_rows: Indices;
201202
derived_virtual_data: Data;
202203
derived_virtual_indices: Indices;
204+
derived_virtual_selected_rows: Indices;
203205
}
204206

205207
export type PropsWithDefaults = IProps & IDefaultProps;
@@ -211,7 +213,9 @@ export type ControlledTableProps = PropsWithDefaults & {
211213
columns: VisibleColumns;
212214
paginator: IPaginator;
213215
viewport: IDerivedData;
216+
viewport_selected_rows: Indices;
214217
virtual: IDerivedData;
218+
virtual_selected_rows: Indices;
215219
};
216220

217221
export interface ICellFactoryOptions {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import * as R from 'ramda';
2+
3+
import { Indices } from 'dash-table/components/Table/props';
4+
import { memoizeOneFactory } from 'core/memoizer';
5+
6+
const getter = (
7+
indices: Indices,
8+
selectedRows: Indices
9+
): Indices => {
10+
const map = new Map<number, number>();
11+
12+
R.addIndex<number>(R.forEach)((virtualIndex, index) => {
13+
map.set(virtualIndex, index);
14+
}, indices);
15+
16+
const mappedSelectedRows: number[] = [];
17+
R.forEach(rowIndex => {
18+
const virtualIndex = map.get(rowIndex);
19+
20+
if (virtualIndex !== undefined) {
21+
mappedSelectedRows.push(virtualIndex);
22+
}
23+
}, selectedRows);
24+
25+
return mappedSelectedRows;
26+
};
27+
28+
export default memoizeOneFactory(getter);

0 commit comments

Comments
 (0)