Strict null check on full "base" code (#4973)

* removes more builder references

* remove builder from profiler

* formatting

* fix profiler dailog

* remove builder from oatuhdialog

* remove the rest of builder references

* formatting

* add more strict null checks to base
This commit is contained in:
Anthony Dresser
2019-04-12 12:59:58 -07:00
committed by GitHub
parent cb1682542b
commit 92b1c59e48
14 changed files with 157 additions and 180 deletions

View File

@@ -32,16 +32,16 @@ export class HeightMap {
} }
public onInsertItems(iterator: INextIterator<IViewItem>, afterItemId: string | undefined = undefined): number | undefined { public onInsertItems(iterator: INextIterator<IViewItem>, afterItemId: string | undefined = undefined): number | undefined {
let viewItem: IViewItem | undefined = undefined; let viewItem: IViewItem | null = null;
let i: number, j: number; let i: number, j: number;
let totalSize: number; let totalSize: number;
let sizeDiff = 0; let sizeDiff = 0;
if (afterItemId === undefined) { if (afterItemId === null) {
i = 0; i = 0;
totalSize = 0; totalSize = 0;
} else { } else {
i = this.indexes[afterItemId] + 1; i = this.indexes[afterItemId!] + 1;
viewItem = this.heightMap[i - 1]; viewItem = this.heightMap[i - 1];
if (!viewItem) { if (!viewItem) {
@@ -59,7 +59,7 @@ export class HeightMap {
while (viewItem = iterator.next()) { while (viewItem = iterator.next()) {
viewItem.top = totalSize + sizeDiff; viewItem.top = totalSize + sizeDiff;
this.indexes[viewItem.view.id] = i++; this.indexes[viewItem.view.id!] = i++;
itemsToInsert.push(viewItem); itemsToInsert.push(viewItem);
sizeDiff += viewItem.height; sizeDiff += viewItem.height;
} }
@@ -69,7 +69,7 @@ export class HeightMap {
for (j = i; j < this.heightMap.length; j++) { for (j = i; j < this.heightMap.length; j++) {
viewItem = this.heightMap[j]; viewItem = this.heightMap[j];
viewItem.top += sizeDiff; viewItem.top += sizeDiff;
this.indexes[viewItem.view.id] = j; this.indexes[viewItem.view.id!] = j;
} }
for (j = itemsToInsert.length - 1; j >= 0; j--) { for (j = itemsToInsert.length - 1; j >= 0; j--) {
@@ -89,7 +89,7 @@ export class HeightMap {
// Contiguous items // Contiguous items
public onRemoveItems(iterator: INextIterator<string>): void { public onRemoveItems(iterator: INextIterator<string>): void {
let itemId: string | undefined = undefined; let itemId: string | null = null;
let viewItem: IViewItem; let viewItem: IViewItem;
let startIndex: number | undefined = undefined; let startIndex: number | undefined = undefined;
let i = 0; let i = 0;
@@ -122,7 +122,7 @@ export class HeightMap {
for (i = startIndex; i < this.heightMap.length; i++) { for (i = startIndex; i < this.heightMap.length; i++) {
viewItem = this.heightMap[i]; viewItem = this.heightMap[i];
viewItem.top += sizeDiff; viewItem.top += sizeDiff;
this.indexes[viewItem.view.id] = i; this.indexes[viewItem.view.id!] = i;
this.onRefreshItem(viewItem); this.onRefreshItem(viewItem);
} }
} }
@@ -156,14 +156,14 @@ export class HeightMap {
} }
public itemAt(position: number): string { public itemAt(position: number): string {
return this.heightMap[this.indexAt(position)].view.id; return this.heightMap[this.indexAt(position)].view.id!;
} }
public withItemsInRange(start: number, end: number, fn: (item: string) => void): void { public withItemsInRange(start: number, end: number, fn: (item: string) => void): void {
start = this.indexAt(start); start = this.indexAt(start);
end = this.indexAt(end); end = this.indexAt(end);
for (let i = start; i <= end; i++) { for (let i = start; i <= end; i++) {
fn(this.heightMap[i].view.id); fn(this.heightMap[i].view.id!);
} }
} }
@@ -202,11 +202,11 @@ export class HeightMap {
} }
public itemAfter(item: IViewItem): IViewItem | undefined { public itemAfter(item: IViewItem): IViewItem | undefined {
return this.heightMap[this.indexes[item.view.id] + 1] || undefined; return this.heightMap[this.indexes[item.view.id!] + 1] || undefined;
} }
public dispose(): void { public dispose(): void {
this.heightMap = undefined; this.heightMap = [];
this.indexes = undefined; this.indexes = {};
} }
} }

View File

@@ -239,12 +239,12 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
if (container.parentElement) { if (container.parentElement) {
this.viewContainer.removeChild(container); this.viewContainer.removeChild(container);
} }
this.onRemoveItems(new ArrayIterator([item.view.id])); this.onRemoveItems(new ArrayIterator([item.view.id!]));
}); });
const disposable = combinedDisposable([onChangeDisposable, containerDisposable]); const disposable = combinedDisposable([onChangeDisposable, containerDisposable]);
const onAdd = view.onAdd ? () => view.onAdd() : () => { }; const onAdd = view.onAdd ? () => view.onAdd!() : () => { };
const onRemove = view.onRemove ? () => view.onRemove() : () => { }; const onRemove = view.onRemove ? () => view.onRemove!() : () => { };
const layoutContainer = this.orientation === Orientation.VERTICAL const layoutContainer = this.orientation === Orientation.VERTICAL
? () => item.container.style.height = `${item.size}px` ? () => item.container.style.height = `${item.size}px`
@@ -342,12 +342,12 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
if (container.parentElement) { if (container.parentElement) {
this.viewContainer.removeChild(container); this.viewContainer.removeChild(container);
} }
this.onRemoveItems(new ArrayIterator([item.view.id])); this.onRemoveItems(new ArrayIterator([item.view.id!]));
}); });
const disposable = combinedDisposable([onChangeDisposable, containerDisposable]); const disposable = combinedDisposable([onChangeDisposable, containerDisposable]);
const onAdd = view.onAdd ? () => view.onAdd() : () => { }; const onAdd = view.onAdd ? () => view.onAdd!() : () => { };
const onRemove = view.onRemove ? () => view.onRemove() : () => { }; const onRemove = view.onRemove ? () => view.onRemove!() : () => { };
const layoutContainer = this.orientation === Orientation.VERTICAL const layoutContainer = this.orientation === Orientation.VERTICAL
? () => item.container.style.height = `${item.size}px` ? () => item.container.style.height = `${item.size}px`
@@ -610,11 +610,11 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
this.layoutViews(); this.layoutViews();
} else { } else {
item.size = size; item.size = size;
this.updateSize(item.view.id, size); this.updateSize(item.view.id!, size);
let top = item.top + item.size; let top = item.top + item.size;
for (let i = index + 1; i < this.viewItems.length; i++) { for (let i = index + 1; i < this.viewItems.length; i++) {
let currentItem = this.viewItems[i]; let currentItem = this.viewItems[i];
this.updateTop(currentItem.view.id, top); this.updateTop(currentItem.view.id!, top);
top += currentItem.size; top += currentItem.size;
} }
this.relayout(index); this.relayout(index);

View File

@@ -33,7 +33,7 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
this._$container = jQuery(this._grid.getContainerNode()); this._$container = jQuery(this._grid.getContainerNode());
this._$container.on('dblclick.autosize', '.slick-resizable-handle', e => this.handleDoubleClick(e)); this._$container.on('dblclick.autosize', '.slick-resizable-handle', e => this.handleDoubleClick(e));
this._context = document.createElement('canvas').getContext('2d'); this._context = document.createElement('canvas').getContext('2d')!;
} }
public destroy() { public destroy() {
@@ -78,7 +78,7 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
}); });
let change = false; let change = false;
for (let i = 0; i <= headerColumns.children.length; i++) { for (let i = 0; i <= headerColumns.children.length; i++) {
let headerEl = jQuery(headerColumns.children.item(i)); let headerEl = jQuery(headerColumns.children.item(i)!);
let columnDef = headerEl.data('column'); let columnDef = headerEl.data('column');
if (columnDef) { if (columnDef) {
let headerWidth = this.getElementWidth(headerEl[0]); let headerWidth = this.getElementWidth(headerEl[0]);
@@ -115,7 +115,7 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
private reSizeColumn(headerEl: JQuery, columnDef: Slick.Column<T>) { private reSizeColumn(headerEl: JQuery, columnDef: Slick.Column<T>) {
let headerWidth = this.getElementWidth(headerEl[0]); let headerWidth = this.getElementWidth(headerEl[0]);
let colIndex = this._grid.getColumnIndex(columnDef.id); let colIndex = this._grid.getColumnIndex(columnDef.id!);
let origCols = this._grid.getColumns(); let origCols = this._grid.getColumns();
let allColumns = clone(origCols); let allColumns = clone(origCols);
allColumns.forEach((col, index) => { allColumns.forEach((col, index) => {
@@ -134,7 +134,7 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
} }
private getMaxColumnTextWidth(columnDef, colIndex: number): number { private getMaxColumnTextWidth(columnDef, colIndex: number): number {
let texts = []; let texts: Array<string> = [];
let rowEl = this.createRow(columnDef); let rowEl = this.createRow(columnDef);
let data = this._grid.getData(); let data = this._grid.getData();
let viewPort = this._grid.getViewport(); let viewPort = this._grid.getViewport();
@@ -146,7 +146,7 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
let template = this.getMaxTextTemplate(texts, columnDef, colIndex, data, rowEl); let template = this.getMaxTextTemplate(texts, columnDef, colIndex, data, rowEl);
let width = this.getTemplateWidth(rowEl, template); let width = this.getTemplateWidth(rowEl, template);
this.deleteRow(rowEl); this.deleteRow(rowEl);
return width > this._options.maxWidth ? this._options.maxWidth : width; return width > this._options.maxWidth! ? this._options.maxWidth! : width;
} }
private getTemplateWidth(rowEl: JQuery, template: JQuery | HTMLElement): number { private getTemplateWidth(rowEl: JQuery, template: JQuery | HTMLElement): number {
@@ -172,7 +172,7 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
maxTemplate = template || text; maxTemplate = template || text;
} }
}); });
return maxTemplate; return maxTemplate!;
} }
private createRow(columnDef): JQuery { private createRow(columnDef): JQuery {
@@ -194,9 +194,9 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
private getElementWidth(element: HTMLElement): number { private getElementWidth(element: HTMLElement): number {
let width, clone = element.cloneNode(true) as HTMLElement; let width, clone = element.cloneNode(true) as HTMLElement;
clone.style.cssText = 'position: absolute; visibility: hidden;right: auto;text-overflow: initial;white-space: nowrap;'; clone.style.cssText = 'position: absolute; visibility: hidden;right: auto;text-overflow: initial;white-space: nowrap;';
element.parentNode.insertBefore(clone, element); element.parentNode!.insertBefore(clone, element);
width = clone.offsetWidth; width = clone.offsetWidth;
clone.parentNode.removeChild(clone); clone.parentNode!.removeChild(clone);
return width; return width;
} }

View File

@@ -36,7 +36,7 @@ export class CellRangeSelector<T> implements ICellRangeSelector<T> {
private handler = new Slick.EventHandler(); private handler = new Slick.EventHandler();
private decorator: ICellRangeDecorator; private decorator: ICellRangeDecorator;
private canvas: HTMLCanvasElement; private canvas: HTMLCanvasElement;
private currentlySelectedRange: { start: Slick.Cell, end: Slick.Cell }; private currentlySelectedRange: { start: Slick.Cell, end?: Slick.Cell };
public onBeforeCellRangeSelected = new Slick.Event<Slick.Cell>(); public onBeforeCellRangeSelected = new Slick.Event<Slick.Cell>();
public onCellRangeSelected = new Slick.Event<{ range: Slick.Range }>(); public onCellRangeSelected = new Slick.Event<{ range: Slick.Range }>();
@@ -87,7 +87,7 @@ export class CellRangeSelector<T> implements ICellRangeSelector<T> {
return; return;
} }
this.canvas.classList.add(this.options.dragClass); this.canvas.classList.add(this.options.dragClass!);
this.grid.setActiveCell(cell.row, cell.cell); this.grid.setActiveCell(cell.row, cell.cell);
@@ -125,7 +125,7 @@ export class CellRangeSelector<T> implements ICellRangeSelector<T> {
return; return;
} }
this.canvas.classList.remove(this.options.dragClass); this.canvas.classList.remove(this.options.dragClass!);
this.dragging = false; this.dragging = false;
e.stopImmediatePropagation(); e.stopImmediatePropagation();
this.decorator.hide(); this.decorator.hide();

View File

@@ -105,7 +105,7 @@ export class CellSelectionModel<T> implements Slick.SelectionModel<T, Array<Slic
private handleHeaderClick(e: MouseEvent, args: Slick.OnHeaderClickEventArgs<T>) { private handleHeaderClick(e: MouseEvent, args: Slick.OnHeaderClickEventArgs<T>) {
if (!isUndefinedOrNull(args.column)) { if (!isUndefinedOrNull(args.column)) {
let columnIndex = this.grid.getColumnIndex(args.column.id); let columnIndex = this.grid.getColumnIndex(args.column.id!);
if (this.grid.canCellBeSelected(0, columnIndex)) { if (this.grid.canCellBeSelected(0, columnIndex)) {
let ranges: Array<Slick.Range>; let ranges: Array<Slick.Range>;
if (e.shiftKey) { if (e.shiftKey) {

View File

@@ -8,6 +8,7 @@ import { ICheckboxStyles } from 'vs/base/browser/ui/checkbox/checkbox';
import * as strings from 'vs/base/common/strings'; import * as strings from 'vs/base/common/strings';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { KeyCode } from 'vs/base/common/keyCodes'; import { KeyCode } from 'vs/base/common/keyCodes';
import { range } from 'vs/base/common/arrays';
export interface ICheckboxSelectColumnOptions extends Slick.PluginOptions, ICheckboxStyles { export interface ICheckboxSelectColumnOptions extends Slick.PluginOptions, ICheckboxStyles {
columnId?: string; columnId?: string;
@@ -19,7 +20,7 @@ export interface ICheckboxSelectColumnOptions extends Slick.PluginOptions, IChec
const defaultOptions: ICheckboxSelectColumnOptions = { const defaultOptions: ICheckboxSelectColumnOptions = {
columnId: '_checkbox_selector', columnId: '_checkbox_selector',
cssClass: null, cssClass: undefined,
toolTip: nls.localize('selectDeselectAll', 'Select/Deselect All'), toolTip: nls.localize('selectDeselectAll', 'Select/Deselect All'),
width: 30 width: 30
}; };
@@ -54,7 +55,7 @@ export class CheckboxSelectColumn<T> implements Slick.Plugin<T> {
} }
private handleSelectedRowsChanged(e: Event, args: Slick.OnSelectedRowsChangedEventArgs<T>): void { private handleSelectedRowsChanged(e: Event, args: Slick.OnSelectedRowsChangedEventArgs<T>): void {
let selectedRows = this._grid.getSelectedRows(); const selectedRows = this._grid.getSelectedRows();
let lookup = {}, row, i; let lookup = {}, row, i;
for (i = 0; i < selectedRows.length; i++) { for (i = 0; i < selectedRows.length; i++) {
row = selectedRows[i]; row = selectedRows[i];
@@ -72,11 +73,11 @@ export class CheckboxSelectColumn<T> implements Slick.Plugin<T> {
if (!this._options.title) { if (!this._options.title) {
if (selectedRows.length && selectedRows.length === this._grid.getDataLength()) { if (selectedRows.length && selectedRows.length === this._grid.getDataLength()) {
this._grid.updateColumnHeader(this._options.columnId, this._grid.updateColumnHeader(this._options.columnId!,
strings.format(checkboxTemplate, 'checked'), strings.format(checkboxTemplate, 'checked'),
this._options.toolTip); this._options.toolTip);
} else { } else {
this._grid.updateColumnHeader(this._options.columnId, this._grid.updateColumnHeader(this._options.columnId!,
strings.format(checkboxTemplate, ''), strings.format(checkboxTemplate, ''),
this._options.toolTip); this._options.toolTip);
} }
@@ -108,7 +109,7 @@ export class CheckboxSelectColumn<T> implements Slick.Plugin<T> {
private handleClick(e: Event, args: Slick.OnClickEventArgs<T>): void { private handleClick(e: Event, args: Slick.OnClickEventArgs<T>): void {
// clicking on a row select checkbox // clicking on a row select checkbox
if (this._grid.getColumns()[args.cell].id === this._options.columnId && jQuery(e.target).is('input[type="checkbox"]')) { if (this._grid.getColumns()[args.cell].id === this._options.columnId && jQuery(e.target!).is('input[type="checkbox"]')) {
// if editing, try to commit // if editing, try to commit
if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) { if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) {
e.preventDefault(); e.preventDefault();
@@ -131,7 +132,7 @@ export class CheckboxSelectColumn<T> implements Slick.Plugin<T> {
} }
private handleHeaderClick(e: Event, args: Slick.OnHeaderClickEventArgs<T>): void { private handleHeaderClick(e: Event, args: Slick.OnHeaderClickEventArgs<T>): void {
if (!this._options.title && args.column.id === this._options.columnId && jQuery(e.target).is('input[type="checkbox"]')) { if (!this._options.title && args.column.id === this._options.columnId && jQuery(e.target!).is('input[type="checkbox"]')) {
// if editing, try to commit // if editing, try to commit
if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) { if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) {
e.preventDefault(); e.preventDefault();
@@ -139,18 +140,15 @@ export class CheckboxSelectColumn<T> implements Slick.Plugin<T> {
return; return;
} }
if (jQuery(e.target).is('input[checked]')) { if (jQuery(e.target!).is('input[checked]')) {
let rows = []; const rows = range(this._grid.getDataLength());
for (let i = 0; i < this._grid.getDataLength(); i++) {
rows.push(i);
}
this._grid.setSelectedRows(rows); this._grid.setSelectedRows(rows);
this._grid.updateColumnHeader(this._options.columnId, this._grid.updateColumnHeader(this._options.columnId!,
strings.format(checkboxTemplate, 'checked'), strings.format(checkboxTemplate, 'checked'),
this._options.toolTip); this._options.toolTip);
} else { } else {
this._grid.setSelectedRows([]); this._grid.setSelectedRows([]);
this._grid.updateColumnHeader(this._options.columnId, this._grid.updateColumnHeader(this._options.columnId!,
strings.format(checkboxTemplate, ''), this._options.toolTip); strings.format(checkboxTemplate, ''), this._options.toolTip);
e.stopPropagation(); e.stopPropagation();
e.stopImmediatePropagation(); e.stopImmediatePropagation();
@@ -173,11 +171,8 @@ export class CheckboxSelectColumn<T> implements Slick.Plugin<T> {
} }
private checkboxSelectionFormatter(row, cell, value, columnDef: Slick.Column<T>, dataContext): string { private checkboxSelectionFormatter(row, cell, value, columnDef: Slick.Column<T>, dataContext): string {
if (dataContext) { return this._selectedRowsLookup[row]
return this._selectedRowsLookup[row] ? strings.format(checkboxTemplate, 'checked')
? strings.format(checkboxTemplate, 'checked') : strings.format(checkboxTemplate, '');
: strings.format(checkboxTemplate, '');
}
return null;
} }
} }

View File

@@ -12,7 +12,7 @@ export class HeaderFilter {
public onFilterApplied = new Slick.Event(); public onFilterApplied = new Slick.Event();
public onCommand = new Slick.Event(); public onCommand = new Slick.Event();
private grid; private grid: Slick.Grid<any>;
private handler = new Slick.EventHandler(); private handler = new Slick.EventHandler();
private defaults = { private defaults = {
filterImage: 'src/sql/media/icons/filter.svg', filterImage: 'src/sql/media/icons/filter.svg',
@@ -20,7 +20,7 @@ export class HeaderFilter {
sortDescImage: 'sort-desc.gif' sortDescImage: 'sort-desc.gif'
}; };
private $menu: JQuery<HTMLElement>; private $menu?: JQuery<HTMLElement>;
private options: any; private options: any;
private okButton: Button; private okButton: Button;
private clearButton: Button; private clearButton: Button;
@@ -70,16 +70,16 @@ export class HeaderFilter {
private hideMenu() { private hideMenu() {
if (this.$menu) { if (this.$menu) {
this.$menu.remove(); this.$menu.remove();
this.$menu = null; this.$menu = undefined;
} }
} }
private handleHeaderCellRendered(e, args) { private handleHeaderCellRendered(e, args) {
let column = args.column; const column = args.column;
if (column.id === '_detail_selector') { if (column.id === '_detail_selector') {
return; return;
} }
let $el = jQuery('<div></div>') const $el = jQuery('<div></div>')
.addClass('slick-header-menubutton') .addClass('slick-header-menubutton')
.data('column', column); .data('column', column);
@@ -93,13 +93,13 @@ export class HeaderFilter {
} }
private addMenuItem(menu, columnDef, title, command, image) { private addMenuItem(menu, columnDef, title, command, image) {
let $item = jQuery('<div class="slick-header-menuitem">') const $item = jQuery('<div class="slick-header-menuitem">')
.data('command', command) .data('command', command)
.data('column', columnDef) .data('column', columnDef)
.bind('click', (e) => this.handleMenuItemClick(e, command, columnDef)) .bind('click', (e) => this.handleMenuItemClick(e, command, columnDef))
.appendTo(menu); .appendTo(menu);
let $icon = jQuery('<div class="slick-header-menuicon">') const $icon = jQuery('<div class="slick-header-menuicon">')
.appendTo($item); .appendTo($item);
if (title === 'Sort Ascending') { if (title === 'Sort Ascending') {
@@ -118,7 +118,7 @@ export class HeaderFilter {
jQuery('<input class="input" placeholder="Search" style="margin-top: 5px; width: 206px">') jQuery('<input class="input" placeholder="Search" style="margin-top: 5px; width: 206px">')
.data('column', columnDef) .data('column', columnDef)
.bind('keyup', (e) => { .bind('keyup', (e) => {
let filterVals = this.getFilterValuesByInput(jQuery(e.target)); const filterVals = this.getFilterValuesByInput(jQuery(e.target));
self.updateFilterInputs(menu, columnDef, filterVals); self.updateFilterInputs(menu, columnDef, filterVals);
}) })
.appendTo(menu); .appendTo(menu);
@@ -132,13 +132,13 @@ export class HeaderFilter {
this.workingFilters = columnDef.filterValues.slice(0); this.workingFilters = columnDef.filterValues.slice(0);
for (let i = 0; i < filterItems.length; i++) { for (let i = 0; i < filterItems.length; i++) {
let filtered = _.contains(this.workingFilters, filterItems[i]); const filtered = _.contains(this.workingFilters, filterItems[i]);
filterOptions += '<label><input type="checkbox" value="' + i + '"' filterOptions += '<label><input type="checkbox" value="' + i + '"'
+ (filtered ? ' checked="checked"' : '') + (filtered ? ' checked="checked"' : '')
+ '/>' + filterItems[i] + '</label>'; + '/>' + filterItems[i] + '</label>';
} }
let $filter = menu.find('.filter'); const $filter = menu.find('.filter');
$filter.empty().append(jQuery(filterOptions)); $filter.empty().append(jQuery(filterOptions));
jQuery(':checkbox', $filter).bind('click', (e) => { jQuery(':checkbox', $filter).bind('click', (e) => {
@@ -147,7 +147,7 @@ export class HeaderFilter {
} }
private showFilter(e) { private showFilter(e) {
let $menuButton = jQuery(e.target); const $menuButton = jQuery(e.target);
this.columnDef = $menuButton.data('column'); this.columnDef = $menuButton.data('column');
this.columnDef.filterValues = this.columnDef.filterValues || []; this.columnDef.filterValues = this.columnDef.filterValues || [];
@@ -179,14 +179,14 @@ export class HeaderFilter {
let filterOptions = '<label><input type="checkbox" value="-1" />(Select All)</label>'; let filterOptions = '<label><input type="checkbox" value="-1" />(Select All)</label>';
for (let i = 0; i < filterItems.length; i++) { for (let i = 0; i < filterItems.length; i++) {
let filtered = _.contains(this.workingFilters, filterItems[i]); const filtered = _.contains(this.workingFilters, filterItems[i]);
if (filterItems[i] && filterItems[i].indexOf('Error:') < 0) { if (filterItems[i] && filterItems[i].indexOf('Error:') < 0) {
filterOptions += '<label><input type="checkbox" value="' + i + '"' filterOptions += '<label><input type="checkbox" value="' + i + '"'
+ (filtered ? ' checked="checked"' : '') + (filtered ? ' checked="checked"' : '')
+ '/>' + escape(filterItems[i]) + '</label>'; + '/>' + escape(filterItems[i]) + '</label>';
} }
} }
let $filter = jQuery('<div class="filter">') const $filter = jQuery('<div class="filter">')
.append(jQuery(filterOptions)) .append(jQuery(filterOptions))
.appendTo(this.$menu); .appendTo(this.$menu);
@@ -194,7 +194,7 @@ export class HeaderFilter {
this.okButton.label = 'OK'; this.okButton.label = 'OK';
this.okButton.title = 'OK'; this.okButton.title = 'OK';
this.okButton.element.id = 'filter-ok-button'; this.okButton.element.id = 'filter-ok-button';
let okElement = jQuery('#filter-ok-button'); const okElement = jQuery('#filter-ok-button');
okElement.bind('click', (ev) => { okElement.bind('click', (ev) => {
this.columnDef.filterValues = this.workingFilters.splice(0); this.columnDef.filterValues = this.workingFilters.splice(0);
this.setButtonImage($menuButton, this.columnDef.filterValues.length > 0); this.setButtonImage($menuButton, this.columnDef.filterValues.length > 0);
@@ -205,7 +205,7 @@ export class HeaderFilter {
this.clearButton.label = 'Clear'; this.clearButton.label = 'Clear';
this.clearButton.title = 'Clear'; this.clearButton.title = 'Clear';
this.clearButton.element.id = 'filter-clear-button'; this.clearButton.element.id = 'filter-clear-button';
let clearElement = jQuery('#filter-clear-button'); const clearElement = jQuery('#filter-clear-button');
clearElement.bind('click', (ev) => { clearElement.bind('click', (ev) => {
this.columnDef.filterValues.length = 0; this.columnDef.filterValues.length = 0;
this.setButtonImage($menuButton, false); this.setButtonImage($menuButton, false);
@@ -216,7 +216,7 @@ export class HeaderFilter {
this.cancelButton.label = 'Cancel'; this.cancelButton.label = 'Cancel';
this.cancelButton.title = 'Cancel'; this.cancelButton.title = 'Cancel';
this.cancelButton.element.id = 'filter-cancel-button'; this.cancelButton.element.id = 'filter-cancel-button';
let cancelElement = jQuery('#filter-cancel-button'); const cancelElement = jQuery('#filter-cancel-button');
cancelElement.bind('click', () => this.hideMenu()); cancelElement.bind('click', () => this.hideMenu());
attachButtonStyler(this.okButton, this._themeService); attachButtonStyler(this.okButton, this._themeService);
attachButtonStyler(this.clearButton, this._themeService); attachButtonStyler(this.clearButton, this._themeService);
@@ -226,8 +226,8 @@ export class HeaderFilter {
this.workingFilters = this.changeWorkingFilter(filterItems, this.workingFilters, jQuery(e.target)); this.workingFilters = this.changeWorkingFilter(filterItems, this.workingFilters, jQuery(e.target));
}); });
let offset = jQuery(e.target).offset(); const offset = jQuery(e.target).offset();
let left = offset.left - this.$menu.width() + jQuery(e.target).width() - 8; const left = offset.left - this.$menu.width() + jQuery(e.target).width() - 8;
let menutop = offset.top + jQuery(e.target).height(); let menutop = offset.top + jQuery(e.target).height();
@@ -243,8 +243,8 @@ export class HeaderFilter {
} }
private changeWorkingFilter(filterItems, workingFilters, $checkbox) { private changeWorkingFilter(filterItems, workingFilters, $checkbox) {
let value = $checkbox.val(); const value = $checkbox.val();
let $filter = $checkbox.parent().parent(); const $filter = $checkbox.parent().parent();
if ($checkbox.val() < 0) { if ($checkbox.val() < 0) {
// Select All // Select All
@@ -256,11 +256,11 @@ export class HeaderFilter {
workingFilters.length = 0; workingFilters.length = 0;
} }
} else { } else {
let index = _.indexOf(workingFilters, filterItems[value]); const index = _.indexOf(workingFilters, filterItems[value]);
if ($checkbox.prop('checked') && index < 0) { if ($checkbox.prop('checked') && index < 0) {
workingFilters.push(filterItems[value]); workingFilters.push(filterItems[value]);
let nextRow = filterItems[(parseInt(value) + 1).toString()]; const nextRow = filterItems[(parseInt(value) + 1).toString()];
if (nextRow && nextRow.indexOf('Error:') >= 0) { if (nextRow && nextRow.indexOf('Error:') >= 0) {
workingFilters.push(nextRow); workingFilters.push(nextRow);
} }
@@ -276,11 +276,11 @@ export class HeaderFilter {
} }
private setButtonImage($el, filtered) { private setButtonImage($el, filtered) {
let element: HTMLElement = $el.get(0); const element: HTMLElement = $el.get(0);
if (filtered) { if (filtered) {
element.className += ' filtered'; element.className += ' filtered';
} else { } else {
let classList = element.classList; const classList = element.classList;
if (classList.contains('filtered')) { if (classList.contains('filtered')) {
classList.remove('filtered'); classList.remove('filtered');
} }
@@ -296,9 +296,9 @@ export class HeaderFilter {
} }
private getFilterValues(dataView, column) { private getFilterValues(dataView, column) {
let seen = []; const seen: Array<any> = [];
for (let i = 0; i < dataView.getLength(); i++) { for (let i = 0; i < dataView.getLength(); i++) {
let value = dataView.getItem(i)[column.field]; const value = dataView.getItem(i)[column.field];
if (!_.contains(seen, value)) { if (!_.contains(seen, value)) {
seen.push(value); seen.push(value);
@@ -308,18 +308,18 @@ export class HeaderFilter {
} }
private getFilterValuesByInput($input) { private getFilterValuesByInput($input) {
let column = $input.data('column'), const column = $input.data('column'),
filter = $input.val(), filter = $input.val(),
dataView = this.grid.getData(), dataView = this.grid.getData(),
seen = []; seen: Array<any> = [];
for (let i = 0; i < dataView.getLength(); i++) { for (let i = 0; i < dataView.getLength(); i++) {
let value = dataView.getItem(i)[column.field]; const value = dataView.getItem(i)[column.field];
if (filter.length > 0) { if (filter.length > 0) {
let itemValue = !value ? '' : value; const itemValue = !value ? '' : value;
let lowercaseFilter = filter.toString().toLowerCase(); const lowercaseFilter = filter.toString().toLowerCase();
let lowercaseVal = itemValue.toString().toLowerCase(); const lowercaseVal = itemValue.toString().toLowerCase();
if (!_.contains(seen, value) && lowercaseVal.indexOf(lowercaseFilter) > -1) { if (!_.contains(seen, value) && lowercaseVal.indexOf(lowercaseFilter) > -1) {
seen.push(value); seen.push(value);
} }
@@ -335,9 +335,9 @@ export class HeaderFilter {
} }
private getAllFilterValues(data, column) { private getAllFilterValues(data, column) {
let seen = []; const seen: Array<any> = [];
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
let value = data[i][column.field]; const value = data[i][column.field];
if (!_.contains(seen, value)) { if (!_.contains(seen, value)) {
seen.push(value); seen.push(value);

View File

@@ -28,12 +28,13 @@ export class MouseWheelSupport implements Slick.Plugin<any> {
private _disposables: IDisposable[] = []; private _disposables: IDisposable[] = [];
constructor(options: IMouseWheelSupportOptions = {}) { constructor(options: IMouseWheelSupportOptions = {}) {
this.options = mixin(options, defaultOptions, false); this.options = defaultOptions;
mixin(this.options, options);
} }
public init(grid: Slick.Grid<any>): void { public init(grid: Slick.Grid<any>): void {
this.canvas = grid.getCanvasNode(); this.canvas = grid.getCanvasNode();
this.viewport = this.canvas.parentElement; this.viewport = this.canvas.parentElement!;
let onMouseWheel = (browserEvent: IMouseWheelEvent) => { let onMouseWheel = (browserEvent: IMouseWheelEvent) => {
let e = new StandardWheelEvent(browserEvent); let e = new StandardWheelEvent(browserEvent);
this._onMouseWheel(e); this._onMouseWheel(e);
@@ -44,8 +45,8 @@ export class MouseWheelSupport implements Slick.Plugin<any> {
private _onMouseWheel(e: StandardWheelEvent) { private _onMouseWheel(e: StandardWheelEvent) {
if (e.deltaY || e.deltaX) { if (e.deltaY || e.deltaX) {
let deltaY = e.deltaY * this.options.scrollSpeed; let deltaY = e.deltaY * this.options.scrollSpeed!;
let deltaX = e.deltaX * this.options.scrollSpeed; let deltaX = e.deltaX * this.options.scrollSpeed!;
const scrollHeight = this.canvas.clientHeight; const scrollHeight = this.canvas.clientHeight;
const scrollWidth = this.canvas.clientWidth; const scrollWidth = this.canvas.clientWidth;
const height = this.viewport.clientHeight; const height = this.viewport.clientHeight;
@@ -67,8 +68,8 @@ export class MouseWheelSupport implements Slick.Plugin<any> {
} else { } else {
this.viewport.scrollTop = this.viewport.scrollTop - deltaY; this.viewport.scrollTop = this.viewport.scrollTop - deltaY;
this.viewport.dispatchEvent(new Event('scroll')); this.viewport.dispatchEvent(new Event('scroll'));
event.stopPropagation(); e.stopPropagation();
event.preventDefault(); e.preventDefault();
} }
// scroll up // scroll up
} else { } else {
@@ -78,8 +79,8 @@ export class MouseWheelSupport implements Slick.Plugin<any> {
} else { } else {
this.viewport.scrollTop = this.viewport.scrollTop - deltaY; this.viewport.scrollTop = this.viewport.scrollTop - deltaY;
this.viewport.dispatchEvent(new Event('scroll')); this.viewport.dispatchEvent(new Event('scroll'));
event.stopPropagation(); e.stopPropagation();
event.preventDefault(); e.preventDefault();
} }
} }
@@ -91,8 +92,8 @@ export class MouseWheelSupport implements Slick.Plugin<any> {
} else { } else {
this.viewport.scrollLeft = this.viewport.scrollLeft - deltaX; this.viewport.scrollLeft = this.viewport.scrollLeft - deltaX;
this.viewport.dispatchEvent(new Event('scroll')); this.viewport.dispatchEvent(new Event('scroll'));
event.stopPropagation(); e.stopPropagation();
event.preventDefault(); e.preventDefault();
} }
// scroll left // scroll left
} else { } else {
@@ -102,8 +103,8 @@ export class MouseWheelSupport implements Slick.Plugin<any> {
} else { } else {
this.viewport.scrollLeft = this.viewport.scrollLeft - deltaX; this.viewport.scrollLeft = this.viewport.scrollLeft - deltaX;
this.viewport.dispatchEvent(new Event('scroll')); this.viewport.dispatchEvent(new Event('scroll'));
event.stopPropagation(); e.stopPropagation();
event.preventDefault(); e.preventDefault();
} }
} }
} }

View File

@@ -49,10 +49,10 @@ export class RowDetailView {
public destroy() { public destroy() {
this._handler.unsubscribeAll(); this._handler.unsubscribeAll();
this.onAsyncResponse.unsubscribe(undefined); this.onAsyncResponse.unsubscribe();
this.onAsyncEndUpdate.unsubscribe(undefined); this.onAsyncEndUpdate.unsubscribe();
this.onAfterRowDetailToggle.unsubscribe(undefined); this.onAfterRowDetailToggle.unsubscribe();
this.onBeforeRowDetailToggle.unsubscribe(undefined); this.onBeforeRowDetailToggle.unsubscribe();
} }
public getOptions(options: any) { public getOptions(options: any) {
@@ -73,7 +73,7 @@ export class RowDetailView {
return; return;
} }
let item = this._dataView.getItem(args.row); const item = this._dataView.getItem(args.row);
// trigger an event before toggling // trigger an event before toggling
this.onBeforeRowDetailToggle.notify({ this.onBeforeRowDetailToggle.notify({
@@ -102,21 +102,21 @@ export class RowDetailView {
// If we scroll save detail views that go out of cache range // If we scroll save detail views that go out of cache range
public handleScroll(e, args) { public handleScroll(e, args) {
let range = this._grid.getRenderedRange(); const range = this._grid.getRenderedRange();
let start: number = (range.top > 0 ? range.top : 0); const start: number = (range.top > 0 ? range.top : 0);
let end: number = (range.bottom > this._dataView.getLength() ? range.bottom : this._dataView.getLength()); const end: number = (range.bottom > this._dataView.getLength() ? range.bottom : this._dataView.getLength());
if (end <= 0) { if (end <= 0) {
return; return;
} }
// Get the item at the top of the view // Get the item at the top of the view
let topMostItem = this._dataView.getItemByIdx(start); const topMostItem = this._dataView.getItemByIdx(start);
// Check it is a parent item // Check it is a parent item
if (topMostItem._parent === undefined) { if (topMostItem._parent === undefined) {
// This is a standard row as we have no parent. // This is a standard row as we have no parent.
let nextItem = this._dataView.getItemByIdx(start + 1); const nextItem = this._dataView.getItemByIdx(start + 1);
if (nextItem !== undefined && nextItem._parent !== undefined) { if (nextItem !== undefined && nextItem._parent !== undefined) {
// This is likely the expanded Detail Row View // This is likely the expanded Detail Row View
// Check for safety // Check for safety
@@ -127,7 +127,7 @@ export class RowDetailView {
} }
// Find the bottom most item that is likely to go off screen // Find the bottom most item that is likely to go off screen
let bottomMostItem = this._dataView.getItemByIdx(end - 1); const bottomMostItem = this._dataView.getItemByIdx(end - 1);
// If we are a detailView and we are about to go out of cache view // If we are a detailView and we are about to go out of cache view
if (bottomMostItem._parent !== undefined) { if (bottomMostItem._parent !== undefined) {
@@ -151,9 +151,9 @@ export class RowDetailView {
// Saves the current state of the detail view // Saves the current state of the detail view
public saveDetailView(item) { public saveDetailView(item) {
let view = jQuery('#innerDetailView_' + item.id); const view = jQuery('#innerDetailView_' + item.id);
if (view) { if (view) {
let html = jQuery('#innerDetailView_' + item.id).html(); const html = jQuery('#innerDetailView_' + item.id).html();
if (html !== undefined) { if (html !== undefined) {
item._detailContent = html; item._detailContent = html;
} }
@@ -231,7 +231,6 @@ export class RowDetailView {
args.itemDetail._detailViewLoaded = true; args.itemDetail._detailViewLoaded = true;
let idxParent = this._dataView.getIdxById(args.itemDetail.id);
this._dataView.updateItem(args.itemDetail.id, args.itemDetail); this._dataView.updateItem(args.itemDetail.id, args.itemDetail);
// trigger an event once the post template is finished loading // trigger an event once the post template is finished loading
@@ -255,9 +254,9 @@ export class RowDetailView {
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
public getPaddingItem(parent, offset) { public getPaddingItem(parent, offset) {
let item: any = {}; const item: any = {};
for (let prop in this._grid.getData()) { for (const prop in this._grid.getData()) {
item[prop] = null; item[prop] = null;
} }
item.id = parent.id + '.' + offset; item.id = parent.id + '.' + offset;
@@ -272,7 +271,7 @@ export class RowDetailView {
} }
public getErrorItem(parent, offset) { public getErrorItem(parent, offset) {
let item: any = {}; const item: any = {};
item.id = parent.id + '.' + offset; item.id = parent.id + '.' + offset;
item._collapsed = true; item._collapsed = true;
item._isPadding = false; item._isPadding = false;
@@ -288,15 +287,15 @@ export class RowDetailView {
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
public applyTemplateNewLineHeight(item, showError = false) { public applyTemplateNewLineHeight(item, showError = false) {
// the height seems to be calculated by the template row count (how many line of items does the template have) // the height seems to be calculated by the template row count (how many line of items does the template have)
let rowCount = this._options.panelRows; const rowCount = this._options.panelRows;
//calculate padding requirements based on detail-content.. //calculate padding requirements based on detail-content..
//ie. worst-case: create an invisible dom node now &find it's height. //ie. worst-case: create an invisible dom node now &find it's height.
let lineHeight = 13; //we know cuz we wrote the custom css innit ;) const lineHeight = 13; //we know cuz we wrote the custom css innit ;)
item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / this._grid.getOptions().rowHeight); item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / this._grid.getOptions().rowHeight);
item._height = (item._sizePadding * this._grid.getOptions().rowHeight); item._height = (item._sizePadding * this._grid.getOptions().rowHeight);
let idxParent = this._dataView.getIdxById(item.id); const idxParent = this._dataView.getIdxById(item.id);
for (let idx = 1; idx <= item._sizePadding; idx++) { for (let idx = 1; idx <= item._sizePadding; idx++) {
if (showError) { if (showError) {
this._dataView.insertItem(idxParent + idx, this.getErrorItem(item, 'error')); this._dataView.insertItem(idxParent + idx, this.getErrorItem(item, 'error'));
@@ -336,9 +335,9 @@ export class RowDetailView {
} else if (dataContext._collapsed) { } else if (dataContext._collapsed) {
return '<div class=\'detailView-toggle expand\'></div>'; return '<div class=\'detailView-toggle expand\'></div>';
} else { } else {
let html = []; const html: Array<string> = [];
let rowHeight = this._grid.getOptions().rowHeight; const rowHeight = this._grid.getOptions().rowHeight;
let bottomMargin = 5; const bottomMargin = 5;
//V313HAX: //V313HAX:
//putting in an extra closing div after the closing toggle div and ommiting a //putting in an extra closing div after the closing toggle div and ommiting a
@@ -369,9 +368,9 @@ export class RowDetailView {
} }
// Grad each of the dom items // Grad each of the dom items
let mainContainer = document.getElementById('detailViewContainer_' + item.id); const mainContainer = document.getElementById('detailViewContainer_' + item.id);
let cellItem = document.getElementById('cellDetailView_' + item.id); const cellItem = document.getElementById('cellDetailView_' + item.id);
let inner = document.getElementById('innerDetailView_' + item.id); const inner = document.getElementById('innerDetailView_' + item.id);
if (!mainContainer || !cellItem || !inner) { if (!mainContainer || !cellItem || !inner) {
return; return;
@@ -381,14 +380,14 @@ export class RowDetailView {
this._dataView.deleteItem(item.id + '.' + idx); this._dataView.deleteItem(item.id + '.' + idx);
} }
let rowHeight = this._grid.getOptions().rowHeight; // height of a row const rowHeight = this._grid.getOptions().rowHeight; // height of a row
let lineHeight = 13; //we know cuz we wrote the custom css innit ;) const lineHeight = 13; //we know cuz we wrote the custom css innit ;)
// Get the inner Item height as this will be the actual size // Get the inner Item height as this will be the actual size
let itemHeight = inner.clientHeight; const itemHeight = inner.clientHeight;
// Now work out how many rows // Now work out how many rows
let rowCount = Math.ceil(itemHeight / rowHeight) + 1; const rowCount = Math.ceil(itemHeight / rowHeight) + 1;
item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / rowHeight); item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / rowHeight);
item._height = (item._sizePadding * rowHeight); item._height = (item._sizePadding * rowHeight);
@@ -404,7 +403,7 @@ export class RowDetailView {
cellItem.setAttribute('style', `height: ${item._height}px;top:${rowHeight}px`); cellItem.setAttribute('style', `height: ${item._height}px;top:${rowHeight}px`);
} }
let idxParent = this._dataView.getIdxById(item.id); const idxParent = this._dataView.getIdxById(item.id);
for (let idx = 1; idx <= item._sizePadding; idx++) { for (let idx = 1; idx <= item._sizePadding; idx++) {
this._dataView.insertItem(idxParent + idx, this.getPaddingItem(item, idx)); this._dataView.insertItem(idxParent + idx, this.getPaddingItem(item, idx));
} }

View File

@@ -8,8 +8,6 @@ export interface IRowNumberColumnOptions {
cssClass?: string; cssClass?: string;
} }
const sizePerDigit = 15;
export class RowNumberColumn<T> implements Slick.Plugin<T> { export class RowNumberColumn<T> implements Slick.Plugin<T> {
private handler = new Slick.EventHandler(); private handler = new Slick.EventHandler();
private grid: Slick.Grid<T>; private grid: Slick.Grid<T>;
@@ -63,11 +61,7 @@ export class RowNumberColumn<T> implements Slick.Plugin<T> {
} }
private formatter(row, cell, value, columnDef: Slick.Column<T>, dataContext): string { private formatter(row, cell, value, columnDef: Slick.Column<T>, dataContext): string {
if (dataContext) { // row is zero-based, we need make it 1 based for display in the result grid
// row is zero-based, we need make it 1 based for display in the result grid return `<span>${row + 1}</span>`;
//
return `<span>${row + 1}</span>`;
}
return null;
} }
} }

View File

@@ -31,7 +31,7 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
} }
private rangesToRows(ranges: Slick.Range[]): number[] { private rangesToRows(ranges: Slick.Range[]): number[] {
let rows = []; const rows: Array<number> = [];
for (let i = 0; i < ranges.length; i++) { for (let i = 0; i < ranges.length; i++) {
for (let j = ranges[i].fromRow; j <= ranges[i].toRow; j++) { for (let j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
rows.push(j); rows.push(j);
@@ -41,8 +41,8 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
} }
private rowsToRanges(rows: number[]): Slick.Range[] { private rowsToRanges(rows: number[]): Slick.Range[] {
let ranges = []; const ranges: Array<Slick.Range> = [];
let lastCell = this._grid.getColumns().length - 1; const lastCell = this._grid.getColumns().length - 1;
for (let i = 0; i < rows.length; i++) { for (let i = 0; i < rows.length; i++) {
ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell)); ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
} }
@@ -69,7 +69,7 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
} }
private getRowsRange(from: number, to: number): number[] { private getRowsRange(from: number, to: number): number[] {
let i, rows = []; let i: number, rows: Array<number> = [];
for (i = from; i <= to; i++) { for (i = from; i <= to; i++) {
rows.push(i); rows.push(i);
} }
@@ -86,7 +86,7 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
} }
private handleKeyDown(e: KeyboardEvent): void { private handleKeyDown(e: KeyboardEvent): void {
let activeRow = this._grid.getActiveCell(); const activeRow = this._grid.getActiveCell();
if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which === 38 || e.which === 40)) { if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which === 38 || e.which === 40)) {
let selectedRows = this.getSelectedRows(); let selectedRows = this.getSelectedRows();
selectedRows.sort((x, y) => x - y); selectedRows.sort((x, y) => x - y);
@@ -106,8 +106,8 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
} }
if (active >= 0 && active < this._grid.getDataLength()) { if (active >= 0 && active < this._grid.getDataLength()) {
this._grid.scrollRowIntoView(active, undefined); this._grid.scrollRowIntoView(active);
let tempRanges = this.rowsToRanges(this.getRowsRange(top, bottom)); const tempRanges = this.rowsToRanges(this.getRowsRange(top, bottom));
this.setSelectedRanges(tempRanges); this.setSelectedRanges(tempRanges);
} }
@@ -117,7 +117,7 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
} }
private handleClick(e: KeyboardEvent): boolean { private handleClick(e: KeyboardEvent): boolean {
let cell = this._grid.getCellFromEvent(e); const cell = this._grid.getCellFromEvent(e);
if (!cell || !this._grid.canCellBeActive(cell.row, cell.cell)) { if (!cell || !this._grid.canCellBeActive(cell.row, cell.cell)) {
return false; return false;
} }
@@ -128,7 +128,7 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
} }
let selection = this.rangesToRows(this._ranges); let selection = this.rangesToRows(this._ranges);
let idx = jQuery.inArray(cell.row, selection); const idx = jQuery.inArray(cell.row, selection);
if (idx === -1 && (e.ctrlKey || e.metaKey)) { if (idx === -1 && (e.ctrlKey || e.metaKey)) {
selection.push(cell.row); selection.push(cell.row);
@@ -137,20 +137,22 @@ export class RowSelectionModel<T extends Slick.SlickData> implements Slick.Selec
selection = selection.filter(o => o !== cell.row); selection = selection.filter(o => o !== cell.row);
this._grid.setActiveCell(cell.row, cell.cell); this._grid.setActiveCell(cell.row, cell.cell);
} else if (selection.length && e.shiftKey) { } else if (selection.length && e.shiftKey) {
let last = selection.pop(); const last = selection.pop();
let from = Math.min(cell.row, last); if (last) {
let to = Math.max(cell.row, last); const from = Math.min(cell.row, last);
selection = []; const to = Math.max(cell.row, last);
for (let i = from; i <= to; i++) { selection = [];
if (i !== last) { for (let i = from; i <= to; i++) {
selection.push(i); if (i !== last) {
selection.push(i);
}
} }
selection.push(last);
} }
selection.push(last);
this._grid.setActiveCell(cell.row, cell.cell); this._grid.setActiveCell(cell.row, cell.cell);
} }
let tempRanges = this.rowsToRanges(selection); const tempRanges = this.rowsToRanges(selection);
this.setSelectedRanges(tempRanges); this.setSelectedRanges(tempRanges);
e.stopImmediatePropagation(); e.stopImmediatePropagation();

View File

@@ -11,21 +11,7 @@
"./vs/vscode.proposed.d.ts", "./vs/vscode.proposed.d.ts",
"./sql/azdata.d.ts", "./sql/azdata.d.ts",
"./sql/azdata.proposed.d.ts", "./sql/azdata.proposed.d.ts",
"./sql/base/browser/ui/breadcrumb/*.ts", "./sql/base/**/*.ts",
"./sql/base/browser/ui/button/*.ts",
"./sql/base/browser/ui/checkbox/*.ts",
"./sql/base/browser/ui/dropdownList/*.ts",
"./sql/base/browser/ui/editableDropdown/*.ts",
"./sql/base/browser/ui/inputBox/*.ts",
"./sql/base/browser/ui/listBox/*.ts",
"./sql/base/browser/ui/panel/*.ts",
"./sql/base/browser/ui/radioButton/*.ts",
"./sql/base/browser/ui/scrollable/*.ts",
"./sql/base/browser/ui/selectBox/*.ts",
"./sql/base/browser/ui/table/*.ts",
"./sql/base/browser/ui/taskbar/*.ts",
"./sql/base/common/**/*.ts",
"./sql/base/node/**/*.ts",
"./sql/platform/angularEventing/**/*.ts", "./sql/platform/angularEventing/**/*.ts",
"./sql/platform/clipboard/**/*.ts", "./sql/platform/clipboard/**/*.ts",
"./sql/platform/credentials/**/*.ts", "./sql/platform/credentials/**/*.ts",

View File

@@ -69,8 +69,8 @@ declare namespace Slick {
* @method unsubscribe * @method unsubscribe
* @param fn {Function} Event handler to be removed. * @param fn {Function} Event handler to be removed.
*/ */
public unsubscribe(fn: (e: EventData, data: T) => any): void; public unsubscribe(fn?: (e: EventData, data: T) => any): void;
public unsubscribe(fn: (e: DOMEvent, data: T) => any): void; public unsubscribe(fn?: (e: DOMEvent, data: T) => any): void;
/*** /***
* Fires an event notifying all subscribers. * Fires an event notifying all subscribers.
@@ -716,7 +716,7 @@ declare namespace Slick {
* Metadata indexed by column index * Metadata indexed by column index
*/ */
[index: number]: ColumnMetadata<T>; [index: number]: ColumnMetadata<T>;
} };
} }
export interface ColumnMetadata<T extends SlickData> { export interface ColumnMetadata<T extends SlickData> {
@@ -1231,10 +1231,10 @@ declare namespace Slick {
public getRenderedRange(viewportTop?: number, viewportLeft?: number): Viewport; public getRenderedRange(viewportTop?: number, viewportLeft?: number): Viewport;
public resizeCanvas(): void; public resizeCanvas(): void;
public updateRowCount(): void; public updateRowCount(): void;
public scrollRowIntoView(row: number, doPaging: boolean): void; public scrollRowIntoView(row: number, doPaging?: boolean): void;
public scrollRowToTop(row: number): void; public scrollRowToTop(row: number): void;
public scrollCellIntoView(row: number, cell: number, doPaging: boolean): void; public scrollCellIntoView(row: number, cell: number, doPaging: boolean): void;
public scrollTo(y: number); public scrollTo(y: number): void;
public getCanvasNode(): HTMLCanvasElement; public getCanvasNode(): HTMLCanvasElement;
public focus(): void; public focus(): void;
@@ -1278,7 +1278,7 @@ declare namespace Slick {
// the documentation is not enlightening // the documentation is not enlightening
startX: number; startX: number;
startY: number; startY: number;
range: { start: Slick.Cell, end: Slick.Cell }; range: { start: Slick.Cell, end?: Slick.Cell };
} }
export interface OnDragInitEventArgs<T extends SlickData> extends GridEventArgs<T> { export interface OnDragInitEventArgs<T extends SlickData> extends GridEventArgs<T> {
@@ -1448,7 +1448,7 @@ declare namespace Slick {
export interface CellCssStylesHash { export interface CellCssStylesHash {
[index: number]: { [index: number]: {
[id: string]: string; [id: string]: string;
} };
} }
export interface Viewport { export interface Viewport {

View File

@@ -1084,7 +1084,7 @@ interface UnderscoreStatic {
* @param array The array to split * @param array The array to split
* @param count The maximum size of the inner arrays. * @param count The maximum size of the inner arrays.
*/ */
chunk<T>(array: _.Collection<T>, count: number): (_.Collection<T>)[] chunk<T>(array: _.Collection<T>, count: number): (_.Collection<T>)[];
/************* /*************
* Functions * * Functions *
@@ -3668,7 +3668,7 @@ interface UnderscoreStatic {
* @param context `this` object in `iterator`, optional. * @param context `this` object in `iterator`, optional.
*/ */
findKey<T>(obj: _.Dictionary<T>, predicate: _.ObjectIterator<T, boolean>, context? : any): string; findKey<T>(obj: _.Dictionary<T>, predicate: _.ObjectIterator<T, boolean>, context? : any): string;
/** /**
* Return a copy of the object, filtered to only have values for the whitelisted keys * Return a copy of the object, filtered to only have values for the whitelisted keys
* (or array of valid keys). * (or array of valid keys).
@@ -4748,7 +4748,7 @@ interface Underscore<T> {
* Wrapped type `object`. * Wrapped type `object`.
* @see _.extend * @see _.extend
**/ **/
findKey(predicate: _.ObjectIterator<any, boolean>, context? : any): any findKey(predicate: _.ObjectIterator<any, boolean>, context? : any): any;
/** /**
* Wrapped type `object`. * Wrapped type `object`.
@@ -5708,7 +5708,7 @@ interface _Chain<T> {
* Wrapped type `object`. * Wrapped type `object`.
* @see _.extend * @see _.extend
**/ **/
findKey(predicate: _.ObjectIterator<any, boolean>, context? : any): _Chain<T> findKey(predicate: _.ObjectIterator<any, boolean>, context? : any): _Chain<T>;
/** /**
* Wrapped type `object`. * Wrapped type `object`.