Check out the live app here.
Agile Tracker is an agile project management tool, inspired by Pivotal Tracker. It uses Rails and Postgres on the backend and React and Redux on the frontend.
This project was built in 10 days, although I plan on continuing to use it, add features and improve it.
- Password digest using BCrypt.
- Session token refreshed upon every sign in & sign out, allowing one session for each user.
- Prevent users from using crud operations on other user's resources.
- Allow users to create, update and destroy projects.
- Allow users to create, update and destroy stories.
- Conditionally show next status button or estimate button.
- Estimate points by clicking on a point estimate component.
- Modularize components on story to handle different actions:
<StoryCaret
showForm={ showForm }
toggleForm={ this.toggleForm }/>
<StoryIcon
kind={ story.kind }/>
<StoryPoints
points={ story.points }
status={ story.status }/>
<EstimateOrButton
acceptStory={ acceptStory }
story={ story }
nextStatusForStory={ nextStatusForStory }
rejectStory={ rejectStory }
updateStory={ updateStory }/>
- Allow users to drag and drop stories across workflows.
- Instead of disabling the user's action (such as dragging to an incorrect workflow based upon the status, the way pivotal tracker does) we allow the user to do what they want, then handle the logic to ensure the action is valid on the backend with some simple logic and some routes. With this implementation, you only need one action to accomplish moving a story, instead of having to edit the story's status, then dragging it into the appropriate workflow.
/stories/:id/accept
/stories/:id/reject
/stories/:id/next
- Instead of disabling the user's action (such as dragging to an incorrect workflow based upon the status, the way pivotal tracker does) we allow the user to do what they want, then handle the logic to ensure the action is valid on the backend with some simple logic and some routes. With this implementation, you only need one action to accomplish moving a story, instead of having to edit the story's status, then dragging it into the appropriate workflow.
class Api::StoriesController < ApplicationController
def next
if @story.next_status_and_workflow
# ...
end
def accept
if @story.accept
# ...
end
def reject
if @story.reject
# ...
end
end
class Story
def next_status_and_workflow
next_status
next_workflow
save
end
def accept
self.status = "Accepted"
send_to_done_workflow
save
end
def reject
self.status = "Rejected"
save
end
end
alt + h
toggles sidebaralt + i
toggles icebox workflowalt + b
toggles backlog workflowalt + c
toggles current workflowalt + d
toggles done workflow