diff --git a/e2e/questdb b/e2e/questdb index 048a595b7..641a661c6 160000 --- a/e2e/questdb +++ b/e2e/questdb @@ -1 +1 @@ -Subproject commit 048a595b70ed66a2a4eb649b36b6bf3ec1e3df8a +Subproject commit 641a661c6e203ddd7a2fe160407c1be3bb4e3249 diff --git a/e2e/tests/console/result_charts.spec.js b/e2e/tests/console/result_charts.spec.js index b2cf38bc0..78206934b 100644 --- a/e2e/tests/console/result_charts.spec.js +++ b/e2e/tests/console/result_charts.spec.js @@ -52,4 +52,31 @@ describe("questdb charts", () => { .invoke("height") .should("be.gt", 0) }) + + it("keeps reset zoom available when the responsive slider disappears", () => { + cy.viewport(760, 900) + cy.typeQueryDirectly( + "SELECT rnd_timestamp(to_timestamp('2024-07-19:00:00:00.000000', 'yyyy-MM-dd:HH:mm:ss.SSSUUU'), to_timestamp('2024-07-20:00:00:00.000000', 'yyyy-MM-dd:HH:mm:ss.SSSUUU'), 0), x FROM long_sequence(500);", + ) + cy.clickRunIconInLine(1) + cy.getByDataHook("chart-panel-button").should("be.visible").click() + + cy.getByDataHook("result-chart") + .find("canvas") + .should("be.visible") + .then(($canvas) => { + const canvas = $canvas[0] + const sliderY = canvas.getBoundingClientRect().height - 44 + + cy.wrap(canvas).realMouseDown({ x: 54, y: sliderY }) + cy.wrap(canvas).realMouseMove(130, sliderY) + cy.wrap(canvas).realMouseUp({ x: 130, y: sliderY }) + }) + + cy.getByDataHook("result-chart-reset-zoom").should("be.visible") + + cy.viewport(1280, 900) + cy.getByDataHook("result-chart-reset-zoom").should("be.visible").click() + cy.getByDataHook("result-chart-reset-zoom").should("not.exist") + }) }) diff --git a/src/components/DropdownMenu/index.tsx b/src/components/DropdownMenu/index.tsx index c37089522..7e8134074 100644 --- a/src/components/DropdownMenu/index.tsx +++ b/src/components/DropdownMenu/index.tsx @@ -1,6 +1,6 @@ import React from "react" import * as RadixDropdownMenu from "@radix-ui/react-dropdown-menu" -import { CaretRightIcon } from "@phosphor-icons/react" +import { CaretRightIcon, CheckIcon } from "@phosphor-icons/react" import styled, { css } from "styled-components" import { menuContainerStyles, @@ -76,6 +76,42 @@ const Item = React.forwardRef< Item.displayName = "DropdownMenuItem" +const StyledCheckboxItem = styled(RadixDropdownMenu.CheckboxItem)` + ${menuItemStyles} +` + +const CheckSlot = styled.span` + display: inline-flex; + width: 1.6rem; + margin-left: auto; + align-items: center; + justify-content: center; + color: ${({ theme }) => theme.color.contentAccent}; +` + +type CheckboxItemProps = React.ComponentPropsWithoutRef< + typeof RadixDropdownMenu.CheckboxItem +> & { + icon?: React.ReactNode +} + +const CheckboxItem = React.forwardRef< + React.ElementRef, + CheckboxItemProps +>(({ icon, children, ...props }, ref) => ( + + {icon != null && {icon}} + {children} + + + + + + +)) + +CheckboxItem.displayName = "DropdownMenuCheckboxItem" + const StyledSubTrigger = styled(RadixDropdownMenu.SubTrigger)` ${menuItemStyles} justify-content: space-between; @@ -120,6 +156,8 @@ export const DropdownMenu = { Item, + CheckboxItem, + Sub: RadixDropdownMenu.Sub, SubTrigger, diff --git a/src/consts/shared-definitions.json b/src/consts/shared-definitions.json index 16c95af3c..e97f51ff5 100644 --- a/src/consts/shared-definitions.json +++ b/src/consts/shared-definitions.json @@ -184,7 +184,7 @@ "surfaces": ["ai", "mcp"], "mutatesNotebook": true, "createsNotebook": true, - "description": "Duplicate a notebook tab. Copies every cell (SQL, mode, chart config) and the layout into a NEW notebook labelled \"