ShareLinkSetting.jsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import React, { Fragment } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import AdminGeneralSecurityContainer from '~/client/services/AdminGeneralSecurityContainer';
  5. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  6. import { apiv3Delete } from '~/client/util/apiv3-client';
  7. import PaginationWrapper from '../../PaginationWrapper';
  8. import ShareLinkList from '../../ShareLink/ShareLinkList';
  9. import { withUnstatedContainers } from '../../UnstatedUtils';
  10. import DeleteAllShareLinksModal from './DeleteAllShareLinksModal';
  11. const Pager = (props) => {
  12. if (props.links.length === 0) {
  13. return null;
  14. }
  15. return (
  16. <PaginationWrapper
  17. activePage={props.activePage}
  18. changePage={props.handlePage}
  19. totalItemsCount={props.totalLinks}
  20. pagingLimit={props.limit}
  21. align="center"
  22. size="sm"
  23. />
  24. );
  25. };
  26. Pager.propTypes = {
  27. links: PropTypes.array.isRequired,
  28. activePage: PropTypes.number.isRequired,
  29. handlePage: PropTypes.func.isRequired,
  30. totalLinks: PropTypes.number.isRequired,
  31. limit: PropTypes.number.isRequired,
  32. };
  33. class ShareLinkSetting extends React.Component {
  34. constructor() {
  35. super();
  36. this.state = {
  37. isDeleteConfirmModalShown: false,
  38. };
  39. this.getShareLinkList = this.getShareLinkList.bind(this);
  40. this.showDeleteConfirmModal = this.showDeleteConfirmModal.bind(this);
  41. this.closeDeleteConfirmModal = this.closeDeleteConfirmModal.bind(this);
  42. this.deleteAllLinksButtonHandler = this.deleteAllLinksButtonHandler.bind(this);
  43. this.deleteLinkById = this.deleteLinkById.bind(this);
  44. this.switchDisableLinkSharing = this.switchDisableLinkSharing.bind(this);
  45. }
  46. UNSAFE_componentWillMount() {
  47. this.getShareLinkList(1);
  48. }
  49. async getShareLinkList(page) {
  50. try {
  51. await this.props.adminGeneralSecurityContainer.retrieveShareLinksByPagingNum(page);
  52. }
  53. catch (err) {
  54. toastError(err);
  55. }
  56. }
  57. showDeleteConfirmModal() {
  58. this.setState({ isDeleteConfirmModalShown: true });
  59. }
  60. closeDeleteConfirmModal() {
  61. this.setState({ isDeleteConfirmModalShown: false });
  62. }
  63. async deleteAllLinksButtonHandler() {
  64. const { t } = this.props;
  65. try {
  66. const res = await apiv3Delete('/share-links/all');
  67. const { deletedCount } = res.data;
  68. toastSuccess(t('toaster.remove_share_link', { count: deletedCount }));
  69. }
  70. catch (err) {
  71. toastError(err);
  72. }
  73. this.getShareLinkList(1);
  74. }
  75. async deleteLinkById(shareLinkId) {
  76. const { t, adminGeneralSecurityContainer } = this.props;
  77. const { shareLinksActivePage } = adminGeneralSecurityContainer.state;
  78. try {
  79. const res = await apiv3Delete(`/share-links/${shareLinkId}`);
  80. const { deletedShareLink } = res.data;
  81. toastSuccess(t('toaster.remove_share_link_success', { shareLinkId: deletedShareLink._id }));
  82. }
  83. catch (err) {
  84. toastError(err);
  85. }
  86. this.getShareLinkList(shareLinksActivePage);
  87. }
  88. async switchDisableLinkSharing() {
  89. const { t, adminGeneralSecurityContainer } = this.props;
  90. try {
  91. await adminGeneralSecurityContainer.switchDisableLinkSharing();
  92. toastSuccess(t('toaster.switch_disable_link_sharing_success'));
  93. }
  94. catch (err) {
  95. toastError(err);
  96. }
  97. }
  98. render() {
  99. const { t, adminGeneralSecurityContainer } = this.props;
  100. const {
  101. shareLinks, shareLinksActivePage, totalshareLinks, shareLinksPagingLimit, disableLinkSharing,
  102. } = adminGeneralSecurityContainer.state;
  103. return (
  104. <Fragment>
  105. <div className="mb-3">
  106. <button
  107. className="pull-right btn btn-danger"
  108. disabled={shareLinks.length === 0}
  109. type="button"
  110. onClick={this.showDeleteConfirmModal}
  111. >
  112. {t('share_links.delete_all_share_links')}
  113. </button>
  114. <h2 className="alert-anchor border-bottom">{t('share_links.share_link_management')}</h2>
  115. </div>
  116. <h4>{t('security_settings.share_link_rights')}</h4>
  117. <div className="row mb-5">
  118. <div className="col-6 offset-3">
  119. <div className="custom-control custom-switch custom-checkbox-success">
  120. <input
  121. type="checkbox"
  122. className="custom-control-input"
  123. id="disableLinkSharing"
  124. checked={!disableLinkSharing}
  125. onChange={() => this.switchDisableLinkSharing()}
  126. />
  127. <label className="custom-control-label" htmlFor="disableLinkSharing">
  128. {t('security_settings.enable_link_sharing')}
  129. </label>
  130. </div>
  131. {!adminGeneralSecurityContainer.state.setupStrategies.includes('local') && disableLinkSharing && (
  132. <div className="badge badge-warning">{t('security_settings.setup_is_not_yet_complete')}</div>
  133. )}
  134. </div>
  135. </div>
  136. <h4>{t('security_settings.all_share_links')}</h4>
  137. <Pager
  138. links={shareLinks}
  139. activePage={shareLinksActivePage}
  140. handlePage={this.getShareLinkList}
  141. totalLinks={totalshareLinks}
  142. limit={shareLinksPagingLimit}
  143. />
  144. {(shareLinks.length !== 0) ? (
  145. <ShareLinkList
  146. shareLinks={shareLinks}
  147. onClickDeleteButton={this.deleteLinkById}
  148. isAdmin
  149. />
  150. )
  151. : (<p className="text-center">{t('share_links.No_share_links')}</p>
  152. )
  153. }
  154. <DeleteAllShareLinksModal
  155. isOpen={this.state.isDeleteConfirmModalShown}
  156. onClose={this.closeDeleteConfirmModal}
  157. onClickDeleteButton={this.deleteAllLinksButtonHandler}
  158. />
  159. </Fragment>
  160. );
  161. }
  162. }
  163. ShareLinkSetting.propTypes = {
  164. t: PropTypes.func.isRequired, // i18next
  165. adminGeneralSecurityContainer: PropTypes.instanceOf(AdminGeneralSecurityContainer).isRequired,
  166. };
  167. const ShareLinkSettingWrapperFC = (props) => {
  168. const { t } = useTranslation('admin');
  169. return <ShareLinkSetting t={t} {...props} />;
  170. };
  171. /**
  172. * Wrapper component for using unstated
  173. */
  174. const ShareLinkSettingWrapper = withUnstatedContainers(ShareLinkSettingWrapperFC, [AdminGeneralSecurityContainer]);
  175. export default ShareLinkSettingWrapper;