diff --git a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py index ac667001..fa784ee6 100644 --- a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py +++ b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py @@ -81,7 +81,7 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest): def _copies_row_using_keyboard_shortcut(self): pyperclip.copy("old clipboard contents") - self.page.find_by_xpath("//*[contains(@class, 'slick-row')]/*[1]/input[@type='checkbox']").click() + self.page.find_by_xpath("//*[contains(@class, 'slick-row')]/*[1]").click() ActionChains(self.page.driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() diff --git a/web/pgadmin/static/img/select-all-icon.png b/web/pgadmin/static/img/select-all-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb8878975b8fde309cd6a586f5c826d6e81571e GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>vGa6s43UuR zJ>$v6puod&@W;!Tug@oPYUthk6=M>pm?o!N?4WeXd51unp3Ow=_!KAZ+6&I&Jr~*} dgCZOogzNtqSzXk>V+J&d!PC{xWt~$(69BVECldew literal 0 HcmV?d00001 diff --git a/web/pgadmin/static/js/selection/active_cell_capture.js b/web/pgadmin/static/js/selection/active_cell_capture.js index 0abb7355..10572736 100644 --- a/web/pgadmin/static/js/selection/active_cell_capture.js +++ b/web/pgadmin/static/js/selection/active_cell_capture.js @@ -1,7 +1,7 @@ define([ 'jquery', 'sources/selection/range_selection_helper' -], function ($, rangeSelectionHelper) { +], function ($, RangeSelectionHelper) { var ActiveCellCapture = function () { var KEY_RIGHT = 39; @@ -10,6 +10,8 @@ define([ var KEY_DOWN = 40; var bypassDefaultActiveCellRangeChange = false; + var isColumnsResized = false; + var isMouseInHeader = false; var grid; var init = function (slickGrid) { @@ -19,6 +21,9 @@ define([ grid.onClick.subscribe(onClickHandler); grid.onActiveCellChanged.subscribe(onActiveCellChangedHandler); grid.onKeyDown.subscribe(onKeyDownHandler); + grid.onHeaderMouseEnter.subscribe(onHeaderMouseEnterHandler); + grid.onHeaderMouseLeave.subscribe(onHeaderMouseLeaveHandler); + grid.onColumnsResized.subscribe(onColumnsResizedHandler); }; var destroy = function () { @@ -26,6 +31,9 @@ define([ grid.onHeaderClick.unsubscribe(onHeaderClickHandler); grid.onActiveCellChanged.unsubscribe(onActiveCellChangedHandler); grid.onKeyDown.unsubscribe(onKeyDownHandler); + grid.onHeaderMouseEnter.unsubscribe(onHeaderMouseEnterHandler); + grid.onHeaderMouseLeave.unsubscribe(onHeaderMouseLeaveHandler); + grid.onColumnsResized.unsubscribe(onColumnsResizedHandler); }; $.extend(this, { @@ -39,6 +47,12 @@ define([ } function onHeaderClickHandler(event, args) { + if (isColumnsResizedAndCurrentlyInHeader()) { + isColumnsResized = false; + event.stopPropagation(); + return; + } + bypassDefaultActiveCellRangeChange = true; var clickedColumn = args.column.pos + 1; @@ -57,6 +71,19 @@ define([ return row >= grid.getDataLength(); } + function onHeaderMouseLeaveHandler() { + isMouseInHeader = false; + } + + function onHeaderMouseEnterHandler() { + isMouseInHeader = true; + isColumnsResized = false; + } + + function onColumnsResizedHandler() { + isColumnsResized = true; + } + function onClickHandler(event, args) { if (isRowHeader(args.cell)) { bypassDefaultActiveCellRangeChange = true; @@ -91,15 +118,19 @@ define([ } } + function isColumnsResizedAndCurrentlyInHeader() { + return isMouseInHeader && isColumnsResized; + } + function isClickingLastClickedHeader(clickedRow, clickedColumn) { return hasActiveCell() && grid.getActiveCell().row === clickedRow && grid.getActiveCell().cell === clickedColumn; } function isClickingInSelectedColumn(clickedColumn) { - var column = rangeSelectionHelper.rangeForColumn(grid, clickedColumn); + var column = RangeSelectionHelper.rangeForColumn(grid, clickedColumn); var cellSelectionModel = grid.getSelectionModel(); var ranges = cellSelectionModel.getSelectedRanges(); - return rangeSelectionHelper.isRangeSelected(ranges, column); + return RangeSelectionHelper.isRangeSelected(ranges, column); } function isRowHeader(cellClicked) { @@ -107,10 +138,10 @@ define([ } function isClickingInSelectedRow(rowClicked) { - var row = rangeSelectionHelper.rangeForRow(grid, rowClicked); + var row = RangeSelectionHelper.rangeForRow(grid, rowClicked); var cellSelectionModel = grid.getSelectionModel(); var ranges = cellSelectionModel.getSelectedRanges(); - return rangeSelectionHelper.isRangeSelected(ranges, row); + return RangeSelectionHelper.isRangeSelected(ranges, row); } function isSingleRangeSelected() { diff --git a/web/pgadmin/static/js/selection/column_selector.js b/web/pgadmin/static/js/selection/column_selector.js index b03c8cf3..8806b68c 100644 --- a/web/pgadmin/static/js/selection/column_selector.js +++ b/web/pgadmin/static/js/selection/column_selector.js @@ -1,4 +1,8 @@ -define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], function ($, rangeSelectionHelper) { +define([ + 'jquery', + 'sources/selection/range_selection_helper', + 'slickgrid' +], function ($, RangeSelectionHelper) { var ColumnSelector = function () { var Slick = window.Slick; var gridEventBus = new Slick.EventHandler(); @@ -16,11 +20,6 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func } $columnHeader.toggleClass('selected'); - if (!hasClickedOnCheckbox(event)) { - var $checkbox = $("[data-id='checkbox-" + columnDefinition.id + "']"); - toggleCheckbox($checkbox); - } - updateRanges(grid, columnDefinition.id); } }); @@ -29,14 +28,14 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func }; var handleSelectedRangesChanged = function (grid, event, ranges) { - $('[data-cell-type="column-header-row"] input:checked') - .each(function (index, checkbox) { - var $checkbox = $(checkbox); - var columnIndex = grid.getColumnIndex($checkbox.data('column-id')); - var isStillSelected = rangeSelectionHelper.isRangeSelected(ranges, - rangeSelectionHelper.rangeForColumn(grid, columnIndex)); + $('.slick-header-column.selected') + .each(function (index, columnHeader) { + var $spanHeaderColumn = $(columnHeader).find('[data-cell-type="column-header-row"]'); + var columnIndex = grid.getColumnIndex($spanHeaderColumn.data('column-id')); + var isStillSelected = RangeSelectionHelper.isRangeSelected(ranges, + RangeSelectionHelper.rangeForColumn(grid, columnIndex)); if (!isStillSelected) { - toggleCheckbox($checkbox); + $(columnHeader).toggleClass('selected') } }); }; @@ -47,13 +46,13 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func var columnIndex = grid.getColumnIndex(columnId); - var columnRange = rangeSelectionHelper.rangeForColumn(grid, columnIndex); + var columnRange = RangeSelectionHelper.rangeForColumn(grid, columnIndex); var newRanges; - if (rangeSelectionHelper.isRangeSelected(ranges, columnRange)) { - newRanges = rangeSelectionHelper.removeRange(ranges, columnRange); + if (RangeSelectionHelper.isRangeSelected(ranges, columnRange)) { + newRanges = RangeSelectionHelper.removeRange(ranges, columnRange); } else { - if (rangeSelectionHelper.areAllRangesSingleColumns(ranges, grid)) { - newRanges = rangeSelectionHelper.addRange(ranges, columnRange); + if (RangeSelectionHelper.areAllRangesSingleColumns(ranges, grid)) { + newRanges = RangeSelectionHelper.addRange(ranges, columnRange); } else { newRanges = [columnRange]; } @@ -61,36 +60,21 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func selectionModel.setSelectedRanges(newRanges); }; - var hasClickedOnCheckbox = function (event) { - return event.target.type == "checkbox" - }; - - var hasClickedChildOfColumnHeader = function (event) { return !$(event.target).hasClass("slick-header-column"); }; - var toggleCheckbox = function (checkbox) { - if (checkbox.prop("checked")) { - checkbox.prop("checked", false) - } else { - checkbox.prop("checked", true) - } - }; - var isColumnSelectable = function (columnDefinition) { return columnDefinition.selectable !== false; }; - var getColumnDefinitionsWithCheckboxes = function (columnDefinitions) { + var getColumnDefinitions = function (columnDefinitions) { return _.map(columnDefinitions, function (columnDefinition) { if (isColumnSelectable(columnDefinition)) { var name = "" + - " " + + " data-test='output-column-header'" + + " data-column-id='" + columnDefinition.id + "'>" + " " + columnDefinition.name + "" + ""; return _.extend(columnDefinition, { @@ -104,7 +88,7 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func $.extend(this, { "init": init, - "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes + "getColumnDefinitions": getColumnDefinitions }); }; return ColumnSelector; diff --git a/web/pgadmin/static/js/selection/grid_selector.js b/web/pgadmin/static/js/selection/grid_selector.js index 90eeacf8..ae4ab96d 100644 --- a/web/pgadmin/static/js/selection/grid_selector.js +++ b/web/pgadmin/static/js/selection/grid_selector.js @@ -23,18 +23,26 @@ define(['jquery', grid.registerPlugin(columnSelector); }; - var getColumnDefinitionsWithCheckboxes = function (columnDefinitions) { - columnDefinitions = columnSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions); - columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions); + var getColumnDefinitions = function (columnDefinitions) { + columnDefinitions = columnSelector.getColumnDefinitions(columnDefinitions); + columnDefinitions = rowSelector.getColumnDefinitions(columnDefinitions); columnDefinitions[0].selectAllOnClick = true; - columnDefinitions[0].name = '' + columnDefinitions[0].name; + columnDefinitions[0].name = '' + + '
' + + columnDefinitions[0].name + + '' + + '
'; return columnDefinitions; }; function handleSelectedRangesChanged(grid) { - $("[data-id='checkbox-select-all']").prop("checked", RangeSelectionHelper.isEntireGridSelected(grid)); + if(RangeSelectionHelper.isEntireGridSelected(grid)) { + $("[data-id='select-all']").addClass("selected"); + } else { + $("[data-id='select-all']").removeClass("selected"); + } } function toggleSelectAll(grid) { @@ -52,7 +60,7 @@ define(['jquery', $.extend(this, { "init": init, - "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes + "getColumnDefinitions": getColumnDefinitions }); }; diff --git a/web/pgadmin/static/js/selection/row_selector.js b/web/pgadmin/static/js/selection/row_selector.js index 9e539353..1088f879 100644 --- a/web/pgadmin/static/js/selection/row_selector.js +++ b/web/pgadmin/static/js/selection/row_selector.js @@ -1,4 +1,4 @@ -define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], function ($, rangeSelectionHelper) { +define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], function ($, RangeSelectionHelper) { var RowSelector = function () { var Slick = window.Slick; @@ -13,23 +13,25 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func var handleClick = function (grid, event, args) { if (grid.getColumns()[args.cell].id === 'row-header-column') { - if (event.target.type != "checkbox") { - var checkbox = $(event.target).find('input[type="checkbox"]'); - toggleCheckbox($(checkbox)); + var $rowHeaderSpan = $(event.target); + + if($rowHeaderSpan.data('cell-type') != "row-header-selector") { + $rowHeaderSpan = $(event.target).find('[data-cell-type="row-header-selector"]'); } + $rowHeaderSpan.toggleClass('selected'); updateRanges(grid, args.row); } }; var handleSelectedRangesChanged = function (grid, event, ranges) { - $('[data-cell-type="row-header-checkbox"]:checked') - .each(function (index, checkbox) { - var $checkbox = $(checkbox); - var row = parseInt($checkbox.data('row')); - var isStillSelected = rangeSelectionHelper.isRangeSelected(ranges, - rangeSelectionHelper.rangeForRow(grid, row)); + $('[data-cell-type="row-header-selector"].selected') + .each(function (index, rowHeaderSpan) { + var $rowHeaderSpan = $(rowHeaderSpan); + var row = parseInt($rowHeaderSpan.data('row')); + var isStillSelected = RangeSelectionHelper.isRangeSelected(ranges, + RangeSelectionHelper.rangeForRow(grid, row)); if (!isStillSelected) { - toggleCheckbox($checkbox); + $rowHeaderSpan.toggleClass('selected'); } }); }; @@ -38,47 +40,40 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func var selectionModel = grid.getSelectionModel(); var ranges = selectionModel.getSelectedRanges(); - var rowRange = rangeSelectionHelper.rangeForRow(grid, rowId); + var rowRange = RangeSelectionHelper.rangeForRow(grid, rowId); var newRanges; - if (rangeSelectionHelper.isRangeSelected(ranges, rowRange)) { - newRanges = rangeSelectionHelper.removeRange(ranges, rowRange); + if (RangeSelectionHelper.isRangeSelected(ranges, rowRange)) { + newRanges = RangeSelectionHelper.removeRange(ranges, rowRange); } else { - if (rangeSelectionHelper.areAllRangesSingleRows(ranges, grid)) { - newRanges = rangeSelectionHelper.addRange(ranges, rowRange); + if (RangeSelectionHelper.areAllRangesSingleRows(ranges, grid)) { + newRanges = RangeSelectionHelper.addRange(ranges, rowRange); } else { newRanges = [rowRange]; } } selectionModel.setSelectedRanges(newRanges); - } - - var toggleCheckbox = function (checkbox) { - if (checkbox.prop("checked")) { - checkbox.prop("checked", false) - } else { - checkbox.prop("checked", true) - } }; - var getColumnDefinitionsWithCheckboxes = function (columnDefinitions) { + var getColumnDefinitions = function (columnDefinitions) { columnDefinitions.unshift({ id: 'row-header-column', name: '', selectable: false, focusable: false, formatter: function (rowIndex) { - return '' - } + 'data-cell-type="row-header-selector"/>' + }, + width: 30 }); return columnDefinitions; }; $.extend(this, { "init": init, - "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes + "getColumnDefinitions": getColumnDefinitions }); }; diff --git a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css index d2d9d079..8695b11e 100644 --- a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css +++ b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css @@ -469,6 +469,6 @@ input.editor-checkbox:focus { } .select-all-icon { - margin-left: 12px; + margin-left: 9px; vertical-align: bottom; } \ No newline at end of file diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js index c064a9bb..310c6f5b 100644 --- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js @@ -631,7 +631,7 @@ define( }); var gridSelector = new GridSelector(); - grid_columns = gridSelector.getColumnDefinitionsWithCheckboxes(grid_columns); + grid_columns = gridSelector.getColumnDefinitions(grid_columns); var grid_options = { editable: true, diff --git a/web/regression/javascript/selection/active_cell_capture_spec.js b/web/regression/javascript/selection/active_cell_capture_spec.js index 46c24776..a0bd3848 100644 --- a/web/regression/javascript/selection/active_cell_capture_spec.js +++ b/web/regression/javascript/selection/active_cell_capture_spec.js @@ -13,7 +13,12 @@ define([ ], function (ActiveCellCapture, RangeSelectionHelper) { describe('ActiveCellCapture', function () { var grid, activeCellPlugin, getSelectedRangesSpy, setSelectedRangesSpy; - var onHeaderClickFunction, onClickFunction; + var onHeaderClickFunction; + var onClickFunction; + var onColumnsResizedFunction; + var onHeaderMouseEnterFunction; + var onHeaderMouseLeaveFunction; + beforeEach(function () { getSelectedRangesSpy = jasmine.createSpy('getSelectedRangesSpy'); setSelectedRangesSpy = jasmine.createSpy('setSelectedRangesSpy'); @@ -38,6 +43,9 @@ define([ onHeaderClick: jasmine.createSpy('onHeaderClick'), onClick: jasmine.createSpy('onClick'), onKeyDown: jasmine.createSpyObj('onKeyDown', ['subscribe']), + onColumnsResized: jasmine.createSpyObj('onColumnsResized', ['subscribe']), + onHeaderMouseEnter: jasmine.createSpyObj('onHeaderMouseEnter', ['subscribe']), + onHeaderMouseLeave: jasmine.createSpyObj('onHeaderMouseLeave', ['subscribe']), getDataLength: function () { return 10 }, @@ -47,13 +55,30 @@ define([ }; activeCellPlugin = new ActiveCellCapture(); - grid.onHeaderClick.subscribe = jasmine.createSpy('subscribe').and.callFake(function (callback) { - onHeaderClickFunction = callback.bind(activeCellPlugin); - }); + grid.onHeaderClick.subscribe = + jasmine.createSpy('subscribe').and.callFake(function (callback) { + onHeaderClickFunction = callback.bind(activeCellPlugin); + }); - grid.onClick.subscribe = jasmine.createSpy('subscribe').and.callFake(function (callback) { - onClickFunction = callback.bind(activeCellPlugin); - }); + grid.onClick.subscribe = + jasmine.createSpy('subscribe').and.callFake(function (callback) { + onClickFunction = callback.bind(activeCellPlugin); + }); + + grid.onColumnsResized.subscribe = + jasmine.createSpy('subscribe').and.callFake(function (callback) { + onColumnsResizedFunction = callback.bind(activeCellPlugin); + }); + + grid.onHeaderMouseEnter.subscribe = + jasmine.createSpy('subscribe').and.callFake(function (callback) { + onHeaderMouseEnterFunction = callback.bind(activeCellPlugin); + }); + + grid.onHeaderMouseLeave.subscribe = + jasmine.createSpy('subscribe').and.callFake(function (callback) { + onHeaderMouseLeaveFunction = callback.bind(activeCellPlugin); + }); activeCellPlugin.init(grid); }); @@ -93,13 +118,91 @@ define([ describe('when the same column is clicked', function () { beforeEach(function () { - onHeaderClickFunction({}, {column: {pos: 1}}) + onHeaderClickFunction({}, {column: {pos: 1}}); }); it('should reset the active cell', function () { expect(grid.resetActiveCell).toHaveBeenCalled(); }); }); + + describe('when mouse is inside the header row', function () { + beforeEach(function () { + onHeaderMouseEnterFunction({}, {}); + }); + + describe('when user finishes resizing the selected column', function () { + var eventSpy; + + beforeEach(function () { + eventSpy = jasmine.createSpyObj('event', ['stopPropagation']); + onColumnsResizedFunction({}, {grid: grid}); + onHeaderClickFunction(eventSpy, {column: {pos: 1}}); + }); + + it('should not deselect the current selected column', function () { + expect(grid.setActiveCell).not.toHaveBeenCalled(); + expect(grid.resetActiveCell).not.toHaveBeenCalled(); + }); + + it('should prevent further event propagation', function () { + expect(eventSpy.stopPropagation).toHaveBeenCalled(); + }); + + describe('when the user clicks the resized column header', function () { + beforeEach(function () { + eventSpy.stopPropagation.calls.reset(); + onHeaderClickFunction(eventSpy, {column: {pos: 2}}); + }); + + it('should change the active cell', function () { + expect(grid.setActiveCell).toHaveBeenCalledWith(0, 3); + expect(grid.resetActiveCell).not.toHaveBeenCalled(); + }); + + it('should allow further event propagation', function () { + expect(eventSpy.stopPropagation).not.toHaveBeenCalled(); + }); + }); + }); + }); + + describe('when mouse is outside the header row', function () { + beforeEach(function () { + onHeaderMouseEnterFunction({}, {}); + onHeaderMouseLeaveFunction({}, {}); + }); + + describe('when user finishes resizing the selected column', function () { + beforeEach(function () { + onColumnsResizedFunction({}, {grid: grid}); + }); + + it('should not deselect the current selected column', function () { + expect(grid.setActiveCell).not.toHaveBeenCalled(); + expect(grid.resetActiveCell).not.toHaveBeenCalled(); + }); + + describe('when the user clicks another column header', function () { + var eventSpy; + + beforeEach(function () { + eventSpy = jasmine.createSpyObj('event', ['stopPropagation']); + onHeaderMouseEnterFunction({}, {}); + onHeaderClickFunction(eventSpy, {column: {pos: 3}}); + }); + + it('should change the active cell', function () { + expect(grid.setActiveCell).toHaveBeenCalledWith(0, 4); + expect(grid.resetActiveCell).not.toHaveBeenCalled(); + }); + + it('should allow further event propagation', function () { + expect(eventSpy.stopPropagation).not.toHaveBeenCalled(); + }); + }); + }); + }); }); describe('when three non-consecutive columns are selected', function () { diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js index 2b0c645f..7e6f2a5f 100644 --- a/web/regression/javascript/selection/column_selector_spec.js +++ b/web/regression/javascript/selection/column_selector_spec.js @@ -62,26 +62,6 @@ define( ]; }); - describe("when a column is not selectable", function () { - it("does not create a checkbox for selecting the column", function () { - var checkboxColumn = { - name: 'some-column-name-4', - selectable: false - }; - columns.push(checkboxColumn); - - setupGrid(columns); - - expect(container.find('.slick-header-columns input').length).toBe(3) - }); - }); - - it("renders a checkbox in the column header", function () { - setupGrid(columns); - - expect(container.find('.slick-header-columns input').length).toBe(3) - }); - it("displays the name of the column", function () { setupGrid(columns); @@ -93,7 +73,7 @@ define( it("preserves the other attributes of column definitions", function () { var columnSelector = new ColumnSelector(); - var selectableColumns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); + var selectableColumns = columnSelector.getColumnDefinitions(columns); expect(selectableColumns[1].id).toBe('1'); }); @@ -102,7 +82,7 @@ define( var grid, cellSelectionModel; beforeEach(function () { var columnSelector = new ColumnSelector(); - columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); + columns = columnSelector.getColumnDefinitions(columns); data = []; for (var i = 0; i < 10; i++) { data.push({ @@ -134,7 +114,7 @@ define( expectOnlyTheFirstColumnToBeSelected(selectedRanges); }); - xit("toggles a selected class to the header cell", function () { + it("toggles a selected class to the header cell", function () { container.find('.slick-header-column:contains(second column)').click(); expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected')) .toBe(true); @@ -217,7 +197,7 @@ define( expectOnlyTheFirstColumnToBeSelected(selectedRanges); }); - xit("toggles a selected class to the header cell", function () { + it("toggles a selected class to the header cell", function () { container.find('.slick-header-column span.column-description:contains(second column)').click(); expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected')) .toBe(true); @@ -225,8 +205,8 @@ define( container.find('.slick-header-column span.column-description:contains(second column)').click(); expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected')) .toBe(false); - }); + }); describe("when a row is selected", function () { beforeEach(function () { @@ -234,81 +214,74 @@ define( cellSelectionModel.setSelectedRanges(selectedRanges); }); - it("deselects the row", function () { - container.find('.slick-header-column')[1].click(); - var selectedRanges = cellSelectionModel.getSelectedRanges(); + it("deselects the row", function () { + container.find('.slick-header-column')[1].click(); + var selectedRanges = cellSelectionModel.getSelectedRanges(); + + expect(selectedRanges.length).toBe(1); - expect(selectedRanges.length).toBe(1); + var column = selectedRanges[0]; - var column = selectedRanges[0]; + expect(column.fromCell).toBe(1); + expect(column.toCell).toBe(1); + expect(column.fromRow).toBe(0); + expect(column.toRow).toBe(9); + }) + }); - expect(column.fromCell).toBe(1); - expect(column.toCell).toBe(1); - expect(column.fromRow).toBe(0); - expect(column.toRow).toBe(9); - }) + describe("clicking a second time", function () { + beforeEach(function () { + container.find('.slick-header-column')[1].click(); }); - describe("clicking a second time", function () { - beforeEach(function () { - container.find('.slick-header-column')[1].click(); - }); + it("deselects the column", function () { + container.find('.slick-header-column')[1].click(); + var selectedRanges = cellSelectionModel.getSelectedRanges(); - it("unchecks checkbox", function () { - container.find('.slick-header-column')[1].click(); - expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy(); - }); + expect(selectedRanges.length).toEqual(0); + }) + }); - it("deselects the column", function () { - container.find('.slick-header-column')[1].click(); - var selectedRanges = cellSelectionModel.getSelectedRanges(); + describe("when the column is not selectable", function () { + it("does not select the column", function () { + $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click(); + var selectedRanges = cellSelectionModel.getSelectedRanges(); - expect(selectedRanges.length).toEqual(0); - }) + expect(selectedRanges.length).toEqual(0); }); + }); - describe("when the column is not selectable", function () { - it("does not select the column", function () { - $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click(); - var selectedRanges = cellSelectionModel.getSelectedRanges(); - - expect(selectedRanges.length).toEqual(0); - }); + describe("when the column is deselected through setSelectedRanges", function () { + beforeEach(function () { + container.find('.slick-header-column')[1].click(); }); - describe("when the column is deselected through setSelectedRanges", function () { - beforeEach(function () { - container.find('.slick-header-column')[1].click(); - }); - - xit("removes selected class from header", function () { - cellSelectionModel.setSelectedRanges([]); + it("removes selected class from header", function () { + cellSelectionModel.setSelectedRanges([]); - expect($(container.find('.slick-header-column')[1]).hasClass('selected')) - .toBe(false); - - }); + expect($(container.find('.slick-header-column')[1]).hasClass('selected')) + .toBe(false); }); + }); - describe("when a non-column range was already selected", function () { - beforeEach(function () { - var selectedRanges = [new Slick.Range(0, 0, 1, 0)]; - cellSelectionModel.setSelectedRanges(selectedRanges); - }); + describe("when a non-column range was already selected", function () { + beforeEach(function () { + var selectedRanges = [new Slick.Range(0, 0, 1, 0)]; + cellSelectionModel.setSelectedRanges(selectedRanges); + }); - it("deselects the non-column range", function () { - container.find('.slick-header-column:contains(some-column-name)').click(); + it("deselects the non-column range", function () { + container.find('.slick-header-column:contains(some-column-name)').click(); - var selectedRanges = cellSelectionModel.getSelectedRanges(); - expectOnlyTheFirstColumnToBeSelected(selectedRanges); - }) - }); + var selectedRanges = cellSelectionModel.getSelectedRanges(); + expectOnlyTheFirstColumnToBeSelected(selectedRanges); + }) }); - }); + function setupGrid(columns) { var columnSelector = new ColumnSelector(); - columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); + columns = columnSelector.getColumnDefinitions(columns); var grid = new SlickGrid(container, data, columns, options); var cellSelectionModel = new Slick.CellSelectionModel(); @@ -337,6 +310,5 @@ define( $(container.find('.grid-canvas')).trigger(pressEvent); } - }); - }); + }); \ No newline at end of file diff --git a/web/regression/javascript/selection/grid_selector_spec.js b/web/regression/javascript/selection/grid_selector_spec.js index 05d1208d..5ea63692 100644 --- a/web/regression/javascript/selection/grid_selector_spec.js +++ b/web/regression/javascript/selection/grid_selector_spec.js @@ -22,7 +22,7 @@ define(["jquery", }]; gridSelector = new GridSelector(); - columns = gridSelector.getColumnDefinitionsWithCheckboxes(columns); + columns = gridSelector.getColumnDefinitions(columns); data = []; for (var i = 0; i < 10; i++) { @@ -50,11 +50,7 @@ define(["jquery", expect(leftmostColumn.id).toBe('row-header-column'); }); - it("renders checkboxes for selecting columns", function () { - expect(container.find('[data-test="output-column-header"] input').length).toBe(2) - }); - - it("renders a checkbox for selecting all the cells", function () { + it("renders a button for selecting all the cells", function () { expect(container.find("[title='Select/Deselect All']").length).toBe(1); }); @@ -71,20 +67,14 @@ define(["jquery", expect(selectedRange.toRow).toBe(9); }); - it("checks the checkbox", function () { + it("adds selected class", function () { container.find("[title='Select/Deselect All']").parent().click(); - expect($(container.find("[data-id='checkbox-select-all']")).is(':checked')).toBeTruthy(); - }) + expect($(container.find("[data-id='select-all']")).hasClass('selected')).toBeTruthy(); + }); }); - describe("when the main checkbox in the corner gets selected", function () { - it("unchecks all the columns", function () { - container.find("[title='Select/Deselect All']").click(); - - expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy(); - expect($(container.find('.slick-header-columns input')[2]).is(':checked')).toBeFalsy(); - }); + describe("when the select all button in the corner gets selected", function () { it("selects all the cells", function () { container.find("[title='Select/Deselect All']").click(); @@ -98,7 +88,7 @@ define(["jquery", expect(selectedRange.toRow).toBe(9); }); - describe("when the main checkbox in the corner gets deselected", function () { + describe("when the select all button in the corner gets deselected", function () { beforeEach(function () { container.find("[title='Select/Deselect All']").click(); }); @@ -116,11 +106,10 @@ define(["jquery", container.find("[title='Select/Deselect All']").click(); }); - it("unchecks the main checkbox", function () { - var ranges = [new Slick.Range(0, 0, 0, 1)]; - rowSelectionModel.setSelectedRanges(ranges); + it("removes the selected class", function () { + container.find("[title='Select/Deselect All']").parent().click(); - expect($(container.find("[title='Select/Deselect All']")).is(':checked')).toBeFalsy(); + expect($(container.find("[data-id='select-all']")).hasClass('selected')).toBeFalsy(); }); }); }); diff --git a/web/regression/javascript/selection/row_selector_spec.js b/web/regression/javascript/selection/row_selector_spec.js index 5907c449..78348bca 100644 --- a/web/regression/javascript/selection/row_selector_spec.js +++ b/web/regression/javascript/selection/row_selector_spec.js @@ -36,7 +36,7 @@ define( for (var i = 0; i < 10; i++) { data.push(['some-value-' + i, 'second value ' + i]); } - columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions); + columnDefinitions = rowSelector.getColumnDefinitions(columnDefinitions); grid = new SlickGrid(container, data, columnDefinitions); grid.registerPlugin(new ActiveCellCapture()); @@ -64,7 +64,7 @@ define( it("renders a span on the leftmost column", function () { expect(container.find('.slick-row').length).toBe(10); - expect(container.find('.slick-row .slick-cell:first-child input[type="checkbox"]').length).toBe(10); + expect(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]').length).toBe(10); }); it("preserves the other attributes of column definitions", function () { @@ -75,17 +75,17 @@ define( describe("selecting rows", function () { describe("when the user clicks a row header span", function () { it("selects the row", function () { - container.find('.slick-row .slick-cell:first-child input[type="checkbox"]')[0].click(); + container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[0].click(); var selectedRanges = cellSelectionModel.getSelectedRanges(); expectOnlyTheFirstRowToBeSelected(selectedRanges); }); - it("checks the checkbox", function () { - container.find('.slick-row .slick-cell:first-child input[type="checkbox"]')[5].click(); + it("add selected class to span", function () { + container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[5].click(); - expect($(container.find('.slick-row .slick-cell:first-child input[type="checkbox"]')[5]) - .is(':checked')).toBeTruthy(); + expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[5]) + .hasClass('selected')).toBeTruthy(); }); }); @@ -97,11 +97,11 @@ define( expectOnlyTheFirstRowToBeSelected(selectedRanges); }); - it("checks the checkbox", function () { + it("add selected class to span", function () { container.find('.slick-row .slick-cell:first-child')[7].click(); - expect($(container.find('.slick-row .slick-cell:first-child input[type="checkbox"]')[7]) - .is(':checked')).toBeTruthy(); + expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[7]) + .hasClass('selected')).toBeTruthy(); }); }); @@ -142,11 +142,11 @@ define( container.find('.slick-row .slick-cell:first-child')[4].click(); }); - it("should uncheck the checkbox", function () { + it("should remove the selected class", function () { cellSelectionModel.setSelectedRanges([]); - expect($(container.find('.slick-row .slick-cell:first-child input[type="checkbox"]')[4]) - .is(':checked')).toBeFalsy(); + expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[4]) + .hasClass('selected')).toBeFalsy(); }); }); @@ -155,10 +155,10 @@ define( container.find('.slick-row .slick-cell:first-child')[1].click(); }); - it("unchecks checkbox", function () { + it("removes the selected class", function () { container.find('.slick-row .slick-cell:first-child')[1].click(); - expect($(container.find('.slick-row .slick-cell:first-child input[type="checkbox"]')[1]) - .is(':checked')).toBeFalsy(); + expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1]) + .hasClass('selected')).toBeFalsy(); }); it("unselects the row", function () { diff --git a/web/regression/javascript/slickgrid/cell_selector_spec.js b/web/regression/javascript/slickgrid/cell_selector_spec.js index f1178541..841ea72b 100644 --- a/web/regression/javascript/slickgrid/cell_selector_spec.js +++ b/web/regression/javascript/slickgrid/cell_selector_spec.js @@ -9,13 +9,13 @@ define(["jquery", "slickgrid/slick.grid", - "slickgrid/slick.rowselectionmodel", + "slickgrid/slick.cellselectionmodel", "sources/slickgrid/cell_selector", "sources/selection/range_selection_helper" ], - function ($, SlickGrid, RowSelectionModel, CellSelector, RangeSelectionHelper) { + function ($, SlickGrid, CellSelectionModel, CellSelector, RangeSelectionHelper) { describe("CellSelector", function () { - var container, columns, cellSelector, data, rowSelectionModel, grid; + var container, columns, cellSelector, data, cellSelectionModel, grid; beforeEach(function () { container = $("
"); container.height(9999); @@ -34,8 +34,8 @@ define(["jquery", } grid = new SlickGrid(container, data, columns); - rowSelectionModel = new RowSelectionModel(); - grid.setSelectionModel(rowSelectionModel); + cellSelectionModel = new CellSelectionModel(); + grid.setSelectionModel(cellSelectionModel); grid.registerPlugin(cellSelector); grid.invalidate(); @@ -52,7 +52,7 @@ define(["jquery", var row = 1, column = 0; $(container.find(".slick-row .slick-cell.l" + column)[row]).click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); + var selectedRanges = cellSelectionModel.getSelectedRanges(); expect(selectedRanges.length).toBe(1); expect(selectedRanges[0].fromCell).toBe(0); expect(selectedRanges[0].toCell).toBe(0); @@ -62,14 +62,14 @@ define(["jquery", it("deselects previously selected ranges", function () { var row2Range = RangeSelectionHelper.rangeForRow(grid, 2); - var ranges = RangeSelectionHelper.addRange(rowSelectionModel.getSelectedRanges(), + var ranges = RangeSelectionHelper.addRange(cellSelectionModel.getSelectedRanges(), row2Range); - rowSelectionModel.setSelectedRanges(ranges); + cellSelectionModel.setSelectedRanges(ranges); var row = 4, column = 1; $(container.find(".slick-row .slick-cell.l" + column)[row]).click(); - expect(RangeSelectionHelper.isRangeSelected(rowSelectionModel.getSelectedRanges(), row2Range)) + expect(RangeSelectionHelper.isRangeSelected(cellSelectionModel.getSelectedRanges(), row2Range)) .toBe(false); }); });