mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-05 00:43:53 +00:00
12.0 list view support multiple selection (#6421)
* Feature - multiple selection with ctrl/shift * update grid view context menu list in multiple selection mode * list view support multiple selection * improve list view selection experience * before remove activeDirent state * improve list view selection experience * fix warnings
This commit is contained in:
@@ -532,7 +532,9 @@ class DirentGridView extends React.Component {
|
|||||||
if (this.props.selectedDirentList.length > 1) return;
|
if (this.props.selectedDirentList.length > 1) return;
|
||||||
// Display menu items according to the current dirent permission
|
// Display menu items according to the current dirent permission
|
||||||
const menuList = this.getDirentItemMenuList(dirent, true);
|
const menuList = this.getDirentItemMenuList(dirent, true);
|
||||||
this.handleContextClick(event, GRID_ITEM_CONTEXTMENU_ID, menuList, dirent);
|
const id = 'grid-item-contextmenu';
|
||||||
|
this.handleContextClick(event, id, menuList, dirent);
|
||||||
|
if (this.props.direntList.filter(item => item.isSelected).length > 1) return;
|
||||||
this.props.onGridItemClick && this.props.onGridItemClick(dirent);
|
this.props.onGridItemClick && this.props.onGridItemClick(dirent);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -96,15 +96,13 @@ class DirentListItem extends React.Component {
|
|||||||
this.tagListTitleID = `tag-list-title-${uuidv4()}`;
|
this.tagListTitleID = `tag-list-title-${uuidv4()}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
componentDidUpdate(prevProps) {
|
||||||
if (nextProps.isItemFreezed !== this.props.isItemFreezed && !nextProps.isItemFreezed) {
|
const { isItemFreezed, activeDirent, dirent } = this.props;
|
||||||
|
|
||||||
|
if (prevProps.isItemFreezed !== isItemFreezed && !isItemFreezed) {
|
||||||
this.setState({
|
this.setState({
|
||||||
highlight: false,
|
highlight: false,
|
||||||
isOperationShow: false,
|
isOperationShow: activeDirent && activeDirent.name === dirent.name,
|
||||||
}, () => {
|
|
||||||
if (nextProps.activeDirent && nextProps.activeDirent.name === nextProps.dirent.name) {
|
|
||||||
this.setState({ isOperationShow: true });
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,7 +190,7 @@ class DirentListItem extends React.Component {
|
|||||||
// '<td>' is clicked
|
// '<td>' is clicked
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
if (e.target.tagName == 'TD') {
|
if (e.target.tagName == 'TD') {
|
||||||
this.props.onDirentClick(this.props.dirent);
|
this.props.onDirentClick(this.props.dirent, e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -682,7 +680,7 @@ class DirentListItem extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { path, dirent, activeDirent } = this.props;
|
let { path, dirent } = this.props;
|
||||||
let direntPath = Utils.joinPath(path, dirent.name);
|
let direntPath = Utils.joinPath(path, dirent.name);
|
||||||
let dirHref = '';
|
let dirHref = '';
|
||||||
if (this.props.currentRepoInfo) {
|
if (this.props.currentRepoInfo) {
|
||||||
@@ -695,11 +693,10 @@ class DirentListItem extends React.Component {
|
|||||||
|
|
||||||
let iconUrl = Utils.getDirentIcon(dirent);
|
let iconUrl = Utils.getDirentIcon(dirent);
|
||||||
|
|
||||||
let isActive = (activeDirent && activeDirent.name === dirent.name) || dirent.isSelected;
|
let isActive = dirent.isSelected;
|
||||||
let trClass = this.state.highlight ? 'tr-highlight ' : '';
|
let trClass = this.state.highlight ? 'tr-highlight ' : '';
|
||||||
trClass += this.state.isDropTipshow ? 'tr-drop-effect' : '';
|
trClass += this.state.isDropTipshow ? 'tr-drop-effect' : '';
|
||||||
trClass += isActive ? 'tr-active' : '';
|
trClass += isActive ? 'tr-active' : '';
|
||||||
trClass += isActive ? 'tr-active' : '';
|
|
||||||
|
|
||||||
let lockedInfo = dirent.is_freezed ? gettext('Frozen by {name}') : gettext('locked by {name}');
|
let lockedInfo = dirent.is_freezed ? gettext('Frozen by {name}') : gettext('locked by {name}');
|
||||||
lockedInfo = lockedInfo.replace('{name}', dirent.lock_owner_name);
|
lockedInfo = lockedInfo.replace('{name}', dirent.lock_owner_name);
|
||||||
|
@@ -129,13 +129,9 @@ class DirentListView extends React.Component {
|
|||||||
this.props.onItemSelected(dirent);
|
this.props.onItemSelected(dirent);
|
||||||
};
|
};
|
||||||
|
|
||||||
onDirentClick = (dirent) => {
|
onDirentClick = (dirent, event) => {
|
||||||
hideMenu();
|
hideMenu();
|
||||||
if (this.props.selectedDirentList.length > 0 && !this.state.activeDirent) {
|
this.props.onDirentClick(dirent, event);
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.setState({ activeDirent: dirent });
|
|
||||||
this.props.onDirentClick(dirent);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
sortByName = (e) => {
|
sortByName = (e) => {
|
||||||
@@ -306,7 +302,7 @@ class DirentListView extends React.Component {
|
|||||||
// table-container contextmenu handle
|
// table-container contextmenu handle
|
||||||
onContainerClick = () => {
|
onContainerClick = () => {
|
||||||
hideMenu();
|
hideMenu();
|
||||||
if (this.state.activeDirent) {
|
if (this.props.selectedDirentList.length > 0) {
|
||||||
this.onDirentClick(null);
|
this.onDirentClick(null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -1360,6 +1360,7 @@ class LibContentView extends React.Component {
|
|||||||
return dirent;
|
return dirent;
|
||||||
}),
|
}),
|
||||||
isDirentSelected: newSelectedDirentList.length > 0,
|
isDirentSelected: newSelectedDirentList.length > 0,
|
||||||
|
isAllDirentSelected: newSelectedDirentList.length === direntList.length,
|
||||||
selectedDirentList: newSelectedDirentList,
|
selectedDirentList: newSelectedDirentList,
|
||||||
lastSelectedIndex: clickedIndex,
|
lastSelectedIndex: clickedIndex,
|
||||||
});
|
});
|
||||||
@@ -1370,6 +1371,7 @@ class LibContentView extends React.Component {
|
|||||||
return dirent;
|
return dirent;
|
||||||
}),
|
}),
|
||||||
isDirentSelected: false,
|
isDirentSelected: false,
|
||||||
|
isAllDirentSelected: false,
|
||||||
selectedDirentList: [],
|
selectedDirentList: [],
|
||||||
lastSelectedIndex: null,
|
lastSelectedIndex: null,
|
||||||
});
|
});
|
||||||
@@ -1414,7 +1416,6 @@ class LibContentView extends React.Component {
|
|||||||
let selectedDirentList = direntList.filter(item => {
|
let selectedDirentList = direntList.filter(item => {
|
||||||
return item.isSelected;
|
return item.isSelected;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (selectedDirentList.length) {
|
if (selectedDirentList.length) {
|
||||||
this.setState({ isDirentSelected: true });
|
this.setState({ isDirentSelected: true });
|
||||||
if (selectedDirentList.length === direntList.length) {
|
if (selectedDirentList.length === direntList.length) {
|
||||||
@@ -1441,29 +1442,20 @@ class LibContentView extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onAllDirentSelected = () => {
|
onAllDirentSelected = () => {
|
||||||
if (this.state.isAllDirentSelected) {
|
this.setState(prevState => {
|
||||||
let direntList = this.state.direntList.map(item => {
|
const isAllDirentSelected = !prevState.isAllDirentSelected;
|
||||||
item.isSelected = false;
|
const direntList = prevState.direntList.map(item => {
|
||||||
|
item.isSelected = isAllDirentSelected;
|
||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
this.setState({
|
|
||||||
isDirentSelected: false,
|
return {
|
||||||
isAllDirentSelected: false,
|
isDirentSelected: isAllDirentSelected,
|
||||||
|
isAllDirentSelected: isAllDirentSelected,
|
||||||
direntList: direntList,
|
direntList: direntList,
|
||||||
selectedDirentList: [],
|
selectedDirentList: isAllDirentSelected ? [...direntList] : []
|
||||||
});
|
};
|
||||||
} else {
|
});
|
||||||
let direntList = this.state.direntList.map(item => {
|
|
||||||
item.isSelected = true;
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
this.setState({
|
|
||||||
isDirentSelected: true,
|
|
||||||
isAllDirentSelected: true,
|
|
||||||
direntList: direntList,
|
|
||||||
selectedDirentList: direntList,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
onFileTagChanged = (dirent, direntPath) => {
|
onFileTagChanged = (dirent, direntPath) => {
|
||||||
|
Reference in New Issue
Block a user