From 13bf4ad229696de0e1353a33dce4d3fc73befbf9 Mon Sep 17 00:00:00 2001 From: Mojca Lorber Date: Wed, 24 May 2017 09:29:44 +0200 Subject: [PATCH] create new repository --- app/assets/javascripts/repositories/index.js | 51 +++++++ app/controllers/repositories_controller.rb | 45 +++++++ app/helpers/permission_helper.rb | 4 + app/views/repositories/index.html.erb | 125 ++++++++++-------- .../index/_create_new_modal.html.erb | 17 +++ .../index/_create_new_modal_body.html.erb | 3 + config/initializers/constants.rb | 3 + config/locales/en.yml | 14 +- config/routes.rb | 6 +- 9 files changed, 207 insertions(+), 61 deletions(-) create mode 100644 app/views/repositories/index/_create_new_modal.html.erb create mode 100644 app/views/repositories/index/_create_new_modal_body.html.erb diff --git a/app/assets/javascripts/repositories/index.js b/app/assets/javascripts/repositories/index.js index dca06dc24..6ae014ec6 100644 --- a/app/assets/javascripts/repositories/index.js +++ b/app/assets/javascripts/repositories/index.js @@ -4,3 +4,54 @@ $('.delete-repo-option').initializeModal('#delete-repo-modal'); $('.rename-repo-option').initializeModal('#rename-repo-modal'); })(); + +// create new +function init() { + initCreateNewModal(); +} + +function initCreateNewModal() { + var link = $("[data-action='create-new-repository']"); + var modal = $("#create-new-modal"); + var submitBtn = modal.find(".modal-footer [data-action='submit']"); + + link.on("click", function() { + $.ajax({ + url: link.attr("data-url"), + type: "GET", + dataType: "json", + success: function (data) { + var modalBody = modal.find(".modal-body"); + modalBody.html(data.html); + + modalBody.find("form") + .on("ajax:success", function(ev2, data2, status2) { + // Redirect to index page + $(location).attr("href", data2.url); + }) + .on("ajax:error", function(ev2, data2, status2) { + // Display errors if needed + $(this).renderFormErrors("repository", data2.responseJSON); + }); + + modal.modal("show"); + modalBody.find("input[type='text']").focus(); + }, + error: function (error) { + // TODO + } + }); + }); + + submitBtn.on("click", function() { + // Submit the form inside modal + $(this).closest(".modal").find(".modal-body form").submit(); + }); + + modal.on("hidden.bs.modal", function(e) { + modal.find(".modal-body form").off("ajax:success ajax:error"); + modal.find(".modal-body").html(""); + }); +} + +init(); diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index ec4ec8293..d048601ba 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -3,11 +3,51 @@ class RepositoriesController < ApplicationController before_action :check_view_all_permissions, only: :index before_action :check_edit_and_destroy_permissions, only: %(destroy destroy_modal rename_modal update) + before_action :check_create_permissions, only: [ + :create_new_modal, + :create + ] def index render('repositories/index') end + def create_new_modal + @new_repository = Repository.new + respond_to do |format| + format.json { + render json: { + html: render_to_string({ + partial: "repositories/index/create_new_modal_body.html.erb" + }) + } + } + end + end + + def create + @repository = Repository.new( + team: @team, + created_by: current_user + ) + @repository.assign_attributes(repository_params) + + respond_to do |format| + if @repository.save + flash[:success] = t("repositories.create.success_flash", name: @repository.name) + format.json { + render json: { url: team_repositories_path(@team, create_action: true) }, + status: :ok + } + else + format.json { + render json: @repository.errors, + status: :unprocessable_entity + } + end + end + end + def destroy_modal @repository = Repository.find(params[:repository_id]) respond_to do |format| @@ -74,6 +114,11 @@ class RepositoriesController < ApplicationController render_403 unless can_view_team_repositories(@team) end + def check_create_permissions + render_403 unless can_create_new_repository(@team) && + @repositories.count < Constants::REPOSITORIES_LIMIT + end + def check_edit_and_destroy_permissions render_403 unless can_edit_and_destroy_repository(@repository) end diff --git a/app/helpers/permission_helper.rb b/app/helpers/permission_helper.rb index e453ed2a7..3ed492cac 100644 --- a/app/helpers/permission_helper.rb +++ b/app/helpers/permission_helper.rb @@ -1053,6 +1053,10 @@ module PermissionHelper is_member_of_team(team) end + def can_create_new_repository(team) + is_admin_of_team(team) + end + def can_view_repositories(team) is_normal_user_or_admin_of_team(team) end diff --git a/app/views/repositories/index.html.erb b/app/views/repositories/index.html.erb index cc39a54e7..34bb7d88e 100644 --- a/app/views/repositories/index.html.erb +++ b/app/views/repositories/index.html.erb @@ -4,68 +4,80 @@ <%= render partial: "repositories/breadcrumbs.html.erb", locals: { teams: @teams, current_team: current_team, type: @type } %> + <% active_repo = @repositories.find_by_id(params[:repository]) %> + <% active_repo = @repositories.first if !active_repo %> + - <% if @repositories.present? %> - <% active_repo = @repositories.find_by_id(params[:repository]) %> - <% active_repo = @repositories.first if !active_repo %> + - - -
- <% @repositories.each do |repo| %> -
- + +
+ <% @repositories.each do |repo| %> +
-
- - <% else %> -

