import React from "react"; import PropTypes from "prop-types"; import { Link } from "react-router-dom"; import { URL_FILES } from "../helpers/"; import { NgIf, Icon, EventEmitter } from "./"; import ReactCSSTransitionGroup from "react-addons-css-transition-group"; import "./breadcrumb.scss"; export class BreadCrumb extends React.Component { constructor(props) { super(props); this.state = { path: this._formatPath(props.path), }; } UNSAFE_componentWillReceiveProps(props) { this.setState({ path: this._formatPath(props.path) }); } _formatPath(full_path) { let paths = full_path.split("/"); if (paths.slice(-1)[0] === "") { paths.pop(); } paths = paths.map((path, index) => { const sub_path = paths.slice(0, index+1).join("/"); const label = path === "" ? (CONFIG.name || "Filestash") : path; if (index === paths.length - 1) { return { full: null, label: label }; } else { return { full: sub_path + "/", label: label, minify: function() { if (index === 0) { return false; } if (paths.length <= (document.body.clientWidth > 800 ? 5 : 4)) { return false; } if (index > paths.length - (document.body.clientWidth > 1000? 4 : 3)) { return false; } return true; }(), }; } }); return paths; } render(Element) { if (new window.URL(location.href).searchParams.get("nav") === "false") return null; const Path = Element? Element : PathElement; return (
{ this.state.path.map((path, index) => { return ( ); }) }
); } }; BreadCrumb.propTypes = { path: PropTypes.string.isRequired, needSaving: PropTypes.bool, }; const BreadCrumbContainer = (props) => { return (
{ props.children }
); }; const Logout = (props) => { const isRunningFromAnIframe = window.self !== window.top; return (
{ isRunningFromAnIframe ? null : ( ) }
); }; const Saving = (props) => { return ( * ); }; const Separator = (props) => { /* eslint-disable-next-line max-len */ const src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAA30lEQVQ4T63T7Q2CMBAG4OuVPdQNcAPdBCYwDdclCAQ3ACfRDXQDZQMHgNRcAoYApfWjv0jIPX3b3gn4wxJjI03TUAhRBkGwV0o9ffaYIEVRrJumuQHA3ReaILxzl+bCkNZ660ozi/QQIl4BoCKieAmyIlyU53lkjCld0CIyhIwxSmt9nEvkRLgoyzIuPggh4iRJqjHkhXTQAwBWUsqNUoq/38sL+TlJf7lf38ngdU5EFNme2adPFgGGrR2LiGcAqIko/LhjeXbatuVOraWUO58hnJ1iRKx8AetxXPHH/1+y62USursaSgAAAABJRU5ErkJggg=="; return (
path_separator
); }; class PathElementWrapperComponent extends React.Component { constructor(props) { super(props); } limitSize(str, is_highlight = false) { if (is_highlight === true) { if (str.length > 30) { return str.substring(0, 12).trim() + "..." + str.substring(str.length - 10, str.length).trim(); } } else { if (str.length > 27) { return str.substring(0, 20).trim() + "..."; } } return str; } render() { let className = "component_path-element-wrapper"; if (this.props.highlight) { className += " highlight"; } let href = this.props.baseURL + (this.props.path.full || ""); href = href .replace(/\%/g, "%2525") // Hack to get the Link Component to work // See ExistingThing in 'thing-existing.js' .replace(/#/g, "%23") .replace(/\?/g, "%3F"); href = href || "/"; href += location.search; return (
{ this.limitSize(this.props.path.label) } ... { this.limitSize(this.props.path.label, true) }
{this.limitSize(this.props.path.label)}
); } } export const PathElementWrapper = EventEmitter(PathElementWrapperComponent); // just a hack to make it play nicely with react-dnd as it refuses to use our // custom component if it's not wrap by something it knows ... export class PathElement extends PathElementWrapper { constructor(props) { super(props); } render(highlight = false) { let className = "component_path-element"; if (this.props.isFirst) className += ` is-first`; if (this.props.className) className += ` ${this.props.className}`; return (
); } }