PagePathHierarchicalLink.jsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import urljoin from 'url-join';
  4. import LinkedPagePath from '../models/linked-page-path';
  5. const PagePathHierarchicalLink = (props) => {
  6. const { linkedPagePath, basePath, isInTrash } = props;
  7. // render root element
  8. if (linkedPagePath.isRoot) {
  9. if (basePath != null) {
  10. return null;
  11. }
  12. return isInTrash
  13. ? (
  14. <>
  15. <span className="path-segment">
  16. <a href="/trash"><i className="icon-trash"></i></a>
  17. </span>
  18. <span className="separator"><a href="/">/</a></span>
  19. </>
  20. )
  21. : (
  22. <>
  23. <span className="path-segment">
  24. <a href="/">
  25. <i className="icon-home"></i>
  26. <span className="separator">/</span>
  27. </a>
  28. </span>
  29. </>
  30. );
  31. }
  32. const isParentExists = linkedPagePath.parent != null;
  33. const isParentRoot = linkedPagePath.parent?.isRoot;
  34. const isSeparatorRequired = isParentExists && !isParentRoot;
  35. const href = encodeURI(urljoin(basePath || '/', linkedPagePath.href));
  36. // eslint-disable-next-line react/prop-types
  37. const RootElm = ({ children }) => {
  38. return props.isInnerElem
  39. ? <>{children}</>
  40. : <span className="grw-page-path-hierarchical-link d-inline-block text-break">{children}</span>;
  41. };
  42. return (
  43. <RootElm>
  44. { isParentExists && (
  45. <PagePathHierarchicalLink linkedPagePath={linkedPagePath.parent} basePath={basePath} isInTrash={isInTrash || linkedPagePath.isInTrash} isInnerElem />
  46. ) }
  47. { isSeparatorRequired && (
  48. <span className="separator">/</span>
  49. ) }
  50. <a className="page-segment" href={href}>{linkedPagePath.pathName}</a>
  51. </RootElm>
  52. );
  53. };
  54. PagePathHierarchicalLink.propTypes = {
  55. linkedPagePath: PropTypes.instanceOf(LinkedPagePath).isRequired,
  56. basePath: PropTypes.string,
  57. isInTrash: PropTypes.bool,
  58. // !!INTERNAL USE ONLY!!
  59. isInnerElem: PropTypes.bool,
  60. };
  61. export default PagePathHierarchicalLink;