Code Monkey home page Code Monkey logo

cm42-central's Introduction

CM42 Central

CM42 Central is an application to provide a user story based backlog management system for agile development teams.

Build Status Code Climate JavaScript Coverage Status

Project Screenshot Reports Screenshot

The Codeminer 42 Feature Set

CM42-Central is a fork of the discontinued Fulcrum project. The old project has not received anything new in the last couple of years, but our fork has evolved considerably and we consider it the new upstream for all intents and purposes.

Some of the improvements we added since the end of 2015:

  • Fixing Pivotal Tracker project CSV import to properly get the Notes
  • Added stories search through Pg_Search (low priority: maybe add option for Elastic)
  • Adding superadmin role to manage projects and users
    • proper users CRUD section
    • Reorganize the user administration
  • Adding Cloudinary/Attachinary support to upload assets to Stories and Notes
    • Uploading is working but it is not showing properly yet
    • Add uploads to Notes
  • General project cleanup
    • upgrading gems
    • using rails-assets
    • refactoring views to use Bootstrap elements
    • fixing failing migrations
    • fixing failing tests, including javascript tests
    • adding phantomjs for feature tests
    • remove StoryObserver and refactor main
    • more markdown javascript to assets
    • needs more testing and tweaking for tablets
    • Backbone code needs more refactoring and cleanup (specially moving the render from story_view to an EJS template)
    • (low priority) replace the polling system for a websockets channel and listener
  • Improved UI
    • A little bit better icon set (Material Icons)
    • Textarea in Story editing can now auto-resize
    • Can collapse sprint groups
    • Bugs and Chores shouldn't be estimated
    • Basic task system inside a Story
    • Labels work as "Epic" grouping
    • Minimal responsiveness to make it usable in smartphones/tablets
    • UI tweaking to make it prettier even without a total redesign
  • Done stories can't be edited, so adding validations and disabling form UIs
  • Added Mattermost basic integration to send story changes to project chat channel
  • Added Slack integration to send story changes to project chat channel
  • Add APIs for chat slash commands to be able to query projects (ex. /centralstatus project-x)
  • Added basic reports
    • Basic Current Iteration status
    • Velocity per Iteration
    • Bugs per Iteration
    • Velocity per Member per Iteration
    • Volatility calculation
    • Burn Up Chart
  • Teams
    • Reorganize the project so the main object is a Team instead of the Project, and Teams can have many Projects
    • Teams are isolated, so a user in a Team can't access a project from another Team
    • Users can be assigned to multiple teams
    • Projects can be transferred between Teams

We already have more features in development and you can follow what needs to be built or fixed in the Issues page.

Goals

CM42-Central starts as a clone of Pivotal Tracker.

We want to make it a drop-in replacement first, by having all of the main functionalities and to later surpass it, by making it not only smarter but also more user-friendly and easier to use than what we consider "incomplete" commercial offerings such as Trello.

The principles that we believe in are:

  • Estimation is not optional, but more like Story Points (proportions) than Time-based estimation.
  • Projects must be divided in short, fixed Iterations.
  • Velocity is the the key managerial element.
  • Stakeholders must test and accept/reject stories within the same Iteration.

Installation

WARNING: It is NOT recommended to create the database using the db:migrate command during the installation process. Some migrations in the project have become outdated due to Rails updates during the application's development. Therefore, if you create the database from scratch using these outdated migrations instead of loading the current schema, the application will not function as intended, and some tests will fail. Be aware!

First up, your system will need the prerequisites for running Ruby on Rails installed Once you have these:

# Checkout the project
$ git clone git://github.com/Codeminer42/cm42-central.git
$ cd cm42-central

# copy and edit the configuration
$ cp .env.sample .env
$ cp config/database.yml.example config/database.yml

# Install the project dependencies
$ gem install bundler
$ bundle install
$ yarn install

# If you want working with import option, have to activated the option memcached
$ CentOS 6.4
 - sudo yum install memcached
$ Debian/Ubuntu
 - sudo apt-get install memcached
$ MacOS
 - brew install memcached
$ Option memcached 
 - sudo /etc/init.d/memcached start
 - sudo /etc/init.d/memcached stop
 - sudo /etc/init.d/memcached restart

# Set up the development database
$ bundle exec rake fulcrum:setup db:setup

