diff --git a/app/assets/javascripts/repositories/index.js b/app/assets/javascripts/repositories/index.js index 59c99641a..fc293e313 100644 --- a/app/assets/javascripts/repositories/index.js +++ b/app/assets/javascripts/repositories/index.js @@ -2,7 +2,11 @@ 'use strict'; // Show modal for repository deletion - $(document).on('click', '#delete-repo-option', function() { + $(document).on('click', '#delete-repo-option', function(e) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + var url = $(this).attr('href'); $.ajax({ method: 'GET', @@ -15,5 +19,59 @@ keyboard: false }); }); + + return false; }); + + // Show modal for repository renaming + $(document).on('click', '#rename-repo-option', function(e) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + + var url = $(this).attr('href'); + $.ajax({ + method: 'GET', + url: url, + dataType: 'json' + }).done(function(xhr, settings, data) { + $('body').append($.parseHTML(data.responseJSON.html)); + $('#rename-repo-modal').modal('show', { + backdrop: true, + keyboard: false + }); + validateRenameForm($('#rename-repo-modal')); + }); + + return false; + }); + + /** + * Reload after successfully updated experiment + * @param {object} $modal Modal object + */ + function validateRenameForm($modal) { + if ($modal) { + var form = $modal.find('form'); + form + .on('ajax:success', function() { + animateSpinner(form, true); + location.reload(); + }) + .on('ajax:error', function(e, error) { + var msg = JSON.parse(error.responseText); + if ('name' in msg) { + renderFormError(e, + $modal.find('#repository_name'), + msg.name.toString(), + true); + } else { + renderFormError(e, + $modal.find('#experiment-name'), + error.statusText, + true); + } + }); + } + } })(); diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index b784e2d82..281c9b9e1 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -21,10 +21,39 @@ class RepositoriesController < ApplicationController def destroy @repo = Repository.find(params[:id]) - @repo.destroy if @repo + flash[:success] = t('repositories.index.delete_flash', name: @repo.name) + @repo.destroy + redirect_to :back + end + + def rename_modal + @repository = Repository.find(params[:repository_id]) + respond_to do |format| + format.json do + render json: { + html: render_to_string( + partial: 'rename_repository_modal.html.erb' + ) + } + end + end + end + + def update + @repo = Repository.find(params[:id]) + old_name = @repo.name + @repo.update_attributes(repository_params) respond_to do |format| - format.js { render inline: 'location.reload();' } + format.json do + if @repo.save + flash[:success] = t('repositories.index.rename_flash', + old_name: old_name, new_name: @repo.name) + render json: {}, status: :ok + else + render json: @repo.errors, status: :unprocessable_entity + end + end end end @@ -39,4 +68,8 @@ class RepositoriesController < ApplicationController def check_view_all_permissions render_403 unless can_view_team_repositories(@team) end + + def repository_params + params.require(:repository).permit(:name) + end end diff --git a/app/views/repositories/_delete_repository_modal.html.erb b/app/views/repositories/_delete_repository_modal.html.erb index 589e27c81..2ec524814 100644 --- a/app/views/repositories/_delete_repository_modal.html.erb +++ b/app/views/repositories/_delete_repository_modal.html.erb @@ -22,7 +22,6 @@ team_repository_path(id: @repository), id: "confirm-repo-delete", method: :delete, - remote: true, type: 'button', class: 'btn btn-primary' %> diff --git a/app/views/repositories/_rename_repository_modal.html.erb b/app/views/repositories/_rename_repository_modal.html.erb new file mode 100644 index 000000000..dc457d87a --- /dev/null +++ b/app/views/repositories/_rename_repository_modal.html.erb @@ -0,0 +1,33 @@ +