56 lines
1.8 KiB
CoffeeScript
56 lines
1.8 KiB
CoffeeScript
import Ember from 'ember'
|
|
import layout from '../templates/components/sortable-table-header'
|
|
|
|
export default Ember.Component.extend
|
|
layout: layout
|
|
tagName: 'th'
|
|
classNames: ['sortable-table-header']
|
|
classNameBindings: ['isSortedByKey:sorted:not-sorted-by', 'sortDirectionClass']
|
|
filters: Ember.Object.create()
|
|
tScope: ''
|
|
defaultDirection: '' # asc or desc
|
|
direction: 'asc'
|
|
init: ->
|
|
@_super arguments...
|
|
Ember.defineProperty @, 'filter_calls', Ember.computed.alias("filters.filter_calls")
|
|
|
|
sortDirectionClass: Ember.computed 'isSortedByKey', ->
|
|
return false unless @get('isSortedByKey')
|
|
if @get('direction') is 'desc' then 'descending' else 'ascending'
|
|
|
|
|
|
isSortedByKey: Ember.computed 'filters.s', ->
|
|
return false unless s = @get('filters.s')
|
|
if Ember.isArray s
|
|
return false unless sort_statement = Ember.get(s, 'firstObject')
|
|
else if typeof s is 'string'
|
|
sort_statement = s
|
|
else
|
|
false
|
|
[sort_key, direction] = sort_statement.split(/\s+/)
|
|
direction ||= 'asc'
|
|
@set 'direction', direction
|
|
sort_key is @get('key')
|
|
|
|
headerContent: Ember.computed 'key', 'tScope', ->
|
|
return '?' unless key = @get('key')
|
|
if t_scope = @get('tScope')
|
|
t key, scope: t_scope
|
|
else
|
|
key.replace(/[_\W]+/g, ' ').capitalize()
|
|
|
|
click: ->
|
|
return unless key = @get('key')
|
|
if isSortedByKey = @get('isSortedByKey')
|
|
if @get('direction') is 'asc'
|
|
@set 'filters.s', "#{key} desc"
|
|
else
|
|
@set 'filters.s', "#{key} asc"
|
|
else
|
|
default_direction = @get('defaultDirection')
|
|
default_direction ||= if key.match /date|(_at$)/ then 'desc' else 'asc'
|
|
default_direction = 'asc' if default_direction is 'ascending'
|
|
default_direction = 'desc' if default_direction is 'descending'
|
|
@set 'filters.s', "#{key} #{default_direction}"
|
|
@get('model')?.reload?()
|