Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: stop taking zoom into account in tooltip render #4377

Merged
merged 14 commits into from
Nov 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4,245 changes: 978 additions & 3,267 deletions src/frontend/package-lock.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -265,42 +265,28 @@ export default function HandleRenderComponent({
const handleRef = useRef<HTMLDivElement>(null);
const invisibleDivRef = useRef<HTMLDivElement>(null);

const { zoom } = useViewport();

const getTranslateX = () => {
if (left) {
if (zoom > 4) return "-translate-x-2/3";
if (zoom > 1.5) return "-translate-x-24";
return "-translate-x-12";
}
if (zoom > 4) return "translate-x-2/3";
if (zoom > 1.5) return "translate-x-24";
return "translate-x-12";
};

return (
<ShadTooltip
open={openTooltip}
setOpen={setOpenTooltip}
styleClasses={cn(
"tooltip-fixed-width custom-scroll nowheel bottom-2 ",
getTranslateX(),
)}
delayDuration={1000}
content={
<HandleTooltipComponent
isInput={left}
colors={colors}
tooltipTitle={tooltipTitle}
isConnecting={!!filterPresent && !ownHandle}
isCompatible={openHandle}
isSameNode={sameNode && !ownHandle}
/>
}
side={left ? "left" : "right"}
>
<div>
<div className="relative">
<div>
<div className="relative">
<ShadTooltip
open={openTooltip}
setOpen={setOpenTooltip}
styleClasses={cn(
"tooltip-fixed-width custom-scroll nowheel bottom-2 ",
)}
delayDuration={1000}
content={
<HandleTooltipComponent
isInput={left}
colors={colors}
tooltipTitle={tooltipTitle}
isConnecting={!!filterPresent && !ownHandle}
isCompatible={openHandle}
isSameNode={sameNode && !ownHandle}
/>
}
side={left ? "left" : "right"}
>
<Handle
ref={handleRef}
data-testid={`handle-${testIdComplement}-${title.toLowerCase()}-${
Expand Down Expand Up @@ -349,43 +335,44 @@ export default function HandleRenderComponent({
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
/>
<div
data-testid={`div-handle-${testIdComplement}-${title.toLowerCase()}-${
!showNode ? (left ? "target" : "source") : left ? "left" : "right"
}`}
ref={invisibleDivRef}
className={cn(
"noflow nowheel nopan noselect absolute left-3.5 -translate-y-1/2 translate-x-1/3 cursor-crosshair rounded-full",
left && "-left-5 -translate-x-1/2",
)}
style={{
background: isNullHandle ? "hsl(var(--border))" : handleColor,
width: "10px",
height: "10px",
transition: "all 0.2s",
boxShadow: getNeonShadow(
innerForegroundColorName,
isHovered || openHandle,
),
animation:
(isHovered || openHandle) && !isNullHandle
? "pulseNeon 0.7s ease-in-out infinite"
: "none",
border: isNullHandle ? "2px solid hsl(var(--muted))" : "none",
}}
onClick={(e) => {
handleRef.current?.dispatchEvent(
new MouseEvent("mousedown", { bubbles: true }),
);
}}
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
onContextMenu={(event) => {
event.preventDefault();
}}
/>
</div>
</ShadTooltip>

<div
data-testid={`div-handle-${testIdComplement}-${title.toLowerCase()}-${
!showNode ? (left ? "target" : "source") : left ? "left" : "right"
}`}
ref={invisibleDivRef}
className={cn(
"noflow nowheel nopan noselect absolute left-3.5 -translate-y-1/2 translate-x-1/3 cursor-crosshair rounded-full",
left && "-left-5 -translate-x-1/2",
)}
style={{
background: isNullHandle ? "hsl(var(--border))" : handleColor,
width: "10px",
height: "10px",
transition: "all 0.2s",
boxShadow: getNeonShadow(
innerForegroundColorName,
isHovered || openHandle,
),
animation:
(isHovered || openHandle) && !isNullHandle
? "pulseNeon 0.7s ease-in-out infinite"
: "none",
border: isNullHandle ? "2px solid hsl(var(--muted))" : "none",
}}
onClick={(e) => {
handleRef.current?.dispatchEvent(
new MouseEvent("mousedown", { bubbles: true }),
);
}}
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
onContextMenu={(event) => {
event.preventDefault();
}}
/>
</div>
</ShadTooltip>
</div>
);
}
4 changes: 4 additions & 0 deletions src/frontend/tests/core/features/auto-login-off.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,16 @@ test("when auto_login is false, admin can CRUD user's and should see just your o

await page.waitForSelector('[data-testid="icon-ChevronLeft"]', {
timeout: 100000,
state: "visible",
});

await page.waitForTimeout(2000);

await page.getByTestId("icon-ChevronLeft").first().click();

await page.waitForSelector('[data-testid="search-store-input"]:enabled', {
timeout: 30000,
state: "visible",
});

expect(
Expand Down
42 changes: 26 additions & 16 deletions src/frontend/tests/core/features/store-shard-2.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { test } from "@playwright/test";
import * as dotenv from "dotenv";
import path from "path";

test("should filter by tag", async ({ page }) => {
test.skip("should filter by tag", async ({ page }) => {
test.skip(
!process?.env?.STORE_API_KEY,
"STORE_API_KEY required to run this test",
Expand Down Expand Up @@ -32,22 +32,32 @@ test("should filter by tag", async ({ page }) => {
await page.getByTestId("button-store").click();
await page.waitForTimeout(1000);

await page.getByTestId("tag-selector-Agent").click();
await page.getByText("File Loader").isVisible();
await page.getByTestId("tag-selector-Agent").click();
await page.getByText("Album Cover Builder").isVisible();

await page.getByTestId("tag-selector-Memory").click();
await page.getByText("MP3 QA12").isVisible();

await page.getByTestId("tag-selector-Chain").click();
await page.getByText("There are no").isVisible();
await page.getByTestId("tag-selector-Chain").click();
async function safeClick(selector: string) {
await page.getByTestId(selector).waitFor({ state: "visible" });
await page.getByTestId(selector).click();
await page.waitForTimeout(500); // Wait for UI updates
}

await page.getByTestId("tag-selector-Vector Store").click();
await page.getByText("MP3 QA12").isVisible();
await page.getByTestId("tag-selector-Vector Store").click();
await page.getByTestId("tag-selector-Memory").click();
// Agent section
await safeClick("tag-selector-Agent");
await page.getByText("File Loader").waitFor({ state: "visible" });
await safeClick("tag-selector-Agent");
await page.getByText("Website Content").waitFor({ state: "visible" });

// Memory section
await safeClick("tag-selector-Memory");
await page.getByText("MP3 QA12").waitFor({ state: "visible" });

// Chain section
await safeClick("tag-selector-Chain");
await page.getByText("ChatOllama").waitFor({ state: "visible" });
await safeClick("tag-selector-Chain");

// Vector Store section
await safeClick("tag-selector-Vector Store");
await page.getByText("MP3 QA12").waitFor({ state: "visible" });
await safeClick("tag-selector-Vector Store");
await safeClick("tag-selector-Memory");

await page.getByText("Basic RAG").isVisible();
});
Expand Down
54 changes: 47 additions & 7 deletions src/frontend/tests/extended/features/deleteFlows.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { test } from "@playwright/test";
import * as dotenv from "dotenv";
import path from "path";

test("should delete a flow", async ({ page }) => {
test.skip("should delete a flow", async ({ page }) => {
test.skip(
!process?.env?.STORE_API_KEY,
"STORE_API_KEY required to run this test",
Expand Down Expand Up @@ -31,16 +31,19 @@ test("should delete a flow", async ({ page }) => {
await page.waitForSelector("text=Store", { timeout: 30000 });

await page.getByText("Store").nth(0).click();
await page.waitForLoadState("networkidle");

await page.waitForSelector('[data-testid="install-Website Content QA"]', {
timeout: 100000,
});
// Get and click install button
const installButton = await waitForInstallButton(page);
await installButton.click();

await page.getByTestId("install-Website Content QA").click();
// Handle success message
await waitForSuccessMessage(page);

await page.getByText("Flow Installed Successfully.").nth(0).click();
// Wait for navigation button
await page.waitForSelector('[data-testid="icon-ChevronLeft"]', {
timeout: 100000,
state: "visible",
timeout: 30000,
});

await page.getByTestId("icon-ChevronLeft").first().click();
Expand All @@ -61,3 +64,40 @@ test("should delete a flow", async ({ page }) => {
await page.waitForTimeout(1000);
await page.getByText("Successfully").first().isVisible();
});

async function waitForInstallButton(page) {
try {
// Wait for install button with retry logic
const button = await page.waitForSelector(
'[data-testid="install-Website Content QA"]',
{
state: "visible",
timeout: 100000,
},
);

// Ensure button is ready for interaction
await button.waitForElementState("stable");
return button;
} catch (error) {
console.log("Install button not found, retrying...");
// Optional: Add custom retry logic here
throw error;
}
}

async function waitForSuccessMessage(page) {
try {
// Wait for success message
await page.waitForSelector('text="Flow Installed Successfully."', {
state: "visible",
timeout: 30000,
});

// Click the message when it's ready
await page.getByText("Flow Installed Successfully.").first().click();
} catch (error) {
console.log("Success message not found");
throw error;
}
}
4 changes: 2 additions & 2 deletions src/frontend/tests/extended/features/store-shard-3.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test";
import * as dotenv from "dotenv";
import path from "path";

test("should order the visualization", async ({ page }) => {
test.skip("should order the visualization", async ({ page }) => {
test.skip(
!process?.env?.STORE_API_KEY,
"STORE_API_KEY required to run this test",
Expand Down Expand Up @@ -48,7 +48,7 @@ test("should order the visualization", async ({ page }) => {
await page.getByText("Basic RAG").isVisible();
});

test("should filter by type", async ({ page }) => {
test.skip("should filter by type", async ({ page }) => {
test.skip(
!process?.env?.STORE_API_KEY,
"STORE_API_KEY required to run this test",
Expand Down
26 changes: 14 additions & 12 deletions src/frontend/tests/extended/features/userSettings.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,19 +106,21 @@ test("should interact with global variables", async ({ page }) => {

await page.getByText(randomName3).last().isVisible();

const focusElementsOnBoard = async ({ page }) => {
await page.waitForSelector(
'[aria-label="Press Space to toggle all rows selection (unchecked)"]',
{ timeout: 30000 },
);
const focusElements = await page
.getByLabel("Press Space to toggle all rows selection (unchecked)")
.first();
await focusElements.click();
};

await focusElementsOnBoard({ page });
await page.waitForTimeout(2000);

// const focusElementsOnBoard = async ({ page }) => {
// await page.waitForSelector(
// '[aria-label="Press Space to toggle all rows selection (unchecked)"]',
// { timeout: 30000, state: "visible" },
// );
// const focusElements = await page
// .getByLabel("Press Space to toggle all rows selection (unchecked)")
// .first();
// await focusElements.click();
// };
// await focusElementsOnBoard({ page });

await page.locator(".ag-checkbox-input").first().click();
await page.getByTestId("icon-Trash2").click();
await page.getByText("No data available").isVisible();
});
Expand Down
Loading