1{"version":3,"sources":["pages/file-history-old/history-item.js","file-history-old.js"],"names":["moment","locale","window","app","config","lang","HistoryItem","props","onMouseEnter","setState","active","onMouseLeave","onItemRestore","e","preventDefault","item","state","this","downloadUrl","URLDecorator","getUrl","type","filePath","objID","rev_file_id","userProfileURL","siteRoot","encodeURIComponent","creator_email","viewUrl","historyRepoID","commit_id","diffUrl","className","datetime","time","is","title","ctime","format","fromNow","index","gettext","src","creator_avatar_url","alt","href","target","creator_name","Utils","bytesToSize","size","canDownload","canCompare","React","Component","MoreMenu","dropdownToggle","dropdownOpen","isOpen","toggle","direction","tag","data-toggle","aria-expanded","right","onClick","PureComponent","FileHistory","listNewHistoryRecords","PER_PAGE","editUtilities","listFileHistoryRecords","then","res","data","isLoading","Error","initNewRecords","listOldHistoryRecords","repoID","seafileAPI","listOldFileHistoryRecords","initOldRecords","onScrollHandler","event","clientHeight","scrollHeight","isBottom","scrollTop","hasMore","reloadMore","isReloadingData","useNewAPI","currentPage","updateNewRecords","commitID","nextCommit","oldFilePath","updateOldRecords","commitId","path","revertFile","success","refershFileList","onSearchedClick","searchedItem","handleSearchedItemClick","historyList","undefined","result","total_count","length","oldPath","old_path","concat","slice","page","next_start_commit","rev_renamed_old_path","id","showCloseSidePanelIcon","onScroll","fileName","width","map","ReactDOM","render","document","getElementById"],"mappings":"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","file":"static/js/fileHistoryOld.chunk.js","sourcesContent":["import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Utils } from '../../utils/utils';\nimport { gettext, siteRoot, filePath, historyRepoID } from '../../utils/constants';\nimport URLDecorator from '../../utils/url-decorator';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\n\nmoment.locale(window.app.config.lang);\n\nconst propTypes = {\n item: PropTypes.object.isRequired,\n index: PropTypes.number.isRequired,\n canDownload: PropTypes.bool.isRequired,\n canCompare: PropTypes.bool.isRequired,\n onItemRestore: PropTypes.func.isRequired,\n};\n\nclass HistoryItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n active: false,\n };\n }\n\n onMouseEnter = () => {\n this.setState({\n active: true\n });\n }\n\n onMouseLeave = () => {\n this.setState({\n active: false\n });\n }\n\n onItemRestore = (e) => {\n e.preventDefault();\n this.props.onItemRestore(this.props.item);\n }\n\n render() {\n let item = this.props.item;\n let downloadUrl = URLDecorator.getUrl({type: 'download_historic_file', filePath: filePath, objID: item.rev_file_id});\n let userProfileURL = `${siteRoot}profile/${encodeURIComponent(item.creator_email)}/`;\n let viewUrl = `${siteRoot}repo/${historyRepoID}/history/files/?obj_id=${item.rev_file_id}&commit_id=${item.commit_id}&p=${filePath}`;\n let diffUrl = `${siteRoot}repo/text_diff/${historyRepoID}/?commit=${item.commit_id}&p=${filePath}`;\n return (\n <Fragment>\n <tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave} className={this.state.active ? 'tr-highlight' : ''}>\n <td>\n <time datetime={item.time} is=\"relative-time\" title={moment(item.ctime).format('llll')}>{moment(item.ctime).fromNow()}</time>\n {this.props.index === 0 && gettext('(current version)')}\n </td>\n <td>\n <img className=\"avatar\" src={item.creator_avatar_url} alt=''></img>{' '}\n <a href={userProfileURL} target='_blank' className=\"username\">{item.creator_name}</a>\n </td>\n <td>{Utils.bytesToSize(item.size)}</td>\n <td>\n {this.state.active &&\n <MoreMenu\n index={this.props.index}\n downloadUrl={downloadUrl}\n viewUrl={viewUrl}\n diffUrl={diffUrl}\n onItemRestore={this.onItemRestore}\n canDownload={this.props.canDownload}\n canCompare={this.props.canCompare}\n />\n }\n </td>\n </tr>\n </Fragment>\n );\n }\n}\n\nHistoryItem.propTypes = propTypes;\n\n\nconst MoreMenuPropTypes = {\n index: PropTypes.number.isRequired,\n downloadUrl: PropTypes.string.isRequired,\n viewUrl: PropTypes.string.isRequired,\n diffUrl: PropTypes.string.isRequired,\n onItemRestore: PropTypes.func.isRequired,\n canDownload: PropTypes.bool.isRequired,\n canCompare: PropTypes.bool.isRequired,\n};\n\nclass MoreMenu extends React.PureComponent {\n\n constructor(props) {\n super(props);\n this.state = {\n dropdownOpen: false\n };\n }\n\n dropdownToggle = () => {\n this.setState({ dropdownOpen: !this.state.dropdownOpen });\n }\n\n render() {\n const { index, downloadUrl, viewUrl, diffUrl, onItemRestore, canCompare, canDownload } = this.props;\n return (\n <Dropdown isOpen={this.state.dropdownOpen} toggle={this.dropdownToggle} direction=\"down\" className=\"mx-1 old-history-more-operation\">\n <DropdownToggle\n tag='i'\n className='fa fa-ellipsis-v'\n title={gettext('More Operations')}\n data-toggle=\"dropdown\"\n aria-expanded={this.state.dropdownOpen}\n >\n </DropdownToggle>\n <DropdownMenu className=\"drop-list\" right={true}>\n {index !== 0 && <a href=\"#\" onClick={onItemRestore}><DropdownItem>{gettext('Restore')}</DropdownItem></a>}\n {canDownload && <a href={downloadUrl}><DropdownItem>{gettext('Download')}</DropdownItem></a>}\n <a href={viewUrl}><DropdownItem>{gettext('View')}</DropdownItem></a>\n {/*canCompare && <a href={diffUrl}><DropdownItem>{gettext('Diff')}</DropdownItem></a>*/}\n </DropdownMenu>\n </Dropdown>\n );\n }\n}\n\nMoreMenu.propTypes = MoreMenuPropTypes;\n\nexport default HistoryItem;\n","import React, { Fragment } from 'react';\nimport ReactDOM from 'react-dom';\nimport { Button } from 'reactstrap';\nimport { Utils } from './utils/utils';\nimport { seafileAPI } from './utils/seafile-api';\nimport { gettext, PER_PAGE, filePath, fileName, historyRepoID, useNewAPI, canDownload, canCompare } from './utils/constants';\nimport editUtilities from './utils/editor-utilities';\nimport Loading from './components/loading';\nimport Logo from './components/logo';\nimport CommonToolbar from './components/toolbar/common-toolbar';\nimport HistoryItem from './pages/file-history-old/history-item';\n\nimport './css/layout.css';\nimport './css/toolbar.css';\nimport './css/search.css';\nimport './css/file-history-old.css';\n\nclass FileHistory extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n historyList: [],\n currentPage: 1,\n hasMore: false,\n nextCommit: undefined,\n filePath: '',\n oldFilePath: '',\n isLoading: true,\n isReloadingData: false,\n };\n }\n\n componentDidMount() {\n if (useNewAPI) {\n this.listNewHistoryRecords(filePath, PER_PAGE);\n } else {\n this.listOldHistoryRecords(historyRepoID, filePath);\n }\n }\n\n listNewHistoryRecords = (filePath, PER_PAGE) => {\n editUtilities.listFileHistoryRecords(filePath, 1, PER_PAGE).then(res => {\n let historyData = res.data;\n if (!historyData) {\n this.setState({isLoading: false});\n throw Error('There is an error in server.');\n }\n this.initNewRecords(res.data);\n });\n }\n\n listOldHistoryRecords = (repoID, filePath) => {\n seafileAPI.listOldFileHistoryRecords(repoID, filePath).then((res) => {\n let historyData = res.data;\n if (!historyData) {\n this.setState({isLoading: false});\n throw Error('There is an error in server.');\n }\n this.initOldRecords(res.data);\n });\n }\n\n initNewRecords(result) {\n if (result.total_count < 5) {\n if (result.data.length) {\n let commitID = result.data[result.data.length-1].commit_id;\n let path = result.data[result.data.length-1].path;\n let oldPath = result.data[result.data.length-1].old_path;\n path = oldPath ? oldPath : path;\n seafileAPI.listOldFileHistoryRecords(historyRepoID, path, commitID).then((res) => {\n if (!res.data) {\n this.setState({isLoading: false});\n throw Error('There is an error in server.');\n }\n this.setState({\n historyList: result.data.concat(res.data.data.slice(1, res.data.data.length)),\n isLoading: false,\n });\n });\n } else {\n seafileAPI.listOldFileHistoryRecords(historyRepoID, filePath).then((res) => {\n if (!res.data) {\n this.setState({isLoading: false});\n throw Error('There is an error in server.');\n }\n this.setState({\n historyList: res.data.data,\n isLoading: false,\n });\n });\n }\n } else {\n this.setState({\n historyList: result.data,\n currentPage: result.page,\n hasMore: result.total_count > (PER_PAGE * this.state.currentPage),\n isLoading: false,\n });\n }\n }\n\n initOldRecords(result) {\n if (result.data.length) {\n this.setState({\n historyList: result.data,\n nextCommit: result.next_start_commit,\n filePath: result.data[result.data.length-1].path,\n oldFilePath: result.data[result.data.length-1].rev_renamed_old_path,\n isLoading: false,\n });\n } else {\n this.setState({nextCommit: result.next_start_commit,});\n if (this.state.nextCommit) {\n seafileAPI.listOldFileHistoryRecords(historyRepoID, filePath, this.state.nextCommit).then((res) => {\n this.initOldRecords(res.data);\n });\n } else {\n this.setState({isLoading: false});\n }\n }\n }\n\n onScrollHandler = (event) => {\n const clientHeight = event.target.clientHeight;\n const scrollHeight = event.target.scrollHeight;\n const scrollTop = event.target.scrollTop;\n const isBottom = (clientHeight + scrollTop + 1 >= scrollHeight);\n let hasMore = this.state.hasMore;\n if (isBottom && hasMore) {\n this.reloadMore();\n }\n }\n\n reloadMore = () => {\n if (!this.state.isReloadingData) {\n if (useNewAPI) {\n let currentPage = this.state.currentPage + 1;\n this.setState({\n currentPage: currentPage,\n isReloadingData: true,\n });\n editUtilities.listFileHistoryRecords(filePath, currentPage, PER_PAGE).then(res => {\n this.updateNewRecords(res.data);\n });\n } else {\n let commitID = this.state.nextCommit;\n let filePath = this.state.filePath;\n let oldFilePath = this.state.oldFilePath;\n this.setState({isReloadingData: true});\n if (oldFilePath) {\n seafileAPI.listOldFileHistoryRecords(historyRepoID, oldFilePath, commitID).then((res) => {\n this.updateOldRecords(res.data, oldFilePath);\n });\n } else {\n seafileAPI.listOldFileHistoryRecords(historyRepoID, filePath, commitID).then((res) => {\n this.updateOldRecords(res.data, filePath);\n });\n }\n }\n }\n }\n\n updateNewRecords(result) {\n this.setState({\n historyList: [...this.state.historyList, ...result.data],\n currentPage: result.page,\n hasMore: result.total_count > (PER_PAGE * this.state.currentPage),\n isReloadingData: false,\n });\n }\n\n updateOldRecords(result, filePath) {\n if (result.data.length) {\n this.setState({\n historyList: [...this.state.historyList, ...result.data],\n nextCommit: result.next_start_commit,\n filePath: result.data[result.data.length-1].path,\n oldFilePath: result.data[result.data.length-1].rev_renamed_old_path,\n isReloadingData: false,\n });\n } else {\n this.setState({nextCommit: result.next_start_commit,});\n if (this.state.nextCommit) {\n seafileAPI.listOldFileHistoryRecords(historyRepoID, filePath, this.state.nextCommit).then((res) => {\n this.updateOldRecords(res.data, filePath);\n });\n }\n }\n }\n\n onItemRestore = (item) => {\n let commitId = item.commit_id;\n let filePath = item.path;\n editUtilities.revertFile(filePath, commitId).then(res => {\n if (res.data.success) {\n this.setState({isLoading: true});\n this.refershFileList();\n }\n });\n }\n\n refershFileList() {\n if (useNewAPI) {\n editUtilities.listFileHistoryRecords(filePath, 1, PER_PAGE).then((res) => {\n this.initNewRecords(res.data);\n });\n } else {\n seafileAPI.listOldFileHistoryRecords(historyRepoID, filePath).then((res) => {\n this.initOldRecords(res.data);\n });\n }\n }\n\n onSearchedClick = (searchedItem) => {\n Utils.handleSearchedItemClick(searchedItem);\n }\n\n render() {\n return (\n <Fragment>\n <div id=\"header\" className=\"old-history-header\">\n <div className=\"logo\">\n <Logo showCloseSidePanelIcon={false}/>\n </div>\n <div className='toolbar'>\n <CommonToolbar onSearchedClick={this.onSearchedClick} />\n </div>\n </div>\n <div id=\"main\" onScroll={this.onScrollHandler}>\n <div className=\"old-history-main\">\n <Fragment>\n <a href=\"javascript:window.history.back()\" className=\"go-back\" title=\"Back\">\n <span className=\"fas fa-chevron-left\"></span>\n </a>\n <h2><span className=\"file-name\">{fileName}</span>{' '}{gettext('History Versions')}</h2>\n </Fragment>\n <Fragment>\n <table className=\"commit-list\">\n <thead>\n <tr>\n <th width=\"40%\" >{gettext('Time')}</th>\n <th width=\"30%\" >{gettext('Modifier')}</th>\n <th width=\"25%\" >{gettext('Size')}</th>\n <th width=\"5%\" ></th>\n </tr>\n </thead>\n {!this.state.isLoading &&\n <tbody>\n {this.state.historyList.map((item, index) => {\n return (\n <HistoryItem\n key={index}\n item={item}\n index={index}\n canDownload={canDownload}\n canCompare={canCompare}\n onItemRestore={this.onItemRestore}\n />\n );\n })}\n </tbody>\n }\n </table>\n {(this.state.isReloadingData || this.state.isLoading) && <Loading />}\n {this.state.nextCommit && !this.state.isLoading && !this.state.isReloadingData &&\n <Button className=\"get-more-btn\" onClick={this.reloadMore}>{gettext('More')}</Button>\n }\n </Fragment>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nReactDOM.render (\n <FileHistory />,\n document.getElementById('wrapper')\n);\n"],"sourceRoot":""}