@@ -46,6 +46,10 @@ export interface Yasqe {
4646 off ( eventName : "autocompletionClose" , handler : ( instance : Yasqe ) => void ) : void ;
4747 on ( eventName : "resize" , handler : ( instance : Yasqe , newSize : string ) => void ) : void ;
4848 off ( eventName : "resize" , handler : ( instance : Yasqe , newSize : string ) => void ) : void ;
49+ on ( eventName : "saveManagedQuery" , handler : ( ) => void ) : void ;
50+ off ( eventName : "saveManagedQuery" , handler : ( ) => void ) : void ;
51+ on ( eventName : "downloadRqFile" , handler : ( ) => void ) : void ;
52+ off ( eventName : "downloadRqFile" , handler : ( ) => void ) : void ;
4953 on ( eventName : string , handler : ( ) => void ) : void ;
5054}
5155
@@ -59,7 +63,7 @@ export class Yasqe extends CodeMirror {
5963 private abortController : AbortController | undefined ;
6064 private queryStatus : "valid" | "error" | undefined ;
6165 private queryBtn : HTMLButtonElement | undefined ;
62- private saveBtn : HTMLButtonElement | undefined ;
66+ private saveBtnWrapper : HTMLDivElement | undefined ;
6367 private fullscreenBtn : HTMLButtonElement | undefined ;
6468 private hamburgerBtn : HTMLButtonElement | undefined ;
6569 private hamburgerMenu : HTMLDivElement | undefined ;
@@ -570,24 +574,42 @@ export class Yasqe extends CodeMirror {
570574 }
571575
572576 /**
573- * Draw save button (THIRD)
577+ * Draw save buttons (THIRD)
574578 */
575- const saveBtn = document . createElement ( "button" ) ;
576- addClass ( saveBtn , "yasqe_saveButton" ) ;
577- const saveIcon = document . createElement ( "i" ) ;
578- addClass ( saveIcon , "fas" ) ;
579- addClass ( saveIcon , "fa-save" ) ;
580- saveIcon . setAttribute ( "aria-hidden" , "true" ) ;
581- saveBtn . appendChild ( saveIcon ) ;
582- saveBtn . onclick = ( ) => {
583- // Call the managed query save function if available
579+ const saveBtnWrapper = document . createElement ( "div" ) ;
580+ addClass ( saveBtnWrapper , "yasqe_saveWrapper" ) ;
581+ saveBtnWrapper . style . display = "none" ; // Hidden by default, shown when workspace is configured
582+ this . saveBtnWrapper = saveBtnWrapper ;
583+
584+ const saveManagedBtn = document . createElement ( "button" ) ;
585+ addClass ( saveManagedBtn , "yasqe_saveManagedButton" ) ;
586+ const saveManagedIcon = document . createElement ( "i" ) ;
587+ addClass ( saveManagedIcon , "fas" ) ;
588+ addClass ( saveManagedIcon , "fa-database" ) ;
589+ saveManagedIcon . setAttribute ( "aria-hidden" , "true" ) ;
590+ saveManagedBtn . appendChild ( saveManagedIcon ) ;
591+ saveManagedBtn . title = "Save as managed query" ;
592+ saveManagedBtn . setAttribute ( "aria-label" , "Save as managed query" ) ;
593+ saveManagedBtn . onclick = ( ) => {
584594 this . emit ( "saveManagedQuery" ) ;
585595 } ;
586- saveBtn . title = "Save managed query (Ctrl+S)" ;
587- saveBtn . setAttribute ( "aria-label" , "Save managed query" ) ;
588- saveBtn . style . display = "none" ; // Hidden by default, shown when workspace is configured
589- this . saveBtn = saveBtn ;
590- buttons . appendChild ( saveBtn ) ;
596+ saveBtnWrapper . appendChild ( saveManagedBtn ) ;
597+
598+ const saveRqBtn = document . createElement ( "button" ) ;
599+ addClass ( saveRqBtn , "yasqe_saveRqButton" ) ;
600+ const saveRqIcon = document . createElement ( "i" ) ;
601+ addClass ( saveRqIcon , "fas" ) ;
602+ addClass ( saveRqIcon , "fa-file-download" ) ;
603+ saveRqIcon . setAttribute ( "aria-hidden" , "true" ) ;
604+ saveRqBtn . appendChild ( saveRqIcon ) ;
605+ saveRqBtn . title = "Save as .rq file" ;
606+ saveRqBtn . setAttribute ( "aria-label" , "Save as .rq file" ) ;
607+ saveRqBtn . onclick = ( ) => {
608+ this . emit ( "downloadRqFile" ) ;
609+ } ;
610+ saveBtnWrapper . appendChild ( saveRqBtn ) ;
611+
612+ buttons . appendChild ( saveBtnWrapper ) ;
591613
592614 /**
593615 * Draw format btn (FOURTH)
@@ -671,21 +693,37 @@ export class Yasqe extends CodeMirror {
671693 this . hamburgerMenu . appendChild ( shareItem ) ;
672694 }
673695
674- const saveItem = document . createElement ( "button" ) ;
675- saveItem . className = "yasqe_hamburgerMenuItem" ;
676- const saveIconMenu = document . createElement ( "i" ) ;
677- addClass ( saveIconMenu , "fas" ) ;
678- addClass ( saveIconMenu , "fa-save " ) ;
679- saveIconMenu . setAttribute ( "aria-hidden" , "true" ) ;
680- saveItem . appendChild ( saveIconMenu ) ;
681- const saveLabel = document . createElement ( "span" ) ;
682- saveLabel . textContent = "Save" ;
683- saveItem . appendChild ( saveLabel ) ;
684- saveItem . onclick = ( ) => {
696+ const saveManagedItem = document . createElement ( "button" ) ;
697+ saveManagedItem . className = "yasqe_hamburgerMenuItem" ;
698+ const saveManagedIconMenu = document . createElement ( "i" ) ;
699+ addClass ( saveManagedIconMenu , "fas" ) ;
700+ addClass ( saveManagedIconMenu , "fa-database " ) ;
701+ saveManagedIconMenu . setAttribute ( "aria-hidden" , "true" ) ;
702+ saveManagedItem . appendChild ( saveManagedIconMenu ) ;
703+ const saveManagedLabel = document . createElement ( "span" ) ;
704+ saveManagedLabel . textContent = "Save as managed query " ;
705+ saveManagedItem . appendChild ( saveManagedLabel ) ;
706+ saveManagedItem . onclick = ( ) => {
685707 this . closeHamburgerMenu ( ) ;
686708 this . emit ( "saveManagedQuery" ) ;
687709 } ;
688- this . hamburgerMenu . appendChild ( saveItem ) ;
710+ this . hamburgerMenu . appendChild ( saveManagedItem ) ;
711+
712+ const saveRqItem = document . createElement ( "button" ) ;
713+ saveRqItem . className = "yasqe_hamburgerMenuItem" ;
714+ const saveRqIconMenu = document . createElement ( "i" ) ;
715+ addClass ( saveRqIconMenu , "fas" ) ;
716+ addClass ( saveRqIconMenu , "fa-file-download" ) ;
717+ saveRqIconMenu . setAttribute ( "aria-hidden" , "true" ) ;
718+ saveRqItem . appendChild ( saveRqIconMenu ) ;
719+ const saveRqLabel = document . createElement ( "span" ) ;
720+ saveRqLabel . textContent = "Save as .rq file" ;
721+ saveRqItem . appendChild ( saveRqLabel ) ;
722+ saveRqItem . onclick = ( ) => {
723+ this . closeHamburgerMenu ( ) ;
724+ this . emit ( "downloadRqFile" ) ;
725+ } ;
726+ this . hamburgerMenu . appendChild ( saveRqItem ) ;
689727
690728 if ( this . config . showFormatButton ) {
691729 const formatItem = document . createElement ( "button" ) ;
@@ -1553,8 +1591,8 @@ export class Yasqe extends CodeMirror {
15531591 }
15541592
15551593 public setSaveButtonVisible ( visible : boolean ) {
1556- if ( this . saveBtn ) {
1557- this . saveBtn . style . display = visible ? "inline-flex" : "none" ;
1594+ if ( this . saveBtnWrapper ) {
1595+ this . saveBtnWrapper . style . display = visible ? "inline-flex" : "none" ;
15581596 }
15591597 }
15601598
0 commit comments