mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Fix an issue in query tool where toggle case of selected text loses selection. #7277
Also make changes to give pgAdmin shortcuts higher priority over CodeMirror default shortcuts.
This commit is contained in:
parent
1a02d13a28
commit
f351b10ed0
@ -29,7 +29,10 @@ Housekeeping
|
|||||||
Bug fixes
|
Bug fixes
|
||||||
*********
|
*********
|
||||||
|
|
||||||
|
| `Issue #7116 <https://github.com/pgadmin-org/pgadmin4/issues/7116>`_ - Bug fixes and improvements in pgAdmin CLI.
|
||||||
|
| `Issue #7165 <https://github.com/pgadmin-org/pgadmin4/issues/7165>`_ - Fixed schema diff wrong query generation for table, foreign table and sequence.
|
||||||
| `Issue #7229 <https://github.com/pgadmin-org/pgadmin4/issues/7229>`_ - Fix an issue in table dialog where changing column name was not syncing table constraints appropriately.
|
| `Issue #7229 <https://github.com/pgadmin-org/pgadmin4/issues/7229>`_ - Fix an issue in table dialog where changing column name was not syncing table constraints appropriately.
|
||||||
| `Issue #7262 <https://github.com/pgadmin-org/pgadmin4/issues/7262>`_ - Fix an issue in editor where replace option in query tool edit menu is not working on non-Mac OS.
|
| `Issue #7262 <https://github.com/pgadmin-org/pgadmin4/issues/7262>`_ - Fix an issue in editor where replace option in query tool edit menu is not working on non-Mac OS.
|
||||||
| `Issue #7268 <https://github.com/pgadmin-org/pgadmin4/issues/7268>`_ - Fix an issue in editor where Format SQL shortcut and multiline selection are not working.
|
| `Issue #7268 <https://github.com/pgadmin-org/pgadmin4/issues/7268>`_ - Fix an issue in editor where Format SQL shortcut and multiline selection are not working.
|
||||||
| `Issue #7269 <https://github.com/pgadmin-org/pgadmin4/issues/7269>`_ - Fix an issue in editor where "Use Spaces?" Preference of Editor is not working.
|
| `Issue #7269 <https://github.com/pgadmin-org/pgadmin4/issues/7269>`_ - Fix an issue in editor where "Use Spaces?" Preference of Editor is not working.
|
||||||
|
| `Issue #7277 <https://github.com/pgadmin-org/pgadmin4/issues/7277>`_ - Fix an issue in query tool where toggle case of selected text loses selection.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
EditorView
|
EditorView
|
||||||
} from '@codemirror/view';
|
} from '@codemirror/view';
|
||||||
import { StateEffect, EditorState } from '@codemirror/state';
|
import { StateEffect, EditorState, EditorSelection } from '@codemirror/state';
|
||||||
import { autocompletion } from '@codemirror/autocomplete';
|
import { autocompletion } from '@codemirror/autocomplete';
|
||||||
import {undo, indentMore, indentLess, toggleComment} from '@codemirror/commands';
|
import {undo, indentMore, indentLess, toggleComment} from '@codemirror/commands';
|
||||||
import { errorMarkerEffect } from './extensions/errorMarker';
|
import { errorMarkerEffect } from './extensions/errorMarker';
|
||||||
@ -49,7 +49,10 @@ export default class CustomEditorView extends EditorView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
replaceSelection(newValue) {
|
replaceSelection(newValue) {
|
||||||
this.dispatch(this.state.replaceSelection(newValue));
|
this.dispatch(this.state.changeByRange(range => ({
|
||||||
|
changes: { from: range.from, to: range.to, insert: newValue },
|
||||||
|
range: EditorSelection.range(range.from, range.to)
|
||||||
|
})));
|
||||||
}
|
}
|
||||||
|
|
||||||
getCursor() {
|
getCursor() {
|
||||||
|
@ -110,7 +110,6 @@ const defaultExtensions = [
|
|||||||
EditorState.allowMultipleSelections.of(true),
|
EditorState.allowMultipleSelections.of(true),
|
||||||
indentOnInput(),
|
indentOnInput(),
|
||||||
syntaxHighlighting,
|
syntaxHighlighting,
|
||||||
keymap.of([defaultKeymap, closeBracketsKeymap, historyKeymap, foldKeymap, completionKeymap].flat()),
|
|
||||||
keymap.of([{
|
keymap.of([{
|
||||||
key: 'Tab',
|
key: 'Tab',
|
||||||
preventDefault: true,
|
preventDefault: true,
|
||||||
@ -147,6 +146,8 @@ export default function Editor({
|
|||||||
|
|
||||||
const preferencesStore = usePreferences();
|
const preferencesStore = usePreferences();
|
||||||
const editable = !disabled;
|
const editable = !disabled;
|
||||||
|
|
||||||
|
const shortcuts = useRef(new Compartment());
|
||||||
const configurables = useRef(new Compartment());
|
const configurables = useRef(new Compartment());
|
||||||
const editableConfig = useRef(new Compartment());
|
const editableConfig = useRef(new Compartment());
|
||||||
|
|
||||||
@ -168,13 +169,14 @@ export default function Editor({
|
|||||||
icon.innerHTML = arrowRightHtml;
|
icon.innerHTML = arrowRightHtml;
|
||||||
}
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
},
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
if (editorContainerRef.current) {
|
if (editorContainerRef.current) {
|
||||||
const state = EditorState.create({
|
const state = EditorState.create({
|
||||||
extensions: [
|
extensions: [
|
||||||
...finalExtns,
|
...finalExtns,
|
||||||
|
shortcuts.current.of([]),
|
||||||
configurables.current.of([]),
|
configurables.current.of([]),
|
||||||
editableConfig.current.of([
|
editableConfig.current.of([
|
||||||
EditorView.editable.of(!disabled),
|
EditorView.editable.of(!disabled),
|
||||||
@ -209,7 +211,6 @@ export default function Editor({
|
|||||||
}),
|
}),
|
||||||
breakpoint ? breakpointGutter : [],
|
breakpoint ? breakpointGutter : [],
|
||||||
showActiveLine ? highlightActiveLine() : activeLineExtn(),
|
showActiveLine ? highlightActiveLine() : activeLineExtn(),
|
||||||
keymap.of(customKeyMap??[]),
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -243,6 +244,13 @@ export default function Editor({
|
|||||||
}
|
}
|
||||||
}, [value]);
|
}, [value]);
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
const keys = keymap.of([customKeyMap??[], defaultKeymap, closeBracketsKeymap, historyKeymap, foldKeymap, completionKeymap].flat());
|
||||||
|
editor.current?.dispatch({
|
||||||
|
effects: shortcuts.current.reconfigure(keys)
|
||||||
|
});
|
||||||
|
}, [customKeyMap]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let pref = preferencesStore.getPreferencesForModule('sqleditor');
|
let pref = preferencesStore.getPreferencesForModule('sqleditor');
|
||||||
let newConfigExtn = [];
|
let newConfigExtn = [];
|
||||||
|
@ -90,7 +90,7 @@ export default function CodeMirror({className, currEditor, showCopyBtn=false, cu
|
|||||||
setShowGoto(true);
|
setShowGoto(true);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...customKeyMap], []);
|
...customKeyMap], [customKeyMap]);
|
||||||
|
|
||||||
const closeFind = () => {
|
const closeFind = () => {
|
||||||
setShowFind([false, false]);
|
setShowFind([false, false]);
|
||||||
|
@ -14,6 +14,7 @@ import convert from 'convert-units';
|
|||||||
import getApiInstance from './api_instance';
|
import getApiInstance from './api_instance';
|
||||||
import usePreferences from '../../preferences/static/js/store';
|
import usePreferences from '../../preferences/static/js/store';
|
||||||
import pgAdmin from 'sources/pgadmin';
|
import pgAdmin from 'sources/pgadmin';
|
||||||
|
import { isMac } from './keyboard_shortcuts';
|
||||||
|
|
||||||
export function parseShortcutValue(obj) {
|
export function parseShortcutValue(obj) {
|
||||||
let shortcut = '';
|
let shortcut = '';
|
||||||
@ -27,6 +28,37 @@ export function parseShortcutValue(obj) {
|
|||||||
return shortcut;
|
return shortcut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isShortcutValue(obj) {
|
||||||
|
if(!obj) return false;
|
||||||
|
if([obj.alt, obj.control, obj?.key, obj?.key?.char].every((k)=>!_.isUndefined(k))){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert shortcut obj to codemirror key format
|
||||||
|
export function toCodeMirrorKey(obj) {
|
||||||
|
let shortcut = '';
|
||||||
|
if (!obj){
|
||||||
|
return shortcut;
|
||||||
|
}
|
||||||
|
if (obj.alt) { shortcut += 'Alt-'; }
|
||||||
|
if (obj.shift) { shortcut += 'Shift-'; }
|
||||||
|
if (obj.control) {
|
||||||
|
if(isMac() && obj.ctrl_is_meta) {
|
||||||
|
shortcut += 'Mod-';
|
||||||
|
} else {
|
||||||
|
shortcut += 'Ctrl-';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(obj?.key.char?.length == 1) {
|
||||||
|
shortcut += obj?.key.char?.toLowerCase();
|
||||||
|
} else {
|
||||||
|
shortcut += obj?.key.char;
|
||||||
|
}
|
||||||
|
return shortcut;
|
||||||
|
}
|
||||||
|
|
||||||
export function getEpoch(inp_date) {
|
export function getEpoch(inp_date) {
|
||||||
let date_obj = inp_date ? inp_date : new Date();
|
let date_obj = inp_date ? inp_date : new Date();
|
||||||
return parseInt(date_obj.getTime()/1000);
|
return parseInt(date_obj.getTime()/1000);
|
||||||
|
@ -79,13 +79,85 @@ function onBeforeUnload(e) {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.returnValue = 'prevent';
|
e.returnValue = 'prevent';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FIXED_PREF = {
|
||||||
|
find: {
|
||||||
|
'control': true,
|
||||||
|
ctrl_is_meta: true,
|
||||||
|
'shift': false,
|
||||||
|
'alt': false,
|
||||||
|
'key': {
|
||||||
|
'key_code': 70,
|
||||||
|
'char': 'F',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
replace: {
|
||||||
|
'control': true,
|
||||||
|
ctrl_is_meta: true,
|
||||||
|
'shift': false,
|
||||||
|
'alt': true,
|
||||||
|
'key': {
|
||||||
|
'key_code': 70,
|
||||||
|
'char': 'F',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
gotolinecol: {
|
||||||
|
'control': true,
|
||||||
|
ctrl_is_meta: true,
|
||||||
|
'shift': false,
|
||||||
|
'alt': false,
|
||||||
|
'key': {
|
||||||
|
'key_code': 76,
|
||||||
|
'char': 'L',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
indent: {
|
||||||
|
'control': false,
|
||||||
|
'shift': false,
|
||||||
|
'alt': false,
|
||||||
|
'key': {
|
||||||
|
'key_code': 9,
|
||||||
|
'char': 'Tab',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
unindent: {
|
||||||
|
'control': false,
|
||||||
|
'shift': true,
|
||||||
|
'alt': false,
|
||||||
|
'key': {
|
||||||
|
'key_code': 9,
|
||||||
|
'char': 'Tab',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
comment: {
|
||||||
|
'control': true,
|
||||||
|
ctrl_is_meta: true,
|
||||||
|
'shift': false,
|
||||||
|
'alt': false,
|
||||||
|
'key': {
|
||||||
|
'key_code': 191,
|
||||||
|
'char': '/',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
format_sql: {
|
||||||
|
'control': true,
|
||||||
|
ctrl_is_meta: true,
|
||||||
|
'shift': false,
|
||||||
|
'alt': false,
|
||||||
|
'key': {
|
||||||
|
'key_code': 75,
|
||||||
|
'char': 'k',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedNodeInfo, qtPanelDocker, qtPanelId, eventBusObj}) {
|
export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedNodeInfo, qtPanelDocker, qtPanelId, eventBusObj}) {
|
||||||
const containerRef = React.useRef(null);
|
const containerRef = React.useRef(null);
|
||||||
const preferencesStore = usePreferences();
|
const preferencesStore = usePreferences();
|
||||||
const [qtState, _setQtState] = useState({
|
const [qtState, _setQtState] = useState({
|
||||||
preferences: {
|
preferences: {
|
||||||
browser: preferencesStore.getPreferencesForModule('browser'),
|
browser: preferencesStore.getPreferencesForModule('browser'),
|
||||||
sqleditor: preferencesStore.getPreferencesForModule('sqleditor'),
|
sqleditor: {...preferencesStore.getPreferencesForModule('sqleditor'), ...FIXED_PREF},
|
||||||
graphs: preferencesStore.getPreferencesForModule('graphs'),
|
graphs: preferencesStore.getPreferencesForModule('graphs'),
|
||||||
misc: preferencesStore.getPreferencesForModule('misc'),
|
misc: preferencesStore.getPreferencesForModule('misc'),
|
||||||
},
|
},
|
||||||
@ -362,7 +434,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
|
|||||||
state => {
|
state => {
|
||||||
setQtState({preferences: {
|
setQtState({preferences: {
|
||||||
browser: state.getPreferencesForModule('browser'),
|
browser: state.getPreferencesForModule('browser'),
|
||||||
sqleditor: state.getPreferencesForModule('sqleditor'),
|
sqleditor: {...state.getPreferencesForModule('sqleditor'), ...FIXED_PREF},
|
||||||
graphs: state.getPreferencesForModule('graphs'),
|
graphs: state.getPreferencesForModule('graphs'),
|
||||||
misc: state.getPreferencesForModule('misc'),
|
misc: state.getPreferencesForModule('misc'),
|
||||||
}});
|
}});
|
||||||
|
@ -48,87 +48,6 @@ const useStyles = makeStyles((theme)=>({
|
|||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const FIXED_PREF = {
|
|
||||||
find: {
|
|
||||||
'control': true,
|
|
||||||
ctrl_is_meta: true,
|
|
||||||
'shift': false,
|
|
||||||
'alt': false,
|
|
||||||
'key': {
|
|
||||||
'key_code': 70,
|
|
||||||
'char': 'F',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
replace: {
|
|
||||||
'control': true,
|
|
||||||
ctrl_is_meta: true,
|
|
||||||
'shift': false,
|
|
||||||
'alt': true,
|
|
||||||
'key': {
|
|
||||||
'key_code': 70,
|
|
||||||
'char': 'F',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
gotolinecol: {
|
|
||||||
'control': true,
|
|
||||||
ctrl_is_meta: true,
|
|
||||||
'shift': false,
|
|
||||||
'alt': false,
|
|
||||||
'key': {
|
|
||||||
'key_code': 76,
|
|
||||||
'char': 'L',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
indent: {
|
|
||||||
'control': false,
|
|
||||||
'shift': false,
|
|
||||||
'alt': false,
|
|
||||||
'key': {
|
|
||||||
'key_code': 9,
|
|
||||||
'char': 'Tab',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
unindent: {
|
|
||||||
'control': false,
|
|
||||||
'shift': true,
|
|
||||||
'alt': false,
|
|
||||||
'key': {
|
|
||||||
'key_code': 9,
|
|
||||||
'char': 'Tab',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
comment: {
|
|
||||||
'control': true,
|
|
||||||
ctrl_is_meta: true,
|
|
||||||
'shift': false,
|
|
||||||
'alt': false,
|
|
||||||
'key': {
|
|
||||||
'key_code': 191,
|
|
||||||
'char': '/',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
uncomment: {
|
|
||||||
'control': true,
|
|
||||||
ctrl_is_meta: true,
|
|
||||||
'shift': false,
|
|
||||||
'alt': false,
|
|
||||||
'key': {
|
|
||||||
'key_code': 190,
|
|
||||||
'char': '.',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
format_sql: {
|
|
||||||
'control': true,
|
|
||||||
ctrl_is_meta: true,
|
|
||||||
'shift': false,
|
|
||||||
'alt': false,
|
|
||||||
'key': {
|
|
||||||
'key_code': 75,
|
|
||||||
'char': 'k',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
function autoCommitRollback(type, api, transId, value) {
|
function autoCommitRollback(type, api, transId, value) {
|
||||||
let url = url_for(`sqleditor.${type}`, {
|
let url = url_for(`sqleditor.${type}`, {
|
||||||
'trans_id': transId,
|
'trans_id': transId,
|
||||||
@ -451,7 +370,7 @@ export function MainToolBar({containerRef, onFilterClick, onManageMacros}) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
shortcut: FIXED_PREF.format_sql,
|
shortcut: queryToolPref.format_sql,
|
||||||
options: {
|
options: {
|
||||||
callback: ()=>{formatSQL();}
|
callback: ()=>{formatSQL();}
|
||||||
}
|
}
|
||||||
@ -596,25 +515,25 @@ export function MainToolBar({containerRef, onFilterClick, onManageMacros}) {
|
|||||||
onClose={onMenuClose}
|
onClose={onMenuClose}
|
||||||
label={gettext('Edit Menu')}
|
label={gettext('Edit Menu')}
|
||||||
>
|
>
|
||||||
<PgMenuItem shortcut={FIXED_PREF.find}
|
<PgMenuItem shortcut={queryToolPref.find}
|
||||||
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_FIND_REPLACE, false);}}>{gettext('Find')}</PgMenuItem>
|
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_FIND_REPLACE, false);}}>{gettext('Find')}</PgMenuItem>
|
||||||
<PgMenuItem shortcut={FIXED_PREF.replace}
|
<PgMenuItem shortcut={queryToolPref.replace}
|
||||||
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_FIND_REPLACE, true);}}>{gettext('Replace')}</PgMenuItem>
|
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_FIND_REPLACE, true);}}>{gettext('Replace')}</PgMenuItem>
|
||||||
<PgMenuItem shortcut={FIXED_PREF.gotolinecol}
|
<PgMenuItem shortcut={queryToolPref.gotolinecol}
|
||||||
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'gotoLineCol');}}>{gettext('Go to Line/Column')}</PgMenuItem>
|
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'gotoLineCol');}}>{gettext('Go to Line/Column')}</PgMenuItem>
|
||||||
<PgMenuDivider />
|
<PgMenuDivider />
|
||||||
<PgMenuItem shortcut={FIXED_PREF.indent}
|
<PgMenuItem shortcut={queryToolPref.indent}
|
||||||
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'indentMore');}}>{gettext('Indent Selection')}</PgMenuItem>
|
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'indentMore');}}>{gettext('Indent Selection')}</PgMenuItem>
|
||||||
<PgMenuItem shortcut={FIXED_PREF.unindent}
|
<PgMenuItem shortcut={queryToolPref.unindent}
|
||||||
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'indentLess');}}>{gettext('Unindent Selection')}</PgMenuItem>
|
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'indentLess');}}>{gettext('Unindent Selection')}</PgMenuItem>
|
||||||
<PgMenuItem shortcut={FIXED_PREF.comment}
|
<PgMenuItem shortcut={queryToolPref.comment}
|
||||||
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'toggleComment');}}>{gettext('Toggle Comment')}</PgMenuItem>
|
onClick={()=>{eventBus.fireEvent(QUERY_TOOL_EVENTS.EDITOR_EXEC_CMD, 'toggleComment');}}>{gettext('Toggle Comment')}</PgMenuItem>
|
||||||
<PgMenuItem shortcut={queryToolPref.toggle_case}
|
<PgMenuItem shortcut={queryToolPref.toggle_case}
|
||||||
onClick={toggleCase}>{gettext('Toggle Case Of Selected Text')}</PgMenuItem>
|
onClick={toggleCase}>{gettext('Toggle Case Of Selected Text')}</PgMenuItem>
|
||||||
<PgMenuItem shortcut={queryToolPref.clear_query}
|
<PgMenuItem shortcut={queryToolPref.clear_query}
|
||||||
onClick={clearQuery}>{gettext('Clear Query')}</PgMenuItem>
|
onClick={clearQuery}>{gettext('Clear Query')}</PgMenuItem>
|
||||||
<PgMenuDivider />
|
<PgMenuDivider />
|
||||||
<PgMenuItem shortcut={FIXED_PREF.format_sql}onClick={formatSQL}>{gettext('Format SQL')}</PgMenuItem>
|
<PgMenuItem shortcut={queryToolPref.format_sql}onClick={formatSQL}>{gettext('Format SQL')}</PgMenuItem>
|
||||||
</PgMenu>
|
</PgMenu>
|
||||||
<PgMenu
|
<PgMenu
|
||||||
anchorRef={filterMenuRef}
|
anchorRef={filterMenuRef}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
import { makeStyles } from '@material-ui/styles';
|
import { makeStyles } from '@material-ui/styles';
|
||||||
import React, {useContext, useCallback, useEffect } from 'react';
|
import React, {useContext, useCallback, useEffect, useMemo } from 'react';
|
||||||
import { format } from 'sql-formatter';
|
import { format } from 'sql-formatter';
|
||||||
import { QueryToolContext, QueryToolEventsContext } from '../QueryToolComponent';
|
import { QueryToolContext, QueryToolEventsContext } from '../QueryToolComponent';
|
||||||
import CodeMirror from '../../../../../../static/js/components/ReactCodeMirror';
|
import CodeMirror from '../../../../../../static/js/components/ReactCodeMirror';
|
||||||
@ -17,7 +17,7 @@ import { LayoutDockerContext, LAYOUT_EVENTS } from '../../../../../../static/js/
|
|||||||
import ConfirmSaveContent from '../../../../../../static/js/Dialogs/ConfirmSaveContent';
|
import ConfirmSaveContent from '../../../../../../static/js/Dialogs/ConfirmSaveContent';
|
||||||
import gettext from 'sources/gettext';
|
import gettext from 'sources/gettext';
|
||||||
import { isMac } from '../../../../../../static/js/keyboard_shortcuts';
|
import { isMac } from '../../../../../../static/js/keyboard_shortcuts';
|
||||||
import { checkTrojanSource } from '../../../../../../static/js/utils';
|
import { checkTrojanSource, isShortcutValue, toCodeMirrorKey } from '../../../../../../static/js/utils';
|
||||||
import { parseApiError } from '../../../../../../static/js/api_instance';
|
import { parseApiError } from '../../../../../../static/js/api_instance';
|
||||||
import { usePgAdmin } from '../../../../../../static/js/BrowserComponent';
|
import { usePgAdmin } from '../../../../../../static/js/BrowserComponent';
|
||||||
import ConfirmPromotionContent from '../dialogs/ConfirmPromotionContent';
|
import ConfirmPromotionContent from '../dialogs/ConfirmPromotionContent';
|
||||||
@ -70,6 +70,8 @@ export default function Query() {
|
|||||||
const pgAdmin = usePgAdmin();
|
const pgAdmin = usePgAdmin();
|
||||||
const preferencesStore = usePreferences();
|
const preferencesStore = usePreferences();
|
||||||
|
|
||||||
|
const queryToolPref = queryToolCtx.preferences.sqleditor;
|
||||||
|
|
||||||
const highlightError = (cmObj, {errormsg: result, data})=>{
|
const highlightError = (cmObj, {errormsg: result, data})=>{
|
||||||
let errorLineNo = 0,
|
let errorLineNo = 0,
|
||||||
startMarker = 0,
|
startMarker = 0,
|
||||||
@ -255,38 +257,6 @@ export default function Query() {
|
|||||||
eventBus.registerListener(QUERY_TOOL_EVENTS.TRIGGER_QUERY_CHANGE, ()=>{
|
eventBus.registerListener(QUERY_TOOL_EVENTS.TRIGGER_QUERY_CHANGE, ()=>{
|
||||||
change();
|
change();
|
||||||
});
|
});
|
||||||
eventBus.registerListener(QUERY_TOOL_EVENTS.TRIGGER_FORMAT_SQL, ()=>{
|
|
||||||
let selection = true, sql = editor.current?.getSelection();
|
|
||||||
let sqlEditorPref = preferencesStore.getPreferencesForModule('sqleditor');
|
|
||||||
/* New library does not support capitalize casing
|
|
||||||
so if a user has set capitalize casing we will
|
|
||||||
use preserve casing which is default for the library.
|
|
||||||
*/
|
|
||||||
let formatPrefs = {
|
|
||||||
language: 'postgresql',
|
|
||||||
keywordCase: sqlEditorPref.keyword_case === 'capitalize' ? 'preserve' : sqlEditorPref.keyword_case,
|
|
||||||
identifierCase: sqlEditorPref.identifier_case === 'capitalize' ? 'preserve' : sqlEditorPref.identifier_case,
|
|
||||||
dataTypeCase: sqlEditorPref.data_type_case,
|
|
||||||
functionCase: sqlEditorPref.function_case,
|
|
||||||
logicalOperatorNewline: sqlEditorPref.logical_operator_new_line,
|
|
||||||
expressionWidth: sqlEditorPref.expression_width,
|
|
||||||
linesBetweenQueries: sqlEditorPref.lines_between_queries,
|
|
||||||
tabWidth: sqlEditorPref.tab_size,
|
|
||||||
useTabs: !sqlEditorPref.use_spaces,
|
|
||||||
denseOperators: !sqlEditorPref.spaces_around_operators,
|
|
||||||
newlineBeforeSemicolon: sqlEditorPref.new_line_before_semicolon
|
|
||||||
};
|
|
||||||
if(sql == '') {
|
|
||||||
sql = editor.current.getValue();
|
|
||||||
selection = false;
|
|
||||||
}
|
|
||||||
let formattedSql = format(sql,formatPrefs);
|
|
||||||
if(selection) {
|
|
||||||
editor.current.replaceSelection(formattedSql, 'around');
|
|
||||||
} else {
|
|
||||||
editor.current.setValue(formattedSql);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
eventBus.registerListener(QUERY_TOOL_EVENTS.EDITOR_TOGGLE_CASE, ()=>{
|
eventBus.registerListener(QUERY_TOOL_EVENTS.EDITOR_TOGGLE_CASE, ()=>{
|
||||||
let selectedText = editor.current?.getSelection();
|
let selectedText = editor.current?.getSelection();
|
||||||
if (!selectedText) return;
|
if (!selectedText) return;
|
||||||
@ -334,7 +304,46 @@ export default function Query() {
|
|||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
return eventBus.registerListener(QUERY_TOOL_EVENTS.WARN_SAVE_TEXT_CLOSE, warnSaveTextClose);
|
|
||||||
|
const formatSQL = ()=>{
|
||||||
|
let selection = true, sql = editor.current?.getSelection();
|
||||||
|
/* New library does not support capitalize casing
|
||||||
|
so if a user has set capitalize casing we will
|
||||||
|
use preserve casing which is default for the library.
|
||||||
|
*/
|
||||||
|
let formatPrefs = {
|
||||||
|
language: 'postgresql',
|
||||||
|
keywordCase: queryToolPref.keyword_case === 'capitalize' ? 'preserve' : queryToolPref.keyword_case,
|
||||||
|
identifierCase: queryToolPref.identifier_case === 'capitalize' ? 'preserve' : queryToolPref.identifier_case,
|
||||||
|
dataTypeCase: queryToolPref.data_type_case,
|
||||||
|
functionCase: queryToolPref.function_case,
|
||||||
|
logicalOperatorNewline: queryToolPref.logical_operator_new_line,
|
||||||
|
expressionWidth: queryToolPref.expression_width,
|
||||||
|
linesBetweenQueries: queryToolPref.lines_between_queries,
|
||||||
|
tabWidth: queryToolPref.tab_size,
|
||||||
|
useTabs: !queryToolPref.use_spaces,
|
||||||
|
denseOperators: !queryToolPref.spaces_around_operators,
|
||||||
|
newlineBeforeSemicolon: queryToolPref.new_line_before_semicolon
|
||||||
|
};
|
||||||
|
if(sql == '') {
|
||||||
|
sql = editor.current.getValue();
|
||||||
|
selection = false;
|
||||||
|
}
|
||||||
|
let formattedSql = format(sql,formatPrefs);
|
||||||
|
if(selection) {
|
||||||
|
editor.current.replaceSelection(formattedSql, 'around');
|
||||||
|
} else {
|
||||||
|
editor.current.setValue(formattedSql);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const unregisterFormatSQL = eventBus.registerListener(QUERY_TOOL_EVENTS.TRIGGER_FORMAT_SQL, formatSQL);
|
||||||
|
const unregisterWarn = eventBus.registerListener(QUERY_TOOL_EVENTS.WARN_SAVE_TEXT_CLOSE, warnSaveTextClose);
|
||||||
|
|
||||||
|
return ()=>{
|
||||||
|
unregisterFormatSQL();
|
||||||
|
unregisterWarn();
|
||||||
|
};
|
||||||
}, [queryToolCtx.preferences]);
|
}, [queryToolCtx.preferences]);
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
@ -400,6 +409,33 @@ export default function Query() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const shortcutOverrideKeys = useMemo(
|
||||||
|
()=>{
|
||||||
|
const queryToolPref = queryToolCtx.preferences.sqleditor;
|
||||||
|
return Object.values(queryToolPref)
|
||||||
|
.filter((p)=>isShortcutValue(p))
|
||||||
|
.map((p)=>({
|
||||||
|
key: toCodeMirrorKey(p), run: (_v, e)=>{
|
||||||
|
queryToolCtx.mainContainerRef?.current?.dispatchEvent(new KeyboardEvent('keydown', {
|
||||||
|
which: e.which,
|
||||||
|
keyCode: e.keyCode,
|
||||||
|
altKey: e.altKey,
|
||||||
|
shiftKey: e.shiftKey,
|
||||||
|
ctrlKey: e.ctrlKey,
|
||||||
|
metaKey: e.metaKey,
|
||||||
|
}));
|
||||||
|
if(toCodeMirrorKey(p) == 'Mod-k') {
|
||||||
|
eventBus.fireEvent(QUERY_TOOL_EVENTS.TRIGGER_FORMAT_SQL);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
preventDefault: true,
|
||||||
|
stopPropagation: true,
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
[queryToolCtx.preferences]
|
||||||
|
);
|
||||||
|
|
||||||
return <CodeMirror
|
return <CodeMirror
|
||||||
currEditor={(obj)=>{
|
currEditor={(obj)=>{
|
||||||
editor.current=obj;
|
editor.current=obj;
|
||||||
@ -409,14 +445,6 @@ export default function Query() {
|
|||||||
onCursorActivity={cursorActivity}
|
onCursorActivity={cursorActivity}
|
||||||
onChange={change}
|
onChange={change}
|
||||||
autocomplete={true}
|
autocomplete={true}
|
||||||
customKeyMap={[
|
customKeyMap={shortcutOverrideKeys}
|
||||||
{
|
|
||||||
key: 'Mod-k', run: (_view, e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
eventBus.fireEvent(QUERY_TOOL_EVENTS.TRIGGER_FORMAT_SQL);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
/>;
|
/>;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user