Fix some nasty bug

This commit is contained in:
Zef Hemel
2022-04-01 15:02:35 +02:00
parent 4d201efdbb
commit b858917c98
13 changed files with 115 additions and 37 deletions
+17 -2
View File
@@ -51,6 +51,13 @@ function fuzzyFilter(pattern: string, options: Option[]): Option[] {
return matches;
}
function simpleFilter(pattern: string, options: Option[]): Option[] {
const lowerPattern = pattern.toLowerCase();
return options.filter((option) => {
return option.name.toLowerCase().includes(lowerPattern);
});
}
export function FilterList({
placeholder,
options,
@@ -59,6 +66,7 @@ export function FilterList({
onKeyPress,
allowNew = false,
helpText = "",
completePrefix,
icon,
newHint,
}: {
@@ -68,6 +76,7 @@ export function FilterList({
onKeyPress?: (key: string, currentText: string) => void;
onSelect: (option: Option | undefined) => void;
allowNew?: boolean;
completePrefix?: string;
helpText: string;
newHint?: string;
icon?: IconDefinition;
@@ -90,7 +99,7 @@ export function FilterList({
if (searchPhrase) {
let foundExactMatch = false;
let results = fuzzyFilter(searchPhrase, options);
let results = simpleFilter(searchPhrase, options);
results = results.sort(magicSorter);
if (allowNew && !foundExactMatch) {
results.push({
@@ -139,7 +148,7 @@ export function FilterList({
ref={searchBoxRef}
onChange={filterUpdate}
onKeyDown={(e: React.KeyboardEvent) => {
// console.log("Key up", e.key);
// console.log("Key up", e);
if (onKeyPress) {
onKeyPress(e.key, text);
}
@@ -159,6 +168,12 @@ export function FilterList({
case "Escape":
onSelect(undefined);
break;
case " ":
if (completePrefix) {
setText(completePrefix);
e.preventDefault();
}
break;
}
}}
/>
+6
View File
@@ -27,6 +27,11 @@ export function PageNavigator({
orderId: orderId,
});
}
let completePrefix: string | undefined = undefined;
if (currentPage && currentPage.includes("/")) {
const pieces = currentPage.split("/");
completePrefix = pieces.slice(0, pieces.length - 1).join("/") + "/";
}
return (
<FilterList
placeholder="Page"
@@ -36,6 +41,7 @@ export function PageNavigator({
allowNew={true}
helpText="Start typing the page name to filter results, press <code>Return</code> to open."
newHint="Create page"
completePrefix={completePrefix}
onSelect={(opt) => {
onNavigate(opt?.name);
}}
+13 -10
View File
@@ -17,23 +17,26 @@ export class CompleterHook implements Hook<CompleterHookT> {
continue;
}
for (const [functionName, functionDef] of Object.entries(
plug.manifest.functions
plug.manifest.functions
)) {
if (functionDef.isCompleter) {
completerPromises.push(plug.invoke(functionName, []));
}
}
}
let allCompletionResults = await Promise.all(completerPromises);
if (allCompletionResults.length === 1) {
return allCompletionResults[0];
} else if (allCompletionResults.length > 1) {
console.error(
"Got completion results from multiple sources, cannot deal with that",
allCompletionResults
);
let actualResult = null;
for (const result of await Promise.all(completerPromises)) {
if (result) {
if (actualResult) {
console.error(
"Got completion results from multiple sources, cannot deal with that"
);
return null;
}
actualResult = result;
}
}
return null;
return actualResult;
}
apply(system: System<CompleterHookT>): void {
+20 -17
View File
@@ -12,12 +12,12 @@ export class PathPageNavigator {
navigationResolve?: () => void;
async navigate(page: string, pos?: number) {
window.history.pushState(
{ page, pos },
page,
`/${encodePageUrl(page)}${pos ? "@" + pos : ""}`
window.history.pushState({ page, pos }, page, `/${encodePageUrl(page)}`);
window.dispatchEvent(
new PopStateEvent("popstate", {
state: { page, pos },
})
);
window.dispatchEvent(new PopStateEvent("popstate"));
await new Promise<void>((resolve) => {
this.navigationResolve = resolve;
});
@@ -27,19 +27,22 @@ export class PathPageNavigator {
subscribe(
pageLoadCallback: (pageName: string, pos: number) => Promise<void>
): void {
const cb = () => {
const gotoPage = this.getCurrentPage();
if (!gotoPage) {
return;
}
safeRun(async () => {
await pageLoadCallback(this.getCurrentPage(), this.getCurrentPos());
if (this.navigationResolve) {
this.navigationResolve();
const cb = (event?: PopStateEvent) => {
const gotoPage = this.getCurrentPage();
if (!gotoPage) {
return;
}
});
};
window.addEventListener("popstate", cb);
safeRun(async () => {
await pageLoadCallback(
this.getCurrentPage(),
event && event.state.pos
);
if (this.navigationResolve) {
this.navigationResolve();
}
});
};
window.addEventListener("popstate", cb);
cb();
}