Skip to content

Instantly share code, notes, and snippets.

@timsu
Last active December 12, 2015 06:08
Show Gist options
  • Save timsu/4726684 to your computer and use it in GitHub Desktop.
Save timsu/4726684 to your computer and use it in GitHub Desktop.
Coffeescript reference implementation for displaying activity hashes
# model history object example:
{ id: 102112, user_id: 5, column: "due", prev: null, value: "2012-02-06T14:17:21Z",
created_at: 1357859045 }
# method to return a string such as "completed this task" given a
# model_history object
# model - history display context, either "task" or "list"
history_string = (model) ->
if @task()
item = "<a href='#task-" + @task()[0] + "'>" + @task()[1] + "</a>"
item_possessive = item + "'s "
else
item = "this " + model
item_possessive = ""
switch @column()
when "tag_added", "tag_removed"
prefix = if @column() == "tag_added" then "added " + item + " to " else "removed " + item + " from "
if @task() and @value() == current_tag.id()
prefix + "this list"
else
prefix + list_name(@value())
when "shared_with", "unshared_with"
(if @column() == "shared_with" then "shared " else "unshared ") +
item + " with " + _.map(@value(), user_link).join(", ")
when "member_added"
"added " + user_link(@value()) + " to " + item
when "member_removed"
if @value().id == @user().id and @column() == "member_removed"
"left " + item
else "removed " + user_link(@value()) + " from " + item
when "attachment_added", "attachment_removed"
file = @value()
(if @column() == "attachment_added" then "attached " else "removed attachment ") +
"<a href='" + file[1] + "' target='_blank'>" + file[0] + "</a>" +
(if @column() == "attachment_added" then " to " else " from ") + item
when "completed_at"
if @value()
"completed " + item
else
"uncompleted " + item
when "deleted_at"
if @value()
"deleted " + item
else
"undeleted " + item
when "acknowledged"
"viewed " + item
when "importance"
"changed " + item_possessive + "priority from " + importance(@prev()) + " to " + importance(@value())
when "notes_length"
if @prev() and @value() > @prev()
"added " + (@value() - @prev()) + " characters to " + item_possessive + "description"
else if @value() == 0
"removed the description"
else if @prev() and @value() < @prev()
"removed " + (@prev() - @value()) + " characters from " + item_possessive + "description"
else if @prev() and @value() == @prev()
"updated " + item_possessive + "description"
else
"added a description to " + item
when "public"
if @value()
"made " + item + " public"
else
"made " + item + " private"
when "due"
if @value() and @prev()
"changed " + item_possessive + "due date from " + time(@prev(), @value()) + " to " + time(@value(), @prev())
else if @value()
"set " + item_possessive + "due date to " + time(@value())
else
"removed " + item_possessive + "due date"
when "repeat"
repeat_value = repeat(@value())
if repeat_value
"changed " + item_possessive + "repeat to " + repeat_value
else
"removed " + item_possessive + "repeat"
when "task_repeated"
"completed this repeating task (now due on " + time(@value(), @prev()) + ")"
when "title"
if @prev()
"changed " + item_possessive + "title from '" + @prev() + "' to '" + @value() + "'"
else
"set " + item_possessive + "title to '" + @value() + "'"
when "name", "description"
if @prev()
"changed " + @column() + " from '" + @prev() + "' to '" + @value() + "'"
else
"set " + @column() + " to '" + @value() + "'"
when "picture_id", "default_list_image_id"
"changed this list's picture"
when "is_silent"
(if @value() then "un" else "") + "silenced " + item
when "is_favorite"
(if @value() then "un" else "") + "favorited " + item
when "user_id"
if model == "list" and !@task()
if @prev()
"changed list owner to " + user_link(@value())
else
"created this list"
else if @prev() and @value().id == -1
"unassigned " + item
else if @prev() == -1 and @value().id == @user().id
"claimed " + item
else if @prev()
"assigned " + item + " to " + user_link(@value())
else if @value().id != current_user.id and @value().id != -1
"created " + item + " for " + user_link(@value())
else
"created " + item
else "changed " + @column() + " to " + @value()
# helper methods for displaying links to lists, importance, time, repeats, users
list_name = (v) ->
list = lists.get_by_id(v)
if list then "<a href='#list-" + list.id + "'>" + list.get("name") + "</a>" else "(a deleted list)"
importance = (v) ->
[ "!!!", "!!", "!", "o"][v]
time = (v, other = new Date().toISOString()) ->
dateFormat = "MMM d"
if other and other.slice(0, 4) != v.slice(0, 4)
dateFormat += ", yyyy"
if v.length > 10
date = new Date(v)
dateFormat += ", hh:mm tt"
else
date = new Date(v.slice(0,4), parseInt(v.slice(5,7))-1, v.slice(8,10))
dateToString date, dateFormat
repeat = (v) ->
value = repeatToString v
user_link = (u) ->
if u.id == current_user.id and self.user().id == current_user.id
"yourself"
else if u.id == current_user.id then "you"
else if u.id > 0 then "<a href='#users-" + u.id + "'>" + u.name + "</a>"
else "(a deleted user)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment