Skip to content

Commit

Permalink
Merge pull request #28 from AdamWard1995/fix_selection
Browse files Browse the repository at this point in the history
Make selection behaviour match ember-frost-list
  • Loading branch information
quincyle committed Jul 31, 2017
2 parents d1d0b6a + b1e11f3 commit aecbe0d
Show file tree
Hide file tree
Showing 9 changed files with 299 additions and 118 deletions.
24 changes: 22 additions & 2 deletions addon/components/frost-fixed-table.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export default Component.extend({

// == Keyword Properties ====================================================

classNameBindings: ['_isShiftDown:shift-down'],
layout,

// == PropTypes =============================================================
Expand All @@ -32,6 +33,7 @@ export default Component.extend({
onSelectionChange: PropTypes.func,

// state
_isShiftDown: PropTypes.bool,
_itemComparator: PropTypes.func,

_rangeState: PropTypes.shape({
Expand Down Expand Up @@ -421,10 +423,26 @@ export default Component.extend({
}
},

setShift (event) {
if (!this.isDestroyed) {
this.set('_isShiftDown', event.shiftKey)
}
},

// == DOM Events ============================================================

// == Lifecycle Hooks =======================================================

init () {
this._super(...arguments)
this._keyHandler = this.setShift.bind(this)
$(document).on(`keyup.${this.elementId} keydown.${this.elementId}`, this._keyHandler)
},

willDestroy () {
$(document).off(`keyup.${this.elementId} keydown.${this.elementId}`, this._keyHandler)
},

/**
* Set up synced scrolling as well as calculating padding for middle sections
*/
Expand Down Expand Up @@ -454,8 +472,10 @@ export default Component.extend({
this.onCallback({action, args, col, row})
},

_clickRow (row) {
this.$(`${this.get('_bodyLeftSelector')} .frost-table-row`).eq(row).trigger('click')
_clickRow (row, event) {
const leftSectionRow = this.$(`${this.get('_bodyLeftSelector')} .frost-table-row`).eq(row)
event.target = leftSectionRow[0]
leftSectionRow.trigger(event)
},

_select ({isRangeSelect, isSpecificSelect, item}) {
Expand Down
19 changes: 16 additions & 3 deletions addon/components/frost-table-row.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
*/

import Ember from 'ember'
const {isEmpty} = Ember
const {ViewUtils, isEmpty} = Ember
const {isSimpleClick} = ViewUtils
import computed, {readOnly} from 'ember-computed-decorators'
import {Component} from 'ember-frost-core'
import {ColumnPropType, ItemPropType} from 'ember-frost-table/typedefs'
import {PropTypes} from 'ember-prop-types'

import layout from '../templates/components/frost-table-row'
import {click} from '../utils/selection'

export default Component.extend({
// == Dependencies ==========================================================
Expand Down Expand Up @@ -64,7 +64,20 @@ export default Component.extend({
// == DOM Events ============================================================

click (event) {
click(event, this.onSelect, this.get('item'))
const isRangeSelect = event.shiftKey
const isSpecificSelect = false

// Only process simple clicks or clicks with the acceptable modifiers
if (isSimpleClick(event) || isRangeSelect) {
event.preventDefault()
event.stopPropagation()

this.onSelect({
isRangeSelect,
isSpecificSelect,
item: this.get('item')
})
}
},

// == Lifecycle Hooks =======================================================
Expand Down
12 changes: 12 additions & 0 deletions addon/components/frost-table.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* global $ */
/**
* Component definition for the frost-table component
*/
Expand Down Expand Up @@ -118,6 +119,17 @@ export default Component.extend({

// == Lifecycle Hooks =======================================================

init () {
this._super(...arguments)
this._keyHandler = this.setShift.bind(this)
$(document).on(`keyup.${this.elementId} keydown.${this.elementId}`, this._keyHandler)
},

willDestroyElement () {
this._super(...arguments)
$(document).off(`keyup.${this.elementId} keydown.${this.elementId}`, this._keyHandler)
},

didRender () {
const selectable = this.get('_isSelectable')
let totalWidth = 0
Expand Down
5 changes: 5 additions & 0 deletions app/styles/ember-frost-table/_frost-fixed-table.scss
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,9 @@ $frost-fixed-table-selected-cell-border-width: 1px;
flex: 1 0 auto;
vertical-align: middle;
}

&.shift-down {
// Range select doesn't select text
user-select: none;
}
}
40 changes: 40 additions & 0 deletions tests/helpers/selection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* global $ */
import {expect} from 'chai'
import {$hook} from 'ember-hook'

function createRangeSelectEvent () {
const e = $.Event('click')
e.shiftKey = true
return e
}

export function assertRowsSelected (rowHook, ...rowNumbers) {
const rows = $hook(rowHook)
let remainingRows = rows
for (let rowNumber of rowNumbers) {
const row = rows.eq(rowNumber)
expect(row).to.have.class('is-selected')
remainingRows = remainingRows.not(row)
}

// ensure remaining rows aren't selected
expect(remainingRows).to.not.have.class('is-selected')
}

export function rowBodyRangeSelect (rowHook, row1, row2) {
$hook(rowHook, {row: row1}).trigger(createRangeSelectEvent())
$hook(rowHook, {row: row2}).trigger(createRangeSelectEvent())
}

export function rowBodySingleSelect (rowHook, row) {
$hook(rowHook, {row}).click()
}

export function rowCheckboxRangeSelect (rowHook, row1, row2) {
$hook(`${rowHook}-selectionCell`, {row: row1}).trigger(createRangeSelectEvent())
$hook(`${rowHook}-selectionCell`, {row: row2}).trigger(createRangeSelectEvent())
}

export function rowCheckboxSingleSelect (rowHook, row) {
$hook(`${rowHook}-selectionCell`, {row}).click()
}
Loading

0 comments on commit aecbe0d

Please sign in to comment.