import React from 'react'; import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import urljoin from 'url-join'; import CopyDropdown from './CopyDropdown'; class RevisionPath extends React.Component { constructor(props) { super(props); this.state = { pages: [], isListPage: false, isLinkToListPage: true, isInTrash: false, }; // retrieve xss library from window this.xss = window.xss; } componentWillMount() { // whether list page or not const isListPage = this.props.pagePath.match(/\/$/); this.setState({ isListPage }); // whether set link to '/' const { behaviorType } = this.props; const isLinkToListPage = (behaviorType === 'crowi'); this.setState({ isLinkToListPage }); this.generateHierarchyData(); } /** * 1. split `pagePath` with '/' * 2. list hierararchical page paths * * e.g. * when `pagePath` is '/foo/bar/baz` * return: * [ * { pagePath: '/foo', pageName: 'foo' }, * { pagePath: '/foo/bar', pageName: 'bar' }, * { pagePath: '/foo/bar/baz', pageName: 'baz' }, * ] */ generateHierarchyData() { // generate pages obj const splitted = this.props.pagePath.split(/\//); splitted.shift(); // omit first element with shift() if (splitted[splitted.length - 1] === '') { splitted.pop(); // omit last element with unshift() } const pages = []; const pagePaths = []; splitted.forEach((pageName) => { // skip trash if (pageName === 'trash' && splitted.length > 1) { this.setState({ isInTrash: true }); return; } pagePaths.push(encodeURIComponent(pageName)); pages.push({ pagePath: urljoin('/', ...pagePaths), pageName: this.xss.process(pageName), }); }); this.setState({ pages }); } showToolTip() { const buttonId = '#copyPagePathDropdown'; $(buttonId).tooltip('show'); setTimeout(() => { $(buttonId).tooltip('hide'); }, 1000); } generateLinkElementToListPage(pagePath, isLinkToListPage, isLastElement) { /* eslint-disable no-else-return */ if (isLinkToListPage) { return /; } else if (!isLastElement) { return /; } else { return ; } /* eslint-enable no-else-return */ } render() { // define styles const separatorStyle = { marginLeft: '0.2em', marginRight: '0.2em', }; const buttonStyle = { marginLeft: '0.5em', padding: '0 2px', }; const { isInTrash } = this.state; const pageLength = this.state.pages.length; const rootElement = isInTrash ? ( <> / ) : ( <> / ); const afterElements = []; this.state.pages.forEach((page, index) => { const isLastElement = (index === pageLength - 1); // add elements for page afterElements.push( {page.pageName} , ); // add elements for '/' afterElements.push( {this.generateLinkElementToListPage(page.pagePath, this.state.isLinkToListPage, isLastElement)} , ); }); return ( {rootElement} {afterElements} ); } } RevisionPath.propTypes = { t: PropTypes.func.isRequired, // i18next behaviorType: PropTypes.string.isRequired, pagePath: PropTypes.string.isRequired, pageId: PropTypes.string, }; export default withTranslation()(RevisionPath);