A basic CRUD list page tends to have various ways of manipulating the content - sorting, filtering etc. Most of these apply to a single column of data, so the UI will generally end up with a button, link or other input in the column-head. I found that I often needed a list of choices where some referred to a single column and others didn't (eg "Sort by: date, popularity, controversy") or choices that have no bearing on the data at all (eg "View as: User, Moderator, Admin").
It was annoying to have to type out the HTML for these lists of choices each time, with appropriate styling to highlight the "current item" etc so I wrote up a helper. My example uses RESTful paths - but could be quickly modified for legacy paths too.
def make_choicelist(title,fieldname,choices,path_hash) # creates a horizontal list displaying a set of choices the user can # pick from including urls for each choice. cur_val = params[fieldname] str = "<div class=\"hlist\"><span class=\"head\">#{title}</span>" choices.each do |label,value| path = url_for path_hash.merge(fieldname => value) str << "<span class=\"#{(cur_val && cur_val == value.to_s) ? "current" : "item"}" str << "\">#{link_to_unless_current(label, path)}</span>" end str << "</div>" str end
You can then pass it:
- The title of the choice list
- The name and current value of the field that saves the state of this item
- The set of choices (label+value) that this field can take
- The basic URL of the page apart from this field - as a hash (so we can merge in the new value)
<% choices = [["Admin", :admin], ["Moderator", :mod] ["User", :user]] -%> <%= make_choicelist "View as:", :user_type, choices, hash_for_widgets_path -%>
The code will generate the list with the given title, and will add each option after it - highlighting whichever is the current choice. You can pair this with your stylesheet to restyle the choice-list appropriately. A really basic style example is below:
/* used for horizontal lists - generally for depicting choices */ .hlist { padding: 0px; background-color: #EEE; color: #333; border: 1px solid #333; } /* short, descriptive heading for the list */ .hlist .head { padding-left: 10px; padding-right: 10px; font-weight: normal; } /* list items */ .hlist .current, .hlist .item { font-weight: bold; margin-right:3px; } /* the currently-selected item */ .hlist .current { padding: 3px; border: 2px inset black; background-color: #333; color: #CCC; } /* an unselected item */ .hlist .item { background-color: silver; font-weight: bold; } /* the link for an unselected item */ .hlist .item a { border: 2px outset black; color: #333; background-color: silver; text-decoration: none; } .hlist .item a:hover { border: 2px inset black; background-color: #444; color: #CCC; }
Which will give you something that looks like this:
No comments:
Post a Comment