Fix path filtering when directory has whitespace in it (#3600)

* Add quotes for path with space in path filter
* Hide directory errors in path filter
This commit is contained in:
WithoutPants
2023-03-26 07:27:44 +11:00
committed by GitHub
parent 2bcab7b0be
commit 0050e4abbf
2 changed files with 25 additions and 6 deletions

View File

@@ -39,6 +39,8 @@ export const PathFilter: React.FC<IInputFilterProps> = ({
currentDirectory={criterion.value ? criterion.value.toString() : ""} currentDirectory={criterion.value ? criterion.value.toString() : ""}
setCurrentDirectory={(v) => onValueChanged(v)} setCurrentDirectory={(v) => onValueChanged(v)}
collapsible collapsible
quoteSpaced
hideError
defaultDirectories={libraryPaths} defaultDirectories={libraryPaths}
/> />
)} )}

View File

@@ -13,6 +13,8 @@ interface IProps {
defaultDirectories?: string[]; defaultDirectories?: string[];
appendButton?: JSX.Element; appendButton?: JSX.Element;
collapsible?: boolean; collapsible?: boolean;
quoteSpaced?: boolean;
hideError?: boolean;
} }
export const FolderSelect: React.FC<IProps> = ({ export const FolderSelect: React.FC<IProps> = ({
@@ -21,15 +23,26 @@ export const FolderSelect: React.FC<IProps> = ({
defaultDirectories, defaultDirectories,
appendButton, appendButton,
collapsible = false, collapsible = false,
quoteSpaced = false,
hideError = false,
}) => { }) => {
const [showBrowser, setShowBrowser] = React.useState(false); const [showBrowser, setShowBrowser] = React.useState(false);
const [directory, setDirectory] = useState(currentDirectory); const [directory, setDirectory] = useState(currentDirectory);
const { data, error, loading } = useDirectory(directory);
const isQuoted =
quoteSpaced && directory.startsWith('"') && directory.endsWith('"');
const { data, error, loading } = useDirectory(
isQuoted ? directory.slice(1, -1) : directory
);
const intl = useIntl(); const intl = useIntl();
const defaultDirectoriesOrEmpty = defaultDirectories ?? [];
const selectableDirectories: string[] = currentDirectory const selectableDirectories: string[] = currentDirectory
? data?.directory.directories ?? defaultDirectories ?? [] ? data?.directory.directories ??
: defaultDirectories ?? []; (error && hideError ? [] : defaultDirectoriesOrEmpty)
: defaultDirectoriesOrEmpty;
const debouncedSetDirectory = useDebouncedSetState(setDirectory, 250); const debouncedSetDirectory = useDebouncedSetState(setDirectory, 250);
@@ -40,6 +53,10 @@ export const FolderSelect: React.FC<IProps> = ({
}, [currentDirectory, directory, debouncedSetDirectory]); }, [currentDirectory, directory, debouncedSetDirectory]);
function setInstant(value: string) { function setInstant(value: string) {
if (quoteSpaced && value.includes(" ")) {
value = `"${value}"`;
}
setCurrentDirectory(value); setCurrentDirectory(value);
setDirectory(value); setDirectory(value);
} }
@@ -95,13 +112,13 @@ export const FolderSelect: React.FC<IProps> = ({
<InputGroup.Append className="align-self-center"> <InputGroup.Append className="align-self-center">
{loading ? ( {loading ? (
<LoadingIndicator inline small message="" /> <LoadingIndicator inline small message="" />
) : ( ) : !hideError ? (
<Icon icon={faTimes} color="red" className="ml-3" /> <Icon icon={faTimes} color="red" className="ml-3" />
)} ) : undefined}
</InputGroup.Append> </InputGroup.Append>
) : undefined} ) : undefined}
</InputGroup> </InputGroup>
{error !== undefined && ( {!hideError && error !== undefined && (
<h5 className="mt-4 text-break">Error: {error.message}</h5> <h5 className="mt-4 text-break">Error: {error.message}</h5>
)} )}
<Collapse in={!collapsible || showBrowser}> <Collapse in={!collapsible || showBrowser}>