Skip to content

Commit 05d9579

Browse files
committed
Button and page to switch engines
1 parent 06303ab commit 05d9579

File tree

5 files changed

+110
-12
lines changed

5 files changed

+110
-12
lines changed

src/app/advanced/[engine]/index.html/TestForm.tsx

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { TestResults } from '@/components/TestResults';
44
import { RegexEngine } from '@/engines/RegexEngine';
55
import OptionsInput from './OptionsInput';
66
import { runTest as runBrowserTest, type TestInput, type TestOutput } from '@regexplanet/common';
7+
import { useRouter } from 'next/navigation';
8+
import { formDataToTestInput } from '@/functions/formDataToTestInput';
79

810
type TestFormProps = {
911
engine: RegexEngine;
@@ -63,6 +65,7 @@ async function runTest(test_url:string, testInput: TestInput): Promise<TestOutpu
6365

6466
export default function TestForm(props: TestFormProps) {
6567
const [testOutput, setTestOutput] = useState<TestOutput | null>();
68+
const router = useRouter()
6669
//const [testInput, setTestInput] = useState<TestInput>(props.testInput);
6770
const testInput = props.testInput;
6871

@@ -127,7 +130,28 @@ export default function TestForm(props: TestFormProps) {
127130
}
128131
setTestInput(localInput);
129132
console.log("after fewer", localInput.inputs);
130-
}
133+
};
134+
135+
const onSwitchEngines = (event: React.MouseEvent<HTMLButtonElement>) => {
136+
event.preventDefault();
137+
const form = event.currentTarget.form;
138+
if (!form) {
139+
return;
140+
}
141+
const formData = new FormData(form);
142+
const localInput = formDataToTestInput(props.engine.handle, formData);
143+
144+
const searchParams = new URLSearchParams();
145+
searchParams.set('engine', props.engine.handle);
146+
searchParams.set('regex', localInput.regex);
147+
searchParams.set('replacement', localInput.replacement);
148+
localInput.options.forEach(option => searchParams.append('option', option));
149+
localInput.inputs.forEach(input => searchParams.append('input', input));
150+
151+
const url = new URL('/advanced/select.html', window.location.href);
152+
url.search = searchParams.toString();
153+
router.push(url.toString());
154+
};
131155

132156
return (
133157
<>
@@ -156,18 +180,9 @@ export default function TestForm(props: TestFormProps) {
156180
<button type="submit" className="btn btn-primary">Test</button>
157181
<button className="ms-3 btn btn-outline-primary" onClick={onMoreInputs}>More inputs</button>
158182
{ testInput.inputs.length > 5 ? <button className="ms-3 btn btn-outline-primary" onClick={onFewerInputs}>Fewer inputs</button> : null }
183+
<button type="submit" className="btn btn-outline-primary float-end" onClick={onSwitchEngines}>Switch Engines</button>
159184
</form>
160185
</>
161186
);
162187
}
163188

164-
function formDataToTestInput(engineHandle:string, formData: FormData): TestInput {
165-
const retVal: TestInput = {
166-
engine: engineHandle,
167-
regex: formData.get('regex') as string,
168-
replacement: formData.get('replacement') as string,
169-
options: formData.getAll('option') as string[],
170-
inputs: formData.getAll('input') as string[]
171-
};
172-
return retVal;
173-
}

