Skip to content

Commit

Permalink
feat: Stop editor scrolling to top (apache#26754)
Browse files Browse the repository at this point in the history
Co-authored-by: Puridach Wutthihathaithamrong <>
Co-authored-by: JUST.in DO IT <justin.park@airbnb.com>
  • Loading branch information
2 people authored and sfirke committed Mar 22, 2024
1 parent 82ce4d2 commit e387e6a
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 2 deletions.
6 changes: 6 additions & 0 deletions superset-frontend/src/SqlLab/actions/sqlLab.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ export const QUERY_EDITOR_SET_SCHEMA = 'QUERY_EDITOR_SET_SCHEMA';
export const QUERY_EDITOR_SET_TITLE = 'QUERY_EDITOR_SET_TITLE';
export const QUERY_EDITOR_SET_AUTORUN = 'QUERY_EDITOR_SET_AUTORUN';
export const QUERY_EDITOR_SET_SQL = 'QUERY_EDITOR_SET_SQL';
export const QUERY_EDITOR_SET_CURSOR_POSITION =
'QUERY_EDITOR_SET_CURSOR_POSITION';
export const QUERY_EDITOR_SET_QUERY_LIMIT = 'QUERY_EDITOR_SET_QUERY_LIMIT';
export const QUERY_EDITOR_SET_TEMPLATE_PARAMS =
'QUERY_EDITOR_SET_TEMPLATE_PARAMS';
Expand Down Expand Up @@ -881,6 +883,10 @@ export function queryEditorSetSql(queryEditor, sql, queryId) {
return { type: QUERY_EDITOR_SET_SQL, queryEditor, sql, queryId };
}

export function queryEditorSetCursorPosition(queryEditor, position) {
return { type: QUERY_EDITOR_SET_CURSOR_POSITION, queryEditor, position };
}

export function queryEditorSetAndSaveSql(targetQueryEditor, sql, queryId) {
return function (dispatch, getState) {
const queryEditor = getUpToDateQuery(getState(), targetQueryEditor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ const setup = (queryEditor: QueryEditor, store?: Store) =>
onChange={jest.fn()}
onBlur={jest.fn()}
autocomplete
onCursorPositionChange={jest.fn()}
/>,
{
useRedux: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { queryEditorSetSelectedText } from 'src/SqlLab/actions/sqlLab';
import { FullSQLEditor as AceEditor } from 'src/components/AsyncAceEditor';
import type { KeyboardShortcut } from 'src/SqlLab/components/KeyboardShortcutButton';
import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor';
import type { CursorPosition } from 'src/SqlLab/types';
import { useAnnotations } from './useAnnotations';
import { useKeywords } from './useKeywords';

Expand All @@ -40,6 +41,7 @@ type AceEditorWrapperProps = {
onBlur: (sql: string) => void;
onChange: (sql: string) => void;
queryEditorId: string;
onCursorPositionChange: (position: CursorPosition) => void;
height: string;
hotkeys: HotKey[];
};
Expand Down Expand Up @@ -69,6 +71,7 @@ const AceEditorWrapper = ({
onBlur = () => {},
onChange = () => {},
queryEditorId,
onCursorPositionChange,
height,
hotkeys,
}: AceEditorWrapperProps) => {
Expand All @@ -79,10 +82,11 @@ const AceEditorWrapper = ({
'sql',
'schema',
'templateParams',
'cursorPosition',
]);

const currentSql = queryEditor.sql ?? '';

const cursorPosition = queryEditor.cursorPosition ?? { row: 0, column: 0 };
const [sql, setSql] = useState(currentSql);

// The editor changeSelection is called multiple times in a row,
Expand Down Expand Up @@ -143,6 +147,15 @@ const AceEditorWrapper = ({

currentSelectionCache.current = selectedText;
});
editor.selection.on('changeCursor', () => {
const cursor = editor.getCursorPosition();
onCursorPositionChange(cursor);
});

const { row, column } = cursorPosition;
editor.moveCursorToPosition({ row, column });
editor.focus();
editor.scrollToLine(row, true, true);
};

const onChangeText = (text: string) => {
Expand Down
12 changes: 11 additions & 1 deletion superset-frontend/src/SqlLab/components/SqlEditor/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ import {
QueryResponse,
Query,
} from '@superset-ui/core';
import type { QueryEditor, SqlLabRootState } from 'src/SqlLab/types';
import type {
QueryEditor,
SqlLabRootState,
CursorPosition,
} from 'src/SqlLab/types';
import type { DatabaseObject } from 'src/features/databases/types';
import { debounce, throttle, isBoolean, isEmpty } from 'lodash';
import Modal from 'src/components/Modal';
Expand All @@ -63,6 +67,7 @@ import {
postStopQuery,
queryEditorSetAutorun,
queryEditorSetSql,
queryEditorSetCursorPosition,
queryEditorSetAndSaveSql,
queryEditorSetTemplateParams,
runQueryFromSqlEditor,
Expand Down Expand Up @@ -757,6 +762,10 @@ const SqlEditor: React.FC<Props> = ({
);
};

const handleCursorPositionChange = (newPosition: CursorPosition) => {
dispatch(queryEditorSetCursorPosition(queryEditor, newPosition));
};

const queryPane = () => {
const { aceEditorHeight, southPaneHeight } =
getAceEditorAndSouthPaneHeights(height, northPercent, southPercent);
Expand Down Expand Up @@ -787,6 +796,7 @@ const SqlEditor: React.FC<Props> = ({
onBlur={onSqlChanged}
onChange={onSqlChanged}
queryEditorId={queryEditor.id}
onCursorPositionChange={handleCursorPositionChange}
height={`${aceEditorHeight}px`}
hotkeys={hotkeys}
/>
Expand Down
1 change: 1 addition & 0 deletions superset-frontend/src/SqlLab/reducers/getInitialState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ export default function getInitialState({
queryLimit: common.conf.DEFAULT_SQLLAB_LIMIT,
hideLeftBar: false,
remoteId: null,
cursorPosition: { row: 0, column: 0 },
};
let unsavedQueryEditor: UnsavedQueryEditor = {};

Expand Down
12 changes: 12 additions & 0 deletions superset-frontend/src/SqlLab/reducers/sqlLab.js
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,18 @@ export default function sqlLabReducer(state = {}, action) {
),
};
},
[actions.QUERY_EDITOR_SET_CURSOR_POSITION]() {
return {
...state,
...alterUnsavedQueryEditorState(
state,
{
cursorPosition: action.position,
},
action.queryEditor.id,
),
};
},
[actions.QUERY_EDITOR_SET_QUERY_LIMIT]() {
return {
...state,
Expand Down
6 changes: 6 additions & 0 deletions superset-frontend/src/SqlLab/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ export enum QueryEditorVersion {

export const LatestQueryEditorVersion = QueryEditorVersion.v1;

export interface CursorPosition {
row: number;
column: number;
}

export interface QueryEditor {
version: QueryEditorVersion;
id: string;
Expand All @@ -56,6 +61,7 @@ export interface QueryEditor {
northPercent?: number;
southPercent?: number;
updatedAt?: number;
cursorPosition?: CursorPosition;
}

export type toastState = {
Expand Down

0 comments on commit e387e6a

Please sign in to comment.