Task state and priority editing
This commit is contained in:
parent
6edd373ad9
commit
12ee321c64
4 changed files with 70 additions and 22 deletions
|
@ -21,13 +21,13 @@
|
||||||
(define-method post-task (story-id description reporter)
|
(define-method post-task (story-id description reporter)
|
||||||
"Post a new task for a story.")
|
"Post a new task for a story.")
|
||||||
|
|
||||||
(define-method story-get-state (id)
|
(define-method story-get-state (type id)
|
||||||
"Get the state of a story.")
|
"Get the state of a story.")
|
||||||
|
|
||||||
(define-method story-set-state (id state)
|
(define-method story-set-state (type id state)
|
||||||
"Set the state of a story.")
|
"Set the state of a story.")
|
||||||
|
|
||||||
(define-method story-change-priority (id dir)
|
(define-method story-change-priority (type id dir)
|
||||||
"Change the priority of a story in direction DIR."))
|
"Change the priority of a story in direction DIR."))
|
||||||
|
|
||||||
(restas:define-module #:scrumli
|
(restas:define-module #:scrumli
|
||||||
|
|
|
@ -46,8 +46,10 @@
|
||||||
(defmethod datastore-get-story ((datastore pg-datastore) id)
|
(defmethod datastore-get-story ((datastore pg-datastore) id)
|
||||||
(with-connection (connection-spec datastore)
|
(with-connection (connection-spec datastore)
|
||||||
(append (query (:select :* :from 'story :where (:= 'id id)) :alist)
|
(append (query (:select :* :from 'story :where (:= 'id id)) :alist)
|
||||||
`((tasks . ,(query (:select :* :from 'task
|
`((tasks . ,(query (:order-by
|
||||||
:where (:= 'story-id id))
|
(:select :* :from 'task
|
||||||
|
:where (:= 'story-id id))
|
||||||
|
'priority)
|
||||||
:alists))))))
|
:alists))))))
|
||||||
|
|
||||||
(defmethod datastore-post-story
|
(defmethod datastore-post-story
|
||||||
|
@ -74,23 +76,24 @@
|
||||||
:assignee "")))
|
:assignee "")))
|
||||||
(save-dao obj))))
|
(save-dao obj))))
|
||||||
|
|
||||||
(defmethod datastore-story-get-state ((datastore pg-datastore) id)
|
(defmethod datastore-story-get-state ((datastore pg-datastore) type id)
|
||||||
(with-connection (connection-spec datastore)
|
(with-connection (connection-spec datastore)
|
||||||
(query (:select 'state :from 'story :where (:= 'id id)) :single)))
|
(query (:select 'state :from type :where (:= 'id id)) :single)))
|
||||||
|
|
||||||
(defmethod datastore-story-set-state ((datastore pg-datastore) id state)
|
(defmethod datastore-story-set-state
|
||||||
|
((datastore pg-datastore) type id state)
|
||||||
(with-connection (connection-spec datastore)
|
(with-connection (connection-spec datastore)
|
||||||
(execute (:update 'story :set 'state state :where (:= 'id id)))))
|
(execute (:update type :set 'state state :where (:= 'id id)))))
|
||||||
|
|
||||||
(defmethod datastore-story-change-priority
|
(defmethod datastore-story-change-priority
|
||||||
((datastore pg-datastore) id dir)
|
((datastore pg-datastore) type id dir)
|
||||||
(with-connection (connection-spec datastore)
|
(with-connection (connection-spec datastore)
|
||||||
(let* ((current-priority (query (:select 'priority :from 'story
|
(let* ((current-priority (query (:select 'priority :from type
|
||||||
:where (:= 'id id))
|
:where (:= 'id id))
|
||||||
:single))
|
:single))
|
||||||
(next-priority (funcall (ecase dir (:up #'-) (:down #'+))
|
(next-priority (funcall (ecase dir (:up #'-) (:down #'+))
|
||||||
current-priority 1)))
|
current-priority 1)))
|
||||||
(execute (:update 'story :set 'priority current-priority
|
(execute (:update type :set 'priority current-priority
|
||||||
:where (:= 'priority next-priority)))
|
:where (:= 'priority next-priority)))
|
||||||
(execute (:update 'story :set 'priority next-priority
|
(execute (:update type :set 'priority next-priority
|
||||||
:where (:= 'id id))))))
|
:where (:= 'id id))))))
|
||||||
|
|
30
scrumli.lisp
30
scrumli.lisp
|
@ -90,18 +90,36 @@
|
||||||
(define-route stories-state ("stories/state" :method :post)
|
(define-route stories-state ("stories/state" :method :post)
|
||||||
(if (logged-in-p)
|
(if (logged-in-p)
|
||||||
(let* ((id (hunchentoot:post-parameter "id"))
|
(let* ((id (hunchentoot:post-parameter "id"))
|
||||||
(current-state (story-get-state id)))
|
(current-state (story-get-state 'story id)))
|
||||||
(story-set-state id (ecase (intern current-state :scrumli)
|
(story-set-state 'story id (ecase (intern current-state :scrumli)
|
||||||
(todo "DOING")
|
(todo "DOING")
|
||||||
(doing "DONE")
|
(doing "DONE")
|
||||||
(done "TODO")))
|
(done "TODO")))
|
||||||
200)
|
200)
|
||||||
403))
|
403))
|
||||||
|
|
||||||
|
(define-route task-state ("tasks/state" :method :post)
|
||||||
|
(if (logged-in-p)
|
||||||
|
(let* ((id (hunchentoot:post-parameter "id"))
|
||||||
|
(current-state (story-get-state 'task id)))
|
||||||
|
(story-set-state 'task id (ecase (intern current-state :scrumli)
|
||||||
|
(todo "DOING")
|
||||||
|
(doing "DONE")
|
||||||
|
(done "TODO"))))))
|
||||||
|
|
||||||
(define-route stories-priority ("stories/:dir" :method :post)
|
(define-route stories-priority ("stories/:dir" :method :post)
|
||||||
(if (logged-in-p)
|
(if (logged-in-p)
|
||||||
(let* ((id (hunchentoot:post-parameter "id")))
|
(let* ((id (hunchentoot:post-parameter "id")))
|
||||||
(story-change-priority id (intern (string-upcase dir) :keyword))
|
(story-change-priority
|
||||||
|
'story id (intern (string-upcase dir) :keyword))
|
||||||
|
200)
|
||||||
|
403))
|
||||||
|
|
||||||
|
(define-route task-priority ("tasks/:dir" :method :post)
|
||||||
|
(if (logged-in-p)
|
||||||
|
(let* ((id (hunchentoot:post-parameter "id")))
|
||||||
|
(story-change-priority
|
||||||
|
'task id (intern (string-upcase dir) :keyword))
|
||||||
200)
|
200)
|
||||||
403))
|
403))
|
||||||
|
|
||||||
|
|
|
@ -9,17 +9,44 @@ var StateIcon = React.createClass({
|
||||||
});
|
});
|
||||||
|
|
||||||
var StoryTaskRow = React.createClass({
|
var StoryTaskRow = React.createClass({
|
||||||
|
changeState: React.autoBind(function(event) {
|
||||||
|
$.ajax({
|
||||||
|
url: "/tasks/state",
|
||||||
|
type: "POST",
|
||||||
|
data: {'id': this.props.task.id},
|
||||||
|
dataType: 'json',
|
||||||
|
mimeType: 'textPlain'
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
moveUp: React.autoBind(function(event) {
|
||||||
|
$.ajax({
|
||||||
|
url: "tasks/up",
|
||||||
|
type: "POST",
|
||||||
|
data: {'id': this.props.task.id},
|
||||||
|
dataType: 'json',
|
||||||
|
mimeType: 'textPlain'
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
moveDown: React.autoBind(function(event) {
|
||||||
|
$.ajax({
|
||||||
|
url: "tasks/down",
|
||||||
|
type: "POST",
|
||||||
|
data: {'id': this.props.task.id},
|
||||||
|
dataType: 'json',
|
||||||
|
mimeType: 'textPlain'
|
||||||
|
});
|
||||||
|
}),
|
||||||
render: function() {
|
render: function() {
|
||||||
var state = " " + this.props.task.state;
|
var state = " " + this.props.task.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr>
|
<tr>
|
||||||
<td class="span1">
|
<td class="span1">
|
||||||
<i class="icon-arrow-up"></i>
|
<i class="icon-arrow-up" onClick={this.moveUp}></i>
|
||||||
<i class="icon-arrow-down"></i>
|
<i class="icon-arrow-down" onClick={this.moveDown}></i>
|
||||||
</td>
|
</td>
|
||||||
<td class="span2">
|
<td class="span2">
|
||||||
<span>
|
<span onClick={this.changeState}>
|
||||||
<StateIcon state={this.props.task.state} />
|
<StateIcon state={this.props.task.state} />
|
||||||
{state}
|
{state}
|
||||||
</span>
|
</span>
|
||||||
|
|
Loading…
Reference in a new issue