Skip to content

Commit 53ed212

Browse files
committed
show config errors in waveconfig widget
1 parent 38fef0e commit 53ed212

2 files changed

Lines changed: 37 additions & 4 deletions

File tree

frontend/app/view/waveconfig/waveconfig-model.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import { BlockNodeModel } from "@/app/block/blocktypes";
5-
import { getApi, getBlockMetaKeyAtom, WOS } from "@/app/store/global";
5+
import { atoms, getApi, getBlockMetaKeyAtom, WOS } from "@/app/store/global";
66
import { globalStore } from "@/app/store/jotaiStore";
77
import type { TabModel } from "@/app/store/tab-model";
88
import { RpcApi } from "@/app/store/wshclientapi";
@@ -11,7 +11,7 @@ import { SecretsContent } from "@/app/view/waveconfig/secretscontent";
1111
import { WaveConfigView } from "@/app/view/waveconfig/waveconfig";
1212
import { isWindows } from "@/util/platformutil";
1313
import { base64ToString, stringToBase64 } from "@/util/util";
14-
import { atom, type PrimitiveAtom } from "jotai";
14+
import { atom, type Atom, type PrimitiveAtom } from "jotai";
1515
import type * as MonacoTypes from "monaco-editor";
1616
import * as React from "react";
1717

@@ -156,6 +156,7 @@ export class WaveConfigViewModel implements ViewModel {
156156
isMenuOpenAtom: PrimitiveAtom<boolean>;
157157
presetsJsonExistsAtom: PrimitiveAtom<boolean>;
158158
activeTabAtom: PrimitiveAtom<"visual" | "json">;
159+
configErrorFilesAtom: Atom<Set<string>>;
159160
configDir: string;
160161
saveShortcut: string;
161162
editorRef: React.RefObject<MonacoTypes.editor.IStandaloneCodeEditor>;
@@ -189,6 +190,14 @@ export class WaveConfigViewModel implements ViewModel {
189190
this.isMenuOpenAtom = atom(false);
190191
this.presetsJsonExistsAtom = atom(false);
191192
this.activeTabAtom = atom<"visual" | "json">("visual");
193+
this.configErrorFilesAtom = atom((get) => {
194+
const fullConfig = get(atoms.fullConfigAtom);
195+
const errorSet = new Set<string>();
196+
for (const cerr of fullConfig?.configerrors ?? []) {
197+
errorSet.add(cerr.file);
198+
}
199+
return errorSet;
200+
});
192201
this.editorRef = React.createRef();
193202

194203
this.secretNamesAtom = atom<string[]>([]);

frontend/app/view/waveconfig/waveconfig.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import { Tooltip } from "@/app/element/tooltip";
5+
import { atoms } from "@/app/store/global";
56
import { globalStore } from "@/app/store/jotaiStore";
67
import { tryReinjectKey } from "@/app/store/keymodel";
78
import { CodeEditor } from "@/app/view/codeeditor/codeeditor";
@@ -21,6 +22,7 @@ const ConfigSidebar = memo(({ model }: ConfigSidebarProps) => {
2122
const [isMenuOpen, setIsMenuOpen] = useAtom(model.isMenuOpenAtom);
2223
const configFiles = model.getConfigFiles();
2324
const deprecatedConfigFiles = model.getDeprecatedConfigFiles();
25+
const configErrorFiles = useAtomValue(model.configErrorFilesAtom);
2426

2527
const handleFileSelect = (file: ConfigFile) => {
2628
model.loadFile(file);
@@ -46,7 +48,12 @@ const ConfigSidebar = memo(({ model }: ConfigSidebarProps) => {
4648
selectedFile?.path === file.path ? "bg-accentbg text-primary" : "hover:bg-secondary/50"
4749
}`}
4850
>
49-
<div className="whitespace-nowrap overflow-hidden text-ellipsis">{file.name}</div>
51+
<div className="flex items-center gap-1">
52+
<div className="whitespace-nowrap overflow-hidden text-ellipsis flex-1">{file.name}</div>
53+
{configErrorFiles.has(file.path) && (
54+
<i className="fa fa-solid fa-circle-exclamation text-error text-[14px] shrink-0" />
55+
)}
56+
</div>
5057
{file.description && (
5158
<div className="text-xs text-muted mt-0.5 whitespace-nowrap overflow-hidden text-ellipsis">
5259
{file.description}
@@ -75,6 +82,9 @@ const ConfigSidebar = memo(({ model }: ConfigSidebarProps) => {
7582
>
7683
deprecated
7784
</span>
85+
{configErrorFiles.has(file.path) && (
86+
<i className="fa fa-solid fa-circle-exclamation text-error text-[14px] ml-auto shrink-0" />
87+
)}
7888
</div>
7989
</div>
8090
))}
@@ -96,6 +106,8 @@ const WaveConfigView = memo(({ blockId, model }: ViewComponentProps<WaveConfigVi
96106
const [isMenuOpen, setIsMenuOpen] = useAtom(model.isMenuOpenAtom);
97107
const hasChanges = useAtomValue(model.hasEditedAtom);
98108
const [activeTab, setActiveTab] = useAtom(model.activeTabAtom);
109+
const fullConfig = useAtomValue(atoms.fullConfigAtom);
110+
const configErrors = fullConfig?.configerrors;
99111

100112
const handleContentChange = useCallback(
101113
(newContent: string) => {
@@ -148,7 +160,8 @@ const WaveConfigView = memo(({ blockId, model }: ViewComponentProps<WaveConfigVi
148160
const saveTooltip = `Save (${model.saveShortcut})`;
149161

150162
return (
151-
<div className="@container flex flex-row w-full h-full">
163+
<div className="@container flex flex-col w-full h-full">
164+
<div className="flex flex-row flex-1 min-h-0">
152165
{isMenuOpen && (
153166
<div className="absolute inset-0 bg-black/50 z-5 @w600:hidden" onClick={() => setIsMenuOpen(false)} />
154167
)}
@@ -284,6 +297,17 @@ const WaveConfigView = memo(({ blockId, model }: ViewComponentProps<WaveConfigVi
284297
</>
285298
)}
286299
</div>
300+
</div>
301+
{configErrors?.length > 0 && (
302+
<div className="bg-error text-primary px-4 py-1 max-h-12 overflow-y-auto border-t border-error/50 shrink-0">
303+
{configErrors.map((cerr, i) => (
304+
<div key={i} className="text-sm">
305+
<span className="font-semibold">Config Error: </span>
306+
{cerr.file}: {cerr.err}
307+
</div>
308+
))}
309+
</div>
310+
)}
287311
</div>
288312
);
289313
});

0 commit comments

Comments
 (0)