Skip to content

Commit de68c60

Browse files
authored
layout fixes 1 (#3341)
1 parent 41b341f commit de68c60

File tree

2 files changed

+79
-4
lines changed

2 files changed

+79
-4
lines changed

skyvern-frontend/src/components/BrowserStream.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type Props = {
4444
workflow?: {
4545
run: WorkflowRunStatusApiResponse;
4646
};
47+
resizeTrigger?: number;
4748
// --
4849
onClose?: () => void;
4950
};
@@ -54,6 +55,7 @@ function BrowserStream({
5455
showControlButtons = undefined,
5556
task = undefined,
5657
workflow = undefined,
58+
resizeTrigger,
5759
// --
5860
onClose,
5961
}: Props) {
@@ -291,6 +293,19 @@ function BrowserStream({
291293
// eslint-disable-next-line react-hooks/exhaustive-deps
292294
}, [interactive, isCommandConnected, userIsControlling]);
293295

296+
// Effect to handle window resize trigger for NoVNC canvas
297+
useEffect(() => {
298+
if (!resizeTrigger || !canvasContainer || !rfbRef.current) {
299+
return;
300+
}
301+
302+
// const originalDisplay = canvasContainer.style.display;
303+
// canvasContainer.style.display = "none";
304+
// canvasContainer.offsetHeight;
305+
// canvasContainer.style.display = originalDisplay;
306+
// window.dispatchEvent(new Event("resize"));
307+
}, [resizeTrigger, canvasContainer]);
308+
294309
// Effect to show toast when task or workflow reaches a final state based on hook updates
295310
useEffect(() => {
296311
const run = task ? task.run : workflow ? workflow.run : null;

skyvern-frontend/src/routes/workflows/editor/Workspace.tsx

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ function Workspace({
126126
useState<DebugSessionApiResponse | null>(null);
127127
const [showPowerButton, setShowPowerButton] = useState(true);
128128
const [reloadKey, setReloadKey] = useState(0);
129+
const [windowResizeTrigger, setWindowResizeTrigger] = useState(0);
129130
const [isReloading, setIsReloading] = useState(false);
130131
const credentialGetter = useCredentialGetter();
131132
const queryClient = useQueryClient();
@@ -263,6 +264,16 @@ function Workspace({
263264
};
264265
});
265266

267+
// Add window resize listener to trigger NoVNC canvas resize
268+
useEffect(() => {
269+
const handleResize = () => {
270+
setWindowResizeTrigger((prev) => prev + 1);
271+
};
272+
273+
window.addEventListener("resize", handleResize);
274+
return () => window.removeEventListener("resize", handleResize);
275+
}, []);
276+
266277
useEffect(() => {
267278
blockScriptStore.setScripts(blockScripts ?? {});
268279
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -720,7 +731,7 @@ function Workspace({
720731
<div className="relative flex h-full w-full overflow-hidden overflow-x-hidden">
721732
{/* infinite canvas */}
722733
<div
723-
className={cn("skyvern-split-left h-full w-[33rem]", {
734+
className={cn("skyvern-split-left h-full w-[33rem] min-w-[33rem]", {
724735
"w-full": !showBrowser,
725736
})}
726737
>
@@ -744,11 +755,11 @@ function Workspace({
744755

745756
{/* browser & timeline & sub-panels in debug mode */}
746757
{showBrowser && (
747-
<div className="skyvern-split-right relative flex h-full flex-1 items-end justify-center bg-[#020617] p-4 pl-6">
758+
<div className="skyvern-split-right relative flex h-full w-[calc(100%-33rem)] items-end justify-center bg-[#020617] p-4 pl-6">
748759
{/* sub panels */}
749760
{workflowPanelState.active && (
750761
<div
751-
className={cn("absolute right-6 top-[8.5rem]", {
762+
className={cn("absolute right-6 top-[8.5rem] z-20", {
752763
"left-6": workflowPanelState.content === "nodeLibrary",
753764
})}
754765
style={{
@@ -803,6 +814,7 @@ function Workspace({
803814
interactive={interactor === "human"}
804815
browserSessionId={activeDebugSession.browser_session_id}
805816
showControlButtons={interactor === "human"}
817+
resizeTrigger={windowResizeTrigger}
806818
/>
807819
) : (
808820
<div className="flex aspect-video w-full flex-col items-center justify-center gap-2 rounded-md border border-slate-800 pb-2 pt-4 text-sm text-slate-400">
@@ -831,7 +843,8 @@ function Workspace({
831843
{/* timeline */}
832844
<div
833845
className={cn("h-full w-[5rem] overflow-visible", {
834-
"pointer-events-none w-[0px] overflow-hidden": !blockLabel,
846+
"pointer-events-none hidden w-[0px] overflow-hidden":
847+
!blockLabel,
835848
})}
836849
>
837850
<div
@@ -899,6 +912,53 @@ function Workspace({
899912
</div>
900913
</div>
901914
)}
915+
916+
{!showBrowser && workflowPanelState.active && (
917+
<div
918+
className={cn(
919+
"pointer-events-none absolute right-6 top-[5rem] z-20",
920+
)}
921+
style={{
922+
top: "8.5rem",
923+
height:
924+
workflowPanelState.content === "nodeLibrary"
925+
? "calc(100vh - 14rem)"
926+
: "unset",
927+
}}
928+
>
929+
{workflowPanelState.content === "cacheKeyValues" && (
930+
<WorkflowCacheKeyValuesPanel
931+
cacheKeyValues={cacheKeyValues}
932+
pending={cacheKeyValuesLoading}
933+
scriptKey={workflow.cache_key ?? "default"}
934+
onDelete={(cacheKeyValue) => {
935+
setToDeleteCacheKeyValue(cacheKeyValue);
936+
setOpenConfirmCacheKeyValueDeleteDialogue(true);
937+
}}
938+
onPaginate={(page) => {
939+
setPage(page);
940+
}}
941+
onSelect={(cacheKeyValue) => {
942+
setCacheKeyValue(cacheKeyValue);
943+
setCacheKeyValueFilter("");
944+
closeWorkflowPanel();
945+
}}
946+
/>
947+
)}
948+
{workflowPanelState.content === "parameters" && (
949+
<WorkflowParametersPanel />
950+
)}
951+
{workflowPanelState.content === "nodeLibrary" && (
952+
<div className="pointer-events-auto relative right-0 top-0 z-20 h-full w-[25rem]">
953+
<WorkflowNodeLibraryPanel
954+
onNodeClick={(props) => {
955+
addNode(props);
956+
}}
957+
/>
958+
</div>
959+
)}
960+
</div>
961+
)}
902962
</div>
903963
</div>
904964
);

0 commit comments

Comments
 (0)