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 $("") continue filters[dim.id] = {} dropdown = $("""').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($ "") 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
#{label dim}").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 = $('
#{col}