HTML Tree: Add a dotted border to pivot rows (#2375)

This commit is contained in:
Adomas Ven 2022-03-02 12:41:59 +02:00 committed by GitHub
parent c0ab16e79d
commit b38d7107d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 9 deletions

View file

@ -92,11 +92,13 @@ class TreeSelection {
if (this.selectEventsSuppressed) return; if (this.selectEventsSuppressed) return;
if (this._tree.invalidate) { let previousPivot = this.pivot;
this._tree.invalidateRow(index);
}
this.pivot = index; this.pivot = index;
this._focused = index; this._focused = index;
if (this._tree.invalidate) {
this._tree.invalidateRow(index);
this._tree.invalidateRow(previousPivot);
}
this._updateTree(shouldDebounce); this._updateTree(shouldDebounce);
} }
@ -123,8 +125,9 @@ class TreeSelection {
return false; return false;
} }
let toInvalidate = Array.from(this.selected); let toInvalidate = new Set(this.selected);
toInvalidate.push(index); toInvalidate.add(index);
toInvalidate.add(this.pivot);
this.selected = new Set([index]); this.selected = new Set([index]);
this._focused = index; this._focused = index;
this.pivot = index; this.pivot = index;
@ -221,7 +224,8 @@ class TreeSelection {
set focused(index) { set focused(index) {
index = Math.max(0, index); index = Math.max(0, index);
let oldValue = this._focused; let previousFocused = this._focused;
let previousPivot = this.pivot;
this.pivot = index; this.pivot = index;
this._focused = index; this._focused = index;
@ -229,7 +233,10 @@ class TreeSelection {
this._updateTree(); this._updateTree();
if (this._tree.invalidate) { if (this._tree.invalidate) {
this._tree.invalidateRow(oldValue); this._tree.invalidateRow(previousFocused);
if (previousPivot != previousFocused) {
this._tree.invalidateRow(previousPivot);
}
this._tree.invalidateRow(index); this._tree.invalidateRow(index);
} }
} }
@ -732,8 +739,12 @@ class VirtualizedTable extends React.Component {
if (this.selection.selectEventsSuppressed) return; if (this.selection.selectEventsSuppressed) return;
if (movePivot) { if (movePivot) {
if (!this.props.multiSelect) return;
let previousPivot = this.selection.pivot;
this.selection._focused = index; this.selection._focused = index;
this.selection.pivot = index; this.selection.pivot = index;
this.invalidateRow(previousPivot);
this.invalidateRow(index);
} }
// Normal selection // Normal selection
else if (!shiftSelect && !toggleSelection) { else if (!shiftSelect && !toggleSelection) {
@ -1138,7 +1149,10 @@ class VirtualizedTable extends React.Component {
onDrop: e => this.props.onDrop && this.props.onDrop(e), onDrop: e => this.props.onDrop && this.props.onDrop(e),
onFocus: e => this.props.onFocus && this.props.onFocus(e), onFocus: e => this.props.onFocus && this.props.onFocus(e),
onMouseOver: e => this._handleMouseOver(e), onMouseOver: e => this._handleMouseOver(e),
className: cx(["virtualized-table", { resizing: this.state.resizing }]), className: cx(["virtualized-table", {
resizing: this.state.resizing,
'multi-select': this.props.multiSelect
}]),
id: this.props.id, id: this.props.id,
ref: ref => this._topDiv = ref, ref: ref => this._topDiv = ref,
tabIndex: 0, tabIndex: 0,
@ -1550,6 +1564,7 @@ function makeRowRenderer(getRowData) {
} }
div.classList.toggle('selected', selection.isSelected(index)); div.classList.toggle('selected', selection.isSelected(index));
div.classList.toggle('pivot', selection.pivot == index);
const rowData = getRowData(index); const rowData = getRowData(index);
for (let column of columns) { for (let column of columns) {

View file

@ -830,7 +830,7 @@ var ItemTree = class ItemTree extends LibraryTree {
return false; return false;
} }
if (this.selection.count == 0) { if (this.selection.count == 0) {
this.selection.select(0); this.selection.select(this.selection.pivot);
} }
} }
@ -1011,6 +1011,7 @@ var ItemTree = class ItemTree extends LibraryTree {
this._getColumns(); this._getColumns();
this.selection.clearSelection(); this.selection.clearSelection();
this.selection.pivot = 0;
await this.refresh(); await this.refresh();
if (Zotero.CollectionTreeCache.error) { if (Zotero.CollectionTreeCache.error) {
return this.setItemsPaneMessage(Zotero.getString('pane.items.loadError')); return this.setItemsPaneMessage(Zotero.getString('pane.items.loadError'));
@ -2866,6 +2867,7 @@ var ItemTree = class ItemTree extends LibraryTree {
} }
div.classList.toggle('selected', selection.isSelected(index)); div.classList.toggle('selected', selection.isSelected(index));
div.classList.toggle('pivot', selection.pivot == index);
div.classList.remove('drop', 'drop-before', 'drop-after'); div.classList.remove('drop', 'drop-before', 'drop-after');
const rowData = this._getRowData(index); const rowData = this._getRowData(index);
div.classList.toggle('context-row', !!rowData.contextRow); div.classList.toggle('context-row', !!rowData.contextRow);

View file

@ -136,6 +136,23 @@
} }
} }
.virtualized-table.multi-select:focus {
.row.pivot {
border: 1px dotted highlight;
box-sizing: initial;
margin: -1px 0;
width: calc(100% - 2px);
> *:first-child {
margin-inline-start: -1px;
}
> *:last-child {
margin-inline-end: -1px;
}
}
}
.virtualized-table-header { .virtualized-table-header {
display: flex; display: flex;
flex-direction: row; flex-direction: row;