diff --git a/frontend/src/components/repo-view/share-repo-view.js b/frontend/src/components/repo-view/share-repo-view.js index ca66487259..49d06c6a07 100644 --- a/frontend/src/components/repo-view/share-repo-view.js +++ b/frontend/src/components/repo-view/share-repo-view.js @@ -73,7 +73,7 @@ class ShareRepoView extends React.Component { {(!this.props.isLoading && this.state.repoList.length === 0) && emptyTip} {(!this.props.isLoading && this.state.repoList.length > 0) && diff --git a/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js b/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js index 07628fa712..2ac4ef4c02 100644 --- a/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js +++ b/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js @@ -10,6 +10,7 @@ const propTypes = { repo: PropTypes.object.isRequired, isItemFreezed: PropTypes.bool.isRequired, isShowRepoOwner: PropTypes.bool.isRequired, + onFreezedItem: PropTypes.func.isRequired, }; class RepoListItem extends React.Component { @@ -21,26 +22,45 @@ class RepoListItem extends React.Component { isOperationShow: false, isItemMenuShow: false, }; + this.isDeparementOnwerGroupMember = false; } onMouseEnter = () => { - this.setState({ - highlight: true, - isOperationShow: true, - }); + if (!this.props.isItemFreezed) { + this.setState({ + highlight: true, + isOperationShow: true, + }); + } } onMouseLeave = () => { - this.setState({ - highlight: false, - isOperationShow: false, - }); + if (!this.props.isItemFreezed) { + this.setState({ + highlight: false, + isOperationShow: false, + }); + } + } + + clickOperationMenuToggle = (e) => { + e.preventDefault(); + this.toggleOperationMenu(); } toggleOperationMenu = () => { - this.setState({ - isItemMenuShow: !this.state.isItemMenuShow - }); + if (this.props.isItemFreezed) { + this.setState({ + highlight: false, + isOperationShow: false, + isItemMenuShow: !this.state.isItemMenuShow + }); + } else { + this.setState({ + isItemMenuShow: !this.state.isItemMenuShow + }); + } + this.props.onFreezedItem(); } getRepoComputeParams = () => { @@ -67,132 +87,179 @@ class RepoListItem extends React.Component { return { iconUrl, iconTitle, libPath }; } + onMenuItemClick = (e) => { + let operation = e.target.dataset.toggle; + switch(operation) { + case 'Rename': + this.onItemRename(); + break; + case 'Folder Permission': + this.onItemPermisionChanged(); + break; + case 'Details': + this.onItemDetails(); + break; + case 'Share': + this.onItemShared(); + break; + case 'Unshare': + this.onItemUnshared(); + break; + default: + break; + } + } + + onItemRename = () => { + // todo + } + + onItemPermisionChanged = () => { + // todo + } + + onItemDetails = () => { + // todo + } + + onItemShared = () => { + // todo + } + + onItemUnshared = () => { + // todo + } + + onItemDelete = () => { + // todo + } + generatorOperations = () => { let { repo, currentGroup } = this.props; let isStaff = currentGroup.admins.indexOf(username) > -1; //for group repolist; let isRepoOwner = repo.owner_email === username; let isAdmin = repo.is_admin; - - let iconVisibility = this.state.isOperationShow ? '' : ' invisible'; - let shareIconClassName = 'sf2-icon-share sf2-x repo-share-btn op-icon' + iconVisibility; - let unshareIconClassName = 'sf2-icon-x3 sf2-x op-icon' + iconVisibility; - let deleteIconClassName = 'sf2-icon-delete sf2-x op-icon' + iconVisibility; - let operationMenuToggleIconClassName = 'sf2-icon-caret-down item-operation-menu-toggle-icon op-icon'; - if (window.innerWidth >= 768) { - operationMenuToggleIconClassName += iconVisibility; - } - - const commonToggle = ( - - - ); - - const commonOperationsInMenu = ( - - {gettext('Rename')} - {folderPermEnabled ? {gettext('Folder Permission')} : null} - {gettext('Details')} - - ); - - let desktopOperations; - let mobileOperationMenu; - - const share = ; - const unshare = - const deleteOperation = ; - - const shareDropdownItem = {gettext('Share')}; - const unshareDropdownItem = {gettext('Unshare')}; + let operations = []; + // todo ,shared width me shared width all; if (isPro) { - if (repo.owner_email.indexOf('@seafile_group') != -1) { // group owned repo - if (isStaff) { - if (repo.owner_email == currentGroup.id + '@seafile_group') { // this repo belongs to the current group - desktopOperations = ( - - {share} - {deleteOperation} - - {commonToggle} - - {commonOperationsInMenu} - - - - ); - mobileOperationMenu = ( - - {shareDropdownItem} - {gettext('Delete')} - {commonOperationsInMenu} - - ); + if (repo.owner_email.indexOf('@seafile_group') != -1) { //current repo is belong to a group; + if (isStaff && repo.owner_email == currentGroup.id + '@seafile_group') { //is a member of this current group, + this.isDeparementOnwerGroupMember = true; + if (folderPermEnabled) { + operations = ['Rename', 'Folder Permission', 'deatils']; } else { - desktopOperations = unshare; - mobileOperationMenu = unshareDropdownItem; + operations = ['Rename', 'Details'] } + } else { + operations.push('Unshare'); } } else { - desktopOperations = ( - - {isRepoOwner || isAdmin ? share : null} - {isStaff || isRepoOwner || isAdmin ? unshare : null} - - ); - mobileOperationMenu = ( - - {isRepoOwner || isAdmin ? shareDropdownItem : null} - {isStaff || isRepoOwner || isAdmin ? unshareDropdownItem : null} - - ); + if (isRepoOwner || isAdmin) { + operations.push('Share'); + } + if (isStaff || isRepoOwner || isAdmin) { + operations.push('Unshare'); + } } } else { - desktopOperations = ( - - {isRepoOwner ? share : null} - {isStaff || isRepoOwner ? unshare : null} - - ); - mobileOperationMenu = ( - - {isRepoOwner ? shareDropdownItem : null} - {isStaff || isRepoOwner ? unshareDropdownItem : null} - - ); + if (isRepoOwner) { + operations.push('share'); + } + if (isStaff || isRepoOwner) { + operations.push('Unshare'); + } } + return operations; + } - const mobileOperations = ( + generatorMobileMenu = () => { + let operations = this.generatorOperations(); + if (this.isDeparementOnwerGroupMember) { + operations.unshift('unshare'); + operations.unshift('share'); + } + return ( - {commonToggle} +
- {mobileOperationMenu} + {operations.map((item, index) => { + return ( + {gettext(item)} + ); + })}
); + } - return { desktopOperations, mobileOperations } + generatorPCMenu = () => { + // scene one: (share, delete, itemToggle and other operations); + // scene two: (share, unshare), (share), (unshare) + let operations = this.generatorOperations(); + const shareOperation = ; + const unshareOperation = + const deleteOperation = ; + + if (this.isDeparementOnwerGroupMember) { + return ( + + {shareOperation} + {deleteOperation} + + + + {operations.map((item, index) => { + return {gettext(item)} + })} + + + + ); + } else { + if (operations.length == 2) { + return ( + + {shareOperation} + {unshareOperation} + + ); + } + if (operations.length == 1 && operations[0] === 'share') { + return shareOperation; + } + + if (operations.length == 1 && operations[0] === 'unshare') { + return unshareOperation; + } + } + return null; } renderPCUI = () => { let { iconUrl, iconTitle, libPath } = this.getRepoComputeParams(); let { repo, isShowRepoOwner } = this.props; - let { desktopOperations } = this.generatorOperations(); return ( {iconTitle} {repo.repo_name} - {desktopOperations} + {this.state.isOperationShow && this.generatorPCMenu()} {repo.size} {moment(repo.last_modified).fromNow()} {isShowRepoOwner && {repo.owner_name}} @@ -203,7 +270,6 @@ class RepoListItem extends React.Component { renderMobileUI = () => { let { iconUrl, iconTitle, libPath } = this.getRepoComputeParams(); let { repo, isShowRepoOwner } = this.props; - let { mobileOperations } = this.generatorOperations(); return ( {iconTitle}/ @@ -213,7 +279,7 @@ class RepoListItem extends React.Component { {repo.size} {moment(repo.last_modified).fromNow()} - {mobileOperations} + {this.generatorMobileMenu()} ); } diff --git a/frontend/src/components/shared-repo-list-view/shared-repo-list-view.js b/frontend/src/components/shared-repo-list-view/shared-repo-list-view.js index 0fe38a33aa..973272da82 100644 --- a/frontend/src/components/shared-repo-list-view/shared-repo-list-view.js +++ b/frontend/src/components/shared-repo-list-view/shared-repo-list-view.js @@ -18,6 +18,31 @@ class SharedRepoListView extends React.Component { }; } + onFreezedItem = () => { + this.setState({ + isItemFreezed: !this.state.isItemFreezed, + }); + } + + renderRepoListView = () => { + return ( + + {this.props.repoList.map(repo => { + return ( + + ); + })} + + ); + } + renderPCUI = () => { let isShowRepoOwner = this.props.isShowRepoOwner; return ( @@ -37,17 +62,7 @@ class SharedRepoListView extends React.Component { - {this.props.repoList.map(repo => { - return ( - - ); - })} + {this.renderRepoListView()} ); @@ -75,17 +90,7 @@ class SharedRepoListView extends React.Component { - {this.props.repoList.map(repo => { - return ( - - ); - })} + {this.renderRepoListView()} );