aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemse2013-06-20 22:51:56 +0200
committerGravatar Tom Willemse2013-06-20 22:51:56 +0200
commit5885f98eabadcac17130183e1df7fe76f2025473 (patch)
treea7754187d6cf35476ef890e571ca2ff9481c0b57
parente529f38b59cdf6fa7155de754ec9857f2b5e2dc6 (diff)
downloadscrumelo-5885f98eabadcac17130183e1df7fe76f2025473.tar.gz
scrumelo-5885f98eabadcac17130183e1df7fe76f2025473.zip
Add changing order of stories
-rw-r--r--js/main.js35
-rw-r--r--scrumelo.el23
2 files changed, 54 insertions, 4 deletions
diff --git a/js/main.js b/js/main.js
index 4b84401..27643f4 100644
--- a/js/main.js
+++ b/js/main.js
@@ -34,6 +34,10 @@ var StoryRow = React.createClass({
return (
<tr>
<td>
+ <i class="icon-arrow-up" onClick={this.moveUp}></i>
+ <i class="icon-arrow-down" onClick={this.moveDown}></i>
+ </td>
+ <td>
<span onClick={this.changeState}>
<StateIcon state={this.state.state} />
{state}
@@ -78,6 +82,30 @@ var StoryRow = React.createClass({
this.setState({state: eval(data).state});
}.bind(this)
});
+ }),
+ moveUp: React.autoBind(function(event) {
+ $.ajax({
+ url: "/stories/up/",
+ type: "POST",
+ data: {'id': this.props.story.id},
+ dataType: 'json',
+ mimeType: 'textPlain',
+ success: function (data) {
+ this.props.onMoved(1);
+ }.bind(this)
+ });
+ }),
+ moveDown: React.autoBind(function(event) {
+ $.ajax({
+ url: "/stories/down/",
+ type: "POST",
+ data: {'id': this.props.story.id},
+ dataType: 'json',
+ mimeType: 'textPlain',
+ success: function (data) {
+ this.props.onMoved(-1);
+ }.bind(this)
+ });
})
});
@@ -101,10 +129,13 @@ var StoryTable = React.createClass({
this.props.pollInterval
);
},
+ handleMoved: React.autoBind(function(direction) {
+ this.loadStoriesFromServer();
+ }),
render: function() {
var storyNodes = this.state.data.map(function (story) {
- return <StoryRow story={story} />;
- });
+ return <StoryRow story={story} onMoved={this.handleMoved} />;
+ }.bind(this));
return (
<table class="table table-striped">
{storyNodes}
diff --git a/scrumelo.el b/scrumelo.el
index a3ba2d3..9cb83b0 100644
--- a/scrumelo.el
+++ b/scrumelo.el
@@ -120,13 +120,30 @@
(elnode-method httpcon
(POST
(with-scrumelo-http-params (id) httpcon
- (message "HI: %s" id)
(with-scrumelo-buffer
(let ((entry (cdr (org-id-find id))))
(goto-char entry)
(org-todo)
+ (save-buffer)
(scrumelo--send-json
- httpcon (list (cons :state (org-entry-get (point) "TODO"))))))))))
+ httpcon
+ (list (cons :state (org-entry-get (point) "TODO"))))))))))
+
+(defun scrumelo-move-story (dir)
+ "Create a function to move a story in direction DIR."
+ (let ((func (intern (concat "org-move-subtree-" dir))))
+ (lambda (httpcon)
+ (elnode-method httpcon
+ (POST
+ (with-scrumelo-http-params (id) httpcon
+ (with-scrumelo-buffer
+ (let ((entry (cdr (org-id-find id))))
+ (goto-char entry)
+ (funcall func)
+ (save-buffer)
+ (scrumelo--send-json
+ httpcon
+ (list (cons :status "OK")))))))))))
(defun scrumelo--send-json (httpcon obj)
"Respond to HTTPCON with OBJ converted to a json structure."
@@ -175,6 +192,8 @@
("^/stories/$" . scrumelo-main-json)
("^/stories/new/$" . scrumelo-new-story)
("^/stories/state/$" . scrumelo-change-state)
+ ("^/stories/up/$" . ,(scrumelo-move-story "up"))
+ ("^/stories/down/$" . ,(scrumelo-move-story "down"))
("^/stories/\\([a-z0-9:-]+\\)/$" . scrumelo-story-json))))
(elnode-start 'scrumelo-handler :port 8028 :host "0.0.0.0")