1717 >
1818 DDL
1919 </button >
20+ <span v-if =" selectedText" class =" separator" >|</span >
21+ <button
22+ v-if =" selectedText"
23+ @click =" runSelectedText"
24+ class =" preview-selection-btn"
25+ >
26+ Preview selection
27+ </button >
2028 </div >
2129 <div class =" flex items-center" >
2230 <!-- BigQuery Cost Estimate (success and error) -->
100108 </div >
101109 </div >
102110 <!-- Code Editor -->
103- <div id =" sql-editor" class =" code-container pb-0" >
111+ <div id =" sql-editor" class =" code-container pb-0" @mouseup = " handleTextSelection " >
104112 <div class =" copy-button-wrapper" >
105113 <vscode-button
106114 @click =" copyToClipboard"
@@ -176,6 +184,7 @@ const clickOpened = ref(false);
176184const showCostError = ref (false );
177185const isErrorSticky = ref (false );
178186const errorIcon = ref (null );
187+ const selectedText = ref (' ' );
179188
180189const vClickOutside = {
181190 mounted (el , binding ) {
@@ -199,6 +208,36 @@ function copyToClipboard() {
199208 }, 2000 );
200209}
201210
211+ // Handle text selection in the code editor
212+ function handleTextSelection () {
213+ const selection = window .getSelection ();
214+ let text = selection? .toString ().trim () || ' ' ;
215+
216+ // Remove line numbers that get included in selection
217+ // Line numbers appear as standalone numbers on their own line when selected
218+ if (text) {
219+ text = text
220+ .split (' \n ' )
221+ .filter (line => ! / ^ \d + $ / .test (line .trim ())) // Remove lines that are just numbers (line numbers)
222+ .join (' \n ' )
223+ .trim ();
224+ }
225+
226+ selectedText .value = text;
227+ }
228+
229+ // Run selected text in Query Preview panel
230+ function runSelectedText () {
231+ if (! selectedText .value ) return ;
232+
233+ vscode .postMessage ({
234+ command: ' bruin.runSelectedInPreview' ,
235+ payload: {
236+ query: selectedText .value
237+ }
238+ });
239+ }
240+
202241const lineHeight = 18 ;
203242const editorPadding = 12 ;
204243const minEditorHeight = ` ${ lineHeight * 2 } px` ;
@@ -402,14 +441,25 @@ const handleMessage = (event) => {
402441 }
403442};
404443
444+ // Handle selection change to clear when deselected
445+ function handleSelectionChange () {
446+ const selection = window .getSelection ();
447+ const text = selection? .toString ().trim () || ' ' ;
448+ if (! text) {
449+ selectedText .value = ' ' ;
450+ }
451+ }
452+
405453// Setup message listeners
406454onMounted (() => {
407455 window .addEventListener (' message' , handleMessage);
456+ document .addEventListener (' selectionchange' , handleSelectionChange);
408457 console .log (' SqlEditor: Message listener added' );
409458});
410459
411460onBeforeUnmount (() => {
412461 window .removeEventListener (' message' , handleMessage);
462+ document .removeEventListener (' selectionchange' , handleSelectionChange);
413463 console .log (' SqlEditor: Message listener removed' );
414464});
415465
@@ -459,6 +509,26 @@ watch(
459509 background- color: var (-- vscode- list- hoverBackground);
460510}
461511
512+ .separator {
513+ color: var (-- vscode- disabledForeground);
514+ font- size: 12px ;
515+ margin: 0 4px ;
516+ }
517+
518+ .preview - selection- btn {
519+ background: transparent;
520+ border: none;
521+ color: var (-- vscode- textLink- foreground);
522+ font- size: 12px ;
523+ font- family: var (-- vscode- font- family);
524+ cursor: pointer;
525+ padding: 4px 0 ;
526+ }
527+
528+ .preview - selection- btn: hover {
529+ color: var (-- vscode- textLink- activeForeground);
530+ }
531+
462532#sql- editor,
463533.python - content {
464534 background- color: var (-- vscode- sideBar- background);
0 commit comments