summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-11-13 16:07:27 +0100
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-11-16 14:07:38 +0100
commit05335a3c8584c48a9317bd0919eccee6948de742 (patch)
tree9f3e533c6fc1fa1169d3e5a0a965d4103f37f19c
parent1328e4b504773ff98d716fd561dbc50fd7652a36 (diff)
downloadgitlab-ce-05335a3c8584c48a9317bd0919eccee6948de742.tar.gz
Create milestones in the group
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
-rw-r--r--app/controllers/groups/milestones_controller.rb36
-rw-r--r--app/views/groups/milestones/index.html.haml12
-rw-r--r--app/views/groups/milestones/new.html.haml46
-rw-r--r--config/routes.rb2
-rw-r--r--features/groups.feature9
-rw-r--r--features/steps/groups.rb22
-rw-r--r--features/steps/shared/paths.rb4
7 files changed, 121 insertions, 10 deletions
diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb
index 669f7f3126d..8779376d93c 100644
--- a/app/controllers/groups/milestones_controller.rb
+++ b/app/controllers/groups/milestones_controller.rb
@@ -1,16 +1,34 @@
class Groups::MilestonesController < Groups::ApplicationController
before_action :authorize_group_milestone!, only: :update
+ before_action :group
def index
- project_milestones = case params[:state]
- when 'all'; state
- when 'closed'; state('closed')
- else state('active')
- end
+ project_milestones =
+ case params[:state]
+ when 'all'; state
+ when 'closed'; state('closed')
+ else state('active')
+ end
+
@group_milestones = Milestones::GroupService.new(project_milestones).execute
@group_milestones = Kaminari.paginate_array(@group_milestones).page(params[:page]).per(PER_PAGE)
end
+ def new
+ @group_milestone = OpenStruct.new(title: nil, description: nil)
+ end
+
+ def create
+ project_ids = params[:milestone][:project_ids]
+ title = milestone_params[:title]
+
+ @group.projects.where(id: project_ids).each do |project|
+ Milestones::CreateService.new(project, current_user, milestone_params).execute
+ end
+
+ redirect_to group_milestone_path(@group, title.parameterize, title: title)
+ end
+
def show
project_milestones = Milestone.where(project_id: group.projects).order("due_date ASC")
@group_milestone = Milestones::GroupService.new(project_milestones).milestone(title)
@@ -51,4 +69,12 @@ class Groups::MilestonesController < Groups::ApplicationController
def authorize_group_milestone!
return render_404 unless can?(current_user, :admin_group, group)
end
+
+ def milestone_params
+ params.require(:milestone).permit(
+ :title,
+ :description,
+ :due_date
+ )
+ end
end
diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml
index 2bbcad5fdfb..ded4f3713f6 100644
--- a/app/views/groups/milestones/index.html.haml
+++ b/app/views/groups/milestones/index.html.haml
@@ -3,9 +3,15 @@
= render 'shared/milestones_filter'
.gray-content-block
- Only milestones from
- %strong #{@group.name}
- group are listed here.
+ .pull-right
+ %span.pull-right.hidden-xs
+ = link_to new_group_milestone_path(@group), class: "btn btn-new" do
+ New Milestone
+
+ .oneline
+ Only milestones from
+ %strong #{@group.name}
+ group are listed here.
.milestones
%ul.content-list
- if @group_milestones.blank?
diff --git a/app/views/groups/milestones/new.html.haml b/app/views/groups/milestones/new.html.haml
new file mode 100644
index 00000000000..287f89a7074
--- /dev/null
+++ b/app/views/groups/milestones/new.html.haml
@@ -0,0 +1,46 @@
+%h3.page-title
+ New Milestone
+
+%p.light
+ This will create milestone in every selected project
+%hr
+
+= form_for @group_milestone, as: :milestone, url: group_milestones_path(@group), html: { class: 'form-horizontal milestone-form gfm-form js-requires-input' } do |f|
+ .row
+ .col-md-6
+ .form-group
+ = f.label :title, "Title", class: "control-label"
+ .col-sm-10
+ = f.text_field :title, maxlength: 255, class: "form-control js-quick-submit", required: true
+ %p.hint Required
+ .form-group.milestone-description
+ = f.label :description, "Description", class: "control-label"
+ .col-sm-10
+ = render layout: 'projects/md_preview', locals: { preview_class: "md-preview" } do
+ = render 'projects/zen', f: f, attr: :description, classes: 'description form-control js-quick-submit'
+ = render 'projects/notes/hints'
+ .clearfix
+ .error-alert
+ .form-group
+ = f.label :projects, "Projects", class: "control-label"
+ .col-sm-10
+ = f.collection_select :project_ids, @group.projects, :id, :name,
+ { selected: @group.projects.map(&:id) }, multiple: true, class: 'select2'
+
+ .col-md-6
+ .form-group
+ = f.label :due_date, "Due Date", class: "control-label"
+ .col-sm-10= f.hidden_field :due_date
+ .col-sm-10
+ .datepicker
+
+ .form-actions
+ = f.submit 'Create Milestone', class: "btn-create btn"
+ = link_to "Cancel", group_milestones_path(@group), class: "btn btn-cancel"
+
+
+:javascript
+ $( ".datepicker" ).datepicker({
+ dateFormat: "yy-mm-dd",
+ onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) }
+ }).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $('#milestone_due_date').val()));
diff --git a/config/routes.rb b/config/routes.rb
index bd85f4e3c69..c0077ab1a99 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -368,7 +368,7 @@ Gitlab::Application.routes.draw do
end
resource :avatar, only: [:destroy]
- resources :milestones, only: [:index, :show, :update]
+ resources :milestones, only: [:index, :show, :update, :new, :create]
end
end
diff --git a/features/groups.feature b/features/groups.feature
index db37fa3b375..615eff6a330 100644
--- a/features/groups.feature
+++ b/features/groups.feature
@@ -153,6 +153,13 @@ Feature: Groups
Then I should see group milestone with descriptions and expiry date
And I should see group milestone with all issues and MRs assigned to that milestone
+ Scenario: Create multiple milestones with one form
+ Given I visit group "Owned" milestones page
+ And I click new milestone button
+ And I fill milestone name
+ When I press create mileston button
+ Then milestone in each project should be created
+
# Group projects in settings
Scenario: I should see all projects in the project list in settings
Given Group "Owned" has archived project
@@ -169,4 +176,4 @@ Feature: Groups
When I visit group "Owned" page
Then I should see group "Owned"
Then I should see project "Public-project"
-
+
diff --git a/features/steps/groups.rb b/features/steps/groups.rb
index 70388c18fcf..a8fba2406ae 100644
--- a/features/steps/groups.rb
+++ b/features/steps/groups.rb
@@ -255,6 +255,28 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
expect(page).to have_xpath("//span[@class='label label-warning']", text: 'archived')
end
+ step 'I fill milestone name' do
+ fill_in 'milestone_title', with: 'v2.9.0'
+ end
+
+ step 'I click new milestone button' do
+ click_link "New Milestone"
+ end
+
+ step 'I press create mileston button' do
+ click_button "Create Milestone"
+ end
+
+ step 'milestone in each project should be created' do
+ group = Group.find_by(name: 'Owned')
+ expect(page).to have_content "Milestone v2.9.0"
+ expect(group.projects).to be_present
+
+ group.projects.each do |project|
+ expect(page).to have_content project.name
+ end
+ end
+
protected
def assigned_to_me(key)
diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb
index eb978620da6..c74a5fd3bc7 100644
--- a/features/steps/shared/paths.rb
+++ b/features/steps/shared/paths.rb
@@ -31,6 +31,10 @@ module SharedPaths
visit merge_requests_group_path(Group.find_by(name: "Owned"))
end
+ step 'I visit group "Owned" milestones page' do
+ visit group_milestones_path(Group.find_by(name: "Owned"))
+ end
+
step 'I visit group "Owned" members page' do
visit group_group_members_path(Group.find_by(name: "Owned"))
end