import React, { useState } from "react"; import { Button, Dropdown, DropdownButton, Form, InputGroup, } from "react-bootstrap"; import { ParserField } from "./ParserField"; import { ShowFields } from "./ShowFields"; const builtInRecipes = [ { pattern: "{title}", ignoreWords: [], whitespaceCharacters: "", capitalizeTitle: false, description: "Filename", }, { pattern: "{title}.{ext}", ignoreWords: [], whitespaceCharacters: "", capitalizeTitle: false, description: "Without extension", }, { pattern: "{}.{yy}.{mm}.{dd}.{title}.XXX.{}.{ext}", ignoreWords: [], whitespaceCharacters: ".", capitalizeTitle: true, description: "", }, { pattern: "{}.{yy}.{mm}.{dd}.{title}.{ext}", ignoreWords: [], whitespaceCharacters: ".", capitalizeTitle: true, description: "", }, { pattern: "{title}.XXX.{}.{ext}", ignoreWords: [], whitespaceCharacters: ".", capitalizeTitle: true, description: "", }, { pattern: "{}.{yy}.{mm}.{dd}.{title}.{i}.{ext}", ignoreWords: ["cz", "fr"], whitespaceCharacters: ".", capitalizeTitle: true, description: "Foreign language", }, ]; export interface IParserInput { pattern: string; ignoreWords: string[]; whitespaceCharacters: string; capitalizeTitle: boolean; page: number; pageSize: number; findClicked: boolean; } interface IParserRecipe { pattern: string; ignoreWords: string[]; whitespaceCharacters: string; capitalizeTitle: boolean; description: string; } interface IParserInputProps { input: IParserInput; onFind: (input: IParserInput) => void; onPageSizeChanged: (newSize: number) => void; showFields: Map; setShowFields: (fields: Map) => void; } export const ParserInput: React.FC = ( props: IParserInputProps ) => { const [pattern, setPattern] = useState(props.input.pattern); const [ignoreWords, setIgnoreWords] = useState( props.input.ignoreWords.join(" ") ); const [whitespaceCharacters, setWhitespaceCharacters] = useState( props.input.whitespaceCharacters ); const [capitalizeTitle, setCapitalizeTitle] = useState( props.input.capitalizeTitle ); function onFind() { props.onFind({ pattern, ignoreWords: ignoreWords.split(" "), whitespaceCharacters, capitalizeTitle, page: 1, pageSize: props.input.pageSize, findClicked: props.input.findClicked, }); } function setParserRecipe(recipe: IParserRecipe) { setPattern(recipe.pattern); setIgnoreWords(recipe.ignoreWords.join(" ")); setWhitespaceCharacters(recipe.whitespaceCharacters); setCapitalizeTitle(recipe.capitalizeTitle); } const validFields = [new ParserField("", "Wildcard")].concat( ParserField.validFields ); function addParserField(field: ParserField) { setPattern(pattern + field.getFieldPattern()); } const PAGE_SIZE_OPTIONS = ["20", "40", "60", "120", "250", "500", "1000"]; return ( Filename Pattern ) => setPattern(e.currentTarget.value) } value={pattern} /> {validFields.map((item) => ( addParserField(item)} > {item.field || "{}"} {item.helperText} ))} Use '\' to escape literal {} characters Ignored words ) => setIgnoreWords(e.currentTarget.value) } value={ignoreWords} /> Matches with {"{i}"}
Title
Whitespace characters: ) => setWhitespaceCharacters(e.currentTarget.value) } value={whitespaceCharacters} /> These characters will be replaced with whitespace in the title setCapitalizeTitle(!capitalizeTitle)} /> Capitalize title {/* TODO - mapping stuff will go here */} {builtInRecipes.map((item) => ( setParserRecipe(item)} > {item.pattern} {item.description} ))} props.setShowFields(fields)} /> ) => props.onPageSizeChanged(parseInt(e.currentTarget.value, 10)) } defaultValue={props.input.pageSize} className="col-1 input-control filter-item" > {PAGE_SIZE_OPTIONS.map((val) => ( ))}
); };