CartoDB/cartodb — pull request #1584 by viddo (2014-12-23 14:10:38+00:00)
Title: Implement content footer

Solves #1438

Some things worth mentioning related to changes:
- Pagination was implemented with a separate model and view, to encapsulate the logic related to the pagination details. It only holds the minimum necessary code related to pagination, and thus a context where the pagination is used need to setup the moving parts (e.g. update the pagination model when the related visualization collection changes).
- Router's UrlsModel is merged with its inline model, since it suffered of [feature envy](https://en.wikipedia.org/wiki/Code_smell). Now the code related to URL state is encapsulated in one place, where the URL construction is a kind of serialization of its internal state. Noticeable API changes:

old | new
---- | -----
`router.urls.byContentType()` | `router.model.contentUrl()`
`router.urls.byCurrentState()` | `router.model.url()`
`router.urls.byCurrentstateToTag('baz')` | `router.model.url(search: ':baz')`
`router.urls.byCurrentStateToSearch('foobar')` | `router.model.url(search: 'foobar')`
| `router.model.toUrl(page: '123')`
There are some new methods too, see the new `new_dashboard/router/model` for all changes.
- The code related to showing _"Show X locked datasets"_ was taken from old code, IMHO, most of it do not belong in the view. It suffers from similar copy-paste issues as the `main_view`, as I [hilighted in an earlier pull-request](https://github.com/CartoDB/cartodb/blob/1438-content-footer/lib/assets/javascripts/cartodb/new_dashboard/main_view.js#L50-L61). But I think we need to discuss and solve this separately (in particular wait for Odyssey.js's model changes to be merged to master I guess).