| | |
| | | import de.micromata.borgbutler.data.Repository; |
| | | import de.micromata.borgbutler.json.JsonUtils; |
| | | import de.micromata.borgbutler.json.borg.BorgFilesystemItem; |
| | | import org.apache.commons.lang3.math.NumberUtils; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | |
| | | * @see JsonUtils#toJson(Object, boolean) |
| | | */ |
| | | public String getArchiveFileLIst(@QueryParam("archiveId") String archiveId, |
| | | @QueryParam("maxResultSize") Integer maxResultSize, |
| | | @QueryParam("search") String search, |
| | | @QueryParam("maxResultSize") String maxResultSize, |
| | | @QueryParam("force") boolean force, |
| | | @QueryParam("prettyPrinter") boolean prettyPrinter) { |
| | | int maxSize = maxResultSize != null ? maxResultSize : 50; |
| | | int maxSize = NumberUtils.toInt(maxResultSize, 50); |
| | | List<BorgFilesystemItem> items = ButlerCache.getInstance().getArchiveContent(archiveId, force, maxSize); |
| | | if (items == null) { |
| | | return "[]"; |
| | |
| | | import {IconRefresh} from '../../general/IconComponents'; |
| | | import I18n from '../../general/translation/I18n'; |
| | | |
| | | function FileListFilters({loadLog, changeFilter, filters}) { |
| | | function FileListFilter({reload, changeFilter, filter}) { |
| | | |
| | | return ( |
| | | <form |
| | | onSubmit={loadLog} |
| | | onSubmit={reload} |
| | | className={'form-inline'} |
| | | > |
| | | <FormLabel length={1}> |
| | |
| | | </FormLabel> |
| | | |
| | | <FormInput |
| | | value={filters.search} |
| | | value={filter.search} |
| | | name={'search'} |
| | | onChange={changeFilter} |
| | | fieldLength={5} |
| | | /> |
| | | |
| | | <FormSelect |
| | | value={filters.maxSize} |
| | | value={filter.maxSize} |
| | | name={'maxSize'} |
| | | onChange={changeFilter} |
| | | hint={<I18n name={'common.limitsResultSize'} />} |
| | |
| | | ); |
| | | } |
| | | |
| | | FileListFilters.propTypes = { |
| | | FileListFilter.propTypes = { |
| | | changeFilter: PropTypes.func.isRequired, |
| | | filters: PropTypes.shape({ |
| | | filter: PropTypes.shape({ |
| | | search: PropTypes.string, |
| | | maxSize: PropTypes.oneOf(['50', '100', '500', '1000', '10000']), |
| | | }).isRequired, |
| | | loadLog: PropTypes.func.isRequired |
| | | reload: PropTypes.func.isRequired |
| | | }; |
| | | |
| | | export default FileListFilters; |
| | | export default FileListFilter; |
| | |
| | | import {getRestServiceUrl} from '../../../utilities/global'; |
| | | import ErrorAlert from '../../general/ErrorAlert'; |
| | | import FileListTable from "./FileListTable"; |
| | | import FileListFilter from "./FileListFilter"; |
| | | |
| | | class ArchiveView extends React.Component { |
| | | |
| | | state = { |
| | | isFetching: false, activeTab: '1', |
| | | fileList: undefined |
| | | fileList: undefined, |
| | | filter: { |
| | | search: '', |
| | | maxSize: '50' |
| | | } |
| | | }; |
| | | |
| | | componentDidMount = () => { |
| | | this.fetchArchiveFileList(false); |
| | | }; |
| | | |
| | | handleInputChange = (event) => { |
| | | event.preventDefault(); |
| | | this.setState({filter : {...this.state.filter, [event.target.name]: event.target.value}}); |
| | | }; |
| | | |
| | | |
| | | fetchArchiveFileList = (force) => { |
| | | let forceReload = false; |
| | |
| | | }); |
| | | fetch(getRestServiceUrl('archives/filelist', { |
| | | archiveId: this.props.archiveId, |
| | | force: forceReload |
| | | force: forceReload, |
| | | search: this.state.filter.search, |
| | | maxResultSize: this.state.filter.maxSize |
| | | }), { |
| | | method: 'GET', |
| | | headers: { |
| | |
| | | } else if (this.state.fileList) { |
| | | if (this.state.fileList.length > 0) { |
| | | content = <React.Fragment> |
| | | <FileListFilter |
| | | filter={this.state.filter} |
| | | changeFilter={this.handleInputChange} |
| | | reload={(event) => { |
| | | event.preventDefault(); |
| | | this.fetchArchiveFileList(); |
| | | }} |
| | | /> |
| | | <FileListTable |
| | | entries={this.state.fileList}/> |
| | | </React.Fragment>; |
| | | } else { |
| | | content = <React.Fragment> |
| | | <Button outline color="primary" onClick={() => this.fetchArchiveFileList(true)}>Load file list from borg backup server</Button> |
| | | <Button outline color="primary" onClick={() => this.fetchArchiveFileList(true)}>Load file list from |
| | | borg backup server</Button> |
| | | </React.Fragment>; |
| | | } |
| | | } |
| | |
| | | <thead> |
| | | <tr> |
| | | <th>Mode</th> |
| | | <th>Date</th> |
| | | <th>Modified time</th> |
| | | <th>Size</th> |
| | | <th>Path</th> |
| | | </tr> |