import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { gettext } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import SharedRepoListItem from './shared-repo-list-item'; import toaster from '../toast'; import LibsMobileThead from '../libs-mobile-thead'; import Loading from '../loading'; const propTypes = { libraryType: PropTypes.string, currentGroup: PropTypes.object, isShowTableThread: PropTypes.bool, sortBy: PropTypes.string, sortOrder: PropTypes.string, sortItems: PropTypes.func, repoList: PropTypes.array.isRequired, onItemUnshare: PropTypes.func.isRequired, onItemDelete: PropTypes.func, onItemRename: PropTypes.func, hasNextPage: PropTypes.bool, onMonitorRepo: PropTypes.func, theadHidden: PropTypes.bool, }; class SharedRepoListView extends React.Component { constructor(props) { super(props); this.state = { isItemFreezed: false, }; } sortByName = (e) => { e.preventDefault(); const sortBy = 'name'; const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc'; this.props.sortItems(sortBy, sortOrder); }; sortByTime = (e) => { e.preventDefault(); const sortBy = 'time'; const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc'; this.props.sortItems(sortBy, sortOrder); }; sortBySize = (e) => { e.preventDefault(); const sortBy = 'size'; const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc'; this.props.sortItems(sortBy, sortOrder); }; getSortMetaData = () => { return { sortByName: this.props.sortBy == 'name', sortByTime: this.props.sortBy == 'time', sortBySize: this.props.sortBy == 'size', sortIcon: this.props.sortOrder == 'asc' ? : }; }; onFreezedItem = () => { this.setState({isItemFreezed: true}); }; onUnfreezedItem = () => { this.setState({isItemFreezed: false}); }; onItemRename = (repo, newName) => { let isDuplicated = this.props.repoList.some(item => { return item.name === newName; }); if (isDuplicated) { let errMessage = gettext('The name "{name}" is already taken. Please choose a different name.'); errMessage = errMessage.replace('{name}', Utils.HTMLescape(newName)); toaster.danger(errMessage); return false; } this.props.onItemRename(repo, newName); }; renderRepoListView = () => { return ( {this.props.repoList.map(repo => { return ( ); })} ); }; renderPCUI = () => { const { theadHidden = false } = this.props; const { sortByName, sortByTime, sortBySize, sortIcon } = this.getSortMetaData(); return ( {this.renderRepoListView()}
{gettext('Library Type')} {gettext('Name')} {sortByName && sortIcon} {gettext('Actions')} {gettext('Size')} {sortBySize && sortIcon} {gettext('Last Update')} {sortByTime && sortIcon} {gettext('Owner')}
); }; renderMobileUI = () => { return ( {this.renderRepoListView()}
); }; render() { const table = Utils.isDesktop() ? this.renderPCUI() : this.renderMobileUI(); if (this.props.hasNextPage) { return ( {table} ); } else { return table; } } } SharedRepoListView.propTypes = propTypes; export default SharedRepoListView;