aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemse2013-07-24 20:42:13 +0200
committerGravatar Tom Willemse2013-07-24 20:43:29 +0200
commit4b9563abd45dafced0521deedb53ea2f872f5639 (patch)
treeca55a17d14b9c1f0583d7573392db0d556b90164
parentc67240467588bed6dd182416cff1618d8e169c1b (diff)
downloadscrumli-4b9563abd45dafced0521deedb53ea2f872f5639.tar.gz
scrumli-4b9563abd45dafced0521deedb53ea2f872f5639.zip
Show assigned gravatar in story and task lists
-rw-r--r--pg-datastore.lisp9
-rw-r--r--static/js/main.js27
2 files changed, 33 insertions, 3 deletions
diff --git a/pg-datastore.lisp b/pg-datastore.lisp
index 317eca5..39e2646 100644
--- a/pg-datastore.lisp
+++ b/pg-datastore.lisp
@@ -57,16 +57,19 @@
(defmethod datastore-get-all-stories ((datastore pg-datastore))
(with-connection (connection-spec datastore)
- (query (:order-by (:select :* :from 'story) 'priority) :alists)))
+ (query (:order-by (:select :* (:as (:md5 'assignee) 'md5)
+ :from 'story) 'priority) :alists)))
(defmethod datastore-get-story ((datastore pg-datastore) id)
(with-connection (connection-spec datastore)
- (append (query (:select :* :from 'story :where (:= 'id id)) :alist)
+ (append (query (:select :* (:as (:md5 'assignee) 'md5) :from 'story
+ :where (:= 'id id)) :alist)
`((tasks . ,(datastore-get-tasks-for-story datastore id))))))
(defmethod datastore-get-tasks-for-story ((datastore pg-datastore) id)
(with-connection (connection-spec datastore)
- (query (:order-by (:select :* :from 'task :where (:= 'story-id id))
+ (query (:order-by (:select :* (:as (:md5 'assignee) 'md5) :from 'task
+ :where (:= 'story-id id))
'priority)
:alists)))
diff --git a/static/js/main.js b/static/js/main.js
index 444f06a..68ea997 100644
--- a/static/js/main.js
+++ b/static/js/main.js
@@ -24,6 +24,25 @@ var StateIcon = React.createClass({
}
});
+var AssigneeIcon = React.createClass({
+ render: function() {
+ var icon;
+
+ if (this.props.assignee)
+ icon = <img src={"https://secure.gravatar.com/avatar/" +
+ this.props.md5 + '?s=24'}
+ title={this.props.assignee}
+ alt={this.props.assignee} />;
+ else
+ icon = (<span title="Unknown" class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-question icon-light"></i>
+ </span>);
+
+ return icon;
+ }
+});
+
var StoryTaskRow = React.createClass({
changeState: React.autoBind(function(event) {
$.post("/tasks/state", {'id': this.props.task.id})
@@ -58,6 +77,10 @@ var StoryTaskRow = React.createClass({
<i class="icon-arrow-down clickable"
onClick={this.moveDown}></i>
</td>
+ <td class="span1">
+ <AssigneeIcon assignee={this.props.task.assignee}
+ md5={this.props.task.md5} />
+ </td>
<td class="span2">
<span onClick={this.changeState} class="clickable">
<StateIcon state={this.state.state} /> {" "}
@@ -182,6 +205,10 @@ var StoryRow = React.createClass({
<i class="icon-arrow-down clickable"
onClick={this.moveDown}></i>
</td>
+ <td class="span1">
+ <AssigneeIcon assignee={this.props.story.assignee}
+ md5={this.props.story.md5} />
+ </td>
<td class="span2">
<span onClick={this.changeState} class="clickable">
<StateIcon state={this.state.state} /> {" "}