This may be a bit extreme.
It's modeled after the ideal "rails way".
In the controller, we now know the name of a single resource. It
doesn't happen to be backed by a database table, but it does know all
about the task of collecting stats, leaving the controller concerned
with just munging params and rendering stuff.
I called the resource `IndexPage`, to avoid the temptation of trying to
reuse it, which can get pretty messy.
Later, if a better abstraction appears, it should be fairly painless to
alter.
If you have fewer than 10 projects, then empty running projects were
linked to with the path `/projects/-1`.
Copy/pasted the list strategy from the other project sections in the
same partial so the duplication becomes explicit.
The tag cloud minimum used to start at 0, then repeatedly compared to
the lowest count and chose the smallest, which is bound to be zero in
every case.
Discussed
[here](8c26ea7cb5 (commitcomment-2719199)).
The current user isn't necessarily current when it is in the model
layer.
The exposed attributes on the tag cloud no longer need to contain type
information.
Move the get_done_today, get_done_this_week, and get_done_this month
methods into their own class in lib/tracks and use the new class in the
context, project, and todo controllers.
This removes the complexity from the application controller, silos it
off, and slightly reduces the complexity of the other controllers so
that they don't have to duplicate as much code.
The tradeoff here is that the code that was moved out into its own class
was also duplicated in the todos controller due to a different use case
that I didn't see before. This is still an improvement however and so
I'm ok with going back and tackling the extra complexity added to
TodoController at a later date.
Grouping isn't as lax in PostgreSQL as it is in MySQL or SQLite. All
sort fields also need to be in the GROUP BY, or be aggregated. The order
isn't relevant when counting, so simply don't order in that case.
Fix#1336
@all_actions_per_context is not used anywhere except for in the
StatsController. It's only used in two functions and it's not used by
anything in the view.
Make it a local variable instead.