import React from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; import CodeMirror from 'react-codemirror'; import moment from 'moment'; import watermark from 'watermark-dom'; import { ButtonGroup, Tooltip } from 'reactstrap'; import { seafileAPI } from './utils/seafile-api'; import { Utils } from './utils/utils'; import { serviceURL, gettext, mediaUrl } from './utils/constants'; import InternalLinkDialog from './components/dialog/internal-link-dialog'; import 'codemirror/lib/codemirror.css'; import 'codemirror/mode/javascript/javascript'; import 'codemirror/mode/css/css'; import 'codemirror/mode/clike/clike'; import 'codemirror/mode/php/php'; import 'codemirror/mode/sql/sql'; import 'codemirror/mode/vue/vue'; import 'codemirror/mode/xml/xml'; import 'codemirror/mode/go/go'; import 'codemirror/mode/python/python'; import 'codemirror/mode/htmlmixed/htmlmixed'; import './assets/css/fa-solid.css'; import './assets/css/fa-regular.css'; import './assets/css/fontawesome.css'; import './css/view-file-text.css'; const { isPro, repoID, repoName, filePath, fileName, siteName, enableWatermark, encoding, fileEncodingList, fileExt, isLocked, fileContent, latestContributor, lastModified, isStarred } = window.app.pageOptions; const options = { lineNumbers: true, mode: Utils.chooseLanguage(fileExt.slice(3, fileExt.length -3)), extraKeys: {'Ctrl': 'autocomplete'}, theme: 'default', autoMatchParens: true, textWrapping: true, lineWrapping: true, readOnly: 'nocursor', }; class ViewFileText extends React.Component { constructor(props) { super(props); this.state = { isLocked: isLocked, star: isStarred, }; } changeEncode = (e) => { window.location.href = serviceURL + '/lib/' + repoID + '/file/' + fileName +'/?file_enc=' + e.target.value; } fileEncode = () => { const list = fileEncodingList.substring(1, fileEncodingList.length - 1).replace(/\'*/g,'').replace(/\s*/g,'').split(','); return (
); } handleMouseDown = (option) => { switch(option) { case 'back': window.location.href = serviceURL + '/library/' + repoID + '/' + repoName + '/'; break; case 'lock': this.toggleLockFile(); break; case 'history': window.location.href = serviceURL + '/repo/file_revisions/' + repoID + '/?p=' + filePath; break; case 'edit': window.location.href = serviceURL + '/repo/' + repoID + '/file/edit/?p=' + filePath + '&file_enc=' + encoding; break; case 'download': window.location.href = serviceURL + '/lib/' + repoID + '/file/' + filePath +'?dl=1'; break; } } renderToolbar() { return (
this.handleMouseDown('back')} /> {isPro === 'True' && this.handleMouseDown('lock')} icon={'fa fa-lock'} /> } {isPro === 'True' && this.handleMouseDown('history')} icon={'fa fa-history'} /> } this.handleMouseDown('edit')} /> this.handleMouseDown('download')} icon={'fa fa-download'} /> {/* this.handleMouseDown('comment')} icon={'sf-btn-group-btn op-icon sf2-icon-msgs sf-btn-group-btn-last'} /> */}
); } toggleStar = () => { if (this.state.star) { seafileAPI.unStarFile(repoID, filePath).then((res) => { if (res.data === 'success') { this.setState({ star: false, }); } }); } else { seafileAPI.starFile(repoID, filePath).then((res) => { if (res.data === 'success') { this.setState({ star: true, }); } }); } } toggleLockFile = () => { if (this.state.isLocked) { seafileAPI.unlockfile(repoID, filePath).then((res) => { this.setState({ isLocked: res.data.is_locked }); }); } else { seafileAPI.lockfile(repoID, filePath).then((res) => { this.setState({ isLocked: res.data.is_locked }); }); } } render() { return (
{this.renderToolbar()}
{this.fileEncode()}
); } } const IconButtonPropTypes = { icon: PropTypes.string, id: PropTypes.string, onMouseDown: PropTypes.func, isActive: PropTypes.bool, disabled: PropTypes.bool, text: PropTypes.string, }; class IconButton extends React.Component { constructor(props) { super(props); this.state = { tooltipOpen: false }; } toggle = () => { this.setState({ tooltipOpen: !this.state.tooltipOpen }); } render() { let className = 'btn btn-icon btn-secondary btn-active'; return ( ); } } IconButton.propTypes = IconButtonPropTypes; const FileInfoPropTypes = { serviceURL: PropTypes.string.isRequired, toggleStar: PropTypes.func.isRequired, isLocked: PropTypes.bool, star: PropTypes.bool, }; class FileInfo extends React.PureComponent { constructor(props) { super(props); } render() { let modifyTime = moment(lastModified * 1000).format('YYYY-MM-DD HH:mm'); const modifierUrl = this.props.serviceURL + '/profile/' + latestContributor + '/'; return (

{fileName} {this.props.isLocked && locked }

{latestContributor} {' '} {modifyTime}
); } } FileInfo.propTypes = FileInfoPropTypes; if (enableWatermark) { const loginUser = window.app.userInfo.name; let watermark_txt; if (loginUser) { watermark_txt = siteName + ' ' + loginUser; } else { watermark_txt = gettext('Anonymous User'); } watermark.init({ watermark_txt: watermark_txt, watermark_alpha: 0.075 }); } ReactDOM.render ( , document.getElementById('root') );