<%=t 'repositories.index.no_repositories' %>

- <% end %> + +
+ <% end %> +
<% else %> @@ -76,3 +88,4 @@ <% end %> <%= javascript_include_tag "repositories/index", "data-turbolinks-track" => true %> +<%= render partial: "repositories/index/create_new_modal.html.erb" %> diff --git a/app/views/repositories/index/_create_new_modal.html.erb b/app/views/repositories/index/_create_new_modal.html.erb new file mode 100644 index 000000000..8a243e238 --- /dev/null +++ b/app/views/repositories/index/_create_new_modal.html.erb @@ -0,0 +1,17 @@ + diff --git a/app/views/repositories/index/_create_new_modal_body.html.erb b/app/views/repositories/index/_create_new_modal_body.html.erb new file mode 100644 index 000000000..f7eea8f87 --- /dev/null +++ b/app/views/repositories/index/_create_new_modal_body.html.erb @@ -0,0 +1,3 @@ +<%= bootstrap_form_for [@team, @new_repository], remote: :true do |f| %> + <%= f.text_field :name, label: t("repositories.create.name_label"), placeholder: t("repositories.create.name_placeholder") %> +<% end %> diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index 7ad024929..798b99ee9 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -51,6 +51,9 @@ class Constants # Maximum nr. of search results for atwho (smart annotations) ATWHO_SEARCH_LIMIT = 5 + # Maximum number of repositories allowed + REPOSITORIES_LIMIT = 5 + #============================================================================= # File and data memory size #============================================================================= diff --git a/config/locales/en.yml b/config/locales/en.yml index 5e1852e16..135b91687 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -149,10 +149,13 @@ en: result: "Result comment" repositories: + nav: + breadcrumbs: + repositories: "Repositories" index: head_title: "Repositories" title: "Repositories" - no_repositories: "No repositories" + add_new_repository_tab: "Create new repository" delete_flash: "\"%{name}\" repository was successfully deleted!" rename_flash: "\"%{old_name}\" repository was successfully renamed to \"%{new_name}\"!" no_teams: @@ -174,9 +177,12 @@ en: name: "New repository name" name_placeholder: "My repository" rename: "Rename repository" - nav: - breadcrumbs: - repositories: "Repositories" + create: + title: "Create new repository" + name_label: "Repository name" + name_placeholder: "My repository" + submit: "Create repository" + success_flash: "Repository %{name} successfully created." comments: options_dropdown: diff --git a/config/routes.rb b/config/routes.rb index 335ff8249..ad78ac9eb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -123,7 +123,11 @@ Rails.application.routes.draw do as: 'file_expired' resources :teams do - resources :repositories, only: %i(index destroy update) do + resources :repositories, only: %i(index create destroy update) do + collection do + get 'create_new_modal', to: 'repositories#create_new_modal', + defaults: { format: 'json' } + end get 'destroy_modal', to: 'repositories#destroy_modal', defaults: { format: 'json' } get 'rename_modal', to: 'repositories#rename_modal',