# Start the local web server
$ bundle exec foreman start -f Procfile.development

Or using docker:

# Checkout the project
$ git clone git://github.com/Codeminer42/cm42-central.git
$ cd cm42-central

# copy and edit the configuration
$ cp .env.sample .env
$ cp config/database.yml.example config/database.yml

# Prepare container
$ docker compose build
$ docker compose run --rm web yarn install
$ docker compose run --rm web bundle exec rake db:setup

# Up container
$ docker compose up

You should then be able to navigate to http://cm42-central.localhost/ in a web browser. You can log in with the test username [email protected], password asdfasdf.

To manage the postgres database, you can access http://adminer.cm42-central.localhost, using the following credentials:

  • server: postgres
  • username: postgres
  • passowrd: postgres

If you need to cleanup your docker install, run:

$ docker compose down -v

Heroku setup

You can use the Deploy button above or manually install like this:

You will need a Heroku Postgresql plan, and you will also need:

  • Postgresql (ex. Heroku Postgresql)
  • Redis (ex. Heroku Redis)
  • Memcached (ex. Memcachier)
  • Mailgun (for email notifications)
  • Cloudinary (for direct client-side uploads, we don't want Carrierwave)
  • Google Recaptcha keys (create for free here)

You will also need to add the buildpacks for Node and webpack-rails:

$ heroku buildpacks:add --index 2 https://github.com/heroku/heroku-buildpack-nodejs#v83
$ heroku buildpacks:add --index 3 https://github.com/febeling/webpack-rails-buildpack.git

You may want to skip recaptcha in development, for that you can manually add this to the environment:

Recaptcha.configuration.skip_verify_env << 'development'

To deploy it to Heroku, make sure you have a local copy of the project; refer to the previous section for instructions. Then:

$ gem install heroku

# Define secret tokens
$ heroku config:set SECRET_TOKEN=`rake secret` SECRET_KEY_BASE=`rake secret` DEVISE_SECRET_KEY=`rake secret`

# Create your app. Replace APPNAME with whatever you want to name it.
$ heroku create APPNAME --stack cedar-14

# Set APP_HOST heroku config so outbound emails have a proper host
# Replace APPNAME below with the value from `heroku create`
$ heroku config:set APP_HOST=APPNAME.herokuapp.com

# Define where the user emails will be coming from
# (This email address does not need to exist)
$ heroku config:set [email protected]

# Tell Heroku to exclude parts of the Gemfile
$ heroku config:set BUNDLE_WITHOUT='development:test:travis:mysql:sqlite'

# How many stories a project will load at once (so very old, done stories, stay out of the first load), (optional, default is 300)
$ heroku config:set STORIES_CEILING=300

# CDN URL - Go to AWS and create a CloudFront configuration (optional)
$ heroku config:set CDN_URL=http://xpto.cloudfront.net

# Google Recaptcha keys
$ heroku config:set RECAPTCHA_SITE_KEY=xyz RECAPTCHA_SECRET_KEY=xyz

# Add postgresql
$ heroku addons:create heroku-postgresql:hobby-dev

# Add Redis for Sidekiq
$ heroku addons:create heroku-redis:hobby-dev

# Add memcache to speed things up (optional)
$ heroku addons:add memcachier:dev

# Allow emails to be sent
$ heroku addons:add mailgun:starter

# Add Cloudinary
$ heroku addons:create cloudinary:starter

# Deploy the first version
$ git push heroku master

# Set up the database
$ heroku run rake db:setup

Once that's done, you will be able to view your site at http://APPNAME.herokuapp.com.

The recommendation is to create a proper domain and add the herokuapp URL as the CNAME.

Translating

Below is an example of how you might go about translating to German.

  • Find the name of your locale, in this case we are using de
  • Copy the config/locales/en.yml file to config/locales/de.yml
  • Edit the file and update all the translated strings in quotes on the right hand side.
  • Add your new locale to config.i18n.available_locales in config/application.rb

Thats it! Ideally you should send your translation as a pull request so you get credit for it, but if you do not wish to do this please send the file to one of the mailing lists.

If we have already translated for your language, please take the time to check the translation database is complete for your language. You can do this by running the rake i18n:missing_keys task. If you find any missing keys for your language please add them.

Disabling registration

To disable public registration you can set the enviroment variable DISABLE_REGISTRATION to true. If set to true, users will need to be invited to a project rather than being able to self sign-up.

Development

If you'd like to help:

  • Check the issue queue for a list of the major features which are yet to be implemented. These have the feature and unstarted labels. If a feature you'd like to work on isn't there, add an issue.
  • Leave a description of how you are going to implement the feature. Failure to do this may lead to you implementing the feature in a way that might conflict with future plans, and so increase the chances of your work being rejected or needing a rework.

Here are some general guidelines for contributing:

  • Make your changes on a branch, and use that branch as the base for pull requests.
  • Try to break changes up into the smallest logical blocks possible. We'd prefer to receive many small commits to one large one in a pull request.
  • Feel free to open unfinished pull requests if you'd like to discuss work in progress, or would like other developers to test it.
  • All patches changes be covered by tests, and should not break the existing tests, unless a current test is invalidated by a code change. This includes Javascript, which is covered with a Jasmine test suite in spec/javascripts/.
  • Run bundle exec rspec spec/ to check the Rails test suite is green. You will need Chrome installed to run the integration tests.
  • To run the Javascript test suite, run npm test.

License

Copyright 2011-2015, Malcolm Locke. Copyright 2015-2022, Codeminer42.

CM42-Central is made available under the Affero GPL license version 3, see LICENSE.txt.

cm42-central's People

Contributors

adbatista avatar akitaonrails avatar andrerpbts avatar bradleypriest avatar brunohkbx avatar carloslopes avatar daniloisr avatar dependabot-support avatar dependabot[bot] avatar dstockdale avatar edddieee avatar edumoreira1506 avatar fidelisclayton avatar gabrielbaldao avatar igor-dmscn avatar jgarcia avatar kaleworsley avatar kostadriano avatar marcosjr182 avatar negreirosleo avatar patybastos avatar pedrofelipe avatar rjchaveiro avatar romulostorel avatar rscardinho avatar rubynho avatar sarahraqueld avatar talyssonoc avatar tiarly avatar zakharday avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cm42-central's Issues

Points displayed as numbers instead of stack

After updating our instance to the latest master branch, we noticed the points of each story are displayed as numbers. Before it was displayed as a stack like on Pivotal.

New display behaviour

We would like to switch back to the previous way of displaying the points, as we find it easier to read.

Was this modification in the latest commits, or there is a setting controlling this?

Connect users with mattermost, by project integration

We should be able to add a dropdown that fetches the usernames from mattermost in the new user/edit user forms. And a Rake task to compare the existing usernames/emails with mattermost so we can fix the usernames and use them in the future to send direct messages from Central-Bot for example

Mimic the new Pivotal Tracker look and feel

The old Fulcrum project tried to mimic the old Pivotal Tracker looks.

We should be able to upgrade the UI (CSS, etc) to make it closer to the new Tracker looks.

This is a complete UI overhaul, probably lengthy, so move with care and do "horizontal changes" first. For example, change the color palette first and merge. Then change typography and merge. Then change specific element spacing and merge. Instead of doing everything at once, that way we can move one step at a time.

Add a "History" view for a Story

Every Story already has every change recorded in the polymorphic Activity model. We need to show it in a new Column View. Each Activity row can be a foldable item in this new Column.

The Column must be of the format "History of "[title of the story]"".

This is the look and feel from Pivotal Tracker:

escola_digital_-demo-_pivotal_tracker

In Tracker each Story History gets its own separated Column, but to make it simpler, we can reuse the same column and every time we click on the "History" icon in the Story View, we reset the Column.

We probably need a (backbone based) Activity View and a new ActivityColumn View or something similar. Possibly an ActivityCollection (backbone based) model and another Activity Model as well. Most of the work will be on the Javascript side and a simple controller that can receive the Story id and send a collection of Activities.

Members should be able to see members of the same project

Currently only Team Admins can edit project members (and have the link for "members" in the main menu).

Normal users should be able to enter the /projects/xyz/users endpoint but the "Add New User" form, the "Add Existing Users" list and the "Remove buttons" should disappear.

The Pundit policies for User should be customized to allow the 'show' action, for example.

Add Mass Operations over many Stories in the Project

There should be a button in the Project view to add a checkbox to all stories in all lists.

Once one of the checkboxes are clicked, there should appear a modal in the top of the screen with options such as "Delete Everything" or "Label Everything" or "Move Everything".

That way we should be able to delete many stories in one operation or add the same labels to many stories at once for example.

This is quite complex in terms of adding a lot of UI elements.

Cross Project Milestones

One way to scale projects is to have different teams working on separated projects to maintain focus and efficiency.

But it's difficult for projects to coordinate because you would have to get in and out of different boards to see how they're doing.

Instead we could show all the related projects' Milestones in all the boards.

We should create a new "Portfolio" entity. So:
Team has many Portfolios
Portfolio has many Projects (portfolio_projects many-to-many table, no need for explicit model here)

Then the StoryCollection must be able to fetch the stories of it's project + the milestone stories from the related projects to render in the same board (possibly with a different color, tag, icon or something to clearly illustrate where that milestone came from).

So each project can control their own stories and the other projects can immediate visualize if they will be able to deliver their stories until the "global" milestone.

Milestones have static dates, so they should appear in the same position in all the backlogs.

We could add a field to the stories table, so if it is a milestone and if it has the global flag, all projects must show them.

In the View the global milestone must show the project name to differentiate from local milestones.

Ticket isn't reassigned to the person who start the work on it

When a ticket is assigned to person A but the person B move it to in progress, the ticket isn't being automatically assigned to the person B.

This issue is causing some problems because a lot of stories appear to be done by someone who isn't working on them

[Suggestion] Stop being a fork

It would be nice a "standalone" repo was used instead of a fork mainly because the search function doesn't work on forks.

ActionView::Template::Error (Must supply cloud_name):

Tried to build cm42-central from scratch with docker-compose on Windows 10.

After executing docker-compose up, creating a new project failed because of the following error.

web_1       | ActionView::Template::Error (Must supply cloud_name):
web_1       |     1: <%= javascript_tag "var ATTACHINARY_OPTIONS = #{attachinary_file_field_options(Story.new, :documents, cloudinary: { use_filename: true }).to_json}" %>
web_1       |     2: <%= raw File.read Rails.root.join('app/views/projects/_attachinary_template.html') %>
web_1       |     3:
web_1       |     4: <%= render partial: 'sidebar',

What am I missing?

The below is my environment.

  • Docker for Windows: docker-compose version 1.11.2, build f963d76f
  • cm42-central: using latest master branch source code.

Thanks in advance.

Create a Burn Down Chart

In the Projects Report, we should be able to draw a Burn Down chart.

The IterationService#backlog_iterations.first is the collection of stories of the current backlog. Each story has a state. In the beginning everything should be 'unstarted'. The vertical chart bar for each day should have the grouping of stories 'delivered_at' that day.

Each story must therefore have a new 'delivered_at' timestamp feature when state change to 'delivered'. That field must be created as a new migration inside the support rails_app used for rspec tests. The newly generated migration should be copied to the template folder.

There is a generator in the central-support, so once the new migration is added to the gem, you can bundle update central-support here in the Central main project and run rails g central-support:install (or something similar, type rails g to list the correct task name) and it will add the new migration, from there you can update Central's main database.

With the proper delivered_at field, the stories can be grouped by day in the sprint (you must consider each project's iteration size and plot the graph accordingly).

One way to do it, is to test out the D3 alternative: https://codepen.io/chrissp26/details/mtcuo

Remake the Login sequence

Currently I have a convoluted method of signing up with the mandatory "team" field. We can either type in the team slug name there or use a URL with the team name that will set a session.

It's convoluted. The correct way would be to remove this field again from the sign in form and remove this URL non-sense.

The correct way is to have a normal sign in page. Then if the current_team is nil it forwards to a /users/xyz/teams that lists the user's teams so the user can POST the team he wants, which will set the current_team and that's it.

"Forgot password" should follow the same logic.

Cannot add tasks to a story

Console returns a 422 error while trying to use browser's autocomplete item as the name of a task. When the text is changed, like adding a blank space at the end of it, as seen on the following gif, the task is created successfully.

addtaskbug

Add people in Team

  • Fix: admin users can edit any user on the team and update any information

list_users

  • Remove users/form inside projects

  • Fix: action create in user_policy.

  • Feature: alter button "manage teams members" to new route teams/:slug/users where users are association with team using enrolment

manage_team_members

First Time Interface Tour

We must add possibly 2 fields in the users table:

  • tour, boolean, default: true. When tour is false, no bubbles will show up
  • tour_steps: text, a string with probably a JSON state of all the bubbles. Whenever a new bubble is shown to the user, we must update it so it doesn't show anymore. That's because the tutorial is not linear. For example, the bubbles explaining a New Story will only show up when the user first clicks on the "New Story" button.

The user must be able to reset the tour from his User Profile edit page or totally disable the tour in the first bubble (the "check here if you already know how to use this product").

One possible library to use is Shepherd (cc @talyssonoc)

Choose Team

The first bubble must show up at the Team selection right after he signs up. There is no Team in the first time so the first bubble must guide to "New Team" button saying:

"You must create a new Team to start, you will become the administrator of the Team. Teams can have many members and many projects and you can participate in multiple teams at the same time"

Dashboard

When a new Team is created and selected, there will be no activities and no projects, so the next bubble must point to the "New Project" button saying:

"You can create as many projects as you want clicking this button"

The next bubble should also highlight the Activities panel saying:

"Every time you change something in the Project or its Story they will be audited and the details of the changes will be visible to every team member from this Activity timeline box. Pro tip: you shouldn't change a Story after the team started working on it, you must add a new Story."

Project View

  1. When a user creates a new project, the board will be empty. The first bubble must point to the "Add Story" button saying:

"Click this button to create new Stories. A Story can be the description of a new feature or a bug report, for example. New stories will be created first at the Chilly Bin box."

  1. Then a new bubble must point to the Chilly Bin column title saying:

"All new stories are stores in this Chilly Bin. You should describe your stories expecting that the description and attachments will suffice for the story to be implemented. Project members should estimate those stories.".

  1. The next bubble must point to the Backlog column saying:

"The backlog MUST have all stories by order of PRIORITY. Most valuable and ready-to-start stories at the top and optional or uncertain stories at the very bottom".

  1. The next bubble must point to the In Progress column saying:

"This is where stories that must be worked on right now will reside. Central will automatically pick up the top stories from the Backlog to fit the team's current Velocity".

  1. The next bubble must point to the Velocity indicator at the top bar saying:

"All stories are estimated by "points". The average of points delivered by a team during an Iteration is the Velocity. The estimated end date of a Project is the total amount of points in the Backlog divided by the Velocity. Here you can simulate adding a new member by slightly increasing the estimated Velocity to see the effects on the future Iteration dates".

  1. The next bubble must point to the Done column saying:

"After a story is delivered and approved, it is sorted out at the bottom of this column. A delivered story can't be modified and this column is here to show you everything that has already been finished and approved".

  1. The next bubble must point to the Members column saying:

"If you want to add or remove people from the Project team, click here"

This is the basics, we can add and tweak more later, but I think that if we have at least this much, it should help new comers.

All text must be in the localized files so we can translate them.

And if we add new bubble later, because they will not be in the "tour_steps" field, only those will show for all users when we add them. This is the mechanism to allow for new bubbles and so users don't see repeated bubbles in the future unless they ask to in the profile edit page.

Option to rearrange columns in Project View

Just like Pivotal Tracker the main columns are ordered this way:

Done -> Current Sprint -> Backlog -> Chilly Bin -> Search Results (optional)

it means that new stories start at the right-side of the screen and "flow" to the left.

All of the other "kanban-like" tools have a different order:

Backlog -> In Progress -> Done

Generic post-it systems all start accumulating cards in the left-side and moving them to the right-side.

So we could have a button, checkbox, user preference where we can invert the order of our columns to be:

Chilly Bin -> Backlog -> Current Sprint -> Done

I still think the Tracker way is correct, but most people might find it confusing if coming from Trello, or Github/Gitlab boards, and others.

Docker Compose - unexpected token at 'Invalid Host header'

Hi!
I've download the repository and launched as it's written for docker:

Checkout the project

$ git clone git://github.com/Codeminer42/cm42-central.git
$ cd cm42-central

copy and edit the configuration

$ cp .env.sample .env
$ cp config/database.yml.example config/database.yml

Prepare container

$ docker-compose build
$ docker-compose run --rm web npm install
$ docker-compose run --rm web bundle exec rake db:create
$ docker-compose run --rm web bundle exec rake db:migrate
$ docker-compose run --rm web bundle exec rake db:seed

Up container

$ docker-compose up

I cannot start the app:

error

The log from the starting up the app is in the attachment - after:

$ git clone git://github.com/Codeminer42/cm42-central.git
$ cd cm42-central

copy and edit the configuration

$ cp .env.sample .env
$ cp config/database.yml.example config/database.yml

There is the log from terminal (running on Mac OS):
docker-output.txt

Thank you in advance.

Improve the Projects sidebar

As with this improvement in Tracker's Dashboard we should have a list of projects the authenticated user is not currently a member of, but that is in the same Organization.

So the sidebar should have:

  1. the same projects that the user is a member of (has Membership)
  2. the other projects from the same organization but without a Membership link

A user can choose to "Join" a project (create a Membership) directly. Optionally a project can have a new field such as (disallow_join: boolean) which would require only an administrator (Enrollment.is_admin true) to be able to add new members, otherwise any member of an organization should be able to join/unjoin any project at will.

Improve release stories

Until now, releases stories was being handled as a normal story, with a simple purpose to separate stories in groups. From now, we need to design it in a way it effectively informs the users about the release expectation.

First off, we need to add a date field to it, called release_date, to store the expected date the release should be launched, with a date picker. Also, release stories just need some fields which normal stories have: Title, Story Type, Release Date and Description.

After that, the release story should dynamically check its iteration date when it was rendered (based in the velocity), and compare with its release date specified. If the iteration start date is greater than release date, then the release should change something in its aspect (like color, background color, icon, w/e) to make visible that it will break the release date expectation.

A more detailed description of how a release story must behave can be found at Pivotal Tracker documentation. Ours must work the exact same way.

  1. Add the release date field, and persist it. Remove uneccessary fields from release story.
  2. Highlight the release story if the release date is compromised.

Fix Eslint issues

There are many Eslint issues reported. Fix all of them and add eslint engine in .codeclimate.yml file.

Make central-bot use APIs instead connecting in central database

Now, since we have API in central, the central-bot can use it instead connecting in central database.

  • Create classes to deal with central API in central-bot
  • Change the workers to use those API classes instead to use AR models
  • Unlink iteration_snapshot from project AR, and link it with project fetch by API

Changing a user to an admin is not working

Didn't investigate, but in the admin/users controller probably, the button "make a user an administrator" is returning ok (success message) but it's not actually updating the user.

CSV import fails

When I export the test project, create a new project and try to import. The AJAX API call fails with 401 {"error":{"message":"Invalid api_key username"}}

The UI shows the upload %, the resets without error message.

Actually all attachments fail - I assume it's a config issue with Attachinary? I'm running the app on MacOS Sierra. Is it possible to run without a Cloudinary account?

Also, I noticed the REST API - would be great if it supported creating stories.

Create a Burn Up Chart

The Burn Down Chart must be done first, so we have the "delivered_at" field in all stories.

A Burn Up chart is basically a plot of total stories in the backlog vs delivered stories, so we can see total stories increasing (client adds new stories) or stories decreasing (client decides to cut down scope to meet deadlines) and productivity (delivered stories over time).

This graph should help the team see when the line of delivered stories will meet the line of total number of stories (the final date of the project). Milestones could be displayed as highlighted points in the graph (x is date, y is number of stories). This allow for basic forecasting of when the project will finish.

Because this graph is probably heavy (as it has to group all stories in the project) this should probably be a separated URL. Instead of adding it to the /projects/xyz/reports, maybe we should have a /projects/xyz/reports/burnup for example.

Add a "Confirm" box for Accept/Reject operation

Sometimes a client pushes the "Accept" button when he actually meant to "Reject" it. And once a story is accepted it becomes read-only, so he can't fix it.

The easiest thing to do is to add a confirm box to avoid accidental clicks like this.

Sometimes, user can't re-prioritize tasks

Some users are reporting a issue with task prioritizing process.

To help reproduce, I'll post here the last user report about the problem:

Some tasks, even with the same estimative points, aren't possible to change their priority, move up or down. In this situation, the column we tried it was In Progress.

This is an important issue and should be solved ASAP.

Integrate with Twilio for 2FA

In the system level (initially as an environment variable) one should be able to add Twilio Token for 2FA. If available each user edit form should have a checkbox to enable 2FA. This tutorial should guide how to implement it.

Important: if the system has no Twilio API configured, everything should work just fine without 2FA. And by adding 2FA, in the activeadmin, the Super Admin should be able to force 2FA to users or disable it if necessary.

Fix Rubocop issues

There are many Rubocop issues reported. Fix all of them and add rubocop engine in .codeclimate.yml file.

Flag to send or not reports by mail/integration

Add a flag into the project, to admins easily start/stop iteration mail reports.

Always check this flag before sending mail with iteration report, and if the iteration is blank, change this flag to false and stop mailing it.

Server will not run after successful installation

After what appeared to be a successful installation (non-docker) I got the following when I tried to start the server:

15:55:45 web.1     | started with pid 1988
15:55:45 worker.1  | started with pid 1989
15:55:45 webpack.1 | started with pid 1991
 70% 1/1 build modules http://0.0.0.0:3808/
15:55:54 webpack.1 | webpack result is served from //localhost:3808/webpack/
15:55:54 webpack.1 | content is served from /home/graeme/cm42-central
15:55:57 worker.1  | exited with code 1
15:55:57 system    | sending SIGTERM to all processes
15:55:57 webpack.1 | terminated by SIGTERM
15:55:58 web.1     | exited with code 0

Nothing in the log directory looked amiss.

Any suggestions where I could look to try and diagnose the problem?

Thanks

Unable to upload a file when creating a story

from Rafael Gibim:

Não estou conseguindo criar uma nova story com attachment. Após anexar o arquivo, o botão de "Save" não é liberado mesmo após o fim do upload
workaround que usei foi criar uma story, depois editei ela e coloquei o anexo normalmente

Better Integration form

Right now to integrate a project with mattermost we have to type in a perfectly crafted JSON string with the necessary integration information such as channel name.

We should add those fields to the new project/edit project form.

Ideally we should see how to fetch a list of private channels from the mattermost API as well, and create a dropdown. (optional)

Refactor Story View into a React component

Story View (story_view.js) is being gradually converted into a react component.

Here is the current state:

Expanded

  • Control buttons ('Save','Delete', 'Cancel') (#131)
  • 'Copy id/url to clipboard' and History buttons (#162)
  • Estimate selector (#171)
  • State and Type selectors (#190, #189)
  • Requested by and Owned by select (#196, #197)
  • Labels (#206)
  • Description (#212)
  • Tasks (#210)
  • Attachments (#215)
  • Notes (#192)

Collapsed

  • State related action buttons
  • Collapsed template (story.ejs)

Popup

  • hoverBox template (story_hover.js)

Wrap up

  • Convert story_view into a React component removing all the appends and replacing all the appends with actual components being rendered inside other components. It can be a <Story /> component that stores the open/closed state in component's state and then renders <OpenStory /> and <ClosedStory /> conditionally
  • Move mutability operations calls to an upper component (probably a container component) that will handle the changes and re-render the component

<CentralBot> Misbehavior when trying to process new projects

Below is the behavior observed on 09/12 when processing the project with the following data.

Name => Project Bar
Slug => project-bar
Created at => 08/03

When the central bot ran it on days 9 and 10 all jobs were executed normal.
However, on Sunday(12/03) only the Start job was executed, creating an iteration_snapshot with iteration_number 2.

This is due to the following behaviors:
1) Creating a new project did not generate an iteration_snapshot with iteration_number 1.
Eg: Project Bar

2) IterationFinishJob, was not able to handle when the conditions aren't matched and tried to get a snapshot but returned nil.

conditions
=> {:project_slug=>"project-bar", :iteration_number=>1}

snapshot.finish_velocity = service["velocity"]
NoMethodError: undefined method `finish_velocity=' for nil:NilClass

I think it should leave in that condition
return if snapshot&.finished_at
Seems like IterationPreFinish was able to manage this situation.

3) - IterationStartJob should not be executed if the others jobs failed
It doesn't have any check, it simply creates a new snapshot
IterationSnapshot.new (project_slug: project_slug) | Snapshot |

This justifies the misbehavior of having a new Iteration_snapshot with iteration_number 2.

I think the best solutions is that all jobs should be dependents and not executed like that :

[IterationPreFinishJob, IterationFinishJob, IterationStartJob].each do |klass|
      begin
        klass.perform_later(project_slug, current_time.to_s, send_notification)
      rescue => e
        Rollbar.log(e, rollbar_extra)
      end
    end

Cross Project Story Linking

It would be great to have something like this from Tracker. The idea is to be able to link a story through it's unique ID and track it's status (in progress, accepted, etc).

This story can be done in 3 stages:

  • links within the same project only (with real-time status within story views)
  • links within different projects (and opening/reopening a story view refreshes with the project)\
  • a "strict-mode" in the project configuration where a story that hosts links to other stories can only be "done" when all stories are accepted.

Minor design corrections

💅 There are a few different minor style bugs on the project appearance. Anyone is welcome to follow up, add new bugs or fix them.

  • Team's edit form has a button not matching it's input size.
    teams_edit

  • Project members list on projects/:team_slug/users has missing margins on users' photo.
    projects_users

  • Project Settings sidebar's divider has two lines instead of one
    project_settings_sidebar

  • Tag Input group button is not matching the input size and it is not correctly following the panel paddings on projects/form
    tag_button
    tag_projects_new

Nothing to happen when click on the 'Add story' button.

Tried to build cm42-central from scratch with docker-compose on Windows 10.

After applying instruction which @alceumedeiros suggested, I could create a project on cm42-central.
However, nothing to happen when I clicked on the 'Add story' button.

I checked cm42 log messages during clicking the button but no log messages appeared.

I had no any changes in my .env and config/database.yml files, just using default values and logged in cm42 with [email protected].

What do I need to setup parameters for enabling a button?

The below is my environment.

  • Docker for Windows: docker-compose version 1.11.2, build f963d76f
  • cm42-central: using latest master branch source code.

and followings are .evn and config/database.yml files contents.

.env

CLOUDINARY_URL=cloudinary://username:password@localhost
MAILER_SENDER=noreply@localhost
MAIN_HOST=localhost:3000
MEMCACHIER_SERVERS=localhost:11211
SECRET_TOKEN=392bed61219db525f689555601bd40b3f12f8c7d06cbe73323d069b104272c4c0a91cc5acf1c0fc0e9b78482e5dde21a2770f82ab10af08d5de678170c6fd727
SECRET_KEY_BASE=1ed0f0a41f719a95c1bad446e9960090cd6e2a5c5f212b7a5cfe1b582548f2a3d4b78f16b99f3883713d71c87b7642537a3a579d522363d285377b1f206fc4ce
STORIES_CEILING=300
CDN_URL=http://xpto.cloudfront.net
NEW_RELIC_LICENSE_KEY=your_license_key
INTEGRATION_URI_MATTERMOST=http://foo.com
RECAPTCHA_PUBLIC_KEY=
RECAPTCHA_PRIVATE_KEY=
WEBPACK_HOST="0.0.0.0"
WEBPACK_MANIFEST_HOST="localhost"
WEBPACK_MANIFEST_PORT="3808"
WEBPACK_PORT="3808"
DB_USERNAME=
DB_PASSWORD=
DB_HOST=

config/database.yml

# PostgreSQL
base: &base
  host: <%= ENV['DB_HOST'] %>
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

development:
  <<: *base
  database: fulcrum_development

test:
  <<: *base
  database: fulcrum_test

production:
  <<: *base
  database: fulcrum_production

Thanks in advance.

Expose the main models as (read-only) APIs

There must be a way to fetch info from the system through APIs (just GET APIs in this Issue).

Ideally with some pagination support through params if the listing is too large.

  • GET /api/v1/teams - should fetch a JSON of all Team models
  • GET /api/v1/teams/{slug}/projects - should fetch a JSON of all projects of that Team through the Ownership association
  • GET /api/v1/teams/{slug}/users - should fetch a JSON of all the members of a team (through the Enrollment association to get which of them are admins)
  • GET /api/v1/projects/{slug}/stories?state=accepted&iteration_number=20 - to fetch all accepted stories from Iteration 20 and so on (check out the IterationService from the central-support gem to know how to deal with iterations)
  • GET /api/v1/projects/{slug}/users - should fetch all members of a Project through the Membership association

APIs must be protected through some kind of API keys.

Each Team Admin (a User Enrolled with is_admin: true in a Team) should have the option to create or revoke API keys in their User Edit forms.

Super Admin users, through ActiveAdmin, can revoke existing keys as well.

It can be implemented with Rails-API on top of the current Rails app. Grape or others can be considered.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.