#--
# Copyright (c) 2010-2011 Peter Horn, Provideal GmbH
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#++
require 'whiny_hash'
class Tabulatr
# Hash keeping the defaults for the table options, may be overriden in the
# table_for call
TABLE_OPTIONS = WhinyHash.new({ # WhinyHash.new({
remote: false, # add data-remote="true" to form
form_class: 'tabulatr_form', # class of the overall form
table_class: 'tabulatr_table', # class for the actual data table
sortable_class: 'sortable', # class for the header of a sortable column
sorting_asc_class: 'sorting-asc', # class for the currently asc sorting column
sorting_desc_class: 'sorting-desc', # class for the currently desc sorting column
page_left_class: 'page-left', # class for the page left button
page_right_class: 'page-right', # class for the page right button
page_no_class: 'page-no', # class for the page no
control_div_class_before: 'table-controls', # class of the upper div containing the paging and batch action controls
control_div_class_after: 'table-controls', # class of the lower div containing the paging and batch action controls
paginator_div_class: 'paginator', # class of the div containing the paging controls
batch_actions_div_class: 'batch-actions', # class of the div containing the batch action controls
select_controls_div_class: 'check-controls', # class of the div containing the check controls
submit_class: 'submit-table', # class of submit button
pagesize_select_class: 'pagesize_select', # class of the pagesize select element
select_all_class: 'select-btn', # class of the select all button
select_none_class: 'select-btn', # class of the select none button
select_visible_class: 'select-btn', # class of the select visible button
unselect_visible_class: 'select-btn', # class of the unselect visible button
select_filtered_class: 'select-btn', # class of the select filtered button
unselect_filtered_class: 'select-btn', # class of the unselect filteredbutton
info_text_class: 'info-text', # class of the info text div
batch_actions_label: 'Batch Action: ', # Text to show in front of the batch action select
batch_actions_type: :select, # :select or :button depending on the kind of input you want
batch_actions_class: 'batch-action-inputs', # class to apply on the batch action input elements
submit_label: 'Apply', # Text on the submit button
select_all_label: 'Select All', # Text on the select all button
select_none_label: 'Select None', # Text on the select none button
select_visible_label: 'Select visible', # Text on the select visible button
unselect_visible_label: 'Unselect visible', # Text on the unselect visible button
select_filtered_label: 'Select filtered', # Text on the select filtered button
unselect_filtered_label: 'Unselect filtered',# Text on the unselect filtered button
info_text: "Showing %1$d, total %2$d, selected %3$d, matching %4$d",
# which controls to be rendered above and below the tabel and in which order
before_table_controls: [:submit, :paginator, :batch_actions, :select_controls, :info_text],
after_table_controls: [],
# whih selecting controls to render in which order
select_controls: [:select_all, :select_none, :select_visible, :unselect_visible,
:select_filtered, :unselect_filtered],
image_path_prefix: '/images/tabulatr/',
pager_left_button: 'left.gif',
pager_left_button_inactive: 'left_off.gif',
pager_right_button: 'right.gif',
pager_right_button_inactive: 'right_off.gif',
sort_up_button: 'up.gif',
sort_up_button_inactive: 'up_off.gif',
sort_down_button: 'down.gif',
sort_down_button_inactive: 'down_off.gif',
make_form: true, # whether or not to wrap the whole table (incl. controls) in a form
table_html: false, # a hash with html attributes for the table
row_html: false, # a hash with html attributes for the normal trs
header_html: false, # a hash with html attributes for the header trs
filter_html: false, # a hash with html attributes for the filter trs
filter: true, # false for no filter row at all
paginate: true, # true to show paginator
sortable: true, # true to allow sorting (can be specified for every sortable column)
selectable: true, # true to render "select all", "select none" and the like
action: nil, # target action of the wrapping form if applicable
batch_actions: false, # name: value hash of batch action stuff
translate: false, # call t() for all 'labels' and stuff, possible values are true/:translate or :localize
row_classes: ['odd', 'even'] # class for the trs
})
# these settings are considered constant for the whole application, can not be overridden
# on a per-table basis.
# That's necessary to allow find_for_table to work properly
TABLE_FORM_OPTIONS = WhinyHash.new({
batch_action_name: 'batch_action', # name of the batch action param
sort_by_key: 'sort_by_key', # name of key which to search, format is 'id asc'
pagination_postfix: '_pagination', # name of the param w/ the pagination infos
filter_postfix: '_filter', # postfix for name of the filter in the params hash: xxx_filter
sort_postfix: '_sort', # postfix for name of the filter in the params hash: xxx_filter
checked_postfix: '_checked', # postfix for name of the checked in the params hash: xxx_filter
associations_filter: '__association', # name of the associations in the filter hash
method: 'post', # http method for that form if applicable
batch_postfix: '_batch', # postfix for name of the batch action select
checked_separator: ',' # symbol to separate the checked ids
})
# these settings are considered constant for the whole application, can not be overridden
# on a per-table basis.
# That's necessary to allow find_for_table to work properly
PAGINATE_OPTIONS = ActiveSupport::HashWithIndifferentAccess.new({
page: 1,
pagesize: 10,
pagesizes: [10, 20, 50]
})
# Hash keeping the defaults for the column options
COLUMN_OPTIONS = ActiveSupport::HashWithIndifferentAccess.new({
header: false, # a string to write into the header cell
width: false, # the width of the cell
align: false, # horizontal alignment
valign: false, # vertical alignment
wrap: true, # wraps
type: :string, # :integer, :date
td_html: false, # a hash with html attributes for the cells
th_html: false, # a hash with html attributes for the header cell
filter_html: false, # a hash with html attributes for the filter cell
filter: true, # false for no filter field,
# container for options_for_select
# String from options_from_collection_for_select or the like
# :range for range spec
# :checkbox for a 0/1 valued checkbox
checkbox_value: '1', # value if checkbox is checked
checkbox_label: '', # text behind the checkbox
filter_width: '97%', # width of the filter
range_filter_symbol: '–', # put between the of the range filter
format: false, # a sprintf-string or a proc to do special formatting
method: false, # if you want to get the column by a different method than its name
link: false, # proc or symbol to make the content a link
join_symbol: ', ', # symbol used to join the elements of 'many' associations
sortable: true # if set, sorting-stuff is added to the header cell
})
# these settings are considered constant for the whole application, can not be overridden
# on a per-table basis.
# That's necessary to allow find_for_table to work properly
FINDER_INJECT_OPTIONS = WhinyHash.new({
pagination: :__pagination,
filters: :__filters,
classname: :__classname,
sorting: :__sorting,
checked: :__checked,
store_data: :__store_data
})
# defaults for the find_for_table
FINDER_OPTIONS = WhinyHash.new({
default_order: false,
default_pagesize: false,
precondition: false,
store_data: false
})
# Stupid hack
SQL_OPTIONS = WhinyHash.new({
like: 'LIKE'
})
def self.finder_inject_options(n=nil)
FINDER_INJECT_OPTIONS.merge!(n) if n
FINDER_INJECT_OPTIONS
end
def self.finder_options(n=nil)
FINDER_OPTIONS.merge!(n) if n
FINDER_OPTIONS
end
def self.column_options(n=nil)
COLUMN_OPTIONS.merge!(n) if n
COLUMN_OPTIONS
end
def self.table_options(n=nil)
TABLE_OPTIONS.merge!(n) if n
TABLE_OPTIONS
end
def self.paginate_options(n=nil)
PAGINATE_OPTIONS.merge!(n) if n
PAGINATE_OPTIONS
end
def self.table_form_options(n=nil)
TABLE_FORM_OPTIONS.merge!(n) if n
TABLE_FORM_OPTIONS
end
def self.table_design_options(n=nil)
raise("table_design_options stopped existing. Use table_options instead.")
end
def table_design_options(n=nil) self.class.table_design_options(n) end
def self.sql_options(n=nil)
SQL_OPTIONS.merge!(n) if n
SQL_OPTIONS
end
def sql_options(n=nil) self.class.sql_options(n) end
end