diff --git a/frontend/package-lock.json b/frontend/package-lock.json index dda7d58057..c0166f04e3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -180,7 +180,7 @@ "dependencies": { "reactstrap": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/reactstrap/-/reactstrap-5.0.0.tgz", "integrity": "sha512-y0eju/LAK7gbEaTFfq2iW92MF7/5Qh0tc1LgYr2mg92IX8NodGc03a+I+cp7bJ0VXHAiLy0bFL9UP89oSm4cBg==", "requires": { "classnames": "^2.2.3", @@ -640,7 +640,7 @@ }, "axios": { "version": "0.18.0", - "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { "follow-redirects": "^1.3.0", @@ -2507,9 +2507,9 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codemirror": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.42.0.tgz", - "integrity": "sha512-pbApC8zDzItP3HRphD6kQVwS976qB5Qi0hU3MZMixLk+AyugOW1RF+8XJEjeyl5yWsHNe88tDUxzeRh5AOxPRw==" + "version": "5.42.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.42.2.tgz", + "integrity": "sha512-Tkv6im39VuhduFMsDA3MlXcC/kKas3Z0PI1/8N88QvFQbtOeiiwnfFJE4juGyC8/a4sb1BSxQlzsil8XLQdxRw==" }, "collapse-white-space": { "version": "1.0.4", @@ -9964,7 +9964,7 @@ }, "react-popper": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-0.8.3.tgz", + "resolved": "http://registry.npmjs.org/react-popper/-/react-popper-0.8.3.tgz", "integrity": "sha1-D3MzMTfJ+wr27EB00tBYWgoEYeE=", "requires": { "popper.js": "^1.12.9", diff --git a/frontend/src/components/history-list-view/history-list-item.js b/frontend/src/components/history-list-view/history-list-item.js index 4173d7989a..49b7415b0c 100644 --- a/frontend/src/components/history-list-view/history-list-item.js +++ b/frontend/src/components/history-list-view/history-list-item.js @@ -1,17 +1,20 @@ import React from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; -import MenuControl from '../menu-control'; +import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem} from 'reactstrap'; +import { gettext, filePath } from '../../utils/constants'; +import URLDecorator from '../../utils/url-decorator'; moment.locale(window.app.config.lang); + const propTypes = { - isItemFrezeed: PropTypes.bool.isRequired, - isFirstItem: PropTypes.bool.isRequired, - preCommitID: PropTypes.string.isRequired, + index: PropTypes.number.isRequired, item: PropTypes.object.isRequired, - currentItem: PropTypes.object.isRequired, - onMenuControlClick: PropTypes.func.isRequired, - onHistoryItemClick: PropTypes.func.isRequired, + currentItem: PropTypes.object, + isItemFreezed: PropTypes.bool.isRequired, + onItemClick: PropTypes.func.isRequired, + onItemRestore: PropTypes.func.isRequired, + onFreezedItemToggle: PropTypes.func.isRequired, }; class HistoryListItem extends React.Component { @@ -19,42 +22,57 @@ class HistoryListItem extends React.Component { constructor(props) { super(props); this.state = { - isShowOperationIcon: false + isShowOperationIcon: false, + isMenuShow: false, }; } onMouseEnter = () => { - if (!this.props.isItemFrezeed) { + if (!this.props.isItemFreezed) { this.setState({isShowOperationIcon: true}); } } onMouseLeave = () => { - if (!this.props.isItemFrezeed) { + if (!this.props.isItemFreezed) { this.setState({isShowOperationIcon: false}); } } + onToggleClick = (e) => { + this.setState({isMenuShow: !this.state.isMenuShow}); + this.props.onFreezedItemToggle(); + } + onItemClick = () => { + this.setState({isShowOperationIcon: false}); //restore to default state if (this.props.item.commit_id === this.props.currentItem.commit_id) { return; } - this.setState({isShowOperationIcon: false}); //restore to default state - this.props.onHistoryItemClick(this.props.item, this.props.preCommitID); + let currentIndex = this.props.index; + this.props.onItemClick(this.props.item, currentIndex); } - onMenuControlClick = (e) => { - e.nativeEvent.stopImmediatePropagation(); - this.props.onMenuControlClick(e, this.props.item , this.props.isFirstItem); + onItemRestore = () => { + this.props.onItemRestore(this.props.currentItem); + } + + onItemDownload = () => { + // nothing todo } render() { + if (!this.props.currentItem) { + return ''; + } let item = this.props.item; - let time = moment.parseZone(item.ctime).format('YYYY-MM-DD HH:mm'); + let time = moment(item.ctime).format('YYYY-MM-DD HH:mm'); let isHigtlightItem = false; if (this.props.item && this.props.currentItem) { isHigtlightItem = this.props.item.commit_id === this.props.currentItem.commit_id; } + let objID = this.props.currentItem.rev_file_id; + let url = URLDecorator.getUrl({type: 'download_historic_file', filePath: filePath, objID: objID}); return (
  • - + + + + {(this.props.index !== 0) && {gettext('Restore')}} + {gettext('Download')} + +
  • ); diff --git a/frontend/src/components/history-list-view/history-list-menu.js b/frontend/src/components/history-list-view/history-list-menu.js deleted file mode 100644 index 493a568ba5..0000000000 --- a/frontend/src/components/history-list-view/history-list-menu.js +++ /dev/null @@ -1,63 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { gettext, filePath } from '../../utils/constants'; -import URLDecorator from '../../utils/url-decorator'; - -const propTypes = { - isFirstItem: PropTypes.bool.isRequired, - isListMenuShow: PropTypes.bool.isRequired, - menuPosition: PropTypes.object.isRequired, - currentItem: PropTypes.object, - onDownloadFile: PropTypes.func.isRequired, - onRestoreFile: PropTypes.func.isRequired, -}; - -class HistoryListMenu extends React.Component { - - onDownloadFile = () => { - this.props.onDownloadFile(); - } - - onRestoreFile = () => { - this.props.onRestoreFile(); - } - - render() { - let style = {}; - let position = this.props.menuPosition; - if (this.props.isListMenuShow) { - style = {position: 'fixed',left: position.left + 'px',top: position.top + 'px',display: 'block'}; - } - - if (!this.props.currentItem) { - return ''; - } - - let objID = this.props.currentItem.rev_file_id; - let url = URLDecorator.getUrl({type: 'download_historic_file', filePath: filePath, objID: objID}); - - if (this.props.isFirstItem) { - return ( - - ); - } - - return ( - - ); - } - -} - -HistoryListMenu.propTypes = propTypes; - -export default HistoryListMenu; diff --git a/frontend/src/components/history-list-view/history-list-view.js b/frontend/src/components/history-list-view/history-list-view.js index e96927c3be..fce29cff68 100644 --- a/frontend/src/components/history-list-view/history-list-view.js +++ b/frontend/src/components/history-list-view/history-list-view.js @@ -2,25 +2,41 @@ import React from 'react'; import PropTypes from 'prop-types'; import HisotyListItem from './history-list-item'; import Loading from '../loading'; -import axios from 'axios'; -import editUtilties from '../../utils/editor-utilties'; -import URLDecorator from '../../utils/url-decorator'; -import { filePath } from '../../utils/constants'; const propTypes = { hasMore: PropTypes.bool.isRequired, isReloadingData: PropTypes.bool.isRequired, - isItemFrezeed: PropTypes.bool.isRequired, historyList: PropTypes.array.isRequired, - currentItem: PropTypes.object, reloadMore: PropTypes.func.isRequired, - onMenuControlClick: PropTypes.func.isRequired, - onHistoryItemClick: PropTypes.func.isRequired, - setDiffContent: PropTypes.func.isRequired, + onItemClick: PropTypes.func.isRequired, }; class HistoryListView extends React.Component { + constructor(props) { + super(props); + this.state = { + isItemFreezed: false, + currentItem: null, + }; + } + + componentDidMount = () => { + let historyList = this.props.historyList; + if (historyList.length > 0) { + this.setState({currentItem: historyList[0]}); + if (historyList === 1) { + this.props.onItemClick(historyList[0]); + } else { + this.props.onItemClick(historyList[0], historyList[1]); + } + } + } + + onFreezedItemToggle = () => { + this.setState({isItemFreezed: !this.state.isItemFreezed}); + } + onScrollHandler = (event) => { const clientHeight = event.target.clientHeight; const scrollHeight = event.target.scrollHeight; @@ -32,46 +48,30 @@ class HistoryListView extends React.Component { } } - componentDidMount() { - let historyList = this.props.historyList; - if (historyList.length > 1) { - let downLoadURL = URLDecorator.getUrl({type: 'download_historic_file', filePath: filePath, objID: historyList[0].rev_file_id}); - let downLoadURL1 = URLDecorator.getUrl({type: 'download_historic_file', filePath: filePath, objID: historyList[1].rev_file_id}); - axios.all([ - editUtilties.getFileContent(downLoadURL), - editUtilties.getFileContent(downLoadURL1) - ]).then(axios.spread((res1, res2) => { - this.props.setDiffContent(res1.data, res2.data); - })); + onItemClick = (item, currentIndex) => { + this.setState({currentItem: item}); + if (currentIndex !== this.props.historyList.length) { + let preItem = this.props.historyList[currentIndex + 1]; + this.props.onItemClick(item, preItem); } else { - let downLoadURL = URLDecorator.getUrl({type: 'download_historic_file', filePath: filePath, objID: historyList[0].rev_file_id}); - axios.all([ - editUtilties.getFileContent(downLoadURL), - ]).then(axios.spread((res1) => { - this.props.setDiffContent(res1.data, ''); - })); + this.props.onItemClick(item); } - } render() { return (