label = (obj) ->
if 'label' of obj
return obj.label
return obj.id
# TODO: This escalated quickly. Use nicer way to track
# the state (eg. via pushstate etc)
@table_view = (el, columns, dataurl, datalen, pagelen=100) ->
container = $('
').appendTo el
filterlink = $('
View filtered resource ').appendTo container
filterlink.hide()
hdrdiv = $('
')#.appendTo container
table = $('
').appendTo container
header = $('').appendTo table
headers = $('').appendTo header
actual_url = dataurl
n_pages = Math.round datalen/pagelen + 0.5
filters = {}
refilter = ->
param = {}
for dim, cats of filters
enabled_cats = (cat for cat, enabled of cats when enabled)
if enabled_cats.length == 0
continue
param[dim] = enabled_cats.join(',')
if _.isEmpty param
actual_url = dataurl
filterlink.removeAttr('href')
filterlink.addClass 'disabled'
filterlink.hide()
else
actual_url = dataurl + 'filter&' + $.param(param) + "/"
filterlink.attr('href', '?resource=' + encodeURIComponent actual_url)
filterlink.removeClass 'disabled'
filterlink.show()
$.getJSON(actual_url).done (spec) ->
n_pages = Math.round spec.length/pagelen + 0.5
load_data 1
for dim in columns
if 'categories' not of dim
headers.append $("#{label dim} ")
continue
filters[dim.id] = {}
dropdown = $("""""")
for cat in dim.categories
dropdown.append $ """
#{label cat}
"""
headers.append $("").append dropdown
dropdown.multiselect
buttonText: do (dim) ->-> label dim
buttonTitle: do (dim) ->-> dim.id
onChange: do (dim) -> (el, selected) ->
field = el.val()
if selected
filters[dim.id][field] = true
else
filters[dim.id][field] = false
refilter()
enableCaseInsensitiveFiltering: true
hack_multiselect_tooltips dropdown, dim
body = $(' ').appendTo table
footer = $('').appendTo container
load_data = (page) ->
start = (page-1)*pagelen
end = start + pagelen
body.empty()
footer.empty()
hdrdiv.empty()
param = $.param
start: start
end: end
labels: true
url = actual_url + 'table?' + param
$.ajax(url).done (rows) ->
for row in rows
rowel = $('
').appendTo body
for col in row
rowel.append($ "#{col} ")
if page > 1
prev = $('< Previous ')
.appendTo(footer)
prev.click -> load_data page-1
hdrdiv.append prev.clone(true)
$(" page #{page} of #{n_pages} ")
.appendTo(footer)
.clone(true).appendTo(hdrdiv)
if page < n_pages
next = $('Next > ')
.appendTo(footer)
next.click -> load_data page+1
hdrdiv.append next.clone(true)
load_data 1
hack_multiselect_tooltips = (el, dim) ->
container = el.parent()
dropdown = container.find(".multiselect-container")
dropdown.find('input[type="checkbox"]').each ->
val = $(@).val()
$(@).parent().parent().parent().prop "title", val
container.find("> .btn-group > .button").prop "title", dim.id