mirror of https://github.com/buster-so/buster.git
Remove unused editor + drop version on save
This commit is contained in:
parent
87376682cb
commit
75e7506dde
|
@ -1,8 +1,7 @@
|
|||
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
||||
import { useNavigate } from '@tanstack/react-router';
|
||||
import last from 'lodash/last';
|
||||
import { create } from 'mutative';
|
||||
import { dashboardQueryKeys } from '@/api/query_keys/dashboard';
|
||||
import { metricsQueryKeys } from '@/api/query_keys/metric';
|
||||
import { setOriginalDashboard } from '@/context/Dashboards/useOriginalDashboardStore';
|
||||
import { initializeMetrics } from '../dashboardQueryHelpers';
|
||||
import { dashboardsUpdateDashboard } from '../requests';
|
||||
|
@ -14,6 +13,7 @@ import { dashboardsUpdateDashboard } from '../requests';
|
|||
export const useSaveDashboard = (params?: { updateOnSave?: boolean }) => {
|
||||
const updateOnSave = params?.updateOnSave || false;
|
||||
const queryClient = useQueryClient();
|
||||
const navigate = useNavigate();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: dashboardsUpdateDashboard,
|
||||
|
@ -55,6 +55,11 @@ export const useSaveDashboard = (params?: { updateOnSave?: boolean }) => {
|
|||
|
||||
const isLatestVersion = data.dashboard.version_number === last(data.versions)?.version_number;
|
||||
if (isLatestVersion) setOriginalDashboard(data.dashboard);
|
||||
navigate({
|
||||
to: '.',
|
||||
ignoreBlocker: true,
|
||||
search: (prev) => ({ ...prev, dashboard_version_number: undefined }),
|
||||
});
|
||||
},
|
||||
});
|
||||
};
|
||||
|
|
|
@ -1,85 +0,0 @@
|
|||
import type { Meta, StoryObj } from '@storybook/react-vite';
|
||||
import { AppVerticalCodeSplitter } from './AppVerticalCodeSplitter';
|
||||
|
||||
const meta: Meta<typeof AppVerticalCodeSplitter> = {
|
||||
title: 'Features/Layout/AppVerticalCodeSplitter',
|
||||
component: AppVerticalCodeSplitter,
|
||||
parameters: {
|
||||
layout: 'fullscreen',
|
||||
},
|
||||
tags: ['autodocs'],
|
||||
args: {
|
||||
className: 'min-h-[600px] min-w-[600px]',
|
||||
},
|
||||
decorators: [
|
||||
(Story) => (
|
||||
<div className="" style={{ height: '500px' }}>
|
||||
<Story />
|
||||
</div>
|
||||
),
|
||||
],
|
||||
};
|
||||
|
||||
export default meta;
|
||||
type Story = StoryObj<typeof AppVerticalCodeSplitter>;
|
||||
|
||||
const mockData: Record<string, string | number | null>[] = [
|
||||
{ id: 1, name: 'Sample Data 1' },
|
||||
{ id: 2, name: 'Sample Data 2' },
|
||||
];
|
||||
|
||||
export const Default: Story = {
|
||||
args: {
|
||||
sql: 'SELECT * FROM sample_table',
|
||||
setSQL: (sql: string) => alert('SQL changed: ' + sql),
|
||||
runSQLError: '',
|
||||
onRunQuery: async () => alert('Running query...'),
|
||||
data: mockData,
|
||||
fetchingData: false,
|
||||
defaultLayout: ['50%', 'auto'],
|
||||
autoSaveId: 'default-split-for-code-splitter',
|
||||
},
|
||||
};
|
||||
|
||||
export const WithError: Story = {
|
||||
args: {
|
||||
...Default.args,
|
||||
runSQLError: 'Invalid SQL syntax',
|
||||
},
|
||||
};
|
||||
|
||||
export const Loading: Story = {
|
||||
args: {
|
||||
...Default.args,
|
||||
fetchingData: true,
|
||||
},
|
||||
};
|
||||
|
||||
export const TopHidden: Story = {
|
||||
args: {
|
||||
...Default.args,
|
||||
topHidden: true,
|
||||
},
|
||||
};
|
||||
|
||||
export const CustomGap: Story = {
|
||||
args: {
|
||||
...Default.args,
|
||||
gapAmount: 6,
|
||||
},
|
||||
};
|
||||
|
||||
export const WithSaveButton: Story = {
|
||||
args: {
|
||||
...Default.args,
|
||||
onSaveSQL: async () => alert('Saving SQL...'),
|
||||
},
|
||||
};
|
||||
|
||||
export const DisabledSave: Story = {
|
||||
args: {
|
||||
...Default.args,
|
||||
onSaveSQL: async () => alert('Saving SQL...'),
|
||||
disabledSave: true,
|
||||
},
|
||||
};
|
|
@ -1,104 +0,0 @@
|
|||
import type { DataResult } from '@buster/server-shared/metrics';
|
||||
import { forwardRef } from 'react';
|
||||
import {
|
||||
AppSplitter,
|
||||
type AppSplitterRef,
|
||||
type LayoutSize,
|
||||
} from '@/components/ui/layouts/AppSplitter';
|
||||
import { DataContainer } from './DataContainer';
|
||||
import { DiffSQLContainer } from './DiffSQLContainer';
|
||||
|
||||
const DEFAULT_LAYOUT: LayoutSize = ['auto', '300px'];
|
||||
|
||||
export interface AppVerticalDiffCodeSplitterProps {
|
||||
originalValue: string;
|
||||
value: string;
|
||||
setValue: (value: string) => void;
|
||||
language: 'sql' | 'yaml';
|
||||
runSQLError: string | undefined;
|
||||
onRunQuery: () => Promise<void>;
|
||||
data: DataResult;
|
||||
fetchingData: boolean;
|
||||
defaultLayout?: LayoutSize;
|
||||
initialLayout?: LayoutSize | null;
|
||||
autoSaveId: string;
|
||||
topHidden?: boolean;
|
||||
onSaveSQL?: () => Promise<void>;
|
||||
disabledSave?: boolean;
|
||||
gapAmount?: number;
|
||||
className?: string;
|
||||
fileName?: string;
|
||||
versionNumber?: number;
|
||||
}
|
||||
|
||||
export const AppVerticalDiffCodeSplitter = forwardRef<
|
||||
AppSplitterRef,
|
||||
AppVerticalDiffCodeSplitterProps
|
||||
>(
|
||||
(
|
||||
{
|
||||
originalValue,
|
||||
value,
|
||||
setValue,
|
||||
language,
|
||||
runSQLError,
|
||||
onRunQuery,
|
||||
onSaveSQL,
|
||||
data,
|
||||
initialLayout = null,
|
||||
fetchingData,
|
||||
defaultLayout = DEFAULT_LAYOUT,
|
||||
autoSaveId,
|
||||
fileName,
|
||||
versionNumber,
|
||||
disabledSave = false,
|
||||
topHidden = false,
|
||||
gapAmount = 3,
|
||||
className,
|
||||
},
|
||||
ref
|
||||
) => {
|
||||
//tailwind might not like this, but yolo
|
||||
const sqlContainerClassName = !topHidden ? `mb-${gapAmount}` : '';
|
||||
const dataContainerClassName = !topHidden ? `mt-${gapAmount}` : '';
|
||||
|
||||
return (
|
||||
<AppSplitter
|
||||
ref={ref}
|
||||
leftChildren={
|
||||
<DiffSQLContainer
|
||||
className={sqlContainerClassName}
|
||||
originalValue={originalValue}
|
||||
value={value}
|
||||
setValue={setValue}
|
||||
language={language}
|
||||
error={runSQLError}
|
||||
onRunQuery={onRunQuery}
|
||||
onSaveSQL={onSaveSQL}
|
||||
disabledSave={disabledSave}
|
||||
fileName={fileName}
|
||||
versionNumber={versionNumber}
|
||||
/>
|
||||
}
|
||||
rightChildren={
|
||||
<DataContainer
|
||||
className={dataContainerClassName}
|
||||
data={data}
|
||||
fetchingData={fetchingData}
|
||||
/>
|
||||
}
|
||||
split="horizontal"
|
||||
defaultLayout={defaultLayout}
|
||||
initialLayout={initialLayout}
|
||||
autoSaveId={autoSaveId}
|
||||
preserveSide="left"
|
||||
rightPanelMinSize={'80px'}
|
||||
leftPanelMinSize={'120px'}
|
||||
leftHidden={topHidden}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
AppVerticalDiffCodeSplitter.displayName = 'AppVerticalDiffCodeSplitter';
|
|
@ -1,61 +0,0 @@
|
|||
import React, { useMemo, useState } from 'react';
|
||||
import { Button } from '@/components/ui/buttons/Button';
|
||||
import { FileCard } from '@/components/ui/card/FileCard';
|
||||
import { Copy2 } from '@/components/ui/icons';
|
||||
import { AppDiffCodeEditor } from '@/components/ui/inputs/AppDiffCodeEditor';
|
||||
import { TextAndVersionPill } from '@/components/ui/typography/TextAndVersionPill';
|
||||
import { useBusterNotifications } from '@/context/BusterNotifications';
|
||||
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
|
||||
import type { AppVerticalCodeSplitterProps } from './AppVerticalCodeSplitter';
|
||||
|
||||
export const DiffSQLContainer: React.FC<{
|
||||
className?: string;
|
||||
originalValue: string | undefined;
|
||||
value: string | undefined;
|
||||
setValue: (value: string) => void;
|
||||
onRunQuery: () => Promise<void>;
|
||||
onSaveSQL?: AppVerticalCodeSplitterProps['onSaveSQL'];
|
||||
disabledSave?: AppVerticalCodeSplitterProps['disabledSave'];
|
||||
error?: string | null;
|
||||
language: 'sql' | 'yaml';
|
||||
fileName?: string;
|
||||
versionNumber?: number;
|
||||
}> = React.memo(({ language, originalValue, value, setValue, fileName, versionNumber }) => {
|
||||
// const [isRunning, setIsRunning] = useState(false);
|
||||
const { openInfoMessage } = useBusterNotifications();
|
||||
|
||||
const onCopySQL = useMemoizedFn(() => {
|
||||
navigator.clipboard.writeText(value || '');
|
||||
openInfoMessage('Copied to clipboard');
|
||||
});
|
||||
|
||||
// const onRunQueryPreflight = useMemoizedFn(async () => {
|
||||
// setIsRunning(true);
|
||||
// await onRunQuery();
|
||||
// setIsRunning(false);
|
||||
// });
|
||||
|
||||
return (
|
||||
<FileCard
|
||||
headerButtons={useMemo(
|
||||
() => <Button prefix={<Copy2 />} variant="ghost" onClick={onCopySQL} />,
|
||||
[onCopySQL]
|
||||
)}
|
||||
fileName={useMemo(
|
||||
() => <TextAndVersionPill fileName={fileName || ''} versionNumber={versionNumber || 0} />,
|
||||
[fileName, versionNumber]
|
||||
)}
|
||||
>
|
||||
<AppDiffCodeEditor
|
||||
className="overflow-hidden"
|
||||
modified={value || ''}
|
||||
original={originalValue || ''}
|
||||
language={language}
|
||||
onChange={setValue}
|
||||
readOnly={true}
|
||||
/>
|
||||
</FileCard>
|
||||
);
|
||||
});
|
||||
|
||||
DiffSQLContainer.displayName = 'DiffSQLContainer';
|
|
@ -7,7 +7,10 @@ import { useMemo, useRef, useState } from 'react';
|
|||
import { useGetDatasetData } from '@/api/buster_rest/datasets';
|
||||
import { useRunSQL } from '@/api/buster_rest/sql';
|
||||
import type { AppSplitterRef, LayoutSize } from '@/components/ui/layouts/AppSplitter';
|
||||
import { AppVerticalCodeSplitter } from '@/components/ui/layouts/AppVerticalCodeSplitter';
|
||||
import {
|
||||
AppVerticalCodeSplitter,
|
||||
type AppVerticalCodeSplitterProps,
|
||||
} from '@/components/ui/layouts/AppVerticalCodeSplitter';
|
||||
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
|
||||
import { useRequest } from '@/hooks/useRequest';
|
||||
import { cn } from '@/lib/classMerge';
|
||||
|
@ -74,6 +77,24 @@ export const DatasetEditorController: React.FC<{
|
|||
}
|
||||
});
|
||||
|
||||
const runButton: AppVerticalCodeSplitterProps['runButton'] = useMemo(() => {
|
||||
return {
|
||||
label: 'Run',
|
||||
onClick: onRunQuery,
|
||||
loading: fetchingTempData,
|
||||
disabled: false,
|
||||
};
|
||||
}, [onRunQuery, fetchingTempData]);
|
||||
|
||||
const saveButton: AppVerticalCodeSplitterProps['saveButton'] = useMemo(() => {
|
||||
return {
|
||||
label: 'Save',
|
||||
onClick: onRunQuery,
|
||||
loading: fetchingInitialData,
|
||||
disabled: false,
|
||||
};
|
||||
}, [onRunQuery, fetchingInitialData]);
|
||||
|
||||
return (
|
||||
<div className="flex h-full w-full flex-col overflow-hidden" ref={ref}>
|
||||
<EditorContainerSubHeader selectedApp={selectedApp} setSelectedApp={setSelectedApp} />
|
||||
|
@ -85,7 +106,8 @@ export const DatasetEditorController: React.FC<{
|
|||
sql={sql}
|
||||
setSQL={setSQL}
|
||||
runSQLError={runSQLError?.message}
|
||||
onRunQuery={onRunQuery}
|
||||
runButton={runButton}
|
||||
saveButton={saveButton}
|
||||
data={shownData}
|
||||
fetchingData={fetchingInitialData || fetchingTempData}
|
||||
defaultLayout={defaultLayout}
|
||||
|
|
Loading…
Reference in New Issue