From 043a2ea7901322a386fbd897509b4c5359dcbc5a Mon Sep 17 00:00:00 2001 From: Nate Kelley Date: Fri, 26 Sep 2025 11:54:55 -0600 Subject: [PATCH] dashboard description not triggering :( --- .../dashboards/queries/useGetDashboard.ts | 3 +- .../components/ui/inputs/InputTextArea.tsx | 35 +++++++++++-------- .../DashboardEditTitle.tsx | 18 ++++++++-- .../ChatContent/ChatInput/ChatInput.tsx | 2 +- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/apps/web/src/api/buster_rest/dashboards/queries/useGetDashboard.ts b/apps/web/src/api/buster_rest/dashboards/queries/useGetDashboard.ts index ca492dfab..6738625d4 100644 --- a/apps/web/src/api/buster_rest/dashboards/queries/useGetDashboard.ts +++ b/apps/web/src/api/buster_rest/dashboards/queries/useGetDashboard.ts @@ -80,8 +80,9 @@ export const usePrefetchGetDashboardClient = ( params?: Omit, 'queryKey' | 'queryFn'> ) => { const queryClient = useQueryClient(); + const queryFn = useGetDashboardAndInitializeMetrics({ prefetchData: false }); + return useMemoizedFn((id: string, versionNumber: number | 'LATEST') => { - const queryFn = useGetDashboardAndInitializeMetrics({ prefetchData: false }); const getDashboardQueryKey = dashboardQueryKeys.dashboardGetDashboard(id, versionNumber); const isStale = isQueryStale(getDashboardQueryKey, queryClient) || params?.staleTime === 0; if (!isStale) return; diff --git a/apps/web/src/components/ui/inputs/InputTextArea.tsx b/apps/web/src/components/ui/inputs/InputTextArea.tsx index db5078ed8..146597ec0 100644 --- a/apps/web/src/components/ui/inputs/InputTextArea.tsx +++ b/apps/web/src/components/ui/inputs/InputTextArea.tsx @@ -1,9 +1,7 @@ -import { ClientOnly } from '@tanstack/react-router'; import { cva, type VariantProps } from 'class-variance-authority'; -import React, { useEffect, useRef } from 'react'; +import React, { useImperativeHandle, useRef } from 'react'; import TextareaAutosize, { type TextareaAutosizeProps } from 'react-textarea-autosize'; import { cn } from '@/lib/classMerge'; -import { useMounted } from '../../../hooks/useMount'; import { inputVariants } from './Input'; const inputTextAreaVariants = inputVariants; @@ -30,7 +28,11 @@ export interface InputTextAreaProps onPressEnter?: (e: React.KeyboardEvent) => void; } -export const InputTextArea = React.forwardRef( +export interface InputTextAreaRef { + forceRecalculateHeight: () => void; +} + +export const InputTextArea = React.forwardRef( ( { className, @@ -46,14 +48,19 @@ export const InputTextArea = React.forwardRef { const textareaRef = useRef(null); - const combinedRef = (node: HTMLTextAreaElement) => { - textareaRef.current = node; - if (typeof ref === 'function') { - ref(node); - } else if (ref) { - ref.current = node; - } - }; + useImperativeHandle( + ref, + () => ({ + forceRecalculateHeight: () => { + if (textareaRef.current) { + // Force a recalculation by triggering an input event + const event = new Event('input', { bubbles: true }); + textareaRef.current.dispatchEvent(event); + } + }, + }), + [] + ); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { @@ -70,16 +77,16 @@ export const InputTextArea = React.forwardRef} + cacheMeasurements={false} {...props} /> ); diff --git a/apps/web/src/controllers/DashboardController/DashboardViewDashboardController/DashboardEditTitle.tsx b/apps/web/src/controllers/DashboardController/DashboardViewDashboardController/DashboardEditTitle.tsx index f5515ced6..b214f6d28 100644 --- a/apps/web/src/controllers/DashboardController/DashboardViewDashboardController/DashboardEditTitle.tsx +++ b/apps/web/src/controllers/DashboardController/DashboardViewDashboardController/DashboardEditTitle.tsx @@ -1,8 +1,10 @@ -import React, { useRef } from 'react'; +import React, { useEffect, useRef } from 'react'; import { useUpdateDashboard } from '@/api/buster_rest/dashboards'; -import { InputTextArea } from '@/components/ui/inputs/InputTextArea'; +import { InputTextArea, type InputTextAreaRef } from '@/components/ui/inputs/InputTextArea'; import { EditableTitle } from '@/components/ui/typography/EditableTitle'; +import { useDebounce } from '@/hooks/useDebounce'; import { useMount } from '@/hooks/useMount'; +import { useSize } from '@/hooks/useSize'; export const DASHBOARD_TITLE_INPUT_ID = (dashboardId: string) => `${dashboardId}-title-input`; @@ -15,6 +17,9 @@ export const DashboardEditTitles: React.FC<{ dashboardId: string; }> = React.memo(({ readOnly, title, description, dashboardId }) => { const titleRef = useRef(null); + const inputTextAreaRef = useRef(null); + const size = useSize(titleRef); + const debouncedWidth = useDebounce(size?.width, { wait: 50, maxWait: 85 }); const { mutateAsync: onUpdateDashboard } = useUpdateDashboard({ saveToServer: false, }); @@ -37,6 +42,12 @@ export const DashboardEditTitles: React.FC<{ } }); + useEffect(() => { + if (debouncedWidth) { + inputTextAreaRef.current?.forceRecalculateHeight(); + } + }, [debouncedWidth]); + return (
{ useEffect(() => { if (hasChat) { requestAnimationFrame(() => { - textAreaRef.current?.focus(); + textAreaRef.current?.focus?.(); }); } }, [hasChat, textAreaRef]);