// Licensed to Cloudera, Inc. under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. Cloudera, Inc. licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import React, { useRef, useEffect, useState, RefObject } from 'react'; import { Input, Button, Dropdown } from 'antd'; import type { MenuProps } from 'antd'; import HdfsIcon from '../../../components/icons/HdfsIcon'; import S3Icon from '../../../components/icons/S3Icon'; import AdlsIcon from '../../../components/icons/AdlsIcon'; import { BreadcrumbData } from '../types'; import Breadcrumb from './Breadcrumb/Breadcrumb'; import DropDownMenuItem from './DropdownMenuItem/DropdownMenuItem'; import './PathBrowser.scss'; interface PathBrowserProps { breadcrumbs?: BreadcrumbData[]; onFilepathChange: (path: string) => void; seperator: string; showIcon: boolean; testId?: string; } const defaultProps = { testId: 'hue-path-browser' }; const PathBrowser: React.FC = ({ breadcrumbs, onFilepathChange, seperator, showIcon, testId }) => { const [isEditMode, setIsEditMode] = useState(false); const icons = { //hdfs file system begins with the first breadcrumb as "/" (ex: /user/demo) '/': , abfs: , s3: }; const useOutsideAlerter = (ref: RefObject) => { useEffect(() => { // Alert if clicked on outside of element const handleClickOutside = (event: MouseEvent) => { const current = ref?.current; if (current && !current.contains(event.target as Node)) { setIsEditMode(false); } }; // Bind the event listener document.addEventListener('mousedown', handleClickOutside); return () => { // Unbind the event listener on clean up document.removeEventListener('mousedown', handleClickOutside); }; }, []); }; const extractFileSystem = (label: string) => { const fileSystemPrefix = label.substring(0, label.length - 3); //hdfs file system begins with the first breadcrumb as "/" (ex: /user/demo) if (fileSystemPrefix == '') { return label; } else { return fileSystemPrefix; } }; const wrapperRef = useRef(null); useOutsideAlerter(wrapperRef); const extractMenuItems = (breadcrumbMenu: BreadcrumbData[]) => { const menu: MenuProps['items'] = breadcrumbMenu.map(breadcrumb => { return { key: breadcrumb.url, label: ( ) }; }); return menu; }; if (breadcrumbs) { return ( <> {!isEditMode ? (
{showIcon && (
{icons[extractFileSystem(breadcrumbs[0].label)]}
)}
{breadcrumbs.length <= 3 ? ( breadcrumbs.map((item: BreadcrumbData, index: number) => { return ( {index != breadcrumbs.length - 1 && (
{seperator}
)}
); }) ) : ( <>
{seperator}
{seperator}
{seperator}
)}
) : (
} defaultValue={decodeURIComponent(breadcrumbs[breadcrumbs.length - 1].url)} onPressEnter={customPath => { onFilepathChange((customPath.target as HTMLInputElement).value); }} className="hue-path-browser__input" autoFocus data-testid={`${testId}-input`} >
)} ); } }; PathBrowser.defaultProps = defaultProps; export default PathBrowser;