Add button (and keyboard shortcut) to download query (#1817)
This commit is contained in:
parent
afc82845b5
commit
618c5ec0fe
|
@ -22,6 +22,7 @@ import "react-splitter-layout/lib/index.css";
|
||||||
import { format } from "react-string-format";
|
import { format } from "react-string-format";
|
||||||
import QueryCommandIcon from "../../../../images/CopilotCommand.svg";
|
import QueryCommandIcon from "../../../../images/CopilotCommand.svg";
|
||||||
import LaunchCopilot from "../../../../images/CopilotTabIcon.svg";
|
import LaunchCopilot from "../../../../images/CopilotTabIcon.svg";
|
||||||
|
import DownloadQueryIcon from "../../../../images/DownloadQuery.svg";
|
||||||
import CancelQueryIcon from "../../../../images/Entity_cancel.svg";
|
import CancelQueryIcon from "../../../../images/Entity_cancel.svg";
|
||||||
import ExecuteQueryIcon from "../../../../images/ExecuteQuery.svg";
|
import ExecuteQueryIcon from "../../../../images/ExecuteQuery.svg";
|
||||||
import SaveQueryIcon from "../../../../images/save-cosmos.svg";
|
import SaveQueryIcon from "../../../../images/save-cosmos.svg";
|
||||||
|
@ -225,6 +226,20 @@ export default class QueryTabComponent extends React.Component<IQueryTabComponen
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public onDownloadQueryClick = (): void => {
|
||||||
|
const text = this.getCurrentEditorQuery();
|
||||||
|
const queryFile = new File([text], `SavedQuery.txt`, { type: "text/plain" });
|
||||||
|
|
||||||
|
// It appears the most consistent to download a file from a blob is to create an anchor element and simulate clicking it
|
||||||
|
const blobUrl = URL.createObjectURL(queryFile);
|
||||||
|
const anchor = document.createElement("a");
|
||||||
|
anchor.href = blobUrl;
|
||||||
|
anchor.download = queryFile.name;
|
||||||
|
document.body.appendChild(anchor); // Must put the anchor in the document.
|
||||||
|
anchor.click();
|
||||||
|
document.body.removeChild(anchor); // Clean up the anchor.
|
||||||
|
};
|
||||||
|
|
||||||
public onSaveQueryClick = (): void => {
|
public onSaveQueryClick = (): void => {
|
||||||
useSidePanel.getState().openSidePanel("Save Query", <SaveQueryPane explorer={this.props.collection.container} />);
|
useSidePanel.getState().openSidePanel("Save Query", <SaveQueryPane explorer={this.props.collection.container} />);
|
||||||
};
|
};
|
||||||
|
@ -405,15 +420,28 @@ export default class QueryTabComponent extends React.Component<IQueryTabComponen
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.saveQueryButton.visible && configContext.platform !== Platform.Fabric) {
|
if (this.saveQueryButton.visible) {
|
||||||
const label = "Save Query";
|
if (configContext.platform !== Platform.Fabric) {
|
||||||
|
const label = "Save Query";
|
||||||
|
buttons.push({
|
||||||
|
iconSrc: SaveQueryIcon,
|
||||||
|
iconAlt: label,
|
||||||
|
keyboardAction: KeyboardAction.SAVE_ITEM,
|
||||||
|
onCommandClick: this.onSaveQueryClick,
|
||||||
|
commandButtonLabel: label,
|
||||||
|
ariaLabel: label,
|
||||||
|
hasPopup: false,
|
||||||
|
disabled: !this.saveQueryButton.enabled,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
buttons.push({
|
buttons.push({
|
||||||
iconSrc: SaveQueryIcon,
|
iconSrc: DownloadQueryIcon,
|
||||||
iconAlt: label,
|
iconAlt: "Download Query",
|
||||||
keyboardAction: KeyboardAction.SAVE_ITEM,
|
keyboardAction: KeyboardAction.DOWNLOAD_ITEM,
|
||||||
onCommandClick: this.onSaveQueryClick,
|
onCommandClick: this.onDownloadQueryClick,
|
||||||
commandButtonLabel: label,
|
commandButtonLabel: "Download Query",
|
||||||
ariaLabel: label,
|
ariaLabel: "Download Query",
|
||||||
hasPopup: false,
|
hasPopup: false,
|
||||||
disabled: !this.saveQueryButton.enabled,
|
disabled: !this.saveQueryButton.enabled,
|
||||||
});
|
});
|
||||||
|
@ -525,6 +553,8 @@ export default class QueryTabComponent extends React.Component<IQueryTabComponen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.saveQueryButton.enabled = newContent.length > 0;
|
||||||
|
|
||||||
useCommandBar.getState().setContextButtons(this.getTabsButtons());
|
useCommandBar.getState().setContextButtons(this.getTabsButtons());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ export enum KeyboardAction {
|
||||||
EXECUTE_ITEM = "EXECUTE_ITEM",
|
EXECUTE_ITEM = "EXECUTE_ITEM",
|
||||||
CANCEL_OR_DISCARD = "CANCEL_OR_DISCARD",
|
CANCEL_OR_DISCARD = "CANCEL_OR_DISCARD",
|
||||||
SAVE_ITEM = "SAVE_ITEM",
|
SAVE_ITEM = "SAVE_ITEM",
|
||||||
|
DOWNLOAD_ITEM = "DOWNLOAD_ITEM",
|
||||||
OPEN_QUERY = "OPEN_QUERY",
|
OPEN_QUERY = "OPEN_QUERY",
|
||||||
OPEN_QUERY_FROM_DISK = "OPEN_QUERY_FROM_DISK",
|
OPEN_QUERY_FROM_DISK = "OPEN_QUERY_FROM_DISK",
|
||||||
NEW_SPROC = "NEW_SPROC",
|
NEW_SPROC = "NEW_SPROC",
|
||||||
|
@ -57,6 +58,7 @@ const bindings: Record<KeyboardAction, string[]> = {
|
||||||
[KeyboardAction.EXECUTE_ITEM]: ["Shift+Enter", "F5"],
|
[KeyboardAction.EXECUTE_ITEM]: ["Shift+Enter", "F5"],
|
||||||
[KeyboardAction.CANCEL_OR_DISCARD]: ["Escape"],
|
[KeyboardAction.CANCEL_OR_DISCARD]: ["Escape"],
|
||||||
[KeyboardAction.SAVE_ITEM]: ["$mod+S"],
|
[KeyboardAction.SAVE_ITEM]: ["$mod+S"],
|
||||||
|
[KeyboardAction.DOWNLOAD_ITEM]: ["$mod+Shift+S"],
|
||||||
[KeyboardAction.OPEN_QUERY]: ["$mod+O"],
|
[KeyboardAction.OPEN_QUERY]: ["$mod+O"],
|
||||||
[KeyboardAction.OPEN_QUERY_FROM_DISK]: ["$mod+Shift+O"],
|
[KeyboardAction.OPEN_QUERY_FROM_DISK]: ["$mod+Shift+O"],
|
||||||
[KeyboardAction.NEW_SPROC]: ["Alt+N P"],
|
[KeyboardAction.NEW_SPROC]: ["Alt+N P"],
|
||||||
|
|
Loading…
Reference in New Issue