src/app/advanced/select.html/page.tsx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
'use client';
2+
import { type TestInput } from "@regexplanet/common";
3+
import { getWorkingEngines } from '@/engines';
4+
import { cleanupSearchParam } from "@/functions/cleanupSearchParam";
5+
import { cleanupSearchParamArray } from "@/functions/cleanupSearchParamArray";
6+
import { formDataToTestInput } from "@/functions/formDataToTestInput";
7+
import { testInputToSearchParams } from "@/functions/testInputToSearchParams";
8+
import { useRouter } from "next/navigation";
9+
10+
export default function SelectEnginePage({ searchParams }: { searchParams: { [key: string]: string | string[] | undefined } }) {
11+
const router = useRouter();
12+
13+
const testInput: TestInput = {
14+
engine: cleanupSearchParam(searchParams["engine"], 'nodejs'),
15+
regex: cleanupSearchParam(searchParams["regex"]),
16+
replacement: cleanupSearchParam(searchParams["replacement"]),
17+
options: cleanupSearchParamArray(searchParams["option"]),
18+
inputs: cleanupSearchParamArray(searchParams["input"]),
19+
}
20+
21+
const onSubmit = (event: React.FormEvent<HTMLFormElement>) => {
22+
event.preventDefault();
23+
const formData = new FormData(event.currentTarget);
24+
const testInput = formDataToTestInput(formData.get('engine') as string, formData);
25+
const url = `/advanced/${testInput.engine}/index.html?${testInputToSearchParams(testInput).toString()}`;
26+
console.log('router.push', url);
27+
router.push(url);
28+
};
29+
30+
const options = testInput.options.map((option, index) => { return (<input type="hidden" name="option" key={`option_${index}`} value={option} />); });
31+
const inputs = testInput.inputs.map((input, index) => { return (<input type="hidden" key={`input_${index}`} name="input" value={input} />) });
32+
return (
33+
<>
34+
<h1>Select Engine</h1>
35+
<div className="mb-3">
36+
<label htmlFor="regex" className="form-label">Regular Expression</label>
37+
<input type="text" className="form-control" id="regex" name="regex" defaultValue={testInput.regex} />
38+
</div>
39+
<div className="mb-3">
40+
<label htmlFor="replacement" className="form-label">Replacement</label>
41+
<input type="text" className="form-control" id="replacement" name="replacement" defaultValue={testInput.replacement} />
42+
</div>
43+
<div className="mb-3">
44+
<label className="form-label d-block">Test with:</label>
45+
{ getWorkingEngines().map((theEngine, index) => { return (
46+
<form action={`/advanced/${theEngine.handle}/index.html`} className="d-inline-block m-1" key={`form_${index}`} method="get" onSubmit={onSubmit}>
47+
<input type="hidden" name="engine" value={theEngine.handle} />
48+
<input type="hidden" name="regex" value={testInput.regex} />
49+
<input type="hidden" name="replacement" value={testInput.replacement} />
50+
{options}
51+
{inputs}
52+
<button className={`btn ${testInput.engine == theEngine.handle ? 'btn-primary' : 'btn-outline-primary'}`}>{`${theEngine.short_name}`}</button>
53+
</form>) })}
54+
</div>
55+
<details className="mt-3"><summary>Raw data</summary><pre>{JSON.stringify(testInput, null, 2)}</pre></details>
56+
</>
57+
)
58+
}

src/app/share/index.html/PreviewRegex.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { type TestInput } from "@regexplanet/common";
2-
import { SubmitButton } from '@/components/SubmitButton';
32
import { getWorkingEngines } from '@/engines';
43

54
type PreviewRegexProps = {

src/functions/formDataToTestInput.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { TestInput } from "@regexplanet/common";
2+
3+
export function formDataToTestInput(
4+
engineHandle: string,
5+
formData: FormData
6+
): TestInput {
7+
const retVal: TestInput = {
8+
engine: engineHandle,
9+
regex: formData.get("regex") as string,
10+
replacement: formData.get("replacement") as string,
11+
options: formData.getAll("option") as string[],
12+
inputs: formData.getAll("input") as string[],
13+
};
14+
return retVal;
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { TestInput } from "@regexplanet/common";
2+
3+
export function testInputToSearchParams(testInput: TestInput): URLSearchParams {
4+
const searchParams = new URLSearchParams();
5+
searchParams.set("engine", testInput.engine);
6+
searchParams.set("regex", testInput.regex);
7+
searchParams.set("replacement", testInput.replacement);
8+
testInput.options.forEach((option) => searchParams.append("option", option));
9+
testInput.inputs.forEach((input) => searchParams.append("input", input));
10+
return searchParams;
11+
}

0 commit comments

Comments
 (0)