diff --git a/frontend/src/components/dialog/save-shared-dir-dialog.js b/frontend/src/components/dialog/save-shared-dir-dialog.js new file mode 100644 index 0000000000..955276e5dc --- /dev/null +++ b/frontend/src/components/dialog/save-shared-dir-dialog.js @@ -0,0 +1,89 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Alert } from 'reactstrap'; +import { gettext } from '../../utils/constants'; +import { seafileAPI } from '../../utils/seafile-api'; +import FileChooser from '../file-chooser/file-chooser'; +import { Utils } from '../../utils/utils'; + +const propTypes = { + sharedToken: PropTypes.string.isRequired, + parentDir: PropTypes.string.isRequired, + items: PropTypes.array.isRequired, + toggleCancel: PropTypes.func.isRequired, + handleSaveSharedDir: PropTypes.func.isRequired, +}; + +class SaveSharedDirDialog extends React.Component { + + constructor(props) { + super(props); + this.state = { + repo: null, + selectedPath: '', + errMessage: '', + }; + } + + onSaveSharedFile = () => { + const { sharedToken, parentDir, items } = this.props; + seafileAPI.saveSharedDir(this.state.repo.repo_id, this.state.selectedPath, sharedToken, parentDir, items).then((res) => { + this.props.toggleCancel(); + this.props.handleSaveSharedDir(); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + this.setState({errMessage: errMessage}); + }); + } + + onDirentItemClick = (repo, selectedPath, dirent) => { + if (dirent.type === 'dir') { + this.setState({ + repo: repo, + selectedPath: selectedPath, + }); + } + else { + this.setState({ + repo: null, + selectedPath: '', + }); + } + } + + onRepoItemClick = (repo) => { + this.setState({ + repo: repo, + selectedPath: '/', + }); + } + + render() { + return ( + + {gettext('Save to:')} + + + {this.state.errMessage && {this.state.errMessage}} + + + + { this.state.selectedPath ? + + : + + } + + + ); + } +} + +SaveSharedDirDialog.propTypes = propTypes; + +export default SaveSharedDirDialog; diff --git a/frontend/src/shared-dir-view.js b/frontend/src/shared-dir-view.js index 2da67a6718..a2bc870748 100644 --- a/frontend/src/shared-dir-view.js +++ b/frontend/src/shared-dir-view.js @@ -13,6 +13,8 @@ import ZipDownloadDialog from './components/dialog/zip-download-dialog'; import ImageDialog from './components/dialog/image-dialog'; import FileUploader from './components/shared-link-file-uploader/file-uploader'; +import SaveSharedDirDialog from './components/dialog/save-shared-dir-dialog'; + import './css/shared-dir-view.css'; import './css/grid-view.css'; @@ -47,6 +49,9 @@ class SharedDirView extends React.Component { isZipDialogOpen: false, zipFolderPath: '', + isSaveSharedDirDialogShow: false, + itemsForSave: [], + isImagePopupOpen: false, imageItems: [], imageIndex: 0 @@ -185,6 +190,35 @@ class SharedDirView extends React.Component { } } + saveSelectedItems = () => { + this.setState({ + isSaveSharedDirDialogShow: true, + itemsForSave: this.state.items.filter(item => item.isSelected) + .map(item => item.file_name || item.folder_name) + }); + } + + saveAllItems = () => { + this.setState({ + isSaveSharedDirDialogShow: true, + itemsForSave: this.state.items + .map(item => item.file_name || item.folder_name) + }); + } + + toggleSaveSharedDirCancel = () => { + this.setState({ + isSaveSharedDirDialogShow: false, + itemsForSave: [] + }); + } + + handleSaveSharedDir = () => { + toaster.success(gettext('Successfully saved'), { + duration: 3 + }); + } + closeZipDialog = () => { this.setState({ isZipDialogOpen: false, @@ -330,8 +364,15 @@ class SharedDirView extends React.Component { {showDownloadIcon && {this.state.items.some(item => item.isSelected) ? - : +
+ + +
+ : +
+ +
}
} @@ -375,6 +416,15 @@ class SharedDirView extends React.Component { /> } + {this.state.isSaveSharedDirDialogShow && + + } {this.state.isImagePopupOpen && [a-f0-9]+)/$', ShareLink.as_view(), name='api-v2.1-share-link'), url(r'^api/v2.1/share-links/(?P[a-f0-9]+)/save-file-to-repo/$', ShareLinkSaveFileToRepo.as_view(), name='api-v2.1-share-link-save-file-to-repo'), + url(r'^api/v2.1/share-links/(?P[a-f0-9]+)/save-items-to-repo/$', ShareLinkSaveItemsToRepo.as_view(), name='api-v2.1-share-link-save-items-to-repo'), url(r'^api/v2.1/share-links/(?P[a-f0-9]+)/dirents/$', ShareLinkDirents.as_view(), name='api-v2.1-share-link-dirents'), url(r'^api/v2.1/share-links/(?P[a-f0-9]+)/online-office-lock/$', ShareLinkOnlineOfficeLock.as_view(), name='api-v2.1-share-link-online-office-lock'),