mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-04 02:51:38 -05:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b17882a1c1 | ||
|
|
f309979126 | ||
|
|
5a0490e81f |
@@ -2,7 +2,7 @@
|
|||||||
"name": "agent",
|
"name": "agent",
|
||||||
"displayName": "SQL Server Agent",
|
"displayName": "SQL Server Agent",
|
||||||
"description": "Manage and troubleshoot SQL Server Agent jobs",
|
"description": "Manage and troubleshoot SQL Server Agent jobs",
|
||||||
"version": "0.33.0",
|
"version": "0.34.0",
|
||||||
"publisher": "Microsoft",
|
"publisher": "Microsoft",
|
||||||
"preview": true,
|
"preview": true,
|
||||||
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt",
|
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "import",
|
"name": "import",
|
||||||
"displayName": "SQL Server Import",
|
"displayName": "SQL Server Import",
|
||||||
"description": "SQL Server Import for Azure Data Studio supports importing CSV or JSON files into SQL Server.",
|
"description": "SQL Server Import for Azure Data Studio supports importing CSV or JSON files into SQL Server.",
|
||||||
"version": "0.2.0",
|
"version": "0.3.0",
|
||||||
"publisher": "Microsoft",
|
"publisher": "Microsoft",
|
||||||
"preview": true,
|
"preview": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
@@ -71,6 +71,13 @@ export class TreeDataTemplate extends Disposable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public set enableCheckbox(value: boolean) {
|
||||||
|
if (value === undefined) {
|
||||||
|
value = true;
|
||||||
|
}
|
||||||
|
this._checkbox.disabled = !value;
|
||||||
|
}
|
||||||
|
|
||||||
public get checkbox(): HTMLInputElement {
|
public get checkbox(): HTMLInputElement {
|
||||||
return this._checkbox;
|
return this._checkbox;
|
||||||
}
|
}
|
||||||
@@ -155,6 +162,7 @@ export class TreeComponentRenderer extends Disposable implements IRenderer {
|
|||||||
templateData.label.textContent = label;
|
templateData.label.textContent = label;
|
||||||
templateData.root.title = label;
|
templateData.root.title = label;
|
||||||
templateData.checkboxState = this.getCheckboxState(treeNode);
|
templateData.checkboxState = this.getCheckboxState(treeNode);
|
||||||
|
templateData.enableCheckbox = treeNode.enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
private getCheckboxState(treeNode: ITreeComponentItem): TreeCheckboxState {
|
private getCheckboxState(treeNode: ITreeComponentItem): TreeCheckboxState {
|
||||||
|
|||||||
@@ -74,8 +74,9 @@ export class MessagePanelState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class MessagePanel extends ViewletPanel {
|
export class MessagePanel extends ViewletPanel {
|
||||||
|
private messageLineCountMap = new Map<IResultMessage, number>();
|
||||||
private ds = new MessageDataSource();
|
private ds = new MessageDataSource();
|
||||||
private renderer = new MessageRenderer();
|
private renderer = new MessageRenderer(this.messageLineCountMap);
|
||||||
private model = new Model();
|
private model = new Model();
|
||||||
private controller: MessageController;
|
private controller: MessageController;
|
||||||
private container = $('div message-tree').getHTMLElement();
|
private container = $('div message-tree').getHTMLElement();
|
||||||
@@ -143,29 +144,40 @@ export class MessagePanel extends ViewletPanel {
|
|||||||
|
|
||||||
private onMessage(message: IResultMessage | IResultMessage[]) {
|
private onMessage(message: IResultMessage | IResultMessage[]) {
|
||||||
let hasError = false;
|
let hasError = false;
|
||||||
|
let lines: number;
|
||||||
if (isArray(message)) {
|
if (isArray(message)) {
|
||||||
hasError = message.find(e => e.isError) ? true : false;
|
hasError = message.find(e => e.isError) ? true : false;
|
||||||
|
lines = message.reduce((currentTotal, resultMessage) => currentTotal + this.countMessageLines(resultMessage), 0);
|
||||||
this.model.messages.push(...message);
|
this.model.messages.push(...message);
|
||||||
} else {
|
} else {
|
||||||
hasError = message.isError;
|
hasError = message.isError;
|
||||||
|
lines = this.countMessageLines(message);
|
||||||
this.model.messages.push(message);
|
this.model.messages.push(message);
|
||||||
}
|
}
|
||||||
|
this.maximumBodySize += lines * 22;
|
||||||
if (hasError) {
|
if (hasError) {
|
||||||
this.setExpanded(true);
|
this.setExpanded(true);
|
||||||
}
|
}
|
||||||
if (this.state.scrollPosition) {
|
if (this.state.scrollPosition) {
|
||||||
this.tree.refresh(this.model).then(() => {
|
this.tree.refresh(this.model).then(() => {
|
||||||
this.tree.setScrollPosition(1);
|
// Restore the previous scroll position when switching between tabs
|
||||||
|
this.tree.setScrollPosition(this.state.scrollPosition);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
const previousScrollPosition = this.tree.getScrollPosition();
|
const previousScrollPosition = this.tree.getScrollPosition();
|
||||||
this.tree.refresh(this.model).then(() => {
|
this.tree.refresh(this.model).then(() => {
|
||||||
|
// Scroll to the end if the user was already at the end otherwise leave the current scroll position
|
||||||
if (previousScrollPosition === 1) {
|
if (previousScrollPosition === 1) {
|
||||||
this.tree.setScrollPosition(1);
|
this.tree.setScrollPosition(1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.maximumBodySize = this.model.messages.length * 22;
|
}
|
||||||
|
|
||||||
|
private countMessageLines(resultMessage: IResultMessage): number {
|
||||||
|
let lines = resultMessage.message.split('\n').length;
|
||||||
|
this.messageLineCountMap.set(resultMessage, lines);
|
||||||
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
private reset() {
|
private reset() {
|
||||||
@@ -220,8 +232,15 @@ class MessageDataSource implements IDataSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class MessageRenderer implements IRenderer {
|
class MessageRenderer implements IRenderer {
|
||||||
|
constructor(private messageLineCountMap: Map<IResultMessage, number>) {
|
||||||
|
}
|
||||||
|
|
||||||
getHeight(tree: ITree, element: any): number {
|
getHeight(tree: ITree, element: any): number {
|
||||||
return 22;
|
const lineHeight = 22;
|
||||||
|
if (this.messageLineCountMap.has(element)) {
|
||||||
|
return lineHeight * this.messageLineCountMap.get(element);
|
||||||
|
}
|
||||||
|
return lineHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTemplateId(tree: ITree, element: any): string {
|
getTemplateId(tree: ITree, element: any): string {
|
||||||
@@ -258,7 +277,7 @@ class MessageRenderer implements IRenderer {
|
|||||||
renderElement(tree: ITree, element: IResultMessage, templateId: string, templateData: IMessageTemplate | IBatchTemplate): void {
|
renderElement(tree: ITree, element: IResultMessage, templateId: string, templateData: IMessageTemplate | IBatchTemplate): void {
|
||||||
if (templateId === TemplateIds.MESSAGE || templateId === TemplateIds.ERROR) {
|
if (templateId === TemplateIds.MESSAGE || templateId === TemplateIds.ERROR) {
|
||||||
let data: IMessageTemplate = templateData;
|
let data: IMessageTemplate = templateData;
|
||||||
data.message.innerText = element.message.replace(/(\r\n|\n|\r)/g, ' ');
|
data.message.innerText = element.message;
|
||||||
} else if (templateId === TemplateIds.BATCH) {
|
} else if (templateId === TemplateIds.BATCH) {
|
||||||
let data = templateData as IBatchTemplate;
|
let data = templateData as IBatchTemplate;
|
||||||
data.timeStamp.innerText = element.time;
|
data.timeStamp.innerText = element.time;
|
||||||
|
|||||||
1
src/sql/sqlops.proposed.d.ts
vendored
1
src/sql/sqlops.proposed.d.ts
vendored
@@ -58,6 +58,7 @@ declare module 'sqlops' {
|
|||||||
|
|
||||||
export class TreeComponentItem extends vscode.TreeItem {
|
export class TreeComponentItem extends vscode.TreeItem {
|
||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
|
enabled?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ComponentBuilder<T extends Component> {
|
export interface ComponentBuilder<T extends Component> {
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ export class ExtHostTreeView<T> extends vsTreeExt.ExtHostTreeView<T> {
|
|||||||
|
|
||||||
protected createTreeItem(element: T, extensionTreeItem: sqlops.TreeComponentItem, parent?: vsTreeExt.TreeNode): ITreeComponentItem {
|
protected createTreeItem(element: T, extensionTreeItem: sqlops.TreeComponentItem, parent?: vsTreeExt.TreeNode): ITreeComponentItem {
|
||||||
let item = super.createTreeItem(element, extensionTreeItem, parent);
|
let item = super.createTreeItem(element, extensionTreeItem, parent);
|
||||||
item = Object.assign({}, item, { checked: extensionTreeItem.checked });
|
item = Object.assign({}, item, { checked: extensionTreeItem.checked, enabled: extensionTreeItem.enabled });
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ import { ITreeViewDataProvider, ITreeItem } from 'vs/workbench/common/views';
|
|||||||
|
|
||||||
export interface ITreeComponentItem extends ITreeItem {
|
export interface ITreeComponentItem extends ITreeItem {
|
||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
|
enabled?: boolean;
|
||||||
onCheckedChanged?: (checked: boolean) => void;
|
onCheckedChanged?: (checked: boolean) => void;
|
||||||
children?: ITreeComponentItem[];
|
children?: ITreeComponentItem[];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user