|
@@ -1,52 +1,80 @@
|
|
|
import React from 'react';
|
|
import React from 'react';
|
|
|
-import PropTypes from 'prop-types';
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
-import { withTranslation } from 'react-i18next';
|
|
|
|
|
import dateFnsFormat from 'date-fns/format';
|
|
import dateFnsFormat from 'date-fns/format';
|
|
|
-
|
|
|
|
|
-import { withUnstatedContainers } from '../UnstatedUtils';
|
|
|
|
|
|
|
+import PropTypes from 'prop-types';
|
|
|
|
|
+import { useTranslation, withTranslation } from 'react-i18next';
|
|
|
|
|
|
|
|
import AppContainer from '~/client/services/AppContainer';
|
|
import AppContainer from '~/client/services/AppContainer';
|
|
|
|
|
+
|
|
|
import CopyDropdown from '../Page/CopyDropdown';
|
|
import CopyDropdown from '../Page/CopyDropdown';
|
|
|
|
|
+import { withUnstatedContainers } from '../UnstatedUtils';
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+const ShareLinkTr = (props) => {
|
|
|
|
|
+ const { t } = useTranslation();
|
|
|
|
|
+
|
|
|
|
|
+ const { isAdmin, shareLink, onDelete } = props;
|
|
|
|
|
+
|
|
|
|
|
+ const { _id: shareLinkId, relatedPage } = shareLink;
|
|
|
|
|
+
|
|
|
|
|
+ const isRelatedPageExists = relatedPage != null;
|
|
|
|
|
+
|
|
|
|
|
+ return (
|
|
|
|
|
+ <tr key={shareLinkId}>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <div className="d-flex">
|
|
|
|
|
+ <span className="mr-auto my-auto">{shareLinkId}</span>
|
|
|
|
|
+
|
|
|
|
|
+ { isRelatedPageExists && (
|
|
|
|
|
+ <CopyDropdown
|
|
|
|
|
+ pagePath={relatedPage.path}
|
|
|
|
|
+ dropdownToggleId={`copydropdown-${shareLinkId}`}
|
|
|
|
|
+ pageId={shareLinkId}
|
|
|
|
|
+ isShareLinkMode
|
|
|
|
|
+ >
|
|
|
|
|
+ Copy Link
|
|
|
|
|
+ </CopyDropdown>
|
|
|
|
|
+ ) }
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ { isAdmin && (
|
|
|
|
|
+ <td>
|
|
|
|
|
+ { isRelatedPageExists
|
|
|
|
|
+ ? <a href={relatedPage.path}>{relatedPage.path}</a>
|
|
|
|
|
+ : '(Page is not found)'
|
|
|
|
|
+ }
|
|
|
|
|
+ </td>
|
|
|
|
|
+ ) }
|
|
|
|
|
+ <td>{shareLink.expiredAt && <span>{dateFnsFormat(new Date(shareLink.expiredAt), 'yyyy-MM-dd HH:mm')}</span>}</td>
|
|
|
|
|
+ <td>{shareLink.description}</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <button className="btn btn-outline-warning" type="button" onClick={onDelete}>
|
|
|
|
|
+ <i className="icon-trash"></i>{t('Delete')}
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ );
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
|
|
|
const ShareLinkList = (props) => {
|
|
const ShareLinkList = (props) => {
|
|
|
|
|
|
|
|
- const { t } = props;
|
|
|
|
|
- function deleteLinkHandler(shareLinkId) {
|
|
|
|
|
- if (props.onClickDeleteButton == null) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- props.onClickDeleteButton(shareLinkId);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const { t } = useTranslation();
|
|
|
|
|
|
|
|
function renderShareLinks() {
|
|
function renderShareLinks() {
|
|
|
return (
|
|
return (
|
|
|
<>
|
|
<>
|
|
|
{props.shareLinks.map(shareLink => (
|
|
{props.shareLinks.map(shareLink => (
|
|
|
- <tr key={shareLink._id}>
|
|
|
|
|
- <td>
|
|
|
|
|
- <div className="d-flex">
|
|
|
|
|
- <span className="mr-auto my-auto">{shareLink._id}</span>
|
|
|
|
|
- <CopyDropdown
|
|
|
|
|
- pagePath={shareLink.relatedPage.path}
|
|
|
|
|
- dropdownToggleId={`copydropdown-${shareLink._id}`}
|
|
|
|
|
- pageId={shareLink._id}
|
|
|
|
|
- isShareLinkMode
|
|
|
|
|
- >
|
|
|
|
|
- Copy Link
|
|
|
|
|
- </CopyDropdown>
|
|
|
|
|
- </div>
|
|
|
|
|
- </td>
|
|
|
|
|
- {props.isAdmin && <td><a href={shareLink.relatedPage.path}>{shareLink.relatedPage.path}</a></td>}
|
|
|
|
|
- <td>{shareLink.expiredAt && <span>{dateFnsFormat(new Date(shareLink.expiredAt), 'yyyy-MM-dd HH:mm')}</span>}</td>
|
|
|
|
|
- <td>{shareLink.description}</td>
|
|
|
|
|
- <td>
|
|
|
|
|
- <button className="btn btn-outline-warning" type="button" onClick={() => deleteLinkHandler(shareLink._id)}>
|
|
|
|
|
- <i className="icon-trash"></i>{t('Delete')}
|
|
|
|
|
- </button>
|
|
|
|
|
- </td>
|
|
|
|
|
- </tr>
|
|
|
|
|
|
|
+ <ShareLinkTr
|
|
|
|
|
+ isAdmin={props.isAdmin}
|
|
|
|
|
+ shareLink={shareLink}
|
|
|
|
|
+ onDelete={() => {
|
|
|
|
|
+ if (props.onClickDeleteButton == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ props.onClickDeleteButton(shareLink._id);
|
|
|
|
|
+ }}
|
|
|
|
|
+ />
|
|
|
))}
|
|
))}
|
|
|
</>
|
|
</>
|
|
|
);
|
|
);
|
|
@@ -78,7 +106,6 @@ const ShareLinkList = (props) => {
|
|
|
const ShareLinkListWrapper = withUnstatedContainers(ShareLinkList, [AppContainer]);
|
|
const ShareLinkListWrapper = withUnstatedContainers(ShareLinkList, [AppContainer]);
|
|
|
|
|
|
|
|
ShareLinkList.propTypes = {
|
|
ShareLinkList.propTypes = {
|
|
|
- t: PropTypes.func.isRequired, // i18next
|
|
|
|
|
appContainer: PropTypes.instanceOf(AppContainer).isRequired,
|
|
appContainer: PropTypes.instanceOf(AppContainer).isRequired,
|
|
|
|
|
|
|
|
shareLinks: PropTypes.array.isRequired,
|
|
shareLinks: PropTypes.array.isRequired,
|