Merge branch 'appbuilder/sprint-12' of https://github.com/ToolJet/ToolJet into appbuilder/sprint-12

This commit is contained in:
johnsoncherian 2025-05-16 17:15:10 +05:30
commit 583dcc5779
6 changed files with 38 additions and 33 deletions

View file

@ -0,0 +1,27 @@
/* eslint-disable import/no-unresolved */
import React from 'react';
import { openSearchPanel } from '@codemirror/search';
import './SearchBox.scss';
import { Button as ButtonComponent } from '@/components/ui/Button/Button.jsx';
export const CodeHinterBtns = ({ view, isPanelOpen, renderCopilot }) => {
return (
<div
className="d-flex tw-flex-col align-items-end tw-gap-[2.5px] w-100 position-absolute tw-pt-[4px] tw-pr-[4px]"
style={{ top: isPanelOpen ? '44px' : 0 }}
>
{!isPanelOpen && (
<ButtonComponent
iconOnly
trailingIcon="search01"
size="small"
variant="outline"
ariaLabel="Open search panel"
className="codehinter-search-btn"
onClick={() => openSearchPanel(view)}
/>
)}
{renderCopilot && renderCopilot()}
</div>
);
};

View file

@ -21,9 +21,10 @@ import { removeNestedDoubleCurlyBraces } from '@/_helpers/utils';
import useStore from '@/AppBuilder/_stores/store'; import useStore from '@/AppBuilder/_stores/store';
import { shallow } from 'zustand/shallow'; import { shallow } from 'zustand/shallow';
import { search, searchKeymap, searchPanelOpen } from '@codemirror/search'; import { search, searchKeymap, searchPanelOpen } from '@codemirror/search';
import { handleSearchPanel, SearchBtn } from './SearchBox'; import { handleSearchPanel } from './SearchBox';
import { useQueryPanelKeyHooks } from './useQueryPanelKeyHooks'; import { useQueryPanelKeyHooks } from './useQueryPanelKeyHooks';
import { isInsideParent } from './utils'; import { isInsideParent } from './utils';
import { CodeHinterBtns } from './CodehinterOverlayTriggers';
const langSupport = Object.freeze({ const langSupport = Object.freeze({
javascript: javascript(), javascript: javascript(),
@ -74,6 +75,7 @@ const MultiLineCodeEditor = (props) => {
const [editorView, setEditorView] = React.useState(null); const [editorView, setEditorView] = React.useState(null);
const [isSearchPanelOpen, setIsSearchPanelOpen] = React.useState(false);
const { queryPanelKeybindings } = useQueryPanelKeyHooks(onChange, currentValueRef, 'multiline'); const { queryPanelKeybindings } = useQueryPanelKeyHooks(onChange, currentValueRef, 'multiline');
const handleOnBlur = () => { const handleOnBlur = () => {
@ -258,7 +260,7 @@ const MultiLineCodeEditor = (props) => {
ref={wrapperRef} ref={wrapperRef}
> >
<div className={`${className} ${darkMode && 'cm-codehinter-dark-themed'}`}> <div className={`${className} ${darkMode && 'cm-codehinter-dark-themed'}`}>
<SearchBtn view={editorView} /> <CodeHinterBtns view={editorView} isPanelOpen={isSearchPanelOpen} renderCopilot={renderCopilot} />
<CodeHinter.PopupIcon <CodeHinter.PopupIcon
callback={handleTogglePopupExapand} callback={handleTogglePopupExapand}
icon="portal-open" icon="portal-open"
@ -266,7 +268,6 @@ const MultiLineCodeEditor = (props) => {
isMultiEditor={true} isMultiEditor={true}
isQueryManager={isInsideQueryPane} isQueryManager={isInsideQueryPane}
/> />
{renderCopilot && renderCopilot()}
<CodeHinter.Portal <CodeHinter.Portal
isCopilotEnabled={false} isCopilotEnabled={false}
@ -326,12 +327,7 @@ const MultiLineCodeEditor = (props) => {
readOnly={readOnly} readOnly={readOnly}
editable={editable} //for transformations in query manager editable={editable} //for transformations in query manager
onCreateEditor={(view) => setEditorView(view)} onCreateEditor={(view) => setEditorView(view)}
onUpdate={(view) => { onUpdate={(view) => setIsSearchPanelOpen(searchPanelOpen(view.state))}
const icon = document.querySelector('.codehinter-search-btn');
if (searchPanelOpen(view.state)) {
icon.style.display = 'none';
} else icon.style.display = 'block';
}}
/> />
</div> </div>
{showPreview && ( {showPreview && (

View file

@ -9,7 +9,6 @@ import {
findPrevious, findPrevious,
replaceNext, replaceNext,
replaceAll, replaceAll,
openSearchPanel,
} from '@codemirror/search'; } from '@codemirror/search';
import './SearchBox.scss'; import './SearchBox.scss';
import InputComponent from '@/components/ui/Input/Index.jsx'; import InputComponent from '@/components/ui/Input/Index.jsx';
@ -162,22 +161,3 @@ function SearchPanel({ view }) {
</div> </div>
); );
} }
export const SearchBtn = ({ view }) => {
return (
<div
className="d-flex justify-content-end w-100 position-absolute tw-pt-[3px] tw-pr-[4px] codehinter-search-btn-wrapper"
style={{ top: 0 }}
>
<ButtonComponent
iconOnly
trailingIcon="search01"
size="small"
variant="outline"
ariaLabel="Open search panel"
className="codehinter-search-btn"
onClick={() => openSearchPanel(view)}
/>
</div>
);
};

View file

@ -44,7 +44,5 @@
} }
.code-hinter-wrapper .codehinter-search-btn { .code-hinter-wrapper .codehinter-search-btn {
display: block; z-index: 1000;
padding-top: 1px;
z-index: 10000;
} }

View file

@ -18381,6 +18381,10 @@ section.ai-message-prompt-input-wrapper {
} }
} }
.codehinter-copilot-btn {
z-index: 1000;
}
#copilot-menu { #copilot-menu {
width: 440px; width: 440px;
max-width: 440px; max-width: 440px;

View file

@ -33,7 +33,7 @@ const Input = React.forwardRef(({ className, size, type, multiline, response, ro
type={isPasswordField && isPasswordVisible ? 'text' : type} type={isPasswordField && isPasswordVisible ? 'text' : type}
className={cn( className={cn(
inputVariants({ size }), inputVariants({ size }),
`tw-relative tw-peer tw-flex tw-text-[12px]/[18px] tw-w-full tw-rounded-[8px] tw-border-[1px] tw-border-solid tw-bg-background-surface-layer-01 tw-py-[7px] tw-text-text-default focus-visible:tw-ring-[1px] focus-visible:tw-ring-offset-[1px] focus-visible:tw-ring-border-accent-strong focus-visible:tw-ring-offset-border-accent-strong focus-visible:tw-border-transparent disabled:tw-cursor-not-allowed ${props.styles}`, `tw-peer tw-flex tw-text-[12px]/[18px] tw-w-full tw-rounded-[8px] tw-border-[1px] tw-border-solid tw-bg-background-surface-layer-01 tw-py-[7px] tw-text-text-default focus-visible:tw-ring-[1px] focus-visible:tw-ring-offset-[1px] focus-visible:tw-ring-border-accent-strong focus-visible:tw-ring-offset-border-accent-strong focus-visible:tw-border-transparent disabled:tw-cursor-not-allowed ${props.styles}`,
className className
)} )}
ref={ref} ref={ref}