2023-08-24 02:18:40 +00:00
|
|
|
import React, { Component, Fragment } from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { Link } from '@gatsbyjs/reach-router';
|
|
|
|
import { Utils } from '../../../utils/utils';
|
|
|
|
import { seafileAPI } from '../../../utils/seafile-api';
|
|
|
|
import { gettext, siteRoot } from '../../../utils/constants';
|
|
|
|
import Loading from '../../../components/loading';
|
|
|
|
import toaster from '../../../components/toast';
|
|
|
|
import EmptyTip from '../../../components/empty-tip';
|
|
|
|
|
|
|
|
const itemPropTypes = {
|
|
|
|
item: PropTypes.object.isRequired,
|
|
|
|
deleteItem: PropTypes.func.isRequired
|
|
|
|
};
|
|
|
|
|
|
|
|
class Item extends Component {
|
|
|
|
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
isOperationShow: false
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
onMouseEnter = () => {
|
2024-07-18 03:58:42 +00:00
|
|
|
this.setState({ isOperationShow: true });
|
2023-08-24 02:18:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
onMouseLeave = () => {
|
2024-07-18 03:58:42 +00:00
|
|
|
this.setState({ isOperationShow: false });
|
2023-08-24 02:18:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
onDeleteLink = (e) => {
|
|
|
|
e.preventDefault();
|
|
|
|
this.props.deleteItem(this.props.item);
|
|
|
|
};
|
|
|
|
|
|
|
|
render() {
|
|
|
|
let item = this.props.item;
|
|
|
|
let path = item.path === '/' ? '/' : item.path.slice(0, item.path.length - 1);
|
|
|
|
let objUrl = `${siteRoot}library/${item.repo_id}/${encodeURIComponent(item.repo_name)}${Utils.encodePath(path)}`;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave} onFocus={this.onMouseEnter}>
|
|
|
|
<td className="name">{item.creator_name}</td>
|
|
|
|
<td>
|
|
|
|
<Link to={objUrl}>{item.obj_name}</Link>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<a href={item.link} target="_blank" rel="noreferrer">{item.link}</a>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<span
|
|
|
|
tabIndex="0"
|
|
|
|
role="button"
|
|
|
|
className={`sf2-icon-x3 action-icon ${this.state.isOperationShow ? '' : 'invisible'}`}
|
|
|
|
onClick={this.onDeleteLink}
|
|
|
|
onKeyDown={Utils.onKeyDown}
|
|
|
|
title={gettext('Delete')}
|
|
|
|
aria-label={gettext('Delete')}
|
|
|
|
>
|
|
|
|
</span>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Item.propTypes = itemPropTypes;
|
|
|
|
|
|
|
|
const propTypes = {
|
|
|
|
repo: PropTypes.object.isRequired,
|
|
|
|
};
|
|
|
|
|
|
|
|
class RepoShareAdminUploadLinks extends Component {
|
|
|
|
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
loading: true,
|
|
|
|
errorMsg: '',
|
|
|
|
items: [],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
|
|
seafileAPI.listRepoUploadLinks(this.props.repo.repo_id).then((res) => {
|
|
|
|
this.setState({
|
|
|
|
loading: false,
|
|
|
|
items: res.data,
|
|
|
|
});
|
|
|
|
}).catch((error) => {
|
|
|
|
this.setState({
|
|
|
|
loading: false,
|
|
|
|
errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
deleteItem = (item) => {
|
|
|
|
seafileAPI.deleteRepoUploadLink(this.props.repo.repo_id, item.token).then(() => {
|
|
|
|
let items = this.state.items.filter(linkItem => {
|
|
|
|
return linkItem.token !== item.token;
|
|
|
|
});
|
2024-07-18 03:58:42 +00:00
|
|
|
this.setState({ items: items });
|
2023-08-24 02:18:40 +00:00
|
|
|
let message = gettext('Successfully deleted 1 item');
|
|
|
|
toaster.success(message);
|
|
|
|
}).catch((error) => {
|
|
|
|
let errMessage = Utils.getErrorMsg(error);
|
|
|
|
toaster.danger(errMessage);
|
|
|
|
});
|
2023-09-13 00:40:50 +00:00
|
|
|
};
|
2023-08-24 02:18:40 +00:00
|
|
|
|
|
|
|
render() {
|
|
|
|
const { loading, errorMsg, items } = this.state;
|
|
|
|
return (
|
|
|
|
<Fragment>
|
|
|
|
{loading && <Loading />}
|
|
|
|
{!loading && errorMsg && <p className="error text-center mt-8">{errorMsg}</p>}
|
|
|
|
{!loading && !errorMsg && !items.length &&
|
2024-08-21 08:32:41 +00:00
|
|
|
<EmptyTip text={gettext('No upload links')}/>
|
2023-08-24 02:18:40 +00:00
|
|
|
}
|
|
|
|
{!loading && !errorMsg && items.length > 0 &&
|
|
|
|
<table className="table-hover">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th width="22%">{gettext('Creator')}</th>
|
|
|
|
<th width="20%">{gettext('Name')}</th>
|
|
|
|
<th width="50%">{gettext('Link')}</th>
|
|
|
|
<th width="8%"></th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>
|
|
|
|
{items.map((item, index) => {
|
|
|
|
return (
|
|
|
|
<Item
|
|
|
|
key={index}
|
|
|
|
item={item}
|
|
|
|
deleteItem={this.deleteItem}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
}
|
|
|
|
</Fragment>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RepoShareAdminUploadLinks.propTypes = propTypes;
|
|
|
|
|
|
|
|
export default RepoShareAdminUploadLinks;
|