From 88d397f473a40236c7a03a7acf924a3640e70d9c Mon Sep 17 00:00:00 2001 From: Johann MacDonagh Date: Sat, 8 Feb 2014 21:47:20 -0500 Subject: Instruct users to fetch merge request branch Instructing users to create a new branch on the target branch and then pulling creates a few issues. If the target branch has moved on since the source branch diverged from it, then the pull will create an unnecessary merge commit from the target branch to the source branch. If the user has pull.rebase set to "true" or "preserve", then this creates an even stranger history. These instructions will ensure the local branch created for the merge request is exactly what contributing user has pushed. --- app/views/projects/merge_requests/show/_how_to_merge.html.haml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/show/_how_to_merge.html.haml b/app/views/projects/merge_requests/show/_how_to_merge.html.haml index 9540453ce3e..63db4b30968 100644 --- a/app/views/projects/merge_requests/show/_how_to_merge.html.haml +++ b/app/views/projects/merge_requests/show/_how_to_merge.html.haml @@ -10,11 +10,11 @@ - target_remote = @merge_request.target_project.namespace.nil? ? "target" :@merge_request.target_project.namespace.path %p %strong Step 1. - Checkout the branch we are going to merge and pull in the code + Fetch the code and create a new branch pointing to it %pre.dark :preserve - git checkout -b #{@merge_request.source_project_path}-#{@merge_request.source_branch} #{@merge_request.target_branch} - git pull #{@merge_request.source_project.http_url_to_repo} #{@merge_request.source_branch} + git fetch #{@merge_request.source_project.http_url_to_repo} #{@merge_request.source_branch} + git checkout -b #{@merge_request.source_project_path}-#{@merge_request.source_branch} FETCH_HEAD %p %strong Step 2. Merge the branch and push the changes to GitLab -- cgit v1.2.1 From 1072c95180aa31b999088fec4d14ce6765041a15 Mon Sep 17 00:00:00 2001 From: Tomas Srna Date: Tue, 22 Jul 2014 13:29:41 +0200 Subject: Attachment URL with non-/ relative root The attachment URL was not working with relative_url_root not equal to '/'. I suggest this fix. --- app/uploaders/attachment_uploader.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index b122b6c8658..24fc294909e 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -26,6 +26,10 @@ class AttachmentUploader < CarrierWave::Uploader::Base Gitlab.config.gitlab.relative_url_root + "/files/#{model.class.to_s.underscore}/#{model.id}/#{file.filename}" end + def url + Gitlab.config.gitlab.relative_url_root + '' + super unless super.nil? + end + def file_storage? self.class.storage == CarrierWave::Storage::File end -- cgit v1.2.1 From 100022d3eaf78d6c4adad647cb00b03a1befffb0 Mon Sep 17 00:00:00 2001 From: polamjag Date: Thu, 14 Aug 2014 02:10:18 +0900 Subject: append .xmlschema to system hook timestamp --- app/services/system_hooks_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb index 41014f199d5..9ac1cfb3ba5 100644 --- a/app/services/system_hooks_service.rb +++ b/app/services/system_hooks_service.rb @@ -18,7 +18,7 @@ class SystemHooksService def build_event_data(model, event) data = { event_name: build_event_name(model, event), - created_at: model.created_at + created_at: model.created_at.xmlschema } case model -- cgit v1.2.1 From 430758653ce7e4d32b40648e6263b79c2709bdad Mon Sep 17 00:00:00 2001 From: Jeroen Jacobs Date: Fri, 27 Jun 2014 16:48:30 +0200 Subject: Adds comments to commits in the API --- app/models/note.rb | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/note.rb b/app/models/note.rb index fa5fdea4eb0..d70ebcd8e6d 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -226,7 +226,7 @@ class Note < ActiveRecord::Base end def diff_file_index - line_code.split('_')[0] + line_code.split('_')[0] if line_code end def diff_file_name @@ -242,11 +242,11 @@ class Note < ActiveRecord::Base end def diff_old_line - line_code.split('_')[1].to_i + line_code.split('_')[1].to_i if line_code end def diff_new_line - line_code.split('_')[2].to_i + line_code.split('_')[2].to_i if line_code end def generate_line_code(line) @@ -267,6 +267,20 @@ class Note < ActiveRecord::Base @diff_line end + def diff_line_type + return @diff_line_type if @diff_line_type + + if diff + diff_lines.each do |line| + if generate_line_code(line) == self.line_code + @diff_line_type = line.type + end + end + end + + @diff_line_type + end + def truncated_diff_lines max_number_of_lines = 16 prev_match_line = nil -- cgit v1.2.1 From e2e4dc5942221f37713c3414e1811cc85dfaeab9 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sat, 27 Sep 2014 22:05:02 +0200 Subject: Use blob local instead of instance. --- app/views/projects/blob/_blob.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index be785dacedb..6ad40e8fa1f 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -16,7 +16,7 @@ = link_to title, '#' %ul.blob-commit-info.bs-callout.bs-callout-info.hidden-xs - - blob_commit = @repository.last_commit_for_path(@commit.id, @blob.path) + - blob_commit = @repository.last_commit_for_path(@commit.id, blob.path) = render blob_commit, project: @project %div#tree-content-holder.tree-content-holder -- cgit v1.2.1 From 81eacd1b2a591d3ce1f14d4119527ea9b290ba8f Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sun, 28 Sep 2014 11:02:29 +0200 Subject: Disable / hide MR edit blob button if cannot edit. --- app/helpers/tree_helper.rb | 31 +++++++++++++++++++++++++----- app/views/projects/blob/_actions.html.haml | 8 +------- app/views/projects/diffs/_file.html.haml | 6 +++--- 3 files changed, 30 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index d815257a4e3..7d616589519 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -53,13 +53,34 @@ module TreeHelper File.join(*args) end - def allowed_tree_edit? - return false unless @repository.branch_names.include?(@ref) + def allowed_tree_edit?(project = nil, ref = nil) + project ||= @project + ref ||= @ref + return false unless project.repository.branch_names.include?(ref) - if @project.protected_branch? @ref - can?(current_user, :push_code_to_protected_branches, @project) + if project.protected_branch? ref + can?(current_user, :push_code_to_protected_branches, project) else - can?(current_user, :push_code, @project) + can?(current_user, :push_code, project) + end + end + + def edit_blob_link(project, ref, path, options = {}) + if project.repository.blob_at(ref, path).text? + text = 'Edit' + after = options[:after] || '' + from_mr = options[:from_merge_request_id] + link_opts = {} + link_opts[:from_merge_request_id] = from_mr if from_mr + cls = 'btn btn-small' + if allowed_tree_edit?(project, ref) + link_to text, project_edit_tree_path(project, tree_join(ref, path), + link_opts), class: cls + else + content_tag :span, text, class: cls + ' disabled' + end + after.html_safe + else + '' end end diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml index 64c19a57803..d8e190417af 100644 --- a/app/views/projects/blob/_actions.html.haml +++ b/app/views/projects/blob/_actions.html.haml @@ -1,11 +1,5 @@ .btn-group.tree-btn-group - -# only show edit link for text files - - if @blob.text? - - if allowed_tree_edit? - = link_to 'Edit', project_edit_tree_path(@project, @id), - class: 'btn btn-small' - - else - %span.btn.btn-small.disabled Edit + = edit_blob_link(@project, @ref, @path) = link_to 'Raw', project_raw_path(@project, @id), class: 'btn btn-small', target: '_blank' -# only show normal/blame view links for text files diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml index 751df6a02e9..fc1faf73854 100644 --- a/app/views/projects/diffs/_file.html.haml +++ b/app/views/projects/diffs/_file.html.haml @@ -27,9 +27,9 @@   - if @merge_request && @merge_request.source_project - = link_to project_edit_tree_path(@merge_request.source_project, tree_join(@merge_request.source_branch, diff_file.new_path), from_merge_request_id: @merge_request.id), { class: 'btn btn-small' } do - Edit -   + = edit_blob_link(@merge_request.source_project, + @merge_request.source_branch, diff_file.new_path, + after: ' ', from_merge_request_id: @merge_request.id) = view_file_btn(@commit.id, diff_file, project) -- cgit v1.2.1 From c44764f523cea756f1f2efdc4db954f4f19df440 Mon Sep 17 00:00:00 2001 From: Bernhard Kaindl Date: Fri, 3 Oct 2014 10:12:44 +0200 Subject: Prepare ForkService to support forking projects to given namespaces Remove overload of BaseService.initialize, so initialize gains params, which is used to pass the namespace (like e.g. in TransferService). The namespace is checked for permission to create projects in it. --- app/services/projects/fork_service.rb | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index a59311bf942..c4f2d08efe9 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -2,11 +2,9 @@ module Projects class ForkService < BaseService include Gitlab::ShellAdapter - def initialize(project, user) - @from_project, @current_user = project, user - end - def execute + @from_project = @project + project_params = { visibility_level: @from_project.visibility_level, description: @from_project.description, @@ -15,8 +13,15 @@ module Projects project = Project.new(project_params) project.name = @from_project.name project.path = @from_project.path - project.namespace = current_user.namespace - project.creator = current_user + project.namespace = @current_user.namespace + if namespace = @params[:namespace] + project.namespace = namespace + end + project.creator = @current_user + unless @current_user.can?(:create_projects, project.namespace) + project.errors.add(:namespace, 'insufficient access rights') + return project + end # If the project cannot save, we do not want to trigger the project destroy # as this can have the side effect of deleting a repo attached to an existing @@ -27,7 +32,7 @@ module Projects #First save the DB entries as they can be rolled back if the repo fork fails project.build_forked_project_link(forked_to_project_id: project.id, forked_from_project_id: @from_project.id) if project.save - project.team << [current_user, :master] + project.team << [@current_user, :master] end #Now fork the repo unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path) -- cgit v1.2.1 From d92749989490289793e1e64fc6fff5673c41c75a Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sat, 4 Oct 2014 10:54:00 +0200 Subject: Remove unused Project#code function. --- app/models/project.rb | 5 ----- 1 file changed, 5 deletions(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index d228da192e4..1c7fd27a38b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -326,11 +326,6 @@ class Project < ActiveRecord::Base @ci_service ||= ci_services.select(&:activated?).first end - # For compatibility with old code - def code - path - end - def items_for(entity) case entity when 'issue' then -- cgit v1.2.1 From 11848febd1170042523907652a36503c57e9fac2 Mon Sep 17 00:00:00 2001 From: Kirill Zaitsev Date: Sun, 5 Oct 2014 17:03:15 +0400 Subject: Add issueable actor --- app/models/concerns/issuable.rb | 3 ++- app/models/user.rb | 8 ++++++++ app/services/issues/base_service.rb | 2 +- app/services/merge_requests/base_merge_service.rb | 3 ++- app/services/merge_requests/base_service.rb | 3 ++- 5 files changed, 15 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 553087946d6..f49708fd6eb 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -131,9 +131,10 @@ module Issuable users.concat(mentions.reduce([], :|)).uniq end - def to_hook_data + def to_hook_data(user) { object_kind: self.class.name.underscore, + user: user.hook_attrs, object_attributes: hook_attrs } end diff --git a/app/models/user.rb b/app/models/user.rb index c90f2462426..45e4d71808f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -488,6 +488,14 @@ class User < ActiveRecord::Base end end + def hook_attrs + { + name: name, + username: username, + avatar_url: avatar_url + } + end + def ensure_namespace_correct # Ensure user has namespace self.create_namespace!(path: self.username, name: self.username) unless self.namespace diff --git a/app/services/issues/base_service.rb b/app/services/issues/base_service.rb index 71b9ffc3489..2deffe3927a 100644 --- a/app/services/issues/base_service.rb +++ b/app/services/issues/base_service.rb @@ -8,7 +8,7 @@ module Issues end def execute_hooks(issue, action = 'open') - issue_data = issue.to_hook_data + issue_data = issue.to_hook_data(current_user) issue_url = Gitlab::UrlBuilder.new(:issue).build(issue.id) issue_data[:object_attributes].merge!(url: issue_url, action: action) issue.project.execute_hooks(issue_data, :issue_hooks) diff --git a/app/services/merge_requests/base_merge_service.rb b/app/services/merge_requests/base_merge_service.rb index 9bc50d3d16c..700a21ca011 100644 --- a/app/services/merge_requests/base_merge_service.rb +++ b/app/services/merge_requests/base_merge_service.rb @@ -13,7 +13,8 @@ module MergeRequests def execute_project_hooks(merge_request) if merge_request.project - merge_request.project.execute_hooks(merge_request.to_hook_data, :merge_request_hooks) + hook_data = merge_request.to_hook_data(current_user) + merge_request.project.execute_hooks(hook_data, :merge_request_hooks) end end end diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb index 2907f3587da..9f57a718eac 100644 --- a/app/services/merge_requests/base_service.rb +++ b/app/services/merge_requests/base_service.rb @@ -13,7 +13,8 @@ module MergeRequests def execute_hooks(merge_request) if merge_request.project - merge_request.project.execute_hooks(merge_request.to_hook_data, :merge_request_hooks) + hook_data = merge_request.to_hook_data(current_user) + merge_request.project.execute_hooks(hook_data, :merge_request_hooks) end end -- cgit v1.2.1 From d584c406e8a687ee0f15cc0ed67ae9001784b1d3 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Fri, 3 Oct 2014 00:26:56 +0200 Subject: Move new blob commit message textarea below editor - match edit blob view - you enter the commit message *after* you make the modifications --- app/views/projects/new_tree/show.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/projects/new_tree/show.html.haml b/app/views/projects/new_tree/show.html.haml index c47c0a3f642..f09d3659774 100644 --- a/app/views/projects/new_tree/show.html.haml +++ b/app/views/projects/new_tree/show.html.haml @@ -19,14 +19,14 @@ Encoding .col-sm-10 = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' - = render 'shared/commit_message_container', params: params, - placeholder: 'Add new file' .file-holder .file-title %i.fa.fa-file .file-content.code %pre#editor= params[:content] + = render 'shared/commit_message_container', params: params, + placeholder: 'Add new file' = hidden_field_tag 'content', '', id: 'file-content' = render 'projects/commit_button', ref: @ref, cancel_path: project_tree_path(@project, @id) -- cgit v1.2.1 From 5700842ba8ca2f3100395a9fb98c759e78e63d96 Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Wed, 15 Oct 2014 02:21:21 -0500 Subject: Add Markdown preview to more forms Enable Markdown previews when creating and editing issues, merge requests, and milestones, and when editing notes. --- app/assets/javascripts/markdown_area.js.coffee | 45 ++++++++++++++++++ app/assets/javascripts/notes.js.coffee | 55 ++-------------------- app/assets/stylesheets/generic/markdown_area.scss | 25 ++++++++++ app/assets/stylesheets/sections/notes.scss | 10 ---- app/controllers/projects/notes_controller.rb | 4 -- app/controllers/projects_controller.rb | 4 ++ app/views/projects/_issuable_form.html.haml | 25 +++++----- app/views/projects/_md_preview.html.haml | 12 +++++ .../projects/merge_requests/_new_submit.html.haml | 13 ++--- app/views/projects/milestones/_form.html.haml | 11 +++-- app/views/projects/notes/_form.html.haml | 22 +++------ app/views/projects/notes/_note.html.haml | 3 +- 12 files changed, 124 insertions(+), 105 deletions(-) create mode 100644 app/views/projects/_md_preview.html.haml (limited to 'app') diff --git a/app/assets/javascripts/markdown_area.js.coffee b/app/assets/javascripts/markdown_area.js.coffee index a0ebfc98ce6..a4bd4774dc9 100644 --- a/app/assets/javascripts/markdown_area.js.coffee +++ b/app/assets/javascripts/markdown_area.js.coffee @@ -24,6 +24,51 @@ $(document).ready -> "opacity": 0 "display": "none" + # Preview button + $(document).off "click", ".js-md-preview-button" + $(document).on "click", ".js-md-preview-button", (e) -> + ### + Shows the Markdown preview. + + Lets the server render GFM into Html and displays it. + ### + e.preventDefault() + form = $(this).closest("form") + # toggle tabs + form.find(".js-md-write-button").parent().removeClass "active" + form.find(".js-md-preview-button").parent().addClass "active" + + # toggle content + form.find(".md-write-holder").hide() + form.find(".md-preview-holder").show() + + preview = form.find(".js-md-preview") + mdText = form.find(".markdown-area").val() + if mdText.trim().length is 0 + preview.text "Nothing to preview." + else + preview.text "Loading..." + $.post($(this).data("url"), + md_text: mdText + ).success (previewData) -> + preview.html previewData + + # Write button + $(document).off "click", ".js-md-write-button" + $(document).on "click", ".js-md-write-button", (e) -> + ### + Shows the Markdown textarea. + ### + e.preventDefault() + form = $(this).closest("form") + # toggle tabs + form.find(".js-md-write-button").parent().addClass "active" + form.find(".js-md-preview-button").parent().removeClass "active" + + # toggle content + form.find(".md-write-holder").show() + form.find(".md-preview-holder").hide() + dropzone = $(".div-dropzone").dropzone( url: project_image_path_upload dictDefaultMessage: "" diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index ba8d7a9a2f5..b6bb0c42ad4 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -36,12 +36,6 @@ class Notes # delete note attachment $(document).on "click", ".js-note-attachment-delete", @removeAttachment - # Preview button - $(document).on "click", ".js-note-preview-button", @previewNote - - # Preview button - $(document).on "click", ".js-note-write-button", @writeNote - # reset main target form after submit $(document).on "ajax:complete", ".js-main-target-form", @resetMainTargetForm @@ -77,8 +71,6 @@ class Notes $(document).off "click", ".note-edit-cancel" $(document).off "click", ".js-note-delete" $(document).off "click", ".js-note-attachment-delete" - $(document).off "click", ".js-note-preview-button" - $(document).off "click", ".js-note-write-button" $(document).off "ajax:complete", ".js-main-target-form" $(document).off "click", ".js-choose-note-attachment-button" $(document).off "click", ".js-discussion-reply-button" @@ -165,47 +157,6 @@ class Notes # cleanup after successfully creating a diff/discussion note @removeDiscussionNoteForm(form) - ### - Shows write note textarea. - ### - writeNote: (e) -> - e.preventDefault() - form = $(this).closest("form") - # toggle tabs - form.find(".js-note-write-button").parent().addClass "active" - form.find(".js-note-preview-button").parent().removeClass "active" - - # toggle content - form.find(".note-write-holder").show() - form.find(".note-preview-holder").hide() - - ### - Shows the note preview. - - Lets the server render GFM into Html and displays it. - ### - previewNote: (e) -> - e.preventDefault() - form = $(this).closest("form") - # toggle tabs - form.find(".js-note-write-button").parent().removeClass "active" - form.find(".js-note-preview-button").parent().addClass "active" - - # toggle content - form.find(".note-write-holder").hide() - form.find(".note-preview-holder").show() - - preview = form.find(".js-note-preview") - noteText = form.find(".js-note-text").val() - if noteText.trim().length is 0 - preview.text "Nothing to preview." - else - preview.text "Loading..." - $.post($(this).data("url"), - note: noteText - ).success (previewData) -> - preview.html previewData - ### Called in response the main target form has been successfully submitted. @@ -220,7 +171,7 @@ class Notes form.find(".js-errors").remove() # reset text and preview - form.find(".js-note-write-button").click() + form.find(".js-md-write-button").click() form.find(".js-note-text").val("").trigger "input" ### @@ -270,8 +221,8 @@ class Notes form.removeClass "js-new-note-form" # setup preview buttons - form.find(".js-note-write-button, .js-note-preview-button").tooltip placement: "left" - previewButton = form.find(".js-note-preview-button") + form.find(".js-md-write-button, .js-md-preview-button").tooltip placement: "left" + previewButton = form.find(".js-md-preview-button") form.find(".js-note-text").on "input", -> if $(this).val().trim() isnt "" previewButton.removeClass("turn-off").addClass "turn-on" diff --git a/app/assets/stylesheets/generic/markdown_area.scss b/app/assets/stylesheets/generic/markdown_area.scss index fbfa72c5e5e..e8c21afabe1 100644 --- a/app/assets/stylesheets/generic/markdown_area.scss +++ b/app/assets/stylesheets/generic/markdown_area.scss @@ -50,3 +50,28 @@ margin-bottom: 0; transition: opacity 200ms ease-in-out; } + +.md-preview-holder { + background: #FFF; + border: 1px solid #ddd; + min-height: 100px; + padding: 5px; + font-size: 14px; + box-shadow: none; +} + +.new_note, +.edit_note, +.issuable-description, +.milestone-description, +.merge-request-form { + .nav-tabs { + margin-bottom: 0; + border: none; + + li a, + li.active a { + border: 1px solid #DDD; + } + } +} diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 7eb42fddade..65ad46a4579 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -224,7 +224,6 @@ ul.notes { margin-bottom: 0; } - .note-preview-holder, .note_text { background: #FFF; border: 1px solid #ddd; @@ -243,15 +242,6 @@ ul.notes { .note_text { width: 100%; } - .nav-tabs { - margin-bottom: 0; - border: none; - - li a, - li.active a { - border: 1px solid #DDD; - } - } } /* loading indicator */ diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb index 7b08b79d236..2f1d631c14a 100644 --- a/app/controllers/projects/notes_controller.rb +++ b/app/controllers/projects/notes_controller.rb @@ -61,10 +61,6 @@ class Projects::NotesController < Projects::ApplicationController end end - def preview - render text: view_context.markdown(params[:note]) - end - private def note diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index b3380a6ff23..aca091e7d2c 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -183,6 +183,10 @@ class ProjectsController < ApplicationController render json: { star_count: @project.star_count } end + def markdown_preview + render text: view_context.markdown(params[:md_text]) + end + private def upload_path diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml index 6cdfab933b4..675b73a59cb 100644 --- a/app/views/projects/_issuable_form.html.haml +++ b/app/views/projects/_issuable_form.html.haml @@ -14,17 +14,20 @@ .form-group.issuable-description = f.label :description, 'Description', class: 'control-label' .col-sm-10 - = render 'projects/zen', f: f, attr: :description, - classes: 'description form-control' - .col-sm-12.hint - .pull-left - Parsed with - #{link_to 'GitLab Flavored Markdown', help_page_path('markdown', 'markdown'), target: '_blank'}. - .pull-right - Attach images (JPG, PNG, GIF) by dragging & dropping - or #{link_to 'selecting them', '#', class: 'markdown-selector' }. - .clearfix - .error-alert + + = render layout: 'projects/md_preview' do + = render 'projects/zen', f: f, attr: :description, + classes: 'description form-control' + .col-sm-12.hint + .pull-left + Parsed with + #{link_to 'GitLab Flavored Markdown', help_page_path('markdown', 'markdown'), target: '_blank'}. + .pull-right + Attach images (JPG, PNG, GIF) by dragging & dropping + or #{link_to 'selecting them', '#', class: 'markdown-selector' }. + + .clearfix + .error-alert %hr .form-group .issue-assignee diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml new file mode 100644 index 00000000000..dbbf8e3bf97 --- /dev/null +++ b/app/views/projects/_md_preview.html.haml @@ -0,0 +1,12 @@ +%ul.nav.nav-tabs + %li.active + = link_to '#md-write-holder', class: 'js-md-write-button' do + Write + %li + = link_to '#md-preview-holder', class: 'js-md-preview-button', data: { url: markdown_preview_project_path(@project) } do + Preview +%div + .md-write-holder + = yield + .md-preview-holder.hide + .js-md-preview diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index d4666eacd7e..76813e688b5 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -21,12 +21,13 @@ .form-group .light = f.label :description, "Description" - = render 'projects/zen', f: f, attr: :description, - classes: 'description form-control' - .clearfix.hint - .pull-left Description is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. - .error-alert + = render layout: 'projects/md_preview' do + = render 'projects/zen', f: f, attr: :description, + classes: 'description form-control' + .clearfix.hint + .pull-left Description is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. + .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + .error-alert .form-group .issue-assignee = f.label :assignee_id do diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index 5fb01a11cc5..0f51a347f01 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -18,13 +18,14 @@ .col-sm-10 = f.text_field :title, maxlength: 255, class: "form-control" %p.hint Required - .form-group + .form-group.milestone-description = f.label :description, "Description", class: "control-label" .col-sm-10 - = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' - .hint - .pull-left Milestones are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. - .pull-left Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + = render layout: 'projects/md_preview' do + = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' + .hint + .pull-left Milestones are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. + .pull-left Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. .clearfix .error-alert .col-md-6 diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index c68b3817e79..05946162d3b 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -5,23 +5,13 @@ = f.hidden_field :noteable_id = f.hidden_field :noteable_type - %ul.nav.nav-tabs - %li.active - = link_to '#note-write-holder', class: 'js-note-write-button' do - Write - %li - = link_to '#note-preview-holder', class: 'js-note-preview-button', data: { url: preview_project_notes_path(@project) } do - Preview - %div - .note-write-holder - = render 'projects/zen', f: f, attr: :note, - classes: 'note_text js-note-text' - .light.clearfix - .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. + = render layout: 'projects/md_preview' do + = render 'projects/zen', f: f, attr: :note, + classes: 'note_text js-note-text' + .light.clearfix + .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} + .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. - .note-preview-holder.hide - .js-note-preview .note-form-actions .buttons diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 814bf19970c..aa52ff35d0c 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -38,7 +38,8 @@ .note-edit-form = form_for note, url: project_note_path(@project, note), method: :put, remote: true, authenticity_token: true do |f| - = f.text_area :note, class: 'note_text js-note-text js-gfm-input turn-on' + = render layout: 'projects/md_preview' do + = f.text_area :note, class: 'note_text js-note-text markdown-area js-gfm-input turn-on' .form-actions.clearfix = f.submit 'Save changes', class: "btn btn-primary btn-save js-comment-button" -- cgit v1.2.1 From cd3eabd71236d2be1430d2dbf23aad91d73aa783 Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Thu, 16 Oct 2014 22:45:13 -0500 Subject: Use GET instead of POST for Markdown previews --- app/assets/javascripts/markdown_area.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/markdown_area.js.coffee b/app/assets/javascripts/markdown_area.js.coffee index a4bd4774dc9..0ca7070dc8b 100644 --- a/app/assets/javascripts/markdown_area.js.coffee +++ b/app/assets/javascripts/markdown_area.js.coffee @@ -48,7 +48,7 @@ $(document).ready -> preview.text "Nothing to preview." else preview.text "Loading..." - $.post($(this).data("url"), + $.get($(this).data("url"), md_text: mdText ).success (previewData) -> preview.html previewData -- cgit v1.2.1 From f9e423b499795e599d25f76c3ef519cac8ac6db0 Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Sat, 18 Oct 2014 18:16:20 -0500 Subject: Fix long line in view --- app/views/projects/_md_preview.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml index dbbf8e3bf97..cb75149434f 100644 --- a/app/views/projects/_md_preview.html.haml +++ b/app/views/projects/_md_preview.html.haml @@ -3,7 +3,8 @@ = link_to '#md-write-holder', class: 'js-md-write-button' do Write %li - = link_to '#md-preview-holder', class: 'js-md-preview-button', data: { url: markdown_preview_project_path(@project) } do + = link_to '#md-preview-holder', class: 'js-md-preview-button', + data: { url: markdown_preview_project_path(@project) } do Preview %div .md-write-holder -- cgit v1.2.1 From b011052ce7ae714e762a611bad1b9e8866fdf7cd Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sun, 19 Oct 2014 11:46:57 +0200 Subject: Remove unused authenticate_user from project#show Redundant with the authorize_read_project! filter --- app/controllers/projects_controller.rb | 2 -- 1 file changed, 2 deletions(-) (limited to 'app') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index b3380a6ff23..42ab6d3d133 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -53,8 +53,6 @@ class ProjectsController < ApplicationController return end - return authenticate_user! unless @project.public? || current_user - limit = (params[:limit] || 20).to_i @events = @project.events.recent @events = event_filter.apply_filter(@events) -- cgit v1.2.1 From e4912243c1110f7194ff4e9a3da6f23a3ccac113 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Fri, 26 Sep 2014 16:11:17 +0200 Subject: Transform remove blob link into button. --- app/views/projects/blob/_actions.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml index 64c19a57803..812d88a8730 100644 --- a/app/views/projects/blob/_actions.html.haml +++ b/app/views/projects/blob/_actions.html.haml @@ -23,5 +23,6 @@ tree_join(@commit.sha, @path)), class: 'btn btn-small' - if allowed_tree_edit? - = link_to '#modal-remove-blob', class: "remove-blob btn btn-small btn-remove", "data-toggle" => "modal" do + = button_tag class: 'remove-blob btn btn-small btn-remove', + 'data-toggle' => 'modal', 'data-target' => '#modal-remove-blob' do Remove -- cgit v1.2.1 From 951abce5627ca55cb66511cdbd4eda4db577f78b Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Mon, 27 Oct 2014 18:06:01 +0100 Subject: Factor behaviors.scss constants --- app/assets/stylesheets/behaviors.scss | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/behaviors.scss b/app/assets/stylesheets/behaviors.scss index be4c4d07f1c..469f4f296ae 100644 --- a/app/assets/stylesheets/behaviors.scss +++ b/app/assets/stylesheets/behaviors.scss @@ -1,12 +1,22 @@ // Details //-------- -.js-details-container .content { display: none; } -.js-details-container .content.hide { display: block; } -.js-details-container.open .content { display: block; } -.js-details-container.open .content.hide { display: none; } +.js-details-container { + .content { + display: none; + &.hide { display: block; } + } + &.open .content { + display: block; + &.hide { display: none; } + } +} // Toggle between two states. -.js-toggler-container .turn-on { display: block; } -.js-toggler-container .turn-off { display: none; } -.js-toggler-container.on .turn-on { display: none; } -.js-toggler-container.on .turn-off { display: block; } +.js-toggler-container { + .turn-on { display: block; } + .turn-off { display: none; } + &.on { + .turn-on { display: none; } + .turn-off { display: block; } + } +} -- cgit v1.2.1 From 56ffa0fba47c8e81c2980140988cbdd2c0520b9d Mon Sep 17 00:00:00 2001 From: Ben Bodenmiller Date: Sun, 12 Oct 2014 05:19:10 -0700 Subject: improve ssh key emails --- app/views/notify/new_ssh_key_email.html.haml | 2 +- app/views/notify/new_ssh_key_email.text.erb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/notify/new_ssh_key_email.html.haml b/app/views/notify/new_ssh_key_email.html.haml index deb0822d8f2..63b0cbbd205 100644 --- a/app/views/notify/new_ssh_key_email.html.haml +++ b/app/views/notify/new_ssh_key_email.html.haml @@ -6,5 +6,5 @@ title: %code= @key.title %p - If this key was added in error, you can remove it here: + If this key was added in error, you can remove it under = link_to "SSH Keys", profile_keys_url diff --git a/app/views/notify/new_ssh_key_email.text.erb b/app/views/notify/new_ssh_key_email.text.erb index 5f0080c2b76..05b551c89a0 100644 --- a/app/views/notify/new_ssh_key_email.text.erb +++ b/app/views/notify/new_ssh_key_email.text.erb @@ -2,6 +2,6 @@ Hi <%= @user.name %>! A new public key was added to your account: -title.................. <%= @key.title %> +Title: <%= @key.title %> -If this key was added in error, you can remove it here: <%= profile_keys_url %> +If this key was added in error, you can remove it at <%= profile_keys_url %> -- cgit v1.2.1 From 733012cb65e43e41aa3b553c7fd02079cbf9eff4 Mon Sep 17 00:00:00 2001 From: Tomas Srna Date: Wed, 29 Oct 2014 10:52:54 +0100 Subject: Removed + '' + --- app/uploaders/attachment_uploader.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index 24fc294909e..29a55b36ca5 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -27,7 +27,7 @@ class AttachmentUploader < CarrierWave::Uploader::Base end def url - Gitlab.config.gitlab.relative_url_root + '' + super unless super.nil? + Gitlab.config.gitlab.relative_url_root + super unless super.nil? end def file_storage? -- cgit v1.2.1 From bafd30f92cfb754fe6864c9cd595df10b52b11f2 Mon Sep 17 00:00:00 2001 From: Andrey Krivko Date: Wed, 22 Oct 2014 22:29:26 +0700 Subject: Session API: Use case-insensitive authentication like in UI --- app/models/user.rb | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index 154cc0f3e16..52e63cde6f9 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -226,6 +226,11 @@ class User < ActiveRecord::Base where("lower(name) LIKE :query OR lower(email) LIKE :query OR lower(username) LIKE :query", query: "%#{query.downcase}%") end + def by_login(login) + where('lower(username) = :value OR lower(email) = :value', + value: login.to_s.downcase).first + end + def by_username_or_id(name_or_id) where('users.username = ? OR users.id = ?', name_or_id.to_s, name_or_id.to_i).first end -- cgit v1.2.1 From c49cb40f65d75a54c8471cb5207512ec145593cc Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Mon, 3 Nov 2014 20:17:02 +0100 Subject: Remove dead Event#new_branch? method --- app/models/event.rb | 4 ---- 1 file changed, 4 deletions(-) (limited to 'app') diff --git a/app/models/event.rb b/app/models/event.rb index c0b126713a6..65b4c2edfee 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -186,10 +186,6 @@ class Event < ActiveRecord::Base data[:ref]["refs/heads"] end - def new_branch? - commit_from =~ /^00000/ - end - def new_ref? commit_from =~ /^00000/ end -- cgit v1.2.1 From c3be1517ae3c576f7f4248b82b611a833fe06675 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Mon, 3 Nov 2014 20:35:06 +0100 Subject: Factor '0' * 40 blank ref constants --- app/services/git_push_service.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 8f2b0e347f6..3f5222c93f1 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -160,19 +160,19 @@ class GitPushService ref_parts = ref.split('/') # Return if this is not a push to a branch (e.g. new commits) - ref_parts[1] =~ /heads/ && oldrev != "0000000000000000000000000000000000000000" + ref_parts[1] =~ /heads/ && oldrev != Gitlab::Git::BLANK_SHA end def push_to_new_branch?(ref, oldrev) ref_parts = ref.split('/') - ref_parts[1] =~ /heads/ && oldrev == "0000000000000000000000000000000000000000" + ref_parts[1] =~ /heads/ && oldrev == Gitlab::Git::BLANK_SHA end def push_remove_branch?(ref, newrev) ref_parts = ref.split('/') - ref_parts[1] =~ /heads/ && newrev == "0000000000000000000000000000000000000000" + ref_parts[1] =~ /heads/ && newrev == Gitlab::Git::BLANK_SHA end def push_to_branch?(ref) -- cgit v1.2.1 From a56d0d47db5b11787472fbed37f23c60bf0e57fe Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Tue, 4 Nov 2014 11:16:53 +0100 Subject: Remove unneeded backslash: "\/" == "/" --- app/helpers/tree_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index 9c611a1c147..8e209498323 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -66,7 +66,7 @@ module TreeHelper def tree_breadcrumbs(tree, max_links = 2) if @path.present? part_path = "" - parts = @path.split("\/") + parts = @path.split('/') yield('..', nil) if parts.count > max_links -- cgit v1.2.1 From 6f34d40436531029228e78d7a55a0e3982dbf89e Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Wed, 5 Nov 2014 11:04:08 +0200 Subject: remove auth duplication --- app/controllers/projects/base_tree_controller.rb | 1 - app/controllers/projects/blame_controller.rb | 1 - app/controllers/projects/blob_controller.rb | 1 - app/controllers/projects/branches_controller.rb | 1 - app/controllers/projects/commit_controller.rb | 1 - app/controllers/projects/commits_controller.rb | 1 - app/controllers/projects/compare_controller.rb | 1 - app/controllers/projects/graphs_controller.rb | 1 - app/controllers/projects/network_controller.rb | 1 - app/controllers/projects/raw_controller.rb | 1 - app/controllers/projects/refs_controller.rb | 1 - app/controllers/projects/repositories_controller.rb | 1 - app/controllers/projects/tags_controller.rb | 2 -- app/controllers/projects_controller.rb | 1 - 14 files changed, 15 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/base_tree_controller.rb b/app/controllers/projects/base_tree_controller.rb index 56c306063c8..a7b1b7b40e8 100644 --- a/app/controllers/projects/base_tree_controller.rb +++ b/app/controllers/projects/base_tree_controller.rb @@ -1,7 +1,6 @@ class Projects::BaseTreeController < Projects::ApplicationController include ExtractsPath - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project end diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb index bad06e7aa2d..367d1295f34 100644 --- a/app/controllers/projects/blame_controller.rb +++ b/app/controllers/projects/blame_controller.rb @@ -3,7 +3,6 @@ class Projects::BlameController < Projects::ApplicationController include ExtractsPath # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 04aa044001e..2412800c493 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -3,7 +3,6 @@ class Projects::BlobController < Projects::ApplicationController include ExtractsPath # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project before_filter :authorize_push_code!, only: [:destroy] diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index 9f50660a5ad..9ebd498e7fa 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -1,6 +1,5 @@ class Projects::BranchesController < Projects::ApplicationController # Authorize - before_filter :authorize_read_project! before_filter :require_non_empty_project before_filter :authorize_download_code! diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index cf05e6ea220..dac858d8e16 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -3,7 +3,6 @@ # Not to be confused with CommitsController, plural. class Projects::CommitController < Projects::ApplicationController # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project before_filter :commit diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb index 53a0d063d8e..9476b6c0284 100644 --- a/app/controllers/projects/commits_controller.rb +++ b/app/controllers/projects/commits_controller.rb @@ -4,7 +4,6 @@ class Projects::CommitsController < Projects::ApplicationController include ExtractsPath # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb index 6d944025598..ffb8c2e4af1 100644 --- a/app/controllers/projects/compare_controller.rb +++ b/app/controllers/projects/compare_controller.rb @@ -1,6 +1,5 @@ class Projects::CompareController < Projects::ApplicationController # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb index 21d3970d65a..4a318cb7d56 100644 --- a/app/controllers/projects/graphs_controller.rb +++ b/app/controllers/projects/graphs_controller.rb @@ -1,6 +1,5 @@ class Projects::GraphsController < Projects::ApplicationController # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/network_controller.rb b/app/controllers/projects/network_controller.rb index 009089ee639..ada1aed0df7 100644 --- a/app/controllers/projects/network_controller.rb +++ b/app/controllers/projects/network_controller.rb @@ -3,7 +3,6 @@ class Projects::NetworkController < Projects::ApplicationController include ApplicationHelper # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index f4fdd616c50..fdbc4c5a098 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -3,7 +3,6 @@ class Projects::RawController < Projects::ApplicationController include ExtractsPath # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index 9ac189a78b3..5d9336bdc49 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -2,7 +2,6 @@ class Projects::RefsController < Projects::ApplicationController include ExtractsPath # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index 6d8ef0f1ac8..bcd14a1c847 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -1,6 +1,5 @@ class Projects::RepositoriesController < Projects::ApplicationController # Authorize - before_filter :authorize_read_project! before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index 94794fb5dd0..162ddef0fec 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -1,8 +1,6 @@ class Projects::TagsController < Projects::ApplicationController # Authorize - before_filter :authorize_read_project! before_filter :require_non_empty_project - before_filter :authorize_download_code! before_filter :authorize_push_code!, only: [:create] before_filter :authorize_admin_project!, only: [:destroy] diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index f81fc29677b..5a80a2ca465 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -4,7 +4,6 @@ class ProjectsController < ApplicationController before_filter :repository, except: [:new, :create] # Authorize - before_filter :authorize_read_project!, except: [:index, :new, :create] before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive, :retry_import] layout 'navless', only: [:new, :create, :fork] -- cgit v1.2.1 From 3246ed514fac233ba9aa9ab86e08336225d40150 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 5 Nov 2014 11:44:40 +0200 Subject: Update GitLab CI service to work with new GitLab CI Signed-off-by: Dmitriy Zaporozhets --- app/models/project_services/gitlab_ci_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index a897c4ab76b..fadebf968bc 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -28,7 +28,7 @@ class GitlabCiService < CiService end def commit_status_path(sha) - project_url + "/builds/#{sha}/status.json?token=#{token}" + project_url + "/commits/#{sha}/status.json?token=#{token}" end def get_ci_build(sha) @@ -55,7 +55,7 @@ class GitlabCiService < CiService end def build_page(sha) - project_url + "/builds/#{sha}" + project_url + "/commits/#{sha}" end def builds_path -- cgit v1.2.1 From 2ee1ec430012e4489ea1d70a13bcb827cafede2e Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 5 Nov 2014 12:53:10 +0100 Subject: Do not allow cross reference note in a mr if a mr contains mentioned commit. --- app/models/note.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/note.rb b/app/models/note.rb index f0ed7580b4c..4252d57ccb1 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -90,7 +90,7 @@ class Note < ActiveRecord::Base note_options.merge!(noteable: noteable) end - create(note_options) + create(note_options) unless cross_reference_disallowed?(noteable, mentioner) end def create_milestone_change_note(noteable, project, author, milestone) @@ -165,6 +165,15 @@ class Note < ActiveRecord::Base [:discussion, type.try(:underscore), id, line_code].join("-").to_sym end + # Determine if cross reference note should be created. + # eg. mentioning a commit in MR comments which exists inside a MR + # should not create "mentioned in" note. + def cross_reference_disallowed?(noteable, mentioner) + if mentioner.kind_of?(MergeRequest) + mentioner.commits.map(&:id).include? noteable.id + end + end + # Determine whether or not a cross-reference note already exists. def cross_reference_exists?(noteable, mentioner) gfm_reference = mentioner_gfm_ref(noteable, mentioner) -- cgit v1.2.1 From 383ac10ca5797818f7a61d04fbff0fbf54e87c0e Mon Sep 17 00:00:00 2001 From: Alex Elman Date: Wed, 27 Aug 2014 11:20:28 -0500 Subject: Issue-280 Send notifications when a note is added to a commit and author is a group member This fixes a bug where commit authors weren't receiving email notifications for notes added to their commits and their membership was in the group but not the project. The fix is to look up membership via the team object which accounts for both project and group members. --- app/models/note.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/note.rb b/app/models/note.rb index f0ed7580b4c..996def0478a 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -251,8 +251,8 @@ class Note < ActiveRecord::Base def commit_author @commit_author ||= - project.users.find_by(email: noteable.author_email) || - project.users.find_by(name: noteable.author_name) + project.team.users.find_by(email: noteable.author_email) || + project.team.users.find_by(name: noteable.author_name) rescue nil end -- cgit v1.2.1 From e4a38e447169069f3d5042d3341ceb4bdc51bf1b Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Wed, 5 Nov 2014 17:51:08 +0100 Subject: Factor using Repository#path_to_repo --- app/models/project_services/flowdock_service.rb | 3 +-- app/models/project_services/gemnasium_service.rb | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/models/project_services/flowdock_service.rb b/app/models/project_services/flowdock_service.rb index 0020b4482e5..86705f5dabd 100644 --- a/app/models/project_services/flowdock_service.rb +++ b/app/models/project_services/flowdock_service.rb @@ -37,13 +37,12 @@ class FlowdockService < Service end def execute(push_data) - repo_path = File.join(Gitlab.config.gitlab_shell.repos_path, "#{project.path_with_namespace}.git") Flowdock::Git.post( push_data[:ref], push_data[:before], push_data[:after], token: token, - repo: repo_path, + repo: project.repository.path_to_repo, repo_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}", commit_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/commit/%s", diff_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/compare/%s...%s", diff --git a/app/models/project_services/gemnasium_service.rb b/app/models/project_services/gemnasium_service.rb index 6d2fc06a5d0..18fdd204ecd 100644 --- a/app/models/project_services/gemnasium_service.rb +++ b/app/models/project_services/gemnasium_service.rb @@ -38,14 +38,13 @@ class GemnasiumService < Service end def execute(push_data) - repo_path = File.join(Gitlab.config.gitlab_shell.repos_path, "#{project.path_with_namespace}.git") Gemnasium::GitlabService.execute( ref: push_data[:ref], before: push_data[:before], after: push_data[:after], token: token, api_key: api_key, - repo: repo_path + repo: project.repository.path_to_repo ) end end -- cgit v1.2.1 From 57c7dafbfe61950fef716b72126410cf449472e4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 5 Nov 2014 16:35:56 +0200 Subject: Light gray bg for white code scheme if used in comments and wiki Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/highlight/white.scss | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss index 815cf367ae8..8d5822937a0 100644 --- a/app/assets/stylesheets/highlight/white.scss +++ b/app/assets/stylesheets/highlight/white.scss @@ -186,3 +186,11 @@ } } } + +.readme-holder .wiki, .note-body, .wiki-holder { + .white { + .highlight, pre, .hljs { + background: #F9F9F9; + } + } +} -- cgit v1.2.1 From 9353db59a084a1524c19efba2ef185a15967f233 Mon Sep 17 00:00:00 2001 From: skv Date: Thu, 6 Nov 2014 22:34:41 +0300 Subject: remove unused js --- app/assets/javascripts/dispatcher.js.coffee | 2 -- app/assets/javascripts/team_members.js.coffee | 4 ---- app/views/projects/team_members/_team_member.html.haml | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 app/assets/javascripts/team_members.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index ec4b7ea42cf..fb1adbc4b3d 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -58,8 +58,6 @@ class Dispatcher when 'groups:show', 'projects:show' new Activities() shortcut_handler = new ShortcutsNavigation() - when 'projects:teams:members:index' - new TeamMembers() when 'groups:members' new GroupMembers() new UsersSelect() diff --git a/app/assets/javascripts/team_members.js.coffee b/app/assets/javascripts/team_members.js.coffee deleted file mode 100644 index 32486f7da54..00000000000 --- a/app/assets/javascripts/team_members.js.coffee +++ /dev/null @@ -1,4 +0,0 @@ -class @TeamMembers - constructor: -> - $('.team-members .project-access-select').on "change", -> - $(this.form).submit() diff --git a/app/views/projects/team_members/_team_member.html.haml b/app/views/projects/team_members/_team_member.html.haml index 5f29b58de32..7a9c0939ba0 100644 --- a/app/views/projects/team_members/_team_member.html.haml +++ b/app/views/projects/team_members/_team_member.html.haml @@ -5,7 +5,7 @@ - unless @project.personal? && user == current_user .pull-left = form_for(member, as: :project_member, url: project_team_member_path(@project, member.user)) do |f| - = f.select :access_level, options_for_select(ProjectMember.access_roles, member.access_level), {}, class: "medium project-access-select span2 trigger-submit" + = f.select :access_level, options_for_select(ProjectMember.access_roles, member.access_level), {}, class: "trigger-submit"   = link_to project_team_member_path(@project, user), data: { confirm: remove_from_project_team_message(@project, user)}, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from team' do %i.fa.fa-minus.fa-inverse -- cgit v1.2.1 From 6cac4e6271fcbfdd51feb3d32dc6c29905adb966 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 7 Nov 2014 12:51:18 +0200 Subject: Fix attachment misaligned in comment Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/notes/_note.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 814bf19970c..a25c5e207fb 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -59,7 +59,7 @@ - if note.attachment.image? = link_to note.attachment.secure_url, target: '_blank' do = image_tag note.attachment.secure_url, class: 'note-image-attach' - .attachment.pull-right + .attachment = link_to note.attachment.secure_url, target: "_blank" do %i.fa.fa-paperclip = note.attachment_identifier -- cgit v1.2.1 From 2148e1997ace8bb5efab214c07492ed5a372dd31 Mon Sep 17 00:00:00 2001 From: Nikita Verkhovin Date: Sat, 8 Nov 2014 16:54:08 +0600 Subject: Add issue edited timestamp --- app/helpers/issues_helper.rb | 13 +++++++++++++ app/views/projects/issues/show.html.haml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 7671033b539..d513e0ba58e 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -62,6 +62,19 @@ module IssuesHelper '' end + def issue_timestamp(issue) + # Shows the created at time and the updated at time if different + ts = "#{time_ago_with_tooltip(issue.created_at, 'bottom', 'note_created_ago')}" + if issue.updated_at != issue.created_at + ts << capture_haml do + haml_tag :small do + haml_concat " (Edited #{time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_edited_ago')})" + end + end + end + ts.html_safe + end + # Checks if issues_tracker setting exists in gitlab.yml def external_issues_tracker_enabled? Gitlab.config.issues_tracker && Gitlab.config.issues_tracker.values.any? diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 71eb0d5c866..aad58e48f6c 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -39,7 +39,7 @@ Open .creator - Created by #{link_to_member(@project, @issue.author)} #{time_ago_with_tooltip(@issue.created_at)} + Created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} %h4.title = gfm escape_once(@issue.title) -- cgit v1.2.1 From 6ace931c3548aaa6c229c7f38191d128e6dc1362 Mon Sep 17 00:00:00 2001 From: Ben Bodenmiller Date: Sun, 9 Nov 2014 03:37:56 -0800 Subject: make repo name link to repo homepage --- app/helpers/projects_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 883c1f63af6..fb5470d98e5 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -42,12 +42,12 @@ module ProjectsHelper def project_title(project) if project.group content_tag :span do - link_to(simple_sanitize(project.group.name), group_path(project.group)) + " / " + project.name + link_to(simple_sanitize(project.group.name), group_path(project.group)) + ' / ' + link_to(simple_sanitize(project.name), project_path(project)) end else owner = project.namespace.owner content_tag :span do - link_to(simple_sanitize(owner.name), user_path(owner)) + " / " + project.name + link_to(simple_sanitize(owner.name), user_path(owner)) + ' / ' + link_to(simple_sanitize(project.name), project_path(project)) end end end -- cgit v1.2.1 From ccd842c3a7742d1d99a13a32ea725032810f2690 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Nov 2014 14:52:30 +0200 Subject: Prevent post-receive error when push to project with dead forks If project has open merge request from fork and this fork was removed before merge request was closed it cause exception during push Signed-off-by: Dmitriy Zaporozhets --- app/models/project.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index c58c9b551c9..1383bf3c46e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -411,7 +411,7 @@ class Project < ActiveRecord::Base mrs = self.merge_requests.opened.where(target_branch: branch_name).to_a mrs = mrs.select(&:last_commit).select { |mr| c_ids.include?(mr.last_commit.id) } - mrs.uniq.each do |merge_request| + mrs.uniq.select(&:source_project).each do |merge_request| MergeRequests::MergeService.new.execute(merge_request, user, nil) end @@ -420,7 +420,7 @@ class Project < ActiveRecord::Base # Update code for merge requests between project and project fork mrs += self.fork_merge_requests.opened.by_branch(branch_name).to_a - mrs.uniq.each do |merge_request| + mrs.uniq.select(&:source_project).each do |merge_request| merge_request.reload_code merge_request.mark_as_unchecked end @@ -435,7 +435,7 @@ class Project < ActiveRecord::Base mrs = self.origin_merge_requests.opened.where(source_branch: branch_name).to_a mrs += self.fork_merge_requests.opened.where(source_branch: branch_name).to_a - mrs.uniq.each do |merge_request| + mrs.uniq.select(&:source_project).each do |merge_request| Note.create_new_commits_note(merge_request, merge_request.project, user, commits) end -- cgit v1.2.1 From 2139e3519b1f1023478bec087cf94f2ec237c0c7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Nov 2014 16:49:26 +0200 Subject: Refactor merge request refresh logic on push Signed-off-by: Dmitriy Zaporozhets --- app/models/project.rb | 39 +-------------- app/services/merge_requests/refresh_service.rb | 67 ++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 37 deletions(-) create mode 100644 app/services/merge_requests/refresh_service.rb (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index 1383bf3c46e..d2576bb85d0 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -402,43 +402,8 @@ class Project < ActiveRecord::Base end def update_merge_requests(oldrev, newrev, ref, user) - return true unless ref =~ /heads/ - branch_name = ref.gsub("refs/heads/", "") - commits = self.repository.commits_between(oldrev, newrev) - c_ids = commits.map(&:id) - - # Close merge requests - mrs = self.merge_requests.opened.where(target_branch: branch_name).to_a - mrs = mrs.select(&:last_commit).select { |mr| c_ids.include?(mr.last_commit.id) } - - mrs.uniq.select(&:source_project).each do |merge_request| - MergeRequests::MergeService.new.execute(merge_request, user, nil) - end - - # Update code for merge requests into project between project branches - mrs = self.merge_requests.opened.by_branch(branch_name).to_a - # Update code for merge requests between project and project fork - mrs += self.fork_merge_requests.opened.by_branch(branch_name).to_a - - mrs.uniq.select(&:source_project).each do |merge_request| - merge_request.reload_code - merge_request.mark_as_unchecked - end - - # Add comment about pushing new commits to merge requests - comment_mr_with_commits(branch_name, commits, user) - - true - end - - def comment_mr_with_commits(branch_name, commits, user) - mrs = self.origin_merge_requests.opened.where(source_branch: branch_name).to_a - mrs += self.fork_merge_requests.opened.where(source_branch: branch_name).to_a - - mrs.uniq.select(&:source_project).each do |merge_request| - Note.create_new_commits_note(merge_request, merge_request.project, - user, commits) - end + MergeRequests::RefreshService.new(self, user). + execute(oldrev, newrev, ref) end def valid_repo? diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb new file mode 100644 index 00000000000..74448998ddd --- /dev/null +++ b/app/services/merge_requests/refresh_service.rb @@ -0,0 +1,67 @@ +module MergeRequests + class RefreshService < MergeRequests::BaseService + def execute(oldrev, newrev, ref) + return true unless ref =~ /heads/ + + @branch_name = ref.gsub("refs/heads/", "") + @fork_merge_requests = @project.fork_merge_requests.opened + @commits = @project.repository.commits_between(oldrev, newrev) + + close_merge_requests + reload_merge_requests + comment_mr_with_commits + + true + end + + private + + # Collect open merge requests that target same branch we push into + # and close if push to master include last commit from merge request + # We need this to close(as merged) merge requests that were merged into + # target branch manually + def close_merge_requests + commit_ids = @commits.map(&:id) + merge_requests = @project.merge_requests.opened.where(target_branch: @branch_name).to_a + merge_requests = merge_requests.select(&:last_commit) + + merge_requests = merge_requests.select do |merge_request| + commit_ids.include?(merge_request.last_commit.id) + end + + + merge_requests.uniq.select(&:source_project).each do |merge_request| + MergeRequests::MergeService.new.execute(merge_request, @current_user, nil) + end + end + + # Refresh merge request diff if we push to source or target branch of merge request + # Note: we should update merge requests from forks too + def reload_merge_requests + merge_requests = @project.merge_requests.opened.by_branch(@branch_name).to_a + merge_requests += @fork_merge_requests.by_branch(@branch_name).to_a + merge_requests = filter_merge_requests(merge_requests) + + merge_requests.each do |merge_request| + merge_request.reload_code + merge_request.mark_as_unchecked + end + end + + # Add comment about pushing new commits to merge requests + def comment_mr_with_commits + merge_requests = @project.origin_merge_requests.opened.where(source_branch: @branch_name).to_a + merge_requests += @fork_merge_requests.where(source_branch: @branch_name).to_a + merge_requests = filter_merge_requests(merge_requests) + + merge_requests.each do |merge_request| + Note.create_new_commits_note(merge_request, merge_request.project, + @current_user, @commits) + end + end + + def filter_merge_requests(merge_requests) + merge_requests.uniq.select(&:source_project) + end + end +end -- cgit v1.2.1 From af154478675f9e3d970dbd9339e0ed23c23a7eec Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 11 Nov 2014 16:09:58 +0100 Subject: Create emails helper for actions links. --- app/helpers/emails_helper.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 app/helpers/emails_helper.rb (limited to 'app') diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb new file mode 100644 index 00000000000..2ef28922ec1 --- /dev/null +++ b/app/helpers/emails_helper.rb @@ -0,0 +1,20 @@ +module EmailsHelper + + # Google Actions + # https://developers.google.com/gmail/markup/reference/go-to-action + def email_action(options) + data = { + "@context" => "http://schema.org", + "@type" => "EmailMessage", + "action" => { + "@type" => "ViewAction", + "name" => options[:name], + "url" => options[:url], + } + } + + content_tag :script, type: 'application/ld+json' do + data.to_json.html_safe + end + end +end -- cgit v1.2.1 From 3dcb5f8501e6eedb41c5d8a83eff1e3b80822f1d Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 11 Nov 2014 16:10:24 +0100 Subject: Include the helper for mailer, add links to emails. --- app/mailers/notify.rb | 1 + app/views/layouts/notify.html.haml | 1 + 2 files changed, 2 insertions(+) (limited to 'app') diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index bd438bab89a..0ee19836627 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -11,6 +11,7 @@ class Notify < ActionMailer::Base add_template_helper ApplicationHelper add_template_helper GitlabMarkdownHelper add_template_helper MergeRequestsHelper + add_template_helper EmailsHelper default_url_options[:host] = Gitlab.config.gitlab.host default_url_options[:protocol] = Gitlab.config.gitlab.protocol diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index ab421d63f1a..1236cf00f01 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -28,3 +28,4 @@ You're receiving this notification because you are a member of the #{link_to_unless @target_url, @project.name_with_namespace, project_url(@project)} project team. - if @target_url #{link_to "View it on GitLab", @target_url} + = email_action name: "View #{@note.noteable_type.underscore.humanize}", url: @target_url -- cgit v1.2.1 From 857852ce048607a0898a9b40e04fdb0658b6a83d Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 12 Nov 2014 11:59:57 +0100 Subject: Set action on issue/mr creation mail. --- app/helpers/emails_helper.rb | 34 +++++++++++++++++++++++----------- app/views/layouts/notify.html.haml | 2 +- 2 files changed, 24 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index 2ef28922ec1..24d67c21d6b 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -2,19 +2,31 @@ module EmailsHelper # Google Actions # https://developers.google.com/gmail/markup/reference/go-to-action - def email_action(options) - data = { - "@context" => "http://schema.org", - "@type" => "EmailMessage", - "action" => { - "@type" => "ViewAction", - "name" => options[:name], - "url" => options[:url], + def email_action(url) + name = action_title(url) + if name + data = { + "@context" => "http://schema.org", + "@type" => "EmailMessage", + "action" => { + "@type" => "ViewAction", + "name" => name, + "url" => url, + } } - } - content_tag :script, type: 'application/ld+json' do - data.to_json.html_safe + content_tag :script, type: 'application/ld+json' do + data.to_json.html_safe + end + end + end + + def action_title(url) + return unless url + ["merge_requests", "issues", "commit"].each do |action| + if url.split("/").include?(action) + return "View #{action.humanize.singularize}" + end end end end diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index 1236cf00f01..da451961327 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -28,4 +28,4 @@ You're receiving this notification because you are a member of the #{link_to_unless @target_url, @project.name_with_namespace, project_url(@project)} project team. - if @target_url #{link_to "View it on GitLab", @target_url} - = email_action name: "View #{@note.noteable_type.underscore.humanize}", url: @target_url + = email_action @target_url -- cgit v1.2.1 From 722d80739b6b4eb6e4803fc55f750300d66b94be Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 12 Nov 2014 13:59:25 +0200 Subject: Prevent big amount of sql queries for push service Signed-off-by: Dmitriy Zaporozhets --- app/services/git_push_service.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 3f5222c93f1..529af1970f6 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -83,9 +83,14 @@ class GitPushService # closing regex. Exclude any mentioned Issues from cross-referencing even if the commits are being pushed to # a different branch. issues_to_close = commit.closes_issues(project) - author = commit_user(commit) - if !issues_to_close.empty? && is_default_branch + # Load commit author only if needed. + # For push with 1k commits it prevents 900+ requests in database + author = nil + + if issues_to_close.present? && is_default_branch + author ||= commit_user(commit) + issues_to_close.each do |issue| Issues::CloseService.new(project, author, {}).execute(issue, commit) end @@ -96,8 +101,13 @@ class GitPushService # being pushed to a different branch). refs = commit.references(project) - issues_to_close refs.reject! { |r| commit.has_mentioned?(r) } - refs.each do |r| - Note.create_cross_reference_note(r, commit, author, project) + + if refs.present? + author ||= commit_user(commit) + + refs.each do |r| + Note.create_cross_reference_note(r, commit, author, project) + end end end end -- cgit v1.2.1 From 334fe86574227433bd2909577c5955c40721d509 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 13 Nov 2014 16:20:43 +0100 Subject: Sanitize branch name and ref name --- app/controllers/projects/branches_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index 9ebd498e7fa..cff1a907dc2 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -1,4 +1,5 @@ class Projects::BranchesController < Projects::ApplicationController + include ActionView::Helpers::SanitizeHelper # Authorize before_filter :require_non_empty_project @@ -16,8 +17,10 @@ class Projects::BranchesController < Projects::ApplicationController end def create + branch_name = sanitize(strip_tags(params[:branch_name])) + ref = sanitize(strip_tags(params[:ref])) result = CreateBranchService.new(project, current_user). - execute(params[:branch_name], params[:ref]) + execute(branch_name, ref) if result[:status] == :success @branch = result[:branch] -- cgit v1.2.1 From 18c8226566edb1c7fa43ccc1bf7a1db33f91489f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 13 Nov 2014 19:40:47 +0200 Subject: Refactor project fork service Signed-off-by: Dmitriy Zaporozhets --- app/services/projects/fork_service.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index c4f2d08efe9..4930660055a 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -13,11 +13,14 @@ module Projects project = Project.new(project_params) project.name = @from_project.name project.path = @from_project.path - project.namespace = @current_user.namespace + project.creator = @current_user + if namespace = @params[:namespace] project.namespace = namespace + else + project.namespace = @current_user.namespace end - project.creator = @current_user + unless @current_user.can?(:create_projects, project.namespace) project.errors.add(:namespace, 'insufficient access rights') return project @@ -47,8 +50,8 @@ module Projects else project.errors.add(:base, "Invalid fork destination") end - project + project end end end -- cgit v1.2.1 From e08e405ac4c448d8b720ed2ef6181c15e3f3dfc1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 13 Nov 2014 22:06:19 +0200 Subject: Select namespace where to fork project Now you can fork project into group or personal namespace. Also I moved fork logic from ProjectsController to own fork resource Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects/forks_controller.rb | 22 ++++++++++++++++++++++ app/controllers/projects_controller.rb | 16 ---------------- app/models/user.rb | 10 ++++++++++ app/views/projects/_home_panel.html.haml | 2 +- app/views/projects/fork.html.haml | 19 ------------------- app/views/projects/forks/error.html.haml | 20 ++++++++++++++++++++ app/views/projects/forks/new.html.haml | 19 +++++++++++++++++++ 7 files changed, 72 insertions(+), 36 deletions(-) create mode 100644 app/controllers/projects/forks_controller.rb delete mode 100644 app/views/projects/fork.html.haml create mode 100644 app/views/projects/forks/error.html.haml create mode 100644 app/views/projects/forks/new.html.haml (limited to 'app') diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb new file mode 100644 index 00000000000..a0481d11582 --- /dev/null +++ b/app/controllers/projects/forks_controller.rb @@ -0,0 +1,22 @@ +class Projects::ForksController < Projects::ApplicationController + # Authorize + before_filter :authorize_download_code! + before_filter :require_non_empty_project + + def new + @namespaces = current_user.manageable_namespaces + @namespaces.delete(@project.namespace) + end + + def create + namespace = Namespace.find(params[:namespace_id]) + @forked_project = ::Projects::ForkService.new(project, current_user, namespace: namespace).execute + + if @forked_project.saved? && @forked_project.forked? + redirect_to(@forked_project, notice: 'Project was successfully forked.') + else + @title = 'Fork project' + render :error + end + end +end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index b5910c902e4..b3181fa310e 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -111,22 +111,6 @@ class ProjectsController < ApplicationController end end - def fork - @forked_project = ::Projects::ForkService.new(project, current_user).execute - - respond_to do |format| - format.html do - if @forked_project.saved? && @forked_project.forked? - redirect_to(@forked_project, notice: 'Project was successfully forked.') - else - @title = 'Fork project' - render "fork" - end - end - format.js - end - end - def autocomplete_sources note_type = params['type'] note_id = params['type_id'] diff --git a/app/models/user.rb b/app/models/user.rb index d400edc0df5..fc191a78f53 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -551,4 +551,14 @@ class User < ActiveRecord::Base UsersStarProject.create!(project: project, user: self) end end + + def manageable_namespaces + @manageable_namespaces ||= + begin + namespaces = [] + namespaces << namespace + namespaces += owned_groups + namespaces += masters_groups + end + end end diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 672a91e0eef..c2fa1c4bccc 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -20,7 +20,7 @@ = link_to project_path(current_user.fork_of(@project)), title: 'Go to my fork' do = link_to_toggle_fork - else - = link_to fork_project_path(@project), title: "Fork project", method: "POST" do + = link_to new_project_fork_path(@project), title: "Fork project" do = link_to_toggle_fork .star-buttons diff --git a/app/views/projects/fork.html.haml b/app/views/projects/fork.html.haml deleted file mode 100644 index d8f5c7b98d6..00000000000 --- a/app/views/projects/fork.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -.alert.alert-danger.alert-block - %h4 - %i.fa.fa-code-fork - Fork Error! - %p - You tried to fork - = link_to_project @project - but it failed for the following reason: - - - - if @forked_project && @forked_project.errors.any? - %p - – - = @forked_project.errors.full_messages.first - - %p - = link_to fork_project_path(@project), title: "Fork", class: "btn", method: "POST" do - %i.fa.fa-code-fork - Try to Fork again diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml new file mode 100644 index 00000000000..76d3aa5bf00 --- /dev/null +++ b/app/views/projects/forks/error.html.haml @@ -0,0 +1,20 @@ +- if @forked_project && !@forked_project.saved? + .alert.alert-danger.alert-block + %h4 + %i.fa.fa-code-fork + Fork Error! + %p + You tried to fork + = link_to_project @project + but it failed for the following reason: + + + - if @forked_project && @forked_project.errors.any? + %p + – + = @forked_project.errors.full_messages.first + + %p + = link_to new_project_fork_path(@project), title: "Fork", class: "btn" do + %i.fa.fa-code-fork + Try to Fork again diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml new file mode 100644 index 00000000000..db7486b00e8 --- /dev/null +++ b/app/views/projects/forks/new.html.haml @@ -0,0 +1,19 @@ +%h3.page-title Fork project +%p.lead Select namespace where to fork this project +%hr + +- @namespaces.in_groups_of(6, false) do |group| + .row + - group.each do |namespace| + .col-md-2.col-sm-3 + .thumbnail + = link_to project_fork_path(@project, namespace_id: namespace.id), title: "Fork here", method: "POST" do + - if namespace.kind_of?(Group) + = image_tag group_icon(namespace.path) + - else + = image_tag avatar_icon(namespace.owner.email, 200) + .caption + %h4=namespace.human_name + %p + = namespace.path + -- cgit v1.2.1 From ced2438312c3fd48f9487465533bb493d83ee998 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 14 Nov 2014 11:08:58 +0100 Subject: Clean the string with commit author and email. --- app/helpers/commits_helper.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 0e0532b65b2..36adeadd8a5 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -87,8 +87,8 @@ module CommitsHelper # avatar: true will prepend the avatar image # size: size of the avatar image in px def commit_person_link(commit, options = {}) - source_name = commit.send "#{options[:source]}_name".to_sym - source_email = commit.send "#{options[:source]}_email".to_sym + source_name = clean(commit.send "#{options[:source]}_name".to_sym) + source_email = clean(commit.send "#{options[:source]}_email".to_sym) user = User.find_for_commit(source_email, source_name) person_name = user.nil? ? source_name : user.name @@ -124,4 +124,8 @@ module CommitsHelper def truncate_sha(sha) Commit.truncate_sha(sha) end + + def clean(string) + Sanitize.clean(string, remove_contents: true) + end end -- cgit v1.2.1 From c10f61802be9d9059b64386cca6bfc3b07beb0b1 Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Tue, 11 Nov 2014 16:59:50 +0100 Subject: Run 'GC.start' after every EmailsOnPushWorker job --- app/workers/emails_on_push_worker.rb | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app') diff --git a/app/workers/emails_on_push_worker.rb b/app/workers/emails_on_push_worker.rb index 2947c8e3ecd..e3f6f3a6aef 100644 --- a/app/workers/emails_on_push_worker.rb +++ b/app/workers/emails_on_push_worker.rb @@ -21,5 +21,8 @@ class EmailsOnPushWorker recipients.split(" ").each do |recipient| Notify.repository_push_email(project_id, recipient, author_id, branch, compare).deliver end + ensure + compare = nil + GC.start end end -- cgit v1.2.1 From 2388fdd7c6274dad8c10f5bc517f0a8b1aa28aa3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 14 Nov 2014 16:06:39 +0200 Subject: Improve fork to namespaces feature * Show namespace thumbnail differently if project was already forked * Show loading spinner when click on fork * Fork link navigates to personal namespace only if no manageable groups exists Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/dispatcher.js.coffee | 2 ++ app/assets/javascripts/project_fork.js.coffee | 5 +++ app/assets/stylesheets/sections/projects.scss | 25 ++++++++++++++ app/helpers/namespaces_helper.rb | 8 +++++ app/models/namespace.rb | 4 +++ app/views/projects/_home_panel.html.haml | 2 +- app/views/projects/forks/new.html.haml | 47 +++++++++++++++++++-------- 7 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 app/assets/javascripts/project_fork.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index fb1adbc4b3d..e8b71a71945 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -75,6 +75,8 @@ class Dispatcher # Ensure we don't create a particular shortcut handler here. This is # already created, where the network graph is created. shortcut_handler = true + when 'projects:forks:new' + new ProjectFork() when 'users:show' new User() diff --git a/app/assets/javascripts/project_fork.js.coffee b/app/assets/javascripts/project_fork.js.coffee new file mode 100644 index 00000000000..e15a1c4ef76 --- /dev/null +++ b/app/assets/javascripts/project_fork.js.coffee @@ -0,0 +1,5 @@ +class @ProjectFork + constructor: -> + $('.fork-thumbnail a').on 'click', -> + $('.fork-namespaces').hide() + $('.save-project-loader').show() diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index b4ee5ccc8d7..76a7507d699 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -270,3 +270,28 @@ ul.nav.nav-projects-tabs { color: #999; } } + +.fork-namespaces { + .thumbnail { + + &.fork-exists-thumbnail { + border-color: #EEE; + + .caption { + color: #999; + } + } + + &.fork-thumbnail { + border-color: #AAA; + + &:hover { + background-color: $hover; + } + } + + a { + text-decoration: none; + } + } +} diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb index bf25dce2301..2bcfde62830 100644 --- a/app/helpers/namespaces_helper.rb +++ b/app/helpers/namespaces_helper.rb @@ -25,4 +25,12 @@ module NamespacesHelper hidden_field_tag(id, value, class: css_class) end + + def namespace_icon(namespace, size = 40) + if namespace.kind_of?(Group) + group_icon(namespace.path) + else + avatar_icon(namespace.owner.email, size) + end + end end diff --git a/app/models/namespace.rb b/app/models/namespace.rb index c0c6de0ee7d..ea4b48fdd7f 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -90,4 +90,8 @@ class Namespace < ActiveRecord::Base def kind type == 'Group' ? 'group' : 'user' end + + def find_fork_of(project) + projects.joins(:forked_project_link).where('forked_project_links.forked_from_project_id = ?', project.id).first + end end diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index c2fa1c4bccc..8b9260d661c 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -16,7 +16,7 @@ - unless @project.empty_repo? .fork-buttons - if current_user && can?(current_user, :fork_project, @project) && @project.namespace != current_user.namespace - - if current_user.already_forked?(@project) + - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 = link_to project_path(current_user.fork_of(@project)), title: 'Go to my fork' do = link_to_toggle_fork - else diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index db7486b00e8..54f2cef023b 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -2,18 +2,37 @@ %p.lead Select namespace where to fork this project %hr -- @namespaces.in_groups_of(6, false) do |group| - .row - - group.each do |namespace| - .col-md-2.col-sm-3 - .thumbnail - = link_to project_fork_path(@project, namespace_id: namespace.id), title: "Fork here", method: "POST" do - - if namespace.kind_of?(Group) - = image_tag group_icon(namespace.path) - - else - = image_tag avatar_icon(namespace.owner.email, 200) - .caption - %h4=namespace.human_name - %p - = namespace.path +.fork-namespaces + - @namespaces.in_groups_of(6, false) do |group| + .row + - group.each do |namespace| + .col-md-2.col-sm-3 + - if fork = namespace.find_fork_of(@project) + .thumbnail.fork-exists-thumbnail + = link_to project_path(fork), title: "Visit project fork", class: 'has_tooltip' do + = image_tag namespace_icon(namespace, 200) + .caption + %h4=namespace.human_name + %p + = namespace.path + - else + .thumbnail.fork-thumbnail + = link_to project_fork_path(@project, namespace_id: namespace.id), title: "Fork here", method: "POST", class: 'has_tooltip' do + = image_tag namespace_icon(namespace, 200) + .caption + %h4=namespace.human_name + %p + = namespace.path + + %p.light + Fork is a copy of a project repository. + %br + Forking a repository allows you to do changes without affecting the original project. + +.save-project-loader.hide + .center + %h2 + %i.fa.fa-spinner.fa-spin + Forking repository + %p Please wait a moment, this page will automatically refresh when ready. -- cgit v1.2.1 From c89c2ddd8697f4e31de63787e57617ba9d061feb Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sun, 16 Nov 2014 17:17:50 +0100 Subject: Remove commit indicator from path on Commits tab --- app/views/projects/commits/show.html.haml | 2 -- 1 file changed, 2 deletions(-) (limited to 'app') diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index 5717c24c274..56956625e0b 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -11,8 +11,6 @@ %ul.breadcrumb.repo-breadcrumb = commits_breadcrumbs - %li.active - commits %div{id: dom_id(@project)} #commits-list= render "commits" -- cgit v1.2.1 From b8fcaa7f4126ce2b5fe0436197b2aacc1be84e96 Mon Sep 17 00:00:00 2001 From: Zertrin Date: Tue, 21 Oct 2014 09:59:03 +0200 Subject: revert using the extension of the blob to determine the syntax highlighting language nohighlight functionality for a hardcoded set of filenames is kept --- app/helpers/blob_helper.rb | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 11fbf1baae7..420ac3f77c7 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -1,14 +1,9 @@ module BlobHelper def highlightjs_class(blob_name) - if blob_name.include?('.') - ext = blob_name.split('.').last - return 'language-' + ext + if no_highlight_files.include?(blob_name.downcase) + 'no-highlight' else - if no_highlight_files.include?(blob_name.downcase) - 'no-highlight' - else - blob_name.downcase - end + blob_name.downcase end end -- cgit v1.2.1 From f9aead9f6e7e477236a51fa4eab3a6cba5dd2331 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 18 Nov 2014 18:00:38 +0200 Subject: Hide gpg signature on tags page from tag message Signed-off-by: Dmitriy Zaporozhets --- app/helpers/git_helper.rb | 5 +++++ app/views/projects/tags/_tag.html.haml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 app/helpers/git_helper.rb (limited to 'app') diff --git a/app/helpers/git_helper.rb b/app/helpers/git_helper.rb new file mode 100644 index 00000000000..09684955233 --- /dev/null +++ b/app/helpers/git_helper.rb @@ -0,0 +1,5 @@ +module GitHelper + def strip_gpg_signature(text) + text.gsub(/-----BEGIN PGP SIGNATURE-----(.*)-----END PGP SIGNATURE-----/m, "") + end +end diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index f93c1b4211f..4ab102ba96c 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -6,7 +6,7 @@ = tag.name - if tag.message.present?   - = tag.message + = strip_gpg_signature(tag.message) .pull-right - if can? current_user, :download_code, @project = render 'projects/repositories/download_archive', ref: tag.name, btn_class: 'btn-grouped btn-group-small' -- cgit v1.2.1 From b34f1be47f667412fc4355bafd17163f2a9f8466 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 19 Nov 2014 15:48:28 +0200 Subject: Increase md typography font size Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/files.scss | 3 --- app/assets/stylesheets/main/mixins.scss | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/files.scss b/app/assets/stylesheets/generic/files.scss index e2b0ef0c5ea..1ed41272ac5 100644 --- a/app/assets/stylesheets/generic/files.scss +++ b/app/assets/stylesheets/generic/files.scss @@ -42,7 +42,6 @@ } .file-content { background: #fff; - font-size: 11px; &.image_file { background: #eee; @@ -54,8 +53,6 @@ } &.wiki { - font-size: 14px; - line-height: 1.6; padding: 25px; .highlight { diff --git a/app/assets/stylesheets/main/mixins.scss b/app/assets/stylesheets/main/mixins.scss index 7f607fc4e8b..5f83913b73b 100644 --- a/app/assets/stylesheets/main/mixins.scss +++ b/app/assets/stylesheets/main/mixins.scss @@ -58,8 +58,8 @@ } @mixin md-typography { - font-size: 14px; - line-height: 1.6; + font-size: 15px; + line-height: 1.5; img { max-width: 100%; @@ -93,7 +93,7 @@ blockquote p { color: #888; - font-size: 14px; + font-size: 15px; line-height: 1.5; } -- cgit v1.2.1 From e65866d4ff337f66e3526a3eb7ac5ea9ae0c3d8f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 19 Nov 2014 17:45:41 +0200 Subject: Improve dashboard page for mobile Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/events.scss | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 656aa5b18a6..485a9c46610 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -186,7 +186,24 @@ } @media (max-width: $screen-xs-max) { - .event-item .event-title { - @include str-truncated(65%); + .event-item { + .event-title { + white-space: normal; + overflow: visible; + max-width: 100%; + } + .avatar { + display: none; + } + + .event-body { + margin: 0; + border-left: 2px solid #DDD; + padding-left: 10px; + } + + .event-item-timestamp { + display: none; + } } } -- cgit v1.2.1 From 580cedd76cb1b2a9101fcb722dfec455ad00c8c6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 19 Nov 2014 18:11:16 +0200 Subject: Fix header and project home ui for mobile Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/header.scss | 1 + app/assets/stylesheets/sections/nav.scss | 2 +- app/assets/stylesheets/sections/projects.scss | 13 +++++++++++++ app/views/projects/_home_panel.html.haml | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index e0e0d60c387..9ad1a1db2cd 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -59,6 +59,7 @@ header { } .navbar-collapse { + margin-top: 47px; padding-right: 0; padding-left: 0; } diff --git a/app/assets/stylesheets/sections/nav.scss b/app/assets/stylesheets/sections/nav.scss index 31c0a0835db..ccd672c5f67 100644 --- a/app/assets/stylesheets/sections/nav.scss +++ b/app/assets/stylesheets/sections/nav.scss @@ -63,7 +63,6 @@ @media (max-width: $screen-xs-max) { font-size: 18px; margin: 0; - max-height: none; &, .container { @@ -86,6 +85,7 @@ color: #fff; font-weight: normal; text-shadow: none; + border: none; &:after { display: none; } } diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 76a7507d699..7b894cf00bb 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -295,3 +295,16 @@ ul.nav.nav-projects-tabs { } } } + +@media (max-width: $screen-xs-max) { + .project-home-panel { + .star-fork-buttons { + padding-top: 10px; + padding-right: 15px; + } + } + + .project-home-links { + display: none; + } +} diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 8b9260d661c..30d063c7a36 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -31,7 +31,7 @@ - else = link_to_toggle_star('You must sign in to star a project.', false, false) - .project-home-row + .project-home-row.hidden-xs - if current_user && !empty_repo .project-home-dropdown = render "dropdown" -- cgit v1.2.1 From 2f3df4cb567a6f14b5a0e161084c2f4cf6fbf764 Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Sat, 8 Nov 2014 23:12:14 -0600 Subject: HipChat service: correct service name & use v2 API HipChat refers to their own product camel cased so we should do the same. HipChat no longer recommends people use the deprecated v1 API so switch to using the v2 API by default. hipchat-rb does not yet default to v2 in any version so it must be specified. --- app/models/project_services/hipchat_service.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index 4078938cdbb..2b804687853 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -19,7 +19,7 @@ class HipchatService < Service validates :token, presence: true, if: :activated? def title - 'Hipchat' + 'HipChat' end def description @@ -44,7 +44,8 @@ class HipchatService < Service private def gate - @gate ||= HipChat::Client.new(token) + options = { api_version: 'v2' } + @gate ||= HipChat::Client.new(token, options) end def create_message(push) -- cgit v1.2.1 From 1353f9aa643f86a3f38f3d2dfa8666d3d942293e Mon Sep 17 00:00:00 2001 From: Daniel Aquino Date: Sat, 8 Nov 2014 23:04:31 -0600 Subject: HipChat service: support custom servers HipChat allows users to run their own private servers and to be able to support those we must connect to the correct URL when using one of these custom servers. --- app/controllers/projects/services_controller.rb | 2 +- app/models/project_services/hipchat_service.rb | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index a5f30dcfd9d..c50a1f1e75b 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -42,7 +42,7 @@ class Projects::ServicesController < Projects::ApplicationController :title, :token, :type, :active, :api_key, :subdomain, :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, - :build_key + :build_key, :server ) end end diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index 2b804687853..a848d74044c 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -15,7 +15,7 @@ class HipchatService < Service MAX_COMMITS = 3 - prop_accessor :token, :room + prop_accessor :token, :room, :server validates :token, presence: true, if: :activated? def title @@ -33,7 +33,9 @@ class HipchatService < Service def fields [ { type: 'text', name: 'token', placeholder: '' }, - { type: 'text', name: 'room', placeholder: '' } + { type: 'text', name: 'room', placeholder: '' }, + { type: 'text', name: 'server', + placeholder: 'Leave blank for default. https://chat.hipchat.com' } ] end @@ -45,6 +47,7 @@ class HipchatService < Service def gate options = { api_version: 'v2' } + options[:server_url] = server unless server.nil? @gate ||= HipChat::Client.new(token, options) end -- cgit v1.2.1 From e683d9c087cc503cd8cb11214ddf265897e726c0 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 20 Nov 2014 18:18:16 +0200 Subject: Possibility to create Milestones or Labels when Issues are disabled --- app/controllers/projects/milestones_controller.rb | 4 +- app/views/projects/_issues_nav.html.haml | 52 +++++++++++++++++++++++ app/views/projects/issues/_head.html.haml | 36 ---------------- app/views/projects/issues/index.html.haml | 2 +- app/views/projects/labels/index.html.haml | 2 +- app/views/projects/merge_requests/index.html.haml | 9 +--- app/views/projects/milestones/index.html.haml | 2 +- app/views/projects/milestones/show.html.haml | 2 +- 8 files changed, 61 insertions(+), 48 deletions(-) create mode 100644 app/views/projects/_issues_nav.html.haml delete mode 100644 app/views/projects/issues/_head.html.haml (limited to 'app') diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb index d338cdedfaf..f362f449e70 100644 --- a/app/controllers/projects/milestones_controller.rb +++ b/app/controllers/projects/milestones_controller.rb @@ -103,7 +103,9 @@ class Projects::MilestonesController < Projects::ApplicationController end def module_enabled - return render_404 unless @project.issues_enabled + unless @project.issues_enabled || @project.merge_requests_enabled + return render_404 + end end def milestone_params diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml new file mode 100644 index 00000000000..1e14a2deb8c --- /dev/null +++ b/app/views/projects/_issues_nav.html.haml @@ -0,0 +1,52 @@ +%ul.nav.nav-tabs + - if project_nav_tab? :issues + = nav_link(controller: :issues) do + = link_to project_issues_path(@project), class: "tab" do + Browse Issues + - if project_nav_tab? :merge_requests + = nav_link(controller: :merge_requests) do + = link_to project_merge_requests_path(@project), class: "tab" do + Merge Requests + = nav_link(controller: :milestones) do + = link_to 'Milestones', project_milestones_path(@project), class: "tab" + = nav_link(controller: :labels) do + = link_to 'Labels', project_labels_path(@project), class: "tab" + + - if current_controller?(:milestones) + %li.pull-right + %button.btn.btn-default.sidebar-expand-button + %i.icon.fa.fa-list + + - if current_controller?(:issues) + - if current_user + %li + = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do + %i.fa.fa-rss + + %li.pull-right + .pull-right + %button.btn.btn-default.sidebar-expand-button + %i.icon.fa.fa-list + = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do + .append-right-10.hidden-xs.hidden-sm + = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } + = hidden_field_tag :state, params['state'] + = hidden_field_tag :scope, params['scope'] + = hidden_field_tag :assignee_id, params['assignee_id'] + = hidden_field_tag :milestone_id, params['milestone_id'] + = hidden_field_tag :label_id, params['label_id'] + - if can? current_user, :write_issue, @project + = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do + %i.fa.fa-plus + New Issue + + - if current_controller?(:merge_requests) + %li.pull-right + .pull-right + %button.btn.btn-default.sidebar-expand-button + %i.icon.fa.fa-list + + - if can? current_user, :write_merge_request, @project + = link_to new_project_merge_request_path(@project), class: "pull-right btn btn-new", title: "New Merge Request" do + %i.fa.fa-plus + New Merge Request diff --git a/app/views/projects/issues/_head.html.haml b/app/views/projects/issues/_head.html.haml deleted file mode 100644 index 1d2f3ed8118..00000000000 --- a/app/views/projects/issues/_head.html.haml +++ /dev/null @@ -1,36 +0,0 @@ -%ul.nav.nav-tabs - = nav_link(controller: :issues) do - = link_to project_issues_path(@project), class: "tab" do - Browse Issues - = nav_link(controller: :milestones) do - = link_to 'Milestones', project_milestones_path(@project), class: "tab" - = nav_link(controller: :labels) do - = link_to 'Labels', project_labels_path(@project), class: "tab" - - - if current_controller?(:milestones) - %li.pull-right - %button.btn.btn-default.sidebar-expand-button - %i.icon.fa.fa-list - - - if current_controller?(:issues) - - if current_user - %li - = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do - %i.fa.fa-rss - - %li.pull-right - .pull-right - %button.btn.btn-default.sidebar-expand-button - %i.icon.fa.fa-list - = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do - .append-right-10.hidden-xs.hidden-sm - = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } - = hidden_field_tag :state, params['state'] - = hidden_field_tag :scope, params['scope'] - = hidden_field_tag :assignee_id, params['assignee_id'] - = hidden_field_tag :milestone_id, params['milestone_id'] - = hidden_field_tag :label_id, params['label_id'] - - if can? current_user, :write_issue, @project - = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do - %i.fa.fa-plus - New Issue diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index 4ec362b3063..8db6241f21f 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -1,4 +1,4 @@ -= render "head" += render "projects/issues_nav" .row .fixed.fixed.sidebar-expand-button.hidden-lg.hidden-md.hidden-xs %i.fa.fa-list.fa-2x diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index 06568278de8..c7c17c7797e 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -1,4 +1,4 @@ -= render "projects/issues/head" += render "projects/issues_nav" - if can? current_user, :admin_label, @project = link_to new_project_label_path(@project), class: "pull-right btn btn-new" do diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index be638d7cac1..cd1e48ca976 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,10 +1,5 @@ -- if can? current_user, :write_merge_request, @project - = link_to new_project_merge_request_path(@project), class: "pull-right btn btn-new", title: "New Merge Request" do - %i.fa.fa-plus - New Merge Request -%h3.page-title - Merge Requests -%hr += render "projects/issues_nav" + .row .fixed.sidebar-expand-button.hidden-lg.hidden-md %i.fa.fa-list.fa-2x diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 03367b7cdbf..0db0b114d63 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -1,4 +1,4 @@ -= render "projects/issues/head" += render "projects/issues_nav" .milestones_content %h3.page-title Milestones diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index 8263f7530a2..f08ccc1d570 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -1,4 +1,4 @@ -= render "projects/issues/head" += render "projects/issues_nav" %h3.page-title Milestone ##{@milestone.iid} .pull-right -- cgit v1.2.1 From cdf558682640876d950527f02d75f9f4532aa007 Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Thu, 20 Nov 2014 23:05:46 +0100 Subject: Fixed an alignment issue, fixes #778 --- app/assets/stylesheets/generic/highlight.scss | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/highlight.scss b/app/assets/stylesheets/generic/highlight.scss index 4110bddf4f3..ae08539d454 100644 --- a/app/assets/stylesheets/generic/highlight.scss +++ b/app/assets/stylesheets/generic/highlight.scss @@ -59,6 +59,10 @@ pre { white-space: pre; word-wrap: normal; + + code { + font-family: $monospace_font; + } } } } -- cgit v1.2.1 From 674cbe939cb65e67479e0d73f4004e52c4546791 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 29 Nov 2014 21:34:18 +0200 Subject: Dont allow project creation without repository Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects_controller.rb | 7 +++-- app/models/project.rb | 21 ++++++++++++++ app/services/projects/create_service.rb | 50 +++++++++++++++++---------------- app/views/projects/create.js.haml | 13 --------- app/views/projects/new.html.haml | 2 +- 5 files changed, 52 insertions(+), 41 deletions(-) delete mode 100644 app/views/projects/create.js.haml (limited to 'app') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index b3181fa310e..ead0127b515 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -19,10 +19,11 @@ class ProjectsController < ApplicationController def create @project = ::Projects::CreateService.new(current_user, project_params).execute - flash[:notice] = 'Project was successfully created.' if @project.saved? - respond_to do |format| - format.js + if @project.saved? + redirect_to project_path(@project), notice: 'Project was successfully created.' + else + render 'new' end end diff --git a/app/models/project.rb b/app/models/project.rb index d2576bb85d0..d7570684ac8 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -586,4 +586,25 @@ class Project < ActiveRecord::Base def origin_merge_requests merge_requests.where(source_project_id: self.id) end + + def create_repository + if gitlab_shell.add_repository(path_with_namespace) + true + else + errors.add(:base, "Failed to create repository") + false + end + end + + def repository_exists? + !!repository.exists? + end + + def create_wiki + ProjectWiki.new(self, self.owner).wiki + true + rescue ProjectWiki::CouldNotCreateWikiError => ex + errors.add(:base, "Failed create wiki") + false + end end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 12386792aab..3672b623806 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -37,35 +37,22 @@ module Projects @project.creator = current_user - if @project.save - log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") - system_hook_service.execute_hooks_for(@project, :create) + Project.transaction do + @project.save - unless @project.group - @project.team << [current_user, :master] - end - - @project.update_column(:last_activity_at, @project.created_at) - - if @project.import? - @project.import_start - else - GitlabShellWorker.perform_async( - :add_repository, - @project.path_with_namespace - ) + unless @project.import? + unless @project.create_repository + raise 'Failed to create repository' + end end + end + if @project.persisted? if @project.wiki_enabled? - begin - # force the creation of a wiki, - ProjectWiki.new(@project, @project.owner).wiki - rescue ProjectWiki::CouldNotCreateWikiError => ex - # Prevent project observer crash - # if failed to create wiki - nil - end + @project.create_wiki end + + after_create_actions end @project @@ -84,5 +71,20 @@ module Projects namespace = Namespace.find_by(id: namespace_id) current_user.can?(:create_projects, namespace) end + + def after_create_actions + log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") + system_hook_service.execute_hooks_for(@project, :create) + + unless @project.group + @project.team << [current_user, :master] + end + + @project.update_column(:last_activity_at, @project.created_at) + + if @project.import? + @project.import_start + end + end end end diff --git a/app/views/projects/create.js.haml b/app/views/projects/create.js.haml deleted file mode 100644 index 89710d3a09a..00000000000 --- a/app/views/projects/create.js.haml +++ /dev/null @@ -1,13 +0,0 @@ -- if @project.saved? - - if @project.import? - :plain - location.href = "#{import_project_path(@project)}"; - - else - :plain - location.href = "#{project_path(@project)}"; -- else - :plain - $(".project-edit-errors").html("#{escape_javascript(render('errors'))}"); - $('.project-submit').enable(); - $('.save-project-loader').hide(); - $('.project-edit-container').show(); diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index f5cd0f21e01..e77ef84f51c 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -3,7 +3,7 @@ = render 'projects/errors' .project-edit-content - = form_for @project, remote: true, html: { class: 'new_project form-horizontal' } do |f| + = form_for @project, html: { class: 'new_project form-horizontal' } do |f| .form-group.project-name-holder = f.label :name, class: 'control-label' do %strong Project name -- cgit v1.2.1 From a8df4ee9e2b7881cea46ebc6b3e7889d13e3b5e5 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 30 Nov 2014 00:49:51 +0200 Subject: Separate web page for projects without repository Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/no_repo.html.haml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 app/views/projects/no_repo.html.haml (limited to 'app') diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml new file mode 100644 index 00000000000..dd576243510 --- /dev/null +++ b/app/views/projects/no_repo.html.haml @@ -0,0 +1,22 @@ +%h2 + %i.fa.fa-warning + No repository + +%p.slead + The repository for this project does not exist. + %br + This means you can not push code until you create an empty repository or import existing one. +%hr + +.no-repo-actions + = link_to project_repository_path(@project), method: :post, class: 'btn btn-primary' do + Create empty bare repository + + %strong.prepend-left-10.append-right-10 or + + = link_to new_project_import_path(@project), class: 'btn' do + Import repository + +- if can? current_user, :remove_project, @project + .prepend-top-20 + = link_to 'Remove project', @project, data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" -- cgit v1.2.1 From 9d937293136afd7994218b8dc72bb0956fb19eeb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 30 Nov 2014 00:50:25 +0200 Subject: Move projects import to separate resource. Add bare repo creation to repository controller Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects/imports_controller.rb | 49 ++++++++++++++++++++++ .../projects/repositories_controller.rb | 9 +++- app/controllers/projects_controller.rb | 39 +++++------------ app/models/project.rb | 2 +- app/views/projects/import.html.haml | 31 -------------- app/views/projects/imports/new.html.haml | 21 ++++++++++ app/views/projects/imports/show.html.haml | 9 ++++ 7 files changed, 99 insertions(+), 61 deletions(-) create mode 100644 app/controllers/projects/imports_controller.rb delete mode 100644 app/views/projects/import.html.haml create mode 100644 app/views/projects/imports/new.html.haml create mode 100644 app/views/projects/imports/show.html.haml (limited to 'app') diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb new file mode 100644 index 00000000000..b8350642804 --- /dev/null +++ b/app/controllers/projects/imports_controller.rb @@ -0,0 +1,49 @@ +class Projects::ImportsController < Projects::ApplicationController + # Authorize + before_filter :authorize_admin_project! + before_filter :require_no_repo + before_filter :redirect_if_progress, except: :show + + def new + end + + def create + @project.import_url = params[:project][:import_url] + + if @project.save + @project.reload + + if @project.import_failed? + @project.import_retry + else + @project.import_start + end + end + + redirect_to project_import_path(@project) + end + + def show + unless @project.import_in_progress? + if @project.import_finished? + redirect_to(@project) and return + else + redirect_to new_project_import_path(@project) and return + end + end + end + + private + + def require_no_repo + if @project.repository_exists? + redirect_to(@project) and return + end + end + + def redirect_if_progress + if @project.import_in_progress? + redirect_to project_import_path(@project) and return + end + end +end diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index bcd14a1c847..3a90c1c806d 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -1,7 +1,14 @@ class Projects::RepositoriesController < Projects::ApplicationController # Authorize before_filter :authorize_download_code! - before_filter :require_non_empty_project + before_filter :require_non_empty_project, except: :create + before_filter :authorize_admin_project!, only: :create + + def create + @project.create_repository + + redirect_to @project + end def archive unless can?(current_user, :download_code, @project) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index ead0127b515..fbd9e5f2a5b 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -4,7 +4,7 @@ class ProjectsController < ApplicationController before_filter :repository, except: [:new, :create] # Authorize - before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive, :retry_import] + before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive] layout 'navless', only: [:new, :create, :fork] before_filter :set_title, only: [:new, :create] @@ -48,7 +48,7 @@ class ProjectsController < ApplicationController def show if @project.import_in_progress? - redirect_to import_project_path(@project) + redirect_to project_import_path(@project) return end @@ -61,37 +61,20 @@ class ProjectsController < ApplicationController respond_to do |format| format.html do - if @project.empty_repo? - render "projects/empty", layout: user_layout + if @project.repository_exists? + if @project.empty_repo? + render "projects/empty", layout: user_layout + else + @last_push = current_user.recent_push(@project.id) if current_user + render :show, layout: user_layout + end else - @last_push = current_user.recent_push(@project.id) if current_user - render :show, layout: user_layout + render "projects/no_repo", layout: user_layout end end - format.json { pager_json("events/_events", @events.count) } - end - end - - def import - if @project.import_finished? - redirect_to @project - return - end - end - - def retry_import - unless @project.import_failed? - redirect_to import_project_path(@project) - end - @project.import_url = project_params[:import_url] - - if @project.save - @project.reload - @project.import_retry + format.json { pager_json("events/_events", @events.count) } end - - redirect_to import_project_path(@project) end def destroy diff --git a/app/models/project.rb b/app/models/project.rb index d7570684ac8..daf4bdd0aad 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -136,7 +136,7 @@ class Project < ActiveRecord::Base state_machine :import_status, initial: :none do event :import_start do - transition :none => :started + transition [:none, :finished] => :started end event :import_finish do diff --git a/app/views/projects/import.html.haml b/app/views/projects/import.html.haml deleted file mode 100644 index 4513c89e784..00000000000 --- a/app/views/projects/import.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -- if @project.import_in_progress? - .save-project-loader - .center - %h2 - %i.fa.fa-spinner.fa-spin - Import in progress. - %p.monospace git clone --bare #{hidden_pass_url(@project.import_url)} - %p Please wait while we import the repository for you. Refresh at will. - :javascript - new ProjectImport(); - -- elsif @project.import_failed? - .save-project-loader - .center - %h2 - Import failed. Retry? - %hr - - if can?(current_user, :admin_project, @project) - = form_for @project, url: retry_import_project_path(@project), method: :put, html: { class: 'form-horizontal' } do |f| - .form-group.import-url-data - = f.label :import_url, class: 'control-label' do - %span Import existing git repo - .col-sm-10 - = f.text_field :import_url, class: 'form-control', placeholder: 'https://github.com/randx/six.git' - .bs-callout.bs-callout-info - This URL must be publicly accessible or you can add a username and password like this: https://username:password@gitlab.com/company/project.git. - %br - The import will time out after 4 minutes. For big repositories, use a clone/push combination. - For SVN repositories, check #{link_to "this migrating from SVN doc.", "http://doc.gitlab.com/ce/workflow/migrating_from_svn.html"} - .form-actions - = f.submit 'Retry import', class: "btn btn-create", tabindex: 4 diff --git a/app/views/projects/imports/new.html.haml b/app/views/projects/imports/new.html.haml new file mode 100644 index 00000000000..6c3083e49f5 --- /dev/null +++ b/app/views/projects/imports/new.html.haml @@ -0,0 +1,21 @@ +%h3.page-title + - if @project.import_failed? + Import failed. Retry? + - else + Import repository + +%hr + += form_for @project, url: project_import_path(@project), method: :post, html: { class: 'form-horizontal' } do |f| + .form-group.import-url-data + = f.label :import_url, class: 'control-label' do + %span Import existing git repo + .col-sm-10 + = f.text_field :import_url, class: 'form-control', placeholder: 'https://github.com/randx/six.git' + .bs-callout.bs-callout-info + This URL must be publicly accessible or you can add a username and password like this: https://username:password@gitlab.com/company/project.git. + %br + The import will time out after 4 minutes. For big repositories, use a clone/push combination. + For SVN repositories, check #{link_to "this migrating from SVN doc.", "http://doc.gitlab.com/ce/workflow/migrating_from_svn.html"} + .form-actions + = f.submit 'Start import', class: "btn btn-create", tabindex: 4 diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml new file mode 100644 index 00000000000..2d1fdafed24 --- /dev/null +++ b/app/views/projects/imports/show.html.haml @@ -0,0 +1,9 @@ +.save-project-loader + .center + %h2 + %i.fa.fa-spinner.fa-spin + Import in progress. + %p.monospace git clone --bare #{hidden_pass_url(@project.import_url)} + %p Please wait while we import the repository for you. Refresh at will. + :javascript + new ProjectImport(); -- cgit v1.2.1 From 25a566da0aae470d7819820500e9343c7f462dfc Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Mon, 1 Dec 2014 15:11:26 +0100 Subject: Remove unused password argument from notification We were still passing a 'password' argument around, but it is not used anywhere because we send a password reset link in the welcome email nowadays. --- app/mailers/emails/profile.rb | 3 +-- app/services/notification_service.rb | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb index f8a7d133d1d..6d7f8eb4b02 100644 --- a/app/mailers/emails/profile.rb +++ b/app/mailers/emails/profile.rb @@ -1,8 +1,7 @@ module Emails module Profile - def new_user_email(user_id, password, token = nil) + def new_user_email(user_id, token = nil) @user = User.find(user_id) - @password = password @target_url = user_url(@user) @token = token mail(to: @user.email, subject: subject("Account was created for you")) diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index c9a1574b84e..2b6217e2e29 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -107,7 +107,7 @@ class NotificationService # Notify new user with email after creation def new_user(user, token = nil) # Don't email omniauth created users - mailer.new_user_email(user.id, user.password, token) unless user.extern_uid? + mailer.new_user_email(user.id, token) unless user.extern_uid? end # Notify users on new note in system -- cgit v1.2.1 From f53e0fff47eda03296dee95dbd44b6f5a78c6269 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 1 Dec 2014 17:40:45 +0200 Subject: Show username in comment header for easier mention Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/notes/_note.html.haml | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app') diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index a25c5e207fb..b2abdf0035d 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -18,6 +18,8 @@ %i.fa.fa-trash-o.cred Remove = link_to_member(@project, note.author, avatar: false) + %span.author-username + = '@' + note.author.username %span.note-last-update = note_timestamp(note) -- cgit v1.2.1 From 9a8ffadc39bf3d9742d4c623d261bee4c6d9e5bf Mon Sep 17 00:00:00 2001 From: Mark Riedesel Date: Thu, 13 Nov 2014 12:40:55 -0600 Subject: Improve Monokai highlight style to match original The current monokai style in highlightjs is not very true to the original and lacks colors for certain syntactic items. This change's goal is to bring the highlightjs monokai style in line with the original design from http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/ --- app/assets/stylesheets/highlight/monokai.scss | 31 ++++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/highlight/monokai.scss b/app/assets/stylesheets/highlight/monokai.scss index 36bc5df2f44..dffa2dc9ed2 100644 --- a/app/assets/stylesheets/highlight/monokai.scss +++ b/app/assets/stylesheets/highlight/monokai.scss @@ -29,28 +29,30 @@ .hljs-tag, .hljs-tag .hljs-title, - .hljs-keyword, - .hljs-literal, .hljs-strong, .hljs-change, .hljs-winutils, .hljs-flow, .lisp .hljs-title, .clojure .hljs-built_in, + .hljs-keyword, .nginx .hljs-title, .tex .hljs-special { color: #F92672; } .hljs { - color: #DDD; + color: #F8F8F2; } - .hljs .hljs-constant, - .asciidoc .hljs-code { + .asciidoc .hljs-code, + .markdown .hljs-code, + .hljs-literal, + .hljs-function .hljs-keyword { color: #66D9EF; } + .hljs-code, .hljs-class .hljs-title, .hljs-header { @@ -62,18 +64,27 @@ .hljs-symbol, .hljs-symbol .hljs-string, .hljs-value, + .hljs-constant, + .hljs-number, .hljs-regexp { - color: #BF79DB; + color: #AE81FF; + } + + .hljs-string { + color: #E6DB74; + } + + .hljs-params { + color: #fd971f; } .hljs-link_url, .hljs-tag .hljs-value, - .hljs-string, .hljs-bullet, .hljs-subst, .hljs-title, .hljs-emphasis, - .haskell .hljs-type, + .hljs-type, .hljs-preprocessor, .hljs-pragma, .ruby .hljs-class .hljs-parent, @@ -99,12 +110,12 @@ } .hljs-comment, - .java .hljs-annotation, + .hljs-annotation, .smartquote, .hljs-blockquote, .hljs-horizontal_rule, - .python .hljs-decorator, .hljs-template_comment, + .hljs-decorator, .hljs-pi, .hljs-doctype, .hljs-deletion, -- cgit v1.2.1 From 86c55106a0fb00533299efb96ba72ac91efc4276 Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Mon, 1 Dec 2014 17:45:25 +0100 Subject: Change twitter handle from gitlabhq -> gitlab --- app/views/shared/_promo.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/shared/_promo.html.haml b/app/views/shared/_promo.html.haml index 3400c345c4c..3596aabe309 100644 --- a/app/views/shared/_promo.html.haml +++ b/app/views/shared/_promo.html.haml @@ -1,5 +1,5 @@ .gitlab-promo = link_to 'Homepage', promo_url = link_to "Blog", promo_url + '/blog/' - = link_to "@gitlabhq", "https://twitter.com/gitlabhq" + = link_to "@gitlab", "https://twitter.com/gitlab" = link_to "Requests", "http://feedback.gitlab.com/" -- cgit v1.2.1 From 4cbe72d76722ce6c3d327ec62f54478a6e955d32 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 11:31:57 +0200 Subject: UI improvements mostly for mobile screens Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/timeline.scss | 17 +++++++++++++++++ app/assets/stylesheets/sections/issues.scss | 10 ++++++++++ app/assets/stylesheets/sections/notes.scss | 7 +++++-- app/views/projects/_issues_nav.html.haml | 8 ++++---- app/views/projects/issues/_issue.html.haml | 2 +- .../projects/merge_requests/_merge_request.html.haml | 4 ++-- app/views/projects/merge_requests/index.html.haml | 2 -- app/views/projects/notes/_form.html.haml | 2 +- 8 files changed, 40 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index f29cf25fa4c..57e9e8ae5c5 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -75,3 +75,20 @@ } } } + +@media (max-width: $screen-xs-max) { + .timeline { + &:before { + background: none; + } + .timeline-entry .timeline-entry-inner { + .timeline-icon { + display: none; + } + + .timeline-content { + margin-left: 0; + } + } + } +} diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index ebf8a6125c7..9a5400fffbc 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -151,4 +151,14 @@ form.edit-issue { } } } + + .issue { + &:hover .issue-actions { + display: none !important; + } + + .issue-updated-at { + display: none; + } + } } diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 7eb42fddade..783f6ae02d3 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -36,13 +36,16 @@ ul.notes { font-size: 13px; } .author { - color: #555; + color: #333; font-weight: bold; font-size: 14px; &:hover { - color: $link_hover_color; + color: $link_color; } } + .author-username { + font-size: 14px; + } } .discussion { diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml index 1e14a2deb8c..5b5d8eb9492 100644 --- a/app/views/projects/_issues_nav.html.haml +++ b/app/views/projects/_issues_nav.html.haml @@ -2,7 +2,7 @@ - if project_nav_tab? :issues = nav_link(controller: :issues) do = link_to project_issues_path(@project), class: "tab" do - Browse Issues + Issues - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do = link_to project_merge_requests_path(@project), class: "tab" do @@ -19,7 +19,7 @@ - if current_controller?(:issues) - if current_user - %li + %li.hidden-xs = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do %i.fa.fa-rss @@ -45,8 +45,8 @@ .pull-right %button.btn.btn-default.sidebar-expand-button %i.icon.fa.fa-list - + - if can? current_user, :write_merge_request, @project - = link_to new_project_merge_request_path(@project), class: "pull-right btn btn-new", title: "New Merge Request" do + = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do %i.fa.fa-plus New Merge Request diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 7525812696f..85a3d2b6c01 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -28,7 +28,7 @@ %span.task-status = issue.task_status - .pull-right + .pull-right.issue-updated-at %small updated #{time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_update_ago')} .issue-labels diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 1ee2e1bdae8..0a719fc642e 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -7,7 +7,7 @@ %i.fa.fa-check MERGED - else - %span.pull-right + %span.pull-right.hidden-xs - if merge_request.for_fork? %span.light #{merge_request.source_project_namespace}: @@ -31,7 +31,7 @@ %span.task-status = merge_request.task_status - .pull-right + .pull-right.hidden-xs %small updated #{time_ago_with_tooltip(merge_request.updated_at, 'bottom', 'merge_request_updated_ago')} .merge-request-labels diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index cd1e48ca976..a6d90a68b11 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,8 +1,6 @@ = render "projects/issues_nav" .row - .fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x .col-md-3.responsive-side = render 'shared/project_filter', project_entities_path: project_merge_requests_path(@project), labels: true, redirect: 'merge_requests', entity: 'merge_request' diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index c68b3817e79..5bc0e60bbe8 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -29,7 +29,7 @@ = yield(:note_actions) %a.btn.grouped.js-close-discussion-note-form Cancel - .note-form-option + .note-form-option.hidden-xs %a.choose-btn.btn.js-choose-note-attachment-button %i.fa.fa-paperclip %span Choose File ... -- cgit v1.2.1 From 8f60144782ba564c63d757c11a72440202f2490c Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Tue, 2 Dec 2014 10:32:24 +0100 Subject: Change avatar file size to 200kb. --- app/models/user.rb | 2 +- app/views/profiles/show.html.haml | 2 +- app/views/shared/_choose_group_avatar_button.html.haml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index fc191a78f53..1cddd85ada0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -124,7 +124,7 @@ class User < ActiveRecord::Base validate :namespace_uniq, if: ->(user) { user.username_changed? } validate :avatar_type, if: ->(user) { user.avatar_changed? } validate :unique_email, if: ->(user) { user.email_changed? } - validates :avatar, file_size: { maximum: 100.kilobytes.to_i } + validates :avatar, file_size: { maximum: 200.kilobytes.to_i } before_validation :generate_password, on: :create before_validation :sanitize_attrs diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index d6b52f86154..640104fdad1 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -83,7 +83,7 @@   %span.file_name.js-avatar-filename File name... = f.file_field :avatar, class: "js-user-avatar-input hidden" - .light The maximum file size allowed is 100KB. + .light The maximum file size allowed is 200KB. - if @user.avatar? %hr = link_to 'Remove avatar', profile_avatar_path, data: { confirm: "Avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" diff --git a/app/views/shared/_choose_group_avatar_button.html.haml b/app/views/shared/_choose_group_avatar_button.html.haml index f32c2d388a7..299c0bd42a2 100644 --- a/app/views/shared/_choose_group_avatar_button.html.haml +++ b/app/views/shared/_choose_group_avatar_button.html.haml @@ -4,4 +4,4 @@   %span.file_name.js-avatar-filename File name... = f.file_field :avatar, class: 'js-group-avatar-input hidden' -.light The maximum file size allowed is 100KB. +.light The maximum file size allowed is 200KB. -- cgit v1.2.1 From 6eeaef6dc4cc0cda9c80bf46f38eae9f640debec Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 11:47:12 +0200 Subject: Smaller tabs for mobile view Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 4 ---- app/assets/stylesheets/generic/mobile.scss | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 app/assets/stylesheets/generic/mobile.scss (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index cd2f4e45e3c..2fc738c18d8 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -330,10 +330,6 @@ table { } } -@media (max-width: $screen-xs-max) { - .container .content { margin-top: 20px; } -} - .wiki .highlight, .note-body .highlight { margin-bottom: 9px; } diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss new file mode 100644 index 00000000000..c164b07b104 --- /dev/null +++ b/app/assets/stylesheets/generic/mobile.scss @@ -0,0 +1,17 @@ +/** Common mobile (screen XS) styles **/ +@media (max-width: $screen-xs-max) { + .container .content { + margin-top: 20px; + } + + .nav.nav-tabs > li > a { + padding: 10px; + font-size: 12px; + margin-right: 3px; + + .badge { + display: none; + } + } +} + -- cgit v1.2.1 From 9211b541d3eaa60401f4ab6a5d264f9179ad4160 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 16:22:23 +0200 Subject: Improve MR code reloading when push code Every time you pushed to master it updates merge requests that has master as target branch. So if you have 50 open merge requests point to master it will reload all of them every time you push a single commit to master. The funny thing is that after reloading diff of most merge requests looks the same. After this patch we update diff only if we push commit to master that includes in MR commits list. For example we have next repository: feature: A - B - C master: A We create merge requests #1 with code from feature to master. MR #1: B - C If we push to master commit D - MR will not be reloaded. So picture will look next: feature: A - B - C master: A - D MR #1: B - C And if we push to master commit B - MR will be reloaded. So picture will look next: feature: A - B - C master: A - B MR #1: C Signed-off-by: Dmitriy Zaporozhets --- app/services/merge_requests/refresh_service.rb | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index 74448998ddd..1a1704aea77 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -43,8 +43,22 @@ module MergeRequests merge_requests = filter_merge_requests(merge_requests) merge_requests.each do |merge_request| - merge_request.reload_code - merge_request.mark_as_unchecked + + if merge_request.source_branch == @branch_name + merge_request.reload_code + merge_request.mark_as_unchecked + else + mr_commit_ids = merge_request.commits.map(&:id) + push_commit_ids = @commits.map(&:id) + matches = mr_commit_ids & push_commit_ids + + if matches.any? + merge_request.reload_code + merge_request.mark_as_unchecked + else + merge_request.mark_as_unchecked + end + end end end -- cgit v1.2.1 From 835cbc06d8d9c773a3b405eca81650378a8ccdcd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 17:42:56 +0200 Subject: Reload mr code on force push too Signed-off-by: Dmitriy Zaporozhets --- app/services/merge_requests/refresh_service.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index 1a1704aea77..baf0936cc3d 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -3,6 +3,7 @@ module MergeRequests def execute(oldrev, newrev, ref) return true unless ref =~ /heads/ + @oldrev, @newrev = oldrev, newrev @branch_name = ref.gsub("refs/heads/", "") @fork_merge_requests = @project.fork_merge_requests.opened @commits = @project.repository.commits_between(oldrev, newrev) @@ -35,6 +36,10 @@ module MergeRequests end end + def force_push? + Gitlab::ForcePushCheck.force_push?(@project, @oldrev, @newrev) + end + # Refresh merge request diff if we push to source or target branch of merge request # Note: we should update merge requests from forks too def reload_merge_requests @@ -44,7 +49,7 @@ module MergeRequests merge_requests.each do |merge_request| - if merge_request.source_branch == @branch_name + if merge_request.source_branch == @branch_name || force_push? merge_request.reload_code merge_request.mark_as_unchecked else -- cgit v1.2.1 From 12f8699296aed86b01cc455dfaa05305966fb5a8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 22:30:06 +0200 Subject: Fix safari 8 ui issue Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/_issues_nav.html.haml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml index 5b5d8eb9492..18628eb6207 100644 --- a/app/views/projects/_issues_nav.html.haml +++ b/app/views/projects/_issues_nav.html.haml @@ -27,14 +27,17 @@ .pull-right %button.btn.btn-default.sidebar-expand-button %i.icon.fa.fa-list - = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do - .append-right-10.hidden-xs.hidden-sm - = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } - = hidden_field_tag :state, params['state'] - = hidden_field_tag :scope, params['scope'] - = hidden_field_tag :assignee_id, params['assignee_id'] - = hidden_field_tag :milestone_id, params['milestone_id'] - = hidden_field_tag :label_id, params['label_id'] + + .pull-left + = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do + .append-right-10.hidden-xs.hidden-sm + = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } + = hidden_field_tag :state, params['state'] + = hidden_field_tag :scope, params['scope'] + = hidden_field_tag :assignee_id, params['assignee_id'] + = hidden_field_tag :milestone_id, params['milestone_id'] + = hidden_field_tag :label_id, params['label_id'] + - if can? current_user, :write_issue, @project = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do %i.fa.fa-plus -- cgit v1.2.1 From 5f15ed04fc58cfe8b7d54b3490248430575b16d9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 22:38:45 +0200 Subject: Respect current controller scope when using search from project area Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/_search.html.haml | 11 ++++++++++- app/views/search/_project_filter.html.haml | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml index 2460a6a014d..04f79846858 100644 --- a/app/views/layouts/_search.html.haml +++ b/app/views/layouts/_search.html.haml @@ -4,7 +4,16 @@ = hidden_field_tag :group_id, @group.try(:id) - if @project && @project.persisted? = hidden_field_tag :project_id, @project.id - = hidden_field_tag :search_code, true + + - if current_controller?(:issues) + = hidden_field_tag :scope, 'issues' + - elsif current_controller?(:merge_requests) + = hidden_field_tag :scope, 'merge_requests' + - elsif current_controller?(:wikis) + = hidden_field_tag :scope, 'wiki_blobs' + - else + = hidden_field_tag :search_code, true + - if @snippet || @snippets = hidden_field_tag :snippets, true = hidden_field_tag :repository_ref, @ref diff --git a/app/views/search/_project_filter.html.haml b/app/views/search/_project_filter.html.haml index c201b3d6c47..ad933502a28 100644 --- a/app/views/search/_project_filter.html.haml +++ b/app/views/search/_project_filter.html.haml @@ -25,6 +25,7 @@ = @search_results.notes_count %li{class: ("active" if @scope == 'wiki_blobs')} = link_to search_filter_path(scope: 'wiki_blobs') do + %i.fa.fa-book Wiki .pull-right = @search_results.wiki_blobs_count -- cgit v1.2.1 From c5bdc7e13ac4f953f83f226b0f2f5b45905d2bce Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 22:47:19 +0200 Subject: New label/milestone link from issue form opens in new window Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/_issuable_form.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml index 6cdfab933b4..dd40a719561 100644 --- a/app/views/projects/_issuable_form.html.haml +++ b/app/views/projects/_issuable_form.html.haml @@ -49,7 +49,7 @@ - else %span.light No open milestones available.   - = link_to 'Create new milestone', new_project_milestone_path(issuable.project) + = link_to 'Create new milestone', new_project_milestone_path(issuable.project), target: :blank .form-group = f.label :label_ids, class: 'control-label' do %i.icon-tag @@ -61,7 +61,7 @@ - else %span.light No labels yet.   - = link_to 'Create new label', new_project_label_path(issuable.project) + = link_to 'Create new label', new_project_label_path(issuable.project), target: :blank .form-actions - if issuable.new_record? -- cgit v1.2.1 From ba51a1dd328c453927d390147f5fa4be3e1f6fe7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 20 Oct 2014 12:56:01 +0300 Subject: Render cross reference in issue title Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/issue_box.scss | 5 +++++ app/helpers/gitlab_markdown_helper.rb | 12 ++++++++++++ app/views/projects/issues/show.html.haml | 3 +++ 3 files changed, 20 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/issue_box.scss b/app/assets/stylesheets/generic/issue_box.scss index 94149594e24..79fbad4b946 100644 --- a/app/assets/stylesheets/generic/issue_box.scss +++ b/app/assets/stylesheets/generic/issue_box.scss @@ -113,6 +113,11 @@ padding: 10px 15px; } + .cross-project-ref { + float: left; + padding: 10px 15px; + } + .creator { float: right; padding: 10px 15px; diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 7d3cb749829..800cacdc2c2 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -254,4 +254,16 @@ module GitlabMarkdownHelper truncated end end + + def cross_project_reference(project, entity) + path = project.path_with_namespace + + if entity.kind_of?(Issue) + [path, entity.iid].join('#') + elsif entity.kind_of?(MergeRequest) + [path, entity.iid].join('!') + else + raise 'Not supported type' + end + end end diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index aad58e48f6c..685d9f96d51 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -38,6 +38,9 @@ - else Open + .cross-project-ref + = cross_project_reference(@project, @issue) + .creator Created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} -- cgit v1.2.1 From ed1c22568a9363161d20a1c38147d0ef0f019c2b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 3 Dec 2014 11:40:04 +0200 Subject: Add cross-project reference tooltip for merge request Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/issues/show.html.haml | 1 + app/views/projects/merge_requests/show/_mr_box.html.haml | 4 ++++ 2 files changed, 5 insertions(+) (limited to 'app') diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 685d9f96d51..01a1fabda26 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -39,6 +39,7 @@ Open .cross-project-ref + %i.fa.fa-link.has_tooltip{:"data-original-title" => 'Cross-project reference'} = cross_project_reference(@project, @issue) .creator diff --git a/app/views/projects/merge_requests/show/_mr_box.html.haml b/app/views/projects/merge_requests/show/_mr_box.html.haml index 7e5a4eda508..866b236d827 100644 --- a/app/views/projects/merge_requests/show/_mr_box.html.haml +++ b/app/views/projects/merge_requests/show/_mr_box.html.haml @@ -8,6 +8,10 @@ - else Open + .cross-project-ref + %i.fa.fa-link.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @merge_request) + .creator Created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} -- cgit v1.2.1 From 80497793355f8b8c735f40dd25c20c2ac989b6e1 Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Wed, 3 Dec 2014 12:50:00 +0100 Subject: Added "news" to no_highlight_files --- app/helpers/blob_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 420ac3f77c7..b7c1db6964c 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -8,6 +8,6 @@ module BlobHelper end def no_highlight_files - %w(credits changelog copying copyright license authors) + %w(credits changelog news copying copyright license authors) end end -- cgit v1.2.1 From 279952bb788b8e1601aafc66306d173956165740 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 3 Dec 2014 17:29:52 +0200 Subject: Show issue/mr id in the list below title Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/issues/_issue.html.haml | 2 +- app/views/projects/merge_requests/_merge_request.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 85a3d2b6c01..dc6510be858 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -4,7 +4,6 @@ = check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue", disabled: !can?(current_user, :modify_issue, issue) .issue-title - %span.light= "##{issue.iid}" %span.str-truncated = link_to_gfm issue.title, project_issue_path(issue.project, issue), class: "row_title" - if issue.closed? @@ -12,6 +11,7 @@ CLOSED .issue-info + %span.light= "##{issue.iid}" - if issue.assignee assigned to #{link_to_member(@project, issue.assignee)} - if issue.votes_count > 0 diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 0a719fc642e..dedb060a231 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -1,6 +1,5 @@ %li{ class: mr_css_classes(merge_request) } .merge-request-title - %span.light= "##{merge_request.iid}" = link_to_gfm truncate(merge_request.title, length: 80), project_merge_request_path(merge_request.target_project, merge_request), class: "row_title" - if merge_request.merged? %small.pull-right @@ -15,6 +14,7 @@ %i.fa.fa-angle-right.light = merge_request.target_branch .merge-request-info + %span.light= "##{merge_request.iid}" - if merge_request.author authored by #{link_to_member(merge_request.source_project, merge_request.author)} - if merge_request.votes_count > 0 -- cgit v1.2.1 From d80a59c7b1d3459579c3da95b64a5f235021aa59 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 4 Dec 2014 12:10:38 +0200 Subject: Create helper for sort drowdown option names Signed-off-by: Dmitriy Zaporozhets --- app/helpers/sorting_helper.rb | 17 +++++++++++++++++ app/views/admin/projects/index.html.haml | 8 ++++---- app/views/admin/users/index.html.haml | 5 +++-- app/views/dashboard/projects.html.haml | 9 +++++---- app/views/explore/groups/index.html.haml | 8 ++++---- app/views/explore/projects/index.html.haml | 8 ++++---- app/views/projects/branches/index.html.haml | 4 ++-- app/views/shared/_sort_dropdown.html.haml | 8 ++++---- 8 files changed, 43 insertions(+), 24 deletions(-) create mode 100644 app/helpers/sorting_helper.rb (limited to 'app') diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb new file mode 100644 index 00000000000..59e58e2f3d3 --- /dev/null +++ b/app/helpers/sorting_helper.rb @@ -0,0 +1,17 @@ +module SortingHelper + def sort_title_oldest_updated + 'Oldest updated' + end + + def sort_title_recently_updated + 'Recently updated' + end + + def sort_title_oldest_created + 'Recently updated' + end + + def sort_title_recently_created + 'Recently updated' + end +end diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 2cd6b12be7f..aa59f38d213 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -56,13 +56,13 @@ = link_to admin_projects_path(sort: nil) do Name = link_to admin_projects_path(sort: 'newest') do - Newest + = sort_title_recently_created = link_to admin_projects_path(sort: 'oldest') do - Oldest + = sort_title_oldest_created = link_to admin_projects_path(sort: 'recently_updated') do - Recently updated + = sort_title_recently_updated = link_to admin_projects_path(sort: 'last_updated') do - Last updated + = sort_title_oldest_updated = link_to admin_projects_path(sort: 'largest_repository') do Largest repository = link_to 'New Project', new_project_path, class: "btn btn-new" diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 92c619738a2..8e1ecb41a85 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -49,9 +49,10 @@ = link_to admin_users_path(sort: 'oldest_sign_in') do Oldest sign in = link_to admin_users_path(sort: 'recently_created') do - Recently created + = sort_title_recently_created = link_to admin_users_path(sort: 'late_created') do - Late created + = sort_title_oldest_created + = link_to 'New User', new_admin_user_path, class: "btn btn-new" %ul.well-list - @users.each do |user| diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index f124c688be1..5b7835b097b 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -14,13 +14,14 @@ = link_to projects_dashboard_filter_path(sort: nil) do Name = link_to projects_dashboard_filter_path(sort: 'newest') do - Newest + = sort_title_recently_created = link_to projects_dashboard_filter_path(sort: 'oldest') do - Oldest + = sort_title_oldest_created = link_to projects_dashboard_filter_path(sort: 'recently_updated') do - Recently updated + = sort_title_recently_updated = link_to projects_dashboard_filter_path(sort: 'last_updated') do - Last updated + = sort_title_oldest_updated + %p.light All projects you have access to are listed here. Public projects are not included here unless you are a member %hr diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index 709d062df83..9b1d7d0416d 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -20,13 +20,13 @@ = link_to explore_groups_path(sort: nil) do Name = link_to explore_groups_path(sort: 'newest') do - Newest + = sort_title_recently_created = link_to explore_groups_path(sort: 'oldest') do - Oldest + = sort_title_oldest_created = link_to explore_groups_path(sort: 'recently_updated') do - Recently updated + = sort_title_recently_updated = link_to explore_groups_path(sort: 'last_updated') do - Last updated + = sort_title_oldest_updated %hr diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml index f797c4e3830..02586077d8c 100644 --- a/app/views/explore/projects/index.html.haml +++ b/app/views/explore/projects/index.html.haml @@ -20,13 +20,13 @@ = link_to explore_projects_path(sort: nil) do Name = link_to explore_projects_path(sort: 'newest') do - Newest + = sort_title_recently_created = link_to explore_projects_path(sort: 'oldest') do - Oldest + = sort_title_oldest_created = link_to explore_projects_path(sort: 'recently_updated') do - Recently updated + = sort_title_recently_updated = link_to explore_projects_path(sort: 'last_updated') do - Last updated + = sort_title_oldest_updated %hr .public-projects diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml index 9f2b1b59292..d2aefd815a1 100644 --- a/app/views/projects/branches/index.html.haml +++ b/app/views/projects/branches/index.html.haml @@ -20,9 +20,9 @@ = link_to project_branches_path(sort: nil) do Name = link_to project_branches_path(sort: 'recently_updated') do - Recently updated + = sort_title_recently_updated = link_to project_branches_path(sort: 'last_updated') do - Last updated + = sort_title_oldest_updated %hr - unless @branches.empty? %ul.bordered-list.top-list.all-branches diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml index 7b37b39780e..54f59245690 100644 --- a/app/views/shared/_sort_dropdown.html.haml +++ b/app/views/shared/_sort_dropdown.html.haml @@ -9,13 +9,13 @@ %ul.dropdown-menu %li = link_to project_filter_path(sort: 'newest') do - Newest + = sort_title_recently_created = link_to project_filter_path(sort: 'oldest') do - Oldest + = sort_title_oldest_created = link_to project_filter_path(sort: 'recently_updated') do - Recently updated + = sort_title_recently_updated = link_to project_filter_path(sort: 'last_updated') do - Last updated + = sort_title_oldest_updated = link_to project_filter_path(sort: 'milestone_due_soon') do Milestone due soon = link_to project_filter_path(sort: 'milestone_due_later') do -- cgit v1.2.1 From 6670c99487891afd4a577d0a9ed54fe455bb0324 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 4 Dec 2014 12:12:51 +0200 Subject: Set proper filter words Signed-off-by: Dmitriy Zaporozhets --- app/helpers/sorting_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb index 59e58e2f3d3..492e065b713 100644 --- a/app/helpers/sorting_helper.rb +++ b/app/helpers/sorting_helper.rb @@ -8,10 +8,10 @@ module SortingHelper end def sort_title_oldest_created - 'Recently updated' + 'Oldest created' end def sort_title_recently_created - 'Recently updated' + 'Recently created' end end -- cgit v1.2.1 From 1a80d13a3990937580c97e2b0ba8fb98f69bc055 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Tue, 25 Nov 2014 18:15:30 +0200 Subject: Multi-provider auth. LDAP is not reworked --- app/controllers/omniauth_callbacks_controller.rb | 7 +++---- app/helpers/profile_helper.rb | 2 +- app/models/identity.rb | 7 +++++++ app/models/user.rb | 3 +-- 4 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 app/models/identity.rb (limited to 'app') diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index bd4b310fcbf..58d0506c07d 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -42,10 +42,8 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController def handle_omniauth if current_user - # Change a logged-in user's authentication method: - current_user.extern_uid = oauth['uid'] - current_user.provider = oauth['provider'] - current_user.save + # Add new authentication method + current_user.identities.find_or_create_by(extern_uid: oauth['uid'], provider: oauth['provider']) redirect_to profile_path else @user = Gitlab::OAuth::User.new(oauth) @@ -53,6 +51,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController # Only allow properly saved users to login. if @user.persisted? && @user.valid? + # binding.pry sign_in_and_redirect(@user.gl_user) else error_message = diff --git a/app/helpers/profile_helper.rb b/app/helpers/profile_helper.rb index 0b375558305..816074e0247 100644 --- a/app/helpers/profile_helper.rb +++ b/app/helpers/profile_helper.rb @@ -1,6 +1,6 @@ module ProfileHelper def oauth_active_class(provider) - if current_user.provider == provider.to_s + if current_user.identities.exists?(provider: provider.to_s) 'active' end end diff --git a/app/models/identity.rb b/app/models/identity.rb new file mode 100644 index 00000000000..e6af93bcc50 --- /dev/null +++ b/app/models/identity.rb @@ -0,0 +1,7 @@ +class Identity < ActiveRecord::Base + belongs_to :user + + validates :extern_uid, allow_blank: true, uniqueness: {scope: :provider} + + scope :ldap, -> { where('provider LIKE ?', 'ldap%') } +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 1cddd85ada0..0cf0946593c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -79,6 +79,7 @@ class User < ActiveRecord::Base # Profile has_many :keys, dependent: :destroy has_many :emails, dependent: :destroy + has_many :identities, dependent: :destroy # Groups has_many :members, dependent: :destroy @@ -113,7 +114,6 @@ class User < ActiveRecord::Base validates :name, presence: true validates :email, presence: true, email: {strict_mode: true}, uniqueness: true validates :bio, length: { maximum: 255 }, allow_blank: true - validates :extern_uid, allow_blank: true, uniqueness: {scope: :provider} validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0} validates :username, presence: true, uniqueness: { case_sensitive: false }, exclusion: { in: Gitlab::Blacklist.path }, @@ -178,7 +178,6 @@ class User < ActiveRecord::Base scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) } scope :not_in_project, ->(project) { project.users.present? ? where("id not in (:ids)", ids: project.users.map(&:id) ) : all } scope :without_projects, -> { where('id NOT IN (SELECT DISTINCT(user_id) FROM members)') } - scope :ldap, -> { where('provider LIKE ?', 'ldap%') } scope :potential_team_members, ->(team) { team.members.any? ? active.not_in_team(team) : active } # -- cgit v1.2.1 From 3a5ed5260b24051939575d1934ce9b8392cac09f Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 27 Nov 2014 13:34:39 +0200 Subject: Supporting for multiple omniauth provider for the same user --- app/controllers/omniauth_callbacks_controller.rb | 5 ++--- app/helpers/profile_helper.rb | 4 ++-- app/models/identity.rb | 2 -- app/models/user.rb | 6 +++++- app/services/notification_service.rb | 2 +- app/views/admin/users/show.html.haml | 2 +- app/views/devise/sessions/_oauth_providers.html.haml | 2 +- 7 files changed, 12 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index 58d0506c07d..3e984e5007a 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -51,7 +51,6 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController # Only allow properly saved users to login. if @user.persisted? && @user.valid? - # binding.pry sign_in_and_redirect(@user.gl_user) else error_message = @@ -66,8 +65,8 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return end end - rescue StandardError - flash[:notice] = "There's no such user!" + rescue ForbiddenAction => e + flash[:notice] = e.message redirect_to new_user_session_path end diff --git a/app/helpers/profile_helper.rb b/app/helpers/profile_helper.rb index 816074e0247..6480fd3886f 100644 --- a/app/helpers/profile_helper.rb +++ b/app/helpers/profile_helper.rb @@ -10,10 +10,10 @@ module ProfileHelper end def show_profile_social_tab? - enabled_social_providers.any? && !current_user.ldap_user? + enabled_social_providers.any? end def show_profile_remove_tab? - gitlab_config.signup_enabled && !current_user.ldap_user? + gitlab_config.signup_enabled end end diff --git a/app/models/identity.rb b/app/models/identity.rb index e6af93bcc50..5fb1850c30b 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -2,6 +2,4 @@ class Identity < ActiveRecord::Base belongs_to :user validates :extern_uid, allow_blank: true, uniqueness: {scope: :provider} - - scope :ldap, -> { where('provider LIKE ?', 'ldap%') } end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 0cf0946593c..7faeef1b5b0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -406,7 +406,11 @@ class User < ActiveRecord::Base end def ldap_user? - extern_uid && provider.start_with?('ldap') + identities.exists?(["provider LIKE ? AND extern_uid IS NOT NULL", "ldap%"]) + end + + def ldap_identity + @ldap_identity ||= identities.find_by(["provider LIKE ?", "ldap%"]) end def accessible_deploy_keys diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 2b6217e2e29..d1aadd741e1 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -107,7 +107,7 @@ class NotificationService # Notify new user with email after creation def new_user(user, token = nil) # Don't email omniauth created users - mailer.new_user_email(user.id, token) unless user.extern_uid? + mailer.new_user_email(user.id, token) unless user.identities.any? end # Notify users on new note in system diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 211d77d5185..29717aedd80 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -95,7 +95,7 @@ %li %span.light LDAP uid: %strong - = @user.extern_uid + = @user.ldap_identity.extern_uid - if @user.created_by %li diff --git a/app/views/devise/sessions/_oauth_providers.html.haml b/app/views/devise/sessions/_oauth_providers.html.haml index 15048a78063..d053c51d7ec 100644 --- a/app/views/devise/sessions/_oauth_providers.html.haml +++ b/app/views/devise/sessions/_oauth_providers.html.haml @@ -1,4 +1,4 @@ -- providers = (enabled_oauth_providers - [:ldap]) +- providers = enabled_oauth_providers.reject{|provider| provider.to_s.starts_with?('ldap')} - if providers.present? .bs-callout.bs-callout-info{:'data-no-turbolink' => 'data-no-turbolink'} %span Sign in with:   -- cgit v1.2.1 From b56b96d438c92981cd5c0f5e2f4b23d3799a3bd3 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 4 Dec 2014 12:55:37 +0200 Subject: added helper --- app/helpers/oauth_helper.rb | 4 ++++ app/views/devise/sessions/_oauth_providers.html.haml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/oauth_helper.rb b/app/helpers/oauth_helper.rb index 7024483b8b3..df18db71c84 100644 --- a/app/helpers/oauth_helper.rb +++ b/app/helpers/oauth_helper.rb @@ -16,4 +16,8 @@ module OauthHelper [:twitter, :github, :google_oauth2].include?(name.to_sym) end end + + def additional_providers + enabled_oauth_providers.reject{|provider| provider.to_s.starts_with?('ldap')} + end end diff --git a/app/views/devise/sessions/_oauth_providers.html.haml b/app/views/devise/sessions/_oauth_providers.html.haml index d053c51d7ec..8d6aaefb9ff 100644 --- a/app/views/devise/sessions/_oauth_providers.html.haml +++ b/app/views/devise/sessions/_oauth_providers.html.haml @@ -1,4 +1,4 @@ -- providers = enabled_oauth_providers.reject{|provider| provider.to_s.starts_with?('ldap')} +- providers = additional_providers - if providers.present? .bs-callout.bs-callout-info{:'data-no-turbolink' => 'data-no-turbolink'} %span Sign in with:   -- cgit v1.2.1 From db2edff937cbc309c10bb1a987356a58f8a9c8fa Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 4 Dec 2014 15:07:01 +0200 Subject: Handle web hook exception Write to log if web hook cant be executed. This prevents 500 error when test web hook with invalid URL and prevent exceptions and retries in sidekiq Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects/hooks_controller.rb | 1 + app/models/hooks/web_hook.rb | 8 +++++++- app/services/test_hook_service.rb | 3 --- 3 files changed, 8 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb index cab8fd76e6c..2d6c3111192 100644 --- a/app/controllers/projects/hooks_controller.rb +++ b/app/controllers/projects/hooks_controller.rb @@ -26,6 +26,7 @@ class Projects::HooksController < Projects::ApplicationController def test if !@project.empty_repo? status = TestHookService.new.execute(hook, current_user) + if status flash[:notice] = 'Hook successfully executed.' else diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index 23fa01e0b70..8479d4aecf6 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -32,7 +32,10 @@ class WebHook < ActiveRecord::Base def execute(data) parsed_url = URI.parse(url) if parsed_url.userinfo.blank? - WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" }, verify: false) + WebHook.post(url, + body: data.to_json, + headers: { "Content-Type" => "application/json" }, + verify: false) else post_url = url.gsub("#{parsed_url.userinfo}@", "") auth = { @@ -45,6 +48,9 @@ class WebHook < ActiveRecord::Base verify: false, basic_auth: auth) end + rescue SocketError, Errno::ECONNREFUSED => e + logger.error("WebHook Error => #{e}") + false end def async_execute(data) diff --git a/app/services/test_hook_service.rb b/app/services/test_hook_service.rb index b6b1ef29b51..17d86a7a274 100644 --- a/app/services/test_hook_service.rb +++ b/app/services/test_hook_service.rb @@ -2,8 +2,5 @@ class TestHookService def execute(hook, current_user) data = GitPushService.new.sample_data(hook.project, current_user) hook.execute(data) - true - rescue SocketError - false end end -- cgit v1.2.1 From cdc62cffcb86dfd939c119cba2acaf266af39f23 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 4 Dec 2014 15:22:10 +0100 Subject: Add rake task for google schema whitelisting. --- app/mailers/notify.rb | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'app') diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 0ee19836627..6d671e6e0bd 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -26,6 +26,14 @@ class Notify < ActionMailer::Base delay_for(2.seconds) end + def test_email(recepient_email, subject, body) + mail(to: recepient_email, + subject: subject, + body: body.html_safe, + content_type: 'text/html' + ) + end + private # The default email address to send emails from -- cgit v1.2.1 From a46fe875c6aea206e575e2b083bd31ed36ee1b1e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 4 Dec 2014 21:49:19 +0200 Subject: Feature: atom feed for user activity Signed-off-by: Dmitriy Zaporozhets --- app/controllers/users_controller.rb | 7 ++++++- app/views/users/show.atom.builder | 29 +++++++++++++++++++++++++++++ app/views/users/show.html.haml | 10 +++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 app/views/users/show.atom.builder (limited to 'app') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 0b442f5383a..67af1801bda 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -20,9 +20,14 @@ class UsersController < ApplicationController # Get user activity feed for projects common for both users @events = @user.recent_events. - where(project_id: authorized_projects_ids).limit(20) + where(project_id: authorized_projects_ids).limit(30) @title = @user.name + + respond_to do |format| + format.html + format.atom { render layout: false } + end end def determine_layout diff --git a/app/views/users/show.atom.builder b/app/views/users/show.atom.builder new file mode 100644 index 00000000000..0d61a9e8097 --- /dev/null +++ b/app/views/users/show.atom.builder @@ -0,0 +1,29 @@ +xml.instruct! +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do + xml.title "Activity feed for #{@user.name}" + xml.link :href => user_url(@user, :atom), :rel => "self", :type => "application/atom+xml" + xml.link :href => user_url(@user), :rel => "alternate", :type => "text/html" + xml.id projects_url + xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? + + @events.each do |event| + if event.proper? + xml.entry do + event_link = event_feed_url(event) + event_title = event_feed_title(event) + event_summary = event_feed_summary(event) + + xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" + xml.link :href => event_link + xml.title truncate(event_title, :length => 80) + xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") + xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(event.author_email) + xml.author do |author| + xml.name event.author_name + xml.email event.author_email + end + xml.summary(:type => "xhtml") { |x| x << event_summary unless event_summary.nil? } + end + end + end +end diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index cb49c030af2..54f2666ce5d 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -18,7 +18,15 @@ %h4 Groups: = render 'groups', groups: @groups %hr - %h4 User Activity: + %h4 + User Activity: + + - if current_user + %span.rss-icon.pull-right + = link_to user_path(@user, :atom, { private_token: current_user.private_token }) do + %strong + %i.fa.fa-rss + = render @events .col-md-4 = render 'profile', user: @user -- cgit v1.2.1 From d31d711a70779132ea43387f93eb4ccc1e472761 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 4 Dec 2014 22:14:20 +0200 Subject: DRY and refactor atom code Signed-off-by: Dmitriy Zaporozhets --- app/helpers/events_helper.rb | 22 ++++++++++++++++++++++ app/helpers/issues_helper.rb | 15 +++++++++++++++ app/views/dashboard/issues.atom.builder | 21 +++++---------------- app/views/dashboard/show.atom.builder | 25 ++++--------------------- app/views/groups/issues.atom.builder | 13 +------------ app/views/groups/show.atom.builder | 24 ++++-------------------- app/views/projects/issues/index.atom.builder | 13 +------------ app/views/users/show.atom.builder | 25 ++++--------------------- 8 files changed, 56 insertions(+), 102 deletions(-) (limited to 'app') diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 71f97fbb8c8..a3136926b38 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -145,4 +145,26 @@ module EventsHelper rescue "--broken encoding" end + + def event_to_atom(xml, event) + if event.proper? + xml.entry do + event_link = event_feed_url(event) + event_title = event_feed_title(event) + event_summary = event_feed_summary(event) + + xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" + xml.link href: event_link + xml.title truncate(event_title, length: 80) + xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") + xml.media :thumbnail, width: "40", height: "40", url: avatar_icon(event.author_email) + xml.author do |author| + xml.name event.author_name + xml.email event.author_email + end + + xml.summary(type: "xhtml") { |x| x << event_summary unless event_summary.nil? } + end + end + end end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index d513e0ba58e..a5b393c1e3c 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -113,4 +113,19 @@ module IssuesHelper 'issue-box-open' end end + + def issue_to_atom(xml, issue) + xml.entry do + xml.id project_issue_url(issue.project, issue) + xml.link href: project_issue_url(issue.project, issue) + xml.title truncate(issue.title, length: 80) + xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") + xml.media :thumbnail, width: "40", height: "40", url: avatar_icon(issue.author_email) + xml.author do |author| + xml.name issue.author_name + xml.email issue.author_email + end + xml.summary issue.title + end + end end diff --git a/app/views/dashboard/issues.atom.builder b/app/views/dashboard/issues.atom.builder index f5413557783..66381310221 100644 --- a/app/views/dashboard/issues.atom.builder +++ b/app/views/dashboard/issues.atom.builder @@ -1,24 +1,13 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do xml.title "#{current_user.name} issues" - xml.link :href => issues_dashboard_url(:atom, :private_token => current_user.private_token), :rel => "self", :type => "application/atom+xml" - xml.link :href => issues_dashboard_url(:private_token => current_user.private_token), :rel => "alternate", :type => "text/html" - xml.id issues_dashboard_url(:private_token => current_user.private_token) + xml.link href: issues_dashboard_url(:atom, private_token: current_user.private_token), rel: "self", type: "application/atom+xml" + xml.link href: issues_dashboard_url(private_token: current_user.private_token), rel: "alternate", type: "text/html" + xml.id issues_dashboard_url(private_token: current_user.private_token) xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? @issues.each do |issue| - xml.entry do - xml.id project_issue_url(issue.project, issue) - xml.link :href => project_issue_url(issue.project, issue) - xml.title truncate(issue.title, :length => 80) - xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(issue.author_email) - xml.author do |author| - xml.name issue.author_name - xml.email issue.author_email - end - xml.summary issue.title - end + issue_to_atom(xml, issue) end end diff --git a/app/views/dashboard/show.atom.builder b/app/views/dashboard/show.atom.builder index f4cf24ccd99..70ac66f8016 100644 --- a/app/views/dashboard/show.atom.builder +++ b/app/views/dashboard/show.atom.builder @@ -1,29 +1,12 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do xml.title "Dashboard feed#{" - #{current_user.name}" if current_user.name.present?}" - xml.link :href => dashboard_url(:atom), :rel => "self", :type => "application/atom+xml" - xml.link :href => dashboard_url, :rel => "alternate", :type => "text/html" + xml.link href: dashboard_url(:atom), rel: "self", type: "application/atom+xml" + xml.link href: dashboard_url, rel: "alternate", type: "text/html" xml.id projects_url xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? @events.each do |event| - if event.proper? - xml.entry do - event_link = event_feed_url(event) - event_title = event_feed_title(event) - event_summary = event_feed_summary(event) - - xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" - xml.link :href => event_link - xml.title truncate(event_title, :length => 80) - xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(event.author_email) - xml.author do |author| - xml.name event.author_name - xml.email event.author_email - end - xml.summary(:type => "xhtml") { |x| x << event_summary unless event_summary.nil? } - end - end + event_to_atom(xml, event) end end diff --git a/app/views/groups/issues.atom.builder b/app/views/groups/issues.atom.builder index f2005193f83..240001967f3 100644 --- a/app/views/groups/issues.atom.builder +++ b/app/views/groups/issues.atom.builder @@ -7,18 +7,7 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://sear xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? @issues.each do |issue| - xml.entry do - xml.id project_issue_url(issue.project, issue) - xml.link :href => project_issue_url(issue.project, issue) - xml.title truncate(issue.title, :length => 80) - xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(issue.author_email) - xml.author do |author| - xml.name issue.author_name - xml.email issue.author_email - end - xml.summary issue.title - end + issue_to_atom(xml, issue) end end diff --git a/app/views/groups/show.atom.builder b/app/views/groups/show.atom.builder index e07bb7d2fb7..e765ea8338d 100644 --- a/app/views/groups/show.atom.builder +++ b/app/views/groups/show.atom.builder @@ -1,28 +1,12 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do xml.title "Group feed - #{@group.name}" - xml.link :href => group_path(@group, :atom), :rel => "self", :type => "application/atom+xml" - xml.link :href => group_path(@group), :rel => "alternate", :type => "text/html" + xml.link href: group_path(@group, :atom), rel: "self", type: "application/atom+xml" + xml.link href: group_path(@group), rel: "alternate", type: "text/html" xml.id projects_url xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? @events.each do |event| - if event.proper? - xml.entry do - event_link = event_feed_url(event) - event_title = event_feed_title(event) - - xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" - xml.link :href => event_link - xml.title truncate(event_title, :length => 80) - xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(event.author_email) - xml.author do |author| - xml.name event.author_name - xml.email event.author_email - end - xml.summary event_title - end - end + event_to_atom(xml, event) end end diff --git a/app/views/projects/issues/index.atom.builder b/app/views/projects/issues/index.atom.builder index 012ba235951..61e651da932 100644 --- a/app/views/projects/issues/index.atom.builder +++ b/app/views/projects/issues/index.atom.builder @@ -7,17 +7,6 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://sear xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? @issues.each do |issue| - xml.entry do - xml.id project_issue_url(@project, issue) - xml.link :href => project_issue_url(@project, issue) - xml.title truncate(issue.title, :length => 80) - xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(issue.author_email) - xml.author do |author| - xml.name issue.author_name - xml.email issue.author_email - end - xml.summary issue.title - end + issue_to_atom(xml, issue) end end diff --git a/app/views/users/show.atom.builder b/app/views/users/show.atom.builder index 0d61a9e8097..b7216a88765 100644 --- a/app/views/users/show.atom.builder +++ b/app/views/users/show.atom.builder @@ -1,29 +1,12 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do xml.title "Activity feed for #{@user.name}" - xml.link :href => user_url(@user, :atom), :rel => "self", :type => "application/atom+xml" - xml.link :href => user_url(@user), :rel => "alternate", :type => "text/html" + xml.link href: user_url(@user, :atom), rel: "self", type: "application/atom+xml" + xml.link href: user_url(@user), rel: "alternate", type: "text/html" xml.id projects_url xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? @events.each do |event| - if event.proper? - xml.entry do - event_link = event_feed_url(event) - event_title = event_feed_title(event) - event_summary = event_feed_summary(event) - - xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" - xml.link :href => event_link - xml.title truncate(event_title, :length => 80) - xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(event.author_email) - xml.author do |author| - xml.name event.author_name - xml.email event.author_email - end - xml.summary(:type => "xhtml") { |x| x << event_summary unless event_summary.nil? } - end - end + event_to_atom(xml, event) end end -- cgit v1.2.1 From b23f71ec4d76bc1a6ed4b6c1add8dbc8fb32eb40 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 5 Dec 2014 15:49:25 +0200 Subject: Set/unset merge request locked_at timestamp after transition Signed-off-by: Dmitriy Zaporozhets --- app/models/merge_request.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'app') diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 7c525b02f48..e558c4164e9 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -70,6 +70,16 @@ class MergeRequest < ActiveRecord::Base transition locked: :reopened end + after_transition any => :locked do |merge_request, transition| + merge_request.locked_at = Time.now + merge_request.save + end + + after_transition :locked => (any - :locked) do |merge_request, transition| + merge_request.locked_at = nil + merge_request.save + end + state :opened state :reopened state :closed -- cgit v1.2.1 From 6487419364fa9c179e24028d85b2be10d574067f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 5 Dec 2014 16:02:08 +0200 Subject: Automatically close merge requests that were locker for 1 day Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects/merge_requests_controller.rb | 5 +++++ app/models/merge_request.rb | 4 ++++ app/views/projects/merge_requests/show/_state_widget.html.haml | 6 ++++-- 3 files changed, 13 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 20a733b10e1..bd43d15984d 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -225,6 +225,11 @@ class Projects::MergeRequestsController < Projects::ApplicationController @allowed_to_merge = allowed_to_merge? @show_merge_controls = @merge_request.open? && @commits.any? && @allowed_to_merge @source_branch = @merge_request.source_project.repository.find_branch(@merge_request.source_branch).try(:name) + + if @merge_request.locked_long_ago? + @merge_request.unlock_mr + @merge_request.close + end end def allowed_to_merge? diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index e558c4164e9..2cc427d35c2 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -346,4 +346,8 @@ class MergeRequest < ActiveRecord::Base source_project.repository.branch_names end end + + def locked_long_ago? + locked_at && locked_at < (Time.now - 1.day) + end end diff --git a/app/views/projects/merge_requests/show/_state_widget.html.haml b/app/views/projects/merge_requests/show/_state_widget.html.haml index 87dad6140be..f909948995c 100644 --- a/app/views/projects/merge_requests/show/_state_widget.html.haml +++ b/app/views/projects/merge_requests/show/_state_widget.html.haml @@ -11,8 +11,10 @@ - if @merge_request.closed? %h4 - Closed by #{link_to_member(@project, @merge_request.closed_event.author, avatar: false)} - #{time_ago_with_tooltip(@merge_request.closed_event.created_at)} + Closed + - if @merge_request.closed_event + by #{link_to_member(@project, @merge_request.closed_event.author, avatar: false)} + #{time_ago_with_tooltip(@merge_request.closed_event.created_at)} %p Changes were not merged into target branch - if @merge_request.merged? -- cgit v1.2.1 From db585009be76ed7b00b4298f863333c92b94cf04 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 5 Dec 2014 15:33:22 +0100 Subject: Revert "Merge pull request #7349 from srna/patch-1" This reverts commit b37b71d887e8521b8992aa6e4f789a38b393e55a, reversing changes made to 42a1d8083c77d3803320bbbd0ac1559ff32d2519. --- app/uploaders/attachment_uploader.rb | 4 ---- 1 file changed, 4 deletions(-) (limited to 'app') diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index 29a55b36ca5..b122b6c8658 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -26,10 +26,6 @@ class AttachmentUploader < CarrierWave::Uploader::Base Gitlab.config.gitlab.relative_url_root + "/files/#{model.class.to_s.underscore}/#{model.id}/#{file.filename}" end - def url - Gitlab.config.gitlab.relative_url_root + super unless super.nil? - end - def file_storage? self.class.storage == CarrierWave::Storage::File end -- cgit v1.2.1 From ed2eaf55c1c2402a0a630838901bdddbc11fda47 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 5 Dec 2014 16:59:17 +0200 Subject: Move issues/mr filter to partial Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/_issuable_filter.html.haml | 49 +++++++++++++++++++++ app/views/projects/issues/_issues.html.haml | 50 +--------------------- app/views/projects/merge_requests/index.html.haml | 52 +---------------------- 3 files changed, 52 insertions(+), 99 deletions(-) create mode 100644 app/views/projects/_issuable_filter.html.haml (limited to 'app') diff --git a/app/views/projects/_issuable_filter.html.haml b/app/views/projects/_issuable_filter.html.haml new file mode 100644 index 00000000000..7e6a94a4700 --- /dev/null +++ b/app/views/projects/_issuable_filter.html.haml @@ -0,0 +1,49 @@ +.issues-filters + .dropdown.inline + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-user + %span.light assignee: + - if @assignee.present? + %strong= @assignee.name + - elsif params[:assignee_id] == "0" + Unassigned + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to project_filter_path(assignee_id: nil) do + Any + = link_to project_filter_path(assignee_id: 0) do + Unassigned + - @assignees.sort_by(&:name).each do |user| + %li + = link_to project_filter_path(assignee_id: user.id) do + = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' + = user.name + + .dropdown.inline.prepend-left-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-clock-o + %span.light milestone: + - if @milestone.present? + %strong= @milestone.title + - elsif params[:milestone_id] == "0" + None (backlog) + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to project_filter_path(milestone_id: nil) do + Any + = link_to project_filter_path(milestone_id: 0) do + None (backlog) + - project_active_milestones.each do |milestone| + %li + = link_to project_filter_path(milestone_id: milestone.id) do + %strong= milestone.title + %small.light= milestone.expires_at + + .pull-right + = render 'shared/sort_dropdown' diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 0bff8bdbead..15c84c7ced2 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -1,55 +1,7 @@ .append-bottom-10 .check-all-holder = check_box_tag "check_all_issues", nil, false, class: "check_all_issues left" - .issues-filters - .dropdown.inline - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-user - %span.light assignee: - - if @assignee.present? - %strong= @assignee.name - - elsif params[:assignee_id] == "0" - Unassigned - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(assignee_id: nil) do - Any - = link_to project_filter_path(assignee_id: 0) do - Unassigned - - @assignees.sort_by(&:name).each do |user| - %li - = link_to project_filter_path(assignee_id: user.id) do - = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' - = user.name - - .dropdown.inline.prepend-left-10 - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-clock-o - %span.light milestone: - - if @milestone.present? - %strong= @milestone.title - - elsif params[:milestone_id] == "0" - None (backlog) - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(milestone_id: nil) do - Any - = link_to project_filter_path(milestone_id: 0) do - None (backlog) - - project_active_milestones.each do |milestone| - %li - = link_to project_filter_path(milestone_id: milestone.id) do - %strong= milestone.title - %small.light= milestone.expires_at - - .pull-right - = render 'shared/sort_dropdown' + = render 'projects/issuable_filter' .clearfix .issues_bulk_update.hide diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index a6d90a68b11..b93e0f9da3e 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -5,56 +5,8 @@ = render 'shared/project_filter', project_entities_path: project_merge_requests_path(@project), labels: true, redirect: 'merge_requests', entity: 'merge_request' .col-md-9 - .mr-filters.append-bottom-10 - .dropdown.inline - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-user - %span.light assignee: - - if @assignee.present? - %strong= @assignee.name - - elsif params[:assignee_id] == "0" - Unassigned - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(assignee_id: nil) do - Any - = link_to project_filter_path(assignee_id: 0) do - Unassigned - - @assignees.sort_by(&:name).each do |user| - %li - = link_to project_filter_path(assignee_id: user.id) do - = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' - = user.name - - .dropdown.inline.prepend-left-10 - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-clock-o - %span.light milestone: - - if @milestone.present? - %strong= @milestone.title - - elsif params[:milestone_id] == "0" - None (backlog) - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(milestone_id: nil) do - Any - = link_to project_filter_path(milestone_id: 0) do - None (backlog) - - project_active_milestones.each do |milestone| - %li - = link_to project_filter_path(milestone_id: milestone.id) do - %strong= milestone.title - %small.light= milestone.expires_at - - .pull-right - = render 'shared/sort_dropdown' - + .append-bottom-10 + = render 'projects/issuable_filter' .panel.panel-default %ul.well-list.mr-list = render @merge_requests -- cgit v1.2.1 From e0f30c605bbf0a92f3ddeffdd80d765a5f041a06 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 5 Dec 2014 17:13:07 +0200 Subject: Add author filter for issues & merge requests pages Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects/application_controller.rb | 27 ++++++++++++++++++++++ app/controllers/projects/issues_controller.rb | 16 ++----------- .../projects/merge_requests_controller.rb | 10 +------- app/finders/issuable_finder.rb | 9 ++++++++ app/views/projects/_issuable_filter.html.haml | 23 ++++++++++++++++++ 5 files changed, 62 insertions(+), 23 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb index 7e4580017dd..6b7fe06d59f 100644 --- a/app/controllers/projects/application_controller.rb +++ b/app/controllers/projects/application_controller.rb @@ -29,4 +29,31 @@ class Projects::ApplicationController < ApplicationController redirect_to project_tree_path(@project, @ref), notice: "This action is not allowed unless you are on top of a branch" end end + + def set_filter_variables(collection) + params[:sort] ||= 'newest' + params[:scope] = 'all' if params[:scope].blank? + params[:state] = 'opened' if params[:state].blank? + + @sort = params[:sort].humanize + + assignee_id = params[:assignee_id] + author_id = params[:author_id] + milestone_id = params[:milestone_id] + + if assignee_id.present? && !assignee_id.to_i.zero? + @assignee = @project.team.find(assignee_id) + end + + if author_id.present? && !author_id.to_i.zero? + @author = @project.team.find(assignee_id) + end + + if milestone_id.present? && !milestone_id.to_i.zero? + @milestone = @project.milestones.find(milestone_id) + end + + @assignees = User.where(id: collection.pluck(:assignee_id)) + @authors = User.where(id: collection.pluck(:author_id)) + end end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index c6d526f05c5..22235123826 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -18,18 +18,12 @@ class Projects::IssuesController < Projects::ApplicationController def index terms = params['issue_search'] + set_filter_variables(@project.issues) - @issues = issues_filtered + @issues = IssuesFinder.new.execute(current_user, params.merge(project_id: @project.id)) @issues = @issues.full_search(terms) if terms.present? @issues = @issues.page(params[:page]).per(20) - assignee_id, milestone_id = params[:assignee_id], params[:milestone_id] - @assignee = @project.team.find(assignee_id) if assignee_id.present? && !assignee_id.to_i.zero? - @milestone = @project.milestones.find(milestone_id) if milestone_id.present? && !milestone_id.to_i.zero? - sort_param = params[:sort] || 'newest' - @sort = sort_param.humanize unless sort_param.empty? - @assignees = User.where(id: @project.issues.pluck(:assignee_id)).active - respond_to do |format| format.html format.atom { render layout: false } @@ -127,12 +121,6 @@ class Projects::IssuesController < Projects::ApplicationController return render_404 unless @project.issues_enabled end - def issues_filtered - params[:scope] = 'all' if params[:scope].blank? - params[:state] = 'opened' if params[:state].blank? - @issues = IssuesFinder.new.execute(current_user, params.merge(project_id: @project.id)) - end - # Since iids are implemented only in 6.1 # user may navigate to issue page using old global ids. # diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index bd43d15984d..4d6f41e9de5 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -17,18 +17,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController before_filter :authorize_modify_merge_request!, only: [:close, :edit, :update, :sort] def index - params[:sort] ||= 'newest' - params[:scope] = 'all' if params[:scope].blank? - params[:state] = 'opened' if params[:state].blank? + set_filter_variables(@project.merge_requests) @merge_requests = MergeRequestsFinder.new.execute(current_user, params.merge(project_id: @project.id)) @merge_requests = @merge_requests.page(params[:page]).per(20) - - @sort = params[:sort].humanize - assignee_id, milestone_id = params[:assignee_id], params[:milestone_id] - @assignee = @project.team.find(assignee_id) if assignee_id.present? && !assignee_id.to_i.zero? - @milestone = @project.milestones.find(milestone_id) if milestone_id.present? && !milestone_id.to_i.zero? - @assignees = User.where(id: @project.merge_requests.pluck(:assignee_id)) end def show diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb index d0574240511..e1477510065 100644 --- a/app/finders/issuable_finder.rb +++ b/app/finders/issuable_finder.rb @@ -33,6 +33,7 @@ class IssuableFinder items = by_search(items) items = by_milestone(items) items = by_assignee(items) + items = by_author(items) items = by_label(items) items = sort(items) end @@ -125,6 +126,14 @@ class IssuableFinder items end + def by_author(items) + if params[:author_id].present? + items = items.where(author_id: (params[:author_id] == '0' ? nil : params[:author_id])) + end + + items + end + def by_label(items) if params[:label_name].present? label_names = params[:label_name].split(",") diff --git a/app/views/projects/_issuable_filter.html.haml b/app/views/projects/_issuable_filter.html.haml index 7e6a94a4700..b3e5efd938f 100644 --- a/app/views/projects/_issuable_filter.html.haml +++ b/app/views/projects/_issuable_filter.html.haml @@ -22,6 +22,29 @@ = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' = user.name + .dropdown.inline.prepend-left-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-user + %span.light author: + - if @author.present? + %strong= @author.name + - elsif params[:author_id] == "0" + Unassigned + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to project_filter_path(author_id: nil) do + Any + = link_to project_filter_path(author_id: 0) do + Unassigned + - @authors.sort_by(&:name).each do |user| + %li + = link_to project_filter_path(author_id: user.id) do + = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' + = user.name + .dropdown.inline.prepend-left-10 %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-clock-o -- cgit v1.2.1 From 7cefd9c6ef4fbbd8eb297ac03e2fa3e43c44f1a1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 5 Dec 2014 18:10:25 +0200 Subject: Prevent 500 on MR page if merge_event missing Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/merge_requests/show/_state_widget.html.haml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/show/_state_widget.html.haml b/app/views/projects/merge_requests/show/_state_widget.html.haml index f909948995c..a4f2a890969 100644 --- a/app/views/projects/merge_requests/show/_state_widget.html.haml +++ b/app/views/projects/merge_requests/show/_state_widget.html.haml @@ -19,8 +19,10 @@ - if @merge_request.merged? %h4 - Merged by #{link_to_member(@project, @merge_request.merge_event.author, avatar: false)} - #{time_ago_with_tooltip(@merge_request.merge_event.created_at)} + Merged + - if @merge_request.merge_event + by #{link_to_member(@project, @merge_request.merge_event.author, avatar: false)} + #{time_ago_with_tooltip(@merge_request.merge_event.created_at)} = render "projects/merge_requests/show/remove_source_branch" - if @merge_request.locked? @@ -46,4 +48,3 @@ Accepting this merge request will close #{@closes_issues.size == 1 ? 'issue' : 'issues'} = succeed '.' do != gfm(issues_sentence(@closes_issues)) - -- cgit v1.2.1 From 04fa03a7d84581d4c5817920456d6b1dc4cb1a58 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 6 Dec 2014 18:22:19 +0200 Subject: Bolder event title and lighter color for event body Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/events.scss | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 485a9c46610..a766d6e77ab 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -47,7 +47,7 @@ .event-title { @include str-truncated(72%); color: #333; - font-weight: normal; + font-weight: 500; font-size: 14px; .author_name { color: #333; @@ -56,12 +56,9 @@ .event-body { margin-left: 35px; margin-right: 100px; + color: #777; - .event-info { - color: #666; - } .event-note { - color: #666; margin-top: 5px; .md { @@ -72,7 +69,7 @@ border: none; background: #f9f9f9; border-radius: 0; - color: #666; + color: #777; margin: 0 20px; } @@ -120,7 +117,6 @@ padding: 3px; padding-left: 0; border: none; - color: #666; .commit-row-title { font-size: 12px; } -- cgit v1.2.1 From 0d5265bbec0ffec004fab0b85b81a0a1bea3b471 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 7 Dec 2014 12:29:37 +0200 Subject: Execute project services asynchronously Signed-off-by: Dmitriy Zaporozhets --- app/models/project.rb | 10 ++-------- app/models/service.rb | 4 ++++ app/workers/project_service_worker.rb | 9 +++++++++ 3 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 app/workers/project_service_worker.rb (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index daf4bdd0aad..32b0145ca24 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -390,14 +390,8 @@ class Project < ActiveRecord::Base end def execute_services(data) - services.each do |service| - - # Call service hook only if it is active - begin - service.execute(data) if service.active - rescue => e - logger.error(e) - end + services.select(&:active).each do |service| + service.async_execute(data) end end diff --git a/app/models/service.rb b/app/models/service.rb index c489c1e96e1..71c8aa39e45 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -82,4 +82,8 @@ class Service < ActiveRecord::Base } end end + + def async_execute(data) + Sidekiq::Client.enqueue(ProjectServiceWorker, id, data) + end end diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb new file mode 100644 index 00000000000..cc0a7f25664 --- /dev/null +++ b/app/workers/project_service_worker.rb @@ -0,0 +1,9 @@ +class ProjectServiceWorker + include Sidekiq::Worker + + sidekiq_options queue: :project_web_hook + + def perform(hook_id, data) + Service.find(hook_id).execute(data) + end +end -- cgit v1.2.1 From de7c3291e9e7d4a8f542c912c7575ec97a3a78df Mon Sep 17 00:00:00 2001 From: Kirill Zaitsev Date: Thu, 20 Nov 2014 09:29:56 +0300 Subject: Trigger merge request hook when source updated --- app/services/merge_requests/refresh_service.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index baf0936cc3d..e557dd3ab07 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -51,7 +51,7 @@ module MergeRequests if merge_request.source_branch == @branch_name || force_push? merge_request.reload_code - merge_request.mark_as_unchecked + update_merge_request(merge_request) else mr_commit_ids = merge_request.commits.map(&:id) push_commit_ids = @commits.map(&:id) @@ -59,14 +59,20 @@ module MergeRequests if matches.any? merge_request.reload_code - merge_request.mark_as_unchecked + update_merge_request(merge_request) else - merge_request.mark_as_unchecked + update_merge_request(merge_request) end end end end + def update_merge_request(merge_request) + MergeRequests::UpdateService.new( + merge_request.target_project, + @current_user, merge_status: 'unchecked').execute(merge_request) + end + # Add comment about pushing new commits to merge requests def comment_mr_with_commits merge_requests = @project.origin_merge_requests.opened.where(source_branch: @branch_name).to_a -- cgit v1.2.1 From eceda17f0911bd62dba83d193df680f7cedc8cd9 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 10 Dec 2014 17:24:11 +0100 Subject: Markdown dropzone image icon should not be clickable. --- app/assets/stylesheets/generic/markdown_area.scss | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/markdown_area.scss b/app/assets/stylesheets/generic/markdown_area.scss index fbfa72c5e5e..b174392dbfc 100644 --- a/app/assets/stylesheets/generic/markdown_area.scss +++ b/app/assets/stylesheets/generic/markdown_area.scss @@ -20,6 +20,7 @@ opacity: 0; font-size: 50px; transition: opacity 200ms ease-in-out; + pointer-events: none; } .div-dropzone-spinner { -- cgit v1.2.1 From c33d078f53244c5b2d4d6cd49f62befed8e2471a Mon Sep 17 00:00:00 2001 From: DJ Mountney Date: Wed, 10 Dec 2014 15:51:54 -0800 Subject: Use the font variables instead of hardcoding fonts in notes. --- app/assets/stylesheets/sections/notes.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 783f6ae02d3..82f1a6b633f 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -76,7 +76,7 @@ ul.notes { .diff-file .notes_holder { font-size: 13px; line-height: 18px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: $regular_font; td { border: 1px solid #ddd; -- cgit v1.2.1 From 2ff60660886008eef2a39bf1f2dcc249bbec8232 Mon Sep 17 00:00:00 2001 From: Miz Date: Thu, 11 Dec 2014 14:18:18 +0200 Subject: Add commit dates to repository-push email tempalte --- app/views/notify/repository_push_email.html.haml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/notify/repository_push_email.html.haml b/app/views/notify/repository_push_email.html.haml index 3cf50bf0826..d678147ec5d 100644 --- a/app/views/notify/repository_push_email.html.haml +++ b/app/views/notify/repository_push_email.html.haml @@ -6,7 +6,9 @@ - @commits.each do |commit| %li %strong #{link_to commit.short_id, project_commit_url(@project, commit)} - %span by #{commit.author_name} + %div + %span by #{commit.author_name} + %i at #{commit.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ")} %pre #{commit.safe_message} %h4 Changes: -- cgit v1.2.1 From f28a12a559ef5492b583f0ae5dff5dcb49c7afe1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 12 Dec 2014 13:15:42 +0200 Subject: Add strict validation to snippet file names Signed-off-by: Dmitriy Zaporozhets --- app/models/snippet.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/snippet.rb b/app/models/snippet.rb index a47fbca3260..44fbff345b4 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -29,7 +29,9 @@ class Snippet < ActiveRecord::Base validates :author, presence: true validates :title, presence: true, length: { within: 0..255 } - validates :file_name, presence: true, length: { within: 0..255 } + validates :file_name, presence: true, length: { within: 0..255 }, + format: { with: Gitlab::Regex.path_regex, + message: Gitlab::Regex.path_regex_message } validates :content, presence: true validates :visibility_level, inclusion: { in: Gitlab::VisibilityLevel.values } @@ -72,7 +74,7 @@ class Snippet < ActiveRecord::Base def visibility_level_field visibility_level - end + end class << self def search(query) -- cgit v1.2.1 From 118bd7178b2be5f8a8fbcfa6af66e9e6d299b658 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 12 Dec 2014 13:28:48 +0200 Subject: Sanitize snippet file name in raw headers Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects/snippets_controller.rb | 2 +- app/controllers/snippets_controller.rb | 2 +- app/models/snippet.rb | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb index 9d5dd8a95cc..25c887deafa 100644 --- a/app/controllers/projects/snippets_controller.rb +++ b/app/controllers/projects/snippets_controller.rb @@ -68,7 +68,7 @@ class Projects::SnippetsController < Projects::ApplicationController @snippet.content, type: 'text/plain; charset=utf-8', disposition: 'inline', - filename: @snippet.file_name + filename: @snippet.sanitized_file_name ) end diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb index bf3312fedc8..312e561b522 100644 --- a/app/controllers/snippets_controller.rb +++ b/app/controllers/snippets_controller.rb @@ -79,7 +79,7 @@ class SnippetsController < ApplicationController @snippet.content, type: 'text/plain; charset=utf-8', disposition: 'inline', - filename: @snippet.file_name + filename: @snippet.sanitized_file_name ) end diff --git a/app/models/snippet.rb b/app/models/snippet.rb index 44fbff345b4..9aba42a0622 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -64,6 +64,10 @@ class Snippet < ActiveRecord::Base file_name end + def sanitized_file_name + file_name.gsub(/[^a-zA-Z0-9_\-\.]+/, '') + end + def mode nil end -- cgit v1.2.1 From 2f13d4daa30433b9db168f291d870260e401e44a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 12 Dec 2014 21:49:51 +0200 Subject: Implement sidebar navigation for project area Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/sidebar.scss | 120 +++++++++++++++++++++++++++ app/views/layouts/nav/_project.html.haml | 7 +- app/views/layouts/project_settings.html.haml | 18 ++-- app/views/layouts/projects.html.haml | 15 ++-- app/views/projects/_settings_nav.html.haml | 2 +- 5 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 app/assets/stylesheets/sections/sidebar.scss (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss new file mode 100644 index 00000000000..fcb8fa4d22b --- /dev/null +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -0,0 +1,120 @@ +body.project { + padding: 0; + + header .container { + width: 100% !important; + } +} + +.page-with-sidebar { + background: #F5F5F5; + + header .navbar-inner { + padding: 0px 20px; + } +} + +.sidebar-wrapper { + z-index: 1000; + position: absolute; + left: 250px; + width: 0; + height: 100%; + margin-left: -250px; + overflow-y: auto; + background: #F5F5F5; +} + +.content-wrapper { + width: 100%; + padding: 15px; + background: #FFF; +} + +.nav-sidebar { + position: fixed; + top: 45px; + width: 250px; + margin: 0; + list-style: none; + margin-top: 20px; +} + +.nav-sidebar li a .count { + float: right; + background: #eee; + padding: 2px 8px; + @include border-radius(6px); +} + +.nav-sidebar li.active a { + color: #333; + background: #EEE; + font-weight: bold; +} + +.nav-sidebar li { + &.separate-item { + border-top: 1px solid #ddd; + padding-top: 10px; + margin-top: 10px; + } + + a { + color: #666; + display: block; + text-decoration: none; + padding: 6px 15px; + font-size: 13px; + line-height: 20px; + text-shadow: 0 1px 2px #FFF; + padding-left: 30px; + + &:hover { + text-decoration: none; + color: #333; + background: #DDD; + } + + &:active, &:focus { + text-decoration: none; + } + } +} + +.project-settings-nav { + margin-left: 0px; + padding-left: 0px; + + li { + line-height: 28px; + font-size: 12px; + list-style: none; + + a { + padding: 5px 15px; + font-size: 12px; + padding-left: 30px; + } + } +} + +@media(min-width:768px) { + .page-with-sidebar { + padding-left: 250px; + } + + .sidebar-wrapper { + width: 250px; + } + + .content-wrapper { + padding: 20px; + } +} + +/** TODO: REMOVE **/ +.profiler-results { + display: none; +} + diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 6cb2a82bac8..6a8b65b4c78 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -1,4 +1,4 @@ -%ul.project-navigation +%ul.project-navigation.nav.nav-sidebar = nav_link(path: 'projects#show', html_options: {class: "home"}) do = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do Project @@ -40,6 +40,9 @@ = link_to 'Snippets', project_snippets_path(@project), class: 'shortcuts-snippets' - if project_nav_tab? :settings - = nav_link(html_options: {class: "#{project_tab_class}"}) do + = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do = link_to edit_project_path(@project), class: "stat-tab tab " do Settings + %i.fa.fa-angle-down + - if defined?(settings) && settings + = render 'projects/settings_nav' diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index c8b8f4ba971..0dcadc2d9c6 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -7,13 +7,13 @@ = render "layouts/init_auto_complete" - if can?(current_user, :download_code, @project) = render 'shared/no_ssh' - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/project' - .container - .content - = render "layouts/flash" - .row - .col-md-2 - = render "projects/settings_nav" - .col-md-10 + + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/project', settings: true + .content-wrapper + .container-fluid + .content + = render "layouts/flash" = yield + = yield :embedded_scripts diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml index 8ad2f165946..834f078330c 100644 --- a/app/views/layouts/projects.html.haml +++ b/app/views/layouts/projects.html.haml @@ -7,10 +7,13 @@ = render "layouts/init_auto_complete" - if can?(current_user, :download_code, @project) = render 'shared/no_ssh' - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/project' - .container - .content - = render "layouts/flash" - = yield + + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/project' + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + = yield = yield :embedded_scripts diff --git a/app/views/projects/_settings_nav.html.haml b/app/views/projects/_settings_nav.html.haml index 2008f8c558d..821bc237779 100644 --- a/app/views/projects/_settings_nav.html.haml +++ b/app/views/projects/_settings_nav.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-pills.nav-stacked.nav-stacked-menu.append-bottom-20.project-settings-nav +%ul.project-settings-nav = nav_link(path: 'projects#edit') do = link_to edit_project_path(@project), class: "stat-tab tab " do %i.fa.fa-pencil-square-o -- cgit v1.2.1 From 6ef75dc77854133db0ef90c30f1a07575692b801 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 12 Dec 2014 22:13:59 +0200 Subject: Style app logo for sidenav Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/sidebar.scss | 43 ++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index fcb8fa4d22b..48b6aad4c67 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -1,17 +1,48 @@ body.project { padding: 0; + &.ui_mars { + .app_logo { + background-color: #24272D; + } + } + + &.ui_color { + .app_logo { + background-color: #325; + } + } + + &.ui_basic { + .app_logo { + background-color: #DDD; + } + } + + &.ui_modern { + .app_logo { + background-color: #017855; + } + } + + &.ui_gray { + .app_logo { + background-color: #222; + } + } + header .container { width: 100% !important; + padding-left: 0px; + + .separator { + display: none; + } } } .page-with-sidebar { background: #F5F5F5; - - header .navbar-inner { - padding: 0px 20px; - } } .sidebar-wrapper { @@ -68,7 +99,7 @@ body.project { font-size: 13px; line-height: 20px; text-shadow: 0 1px 2px #FFF; - padding-left: 30px; + padding-left: 67px; &:hover { text-decoration: none; @@ -94,7 +125,7 @@ body.project { a { padding: 5px 15px; font-size: 12px; - padding-left: 30px; + padding-left: 67px; } } } -- cgit v1.2.1 From 4eb3c47d4ec3e6750ae79e14eb008ce92fda96fd Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Sun, 14 Dec 2014 15:13:09 +0100 Subject: Fixed a lot of already defined notices Signed-off-by: Jeroen van Baarsen --- app/models/commit.rb | 8 ++++---- app/models/project_wiki.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/models/commit.rb b/app/models/commit.rb index 212229649fc..37dd371ec00 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -10,12 +10,12 @@ class Commit # Used to prevent 500 error on huge commits by suppressing diff # # User can force display of diff above this size - DIFF_SAFE_FILES = 100 - DIFF_SAFE_LINES = 5000 + DIFF_SAFE_FILES = 100 unless defined?(DIFF_SAFE_FILES) + DIFF_SAFE_LINES = 5000 unless defined?(DIFF_SAFE_LINES) # Commits above this size will not be rendered in HTML - DIFF_HARD_LIMIT_FILES = 1000 - DIFF_HARD_LIMIT_LINES = 50000 + DIFF_HARD_LIMIT_FILES = 1000 unless defined?(DIFF_HARD_LIMIT_FILES) + DIFF_HARD_LIMIT_LINES = 50000 unless defined?(DIFF_HARD_LIMIT_LINES) class << self def decorate(commits) diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index 770a26ed894..f8a28ca9866 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -5,7 +5,7 @@ class ProjectWiki 'Markdown' => :markdown, 'RDoc' => :rdoc, 'AsciiDoc' => :asciidoc - } + } unless defined?(MARKUPS) class CouldNotCreateWikiError < StandardError; end -- cgit v1.2.1 From c4a56797a4c3a818c0ac6e57e2ea3acb76f3f1eb Mon Sep 17 00:00:00 2001 From: skv-headless Date: Mon, 15 Dec 2014 16:10:56 +0300 Subject: transfer error handler --- app/assets/javascripts/application.js.coffee | 6 ------ app/controllers/projects_controller.rb | 3 +++ app/views/projects/transfer.js.haml | 7 +------ 3 files changed, 4 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index e9a28c12159..4cda8b75d8e 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -51,12 +51,6 @@ window.ajaxGet = (url) -> window.showAndHide = (selector) -> -window.errorMessage = (message) -> - ehtml = $("

") - ehtml.addClass("error_message") - ehtml.html(message) - ehtml - window.split = (val) -> return val.split( /,\s*/ ) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index fcff6952d38..e541b6fd872 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -44,6 +44,9 @@ class ProjectsController < ApplicationController def transfer ::Projects::TransferService.new(project, current_user, project_params).execute + if @project.errors[:namespace_id].present? + flash[:alert] = @project.errors[:namespace_id].first + end end def show diff --git a/app/views/projects/transfer.js.haml b/app/views/projects/transfer.js.haml index 10b0de98c04..6d083c5c516 100644 --- a/app/views/projects/transfer.js.haml +++ b/app/views/projects/transfer.js.haml @@ -1,7 +1,2 @@ -- if @project.errors[:namespace_id].present? - :plain - $("#tab-transfer .errors-holder").replaceWith(errorMessage('#{escape_javascript(@project.errors[:namespace_id].first)}')); - $("#tab-transfer .form-actions input").removeAttr('disabled').removeClass('disabled'); -- else - :plain +:plain location.href = "#{edit_project_path(@project)}"; -- cgit v1.2.1 From 4ab728bfe89adbc8f9d430e80f0582b1775a50d5 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 15 Dec 2014 16:31:23 +0200 Subject: Fix random Argument error when update note In some strange cases Ruby thinks `system` is not AR field but Kernel.system call and raises exception during save. It should prevent this random wierd behaviour Signed-off-by: Dmitriy Zaporozhets --- app/models/note.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/note.rb b/app/models/note.rb index 5bf645bbd1d..5996298be22 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -502,6 +502,6 @@ class Note < ActiveRecord::Base end def editable? - !system + !read_attribute(:system) end end -- cgit v1.2.1 From 5f63c00598a9ec79dc03fe016b525b73fcb78112 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 15 Dec 2014 17:46:36 +0200 Subject: Fix graph and settings highlight Signed-off-by: Dmitriy Zaporozhets --- .../javascripts/stat_graph_contributors_graph.js.coffee | 4 ++-- app/assets/stylesheets/sections/sidebar.scss | 16 +++++++++++----- app/views/layouts/nav/_project.html.haml | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/stat_graph_contributors_graph.js.coffee b/app/assets/javascripts/stat_graph_contributors_graph.js.coffee index 9952fa0b00a..8b82d20c6c2 100644 --- a/app/assets/javascripts/stat_graph_contributors_graph.js.coffee +++ b/app/assets/javascripts/stat_graph_contributors_graph.js.coffee @@ -46,7 +46,7 @@ class @ContributorsGraph class @ContributorsMasterGraph extends ContributorsGraph constructor: (@data) -> - @width = $('.container').width() - 70 + @width = $('.container').width() - 345 @height = 200 @x = null @y = null @@ -119,7 +119,7 @@ class @ContributorsMasterGraph extends ContributorsGraph class @ContributorsAuthorGraph extends ContributorsGraph constructor: (@data) -> - @width = $('.container').width()/2 - 100 + @width = $('.container').width()/2 - 225 @height = 200 @x = null @y = null diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 48b6aad4c67..d23ce7d236a 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -74,14 +74,20 @@ body.project { .nav-sidebar li a .count { float: right; background: #eee; - padding: 2px 8px; + padding: 0px 8px; @include border-radius(6px); } -.nav-sidebar li.active a { - color: #333; - background: #EEE; - font-weight: bold; +.nav-sidebar li { + &.active a { + color: #333; + background: #EEE; + font-weight: bold; + + &.no-highlight { + background: none; + } + } } .nav-sidebar li { diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 6a8b65b4c78..05d637f2124 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -41,7 +41,7 @@ - if project_nav_tab? :settings = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_project_path(@project), class: "stat-tab tab " do + = link_to edit_project_path(@project), class: "stat-tab tab no-highlight" do Settings %i.fa.fa-angle-down - if defined?(settings) && settings -- cgit v1.2.1 From 5f797be0e8a8e5372aea439be05f25ff88fe3cbf Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 15 Dec 2014 18:06:03 +0200 Subject: Mobile UI fixes for sidebar nav Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/header.scss | 2 -- app/assets/stylesheets/sections/sidebar.scss | 25 +++++++++++++++---------- app/views/layouts/nav/_project.html.haml | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index 9ad1a1db2cd..dc23272b481 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -52,8 +52,6 @@ header { border-width: 0; font-size: 18px; - .app_logo { margin-left: -15px; } - .title { @include str-truncated(70%); } diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index d23ce7d236a..188f40fe4f9 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -47,11 +47,6 @@ body.project { .sidebar-wrapper { z-index: 1000; - position: absolute; - left: 250px; - width: 0; - height: 100%; - margin-left: -250px; overflow-y: auto; background: #F5F5F5; } @@ -63,12 +58,12 @@ body.project { } .nav-sidebar { - position: fixed; - top: 45px; - width: 250px; margin: 0; list-style: none; - margin-top: 20px; + + &.navbar-collapse { + padding: 0px !important; + } } .nav-sidebar li a .count { @@ -143,6 +138,17 @@ body.project { .sidebar-wrapper { width: 250px; + position: absolute; + left: 250px; + height: 100%; + margin-left: -250px; + + .nav-sidebar { + margin-top: 20px; + position: fixed; + top: 45px; + width: 250px; + } } .content-wrapper { @@ -154,4 +160,3 @@ body.project { .profiler-results { display: none; } - diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 05d637f2124..000bb1475db 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -1,4 +1,4 @@ -%ul.project-navigation.nav.nav-sidebar +%ul.project-navigation.nav.nav-sidebar.navbar-collapse.collapse = nav_link(path: 'projects#show', html_options: {class: "home"}) do = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do Project -- cgit v1.2.1 From 7b71a9e2212c72b21ca38fa82237c1c51d2aa6ff Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 15 Dec 2014 20:00:44 +0200 Subject: Add icons to project sidenav Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/events.scss | 11 +++++++++++ app/assets/stylesheets/sections/sidebar.scss | 6 ++++++ app/views/layouts/nav/_project.html.haml | 29 ++++++++++++++++++++++------ 3 files changed, 40 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index a766d6e77ab..717f17dc601 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -171,6 +171,17 @@ } } +.project .event_filter { + position: static; + float: left; + width: 100%; + margin-left: 0; + a { + margin-right: 10px; + width: 50px; + } +} + /* * Last push widget */ diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 188f40fe4f9..9db56055f24 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -111,6 +111,11 @@ body.project { &:active, &:focus { text-decoration: none; } + + i { + width: 20px; + color: #999; + } } } @@ -153,6 +158,7 @@ body.project { .content-wrapper { padding: 20px; + border-left: 1px solid #EAEAEA; } } diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 000bb1475db..c9ae3f5ffff 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -1,26 +1,37 @@ %ul.project-navigation.nav.nav-sidebar.navbar-collapse.collapse = nav_link(path: 'projects#show', html_options: {class: "home"}) do = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do + %i.fa.fa-dashboard Project - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do - = link_to 'Files', project_tree_path(@project, @ref || @repository.root_ref), class: 'shortcuts-tree' + = link_to project_tree_path(@project, @ref || @repository.root_ref), class: 'shortcuts-tree' do + %i.fa.fa-files-o + Files + - if project_nav_tab? :commits = nav_link(controller: %w(commit commits compare repositories tags branches)) do - = link_to "Commits", project_commits_path(@project, @ref || @repository.root_ref), class: 'shortcuts-commits' + = link_to project_commits_path(@project, @ref || @repository.root_ref), class: 'shortcuts-commits' do + %i.fa.fa-history + Commits - if project_nav_tab? :network = nav_link(controller: %w(network)) do - = link_to "Network", project_network_path(@project, @ref || @repository.root_ref), class: 'shortcuts-network' + = link_to project_network_path(@project, @ref || @repository.root_ref), class: 'shortcuts-network' do + %i.fa.fa-code-fork + Network - if project_nav_tab? :graphs = nav_link(controller: %w(graphs)) do - = link_to "Graphs", project_graph_path(@project, @ref || @repository.root_ref), class: 'shortcuts-graphs' + = link_to project_graph_path(@project, @ref || @repository.root_ref), class: 'shortcuts-graphs' do + %i.fa.fa-area-chart + Graphs - if project_nav_tab? :issues = nav_link(controller: %w(issues milestones labels)) do = link_to url_for_project_issues, class: 'shortcuts-issues' do + %i.fa.fa-exclamation-circle Issues - if @project.used_default_issues_tracker? %span.count.issue_counter= @project.issues.opened.count @@ -28,20 +39,26 @@ - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do = link_to project_merge_requests_path(@project), class: 'shortcuts-merge_requests' do + %i.fa.fa-tasks Merge Requests %span.count.merge_counter= @project.merge_requests.opened.count - if project_nav_tab? :wiki = nav_link(controller: :wikis) do - = link_to 'Wiki', project_wiki_path(@project, :home), class: 'shortcuts-wiki' + = link_to project_wiki_path(@project, :home), class: 'shortcuts-wiki' do + %i.fa.fa-book + Wiki - if project_nav_tab? :snippets = nav_link(controller: :snippets) do - = link_to 'Snippets', project_snippets_path(@project), class: 'shortcuts-snippets' + = link_to project_snippets_path(@project), class: 'shortcuts-snippets' do + %i.fa.fa-file-text-o + Snippets - if project_nav_tab? :settings = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do = link_to edit_project_path(@project), class: "stat-tab tab no-highlight" do + %i.fa.fa-cogs Settings %i.fa.fa-angle-down - if defined?(settings) && settings -- cgit v1.2.1 From f06f69b9da81337db14324783b45ea5f55fcf735 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Sun, 14 Dec 2014 19:01:59 -0600 Subject: Add theme type css class --- app/helpers/application_helper.rb | 4 ++++ app/views/layouts/admin.html.haml | 2 +- app/views/layouts/application.html.haml | 2 +- app/views/layouts/errors.html.haml | 2 +- app/views/layouts/explore.html.haml | 2 +- app/views/layouts/group.html.haml | 2 +- app/views/layouts/navless.html.haml | 2 +- app/views/layouts/profile.html.haml | 2 +- app/views/layouts/project_settings.html.haml | 2 +- app/views/layouts/projects.html.haml | 2 +- app/views/layouts/public_group.html.haml | 2 +- app/views/layouts/public_projects.html.haml | 2 +- app/views/layouts/public_users.html.haml | 2 +- app/views/layouts/search.html.haml | 2 +- app/views/profiles/update.js.erb | 4 ++-- 15 files changed, 19 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 021bd0a494c..01aa4a60d4c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -114,6 +114,10 @@ module ApplicationHelper Gitlab::Theme.css_class_by_id(current_user.try(:theme_id)) end + def theme_type + Gitlab::Theme.type_css_class_by_id(current_user.try(:theme_id)) + end + def user_color_scheme_class COLOR_SCHEMES[current_user.try(:color_scheme_id)] if defined?(current_user) end diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 207ab22f4c7..744ecaa0297 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Admin area" - %body{class: "#{app_theme} admin", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} admin", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "Admin area" %nav.main-nav.navbar-collapse.collapse diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 7d0819aa93e..e35a3915d0e 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Dashboard" - %body{class: "#{app_theme} application", :'data-page' => body_data_page } + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page } = render "layouts/broadcast" = render "layouts/head_panel", title: "Dashboard" %nav.main-nav.navbar-collapse.collapse diff --git a/app/views/layouts/errors.html.haml b/app/views/layouts/errors.html.haml index 16df9c10fbb..e7d875173e6 100644 --- a/app/views/layouts/errors.html.haml +++ b/app/views/layouts/errors.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Error" - %body{class: "#{app_theme} application"} + %body{class: "#{app_theme} #{theme_type} application"} = render "layouts/head_panel", title: "" if current_user .container.navless-container = render "layouts/flash" diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index d023846c5eb..9813d846542 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -2,7 +2,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: page_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" - if current_user = render "layouts/head_panel", title: page_title diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index f22fb236cb5..6ad285e2468 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "group: #{@group.name}" %nav.main-nav.navbar-collapse.collapse diff --git a/app/views/layouts/navless.html.haml b/app/views/layouts/navless.html.haml index 2c5fffe384f..730f3d09277 100644 --- a/app/views/layouts/navless.html.haml +++ b/app/views/layouts/navless.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: @title .container.navless-container diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 1d0ab84d26f..c57047bb1f3 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Profile" - %body{class: "#{app_theme} profile", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} profile", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "Profile" %nav.main-nav.navbar-collapse.collapse diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index c8b8f4ba971..fd233452215 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} #{theme_type} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml index 8ad2f165946..fb64c40e8bb 100644 --- a/app/views/layouts/projects.html.haml +++ b/app/views/layouts/projects.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: project_head_title - %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} #{theme_type} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" diff --git a/app/views/layouts/public_group.html.haml b/app/views/layouts/public_group.html.haml index a289b784725..b97b0cf92cb 100644 --- a/app/views/layouts/public_group.html.haml +++ b/app/views/layouts/public_group.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: "group: #{@group.name}" %nav.main-nav.navbar-collapse.collapse diff --git a/app/views/layouts/public_projects.html.haml b/app/views/layouts/public_projects.html.haml index 2a9230244f8..4819b9b135f 100644 --- a/app/views/layouts/public_projects.html.haml +++ b/app/views/layouts/public_projects.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: project_title(@project) %nav.main-nav.navbar-collapse.collapse diff --git a/app/views/layouts/public_users.html.haml b/app/views/layouts/public_users.html.haml index 4aa258fea0d..fdba0f099a9 100644 --- a/app/views/layouts/public_users.html.haml +++ b/app/views/layouts/public_users.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: @title .container.navless-container diff --git a/app/views/layouts/search.html.haml b/app/views/layouts/search.html.haml index 084ff7ec830..6d001e7ee1c 100644 --- a/app/views/layouts/search.html.haml +++ b/app/views/layouts/search.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Search" - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "Search" .container.navless-container diff --git a/app/views/profiles/update.js.erb b/app/views/profiles/update.js.erb index 04b5cf4827d..e664ac2a52a 100644 --- a/app/views/profiles/update.js.erb +++ b/app/views/profiles/update.js.erb @@ -1,6 +1,6 @@ // Remove body class for any previous theme, re-add current one -$('body').removeClass('ui_basic ui_mars ui_modern ui_gray ui_color') -$('body').addClass('<%= app_theme %>') +$('body').removeClass('ui_basic ui_mars ui_modern ui_gray ui_color light_theme dark_theme') +$('body').addClass('<%= app_theme %> <%= theme_type %>') // Re-render the header to reflect the new theme $('header').html('<%= escape_javascript(render("layouts/head_panel", title: "Profile")) %>') -- cgit v1.2.1 From f3f27fee88a30899564ed32a2968b0ac8e31451f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 16 Dec 2014 16:58:15 +0200 Subject: Left-side navigation for group layout Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/events.scss | 2 +- app/assets/stylesheets/sections/sidebar.scss | 4 +- app/helpers/groups_helper.rb | 10 +++- app/views/groups/_settings_nav.html.haml | 2 +- app/views/groups/edit.html.haml | 70 +++++++++++++--------------- app/views/groups/projects.html.haml | 52 ++++++++++----------- app/views/layouts/group.html.haml | 18 ++++--- app/views/layouts/nav/_group.html.haml | 18 +++++-- app/views/layouts/project_settings.html.haml | 2 +- app/views/layouts/projects.html.haml | 2 +- app/views/projects/_settings_nav.html.haml | 2 +- 11 files changed, 98 insertions(+), 84 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 717f17dc601..11b212c5a5b 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -171,7 +171,7 @@ } } -.project .event_filter { +.sidenav .event_filter { position: static; float: left; width: 100%; diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 9db56055f24..a267869c0dd 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -1,4 +1,4 @@ -body.project { +body.sidenav { padding: 0; &.ui_mars { @@ -119,7 +119,7 @@ body.project { } } -.project-settings-nav { +.sidebar-subnav { margin-left: 0px; padding-left: 0px; diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index 0dc53dedeb7..975cdeda1bc 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -6,7 +6,7 @@ module GroupsHelper def leave_group_message(group) "Are you sure you want to leave \"#{group}\" group?" end - + def should_user_see_group_roles?(user, group) if user user.is_admin? || group.members.exists?(user_id: user.id) @@ -44,4 +44,12 @@ module GroupsHelper path << "?#{options.to_param}" path end + + def group_settings_page? + if current_controller?('groups') + current_action?('edit') || current_action?('projects') + else + false + end + end end diff --git a/app/views/groups/_settings_nav.html.haml b/app/views/groups/_settings_nav.html.haml index ec1fb4a2c00..82d760f7c41 100644 --- a/app/views/groups/_settings_nav.html.haml +++ b/app/views/groups/_settings_nav.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-pills.nav-stacked.nav-stacked-menu +%ul.sidebar-subnav = nav_link(path: 'groups#edit') do = link_to edit_group_path(@group) do %i.fa.fa-pencil-square-o diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index eb24fd65d9e..a963c59586e 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -1,41 +1,37 @@ -.row - .col-md-2 - = render 'settings_nav' - .col-md-10 - .panel.panel-default - .panel-heading - %strong= @group.name - group settings: - .panel-body - = form_for @group, html: { multipart: true, class: "form-horizontal" }, authenticity_token: true do |f| - - if @group.errors.any? - .alert.alert-danger - %span= @group.errors.full_messages.first - = render 'shared/group_form', f: f +.panel.panel-default + .panel-heading + %strong= @group.name + group settings: + .panel-body + = form_for @group, html: { multipart: true, class: "form-horizontal" }, authenticity_token: true do |f| + - if @group.errors.any? + .alert.alert-danger + %span= @group.errors.full_messages.first + = render 'shared/group_form', f: f - .form-group - .col-sm-2 - .col-sm-10 - = image_tag group_icon(@group.to_param), alt: '', class: 'avatar s160' - %p.light - - if @group.avatar? - You can change your group avatar here - - else - You can upload a group avatar here - = render 'shared/choose_group_avatar_button', f: f - - if @group.avatar? - %hr - = link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" + .form-group + .col-sm-2 + .col-sm-10 + = image_tag group_icon(@group.to_param), alt: '', class: 'avatar s160' + %p.light + - if @group.avatar? + You can change your group avatar here + - else + You can upload a group avatar here + = render 'shared/choose_group_avatar_button', f: f + - if @group.avatar? + %hr + = link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" - .form-actions - = f.submit 'Save group', class: "btn btn-save" + .form-actions + = f.submit 'Save group', class: "btn btn-save" - .panel.panel-danger - .panel-heading Remove group - .panel-body - %p - Removing group will cause all child projects and resources to be removed. - %br - %strong Removed group can not be restored! +.panel.panel-danger + .panel-heading Remove group + .panel-body + %p + Removing group will cause all child projects and resources to be removed. + %br + %strong Removed group can not be restored! - = link_to 'Remove Group', @group, data: {confirm: 'Removed group can not be restored! Are you sure?'}, method: :delete, class: "btn btn-remove" + = link_to 'Remove Group', @group, data: {confirm: 'Removed group can not be restored! Are you sure?'}, method: :delete, class: "btn btn-remove" diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml index 65a66355c56..40c81e8cd5b 100644 --- a/app/views/groups/projects.html.haml +++ b/app/views/groups/projects.html.haml @@ -1,29 +1,25 @@ -.row - .col-md-2 - = render 'settings_nav' - .col-md-10 - .panel.panel-default - .panel-heading - %strong= @group.name - projects: - - if can? current_user, :manage_group, @group - .panel-head-actions - = link_to new_project_path(namespace_id: @group.id), class: "btn btn-new" do - %i.fa.fa-plus - New Project - %ul.well-list - - @projects.each do |project| - %li - .list-item-name - = visibility_level_icon(project.visibility_level) - %strong= link_to project.name_with_namespace, project - %span.label.label-gray - = repository_size(project) - .pull-right - = link_to 'Members', project_team_index_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" - = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" - = link_to 'Remove', project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn btn-small btn-remove" - - if @projects.blank? - .nothing-here-block This group has no projects yet +.panel.panel-default + .panel-heading + %strong= @group.name + projects: + - if can? current_user, :manage_group, @group + .panel-head-actions + = link_to new_project_path(namespace_id: @group.id), class: "btn btn-new" do + %i.fa.fa-plus + New Project + %ul.well-list + - @projects.each do |project| + %li + .list-item-name + = visibility_level_icon(project.visibility_level) + %strong= link_to project.name_with_namespace, project + %span.label.label-gray + = repository_size(project) + .pull-right + = link_to 'Members', project_team_index_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" + = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" + = link_to 'Remove', project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn btn-small btn-remove" + - if @projects.blank? + .nothing-here-block This group has no projects yet - = paginate @projects, theme: "gitlab" += paginate @projects, theme: "gitlab" diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index f22fb236cb5..86ce398e09c 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -1,12 +1,16 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application sidenav", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "group: #{@group.name}" - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/group' - .container - .content - = render "layouts/flash" - = yield + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/group' + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + .clearfix + = yield + = yield :embedded_scripts diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 9095a843c9f..686280c9ec7 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -1,25 +1,35 @@ -%ul +%ul.nav.nav-sidebar.navbar-collapse.collapse = nav_link(path: 'groups#show', html_options: {class: 'home'}) do = link_to group_path(@group), title: "Home" do + %i.fa.fa-dashboard Activity = nav_link(controller: [:group, :milestones]) do = link_to group_milestones_path(@group) do + %i.fa.fa-clock-o Milestones = nav_link(path: 'groups#issues') do = link_to issues_group_path(@group) do + %i.fa.fa-exclamation-circle Issues - if current_user %span.count= current_user.assigned_issues.opened.of_group(@group).count = nav_link(path: 'groups#merge_requests') do = link_to merge_requests_group_path(@group) do + %i.fa.fa-tasks Merge Requests - if current_user %span.count= current_user.cared_merge_requests.opened.of_group(@group).count = nav_link(path: 'groups#members') do - = link_to "Members", members_group_path(@group) + = link_to members_group_path(@group) do + %i.fa.fa-users + Members - if can?(current_user, :manage_group, @group) - = nav_link(path: 'groups#edit') do - = link_to edit_group_path(@group), class: "tab " do + = nav_link(html_options: { class: "#{"active" if group_settings_page?} separate-item" }) do + = link_to edit_group_path(@group), class: "tab no-highlight" do + %i.fa.fa-cogs Settings + %i.fa.fa-angle-down + - if group_settings_page? + = render 'groups/settings_nav' diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index 0dcadc2d9c6..47bc007fc6a 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} sidenav project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml index 834f078330c..644187b0998 100644 --- a/app/views/layouts/projects.html.haml +++ b/app/views/layouts/projects.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: project_head_title - %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} sidenav project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" diff --git a/app/views/projects/_settings_nav.html.haml b/app/views/projects/_settings_nav.html.haml index 821bc237779..591b5b0e160 100644 --- a/app/views/projects/_settings_nav.html.haml +++ b/app/views/projects/_settings_nav.html.haml @@ -1,4 +1,4 @@ -%ul.project-settings-nav +%ul.project-settings-nav.sidebar-subnav = nav_link(path: 'projects#edit') do = link_to edit_project_path(@project), class: "stat-tab tab " do %i.fa.fa-pencil-square-o -- cgit v1.2.1 From 06a219baa5130479bf2ee31f26c138509679c562 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 16 Dec 2014 18:15:48 +0200 Subject: Restyle group page and event filter Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/activities.js.coffee | 2 +- app/assets/stylesheets/sections/events.scss | 45 ++--------------------- app/helpers/events_helper.rb | 13 +++---- app/views/dashboard/_sidebar.html.haml | 9 +---- app/views/groups/show.html.haml | 57 +++++++++++------------------ app/views/layouts/group.html.haml | 2 +- app/views/shared/_event_filter.html.haml | 16 +++++++- 7 files changed, 49 insertions(+), 95 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/activities.js.coffee b/app/assets/javascripts/activities.js.coffee index 4f76d8ce486..777c62dc1b7 100644 --- a/app/assets/javascripts/activities.js.coffee +++ b/app/assets/javascripts/activities.js.coffee @@ -12,7 +12,7 @@ class @Activities toggleFilter: (sender) -> - sender.parent().toggleClass "inactive" + sender.parent().toggleClass "active" event_filters = $.cookie("event_filter") filter = sender.attr("id").split("_")[0] if event_filters diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 11b212c5a5b..93ad17f57c0 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -140,47 +140,6 @@ } } -/** - * Event filter - * - */ -.event_filter { - position: absolute; - width: 40px; - margin-left: -55px; - - .filter_icon { - a { - text-align:center; - background: $bg_primary; - margin-bottom: 10px; - float: left; - padding: 9px 6px; - font-size: 18px; - width: 40px; - color: #FFF; - @include border-radius(3px); - } - - &.inactive { - a { - color: #DDD; - background: #f9f9f9; - } - } - } -} - -.sidenav .event_filter { - position: static; - float: left; - width: 100%; - margin-left: 0; - a { - margin-right: 10px; - width: 50px; - } -} /* * Last push widget @@ -214,3 +173,7 @@ } } } + +.event_filter li a { + padding: 5px 10px; +} diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index a3136926b38..903a5009616 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -21,15 +21,14 @@ module EventsHelper def event_filter_link(key, tooltip) key = key.to_s - inactive = if @event_filter.active? key - nil - else - 'inactive' - end + active = if @event_filter.active? key + 'active' + end - content_tag :div, class: "filter_icon #{inactive}" do + content_tag :li, class: "filter_icon #{active}" do link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do - content_tag :i, nil, class: icon_for_event[key] + content_tag(:i, nil, class: icon_for_event[key]) + + content_tag(:span, ' ' + tooltip) end end end diff --git a/app/views/dashboard/_sidebar.html.haml b/app/views/dashboard/_sidebar.html.haml index add9eb7fa29..a980f495427 100644 --- a/app/views/dashboard/_sidebar.html.haml +++ b/app/views/dashboard/_sidebar.html.haml @@ -15,11 +15,4 @@ = render "groups", groups: @groups .prepend-top-20 - %span.rss-icon - = link_to dashboard_path(:atom, { private_token: current_user.private_token }) do - %strong - %i.fa.fa-rss - News Feed - -%hr -= render 'shared/promo' + = render 'shared/promo' diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index d876e87852c..81f0e1dd2d8 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,37 +1,22 @@ .dashboard - %section.activities.col-md-8.hidden-sm.hidden-xs - - if current_user - = render "events/event_last_push", event: @last_push - = link_to dashboard_path, class: 'btn btn-tiny' do - ← To dashboard -   - %span.cgray - Currently you are only seeing events from the - = @group.name - group - %hr - = render 'shared/event_filter' - - if @events.any? - .content_list - - else - .nothing-here-block Project activity will be displayed here - = spinner - %aside.side.col-md-4 - .light-well.append-bottom-20 - = image_tag group_icon(@group.path), class: "avatar s90" - .clearfix.light - %h3.page-title - = @group.name - - if @group.description.present? - %p - = escaped_autolink(@group.description) - = render "projects", projects: @projects - - if current_user - .prepend-top-20 - = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed" do - %strong - %i.fa.fa-rss - News Feed - - %hr - = render 'shared/promo' + %div + = image_tag group_icon(@group.path), class: "avatar s90" + .clearfix + %h2 + = @group.name + - if @group.description.present? + %p + = escaped_autolink(@group.description) + %hr + .row + %section.activities.col-md-8.hidden-sm.hidden-xs + - if current_user + = render "events/event_last_push", event: @last_push + = render 'shared/event_filter' + - if @events.any? + .content_list + - else + .nothing-here-block Project activity will be displayed here + = spinner + %aside.side.col-md-4 + = render "projects", projects: @projects diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index 86ce398e09c..c5d8568b41a 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -3,7 +3,7 @@ = render "layouts/head", title: group_head_title %body{class: "#{app_theme} application sidenav", :'data-page' => body_data_page} = render "layouts/broadcast" - = render "layouts/head_panel", title: "group: #{@group.name}" + = render "layouts/head_panel", title: @group.name .page-with-sidebar .sidebar-wrapper = render 'layouts/nav/group' diff --git a/app/views/shared/_event_filter.html.haml b/app/views/shared/_event_filter.html.haml index ee0b57fbe5a..d07a9e2b924 100644 --- a/app/views/shared/_event_filter.html.haml +++ b/app/views/shared/_event_filter.html.haml @@ -1,5 +1,19 @@ -.event_filter +%ul.nav.nav-pills.event_filter = event_filter_link EventFilter.push, 'Push events' = event_filter_link EventFilter.merged, 'Merge events' = event_filter_link EventFilter.comments, 'Comments' = event_filter_link EventFilter.team, 'Team' + + - if current_user + - if current_controller?(:dashboard) + %li.pull-right + = link_to dashboard_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do + %i.fa.fa-rss + News Feed + + - if current_controller?(:groups) + %li.pull-right + = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do + %i.fa.fa-rss + News Feed +%hr -- cgit v1.2.1 From eb2face2cb8c0f7d4cae5c3423162f27c7fc02b1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 17 Dec 2014 12:20:05 +0200 Subject: Dashboard layout uses sidenav Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/dashboard.scss | 14 -------------- app/views/dashboard/_groups.html.haml | 11 ++++++----- app/views/dashboard/_projects.html.haml | 11 ++++++----- app/views/layouts/application.html.haml | 18 +++++++++++------- app/views/layouts/nav/_dashboard.html.haml | 10 ++++++++-- 5 files changed, 31 insertions(+), 33 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index d181d83e857..e540f7ff940 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -23,20 +23,6 @@ } } -.dashboard { - .dash-filter { - width: 205px; - float: left; - height: inherit; - } -} - -@media (max-width: 1200px) { - .dashboard .dash-filter { - width: 140px; - } -} - .dash-sidebar-tabs { margin-bottom: 2px; border: none; diff --git a/app/views/dashboard/_groups.html.haml b/app/views/dashboard/_groups.html.haml index 5460cf56f22..ddabd6e0d52 100644 --- a/app/views/dashboard/_groups.html.haml +++ b/app/views/dashboard/_groups.html.haml @@ -1,10 +1,11 @@ .panel.panel-default .panel-heading.clearfix - = search_field_tag :filter_group, nil, placeholder: 'Filter by name', class: 'dash-filter form-control' - - if current_user.can_create_group? - = link_to new_group_path, class: "btn btn-new pull-right" do - %i.fa.fa-plus - New group + .input-group + = search_field_tag :filter_group, nil, placeholder: 'Filter by name', class: 'dash-filter form-control' + - if current_user.can_create_group? + .input-group-addon + = link_to new_group_path, class: "" do + %strong New group %ul.well-list.dash-list - groups.each do |group| %li.group-row diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/_projects.html.haml index 3598425777f..304aa17eba8 100644 --- a/app/views/dashboard/_projects.html.haml +++ b/app/views/dashboard/_projects.html.haml @@ -1,10 +1,11 @@ .panel.panel-default .panel-heading.clearfix - = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'dash-filter form-control' - - if current_user.can_create_project? - = link_to new_project_path, class: "btn btn-new pull-right" do - %i.fa.fa-plus - New project + .input-group + = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'dash-filter form-control' + - if current_user.can_create_project? + .input-group-addon + = link_to new_project_path, class: "" do + %strong New project %ul.well-list.dash-list - projects.each do |project| diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 7d0819aa93e..ddae02bbb45 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,12 +1,16 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Dashboard" - %body{class: "#{app_theme} application", :'data-page' => body_data_page } + %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page } = render "layouts/broadcast" = render "layouts/head_panel", title: "Dashboard" - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/dashboard' - .container - .content - = render "layouts/flash" - = yield + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/dashboard' + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + .clearfix + = yield + = yield :embedded_scripts diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index a6e9772d93f..619cf625689 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -1,18 +1,24 @@ -%ul +%ul.nav.nav-sidebar.navbar-collapse.collapse = nav_link(path: 'dashboard#show', html_options: {class: 'home'}) do = link_to root_path, title: 'Home', class: 'shortcuts-activity' do + %i.fa.fa-dashboard Activity = nav_link(path: 'dashboard#projects') do = link_to projects_dashboard_path, class: 'shortcuts-projects' do + %i.fa.fa-cube Projects = nav_link(path: 'dashboard#issues') do = link_to issues_dashboard_path, class: 'shortcuts-issues' do + %i.fa.fa-exclamation-circle Issues %span.count= current_user.assigned_issues.opened.count = nav_link(path: 'dashboard#merge_requests') do = link_to merge_requests_dashboard_path, class: 'shortcuts-merge_requests' do + %i.fa.fa-tasks Merge Requests %span.count= current_user.assigned_merge_requests.opened.count = nav_link(controller: :help) do - = link_to "Help", help_path + = link_to help_path do + %i.fa.fa-question-circle + Help -- cgit v1.2.1 From 51ee71d8e0912656b46dcc4d3add7c2aabd2ead3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 17 Dec 2014 12:26:33 +0200 Subject: Migrate public layouts to new design Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/explore.html.haml | 2 +- app/views/layouts/nav/_group.html.haml | 9 +++++---- app/views/layouts/public_group.html.haml | 16 +++++++++++----- app/views/layouts/public_projects.html.haml | 15 ++++++++++----- app/views/layouts/public_users.html.haml | 2 +- 5 files changed, 28 insertions(+), 16 deletions(-) (limited to 'app') diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index d023846c5eb..dcc7962830d 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -2,7 +2,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: page_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} = render "layouts/broadcast" - if current_user = render "layouts/head_panel", title: page_title diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 686280c9ec7..78d6b768155 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -3,10 +3,11 @@ = link_to group_path(@group), title: "Home" do %i.fa.fa-dashboard Activity - = nav_link(controller: [:group, :milestones]) do - = link_to group_milestones_path(@group) do - %i.fa.fa-clock-o - Milestones + - if current_user + = nav_link(controller: [:group, :milestones]) do + = link_to group_milestones_path(@group) do + %i.fa.fa-clock-o + Milestones = nav_link(path: 'groups#issues') do = link_to issues_group_path(@group) do %i.fa.fa-exclamation-circle diff --git a/app/views/layouts/public_group.html.haml b/app/views/layouts/public_group.html.haml index a289b784725..99c29dc78dc 100644 --- a/app/views/layouts/public_group.html.haml +++ b/app/views/layouts/public_group.html.haml @@ -1,10 +1,16 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: "group: #{@group.name}" - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/group' - .container - .content= yield + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/group' + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + .clearfix + = yield + = yield :embedded_scripts diff --git a/app/views/layouts/public_projects.html.haml b/app/views/layouts/public_projects.html.haml index 2a9230244f8..343bddcf0b2 100644 --- a/app/views/layouts/public_projects.html.haml +++ b/app/views/layouts/public_projects.html.haml @@ -1,10 +1,15 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: project_title(@project) - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/project' - .container - .content= yield + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/project' + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + = yield + = yield :embedded_scripts diff --git a/app/views/layouts/public_users.html.haml b/app/views/layouts/public_users.html.haml index 4aa258fea0d..18b856b10e1 100644 --- a/app/views/layouts/public_users.html.haml +++ b/app/views/layouts/public_users.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: @title .container.navless-container -- cgit v1.2.1 From d6eda842a9094929423a0c43f3db76c0621603bf Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 17 Dec 2014 12:44:36 +0200 Subject: Sidenav for profile area Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/nav/_profile.html.haml | 30 +++++++++++++++++++++++------- app/views/layouts/navless.html.haml | 2 +- app/views/layouts/profile.html.haml | 18 +++++++++++------- 3 files changed, 35 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 1de5ee99cf4..05ba20e3611 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -1,26 +1,42 @@ -%ul +%ul.nav-sidebar.navbar-collapse.collapse = nav_link(path: 'profiles#show', html_options: {class: 'home'}) do = link_to profile_path, title: "Profile" do + %i.fa.fa-user Profile = nav_link(controller: :accounts) do - = link_to "Account", profile_account_path + = link_to profile_account_path do + %i.fa.fa-gear + Account = nav_link(controller: :emails) do = link_to profile_emails_path do + %i.fa.fa-envelope-o Emails %span.count= current_user.emails.count + 1 - unless current_user.ldap_user? = nav_link(controller: :passwords) do - = link_to "Password", edit_profile_password_path + = link_to edit_profile_password_path do + %i.fa.fa-lock + Password = nav_link(controller: :notifications) do - = link_to "Notifications", profile_notifications_path + = link_to profile_notifications_path do + %i.fa.fa-inbox + Notifications + = nav_link(controller: :keys) do = link_to profile_keys_path do + %i.fa.fa-key SSH Keys %span.count= current_user.keys.count = nav_link(path: 'profiles#design') do - = link_to "Design", design_profile_path + = link_to design_profile_path do + %i.fa.fa-image + Design = nav_link(controller: :groups) do - = link_to "Groups", profile_groups_path + = link_to profile_groups_path do + %i.fa.fa-group + Groups = nav_link(path: 'profiles#history') do - = link_to "History", history_profile_path + = link_to history_profile_path do + %i.fa.fa-history + History diff --git a/app/views/layouts/navless.html.haml b/app/views/layouts/navless.html.haml index 2c5fffe384f..7f452e84b01 100644 --- a/app/views/layouts/navless.html.haml +++ b/app/views/layouts/navless.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: @title .container.navless-container diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 1d0ab84d26f..f20f4ea1283 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -1,12 +1,16 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Profile" - %body{class: "#{app_theme} profile", :'data-page' => body_data_page} + %body{class: "#{app_theme} sidenav profile", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "Profile" - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/profile' - .container - .content - = render "layouts/flash" - = yield + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/profile' + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + .clearfix + = yield + = yield :embedded_scripts -- cgit v1.2.1 From c0d589dedb15548aabad88855fd6c340b348cf5b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 17 Dec 2014 13:10:58 +0200 Subject: Improve sidenav colors Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/sidebar.scss | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index a267869c0dd..79433ce5120 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -75,13 +75,17 @@ body.sidenav { .nav-sidebar li { &.active a { - color: #333; + color: #111; background: #EEE; font-weight: bold; &.no-highlight { background: none; } + + i { + color: #444; + } } } @@ -93,7 +97,7 @@ body.sidenav { } a { - color: #666; + color: #555; display: block; text-decoration: none; padding: 6px 15px; @@ -114,7 +118,7 @@ body.sidenav { i { width: 20px; - color: #999; + color: #888; } } } -- cgit v1.2.1 From b667a45942a230b86c21f47897de5a787015059f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 18 Dec 2014 17:22:10 +0200 Subject: Restyle issue/mr/milestone to new layout Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/issue_box.scss | 120 ++---------------- app/assets/stylesheets/sections/issues.scss | 4 + app/assets/stylesheets/sections/votes.scss | 10 -- app/views/projects/issues/_issue_context.html.haml | 43 ++++--- app/views/projects/issues/show.html.haml | 134 +++++++++------------ app/views/projects/merge_requests/_show.html.haml | 112 ++++++++++++----- .../merge_requests/show/_context.html.haml | 41 +++---- .../projects/merge_requests/show/_mr_box.html.haml | 26 +--- .../merge_requests/show/_mr_title.html.haml | 52 ++------ app/views/projects/milestones/show.html.haml | 94 +++++++-------- 10 files changed, 256 insertions(+), 380 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/issue_box.scss b/app/assets/stylesheets/generic/issue_box.scss index 79fbad4b946..176c45581a8 100644 --- a/app/assets/stylesheets/generic/issue_box.scss +++ b/app/assets/stylesheets/generic/issue_box.scss @@ -1,128 +1,30 @@ /** - * Issue box: - * Huge block (one per page) for storing title, descripion and other information. + * Issue box for showing Open/Closed state: * Used for Issue#show page, MergeRequest#show page etc * - * CLasses: - * .issue-box - Regular box */ .issue-box { - color: #555; - margin:20px 0; - background: $box_bg; - @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.09)); + display: inline-block; + padding: 0 10px; &.issue-box-closed { - .state { - background-color: #F3CECE; - border-color: $border_danger; - } - .state-label { - background-color: $bg_danger; - color: #FFF; - } + background-color: $bg_danger; + color: #FFF; } &.issue-box-merged { - .state { - background-color: #B7CEE7; - border-color: $border_primary; - } - .state-label { - background-color: $bg_primary; - color: #FFF; - } + background-color: $bg_primary; + color: #FFF; } &.issue-box-open { - .state { - background-color: #D6F1D7; - border-color: $bg_success; - } - .state-label { - background-color: $bg_success; - color: #FFF; - } + background-color: $bg_success; + color: #FFF; } &.issue-box-expired { - .state { - background-color: #EEE9B3; - border-color: #faebcc; - } - .state-label { - background: #cea61b; - color: #FFF; - } - } - - .control-group { - margin-bottom: 0; - } - - .state { - background-color: #f9f9f9; - } - - .title { - font-size: 28px; - font-weight: normal; - line-height: 1.5; - margin: 0; - color: #333; - padding: 10px 15px; - } - - .context { - border: none; - border-top: 1px solid #eee; - padding: 10px 15px; - - // Reset text align for children - .text-right > * { text-align: left; } - - @media (max-width: $screen-xs-max) { - // Don't right align on mobile - .text-right { text-align: left; } - - .row .col-md-6 { - padding-top: 5px; - } - } - } - - .description { - padding: 0 15px 10px 15px; - - code { - white-space: pre-wrap; - } - } - - .title, .context, .description { - .clearfix { - margin: 0; - } - } - - .state-label { - font-size: 14px; - float: left; - font-weight: bold; - padding: 10px 15px; - } - - .cross-project-ref { - float: left; - padding: 10px 15px; - } - - .creator { - float: right; - padding: 10px 15px; - a { - text-decoration: underline; - } + background: #cea61b; + color: #FFF; } } diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 9a5400fffbc..929838379cb 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -162,3 +162,7 @@ form.edit-issue { } } } + +.issue-title { + margin-top: 0; +} diff --git a/app/assets/stylesheets/sections/votes.scss b/app/assets/stylesheets/sections/votes.scss index d683e33e1f0..ba0a519dca6 100644 --- a/app/assets/stylesheets/sections/votes.scss +++ b/app/assets/stylesheets/sections/votes.scss @@ -37,13 +37,3 @@ margin: 0 8px; } -.votes-holder { - float: right; - width: 250px; - - @media (max-width: $screen-xs-max) { - width: 100%; - margin-top: 5px; - margin-bottom: 10px; - } -} diff --git a/app/views/projects/issues/_issue_context.html.haml b/app/views/projects/issues/_issue_context.html.haml index 648f459dc9e..d443aae43ac 100644 --- a/app/views/projects/issues/_issue_context.html.haml +++ b/app/views/projects/issues/_issue_context.html.haml @@ -1,25 +1,24 @@ = form_for [@project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f| - .row - .col-sm-6 - %strong.append-right-10 - Assignee: + %div.prepend-top-20 + %strong + Assignee: - - if can?(current_user, :modify_issue, @issue) - = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id) - - elsif issue.assignee - = link_to_member(@project, @issue.assignee) - - else - None + - if can?(current_user, :modify_issue, @issue) + = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id) + - elsif issue.assignee + = link_to_member(@project, @issue.assignee) + - else + None - .col-sm-6.text-right - %strong.append-right-10 - Milestone: - - if can?(current_user, :modify_issue, @issue) - = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) - = hidden_field_tag :issue_context - = f.submit class: 'btn' - - elsif issue.milestone - = link_to project_milestone_path(@project, @issue.milestone) do - = @issue.milestone.title - - else - None + %div.prepend-top-20 + %strong + Milestone: + - if can?(current_user, :modify_issue, @issue) + = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) + = hidden_field_tag :issue_context + = f.submit class: 'btn' + - elsif issue.milestone + = link_to project_milestone_path(@project, @issue.milestone) do + = @issue.milestone.title + - else + None diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 01a1fabda26..5e5098b73ef 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -1,79 +1,65 @@ %h3.page-title - Issue ##{@issue.iid} - - %span.pull-right.issue-btn-group - - if can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), class: "btn btn-grouped", title: "New Issue", id: "new_issue_link" do - %i.fa.fa-plus - New Issue - - if can?(current_user, :modify_issue, @issue) - - if @issue.closed? - = link_to 'Reopen', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" - - else - = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" - - = link_to edit_project_issue_path(@project, @issue), class: "btn btn-grouped" do - %i.fa.fa-pencil-square-o - Edit - -.clearfix - .votes-holder - #votes= render 'votes/votes_block', votable: @issue - - .back-link - = link_to project_issues_path(@project) do - ← To issues list - %span.milestone-nav-link - - if @issue.milestone - | - %span.light Milestone - = link_to project_milestone_path(@project, @issue.milestone) do - = @issue.milestone.title - -.issue-box{ class: issue_box_class(@issue) } - .state.clearfix - .state-label - - if @issue.closed? - Closed - - else - Open - - .cross-project-ref - %i.fa.fa-link.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @issue) - - .creator - Created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} - - %h4.title - = gfm escape_once(@issue.title) - - - if @issue.description.present? - .description - .wiki - = preserve do - = markdown(@issue.description, parse_tasks: true) - .context - %cite.cgray - = render partial: 'issue_context', locals: { issue: @issue } - - -- content_for :note_actions do - - if can?(current_user, :modify_issue, @issue) + .issue-box{ class: issue_box_class(@issue) } - if @issue.closed? - = link_to 'Reopen Issue', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' + Closed - else - = link_to 'Close Issue', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" - -.participants - %cite.cgray - = pluralize(@issue.participants.count, 'participant') - - @issue.participants.each do |participant| - = link_to_member(@project, participant, name: false, size: 24) + Open + Issue ##{@issue.iid} + .pull-right.creator + %small Created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} +%hr +.row + .col-sm-9 + %h3.issue-title + = gfm escape_once(@issue.title) + %div + - if @issue.description.present? + .description + .wiki + = preserve do + = markdown(@issue.description, parse_tasks: true) + %hr + - content_for :note_actions do + - if can?(current_user, :modify_issue, @issue) + - if @issue.closed? + = link_to 'Reopen Issue', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' + - else + = link_to 'Close Issue', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" + .participants + %cite.cgray + = pluralize(@issue.participants.count, 'participant') + - @issue.participants.each do |participant| + = link_to_member(@project, participant, name: false, size: 24) + .issue-show-labels.pull-right + - @issue.labels.each do |label| + = link_to project_issues_path(@project, label_name: label.name) do + = render_colored_label(label) - .issue-show-labels.pull-right - - @issue.labels.each do |label| - = link_to project_issues_path(@project, label_name: label.name) do - = render_colored_label(label) + .voting_notes#notes= render "projects/notes/notes_with_form" + .col-sm-3 + %div + - if can?(current_user, :write_issue, @project) + = link_to new_project_issue_path(@project), class: "btn btn-block", title: "New Issue", id: "new_issue_link" do + %i.fa.fa-plus + New Issue + - if can?(current_user, :modify_issue, @issue) + - if @issue.closed? + = link_to 'Reopen', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-block btn-reopen" + - else + = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-block btn-close", title: "Close Issue" -.voting_notes#notes= render "projects/notes/notes_with_form" + = link_to edit_project_issue_path(@project, @issue), class: "btn btn-block" do + %i.fa.fa-pencil-square-o + Edit + .clearfix + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @issue) + %hr + .clearfix + .votes-holder + %h6 Votes + #votes= render 'votes/votes_block', votable: @issue + %hr + .context + %cite.cgray + = render partial: 'issue_context', locals: { issue: @issue } diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 7b28dd5e7da..fd45ca87b8e 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,38 +1,90 @@ .merge-request = render "projects/merge_requests/show/mr_title" - = render "projects/merge_requests/show/how_to_merge" - = render "projects/merge_requests/show/mr_box" - = render "projects/merge_requests/show/state_widget" - = render "projects/merge_requests/show/commits" - = render "projects/merge_requests/show/participants" + %hr + .row + .col-sm-9 + = render "projects/merge_requests/show/how_to_merge" + = render "projects/merge_requests/show/mr_box" + %hr + .append-bottom-20 + %p.slead + %span From + - if @merge_request.for_fork? + %strong.label-branch< + - if @merge_request.source_project + = link_to @merge_request.source_project_namespace, project_path(@merge_request.source_project) + - else + \ #{@merge_request.source_project_namespace} + \:#{@merge_request.source_branch} + %span into + %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} + - else + %strong.label-branch #{@merge_request.source_branch} + %span into + %strong.label-branch #{@merge_request.target_branch} + = render "projects/merge_requests/show/state_widget" + = render "projects/merge_requests/show/commits" + = render "projects/merge_requests/show/participants" - - if @commits.present? - %ul.nav.nav-pills.merge-request-tabs - %li.notes-tab{data: {action: 'notes'}} - = link_to project_merge_request_path(@project, @merge_request) do - %i.fa.fa-comment - Discussion - %span.badge= @merge_request.mr_and_commit_notes.count - %li.diffs-tab{data: {action: 'diffs'}} - = link_to diffs_project_merge_request_path(@project, @merge_request) do - %i.fa.fa-list-alt - Changes - %span.badge= @merge_request.diffs.size + - if @commits.present? + %ul.nav.nav-pills.merge-request-tabs + %li.notes-tab{data: {action: 'notes'}} + = link_to project_merge_request_path(@project, @merge_request) do + %i.fa.fa-comment + Discussion + %span.badge= @merge_request.mr_and_commit_notes.count + %li.diffs-tab{data: {action: 'diffs'}} + = link_to diffs_project_merge_request_path(@project, @merge_request) do + %i.fa.fa-list-alt + Changes + %span.badge= @merge_request.diffs.size + + - content_for :note_actions do + - if can?(current_user, :modify_merge_request, @merge_request) + - if @merge_request.open? + = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" + - if @merge_request.closed? + = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" + + .diffs.tab-content + - if current_page?(action: 'diffs') + = render "projects/merge_requests/show/diffs" + .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } + = render "projects/notes/notes_with_form" + .mr-loading-status + = spinner + .col-sm-3 + .issue-btn-group + - if can?(current_user, :modify_merge_request, @merge_request) + - if @merge_request.open? + .btn-group-justified.append-bottom-20 + .btn-group + %a.btn.dropdown-toggle{ data: {toggle: :dropdown} } + %i.fa.fa-download + Download as + %span.caret + %ul.dropdown-menu + %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) + %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) + = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-block btn-close", title: "Close merge request" + = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn btn-block", id:"edit_merge_request" do + %i.fa.fa-pencil-square-o + Edit + - if @merge_request.closed? + = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-block btn-reopen reopen-mr-link", title: "Close merge request" + .clearfix + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @merge_request) + %hr + .votes-holder.hidden-sm.hidden-xs + %h6 Votes + #votes= render 'votes/votes_block', votable: @merge_request + %hr + .context + %cite.cgray + = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } - - content_for :note_actions do - - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.open? - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" - - if @merge_request.closed? - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" - .diffs.tab-content - - if current_page?(action: 'diffs') - = render "projects/merge_requests/show/diffs" - .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } - = render "projects/notes/notes_with_form" - .mr-loading-status - = spinner :javascript var merge_request; diff --git a/app/views/projects/merge_requests/show/_context.html.haml b/app/views/projects/merge_requests/show/_context.html.haml index 089302e3588..d4b6434b171 100644 --- a/app/views/projects/merge_requests/show/_context.html.haml +++ b/app/views/projects/merge_requests/show/_context.html.haml @@ -1,24 +1,23 @@ = form_for [@project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f| - .row - .col-sm-6 - %strong.append-right-10 - Assignee: + %div.prepend-top-20 + %strong + Assignee: - - if can?(current_user, :modify_merge_request, @merge_request) - = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @merge_request.assignee_id) - - elsif merge_request.assignee - = link_to_member(@project, @merge_request.assignee) - - else - None + - if can?(current_user, :modify_merge_request, @merge_request) + = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @merge_request.assignee_id) + - elsif merge_request.assignee + = link_to_member(@project, @merge_request.assignee) + - else + None - .col-sm-6.text-right - %strong.append-right-10 - Milestone: - - if can?(current_user, :modify_merge_request, @merge_request) - = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) - = hidden_field_tag :merge_request_context - = f.submit class: 'btn' - - elsif merge_request.milestone - = link_to merge_request.milestone.title, project_milestone_path - - else - None + %div.prepend-top-20 + %strong + Milestone: + - if can?(current_user, :modify_merge_request, @merge_request) + = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) + = hidden_field_tag :merge_request_context + = f.submit class: 'btn' + - elsif merge_request.milestone + = link_to merge_request.milestone.title, project_milestone_path + - else + None diff --git a/app/views/projects/merge_requests/show/_mr_box.html.haml b/app/views/projects/merge_requests/show/_mr_box.html.haml index 866b236d827..ab1284547ad 100644 --- a/app/views/projects/merge_requests/show/_mr_box.html.haml +++ b/app/views/projects/merge_requests/show/_mr_box.html.haml @@ -1,29 +1,9 @@ -.issue-box{ class: issue_box_class(@merge_request) } - .state.clearfix - .state-label - - if @merge_request.merged? - Merged - - elsif @merge_request.closed? - Closed - - else - Open - - .cross-project-ref - %i.fa.fa-link.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @merge_request) - - .creator - Created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} - - %h4.title - = gfm escape_once(@merge_request.title) +%h3.issue-title + = gfm escape_once(@merge_request.title) +%div - if @merge_request.description.present? .description .wiki = preserve do = markdown(@merge_request.description, parse_tasks: true) - - .context - %cite.cgray - = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml index 6fe765248e4..fb34de43c1b 100644 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ b/app/views/projects/merge_requests/show/_mr_title.html.haml @@ -1,45 +1,11 @@ %h3.page-title - = "Merge Request ##{@merge_request.iid}" - - %span.pull-right.issue-btn-group - - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.open? - .btn-group.pull-left - %a.btn.btn-grouped.dropdown-toggle{ data: {toggle: :dropdown} } - %i.fa.fa-download - Download as - %span.caret - %ul.dropdown-menu - %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) - %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) - - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-grouped btn-close", title: "Close merge request" - - = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn btn-grouped", id:"edit_merge_request" do - %i.fa.fa-pencil-square-o - Edit - - if @merge_request.closed? - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link", title: "Close merge request" - -.votes-holder.hidden-sm.hidden-xs - #votes= render 'votes/votes_block', votable: @merge_request - -.back-link - = link_to project_merge_requests_path(@project) do - ← To merge requests - - %span.prepend-left-20 - %span From - - if @merge_request.for_fork? - %strong.label-branch< - - if @merge_request.source_project - = link_to @merge_request.source_project_namespace, project_path(@merge_request.source_project) - - else - \ #{@merge_request.source_project_namespace} - \:#{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} + .issue-box{ class: issue_box_class(@merge_request) } + - if @merge_request.merged? + Merged + - elsif @merge_request.closed? + Closed - else - %strong.label-branch #{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_branch} + Open + = "Merge Request ##{@merge_request.iid}" + .pull-right.creator + %small Created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index f08ccc1d570..cd62e4811ac 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -1,57 +1,59 @@ = render "projects/issues_nav" %h3.page-title + .issue-box{ class: issue_box_class(@milestone) } + - if @milestone.closed? + Closed + - elsif @milestone.expired? + Expired + - else + Open Milestone ##{@milestone.iid} - .pull-right - - if can?(current_user, :admin_milestone, @project) - = link_to edit_project_milestone_path(@project, @milestone), class: "btn btn-grouped" do - %i.fa.fa-pencil-square-o - Edit - - if @milestone.active? - = link_to 'Close Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-grouped" - - else - = link_to 'Reopen Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-grouped" + .pull-right.creator + %small= @milestone.expires_at +%hr - if @milestone.issues.any? && @milestone.can_be_closed? .alert.alert-success %span All issues for this milestone are closed. You may close milestone now. +.row + .col-sm-9 + %h3.issue-title + = gfm escape_once(@milestone.title) + %div + - if @milestone.description.present? + .description + .wiki + = preserve do + = markdown @milestone.description -.back-link - = link_to project_milestones_path(@project) do - ← To milestones list - - -.issue-box{ class: issue_box_class(@milestone) } - .state.clearfix - .state-label - - if @milestone.closed? - Closed - - elsif @milestone.expired? - Expired - - else - Open - .creator - = @milestone.expires_at - - %h4.title - = gfm escape_once(@milestone.title) + %hr + .context + %p.lead + Progress: + #{@milestone.closed_items_count} closed + – + #{@milestone.open_items_count} open +   + %span.light #{@milestone.percent_complete}% complete + %span.pull-right= @milestone.expires_at + .progress.progress-info + .progress-bar{style: "width: #{@milestone.percent_complete}%;"} - - if @milestone.description.present? - .description - .wiki - = preserve do - = markdown @milestone.description + .col-sm-3 + %div + - if can?(current_user, :admin_milestone, @project) + = link_to edit_project_milestone_path(@project, @milestone), class: "btn btn-block" do + %i.fa.fa-pencil-square-o + Edit + - if @milestone.active? + = link_to 'Close Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-block" + - else + = link_to 'Reopen Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-block" + = link_to new_project_issue_path(@project, issue: { milestone_id: @milestone.id }), class: "btn btn-block", title: "New Issue" do + %i.fa.fa-plus + New Issue + = link_to 'Browse Issues', project_issues_path(@milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link btn-block" - .context - %p - Progress: - #{@milestone.closed_items_count} closed - – - #{@milestone.open_items_count} open -   - %span.light #{@milestone.percent_complete}% complete - %span.pull-right= @milestone.expires_at - .progress.progress-info - .progress-bar{style: "width: #{@milestone.percent_complete}%;"} %ul.nav.nav-tabs @@ -69,10 +71,6 @@ %span.badge= @users.count .pull-right - = link_to new_project_issue_path(@project, issue: { milestone_id: @milestone.id }), class: "btn btn-small btn-grouped", title: "New Issue" do - %i.fa.fa-plus - New Issue - = link_to 'Browse Issues', project_issues_path(@milestone.project, milestone_id: @milestone.id), class: "btn btn-small edit-milestone-link btn-grouped" .tab-content .tab-pane.active#tab-issues -- cgit v1.2.1 From a9761ac1b86275397f36e484f02ab7e87eb1ff05 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Sat, 20 Dec 2014 14:55:55 -0600 Subject: Differentiate system notes --- app/assets/stylesheets/generic/timeline.scss | 36 ++++++++++++++++++++++++++++ app/views/projects/notes/_note.html.haml | 9 +++++-- 2 files changed, 43 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index 57e9e8ae5c5..82ee41b71bd 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -74,6 +74,42 @@ } } } + + .system-note .timeline-entry-inner { + .timeline-icon { + background: none; + margin-left: 12px; + margin-top: 0; + @include box-shadow(none); + + span { + margin: 0 2px; + font-size: 16px; + color: #eeeeee; + } + } + + .timeline-content { + background: none; + margin-left: 45px; + padding: 0px 15px; + + &:after { border: 0; } + + .note-header { + span { font-size: 12px; } + + .avatar { + margin-right: 5px; + } + } + + .note-text { + font-size: 12px; + margin-left: 20px; + } + } + } } @media (max-width: $screen-xs-max) { diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 354afd3e2c9..db972ec572d 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -1,7 +1,10 @@ -%li.timeline-entry{ id: dom_id(note), class: dom_class(note), data: { discussion: note.discussion_id } } +%li.timeline-entry{ id: dom_id(note), class: [dom_class(note), ('system-note' if note.system)], data: { discussion: note.discussion_id } } .timeline-entry-inner .timeline-icon - = image_tag avatar_icon(note.author_email), class: "avatar s40" + - if note.system + %span.fa.fa-circle + - else + = image_tag avatar_icon(note.author_email), class: "avatar s40" .timeline-content .note-header .note-actions @@ -17,6 +20,8 @@ = link_to project_note_path(@project, note), title: "Remove comment", method: :delete, data: { confirm: 'Are you sure you want to remove this comment?' }, remote: true, class: "danger js-note-delete" do %i.fa.fa-trash-o.cred Remove + - if note.system + = image_tag avatar_icon(note.author_email), class: "avatar s16" = link_to_member(@project, note.author, avatar: false) %span.author-username = '@' + note.author.username -- cgit v1.2.1 From abd83baeab474764030f1daa7c7ca3335ca91d98 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 21 Dec 2014 00:23:17 +0200 Subject: Admin area using side nav Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/admin.html.haml | 17 ++++++++++------- app/views/layouts/nav/_admin.html.haml | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 207ab22f4c7..7c6bfd643d8 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -1,13 +1,16 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Admin area" - %body{class: "#{app_theme} admin", :'data-page' => body_data_page} + %body{class: "#{app_theme} sidenav admin", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "Admin area" - %nav.main-nav.navbar-collapse.collapse - .container= render 'layouts/nav/admin' - .container - .content - = render "layouts/flash" - = yield + .page-with-sidebar + .sidebar-wrapper + = render 'layouts/nav/admin' + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + .clearfix + = yield = yield :embedded_scripts diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index c57216f01c8..1a506832ea2 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -1,4 +1,4 @@ -%ul +%ul.nav-sidebar.navbar-collapse.collapse = nav_link(controller: :dashboard, html_options: {class: 'home'}) do = link_to admin_root_path, title: "Stats" do Overview -- cgit v1.2.1 From bcc04adb1342155d4ec2b670702406285145cb32 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 21 Dec 2014 01:11:08 +0200 Subject: Css/views cleanup after layout restyle Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/header.scss | 20 ++---- app/assets/stylesheets/sections/nav.scss | 96 ---------------------------- app/assets/stylesheets/sections/sidebar.scss | 48 -------------- app/assets/stylesheets/themes/ui_basic.scss | 12 ++-- app/assets/stylesheets/themes/ui_color.scss | 5 +- app/assets/stylesheets/themes/ui_gray.scss | 5 +- app/assets/stylesheets/themes/ui_mars.scss | 5 +- app/assets/stylesheets/themes/ui_modern.scss | 5 +- app/views/layouts/_head_panel.html.haml | 2 - app/views/layouts/_page.html.haml | 16 +++++ app/views/layouts/admin.html.haml | 13 +--- app/views/layouts/application.html.haml | 13 +--- app/views/layouts/explore.html.haml | 2 +- app/views/layouts/group.html.haml | 11 +--- app/views/layouts/nav/_project.html.haml | 3 +- app/views/layouts/navless.html.haml | 2 +- app/views/layouts/profile.html.haml | 13 +--- app/views/layouts/project_settings.html.haml | 13 +--- app/views/layouts/projects.html.haml | 13 +--- app/views/layouts/public_group.html.haml | 13 +--- app/views/layouts/public_projects.html.haml | 12 +--- app/views/layouts/public_users.html.haml | 5 +- 22 files changed, 56 insertions(+), 271 deletions(-) delete mode 100644 app/assets/stylesheets/sections/nav.scss create mode 100644 app/views/layouts/_page.html.haml (limited to 'app') diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index dc23272b481..db419f76532 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -84,6 +84,11 @@ header { z-index: 10; + .container { + width: 100% !important; + padding-left: 0px; + } + /** * * Logo holder @@ -230,21 +235,6 @@ header { color: #fff; } } - - .app_logo { - .separator { - margin-left: 0; - margin-right: 0; - } - } - - .separator { - float: left; - height: 46px; - width: 2px; - margin-left: 10px; - margin-right: 10px; - } } .search .search-input { diff --git a/app/assets/stylesheets/sections/nav.scss b/app/assets/stylesheets/sections/nav.scss deleted file mode 100644 index ccd672c5f67..00000000000 --- a/app/assets/stylesheets/sections/nav.scss +++ /dev/null @@ -1,96 +0,0 @@ -.main-nav { - background: #f5f5f5; - margin: 20px 0; - margin-top: 0; - padding-top: 4px; - border-bottom: 1px solid #E9E9E9; - - ul { - padding: 0; - margin: auto; - .count { - font-weight: normal; - display: inline-block; - height: 15px; - padding: 1px 6px; - height: auto; - font-size: 0.82em; - line-height: 14px; - text-align: center; - color: #777; - background: #eee; - @include border-radius(8px); - } - .label { - background: $hover; - text-shadow: none; - color: $style_color; - } - li { - list-style-type: none; - margin: 0; - display: table-cell; - width: 1%; - &.active { - a { - color: $link_color; - font-weight: bold; - border-bottom: 3px solid $link_color; - } - } - - &:hover { - a { - color: $link_hover_color; - border-bottom: 3px solid $link_hover_color; - } - } - } - a { - display: block; - text-align: center; - font-weight: bold; - height: 42px; - line-height: 39px; - color: #777; - text-shadow: 0 1px 1px white; - text-decoration: none; - overflow: hidden; - margin-bottom: -1px; - } - } - - @media (max-width: $screen-xs-max) { - font-size: 18px; - margin: 0; - max-height: none; - - &, .container { - padding: 0; - border-top: 0; - } - - ul { - height: auto; - - li { - display: list-item; - width: auto; - padding: 5px 0; - - &.active { - background-color: $link_hover_color; - - a { - color: #fff; - font-weight: normal; - text-shadow: none; - border: none; - - &:after { display: none; } - } - } - } - } - } -} diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 79433ce5120..f3b2167bc6e 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -1,46 +1,3 @@ -body.sidenav { - padding: 0; - - &.ui_mars { - .app_logo { - background-color: #24272D; - } - } - - &.ui_color { - .app_logo { - background-color: #325; - } - } - - &.ui_basic { - .app_logo { - background-color: #DDD; - } - } - - &.ui_modern { - .app_logo { - background-color: #017855; - } - } - - &.ui_gray { - .app_logo { - background-color: #222; - } - } - - header .container { - width: 100% !important; - padding-left: 0px; - - .separator { - display: none; - } - } -} - .page-with-sidebar { background: #F5F5F5; } @@ -165,8 +122,3 @@ body.sidenav { border-left: 1px solid #EAEAEA; } } - -/** TODO: REMOVE **/ -.profiler-results { - display: none; -} diff --git a/app/assets/stylesheets/themes/ui_basic.scss b/app/assets/stylesheets/themes/ui_basic.scss index 3e3744fdc33..0dad9917b55 100644 --- a/app/assets/stylesheets/themes/ui_basic.scss +++ b/app/assets/stylesheets/themes/ui_basic.scss @@ -9,17 +9,15 @@ .navbar-inner { background: #F1F1F1; border-bottom: 1px solid #DDD; + + .app_logo { + background-color: #DDD; + } + .nav > li > a { color: $style_color; } - .separator { - background: #F9F9F9; - border-left: 1px solid #DDD; - } } } } - .main-nav { - background: #FFF; - } } diff --git a/app/assets/stylesheets/themes/ui_color.scss b/app/assets/stylesheets/themes/ui_color.scss index a08f3ff3d48..3c441a8e098 100644 --- a/app/assets/stylesheets/themes/ui_color.scss +++ b/app/assets/stylesheets/themes/ui_color.scss @@ -23,9 +23,8 @@ background-color: #436; } } - .separator { - background: #436; - border-left: 1px solid #659; + .app_logo { + background-color: #325; } .nav > li > a { color: #98C; diff --git a/app/assets/stylesheets/themes/ui_gray.scss b/app/assets/stylesheets/themes/ui_gray.scss index 959febad6fe..8df08ccaeec 100644 --- a/app/assets/stylesheets/themes/ui_gray.scss +++ b/app/assets/stylesheets/themes/ui_gray.scss @@ -23,9 +23,8 @@ background-color: #272727; } } - .separator { - background: #272727; - border-left: 1px solid #474747; + .app_logo { + background-color: #222; } } } diff --git a/app/assets/stylesheets/themes/ui_mars.scss b/app/assets/stylesheets/themes/ui_mars.scss index 9af5adbf10a..b08cbda6c4f 100644 --- a/app/assets/stylesheets/themes/ui_mars.scss +++ b/app/assets/stylesheets/themes/ui_mars.scss @@ -23,9 +23,8 @@ background-color: #373D47; } } - .separator { - background: #373D47; - border-left: 1px solid #575D67; + .app_logo { + background-color: #24272D; } .nav > li > a { color: #979DA7; diff --git a/app/assets/stylesheets/themes/ui_modern.scss b/app/assets/stylesheets/themes/ui_modern.scss index 308a03477db..34f39614ca4 100644 --- a/app/assets/stylesheets/themes/ui_modern.scss +++ b/app/assets/stylesheets/themes/ui_modern.scss @@ -23,9 +23,8 @@ background-color: #018865; } } - .separator { - background: #018865; - border-left: 1px solid #11A885; + .app_logo { + background-color: #017855; } .nav > li > a { color: #ADC; diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index 5dcaee2fa02..eda37f8237a 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -2,10 +2,8 @@ .navbar-inner .container %div.app_logo - %span.separator = link_to root_path, class: "home has_bottom_tooltip", title: "Dashboard" do %h1 GITLAB - %span.separator %h1.title= title %button.navbar-toggle{"data-target" => ".navbar-collapse", "data-toggle" => "collapse", type: "button"} diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml new file mode 100644 index 00000000000..621365fa6aa --- /dev/null +++ b/app/views/layouts/_page.html.haml @@ -0,0 +1,16 @@ +- if defined?(sidebar) + .page-with-sidebar + .sidebar-wrapper + = render(sidebar) + .content-wrapper + .container-fluid + .content + = render "layouts/flash" + .clearfix + = yield +- else + .container.navless-container + .content + = yield + += yield :embedded_scripts diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 7c6bfd643d8..7d25d9a4290 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -1,16 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Admin area" - %body{class: "#{app_theme} sidenav admin", :'data-page' => body_data_page} + %body{class: "#{app_theme} admin", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "Admin area" - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/admin' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - .clearfix - = yield - = yield :embedded_scripts + = render 'layouts/page', sidebar: 'layouts/nav/admin' diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index ddae02bbb45..ec53c4b1508 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,16 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Dashboard" - %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page } + %body{class: "#{app_theme} application", :'data-page' => body_data_page } = render "layouts/broadcast" = render "layouts/head_panel", title: "Dashboard" - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/dashboard' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - .clearfix - = yield - = yield :embedded_scripts + = render 'layouts/page', sidebar: 'layouts/nav/dashboard' diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index dcc7962830d..d023846c5eb 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -2,7 +2,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: page_title - %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" - if current_user = render "layouts/head_panel", title: page_title diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index c5d8568b41a..04ccfd6e563 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -4,13 +4,4 @@ %body{class: "#{app_theme} application sidenav", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: @group.name - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/group' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - .clearfix - = yield - = yield :embedded_scripts + = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index c9ae3f5ffff..d634d39bfdf 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -61,5 +61,6 @@ %i.fa.fa-cogs Settings %i.fa.fa-angle-down - - if defined?(settings) && settings + + - if @project_settings_nav = render 'projects/settings_nav' diff --git a/app/views/layouts/navless.html.haml b/app/views/layouts/navless.html.haml index 7f452e84b01..2c5fffe384f 100644 --- a/app/views/layouts/navless.html.haml +++ b/app/views/layouts/navless.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: @title .container.navless-container diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index f20f4ea1283..b387ea907b3 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -1,16 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Profile" - %body{class: "#{app_theme} sidenav profile", :'data-page' => body_data_page} + %body{class: "#{app_theme} profile", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: "Profile" - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/profile' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - .clearfix - = yield - = yield :embedded_scripts + = render 'layouts/page', sidebar: 'layouts/nav/profile' diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index 47bc007fc6a..b8f4e92fff8 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -1,19 +1,12 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} sidenav project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" - if can?(current_user, :download_code, @project) = render 'shared/no_ssh' - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/project', settings: true - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - = yield - = yield :embedded_scripts + - @project_settings_nav = true + = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml index 644187b0998..84c53a36cbd 100644 --- a/app/views/layouts/projects.html.haml +++ b/app/views/layouts/projects.html.haml @@ -1,19 +1,10 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: project_head_title - %body{class: "#{app_theme} sidenav project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" - if can?(current_user, :download_code, @project) = render 'shared/no_ssh' - - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/project' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - = yield - = yield :embedded_scripts + = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_group.html.haml b/app/views/layouts/public_group.html.haml index 99c29dc78dc..2bb52eeca86 100644 --- a/app/views/layouts/public_group.html.haml +++ b/app/views/layouts/public_group.html.haml @@ -1,16 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: "group: #{@group.name}" - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/group' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - .clearfix - = yield - = yield :embedded_scripts + = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/public_projects.html.haml b/app/views/layouts/public_projects.html.haml index 343bddcf0b2..b96a28d4ea5 100644 --- a/app/views/layouts/public_projects.html.haml +++ b/app/views/layouts/public_projects.html.haml @@ -1,15 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: project_title(@project) - .page-with-sidebar - .sidebar-wrapper - = render 'layouts/nav/project' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - = yield - = yield :embedded_scripts + = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_users.html.haml b/app/views/layouts/public_users.html.haml index 18b856b10e1..6780701061d 100644 --- a/app/views/layouts/public_users.html.haml +++ b/app/views/layouts/public_users.html.haml @@ -1,8 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} sidenav application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/public_head_panel", title: @title - .container.navless-container - .content= yield + = render 'layouts/page' -- cgit v1.2.1 From 59bb635e0e94a0e6c61a0c53cdb70a4eb7bd3910 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 13:27:48 +0200 Subject: Set project path & name in one field without transforamtion Signed-off-by: Dmitriy Zaporozhets --- app/services/projects/create_service.rb | 10 ++++------ app/views/projects/new.html.haml | 23 +++++------------------ 2 files changed, 9 insertions(+), 24 deletions(-) (limited to 'app') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 3672b623806..7b06ce9a337 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -12,12 +12,10 @@ module Projects @project.visibility_level = default_features.visibility_level end - # Parametrize path for project - # - # Ex. - # 'GitLab HQ'.parameterize => "gitlab-hq" - # - @project.path = @project.name.dup.parameterize unless @project.path.present? + # Set project name from path + unless @project.name.present? + @project.name = @project.path.dup + end # get namespace id namespace_id = params[:namespace_id] diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index e77ef84f51c..f0f9d74c808 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -5,10 +5,13 @@ = form_for @project, html: { class: 'new_project form-horizontal' } do |f| .form-group.project-name-holder - = f.label :name, class: 'control-label' do + = f.label :path, class: 'control-label' do %strong Project name .col-sm-10 - = f.text_field :name, placeholder: "Example Project", class: "form-control", tabindex: 1, autofocus: true + .input-group + = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 1, autofocus: true + .input-group-addon + \.git - if current_user.can_select_namespace? .form-group @@ -18,22 +21,6 @@ = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user), {}, {class: 'select2', tabindex: 2} %hr - .js-toggle-container - .form-group - .col-sm-2 - .col-sm-10 - = link_to "#", class: 'js-toggle-button' do - %i.fa.fa-pencil-square-o - %span Customize repository name? - .js-toggle-content.hide - .form-group - = f.label :path, class: 'control-label' do - %span Repository name - .col-sm-10 - .input-group - = f.text_field :path, class: 'form-control' - %span.input-group-addon .git - .js-toggle-container .form-group .col-sm-2 -- cgit v1.2.1 From ed2bcf952be8e6431ad5d3fb7b39927880b512b0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 13:50:58 +0200 Subject: Set group path during creation Signed-off-by: Dmitriy Zaporozhets --- app/controllers/groups_controller.rb | 2 +- app/views/projects/edit.html.haml | 2 ++ app/views/projects/new.html.haml | 2 +- app/views/shared/_group_form.html.haml | 18 ++++++++++++++---- 4 files changed, 18 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 36222758eb2..1ea2a2a8c18 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -23,7 +23,7 @@ class GroupsController < ApplicationController def create @group = Group.new(group_params) - @group.path = @group.name.dup.parameterize if @group.name + @group.name = @group.path.dup unless @group.name if @group.save @group.add_owner(current_user) diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index b85cf7d8d37..f2bb56b5664 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -136,6 +136,8 @@ .col-sm-9 .form-group .input-group + .input-group-addon + #{URI.join(root_url, @project.namespace.path)}/ = f.text_field :path, class: 'form-control' %span.input-group-addon .git %ul diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index f0f9d74c808..f320a2b505e 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -6,7 +6,7 @@ = form_for @project, html: { class: 'new_project form-horizontal' } do |f| .form-group.project-name-holder = f.label :path, class: 'control-label' do - %strong Project name + %strong Project path .col-sm-10 .input-group = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 1, autofocus: true diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml index 93294e42505..e0bf77db10f 100644 --- a/app/views/shared/_group_form.html.haml +++ b/app/views/shared/_group_form.html.haml @@ -1,9 +1,19 @@ +- if @group.persisted? + .form-group + = f.label :name, class: 'control-label' do + Group name + .col-sm-10 + = f.text_field :name, placeholder: 'open-source', class: 'form-control' + .form-group - = f.label :name, class: 'control-label' do - Group name + = f.label :path, class: 'control-label' do + Group path .col-sm-10 - = f.text_field :name, placeholder: 'Example Group', class: 'form-control', - autofocus: local_assigns[:autofocus] || false + .input-group + .input-group-addon + = root_url + = f.text_field :path, placeholder: 'open-source', class: 'form-control', + autofocus: local_assigns[:autofocus] || false .form-group.group-description-holder = f.label :description, 'Details', class: 'control-label' -- cgit v1.2.1 From 52a8e5c01a2a5377dbd51587f8197c49b17430b3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 13:55:32 +0200 Subject: Set group name from path in admin controller Signed-off-by: Dmitriy Zaporozhets --- app/controllers/admin/groups_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index e6d0c9323c1..8c7d90a5d9f 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -21,7 +21,7 @@ class Admin::GroupsController < Admin::ApplicationController def create @group = Group.new(group_params) - @group.path = @group.name.dup.parameterize if @group.name + @group.name = @group.path.dup unless @group.name if @group.save @group.add_owner(current_user) -- cgit v1.2.1 From 1f2628fe2118642b467e93a362cebb11ca780a40 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 15:02:47 +0200 Subject: Allow Group path to be changed at the same time as name Signed-off-by: Dmitriy Zaporozhets --- app/views/admin/groups/_form.html.haml | 11 ----------- app/views/shared/_group_form.html.haml | 7 +++++++ 2 files changed, 7 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml index f4d7e25fd74..86a73200609 100644 --- a/app/views/admin/groups/_form.html.haml +++ b/app/views/admin/groups/_form.html.haml @@ -21,17 +21,6 @@ = link_to 'Cancel', admin_groups_path, class: "btn btn-cancel" - else - .form-group.group_name_holder - = f.label :path, class: 'control-label' do - %span Group path - .col-sm-10 - = f.text_field :path, placeholder: "example-group", class: "form-control danger" - .bs-callout.bs-callout-danger - %ul - %li Changing group path can have unintended side effects. - %li Renaming group path will rename directory for all related projects - %li It will change web url for access group and group projects. - %li It will change the git path to repositories under this group. .form-actions = f.submit 'Save changes', class: "btn btn-primary" = link_to 'Cancel', admin_group_path(@group), class: "btn btn-cancel" diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml index e0bf77db10f..5875f71bac2 100644 --- a/app/views/shared/_group_form.html.haml +++ b/app/views/shared/_group_form.html.haml @@ -14,6 +14,13 @@ = root_url = f.text_field :path, placeholder: 'open-source', class: 'form-control', autofocus: local_assigns[:autofocus] || false + - if @group.persisted? + .bs-callout.bs-callout-danger + %ul + %li Changing group path can have unintended side effects. + %li Renaming group path will rename directory for all related projects + %li It will change web url for access group and group projects. + %li It will change the git path to repositories under this group. .form-group.group-description-holder = f.label :description, 'Details', class: 'control-label' -- cgit v1.2.1 From 5b49bb208a21fa96d0ae1bb93506725deee6c5b5 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 16:42:26 +0200 Subject: Fix issueable context update and fix tests Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/issue.js.coffee | 4 ++-- app/assets/javascripts/merge_request.js.coffee | 4 ++-- app/views/projects/issues/show.html.haml | 2 +- app/views/projects/issues/update.js.haml | 2 +- app/views/projects/merge_requests/_show.html.haml | 2 +- app/views/projects/merge_requests/update.js.haml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/issue.js.coffee b/app/assets/javascripts/issue.js.coffee index 597b4695a6d..45c248e6fb6 100644 --- a/app/assets/javascripts/issue.js.coffee +++ b/app/assets/javascripts/issue.js.coffee @@ -1,9 +1,9 @@ class @Issue constructor: -> $('.edit-issue.inline-update input[type="submit"]').hide() - $(".issue-box .inline-update").on "change", "select", -> + $(".context .inline-update").on "change", "select", -> $(this).submit() - $(".issue-box .inline-update").on "change", "#issue_assignee_id", -> + $(".context .inline-update").on "change", "#issue_assignee_id", -> $(this).submit() if $("a.btn-close").length diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee index 46e06424e5a..fba933ddab5 100644 --- a/app/assets/javascripts/merge_request.js.coffee +++ b/app/assets/javascripts/merge_request.js.coffee @@ -26,9 +26,9 @@ class @MergeRequest initContextWidget: -> $('.edit-merge_request.inline-update input[type="submit"]').hide() - $(".issue-box .inline-update").on "change", "select", -> + $(".context .inline-update").on "change", "select", -> $(this).submit() - $(".issue-box .inline-update").on "change", "#merge_request_assignee_id", -> + $(".context .inline-update").on "change", "#merge_request_assignee_id", -> $(this).submit() initMergeWidget: -> diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 5e5098b73ef..1c9af4c4501 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -48,7 +48,7 @@ - else = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-block btn-close", title: "Close Issue" - = link_to edit_project_issue_path(@project, @issue), class: "btn btn-block" do + = link_to edit_project_issue_path(@project, @issue), class: "btn btn-block issuable-edit" do %i.fa.fa-pencil-square-o Edit .clearfix diff --git a/app/views/projects/issues/update.js.haml b/app/views/projects/issues/update.js.haml index 5199e9fc61f..6e50667b084 100644 --- a/app/views/projects/issues/update.js.haml +++ b/app/views/projects/issues/update.js.haml @@ -3,7 +3,7 @@ :plain $("##{dom_id(@issue)}").fadeOut(); - elsif params[:issue_context] - $('.issue-box .context').effect('highlight'); + $('.context').effect('highlight'); - if @issue.milestone $('.milestone-nav-link').replaceWith("| Milestone #{escape_javascript(link_to @issue.milestone.title, project_milestone_path(@issue.project, @issue.milestone))}") - else diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index fd45ca87b8e..a05c78bc3e9 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -67,7 +67,7 @@ %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-block btn-close", title: "Close merge request" - = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn btn-block", id:"edit_merge_request" do + = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn btn-block issuable-edit", id: "edit_merge_request" do %i.fa.fa-pencil-square-o Edit - if @merge_request.closed? diff --git a/app/views/projects/merge_requests/update.js.haml b/app/views/projects/merge_requests/update.js.haml index 6452cc6382d..6f4c5dd7a3b 100644 --- a/app/views/projects/merge_requests/update.js.haml +++ b/app/views/projects/merge_requests/update.js.haml @@ -1,2 +1,2 @@ - if params[:merge_request_context] - $('.issue-box .context').effect('highlight'); + $('.context').effect('highlight'); -- cgit v1.2.1 From fb7be3238d86501353863313af72563528ace76f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 17:09:48 +0200 Subject: For API compatibility still generate path from name if only name provided Signed-off-by: Dmitriy Zaporozhets --- app/services/projects/create_service.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 7b06ce9a337..31226b7504b 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -13,8 +13,15 @@ module Projects end # Set project name from path - unless @project.name.present? + if @project.name.present? && @project.path.present? + # if both name and path set - everything is ok + elsif @project.path.present? + # Set project name from path @project.name = @project.path.dup + elsif @project.name.present? + # For compatibility - set path from name + # TODO: remove this in 8.0 + @project.path = @project.name.dup.parameterize end # get namespace id -- cgit v1.2.1 From 8be0c60e4069cd07ee4ae4d4f2508b554a0d16c3 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 22 Dec 2014 16:44:14 +0100 Subject: Remove extra css class markdown-area which prevented attachments upload. --- app/views/projects/notes/_note.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index db972ec572d..80e7342455b 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -46,7 +46,7 @@ .note-edit-form = form_for note, url: project_note_path(@project, note), method: :put, remote: true, authenticity_token: true do |f| = render layout: 'projects/md_preview' do - = f.text_area :note, class: 'note_text js-note-text markdown-area js-gfm-input turn-on' + = f.text_area :note, class: 'note_text js-note-text js-gfm-input turn-on' .form-actions.clearfix = f.submit 'Save changes', class: "btn btn-primary btn-save js-comment-button" -- cgit v1.2.1 From a2d188f688759b3889de576bb8019e189bcac902 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 22 Dec 2014 20:36:15 +0200 Subject: Render MR diff full size of screen Signed-off-by: Dmitriy Zaporozhets --- .../stylesheets/sections/merge_requests.scss | 4 -- app/assets/stylesheets/sections/notes.scss | 17 +++++-- app/helpers/notes_helper.rb | 7 ++- app/views/projects/merge_requests/_show.html.haml | 56 +++++++++++----------- 4 files changed, 46 insertions(+), 38 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index ec844cc00b0..a0f709070ac 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -20,16 +20,12 @@ } .merge-request .merge-request-tabs{ - border-bottom: 2px solid $border_primary; margin: 20px 0; li { a { padding: 15px 40px; font-size: 14px; - margin-bottom: -2px; - border-bottom: 2px solid $border_primary; - @include border-radius(0px); } } } diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index e1f9c0cb258..74c500f88b3 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -155,19 +155,26 @@ ul.notes { } .add-diff-note { - background: image-url("diff_note_add.png") no-repeat left 0; - border: none; - height: 22px; - margin-left: -65px; + margin-top: -4px; + @include border-radius(40px); + background: #FFF; + padding: 4px; + font-size: 16px; + color: $link_color; + margin-left: -60px; position: absolute; - width: 22px; z-index: 10; + transition: all 0.2s ease; + // "hide" it by default opacity: 0.0; filter: alpha(opacity=0); &:hover { + font-size: 24px; + background: $bg_primary; + color: #FFF; @include show-add-diff-note; } } diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 901052edec6..6d2244b8714 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -52,8 +52,11 @@ module NotesHelper discussion_id: discussion_id } - button_tag '', class: 'btn add-diff-note js-add-diff-note-button', - data: data, title: 'Add a comment to this line' + button_tag(class: 'btn add-diff-note js-add-diff-note-button', + data: data, + title: 'Add a comment to this line') do + content_tag :i, nil, class: 'fa fa-comment-o' + end end def link_to_reply_diff(note) diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index a05c78bc3e9..57ab6bdd545 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -26,33 +26,6 @@ = render "projects/merge_requests/show/commits" = render "projects/merge_requests/show/participants" - - if @commits.present? - %ul.nav.nav-pills.merge-request-tabs - %li.notes-tab{data: {action: 'notes'}} - = link_to project_merge_request_path(@project, @merge_request) do - %i.fa.fa-comment - Discussion - %span.badge= @merge_request.mr_and_commit_notes.count - %li.diffs-tab{data: {action: 'diffs'}} - = link_to diffs_project_merge_request_path(@project, @merge_request) do - %i.fa.fa-list-alt - Changes - %span.badge= @merge_request.diffs.size - - - content_for :note_actions do - - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.open? - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" - - if @merge_request.closed? - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" - - .diffs.tab-content - - if current_page?(action: 'diffs') - = render "projects/merge_requests/show/diffs" - .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } - = render "projects/notes/notes_with_form" - .mr-loading-status - = spinner .col-sm-3 .issue-btn-group - if can?(current_user, :modify_merge_request, @merge_request) @@ -84,6 +57,35 @@ %cite.cgray = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } + - if @commits.present? + %ul.nav.nav-tabs.merge-request-tabs + %li.notes-tab{data: {action: 'notes'}} + = link_to project_merge_request_path(@project, @merge_request) do + %i.fa.fa-comment + Discussion + %span.badge= @merge_request.mr_and_commit_notes.count + %li.diffs-tab{data: {action: 'diffs'}} + = link_to diffs_project_merge_request_path(@project, @merge_request) do + %i.fa.fa-list-alt + Changes + %span.badge= @merge_request.diffs.size + + - content_for :note_actions do + - if can?(current_user, :modify_merge_request, @merge_request) + - if @merge_request.open? + = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" + - if @merge_request.closed? + = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" + + .diffs.tab-content + - if current_page?(action: 'diffs') + = render "projects/merge_requests/show/diffs" + .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } + .row + .col-sm-9 + = render "projects/notes/notes_with_form" + .mr-loading-status + = spinner :javascript -- cgit v1.2.1 From 9a8ac2accc78f231fdf7ad7fd8b8bb405a24942b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 23 Dec 2014 10:51:14 +0200 Subject: Show issuable context labels as blocks Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/issues/_issue_context.html.haml | 4 ++-- app/views/projects/merge_requests/show/_context.html.haml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/views/projects/issues/_issue_context.html.haml b/app/views/projects/issues/_issue_context.html.haml index d443aae43ac..98777a58f9d 100644 --- a/app/views/projects/issues/_issue_context.html.haml +++ b/app/views/projects/issues/_issue_context.html.haml @@ -1,6 +1,6 @@ = form_for [@project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f| %div.prepend-top-20 - %strong + %p Assignee: - if can?(current_user, :modify_issue, @issue) @@ -11,7 +11,7 @@ None %div.prepend-top-20 - %strong + %p Milestone: - if can?(current_user, :modify_issue, @issue) = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) diff --git a/app/views/projects/merge_requests/show/_context.html.haml b/app/views/projects/merge_requests/show/_context.html.haml index d4b6434b171..5b6e64f0657 100644 --- a/app/views/projects/merge_requests/show/_context.html.haml +++ b/app/views/projects/merge_requests/show/_context.html.haml @@ -1,6 +1,6 @@ = form_for [@project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f| %div.prepend-top-20 - %strong + %p Assignee: - if can?(current_user, :modify_merge_request, @merge_request) @@ -11,7 +11,7 @@ None %div.prepend-top-20 - %strong + %p Milestone: - if can?(current_user, :modify_merge_request, @merge_request) = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) -- cgit v1.2.1 From 90ed76ac3cfc64f7bfc66a90104d055ddd1bb2e7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 23 Dec 2014 11:22:12 +0200 Subject: Prevent 500 after merge MR if you check remove source branch Signed-off-by: Dmitriy Zaporozhets --- app/helpers/tree_helper.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index 329beadbd41..e32aeba5f8f 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -66,7 +66,14 @@ module TreeHelper end def edit_blob_link(project, ref, path, options = {}) - if project.repository.blob_at(ref, path).text? + blob = + begin + project.repository.blob_at(ref, path) + rescue + nil + end + + if blob && blob.text? text = 'Edit' after = options[:after] || '' from_mr = options[:from_merge_request_id] -- cgit v1.2.1 From b34e83d261f30549062ee7c8b9e25f632bbcf163 Mon Sep 17 00:00:00 2001 From: uran Date: Wed, 27 Aug 2014 13:12:42 +0300 Subject: Corrected validation of 'Create branch' and 'Create tag' buttons --- app/assets/javascripts/application.js.coffee | 24 +++++++++--------------- app/views/projects/branches/new.html.haml | 3 ++- app/views/projects/tags/new.html.haml | 3 ++- 3 files changed, 13 insertions(+), 17 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 4cda8b75d8e..2ff64efdc5b 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -76,24 +76,18 @@ window.disableButtonIfEmptyField = (field_selector, button_selector) -> # Disable button if any input field with given selector is empty window.disableButtonIfAnyEmptyField = (form, form_selector, button_selector) -> closest_submit = form.find(button_selector) - empty = false - form.find('input').filter(form_selector).each -> - empty = true if rstrip($(this).val()) is "" - - if empty - closest_submit.disable() - else - closest_submit.enable() - - form.keyup -> - empty = false + updateButtons = -> + filled = true form.find('input').filter(form_selector).each -> - empty = true if rstrip($(this).val()) is "" + filled = rstrip($(this).val()) != "" || !$(this).attr('required') - if empty - closest_submit.disable() - else + if filled closest_submit.enable() + else + closest_submit.disable() + + updateButtons() + form.keyup(updateButtons) window.sanitize = (str) -> return str.replace(/<(?:.|\n)*?>/gm, '') diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml index a6623240da1..2719bcc33bc 100644 --- a/app/views/projects/branches/new.html.haml +++ b/app/views/projects/branches/new.html.haml @@ -5,7 +5,7 @@ %h3.page-title %i.fa.fa-code-fork New branch -= form_tag project_branches_path, method: :post, class: "form-horizontal" do += form_tag project_branches_path, method: :post, id: "new-branch-form", class: "form-horizontal" do .form-group = label_tag :branch_name, 'Name for new branch', class: 'control-label' .col-sm-10 @@ -19,6 +19,7 @@ = link_to 'Cancel', project_branches_path(@project), class: 'btn btn-cancel' :javascript + disableButtonIfAnyEmptyField($("#new-branch-form"), ".form-control", ".btn-create"); var availableTags = #{@project.repository.ref_names.to_json}; $("#ref").autocomplete({ diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index ad7ff8d3db8..289c52a2e3f 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -5,7 +5,7 @@ %h3.page-title %i.fa.fa-code-fork New tag -= form_tag project_tags_path, method: :post, class: "form-horizontal" do += form_tag project_tags_path, method: :post, id: "new-tag-form", class: "form-horizontal" do .form-group = label_tag :tag_name, 'Name for new tag', class: 'control-label' .col-sm-10 @@ -25,6 +25,7 @@ = link_to 'Cancel', project_tags_path(@project), class: 'btn btn-cancel' :javascript + disableButtonIfAnyEmptyField($("#new-tag-form"), ".form-control", ".btn-create"); var availableTags = #{@project.repository.ref_names.to_json}; $("#ref").autocomplete({ -- cgit v1.2.1 From 32eb5de510a7e32d9bb886595aa47d95dc00490f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 23 Dec 2014 17:31:38 +0200 Subject: One column issue/mr lists for project Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/gl_bootstrap.scss | 4 ++ app/helpers/projects_helper.rb | 25 --------- app/views/projects/_issuable_filter.html.haml | 39 ++++++++++++++ app/views/projects/issues/index.html.haml | 11 ++-- app/views/projects/merge_requests/index.html.haml | 30 +++++------ app/views/shared/_project_filter.html.haml | 64 ----------------------- 6 files changed, 59 insertions(+), 114 deletions(-) delete mode 100644 app/views/shared/_project_filter.html.haml (limited to 'app') diff --git a/app/assets/stylesheets/gl_bootstrap.scss b/app/assets/stylesheets/gl_bootstrap.scss index 9c5e76ab8e2..2a68d922bb7 100644 --- a/app/assets/stylesheets/gl_bootstrap.scss +++ b/app/assets/stylesheets/gl_bootstrap.scss @@ -148,6 +148,10 @@ $list-group-active-bg: $bg_primary; color: #666; } +.nav-compact > li > a { + padding: 6px 12px; +} + .nav-small > li > a { padding: 3px 5px; font-size: 12px; diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index fb5470d98e5..6568f438e25 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -68,31 +68,6 @@ module ProjectsHelper project_nav_tabs.include? name end - def selected_label?(label_name) - params[:label_name].to_s.split(',').include?(label_name) - end - - def labels_filter_path(label_name) - label_name = - if selected_label?(label_name) - params[:label_name].split(',').reject { |l| l == label_name }.join(',') - elsif params[:label_name].present? - "#{params[:label_name]},#{label_name}" - else - label_name - end - - project_filter_path(label_name: label_name) - end - - def label_filter_class(label_name) - if selected_label?(label_name) - 'label-filter-item active' - else - 'label-filter-item light' - end - end - def project_filter_path(options={}) exist_opts = { state: params[:state], diff --git a/app/views/projects/_issuable_filter.html.haml b/app/views/projects/_issuable_filter.html.haml index b3e5efd938f..45b5137a1b3 100644 --- a/app/views/projects/_issuable_filter.html.haml +++ b/app/views/projects/_issuable_filter.html.haml @@ -1,4 +1,19 @@ .issues-filters + .pull-left.append-right-20 + %ul.nav.nav-pills.nav-compact + %li{class: ("active" if params[:state] == 'opened')} + = link_to project_filter_path(state: 'opened') do + %i.fa.fa-exclamation-circle + Open + %li{class: ("active" if params[:state] == 'closed')} + = link_to project_filter_path(state: 'closed') do + %i.fa.fa-check-circle + Closed + %li{class: ("active" if params[:state] == 'all')} + = link_to project_filter_path(state: 'all') do + %i.fa.fa-compass + All + .dropdown.inline %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-user @@ -68,5 +83,29 @@ %strong= milestone.title %small.light= milestone.expires_at + .dropdown.inline.prepend-left-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-user + %span.light label: + - if params[:label_name].present? + %strong= params[:label_name] + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to project_filter_path(label_name: nil) do + Any + - if @project.labels.any? + - @project.labels.order_by_name.each do |label| + %li + = link_to project_filter_path(label_name: label.name) do + = render_colored_label(label) + - else + %li + = link_to generate_project_labels_path(@project, redirect: request.original_url), method: :post do + %i.fa.fa-plus-circle + Create default labels + .pull-right = render 'shared/sort_dropdown' diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index 8db6241f21f..0d00d6bfded 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -1,9 +1,4 @@ = render "projects/issues_nav" -.row - .fixed.fixed.sidebar-expand-button.hidden-lg.hidden-md.hidden-xs - %i.fa.fa-list.fa-2x - .col-md-3.responsive-side - = render 'shared/project_filter', project_entities_path: project_issues_path(@project), - labels: true, redirect: 'issues', entity: 'issue' - .col-md-9.issues-holder - = render "issues" + +.issues-holder + = render "issues" diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index b93e0f9da3e..6a615266ca3 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,23 +1,19 @@ = render "projects/issues_nav" -.row - .col-md-3.responsive-side - = render 'shared/project_filter', project_entities_path: project_merge_requests_path(@project), - labels: true, redirect: 'merge_requests', entity: 'merge_request' - .col-md-9 - .append-bottom-10 - = render 'projects/issuable_filter' - .panel.panel-default - %ul.well-list.mr-list - = render @merge_requests - - if @merge_requests.blank? - %li - .nothing-here-block No merge requests to show - - if @merge_requests.present? - .pull-right - %span.cgray.pull-right #{@merge_requests.total_count} merge requests for this filter +.merge-requests-holder + .append-bottom-10 + = render 'projects/issuable_filter' + .panel.panel-default + %ul.well-list.mr-list + = render @merge_requests + - if @merge_requests.blank? + %li + .nothing-here-block No merge requests to show + - if @merge_requests.present? + .pull-right + %span.cgray.pull-right #{@merge_requests.total_count} merge requests for this filter - = paginate @merge_requests, theme: "gitlab" + = paginate @merge_requests, theme: "gitlab" :javascript $(merge_requestsPage); diff --git a/app/views/shared/_project_filter.html.haml b/app/views/shared/_project_filter.html.haml deleted file mode 100644 index ea6a49e1501..00000000000 --- a/app/views/shared/_project_filter.html.haml +++ /dev/null @@ -1,64 +0,0 @@ -.side-filters - = form_tag project_entities_path, method: 'get' do - - if current_user - %fieldset - %ul.nav.nav-pills.nav-stacked - %li{class: ("active" if params[:scope] == 'all')} - = link_to project_filter_path(scope: 'all') do - Everyone's - %span.pull-right - = authorized_entities_count(current_user, entity, @project) - %li{class: ("active" if params[:scope] == 'assigned-to-me')} - = link_to project_filter_path(scope: 'assigned-to-me') do - Assigned to me - %span.pull-right - = assigned_entities_count(current_user, entity, @project) - %li{class: ("active" if params[:scope] == 'created-by-me')} - = link_to project_filter_path(scope: 'created-by-me') do - Created by me - %span.pull-right - = authored_entities_count(current_user, entity, @project) - - %fieldset - %legend State - %ul.nav.nav-pills - %li{class: ("active" if params[:state] == 'opened')} - = link_to project_filter_path(state: 'opened') do - Open - %li{class: ("active" if params[:state] == 'closed')} - = link_to project_filter_path(state: 'closed') do - Closed - %li{class: ("active" if params[:state] == 'all')} - = link_to project_filter_path(state: 'all') do - All - - - if defined?(labels) - %fieldset - %legend - Labels - %small.pull-right - = link_to project_labels_path(@project), class: 'light' do - %i.fa.fa-pencil-square-o - %ul.nav.nav-pills.nav-stacked.nav-small.labels-filter - - @project.labels.order_by_name.each do |label| - %li{class: label_filter_class(label.name)} - = link_to labels_filter_path(label.name) do - = render_colored_label(label) - - if selected_label?(label.name) - .pull-right - %i.fa.fa-times - - - if @project.labels.empty? - .light-well - Create first label at - = link_to 'labels page', project_labels_path(@project) - %br - or #{link_to 'generate', generate_project_labels_path(@project, redirect: redirect), method: :post} default set of labels - - %fieldset - - if %w(state scope milestone_id assignee_id label_name).select { |k| params[k].present? }.any? - = link_to project_entities_path, class: 'cgray pull-right' do - %i.fa.fa-times - %strong Clear filter - - -- cgit v1.2.1 From 47634e392fab457dd0634225961944804bc04efe Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 23 Dec 2014 18:49:39 +0200 Subject: Refactor issues and merge requests lists Signed-off-by: Dmitriy Zaporozhets --- app/controllers/application_controller.rb | 42 ++++++++ app/controllers/dashboard_controller.rb | 12 +-- app/controllers/groups_controller.rb | 18 +--- app/controllers/projects/application_controller.rb | 27 ----- app/controllers/projects/issues_controller.rb | 6 +- .../projects/merge_requests_controller.rb | 6 +- app/helpers/application_helper.rb | 18 ++++ app/helpers/dashboard_helper.rb | 14 --- app/helpers/projects_helper.rb | 17 ---- app/views/dashboard/issues.html.haml | 10 +- app/views/dashboard/merge_requests.html.haml | 10 +- app/views/groups/issues.html.haml | 10 +- app/views/groups/merge_requests.html.haml | 10 +- app/views/layouts/nav/_group.html.haml | 4 +- app/views/projects/_issuable_filter.html.haml | 111 -------------------- app/views/projects/_issues_nav.html.haml | 11 +- app/views/projects/issues/_issues.html.haml | 2 +- app/views/projects/merge_requests/index.html.haml | 2 +- app/views/shared/_filter.html.haml | 50 --------- app/views/shared/_issuable_filter.html.haml | 112 +++++++++++++++++++++ app/views/shared/_sort_dropdown.html.haml | 12 +-- 21 files changed, 217 insertions(+), 287 deletions(-) delete mode 100644 app/views/projects/_issuable_filter.html.haml delete mode 100644 app/views/shared/_filter.html.haml create mode 100644 app/views/shared/_issuable_filter.html.haml (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f1e1bebe5ce..0ddd743f053 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -239,4 +239,46 @@ class ApplicationController < ActionController::Base redirect_to profile_path, notice: 'Please complete your profile with email address' and return end end + + def set_filters_defaults + params[:sort] ||= 'newest' + params[:scope] = 'all' if params[:scope].blank? + params[:state] = 'opened' if params[:state].blank? + + @sort = params[:sort].humanize + + if @project + params[:project_id] = @project.id + elsif @group + params[:group_id] = @group.id + else + params[:authorized_only] = true + + unless params[:assignee_id].present? + params[:assignee_id] = current_user.id + end + end + end + + def set_filter_values(collection) + assignee_id = params[:assignee_id] + author_id = params[:author_id] + milestone_id = params[:milestone_id] + + @assignees = User.where(id: collection.pluck(:assignee_id)) + @authors = User.where(id: collection.pluck(:author_id)) + @milestones = Milestone.where(id: collection.pluck(:milestone_id)) + + if assignee_id.present? && !assignee_id.to_i.zero? + @assignee = @assignees.find(assignee_id) + end + + if author_id.present? && !author_id.to_i.zero? + @author = @authors.find(author_id) + end + + if milestone_id.present? && !milestone_id.to_i.zero? + @milestone = @milestones.find(milestone_id) + end + end end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 5aff526d1b5..bfd1361f2df 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -3,8 +3,6 @@ class DashboardController < ApplicationController before_filter :load_projects, except: [:projects] before_filter :event_filter, only: :show - before_filter :default_filter, only: [:issues, :merge_requests] - def show # Fetch only 30 projects. @@ -55,13 +53,17 @@ class DashboardController < ApplicationController end def merge_requests + set_filters_defaults @merge_requests = MergeRequestsFinder.new.execute(current_user, params) + set_filter_values(@merge_requests) @merge_requests = @merge_requests.page(params[:page]).per(20) @merge_requests = @merge_requests.preload(:author, :target_project) end def issues + set_filters_defaults @issues = IssuesFinder.new.execute(current_user, params) + set_filter_values(@issues) @issues = @issues.page(params[:page]).per(20) @issues = @issues.preload(:author, :project) @@ -76,10 +78,4 @@ class DashboardController < ApplicationController def load_projects @projects = current_user.authorized_projects.sorted_by_activity.non_archived end - - def default_filter - params[:scope] = 'assigned-to-me' if params[:scope].blank? - params[:state] = 'opened' if params[:state].blank? - params[:authorized_only] = true - end end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 36222758eb2..a28f4cc4072 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -11,8 +11,6 @@ class GroupsController < ApplicationController # Load group projects before_filter :load_projects, except: [:new, :create, :projects, :edit, :update] - before_filter :default_filter, only: [:issues, :merge_requests] - layout :determine_layout before_filter :set_title, only: [:new, :create] @@ -47,13 +45,17 @@ class GroupsController < ApplicationController end def merge_requests + set_filters_defaults @merge_requests = MergeRequestsFinder.new.execute(current_user, params) + set_filter_values(@merge_requests) @merge_requests = @merge_requests.page(params[:page]).per(20) @merge_requests = @merge_requests.preload(:author, :target_project) end def issues + set_filters_defaults @issues = IssuesFinder.new.execute(current_user, params) + set_filter_values(@issues) @issues = @issues.page(params[:page]).per(20) @issues = @issues.preload(:author, :project) @@ -148,18 +150,6 @@ class GroupsController < ApplicationController end end - def default_filter - if params[:scope].blank? - if current_user - params[:scope] = 'assigned-to-me' - else - params[:scope] = 'all' - end - end - params[:state] = 'opened' if params[:state].blank? - params[:group_id] = @group.id - end - def group_params params.require(:group).permit(:name, :description, :path, :avatar) end diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb index 6b7fe06d59f..7e4580017dd 100644 --- a/app/controllers/projects/application_controller.rb +++ b/app/controllers/projects/application_controller.rb @@ -29,31 +29,4 @@ class Projects::ApplicationController < ApplicationController redirect_to project_tree_path(@project, @ref), notice: "This action is not allowed unless you are on top of a branch" end end - - def set_filter_variables(collection) - params[:sort] ||= 'newest' - params[:scope] = 'all' if params[:scope].blank? - params[:state] = 'opened' if params[:state].blank? - - @sort = params[:sort].humanize - - assignee_id = params[:assignee_id] - author_id = params[:author_id] - milestone_id = params[:milestone_id] - - if assignee_id.present? && !assignee_id.to_i.zero? - @assignee = @project.team.find(assignee_id) - end - - if author_id.present? && !author_id.to_i.zero? - @author = @project.team.find(assignee_id) - end - - if milestone_id.present? && !milestone_id.to_i.zero? - @milestone = @project.milestones.find(milestone_id) - end - - @assignees = User.where(id: collection.pluck(:assignee_id)) - @authors = User.where(id: collection.pluck(:author_id)) - end end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 22235123826..0266c51babb 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -18,9 +18,9 @@ class Projects::IssuesController < Projects::ApplicationController def index terms = params['issue_search'] - set_filter_variables(@project.issues) - - @issues = IssuesFinder.new.execute(current_user, params.merge(project_id: @project.id)) + set_filters_defaults + @issues = IssuesFinder.new.execute(current_user, params) + set_filter_values(@issues) @issues = @issues.full_search(terms) if terms.present? @issues = @issues.page(params[:page]).per(20) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 4d6f41e9de5..20d1222326e 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -17,9 +17,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController before_filter :authorize_modify_merge_request!, only: [:close, :edit, :update, :sort] def index - set_filter_variables(@project.merge_requests) - - @merge_requests = MergeRequestsFinder.new.execute(current_user, params.merge(project_id: @project.id)) + set_filters_defaults + @merge_requests = MergeRequestsFinder.new.execute(current_user, params) + set_filter_values(@merge_requests) @merge_requests = @merge_requests.page(params[:page]).per(20) end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 01aa4a60d4c..90cc58f44b7 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -275,4 +275,22 @@ module ApplicationHelper def promo_url 'https://' + promo_host end + + def page_filter_path(options={}) + exist_opts = { + state: params[:state], + scope: params[:scope], + label_name: params[:label_name], + milestone_id: params[:milestone_id], + assignee_id: params[:assignee_id], + author_id: params[:author_id], + sort: params[:sort], + } + + options = exist_opts.merge(options) + + path = request.path + path << "?#{options.to_param}" + path + end end diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb index acc0eeb76b3..976a396e7b6 100644 --- a/app/helpers/dashboard_helper.rb +++ b/app/helpers/dashboard_helper.rb @@ -1,18 +1,4 @@ module DashboardHelper - def filter_path(entity, options={}) - exist_opts = { - state: params[:state], - scope: params[:scope], - project_id: params[:project_id], - } - - options = exist_opts.merge(options) - - path = request.path - path << "?#{options.to_param}" - path - end - def entities_per_project(project, entity) case entity.to_sym when :issue then @issues.where(project_id: project.id) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 6568f438e25..e489d431e84 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -68,23 +68,6 @@ module ProjectsHelper project_nav_tabs.include? name end - def project_filter_path(options={}) - exist_opts = { - state: params[:state], - scope: params[:scope], - label_name: params[:label_name], - milestone_id: params[:milestone_id], - assignee_id: params[:assignee_id], - sort: params[:sort], - } - - options = exist_opts.merge(options) - - path = request.path - path << "?#{options.to_param}" - path - end - def project_active_milestones @project.milestones.active.order("due_date, title ASC") end diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml index 7c1f1ddbb80..db19a46cb26 100644 --- a/app/views/dashboard/issues.html.haml +++ b/app/views/dashboard/issues.html.haml @@ -5,10 +5,6 @@ List all issues from all projects you have access to. %hr -.row - .fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x - .col-md-3.responsive-side - = render 'shared/filter', entity: 'issue' - .col-md-9 - = render 'shared/issues' +.append-bottom-20 + = render 'shared/issuable_filter' += render 'shared/issues' diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml index c96584c7b6b..97a42461b4e 100644 --- a/app/views/dashboard/merge_requests.html.haml +++ b/app/views/dashboard/merge_requests.html.haml @@ -5,10 +5,6 @@ %p.light List all merge requests from all projects you have access to. %hr -.row - .fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x - .col-md-3.responsive-side - = render 'shared/filter', entity: 'merge_request' - .col-md-9 - = render 'shared/merge_requests' +.append-bottom-20 + = render 'shared/issuable_filter' += render 'shared/merge_requests' diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml index 1932ba2f644..6c0d89c4e7c 100644 --- a/app/views/groups/issues.html.haml +++ b/app/views/groups/issues.html.haml @@ -9,10 +9,6 @@ To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page. %hr -.row - .fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x - .col-md-3.responsive-side - = render 'shared/filter', entity: 'issue' - .col-md-9 - = render 'shared/issues' +.append-bottom-20 + = render 'shared/issuable_filter' += render 'shared/issues' diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml index 86d5acdaa32..1ad74905636 100644 --- a/app/views/groups/merge_requests.html.haml +++ b/app/views/groups/merge_requests.html.haml @@ -8,10 +8,6 @@ - if current_user To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page. %hr -.row - .fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x - .col-md-3.responsive-side - = render 'shared/filter', entity: 'merge_request' - .col-md-9 - = render 'shared/merge_requests' +.append-bottom-20 + = render 'shared/issuable_filter' += render 'shared/merge_requests' diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 78d6b768155..3c8f47a7bea 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -13,13 +13,13 @@ %i.fa.fa-exclamation-circle Issues - if current_user - %span.count= current_user.assigned_issues.opened.of_group(@group).count + %span.count= Issue.opened.of_group(@group).count = nav_link(path: 'groups#merge_requests') do = link_to merge_requests_group_path(@group) do %i.fa.fa-tasks Merge Requests - if current_user - %span.count= current_user.cared_merge_requests.opened.of_group(@group).count + %span.count= MergeRequest.opened.of_group(@group).count = nav_link(path: 'groups#members') do = link_to members_group_path(@group) do %i.fa.fa-users diff --git a/app/views/projects/_issuable_filter.html.haml b/app/views/projects/_issuable_filter.html.haml deleted file mode 100644 index 45b5137a1b3..00000000000 --- a/app/views/projects/_issuable_filter.html.haml +++ /dev/null @@ -1,111 +0,0 @@ -.issues-filters - .pull-left.append-right-20 - %ul.nav.nav-pills.nav-compact - %li{class: ("active" if params[:state] == 'opened')} - = link_to project_filter_path(state: 'opened') do - %i.fa.fa-exclamation-circle - Open - %li{class: ("active" if params[:state] == 'closed')} - = link_to project_filter_path(state: 'closed') do - %i.fa.fa-check-circle - Closed - %li{class: ("active" if params[:state] == 'all')} - = link_to project_filter_path(state: 'all') do - %i.fa.fa-compass - All - - .dropdown.inline - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-user - %span.light assignee: - - if @assignee.present? - %strong= @assignee.name - - elsif params[:assignee_id] == "0" - Unassigned - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(assignee_id: nil) do - Any - = link_to project_filter_path(assignee_id: 0) do - Unassigned - - @assignees.sort_by(&:name).each do |user| - %li - = link_to project_filter_path(assignee_id: user.id) do - = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' - = user.name - - .dropdown.inline.prepend-left-10 - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-user - %span.light author: - - if @author.present? - %strong= @author.name - - elsif params[:author_id] == "0" - Unassigned - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(author_id: nil) do - Any - = link_to project_filter_path(author_id: 0) do - Unassigned - - @authors.sort_by(&:name).each do |user| - %li - = link_to project_filter_path(author_id: user.id) do - = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' - = user.name - - .dropdown.inline.prepend-left-10 - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-clock-o - %span.light milestone: - - if @milestone.present? - %strong= @milestone.title - - elsif params[:milestone_id] == "0" - None (backlog) - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(milestone_id: nil) do - Any - = link_to project_filter_path(milestone_id: 0) do - None (backlog) - - project_active_milestones.each do |milestone| - %li - = link_to project_filter_path(milestone_id: milestone.id) do - %strong= milestone.title - %small.light= milestone.expires_at - - .dropdown.inline.prepend-left-10 - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-user - %span.light label: - - if params[:label_name].present? - %strong= params[:label_name] - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to project_filter_path(label_name: nil) do - Any - - if @project.labels.any? - - @project.labels.order_by_name.each do |label| - %li - = link_to project_filter_path(label_name: label.name) do - = render_colored_label(label) - - else - %li - = link_to generate_project_labels_path(@project, redirect: request.original_url), method: :post do - %i.fa.fa-plus-circle - Create default labels - - .pull-right - = render 'shared/sort_dropdown' diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml index 18628eb6207..4e2ef3202f9 100644 --- a/app/views/projects/_issues_nav.html.haml +++ b/app/views/projects/_issues_nav.html.haml @@ -2,15 +2,22 @@ - if project_nav_tab? :issues = nav_link(controller: :issues) do = link_to project_issues_path(@project), class: "tab" do + %i.fa.fa-exclamation-circle Issues - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do = link_to project_merge_requests_path(@project), class: "tab" do + %i.fa.fa-tasks Merge Requests = nav_link(controller: :milestones) do - = link_to 'Milestones', project_milestones_path(@project), class: "tab" + = link_to project_milestones_path(@project), class: "tab" do + %i.fa.fa-clock-o + Milestones = nav_link(controller: :labels) do - = link_to 'Labels', project_labels_path(@project), class: "tab" + = link_to project_labels_path(@project), class: "tab" do + %i.fa.fa-tags + Labels + - if current_controller?(:milestones) %li.pull-right diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 15c84c7ced2..010ca3b68b3 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -1,7 +1,7 @@ .append-bottom-10 .check-all-holder = check_box_tag "check_all_issues", nil, false, class: "check_all_issues left" - = render 'projects/issuable_filter' + = render 'shared/issuable_filter' .clearfix .issues_bulk_update.hide diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index 6a615266ca3..2654ea70990 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -2,7 +2,7 @@ .merge-requests-holder .append-bottom-10 - = render 'projects/issuable_filter' + = render 'shared/issuable_filter' .panel.panel-default %ul.well-list.mr-list = render @merge_requests diff --git a/app/views/shared/_filter.html.haml b/app/views/shared/_filter.html.haml deleted file mode 100644 index d366dd97a71..00000000000 --- a/app/views/shared/_filter.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -.side-filters - = form_tag filter_path(entity), method: 'get' do - - if current_user - %fieldset.scope-filter - %ul.nav.nav-pills.nav-stacked - %li{class: ("active" if params[:scope] == 'assigned-to-me')} - = link_to filter_path(entity, scope: 'assigned-to-me') do - Assigned to me - %span.pull-right - = assigned_entities_count(current_user, entity, @group) - %li{class: ("active" if params[:scope] == 'authored')} - = link_to filter_path(entity, scope: 'authored') do - Created by me - %span.pull-right - = authored_entities_count(current_user, entity, @group) - %li{class: ("active" if params[:scope] == 'all')} - = link_to filter_path(entity, scope: 'all') do - Everyone's - %span.pull-right - = authorized_entities_count(current_user, entity, @group) - - %fieldset.status-filter - %legend State - %ul.nav.nav-pills - %li{class: ("active" if params[:state] == 'opened')} - = link_to filter_path(entity, state: 'opened') do - Open - %li{class: ("active" if params[:state] == 'closed')} - = link_to filter_path(entity, state: 'closed') do - Closed - %li{class: ("active" if params[:state] == 'all')} - = link_to filter_path(entity, state: 'all') do - All - - %fieldset - %legend Projects - %ul.nav.nav-pills.nav-stacked.nav-small - - @projects.each do |project| - - unless entities_per_project(project, entity).zero? - %li{class: ("active" if params[:project_id] == project.id.to_s)} - = link_to filter_path(entity, project_id: project.id) do - = project.name_with_namespace - %small.pull-right= entities_per_project(project, entity) - - %fieldset - - if params[:state].present? || params[:project_id].present? - = link_to filter_path(entity, state: nil, project_id: nil), class: 'pull-right cgray' do - %i.fa.fa-times - %strong Clear filter - diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml new file mode 100644 index 00000000000..56d58a52686 --- /dev/null +++ b/app/views/shared/_issuable_filter.html.haml @@ -0,0 +1,112 @@ +.issues-filters + .pull-left.append-right-20 + %ul.nav.nav-pills.nav-compact + %li{class: ("active" if params[:state] == 'opened')} + = link_to page_filter_path(state: 'opened') do + %i.fa.fa-exclamation-circle + Open + %li{class: ("active" if params[:state] == 'closed')} + = link_to page_filter_path(state: 'closed') do + %i.fa.fa-check-circle + Closed + %li{class: ("active" if params[:state] == 'all')} + = link_to page_filter_path(state: 'all') do + %i.fa.fa-compass + All + + .dropdown.inline + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-user + %span.light assignee: + - if @assignee.present? + %strong= @assignee.name + - elsif params[:assignee_id] == "0" + Unassigned + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to page_filter_path(assignee_id: nil) do + Any + = link_to page_filter_path(assignee_id: 0) do + Unassigned + - @assignees.sort_by(&:name).each do |user| + %li + = link_to page_filter_path(assignee_id: user.id) do + = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' + = user.name + + .dropdown.inline.prepend-left-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-user + %span.light author: + - if @author.present? + %strong= @author.name + - elsif params[:author_id] == "0" + Unassigned + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to page_filter_path(author_id: nil) do + Any + = link_to page_filter_path(author_id: 0) do + Unassigned + - @authors.sort_by(&:name).each do |user| + %li + = link_to page_filter_path(author_id: user.id) do + = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' + = user.name + + .dropdown.inline.prepend-left-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-clock-o + %span.light milestone: + - if @milestone.present? + %strong= @milestone.title + - elsif params[:milestone_id] == "0" + None (backlog) + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to page_filter_path(milestone_id: nil) do + Any + = link_to page_filter_path(milestone_id: 0) do + None (backlog) + - @milestones.each do |milestone| + %li + = link_to page_filter_path(milestone_id: milestone.id) do + %strong= milestone.title + %small.light= milestone.expires_at + + - if @project + .dropdown.inline.prepend-left-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-tags + %span.light label: + - if params[:label_name].present? + %strong= params[:label_name] + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to page_filter_path(label_name: nil) do + Any + - if @project.labels.any? + - @project.labels.order_by_name.each do |label| + %li + = link_to page_filter_path(label_name: label.name) do + = render_colored_label(label) + - else + %li + = link_to generate_project_labels_path(@project, redirect: request.original_url), method: :post do + %i.fa.fa-plus-circle + Create default labels + + .pull-right + = render 'shared/sort_dropdown' diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml index 54f59245690..93ed9b67336 100644 --- a/app/views/shared/_sort_dropdown.html.haml +++ b/app/views/shared/_sort_dropdown.html.haml @@ -8,15 +8,15 @@ %b.caret %ul.dropdown-menu %li - = link_to project_filter_path(sort: 'newest') do + = link_to page_filter_path(sort: 'newest') do = sort_title_recently_created - = link_to project_filter_path(sort: 'oldest') do + = link_to page_filter_path(sort: 'oldest') do = sort_title_oldest_created - = link_to project_filter_path(sort: 'recently_updated') do + = link_to page_filter_path(sort: 'recently_updated') do = sort_title_recently_updated - = link_to project_filter_path(sort: 'last_updated') do + = link_to page_filter_path(sort: 'last_updated') do = sort_title_oldest_updated - = link_to project_filter_path(sort: 'milestone_due_soon') do + = link_to page_filter_path(sort: 'milestone_due_soon') do Milestone due soon - = link_to project_filter_path(sort: 'milestone_due_later') do + = link_to page_filter_path(sort: 'milestone_due_later') do Milestone due later -- cgit v1.2.1 From 1fa19401e969f79cbd737c55e63249ca9355791c Mon Sep 17 00:00:00 2001 From: Jason Lippert Date: Mon, 8 Dec 2014 16:54:09 -0500 Subject: Teamcity interaction using 8.1 rest api --- app/controllers/projects/services_controller.rb | 2 +- app/models/project.rb | 4 +- app/models/project_services/teamcity_service.rb | 116 ++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 app/models/project_services/teamcity_service.rb (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index c50a1f1e75b..ef4d2609147 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -42,7 +42,7 @@ class Projects::ServicesController < Projects::ApplicationController :title, :token, :type, :active, :api_key, :subdomain, :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, - :build_key, :server + :build_key, :server, :teamcity_url, :build_type ) end end diff --git a/app/models/project.rb b/app/models/project.rb index 32b0145ca24..f0a49b633fe 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -66,6 +66,7 @@ class Project < ActiveRecord::Base has_one :slack_service, dependent: :destroy has_one :buildbox_service, dependent: :destroy has_one :bamboo_service, dependent: :destroy + has_one :teamcity_service, dependent: :destroy has_one :pushover_service, dependent: :destroy has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" has_one :forked_from_project, through: :forked_project_link @@ -314,7 +315,8 @@ class Project < ActiveRecord::Base end def available_services_names - %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla emails_on_push gemnasium slack pushover buildbox bamboo) + %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla + emails_on_push gemnasium slack pushover buildbox bamboo teamcity) end def gitlab_ci? diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb new file mode 100644 index 00000000000..52b5862e4d1 --- /dev/null +++ b/app/models/project_services/teamcity_service.rb @@ -0,0 +1,116 @@ +class TeamcityService < CiService + include HTTParty + + prop_accessor :teamcity_url, :build_type, :username, :password + + validates :teamcity_url, presence: true, + format: { with: URI::regexp }, if: :activated? + validates :build_type, presence: true, if: :activated? + validates :username, presence: true, + if: ->(service) { service.password? }, if: :activated? + validates :password, presence: true, + if: ->(service) { service.username? }, if: :activated? + + attr_accessor :response + + after_save :compose_service_hook, if: :activated? + + def compose_service_hook + hook = service_hook || build_service_hook + hook.save + end + + def title + 'JetBrains TeamCity CI' + end + + def description + 'A continuous integration and build server' + end + + def help + 'The build configuration in Teamcity must use the build format '\ + 'number %build.vcs.number% '\ + 'you will also want to configure monitoring of all branches so merge '\ + 'requests build, that setting is in the vsc root advanced settings.' + end + + def to_param + 'teamcity' + end + + def fields + [ + { type: 'text', name: 'teamcity_url', + placeholder: 'TeamCity root URL like https://teamcity.example.com' }, + { type: 'text', name: 'build_type', + placeholder: 'Build configuration ID' }, + { type: 'text', name: 'username', + placeholder: 'A user with permissions to trigger a manual build' }, + { type: 'password', name: 'password' }, + ] + end + + def build_info(sha) + url = URI.parse("#{teamcity_url}/httpAuth/app/rest/builds/"\ + "branch:unspecified:any,number:#{sha}") + auth = { + username: username, + password: password, + } + @response = HTTParty.get("#{url}", verify: false, basic_auth: auth) + end + + def build_page(sha) + build_info(sha) if @response.nil? || !@response.code + + if @response.code != 200 + # If actual build link can't be determined, + # send user to build summary page. + "#{teamcity_url}/viewLog.html?buildTypeId=#{build_type}" + else + # If actual build link is available, go to build result page. + built_id = @response['build']['id'] + "#{teamcity_url}/viewLog.html?buildId=#{built_id}"\ + "&buildTypeId=#{build_type}" + end + end + + def commit_status(sha) + build_info(sha) if @response.nil? || !@response.code + return :error unless @response.code == 200 || @response.code == 404 + + status = if @response.code == 404 + 'Pending' + else + @response['build']['status'] + end + + if status.include?('SUCCESS') + 'success' + elsif status.include?('FAILURE') + 'failed' + elsif status.include?('Pending') + 'pending' + else + :error + end + end + + def execute(data) + auth = { + username: username, + password: password, + } + + branch = data[:ref] + + self.class.post("#{teamcity_url}/httpAuth/app/rest/buildQueue", + body: ""\ + ""\ + '', + headers: { 'Content-type' => 'application/xml' }, + basic_auth: auth + ) + end +end -- cgit v1.2.1 From 016981c009a2a8c6066085300a838d9c9d6bfd5d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 24 Dec 2014 11:04:33 +0200 Subject: Refactor issuable list pages Signed-off-by: Dmitriy Zaporozhets --- app/controllers/application_controller.rb | 37 ++++++++++++++++------ app/controllers/dashboard_controller.rb | 8 ++--- app/controllers/groups_controller.rb | 8 ++--- app/controllers/projects/issues_controller.rb | 4 +-- .../projects/merge_requests_controller.rb | 4 +-- 5 files changed, 33 insertions(+), 28 deletions(-) (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0ddd743f053..79824116b41 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -240,24 +240,26 @@ class ApplicationController < ActionController::Base end end - def set_filters_defaults + def set_filters_params params[:sort] ||= 'newest' params[:scope] = 'all' if params[:scope].blank? params[:state] = 'opened' if params[:state].blank? - @sort = params[:sort].humanize + @filter_params = params.dup if @project - params[:project_id] = @project.id + @filter_params[:project_id] = @project.id elsif @group - params[:group_id] = @group.id + @filter_params[:group_id] = @group.id else - params[:authorized_only] = true + @filter_params[:authorized_only] = true - unless params[:assignee_id].present? - params[:assignee_id] = current_user.id + unless @filter_params[:assignee_id] + @filter_params[:assignee_id] = current_user.id end end + + @filter_params end def set_filter_values(collection) @@ -265,20 +267,35 @@ class ApplicationController < ActionController::Base author_id = params[:author_id] milestone_id = params[:milestone_id] + @sort = params[:sort].try(:humanize) @assignees = User.where(id: collection.pluck(:assignee_id)) @authors = User.where(id: collection.pluck(:author_id)) @milestones = Milestone.where(id: collection.pluck(:milestone_id)) if assignee_id.present? && !assignee_id.to_i.zero? - @assignee = @assignees.find(assignee_id) + @assignee = @assignees.find_by(id: assignee_id) end if author_id.present? && !author_id.to_i.zero? - @author = @authors.find(author_id) + @author = @authors.find_by(id: author_id) end if milestone_id.present? && !milestone_id.to_i.zero? - @milestone = @milestones.find(milestone_id) + @milestone = @milestones.find_by(id: milestone_id) end end + + def get_issues_collection + set_filters_params + issues = IssuesFinder.new.execute(current_user, @filter_params) + set_filter_values(issues) + issues + end + + def get_merge_requests_collection + set_filters_params + merge_requests = MergeRequestsFinder.new.execute(current_user, @filter_params) + set_filter_values(merge_requests) + merge_requests + end end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index bfd1361f2df..cd876024ba3 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -53,17 +53,13 @@ class DashboardController < ApplicationController end def merge_requests - set_filters_defaults - @merge_requests = MergeRequestsFinder.new.execute(current_user, params) - set_filter_values(@merge_requests) + @merge_requests = get_merge_requests_collection @merge_requests = @merge_requests.page(params[:page]).per(20) @merge_requests = @merge_requests.preload(:author, :target_project) end def issues - set_filters_defaults - @issues = IssuesFinder.new.execute(current_user, params) - set_filter_values(@issues) + @issues = get_issues_collection @issues = @issues.page(params[:page]).per(20) @issues = @issues.preload(:author, :project) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index a28f4cc4072..6cd12c35bf9 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -45,17 +45,13 @@ class GroupsController < ApplicationController end def merge_requests - set_filters_defaults - @merge_requests = MergeRequestsFinder.new.execute(current_user, params) - set_filter_values(@merge_requests) + @merge_requests = get_merge_requests_collection @merge_requests = @merge_requests.page(params[:page]).per(20) @merge_requests = @merge_requests.preload(:author, :target_project) end def issues - set_filters_defaults - @issues = IssuesFinder.new.execute(current_user, params) - set_filter_values(@issues) + @issues = get_issues_collection @issues = @issues.page(params[:page]).per(20) @issues = @issues.preload(:author, :project) diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 0266c51babb..42e207cf376 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -18,9 +18,7 @@ class Projects::IssuesController < Projects::ApplicationController def index terms = params['issue_search'] - set_filters_defaults - @issues = IssuesFinder.new.execute(current_user, params) - set_filter_values(@issues) + @issues = get_issues_collection @issues = @issues.full_search(terms) if terms.present? @issues = @issues.page(params[:page]).per(20) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 20d1222326e..d23461821d7 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -17,9 +17,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController before_filter :authorize_modify_merge_request!, only: [:close, :edit, :update, :sort] def index - set_filters_defaults - @merge_requests = MergeRequestsFinder.new.execute(current_user, params) - set_filter_values(@merge_requests) + @merge_requests = get_merge_requests_collection @merge_requests = @merge_requests.page(params[:page]).per(20) end -- cgit v1.2.1 From 7b792af872699cd9439c750b780b0b906342cff0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 24 Dec 2014 11:39:03 +0200 Subject: Improvements to issues/mr filters: * use filter_params variable when set filter values * fix project issues spinach tests Signed-off-by: Dmitriy Zaporozhets --- app/controllers/application_controller.rb | 8 ++++---- app/views/shared/_issuable_filter.html.haml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 79824116b41..1b48572f2b8 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -263,11 +263,11 @@ class ApplicationController < ActionController::Base end def set_filter_values(collection) - assignee_id = params[:assignee_id] - author_id = params[:author_id] - milestone_id = params[:milestone_id] + assignee_id = @filter_params[:assignee_id] + author_id = @filter_params[:author_id] + milestone_id = @filter_params[:milestone_id] - @sort = params[:sort].try(:humanize) + @sort = @filter_params[:sort].try(:humanize) @assignees = User.where(id: collection.pluck(:assignee_id)) @authors = User.where(id: collection.pluck(:author_id)) @milestones = Milestone.where(id: collection.pluck(:milestone_id)) diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml index 56d58a52686..4f683258fac 100644 --- a/app/views/shared/_issuable_filter.html.haml +++ b/app/views/shared/_issuable_filter.html.haml @@ -14,7 +14,7 @@ %i.fa.fa-compass All - .dropdown.inline + .dropdown.inline.assignee-filter %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-user %span.light assignee: @@ -37,7 +37,7 @@ = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' = user.name - .dropdown.inline.prepend-left-10 + .dropdown.inline.prepend-left-10.author-filter %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-user %span.light author: @@ -60,7 +60,7 @@ = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' = user.name - .dropdown.inline.prepend-left-10 + .dropdown.inline.prepend-left-10.milestone-filter %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-clock-o %span.light milestone: @@ -84,7 +84,7 @@ %small.light= milestone.expires_at - if @project - .dropdown.inline.prepend-left-10 + .dropdown.inline.prepend-left-10.labels-filter %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %i.fa.fa-tags %span.light label: -- cgit v1.2.1 From 97d7c06f781f17a21689cf35410009f1247427e9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 24 Dec 2014 12:56:03 +0200 Subject: Fix scroll problems and disable authorized_only filter Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/main/layout.scss | 4 ---- app/assets/stylesheets/sections/sidebar.scss | 1 - app/controllers/application_controller.rb | 6 +++++- 3 files changed, 5 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/main/layout.scss b/app/assets/stylesheets/main/layout.scss index 2800feb81f2..71522443f10 100644 --- a/app/assets/stylesheets/main/layout.scss +++ b/app/assets/stylesheets/main/layout.scss @@ -4,10 +4,6 @@ html { &.touch .tooltip { display: none !important; } } -body { - padding-bottom: 20px; -} - .container { padding-top: 0; z-index: 5; diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index f3b2167bc6e..80b49d751b9 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -3,7 +3,6 @@ } .sidebar-wrapper { - z-index: 1000; overflow-y: auto; background: #F5F5F5; } diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1b48572f2b8..41ad5f98ace 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -252,7 +252,11 @@ class ApplicationController < ActionController::Base elsif @group @filter_params[:group_id] = @group.id else - @filter_params[:authorized_only] = true + # TODO: this filter ignore issues/mr created in public or + # internal repos where you are not a member. Enable this filter + # or improve current implementation to filter only issues you + # created or assigned or mentioned + #@filter_params[:authorized_only] = true unless @filter_params[:assignee_id] @filter_params[:assignee_id] = current_user.id -- cgit v1.2.1 From 8045d96ea81ffd1a87018c751a4604613b04da71 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 24 Dec 2014 13:39:35 +0200 Subject: Fix diff comments Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/notes.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 30f8530dfda..4d1c81d91d4 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -375,7 +375,7 @@ class @Notes ### addDiffNote: (e) => e.preventDefault() - link = e.target + link = e.currentTarget form = $(".js-new-note-form") row = $(link).closest("tr") nextRow = row.next() -- cgit v1.2.1 From e41dadcb33fda44ee274daa673bd933e13aa90eb Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Fri, 19 Dec 2014 16:15:29 +0200 Subject: Doorkeeper integration --- app/controllers/oauth/applications_controller.rb | 25 ++++++++++ app/controllers/oauth/authorizations_controller.rb | 57 ++++++++++++++++++++++ .../oauth/authorized_applications_controller.rb | 8 +++ app/controllers/profiles/accounts_controller.rb | 2 + app/models/user.rb | 1 + .../oauth2/access_token_validation_service.rb | 41 ++++++++++++++++ .../doorkeeper/applications/_delete_form.html.haml | 4 ++ app/views/doorkeeper/applications/_form.html.haml | 25 ++++++++++ app/views/doorkeeper/applications/edit.html.haml | 2 + app/views/doorkeeper/applications/index.html.haml | 16 ++++++ app/views/doorkeeper/applications/new.html.haml | 2 + app/views/doorkeeper/applications/show.html.haml | 21 ++++++++ .../doorkeeper/authorizations/error.html.haml | 3 ++ app/views/doorkeeper/authorizations/new.html.haml | 28 +++++++++++ app/views/doorkeeper/authorizations/show.html.haml | 3 ++ .../authorized_applications/_delete_form.html.haml | 4 ++ .../authorized_applications/index.html.haml | 16 ++++++ app/views/layouts/doorkeeper/admin.html.erb | 34 +++++++++++++ app/views/layouts/doorkeeper/application.html.erb | 23 +++++++++ app/views/layouts/nav/_profile.html.haml | 2 +- app/views/profiles/accounts/show.html.haml | 35 +++++++++++++ 21 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 app/controllers/oauth/applications_controller.rb create mode 100644 app/controllers/oauth/authorizations_controller.rb create mode 100644 app/controllers/oauth/authorized_applications_controller.rb create mode 100644 app/services/oauth2/access_token_validation_service.rb create mode 100644 app/views/doorkeeper/applications/_delete_form.html.haml create mode 100644 app/views/doorkeeper/applications/_form.html.haml create mode 100644 app/views/doorkeeper/applications/edit.html.haml create mode 100644 app/views/doorkeeper/applications/index.html.haml create mode 100644 app/views/doorkeeper/applications/new.html.haml create mode 100644 app/views/doorkeeper/applications/show.html.haml create mode 100644 app/views/doorkeeper/authorizations/error.html.haml create mode 100644 app/views/doorkeeper/authorizations/new.html.haml create mode 100644 app/views/doorkeeper/authorizations/show.html.haml create mode 100644 app/views/doorkeeper/authorized_applications/_delete_form.html.haml create mode 100644 app/views/doorkeeper/authorized_applications/index.html.haml create mode 100644 app/views/layouts/doorkeeper/admin.html.erb create mode 100644 app/views/layouts/doorkeeper/application.html.erb (limited to 'app') diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb new file mode 100644 index 00000000000..8eafe5e3b3d --- /dev/null +++ b/app/controllers/oauth/applications_controller.rb @@ -0,0 +1,25 @@ +class Oauth::ApplicationsController < Doorkeeper::ApplicationsController + before_filter :authenticate_user! + layout "profile" + + def index + @applications = current_user.oauth_applications + end + + def create + @application = Doorkeeper::Application.new(application_params) + @application.owner = current_user if Doorkeeper.configuration.confirm_application_owner? + if @application.save + flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) + redirect_to oauth_application_url(@application) + else + render :new + end + end + + def destroy + flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :destroy]) if @application.destroy + redirect_to profile_account_url + end + +end \ No newline at end of file diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb new file mode 100644 index 00000000000..c46707e2c77 --- /dev/null +++ b/app/controllers/oauth/authorizations_controller.rb @@ -0,0 +1,57 @@ +class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController + before_filter :authenticate_resource_owner! + layout "profile" + + def new + if pre_auth.authorizable? + if skip_authorization? || matching_token? + auth = authorization.authorize + redirect_to auth.redirect_uri + else + render "doorkeeper/authorizations/new" + end + else + render "doorkeeper/authorizations/error" + end + end + + # TODO: Handle raise invalid authorization + def create + redirect_or_render authorization.authorize + end + + def destroy + redirect_or_render authorization.deny + end + + private + + def matching_token? + Doorkeeper::AccessToken.matching_token_for pre_auth.client, + current_resource_owner.id, + pre_auth.scopes + end + + def redirect_or_render(auth) + if auth.redirectable? + redirect_to auth.redirect_uri + else + render json: auth.body, status: auth.status + end + end + + def pre_auth + @pre_auth ||= Doorkeeper::OAuth::PreAuthorization.new(Doorkeeper.configuration, + server.client_via_uid, + params) + end + + def authorization + @authorization ||= strategy.request + end + + def strategy + @strategy ||= server.authorization_request pre_auth.response_type + end +end + diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb new file mode 100644 index 00000000000..b6d4a99c0a9 --- /dev/null +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -0,0 +1,8 @@ +class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicationsController + layout "profile" + + def destroy + Doorkeeper::AccessToken.revoke_all_for params[:id], current_resource_owner + redirect_to profile_account_url, notice: I18n.t(:notice, scope: [:doorkeeper, :flash, :authorized_applications, :destroy]) + end +end \ No newline at end of file diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb index fe121691a10..5f15378c831 100644 --- a/app/controllers/profiles/accounts_controller.rb +++ b/app/controllers/profiles/accounts_controller.rb @@ -3,5 +3,7 @@ class Profiles::AccountsController < ApplicationController def show @user = current_user + @applications = current_user.oauth_applications + @authorized_applications = Doorkeeper::Application.authorized_for(current_user) end end diff --git a/app/models/user.rb b/app/models/user.rb index 7faeef1b5b0..6518fc50b70 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -106,6 +106,7 @@ class User < ActiveRecord::Base has_many :recent_events, -> { order "id DESC" }, foreign_key: :author_id, class_name: "Event" has_many :assigned_issues, dependent: :destroy, foreign_key: :assignee_id, class_name: "Issue" has_many :assigned_merge_requests, dependent: :destroy, foreign_key: :assignee_id, class_name: "MergeRequest" + has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner, dependent: :destroy # diff --git a/app/services/oauth2/access_token_validation_service.rb b/app/services/oauth2/access_token_validation_service.rb new file mode 100644 index 00000000000..95283489753 --- /dev/null +++ b/app/services/oauth2/access_token_validation_service.rb @@ -0,0 +1,41 @@ +module Oauth2::AccessTokenValidationService + # Results: + VALID = :valid + EXPIRED = :expired + REVOKED = :revoked + INSUFFICIENT_SCOPE = :insufficient_scope + + class << self + def validate(token, scopes: []) + if token.expired? + return EXPIRED + + elsif token.revoked? + return REVOKED + + elsif !self.sufficent_scope?(token, scopes) + return INSUFFICIENT_SCOPE + + else + return VALID + end + end + + protected + # True if the token's scope is a superset of required scopes, + # or the required scopes is empty. + def sufficent_scope?(token, scopes) + if scopes.blank? + # if no any scopes required, the scopes of token is sufficient. + return true + else + # If there are scopes required, then check whether + # the set of authorized scopes is a superset of the set of required scopes + required_scopes = Set.new(scopes) + authorized_scopes = Set.new(token.scopes) + + return authorized_scopes >= required_scopes + end + end + end +end \ No newline at end of file diff --git a/app/views/doorkeeper/applications/_delete_form.html.haml b/app/views/doorkeeper/applications/_delete_form.html.haml new file mode 100644 index 00000000000..bf8098f38d0 --- /dev/null +++ b/app/views/doorkeeper/applications/_delete_form.html.haml @@ -0,0 +1,4 @@ +- submit_btn_css ||= 'btn btn-link btn-remove btn-small' += form_tag oauth_application_path(application) do + %input{:name => "_method", :type => "hidden", :value => "delete"}/ + = submit_tag 'Destroy', onclick: "return confirm('Are you sure?')", class: submit_btn_css \ No newline at end of file diff --git a/app/views/doorkeeper/applications/_form.html.haml b/app/views/doorkeeper/applications/_form.html.haml new file mode 100644 index 00000000000..45ddf16ad0b --- /dev/null +++ b/app/views/doorkeeper/applications/_form.html.haml @@ -0,0 +1,25 @@ += form_for application, url: doorkeeper_submit_path(application), html: {class: 'form-horizontal', role: 'form'} do |f| + - if application.errors.any? + .alert.alert-danger{"data-alert" => ""} + %p Whoops! Check your form for possible errors + = content_tag :div, class: "form-group#{' has-error' if application.errors[:name].present?}" do + = f.label :name, class: 'col-sm-2 control-label' + .col-sm-10 + = f.text_field :name, class: 'form-control' + = doorkeeper_errors_for application, :name + = content_tag :div, class: "form-group#{' has-error' if application.errors[:redirect_uri].present?}" do + = f.label :redirect_uri, class: 'col-sm-2 control-label' + .col-sm-10 + = f.text_area :redirect_uri, class: 'form-control' + = doorkeeper_errors_for application, :redirect_uri + %span.help-block + Use one line per URI + - if Doorkeeper.configuration.native_redirect_uri + %span.help-block + Use + %code= Doorkeeper.configuration.native_redirect_uri + for local tests + .form-group + .col-sm-offset-2.col-sm-10 + = f.submit 'Submit', class: "btn btn-primary wide" + = link_to "Cancel", profile_account_path, :class => "btn btn-default" \ No newline at end of file diff --git a/app/views/doorkeeper/applications/edit.html.haml b/app/views/doorkeeper/applications/edit.html.haml new file mode 100644 index 00000000000..61584eb9c49 --- /dev/null +++ b/app/views/doorkeeper/applications/edit.html.haml @@ -0,0 +1,2 @@ +%h3.page-title Edit application += render 'form', application: @application \ No newline at end of file diff --git a/app/views/doorkeeper/applications/index.html.haml b/app/views/doorkeeper/applications/index.html.haml new file mode 100644 index 00000000000..e5be4b4bcac --- /dev/null +++ b/app/views/doorkeeper/applications/index.html.haml @@ -0,0 +1,16 @@ +%h3.page-title Your applications +%p= link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' +%table.table.table-striped + %thead + %tr + %th Name + %th Callback URL + %th + %th + %tbody + - @applications.each do |application| + %tr{:id => "application_#{application.id}"} + %td= link_to application.name, oauth_application_path(application) + %td= application.redirect_uri + %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link' + %td= render 'delete_form', application: application \ No newline at end of file diff --git a/app/views/doorkeeper/applications/new.html.haml b/app/views/doorkeeper/applications/new.html.haml new file mode 100644 index 00000000000..655845e4af5 --- /dev/null +++ b/app/views/doorkeeper/applications/new.html.haml @@ -0,0 +1,2 @@ +%h3.page-title New application += render 'form', application: @application \ No newline at end of file diff --git a/app/views/doorkeeper/applications/show.html.haml b/app/views/doorkeeper/applications/show.html.haml new file mode 100644 index 00000000000..5236b865896 --- /dev/null +++ b/app/views/doorkeeper/applications/show.html.haml @@ -0,0 +1,21 @@ +%h3.page-title + Application: #{@application.name} +.row + .col-md-8 + %h4 Application Id: + %p + %code#application_id= @application.uid + %h4 Secret: + %p + %code#secret= @application.secret + %h4 Callback urls: + %table + - @application.redirect_uri.split.each do |uri| + %tr + %td + %code= uri + %td + = link_to 'Authorize', oauth_authorization_path(client_id: @application.uid, redirect_uri: uri, response_type: 'code'), class: 'btn btn-success', target: '_blank' +.prepend-top-20 + %p= link_to 'Edit', edit_oauth_application_path(@application), class: 'btn btn-primary wide pull-left' + %p= render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' \ No newline at end of file diff --git a/app/views/doorkeeper/authorizations/error.html.haml b/app/views/doorkeeper/authorizations/error.html.haml new file mode 100644 index 00000000000..7561ec85ed9 --- /dev/null +++ b/app/views/doorkeeper/authorizations/error.html.haml @@ -0,0 +1,3 @@ +%h3.page-title An error has occurred +%main{:role => "main"} + %pre= @pre_auth.error_response.body[:error_description] \ No newline at end of file diff --git a/app/views/doorkeeper/authorizations/new.html.haml b/app/views/doorkeeper/authorizations/new.html.haml new file mode 100644 index 00000000000..15f9ee266c1 --- /dev/null +++ b/app/views/doorkeeper/authorizations/new.html.haml @@ -0,0 +1,28 @@ +%h3.page-title Authorize required +%main{:role => "main"} + %p.h4 + Authorize + %strong.text-info= @pre_auth.client.name + to use your account? + - if @pre_auth.scopes + #oauth-permissions + %p This application will be able to: + %ul.text-info + - @pre_auth.scopes.each do |scope| + %li= t scope, scope: [:doorkeeper, :scopes] + %hr/ + .actions + = form_tag oauth_authorization_path, method: :post do + = hidden_field_tag :client_id, @pre_auth.client.uid + = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri + = hidden_field_tag :state, @pre_auth.state + = hidden_field_tag :response_type, @pre_auth.response_type + = hidden_field_tag :scope, @pre_auth.scope + = submit_tag "Authorize", class: "btn btn-success wide pull-left" + = form_tag oauth_authorization_path, method: :delete do + = hidden_field_tag :client_id, @pre_auth.client.uid + = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri + = hidden_field_tag :state, @pre_auth.state + = hidden_field_tag :response_type, @pre_auth.response_type + = hidden_field_tag :scope, @pre_auth.scope + = submit_tag "Deny", class: "btn btn-danger prepend-left-10" \ No newline at end of file diff --git a/app/views/doorkeeper/authorizations/show.html.haml b/app/views/doorkeeper/authorizations/show.html.haml new file mode 100644 index 00000000000..9a402007194 --- /dev/null +++ b/app/views/doorkeeper/authorizations/show.html.haml @@ -0,0 +1,3 @@ +%h3.page-title Authorization code: +%main{:role => "main"} + %code#authorization_code= params[:code] \ No newline at end of file diff --git a/app/views/doorkeeper/authorized_applications/_delete_form.html.haml b/app/views/doorkeeper/authorized_applications/_delete_form.html.haml new file mode 100644 index 00000000000..5cbb4a70c19 --- /dev/null +++ b/app/views/doorkeeper/authorized_applications/_delete_form.html.haml @@ -0,0 +1,4 @@ +- submit_btn_css ||= 'btn btn-link btn-remove' += form_tag oauth_authorized_application_path(application) do + %input{:name => "_method", :type => "hidden", :value => "delete"}/ + = submit_tag 'Revoke', onclick: "return confirm('Are you sure?')", class: 'btn btn-link btn-remove btn-small' \ No newline at end of file diff --git a/app/views/doorkeeper/authorized_applications/index.html.haml b/app/views/doorkeeper/authorized_applications/index.html.haml new file mode 100644 index 00000000000..814cdc987ef --- /dev/null +++ b/app/views/doorkeeper/authorized_applications/index.html.haml @@ -0,0 +1,16 @@ +%header.page-header + %h1 Your authorized applications +%main{:role => "main"} + %table.table.table-striped + %thead + %tr + %th Application + %th Created At + %th + %th + %tbody + - @applications.each do |application| + %tr + %td= application.name + %td= application.created_at.strftime('%Y-%m-%d %H:%M:%S') + %td= render 'delete_form', application: application \ No newline at end of file diff --git a/app/views/layouts/doorkeeper/admin.html.erb b/app/views/layouts/doorkeeper/admin.html.erb new file mode 100644 index 00000000000..baeb5eb63fc --- /dev/null +++ b/app/views/layouts/doorkeeper/admin.html.erb @@ -0,0 +1,34 @@ + + + + + + + Doorkeeper + <%= stylesheet_link_tag "doorkeeper/admin/application" %> + <%= csrf_meta_tags %> + + +

+
+ <%- if flash[:notice].present? %> +
+ <%= flash[:notice] %> +
+ <% end -%> + + <%= yield %> +
+ + diff --git a/app/views/layouts/doorkeeper/application.html.erb b/app/views/layouts/doorkeeper/application.html.erb new file mode 100644 index 00000000000..fd7a31584f3 --- /dev/null +++ b/app/views/layouts/doorkeeper/application.html.erb @@ -0,0 +1,23 @@ + + + + OAuth authorize required + + + + + <%= stylesheet_link_tag "doorkeeper/application" %> + <%= csrf_meta_tags %> + + +
+ <%- if flash[:notice].present? %> +
+ <%= flash[:notice] %> +
+ <% end -%> + + <%= yield %> +
+ + diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 05ba20e3611..f68fe87a75b 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -3,7 +3,7 @@ = link_to profile_path, title: "Profile" do %i.fa.fa-user Profile - = nav_link(controller: :accounts) do + = nav_link(controller: [:accounts, :applications]) do = link_to profile_account_path do %i.fa.fa-gear Account diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index a21dcff41c0..1d0b6d77189 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -75,3 +75,38 @@ The following groups will be abandoned. You should transfer or remove them: %strong #{current_user.solo_owned_groups.map(&:name).join(', ')} = link_to 'Delete account', user_registration_path, data: { confirm: "REMOVE #{current_user.name}? Are you sure?" }, method: :delete, class: "btn btn-remove" + + %h3.page-title + OAuth2 + %fieldset.oauth-applications + %legend Your applications + %p= link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' + %table.table.table-striped + %thead + %tr + %th Name + %th Callback URL + %th + %th + %tbody + - @applications.each do |application| + %tr{:id => "application_#{application.id}"} + %td= link_to application.name, oauth_application_path(application) + %td= application.redirect_uri + %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link btn-small' + %td= render 'doorkeeper/applications/delete_form', application: application + + %fieldset.oauth-authorized-applications + %legend Your authorized applications + %table.table.table-striped + %thead + %tr + %th Name + %th Created At + %th + %tbody + - @authorized_applications.each do |application| + %tr{:id => "application_#{application.id}"} + %td= link_to application.name, oauth_application_path(application) + %td= application.created_at.strftime('%Y-%m-%d %H:%M:%S') + %td= render 'doorkeeper/authorized_applications/delete_form', application: application -- cgit v1.2.1 From a61ccd4ad2d83b2422561a374c300260e5a6d240 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Wed, 24 Dec 2014 15:44:17 +0200 Subject: convert erb to haml --- app/views/layouts/doorkeeper/admin.html.erb | 34 ---------------------- app/views/layouts/doorkeeper/admin.html.haml | 22 ++++++++++++++ app/views/layouts/doorkeeper/application.html.erb | 23 --------------- app/views/layouts/doorkeeper/application.html.haml | 15 ++++++++++ 4 files changed, 37 insertions(+), 57 deletions(-) delete mode 100644 app/views/layouts/doorkeeper/admin.html.erb create mode 100644 app/views/layouts/doorkeeper/admin.html.haml delete mode 100644 app/views/layouts/doorkeeper/application.html.erb create mode 100644 app/views/layouts/doorkeeper/application.html.haml (limited to 'app') diff --git a/app/views/layouts/doorkeeper/admin.html.erb b/app/views/layouts/doorkeeper/admin.html.erb deleted file mode 100644 index baeb5eb63fc..00000000000 --- a/app/views/layouts/doorkeeper/admin.html.erb +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Doorkeeper - <%= stylesheet_link_tag "doorkeeper/admin/application" %> - <%= csrf_meta_tags %> - - - -
- <%- if flash[:notice].present? %> -
- <%= flash[:notice] %> -
- <% end -%> - - <%= yield %> -
- - diff --git a/app/views/layouts/doorkeeper/admin.html.haml b/app/views/layouts/doorkeeper/admin.html.haml new file mode 100644 index 00000000000..bd9adfab66d --- /dev/null +++ b/app/views/layouts/doorkeeper/admin.html.haml @@ -0,0 +1,22 @@ +!!! +%html + %head + %meta{:charset => "utf-8"} + %meta{:content => "IE=edge", "http-equiv" => "X-UA-Compatible"} + %meta{:content => "width=device-width, initial-scale=1.0", :name => "viewport"} + %title Doorkeeper + = stylesheet_link_tag "doorkeeper/admin/application" + = csrf_meta_tags + %body + .navbar.navbar-inverse.navbar-fixed-top{:role => "navigation"} + .container + .navbar-header + = link_to 'OAuth2 Provider', oauth_applications_path, class: 'navbar-brand' + %ul.nav.navbar-nav + = content_tag :li, class: "#{'active' if request.path == oauth_applications_path}" do + = link_to 'Applications', oauth_applications_path + .container + - if flash[:notice].present? + .alert.alert-info + = flash[:notice] + = yield \ No newline at end of file diff --git a/app/views/layouts/doorkeeper/application.html.erb b/app/views/layouts/doorkeeper/application.html.erb deleted file mode 100644 index fd7a31584f3..00000000000 --- a/app/views/layouts/doorkeeper/application.html.erb +++ /dev/null @@ -1,23 +0,0 @@ - - - - OAuth authorize required - - - - - <%= stylesheet_link_tag "doorkeeper/application" %> - <%= csrf_meta_tags %> - - -
- <%- if flash[:notice].present? %> -
- <%= flash[:notice] %> -
- <% end -%> - - <%= yield %> -
- - diff --git a/app/views/layouts/doorkeeper/application.html.haml b/app/views/layouts/doorkeeper/application.html.haml new file mode 100644 index 00000000000..e5f37fad1f4 --- /dev/null +++ b/app/views/layouts/doorkeeper/application.html.haml @@ -0,0 +1,15 @@ +!!! +%html + %head + %title OAuth authorize required + %meta{:charset => "utf-8"} + %meta{:content => "IE=edge", "http-equiv" => "X-UA-Compatible"} + %meta{:content => "width=device-width, initial-scale=1.0", :name => "viewport"} + = stylesheet_link_tag "doorkeeper/application" + = csrf_meta_tags + %body + #container + - if flash[:notice].present? + .alert.alert-info + = flash[:notice] + = yield \ No newline at end of file -- cgit v1.2.1 From fe104386b16a73cbac1588aa5cce8319c6355ee9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 24 Dec 2014 16:15:45 +0200 Subject: Fix layout if broadcast message enabled Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/_broadcast.html.haml | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/views/layouts/_broadcast.html.haml b/app/views/layouts/_broadcast.html.haml index e7d477c225e..e589e34dd23 100644 --- a/app/views/layouts/_broadcast.html.haml +++ b/app/views/layouts/_broadcast.html.haml @@ -2,3 +2,7 @@ .broadcast-message{ style: broadcast_styling(broadcast_message) } %i.fa.fa-bullhorn = broadcast_message.message + :css + .sidebar-wrapper .nav-sidebar { + margin-top: 58px; + } -- cgit v1.2.1 From 84b40a346a46ca75e7a8981999c6b74187328435 Mon Sep 17 00:00:00 2001 From: Francesco Coda Zabetta Date: Mon, 15 Dec 2014 11:11:38 +0100 Subject: check browser version, blacklisting outdated IE (version < 10) --- app/assets/stylesheets/generic/common.scss | 12 ++++++++++++ app/helpers/application_helper.rb | 4 ++++ app/views/layouts/_head_panel.html.haml | 2 ++ app/views/layouts/_public_head_panel.html.haml | 1 + app/views/layouts/devise.html.haml | 1 + app/views/shared/_outdated_browser.html.haml | 8 ++++++++ 6 files changed, 28 insertions(+) create mode 100644 app/views/shared/_outdated_browser.html.haml (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 2fc738c18d8..f3879defb77 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -227,6 +227,18 @@ li.note { } } +.browser-alert { + padding: 10px; + text-align: center; + background: #C67; + color: #fff; + font-weight: bold; + a { + color: #fff; + text-decoration: underline; + } +} + .warning_message { border-left: 4px solid #ed9; color: #b90; diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 90cc58f44b7..54caaa0f7e5 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -293,4 +293,8 @@ module ApplicationHelper path << "?#{options.to_param}" path end + + def outdated_browser? + browser.ie? && browser.version.to_i < 10 + end end diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index eda37f8237a..e98b8ec631d 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -44,3 +44,5 @@ %li.hidden-xs = link_to current_user, class: "profile-pic", id: 'profile-pic' do = image_tag avatar_icon(current_user.email, 26), alt: 'User activity' + += render 'shared/outdated_browser' diff --git a/app/views/layouts/_public_head_panel.html.haml b/app/views/layouts/_public_head_panel.html.haml index 9bfc14d16c1..02a5e4868d1 100644 --- a/app/views/layouts/_public_head_panel.html.haml +++ b/app/views/layouts/_public_head_panel.html.haml @@ -20,3 +20,4 @@ %li.visible-xs = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes') += render 'shared/outdated_browser' diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml index 06de03eadad..6539a24119c 100644 --- a/app/views/layouts/devise.html.haml +++ b/app/views/layouts/devise.html.haml @@ -6,6 +6,7 @@ .content .login-title %h1= brand_title + = render 'shared/outdated_browser' %hr .container .content diff --git a/app/views/shared/_outdated_browser.html.haml b/app/views/shared/_outdated_browser.html.haml new file mode 100644 index 00000000000..0eba1fe075f --- /dev/null +++ b/app/views/shared/_outdated_browser.html.haml @@ -0,0 +1,8 @@ +- if outdated_browser? + - link = "https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/requirements.md#supported-web-browsers" + .browser-alert + GitLab may not work properly because you are using an outdated web browser. + %br + Please install a + = link_to 'supported web browser', link + for a better experience. -- cgit v1.2.1 From b4e6dec8909493bddab01a7b51c99b2314b37420 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 24 Dec 2014 18:34:14 +0200 Subject: fold-subnav class for folded sidebar navigation. Dashboard and project nav adopted Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/main/variables.scss | 2 +- app/assets/stylesheets/sections/sidebar.scss | 32 +++++++++++++++++++++++ app/views/layouts/nav/_dashboard.html.haml | 19 +++++++++----- app/views/layouts/nav/_project.html.haml | 38 ++++++++++++++++++---------- 4 files changed, 69 insertions(+), 22 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index c71984a5665..ca296c85a91 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -44,6 +44,6 @@ $added: #63c363; $deleted: #f77; /** - * + * NProgress customize */ $nprogress-color: #3498db; diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 80b49d751b9..2df85629ff0 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -121,3 +121,35 @@ border-left: 1px solid #EAEAEA; } } + +.fold-sidenav { + .page-with-sidebar { + padding-left: 50px; + } + + .sidebar-wrapper { + width: 52px; + position: absolute; + left: 50px; + height: 100%; + margin-left: -50px; + + .nav-sidebar { + margin-top: 20px; + position: fixed; + top: 45px; + width: 52px; + + li a { + padding-left: 18px; + font-size: 14px; + padding: 10px 15px; + text-align: center; + + & > span { + display: none; + } + } + } + } +} diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 619cf625689..4dbfbb27c6f 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -2,23 +2,28 @@ = nav_link(path: 'dashboard#show', html_options: {class: 'home'}) do = link_to root_path, title: 'Home', class: 'shortcuts-activity' do %i.fa.fa-dashboard - Activity + %span + Activity = nav_link(path: 'dashboard#projects') do = link_to projects_dashboard_path, class: 'shortcuts-projects' do %i.fa.fa-cube - Projects + %span + Projects = nav_link(path: 'dashboard#issues') do = link_to issues_dashboard_path, class: 'shortcuts-issues' do %i.fa.fa-exclamation-circle - Issues - %span.count= current_user.assigned_issues.opened.count + %span + Issues + %span.count= current_user.assigned_issues.opened.count = nav_link(path: 'dashboard#merge_requests') do = link_to merge_requests_dashboard_path, class: 'shortcuts-merge_requests' do %i.fa.fa-tasks - Merge Requests - %span.count= current_user.assigned_merge_requests.opened.count + %span + Merge Requests + %span.count= current_user.assigned_merge_requests.opened.count = nav_link(controller: :help) do = link_to help_path do %i.fa.fa-question-circle - Help + %span + Help diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index d634d39bfdf..0c0a40a6d18 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -2,65 +2,75 @@ = nav_link(path: 'projects#show', html_options: {class: "home"}) do = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do %i.fa.fa-dashboard - Project + %span + Project - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do = link_to project_tree_path(@project, @ref || @repository.root_ref), class: 'shortcuts-tree' do %i.fa.fa-files-o - Files + %span + Files - if project_nav_tab? :commits = nav_link(controller: %w(commit commits compare repositories tags branches)) do = link_to project_commits_path(@project, @ref || @repository.root_ref), class: 'shortcuts-commits' do %i.fa.fa-history - Commits + %span + Commits - if project_nav_tab? :network = nav_link(controller: %w(network)) do = link_to project_network_path(@project, @ref || @repository.root_ref), class: 'shortcuts-network' do %i.fa.fa-code-fork - Network + %span + Network - if project_nav_tab? :graphs = nav_link(controller: %w(graphs)) do = link_to project_graph_path(@project, @ref || @repository.root_ref), class: 'shortcuts-graphs' do %i.fa.fa-area-chart - Graphs + %span + Graphs - if project_nav_tab? :issues = nav_link(controller: %w(issues milestones labels)) do = link_to url_for_project_issues, class: 'shortcuts-issues' do %i.fa.fa-exclamation-circle - Issues - - if @project.used_default_issues_tracker? - %span.count.issue_counter= @project.issues.opened.count + %span + Issues + - if @project.used_default_issues_tracker? + %span.count.issue_counter= @project.issues.opened.count - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do = link_to project_merge_requests_path(@project), class: 'shortcuts-merge_requests' do %i.fa.fa-tasks - Merge Requests - %span.count.merge_counter= @project.merge_requests.opened.count + %span + Merge Requests + %span.count.merge_counter= @project.merge_requests.opened.count - if project_nav_tab? :wiki = nav_link(controller: :wikis) do = link_to project_wiki_path(@project, :home), class: 'shortcuts-wiki' do %i.fa.fa-book - Wiki + %span + Wiki - if project_nav_tab? :snippets = nav_link(controller: :snippets) do = link_to project_snippets_path(@project), class: 'shortcuts-snippets' do %i.fa.fa-file-text-o - Snippets + %span + Snippets - if project_nav_tab? :settings = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do = link_to edit_project_path(@project), class: "stat-tab tab no-highlight" do %i.fa.fa-cogs - Settings - %i.fa.fa-angle-down + %span + Settings + %i.fa.fa-angle-down - if @project_settings_nav = render 'projects/settings_nav' -- cgit v1.2.1 From 19109a9458382c86cb71c2008892f425cf3fea16 Mon Sep 17 00:00:00 2001 From: uran Date: Thu, 28 Aug 2014 19:57:39 +0300 Subject: Stability improvement --- app/helpers/projects_helper.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index e489d431e84..fbec38877cd 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -234,7 +234,9 @@ module ProjectsHelper def hidden_pass_url(original_url) result = URI(original_url) - result.password = '*****' if result.password.present? + result.password = '*****' unless result.password.nil? result + rescue + original_url end end -- cgit v1.2.1 From f0d0b19393136a5f2f9faea845ed2c02849b7db9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 10:13:45 +0200 Subject: Fold sidebar for mobile devices and expand for desktop Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/sidebar.scss | 13 +++++++-- app/views/layouts/nav/_admin.html.haml | 41 ++++++++++++++++++++++------ app/views/layouts/nav/_dashboard.html.haml | 2 +- app/views/layouts/nav/_group.html.haml | 30 ++++++++++++-------- app/views/layouts/nav/_profile.html.haml | 30 ++++++++++++-------- app/views/layouts/nav/_project.html.haml | 2 +- app/views/projects/_settings_nav.html.haml | 18 ++++++++---- 7 files changed, 94 insertions(+), 42 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 2df85629ff0..65229336e92 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -96,7 +96,7 @@ } } -@media(min-width:768px) { +@mixin expanded-sidebar { .page-with-sidebar { padding-left: 250px; } @@ -122,7 +122,7 @@ } } -.fold-sidenav { +@mixin folded-sidebar { .page-with-sidebar { padding-left: 50px; } @@ -153,3 +153,12 @@ } } } + +@media (max-width: $screen-sm-max) { + @include folded-sidebar; +} + +@media(min-width: $screen-sm-max) { + @include expanded-sidebar; +} + diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 1a506832ea2..ea503a9cc2e 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -1,19 +1,42 @@ -%ul.nav-sidebar.navbar-collapse.collapse +%ul.nav.nav-sidebar = nav_link(controller: :dashboard, html_options: {class: 'home'}) do = link_to admin_root_path, title: "Stats" do - Overview + %i.fa.fa-dashboard + %span + Overview = nav_link(controller: :projects) do - = link_to "Projects", admin_projects_path + = link_to admin_projects_path do + %i.fa.fa-cube + %span + Projects = nav_link(controller: :users) do - = link_to "Users", admin_users_path + = link_to admin_users_path do + %i.fa.fa-users + %span + Users = nav_link(controller: :groups) do - = link_to "Groups", admin_groups_path + = link_to admin_groups_path do + %i.fa.fa-group + %span + Groups = nav_link(controller: :logs) do - = link_to "Logs", admin_logs_path + = link_to admin_logs_path do + %i.fa.fa-file-text + %span + Logs = nav_link(controller: :broadcast_messages) do - = link_to "Messages", admin_broadcast_messages_path + = link_to admin_broadcast_messages_path do + %i.fa.fa-bullhorn + %span + Messages = nav_link(controller: :hooks) do - = link_to "Hooks", admin_hooks_path + = link_to admin_hooks_path do + %i.fa.fa-external-link + %span + Hooks = nav_link(controller: :background_jobs) do - = link_to "Background Jobs", admin_background_jobs_path + = link_to admin_background_jobs_path do + %i.fa.fa-cog + %span + Background Jobs diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 4dbfbb27c6f..da1976346d5 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-sidebar.navbar-collapse.collapse +%ul.nav.nav-sidebar = nav_link(path: 'dashboard#show', html_options: {class: 'home'}) do = link_to root_path, title: 'Home', class: 'shortcuts-activity' do %i.fa.fa-dashboard diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 3c8f47a7bea..54468d077ab 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -1,36 +1,42 @@ -%ul.nav.nav-sidebar.navbar-collapse.collapse +%ul.nav.nav-sidebar = nav_link(path: 'groups#show', html_options: {class: 'home'}) do = link_to group_path(@group), title: "Home" do %i.fa.fa-dashboard - Activity + %span + Activity - if current_user = nav_link(controller: [:group, :milestones]) do = link_to group_milestones_path(@group) do %i.fa.fa-clock-o - Milestones + %span + Milestones = nav_link(path: 'groups#issues') do = link_to issues_group_path(@group) do %i.fa.fa-exclamation-circle - Issues - - if current_user - %span.count= Issue.opened.of_group(@group).count + %span + Issues + - if current_user + %span.count= Issue.opened.of_group(@group).count = nav_link(path: 'groups#merge_requests') do = link_to merge_requests_group_path(@group) do %i.fa.fa-tasks - Merge Requests - - if current_user - %span.count= MergeRequest.opened.of_group(@group).count + %span + Merge Requests + - if current_user + %span.count= MergeRequest.opened.of_group(@group).count = nav_link(path: 'groups#members') do = link_to members_group_path(@group) do %i.fa.fa-users - Members + %span + Members - if can?(current_user, :manage_group, @group) = nav_link(html_options: { class: "#{"active" if group_settings_page?} separate-item" }) do = link_to edit_group_path(@group), class: "tab no-highlight" do %i.fa.fa-cogs - Settings - %i.fa.fa-angle-down + %span + Settings + %i.fa.fa-angle-down - if group_settings_page? = render 'groups/settings_nav' diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 05ba20e3611..64d9ad75dc2 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -1,8 +1,9 @@ -%ul.nav-sidebar.navbar-collapse.collapse +%ul.nav.nav-sidebar = nav_link(path: 'profiles#show', html_options: {class: 'home'}) do = link_to profile_path, title: "Profile" do %i.fa.fa-user - Profile + %span + Profile = nav_link(controller: :accounts) do = link_to profile_account_path do %i.fa.fa-gear @@ -10,33 +11,40 @@ = nav_link(controller: :emails) do = link_to profile_emails_path do %i.fa.fa-envelope-o - Emails - %span.count= current_user.emails.count + 1 + %span + Emails + %span.count= current_user.emails.count + 1 - unless current_user.ldap_user? = nav_link(controller: :passwords) do = link_to edit_profile_password_path do %i.fa.fa-lock - Password + %span + Password = nav_link(controller: :notifications) do = link_to profile_notifications_path do %i.fa.fa-inbox - Notifications + %span + Notifications = nav_link(controller: :keys) do = link_to profile_keys_path do %i.fa.fa-key - SSH Keys - %span.count= current_user.keys.count + %span + SSH Keys + %span.count= current_user.keys.count = nav_link(path: 'profiles#design') do = link_to design_profile_path do %i.fa.fa-image - Design + %span + Design = nav_link(controller: :groups) do = link_to profile_groups_path do %i.fa.fa-group - Groups + %span + Groups = nav_link(path: 'profiles#history') do = link_to history_profile_path do %i.fa.fa-history - History + %span + History diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 0c0a40a6d18..94cee0bd50f 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -1,4 +1,4 @@ -%ul.project-navigation.nav.nav-sidebar.navbar-collapse.collapse +%ul.project-navigation.nav.nav-sidebar = nav_link(path: 'projects#show', html_options: {class: "home"}) do = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do %i.fa.fa-dashboard diff --git a/app/views/projects/_settings_nav.html.haml b/app/views/projects/_settings_nav.html.haml index 591b5b0e160..64eda0bf286 100644 --- a/app/views/projects/_settings_nav.html.haml +++ b/app/views/projects/_settings_nav.html.haml @@ -2,24 +2,30 @@ = nav_link(path: 'projects#edit') do = link_to edit_project_path(@project), class: "stat-tab tab " do %i.fa.fa-pencil-square-o - Project + %span + Project = nav_link(controller: [:team_members, :teams]) do = link_to project_team_index_path(@project), class: "team-tab tab" do %i.fa.fa-users - Members + %span + Members = nav_link(controller: :deploy_keys) do = link_to project_deploy_keys_path(@project) do %i.fa.fa-key - Deploy Keys + %span + Deploy Keys = nav_link(controller: :hooks) do = link_to project_hooks_path(@project) do %i.fa.fa-link - Web Hooks + %span + Web Hooks = nav_link(controller: :services) do = link_to project_services_path(@project) do %i.fa.fa-cogs - Services + %span + Services = nav_link(controller: :protected_branches) do = link_to project_protected_branches_path(@project) do %i.fa.fa-lock - Protected branches + %span + Protected branches -- cgit v1.2.1 From 1fbc01024123c44740e1c94cab5a74faf2856a21 Mon Sep 17 00:00:00 2001 From: uran Date: Tue, 2 Sep 2014 18:12:13 +0300 Subject: Implemented notes (body) patching in API. --- app/services/notes/update_service.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/services/notes/update_service.rb (limited to 'app') diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb new file mode 100644 index 00000000000..63431b82471 --- /dev/null +++ b/app/services/notes/update_service.rb @@ -0,0 +1,25 @@ +module Notes + class UpdateService < BaseService + def execute + note = project.notes.find(params[:note_id]) + note.note = params[:note] + if note.save + notification_service.new_note(note) + + # Skip system notes, like status changes and cross-references. + unless note.system + event_service.leave_note(note, note.author) + + # Create a cross-reference note if this Note contains GFM that + # names an issue, merge request, or commit. + note.references.each do |mentioned| + Note.create_cross_reference_note(mentioned, note.noteable, + note.author, note.project) + end + end + end + + note + end + end +end -- cgit v1.2.1 From 5140a4cd139e43a3c7a1d23fdd61bfc0d9aff6a6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 14:32:49 +0200 Subject: Set of UI changes mostly for issue and merge request * return edit/close buttons to old position (right of title) * make 'Issue #1' header smaller * move mr commits to separate tab * change inline/side diff switcher to buttons from tabs * make issue sidebar start with dicsussion block Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/merge_request.js.coffee | 3 + app/assets/stylesheets/generic/issue_box.scss | 4 +- .../stylesheets/sections/merge_requests.scss | 1 + app/helpers/diff_helper.rb | 18 ++++ app/views/projects/diffs/_diffs.html.haml | 12 +-- app/views/projects/issues/_discussion.html.haml | 37 ++++++++ app/views/projects/issues/show.html.haml | 86 ++++++----------- .../projects/merge_requests/_discussion.html.haml | 31 ++++++ app/views/projects/merge_requests/_show.html.haml | 105 ++++++++------------- .../merge_requests/show/_mr_title.html.haml | 17 +++- .../merge_requests/show/_participants.html.haml | 5 - 11 files changed, 179 insertions(+), 140 deletions(-) create mode 100644 app/views/projects/issues/_discussion.html.haml create mode 100644 app/views/projects/merge_requests/_discussion.html.haml (limited to 'app') diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee index fba933ddab5..9e3ca45ce04 100644 --- a/app/assets/javascripts/merge_request.js.coffee +++ b/app/assets/javascripts/merge_request.js.coffee @@ -89,6 +89,9 @@ class @MergeRequest this.$('.merge-request-tabs .diffs-tab').addClass 'active' this.loadDiff() unless @diffs_loaded this.$('.diffs').show() + when 'commits' + this.$('.merge-request-tabs .commits-tab').addClass 'active' + this.$('.commits').show() else this.$('.merge-request-tabs .notes-tab').addClass 'active' this.$('.notes').show() diff --git a/app/assets/stylesheets/generic/issue_box.scss b/app/assets/stylesheets/generic/issue_box.scss index 176c45581a8..2563ab516e2 100644 --- a/app/assets/stylesheets/generic/issue_box.scss +++ b/app/assets/stylesheets/generic/issue_box.scss @@ -6,7 +6,9 @@ .issue-box { display: inline-block; - padding: 0 10px; + padding: 7px 13px; + font-weight: normal; + margin-right: 5px; &.issue-box-closed { background-color: $bg_danger; diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index a0f709070ac..f3525dc589e 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -102,6 +102,7 @@ .mr-state-widget { background: $box_bg; margin-bottom: 20px; + color: #666; @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.09)); .ci_widget { diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index cb50d89cba8..a15af0be01a 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -117,4 +117,22 @@ module DiffHelper [comments_left, comments_right] end + + def inline_diff_btn + params_copy = params.dup + params_copy[:view] = 'inline' + + link_to url_for(params_copy), id: "commit-diff-viewtype", class: (params[:view] != 'parallel' ? 'btn active' : 'btn') do + 'Inline' + end + end + + def parallel_diff_btn + params_copy = params.dup + params_copy[:view] = 'parallel' + + link_to url_for(params_copy), id: "commit-diff-viewtype", class: (params[:view] == 'parallel' ? 'btn active' : 'btn') do + 'Side-by-side' + end + end end diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml index 334ea1ba82f..48d4c33ce85 100644 --- a/app/views/projects/diffs/_diffs.html.haml +++ b/app/views/projects/diffs/_diffs.html.haml @@ -2,15 +2,9 @@ .col-md-8 = render 'projects/diffs/stats', diffs: diffs .col-md-4 - %ul.nav.nav-tabs - %li.pull-right{class: params[:view] == 'parallel' ? 'active' : ''} - - params_copy = params.dup - - params_copy[:view] = 'parallel' - = link_to "Side-by-side Diff", url_for(params_copy), {id: "commit-diff-viewtype"} - %li.pull-right{class: params[:view] != 'parallel' ? 'active' : ''} - - params_copy[:view] = 'inline' - = link_to "Inline Diff", url_for(params_copy), {id: "commit-diff-viewtype"} - + .btn-group.pull-right + = inline_diff_btn + = parallel_diff_btn - if show_diff_size_warning?(diffs) = render 'projects/diffs/warning', diffs: diffs diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml new file mode 100644 index 00000000000..d62afe582b9 --- /dev/null +++ b/app/views/projects/issues/_discussion.html.haml @@ -0,0 +1,37 @@ +- content_for :note_actions do + - if can?(current_user, :modify_issue, @issue) + - if @issue.closed? + = link_to 'Reopen Issue', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' + - else + = link_to 'Close Issue', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" +.row + .col-sm-9 + .participants + %cite.cgray + = pluralize(@issue.participants.count, 'participant') + - @issue.participants.each do |participant| + = link_to_member(@project, participant, name: false, size: 24) + + .voting_notes#notes= render "projects/notes/notes_with_form" + .col-sm-3 + %div + .clearfix + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @issue) + %hr + .clearfix + .votes-holder + %h6 Votes + #votes= render 'votes/votes_block', votable: @issue + %hr + .context + %cite.cgray + = render partial: 'issue_context', locals: { issue: @issue } + + - if @issue.labels.any? + %hr + %h6 Labels + .issue-show-labels + - @issue.labels.each do |label| + = link_to project_issues_path(@project, label_name: label.name) do + %p= render_colored_label(label) diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 1c9af4c4501..b21a394ebeb 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -1,65 +1,37 @@ -%h3.page-title +%h4.page-title .issue-box{ class: issue_box_class(@issue) } - if @issue.closed? Closed - else Open Issue ##{@issue.iid} - .pull-right.creator - %small Created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} -%hr -.row - .col-sm-9 - %h3.issue-title - = gfm escape_once(@issue.title) - %div - - if @issue.description.present? - .description - .wiki - = preserve do - = markdown(@issue.description, parse_tasks: true) - %hr - - content_for :note_actions do - - if can?(current_user, :modify_issue, @issue) - - if @issue.closed? - = link_to 'Reopen Issue', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' - - else - = link_to 'Close Issue', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" - .participants - %cite.cgray - = pluralize(@issue.participants.count, 'participant') - - @issue.participants.each do |participant| - = link_to_member(@project, participant, name: false, size: 24) - .issue-show-labels.pull-right - - @issue.labels.each do |label| - = link_to project_issues_path(@project, label_name: label.name) do - = render_colored_label(label) + %small.creator + · created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} + + .pull-right + - if can?(current_user, :write_issue, @project) + = link_to new_project_issue_path(@project), class: "btn btn-grouped", title: "New Issue", id: "new_issue_link" do + %i.fa.fa-plus + New Issue + - if can?(current_user, :modify_issue, @issue) + - if @issue.closed? + = link_to 'Reopen', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" + - else + = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" - .voting_notes#notes= render "projects/notes/notes_with_form" - .col-sm-3 - %div - - if can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), class: "btn btn-block", title: "New Issue", id: "new_issue_link" do - %i.fa.fa-plus - New Issue - - if can?(current_user, :modify_issue, @issue) - - if @issue.closed? - = link_to 'Reopen', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-block btn-reopen" - - else - = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-block btn-close", title: "Close Issue" + = link_to edit_project_issue_path(@project, @issue), class: "btn btn-grouped issuable-edit" do + %i.fa.fa-pencil-square-o + Edit - = link_to edit_project_issue_path(@project, @issue), class: "btn btn-block issuable-edit" do - %i.fa.fa-pencil-square-o - Edit - .clearfix - %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @issue) - %hr - .clearfix - .votes-holder - %h6 Votes - #votes= render 'votes/votes_block', votable: @issue - %hr - .context - %cite.cgray - = render partial: 'issue_context', locals: { issue: @issue } +%hr +%h3.issue-title + = gfm escape_once(@issue.title) +%div + - if @issue.description.present? + .description + .wiki + = preserve do + = markdown(@issue.description, parse_tasks: true) + +%hr += render "projects/issues/discussion" diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml new file mode 100644 index 00000000000..b0b4f24dd3f --- /dev/null +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -0,0 +1,31 @@ +- content_for :note_actions do + - if can?(current_user, :modify_merge_request, @merge_request) + - if @merge_request.open? + = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" + - if @merge_request.closed? + = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" + +.row + .col-sm-9 + = render "projects/merge_requests/show/participants" + = render "projects/notes/notes_with_form" + .col-sm-3 + .clearfix + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @merge_request) + %hr + .votes-holder.hidden-sm.hidden-xs + %h6 Votes + #votes= render 'votes/votes_block', votable: @merge_request + %hr + .context + %cite.cgray + = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } + + - if @merge_request.labels.any? + %hr + %h6 Labels + .merge-request-show-labels + - @merge_request.labels.each do |label| + = link_to project_merge_requests_path(@project, label_name: label.name) do + %p= render_colored_label(label) diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 57ab6bdd545..cc42efb2f50 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,89 +1,64 @@ .merge-request = render "projects/merge_requests/show/mr_title" %hr - .row - .col-sm-9 - = render "projects/merge_requests/show/how_to_merge" - = render "projects/merge_requests/show/mr_box" - %hr - .append-bottom-20 - %p.slead - %span From - - if @merge_request.for_fork? - %strong.label-branch< - - if @merge_request.source_project - = link_to @merge_request.source_project_namespace, project_path(@merge_request.source_project) - - else - \ #{@merge_request.source_project_namespace} - \:#{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} + = render "projects/merge_requests/show/mr_box" + %hr + .append-bottom-20 + .slead + %span From + - if @merge_request.for_fork? + %strong.label-branch< + - if @merge_request.source_project + = link_to @merge_request.source_project_namespace, project_path(@merge_request.source_project) - else - %strong.label-branch #{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_branch} - = render "projects/merge_requests/show/state_widget" - = render "projects/merge_requests/show/commits" - = render "projects/merge_requests/show/participants" + \ #{@merge_request.source_project_namespace} + \:#{@merge_request.source_branch} + %span into + %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} + - else + %strong.label-branch #{@merge_request.source_branch} + %span into + %strong.label-branch #{@merge_request.target_branch} + - if @merge_request.open? + %span.pull-right + .btn-group + %a.btn.dropdown-toggle{ data: {toggle: :dropdown} } + %i.fa.fa-download + Download as + %span.caret + %ul.dropdown-menu + %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) + %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) - .col-sm-3 - .issue-btn-group - - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.open? - .btn-group-justified.append-bottom-20 - .btn-group - %a.btn.dropdown-toggle{ data: {toggle: :dropdown} } - %i.fa.fa-download - Download as - %span.caret - %ul.dropdown-menu - %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) - %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-block btn-close", title: "Close merge request" - = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn btn-block issuable-edit", id: "edit_merge_request" do - %i.fa.fa-pencil-square-o - Edit - - if @merge_request.closed? - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-block btn-reopen reopen-mr-link", title: "Close merge request" - .clearfix - %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @merge_request) - %hr - .votes-holder.hidden-sm.hidden-xs - %h6 Votes - #votes= render 'votes/votes_block', votable: @merge_request - %hr - .context - %cite.cgray - = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } + = render "projects/merge_requests/show/how_to_merge" + = render "projects/merge_requests/show/state_widget" - if @commits.present? %ul.nav.nav-tabs.merge-request-tabs %li.notes-tab{data: {action: 'notes'}} = link_to project_merge_request_path(@project, @merge_request) do - %i.fa.fa-comment + %i.fa.fa-comments Discussion %span.badge= @merge_request.mr_and_commit_notes.count + %li.commits-tab{data: {action: 'commits'}} + = link_to project_merge_request_path(@project, @merge_request) do + %i.fa.fa-database + Commits + %span.badge= @commits.size %li.diffs-tab{data: {action: 'diffs'}} = link_to diffs_project_merge_request_path(@project, @merge_request) do %i.fa.fa-list-alt Changes %span.badge= @merge_request.diffs.size - - content_for :note_actions do - - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.open? - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" - - if @merge_request.closed? - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" - + .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } + = render "projects/merge_requests/discussion" + .commits.tab-content + = render "projects/merge_requests/show/commits" .diffs.tab-content - if current_page?(action: 'diffs') = render "projects/merge_requests/show/diffs" - .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } - .row - .col-sm-9 - = render "projects/notes/notes_with_form" + .mr-loading-status = spinner diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml index fb34de43c1b..0f20eba382c 100644 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ b/app/views/projects/merge_requests/show/_mr_title.html.haml @@ -1,4 +1,4 @@ -%h3.page-title +%h4.page-title .issue-box{ class: issue_box_class(@merge_request) } - if @merge_request.merged? Merged @@ -7,5 +7,16 @@ - else Open = "Merge Request ##{@merge_request.iid}" - .pull-right.creator - %small Created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} + %small.creator + · + created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} + + .issue-btn-group.pull-right + - if can?(current_user, :modify_merge_request, @merge_request) + - if @merge_request.open? + = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-grouped btn-close", title: "Close merge request" + = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn btn-grouped issuable-edit", id: "edit_merge_request" do + %i.fa.fa-pencil-square-o + Edit + - if @merge_request.closed? + = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link", title: "Close merge request" diff --git a/app/views/projects/merge_requests/show/_participants.html.haml b/app/views/projects/merge_requests/show/_participants.html.haml index b709c89cec2..15a97404cb0 100644 --- a/app/views/projects/merge_requests/show/_participants.html.haml +++ b/app/views/projects/merge_requests/show/_participants.html.haml @@ -2,8 +2,3 @@ %cite.cgray #{@merge_request.participants.count} participants - @merge_request.participants.each do |participant| = link_to_member(@project, participant, name: false, size: 24) - - .merge-request-show-labels.pull-right - - @merge_request.labels.each do |label| - = link_to project_merge_requests_path(@project, label_name: label.name) do - = render_colored_label(label) -- cgit v1.2.1 From 88b480174cbd0d95726df1390f667996efcf52f3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 14:46:18 +0200 Subject: Improve issue/mr page for tablets Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/merge_requests.scss | 16 +++++++++------- app/views/projects/issues/_discussion.html.haml | 4 ++-- app/views/projects/merge_requests/_discussion.html.haml | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index f3525dc589e..49bbae05340 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -19,13 +19,15 @@ } } -.merge-request .merge-request-tabs{ - margin: 20px 0; - - li { - a { - padding: 15px 40px; - font-size: 14px; +@media(min-width: $screen-sm-max) { + .merge-request .merge-request-tabs{ + margin: 20px 0; + + li { + a { + padding: 15px 40px; + font-size: 14px; + } } } } diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index d62afe582b9..ec03f375d6b 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -5,7 +5,7 @@ - else = link_to 'Close Issue', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" .row - .col-sm-9 + .col-md-9 .participants %cite.cgray = pluralize(@issue.participants.count, 'participant') @@ -13,7 +13,7 @@ = link_to_member(@project, participant, name: false, size: 24) .voting_notes#notes= render "projects/notes/notes_with_form" - .col-sm-3 + .col-md-3.hidden-sm.hidden-xs %div .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index b0b4f24dd3f..6bb5c465596 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -6,10 +6,10 @@ = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" .row - .col-sm-9 + .col-md-9 = render "projects/merge_requests/show/participants" = render "projects/notes/notes_with_form" - .col-sm-3 + .col-md-3.hidden-sm.hidden-xs .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} = cross_project_reference(@project, @merge_request) -- cgit v1.2.1 From 99e52c9ad082a4a8f953bab9f41e023de5182c37 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 14:58:43 +0200 Subject: Small UI imporovement for merge request accept widget and projects page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/merge_requests.scss | 1 - app/views/dashboard/projects.html.haml | 12 +++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 49bbae05340..920702ff3c4 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -149,7 +149,6 @@ padding: 10px 15px; h4 { - font-size: 20px; font-weight: normal; } diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index 5b7835b097b..b880acf1245 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -38,17 +38,19 @@ = link_to project_path(project), class: dom_class(project) do = project.name_with_namespace + - if project.forked_from_project +   + %small + %i.fa.fa-code-fork + Forked from: + = link_to project.forked_from_project.name_with_namespace, project_path(project.forked_from_project) + - if current_user.can_leave_project?(project) .pull-right = link_to leave_project_team_members_path(project), data: { confirm: "Leave project?"}, method: :delete, remote: true, class: "btn-tiny btn remove-row", title: 'Leave project' do %i.fa.fa-sign-out Leave - - if project.forked_from_project - %small.pull-right - %i.fa.fa-code-fork - Forked from: - = link_to project.forked_from_project.name_with_namespace, project_path(project.forked_from_project) .project-info .pull-right - if project.archived? -- cgit v1.2.1 From fca161f5c50e282acf65e11decc86a35d5e43847 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 15:55:12 +0200 Subject: Fix tests Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/merge_requests/_show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index cc42efb2f50..74ef819a7aa 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -41,7 +41,7 @@ Discussion %span.badge= @merge_request.mr_and_commit_notes.count %li.commits-tab{data: {action: 'commits'}} - = link_to project_merge_request_path(@project, @merge_request) do + = link_to project_merge_request_path(@project, @merge_request), title: 'Commits' do %i.fa.fa-database Commits %span.badge= @commits.size -- cgit v1.2.1 From 40ff1bc8ba4969a47e805694ec11a367a15f23eb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 15:55:23 +0200 Subject: Align sidebar navigation differently Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/sidebar.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 65229336e92..51d6b2c920c 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -60,7 +60,7 @@ font-size: 13px; line-height: 20px; text-shadow: 0 1px 2px #FFF; - padding-left: 67px; + padding-left: 20px; &:hover { text-decoration: none; @@ -75,6 +75,7 @@ i { width: 20px; color: #888; + margin-right: 23px; } } } @@ -91,7 +92,7 @@ a { padding: 5px 15px; font-size: 12px; - padding-left: 67px; + padding-left: 20px; } } } -- cgit v1.2.1 From 7fe8d41d88f744b16e6e12c1c07ef3f956994110 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 16:46:28 +0200 Subject: Improve code style Signed-off-by: Dmitriy Zaporozhets --- app/controllers/oauth/applications_controller.rb | 14 ++++++++++---- app/controllers/oauth/authorizations_controller.rb | 11 ++++++----- .../oauth/authorized_applications_controller.rb | 4 ++-- 3 files changed, 18 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb index 8eafe5e3b3d..b53e9662af0 100644 --- a/app/controllers/oauth/applications_controller.rb +++ b/app/controllers/oauth/applications_controller.rb @@ -8,7 +8,11 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController def create @application = Doorkeeper::Application.new(application_params) - @application.owner = current_user if Doorkeeper.configuration.confirm_application_owner? + + if Doorkeeper.configuration.confirm_application_owner? + @application.owner = current_user + end + if @application.save flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) redirect_to oauth_application_url(@application) @@ -18,8 +22,10 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController end def destroy - flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :destroy]) if @application.destroy + if @application.destroy + flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :destroy]) + end + redirect_to profile_account_url end - -end \ No newline at end of file +end diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb index c46707e2c77..72cbbf2e616 100644 --- a/app/controllers/oauth/authorizations_controller.rb +++ b/app/controllers/oauth/authorizations_controller.rb @@ -27,9 +27,9 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController private def matching_token? - Doorkeeper::AccessToken.matching_token_for pre_auth.client, - current_resource_owner.id, - pre_auth.scopes + Doorkeeper::AccessToken.matching_token_for(pre_auth.client, + current_resource_owner.id, + pre_auth.scopes) end def redirect_or_render(auth) @@ -41,7 +41,8 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController end def pre_auth - @pre_auth ||= Doorkeeper::OAuth::PreAuthorization.new(Doorkeeper.configuration, + @pre_auth ||= + Doorkeeper::OAuth::PreAuthorization.new(Doorkeeper.configuration, server.client_via_uid, params) end @@ -51,7 +52,7 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController end def strategy - @strategy ||= server.authorization_request pre_auth.response_type + @strategy ||= server.authorization_request(pre_auth.response_type) end end diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index b6d4a99c0a9..202421b4abd 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -2,7 +2,7 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio layout "profile" def destroy - Doorkeeper::AccessToken.revoke_all_for params[:id], current_resource_owner + Doorkeeper::AccessToken.revoke_all_for(params[:id], current_resource_owner) redirect_to profile_account_url, notice: I18n.t(:notice, scope: [:doorkeeper, :flash, :authorized_applications, :destroy]) end -end \ No newline at end of file +end -- cgit v1.2.1 From 592e396869ba5dc116cec333733cea8dfbf4a9b5 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 18:35:04 +0200 Subject: Rework oauth2 feature * improve UI * add authorization * add separate page for oauth applications Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/tables.scss | 20 ++++++++++ app/assets/stylesheets/sections/tree.scss | 13 ------- app/controllers/oauth/applications_controller.rb | 12 +++++- app/controllers/oauth/authorizations_controller.rb | 1 - .../oauth/authorized_applications_controller.rb | 2 +- app/controllers/profiles/accounts_controller.rb | 2 - app/controllers/profiles_controller.rb | 5 +++ app/models/user.rb | 4 ++ app/views/doorkeeper/applications/_form.html.haml | 7 ++-- app/views/doorkeeper/applications/show.html.haml | 37 +++++++++++-------- app/views/layouts/nav/_profile.html.haml | 6 ++- app/views/profiles/accounts/show.html.haml | 34 ----------------- app/views/profiles/applications.html.haml | 43 ++++++++++++++++++++++ 13 files changed, 113 insertions(+), 73 deletions(-) create mode 100644 app/assets/stylesheets/generic/tables.scss create mode 100644 app/views/profiles/applications.html.haml (limited to 'app') diff --git a/app/assets/stylesheets/generic/tables.scss b/app/assets/stylesheets/generic/tables.scss new file mode 100644 index 00000000000..71a7d4abaee --- /dev/null +++ b/app/assets/stylesheets/generic/tables.scss @@ -0,0 +1,20 @@ +table { + &.table { + tr { + td, th { + padding: 8px 10px; + line-height: 20px; + vertical-align: middle; + } + th { + font-weight: normal; + font-size: 15px; + border-bottom: 1px solid #CCC !important; + } + td { + border-color: #F1F1F1 !important; + border-bottom: 1px solid; + } + } + } +} diff --git a/app/assets/stylesheets/sections/tree.scss b/app/assets/stylesheets/sections/tree.scss index 678a6cd716d..bc7451e2d53 100644 --- a/app/assets/stylesheets/sections/tree.scss +++ b/app/assets/stylesheets/sections/tree.scss @@ -17,19 +17,6 @@ @include border-radius(0); tr { - td, th { - padding: 8px 10px; - line-height: 20px; - } - th { - font-weight: normal; - font-size: 15px; - border-bottom: 1px solid #CCC !important; - } - td { - border-color: #F1F1F1 !important; - border-bottom: 1px solid; - } &:hover { td { background: $hover; diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb index b53e9662af0..93201eff303 100644 --- a/app/controllers/oauth/applications_controller.rb +++ b/app/controllers/oauth/applications_controller.rb @@ -3,7 +3,7 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController layout "profile" def index - @applications = current_user.oauth_applications + head :forbidden and return end def create @@ -28,4 +28,14 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController redirect_to profile_account_url end + + private + + def set_application + @application = current_user.oauth_applications.find(params[:id]) + end + + rescue_from ActiveRecord::RecordNotFound do |exception| + render "errors/not_found", layout: "errors", status: 404 + end end diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb index 72cbbf2e616..a57b4a60c24 100644 --- a/app/controllers/oauth/authorizations_controller.rb +++ b/app/controllers/oauth/authorizations_controller.rb @@ -55,4 +55,3 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController @strategy ||= server.authorization_request(pre_auth.response_type) end end - diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 202421b4abd..0b27ce7da72 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -3,6 +3,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio def destroy Doorkeeper::AccessToken.revoke_all_for(params[:id], current_resource_owner) - redirect_to profile_account_url, notice: I18n.t(:notice, scope: [:doorkeeper, :flash, :authorized_applications, :destroy]) + redirect_to applications_profile_url, notice: I18n.t(:notice, scope: [:doorkeeper, :flash, :authorized_applications, :destroy]) end end diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb index 5f15378c831..fe121691a10 100644 --- a/app/controllers/profiles/accounts_controller.rb +++ b/app/controllers/profiles/accounts_controller.rb @@ -3,7 +3,5 @@ class Profiles::AccountsController < ApplicationController def show @user = current_user - @applications = current_user.oauth_applications - @authorized_applications = Doorkeeper::Application.authorized_for(current_user) end end diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb index e877f9b9049..c0b7e2223a2 100644 --- a/app/controllers/profiles_controller.rb +++ b/app/controllers/profiles_controller.rb @@ -13,6 +13,11 @@ class ProfilesController < ApplicationController def design end + def applications + @applications = current_user.oauth_applications + @authorized_tokens = current_user.oauth_authorized_tokens + end + def update user_params.except!(:email) if @user.ldap_user? diff --git a/app/models/user.rb b/app/models/user.rb index 6518fc50b70..7dae318e780 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -565,4 +565,8 @@ class User < ActiveRecord::Base namespaces += masters_groups end end + + def oauth_authorized_tokens + Doorkeeper::AccessToken.where(resource_owner_id: self.id, revoked_at: nil) + end end diff --git a/app/views/doorkeeper/applications/_form.html.haml b/app/views/doorkeeper/applications/_form.html.haml index 45ddf16ad0b..a5fec2fabdb 100644 --- a/app/views/doorkeeper/applications/_form.html.haml +++ b/app/views/doorkeeper/applications/_form.html.haml @@ -19,7 +19,6 @@ Use %code= Doorkeeper.configuration.native_redirect_uri for local tests - .form-group - .col-sm-offset-2.col-sm-10 - = f.submit 'Submit', class: "btn btn-primary wide" - = link_to "Cancel", profile_account_path, :class => "btn btn-default" \ No newline at end of file + .form-actions + = f.submit 'Submit', class: "btn btn-primary wide" + = link_to "Cancel", applications_profile_path, class: "btn btn-default" diff --git a/app/views/doorkeeper/applications/show.html.haml b/app/views/doorkeeper/applications/show.html.haml index 5236b865896..82e78b4af13 100644 --- a/app/views/doorkeeper/applications/show.html.haml +++ b/app/views/doorkeeper/applications/show.html.haml @@ -1,21 +1,26 @@ %h3.page-title Application: #{@application.name} -.row - .col-md-8 - %h4 Application Id: - %p + + +%table.table + %tr + %td + Application Id + %td %code#application_id= @application.uid - %h4 Secret: - %p + %tr + %td + Secret: + %td %code#secret= @application.secret - %h4 Callback urls: - %table + + %tr + %td + Callback url + %td - @application.redirect_uri.split.each do |uri| - %tr - %td - %code= uri - %td - = link_to 'Authorize', oauth_authorization_path(client_id: @application.uid, redirect_uri: uri, response_type: 'code'), class: 'btn btn-success', target: '_blank' -.prepend-top-20 - %p= link_to 'Edit', edit_oauth_application_path(@application), class: 'btn btn-primary wide pull-left' - %p= render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' \ No newline at end of file + %div + %span.monospace= uri +.form-actions + = link_to 'Edit', edit_oauth_application_path(@application), class: 'btn btn-primary wide pull-left' + = render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index f68fe87a75b..8bb45e4a6d0 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -3,10 +3,14 @@ = link_to profile_path, title: "Profile" do %i.fa.fa-user Profile - = nav_link(controller: [:accounts, :applications]) do + = nav_link(controller: [:accounts]) do = link_to profile_account_path do %i.fa.fa-gear Account + = nav_link(path: ['profiles#applications', 'applications#edit', 'applications#show', 'applications#new']) do + = link_to applications_profile_path do + %i.fa.fa-cloud + Applications = nav_link(controller: :emails) do = link_to profile_emails_path do %i.fa.fa-envelope-o diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index 1d0b6d77189..53a50f6796b 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -75,38 +75,4 @@ The following groups will be abandoned. You should transfer or remove them: %strong #{current_user.solo_owned_groups.map(&:name).join(', ')} = link_to 'Delete account', user_registration_path, data: { confirm: "REMOVE #{current_user.name}? Are you sure?" }, method: :delete, class: "btn btn-remove" - - %h3.page-title - OAuth2 - %fieldset.oauth-applications - %legend Your applications - %p= link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' - %table.table.table-striped - %thead - %tr - %th Name - %th Callback URL - %th - %th - %tbody - - @applications.each do |application| - %tr{:id => "application_#{application.id}"} - %td= link_to application.name, oauth_application_path(application) - %td= application.redirect_uri - %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link btn-small' - %td= render 'doorkeeper/applications/delete_form', application: application - %fieldset.oauth-authorized-applications - %legend Your authorized applications - %table.table.table-striped - %thead - %tr - %th Name - %th Created At - %th - %tbody - - @authorized_applications.each do |application| - %tr{:id => "application_#{application.id}"} - %td= link_to application.name, oauth_application_path(application) - %td= application.created_at.strftime('%Y-%m-%d %H:%M:%S') - %td= render 'doorkeeper/authorized_applications/delete_form', application: application diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml new file mode 100644 index 00000000000..cdb188dc1af --- /dev/null +++ b/app/views/profiles/applications.html.haml @@ -0,0 +1,43 @@ +%h3.page-title + OAuth2 + +%fieldset.oauth-applications + %legend Your applications + %p= link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' + - if @applications.any? + %table.table.table-striped + %thead + %tr + %th Name + %th Callback URL + %th Clients + %th + %th + %tbody + - @applications.each do |application| + %tr{:id => "application_#{application.id}"} + %td= link_to application.name, oauth_application_path(application) + %td + - application.redirect_uri.split.each do |uri| + %div= uri + %td= application.access_tokens.count + %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link btn-small' + %td= render 'doorkeeper/applications/delete_form', application: application + +%fieldset.oauth-authorized-applications.prepend-top-20 + %legend Authorized applications + %table.table.table-striped + %thead + %tr + %th Name + %th Authorized At + %th Scope + %th + %tbody + - @authorized_tokens.each do |token| + - application = token.application + %tr{:id => "application_#{application.id}"} + %td= application.name + %td= token.created_at + %td= token.scopes + %td= render 'doorkeeper/authorized_applications/delete_form', application: application -- cgit v1.2.1 From aadfb3665f39e5886254bac856ebd1cc47f8c652 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 18:46:19 +0200 Subject: Fix tests and add message if no oauth apps Signed-off-by: Dmitriy Zaporozhets --- app/controllers/oauth/applications_controller.rb | 2 +- app/views/profiles/applications.html.haml | 34 +++++++++++++----------- 2 files changed, 20 insertions(+), 16 deletions(-) (limited to 'app') diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb index 93201eff303..3407490e498 100644 --- a/app/controllers/oauth/applications_controller.rb +++ b/app/controllers/oauth/applications_controller.rb @@ -26,7 +26,7 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :destroy]) end - redirect_to profile_account_url + redirect_to applications_profile_url end private diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml index cdb188dc1af..cb24e4a3dde 100644 --- a/app/views/profiles/applications.html.haml +++ b/app/views/profiles/applications.html.haml @@ -26,18 +26,22 @@ %fieldset.oauth-authorized-applications.prepend-top-20 %legend Authorized applications - %table.table.table-striped - %thead - %tr - %th Name - %th Authorized At - %th Scope - %th - %tbody - - @authorized_tokens.each do |token| - - application = token.application - %tr{:id => "application_#{application.id}"} - %td= application.name - %td= token.created_at - %td= token.scopes - %td= render 'doorkeeper/authorized_applications/delete_form', application: application + + - if @authorized_tokens.any? + %table.table.table-striped + %thead + %tr + %th Name + %th Authorized At + %th Scope + %th + %tbody + - @authorized_tokens.each do |token| + - application = token.application + %tr{:id => "application_#{application.id}"} + %td= application.name + %td= token.created_at + %td= token.scopes + %td= render 'doorkeeper/authorized_applications/delete_form', application: application + - else + %p.light You dont have any authorized applications -- cgit v1.2.1 From d2bd5e833fdcf5bbb039936a3f71eaf7ff829063 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 25 Dec 2014 20:51:07 +0200 Subject: Fix nav_link support for several path options Signed-off-by: Dmitriy Zaporozhets --- app/helpers/tab_helper.rb | 52 ++++++++++++++++++++------------ app/views/layouts/nav/_profile.html.haml | 3 +- 2 files changed, 35 insertions(+), 20 deletions(-) (limited to 'app') diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index bc43e078568..639fc98c222 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -28,6 +28,10 @@ module TabHelper # nav_link(controller: [:tree, :refs]) { "Hello" } # # => '
  • Hello
  • ' # + # # Several paths + # nav_link(path: ['tree#show', 'profile#show']) { "Hello" } + # # => '
  • Hello
  • ' + # # # Shorthand path # nav_link(path: 'tree#show') { "Hello" } # # => '
  • Hello
  • ' @@ -38,25 +42,7 @@ module TabHelper # # Returns a list item element String def nav_link(options = {}, &block) - if path = options.delete(:path) - if path.respond_to?(:each) - c = path.map { |p| p.split('#').first } - a = path.map { |p| p.split('#').last } - else - c, a, _ = path.split('#') - end - else - c = options.delete(:controller) - a = options.delete(:action) - end - - if c && a - # When given both options, make sure BOTH are active - klass = current_controller?(*c) && current_action?(*a) ? 'active' : '' - else - # Otherwise check EITHER option - klass = current_controller?(*c) || current_action?(*a) ? 'active' : '' - end + klass = active_nav_link?(options) ? 'active' : '' # Add our custom class into the html_options, which may or may not exist # and which may or may not already have a :class key @@ -72,6 +58,34 @@ module TabHelper end end + def active_nav_link?(options) + if path = options.delete(:path) + unless path.respond_to?(:each) + path = [path] + end + + path.any? do |single_path| + current_path?(single_path) + end + else + c = options.delete(:controller) + a = options.delete(:action) + + if c && a + # When given both options, make sure BOTH are true + current_controller?(*c) && current_action?(*a) + else + # Otherwise check EITHER option + current_controller?(*c) || current_action?(*a) + end + end + end + + def current_path?(path) + c, a, _ = path.split('#') + current_controller?(c) && current_action?(a) + end + def project_tab_class return "active" if current_page?(controller: "/projects", action: :edit, id: @project) diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 2821e5c0668..36b48a5d02d 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -11,7 +11,8 @@ = nav_link(path: ['profiles#applications', 'applications#edit', 'applications#show', 'applications#new']) do = link_to applications_profile_path do %i.fa.fa-cloud - Applications + %span + Applications = nav_link(controller: :emails) do = link_to profile_emails_path do %i.fa.fa-envelope-o -- cgit v1.2.1 From b7eb0d178e2a1e951ba6e110ad703def3fb35357 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 26 Dec 2014 09:14:53 +0100 Subject: Add checkbox for protected branch developer can push to. --- app/controllers/projects/protected_branches_controller.rb | 2 +- app/views/projects/protected_branches/index.html.haml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb index bd31b1d3c54..a0df392e424 100644 --- a/app/controllers/projects/protected_branches_controller.rb +++ b/app/controllers/projects/protected_branches_controller.rb @@ -27,6 +27,6 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController private def protected_branch_params - params.require(:protected_branch).permit(:name) + params.require(:protected_branch).permit(:name, :developers_can_push) end end diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml index 227a2f9a061..2d04c572c73 100644 --- a/app/views/projects/protected_branches/index.html.haml +++ b/app/views/projects/protected_branches/index.html.haml @@ -22,6 +22,10 @@ = f.label :name, "Branch", class: 'control-label' .col-sm-10 = f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: "Select branch"}, {class: "select2"}) + .form-group + = f.label :developers_can_push, "Developers can push?", class: 'control-label' + .col-sm-10 + = f.check_box :developers_can_push .form-actions = f.submit 'Protect', class: "btn-create btn" - unless @branches.empty? -- cgit v1.2.1 From 61b4214e94116501424e1c9daaeef32566453b13 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 26 Dec 2014 09:35:49 +0100 Subject: Allow regular code push for developers if the protected branch allows it. --- app/models/project.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index 32b0145ca24..80f1c0d598a 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -470,6 +470,10 @@ class Project < ActiveRecord::Base protected_branches_names.include?(branch_name) end + def developers_can_push_to_protected_branch?(branch_name) + protected_branches.map{ |pb| pb.developers_can_push if pb.name == branch_name }.compact.first + end + def forked? !(forked_project_link.nil? || forked_project_link.forked_from_project.nil?) end -- cgit v1.2.1 From 92eb3974ac28aff7c78f4ca0cbafbad842fc7160 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 26 Dec 2014 11:39:12 +0100 Subject: Add option to disable/enable developers push to already protected branches. --- .../projects/protected_branches_controller.rb | 17 +++++++++++++++++ app/views/projects/protected_branches/index.html.haml | 7 +++++++ 2 files changed, 24 insertions(+) (limited to 'app') diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb index a0df392e424..ac68992faa0 100644 --- a/app/controllers/projects/protected_branches_controller.rb +++ b/app/controllers/projects/protected_branches_controller.rb @@ -15,6 +15,23 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController redirect_to project_protected_branches_path(@project) end + def update + protected_branch = @project.protected_branches.find(params[:id]) + + if protected_branch && + protected_branch.update_attributes( + developers_can_push: params[:developers_can_push] + ) + flash[:notice] = 'Branch was successfully updated.' + else + flash[:alert] = 'Could not update the branch.' + end + + respond_to do |format| + format.html { redirect_to project_protected_branches_path } + end + end + def destroy @project.protected_branches.find(params[:id]).destroy diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml index 2d04c572c73..183f25bfc82 100644 --- a/app/views/projects/protected_branches/index.html.haml +++ b/app/views/projects/protected_branches/index.html.haml @@ -40,8 +40,15 @@ %span.label.label-info default %span.label.label-success %i.fa.fa-lock + - if branch.developers_can_push + %span.label.label-warning + %i.fa.fa-group .pull-right - if can? current_user, :admin_project, @project + - if branch.developers_can_push + = link_to 'Disable developers push', [@project, branch, { developers_can_push: false }], data: { confirm: 'Branch will be no longer writable for developers. Are you sure?' }, method: :put, class: "btn btn-grouped btn-small" + - else + = link_to 'Allow developers to push', [@project, branch, { developers_can_push: true }], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :put, class: "btn btn-grouped btn-small" = link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small" - if commit = branch.commit -- cgit v1.2.1 From e3951019f5de7359659a4c13db0eeb16cf1195f1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 26 Dec 2014 14:19:30 +0200 Subject: Put nprogress spinner to bottom left position Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 2fc738c18d8..dfc7b0de9b7 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -355,3 +355,9 @@ table { .task-status { margin-left: 10px; } + +#nprogress .spinner { + top: auto !important; + bottom: 20px !important; + left: 20px !important; +} -- cgit v1.2.1 From 038161f4e0b41a0fd6b877171a1f47d062b5c857 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 26 Dec 2014 14:19:54 +0200 Subject: Make nprogress color to red Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/main/variables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index ca296c85a91..92b220f8019 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -46,4 +46,4 @@ $deleted: #f77; /** * NProgress customize */ -$nprogress-color: #3498db; +$nprogress-color: #c0392b; -- cgit v1.2.1 From f1c39763c9daf5f053f9b9ae0bcd1c50ea59133f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 26 Dec 2014 14:25:37 +0200 Subject: Fix UI for no-ssh-key message Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 20 -------------------- app/views/layouts/project_settings.html.haml | 3 --- app/views/layouts/projects.html.haml | 2 -- app/views/projects/show.html.haml | 3 +++ app/views/shared/_no_ssh.html.haml | 20 +++++++------------- 5 files changed, 10 insertions(+), 38 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index dfc7b0de9b7..6c37cbf072e 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -207,26 +207,6 @@ li.note { } } -.no-ssh-key-message { - padding: 10px 0; - background: #C67; - margin: 0; - color: #FFF; - margin-top: -1px; - text-align: center; - - a { - color: #fff; - text-decoration: underline; - } - - .links-xs { - text-align: center; - font-size: 16px; - padding: 5px; - } -} - .warning_message { border-left: 4px solid #ed9; color: #b90; diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index 810fb4e2005..0f20bf38bfd 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -5,8 +5,5 @@ = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" - - if can?(current_user, :download_code, @project) - = render 'shared/no_ssh' - - @project_settings_nav = true = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml index b4b1bcf241c..d4ee53db55c 100644 --- a/app/views/layouts/projects.html.haml +++ b/app/views/layouts/projects.html.haml @@ -5,6 +5,4 @@ = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" - - if can?(current_user, :download_code, @project) - = render 'shared/no_ssh' = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 9b06ebe95a4..14d1ad956e3 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,3 +1,6 @@ +- if can?(current_user, :download_code, @project) + = render 'shared/no_ssh' + = render "home_panel" - readme = @repository.readme diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml index e70eb4d01b9..e1c2a962982 100644 --- a/app/views/shared/_no_ssh.html.haml +++ b/app/views/shared/_no_ssh.html.haml @@ -1,14 +1,8 @@ - if cookies[:hide_no_ssh_message].blank? && current_user.require_ssh_key? && !current_user.hide_no_ssh_key - .no-ssh-key-message - .container - You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', new_profile_key_path} to your profile - .pull-right.hidden-xs - = link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'hide-no-ssh-message', remote: true - | - = link_to 'Remind later', '#', class: 'hide-no-ssh-message' - .links-xs.visible-xs - = link_to "Add key", new_profile_key_path - | - = link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'hide-no-ssh-message', remote: true - | - = link_to 'Later', '#', class: 'hide-no-ssh-message' + .no-ssh-key-message.alert.alert-warning.hidden-xs + You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', new_profile_key_path} to your profile + + .pull-right + = link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'hide-no-ssh-message', remote: true + | + = link_to 'Remind later', '#', class: 'hide-no-ssh-message' -- cgit v1.2.1 From a248efadf7a4a8e2ebf0a98413c195b3c8766f20 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 26 Dec 2014 14:28:49 +0200 Subject: Fix links for no-ssh message Signed-off-by: Dmitriy Zaporozhets --- app/views/shared/_no_ssh.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml index e1c2a962982..8e6f802fd3b 100644 --- a/app/views/shared/_no_ssh.html.haml +++ b/app/views/shared/_no_ssh.html.haml @@ -3,6 +3,6 @@ You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', new_profile_key_path} to your profile .pull-right - = link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'hide-no-ssh-message', remote: true + = link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put | = link_to 'Remind later', '#', class: 'hide-no-ssh-message' -- cgit v1.2.1 From 573d554c6927f0e6804c986af7d8837e0abd6cd9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 26 Dec 2014 14:34:50 +0200 Subject: set z-index for navbar and sidebar explicitly Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/header.scss | 3 +-- app/assets/stylesheets/sections/sidebar.scss | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index db419f76532..f71b62ace9c 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -4,6 +4,7 @@ */ header { &.navbar-gitlab { + z-index: 100; margin-bottom: 0; min-height: 40px; border: none; @@ -82,8 +83,6 @@ header { } } - z-index: 10; - .container { width: 100% !important; padding-left: 0px; diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 51d6b2c920c..fdf9eb86d46 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -3,6 +3,7 @@ } .sidebar-wrapper { + z-index: 99; overflow-y: auto; background: #F5F5F5; } -- cgit v1.2.1 From aa54482a37df5b122e35029a316094c2f55d5044 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 26 Dec 2014 14:53:50 +0200 Subject: Fix no-ssh message for non logged in user Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 14d1ad956e3..af6e4567c1b 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,4 +1,4 @@ -- if can?(current_user, :download_code, @project) +- if current_user && can?(current_user, :download_code, @project) = render 'shared/no_ssh' = render "home_panel" -- cgit v1.2.1 From 1b6ebd17179b610f832d5a1cfda866167124bb1c Mon Sep 17 00:00:00 2001 From: Stephan van Leeuwen Date: Fri, 26 Dec 2014 15:29:02 +0100 Subject: Updated sidebar style to span the whole height. --- app/assets/stylesheets/sections/sidebar.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 51d6b2c920c..b836e566a10 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -104,10 +104,11 @@ .sidebar-wrapper { width: 250px; - position: absolute; + position: fixed; left: 250px; height: 100%; margin-left: -250px; + border-right: 1px solid #EAEAEA; .nav-sidebar { margin-top: 20px; @@ -119,7 +120,6 @@ .content-wrapper { padding: 20px; - border-left: 1px solid #EAEAEA; } } -- cgit v1.2.1 From 071ad02c027ac14e0944e957664fc24c82b720c3 Mon Sep 17 00:00:00 2001 From: Stephan van Leeuwen Date: Fri, 26 Dec 2014 15:29:19 +0100 Subject: Updated mobile sidebar to allow scrolling --- app/assets/stylesheets/sections/sidebar.scss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index b836e566a10..697e9d20231 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -130,14 +130,16 @@ .sidebar-wrapper { width: 52px; - position: absolute; + position: fixed; left: 50px; height: 100%; margin-left: -50px; + border-right: 1px solid #EAEAEA; + overflow-x: hidden; .nav-sidebar { margin-top: 20px; - position: fixed; + position: absolute; top: 45px; width: 52px; -- cgit v1.2.1 From 2cbfc515f22e2064fb29c9cbb8326a132a3515fc Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 26 Dec 2014 15:36:35 +0100 Subject: Move protected branches list to a partial. --- .../protected_branches/_branches_list.html.haml | 36 ++++++++++++++++++++ .../projects/protected_branches/index.html.haml | 38 ++++------------------ 2 files changed, 42 insertions(+), 32 deletions(-) create mode 100644 app/views/projects/protected_branches/_branches_list.html.haml (limited to 'app') diff --git a/app/views/projects/protected_branches/_branches_list.html.haml b/app/views/projects/protected_branches/_branches_list.html.haml new file mode 100644 index 00000000000..1bae1938c27 --- /dev/null +++ b/app/views/projects/protected_branches/_branches_list.html.haml @@ -0,0 +1,36 @@ +- unless @branches.empty? + %h5 Already Protected: + %table.table.protected-branches-list + %thead + %tr + %th{style: "border:0;"} Branch + %th{style: "border:0;"} Developers can push + %th{style: "border:0;"} + + %tbody + - @branches.each do |branch| + - @url = project_protected_branch_path(@project, branch) + %tr + %td + = link_to project_commits_path(@project, branch.name) do + %strong= branch.name + - if @project.root_ref?(branch.name) + %span.label.label-info default + %td + = check_box_tag "developers_can_push", branch.id, branch.developers_can_push, "data-url" => @url + %td + .pull-right + - if can? current_user, :admin_project, @project + = link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small" + %tr + %td{style: "border:0;"} + - if commit = branch.commit + = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do + = commit.short_id + %span.light + = gfm escape_once(truncate(commit.title, length: 40)) + #{time_ago_with_tooltip(commit.committed_date)} + - else + (branch was removed from repository) + %td{style: "border:0;"} + %td{style: "border:0;"} diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml index 183f25bfc82..2164c874c74 100644 --- a/app/views/projects/protected_branches/index.html.haml +++ b/app/views/projects/protected_branches/index.html.haml @@ -23,39 +23,13 @@ .col-sm-10 = f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: "Select branch"}, {class: "select2"}) .form-group - = f.label :developers_can_push, "Developers can push?", class: 'control-label' + = f.label :developers_can_push, class: 'control-label' do + Developers can push .col-sm-10 - = f.check_box :developers_can_push + .checkbox + = f.check_box :developers_can_push + %span.descr Allow developers to push to this branch .form-actions = f.submit 'Protect', class: "btn-create btn" -- unless @branches.empty? - %h5 Already Protected: - %ul.bordered-list.protected-branches-list - - @branches.each do |branch| - %li - %h4 - = link_to project_commits_path(@project, branch.name) do - %strong= branch.name - - if @project.root_ref?(branch.name) - %span.label.label-info default - %span.label.label-success - %i.fa.fa-lock - - if branch.developers_can_push - %span.label.label-warning - %i.fa.fa-group - .pull-right - - if can? current_user, :admin_project, @project - - if branch.developers_can_push - = link_to 'Disable developers push', [@project, branch, { developers_can_push: false }], data: { confirm: 'Branch will be no longer writable for developers. Are you sure?' }, method: :put, class: "btn btn-grouped btn-small" - - else - = link_to 'Allow developers to push', [@project, branch, { developers_can_push: true }], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :put, class: "btn btn-grouped btn-small" - = link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small" += render 'branches_list' - - if commit = branch.commit - = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do - = commit.short_id - %span.light - = gfm escape_once(truncate(commit.title, length: 40)) - #{time_ago_with_tooltip(commit.committed_date)} - - else - (branch was removed from repository) -- cgit v1.2.1 From 16ebeedef225db60e1f62d43e5152a04c29fd289 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 26 Dec 2014 15:37:04 +0100 Subject: Update branch status with ajax call. --- app/assets/javascripts/protected_branches.js.coffee | 19 +++++++++++++++++++ .../projects/protected_branches_controller.rb | 13 +++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 app/assets/javascripts/protected_branches.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/protected_branches.js.coffee b/app/assets/javascripts/protected_branches.js.coffee new file mode 100644 index 00000000000..e03bd148dc8 --- /dev/null +++ b/app/assets/javascripts/protected_branches.js.coffee @@ -0,0 +1,19 @@ +$ -> + $(":checkbox").change -> + id = $(this).val() + checked = $(this).is(":checked") + url = $(this).data("url") + $.ajax + type: "PUT" + url: url + dataType: "json" + data: + id: id + developers_can_push: checked + + success: -> + new Flash("Branch updated.", "notice") + location.reload true + + error: -> + new Flash("Failed to update branch!", "alert") diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb index ac68992faa0..02160d973b3 100644 --- a/app/controllers/projects/protected_branches_controller.rb +++ b/app/controllers/projects/protected_branches_controller.rb @@ -22,13 +22,14 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController protected_branch.update_attributes( developers_can_push: params[:developers_can_push] ) - flash[:notice] = 'Branch was successfully updated.' - else - flash[:alert] = 'Could not update the branch.' - end - respond_to do |format| - format.html { redirect_to project_protected_branches_path } + respond_to do |format| + format.json { render :json => protected_branch, status: :ok } + end + else + respond_to do |format| + format.json { render json: protected_branch.errors, status: :unprocessable_entity } + end end end -- cgit v1.2.1 From 9fd061807e65d106bac4c42618aaf177cd58855d Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 26 Dec 2014 15:55:58 +0100 Subject: Update on the correct checkbox. --- .../javascripts/protected_branches.js.coffee | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/protected_branches.js.coffee b/app/assets/javascripts/protected_branches.js.coffee index e03bd148dc8..691fd4f10d8 100644 --- a/app/assets/javascripts/protected_branches.js.coffee +++ b/app/assets/javascripts/protected_branches.js.coffee @@ -1,19 +1,21 @@ $ -> $(":checkbox").change -> - id = $(this).val() - checked = $(this).is(":checked") - url = $(this).data("url") - $.ajax - type: "PUT" - url: url - dataType: "json" - data: - id: id - developers_can_push: checked + name = $(this).attr("name") + if name == "developers_can_push" + id = $(this).val() + checked = $(this).is(":checked") + url = $(this).data("url") + $.ajax + type: "PUT" + url: url + dataType: "json" + data: + id: id + developers_can_push: checked - success: -> - new Flash("Branch updated.", "notice") - location.reload true + success: -> + new Flash("Branch updated.", "notice") + location.reload true - error: -> - new Flash("Failed to update branch!", "alert") + error: -> + new Flash("Failed to update branch!", "alert") -- cgit v1.2.1 From 78865a0c993f72c470e67ccb40f7b8d87ad50878 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 26 Dec 2014 17:16:38 +0100 Subject: Move styling to css. --- app/assets/stylesheets/sections/projects.scss | 7 +++++++ .../projects/protected_branches/_branches_list.html.haml | 16 ++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 7b894cf00bb..fbfe9ad4c93 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -308,3 +308,10 @@ ul.nav.nav-projects-tabs { display: none; } } + + +table.table.protected-branches-list tr.no-border { + th, td { + border: 0; + } +} diff --git a/app/views/projects/protected_branches/_branches_list.html.haml b/app/views/projects/protected_branches/_branches_list.html.haml index 1bae1938c27..c37b255b6ac 100644 --- a/app/views/projects/protected_branches/_branches_list.html.haml +++ b/app/views/projects/protected_branches/_branches_list.html.haml @@ -2,10 +2,10 @@ %h5 Already Protected: %table.table.protected-branches-list %thead - %tr - %th{style: "border:0;"} Branch - %th{style: "border:0;"} Developers can push - %th{style: "border:0;"} + %tr.no-border + %th Branch + %th Developers can push + %th %tbody - @branches.each do |branch| @@ -22,8 +22,8 @@ .pull-right - if can? current_user, :admin_project, @project = link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small" - %tr - %td{style: "border:0;"} + %tr.no-border + %td - if commit = branch.commit = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do = commit.short_id @@ -32,5 +32,5 @@ #{time_ago_with_tooltip(commit.committed_date)} - else (branch was removed from repository) - %td{style: "border:0;"} - %td{style: "border:0;"} + %td + %td -- cgit v1.2.1 From 465f186954d00fa47c8b05cc91f33e7943aa209a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 26 Dec 2014 18:33:53 +0200 Subject: Show assigned issues/mr be default on dashboard This was default before but now it fixed with providing assignee_id parameter making url shareble and dont reset when other filters users. Also this commit removes old methods that are not used any more. Signed-off-by: Dmitriy Zaporozhets --- app/controllers/application_controller.rb | 4 ---- app/helpers/dashboard_helper.rb | 38 ++++-------------------------- app/views/layouts/nav/_dashboard.html.haml | 4 ++-- 3 files changed, 6 insertions(+), 40 deletions(-) (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 41ad5f98ace..4b8cae469e3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -257,10 +257,6 @@ class ApplicationController < ActionController::Base # or improve current implementation to filter only issues you # created or assigned or mentioned #@filter_params[:authorized_only] = true - - unless @filter_params[:assignee_id] - @filter_params[:assignee_id] = current_user.id - end end @filter_params diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb index 976a396e7b6..3e6f3b41ff5 100644 --- a/app/helpers/dashboard_helper.rb +++ b/app/helpers/dashboard_helper.rb @@ -1,13 +1,4 @@ module DashboardHelper - def entities_per_project(project, entity) - case entity.to_sym - when :issue then @issues.where(project_id: project.id) - when :merge_request then @merge_requests.where(target_project_id: project.id) - else - [] - end.count - end - def projects_dashboard_filter_path(options={}) exist_opts = { sort: params[:sort], @@ -22,32 +13,11 @@ module DashboardHelper path end - def assigned_entities_count(current_user, entity, scope = nil) - items = current_user.send('assigned_' + entity.pluralize) - get_count(items, scope) - end - - def authored_entities_count(current_user, entity, scope = nil) - items = current_user.send(entity.pluralize) - get_count(items, scope) + def assigned_issues_dashboard_path + issues_dashboard_path(assignee_id: current_user.id) end - def authorized_entities_count(current_user, entity, scope = nil) - items = entity.classify.constantize - get_count(items, scope, true, current_user) - end - - protected - - def get_count(items, scope, get_authorized = false, current_user = nil) - items = items.opened - if scope.kind_of?(Group) - items = items.of_group(scope) - elsif scope.kind_of?(Project) - items = items.of_projects(scope) - elsif get_authorized - items = items.of_projects(current_user.authorized_projects) - end - items.count + def assigned_mrs_dashboard_path + merge_requests_dashboard_path(assignee_id: current_user.id) end end diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index da1976346d5..a2eaa2d83c5 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -10,13 +10,13 @@ %span Projects = nav_link(path: 'dashboard#issues') do - = link_to issues_dashboard_path, class: 'shortcuts-issues' do + = link_to assigned_issues_dashboard_path, class: 'shortcuts-issues' do %i.fa.fa-exclamation-circle %span Issues %span.count= current_user.assigned_issues.opened.count = nav_link(path: 'dashboard#merge_requests') do - = link_to merge_requests_dashboard_path, class: 'shortcuts-merge_requests' do + = link_to assigned_mrs_dashboard_path, class: 'shortcuts-merge_requests' do %i.fa.fa-tasks %span Merge Requests -- cgit v1.2.1 From aacf07467c1a30b349b8fa1d0155e8c95418bafe Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Fri, 26 Dec 2014 15:24:21 -0600 Subject: Merge request error display. Fixes #8432 --- app/services/merge_requests/build_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb index 1475973e543..859c3f56b2b 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -13,7 +13,7 @@ module MergeRequests merge_request.target_branch ||= merge_request.target_project.default_branch unless merge_request.target_branch && merge_request.source_branch - return build_failed(merge_request, "You must select source and target branches") + return build_failed(merge_request, nil) end # Generate suggested MR title based on source branch name @@ -59,7 +59,7 @@ module MergeRequests end def build_failed(merge_request, message) - merge_request.errors.add(:base, message) + merge_request.errors.add(:base, message) unless message.nil? merge_request.compare_commits = [] merge_request.can_be_created = false merge_request -- cgit v1.2.1 From 4adc033761db149e5bb46f4be02788f1fd384b20 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 27 Dec 2014 16:03:02 +0200 Subject: Improve UI for group milestone and project milestone pages Signed-off-by: Dmitriy Zaporozhets --- app/views/groups/milestones/show.html.haml | 70 ++++++++++++------------- app/views/projects/milestones/show.html.haml | 76 +++++++++++++--------------- 2 files changed, 71 insertions(+), 75 deletions(-) (limited to 'app') diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml index 411d1822be0..7bcac56c37b 100644 --- a/app/views/groups/milestones/show.html.haml +++ b/app/views/groups/milestones/show.html.haml @@ -1,4 +1,9 @@ -%h3.page-title +%h4.page-title + .issue-box{ class: "issue-box-#{@group_milestone.closed? ? 'closed' : 'open'}" } + - if @group_milestone.closed? + Closed + - else + Open Milestone #{@group_milestone.title} .pull-right - if can?(current_user, :manage_group, @group) @@ -7,46 +12,41 @@ - else = link_to 'Reopen Milestone', group_milestone_path(@group, @group_milestone.safe_title, title: @group_milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-small btn-grouped btn-reopen" +%hr - if (@group_milestone.total_items_count == @group_milestone.closed_items_count) && @group_milestone.active? .alert.alert-success %span All issues for this milestone are closed. You may close the milestone now. -.back-link - = link_to group_milestones_path(@group) do - ← To milestones list - -.issue-box{ class: "issue-box-#{@group_milestone.closed? ? 'closed' : 'open'}" } - .state.clearfix - .state-label - - if @group_milestone.closed? - Closed - - else - Open - - %h4.title - = gfm escape_once(@group_milestone.title) - - .description - - @group_milestone.milestones.each do |milestone| - %hr - %h4 - = link_to "#{milestone.project.name} - #{milestone.title}", project_milestone_path(milestone.project, milestone) - %span.pull-right= milestone.expires_at +.description +%table.table + %thead + %tr + %th Project + %th Open issues + %th State + %th Due date + - @group_milestone.milestones.each do |milestone| + %tr + %td + = link_to "#{milestone.project.name}", project_milestone_path(milestone.project, milestone) + %td + = milestone.issues.opened.count + %td - if milestone.closed? - %span.label.label-danger #{milestone.state} - = preserve do - - if milestone.description.present? - = milestone.description - - .context - %p - Progress: - #{@group_milestone.closed_items_count} closed - – - #{@group_milestone.open_items_count} open + Closed + - else + Open + %td + = milestone.expires_at - .progress.progress-info - .progress-bar{style: "width: #{@group_milestone.percent_complete}%;"} +.context + %p.lead + Progress: + #{@group_milestone.closed_items_count} closed + – + #{@group_milestone.open_items_count} open + .progress.progress-info + .progress-bar{style: "width: #{@group_milestone.percent_complete}%;"} %ul.nav.nav-tabs %li.active diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index cd62e4811ac..031b5a31895 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -1,5 +1,5 @@ = render "projects/issues_nav" -%h3.page-title +%h4.page-title .issue-box{ class: issue_box_class(@milestone) } - if @milestone.closed? Closed @@ -8,52 +8,44 @@ - else Open Milestone ##{@milestone.iid} - .pull-right.creator - %small= @milestone.expires_at + %small.creator + = @milestone.expires_at + .pull-right + - if can?(current_user, :admin_milestone, @project) + = link_to edit_project_milestone_path(@project, @milestone), class: "btn btn-grouped" do + %i.fa.fa-pencil-square-o + Edit + - if @milestone.active? + = link_to 'Close Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-grouped" + - else + = link_to 'Reopen Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-grouped" %hr - if @milestone.issues.any? && @milestone.can_be_closed? .alert.alert-success %span All issues for this milestone are closed. You may close milestone now. -.row - .col-sm-9 - %h3.issue-title - = gfm escape_once(@milestone.title) - %div - - if @milestone.description.present? - .description - .wiki - = preserve do - = markdown @milestone.description - - %hr - .context - %p.lead - Progress: - #{@milestone.closed_items_count} closed - – - #{@milestone.open_items_count} open -   - %span.light #{@milestone.percent_complete}% complete - %span.pull-right= @milestone.expires_at - .progress.progress-info - .progress-bar{style: "width: #{@milestone.percent_complete}%;"} - .col-sm-3 - %div - - if can?(current_user, :admin_milestone, @project) - = link_to edit_project_milestone_path(@project, @milestone), class: "btn btn-block" do - %i.fa.fa-pencil-square-o - Edit - - if @milestone.active? - = link_to 'Close Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-block" - - else - = link_to 'Reopen Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-block" - = link_to new_project_issue_path(@project, issue: { milestone_id: @milestone.id }), class: "btn btn-block", title: "New Issue" do - %i.fa.fa-plus - New Issue - = link_to 'Browse Issues', project_issues_path(@milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link btn-block" +%h3.issue-title + = gfm escape_once(@milestone.title) +%div + - if @milestone.description.present? + .description + .wiki + = preserve do + = markdown @milestone.description +%hr +.context + %p.lead + Progress: + #{@milestone.closed_items_count} closed + – + #{@milestone.open_items_count} open +   + %span.light #{@milestone.percent_complete}% complete + %span.pull-right= @milestone.expires_at + .progress.progress-info + .progress-bar{style: "width: #{@milestone.percent_complete}%;"} %ul.nav.nav-tabs @@ -71,6 +63,10 @@ %span.badge= @users.count .pull-right + = link_to new_project_issue_path(@project, issue: { milestone_id: @milestone.id }), class: "btn btn-grouped", title: "New Issue" do + %i.fa.fa-plus + New Issue + = link_to 'Browse Issues', project_issues_path(@milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link btn-grouped" .tab-content .tab-pane.active#tab-issues -- cgit v1.2.1 From c2331d87e5ab561db8a4003c4df1ed20755ab108 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Sat, 27 Dec 2014 19:22:15 +0400 Subject: chmod -x --- app/views/devise/confirmations/new.html.haml | 0 app/views/devise/passwords/new.html.haml | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 app/views/devise/confirmations/new.html.haml mode change 100755 => 100644 app/views/devise/passwords/new.html.haml (limited to 'app') diff --git a/app/views/devise/confirmations/new.html.haml b/app/views/devise/confirmations/new.html.haml old mode 100755 new mode 100644 diff --git a/app/views/devise/passwords/new.html.haml b/app/views/devise/passwords/new.html.haml old mode 100755 new mode 100644 -- cgit v1.2.1 From 6342bc299457a2b298e8cb556bcd55efe1bbe030 Mon Sep 17 00:00:00 2001 From: Stephan van Leeuwen Date: Sat, 27 Dec 2014 20:08:29 +0100 Subject: Changed header to stay at the top of the page. --- app/assets/stylesheets/generic/common.scss | 2 +- app/assets/stylesheets/sections/header.scss | 3 +++ app/assets/stylesheets/sections/sidebar.scss | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 2fc738c18d8..fa25757cfc3 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -282,7 +282,7 @@ img.emoji { } .navless-container { - margin-top: 20px; + margin-top: 68px; } .description-block { diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index db419f76532..33a37ee6d7a 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -7,6 +7,9 @@ header { margin-bottom: 0; min-height: 40px; border: none; + position: fixed; + top: 0; + width: 100%; .navbar-inner { filter: none; diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 697e9d20231..d03f73f2872 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -11,6 +11,7 @@ width: 100%; padding: 15px; background: #FFF; + margin-top: 48px; } .nav-sidebar { @@ -131,9 +132,9 @@ .sidebar-wrapper { width: 52px; position: fixed; - left: 50px; + top: 0; + left: 0; height: 100%; - margin-left: -50px; border-right: 1px solid #EAEAEA; overflow-x: hidden; -- cgit v1.2.1 From 6c65b91d8c754c61fe8e50966283af5f78c1c9f0 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Tue, 30 Sep 2014 22:28:05 +0200 Subject: Remove or prepend _ to unused method arguments --- app/controllers/registrations_controller.rb | 4 ++-- app/helpers/tree_helper.rb | 2 +- app/views/projects/tree/_tree.html.haml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 6d3214b70a8..9321536e6df 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -15,11 +15,11 @@ class RegistrationsController < Devise::RegistrationsController super end - def after_sign_up_path_for(resource) + def after_sign_up_path_for(_resource) new_user_session_path end - def after_inactive_sign_up_path_for(resource) + def after_inactive_sign_up_path_for(_resource) new_user_session_path end diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index e32aeba5f8f..b86275704c9 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -108,7 +108,7 @@ module TreeHelper end end - def up_dir_path(tree) + def up_dir_path file = File.join(@path, "..") tree_join(@ref, file) end diff --git a/app/views/projects/tree/_tree.html.haml b/app/views/projects/tree/_tree.html.haml index 1159fcadffd..68ccd4d61bb 100644 --- a/app/views/projects/tree/_tree.html.haml +++ b/app/views/projects/tree/_tree.html.haml @@ -35,7 +35,7 @@ - if @path.present? %tr.tree-item %td.tree-item-file-name - = link_to "..", project_tree_path(@project, up_dir_path(tree)), class: 'prepend-left-10' + = link_to "..", project_tree_path(@project, up_dir_path), class: 'prepend-left-10' %td %td.hidden-xs -- cgit v1.2.1 From 5dbe94dc9bda5deceb6957a7e757425874f448de Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Thu, 4 Dec 2014 16:31:12 +0100 Subject: Simplify SSH fingerprint regexp extraction [\d\h] is the same as \h --- app/models/key.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/key.rb b/app/models/key.rb index 095c73d8baf..65a426d1f8b 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -89,7 +89,7 @@ class Key < ActiveRecord::Base end if cmd_status.zero? - cmd_output.gsub /([\d\h]{2}:)+[\d\h]{2}/ do |match| + cmd_output.gsub /(\h{2}:)+\h{2}/ do |match| self.fingerprint = match end end -- cgit v1.2.1 From cd688a60111853f63413a87ad6632ad57368e886 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sun, 19 Oct 2014 16:09:38 +0200 Subject: Replace regex methods by string ones since faster and more readable. --- app/models/commit.rb | 8 ++++---- app/models/project_services/campfire_service.rb | 4 ++-- app/models/project_services/hipchat_service.rb | 4 ++-- app/models/project_services/pushover_service.rb | 4 ++-- app/models/project_services/slack_message.rb | 4 ++-- app/models/user.rb | 2 +- app/services/git_push_service.rb | 8 ++++---- app/services/notification_service.rb | 2 +- 8 files changed, 18 insertions(+), 18 deletions(-) (limited to 'app') diff --git a/app/models/commit.rb b/app/models/commit.rb index 37dd371ec00..baccf286740 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -75,11 +75,11 @@ class Commit return no_commit_message if title.blank? - title_end = title.index(/\n/) + title_end = title.index("\n") if (!title_end && title.length > 100) || (title_end && title_end > 100) title[0..79] << "…".html_safe else - title.split(/\n/, 2).first + title.split("\n", 2).first end end @@ -87,11 +87,11 @@ class Commit # # cut off, ellipses (`&hellp;`) are prepended to the commit message. def description - title_end = safe_message.index(/\n/) + title_end = safe_message.index("\n") @description ||= if (!title_end && safe_message.length > 100) || (title_end && title_end > 100) "…".html_safe << safe_message[80..-1] else - safe_message.split(/\n/, 2)[1].try(:chomp) + safe_message.split("\n", 2)[1].try(:chomp) end end diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb index 0736ddab99b..3116c311052 100644 --- a/app/models/project_services/campfire_service.rb +++ b/app/models/project_services/campfire_service.rb @@ -60,9 +60,9 @@ class CampfireService < Service message << "[#{project.name_with_namespace}] " message << "#{push[:user_name]} " - if before =~ /000000/ + if before.include?('000000') message << "pushed new branch #{ref} \n" - elsif after =~ /000000/ + elsif after.include?('000000') message << "removed branch #{ref} \n" else message << "pushed #{push[:total_commits_count]} commits to #{ref}. " diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index a848d74044c..5645a15b144 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -58,12 +58,12 @@ class HipchatService < Service message = "" message << "#{push[:user_name]} " - if before =~ /000000/ + if before.include?('000000') message << "pushed new branch #{ref}"\ " to "\ "#{project.name_with_namespace.gsub!(/\s/, "")}\n" - elsif after =~ /000000/ + elsif after.include?('000000') message << "removed branch #{ref} from #{project.name_with_namespace.gsub!(/\s/,'')} \n" else message << "pushed to branch Date: Mon, 29 Dec 2014 09:04:31 +0100 Subject: Use shorter search for protected branch status. --- app/models/project.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index 80f1c0d598a..40b3412c654 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -471,7 +471,7 @@ class Project < ActiveRecord::Base end def developers_can_push_to_protected_branch?(branch_name) - protected_branches.map{ |pb| pb.developers_can_push if pb.name == branch_name }.compact.first + protected_branches.any? { |pb| pb.name == branch_name && pb.developers_can_push } end def forked? -- cgit v1.2.1 From 6aec286fca169502edd4c643a6d2202a012fa142 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 13:58:01 +0200 Subject: Fix navbar items for mobile biew Signed-off-by: Dmitriy Zaporozhets --- app/views/groups/_settings_nav.html.haml | 7 ++++--- app/views/layouts/nav/_profile.html.haml | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/views/groups/_settings_nav.html.haml b/app/views/groups/_settings_nav.html.haml index 82d760f7c41..35180792a0d 100644 --- a/app/views/groups/_settings_nav.html.haml +++ b/app/views/groups/_settings_nav.html.haml @@ -2,9 +2,10 @@ = nav_link(path: 'groups#edit') do = link_to edit_group_path(@group) do %i.fa.fa-pencil-square-o - Group + %span + Group = nav_link(path: 'groups#projects') do = link_to projects_group_path(@group) do %i.fa.fa-folder - Projects - + %span + Projects diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 36b48a5d02d..cc50b9b570a 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -7,7 +7,8 @@ = nav_link(controller: :accounts) do = link_to profile_account_path do %i.fa.fa-gear - Account + %span + Account = nav_link(path: ['profiles#applications', 'applications#edit', 'applications#show', 'applications#new']) do = link_to applications_profile_path do %i.fa.fa-cloud -- cgit v1.2.1 From a2afc5c3f95268920f5f93d367a94aa67945c0aa Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Mon, 29 Dec 2014 10:36:57 +0100 Subject: Remove unused ex local variable from event.rb --- app/models/event.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/event.rb b/app/models/event.rb index 65b4c2edfee..2a6c690ab91 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -174,7 +174,7 @@ class Event < ActiveRecord::Base def valid_push? data[:ref] && ref_name.present? - rescue => ex + rescue false end -- cgit v1.2.1 From cf9573686586fafc199c6178b672f9ee617476d2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 15:55:21 +0200 Subject: New feature: add 'Mention' notification level It does disable all emails expect system one or when you was @mentioned Signed-off-by: Dmitriy Zaporozhets --- app/models/notification.rb | 10 ++++++-- app/services/notification_service.rb | 33 +++++++++++++++++++++++++ app/views/profiles/notifications/show.html.haml | 7 ++++++ 3 files changed, 48 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/notification.rb b/app/models/notification.rb index b0f8ed6a4ec..1395274173d 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -6,12 +6,13 @@ class Notification N_PARTICIPATING = 1 N_WATCH = 2 N_GLOBAL = 3 + N_MENTION = 4 attr_accessor :target class << self def notification_levels - [N_DISABLED, N_PARTICIPATING, N_WATCH] + [N_DISABLED, N_PARTICIPATING, N_WATCH, N_MENTION] end def options_with_labels @@ -19,12 +20,13 @@ class Notification disabled: N_DISABLED, participating: N_PARTICIPATING, watch: N_WATCH, + mention: N_MENTION, global: N_GLOBAL } end def project_notification_levels - [N_DISABLED, N_PARTICIPATING, N_WATCH, N_GLOBAL] + [N_DISABLED, N_PARTICIPATING, N_WATCH, N_GLOBAL, N_MENTION] end end @@ -48,6 +50,10 @@ class Notification target.notification_level == N_GLOBAL end + def mention? + target.notification_level == N_MENTION + end + def level target.notification_level end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index d1aadd741e1..fb8f812dad8 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -144,6 +144,10 @@ class NotificationService # Merge project watchers recipients = recipients.concat(project_watchers(note.project)).compact.uniq + # Reject mention users unless mentioned in comment + recipients = reject_mention_users(recipients - note.mentioned_users, note.project) + recipients = recipients + note.mentioned_users + # Reject mutes users recipients = reject_muted_users(recipients, note.project) @@ -285,13 +289,39 @@ class NotificationService end end + # Remove users with notification level 'Mentioned' + def reject_mention_users(users, project = nil) + users = users.to_a.compact.uniq + + users.reject do |user| + next user.notification.mention? unless project + + tm = project.project_members.find_by(user_id: user.id) + + if !tm && project.group + tm = project.group.group_members.find_by(user_id: user.id) + end + + # reject users who globally set mention notification and has no membership + next user.notification.mention? unless tm + + # reject users who set mention notification in project + next true if tm.notification.mention? + + # reject users who have N_MENTION in project and disabled in global settings + tm.notification.global? && user.notification.mention? + end + end + def new_resource_email(target, project, method) if target.respond_to?(:participants) recipients = target.participants else recipients = [] end + recipients = reject_muted_users(recipients, project) + recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(target.author) @@ -302,6 +332,7 @@ class NotificationService def close_resource_email(target, project, current_user, method) recipients = reject_muted_users([target.author, target.assignee], project) + recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(current_user) @@ -320,6 +351,7 @@ class NotificationService # reject users with disabled notifications recipients = reject_muted_users(recipients, project) + recipients = reject_mention_users(recipients, project) # Reject me from recipients if I reassign an item recipients.delete(current_user) @@ -331,6 +363,7 @@ class NotificationService def reopen_resource_email(target, project, current_user, method, status) recipients = reject_muted_users([target.author, target.assignee], project) + recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(current_user) diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index a044fad8fa3..96fe91b9b20 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -15,6 +15,13 @@ Disabled %p You will not get any notifications via email + .radio + = label_tag nil, class: '' do + = radio_button_tag :notification_level, Notification::N_MENTION, @notification.mention?, class: 'trigger-submit' + .level-title + Mention + %p You will receive notifications only for comments where you was @mentioned + .radio = label_tag nil, class: '' do = radio_button_tag :notification_level, Notification::N_PARTICIPATING, @notification.participating?, class: 'trigger-submit' -- cgit v1.2.1 From b07802ab684d2126f84f927a21191a79d200788d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 16:41:10 +0200 Subject: Rescue Net::OpenTimeout exception in web hook Signed-off-by: Dmitriy Zaporozhets --- app/models/hooks/web_hook.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index 8479d4aecf6..d1d522be194 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -48,7 +48,7 @@ class WebHook < ActiveRecord::Base verify: false, basic_auth: auth) end - rescue SocketError, Errno::ECONNREFUSED => e + rescue SocketError, Errno::ECONNREFUSED, Net::OpenTimeout => e logger.error("WebHook Error => #{e}") false end -- cgit v1.2.1 From 91a3a7a6a0cf7806ad4c00f2cac4854a77441b5f Mon Sep 17 00:00:00 2001 From: yglukhov Date: Wed, 24 Dec 2014 16:52:40 +0200 Subject: Markdown preview in wiki --- app/assets/stylesheets/generic/forms.scss | 3 ++- app/assets/stylesheets/generic/markdown_area.scss | 1 + app/views/projects/wikis/_form.html.haml | 12 +++++++----- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/forms.scss b/app/assets/stylesheets/generic/forms.scss index e8b23090b0f..865253d4a77 100644 --- a/app/assets/stylesheets/generic/forms.scss +++ b/app/assets/stylesheets/generic/forms.scss @@ -88,7 +88,8 @@ label { @include box-shadow(none); } -.issuable-description { +.issuable-description, +.wiki-content { margin-top: 35px; } diff --git a/app/assets/stylesheets/generic/markdown_area.scss b/app/assets/stylesheets/generic/markdown_area.scss index 4168e235cae..5a87cc6c612 100644 --- a/app/assets/stylesheets/generic/markdown_area.scss +++ b/app/assets/stylesheets/generic/markdown_area.scss @@ -65,6 +65,7 @@ .edit_note, .issuable-description, .milestone-description, +.wiki-content, .merge-request-form { .nav-tabs { margin-bottom: 0; diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml index f37c086716d..111484c8316 100644 --- a/app/views/projects/wikis/_form.html.haml +++ b/app/views/projects/wikis/_form.html.haml @@ -19,13 +19,15 @@ %code [Link Title](page-slug) \. - .form-group + .form-group.wiki-content = f.label :content, class: 'control-label' .col-sm-10 - = render 'projects/zen', f: f, attr: :content, classes: 'description form-control' - .col-sm-12.hint - .pull-left Wiki content is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'} - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + = render layout: 'projects/md_preview' do + = render 'projects/zen', f: f, attr: :content, classes: 'description form-control' + .col-sm-12.hint + .pull-left Wiki content is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'} + .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + .clearfix .error-alert .form-group -- cgit v1.2.1 From ed4e682eb809de9103c713a6604a732345e57529 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 17:48:43 +0200 Subject: Fix async services execution broken in 7.6 Signed-off-by: Dmitriy Zaporozhets --- app/models/project_services/slack_message.rb | 16 ++++++++-------- app/workers/project_service_worker.rb | 1 + app/workers/project_web_hook_worker.rb | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/models/project_services/slack_message.rb b/app/models/project_services/slack_message.rb index 28204e5ea60..d0ddb1f162c 100644 --- a/app/models/project_services/slack_message.rb +++ b/app/models/project_services/slack_message.rb @@ -1,6 +1,14 @@ require 'slack-notifier' class SlackMessage + attr_reader :after + attr_reader :before + attr_reader :commits + attr_reader :project_name + attr_reader :project_url + attr_reader :ref + attr_reader :username + def initialize(params) @after = params.fetch(:after) @before = params.fetch(:before) @@ -23,14 +31,6 @@ class SlackMessage private - attr_reader :after - attr_reader :before - attr_reader :commits - attr_reader :project_name - attr_reader :project_url - attr_reader :ref - attr_reader :username - def message if new_branch? new_branch_message diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb index cc0a7f25664..64d39c4d3f7 100644 --- a/app/workers/project_service_worker.rb +++ b/app/workers/project_service_worker.rb @@ -4,6 +4,7 @@ class ProjectServiceWorker sidekiq_options queue: :project_web_hook def perform(hook_id, data) + data = data.with_indifferent_access Service.find(hook_id).execute(data) end end diff --git a/app/workers/project_web_hook_worker.rb b/app/workers/project_web_hook_worker.rb index 9f9b9b1df5f..73085c046bd 100644 --- a/app/workers/project_web_hook_worker.rb +++ b/app/workers/project_web_hook_worker.rb @@ -4,6 +4,7 @@ class ProjectWebHookWorker sidekiq_options queue: :project_web_hook def perform(hook_id, data) - WebHook.find(hook_id).execute data + data = data.with_indifferent_access + WebHook.find(hook_id).execute(data) end end -- cgit v1.2.1 From 492f3a477940daf425aabc9dd4a33e7a1e9092c1 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 29 Dec 2014 17:07:23 +0100 Subject: Add user key actions to admins. --- app/controllers/admin/users_controller.rb | 24 +++++++++++++++++++++++- app/views/admin/users/show.html.haml | 27 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index baad9095b70..b11a0b04687 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -11,6 +11,7 @@ class Admin::UsersController < Admin::ApplicationController def show @personal_projects = user.personal_projects @joined_projects = user.projects.joined(@user) + @ssh_keys = user.keys.order('id DESC') end def new @@ -107,6 +108,27 @@ class Admin::UsersController < Admin::ApplicationController end end + def show_key + @key = user.keys.find(params[:key_id]) + + respond_to do |format| + format.html { render 'key' } + format.js { render nothing: true } + end + end + + def remove_key + key = user.keys.find(params[:key_id]) + + respond_to do |format| + if key.destroy + format.html { redirect_to [:admin, user], notice: 'User key was successfully removed.' } + else + format.html { redirect_to [:admin, user], alert: 'Failed to remove user key.' } + end + end + end + protected def user @@ -118,7 +140,7 @@ class Admin::UsersController < Admin::ApplicationController :email, :remember_me, :bio, :name, :username, :skype, :linkedin, :twitter, :website_url, :color_scheme_id, :theme_id, :force_random_password, :extern_uid, :provider, :password_expires_at, :avatar, :hide_no_ssh_key, - :projects_limit, :can_create_group, :admin + :projects_limit, :can_create_group, :admin, :key_id ) end end diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 29717aedd80..ef873fb2298 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -20,6 +20,8 @@ %a{"data-toggle" => "tab", href: "#groups"} Groups %li %a{"data-toggle" => "tab", href: "#projects"} Projects + %li + %a{"data-toggle" => "tab", href: "#ssh-keys"} SSH keys .tab-content #account.tab-pane.active @@ -217,3 +219,28 @@ - if tm.respond_to? :project = link_to project_team_member_path(project, @user), data: { confirm: remove_from_project_team_message(project, @user) }, remote: true, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from project' do %i.fa.fa-times + #ssh-keys.tab-pane + - if @ssh_keys.any? + .panel.panel-default + %table.table + %thead.panel-heading + %tr + %th Title + %th Fingerprint + %th + %tbody + - @ssh_keys.each do |key| + %tr + %td + = link_to user_key_admin_user_path(@user, key) do + %strong= key.title + %td + %span + (#{key.fingerprint}) + %span.cgray + added #{time_ago_with_tooltip(key.created_at)} + %td + = link_to 'Remove', remove_user_key_admin_user_path(@user, key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-small btn-remove delete-key pull-right" + + - else + .nothing-here-block User has no ssh keys -- cgit v1.2.1 From f0085d034b33adc78753e2952a5e04842ca979e3 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 29 Dec 2014 17:09:39 +0100 Subject: Reuse show page for user keys. --- app/views/admin/users/key.html.haml | 4 ++++ app/views/profiles/keys/_key_details.html.haml | 19 +++++++++++++++++++ app/views/profiles/keys/show.html.haml | 20 +------------------- 3 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 app/views/admin/users/key.html.haml create mode 100644 app/views/profiles/keys/_key_details.html.haml (limited to 'app') diff --git a/app/views/admin/users/key.html.haml b/app/views/admin/users/key.html.haml new file mode 100644 index 00000000000..c2b6ffc1fa8 --- /dev/null +++ b/app/views/admin/users/key.html.haml @@ -0,0 +1,4 @@ += render "profiles/keys/key_details" + +.pull-right + = link_to 'Remove', remove_user_key_admin_user_path(@user, @key), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" diff --git a/app/views/profiles/keys/_key_details.html.haml b/app/views/profiles/keys/_key_details.html.haml new file mode 100644 index 00000000000..b7e0029a8ac --- /dev/null +++ b/app/views/profiles/keys/_key_details.html.haml @@ -0,0 +1,19 @@ +.row + .col-md-4 + .panel.panel-default + .panel-heading + SSH Key + %ul.well-list + %li + %span.light Title: + %strong= @key.title + %li + %span.light Created on: + %strong= @key.created_at.stamp("Aug 21, 2011") + + .col-md-8 + %p + %span.light Fingerprint: + %strong= @key.fingerprint + %pre.well-pre + = @key.key diff --git a/app/views/profiles/keys/show.html.haml b/app/views/profiles/keys/show.html.haml index c4fc1bb269c..470b984d16c 100644 --- a/app/views/profiles/keys/show.html.haml +++ b/app/views/profiles/keys/show.html.haml @@ -1,22 +1,4 @@ -.row - .col-md-4 - .panel.panel-default - .panel-heading - SSH Key - %ul.well-list - %li - %span.light Title: - %strong= @key.title - %li - %span.light Created on: - %strong= @key.created_at.stamp("Aug 21, 2011") - - .col-md-8 - %p - %span.light Fingerprint: - %strong= @key.fingerprint - %pre.well-pre - = @key.key += render "key_details" .pull-right = link_to 'Remove', profile_key_path(@key), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" -- cgit v1.2.1 From a0c4fa31741ed3b5f01eaec0cf02fae10c39a62d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 19:11:34 +0200 Subject: Use same font size for all sidenav items Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/sidebar.scss | 8 -------- 1 file changed, 8 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss index 581a7318ee1..79441eba6db 100644 --- a/app/assets/stylesheets/sections/sidebar.scss +++ b/app/assets/stylesheets/sections/sidebar.scss @@ -87,15 +87,7 @@ padding-left: 0px; li { - line-height: 28px; - font-size: 12px; list-style: none; - - a { - padding: 5px 15px; - font-size: 12px; - padding-left: 20px; - } } } -- cgit v1.2.1 From 95c0393789e6f65e2c0ddcbdf1d7e38801be2dd4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 19:30:27 +0200 Subject: Inline protected branches list Signed-off-by: Dmitriy Zaporozhets --- .../protected_branches/_branches_list.html.haml | 24 ++++++++++------------ 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'app') diff --git a/app/views/projects/protected_branches/_branches_list.html.haml b/app/views/projects/protected_branches/_branches_list.html.haml index c37b255b6ac..e422799f55c 100644 --- a/app/views/projects/protected_branches/_branches_list.html.haml +++ b/app/views/projects/protected_branches/_branches_list.html.haml @@ -1,10 +1,12 @@ - unless @branches.empty? - %h5 Already Protected: + %br + %h4 Already Protected: %table.table.protected-branches-list %thead %tr.no-border %th Branch %th Developers can push + %th Last commit %th %tbody @@ -18,19 +20,15 @@ %span.label.label-info default %td = check_box_tag "developers_can_push", branch.id, branch.developers_can_push, "data-url" => @url + %td + - if commit = branch.commit + = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do + = commit.short_id + · + #{time_ago_with_tooltip(commit.committed_date)} + - else + (branch was removed from repository) %td .pull-right - if can? current_user, :admin_project, @project = link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small" - %tr.no-border - %td - - if commit = branch.commit - = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do - = commit.short_id - %span.light - = gfm escape_once(truncate(commit.title, length: 40)) - #{time_ago_with_tooltip(commit.committed_date)} - - else - (branch was removed from repository) - %td - %td -- cgit v1.2.1 From b97b85496307acf57fdfd0a2b55b721f8f592718 Mon Sep 17 00:00:00 2001 From: Stephan van Leeuwen Date: Mon, 29 Dec 2014 19:10:53 +0100 Subject: Updated merge request commits view The merge request commits tab now uses the same layout as used in the project commits view --- app/views/projects/merge_requests/_show.html.haml | 2 +- .../merge_requests/show/_commits.html.haml | 31 +--------------------- 2 files changed, 2 insertions(+), 31 deletions(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 74ef819a7aa..f8d2673335a 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -42,7 +42,7 @@ %span.badge= @merge_request.mr_and_commit_notes.count %li.commits-tab{data: {action: 'commits'}} = link_to project_merge_request_path(@project, @merge_request), title: 'Commits' do - %i.fa.fa-database + %i.fa.fa-history Commits %span.badge= @commits.size %li.diffs-tab{data: {action: 'diffs'}} diff --git a/app/views/projects/merge_requests/show/_commits.html.haml b/app/views/projects/merge_requests/show/_commits.html.haml index a6587403871..ac214e687b8 100644 --- a/app/views/projects/merge_requests/show/_commits.html.haml +++ b/app/views/projects/merge_requests/show/_commits.html.haml @@ -1,30 +1 @@ -- if @commits.present? - .panel.panel-default - .panel-heading - %i.fa.fa-list - Commits (#{@commits.count}) - .commits.mr-commits - - if @commits.count > 8 - %ul.first-commits.well-list - - @commits.first(8).each do |commit| - = render "projects/commits/commit", commit: commit, project: @merge_request.source_project - %li.bottom - 8 of #{@commits.count} commits displayed. - %strong - %a.show-all-commits Click here to show all - - if @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE - %ul.all-commits.hide.well-list - - @commits.first(MergeRequestDiff::COMMITS_SAFE_SIZE).each do |commit| - = render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project - %li - other #{@commits.size - MergeRequestDiff::COMMITS_SAFE_SIZE} commits hidden to prevent performance issues. - - else - %ul.all-commits.hide.well-list - - @commits.each do |commit| - = render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project - - - else - %ul.well-list - - @commits.each do |commit| - = render "projects/commits/commit", commit: commit, project: @merge_request.source_project - += render "projects/commits/commits" \ No newline at end of file -- cgit v1.2.1 From 4fe699fdc3396c93b7d84a43ba96c432711a1ea5 Mon Sep 17 00:00:00 2001 From: Stephan van Leeuwen Date: Mon, 29 Dec 2014 20:14:51 +0100 Subject: Updated create merge request submit view Create merge request submit view now uses the same form layout as creating an issue. The commits view now uses the same layout as the project commits view The commits and diffs are now in separate tabs, as used in the merge request view --- .../projects/merge_requests/_new_submit.html.haml | 147 +++++++++++++-------- 1 file changed, 91 insertions(+), 56 deletions(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index 76813e688b5..6c5875c7d42 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -9,74 +9,103 @@ %span.pull-right = link_to 'Change branches', new_project_merge_request_path(@project) -= form_for [@project, @merge_request], html: { class: "merge-request-form gfm-form" } do |f| - .panel.panel-default - - .panel-body - .form-group - .light - = f.label :title do - Title * - = f.text_field :title, class: "form-control input-lg js-gfm-input", maxlength: 255, rows: 5, required: true - .form-group - .light - = f.label :description, "Description" += form_for [@project, @merge_request], html: { class: "merge-request-form form-horizontal gfm-form" } do |f| + .merge-request-form-info + .form-group + = f.label :title, class: 'control-label' do + %strong Title * + .col-sm-10 + = f.text_field :title, maxlength: 255, autofocus: true, class: 'form-control pad js-gfm-input', required: true + .form-group.issuable-description + = f.label :description, 'Description', class: 'control-label' + .col-sm-10 = render layout: 'projects/md_preview' do - = render 'projects/zen', f: f, attr: :description, - classes: 'description form-control' - .clearfix.hint - .pull-left Description is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' + + .col-sm-12-hint + .pull-left + Parsed with + #{link_to 'Gitlab Flavored Markdown', help_page_path('markdown', 'markdown'), target: '_blank'}. + .pull-right + Attach images (JPG, PNG, GIF) by dragging & dropping + or #{link_to 'selecting them', '#', class: 'markdown-selector'}. + + .clearfix .error-alert - .form-group - .issue-assignee - = f.label :assignee_id do - %i.fa.fa-user - Assign to - %div - = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select a user', class: 'custom-form-control', selected: @merge_request.assignee_id, project_id: @merge_request.target_project_id) -   - = link_to 'Assign to me', '#', class: 'btn assign-to-me-link' - .form-group - .issue-milestone - = f.label :milestone_id do - %i.fa.fa-clock-o - Milestone - %div= f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2'}) - .form-group - = f.label :label_ids do - %i.fa.fa-tag - Labels - %div - = f.collection_select :label_ids, @merge_request.target_project.labels.all, :id, :name, { selected: @merge_request.label_ids }, multiple: true, class: 'select2' + %hr + .form-group + .issue-assignee + = f.label :assignee_id, class: 'control-label' do + %i.fa.fa-user + Assign to + .col-sm-10 + = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select a user', class: 'custom-form-control', selected: @merge_request.assignee_id, project_id: @merge_request.target_project_id) +   + = link_to 'Assign to me', '#', class: 'btn assign-to-me-link' + .form-group + .issue-milestone + = f.label :milestone_id, class: 'control-label' do + %i.fa.fa-clock-o + Milestone + .col-sm-10 + - if milestone_options(@merge_request).present? + = f.select(:milestone_id, milestone_options(@merge_request), {include_blank: 'Select milestone'}, {class: 'select2'}) + - else + %span.light No open milestones available. +   + - if can? current_user, :admin_milestone, @merge_request.target_project + = link_to 'Create new milestone', new_project_milestone_path(@merge_request.target_project), target: :blank + .form-group + = f.label :label_ids, class: 'control-label' do + %i.fa.fa-tag + Labels + .col-sm-10 + - if @merge_request.target_project.labels.any? + = f.collection_select :label_ids, @merge_request.target_project.labels.all, :id, :name, {selected: @merge_request.label_ids}, multiple: true, class: 'select2' + - else + %span.light No labels yet. +   + - if can? current_user, :admin_label, @merge_request.target_project + = link_to 'Create new label', new_project_label_path(@merge_request.target_project), target: :blank - .panel-footer + .form-actions - if contribution_guide_url(@target_project) %p Please review the - %strong #{link_to "guidelines for contribution", contribution_guide_url(@target_project)} + %strong #{link_to 'guidelines for contribution', contribution_guide_url(@target_project)} to this repository. = f.hidden_field :source_project_id + = f.hidden_field :source_branch = f.hidden_field :target_project_id = f.hidden_field :target_branch - = f.hidden_field :source_branch - = f.submit 'Submit merge request', class: "btn btn-create" + = f.submit 'Submit merge request', class: 'btn btn-create' -.mr-compare - = render "projects/commits/commit_list" - - %h4 Changes - - if @diffs.present? - = render "projects/diffs/diffs", diffs: @diffs, project: @project - - elsif @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE - .bs-callout.bs-callout-danger - %h4 This comparison includes more than #{MergeRequestDiff::COMMITS_SAFE_SIZE} commits. - %p To preserve performance the line changes are not shown. - - else - .bs-callout.bs-callout-danger - %h4 This comparison includes huge diff. - %p To preserve performance the line changes are not shown. +.mr-compare.merge-request + %ul.nav.nav-tabs.merge-request-tabs + %li.commits-tab{data: {action: 'commits'}} + = link_to url_for(params) do + %i.fa.fa-history + Commits + %span.badge= @commits.size + %li.diffs-tab{data: {action: 'diffs'}} + = link_to url_for(params) do + %i.fa.fa-list-alt + Changes + %span.badge= @diffs.size + .commits.tab-content + = render "projects/commits/commits" + .diffs.tab-content + - if @diffs.present? + = render "projects/diffs/diffs", diffs: @diffs, project: @project + - elsif @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE + .bs-callout.bs-callout-danger + %h4 This comparison includes more than #{MergeRequestDiff::COMMITS_SAFE_SIZE} commits. + %p To preserve performance the line changes are not shown. + - else + .bs-callout.bs-callout-danger + %h4 This comparison includes a huge diff. + %p To preserve performance the line changes are not shown. :javascript $('.assign-to-me-link').on('click', function(e){ @@ -85,3 +114,9 @@ }); window.project_image_path_upload = "#{upload_image_project_path @project}"; + +:javascript + var merge_request + merge_request = new MergeRequest({ + action: 'commits' + }); -- cgit v1.2.1 From b753bfd1456628a255cbe3cbf90067a68544bc8b Mon Sep 17 00:00:00 2001 From: Stephan van Leeuwen Date: Mon, 29 Dec 2014 20:29:59 +0100 Subject: Updated issuable form to only show create links if allowed, and added contribution guide url to form actions. Also changed icon for labels. Removed contribution guide notice from issue form. --- app/views/projects/_issuable_form.html.haml | 13 ++++++++++--- app/views/projects/issues/_form.html.haml | 6 ------ 2 files changed, 10 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml index b02f52a5aff..19fdab049ea 100644 --- a/app/views/projects/_issuable_form.html.haml +++ b/app/views/projects/_issuable_form.html.haml @@ -52,10 +52,11 @@ - else %span.light No open milestones available.   - = link_to 'Create new milestone', new_project_milestone_path(issuable.project), target: :blank + - if can? current_user, :admin_milestone, issuable.project + = link_to 'Create new milestone', new_project_milestone_path(issuable.project), target: :blank .form-group = f.label :label_ids, class: 'control-label' do - %i.icon-tag + %i.fa.fa-tag Labels .col-sm-10 - if issuable.project.labels.any? @@ -64,9 +65,15 @@ - else %span.light No labels yet.   - = link_to 'Create new label', new_project_label_path(issuable.project), target: :blank + - if can? current_user, :admin_label, issuable.project + = link_to 'Create new label', new_project_label_path(issuable.project), target: :blank .form-actions + - if contribution_guide_url(issuable.project) && !issuable.persisted? + %p + Please review the + %strong #{link_to 'guidelines for contribution', contribution_guide_url(issuable.project)} + to this repository. - if issuable.new_record? = f.submit "Submit new #{issuable.class.model_name.human.downcase}", class: 'btn btn-create' - else diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 64a28d8da49..2a7b44955cd 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -1,12 +1,6 @@ %div.issue-form-holder %h3.page-title= @issue.new_record? ? "New Issue" : "Edit Issue ##{@issue.iid}" %hr - - if @repository.exists? && !@repository.empty? && @repository.contribution_guide && !@issue.persisted? - - contribution_guide_url = project_blob_path(@project, tree_join(@repository.root_ref, @repository.contribution_guide.name)) - .row - .col-sm-10.col-sm-offset-2 - .alert.alert-info - = "Please review the #{link_to "guidelines for contribution", contribution_guide_url} to this repository.".html_safe = form_for [@project, @issue], html: { class: 'form-horizontal issue-form gfm-form' } do |f| = render 'projects/issuable_form', f: f, issuable: @issue -- cgit v1.2.1 From 95cd5b275a3dcb442c5571814baafbfb90639a20 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Dec 2014 22:59:08 +0200 Subject: Prevent content overflow for notes Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/notes.scss | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 74c500f88b3..1550e30fe53 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -62,6 +62,7 @@ ul.notes { } .note-body { @include md-typography; + overflow: auto; } .note-header { padding-bottom: 3px; -- cgit v1.2.1 From 9f9f1b3b87431221e15b52c6385afbfa6fdb0723 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Mon, 29 Dec 2014 14:20:22 -0600 Subject: Fix HipChat Server --- app/models/project_services/hipchat_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index a848d74044c..6ef4b210c56 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -35,7 +35,7 @@ class HipchatService < Service { type: 'text', name: 'token', placeholder: '' }, { type: 'text', name: 'room', placeholder: '' }, { type: 'text', name: 'server', - placeholder: 'Leave blank for default. https://chat.hipchat.com' } + placeholder: 'Leave blank for default. https://hipchat.example.com' } ] end @@ -47,7 +47,7 @@ class HipchatService < Service def gate options = { api_version: 'v2' } - options[:server_url] = server unless server.nil? + options[:server_url] = server unless server.blank? @gate ||= HipChat::Client.new(token, options) end -- cgit v1.2.1 From 82829ed49e11a173275633cad63978e4ee07e927 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 30 Dec 2014 10:15:11 +0100 Subject: Move user key manipulation in admin section to a separate controller. --- app/controllers/admin/keys_controller.rb | 34 +++++++++++++++++++++++++++++++ app/controllers/admin/users_controller.rb | 21 ------------------- app/views/admin/keys/show.html.haml | 4 ++++ app/views/admin/users/key.html.haml | 4 ---- app/views/admin/users/show.html.haml | 4 ++-- 5 files changed, 40 insertions(+), 27 deletions(-) create mode 100644 app/controllers/admin/keys_controller.rb create mode 100644 app/views/admin/keys/show.html.haml delete mode 100644 app/views/admin/users/key.html.haml (limited to 'app') diff --git a/app/controllers/admin/keys_controller.rb b/app/controllers/admin/keys_controller.rb new file mode 100644 index 00000000000..21111bb44f5 --- /dev/null +++ b/app/controllers/admin/keys_controller.rb @@ -0,0 +1,34 @@ +class Admin::KeysController < Admin::ApplicationController + before_filter :user, only: [:show, :destroy] + + def show + @key = user.keys.find(params[:id]) + + respond_to do |format| + format.html + format.js { render nothing: true } + end + end + + def destroy + key = user.keys.find(params[:id]) + + respond_to do |format| + if key.destroy + format.html { redirect_to [:admin, user], notice: 'User key was successfully removed.' } + else + format.html { redirect_to [:admin, user], alert: 'Failed to remove user key.' } + end + end + end + + protected + + def user + @user ||= User.find_by!(username: params[:user_id]) + end + + def key_params + params.require(:user_id, :id) + end +end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index b11a0b04687..86c671ed756 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -108,27 +108,6 @@ class Admin::UsersController < Admin::ApplicationController end end - def show_key - @key = user.keys.find(params[:key_id]) - - respond_to do |format| - format.html { render 'key' } - format.js { render nothing: true } - end - end - - def remove_key - key = user.keys.find(params[:key_id]) - - respond_to do |format| - if key.destroy - format.html { redirect_to [:admin, user], notice: 'User key was successfully removed.' } - else - format.html { redirect_to [:admin, user], alert: 'Failed to remove user key.' } - end - end - end - protected def user diff --git a/app/views/admin/keys/show.html.haml b/app/views/admin/keys/show.html.haml new file mode 100644 index 00000000000..2ea05b6aa00 --- /dev/null +++ b/app/views/admin/keys/show.html.haml @@ -0,0 +1,4 @@ += render "profiles/keys/key_details" + +.pull-right + = link_to 'Remove', admin_user_key_path(@user, @key), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" diff --git a/app/views/admin/users/key.html.haml b/app/views/admin/users/key.html.haml deleted file mode 100644 index c2b6ffc1fa8..00000000000 --- a/app/views/admin/users/key.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -= render "profiles/keys/key_details" - -.pull-right - = link_to 'Remove', remove_user_key_admin_user_path(@user, @key), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index ef873fb2298..5754f9448d7 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -232,7 +232,7 @@ - @ssh_keys.each do |key| %tr %td - = link_to user_key_admin_user_path(@user, key) do + = link_to admin_user_key_path(@user, key) do %strong= key.title %td %span @@ -240,7 +240,7 @@ %span.cgray added #{time_ago_with_tooltip(key.created_at)} %td - = link_to 'Remove', remove_user_key_admin_user_path(@user, key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-small btn-remove delete-key pull-right" + = link_to 'Remove', admin_user_key_path(@user, key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-small btn-remove delete-key pull-right" - else .nothing-here-block User has no ssh keys -- cgit v1.2.1 From 27ee0fc57b3b3fe28f55d2a8cae424e99cf8f79e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 30 Dec 2014 11:32:24 +0200 Subject: Helper for ajax group selectbox Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/api.js.coffee | 29 +++++++++++++++++++++++++++++ app/assets/stylesheets/generic/selects.scss | 12 ++++++++++++ app/helpers/selects_helper.rb | 9 +++++++++ 3 files changed, 50 insertions(+) (limited to 'app') diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee index fafa5cdfaa4..27d04e7cac6 100644 --- a/app/assets/javascripts/api.js.coffee +++ b/app/assets/javascripts/api.js.coffee @@ -1,4 +1,6 @@ @Api = + groups_path: "/api/:version/groups.json" + group_path: "/api/:version/groups/:id.json" users_path: "/api/:version/users.json" user_path: "/api/:version/users/:id.json" notes_path: "/api/:version/projects/:id/notes.json" @@ -51,6 +53,33 @@ ).done (users) -> callback(users) + group: (group_id, callback) -> + url = Api.buildUrl(Api.group_path) + url = url.replace(':id', group_id) + + $.ajax( + url: url + data: + private_token: gon.api_token + dataType: "json" + ).done (group) -> + callback(group) + + # Return groups list. Filtered by query + # Only active groups retrieved + groups: (query, skip_ldap, callback) -> + url = Api.buildUrl(Api.groups_path) + + $.ajax( + url: url + data: + private_token: gon.api_token + search: query + per_page: 20 + dataType: "json" + ).done (groups) -> + callback(groups) + # Return project users list. Filtered by query # Only active users retrieved projectUsers: (project_id, query, callback) -> diff --git a/app/assets/stylesheets/generic/selects.scss b/app/assets/stylesheets/generic/selects.scss index e0f508d2695..d85e80a512b 100644 --- a/app/assets/stylesheets/generic/selects.scss +++ b/app/assets/stylesheets/generic/selects.scss @@ -116,6 +116,18 @@ select { } } +.group-result { + .group-image { + float: left; + } + .group-name { + font-weight: bold; + } + .group-path { + color: #999; + } +} + .user-result { .user-image { float: left; diff --git a/app/helpers/selects_helper.rb b/app/helpers/selects_helper.rb index ab24367c455..796d805f219 100644 --- a/app/helpers/selects_helper.rb +++ b/app/helpers/selects_helper.rb @@ -17,4 +17,13 @@ module SelectsHelper project_id = opts[:project_id] || @project.id hidden_field_tag(id, value, class: css_class, 'data-placeholder' => placeholder, 'data-project-id' => project_id) end + + def groups_select_tag(id, opts = {}) + css_class = "ajax-groups-select " + css_class << "multiselect " if opts[:multiple] + css_class << (opts[:class] || '') + value = opts[:selected] || '' + + hidden_field_tag(id, value, class: css_class) + end end -- cgit v1.2.1 From 5d2e637c17d28315185816a32b202ada15a7c77f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 30 Dec 2014 11:32:52 +0200 Subject: Group selectbox js Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/groups_select.js.coffee | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/assets/javascripts/groups_select.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/groups_select.js.coffee b/app/assets/javascripts/groups_select.js.coffee new file mode 100644 index 00000000000..1084e2a17d1 --- /dev/null +++ b/app/assets/javascripts/groups_select.js.coffee @@ -0,0 +1,41 @@ +class @GroupsSelect + constructor: -> + $('.ajax-groups-select').each (i, select) => + skip_ldap = $(select).hasClass('skip_ldap') + + $(select).select2 + placeholder: "Search for a group" + multiple: $(select).hasClass('multiselect') + minimumInputLength: 0 + query: (query) -> + Api.groups query.term, skip_ldap, (groups) -> + data = { results: groups } + query.callback(data) + + initSelection: (element, callback) -> + id = $(element).val() + if id isnt "" + Api.group(id, callback) + + + formatResult: (args...) => + @formatResult(args...) + formatSelection: (args...) => + @formatSelection(args...) + dropdownCssClass: "ajax-groups-dropdown" + escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results + m + + formatResult: (group) -> + if group.avatar_url + avatar = group.avatar_url + else + avatar = gon.default_avatar_url + + "
    +
    #{group.name}
    +
    #{group.path}
    +
    " + + formatSelection: (group) -> + group.name -- cgit v1.2.1 From 607ea7c6e5663542ae53de66a80f3e8beefe1341 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 30 Dec 2014 11:01:30 +0100 Subject: Share the key table between admin and profile resources. --- app/controllers/admin/users_controller.rb | 2 +- app/helpers/application_helper.rb | 8 ++++++++ app/views/admin/keys/show.html.haml | 5 +---- app/views/admin/users/show.html.haml | 25 +------------------------ app/views/profiles/keys/_key.html.haml | 21 ++++++++++++--------- app/views/profiles/keys/_key_details.html.haml | 3 +++ app/views/profiles/keys/_key_table.html.haml | 19 +++++++++++++++++++ app/views/profiles/keys/index.html.haml | 14 ++------------ app/views/profiles/keys/show.html.haml | 3 --- 9 files changed, 47 insertions(+), 53 deletions(-) create mode 100644 app/views/profiles/keys/_key_table.html.haml (limited to 'app') diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 86c671ed756..aea8545d38e 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -11,7 +11,7 @@ class Admin::UsersController < Admin::ApplicationController def show @personal_projects = user.personal_projects @joined_projects = user.projects.joined(@user) - @ssh_keys = user.keys.order('id DESC') + @keys = user.keys.order('id DESC') end def new diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 54caaa0f7e5..092a1ba9229 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -297,4 +297,12 @@ module ApplicationHelper def outdated_browser? browser.ie? && browser.version.to_i < 10 end + + def path_to_key(key, admin = false) + if admin + admin_user_key_path(@user, key) + else + profile_key_path(key) + end + end end diff --git a/app/views/admin/keys/show.html.haml b/app/views/admin/keys/show.html.haml index 2ea05b6aa00..5b23027b3ab 100644 --- a/app/views/admin/keys/show.html.haml +++ b/app/views/admin/keys/show.html.haml @@ -1,4 +1 @@ -= render "profiles/keys/key_details" - -.pull-right - = link_to 'Remove', admin_user_key_path(@user, @key), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" += render "profiles/keys/key_details", admin: true diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 5754f9448d7..88e71aa170f 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -220,27 +220,4 @@ = link_to project_team_member_path(project, @user), data: { confirm: remove_from_project_team_message(project, @user) }, remote: true, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from project' do %i.fa.fa-times #ssh-keys.tab-pane - - if @ssh_keys.any? - .panel.panel-default - %table.table - %thead.panel-heading - %tr - %th Title - %th Fingerprint - %th - %tbody - - @ssh_keys.each do |key| - %tr - %td - = link_to admin_user_key_path(@user, key) do - %strong= key.title - %td - %span - (#{key.fingerprint}) - %span.cgray - added #{time_ago_with_tooltip(key.created_at)} - %td - = link_to 'Remove', admin_user_key_path(@user, key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-small btn-remove delete-key pull-right" - - - else - .nothing-here-block User has no ssh keys + = render 'profiles/keys/key_table', admin: true diff --git a/app/views/profiles/keys/_key.html.haml b/app/views/profiles/keys/_key.html.haml index 81411a7565e..8892302e25d 100644 --- a/app/views/profiles/keys/_key.html.haml +++ b/app/views/profiles/keys/_key.html.haml @@ -1,9 +1,12 @@ -%li - = link_to profile_key_path(key) do - %strong= key.title - %span - (#{key.fingerprint}) - %span.cgray - added #{time_ago_with_tooltip(key.created_at)} - - = link_to 'Remove', profile_key_path(key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-small btn-remove delete-key pull-right" +%tr + %td + = link_to path_to_key(key, is_admin) do + %strong= key.title + %td + %span + (#{key.fingerprint}) + %td + %span.cgray + added #{time_ago_with_tooltip(key.created_at)} + %td + = link_to 'Remove', path_to_key(key, is_admin), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-small btn-remove delete-key pull-right" diff --git a/app/views/profiles/keys/_key_details.html.haml b/app/views/profiles/keys/_key_details.html.haml index b7e0029a8ac..8bac22a2e1a 100644 --- a/app/views/profiles/keys/_key_details.html.haml +++ b/app/views/profiles/keys/_key_details.html.haml @@ -1,3 +1,4 @@ +- is_admin = defined?(admin) ? true : false .row .col-md-4 .panel.panel-default @@ -17,3 +18,5 @@ %strong= @key.fingerprint %pre.well-pre = @key.key + .pull-right + = link_to 'Remove', path_to_key(@key, is_admin), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" diff --git a/app/views/profiles/keys/_key_table.html.haml b/app/views/profiles/keys/_key_table.html.haml new file mode 100644 index 00000000000..ef0075aad3b --- /dev/null +++ b/app/views/profiles/keys/_key_table.html.haml @@ -0,0 +1,19 @@ +- is_admin = defined?(admin) ? true : false +.panel.panel-default + - if @keys.any? + %table.table + %thead.panel-heading + %tr + %th Title + %th Fingerprint + %th Added at + %th + %tbody + - @keys.each do |key| + = render 'profiles/keys/key', key: key, is_admin: is_admin + - else + .nothing-here-block + - if is_admin + User has no ssh keys + - else + There are no SSH keys with access to your account. diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index a322f82f236..809953960bb 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -1,5 +1,5 @@ %h3.page-title - My SSH keys + My SSH keys (#{@keys.count}) .pull-right = link_to "Add SSH Key", new_profile_key_path, class: "btn btn-new" %p.light @@ -9,14 +9,4 @@ = link_to "generate it", help_page_path("ssh", "ssh") %hr - -.panel.panel-default - .panel-heading - SSH Keys (#{@keys.count}) - %ul.well-list#keys-table - = render @keys - - if @keys.blank? - %li - .nothing-here-block There are no SSH keys with access to your account. - - += render 'key_table' diff --git a/app/views/profiles/keys/show.html.haml b/app/views/profiles/keys/show.html.haml index 470b984d16c..cfd53298962 100644 --- a/app/views/profiles/keys/show.html.haml +++ b/app/views/profiles/keys/show.html.haml @@ -1,4 +1 @@ = render "key_details" - -.pull-right - = link_to 'Remove', profile_key_path(@key), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" -- cgit v1.2.1 From 0930086bea914d4fd32c21706bcdcb3daf529561 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 30 Dec 2014 16:38:27 +0200 Subject: Fix tests Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/sections/merge_requests.scss | 4 ---- 1 file changed, 4 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 920702ff3c4..1f8ea85eb65 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -170,7 +170,3 @@ .merge-request-show-labels .label { padding: 6px 10px; } - -.mr-commits .commit { - padding: 10px 15px; -} -- cgit v1.2.1 From 6e217bd55cf900692da49592cca36a04b2eb4a95 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 30 Dec 2014 17:28:34 +0200 Subject: Improve accept mr widget UI Signed-off-by: Dmitriy Zaporozhets --- .../stylesheets/sections/merge_requests.scss | 23 ++++++++++++-- .../merge_requests/show/_mr_accept.html.haml | 35 ++++++++++------------ 2 files changed, 36 insertions(+), 22 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 1f8ea85eb65..8445b77c1a8 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -11,10 +11,27 @@ } } - .accept-group { - label { - margin: 5px; + .accept-merge-holder { + margin-top: 5px; + + .accept-action { + display: inline-block; + + .accept_merge_request { + padding: 10px 20px; + } + } + + .accept-control { + display: inline-block; margin-left: 20px; + padding: 10px 0; + line-height: 20px; + font-weight: bold; + + .checkbox { + margin: 0; + } } } } diff --git a/app/views/projects/merge_requests/show/_mr_accept.html.haml b/app/views/projects/merge_requests/show/_mr_accept.html.haml index 4939ae03994..dd5f29e5389 100644 --- a/app/views/projects/merge_requests/show/_mr_accept.html.haml +++ b/app/views/projects/merge_requests/show/_mr_accept.html.haml @@ -13,25 +13,22 @@ .automerge_widget.can_be_merged.hide .clearfix = form_for [:automerge, @project, @merge_request], remote: true, method: :post do |f| - %h4 - You can accept this request automatically. - .accept-merge-holder.clearfix - .accept-group - .pull-left - = f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request" - - if can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && !@merge_request.for_fork? - .remove_branch_holder.pull-left - = label_tag :should_remove_source_branch, class: "checkbox" do - = check_box_tag :should_remove_source_branch - Remove source-branch - .js-toggle-container - %label - %i.fa.fa-edit - = link_to "modify merge commit message", "#", class: "modify-merge-commit-link js-toggle-button", title: "Modify merge commit message" - .js-toggle-content.hide - = render 'shared/commit_message_container', params: params, - text: @merge_request.merge_commit_message, - rows: 14, hint: true + .accept-merge-holder.clearfix.js-toggle-container + .accept-action + = f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request" + - if can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && !@merge_request.for_fork? + .accept-control + = label_tag :should_remove_source_branch, class: "checkbox" do + = check_box_tag :should_remove_source_branch + Remove source-branch + .accept-control + = link_to "#", class: "modify-merge-commit-link js-toggle-button", title: "Modify merge commit message" do + %i.fa.fa-edit + Modify commit message + .js-toggle-content.hide.prepend-top-20 + = render 'shared/commit_message_container', params: params, + text: @merge_request.merge_commit_message, + rows: 14, hint: true %hr .light -- cgit v1.2.1 From 3a3b0da81e2320be890ddb9c00a055ea4c6a305b Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Fri, 3 Oct 2014 12:56:48 +0200 Subject: Make blob new and edit file editors more uniform --- app/views/projects/_blob_editor.html.haml | 15 +++++++++++++++ app/views/projects/edit_tree/show.html.haml | 17 +---------------- app/views/projects/new_tree/show.html.haml | 7 +------ 3 files changed, 17 insertions(+), 22 deletions(-) create mode 100644 app/views/projects/_blob_editor.html.haml (limited to 'app') diff --git a/app/views/projects/_blob_editor.html.haml b/app/views/projects/_blob_editor.html.haml new file mode 100644 index 00000000000..1fb74b55c41 --- /dev/null +++ b/app/views/projects/_blob_editor.html.haml @@ -0,0 +1,15 @@ +.file-holder.file + .file-title + %i.icon-file + %span.file_name + %span.monospace.light #{ref} + - if local_assigns[:path] + = ': ' + local_assigns[:path] + .file-content.code + %pre.js-edit-mode-pane#editor + = params[:content] || local_assigns[:blob_data] + - if local_assigns[:path] + .js-edit-mode-pane#preview.hide + .center + %h2 + %i.icon-spinner.icon-spin diff --git a/app/views/projects/edit_tree/show.html.haml b/app/views/projects/edit_tree/show.html.haml index 5ccde05063e..7e0789853af 100644 --- a/app/views/projects/edit_tree/show.html.haml +++ b/app/views/projects/edit_tree/show.html.haml @@ -6,21 +6,7 @@ = link_to editing_preview_title(@blob.name), '#preview', 'data-preview-url' => preview_project_edit_tree_path(@project, @id) = form_tag(project_edit_tree_path(@project, @id), method: :put, class: "form-horizontal") do - .file-holder.file - .file-title - %i.fa.fa-file - %span.file_name - %span.monospace.light #{@ref}: - = @path - %span.options - .btn-group.tree-btn-group - = link_to "Cancel", @after_edit_path, class: "btn btn-tiny btn-cancel", data: { confirm: leave_edit_message } - .file-content.code - %pre.js-edit-mode-pane#editor - .js-edit-mode-pane#preview.hide - .center - %h2 - %i.fa.fa-spinner.fa-spin + = render 'projects/blob_editor', ref: @ref, path: @path, blob_data: @blob.data = render 'shared/commit_message_container', params: params, placeholder: "Update #{@blob.name}" = hidden_field_tag 'last_commit', @last_commit @@ -34,7 +20,6 @@ ace.config.loadModule("ace/ext/searchbox"); var ace_mode = "#{@blob.language.try(:ace_mode)}"; var editor = ace.edit("editor"); - editor.setValue("#{escape_javascript(@blob.data)}"); if (ace_mode) { editor.getSession().setMode('ace/mode/' + ace_mode); } diff --git a/app/views/projects/new_tree/show.html.haml b/app/views/projects/new_tree/show.html.haml index f09d3659774..cf7b768694f 100644 --- a/app/views/projects/new_tree/show.html.haml +++ b/app/views/projects/new_tree/show.html.haml @@ -19,12 +19,7 @@ Encoding .col-sm-10 = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' - .file-holder - .file-title - %i.fa.fa-file - .file-content.code - %pre#editor= params[:content] - + = render 'projects/blob_editor', ref: @ref = render 'shared/commit_message_container', params: params, placeholder: 'Add new file' = hidden_field_tag 'content', '', id: 'file-content' -- cgit v1.2.1 From 25c37b0e73e4e5ee0168bc6c407d4dcd035299fa Mon Sep 17 00:00:00 2001 From: Stephan van Leeuwen Date: Tue, 30 Dec 2014 18:53:46 +0100 Subject: Fixed issue not being able to create a new issue on an empty project. --- app/views/projects/_issuable_form.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml index 19fdab049ea..9e2e214b3e8 100644 --- a/app/views/projects/_issuable_form.html.haml +++ b/app/views/projects/_issuable_form.html.haml @@ -69,7 +69,7 @@ = link_to 'Create new label', new_project_label_path(issuable.project), target: :blank .form-actions - - if contribution_guide_url(issuable.project) && !issuable.persisted? + - if !issuable.project.empty_repo? && contribution_guide_url(issuable.project) && !issuable.persisted? %p Please review the %strong #{link_to 'guidelines for contribution', contribution_guide_url(issuable.project)} -- cgit v1.2.1 From 1d8dcfaf8be8679556e1602d0061fc5cdd828845 Mon Sep 17 00:00:00 2001 From: Arif Ali Date: Tue, 30 Dec 2014 20:50:08 +0000 Subject: fix deleted file display when using new gitlab_git gem, and add new gitlab_git gem --- app/views/projects/diffs/_file.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml index 23e7691b32e..0c5f2ad1f3a 100644 --- a/app/views/projects/diffs/_file.html.haml +++ b/app/views/projects/diffs/_file.html.haml @@ -4,7 +4,7 @@ .diff-file{id: "diff-#{i}", data: {blob_diff_path: blob_diff_path }} .diff-header{id: "file-path-#{hexdigest(diff_file.new_path || diff_file.old_path)}"} - if diff_file.deleted_file - %span= diff_file.old_path + %span="#{diff_file.old_path} deleted" .diff-btn-group - if @commit.parent_ids.present? -- cgit v1.2.1 From 021cff67f3514b4c2cb1f7b859cbfc314afa0a0c Mon Sep 17 00:00:00 2001 From: marmis85 Date: Wed, 31 Dec 2014 03:15:04 +0100 Subject: Flatten the directory hierarchy while there is only one directory descendant --- app/helpers/tree_helper.rb | 10 ++++++++++ app/views/projects/tree/_tree_item.html.haml | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index e32aeba5f8f..5a96a208e93 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -113,6 +113,16 @@ module TreeHelper tree_join(@ref, file) end + # returns the relative path of the first subdir that doesn't have only one directory descendand + def flatten_tree(tree) + subtree = Gitlab::Git::Tree.where(@repository, @commit.id, tree.path) + if subtree.count == 1 && subtree.first.dir? + return tree_join(tree.name, flatten_tree(subtree.first)) + else + return tree.name + end + end + def leave_edit_message "Leave edit mode?\nAll unsaved changes will be lost." end diff --git a/app/views/projects/tree/_tree_item.html.haml b/app/views/projects/tree/_tree_item.html.haml index f8cecf9be1f..5adbf93ff8f 100644 --- a/app/views/projects/tree/_tree_item.html.haml +++ b/app/views/projects/tree/_tree_item.html.haml @@ -2,7 +2,8 @@ %td.tree-item-file-name = tree_icon(type) %span.str-truncated - = link_to tree_item.name, project_tree_path(@project, tree_join(@id || @commit.id, tree_item.name)) + - path = flatten_tree(tree_item) + = link_to path, project_tree_path(@project, tree_join(@id || @commit.id, path)) %td.tree_time_ago.cgray = render 'spinner' %td.hidden-xs.tree_commit -- cgit v1.2.1 From e5c0e2603ac6946c08b1c0be0f74cf857f234bd6 Mon Sep 17 00:00:00 2001 From: Jeremy Maziarz Date: Wed, 31 Dec 2014 15:05:38 -0500 Subject: Fix xmlns:media namespacing for atom feeds --- app/views/dashboard/issues.atom.builder | 2 +- app/views/dashboard/show.atom.builder | 2 +- app/views/groups/show.atom.builder | 2 +- app/views/users/show.atom.builder | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/views/dashboard/issues.atom.builder b/app/views/dashboard/issues.atom.builder index 66381310221..72e9e361dc3 100644 --- a/app/views/dashboard/issues.atom.builder +++ b/app/views/dashboard/issues.atom.builder @@ -1,5 +1,5 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{current_user.name} issues" xml.link href: issues_dashboard_url(:atom, private_token: current_user.private_token), rel: "self", type: "application/atom+xml" xml.link href: issues_dashboard_url(private_token: current_user.private_token), rel: "alternate", type: "text/html" diff --git a/app/views/dashboard/show.atom.builder b/app/views/dashboard/show.atom.builder index 70ac66f8016..da631ecb33e 100644 --- a/app/views/dashboard/show.atom.builder +++ b/app/views/dashboard/show.atom.builder @@ -1,5 +1,5 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "Dashboard feed#{" - #{current_user.name}" if current_user.name.present?}" xml.link href: dashboard_url(:atom), rel: "self", type: "application/atom+xml" xml.link href: dashboard_url, rel: "alternate", type: "text/html" diff --git a/app/views/groups/show.atom.builder b/app/views/groups/show.atom.builder index e765ea8338d..c78bd1bd263 100644 --- a/app/views/groups/show.atom.builder +++ b/app/views/groups/show.atom.builder @@ -1,5 +1,5 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "Group feed - #{@group.name}" xml.link href: group_path(@group, :atom), rel: "self", type: "application/atom+xml" xml.link href: group_path(@group), rel: "alternate", type: "text/html" diff --git a/app/views/users/show.atom.builder b/app/views/users/show.atom.builder index b7216a88765..8fe30b23635 100644 --- a/app/views/users/show.atom.builder +++ b/app/views/users/show.atom.builder @@ -1,5 +1,5 @@ xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlnsmedia" => "http://search.yahoo.com/mrss/" do +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "Activity feed for #{@user.name}" xml.link href: user_url(@user, :atom), rel: "self", type: "application/atom+xml" xml.link href: user_url(@user), rel: "alternate", type: "text/html" -- cgit v1.2.1 From 82dec3baf284675564a3c3adc9c198519828bc67 Mon Sep 17 00:00:00 2001 From: mattes Date: Fri, 5 Sep 2014 03:59:45 +0200 Subject: remove go-import meta tag from haml file --- app/views/layouts/_head.html.haml | 7 ------- 1 file changed, 7 deletions(-) (limited to 'app') diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index fa6aecb6661..ccf8df33714 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -1,12 +1,5 @@ %head %meta{charset: "utf-8"} - - -# Go repository retrieval support - -# Need to be the fist thing in the head - -# Since Go is using an XML parser to process HTML5 - -# https://github.com/gitlabhq/gitlabhq/pull/5958#issuecomment-45397555 - - if controller_name == 'projects' && action_name == 'show' - %meta{name: "go-import", content: "#{@project.web_url_without_protocol} git #{@project.web_url}.git"} %meta{content: "GitLab Community Edition", name: "description"} %title -- cgit v1.2.1 From 33c9f05c6bb90a995ddc685b4a22479f17c575e5 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Thu, 9 Oct 2014 09:47:47 +0200 Subject: Append in place for strings and arrays --- app/controllers/projects/refs_controller.rb | 6 +++--- app/helpers/commits_helper.rb | 2 +- app/helpers/graph_helper.rb | 4 ++-- app/helpers/projects_helper.rb | 2 +- app/helpers/tags_helper.rb | 2 +- app/helpers/tree_helper.rb | 9 ++++++--- app/models/ability.rb | 26 +++++++++++++------------- app/models/concerns/mentionable.rb | 2 +- app/models/merge_request.rb | 3 ++- app/models/network/graph.rb | 2 +- app/models/project.rb | 2 +- app/models/project_team.rb | 2 +- app/models/user.rb | 4 ++-- 13 files changed, 35 insertions(+), 31 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index 5d9336bdc49..67665f5f601 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -41,9 +41,9 @@ class Projects::RefsController < Projects::ApplicationController @path = params[:path] contents = [] - contents += tree.trees - contents += tree.blobs - contents += tree.submodules + contents.push(*tree.trees) + contents.push(*tree.blobs) + contents.push(*tree.submodules) @logs = contents[@offset, @limit].to_a.map do |content| file = @path ? File.join(@path, content.name) : content.name diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 36adeadd8a5..cf279823986 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -44,7 +44,7 @@ module CommitsHelper parts = @path.split('/') parts.each_with_index do |part, i| - crumbs += content_tag(:li) do + crumbs << content_tag(:li) do # The text is just the individual part, but the link needs all the parts before it link_to part, project_commits_path(@project, tree_join(@ref, parts[0..i].join('/'))) end diff --git a/app/helpers/graph_helper.rb b/app/helpers/graph_helper.rb index 7cb1b6f8d1a..e1dda20de85 100644 --- a/app/helpers/graph_helper.rb +++ b/app/helpers/graph_helper.rb @@ -1,10 +1,10 @@ module GraphHelper def get_refs(repo, commit) refs = "" - refs += commit.ref_names(repo).join(" ") + refs << commit.ref_names(repo).join(' ') # append note count - refs += "[#{@graph.notes[commit.id]}]" if @graph.notes[commit.id] > 0 + refs << "[#{@graph.notes[commit.id]}]" if @graph.notes[commit.id] > 0 refs end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index e489d431e84..f7e01f90717 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -86,7 +86,7 @@ module ProjectsHelper def link_to_toggle_star(title, starred, signed_in) cls = 'star-btn' - cls += ' disabled' unless signed_in + cls << ' disabled' unless signed_in toggle_html = content_tag('span', class: 'toggle') do toggle_text = if starred diff --git a/app/helpers/tags_helper.rb b/app/helpers/tags_helper.rb index ef89bb32c6d..fb85544df2d 100644 --- a/app/helpers/tags_helper.rb +++ b/app/helpers/tags_helper.rb @@ -6,7 +6,7 @@ module TagsHelper def tag_list(project) html = '' project.tag_list.each do |tag| - html += link_to tag, tag_path(tag) + html << link_to(tag, tag_path(tag)) end html.html_safe diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index e32aeba5f8f..8693acad994 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -10,13 +10,16 @@ module TreeHelper tree = "" # Render folders if we have any - tree += render partial: 'projects/tree/tree_item', collection: folders, locals: {type: 'folder'} if folders.present? + tree << render(partial: 'projects/tree/tree_item', collection: folders, + locals: { type: 'folder' }) if folders.present? # Render files if we have any - tree += render partial: 'projects/tree/blob_item', collection: files, locals: {type: 'file'} if files.present? + tree << render(partial: 'projects/tree/blob_item', collection: files, + locals: { type: 'file' }) if files.present? # Render submodules if we have any - tree += render partial: 'projects/tree/submodule_item', collection: submodules if submodules.present? + tree << render(partial: 'projects/tree/submodule_item', + collection: submodules) if submodules.present? tree.html_safe end diff --git a/app/models/ability.rb b/app/models/ability.rb index 97a72bf3635..890417e780d 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -73,28 +73,28 @@ class Ability # Rules based on role in project if team.master?(user) - rules += project_master_rules + rules.push(*project_master_rules) elsif team.developer?(user) - rules += project_dev_rules + rules.push(*project_dev_rules) elsif team.reporter?(user) - rules += project_report_rules + rules.push(*project_report_rules) elsif team.guest?(user) - rules += project_guest_rules + rules.push(*project_guest_rules) end if project.public? || project.internal? - rules += public_project_rules + rules.push(*public_project_rules) end if project.owner == user || user.admin? - rules += project_admin_rules + rules.push(*project_admin_rules) end if project.group && project.group.has_owner?(user) - rules += project_admin_rules + rules.push(*project_admin_rules) end if project.archived? @@ -193,17 +193,17 @@ class Ability # Only group masters and group owners can create new projects in group if group.has_master?(user) || group.has_owner?(user) || user.admin? - rules += [ + rules.push(*[ :create_projects, - ] + ]) end # Only group owner and administrators can manage group if group.has_owner?(user) || user.admin? - rules += [ + rules.push(*[ :manage_group, :manage_namespace - ] + ]) end rules.flatten @@ -214,10 +214,10 @@ class Ability # Only namespace owner and administrators can manage it if namespace.owner == user || user.admin? - rules += [ + rules.push(*[ :create_projects, :manage_namespace - ] + ]) end rules.flatten diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb index 6c1aa99668a..66f83b932d4 100644 --- a/app/models/concerns/mentionable.rb +++ b/app/models/concerns/mentionable.rb @@ -50,7 +50,7 @@ module Mentionable matches.each do |match| identifier = match.delete "@" if identifier == "all" - users += project.team.members.flatten + users.push(*project.team.members.flatten) else id = User.find_by(username: identifier).try(:id) users << User.find(id) unless id.blank? diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 2cc427d35c2..5dc3c403b3b 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -248,7 +248,8 @@ class MergeRequest < ActiveRecord::Base def closes_issues if target_branch == project.default_branch issues = commits.flat_map { |c| c.closes_issues(project) } - issues += Gitlab::ClosingIssueExtractor.closed_by_message_in_project(description, project) + issues.push(*Gitlab::ClosingIssueExtractor. + closed_by_message_in_project(description, project)) issues.uniq.sort_by(&:id) else [] diff --git a/app/models/network/graph.rb b/app/models/network/graph.rb index 43979b5e807..f13a40cf4f6 100644 --- a/app/models/network/graph.rb +++ b/app/models/network/graph.rb @@ -226,7 +226,7 @@ module Network reserved = [] for day in time_range - reserved += @reserved[day] + reserved.push(*@reserved[day]) end reserved.uniq! diff --git a/app/models/project.rb b/app/models/project.rb index b0c379e6157..67898955d63 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -170,7 +170,7 @@ class Project < ActiveRecord::Base def publicish(user) visibility_levels = [Project::PUBLIC] - visibility_levels += [Project::INTERNAL] if user + visibility_levels << Project::INTERNAL if user where(visibility_level: visibility_levels) end diff --git a/app/models/project_team.rb b/app/models/project_team.rb index 657ee23ae23..bc9c3ce58f6 100644 --- a/app/models/project_team.rb +++ b/app/models/project_team.rb @@ -160,7 +160,7 @@ class ProjectTeam end user_ids = project_members.pluck(:user_id) - user_ids += group_members.pluck(:user_id) if group + user_ids.push(*group_members.pluck(:user_id)) if group User.where(id: user_ids) end diff --git a/app/models/user.rb b/app/models/user.rb index 7dae318e780..33a0d03370e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -297,8 +297,8 @@ class User < ActiveRecord::Base def authorized_projects @authorized_projects ||= begin project_ids = personal_projects.pluck(:id) - project_ids += groups_projects.pluck(:id) - project_ids += projects.pluck(:id).uniq + project_ids.push(*groups_projects.pluck(:id)) + project_ids.push(*projects.pluck(:id).uniq) Project.where(id: project_ids).joins(:namespace).order('namespaces.name ASC') end end -- cgit v1.2.1 From 05dd6309baa3c0dbc4346c33136a30c5c1cf6922 Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Fri, 2 Jan 2015 14:54:51 +0100 Subject: Raise group avatar filesize limit to 200kb, fixes #8527 --- app/models/group.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/group.rb b/app/models/group.rb index b8ed3b8ac73..733afa2fc07 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -21,7 +21,7 @@ class Group < Namespace has_many :users, through: :group_members validate :avatar_type, if: ->(user) { user.avatar_changed? } - validates :avatar, file_size: { maximum: 100.kilobytes.to_i } + validates :avatar, file_size: { maximum: 200.kilobytes.to_i } mount_uploader :avatar, AttachmentUploader -- cgit v1.2.1 From 3d7519016f9fc3642e1d672d3f80092562e9505a Mon Sep 17 00:00:00 2001 From: Wanfung Joshua Lee Date: Mon, 5 Jan 2015 19:57:09 -0800 Subject: fix the wacky dashboard intro icon styling [ci skip] --- app/assets/stylesheets/generic/common.scss | 12 +++++++++--- app/views/dashboard/_zero_authorized_projects.html.haml | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 24f7a9ad686..da708c96b09 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -292,11 +292,17 @@ table { .dashboard-intro-icon { float: left; + text-align: center; font-size: 32px; color: #AAA; - padding: 5px 0; - width: 50px; - min-height: 100px; + width: 60px; +} + +.dashboard-intro-text { + display: inline-block; + margin-left: -60px; + padding-left: 60px; + width: 100%; } .broadcast-message { diff --git a/app/views/dashboard/_zero_authorized_projects.html.haml b/app/views/dashboard/_zero_authorized_projects.html.haml index 5d133cd8285..f78ce69ef9e 100644 --- a/app/views/dashboard/_zero_authorized_projects.html.haml +++ b/app/views/dashboard/_zero_authorized_projects.html.haml @@ -4,7 +4,7 @@ %div .dashboard-intro-icon %i.fa.fa-bookmark-o - %div + .dashboard-intro-text %p.slead You don't have access to any projects right now. %br @@ -24,7 +24,7 @@ %div .dashboard-intro-icon %i.fa.fa-users - %div + .dashboard-intro-text %p.slead You can create a group for several dependent projects. %br @@ -38,7 +38,7 @@ %div .dashboard-intro-icon %i.fa.fa-globe - %div + .dashboard-intro-text %p.slead There are %strong= @publicish_project_count -- cgit v1.2.1 From 33a510685706549fcf61f78021ce7099ea23e067 Mon Sep 17 00:00:00 2001 From: Wanfung Joshua Lee Date: Mon, 5 Jan 2015 21:36:58 -0800 Subject: fix event-last-push message's styling on mobile [ci skip] --- app/assets/stylesheets/sections/events.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 93ad17f57c0..3c3a0d92c6e 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -145,8 +145,12 @@ * Last push widget */ .event-last-push { + overflow: auto; .event-last-push-text { - @include str-truncated(75%); + @include str-truncated(100%); + float:left; + margin-right: -150px; + padding-right: 150px; line-height: 24px; } } -- cgit v1.2.1 From 252443893ce6e4ca2caaca8eefe75c918c20ffff Mon Sep 17 00:00:00 2001 From: Wanfung Joshua Lee Date: Mon, 5 Jan 2015 21:48:04 -0800 Subject: removing padding on form-actions when in mobile size [ci skip] --- app/assets/stylesheets/generic/forms.scss | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/forms.scss b/app/assets/stylesheets/generic/forms.scss index 865253d4a77..1a832569953 100644 --- a/app/assets/stylesheets/generic/forms.scss +++ b/app/assets/stylesheets/generic/forms.scss @@ -31,7 +31,12 @@ fieldset legend { margin-bottom: 18px; background-color: whitesmoke; border-top: 1px solid #e5e5e5; - padding-left: 17%; +} + +@media (min-width: $screen-sm-min) { + .form-actions { + padding-left: 17%; + } } label { -- cgit v1.2.1 From 4165426725677d092275f2935a43527f130d8bcb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 6 Jan 2015 12:32:04 -0800 Subject: Restyle and refactor milestones filter --- app/controllers/projects/milestones_controller.rb | 2 +- app/helpers/groups_helper.rb | 12 ---- app/helpers/milestones_helper.rb | 9 +++ app/views/groups/_filter.html.haml | 12 ---- app/views/groups/milestones/index.html.haml | 72 +++++++++++------------ app/views/projects/milestones/index.html.haml | 32 ++++------ app/views/shared/_milestones_filter.html.haml | 16 +++++ 7 files changed, 70 insertions(+), 85 deletions(-) create mode 100644 app/helpers/milestones_helper.rb delete mode 100644 app/views/groups/_filter.html.haml create mode 100644 app/views/shared/_milestones_filter.html.haml (limited to 'app') diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb index f362f449e70..95801f8b8fb 100644 --- a/app/controllers/projects/milestones_controller.rb +++ b/app/controllers/projects/milestones_controller.rb @@ -11,7 +11,7 @@ class Projects::MilestonesController < Projects::ApplicationController respond_to :html def index - @milestones = case params[:f] + @milestones = case params[:state] when 'all'; @project.milestones.order("state, due_date DESC") when 'closed'; @project.milestones.closed.order("due_date DESC") else @project.milestones.active.order("due_date ASC") diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index 975cdeda1bc..03fd461a462 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -33,18 +33,6 @@ module GroupsHelper title end - def group_filter_path(entity, options={}) - exist_opts = { - status: params[:status] - } - - options = exist_opts.merge(options) - - path = request.path - path << "?#{options.to_param}" - path - end - def group_settings_page? if current_controller?('groups') current_action?('edit') || current_action?('projects') diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb new file mode 100644 index 00000000000..6847123d2d4 --- /dev/null +++ b/app/helpers/milestones_helper.rb @@ -0,0 +1,9 @@ +module MilestonesHelper + def milestones_filter_path(opts = {}) + if @project + project_milestones_path(@project, opts) + elsif @group + group_milestones_path(@group, opts) + end + end +end diff --git a/app/views/groups/_filter.html.haml b/app/views/groups/_filter.html.haml deleted file mode 100644 index 393be3f1d12..00000000000 --- a/app/views/groups/_filter.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -= form_tag group_filter_path(entity), method: 'get' do - %fieldset - %ul.nav.nav-pills.nav-stacked - %li{class: ("active" if (params[:status] == 'active' || !params[:status]))} - = link_to group_filter_path(entity, status: 'active') do - Active - %li{class: ("active" if params[:status] == 'closed')} - = link_to group_filter_path(entity, status: 'closed') do - Closed - %li{class: ("active" if params[:status] == 'all')} - = link_to group_filter_path(entity, status: 'all') do - All diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml index 2727525f070..7f0b2832cac 100644 --- a/app/views/groups/milestones/index.html.haml +++ b/app/views/groups/milestones/index.html.haml @@ -9,42 +9,38 @@ %hr -.row - .fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x - .col-md-3.responsive-side - = render 'groups/filter', entity: 'milestone' - .col-md-9 - .panel.panel-default - %ul.well-list - - if @group_milestones.blank? - %li - .nothing-here-block No milestones to show - - else - - @group_milestones.each do |milestone| - %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } - .pull-right - - if can?(current_user, :manage_group, @group) - - if milestone.closed? - = link_to 'Reopen Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-small btn-grouped btn-reopen" - - else - = link_to 'Close Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-small btn-close" - %h4 - = link_to_gfm truncate(milestone.title, length: 100), group_milestone_path(@group, milestone.safe_title, title: milestone.title) += render 'shared/milestones_filter' +.milestones + .panel.panel-default + %ul.well-list + - if @group_milestones.blank? + %li + .nothing-here-block No milestones to show + - else + - @group_milestones.each do |milestone| + %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } + .pull-right + - if can?(current_user, :manage_group, @group) + - if milestone.closed? + = link_to 'Reopen Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-small btn-grouped btn-reopen" + - else + = link_to 'Close Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-small btn-close" + %h4 + = link_to_gfm truncate(milestone.title, length: 100), group_milestone_path(@group, milestone.safe_title, title: milestone.title) + %div %div - %div - = link_to group_milestone_path(@group, milestone.safe_title, title: milestone.title) do - = pluralize milestone.issue_count, 'Issue' -   - = link_to group_milestone_path(@group, milestone.safe_title, title: milestone.title) do - = pluralize milestone.merge_requests_count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete - .progress.progress-info - .progress-bar{style: "width: #{milestone.percent_complete}%;"} - %div - %br - - milestone.projects.each do |project| - %span.label.label-default - = project.name - = paginate @group_milestones, theme: "gitlab" + = link_to group_milestone_path(@group, milestone.safe_title, title: milestone.title) do + = pluralize milestone.issue_count, 'Issue' +   + = link_to group_milestone_path(@group, milestone.safe_title, title: milestone.title) do + = pluralize milestone.merge_requests_count, 'Merge Request' +   + %span.light #{milestone.percent_complete}% complete + .progress.progress-info + .progress-bar{style: "width: #{milestone.percent_complete}%;"} + %div + %br + - milestone.projects.each do |project| + %span.label.label-default + = project.name + = paginate @group_milestones, theme: "gitlab" diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 0db0b114d63..04a1b9243d5 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -7,27 +7,15 @@ %i.fa.fa-plus New Milestone - .row - .fixed.sidebar-expand-button.hidden-lg.hidden-md.hidden-xs - %i.fa.fa-list.fa-2x - .col-md-3.responsive-side - %ul.nav.nav-pills.nav-stacked - %li{class: ("active" if (params[:f] == "active" || !params[:f]))} - = link_to project_milestones_path(@project, f: "active") do - Active - %li{class: ("active" if params[:f] == "closed")} - = link_to project_milestones_path(@project, f: "closed") do - Closed - %li{class: ("active" if params[:f] == "all")} - = link_to project_milestones_path(@project, f: "all") do - All - .col-md-9 - .panel.panel-default - %ul.well-list - = render @milestones += render 'shared/milestones_filter' - - if @milestones.blank? - %li - .nothing-here-block No milestones to show +.milestones + .panel.panel-default + %ul.well-list + = render @milestones - = paginate @milestones, theme: "gitlab" + - if @milestones.blank? + %li + .nothing-here-block No milestones to show + + = paginate @milestones, theme: "gitlab" diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml new file mode 100644 index 00000000000..8c2fd166922 --- /dev/null +++ b/app/views/shared/_milestones_filter.html.haml @@ -0,0 +1,16 @@ +.fixed.sidebar-expand-button.hidden-lg.hidden-md + %i.fa.fa-list.fa-2x +.responsive-side.milestones-filters.append-bottom-10 + %ul.nav.nav-pills.nav-compact + %li{class: ("active" if params[:state].blank? || params[:state] == 'opened')} + = link_to milestones_filter_path(state: 'opened') do + %i.fa.fa-exclamation-circle + Open + %li{class: ("active" if params[:state] == 'closed')} + = link_to milestones_filter_path(state: 'closed') do + %i.fa.fa-check-circle + Closed + %li{class: ("active" if params[:state] == 'all')} + = link_to milestones_filter_path(state: 'all') do + %i.fa.fa-compass + All -- cgit v1.2.1 From b8f48bf414f1ea1f6e36c9c560ae252bbfc20864 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 6 Jan 2015 13:09:56 -0800 Subject: Restyle and refactor dashboard projects page filtering --- app/helpers/dashboard_helper.rb | 2 + app/views/dashboard/_projects_filter.html.haml | 145 ++++++++++++++++--------- app/views/dashboard/projects.html.haml | 106 +++++++----------- 3 files changed, 139 insertions(+), 114 deletions(-) (limited to 'app') diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb index 3e6f3b41ff5..4dae96644c8 100644 --- a/app/helpers/dashboard_helper.rb +++ b/app/helpers/dashboard_helper.rb @@ -4,6 +4,8 @@ module DashboardHelper sort: params[:sort], scope: params[:scope], group: params[:group], + tag: params[:tag], + visibility_level: params[:visibility_level], } options = exist_opts.merge(options) diff --git a/app/views/dashboard/_projects_filter.html.haml b/app/views/dashboard/_projects_filter.html.haml index b65e882e693..0e990ccfab4 100644 --- a/app/views/dashboard/_projects_filter.html.haml +++ b/app/views/dashboard/_projects_filter.html.haml @@ -1,55 +1,100 @@ -%fieldset - %ul.nav.nav-pills.nav-stacked - = nav_tab :scope, nil do - = link_to projects_dashboard_filter_path(scope: nil) do - All - %span.pull-right - = current_user.authorized_projects.count - = nav_tab :scope, 'personal' do - = link_to projects_dashboard_filter_path(scope: 'personal') do - Personal - %span.pull-right - = current_user.personal_projects.count - = nav_tab :scope, 'joined' do - = link_to projects_dashboard_filter_path(scope: 'joined') do - Joined - %span.pull-right - = current_user.authorized_projects.joined(current_user).count - = nav_tab :scope, 'owned' do - = link_to projects_dashboard_filter_path(scope: 'owned') do - Owned - %span.pull-right - = current_user.owned_projects.count +.dash-projects-filters.append-bottom-20 + .pull-left.append-right-20 + %ul.nav.nav-pills.nav-compact + = nav_tab :scope, nil do + = link_to projects_dashboard_filter_path(scope: nil) do + All + = nav_tab :scope, 'personal' do + = link_to projects_dashboard_filter_path(scope: 'personal') do + Personal + = nav_tab :scope, 'joined' do + = link_to projects_dashboard_filter_path(scope: 'joined') do + Joined + = nav_tab :scope, 'owned' do + = link_to projects_dashboard_filter_path(scope: 'owned') do + Owned -%fieldset - %legend Visibility - %ul.nav.nav-pills.nav-stacked.nav-small.visibility-filter - - Gitlab::VisibilityLevel.values.each do |level| - %li{ class: (level.to_s == params[:visibility_level]) ? 'active' : 'light' } - = link_to projects_dashboard_filter_path(visibility_level: level) do - = visibility_level_icon(level) - = visibility_level_label(level) + .dropdown.inline.append-right-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-globe + %span.light Visibility: + - if params[:visibility_level].present? + = visibility_level_label(params[:visibility_level].to_i) + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to projects_dashboard_filter_path(visibility_level: nil) do + Any + - Gitlab::VisibilityLevel.values.each do |level| + %li{ class: (level.to_s == params[:visibility_level]) ? 'active' : 'light' } + = link_to projects_dashboard_filter_path(visibility_level: level) do + = visibility_level_icon(level) + = visibility_level_label(level) -- if @groups.present? - %fieldset - %legend Groups - %ul.nav.nav-pills.nav-stacked.nav-small - - @groups.each do |group| - %li{ class: (group.name == params[:group]) ? 'active' : 'light' } - = link_to projects_dashboard_filter_path(group: group.name) do - %i.fa.fa-folder-o - = group.name - %small.pull-right - = group.projects.count + - if @groups.present? + .dropdown.inline.append-right-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-group + %span.light Group: + - if params[:group].present? + = Group.find_by(name: params[:group]).name + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to projects_dashboard_filter_path(group: nil) do + Any + - @groups.each do |group| + %li{ class: (group.name == params[:group]) ? 'active' : 'light' } + = link_to projects_dashboard_filter_path(group: group.name) do + = group.name + %small.pull-right + = group.projects.count -- if @tags.present? - %fieldset - %legend Tags - %ul.nav.nav-pills.nav-stacked.nav-small - - @tags.each do |tag| - %li{ class: (tag.name == params[:tag]) ? 'active' : 'light' } - = link_to projects_dashboard_filter_path(scope: params[:scope], tag: tag.name) do - %i.fa.fa-tag - = tag.name + - if @tags.present? + .dropdown.inline.append-right-10 + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-tags + %span.light Tags: + - if params[:tag].present? + = params[:tag] + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to projects_dashboard_filter_path(tag: nil) do + Any + + - @tags.each do |tag| + %li{ class: (tag.name == params[:tag]) ? 'active' : 'light' } + = link_to projects_dashboard_filter_path(tag: tag.name) do + %i.fa.fa-tag + = tag.name + + .pull-right + .dropdown.inline + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %span.light sort: + - if @sort.present? + = @sort.humanize + - else + Name + %b.caret + %ul.dropdown-menu + %li + = link_to projects_dashboard_filter_path(sort: nil) do + Name + = link_to projects_dashboard_filter_path(sort: 'newest') do + = sort_title_recently_created + = link_to projects_dashboard_filter_path(sort: 'oldest') do + = sort_title_oldest_created + = link_to projects_dashboard_filter_path(sort: 'recently_updated') do + = sort_title_recently_updated + = link_to projects_dashboard_filter_path(sort: 'last_updated') do + = sort_title_oldest_updated diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index b880acf1245..944441669e7 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -1,76 +1,54 @@ %h3.page-title My Projects -.pull-right - .dropdown.inline - %a.dropdown-toggle.btn.btn-small{href: '#', "data-toggle" => "dropdown"} - %span.light sort: - - if @sort.present? - = @sort.humanize - - else - Name - %b.caret - %ul.dropdown-menu - %li - = link_to projects_dashboard_filter_path(sort: nil) do - Name - = link_to projects_dashboard_filter_path(sort: 'newest') do - = sort_title_recently_created - = link_to projects_dashboard_filter_path(sort: 'oldest') do - = sort_title_oldest_created - = link_to projects_dashboard_filter_path(sort: 'recently_updated') do - = sort_title_recently_updated - = link_to projects_dashboard_filter_path(sort: 'last_updated') do - = sort_title_oldest_updated %p.light All projects you have access to are listed here. Public projects are not included here unless you are a member %hr -.row - .col-md-3.hidden-sm.hidden-xs.side-filters - = render "projects_filter" - .col-md-9 - %ul.bordered-list.my-projects.top-list - - @projects.each do |project| - %li.my-project-row - %h4.project-title - .project-access-icon - = visibility_level_icon(project.visibility_level) - = link_to project_path(project), class: dom_class(project) do - = project.name_with_namespace +.side-filters + = render "projects_filter" +.dash-projects + %ul.bordered-list.my-projects.top-list + - @projects.each do |project| + %li.my-project-row + %h4.project-title + .project-access-icon + = visibility_level_icon(project.visibility_level) + = link_to project_path(project), class: dom_class(project) do + = project.name_with_namespace - - if project.forked_from_project -   - %small - %i.fa.fa-code-fork - Forked from: - = link_to project.forked_from_project.name_with_namespace, project_path(project.forked_from_project) + - if project.forked_from_project +   + %small + %i.fa.fa-code-fork + Forked from: + = link_to project.forked_from_project.name_with_namespace, project_path(project.forked_from_project) - - if current_user.can_leave_project?(project) - .pull-right - = link_to leave_project_team_members_path(project), data: { confirm: "Leave project?"}, method: :delete, remote: true, class: "btn-tiny btn remove-row", title: 'Leave project' do - %i.fa.fa-sign-out - Leave - - .project-info + - if current_user.can_leave_project?(project) .pull-right - - if project.archived? - %span.label - %i.fa.fa-archive - Archived - - project.tags.each do |tag| - %span.label.label-info - %i.fa.fa-tag - = tag.name - - if project.description.present? - %p= truncate project.description, length: 100 - .last-activity - %span.light Last activity: - %span.date= project_last_activity(project) + = link_to leave_project_team_members_path(project), data: { confirm: "Leave project?"}, method: :delete, remote: true, class: "btn-tiny btn remove-row", title: 'Leave project' do + %i.fa.fa-sign-out + Leave + + .project-info + .pull-right + - if project.archived? + %span.label + %i.fa.fa-archive + Archived + - project.tags.each do |tag| + %span.label.label-info + %i.fa.fa-tag + = tag.name + - if project.description.present? + %p= truncate project.description, length: 100 + .last-activity + %span.light Last activity: + %span.date= project_last_activity(project) - - if @projects.blank? - %li - .nothing-here-block There are no projects here. - .bottom - = paginate @projects, theme: "gitlab" + - if @projects.blank? + %li + .nothing-here-block There are no projects here. + .bottom + = paginate @projects, theme: "gitlab" -- cgit v1.2.1 From b55a0519acb34a764b2a350010aa813fd35b361e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 6 Jan 2015 15:39:33 -0800 Subject: Pass source project variable to commits list on MR page --- app/views/projects/commits/_commits.html.haml | 2 +- app/views/projects/commits/show.html.haml | 2 +- app/views/projects/merge_requests/_new_submit.html.haml | 2 +- app/views/projects/merge_requests/show/_commits.html.haml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml index d57659065a8..f279e3c37cd 100644 --- a/app/views/projects/commits/_commits.html.haml +++ b/app/views/projects/commits/_commits.html.haml @@ -7,5 +7,5 @@ %p= pluralize(commits.count, 'commit') .col-md-10 %ul.bordered-list - = render commits, project: @project + = render commits, project: project %hr.lists-separator diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index 56956625e0b..b80639763c8 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -13,7 +13,7 @@ = commits_breadcrumbs %div{id: dom_id(@project)} - #commits-list= render "commits" + #commits-list= render "commits", project: @project .clear = spinner diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index 6c5875c7d42..ac374532ffd 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -94,7 +94,7 @@ %span.badge= @diffs.size .commits.tab-content - = render "projects/commits/commits" + = render "projects/commits/commits", project: @project .diffs.tab-content - if @diffs.present? = render "projects/diffs/diffs", diffs: @diffs, project: @project diff --git a/app/views/projects/merge_requests/show/_commits.html.haml b/app/views/projects/merge_requests/show/_commits.html.haml index ac214e687b8..3b7f283daf0 100644 --- a/app/views/projects/merge_requests/show/_commits.html.haml +++ b/app/views/projects/merge_requests/show/_commits.html.haml @@ -1 +1 @@ -= render "projects/commits/commits" \ No newline at end of file += render "projects/commits/commits", project: @merge_request.source_project -- cgit v1.2.1 From ccdf08d80a64590f6188a3e36d68625e506b331c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 6 Jan 2015 16:24:47 -0800 Subject: Refactor merge request merge service * Add system note when user merges MR in same way as it closes it * Remove duplicating code --- app/models/merge_request.rb | 4 +++- app/services/merge_requests/auto_merge_service.rb | 7 ++++--- app/services/merge_requests/base_merge_service.rb | 13 +------------ app/services/merge_requests/merge_service.rb | 8 +++++--- app/services/merge_requests/refresh_service.rb | 4 +++- 5 files changed, 16 insertions(+), 20 deletions(-) (limited to 'app') diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 2cc427d35c2..de0ee0e2c5a 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -189,7 +189,9 @@ class MergeRequest < ActiveRecord::Base end def automerge!(current_user, commit_message = nil) - MergeRequests::AutoMergeService.new.execute(self, current_user, commit_message) + MergeRequests::AutoMergeService. + new(target_project, current_user). + execute(self, commit_message) end def open? diff --git a/app/services/merge_requests/auto_merge_service.rb b/app/services/merge_requests/auto_merge_service.rb index 20b88d1510c..b5d90a74e15 100644 --- a/app/services/merge_requests/auto_merge_service.rb +++ b/app/services/merge_requests/auto_merge_service.rb @@ -5,15 +5,16 @@ module MergeRequests # mark merge request as merged and execute all hooks and notifications # Called when you do merge via GitLab UI class AutoMergeService < BaseMergeService - def execute(merge_request, current_user, commit_message) + def execute(merge_request, commit_message) merge_request.lock_mr if Gitlab::Satellite::MergeAction.new(current_user, merge_request).merge!(commit_message) merge_request.merge - notification.merge_mr(merge_request, current_user) + notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) - execute_project_hooks(merge_request) + create_note(merge_request) + execute_hooks(merge_request) true else diff --git a/app/services/merge_requests/base_merge_service.rb b/app/services/merge_requests/base_merge_service.rb index 700a21ca011..9579573adf9 100644 --- a/app/services/merge_requests/base_merge_service.rb +++ b/app/services/merge_requests/base_merge_service.rb @@ -1,21 +1,10 @@ module MergeRequests - class BaseMergeService + class BaseMergeService < MergeRequests::BaseService private - def notification - NotificationService.new - end - def create_merge_event(merge_request, current_user) EventCreateService.new.merge_mr(merge_request, current_user) end - - def execute_project_hooks(merge_request) - if merge_request.project - hook_data = merge_request.to_hook_data(current_user) - merge_request.project.execute_hooks(hook_data, :merge_request_hooks) - end - end end end diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 680766140bd..2dae3a19041 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -6,12 +6,14 @@ module MergeRequests # Called when you do merge via command line and push code # to target branch class MergeService < BaseMergeService - def execute(merge_request, current_user, commit_message) + def execute(merge_request, commit_message) merge_request.merge - notification.merge_mr(merge_request, current_user) + binding.pry + notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) - execute_project_hooks(merge_request) + create_note(merge_request) + execute_hooks(merge_request) true rescue diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index baf0936cc3d..a6705de61f2 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -32,7 +32,9 @@ module MergeRequests merge_requests.uniq.select(&:source_project).each do |merge_request| - MergeRequests::MergeService.new.execute(merge_request, @current_user, nil) + MergeRequests::MergeService. + new(merge_request.target_project, @current_user). + execute(merge_request, nil) end end -- cgit v1.2.1 From 7eeec5e45a3f56ee6b05985962eb88d733b6beb2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 6 Jan 2015 17:00:27 -0800 Subject: Ooops! Removing debug line :) --- app/services/merge_requests/merge_service.rb | 1 - 1 file changed, 1 deletion(-) (limited to 'app') diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 2dae3a19041..5de7247d617 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -9,7 +9,6 @@ module MergeRequests def execute(merge_request, commit_message) merge_request.merge - binding.pry notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) create_note(merge_request) -- cgit v1.2.1 From d02a22ba21f91d2aa4f9cf716dc3aefcf7e7495e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 7 Jan 2015 17:07:36 -0800 Subject: Redesign signin/singup pages --- app/assets/stylesheets/sections/login.scss | 89 ++++++++++++++-------- app/helpers/application_helper.rb | 5 ++ app/views/devise/sessions/_new_base.html.haml | 2 +- app/views/devise/sessions/_new_ldap.html.haml | 1 - .../devise/sessions/_oauth_providers.html.haml | 10 --- app/views/devise/sessions/new.html.haml | 52 +++---------- app/views/devise/shared/_oauth_box.html.haml | 10 +++ app/views/devise/shared/_signin_box.html.haml | 25 ++++++ app/views/devise/shared/_signup_box.html.haml | 17 +++++ app/views/layouts/_public_head_panel.html.haml | 13 ++-- app/views/layouts/devise.html.haml | 47 ++++++------ 11 files changed, 156 insertions(+), 115 deletions(-) delete mode 100644 app/views/devise/sessions/_oauth_providers.html.haml create mode 100644 app/views/devise/shared/_oauth_box.html.haml create mode 100644 app/views/devise/shared/_signin_box.html.haml create mode 100644 app/views/devise/shared/_signup_box.html.haml (limited to 'app') diff --git a/app/assets/stylesheets/sections/login.scss b/app/assets/stylesheets/sections/login.scss index 1bcb1f6d68e..901733ef9ff 100644 --- a/app/assets/stylesheets/sections/login.scss +++ b/app/assets/stylesheets/sections/login.scss @@ -1,48 +1,66 @@ /* Login Page */ .login-page { - h1 { - font-size: 3em; - font-weight: 200; + .container { + max-width: 960px; } - .login-box{ - padding: 0 15px; + .navbar-gitlab .container { + max-width: none; + } - .login-heading h3 { - font-weight: 300; - line-height: 2; - } + .brand-holder { + font-size: 18px; + line-height: 1.5; - .login-footer { - margin-top: 10px; + p { + color: #888; } - .btn { - padding: 12px !important; - @extend .btn-block; + h1:first-child { + font-weight: normal; + margin-bottom: 30px; } - } - .brand-image { img { max-width: 100%; - margin-bottom: 20px; + margin-bottom: 30px; } - &.default-brand-image { - margin: 0 80px; + a { + font-weight: bold; } } - .login-logo { - margin: 10px 0 30px 0; - display: block; + .login-box{ + background: #fafafa; + border-radius: 10px; + box-shadow: 0 0px 2px #CCC; + padding: 15px; + + .login-heading h3 { + font-weight: 300; + line-height: 1.5; + margin: 0; + display: none; + } + + .login-footer { + margin-top: 10px; + } + + a.forgot { + float: right; + padding-top: 6px + } + + .nav .active a { + background: transparent; + } } .form-control { - background-color: #F5F5F5; - font-size: 16px; - padding: 14px 10px; + font-size: 14px; + padding: 10px 8px; width: 100%; height: auto; @@ -68,11 +86,6 @@ } } - .login-box a.forgot { - float: right; - padding-top: 6px - } - .devise-errors { h2 { font-size: 14px; @@ -80,7 +93,19 @@ } } - .brand-holder { - border-right: 1px solid #EEE; + .remember-me { + margin-top: -10px; + + label { + font-weight: normal; + } + } +} + +@media (max-width: $screen-xs-max) { + .login-page { + .col-sm-5.pull-right { + float: none !important; + } } } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 092a1ba9229..f21b0bd1f50 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -305,4 +305,9 @@ module ApplicationHelper profile_key_path(key) end end + + def redirect_from_root? + request.env['rack.session']['user_return_to'] == + '/' + end end diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml index e819847e5ea..ab9085f0ba7 100644 --- a/app/views/devise/sessions/_new_base.html.haml +++ b/app/views/devise/sessions/_new_base.html.haml @@ -2,7 +2,7 @@ = f.text_field :login, class: "form-control top", placeholder: "Username or Email", autofocus: "autofocus" = f.password_field :password, class: "form-control bottom", placeholder: "Password" - if devise_mapping.rememberable? - .clearfix.append-bottom-10 + .remember-me %label.checkbox.remember_me{for: "user_remember_me"} = f.check_box :remember_me %span Remember me diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml index bf8a593c254..e986989a728 100644 --- a/app/views/devise/sessions/_new_ldap.html.haml +++ b/app/views/devise/sessions/_new_ldap.html.haml @@ -1,5 +1,4 @@ = form_tag(user_omniauth_callback_path(provider), id: 'new_ldap_user' ) do = text_field_tag :username, nil, {class: "form-control top", placeholder: "LDAP Login", autofocus: "autofocus"} = password_field_tag :password, nil, {class: "form-control bottom", placeholder: "Password"} - %br/ = button_tag "LDAP Sign in", class: "btn-save btn" diff --git a/app/views/devise/sessions/_oauth_providers.html.haml b/app/views/devise/sessions/_oauth_providers.html.haml deleted file mode 100644 index 8d6aaefb9ff..00000000000 --- a/app/views/devise/sessions/_oauth_providers.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -- providers = additional_providers -- if providers.present? - .bs-callout.bs-callout-info{:'data-no-turbolink' => 'data-no-turbolink'} - %span Sign in with:   - - providers.each do |provider| - %span - - if default_providers.include?(provider) - = link_to authbutton(provider, 32), omniauth_authorize_path(resource_name, provider) - - else - = link_to provider.to_s.titleize, omniauth_authorize_path(resource_name, provider), class: "btn" diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index ca7e9570b43..5e31d8e818a 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -1,43 +1,15 @@ -.login-box - .login-heading - %h3 Sign in - .login-body - - if ldap_enabled? - %ul.nav.nav-tabs - - @ldap_servers.each_with_index do |server, i| - %li{class: (:active if i.zero?)} - = link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab' - - if gitlab_config.signin_enabled - %li - = link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab' - .tab-content - - @ldap_servers.each_with_index do |server, i| - %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)} - = render 'devise/sessions/new_ldap', provider: server['provider_name'] - - if gitlab_config.signin_enabled - %div#tab-signin.tab-pane - = render 'devise/sessions/new_base' +%div + = render 'devise/shared/signin_box' - - elsif gitlab_config.signin_enabled - = render 'devise/sessions/new_base' - - else - %div - No authentication methods configured. + - if Gitlab.config.omniauth.enabled && devise_mapping.omniauthable? + .prepend-top-20 + = render 'devise/shared/oauth_box' - = render 'devise/sessions/oauth_providers' if Gitlab.config.omniauth.enabled && devise_mapping.omniauthable? + - if gitlab_config.signup_enabled + .prepend-top-20 + = render 'devise/shared/signup_box' - .login-footer - - if gitlab_config.signup_enabled - %p - %span.light - Don't have an account? - %strong - = link_to "Sign up", new_registration_path(resource_name) - - %p - %span.light Did not receive confirmation email? - = link_to "Send again", new_confirmation_path(resource_name) - - - if extra_config.has_key?('sign_in_text') - %hr - = markdown(extra_config.sign_in_text) +.clearfix.prepend-top-20 + %p + %span.light Did not receive confirmation email? + = link_to "Send again", new_confirmation_path(resource_name) diff --git a/app/views/devise/shared/_oauth_box.html.haml b/app/views/devise/shared/_oauth_box.html.haml new file mode 100644 index 00000000000..c2e1373de30 --- /dev/null +++ b/app/views/devise/shared/_oauth_box.html.haml @@ -0,0 +1,10 @@ +- providers = additional_providers +- if providers.present? + .login-box{:'data-no-turbolink' => 'data-no-turbolink'} + %span Sign in with   + - providers.each do |provider| + %span + - if default_providers.include?(provider) + = link_to authbutton(provider, 32), omniauth_authorize_path(resource_name, provider) + - else + = link_to provider.to_s.titleize, omniauth_authorize_path(resource_name, provider), class: "btn" diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml new file mode 100644 index 00000000000..3f2161ff6a4 --- /dev/null +++ b/app/views/devise/shared/_signin_box.html.haml @@ -0,0 +1,25 @@ +.login-box + .login-heading + %h3 Sign in + .login-body + - if ldap_enabled? + %ul.nav.nav-tabs + - @ldap_servers.each_with_index do |server, i| + %li{class: (:active if i.zero?)} + = link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab' + - if gitlab_config.signin_enabled + %li + = link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab' + .tab-content + - @ldap_servers.each_with_index do |server, i| + %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)} + = render 'devise/sessions/new_ldap', provider: server['provider_name'] + - if gitlab_config.signin_enabled + %div#tab-signin.tab-pane + = render 'devise/sessions/new_base' + + - elsif gitlab_config.signin_enabled + = render 'devise/sessions/new_base' + - else + %div + No authentication methods configured. diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml new file mode 100644 index 00000000000..5709c661288 --- /dev/null +++ b/app/views/devise/shared/_signup_box.html.haml @@ -0,0 +1,17 @@ +.login-box + .login-heading + %h3 Sign up + .login-body + = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| + .devise-errors + = devise_error_messages! + %div + = f.text_field :name, class: "form-control top", placeholder: "Name", required: true + %div + = f.text_field :username, class: "form-control middle", placeholder: "Username", required: true + %div + = f.email_field :email, class: "form-control middle", placeholder: "Email", required: true + .form-group#password-strength + = f.password_field :password, class: "form-control bottom", id: "user_password_sign_up", placeholder: "Password", required: true + %div + = f.submit "Sign up", class: "btn-create btn" diff --git a/app/views/layouts/_public_head_panel.html.haml b/app/views/layouts/_public_head_panel.html.haml index 02a5e4868d1..1d5bbb2aade 100644 --- a/app/views/layouts/_public_head_panel.html.haml +++ b/app/views/layouts/_public_head_panel.html.haml @@ -12,12 +12,13 @@ %span.sr-only Toggle navigation %i.fa.fa-bars - .pull-right.hidden-xs - = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-new' + - unless current_controller?('sessions') + .pull-right.hidden-xs + = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-new' - .navbar-collapse.collapse - %ul.nav.navbar-nav - %li.visible-xs - = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes') + .navbar-collapse.collapse + %ul.nav.navbar-nav + %li.visible-xs + = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes') = render 'shared/outdated_browser' diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml index 6539a24119c..8b3872e535d 100644 --- a/app/views/layouts/devise.html.haml +++ b/app/views/layouts/devise.html.haml @@ -1,36 +1,33 @@ !!! 5 %html{ lang: "en"} = render "layouts/head" - %body.ui_basic.login-page - .container - .content - .login-title - %h1= brand_title - = render 'shared/outdated_browser' - %hr - .container + %body.ui_mars.login-page.application + = render "layouts/broadcast" + = render "layouts/public_head_panel", title: '' + .container.navless-container .content - = render "layouts/flash" - .row - .col-md-7.brand-holder + - unless redirect_from_root? + = render "layouts/flash" + .row.prepend-top-20 + .col-sm-5.pull-right + = yield + .col-sm-7.brand-holder.pull-left + %h1 + = brand_title - if brand_item - .brand-image - = brand_image - .brand_text - = brand_text + = brand_image + = brand_text - else - .brand-image.default-brand-image.hidden-sm.hidden-xs - = image_tag 'brand_logo.png' - .brand_text.hidden-xs - %h2 Open source software to collaborate on code + %h3 Open source software to collaborate on code - %p.lead - Manage git repositories with fine grained access controls that keep your code secure. - Perform code reviews and enhance collaboration with merge requests. - Each project can also have an issue tracker and a wiki. + %p + Manage git repositories with fine grained access controls that keep your code secure. + Perform code reviews and enhance collaboration with merge requests. + Each project can also have an issue tracker and a wiki. + + - if extra_config.has_key?('sign_in_text') + = markdown(extra_config.sign_in_text) - .col-md-5 - = yield %hr .container .footer-links -- cgit v1.2.1 From 8589b4e137f50293952923bb07e2814257d7784d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 8 Jan 2015 00:22:50 -0800 Subject: Init ApplicationSettings resource with defaults from config file --- .../admin/application_settings_controller.rb | 31 ++++++++++++++++++++++ app/controllers/registrations_controller.rb | 4 ++- app/helpers/application_helper.rb | 8 ++++++ app/helpers/application_settings_helper.rb | 2 ++ app/models/application_setting.rb | 5 ++++ app/services/gravatar_service.rb | 2 +- .../admin/application_settings/_form.html.haml | 29 ++++++++++++++++++++ .../admin/application_settings/edit.html.haml | 5 ++++ .../admin/application_settings/show.html.haml | 18 +++++++++++++ app/views/devise/sessions/new.html.haml | 2 +- app/views/devise/shared/_signin_box.html.haml | 6 ++--- 11 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 app/controllers/admin/application_settings_controller.rb create mode 100644 app/helpers/application_settings_helper.rb create mode 100644 app/models/application_setting.rb create mode 100644 app/views/admin/application_settings/_form.html.haml create mode 100644 app/views/admin/application_settings/edit.html.haml create mode 100644 app/views/admin/application_settings/show.html.haml (limited to 'app') diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb new file mode 100644 index 00000000000..d6e950b0007 --- /dev/null +++ b/app/controllers/admin/application_settings_controller.rb @@ -0,0 +1,31 @@ +class Admin::ApplicationSettingsController < Admin::ApplicationController + before_filter :set_application_setting + + def show + end + + def edit + end + + def update + @application_setting.update_attributes(application_setting_params) + + redirect_to admin_application_settings_path + end + + private + + def set_application_setting + @application_setting = ApplicationSetting.last + end + + def application_setting_params + params.require(:application_setting).permit( + :default_projects_limit, + :signup_enabled, + :signin_enabled, + :gravatar_enabled, + :sign_in_text, + ) + end +end diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 6d3214b70a8..7c15eab4345 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -26,7 +26,9 @@ class RegistrationsController < Devise::RegistrationsController private def signup_enabled? - redirect_to new_user_session_path unless Gitlab.config.gitlab.signup_enabled + unless ApplicationSetting.current.signup_enabled + redirect_to new_user_session_path + end end def sign_up_params diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f21b0bd1f50..c339b3597ec 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -310,4 +310,12 @@ module ApplicationHelper request.env['rack.session']['user_return_to'] == '/' end + + def signup_enabled? + ApplicationSetting.current.signup_enabled + end + + def signin_enabled? + ApplicationSetting.current.signin_enabled + end end diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb new file mode 100644 index 00000000000..bb39a3cf4f0 --- /dev/null +++ b/app/helpers/application_settings_helper.rb @@ -0,0 +1,2 @@ +module ApplicationSettingsHelper +end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb new file mode 100644 index 00000000000..4b885461cbb --- /dev/null +++ b/app/models/application_setting.rb @@ -0,0 +1,5 @@ +class ApplicationSetting < ActiveRecord::Base + def self.current + ApplicationSetting.last + end +end diff --git a/app/services/gravatar_service.rb b/app/services/gravatar_service.rb index a69c7c78377..d8c9436aaa5 100644 --- a/app/services/gravatar_service.rb +++ b/app/services/gravatar_service.rb @@ -1,6 +1,6 @@ class GravatarService def execute(email, size = nil) - if gravatar_config.enabled && email.present? + if ApplicationSetting.current.gravatar_enabled && email.present? size = 40 if size.nil? || size <= 0 sprintf gravatar_url, diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml new file mode 100644 index 00000000000..846d74d433d --- /dev/null +++ b/app/views/admin/application_settings/_form.html.haml @@ -0,0 +1,29 @@ += form_for @application_setting, url: admin_application_settings_path, html: { class: 'form-horizontal fieldset-form' } do |f| + - if @application_setting.errors.any? + #error_explanation + .alert.alert-danger + - @application_setting.errors.full_messages.each do |msg| + %p= msg + + .form-group + = f.label :default_projects_limit, class: 'control-label' + .col-sm-10 + = f.number_field :default_projects_limit, class: 'form-control' + .form-group + = f.label :signup_enabled, class: 'control-label' + .col-sm-10 + = f.check_box :signup_enabled, class: 'checkbox' + .form-group + = f.label :signin_enabled, class: 'control-label' + .col-sm-10 + = f.check_box :signin_enabled, class: 'checkbox' + .form-group + = f.label :gravatar_enabled, class: 'control-label' + .col-sm-10 + = f.check_box :gravatar_enabled, class: 'checkbox' + .form-group + = f.label :sign_in_text, class: 'control-label' + .col-sm-10 + = f.text_area :sign_in_text, class: 'form-control' + .form-actions + = f.submit 'Save', class: 'btn btn-primary' diff --git a/app/views/admin/application_settings/edit.html.haml b/app/views/admin/application_settings/edit.html.haml new file mode 100644 index 00000000000..62c0617ca4f --- /dev/null +++ b/app/views/admin/application_settings/edit.html.haml @@ -0,0 +1,5 @@ +%h1 Editing application_setting + += render 'form' + += link_to 'Back', admin_application_settings_path diff --git a/app/views/admin/application_settings/show.html.haml b/app/views/admin/application_settings/show.html.haml new file mode 100644 index 00000000000..1c77886546d --- /dev/null +++ b/app/views/admin/application_settings/show.html.haml @@ -0,0 +1,18 @@ +%table.table + %tr + %td Default projects limit: + %td= @application_setting.default_projects_limit + %tr + %td Signup enabled: + %td= @application_setting.signup_enabled + %tr + %td Signin enabled: + %td= @application_setting.signin_enabled + %tr + %td Gravatar enabled: + %td= @application_setting.gravatar_enabled + %tr + %td Sign in text: + %td= @application_setting.sign_in_text + += link_to 'Edit', edit_admin_application_settings_path diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index 5e31d8e818a..6d8415613d1 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -5,7 +5,7 @@ .prepend-top-20 = render 'devise/shared/oauth_box' - - if gitlab_config.signup_enabled + - if signup_enabled? .prepend-top-20 = render 'devise/shared/signup_box' diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index 3f2161ff6a4..70587329033 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -7,18 +7,18 @@ - @ldap_servers.each_with_index do |server, i| %li{class: (:active if i.zero?)} = link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab' - - if gitlab_config.signin_enabled + - if signin_enabled? %li = link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab' .tab-content - @ldap_servers.each_with_index do |server, i| %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)} = render 'devise/sessions/new_ldap', provider: server['provider_name'] - - if gitlab_config.signin_enabled + - if signin_enabled? %div#tab-signin.tab-pane = render 'devise/sessions/new_base' - - elsif gitlab_config.signin_enabled + - elsif signin_enabled? = render 'devise/sessions/new_base' - else %div -- cgit v1.2.1 From 57a65ede77b7bbae6e3b2a7aa52135de7b0c2f8e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 8 Jan 2015 09:53:35 -0800 Subject: Improve application settings and write tests --- .../admin/application_settings_controller.rb | 12 +++--- app/controllers/application_controller.rb | 4 +- app/controllers/registrations_controller.rb | 4 +- app/controllers/sessions_controller.rb | 22 +++++------ app/helpers/application_helper.rb | 8 ---- app/helpers/application_settings_helper.rb | 11 ++++++ app/models/user.rb | 5 ++- app/services/base_service.rb | 6 +++ app/services/gravatar_service.rb | 4 +- .../admin/application_settings/_form.html.haml | 44 ++++++++++++---------- .../admin/application_settings/edit.html.haml | 5 --- .../admin/application_settings/show.html.haml | 21 ++--------- app/views/layouts/devise.html.haml | 4 +- app/views/layouts/nav/_admin.html.haml | 5 +++ 14 files changed, 79 insertions(+), 76 deletions(-) delete mode 100644 app/views/admin/application_settings/edit.html.haml (limited to 'app') diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index d6e950b0007..39ca0b4feba 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -4,13 +4,13 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController def show end - def edit - end - def update - @application_setting.update_attributes(application_setting_params) - - redirect_to admin_application_settings_path + if @application_setting.update_attributes(application_setting_params) + redirect_to admin_application_settings_path, + notice: 'Application settings saved successfully' + else + render :show + end end private diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4b8cae469e3..b83de68c5d2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,6 +1,8 @@ require 'gon' class ApplicationController < ActionController::Base + include Gitlab::CurrentSettings + before_filter :authenticate_user_from_token! before_filter :authenticate_user! before_filter :reject_blocked! @@ -13,7 +15,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception - helper_method :abilities, :can? + helper_method :abilities, :can?, :current_application_settings rescue_from Encoding::CompatibilityError do |exception| log_exception(exception) diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 7c15eab4345..981dc2d8023 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -26,8 +26,8 @@ class RegistrationsController < Devise::RegistrationsController private def signup_enabled? - unless ApplicationSetting.current.signup_enabled - redirect_to new_user_session_path + if current_application_settings.signup_enabled? + redirect_to(new_user_session_path) end end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 5ced98152a5..7b6982c5074 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,16 +1,16 @@ class SessionsController < Devise::SessionsController - def new - redirect_path = if request.referer.present? && (params['redirect_to_referer'] == 'yes') - referer_uri = URI(request.referer) - if referer_uri.host == Gitlab.config.gitlab.host - referer_uri.path - else - request.fullpath - end - else - request.fullpath - end + redirect_path = + if request.referer.present? && (params['redirect_to_referer'] == 'yes') + referer_uri = URI(request.referer) + if referer_uri.host == Gitlab.config.gitlab.host + referer_uri.path + else + request.fullpath + end + else + request.fullpath + end # Prevent a 'you are already signed in' message directly after signing: # we should never redirect to '/users/sign_in' after signing in successfully. diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c339b3597ec..f21b0bd1f50 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -310,12 +310,4 @@ module ApplicationHelper request.env['rack.session']['user_return_to'] == '/' end - - def signup_enabled? - ApplicationSetting.current.signup_enabled - end - - def signin_enabled? - ApplicationSetting.current.signin_enabled - end end diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index bb39a3cf4f0..16db33efd33 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -1,2 +1,13 @@ module ApplicationSettingsHelper + def signup_enabled? + current_application_settings.signup_enabled + end + + def signin_enabled? + current_application_settings.signin_enabled + end + + def extra_sign_in_text + current_application_settings.sign_in_text + end end diff --git a/app/models/user.rb b/app/models/user.rb index 7dae318e780..6e5ac9b39c8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,14 +51,15 @@ require 'file_size_validator' class User < ActiveRecord::Base include Gitlab::ConfigHelper - extend Gitlab::ConfigHelper include TokenAuthenticatable + extend Gitlab::ConfigHelper + extend Gitlab::CurrentSettings default_value_for :admin, false default_value_for :can_create_group, gitlab_config.default_can_create_group default_value_for :can_create_team, false default_value_for :hide_no_ssh_key, false - default_value_for :projects_limit, gitlab_config.default_projects_limit + default_value_for :projects_limit, current_application_settings.default_projects_limit default_value_for :theme_id, gitlab_config.default_theme devise :database_authenticatable, :lockable, :async, diff --git a/app/services/base_service.rb b/app/services/base_service.rb index 0d46eeaa18f..bb51795df7c 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -1,4 +1,6 @@ class BaseService + include Gitlab::CurrentSettings + attr_accessor :project, :current_user, :params def initialize(project, user, params = {}) @@ -29,6 +31,10 @@ class BaseService SystemHooksService.new end + def current_application_settings + ApplicationSetting.current + end + private def error(message) diff --git a/app/services/gravatar_service.rb b/app/services/gravatar_service.rb index d8c9436aaa5..4bee0c26a68 100644 --- a/app/services/gravatar_service.rb +++ b/app/services/gravatar_service.rb @@ -1,6 +1,8 @@ class GravatarService + include Gitlab::CurrentSettings + def execute(email, size = nil) - if ApplicationSetting.current.gravatar_enabled && email.present? + if current_application_settings.gravatar_enabled? && email.present? size = 40 if size.nil? || size <= 0 sprintf gravatar_url, diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 846d74d433d..5ca9585e9a9 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -5,25 +5,29 @@ - @application_setting.errors.full_messages.each do |msg| %p= msg - .form-group - = f.label :default_projects_limit, class: 'control-label' - .col-sm-10 - = f.number_field :default_projects_limit, class: 'form-control' - .form-group - = f.label :signup_enabled, class: 'control-label' - .col-sm-10 - = f.check_box :signup_enabled, class: 'checkbox' - .form-group - = f.label :signin_enabled, class: 'control-label' - .col-sm-10 - = f.check_box :signin_enabled, class: 'checkbox' - .form-group - = f.label :gravatar_enabled, class: 'control-label' - .col-sm-10 - = f.check_box :gravatar_enabled, class: 'checkbox' - .form-group - = f.label :sign_in_text, class: 'control-label' - .col-sm-10 - = f.text_area :sign_in_text, class: 'form-control' + %fieldset + %legend Features + .form-group + = f.label :signup_enabled, class: 'control-label' + .col-sm-10 + = f.check_box :signup_enabled, class: 'checkbox' + .form-group + = f.label :signin_enabled, class: 'control-label' + .col-sm-10 + = f.check_box :signin_enabled, class: 'checkbox' + .form-group + = f.label :gravatar_enabled, class: 'control-label' + .col-sm-10 + = f.check_box :gravatar_enabled, class: 'checkbox' + %fieldset + %legend Misc + .form-group + = f.label :default_projects_limit, class: 'control-label' + .col-sm-10 + = f.number_field :default_projects_limit, class: 'form-control' + .form-group + = f.label :sign_in_text, class: 'control-label' + .col-sm-10 + = f.text_area :sign_in_text, class: 'form-control' .form-actions = f.submit 'Save', class: 'btn btn-primary' diff --git a/app/views/admin/application_settings/edit.html.haml b/app/views/admin/application_settings/edit.html.haml deleted file mode 100644 index 62c0617ca4f..00000000000 --- a/app/views/admin/application_settings/edit.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%h1 Editing application_setting - -= render 'form' - -= link_to 'Back', admin_application_settings_path diff --git a/app/views/admin/application_settings/show.html.haml b/app/views/admin/application_settings/show.html.haml index 1c77886546d..39b66647a5a 100644 --- a/app/views/admin/application_settings/show.html.haml +++ b/app/views/admin/application_settings/show.html.haml @@ -1,18 +1,3 @@ -%table.table - %tr - %td Default projects limit: - %td= @application_setting.default_projects_limit - %tr - %td Signup enabled: - %td= @application_setting.signup_enabled - %tr - %td Signin enabled: - %td= @application_setting.signin_enabled - %tr - %td Gravatar enabled: - %td= @application_setting.gravatar_enabled - %tr - %td Sign in text: - %td= @application_setting.sign_in_text - -= link_to 'Edit', edit_admin_application_settings_path +%h3.page-title Application settings +%hr += render 'form' diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml index 8b3872e535d..857ebd9b8d9 100644 --- a/app/views/layouts/devise.html.haml +++ b/app/views/layouts/devise.html.haml @@ -25,8 +25,8 @@ Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki. - - if extra_config.has_key?('sign_in_text') - = markdown(extra_config.sign_in_text) + - if extra_sign_in_text.present? + = markdown(extra_sign_in_text) %hr .container diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index ea503a9cc2e..fdc517617e3 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -40,3 +40,8 @@ %span Background Jobs + = nav_link(controller: :application_settings) do + = link_to admin_application_settings_path do + %i.fa.fa-cogs + %span + Settings -- cgit v1.2.1 From d0a50985ec613584821806062df4eaa39337449c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 8 Jan 2015 11:26:16 -0800 Subject: Create ApplicationSettings if does not exist in runtime --- app/controllers/admin/application_settings_controller.rb | 2 +- app/models/application_setting.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index 39ca0b4feba..5116f1f177a 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -16,7 +16,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController private def set_application_setting - @application_setting = ApplicationSetting.last + @application_setting = ApplicationSetting.current end def application_setting_params diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 4b885461cbb..47fa6f1071c 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -2,4 +2,14 @@ class ApplicationSetting < ActiveRecord::Base def self.current ApplicationSetting.last end + + def self.create_from_defaults + create( + default_projects_limit: Settings.gitlab['default_projects_limit'], + signup_enabled: Settings.gitlab['signup_enabled'], + signin_enabled: Settings.gitlab['signin_enabled'], + gravatar_enabled: Settings.gravatar['enabled'], + sign_in_text: Settings.extra['sign_in_text'], + ) + end end -- cgit v1.2.1 From 939c046a9872c1d7c38d73dc08860681ecebd1f1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 8 Jan 2015 13:21:00 -0800 Subject: Fix feature and tests --- app/controllers/registrations_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 981dc2d8023..52db44bf822 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -26,7 +26,7 @@ class RegistrationsController < Devise::RegistrationsController private def signup_enabled? - if current_application_settings.signup_enabled? + unless current_application_settings.signup_enabled? redirect_to(new_user_session_path) end end -- cgit v1.2.1 From 08c9cb4cabab648d90e6fcf055f1143fbbc994e8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 8 Jan 2015 14:26:43 -0800 Subject: Finally fix stuff related to dynamic config --- app/helpers/application_settings_helper.rb | 8 ++++++-- app/helpers/profile_helper.rb | 2 +- app/views/admin/dashboard/index.html.haml | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 16db33efd33..04299316102 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -1,10 +1,14 @@ module ApplicationSettingsHelper + def gravatar_enabled? + current_application_settings.gravatar_enabled? + end + def signup_enabled? - current_application_settings.signup_enabled + current_application_settings.signup_enabled? end def signin_enabled? - current_application_settings.signin_enabled + current_application_settings.signin_enabled? end def extra_sign_in_text diff --git a/app/helpers/profile_helper.rb b/app/helpers/profile_helper.rb index 6480fd3886f..9e37e44732a 100644 --- a/app/helpers/profile_helper.rb +++ b/app/helpers/profile_helper.rb @@ -14,6 +14,6 @@ module ProfileHelper end def show_profile_remove_tab? - gitlab_config.signup_enabled + signup_enabled? end end diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 7427cea7e8b..c6badeb4bd9 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -104,7 +104,7 @@ %p Sign up %span.light.pull-right - = boolean_to_icon gitlab_config.signup_enabled + = boolean_to_icon signup_enabled? %p LDAP %span.light.pull-right @@ -112,7 +112,7 @@ %p Gravatar %span.light.pull-right - = boolean_to_icon Gitlab.config.gravatar.enabled + = boolean_to_icon gravatar_enabled? %p OmniAuth %span.light.pull-right -- cgit v1.2.1 From 9c03c1c545d1afeaf12d8ee1c204936cdf8c55e1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 9 Jan 2015 19:10:01 -0800 Subject: Make automerge via satellite --- app/assets/javascripts/merge_request.js.coffee | 13 +++++++++++++ app/controllers/projects/merge_requests_controller.rb | 7 ++++--- app/views/projects/merge_requests/_show.html.haml | 2 +- app/views/projects/merge_requests/automerge.js.haml | 3 +-- app/workers/auto_merge_worker.rb | 13 +++++++++++++ 5 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 app/workers/auto_merge_worker.rb (limited to 'app') diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee index 9e3ca45ce04..5bcbd56852d 100644 --- a/app/assets/javascripts/merge_request.js.coffee +++ b/app/assets/javascripts/merge_request.js.coffee @@ -135,3 +135,16 @@ class @MergeRequest this.$('.automerge_widget').hide() this.$('.merge-in-progress').hide() this.$('.automerge_widget.already_cannot_be_merged').show() + + mergeInProgress: -> + $.ajax + type: 'GET' + url: $('.merge-request').data('url') + success: (data) => + switch data.state + when 'merged' + location.reload() + else + setTimeout(merge_request.mergeInProgress, 3000) + dataType: 'json' + diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index d23461821d7..3f702b0af97 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -27,6 +27,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController respond_to do |format| format.html + format.json { render json: @merge_request } format.diff { render text: @merge_request.to_diff(current_user) } format.patch { render text: @merge_request.to_patch(current_user) } end @@ -104,15 +105,15 @@ class Projects::MergeRequestsController < Projects::ApplicationController if @merge_request.unchecked? @merge_request.check_if_can_be_merged end - render json: {merge_status: @merge_request.merge_status_name} + + render json: { merge_status: @merge_request.merge_status_name } end def automerge return access_denied! unless allowed_to_merge? if @merge_request.open? && @merge_request.can_be_merged? - @merge_request.should_remove_source_branch = params[:should_remove_source_branch] - @merge_request.automerge!(current_user, params[:commit_message]) + AutoMergeWorker.perform_async(@merge_request.id, current_user.id, params) @status = true else @status = false diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index f8d2673335a..8e31a7e3fe4 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,4 +1,4 @@ -.merge-request +.merge-request{'data-url' => project_merge_request_path(@project, @merge_request)} = render "projects/merge_requests/show/mr_title" %hr = render "projects/merge_requests/show/mr_box" diff --git a/app/views/projects/merge_requests/automerge.js.haml b/app/views/projects/merge_requests/automerge.js.haml index e01ff662e7d..a53cbb150a4 100644 --- a/app/views/projects/merge_requests/automerge.js.haml +++ b/app/views/projects/merge_requests/automerge.js.haml @@ -1,7 +1,6 @@ -if @status :plain - location.reload(); + merge_request.mergeInProgress(); -else :plain merge_request.alreadyOrCannotBeMerged() - diff --git a/app/workers/auto_merge_worker.rb b/app/workers/auto_merge_worker.rb new file mode 100644 index 00000000000..a6dd73eee5f --- /dev/null +++ b/app/workers/auto_merge_worker.rb @@ -0,0 +1,13 @@ +class AutoMergeWorker + include Sidekiq::Worker + + sidekiq_options queue: :default + + def perform(merge_request_id, current_user_id, params) + params = params.with_indifferent_access + current_user = User.find(current_user_id) + merge_request = MergeRequest.find(merge_request_id) + merge_request.should_remove_source_branch = params[:should_remove_source_branch] + merge_request.automerge!(current_user, params[:commit_message]) + end +end -- cgit v1.2.1 From a9f7fd2c1a7052247333b89f6a22a883b480370d Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Wed, 31 Dec 2014 15:07:48 +0200 Subject: Github Importer --- app/controllers/github_imports_controller.rb | 75 ++++++++++++++++++++++++ app/controllers/omniauth_callbacks_controller.rb | 2 +- app/helpers/projects_helper.rb | 16 +++++ app/views/github_imports/create.js.haml | 18 ++++++ app/views/github_imports/status.html.haml | 41 +++++++++++++ app/views/projects/new.html.haml | 10 +++- app/workers/repository_import_worker.rb | 8 ++- 7 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 app/controllers/github_imports_controller.rb create mode 100644 app/views/github_imports/create.js.haml create mode 100644 app/views/github_imports/status.html.haml (limited to 'app') diff --git a/app/controllers/github_imports_controller.rb b/app/controllers/github_imports_controller.rb new file mode 100644 index 00000000000..97a2637b1eb --- /dev/null +++ b/app/controllers/github_imports_controller.rb @@ -0,0 +1,75 @@ +class GithubImportsController < ApplicationController + before_filter :github_auth, except: :callback + + rescue_from Octokit::Unauthorized, with: :github_unauthorized + + def callback + token = client.auth_code.get_token(params[:code]).token + current_user.github_access_token = token + current_user.save + redirect_to status_github_import_url + end + + def status + @repos = octo_client.repos + octo_client.orgs.each do |org| + @repos += octo_client.repos(org.login) + end + + @already_added_projects = current_user.created_projects.where(import_type: "github") + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.reject!{|repo| already_added_projects_names.include? repo.full_name} + end + + def create + @repo_id = params[:repo_id].to_i + repo = octo_client.repo(@repo_id) + target_namespace = params[:new_namespace].presence || repo.owner.login + existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) + + if existing_namespace + if existing_namespace.owner == current_user + namespace = existing_namespace + else + @already_been_taken = true + @target_namespace = target_namespace + @project_name = repo.name + render and return + end + else + namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) + namespace.add_owner(current_user) + end + + Gitlab::Github::ProjectCreator.new(repo, namespace, current_user).execute + end + + private + + def client + @client ||= Gitlab::Github::Client.new.client + end + + def octo_client + Octokit.auto_paginate = true + @octo_client ||= Octokit::Client.new(:access_token => current_user.github_access_token) + end + + def github_auth + if current_user.github_access_token.blank? + go_to_gihub_for_permissions + end + end + + def go_to_gihub_for_permissions + redirect_to client.auth_code.authorize_url({ + redirect_uri: callback_github_import_url, + scope: "repo, user, user:email" + }) + end + + def github_unauthorized + go_to_gihub_for_permissions + end +end diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index 3e984e5007a..442a1cf7518 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -65,7 +65,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return end end - rescue ForbiddenAction => e + rescue Gitlab::OAuth::ForbiddenAction => e flash[:notice] = e.message redirect_to new_user_session_path end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index e489d431e84..39d6be06383 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -237,4 +237,20 @@ module ProjectsHelper result.password = '*****' if result.password.present? result end + + def project_status_css_class(status) + case status + when "started" + "active" + when "failed" + "danger" + when "finished" + "success" + end + end + + def github_import_enabled? + Gitlab.config.omniauth.enabled && enabled_oauth_providers.include?(:github) + end end + diff --git a/app/views/github_imports/create.js.haml b/app/views/github_imports/create.js.haml new file mode 100644 index 00000000000..e354c2da4dd --- /dev/null +++ b/app/views/github_imports/create.js.haml @@ -0,0 +1,18 @@ +- if @already_been_taken + :plain + target_field = $("tr#repo_#{@repo_id} .import-target") + origin_target = target_field.text() + project_name = "#{@project_name}" + origin_namespace = "#{@target_namespace}" + target_field.empty() + target_field.append("

    This namespace already been taken! Please choose another one

    ") + target_field.append("") + target_field.append("/" + project_name) + target_field.data("project_name", project_name) + target_field.find('input').prop("value", origin_namespace) +- else + :plain + $("table.import-jobs tbody").prepend($("tr#repo_#{@repo_id}")) + $("tr#repo_#{@repo_id}").addClass("active").find(".import-actions").text("started") + + \ No newline at end of file diff --git a/app/views/github_imports/status.html.haml b/app/views/github_imports/status.html.haml new file mode 100644 index 00000000000..6a196cae39d --- /dev/null +++ b/app/views/github_imports/status.html.haml @@ -0,0 +1,41 @@ +%h3.page-title + Import repositories from github + +%hr +%h4 + Select projects you want to import. + +%table.table.table-bordered.import-jobs + %thead + %tr + %th From GitHub + %th To GitLab + %th Status + %tbody + - @already_added_projects.each do |repo| + %tr{id: "repo_#{repo.id}", class: "#{project_status_css_class(repo.import_status)}"} + %td= repo.import_source + %td= repo.name_with_namespace + %td= repo.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo.id}"} + %td= repo.full_name + %td.import-target + = repo.full_name + %td.import-actions + = button_tag "Add", class: "btn btn-add-to-import" + + +:coffeescript + $(".btn-add-to-import").click () -> + new_namespace = null + tr = $(this).closest("tr") + id = tr.attr("id").replace("repo_", "") + if tr.find(".import-target input").length > 0 + new_namespace = tr.find(".import-target input").prop("value") + tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) + $.post "#{github_import_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + + diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index f320a2b505e..88c1f725703 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -39,7 +39,15 @@ %br The import will time out after 4 minutes. For big repositories, use a clone/push combination. For SVN repositories, check #{link_to "this migrating from SVN doc.", "http://doc.gitlab.com/ce/workflow/migrating_from_svn.html"} - %hr + + - if github_import_enabled? + .project-import.form-group + .col-sm-2 + .col-sm-10 + %i.fa.fa-bars + = link_to "Import projects from github", status_github_import_path + + %hr.prepend-botton-10 .form-group = f.label :description, class: 'control-label' do diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index 01586150cd2..0bcc42bc62c 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -10,7 +10,13 @@ class RepositoryImportWorker project.path_with_namespace, project.import_url) - if result + if project.import_type == 'github' + result_of_data_import = Gitlab::Github::Importer.new(project).execute + else + result_of_data_import = true + end + + if result && result_of_data_import project.import_finish project.save project.satellite.create unless project.satellite.exists? -- cgit v1.2.1 From b758b4c80bacd655f0241375c2391028cfd73f77 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 10 Jan 2015 19:26:00 -0800 Subject: If noteable is nil - make discussion outdated --- app/models/note.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/models/note.rb b/app/models/note.rb index 5996298be22..e99bc2668d6 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -296,6 +296,7 @@ class Note < ActiveRecord::Base # If not - its outdated diff def active? return true unless self.diff + return false unless noteable noteable.diffs.each do |mr_diff| next unless mr_diff.new_path == self.diff.new_path -- cgit v1.2.1 From 2543af84f0925a1eea585675b2a334a5691a110b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 10 Jan 2015 22:18:14 -0800 Subject: Execute GitLab CI on tag push --- app/services/git_tag_push_service.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'app') diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb index 62eaf9b4f51..bacd39bf1c4 100644 --- a/app/services/git_tag_push_service.rb +++ b/app/services/git_tag_push_service.rb @@ -8,6 +8,12 @@ class GitTagPushService create_push_event project.repository.expire_cache project.execute_hooks(@push_data.dup, :tag_push_hooks) + + if project.gitlab_ci? + project.gitlab_ci_service.async_execute(@push_data) + end + + true end private -- cgit v1.2.1 From 319704451233f4abfbb0e4bcc9bb3e0a756f5eb1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 11 Jan 2015 23:51:31 -0800 Subject: Refactor push data builder. Moved it to separate class Also execute GitLab CI on creating tag via UI --- app/controllers/projects/services_controller.rb | 3 +- app/controllers/projects/tags_controller.rb | 1 + app/services/create_tag_service.rb | 10 ++++ app/services/git_push_service.rb | 63 +------------------------ app/services/git_tag_push_service.rb | 16 +------ app/services/test_hook_service.rb | 2 +- 6 files changed, 17 insertions(+), 78 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index ef4d2609147..9c203debc3f 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -24,8 +24,7 @@ class Projects::ServicesController < Projects::ApplicationController end def test - data = GitPushService.new.sample_data(project, current_user) - + data = Gitlab::PushDataBuilder.build(project, current_user) @service.execute(data) redirect_to :back diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index 162ddef0fec..64b820160d3 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -13,6 +13,7 @@ class Projects::TagsController < Projects::ApplicationController def create result = CreateTagService.new(@project, current_user). execute(params[:tag_name], params[:ref], params[:message]) + if result[:status] == :success @tag = result[:tag] redirect_to project_tags_path(@project) diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb index 9b2a2270233..6c3d15e9f4d 100644 --- a/app/services/create_tag_service.rb +++ b/app/services/create_tag_service.rb @@ -21,6 +21,11 @@ class CreateTagService < BaseService new_tag = repository.find_tag(tag_name) if new_tag + if project.gitlab_ci? + push_data = create_push_data(project, current_user, new_tag) + project.gitlab_ci_service.async_execute(push_data) + end + Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags') return success(new_tag) else @@ -33,4 +38,9 @@ class CreateTagService < BaseService out[:tag] = branch out end + + def create_push_data(project, user, tag) + Gitlab::PushDataBuilder. + build(project, user, Gitlab::Git::BLANK_SHA, tag.target, tag.name, []) + end end diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 529af1970f6..a9ea7daabc8 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -52,16 +52,6 @@ class GitPushService end end - # This method provide a sample data - # generated with post_receive_data method - # for given project - # - def sample_data(project, user) - @project, @user = project, user - @push_commits = project.repository.commits(project.default_branch, nil, 3) - post_receive_data(@push_commits.last.id, @push_commits.first.id, "refs/heads/#{project.default_branch}") - end - protected def create_push_event(push_data) @@ -112,58 +102,9 @@ class GitPushService end end - # Produce a hash of post-receive data - # - # data = { - # before: String, - # after: String, - # ref: String, - # user_id: String, - # user_name: String, - # project_id: String, - # repository: { - # name: String, - # url: String, - # description: String, - # homepage: String, - # }, - # commits: Array, - # total_commits_count: Fixnum - # } - # def post_receive_data(oldrev, newrev, ref) - # Total commits count - push_commits_count = push_commits.size - - # Get latest 20 commits ASC - push_commits_limited = push_commits.last(20) - - # Hash to be passed as post_receive_data - data = { - before: oldrev, - after: newrev, - ref: ref, - user_id: user.id, - user_name: user.name, - project_id: project.id, - repository: { - name: project.name, - url: project.url_to_repo, - description: project.description, - homepage: project.web_url, - }, - commits: [], - total_commits_count: push_commits_count - } - - # For performance purposes maximum 20 latest commits - # will be passed as post receive hook data. - # - push_commits_limited.each do |commit| - data[:commits] << commit.hook_attrs(project) - end - - data + Gitlab::PushDataBuilder. + build(project, user, oldrev, newrev, ref, push_commits) end def push_to_existing_branch?(ref, oldrev) diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb index bacd39bf1c4..c24809ad607 100644 --- a/app/services/git_tag_push_service.rb +++ b/app/services/git_tag_push_service.rb @@ -19,20 +19,8 @@ class GitTagPushService private def create_push_data(oldrev, newrev, ref) - data = { - ref: ref, - before: oldrev, - after: newrev, - user_id: user.id, - user_name: user.name, - project_id: project.id, - repository: { - name: project.name, - url: project.url_to_repo, - description: project.description, - homepage: project.web_url - } - } + Gitlab::PushDataBuilder. + build(project, user, oldrev, newrev, ref, []) end def create_push_event diff --git a/app/services/test_hook_service.rb b/app/services/test_hook_service.rb index 17d86a7a274..3c03aeaaf66 100644 --- a/app/services/test_hook_service.rb +++ b/app/services/test_hook_service.rb @@ -1,6 +1,6 @@ class TestHookService def execute(hook, current_user) - data = GitPushService.new.sample_data(hook.project, current_user) + data = Gitlab::PushDataBuilder.build(hook.project, current_user) hook.execute(data) end end -- cgit v1.2.1 From 4e7df0037a45f4d2b05ef1a582cb1bbef44afd10 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 12 Jan 2015 00:05:04 -0800 Subject: Fix ci data in hook when create git tag via UI --- app/services/create_tag_service.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb index 6c3d15e9f4d..041c2287c36 100644 --- a/app/services/create_tag_service.rb +++ b/app/services/create_tag_service.rb @@ -27,9 +27,9 @@ class CreateTagService < BaseService end Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags') - return success(new_tag) + success(new_tag) else - return error('Invalid reference name') + error('Invalid reference name') end end @@ -41,6 +41,6 @@ class CreateTagService < BaseService def create_push_data(project, user, tag) Gitlab::PushDataBuilder. - build(project, user, Gitlab::Git::BLANK_SHA, tag.target, tag.name, []) + build(project, user, Gitlab::Git::BLANK_SHA, tag.target, 'refs/tags/' + tag.name, []) end end -- cgit v1.2.1 From 0a089661fd488bf71b7a426441204713200f57ed Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 12 Jan 2015 13:35:29 +0100 Subject: Rename the checkbox css class to prevent it from being overwritten by the same named bootstrap class. --- app/assets/stylesheets/sections/merge_requests.scss | 2 +- app/views/projects/merge_requests/show/_mr_accept.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 8445b77c1a8..74e1d8beb5a 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -29,7 +29,7 @@ line-height: 20px; font-weight: bold; - .checkbox { + .remove_source_checkbox { margin: 0; } } diff --git a/app/views/projects/merge_requests/show/_mr_accept.html.haml b/app/views/projects/merge_requests/show/_mr_accept.html.haml index dd5f29e5389..11a111e5faa 100644 --- a/app/views/projects/merge_requests/show/_mr_accept.html.haml +++ b/app/views/projects/merge_requests/show/_mr_accept.html.haml @@ -18,7 +18,7 @@ = f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request" - if can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && !@merge_request.for_fork? .accept-control - = label_tag :should_remove_source_branch, class: "checkbox" do + = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do = check_box_tag :should_remove_source_branch Remove source-branch .accept-control -- cgit v1.2.1 From bba8e59a044f34a02000b752a70198fb74236b1d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 12 Jan 2015 09:08:25 -0800 Subject: Fix test hook and tests --- app/controllers/projects/services_controller.rb | 2 +- app/services/test_hook_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 9c203debc3f..b2ce99aeb45 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -24,7 +24,7 @@ class Projects::ServicesController < Projects::ApplicationController end def test - data = Gitlab::PushDataBuilder.build(project, current_user) + data = Gitlab::PushDataBuilder.build_sample(project, current_user) @service.execute(data) redirect_to :back diff --git a/app/services/test_hook_service.rb b/app/services/test_hook_service.rb index 3c03aeaaf66..21ec2c01cb8 100644 --- a/app/services/test_hook_service.rb +++ b/app/services/test_hook_service.rb @@ -1,6 +1,6 @@ class TestHookService def execute(hook, current_user) - data = Gitlab::PushDataBuilder.build(hook.project, current_user) + data = Gitlab::PushDataBuilder.build_sample(hook.project, current_user) hook.execute(data) end end -- cgit v1.2.1 From 058f223b01c87fc45825c2459d36371166abfc27 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 12 Jan 2015 09:30:52 -0800 Subject: ForbiddenAction constant fix --- app/controllers/omniauth_callbacks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index 3e984e5007a..442a1cf7518 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -65,7 +65,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return end end - rescue ForbiddenAction => e + rescue Gitlab::OAuth::ForbiddenAction => e flash[:notice] = e.message redirect_to new_user_session_path end -- cgit v1.2.1 From c13f420b663af3eca6a8c11c7c9c5b3aa684336b Mon Sep 17 00:00:00 2001 From: yglukhov Date: Tue, 6 Jan 2015 10:50:37 +0200 Subject: First entry in wiki history leads to newest revision. --- app/helpers/projects_helper.rb | 5 +++++ app/views/projects/wikis/history.html.haml | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index e489d431e84..786a386c0ea 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -237,4 +237,9 @@ module ProjectsHelper result.password = '*****' if result.password.present? result end + + def project_wiki_path_with_version(proj, page, version, is_newest) + url_params = is_newest ? {} : { version_id: version } + project_wiki_path(proj, page, url_params) + end end diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index ef4b8f74714..b30eff94f2c 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -12,11 +12,12 @@ %th Last updated %th Format %tbody - - @page.versions.each do |version| + - @page.versions.each_with_index do |version, index| - commit = version %tr %td - = link_to project_wiki_path(@project, @page, version_id: commit.id) do + = link_to project_wiki_path_with_version(@project, @page, + commit.id, index == 0) do = truncate_sha(commit.id) %td = commit.author.name -- cgit v1.2.1 From b1792d9e4c28366ecc896e36d22099ab564c150f Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 13 Jan 2015 13:01:50 +0100 Subject: Scroll the readme anchors below the navbar. --- app/assets/javascripts/project_show.js.coffee | 15 +++++++++++++++ app/assets/javascripts/tree_show.js.coffee | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 app/assets/javascripts/tree_show.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee index 02a7d7b731d..73818ecd0ed 100644 --- a/app/assets/javascripts/project_show.js.coffee +++ b/app/assets/javascripts/project_show.js.coffee @@ -13,3 +13,18 @@ class @ProjectShow $("a[href=" + defaultView + "]").tab "show" else $("a[data-toggle='tab']:first").tab "show" + +$(document).ready -> + $(window).load (e) -> + e.preventDefault() + unless location.hash is "" + $("html, body").animate + scrollTop: $(".navbar").offset().top - $(".navbar").height() + , 200 + false + + $("a").click (e) -> + unless location.hash is "" + $("html,body").animate + scrollTop: $(this).offset().top - $(".navbar").height() - 3 + , 200 diff --git a/app/assets/javascripts/tree_show.js.coffee b/app/assets/javascripts/tree_show.js.coffee new file mode 100644 index 00000000000..33300643dc4 --- /dev/null +++ b/app/assets/javascripts/tree_show.js.coffee @@ -0,0 +1,14 @@ +$(document).ready -> + $(window).load (e) -> + e.preventDefault() + unless location.hash is "" + $("html, body").animate + scrollTop: $(".navbar").offset().top - $(".navbar").height() + , 200 + false + + $("a").click (e) -> + unless location.hash is "" + $("html,body").animate + scrollTop: $(this).offset().top - $(".navbar").height() - 3 + , 200 -- cgit v1.2.1 From 5140bd88247125e24090a45be920b509b0fcf958 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 13 Jan 2015 13:14:32 +0100 Subject: When anchor is clicked set the correct condition. --- app/assets/javascripts/project_show.js.coffee | 8 +++++--- app/assets/javascripts/tree_show.js.coffee | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee index 73818ecd0ed..581bd2edc20 100644 --- a/app/assets/javascripts/project_show.js.coffee +++ b/app/assets/javascripts/project_show.js.coffee @@ -21,10 +21,12 @@ $(document).ready -> $("html, body").animate scrollTop: $(".navbar").offset().top - $(".navbar").height() , 200 - false - $("a").click (e) -> - unless location.hash is "" + $("a").click (event) -> + link = event.target + isAnchor = link instanceof HTMLAnchorElement + + if (location.hash != "" || isAnchor) $("html,body").animate scrollTop: $(this).offset().top - $(".navbar").height() - 3 , 200 diff --git a/app/assets/javascripts/tree_show.js.coffee b/app/assets/javascripts/tree_show.js.coffee index 33300643dc4..ee43638c4b2 100644 --- a/app/assets/javascripts/tree_show.js.coffee +++ b/app/assets/javascripts/tree_show.js.coffee @@ -5,10 +5,12 @@ $(document).ready -> $("html, body").animate scrollTop: $(".navbar").offset().top - $(".navbar").height() , 200 - false - $("a").click (e) -> - unless location.hash is "" + $("a").click (event) -> + link = event.target + isAnchor = link instanceof HTMLAnchorElement + + if (location.hash != "" || isAnchor) $("html,body").animate scrollTop: $(this).offset().top - $(".navbar").height() - 3 , 200 -- cgit v1.2.1 From 5b32fda4b8698deda5402b8c640d36bf5cd69222 Mon Sep 17 00:00:00 2001 From: phortx Date: Tue, 13 Jan 2015 14:09:19 +0100 Subject: Add more label color suggestions --- app/helpers/labels_helper.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 19d688c4bb8..bf9d9fd2496 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -14,14 +14,27 @@ module LabelsHelper def suggested_colors [ + '#CC0033', + '#FF0000', '#D9534F', + '#D1D100', '#F0AD4E', + '#AD8D43', + '#0033CC', '#428BCA', + '#44AD8E', + '#A8D695', '#5CB85C', + '#69D100', + '#004E00', '#34495E', '#7F8C8D', + '#A295D6', + '#5843AD', '#8E44AD', - '#FFECDB' + '#AD4363', + '#FFECDB', + '#D10069' ] end -- cgit v1.2.1 From e64e0104fa97d6b420aa430018acfcfc3894044b Mon Sep 17 00:00:00 2001 From: phortx Date: Tue, 13 Jan 2015 15:47:23 +0100 Subject: Reorders label colors for better "rainbow" --- app/helpers/labels_helper.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index bf9d9fd2496..a2e6244e8b3 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -14,12 +14,6 @@ module LabelsHelper def suggested_colors [ - '#CC0033', - '#FF0000', - '#D9534F', - '#D1D100', - '#F0AD4E', - '#AD8D43', '#0033CC', '#428BCA', '#44AD8E', @@ -32,9 +26,15 @@ module LabelsHelper '#A295D6', '#5843AD', '#8E44AD', - '#AD4363', '#FFECDB', - '#D10069' + '#AD4363', + '#D10069', + '#CC0033', + '#FF0000', + '#D9534F', + '#D1D100', + '#F0AD4E', + '#AD8D43' ] end -- cgit v1.2.1 From ef933a4a962e4ab12c448241ad500e229a569f21 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 13 Jan 2015 10:34:01 -0800 Subject: Improve import page --- app/views/projects/new.html.haml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 88c1f725703..ccd02acd761 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -27,7 +27,7 @@ .col-sm-10 = link_to "#", class: 'js-toggle-button' do %i.fa.fa-upload - %span Import existing repository? + %span Import existing repository by URL .js-toggle-content.hide .form-group.import-url-data = f.label :import_url, class: 'control-label' do @@ -39,13 +39,14 @@ %br The import will time out after 4 minutes. For big repositories, use a clone/push combination. For SVN repositories, check #{link_to "this migrating from SVN doc.", "http://doc.gitlab.com/ce/workflow/migrating_from_svn.html"} - + - if github_import_enabled? .project-import.form-group .col-sm-2 .col-sm-10 - %i.fa.fa-bars - = link_to "Import projects from github", status_github_import_path + = link_to status_github_import_path do + %i.fa.fa-github + Import projects from GitHub %hr.prepend-botton-10 -- cgit v1.2.1 From 1e37e8924ab38cfbb2a838c2bc6589b03f72dbcd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 13 Jan 2015 11:44:17 -0800 Subject: Improve github import page UI --- app/controllers/github_imports_controller.rb | 2 +- app/views/github_imports/create.js.haml | 4 +-- app/views/github_imports/status.html.haml | 39 ++++++++++++++++------------ 3 files changed, 25 insertions(+), 20 deletions(-) (limited to 'app') diff --git a/app/controllers/github_imports_controller.rb b/app/controllers/github_imports_controller.rb index 97a2637b1eb..c96bef598be 100644 --- a/app/controllers/github_imports_controller.rb +++ b/app/controllers/github_imports_controller.rb @@ -2,7 +2,7 @@ class GithubImportsController < ApplicationController before_filter :github_auth, except: :callback rescue_from Octokit::Unauthorized, with: :github_unauthorized - + def callback token = client.auth_code.get_token(params[:code]).token current_user.github_access_token = token diff --git a/app/views/github_imports/create.js.haml b/app/views/github_imports/create.js.haml index e354c2da4dd..363dfeb4f54 100644 --- a/app/views/github_imports/create.js.haml +++ b/app/views/github_imports/create.js.haml @@ -13,6 +13,4 @@ - else :plain $("table.import-jobs tbody").prepend($("tr#repo_#{@repo_id}")) - $("tr#repo_#{@repo_id}").addClass("active").find(".import-actions").text("started") - - \ No newline at end of file + $("tr#repo_#{@repo_id}").addClass("active").find(".import-actions").html(" started") diff --git a/app/views/github_imports/status.html.haml b/app/views/github_imports/status.html.haml index 6a196cae39d..47c60e4d45f 100644 --- a/app/views/github_imports/status.html.haml +++ b/app/views/github_imports/status.html.haml @@ -1,31 +1,41 @@ %h3.page-title - Import repositories from github + %i.fa.fa-github + Import repositories from GitHub.com -%hr -%h4 +%p.light Select projects you want to import. - -%table.table.table-bordered.import-jobs + %span.pull-right + Reload to see the progress. + +%hr +%table.table.import-jobs %thead %tr %th From GitHub %th To GitLab %th Status %tbody - - @already_added_projects.each do |repo| - %tr{id: "repo_#{repo.id}", class: "#{project_status_css_class(repo.import_status)}"} - %td= repo.import_source - %td= repo.name_with_namespace - %td= repo.human_import_status_name - + - @already_added_projects.each do |project| + %tr{id: "repo_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td= project.import_source + %td + %strong= link_to project.name_with_namespace, project + %td + - if project.import_status == 'finished' + %span.cgreen + %i.fa.fa-check + done + - else + = project.human_import_status_name + - @repos.each do |repo| %tr{id: "repo_#{repo.id}"} %td= repo.full_name - %td.import-target + %td.import-target = repo.full_name %td.import-actions = button_tag "Add", class: "btn btn-add-to-import" - + :coffeescript $(".btn-add-to-import").click () -> @@ -36,6 +46,3 @@ new_namespace = tr.find(".import-target input").prop("value") tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) $.post "#{github_import_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' - - - -- cgit v1.2.1 From 63924efeaffbf2a359817ea5f26a4c6cf0dbfb30 Mon Sep 17 00:00:00 2001 From: Sheigutn Date: Tue, 13 Jan 2015 21:04:04 +0100 Subject: Add support for colored header on Android Lollipop with Chrome --- app/views/layouts/_head.html.haml | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index fa6aecb6661..17bcf8d3631 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -19,6 +19,7 @@ = csrf_meta_tags = include_gon %meta{name: 'viewport', content: 'width=device-width, initial-scale=1.0'} + %meta{name: 'theme-color', content: '#474D57'} = render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id') = render 'layouts/piwik' if extra_config.has_key?('piwik_url') && extra_config.has_key?('piwik_site_id') -- cgit v1.2.1 From 55947addc35fcf21f80c8c3e9a7a9840ba1193c0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 09:56:33 -0800 Subject: Revert "When anchor is clicked set the correct condition." This reverts commit 5140bd88247125e24090a45be920b509b0fcf958. --- app/assets/javascripts/project_show.js.coffee | 8 +++----- app/assets/javascripts/tree_show.js.coffee | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee index 581bd2edc20..73818ecd0ed 100644 --- a/app/assets/javascripts/project_show.js.coffee +++ b/app/assets/javascripts/project_show.js.coffee @@ -21,12 +21,10 @@ $(document).ready -> $("html, body").animate scrollTop: $(".navbar").offset().top - $(".navbar").height() , 200 + false - $("a").click (event) -> - link = event.target - isAnchor = link instanceof HTMLAnchorElement - - if (location.hash != "" || isAnchor) + $("a").click (e) -> + unless location.hash is "" $("html,body").animate scrollTop: $(this).offset().top - $(".navbar").height() - 3 , 200 diff --git a/app/assets/javascripts/tree_show.js.coffee b/app/assets/javascripts/tree_show.js.coffee index ee43638c4b2..33300643dc4 100644 --- a/app/assets/javascripts/tree_show.js.coffee +++ b/app/assets/javascripts/tree_show.js.coffee @@ -5,12 +5,10 @@ $(document).ready -> $("html, body").animate scrollTop: $(".navbar").offset().top - $(".navbar").height() , 200 + false - $("a").click (event) -> - link = event.target - isAnchor = link instanceof HTMLAnchorElement - - if (location.hash != "" || isAnchor) + $("a").click (e) -> + unless location.hash is "" $("html,body").animate scrollTop: $(this).offset().top - $(".navbar").height() - 3 , 200 -- cgit v1.2.1 From ff7f4a134e4d62a22a38409b7f71c582d86f53d8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 09:57:38 -0800 Subject: Revert "Scroll the readme anchors below the navbar." This reverts commit b1792d9e4c28366ecc896e36d22099ab564c150f. --- app/assets/javascripts/project_show.js.coffee | 15 --------------- app/assets/javascripts/tree_show.js.coffee | 14 -------------- 2 files changed, 29 deletions(-) delete mode 100644 app/assets/javascripts/tree_show.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee index 73818ecd0ed..02a7d7b731d 100644 --- a/app/assets/javascripts/project_show.js.coffee +++ b/app/assets/javascripts/project_show.js.coffee @@ -13,18 +13,3 @@ class @ProjectShow $("a[href=" + defaultView + "]").tab "show" else $("a[data-toggle='tab']:first").tab "show" - -$(document).ready -> - $(window).load (e) -> - e.preventDefault() - unless location.hash is "" - $("html, body").animate - scrollTop: $(".navbar").offset().top - $(".navbar").height() - , 200 - false - - $("a").click (e) -> - unless location.hash is "" - $("html,body").animate - scrollTop: $(this).offset().top - $(".navbar").height() - 3 - , 200 diff --git a/app/assets/javascripts/tree_show.js.coffee b/app/assets/javascripts/tree_show.js.coffee deleted file mode 100644 index 33300643dc4..00000000000 --- a/app/assets/javascripts/tree_show.js.coffee +++ /dev/null @@ -1,14 +0,0 @@ -$(document).ready -> - $(window).load (e) -> - e.preventDefault() - unless location.hash is "" - $("html, body").animate - scrollTop: $(".navbar").offset().top - $(".navbar").height() - , 200 - false - - $("a").click (e) -> - unless location.hash is "" - $("html,body").animate - scrollTop: $(this).offset().top - $(".navbar").height() - 3 - , 200 -- cgit v1.2.1 From 204b3c121cb038c5825dff3fa877ae2eea15403b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 15:22:31 -0800 Subject: Fix anchor issue with fixed navbar When use anchors - conetent gets hidden under navbar. This commit fixes with hack using margin+height combination --- app/assets/stylesheets/generic/timeline.scss | 11 +++++++++++ app/assets/stylesheets/generic/typography.scss | 15 +++++++++++++-- app/assets/stylesheets/main/layout.scss | 1 - app/assets/stylesheets/main/mixins.scss | 6 ++++-- app/assets/stylesheets/sections/header.scss | 2 -- app/assets/stylesheets/sections/notes.scss | 1 + app/views/layouts/_head_panel.html.haml | 2 +- 7 files changed, 30 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index 82ee41b71bd..cdd044290da 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -20,6 +20,17 @@ margin-bottom: 10px; clear: both; + /* Hack for anchors and fixed navbar */ + &[id] { + &:before { + content: ''; + display: block; + position: relative; + width: 0; + height: 3em; + margin-top: -3em; + } + } &:target { .timeline-entry-inner .timeline-content { diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss index 385a627b4be..3f63a0b92b1 100644 --- a/app/assets/stylesheets/generic/typography.scss +++ b/app/assets/stylesheets/generic/typography.scss @@ -98,8 +98,7 @@ a:focus { $size: 16px; position: absolute; right: 100%; - top: 50%; - margin-top: -$size/2; + bottom: 7px; margin-right: 0px; padding-right: 20px; display: inline-block; @@ -109,6 +108,18 @@ a:focus { background-size: contain; background-repeat: no-repeat; } + + /* Hack for anchors and fixed navbar */ + &[id] { + &:before { + content: ''; + display: block; + position: relative; + width: 0; + height: 3em; + margin-top: -3em; + } + } } ul { diff --git a/app/assets/stylesheets/main/layout.scss b/app/assets/stylesheets/main/layout.scss index 71522443f10..e44bccb0183 100644 --- a/app/assets/stylesheets/main/layout.scss +++ b/app/assets/stylesheets/main/layout.scss @@ -12,4 +12,3 @@ html { .container .content { margin: 0 0; } - diff --git a/app/assets/stylesheets/main/mixins.scss b/app/assets/stylesheets/main/mixins.scss index 5f83913b73b..c86f9be52d0 100644 --- a/app/assets/stylesheets/main/mixins.scss +++ b/app/assets/stylesheets/main/mixins.scss @@ -65,8 +65,10 @@ max-width: 100%; } - *:first-child { - margin-top: 0; + h1, h2, h3 { + &:first-child { + margin-top: 0; + } } code { padding: 0 4px; } diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index 32b0b10c649..a5098b6da5b 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -8,8 +8,6 @@ header { margin-bottom: 0; min-height: 40px; border: none; - position: fixed; - top: 0; width: 100%; .navbar-inner { diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 1550e30fe53..74945717a02 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -57,6 +57,7 @@ ul.notes { .note { display: block; position:relative; + .attachment { font-size: 14px; } diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index e98b8ec631d..bdf27562c26 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -1,4 +1,4 @@ -%header.navbar.navbar-static-top.navbar-gitlab +%header.navbar.navbar-fixed-top.navbar-gitlab .navbar-inner .container %div.app_logo -- cgit v1.2.1 From 46ed6fb58fc33d084751e77fe7d5521d108a1e43 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 17:22:36 -0800 Subject: Revert "Fix anchor issue with fixed navbar" This reverts commit 204b3c121cb038c5825dff3fa877ae2eea15403b. --- app/assets/stylesheets/generic/timeline.scss | 11 ----------- app/assets/stylesheets/generic/typography.scss | 15 ++------------- app/assets/stylesheets/main/layout.scss | 1 + app/assets/stylesheets/main/mixins.scss | 6 ++---- app/assets/stylesheets/sections/header.scss | 2 ++ app/assets/stylesheets/sections/notes.scss | 1 - app/views/layouts/_head_panel.html.haml | 2 +- 7 files changed, 8 insertions(+), 30 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index cdd044290da..82ee41b71bd 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -20,17 +20,6 @@ margin-bottom: 10px; clear: both; - /* Hack for anchors and fixed navbar */ - &[id] { - &:before { - content: ''; - display: block; - position: relative; - width: 0; - height: 3em; - margin-top: -3em; - } - } &:target { .timeline-entry-inner .timeline-content { diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss index 3f63a0b92b1..385a627b4be 100644 --- a/app/assets/stylesheets/generic/typography.scss +++ b/app/assets/stylesheets/generic/typography.scss @@ -98,7 +98,8 @@ a:focus { $size: 16px; position: absolute; right: 100%; - bottom: 7px; + top: 50%; + margin-top: -$size/2; margin-right: 0px; padding-right: 20px; display: inline-block; @@ -108,18 +109,6 @@ a:focus { background-size: contain; background-repeat: no-repeat; } - - /* Hack for anchors and fixed navbar */ - &[id] { - &:before { - content: ''; - display: block; - position: relative; - width: 0; - height: 3em; - margin-top: -3em; - } - } } ul { diff --git a/app/assets/stylesheets/main/layout.scss b/app/assets/stylesheets/main/layout.scss index e44bccb0183..71522443f10 100644 --- a/app/assets/stylesheets/main/layout.scss +++ b/app/assets/stylesheets/main/layout.scss @@ -12,3 +12,4 @@ html { .container .content { margin: 0 0; } + diff --git a/app/assets/stylesheets/main/mixins.scss b/app/assets/stylesheets/main/mixins.scss index c86f9be52d0..5f83913b73b 100644 --- a/app/assets/stylesheets/main/mixins.scss +++ b/app/assets/stylesheets/main/mixins.scss @@ -65,10 +65,8 @@ max-width: 100%; } - h1, h2, h3 { - &:first-child { - margin-top: 0; - } + *:first-child { + margin-top: 0; } code { padding: 0 4px; } diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index a5098b6da5b..32b0b10c649 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -8,6 +8,8 @@ header { margin-bottom: 0; min-height: 40px; border: none; + position: fixed; + top: 0; width: 100%; .navbar-inner { diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 74945717a02..1550e30fe53 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -57,7 +57,6 @@ ul.notes { .note { display: block; position:relative; - .attachment { font-size: 14px; } diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index bdf27562c26..e98b8ec631d 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -1,4 +1,4 @@ -%header.navbar.navbar-fixed-top.navbar-gitlab +%header.navbar.navbar-static-top.navbar-gitlab .navbar-inner .container %div.app_logo -- cgit v1.2.1 From c9bdc03bd9eeb4b38a2232eeb7bd9e1b14d76723 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 18:42:25 -0800 Subject: Improve layout css --- app/assets/stylesheets/generic/common.scss | 4 - app/assets/stylesheets/main/layout.scss | 7 + app/assets/stylesheets/sections/header.scss | 2 - app/assets/stylesheets/sections/nav_sidebar.scss | 161 +++++++++++++++++++++++ app/assets/stylesheets/sections/sidebar.scss | 161 ----------------------- app/views/layouts/_broadcast.html.haml | 4 - app/views/layouts/_head_panel.html.haml | 2 +- app/views/layouts/_public_head_panel.html.haml | 2 +- 8 files changed, 170 insertions(+), 173 deletions(-) create mode 100644 app/assets/stylesheets/sections/nav_sidebar.scss delete mode 100644 app/assets/stylesheets/sections/sidebar.scss (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index da708c96b09..cd6352db85f 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -273,10 +273,6 @@ img.emoji { height: 220px; } -.navless-container { - margin-top: 68px; -} - .description-block { @extend .light-well; @extend .light; diff --git a/app/assets/stylesheets/main/layout.scss b/app/assets/stylesheets/main/layout.scss index 71522443f10..1085e68b7d4 100644 --- a/app/assets/stylesheets/main/layout.scss +++ b/app/assets/stylesheets/main/layout.scss @@ -2,6 +2,10 @@ html { overflow-y: scroll; &.touch .tooltip { display: none !important; } + + body { + padding-top: 47px; + } } .container { @@ -13,3 +17,6 @@ html { margin: 0 0; } +.navless-container { + margin-top: 30px; +} diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index 32b0b10c649..a5098b6da5b 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -8,8 +8,6 @@ header { margin-bottom: 0; min-height: 40px; border: none; - position: fixed; - top: 0; width: 100%; .navbar-inner { diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss new file mode 100644 index 00000000000..edb5f90813f --- /dev/null +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -0,0 +1,161 @@ +.page-with-sidebar { + background: #F5F5F5; +} + +.sidebar-wrapper { + z-index: 99; + overflow-y: auto; + background: #F5F5F5; +} + +.content-wrapper { + width: 100%; + padding: 15px; + background: #FFF; +} + +.nav-sidebar { + margin: 0; + list-style: none; + + &.navbar-collapse { + padding: 0px !important; + } +} + +.nav-sidebar li a .count { + float: right; + background: #eee; + padding: 0px 8px; + @include border-radius(6px); +} + +.nav-sidebar li { + &.active a { + color: #111; + background: #EEE; + font-weight: bold; + + &.no-highlight { + background: none; + } + + i { + color: #444; + } + } +} + +.nav-sidebar li { + &.separate-item { + border-top: 1px solid #ddd; + padding-top: 10px; + margin-top: 10px; + } + + a { + color: #555; + display: block; + text-decoration: none; + padding: 6px 15px; + font-size: 13px; + line-height: 20px; + text-shadow: 0 1px 2px #FFF; + padding-left: 20px; + + &:hover { + text-decoration: none; + color: #333; + background: #DDD; + } + + &:active, &:focus { + text-decoration: none; + } + + i { + width: 20px; + color: #888; + margin-right: 23px; + } + } +} + +.sidebar-subnav { + margin-left: 0px; + padding-left: 0px; + + li { + list-style: none; + } +} + +@mixin expanded-sidebar { + .page-with-sidebar { + padding-left: 250px; + } + + .sidebar-wrapper { + width: 250px; + position: fixed; + left: 250px; + height: 100%; + margin-left: -250px; + border-right: 1px solid #EAEAEA; + + .nav-sidebar { + margin-top: 20px; + position: fixed; + top: 45px; + width: 250px; + } + } + + .content-wrapper { + padding: 20px; + } +} + +@mixin folded-sidebar { + .page-with-sidebar { + padding-left: 50px; + } + + .sidebar-wrapper { + width: 52px; + position: fixed; + top: 0; + left: 0; + height: 100%; + border-right: 1px solid #EAEAEA; + overflow-x: hidden; + + .nav-sidebar { + margin-top: 20px; + position: absolute; + top: 45px; + width: 52px; + + li a { + padding-left: 18px; + font-size: 14px; + padding: 10px 15px; + text-align: center; + + & > span { + display: none; + } + } + } + } +} + +@media (max-width: $screen-sm-max) { + @include folded-sidebar; +} + +@media(min-width: $screen-sm-max) { + @include expanded-sidebar; +} + + diff --git a/app/assets/stylesheets/sections/sidebar.scss b/app/assets/stylesheets/sections/sidebar.scss deleted file mode 100644 index 79441eba6db..00000000000 --- a/app/assets/stylesheets/sections/sidebar.scss +++ /dev/null @@ -1,161 +0,0 @@ -.page-with-sidebar { - background: #F5F5F5; -} - -.sidebar-wrapper { - z-index: 99; - overflow-y: auto; - background: #F5F5F5; -} - -.content-wrapper { - width: 100%; - padding: 15px; - background: #FFF; - margin-top: 48px; -} - -.nav-sidebar { - margin: 0; - list-style: none; - - &.navbar-collapse { - padding: 0px !important; - } -} - -.nav-sidebar li a .count { - float: right; - background: #eee; - padding: 0px 8px; - @include border-radius(6px); -} - -.nav-sidebar li { - &.active a { - color: #111; - background: #EEE; - font-weight: bold; - - &.no-highlight { - background: none; - } - - i { - color: #444; - } - } -} - -.nav-sidebar li { - &.separate-item { - border-top: 1px solid #ddd; - padding-top: 10px; - margin-top: 10px; - } - - a { - color: #555; - display: block; - text-decoration: none; - padding: 6px 15px; - font-size: 13px; - line-height: 20px; - text-shadow: 0 1px 2px #FFF; - padding-left: 20px; - - &:hover { - text-decoration: none; - color: #333; - background: #DDD; - } - - &:active, &:focus { - text-decoration: none; - } - - i { - width: 20px; - color: #888; - margin-right: 23px; - } - } -} - -.sidebar-subnav { - margin-left: 0px; - padding-left: 0px; - - li { - list-style: none; - } -} - -@mixin expanded-sidebar { - .page-with-sidebar { - padding-left: 250px; - } - - .sidebar-wrapper { - width: 250px; - position: fixed; - left: 250px; - height: 100%; - margin-left: -250px; - border-right: 1px solid #EAEAEA; - - .nav-sidebar { - margin-top: 20px; - position: fixed; - top: 45px; - width: 250px; - } - } - - .content-wrapper { - padding: 20px; - } -} - -@mixin folded-sidebar { - .page-with-sidebar { - padding-left: 50px; - } - - .sidebar-wrapper { - width: 52px; - position: fixed; - top: 0; - left: 0; - height: 100%; - border-right: 1px solid #EAEAEA; - overflow-x: hidden; - - .nav-sidebar { - margin-top: 20px; - position: absolute; - top: 45px; - width: 52px; - - li a { - padding-left: 18px; - font-size: 14px; - padding: 10px 15px; - text-align: center; - - & > span { - display: none; - } - } - } - } -} - -@media (max-width: $screen-sm-max) { - @include folded-sidebar; -} - -@media(min-width: $screen-sm-max) { - @include expanded-sidebar; -} - diff --git a/app/views/layouts/_broadcast.html.haml b/app/views/layouts/_broadcast.html.haml index e589e34dd23..e7d477c225e 100644 --- a/app/views/layouts/_broadcast.html.haml +++ b/app/views/layouts/_broadcast.html.haml @@ -2,7 +2,3 @@ .broadcast-message{ style: broadcast_styling(broadcast_message) } %i.fa.fa-bullhorn = broadcast_message.message - :css - .sidebar-wrapper .nav-sidebar { - margin-top: 58px; - } diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index e98b8ec631d..bdf27562c26 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -1,4 +1,4 @@ -%header.navbar.navbar-static-top.navbar-gitlab +%header.navbar.navbar-fixed-top.navbar-gitlab .navbar-inner .container %div.app_logo diff --git a/app/views/layouts/_public_head_panel.html.haml b/app/views/layouts/_public_head_panel.html.haml index 1d5bbb2aade..e912fea2aee 100644 --- a/app/views/layouts/_public_head_panel.html.haml +++ b/app/views/layouts/_public_head_panel.html.haml @@ -1,4 +1,4 @@ -%header.navbar.navbar-static-top.navbar-gitlab +%header.navbar.navbar-fixed-top.navbar-gitlab .navbar-inner .container %div.app_logo -- cgit v1.2.1 From 8bc65f6d4bc665a1bde9ae2863eb884050acff1d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 19:39:10 -0800 Subject: Fix anchors being hidden under fixed navbar issue --- app/assets/javascripts/application.js.coffee | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 4cda8b75d8e..6d038f772e9 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -109,9 +109,19 @@ window.unbindEvents = -> $(document).unbind('scroll') $(document).off('scroll') +window.shiftWindow = -> + scrollBy 0, -50 + document.addEventListener("page:fetch", unbindEvents) +# Scroll the window to avoid the topnav bar +# https://github.com/twitter/bootstrap/issues/1768 +if location.hash + setTimeout shiftWindow, 1 +window.addEventListener "hashchange", shiftWindow + $ -> + # Click a .one_click_select field, select the contents $(".one_click_select").on 'click', -> $(@).select() -- cgit v1.2.1 From f8b97b454b8eae343bd7ea6e92fd2257eeae45b0 Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Wed, 14 Jan 2015 21:12:16 -0800 Subject: Make view link come first so I don't have to mouse to the end of the email line. --- app/views/layouts/notify.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index da451961327..e81cf9e5bf6 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -24,8 +24,8 @@ %p \— %br - - if @project - You're receiving this notification because you are a member of the #{link_to_unless @target_url, @project.name_with_namespace, project_url(@project)} project team. - if @target_url #{link_to "View it on GitLab", @target_url} = email_action @target_url + - if @project + You're receiving this notification because you are a member of the #{link_to_unless @target_url, @project.name_with_namespace, project_url(@project)} project team. -- cgit v1.2.1 From 80e784edb859cbe208721a330b7e37dbffc4331b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 21:43:31 -0800 Subject: Fix image drag-n-drop to diff comments --- app/assets/javascripts/dropzone_input.js.coffee | 242 ++++++++++++++++++++++++ app/assets/javascripts/markdown_area.js.coffee | 241 ----------------------- app/assets/javascripts/notes.js.coffee | 2 + 3 files changed, 244 insertions(+), 241 deletions(-) create mode 100644 app/assets/javascripts/dropzone_input.js.coffee delete mode 100644 app/assets/javascripts/markdown_area.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee new file mode 100644 index 00000000000..a0f0d98a8dc --- /dev/null +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -0,0 +1,242 @@ +class @DropzoneInput + constructor: (form) -> + Dropzone.autoDiscover = false + alertClass = "alert alert-danger alert-dismissable div-dropzone-alert" + alertAttr = "class=\"close\" data-dismiss=\"alert\"" + "aria-hidden=\"true\"" + divHover = "
    " + divSpinner = "
    " + divAlert = "
    " + iconPicture = "" + iconSpinner = "" + btnAlert = "" + project_image_path_upload = window.project_image_path_upload or null + + form_textarea = $(form).find("textarea.markdown-area") + form_textarea.wrap "
    " + + form_dropzone = $(form).find('.div-dropzone') + form_dropzone.parent().addClass "div-dropzone-wrapper" + form_dropzone.append divHover + $(".div-dropzone-hover").append iconPicture + form_dropzone.append divSpinner + $(".div-dropzone-spinner").append iconSpinner + $(".div-dropzone-spinner").css + "opacity": 0 + "display": "none" + + # Preview button + $(document).off "click", ".js-md-preview-button" + $(document).on "click", ".js-md-preview-button", (e) -> + ### + Shows the Markdown preview. + + Lets the server render GFM into Html and displays it. + ### + e.preventDefault() + form = $(this).closest("form") + # toggle tabs + form.find(".js-md-write-button").parent().removeClass "active" + form.find(".js-md-preview-button").parent().addClass "active" + + # toggle content + form.find(".md-write-holder").hide() + form.find(".md-preview-holder").show() + + preview = form.find(".js-md-preview") + mdText = form.find(".markdown-area").val() + if mdText.trim().length is 0 + preview.text "Nothing to preview." + else + preview.text "Loading..." + $.get($(this).data("url"), + md_text: mdText + ).success (previewData) -> + preview.html previewData + + # Write button + $(document).off "click", ".js-md-write-button" + $(document).on "click", ".js-md-write-button", (e) -> + ### + Shows the Markdown textarea. + ### + e.preventDefault() + form = $(this).closest("form") + # toggle tabs + form.find(".js-md-write-button").parent().addClass "active" + form.find(".js-md-preview-button").parent().removeClass "active" + + # toggle content + form.find(".md-write-holder").show() + form.find(".md-preview-holder").hide() + + dropzone = form_dropzone.dropzone( + url: project_image_path_upload + dictDefaultMessage: "" + clickable: true + paramName: "markdown_img" + maxFilesize: 10 + uploadMultiple: false + acceptedFiles: "image/jpg,image/jpeg,image/gif,image/png" + headers: + "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") + + previewContainer: false + + processing: -> + $(".div-dropzone-alert").alert "close" + + dragover: -> + form_textarea.addClass "div-dropzone-focus" + form.find(".div-dropzone-hover").css "opacity", 0.7 + return + + dragleave: -> + form_textarea.removeClass "div-dropzone-focus" + form.find(".div-dropzone-hover").css "opacity", 0 + return + + drop: -> + form_textarea.removeClass "div-dropzone-focus" + form.find(".div-dropzone-hover").css "opacity", 0 + form_textarea.focus() + return + + success: (header, response) -> + child = $(dropzone[0]).children("textarea") + $(child).val $(child).val() + formatLink(response.link) + "\n" + return + + error: (temp, errorMessage) -> + checkIfMsgExists = $(".error-alert").children().length + if checkIfMsgExists is 0 + $(".error-alert").append divAlert + $(".div-dropzone-alert").append btnAlert + errorMessage + return + + sending: -> + form_dropzone.find(".div-dropzone-spinner").css + "opacity": 0.7 + "display": "inherit" + return + + complete: -> + $(".dz-preview").remove() + $(".markdown-area").trigger "input" + $(".div-dropzone-spinner").css + "opacity": 0 + "display": "none" + return + ) + + child = $(dropzone[0]).children("textarea") + + formatLink = (str) -> + "![" + str.alt + "](" + str.url + ")" + + handlePaste = (e) -> + e.preventDefault() + my_event = e.originalEvent + + if my_event.clipboardData and my_event.clipboardData.items + processItem(my_event) + + processItem = (e) -> + image = isImage(e) + if image + filename = getFilename(e) or "image.png" + text = "{{" + filename + "}}" + pasteText(text) + uploadFile image.getAsFile(), filename + + else + text = e.clipboardData.getData("text/plain") + pasteText(text) + + isImage = (data) -> + i = 0 + while i < data.clipboardData.items.length + item = data.clipboardData.items[i] + if item.type.indexOf("image") isnt -1 + return item + i++ + return false + + pasteText = (text) -> + caretStart = $(child)[0].selectionStart + caretEnd = $(child)[0].selectionEnd + textEnd = $(child).val().length + + beforeSelection = $(child).val().substring 0, caretStart + afterSelection = $(child).val().substring caretEnd, textEnd + $(child).val beforeSelection + text + afterSelection + form_textarea.trigger "input" + + getFilename = (e) -> + if window.clipboardData and window.clipboardData.getData + value = window.clipboardData.getData("Text") + else if e.clipboardData and e.clipboardData.getData + value = e.clipboardData.getData("text/plain") + + value = value.split("\r") + value.first() + + uploadFile = (item, filename) -> + formData = new FormData() + formData.append "markdown_img", item, filename + $.ajax + url: project_image_path_upload + type: "POST" + data: formData + dataType: "json" + processData: false + contentType: false + headers: + "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") + + beforeSend: -> + showSpinner() + closeAlertMessage() + + success: (e, textStatus, response) -> + insertToTextArea(filename, formatLink(response.responseJSON.link)) + + error: (response) -> + showError(response.responseJSON.message) + + complete: -> + closeSpinner() + + insertToTextArea = (filename, url) -> + $(child).val (index, val) -> + val.replace("{{" + filename + "}}", url + "\n") + + appendToTextArea = (url) -> + $(child).val (index, val) -> + val + url + "\n" + + showSpinner = (e) -> + form.find(".div-dropzone-spinner").css + "opacity": 0.7 + "display": "inherit" + + closeSpinner = -> + form.find(".div-dropzone-spinner").css + "opacity": 0 + "display": "none" + + showError = (message) -> + checkIfMsgExists = $(".error-alert").children().length + if checkIfMsgExists is 0 + $(".error-alert").append divAlert + $(".div-dropzone-alert").append btnAlert + message + + closeAlertMessage = -> + form.find(".div-dropzone-alert").alert "close" + + form.find(".markdown-selector").click (e) -> + e.preventDefault() + $(@).closest('.gfm-form').find('.div-dropzone').click() + return + + formatLink: (str) -> + "![" + str.alt + "](" + str.url + ")" diff --git a/app/assets/javascripts/markdown_area.js.coffee b/app/assets/javascripts/markdown_area.js.coffee deleted file mode 100644 index 0ca7070dc8b..00000000000 --- a/app/assets/javascripts/markdown_area.js.coffee +++ /dev/null @@ -1,241 +0,0 @@ -formatLink = (str) -> - "![" + str.alt + "](" + str.url + ")" - -$(document).ready -> - alertClass = "alert alert-danger alert-dismissable div-dropzone-alert" - alertAttr = "class=\"close\" data-dismiss=\"alert\"" + "aria-hidden=\"true\"" - divHover = "
    " - divSpinner = "
    " - divAlert = "
    " - iconPicture = "" - iconSpinner = "" - btnAlert = "" - project_image_path_upload = window.project_image_path_upload or null - - $("textarea.markdown-area").wrap "
    " - - $(".div-dropzone").parent().addClass "div-dropzone-wrapper" - - $(".div-dropzone").append divHover - $(".div-dropzone-hover").append iconPicture - $(".div-dropzone").append divSpinner - $(".div-dropzone-spinner").append iconSpinner - $(".div-dropzone-spinner").css - "opacity": 0 - "display": "none" - - # Preview button - $(document).off "click", ".js-md-preview-button" - $(document).on "click", ".js-md-preview-button", (e) -> - ### - Shows the Markdown preview. - - Lets the server render GFM into Html and displays it. - ### - e.preventDefault() - form = $(this).closest("form") - # toggle tabs - form.find(".js-md-write-button").parent().removeClass "active" - form.find(".js-md-preview-button").parent().addClass "active" - - # toggle content - form.find(".md-write-holder").hide() - form.find(".md-preview-holder").show() - - preview = form.find(".js-md-preview") - mdText = form.find(".markdown-area").val() - if mdText.trim().length is 0 - preview.text "Nothing to preview." - else - preview.text "Loading..." - $.get($(this).data("url"), - md_text: mdText - ).success (previewData) -> - preview.html previewData - - # Write button - $(document).off "click", ".js-md-write-button" - $(document).on "click", ".js-md-write-button", (e) -> - ### - Shows the Markdown textarea. - ### - e.preventDefault() - form = $(this).closest("form") - # toggle tabs - form.find(".js-md-write-button").parent().addClass "active" - form.find(".js-md-preview-button").parent().removeClass "active" - - # toggle content - form.find(".md-write-holder").show() - form.find(".md-preview-holder").hide() - - dropzone = $(".div-dropzone").dropzone( - url: project_image_path_upload - dictDefaultMessage: "" - clickable: true - paramName: "markdown_img" - maxFilesize: 10 - uploadMultiple: false - acceptedFiles: "image/jpg,image/jpeg,image/gif,image/png" - headers: - "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") - - previewContainer: false - - processing: -> - $(".div-dropzone-alert").alert "close" - - dragover: -> - $(".div-dropzone > textarea").addClass "div-dropzone-focus" - $(".div-dropzone-hover").css "opacity", 0.7 - return - - dragleave: -> - $(".div-dropzone > textarea").removeClass "div-dropzone-focus" - $(".div-dropzone-hover").css "opacity", 0 - return - - drop: -> - $(".div-dropzone > textarea").removeClass "div-dropzone-focus" - $(".div-dropzone-hover").css "opacity", 0 - $(".div-dropzone > textarea").focus() - return - - success: (header, response) -> - child = $(dropzone[0]).children("textarea") - $(child).val $(child).val() + formatLink(response.link) + "\n" - return - - error: (temp, errorMessage) -> - checkIfMsgExists = $(".error-alert").children().length - if checkIfMsgExists is 0 - $(".error-alert").append divAlert - $(".div-dropzone-alert").append btnAlert + errorMessage - return - - sending: -> - $(".div-dropzone-spinner").css - "opacity": 0.7 - "display": "inherit" - return - - complete: -> - $(".dz-preview").remove() - $(".markdown-area").trigger "input" - $(".div-dropzone-spinner").css - "opacity": 0 - "display": "none" - return - ) - - child = $(dropzone[0]).children("textarea") - - formatLink = (str) -> - "![" + str.alt + "](" + str.url + ")" - - handlePaste = (e) -> - e.preventDefault() - my_event = e.originalEvent - - if my_event.clipboardData and my_event.clipboardData.items - processItem(my_event) - - processItem = (e) -> - image = isImage(e) - if image - filename = getFilename(e) or "image.png" - text = "{{" + filename + "}}" - pasteText(text) - uploadFile image.getAsFile(), filename - - else - text = e.clipboardData.getData("text/plain") - pasteText(text) - - isImage = (data) -> - i = 0 - while i < data.clipboardData.items.length - item = data.clipboardData.items[i] - if item.type.indexOf("image") isnt -1 - return item - i++ - return false - - pasteText = (text) -> - caretStart = $(child)[0].selectionStart - caretEnd = $(child)[0].selectionEnd - textEnd = $(child).val().length - - beforeSelection = $(child).val().substring 0, caretStart - afterSelection = $(child).val().substring caretEnd, textEnd - $(child).val beforeSelection + text + afterSelection - $(".markdown-area").trigger "input" - - getFilename = (e) -> - if window.clipboardData and window.clipboardData.getData - value = window.clipboardData.getData("Text") - else if e.clipboardData and e.clipboardData.getData - value = e.clipboardData.getData("text/plain") - - value = value.split("\r") - value.first() - - uploadFile = (item, filename) -> - formData = new FormData() - formData.append "markdown_img", item, filename - $.ajax - url: project_image_path_upload - type: "POST" - data: formData - dataType: "json" - processData: false - contentType: false - headers: - "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") - - beforeSend: -> - showSpinner() - closeAlertMessage() - - success: (e, textStatus, response) -> - insertToTextArea(filename, formatLink(response.responseJSON.link)) - - error: (response) -> - showError(response.responseJSON.message) - - complete: -> - closeSpinner() - - insertToTextArea = (filename, url) -> - $(child).val (index, val) -> - val.replace("{{" + filename + "}}", url + "\n") - - appendToTextArea = (url) -> - $(child).val (index, val) -> - val + url + "\n" - - showSpinner = (e) -> - $(".div-dropzone-spinner").css - "opacity": 0.7 - "display": "inherit" - - closeSpinner = -> - $(".div-dropzone-spinner").css - "opacity": 0 - "display": "none" - - showError = (message) -> - checkIfMsgExists = $(".error-alert").children().length - if checkIfMsgExists is 0 - $(".error-alert").append divAlert - $(".div-dropzone-alert").append btnAlert + message - - closeAlertMessage = -> - $(".div-dropzone-alert").alert "close" - - $(".markdown-selector").click (e) -> - e.preventDefault() - $(@).closest('.gfm-form').find('.div-dropzone').click() - return - - return diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 4d1c81d91d4..ff2cc7c21d2 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -219,6 +219,7 @@ class @Notes setupNoteForm: (form) -> disableButtonIfEmptyField form.find(".js-note-text"), form.find(".js-comment-button") form.removeClass "js-new-note-form" + form.find('.div-dropzone').remove() # setup preview buttons form.find(".js-md-write-button, .js-md-preview-button").tooltip placement: "left" @@ -233,6 +234,7 @@ class @Notes # remove notify commit author checkbox for non-commit notes form.find(".js-notify-commit-author").remove() if form.find("#note_noteable_type").val() isnt "Commit" GitLab.GfmAutoComplete.setup() + new DropzoneInput(form) form.show() -- cgit v1.2.1 From 4babc50eb706834b7707f1cf11849df1d5be9b86 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 22:42:58 -0800 Subject: Huge set of fixes for comments logic --- app/assets/javascripts/notes.js.coffee | 11 +- app/assets/stylesheets/main/mixins.scss | 4 - app/assets/stylesheets/sections/markdown_area.scss | 9 ++ app/assets/stylesheets/sections/note_form.scss | 162 ++++++++++++++++++++ app/assets/stylesheets/sections/notes.scss | 166 --------------------- app/views/projects/notes/_edit_form.html.haml | 22 +++ app/views/projects/notes/_form.html.haml | 5 +- app/views/projects/notes/_note.html.haml | 22 +-- 8 files changed, 207 insertions(+), 194 deletions(-) create mode 100644 app/assets/stylesheets/sections/markdown_area.scss create mode 100644 app/assets/stylesheets/sections/note_form.scss create mode 100644 app/views/projects/notes/_edit_form.html.haml (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index ff2cc7c21d2..fcaaa81eaad 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -261,8 +261,10 @@ class @Notes Updates the current note field. ### updateNote: (xhr, note, status) => - note_li = $("#note_" + note.id) + note_li = $(".note-row-" + note.id) note_li.replaceWith(note.html) + note_li.find('.note-edit-form').hide() + note_li.find('.note-text').show() code = "#note_" + note.id + " .highlight pre code" $(code).each (i, e) -> hljs.highlightBlock(e) @@ -278,11 +280,16 @@ class @Notes e.preventDefault() note = $(this).closest(".note") note.find(".note-text").hide() + form = note.find(".note-edit-form") + form.find('.div-dropzone').remove() # Show the attachment delete link note.find(".js-note-attachment-delete").show() + + # Setup markdown form GitLab.GfmAutoComplete.setup() - form = note.find(".note-edit-form") + new DropzoneInput(form) + form.show() textarea = form.find("textarea") textarea.focus() diff --git a/app/assets/stylesheets/main/mixins.scss b/app/assets/stylesheets/main/mixins.scss index 5f83913b73b..ebf68850f98 100644 --- a/app/assets/stylesheets/main/mixins.scss +++ b/app/assets/stylesheets/main/mixins.scss @@ -65,10 +65,6 @@ max-width: 100%; } - *:first-child { - margin-top: 0; - } - code { padding: 0 4px; } h1 { diff --git a/app/assets/stylesheets/sections/markdown_area.scss b/app/assets/stylesheets/sections/markdown_area.scss new file mode 100644 index 00000000000..8ee8eaa4ee7 --- /dev/null +++ b/app/assets/stylesheets/sections/markdown_area.scss @@ -0,0 +1,9 @@ +.markdown-area { + background: #FFF; + border: 1px solid #ddd; + min-height: 100px; + padding: 5px; + font-size: 14px; + box-shadow: none; + width: 100%; +} diff --git a/app/assets/stylesheets/sections/note_form.scss b/app/assets/stylesheets/sections/note_form.scss new file mode 100644 index 00000000000..61eb515faee --- /dev/null +++ b/app/assets/stylesheets/sections/note_form.scss @@ -0,0 +1,162 @@ +/** + * Note Form + */ + +.comment-btn { + @extend .btn-create; +} +.reply-btn { + @extend .btn-primary; +} +.diff-file .diff-content { + tr.line_holder:hover { + &> td.line_content { + background: $hover !important; + border-color: darken($hover, 10%) !important; + } + &> td.new_line, + &> td.old_line { + background: darken($hover, 4%) !important; + border-color: darken($hover, 10%) !important; + } + } + + tr.line_holder:hover > td .line_note_link { + opacity: 1.0; + filter: alpha(opacity=100); + } +} +.diff-file, +.discussion { + .new_note { + margin: 0; + border: none; + } +} +.new_note { + display: none; +} + +.new_note, .edit_note { + .buttons { + float: left; + margin-top: 8px; + } + .clearfix { + margin-bottom: 0; + } + + .note-preview-holder { + > p { + overflow-x: auto; + } + } + + .note_text { + width: 100%; + } +} + +/* loading indicator */ +.notes-busy { + margin: 18px; +} + +.note-image-attach { + @extend .col-md-4; + @extend .thumbnail; + margin-left: 45px; + float: none; +} + +.common-note-form { + margin: 0; + background: #F9F9F9; + padding: 5px; + border: 1px solid #DDD; +} + +.note-form-actions { + background: #F9F9F9; + height: 45px; + + .note-form-option { + margin-top: 8px; + margin-left: 30px; + @extend .pull-left; + } + + .js-notify-commit-author { + float: left; + } + + .write-preview-btn { + // makes the "absolute" position for links relative to this + position: relative; + + // preview/edit buttons + > a { + position: absolute; + right: 5px; + top: 8px; + } + } +} + +.note-edit-form { + display: none; + font-size: 13px; + + .form-actions { + padding-left: 20px; + + .btn-save { + float: left; + } + + .note-form-option { + float: left; + padding: 2px 0 0 25px; + } + } +} + +.js-note-attachment-delete { + display: none; +} + +.parallel-comment { + padding: 6px; +} + +.error-alert > .alert { + margin-top: 5px; + margin-bottom: 5px; +} + +.discussion-body, +.diff-file { + .notes .note { + border-color: #ddd; + padding: 10px 15px; + } + + .discussion-reply-holder { + background: #f9f9f9; + padding: 10px 15px; + border-top: 1px solid #DDD; + } +} + +.discussion-notes-count { + font-size: 16px; +} + +.edit_note { + .markdown-area { + min-height: 140px; + } + .note-form-actions { + background: #FFF; + } +} diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 1550e30fe53..117e5e7f977 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -190,169 +190,3 @@ ul.notes { } } -/** - * Note Form - */ - -.comment-btn { - @extend .btn-create; -} -.reply-btn { - @extend .btn-primary; -} -.diff-file .diff-content { - tr.line_holder:hover { - &> td.line_content { - background: $hover !important; - border-color: darken($hover, 10%) !important; - } - &> td.new_line, - &> td.old_line { - background: darken($hover, 4%) !important; - border-color: darken($hover, 10%) !important; - } - } - - tr.line_holder:hover > td .line_note_link { - opacity: 1.0; - filter: alpha(opacity=100); - } -} -.diff-file, -.discussion { - .new_note { - margin: 0; - border: none; - } -} -.new_note { - display: none; - .buttons { - float: left; - margin-top: 8px; - } - .clearfix { - margin-bottom: 0; - } - - .note_text { - background: #FFF; - border: 1px solid #ddd; - min-height: 100px; - padding: 5px; - font-size: 14px; - box-shadow: none; - } - - .note-preview-holder { - > p { - overflow-x: auto; - } - } - - .note_text { - width: 100%; - } -} - -/* loading indicator */ -.notes-busy { - margin: 18px; -} - -.note-image-attach { - @extend .col-md-4; - @extend .thumbnail; - margin-left: 45px; - float: none; -} - -.common-note-form { - margin: 0; - background: #F9F9F9; - padding: 5px; - border: 1px solid #DDD; -} - -.note-form-actions { - background: #F9F9F9; - height: 45px; - - .note-form-option { - margin-top: 8px; - margin-left: 30px; - @extend .pull-left; - } - - .js-notify-commit-author { - float: left; - } - - .write-preview-btn { - // makes the "absolute" position for links relative to this - position: relative; - - // preview/edit buttons - > a { - position: absolute; - right: 5px; - top: 8px; - } - } -} - -.note-edit-form { - display: none; - - .note_text { - border: 1px solid #DDD; - box-shadow: none; - font-size: 14px; - height: 80px; - width: 100%; - } - - .form-actions { - padding-left: 20px; - - .btn-save { - float: left; - } - - .note-form-option { - float: left; - padding: 2px 0 0 25px; - } - } -} - -.js-note-attachment-delete { - display: none; -} - -.parallel-comment { - padding: 6px; -} - -.error-alert > .alert { - margin-top: 5px; - margin-bottom: 5px; -} - -.discussion-body, -.diff-file { - .notes .note { - border-color: #ddd; - padding: 10px 15px; - } - - .discussion-reply-holder { - background: #f9f9f9; - padding: 10px 15px; - border-top: 1px solid #DDD; - } -} - -.discussion-notes-count { - font-size: 16px; -} diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml new file mode 100644 index 00000000000..a4520787a85 --- /dev/null +++ b/app/views/projects/notes/_edit_form.html.haml @@ -0,0 +1,22 @@ +.note-edit-form + = form_for note, url: project_note_path(@project, note), method: :put, remote: true, authenticity_token: true do |f| + = render layout: 'projects/md_preview' do + = render 'projects/zen', f: f, attr: :note, + classes: 'note_text js-note-text' + + .light.clearfix + .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} + .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. + + .note-form-actions + .buttons + = f.submit 'Save Comment', class: "btn btn-primary btn-save btn-grouped js-comment-button" + = link_to 'Cancel', "#", class: "btn btn-cancel note-edit-cancel" + + .note-form-option.hidden-xs + %a.choose-btn.btn.js-choose-note-attachment-button + %i.fa.fa-paperclip + %span Choose File ... +   + %span.file_name.js-attachment-filename + = f.file_field :attachment, class: "js-note-attachment-input hidden" diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 47ffe1fd2f3..76525966dc3 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -7,7 +7,8 @@ = render layout: 'projects/md_preview' do = render 'projects/zen', f: f, attr: :note, - classes: 'note_text js-note-text' + classes: 'note_text js-note-text' + .light.clearfix .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. @@ -24,7 +25,7 @@ %i.fa.fa-paperclip %span Choose File ...   - %span.file_name.js-attachment-filename File name... + %span.file_name.js-attachment-filename = f.file_field :attachment, class: "js-note-attachment-input hidden" :javascript diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 80e7342455b..691c169b620 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -1,4 +1,4 @@ -%li.timeline-entry{ id: dom_id(note), class: [dom_class(note), ('system-note' if note.system)], data: { discussion: note.discussion_id } } +%li.timeline-entry{ id: dom_id(note), class: [dom_class(note), "note-row-#{note.id}", ('system-note' if note.system)], data: { discussion: note.discussion_id } } .timeline-entry-inner .timeline-icon - if note.system @@ -42,25 +42,7 @@ .note-text = preserve do = markdown(note.note, {no_header_anchors: true}) - - .note-edit-form - = form_for note, url: project_note_path(@project, note), method: :put, remote: true, authenticity_token: true do |f| - = render layout: 'projects/md_preview' do - = f.text_area :note, class: 'note_text js-note-text js-gfm-input turn-on' - - .form-actions.clearfix - = f.submit 'Save changes', class: "btn btn-primary btn-save js-comment-button" - - .note-form-option - %a.choose-btn.btn.js-choose-note-attachment-button - %i.fa.fa-paperclip - %span Choose File ... -   - %span.file_name.js-attachment-filename File name... - = f.file_field :attachment, class: "js-note-attachment-input hidden" - - = link_to 'Cancel', "#", class: "btn btn-cancel note-edit-cancel" - + = render 'projects/notes/edit_form', note: note - if note.attachment.url .note-attachment -- cgit v1.2.1 From 23498337b17fe5f94bd87884ee6773187ec993a8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 23:09:30 -0800 Subject: Clone comment form on edit. Fixes bug with disappearing textarea or cancel of edit --- app/assets/javascripts/notes.js.coffee | 9 ++++++--- app/assets/stylesheets/sections/note_form.scss | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index fcaaa81eaad..d1935d1d007 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -280,7 +280,10 @@ class @Notes e.preventDefault() note = $(this).closest(".note") note.find(".note-text").hide() - form = note.find(".note-edit-form") + note.find(".note-header").hide() + base_form = note.find(".note-edit-form") + form = base_form.clone().insertAfter(base_form) + form.addClass('current-note-edit-form') form.find('.div-dropzone').remove() # Show the attachment delete link @@ -304,8 +307,8 @@ class @Notes e.preventDefault() note = $(this).closest(".note") note.find(".note-text").show() - note.find(".js-note-attachment-delete").hide() - note.find(".note-edit-form").hide() + note.find(".note-header").show() + note.find(".current-note-edit-form").remove() ### Called in response to deleting a note of any kind. diff --git a/app/assets/stylesheets/sections/note_form.scss b/app/assets/stylesheets/sections/note_form.scss index 61eb515faee..cf1bd09e8e1 100644 --- a/app/assets/stylesheets/sections/note_form.scss +++ b/app/assets/stylesheets/sections/note_form.scss @@ -157,6 +157,6 @@ min-height: 140px; } .note-form-actions { - background: #FFF; + background: transparent; } } -- cgit v1.2.1 From 3333bd46085230ddbfd2a2208a7811507fc66317 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 14 Jan 2015 23:18:21 -0800 Subject: Explicitly enable drag-n-drop for issue/mr/wiki markdown forms --- app/assets/javascripts/dispatcher.js.coffee | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index e8b71a71945..db1c529d51e 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -33,11 +33,13 @@ class Dispatcher GitLab.GfmAutoComplete.setup() shortcut_handler = new ShortcutsNavigation() new ZenMode() + new DropzoneInput($('.issue-form')) when 'projects:merge_requests:new', 'projects:merge_requests:edit' GitLab.GfmAutoComplete.setup() new Diff() shortcut_handler = new ShortcutsNavigation() new ZenMode() + new DropzoneInput($('.merge-request-form')) when 'projects:merge_requests:show' new Diff() shortcut_handler = new ShortcutsIssueable() @@ -108,6 +110,7 @@ class Dispatcher new Wikis() shortcut_handler = new ShortcutsNavigation() new ZenMode() + new DropzoneInput($('.wiki-form')) when 'snippets', 'labels', 'graphs' shortcut_handler = new ShortcutsNavigation() when 'team_members', 'deploy_keys', 'hooks', 'services', 'protected_branches' -- cgit v1.2.1 From cad685e70b704a98778aa11a5f3c3448334367ff Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Jan 2015 00:15:12 -0800 Subject: Refactor zen mode. Make it works in diffs --- app/assets/javascripts/dispatcher.js.coffee | 1 + app/assets/javascripts/zen_mode.js.coffee | 12 ++- app/assets/stylesheets/generic/forms.scss | 133 ------------------------- app/assets/stylesheets/generic/zen.scss | 98 ++++++++++++++++++ app/assets/stylesheets/sections/note_form.scss | 9 ++ app/views/projects/_zen.html.haml | 9 +- app/views/projects/notes/_edit_form.html.haml | 2 +- app/views/projects/notes/_form.html.haml | 2 +- 8 files changed, 125 insertions(+), 141 deletions(-) create mode 100644 app/assets/stylesheets/generic/zen.scss (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index db1c529d51e..e5349d80e94 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -46,6 +46,7 @@ class Dispatcher new ZenMode() when "projects:merge_requests:diffs" new Diff() + new ZenMode() when 'projects:merge_requests:index' shortcut_handler = new ShortcutsNavigation() when 'dashboard:show' diff --git a/app/assets/javascripts/zen_mode.js.coffee b/app/assets/javascripts/zen_mode.js.coffee index 0c9942a4014..0fb8f7ed75f 100644 --- a/app/assets/javascripts/zen_mode.js.coffee +++ b/app/assets/javascripts/zen_mode.js.coffee @@ -10,7 +10,15 @@ class @ZenMode if not @active_checkbox @scroll_position = window.pageYOffset - $('body').on 'change', '.zennable input[type=checkbox]', (e) => + $('body').on 'click', '.zen-enter-link', (e) => + e.preventDefault() + $(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', true) + + $('body').on 'click', '.zen-leave-link', (e) => + e.preventDefault() + $(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', false) + + $('body').on 'change', '.zen-toggle-comment', (e) => checkbox = e.currentTarget if checkbox.checked # Disable other keyboard shortcuts in ZEN mode @@ -32,8 +40,6 @@ class @ZenMode @active_zen_area = @active_checkbox.parent().find('textarea') @active_zen_area.focus() window.location.hash = ZenMode.fullscreen_prefix + @active_checkbox.prop('id') - # Disable dropzone in ZEN mode - Dropzone.forElement('.div-dropzone').disable() exitZenMode: => if @active_zen_area isnt null diff --git a/app/assets/stylesheets/generic/forms.scss b/app/assets/stylesheets/generic/forms.scss index 1a832569953..c8982cdc00d 100644 --- a/app/assets/stylesheets/generic/forms.scss +++ b/app/assets/stylesheets/generic/forms.scss @@ -97,136 +97,3 @@ label { .wiki-content { margin-top: 35px; } - -.zennable { - position: relative; - - input { - display: none; - } - - .collapse { - display: none; - opacity: 0.5; - - &:before { - content: '\f066'; - font-family: FontAwesome; - color: #000; - font-size: 28px; - position: relative; - padding: 30px 40px 0 0; - } - - &:hover { - opacity: 0.8; - } - } - - .expand { - opacity: 0.5; - - &:before { - content: '\f065'; - font-family: FontAwesome; - color: #000; - font-size: 14px; - line-height: 14px; - padding-right: 20px; - position: relative; - vertical-align: middle; - } - - &:hover { - opacity: 0.8; - } - } - - input:checked ~ .zen-backdrop .expand { - display: none; - } - - input:checked ~ .zen-backdrop .collapse { - display: block; - position: absolute; - top: 0; - } - - label { - position: absolute; - top: -26px; - right: 0; - font-variant: small-caps; - text-transform: uppercase; - font-size: 10px; - padding: 4px; - font-weight: 500; - letter-spacing: 1px; - - &:before { - display: inline-block; - width: 10px; - height: 14px; - } - } - - input:checked ~ .zen-backdrop { - background-color: white; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 1031; - - textarea { - border: none; - box-shadow: none; - border-radius: 0; - color: #000; - font-size: 20px; - line-height: 26px; - padding: 30px; - display: block; - outline: none; - resize: none; - height: 100vh; - max-width: 900px; - margin: 0 auto; - } - } - - .zen-backdrop textarea::-webkit-input-placeholder { - color: white; - } - - .zen-backdrop textarea:-moz-placeholder { - color: white; - } - - .zen-backdrop textarea::-moz-placeholder { - color: white; - } - - .zen-backdrop textarea:-ms-input-placeholder { - color: white; - } - - input:checked ~ .zen-backdrop textarea::-webkit-input-placeholder { - color: #999; - } - - input:checked ~ .zen-backdrop textarea:-moz-placeholder { - color: #999; - opacity: 1; - } - - input:checked ~ .zen-backdrop textarea::-moz-placeholder { - color: #999; - opacity: 1; - } - - input:checked ~ .zen-backdrop textarea:-ms-input-placeholder { - color: #999; - } -} diff --git a/app/assets/stylesheets/generic/zen.scss b/app/assets/stylesheets/generic/zen.scss new file mode 100644 index 00000000000..26afc21a6ab --- /dev/null +++ b/app/assets/stylesheets/generic/zen.scss @@ -0,0 +1,98 @@ +.zennable { + position: relative; + + input { + display: none; + } + + .zen-enter-link { + color: #888; + position: absolute; + top: -26px; + right: 4px; + } + + .zen-leave-link { + display: none; + color: #888; + position: absolute; + top: 10px; + right: 10px; + padding: 5px; + font-size: 36px; + + &:hover { + color: #111; + } + } + + input:checked ~ .zen-backdrop .zen-enter-link { + display: none; + } + + input:checked ~ .zen-backdrop .zen-leave-link { + display: block; + position: absolute; + top: 0; + } + + input:checked ~ .zen-backdrop { + background-color: white; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1031; + + textarea { + border: none; + box-shadow: none; + border-radius: 0; + color: #000; + font-size: 20px; + line-height: 26px; + padding: 30px; + display: block; + outline: none; + resize: none; + height: 100vh; + max-width: 900px; + margin: 0 auto; + } + } + + .zen-backdrop textarea::-webkit-input-placeholder { + color: white; + } + + .zen-backdrop textarea:-moz-placeholder { + color: white; + } + + .zen-backdrop textarea::-moz-placeholder { + color: white; + } + + .zen-backdrop textarea:-ms-input-placeholder { + color: white; + } + + input:checked ~ .zen-backdrop textarea::-webkit-input-placeholder { + color: #999; + } + + input:checked ~ .zen-backdrop textarea:-moz-placeholder { + color: #999; + opacity: 1; + } + + input:checked ~ .zen-backdrop textarea::-moz-placeholder { + color: #999; + opacity: 1; + } + + input:checked ~ .zen-backdrop textarea:-ms-input-placeholder { + color: #999; + } +} diff --git a/app/assets/stylesheets/sections/note_form.scss b/app/assets/stylesheets/sections/note_form.scss index cf1bd09e8e1..26511d799f3 100644 --- a/app/assets/stylesheets/sections/note_form.scss +++ b/app/assets/stylesheets/sections/note_form.scss @@ -160,3 +160,12 @@ background: transparent; } } + +.comment-hints { + color: #999; + background: #FFF; + padding: 5px; + margin-top: -7px; + border: 1px solid #DDD; + font-size: 13px; +} diff --git a/app/views/projects/_zen.html.haml b/app/views/projects/_zen.html.haml index 2bbc49e8eb5..5114c5874ea 100644 --- a/app/views/projects/_zen.html.haml +++ b/app/views/projects/_zen.html.haml @@ -1,7 +1,10 @@ .zennable - %input#zen-toggle-comment{ tabindex: '-1', type: 'checkbox' } + %input#zen-toggle-comment.zen-toggle-comment{ tabindex: '-1', type: 'checkbox' } .zen-backdrop - classes << ' js-gfm-input markdown-area' = f.text_area attr, class: classes, placeholder: 'Leave a comment' - %label{ for: 'zen-toggle-comment', class: 'expand' } Edit in fullscreen - %label{ for: 'zen-toggle-comment', class: 'collapse' } + = link_to nil, class: 'zen-enter-link' do + %i.fa.fa-expand + Edit in fullscreen + = link_to nil, class: 'zen-leave-link' do + %i.fa.fa-compress diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml index a4520787a85..59e2b3f1b0b 100644 --- a/app/views/projects/notes/_edit_form.html.haml +++ b/app/views/projects/notes/_edit_form.html.haml @@ -4,7 +4,7 @@ = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text' - .light.clearfix + .comment-hints.clearfix .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 76525966dc3..3879a0f10da 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -9,7 +9,7 @@ = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text' - .light.clearfix + .comment-hints.clearfix .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. -- cgit v1.2.1 From bf079c24afb8ad2991a4eaf60a71a7bc45dd775d Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Wed, 3 Dec 2014 15:27:31 +0100 Subject: Replace highlight.js with rouge-fork rugments I decided to create a fork of rouge as rouge lacks a HTML formatter with the required options such as wrapping a line with tags. Furthermore I was not really convinced about the clarity of rouge's source code. Rugments 1.0.0beta3 for now only includes some basic linting and a new HTML formatter. Everything else should behave the same. --- app/assets/images/dark-scheme-preview.png | Bin 9873 -> 5792 bytes app/assets/images/monokai-scheme-preview.png | Bin 4332 -> 5401 bytes .../images/solarized-dark-scheme-preview.png | Bin 9902 -> 4993 bytes .../images/solarized-light-scheme-preview.png | Bin 0 -> 4746 bytes app/assets/images/white-scheme-preview.png | Bin 10022 -> 5617 bytes app/assets/javascripts/application.js.coffee | 1 - app/assets/javascripts/dispatcher.js.coffee | 8 - app/assets/javascripts/notes.js.coffee | 7 - app/assets/stylesheets/application.scss | 1 - app/assets/stylesheets/generic/highlight.scss | 33 +-- app/assets/stylesheets/highlight/dark.scss | 276 ++++++--------------- app/assets/stylesheets/highlight/monokai.scss | 232 ++++++----------- .../stylesheets/highlight/solarized_dark.scss | 204 +++++++-------- .../stylesheets/highlight/solarized_light.scss | 101 ++++++++ app/assets/stylesheets/highlight/white.scss | 268 ++++++-------------- app/assets/stylesheets/main/mixins.scss | 11 +- app/assets/stylesheets/sections/tree.scss | 5 + app/helpers/application_helper.rb | 19 +- app/helpers/blob_helper.rb | 19 +- app/views/projects/blame/show.html.haml | 6 +- app/views/projects/blob/_text.html.haml | 2 +- app/views/projects/wikis/history.html.haml | 2 +- app/views/search/results/_blob.html.haml | 2 +- app/views/search/results/_wiki_blob.html.haml | 2 +- app/views/shared/_file_highlight.html.haml | 10 + app/views/shared/_file_hljs.html.haml | 13 - app/views/shared/snippets/_blob.html.haml | 2 +- 27 files changed, 489 insertions(+), 735 deletions(-) create mode 100644 app/assets/images/solarized-light-scheme-preview.png create mode 100644 app/assets/stylesheets/highlight/solarized_light.scss create mode 100644 app/views/shared/_file_highlight.html.haml delete mode 100644 app/views/shared/_file_hljs.html.haml (limited to 'app') diff --git a/app/assets/images/dark-scheme-preview.png b/app/assets/images/dark-scheme-preview.png index 6dac6cd8ca1..2d631a49fd3 100644 Binary files a/app/assets/images/dark-scheme-preview.png and b/app/assets/images/dark-scheme-preview.png differ diff --git a/app/assets/images/monokai-scheme-preview.png b/app/assets/images/monokai-scheme-preview.png index 3aeed886a02..6791d1ee33d 100644 Binary files a/app/assets/images/monokai-scheme-preview.png and b/app/assets/images/monokai-scheme-preview.png differ diff --git a/app/assets/images/solarized-dark-scheme-preview.png b/app/assets/images/solarized-dark-scheme-preview.png index ae092ab5213..8f904405310 100644 Binary files a/app/assets/images/solarized-dark-scheme-preview.png and b/app/assets/images/solarized-dark-scheme-preview.png differ diff --git a/app/assets/images/solarized-light-scheme-preview.png b/app/assets/images/solarized-light-scheme-preview.png new file mode 100644 index 00000000000..7da5d2d2090 Binary files /dev/null and b/app/assets/images/solarized-light-scheme-preview.png differ diff --git a/app/assets/images/white-scheme-preview.png b/app/assets/images/white-scheme-preview.png index d1866e00158..d32b7485e1e 100644 Binary files a/app/assets/images/white-scheme-preview.png and b/app/assets/images/white-scheme-preview.png differ diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 6d038f772e9..a3ed19d61ba 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -25,7 +25,6 @@ #= require g.bar-min #= require chart-lib.min #= require branch-graph -#= require highlight.pack #= require ace/ace #= require ace/ext-searchbox #= require d3 diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index e5349d80e94..ef86c2781c9 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -4,7 +4,6 @@ $ -> class Dispatcher constructor: () -> @initSearch() - @initHighlight() @initPageScripts() initPageScripts: -> @@ -130,10 +129,3 @@ class Dispatcher project_ref = opts.data('autocomplete-project-ref') new SearchAutocomplete(path, project_id, project_ref) - - initHighlight: -> - $('.highlight pre code').each (i, e) -> - $(e).html($.map($(e).html().split("\n"), (line, i) -> - "" + line + "" - ).join("\n")) - hljs.highlightBlock(e) diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index d1935d1d007..ac1353b8bb6 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -114,10 +114,6 @@ class @Notes if @isNewNote(note) @note_ids.push(note.id) $('ul.main-notes-list').append(note.html) - code = "#note_" + note.id + " .highlight pre code" - $(code).each (i, e) -> - hljs.highlightBlock(e) - ### Check if note does not exists on page @@ -265,9 +261,6 @@ class @Notes note_li.replaceWith(note.html) note_li.find('.note-edit-form').hide() note_li.find('.note-text').show() - code = "#note_" + note.id + " .highlight pre code" - $(code).each (i, e) -> - hljs.highlightBlock(e) ### Called in response to clicking the edit note link diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 0d404f15055..3cf08782c3c 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -6,7 +6,6 @@ *= require jquery.ui.autocomplete *= require jquery.atwho *= require select2 - *= require highlightjs.min *= require_self *= require dropzone/basic */ diff --git a/app/assets/stylesheets/generic/highlight.scss b/app/assets/stylesheets/generic/highlight.scss index ae08539d454..83dc7ab491a 100644 --- a/app/assets/stylesheets/generic/highlight.scss +++ b/app/assets/stylesheets/generic/highlight.scss @@ -1,4 +1,4 @@ -.highlighted-data { +.file-content.code { border: none; box-shadow: none; margin: 0px; @@ -13,8 +13,13 @@ font-size: 12px !important; line-height: 16px !important; margin: 0; + overflow: auto; + overflow-y: hidden; + white-space: pre; + word-wrap: normal; code { + font-family: $monospace_font; white-space: pre; word-wrap: normal; padding: 0; @@ -25,10 +30,6 @@ } } - .hljs { - padding: 0; - } - .line-numbers { padding: 10px; text-align: right; @@ -51,18 +52,18 @@ } } } +} - .highlight { - overflow: auto; - overflow-y: hidden; - - pre { - white-space: pre; - word-wrap: normal; +.note-text .code { + border: none; + box-shadow: none; + background: $box_bg; + padding: 1em; - code { - font-family: $monospace_font; - } - } + code { + font-family: $monospace_font; + white-space: pre; + word-wrap: normal; + padding: 0; } } diff --git a/app/assets/stylesheets/highlight/dark.scss b/app/assets/stylesheets/highlight/dark.scss index ca51da3fdd4..4095d35b05f 100644 --- a/app/assets/stylesheets/highlight/dark.scss +++ b/app/assets/stylesheets/highlight/dark.scss @@ -1,199 +1,83 @@ -.dark { - background-color: #232323; - - .line.hll { - background: #558; - } - - .highlight{ - border-left: 1px solid #444; - } - - .no-highlight { - color: #DDD; - } +/* https://github.com/MozMorris/tomorrow-pygments */ +.code.dark { + pre.code, + .line-numbers, .line-numbers a { - color: #666; - } - - pre { - background-color: #232323; - } - - .hljs { - display: block; - background: #232323; - color: #E6E1DC; - } - - .hljs-comment, - .hljs-template_comment, - .hljs-javadoc, - .hljs-shebang { - color: #BC9458; - font-style: italic; - } - - .hljs-keyword, - .ruby .hljs-function .hljs-keyword, - .hljs-request, - .hljs-status, - .nginx .hljs-title, - .method, - .hljs-list .hljs-title { - color: #C26230; - } - - .hljs-string, - .hljs-number, - .hljs-regexp, - .hljs-tag .hljs-value, - .hljs-cdata, - .hljs-filter .hljs-argument, - .hljs-attr_selector, - .apache .hljs-cbracket, - .hljs-date, - .tex .hljs-command, - .markdown .hljs-link_label { - color: #A5C261; - } - - .hljs-subst { - color: #519F50; - } - - .hljs-tag, - .hljs-tag .hljs-keyword, - .hljs-tag .hljs-title, - .hljs-doctype, - .hljs-sub .hljs-identifier, - .hljs-pi, - .input_number { - color: #E8BF6A; - } - - .hljs-identifier { - color: #D0D0FF; - } - - .hljs-class .hljs-title, - .haskell .hljs-type, - .smalltalk .hljs-class, - .hljs-javadoctag, - .hljs-yardoctag, - .hljs-phpdoc { - text-decoration: none; - } - - .hljs-constant { - color: #DA4939; - } - - - .hljs-symbol, - .hljs-built_in, - .ruby .hljs-symbol .hljs-string, - .ruby .hljs-symbol .hljs-identifier, - .markdown .hljs-link_url, - .hljs-attribute { - color: #6D9CBE; - } - - .markdown .hljs-link_url { - text-decoration: underline; - } - - - - .hljs-params, - .hljs-variable, - .clojure .hljs-attribute { - color: #D0D0FF; - } - - .css .hljs-tag, - .hljs-rules .hljs-property, - .hljs-pseudo, - .tex .hljs-special { - color: #CDA869; - } - - .css .hljs-class { - color: #9B703F; - } - - .hljs-rules .hljs-keyword { - color: #C5AF75; - } - - .hljs-rules .hljs-value { - color: #CF6A4C; - } - - .css .hljs-id { - color: #8B98AB; - } - - .hljs-annotation, - .apache .hljs-sqbracket, - .nginx .hljs-built_in { - color: #9B859D; - } - - .hljs-preprocessor, - .hljs-preprocessor *, - .hljs-pragma { - color: #8996A8 !important; - } - - .hljs-hexcolor, - .css .hljs-value .hljs-number { - color: #A5C261; - } - - .hljs-title, - .hljs-decorator, - .css .hljs-function { - color: #FFC66D; - } - - .diff .hljs-header, - .hljs-chunk { - background-color: #2F33AB; - color: #E6E1DC; - display: inline-block; - width: 100%; - } - - .diff .hljs-change { - background-color: #4A410D; - color: #F8F8F8; - display: inline-block; - width: 100%; - } - - .hljs-addition { - background-color: #144212; - color: #E6E1DC; - display: inline-block; - width: 100%; - } - - .hljs-deletion { - background-color: #600; - color: #E6E1DC; - display: inline-block; - width: 100%; - } - - .coffeescript .javascript, - .javascript .xml, - .tex .hljs-formula, - .xml .javascript, - .xml .vbscript, - .xml .css, - .xml .hljs-cdata { - opacity: 0.7; - } + background-color: #1d1f21 !important; + color: #c5c8c6 !important; + } + + pre.code { + border-left: 1px solid #666; + } + + pre.hll { + background-color: #fff !important; + } + + .hll { background-color: #373b41 } + .c { color: #969896 } /* Comment */ + .err { color: #cc6666 } /* Error */ + .k { color: #b294bb } /* Keyword */ + .l { color: #de935f } /* Literal */ + .n { color: #c5c8c6 } /* Name */ + .o { color: #8abeb7 } /* Operator */ + .p { color: #c5c8c6 } /* Punctuation */ + .cm { color: #969896 } /* Comment.Multiline */ + .cp { color: #969896 } /* Comment.Preproc */ + .c1 { color: #969896 } /* Comment.Single */ + .cs { color: #969896 } /* Comment.Special */ + .gd { color: #cc6666 } /* Generic.Deleted */ + .ge { font-style: italic } /* Generic.Emph */ + .gh { color: #c5c8c6; font-weight: bold } /* Generic.Heading */ + .gi { color: #b5bd68 } /* Generic.Inserted */ + .gp { color: #969896; font-weight: bold } /* Generic.Prompt */ + .gs { font-weight: bold } /* Generic.Strong */ + .gu { color: #8abeb7; font-weight: bold } /* Generic.Subheading */ + .kc { color: #b294bb } /* Keyword.Constant */ + .kd { color: #b294bb } /* Keyword.Declaration */ + .kn { color: #8abeb7 } /* Keyword.Namespace */ + .kp { color: #b294bb } /* Keyword.Pseudo */ + .kr { color: #b294bb } /* Keyword.Reserved */ + .kt { color: #f0c674 } /* Keyword.Type */ + .ld { color: #b5bd68 } /* Literal.Date */ + .m { color: #de935f } /* Literal.Number */ + .s { color: #b5bd68 } /* Literal.String */ + .na { color: #81a2be } /* Name.Attribute */ + .nb { color: #c5c8c6 } /* Name.Builtin */ + .nc { color: #f0c674 } /* Name.Class */ + .no { color: #cc6666 } /* Name.Constant */ + .nd { color: #8abeb7 } /* Name.Decorator */ + .ni { color: #c5c8c6 } /* Name.Entity */ + .ne { color: #cc6666 } /* Name.Exception */ + .nf { color: #81a2be } /* Name.Function */ + .nl { color: #c5c8c6 } /* Name.Label */ + .nn { color: #f0c674 } /* Name.Namespace */ + .nx { color: #81a2be } /* Name.Other */ + .py { color: #c5c8c6 } /* Name.Property */ + .nt { color: #8abeb7 } /* Name.Tag */ + .nv { color: #cc6666 } /* Name.Variable */ + .ow { color: #8abeb7 } /* Operator.Word */ + .w { color: #c5c8c6 } /* Text.Whitespace */ + .mf { color: #de935f } /* Literal.Number.Float */ + .mh { color: #de935f } /* Literal.Number.Hex */ + .mi { color: #de935f } /* Literal.Number.Integer */ + .mo { color: #de935f } /* Literal.Number.Oct */ + .sb { color: #b5bd68 } /* Literal.String.Backtick */ + .sc { color: #c5c8c6 } /* Literal.String.Char */ + .sd { color: #969896 } /* Literal.String.Doc */ + .s2 { color: #b5bd68 } /* Literal.String.Double */ + .se { color: #de935f } /* Literal.String.Escape */ + .sh { color: #b5bd68 } /* Literal.String.Heredoc */ + .si { color: #de935f } /* Literal.String.Interpol */ + .sx { color: #b5bd68 } /* Literal.String.Other */ + .sr { color: #b5bd68 } /* Literal.String.Regex */ + .s1 { color: #b5bd68 } /* Literal.String.Single */ + .ss { color: #b5bd68 } /* Literal.String.Symbol */ + .bp { color: #c5c8c6 } /* Name.Builtin.Pseudo */ + .vc { color: #cc6666 } /* Name.Variable.Class */ + .vg { color: #cc6666 } /* Name.Variable.Global */ + .vi { color: #cc6666 } /* Name.Variable.Instance */ + .il { color: #de935f } /* Literal.Number.Integer.Long */ } diff --git a/app/assets/stylesheets/highlight/monokai.scss b/app/assets/stylesheets/highlight/monokai.scss index dffa2dc9ed2..730018e3e28 100644 --- a/app/assets/stylesheets/highlight/monokai.scss +++ b/app/assets/stylesheets/highlight/monokai.scss @@ -1,159 +1,79 @@ -.monokai { - background-color: #272822; - - .highlight{ - border-left: 1px solid #444; - } - - .line.hll { - background: #558; - } - - .no-highlight { - color: #DDD; - } +/* https://github.com/richleland/pygments-css/blob/master/monokai.css */ +.code.monokai { + pre.highlight, + .line-numbers, .line-numbers a { - color: #666; - } - - pre { - background-color: #272822; - color: #f8f8f2; - } - - .hljs { - display: block; - background: #272822; - } - - .hljs-tag, - .hljs-tag .hljs-title, - .hljs-strong, - .hljs-change, - .hljs-winutils, - .hljs-flow, - .lisp .hljs-title, - .clojure .hljs-built_in, - .hljs-keyword, - .nginx .hljs-title, - .tex .hljs-special { - color: #F92672; - } - - .hljs { - color: #F8F8F2; - } - - .asciidoc .hljs-code, - .markdown .hljs-code, - .hljs-literal, - .hljs-function .hljs-keyword { - color: #66D9EF; - } - - - .hljs-code, - .hljs-class .hljs-title, - .hljs-header { - color: white; - } - - .hljs-link_label, - .hljs-attribute, - .hljs-symbol, - .hljs-symbol .hljs-string, - .hljs-value, - .hljs-constant, - .hljs-number, - .hljs-regexp { - color: #AE81FF; - } - - .hljs-string { - color: #E6DB74; - } - - .hljs-params { - color: #fd971f; - } - - .hljs-link_url, - .hljs-tag .hljs-value, - .hljs-bullet, - .hljs-subst, - .hljs-title, - .hljs-emphasis, - .hljs-type, - .hljs-preprocessor, - .hljs-pragma, - .ruby .hljs-class .hljs-parent, - .hljs-built_in, - .sql .hljs-aggregate, - .django .hljs-template_tag, - .django .hljs-variable, - .smalltalk .hljs-class, - .hljs-javadoc, - .django .hljs-filter .hljs-argument, - .smalltalk .hljs-localvars, - .smalltalk .hljs-array, - .hljs-attr_selector, - .hljs-pseudo, - .hljs-addition, - .hljs-stream, - .hljs-envvar, - .apache .hljs-tag, - .apache .hljs-cbracket, - .tex .hljs-command, - .hljs-prompt { - color: #A6E22E; - } - - .hljs-comment, - .hljs-annotation, - .smartquote, - .hljs-blockquote, - .hljs-horizontal_rule, - .hljs-template_comment, - .hljs-decorator, - .hljs-pi, - .hljs-doctype, - .hljs-deletion, - .hljs-shebang, - .apache .hljs-sqbracket, - .tex .hljs-formula { - color: #75715E; - } - - .hljs-keyword, - .hljs-literal, - .css .hljs-id, - .hljs-phpdoc, - .hljs-title, - .hljs-header, - .haskell .hljs-type, - .vbscript .hljs-built_in, - .sql .hljs-aggregate, - .rsl .hljs-built_in, - .smalltalk .hljs-class, - .diff .hljs-header, - .hljs-chunk, - .hljs-winutils, - .bash .hljs-variable, - .apache .hljs-tag, - .tex .hljs-special, - .hljs-request, - .hljs-status { - font-weight: bold; - } - - .coffeescript .javascript, - .javascript .xml, - .tex .hljs-formula, - .xml .javascript, - .xml .vbscript, - .xml .css, - .xml .hljs-cdata { - opacity: 0.5; - } + background:#272822 !important; + color:#f8f8f2 !important; + } + + pre.code { + border-left: 1px solid #555; + } + + .hll { background-color: #49483e } + .c { color: #75715e } /* Comment */ + .err { color: #960050; background-color: #1e0010 } /* Error */ + .k { color: #66d9ef } /* Keyword */ + .l { color: #ae81ff } /* Literal */ + .n { color: #f8f8f2 } /* Name */ + .o { color: #f92672 } /* Operator */ + .p { color: #f8f8f2 } /* Punctuation */ + .cm { color: #75715e } /* Comment.Multiline */ + .cp { color: #75715e } /* Comment.Preproc */ + .c1 { color: #75715e } /* Comment.Single */ + .cs { color: #75715e } /* Comment.Special */ + .ge { font-style: italic } /* Generic.Emph */ + .gs { font-weight: bold } /* Generic.Strong */ + .kc { color: #66d9ef } /* Keyword.Constant */ + .kd { color: #66d9ef } /* Keyword.Declaration */ + .kn { color: #f92672 } /* Keyword.Namespace */ + .kp { color: #66d9ef } /* Keyword.Pseudo */ + .kr { color: #66d9ef } /* Keyword.Reserved */ + .kt { color: #66d9ef } /* Keyword.Type */ + .ld { color: #e6db74 } /* Literal.Date */ + .m { color: #ae81ff } /* Literal.Number */ + .s { color: #e6db74 } /* Literal.String */ + .na { color: #a6e22e } /* Name.Attribute */ + .nb { color: #f8f8f2 } /* Name.Builtin */ + .nc { color: #a6e22e } /* Name.Class */ + .no { color: #66d9ef } /* Name.Constant */ + .nd { color: #a6e22e } /* Name.Decorator */ + .ni { color: #f8f8f2 } /* Name.Entity */ + .ne { color: #a6e22e } /* Name.Exception */ + .nf { color: #a6e22e } /* Name.Function */ + .nl { color: #f8f8f2 } /* Name.Label */ + .nn { color: #f8f8f2 } /* Name.Namespace */ + .nx { color: #a6e22e } /* Name.Other */ + .py { color: #f8f8f2 } /* Name.Property */ + .nt { color: #f92672 } /* Name.Tag */ + .nv { color: #f8f8f2 } /* Name.Variable */ + .ow { color: #f92672 } /* Operator.Word */ + .w { color: #f8f8f2 } /* Text.Whitespace */ + .mf { color: #ae81ff } /* Literal.Number.Float */ + .mh { color: #ae81ff } /* Literal.Number.Hex */ + .mi { color: #ae81ff } /* Literal.Number.Integer */ + .mo { color: #ae81ff } /* Literal.Number.Oct */ + .sb { color: #e6db74 } /* Literal.String.Backtick */ + .sc { color: #e6db74 } /* Literal.String.Char */ + .sd { color: #e6db74 } /* Literal.String.Doc */ + .s2 { color: #e6db74 } /* Literal.String.Double */ + .se { color: #ae81ff } /* Literal.String.Escape */ + .sh { color: #e6db74 } /* Literal.String.Heredoc */ + .si { color: #e6db74 } /* Literal.String.Interpol */ + .sx { color: #e6db74 } /* Literal.String.Other */ + .sr { color: #e6db74 } /* Literal.String.Regex */ + .s1 { color: #e6db74 } /* Literal.String.Single */ + .ss { color: #e6db74 } /* Literal.String.Symbol */ + .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ + .vc { color: #f8f8f2 } /* Name.Variable.Class */ + .vg { color: #f8f8f2 } /* Name.Variable.Global */ + .vi { color: #f8f8f2 } /* Name.Variable.Instance */ + .il { color: #ae81ff } /* Literal.Number.Integer.Long */ + + .gh { } /* Generic Heading & Diff Header */ + .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ + .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ + .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ } diff --git a/app/assets/stylesheets/highlight/solarized_dark.scss b/app/assets/stylesheets/highlight/solarized_dark.scss index b9bec225188..be6904100ec 100644 --- a/app/assets/stylesheets/highlight/solarized_dark.scss +++ b/app/assets/stylesheets/highlight/solarized_dark.scss @@ -1,125 +1,101 @@ -.solarized-dark { - background-color: #002B36; - - .highlight{ - border-left: 1px solid #113b46; - } - - .line.hll { - background: #000; - } - - .no-highlight { - color: #DDD; - } - - pre { - background-color: #002B36; - color: #eee; - } +/* https://gist.github.com/qguv/7936275 */ +.code.solarized-dark { + pre.code, + .line-numbers, .line-numbers a { - color: #666; + background-color: #002b36 !important; + color: #93a1a1 !important; } - .hljs { - display: block; - background: #002b36; - color: #839496; - } - - .hljs-comment, - .hljs-template_comment, - .diff .hljs-header, - .hljs-doctype, - .hljs-pi, - .lisp .hljs-string, - .hljs-javadoc { - color: #586e75; - } - - /* Solarized Green */ - .hljs-keyword, - .hljs-winutils, - .method, - .hljs-addition, - .css .hljs-tag, - .hljs-request, - .hljs-status, - .nginx .hljs-title { - color: #859900; + pre.code { + border-left: 1px solid #113b46; } - /* Solarized Cyan */ - .hljs-number, - .hljs-command, - .hljs-string, - .hljs-tag .hljs-value, - .hljs-rules .hljs-value, - .hljs-phpdoc, - .tex .hljs-formula, - .hljs-regexp, - .hljs-hexcolor, - .hljs-link_url { - color: #2aa198; - } + /* Solarized Dark - /* Solarized Blue */ - .hljs-title, - .hljs-localvars, - .hljs-chunk, - .hljs-decorator, - .hljs-built_in, - .hljs-identifier, - .vhdl .hljs-literal, - .hljs-id, - .css .hljs-function { - color: #268bd2; - } + For use with Jekyll and Pygments - /* Solarized Yellow */ - .hljs-attribute, - .hljs-variable, - .lisp .hljs-body, - .smalltalk .hljs-number, - .hljs-constant, - .hljs-class .hljs-title, - .hljs-parent, - .haskell .hljs-type, - .hljs-link_reference { - color: #b58900; - } + http://ethanschoonover.com/solarized - /* Solarized Orange */ - .hljs-preprocessor, - .hljs-preprocessor .hljs-keyword, - .hljs-pragma, - .hljs-shebang, - .hljs-symbol, - .hljs-symbol .hljs-string, - .diff .hljs-change, - .hljs-special, - .hljs-attr_selector, - .hljs-subst, - .hljs-cdata, - .clojure .hljs-title, - .css .hljs-pseudo, - .hljs-header { - color: #cb4b16; - } + SOLARIZED HEX ROLE + --------- -------- ------------------------------------------ + base03 #002b36 background + base01 #586e75 comments / secondary content + base1 #93a1a1 body text / default code / primary content + orange #cb4b16 constants + red #dc322f regex, special keywords + blue #268bd2 reserved keywords + cyan #2aa198 strings, numbers + green #859900 operators, other keywords + */ - /* Solarized Red */ - .hljs-deletion, - .hljs-important { - color: #dc322f; - } - - /* Solarized Violet */ - .hljs-link_label { - color: #6c71c4; - } - - .tex .hljs-formula { - background: #073642; - } + .c { color: #586e75 } /* Comment */ + .err { color: #93a1a1 } /* Error */ + .g { color: #93a1a1 } /* Generic */ + .k { color: #859900 } /* Keyword */ + .l { color: #93a1a1 } /* Literal */ + .n { color: #93a1a1 } /* Name */ + .o { color: #859900 } /* Operator */ + .x { color: #cb4b16 } /* Other */ + .p { color: #93a1a1 } /* Punctuation */ + .cm { color: #586e75 } /* Comment.Multiline */ + .cp { color: #859900 } /* Comment.Preproc */ + .c1 { color: #586e75 } /* Comment.Single */ + .cs { color: #859900 } /* Comment.Special */ + .gd { color: #2aa198 } /* Generic.Deleted */ + .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */ + .gr { color: #dc322f } /* Generic.Error */ + .gh { color: #cb4b16 } /* Generic.Heading */ + .gi { color: #859900 } /* Generic.Inserted */ + .go { color: #93a1a1 } /* Generic.Output */ + .gp { color: #93a1a1 } /* Generic.Prompt */ + .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */ + .gu { color: #cb4b16 } /* Generic.Subheading */ + .gt { color: #93a1a1 } /* Generic.Traceback */ + .kc { color: #cb4b16 } /* Keyword.Constant */ + .kd { color: #268bd2 } /* Keyword.Declaration */ + .kn { color: #859900 } /* Keyword.Namespace */ + .kp { color: #859900 } /* Keyword.Pseudo */ + .kr { color: #268bd2 } /* Keyword.Reserved */ + .kt { color: #dc322f } /* Keyword.Type */ + .ld { color: #93a1a1 } /* Literal.Date */ + .m { color: #2aa198 } /* Literal.Number */ + .s { color: #2aa198 } /* Literal.String */ + .na { color: #93a1a1 } /* Name.Attribute */ + .nb { color: #B58900 } /* Name.Builtin */ + .nc { color: #268bd2 } /* Name.Class */ + .no { color: #cb4b16 } /* Name.Constant */ + .nd { color: #268bd2 } /* Name.Decorator */ + .ni { color: #cb4b16 } /* Name.Entity */ + .ne { color: #cb4b16 } /* Name.Exception */ + .nf { color: #268bd2 } /* Name.Function */ + .nl { color: #93a1a1 } /* Name.Label */ + .nn { color: #93a1a1 } /* Name.Namespace */ + .nx { color: #93a1a1 } /* Name.Other */ + .py { color: #93a1a1 } /* Name.Property */ + .nt { color: #268bd2 } /* Name.Tag */ + .nv { color: #268bd2 } /* Name.Variable */ + .ow { color: #859900 } /* Operator.Word */ + .w { color: #93a1a1 } /* Text.Whitespace */ + .mf { color: #2aa198 } /* Literal.Number.Float */ + .mh { color: #2aa198 } /* Literal.Number.Hex */ + .mi { color: #2aa198 } /* Literal.Number.Integer */ + .mo { color: #2aa198 } /* Literal.Number.Oct */ + .sb { color: #586e75 } /* Literal.String.Backtick */ + .sc { color: #2aa198 } /* Literal.String.Char */ + .sd { color: #93a1a1 } /* Literal.String.Doc */ + .s2 { color: #2aa198 } /* Literal.String.Double */ + .se { color: #cb4b16 } /* Literal.String.Escape */ + .sh { color: #93a1a1 } /* Literal.String.Heredoc */ + .si { color: #2aa198 } /* Literal.String.Interpol */ + .sx { color: #2aa198 } /* Literal.String.Other */ + .sr { color: #dc322f } /* Literal.String.Regex */ + .s1 { color: #2aa198 } /* Literal.String.Single */ + .ss { color: #2aa198 } /* Literal.String.Symbol */ + .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ + .vc { color: #268bd2 } /* Name.Variable.Class */ + .vg { color: #268bd2 } /* Name.Variable.Global */ + .vi { color: #268bd2 } /* Name.Variable.Instance */ + .il { color: #2aa198 } /* Literal.Number.Integer.Long */ } diff --git a/app/assets/stylesheets/highlight/solarized_light.scss b/app/assets/stylesheets/highlight/solarized_light.scss new file mode 100644 index 00000000000..55be6e30383 --- /dev/null +++ b/app/assets/stylesheets/highlight/solarized_light.scss @@ -0,0 +1,101 @@ +/* https://gist.github.com/qguv/7936275 */ +.code.solarized-light { + + pre.code, + .line-numbers, + .line-numbers a { + background-color: #fdf6e3 !important; + color: #586e75 !important; + } + + pre.code { + border-left: 1px solid #c5d0d4; + } + + /* Solarized Light + + For use with Jekyll and Pygments + + http://ethanschoonover.com/solarized + + SOLARIZED HEX ROLE + --------- -------- ------------------------------------------ + base01 #586e75 body text / default code / primary content + base1 #93a1a1 comments / secondary content + base3 #fdf6e3 background + orange #cb4b16 constants + red #dc322f regex, special keywords + blue #268bd2 reserved keywords + cyan #2aa198 strings, numbers + green #859900 operators, other keywords + */ + + .c { color: #93a1a1 } /* Comment */ + .err { color: #586e75 } /* Error */ + .g { color: #586e75 } /* Generic */ + .k { color: #859900 } /* Keyword */ + .l { color: #586e75 } /* Literal */ + .n { color: #586e75 } /* Name */ + .o { color: #859900 } /* Operator */ + .x { color: #cb4b16 } /* Other */ + .p { color: #586e75 } /* Punctuation */ + .cm { color: #93a1a1 } /* Comment.Multiline */ + .cp { color: #859900 } /* Comment.Preproc */ + .c1 { color: #93a1a1 } /* Comment.Single */ + .cs { color: #859900 } /* Comment.Special */ + .gd { color: #2aa198 } /* Generic.Deleted */ + .ge { color: #586e75; font-style: italic } /* Generic.Emph */ + .gr { color: #dc322f } /* Generic.Error */ + .gh { color: #cb4b16 } /* Generic.Heading */ + .gi { color: #859900 } /* Generic.Inserted */ + .go { color: #586e75 } /* Generic.Output */ + .gp { color: #586e75 } /* Generic.Prompt */ + .gs { color: #586e75; font-weight: bold } /* Generic.Strong */ + .gu { color: #cb4b16 } /* Generic.Subheading */ + .gt { color: #586e75 } /* Generic.Traceback */ + .kc { color: #cb4b16 } /* Keyword.Constant */ + .kd { color: #268bd2 } /* Keyword.Declaration */ + .kn { color: #859900 } /* Keyword.Namespace */ + .kp { color: #859900 } /* Keyword.Pseudo */ + .kr { color: #268bd2 } /* Keyword.Reserved */ + .kt { color: #dc322f } /* Keyword.Type */ + .ld { color: #586e75 } /* Literal.Date */ + .m { color: #2aa198 } /* Literal.Number */ + .s { color: #2aa198 } /* Literal.String */ + .na { color: #586e75 } /* Name.Attribute */ + .nb { color: #B58900 } /* Name.Builtin */ + .nc { color: #268bd2 } /* Name.Class */ + .no { color: #cb4b16 } /* Name.Constant */ + .nd { color: #268bd2 } /* Name.Decorator */ + .ni { color: #cb4b16 } /* Name.Entity */ + .ne { color: #cb4b16 } /* Name.Exception */ + .nf { color: #268bd2 } /* Name.Function */ + .nl { color: #586e75 } /* Name.Label */ + .nn { color: #586e75 } /* Name.Namespace */ + .nx { color: #586e75 } /* Name.Other */ + .py { color: #586e75 } /* Name.Property */ + .nt { color: #268bd2 } /* Name.Tag */ + .nv { color: #268bd2 } /* Name.Variable */ + .ow { color: #859900 } /* Operator.Word */ + .w { color: #586e75 } /* Text.Whitespace */ + .mf { color: #2aa198 } /* Literal.Number.Float */ + .mh { color: #2aa198 } /* Literal.Number.Hex */ + .mi { color: #2aa198 } /* Literal.Number.Integer */ + .mo { color: #2aa198 } /* Literal.Number.Oct */ + .sb { color: #93a1a1 } /* Literal.String.Backtick */ + .sc { color: #2aa198 } /* Literal.String.Char */ + .sd { color: #586e75 } /* Literal.String.Doc */ + .s2 { color: #2aa198 } /* Literal.String.Double */ + .se { color: #cb4b16 } /* Literal.String.Escape */ + .sh { color: #586e75 } /* Literal.String.Heredoc */ + .si { color: #2aa198 } /* Literal.String.Interpol */ + .sx { color: #2aa198 } /* Literal.String.Other */ + .sr { color: #dc322f } /* Literal.String.Regex */ + .s1 { color: #2aa198 } /* Literal.String.Single */ + .ss { color: #2aa198 } /* Literal.String.Symbol */ + .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ + .vc { color: #268bd2 } /* Name.Variable.Class */ + .vg { color: #268bd2 } /* Name.Variable.Global */ + .vi { color: #268bd2 } /* Name.Variable.Instance */ + .il { color: #2aa198 } /* Literal.Number.Integer.Long */ +} diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss index 8d5822937a0..050a5d241a6 100644 --- a/app/assets/stylesheets/highlight/white.scss +++ b/app/assets/stylesheets/highlight/white.scss @@ -1,196 +1,78 @@ -.white { - .line.hll { - background: #FFA; - } - - pre { - background-color: #fff; - color: #333; - } - - .hljs { - background: #FFF; - } +/* https://github.com/aahan/pygments-github-style */ +.code.white { + pre.highlight, + .line-numbers, .line-numbers a { - color: #999; - } - - .hljs { - display: block; - background: #fff; color: black; - } - - .hljs-comment, - .hljs-template_comment, - .hljs-javadoc, - .hljs-comment * { - color: #006a00; - } - - .hljs-keyword, - .hljs-literal, - .nginx .hljs-title { - color: #aa0d91; - } - .method, - .hljs-list .hljs-title, - .hljs-tag .hljs-title, - .setting .hljs-value, - .hljs-winutils, - .tex .hljs-command, - .http .hljs-title, - .hljs-request, - .hljs-status { - color: #008; - } - - .hljs-envvar, - .tex .hljs-special { - color: #660; - } - - .hljs-string { - color: #c41a16; - } - .hljs-tag .hljs-value, - .hljs-cdata, - .hljs-filter .hljs-argument, - .hljs-attr_selector, - .apache .hljs-cbracket, - .hljs-date, - .hljs-regexp { - color: #080; - } - - .hljs-sub .hljs-identifier, - .hljs-pi, - .hljs-tag, - .hljs-tag .hljs-keyword, - .hljs-decorator, - .ini .hljs-title, - .hljs-shebang, - .hljs-prompt, - .hljs-hexcolor, - .hljs-rules .hljs-value, - .hljs-symbol, - .hljs-symbol .hljs-string, - .hljs-number, - .css .hljs-function, - .clojure .hljs-title, - .clojure .hljs-built_in, - .hljs-function .hljs-title, - .coffeescript .hljs-attribute { - color: #1c00cf; - } - - .hljs-class .hljs-title, - .haskell .hljs-type, - .smalltalk .hljs-class, - .hljs-javadoctag, - .hljs-yardoctag, - .hljs-phpdoc, - .hljs-typename, - .hljs-tag .hljs-attribute, - .hljs-doctype, - .hljs-class .hljs-id, - .hljs-built_in, - .setting, - .hljs-params, - .clojure .hljs-attribute { - color: #5c2699; - } - - .hljs-variable { - color: #3f6e74; - } - .css .hljs-tag, - .hljs-rules .hljs-property, - .hljs-pseudo, - .hljs-subst { - color: #000; - } - - .css .hljs-class, - .css .hljs-id { - color: #9B703F; - } - - .hljs-value .hljs-important { - color: #ff7700; - font-weight: bold; - } - - .hljs-rules .hljs-keyword { - color: #C5AF75; - } - - .hljs-annotation, - .apache .hljs-sqbracket, - .nginx .hljs-built_in { - color: #9B859D; - } - - .hljs-preprocessor, - .hljs-preprocessor *, - .hljs-pragma { - color: #643820; - } - - .tex .hljs-formula { - background-color: #EEE; - font-style: italic; - } - - .diff .hljs-header, - .hljs-chunk { - color: #808080; - font-weight: bold; - } - - .diff .hljs-change { - background-color: #BCCFF9; - } - - .hljs-addition { - background-color: #BAEEBA; - } - - .hljs-deletion { - background-color: #FFC8BD; - } - - .hljs-comment .hljs-yardoctag { - font-weight: bold; - } - - .method .hljs-id { - color: #000; - } -} - -.shadow { - @include box-shadow(0 5px 15px #000); -} - -.file-content { - &.code .white { - .highlight { - border-left: 1px solid #eee; - } - } - - &.wiki .white { - .highlight, pre, .hljs { - background: #F9F9F9; - } - } -} - -.readme-holder .wiki, .note-body, .wiki-holder { - .white { - .highlight, pre, .hljs { - background: #F9F9F9; - } - } + background-color: #fff !important; + color: #333 !important; + } + + pre.code { + border-left: 1px solid #bbb; + } + + .hll { background-color: #f8f8f8 } + .c { color: #999988; font-style: italic; } + .err { color: #a61717; background-color: #e3d2d2; } + .k { font-weight: bold; } + .o { font-weight: bold; } + .cm { color: #999988; font-style: italic; } + .cp { color: #999999; font-weight: bold; } + .c1 { color: #999988; font-style: italic; } + .cs { color: #999999; font-weight: bold; font-style: italic; } + .gd { color: #000000; background-color: #ffdddd; } + .gd .x { color: #000000; background-color: #ffaaaa; } + .ge { font-style: italic; } + .gr { color: #aa0000; } + .gh { color: #999999; } + .gi { color: #000000; background-color: #ddffdd; } + .gi .x { color: #000000; background-color: #aaffaa; } + .go { color: #888888; } + .gp { color: #555555; } + .gs { font-weight: bold; } + .gu { color: #800080; font-weight: bold; } + .gt { color: #aa0000; } + .kc { font-weight: bold; } + .kd { font-weight: bold; } + .kn { font-weight: bold; } + .kp { font-weight: bold; } + .kr { font-weight: bold; } + .kt { color: #445588; font-weight: bold; } + .m { color: #009999; } + .s { color: #dd1144; } + .n { color: #333333; } + .na { color: teal; } + .nb { color: #0086b3; } + .nc { color: #445588; font-weight: bold; } + .no { color: teal; } + .ni { color: purple; } + .ne { color: #990000; font-weight: bold; } + .nf { color: #990000; font-weight: bold; } + .nn { color: #555555; } + .nt { color: navy; } + .nv { color: teal; } + .ow { font-weight: bold; } + .w { color: #bbbbbb; } + .mf { color: #009999; } + .mh { color: #009999; } + .mi { color: #009999; } + .mo { color: #009999; } + .sb { color: #dd1144; } + .sc { color: #dd1144; } + .sd { color: #dd1144; } + .s2 { color: #dd1144; } + .se { color: #dd1144; } + .sh { color: #dd1144; } + .si { color: #dd1144; } + .sx { color: #dd1144; } + .sr { color: #009926; } + .s1 { color: #dd1144; } + .ss { color: #990073; } + .bp { color: #999999; } + .vc { color: teal; } + .vg { color: teal; } + .vi { color: teal; } + .il { color: #009999; } + .gc { color: #999; background-color: #EAF2F5; } } diff --git a/app/assets/stylesheets/main/mixins.scss b/app/assets/stylesheets/main/mixins.scss index ebf68850f98..8435d1dae79 100644 --- a/app/assets/stylesheets/main/mixins.scss +++ b/app/assets/stylesheets/main/mixins.scss @@ -65,7 +65,16 @@ max-width: 100%; } - code { padding: 0 4px; } + *:first-child { + margin-top: 0; + } + + code { + font-family: $monospace_font; + white-space: pre; + word-wrap: normal; + padding: 0; + } h1 { margin-top: 45px; diff --git a/app/assets/stylesheets/sections/tree.scss b/app/assets/stylesheets/sections/tree.scss index bc7451e2d53..ff9464e217f 100644 --- a/app/assets/stylesheets/sections/tree.scss +++ b/app/assets/stylesheets/sections/tree.scss @@ -98,6 +98,11 @@ background: #f1f1f1; border-left: 1px solid #DDD; } + td.lines { + code { + font-family: $monospace_font; + } + } } } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f21b0bd1f50..67c02f5dfa4 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -5,8 +5,9 @@ module ApplicationHelper COLOR_SCHEMES = { 1 => 'white', 2 => 'dark', - 3 => 'solarized-dark', - 4 => 'monokai', + 3 => 'solarized-light', + 4 => 'solarized-dark', + 5 => 'monokai', } COLOR_SCHEMES.default = 'white' @@ -189,20 +190,6 @@ module ApplicationHelper BroadcastMessage.current end - def highlight_js(&block) - string = capture(&block) - - content_tag :div, class: "highlighted-data #{user_color_scheme_class}" do - content_tag :div, class: 'highlight' do - content_tag :pre do - content_tag :code do - string.html_safe - end - end - end - end - end - def time_ago_with_tooltip(date, placement = 'top', html_class = 'time_ago') capture_haml do haml_tag :time, date.to_s, diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 420ac3f77c7..3a282803963 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -1,10 +1,19 @@ module BlobHelper - def highlightjs_class(blob_name) - if no_highlight_files.include?(blob_name.downcase) - 'no-highlight' - else - blob_name.downcase + def highlight(blob_name, blob_content, nowrap = false) + formatter = Rugments::Formatters::HTML.new( + nowrap: nowrap, + cssclass: 'code highlight', + lineanchors: true, + lineanchorsid: 'LC' + ) + + begin + lexer = Rugments::Lexer.guess(filename: blob_name, source: blob_content) + rescue Rugments::Lexer::AmbiguousGuess + lexer = Rugments::Lexers::PlainText end + + formatter.format(lexer.lex(blob_content)).html_safe end def no_highlight_files diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml index bdf02c6285d..c507ecf2e49 100644 --- a/app/views/projects/blame/show.html.haml +++ b/app/views/projects/blame/show.html.haml @@ -26,9 +26,9 @@ = i \ %td.lines - %pre - %code{ class: highlightjs_class(@blob.name) } + %pre{class: 'code highlight white'} + %code :erb <% lines.each do |line| %> - <%= line %> + <%= highlight(@blob.name, line, true).html_safe %> <% end %> diff --git a/app/views/projects/blob/_text.html.haml b/app/views/projects/blob/_text.html.haml index 7cbea7c3eb6..f6bd62f239b 100644 --- a/app/views/projects/blob/_text.html.haml +++ b/app/views/projects/blob/_text.html.haml @@ -8,6 +8,6 @@ - else .file-content.code - unless blob.empty? - = render 'shared/file_hljs', blob: blob + = render 'shared/file_highlight', blob: blob - else .nothing-here-block Empty file diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index b30eff94f2c..9c9a9933dcf 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -24,7 +24,7 @@ %td = commit.message %td - #{time_ago_with_tooltip(version.date)} + #{time_ago_with_tooltip(version.authored_date)} %td %strong = @page.page.wiki.page(@page.page.name, commit.id).try(:format) diff --git a/app/views/search/results/_blob.html.haml b/app/views/search/results/_blob.html.haml index b46b4832e19..dae641dab4f 100644 --- a/app/views/search/results/_blob.html.haml +++ b/app/views/search/results/_blob.html.haml @@ -6,4 +6,4 @@ %strong = blob.filename .file-content.code.term - = render 'shared/file_hljs', blob: blob, first_line_number: blob.startline + = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline, user_color_scheme_class: 'white' diff --git a/app/views/search/results/_wiki_blob.html.haml b/app/views/search/results/_wiki_blob.html.haml index e361074b6a0..c7bc596eb14 100644 --- a/app/views/search/results/_wiki_blob.html.haml +++ b/app/views/search/results/_wiki_blob.html.haml @@ -6,4 +6,4 @@ %strong = wiki_blob.filename .file-content.code.term - = render 'shared/file_hljs', blob: wiki_blob, first_line_number: wiki_blob.startline + = render 'shared/file_highlight', blob: wiki_blob, first_line_number: wiki_blob.startline, user_color_scheme_class: 'white' diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml new file mode 100644 index 00000000000..52b48ff7451 --- /dev/null +++ b/app/views/shared/_file_highlight.html.haml @@ -0,0 +1,10 @@ +.file-content.code{class: user_color_scheme_class} + .line-numbers + - if blob.data.present? + - blob.data.lines.to_a.size.times do |index| + - offset = defined?(first_line_number) ? first_line_number : 1 + - i = index + offset + = link_to "#L#{i}", id: "L#{i}", rel: "#L#{i}" do + %i.fa.fa-link + = i + = highlight(blob.name, blob.data) diff --git a/app/views/shared/_file_hljs.html.haml b/app/views/shared/_file_hljs.html.haml deleted file mode 100644 index 444c948b026..00000000000 --- a/app/views/shared/_file_hljs.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%div.highlighted-data{class: user_color_scheme_class} - .line-numbers - - if blob.data.present? - - blob.data.lines.to_a.size.times do |index| - - offset = defined?(first_line_number) ? first_line_number : 1 - - i = index + offset - = link_to "#L#{i}", id: "L#{i}", rel: "#L#{i}" do - %i.fa.fa-link - = i - .highlight - %pre - %code{ class: highlightjs_class(blob.name) } - #{blob.data} diff --git a/app/views/shared/snippets/_blob.html.haml b/app/views/shared/snippets/_blob.html.haml index 8cec6168ab8..30458793fd1 100644 --- a/app/views/shared/snippets/_blob.html.haml +++ b/app/views/shared/snippets/_blob.html.haml @@ -8,7 +8,7 @@ = render_markup(@snippet.file_name, @snippet.data) - else .file-content.code - = render 'shared/file_hljs', blob: @snippet + = render 'shared/file_highlight', blob: @snippet - else .file-content.code .nothing-here-block Empty file -- cgit v1.2.1 From b79ada97bb8e85c85472e0cee269a28c0e6d5ef7 Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Thu, 15 Jan 2015 14:02:09 +0100 Subject: Remove password strength indicator We were having the following issues: - the indicator would sometimes stay red even if the password that was entered was long enough; - the indicator had a middle yellow signal: what does that mean? - the red/green backgrounds were not color-blind-friendly. --- app/assets/javascripts/application.js.coffee | 1 - app/assets/javascripts/password_strength.js.coffee | 31 ---------------------- app/assets/stylesheets/sections/profile.scss | 17 ------------ app/views/devise/passwords/edit.html.haml | 4 +-- app/views/devise/registrations/new.html.haml | 4 +-- app/views/profiles/passwords/edit.html.haml | 2 +- app/views/profiles/passwords/new.html.haml | 2 +- 7 files changed, 6 insertions(+), 55 deletions(-) delete mode 100644 app/assets/javascripts/password_strength.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 6d038f772e9..747035a9923 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -18,7 +18,6 @@ #= require jquery.turbolinks #= require turbolinks #= require bootstrap -#= require password_strength #= require select2 #= require raphael #= require g.raphael-min diff --git a/app/assets/javascripts/password_strength.js.coffee b/app/assets/javascripts/password_strength.js.coffee deleted file mode 100644 index 825f5630266..00000000000 --- a/app/assets/javascripts/password_strength.js.coffee +++ /dev/null @@ -1,31 +0,0 @@ -#= require pwstrength-bootstrap-1.2.2 -overwritten_messages = - wordSimilarToUsername: "Your password should not contain your username" - -overwritten_rules = - wordSequences: false - -options = - showProgressBar: false - showVerdicts: false - showPopover: true - showErrors: true - showStatus: true - errorMessages: overwritten_messages - -$(document).ready -> - profileOptions = {} - profileOptions.ui = options - profileOptions.rules = - activated: overwritten_rules - - deviseOptions = {} - deviseOptions.common = - usernameField: "#user_username" - deviseOptions.ui = options - deviseOptions.rules = - activated: overwritten_rules - - $("#user_password_profile").pwstrength profileOptions - $("#user_password_sign_up").pwstrength deviseOptions - $("#user_password_recover").pwstrength deviseOptions diff --git a/app/assets/stylesheets/sections/profile.scss b/app/assets/stylesheets/sections/profile.scss index b9f4e317e9c..086875582f3 100644 --- a/app/assets/stylesheets/sections/profile.scss +++ b/app/assets/stylesheets/sections/profile.scss @@ -111,20 +111,3 @@ height: 50px; } } - -//CSS for password-strength indicator -#password-strength { - margin-bottom: 0; -} - -.has-success input { - background-color: #D6F1D7 !important; -} - -.has-error input { - background-color: #F3CECE !important; -} - -.has-warning input { - background-color: #FFE9A4 !important; -} diff --git a/app/views/devise/passwords/edit.html.haml b/app/views/devise/passwords/edit.html.haml index f6cbf9b82ba..1326cc0aac9 100644 --- a/app/views/devise/passwords/edit.html.haml +++ b/app/views/devise/passwords/edit.html.haml @@ -6,8 +6,8 @@ .devise-errors = devise_error_messages! = f.hidden_field :reset_password_token - .form-group#password-strength - = f.password_field :password, class: "form-control top", id: "user_password_recover", placeholder: "New password", required: true + %div + = f.password_field :password, class: "form-control top", placeholder: "New password", required: true %div = f.password_field :password_confirmation, class: "form-control bottom", placeholder: "Confirm new password", required: true .clearfix.append-bottom-10 diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index 123de881f59..d6a952f3dc5 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -11,8 +11,8 @@ = f.text_field :username, class: "form-control middle", placeholder: "Username", required: true %div = f.email_field :email, class: "form-control middle", placeholder: "Email", required: true - .form-group#password-strength - = f.password_field :password, class: "form-control middle", id: "user_password_sign_up", placeholder: "Password", required: true + %div + = f.password_field :password, class: "form-control middle", placeholder: "Password", required: true %div = f.password_field :password_confirmation, class: "form-control bottom", placeholder: "Confirm password", required: true %div diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml index 425200ff523..2a7d317aa3e 100644 --- a/app/views/profiles/passwords/edit.html.haml +++ b/app/views/profiles/passwords/edit.html.haml @@ -24,7 +24,7 @@ .form-group = f.label :password, 'New password', class: 'control-label' .col-sm-10 - = f.password_field :password, required: true, class: 'form-control', id: 'user_password_profile' + = f.password_field :password, required: true, class: 'form-control' .form-group = f.label :password_confirmation, class: 'control-label' .col-sm-10 diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml index 42d2d0db29c..aef7348fd20 100644 --- a/app/views/profiles/passwords/new.html.haml +++ b/app/views/profiles/passwords/new.html.haml @@ -16,7 +16,7 @@ .col-sm-10= f.password_field :current_password, required: true, class: 'form-control' .form-group = f.label :password, class: 'control-label' - .col-sm-10= f.password_field :password, required: true, class: 'form-control', id: 'user_password_profile' + .col-sm-10= f.password_field :password, required: true, class: 'form-control' .form-group = f.label :password_confirmation, class: 'control-label' .col-sm-10 -- cgit v1.2.1 From c6ab8d04e865c69f53aba7ba1da0b120aaa342b9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Jan 2015 10:34:40 -0800 Subject: Fix tabindex for comment form --- app/views/projects/_zen.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/_zen.html.haml b/app/views/projects/_zen.html.haml index 5114c5874ea..cf1c55ecca6 100644 --- a/app/views/projects/_zen.html.haml +++ b/app/views/projects/_zen.html.haml @@ -3,7 +3,7 @@ .zen-backdrop - classes << ' js-gfm-input markdown-area' = f.text_area attr, class: classes, placeholder: 'Leave a comment' - = link_to nil, class: 'zen-enter-link' do + = link_to nil, class: 'zen-enter-link', tabindex: '-1' do %i.fa.fa-expand Edit in fullscreen = link_to nil, class: 'zen-leave-link' do -- cgit v1.2.1 From 3d3c7efa3e03c34dd48fa7ca959f11af204ffe75 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Jan 2015 14:55:45 -0800 Subject: Increase font size for lists --- app/assets/stylesheets/generic/lists.scss | 3 +-- app/assets/stylesheets/main/variables.scss | 5 +++++ app/assets/stylesheets/sections/commits.scss | 3 +-- app/assets/stylesheets/sections/issues.scss | 2 +- app/assets/stylesheets/sections/merge_requests.scss | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index 2653bfbf831..5950885c42c 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -69,12 +69,11 @@ } .well-title { - font-size: 14px; + font-size: $list-font-size; line-height: 18px; } .row_title { - font-weight: 500; color: #444; &:hover { color: #444; diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index 92b220f8019..e65f07bdc63 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -47,3 +47,8 @@ $deleted: #f77; * NProgress customize */ $nprogress-color: #c0392b; + +/** + * Font sizes + */ +$list-font-size: 15px; diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index 684e8377a7b..2fd2dcba475 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -139,7 +139,7 @@ */ li.commit { .commit-row-title { - font-size: 14px; + font-size: $list-font-size; margin-bottom: 2px; .notes_count { @@ -158,7 +158,6 @@ li.commit { .commit-row-message { color: #333; - font-weight: 500; &:hover { color: #444; text-decoration: underline; diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 929838379cb..26dc71c6d8f 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -5,7 +5,7 @@ .issue-title { margin-bottom: 5px; - font-size: 14px; + font-size: $list-font-size; } .issue-info { diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 74e1d8beb5a..8bd32f41e2c 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -88,7 +88,7 @@ .merge-request-title { margin-bottom: 5px; - font-size: 14px; + font-size: $list-font-size; } .merge-request-info { -- cgit v1.2.1 From 41f09bed82a7808e0e785d297567dc1411b41938 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Jan 2015 15:19:04 -0800 Subject: Re-order admin dashboard --- app/views/admin/dashboard/index.html.haml | 120 ++++++++++++++---------------- 1 file changed, 57 insertions(+), 63 deletions(-) (limited to 'app') diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index c6badeb4bd9..dd95af426c4 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -1,69 +1,7 @@ -%h3.page-title - Admin area -%p.light - You can manage projects, users and other GitLab data from here. -%hr .admin-dashboard - .row - .col-sm-4 - .light-well - %h4 Projects - .data - = link_to admin_projects_path do - %h1= Project.count - %hr - = link_to 'New Project', new_project_path, class: "btn btn-new" - .col-sm-4 - .light-well - %h4 Users - .data - = link_to admin_users_path do - %h1= User.count - %hr - = link_to 'New User', new_admin_user_path, class: "btn btn-new" - .col-sm-4 - .light-well - %h4 Groups - .data - = link_to admin_groups_path do - %h1= Group.count - %hr - = link_to 'New Group', new_admin_group_path, class: "btn btn-new" - - .row.prepend-top-10 - .col-md-4 - %h4 Latest projects - %hr - - @projects.each do |project| - %p - = link_to project.name_with_namespace, [:admin, project], class: 'str-truncated' - %span.light.pull-right - #{time_ago_with_tooltip(project.created_at)} - - .col-md-4 - %h4 Latest users - %hr - - @users.each do |user| - %p - = link_to [:admin, user], class: 'str-truncated' do - = user.name - %span.light.pull-right - #{time_ago_with_tooltip(user.created_at)} - - .col-md-4 - %h4 Latest groups - %hr - - @groups.each do |group| - %p - = link_to [:admin, group], class: 'str-truncated' do - = group.name - %span.light.pull-right - #{time_ago_with_tooltip(group.created_at)} - - %br .row .col-md-4 - %h4 Stats + %h4 Statistics %hr %p Forks @@ -141,3 +79,59 @@ Rails %span.pull-right #{Rails::VERSION::STRING} + %hr + .row + .col-sm-4 + .light-well + %h4 Projects + .data + = link_to admin_projects_path do + %h1= Project.count + %hr + = link_to 'New Project', new_project_path, class: "btn btn-new" + .col-sm-4 + .light-well + %h4 Users + .data + = link_to admin_users_path do + %h1= User.count + %hr + = link_to 'New User', new_admin_user_path, class: "btn btn-new" + .col-sm-4 + .light-well + %h4 Groups + .data + = link_to admin_groups_path do + %h1= Group.count + %hr + = link_to 'New Group', new_admin_group_path, class: "btn btn-new" + + .row.prepend-top-10 + .col-md-4 + %h4 Latest projects + %hr + - @projects.each do |project| + %p + = link_to project.name_with_namespace, [:admin, project], class: 'str-truncated' + %span.light.pull-right + #{time_ago_with_tooltip(project.created_at)} + + .col-md-4 + %h4 Latest users + %hr + - @users.each do |user| + %p + = link_to [:admin, user], class: 'str-truncated' do + = user.name + %span.light.pull-right + #{time_ago_with_tooltip(user.created_at)} + + .col-md-4 + %h4 Latest groups + %hr + - @groups.each do |group| + %p + = link_to [:admin, group], class: 'str-truncated' do + = group.name + %span.light.pull-right + #{time_ago_with_tooltip(group.created_at)} -- cgit v1.2.1 From eb84ee7a20cb84d3657e1b341e792053eba94455 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Jan 2015 15:19:58 -0800 Subject: Better label for diffs --- app/views/projects/diffs/_file.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml index 0c5f2ad1f3a..34d13502231 100644 --- a/app/views/projects/diffs/_file.html.haml +++ b/app/views/projects/diffs/_file.html.haml @@ -26,7 +26,7 @@   = link_to '#', class: 'js-toggle-diff-comments btn btn-small' do %i.fa.fa-chevron-down - Diff comments + Show/Hide comments   - if @merge_request && @merge_request.source_project -- cgit v1.2.1 From 714ef622644ff478f9538f9b0b4d160d6340214f Mon Sep 17 00:00:00 2001 From: Carlos Ribeiro Date: Thu, 15 Jan 2015 23:06:32 -0200 Subject: Fix the email variable substituation in ssh help page --- app/views/help/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/help/show.html.haml b/app/views/help/show.html.haml index 67f9cc41cf3..eca34dbff06 100644 --- a/app/views/help/show.html.haml +++ b/app/views/help/show.html.haml @@ -1,2 +1,2 @@ .documentation.wiki - = markdown File.read(Rails.root.join('doc', @category, @file + '.md')) + = markdown File.read(Rails.root.join('doc', @category, @file + '.md')).gsub("$your_email", current_user.email) -- cgit v1.2.1 From 4dfa1ed269fb5a483d37eeffc8009f85f13d1e0f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Jan 2015 23:24:30 -0800 Subject: Add some mobile fixes to UI --- app/assets/stylesheets/generic/mobile.scss | 33 ++++++++++++++++++++++++++- app/assets/stylesheets/sections/projects.scss | 14 ------------ app/views/projects/issues/show.html.haml | 2 +- app/views/shared/_milestones_filter.html.haml | 4 +--- 4 files changed, 34 insertions(+), 19 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss index c164b07b104..bcd28098502 100644 --- a/app/assets/stylesheets/generic/mobile.scss +++ b/app/assets/stylesheets/generic/mobile.scss @@ -1,4 +1,4 @@ -/** Common mobile (screen XS) styles **/ +/** Common mobile (screen XS, SM) styles **/ @media (max-width: $screen-xs-max) { .container .content { margin-top: 20px; @@ -13,5 +13,36 @@ display: none; } } + + .issues-filters, + .dash-projects-filters { + display: none; + } + + .rss-btn { + display: none !important; + } + + .project-home-panel { + .star-fork-buttons { + padding-top: 10px; + padding-right: 15px; + } + } + + .project-home-links { + display: none; + } } +@media (max-width: $screen-sm-max) { + .issues-filters { + .milestone-filter, .labels-filter { + display: none; + } + } + + .page-title .new-issue-link { + display: none; + } +} diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index fbfe9ad4c93..93c0c2bc518 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -296,20 +296,6 @@ ul.nav.nav-projects-tabs { } } -@media (max-width: $screen-xs-max) { - .project-home-panel { - .star-fork-buttons { - padding-top: 10px; - padding-right: 15px; - } - } - - .project-home-links { - display: none; - } -} - - table.table.protected-branches-list tr.no-border { th, td { border: 0; diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index b21a394ebeb..75411c6d86f 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -10,7 +10,7 @@ .pull-right - if can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), class: "btn btn-grouped", title: "New Issue", id: "new_issue_link" do + = link_to new_project_issue_path(@project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do %i.fa.fa-plus New Issue - if can?(current_user, :modify_issue, @issue) diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml index 8c2fd166922..208f1b77372 100644 --- a/app/views/shared/_milestones_filter.html.haml +++ b/app/views/shared/_milestones_filter.html.haml @@ -1,6 +1,4 @@ -.fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x -.responsive-side.milestones-filters.append-bottom-10 +.milestones-filters.append-bottom-10 %ul.nav.nav-pills.nav-compact %li{class: ("active" if params[:state].blank? || params[:state] == 'opened')} = link_to milestones_filter_path(state: 'opened') do -- cgit v1.2.1 From 33f27fcb6a28bb69727427e1c9ff3c8804466f60 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Jan 2015 23:34:30 -0800 Subject: Remvoe unnecessary expand buttons --- app/assets/stylesheets/generic/mobile.scss | 3 ++- app/views/projects/_issues_nav.html.haml | 11 ----------- 2 files changed, 2 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss index bcd28098502..90703cde0d1 100644 --- a/app/assets/stylesheets/generic/mobile.scss +++ b/app/assets/stylesheets/generic/mobile.scss @@ -15,7 +15,8 @@ } .issues-filters, - .dash-projects-filters { + .dash-projects-filters, + .check-all-holder { display: none; } diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml index 4e2ef3202f9..f4e3d9a1093 100644 --- a/app/views/projects/_issues_nav.html.haml +++ b/app/views/projects/_issues_nav.html.haml @@ -19,11 +19,6 @@ Labels - - if current_controller?(:milestones) - %li.pull-right - %button.btn.btn-default.sidebar-expand-button - %i.icon.fa.fa-list - - if current_controller?(:issues) - if current_user %li.hidden-xs @@ -32,9 +27,6 @@ %li.pull-right .pull-right - %button.btn.btn-default.sidebar-expand-button - %i.icon.fa.fa-list - .pull-left = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do .append-right-10.hidden-xs.hidden-sm @@ -53,9 +45,6 @@ - if current_controller?(:merge_requests) %li.pull-right .pull-right - %button.btn.btn-default.sidebar-expand-button - %i.icon.fa.fa-list - - if can? current_user, :write_merge_request, @project = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do %i.fa.fa-plus -- cgit v1.2.1 From 03a669d81d632354cff9bfa56928209623a1e503 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Jan 2015 00:09:25 -0800 Subject: Fix broadcast message overflow --- app/assets/stylesheets/sections/nav_sidebar.scss | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index edb5f90813f..dc1a889ed5f 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -1,5 +1,13 @@ .page-with-sidebar { background: #F5F5F5; + + .sidebar-wrapper { + position: fixed; + top: 0; + left: 0; + height: 100%; + border-right: 1px solid #EAEAEA; + } } .sidebar-wrapper { @@ -97,11 +105,6 @@ .sidebar-wrapper { width: 250px; - position: fixed; - left: 250px; - height: 100%; - margin-left: -250px; - border-right: 1px solid #EAEAEA; .nav-sidebar { margin-top: 20px; @@ -123,11 +126,6 @@ .sidebar-wrapper { width: 52px; - position: fixed; - top: 0; - left: 0; - height: 100%; - border-right: 1px solid #EAEAEA; overflow-x: hidden; .nav-sidebar { @@ -157,5 +155,3 @@ @media(min-width: $screen-sm-max) { @include expanded-sidebar; } - - -- cgit v1.2.1 From 41d7be3ce1ae9a4bff93b62322f35989b6ad4cf6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Jan 2015 16:01:15 -0800 Subject: Allow to specify home page for non logged-in users --- app/controllers/admin/application_settings_controller.rb | 1 + app/controllers/application_controller.rb | 11 +++++++++++ app/helpers/application_helper.rb | 5 ----- app/models/application_setting.rb | 3 +++ app/views/admin/application_settings/_form.html.haml | 4 ++++ app/views/layouts/devise.html.haml | 3 +-- 6 files changed, 20 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index 5116f1f177a..a937f484877 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -26,6 +26,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController :signin_enabled, :gravatar_enabled, :sign_in_text, + :home_page_url ) end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b83de68c5d2..4780a7a2a9a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -48,6 +48,17 @@ class ApplicationController < ActionController::Base end end + def authenticate_user! + # If user is not signe-in and tries to access root_path - redirect him to landing page + if current_application_settings.home_page_url.present? + if current_user.nil? && controller_name == 'dashboard' && action_name == 'show' + redirect_to current_application_settings.home_page_url and return + end + end + + super + end + def log_exception(exception) application_trace = ActionDispatch::ExceptionWrapper.new(env, exception).application_trace application_trace.map!{ |t| " #{t}\n" } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 67c02f5dfa4..f65e04af205 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -292,9 +292,4 @@ module ApplicationHelper profile_key_path(key) end end - - def redirect_from_root? - request.env['rack.session']['user_return_to'] == - '/' - end end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 47fa6f1071c..d9c73559098 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -1,4 +1,7 @@ class ApplicationSetting < ActiveRecord::Base + validates :home_page_url, allow_blank: true, + format: { with: URI::regexp(%w(http https)), message: "should be a valid url" } + def self.current ApplicationSetting.last end diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 5ca9585e9a9..481e7882300 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -25,6 +25,10 @@ = f.label :default_projects_limit, class: 'control-label' .col-sm-10 = f.number_field :default_projects_limit, class: 'form-control' + .form-group + = f.label :home_page_url, class: 'control-label' + .col-sm-10 + = f.text_field :home_page_url, class: 'form-control', placeholder: 'http://company.example.com' .form-group = f.label :sign_in_text, class: 'control-label' .col-sm-10 diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml index 857ebd9b8d9..6f805f1c9d1 100644 --- a/app/views/layouts/devise.html.haml +++ b/app/views/layouts/devise.html.haml @@ -6,8 +6,7 @@ = render "layouts/public_head_panel", title: '' .container.navless-container .content - - unless redirect_from_root? - = render "layouts/flash" + = render "layouts/flash" .row.prepend-top-20 .col-sm-5.pull-right = yield -- cgit v1.2.1 From e7f772550c5fad5761777b76f97726be84693746 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Jan 2015 16:09:20 -0800 Subject: Add tests to home page url redirect --- app/views/admin/application_settings/_form.html.haml | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 481e7882300..9423a207068 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -29,6 +29,7 @@ = f.label :home_page_url, class: 'control-label' .col-sm-10 = f.text_field :home_page_url, class: 'form-control', placeholder: 'http://company.example.com' + %span.help-block We will redirect non-logged in users to this page .form-group = f.label :sign_in_text, class: 'control-label' .col-sm-10 -- cgit v1.2.1 From 38600e328bf4bacf2d3e4288943fb7652ee6c674 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Jan 2015 17:22:17 -0800 Subject: Validate application settings only if column exists --- app/models/application_setting.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index d9c73559098..aed4068f309 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -1,6 +1,7 @@ class ApplicationSetting < ActiveRecord::Base validates :home_page_url, allow_blank: true, - format: { with: URI::regexp(%w(http https)), message: "should be a valid url" } + format: { with: URI::regexp(%w(http https)), message: "should be a valid url" }, + if: :home_page_url_column_exist def self.current ApplicationSetting.last @@ -15,4 +16,8 @@ class ApplicationSetting < ActiveRecord::Base sign_in_text: Settings.extra['sign_in_text'], ) end + + def home_page_url_column_exist + ActiveRecord::Base.connection.column_exists?(:application_settings, :home_page_url) + end end -- cgit v1.2.1 From f2eb234c068ccb57f100080a499d307b9b2f5502 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Jan 2015 18:12:15 -0800 Subject: Fix passign args to original authenticate_user! --- app/controllers/application_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4780a7a2a9a..6da4f91c3f4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -48,7 +48,7 @@ class ApplicationController < ActionController::Base end end - def authenticate_user! + def authenticate_user!(*args) # If user is not signe-in and tries to access root_path - redirect him to landing page if current_application_settings.home_page_url.present? if current_user.nil? && controller_name == 'dashboard' && action_name == 'show' @@ -56,7 +56,7 @@ class ApplicationController < ActionController::Base end end - super + super(*args) end def log_exception(exception) -- cgit v1.2.1 From 09152bad0c3dd950d3d6dd0c0ea7f31056df1fdf Mon Sep 17 00:00:00 2001 From: Timo Lilja Date: Sat, 17 Jan 2015 16:15:20 +0200 Subject: Fix "500: Encoding error" on blame view This change forces encoding of source line data into UTF-8 and thus fixes the encoding error at least partially. The issue is described in https://gitlab.com/gitlab-org/gitlab-ce/issues/894 --- app/views/projects/blame/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml index c507ecf2e49..51a2f20d1e2 100644 --- a/app/views/projects/blame/show.html.haml +++ b/app/views/projects/blame/show.html.haml @@ -30,5 +30,5 @@ %code :erb <% lines.each do |line| %> - <%= highlight(@blob.name, line, true).html_safe %> + <%= highlight(@blob.name, line.force_encoding("utf-8"), true).html_safe %> <% end %> -- cgit v1.2.1 From b0ec61500e4de9dafd9dfb0177d92349c789de8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Sat, 17 Jan 2015 16:39:29 +0100 Subject: Fixes the sort dropdown goind outside of the screen see gitlab-org/gitlab-ce#986 --- app/assets/stylesheets/generic/common.scss | 5 +++++ app/views/shared/_sort_dropdown.html.haml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index cd6352db85f..1a7e96f1d0c 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -54,6 +54,11 @@ pre { text-shadow: none; } +.dropdown-menu-align-right { + left: auto; + right: 0px; +} + .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background: $bg_primary; diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml index 93ed9b67336..3e6a62380f3 100644 --- a/app/views/shared/_sort_dropdown.html.haml +++ b/app/views/shared/_sort_dropdown.html.haml @@ -6,7 +6,7 @@ - else Newest %b.caret - %ul.dropdown-menu + %ul.dropdown-menu.dropdown-menu-align-right %li = link_to page_filter_path(sort: 'newest') do = sort_title_recently_created -- cgit v1.2.1 From 727363163e56c25c2040057a546b171267842d6f Mon Sep 17 00:00:00 2001 From: Ivan Zotov Date: Sat, 17 Jan 2015 19:10:28 +0300 Subject: Optimize images 24.5% with ImageOptim. --- app/assets/images/authbuttons/github_32.png | Bin 1902 -> 1822 bytes app/assets/images/authbuttons/github_64.png | Bin 4444 -> 4196 bytes app/assets/images/authbuttons/google_32.png | Bin 1611 -> 1501 bytes app/assets/images/authbuttons/google_64.png | Bin 3437 -> 3169 bytes app/assets/images/authbuttons/twitter_32.png | Bin 1417 -> 1311 bytes app/assets/images/authbuttons/twitter_64.png | Bin 3328 -> 3054 bytes app/assets/images/bg-header.png | Bin 210 -> 90 bytes app/assets/images/bg_fallback.png | Bin 2976 -> 167 bytes app/assets/images/brand_logo.png | Bin 32119 -> 27059 bytes app/assets/images/chosen-sprite.png | Bin 396 -> 367 bytes app/assets/images/dark-scheme-preview.png | Bin 5792 -> 3996 bytes app/assets/images/diff_note_add.png | Bin 691 -> 418 bytes app/assets/images/icon-link.png | Bin 1019 -> 726 bytes app/assets/images/icon-search.png | Bin 331 -> 222 bytes app/assets/images/icon_sprite.png | Bin 2782 -> 2636 bytes app/assets/images/images.png | Bin 6644 -> 5849 bytes app/assets/images/logo-black.png | Bin 2797 -> 2608 bytes app/assets/images/logo-white.png | Bin 7501 -> 7331 bytes app/assets/images/monokai-scheme-preview.png | Bin 5401 -> 3711 bytes app/assets/images/move.png | Bin 260 -> 197 bytes app/assets/images/no_avatar.png | Bin 704 -> 621 bytes app/assets/images/no_group_avatar.png | Bin 4884 -> 942 bytes app/assets/images/slider_handles.png | Bin 4122 -> 1377 bytes app/assets/images/solarized-dark-scheme-preview.png | Bin 4993 -> 3195 bytes .../images/solarized-light-scheme-preview.png | Bin 4746 -> 3095 bytes app/assets/images/switch_icon.png | Bin 1197 -> 231 bytes app/assets/images/trans_bg.gif | Bin 50 -> 49 bytes app/assets/images/white-scheme-preview.png | Bin 5617 -> 3751 bytes 28 files changed, 0 insertions(+), 0 deletions(-) (limited to 'app') diff --git a/app/assets/images/authbuttons/github_32.png b/app/assets/images/authbuttons/github_32.png index c56eef05eb9..0445b567bbc 100644 Binary files a/app/assets/images/authbuttons/github_32.png and b/app/assets/images/authbuttons/github_32.png differ diff --git a/app/assets/images/authbuttons/github_64.png b/app/assets/images/authbuttons/github_64.png index 39de55bc796..dc7c03d1005 100644 Binary files a/app/assets/images/authbuttons/github_64.png and b/app/assets/images/authbuttons/github_64.png differ diff --git a/app/assets/images/authbuttons/google_32.png b/app/assets/images/authbuttons/google_32.png index 6225cc9c2d7..b03c3ec5207 100644 Binary files a/app/assets/images/authbuttons/google_32.png and b/app/assets/images/authbuttons/google_32.png differ diff --git a/app/assets/images/authbuttons/google_64.png b/app/assets/images/authbuttons/google_64.png index 4d608f71008..94a0e089c6e 100644 Binary files a/app/assets/images/authbuttons/google_64.png and b/app/assets/images/authbuttons/google_64.png differ diff --git a/app/assets/images/authbuttons/twitter_32.png b/app/assets/images/authbuttons/twitter_32.png index 696eb02484d..a3d4964f40f 100644 Binary files a/app/assets/images/authbuttons/twitter_32.png and b/app/assets/images/authbuttons/twitter_32.png differ diff --git a/app/assets/images/authbuttons/twitter_64.png b/app/assets/images/authbuttons/twitter_64.png index 2893274766f..5c9f14cb077 100644 Binary files a/app/assets/images/authbuttons/twitter_64.png and b/app/assets/images/authbuttons/twitter_64.png differ diff --git a/app/assets/images/bg-header.png b/app/assets/images/bg-header.png index 9ecdaf4e2d5..639271c6faf 100644 Binary files a/app/assets/images/bg-header.png and b/app/assets/images/bg-header.png differ diff --git a/app/assets/images/bg_fallback.png b/app/assets/images/bg_fallback.png index d9066ad7d7b..e5fe659ba63 100644 Binary files a/app/assets/images/bg_fallback.png and b/app/assets/images/bg_fallback.png differ diff --git a/app/assets/images/brand_logo.png b/app/assets/images/brand_logo.png index 09b1689ca45..9c564bb6141 100644 Binary files a/app/assets/images/brand_logo.png and b/app/assets/images/brand_logo.png differ diff --git a/app/assets/images/chosen-sprite.png b/app/assets/images/chosen-sprite.png index d08e4b7e624..3d936b07d44 100644 Binary files a/app/assets/images/chosen-sprite.png and b/app/assets/images/chosen-sprite.png differ diff --git a/app/assets/images/dark-scheme-preview.png b/app/assets/images/dark-scheme-preview.png index 2d631a49fd3..2ef58e52549 100644 Binary files a/app/assets/images/dark-scheme-preview.png and b/app/assets/images/dark-scheme-preview.png differ diff --git a/app/assets/images/diff_note_add.png b/app/assets/images/diff_note_add.png index 8ec15b701fc..0084422e330 100644 Binary files a/app/assets/images/diff_note_add.png and b/app/assets/images/diff_note_add.png differ diff --git a/app/assets/images/icon-link.png b/app/assets/images/icon-link.png index 32ade0fe9a3..60021d5ac47 100644 Binary files a/app/assets/images/icon-link.png and b/app/assets/images/icon-link.png differ diff --git a/app/assets/images/icon-search.png b/app/assets/images/icon-search.png index 084b89e3a7c..3c1c146541d 100644 Binary files a/app/assets/images/icon-search.png and b/app/assets/images/icon-search.png differ diff --git a/app/assets/images/icon_sprite.png b/app/assets/images/icon_sprite.png index 9ad65fc443b..2e7a5023398 100644 Binary files a/app/assets/images/icon_sprite.png and b/app/assets/images/icon_sprite.png differ diff --git a/app/assets/images/images.png b/app/assets/images/images.png index da91f6b1f4c..ad146246caf 100644 Binary files a/app/assets/images/images.png and b/app/assets/images/images.png differ diff --git a/app/assets/images/logo-black.png b/app/assets/images/logo-black.png index 4a96572d570..49cdc16cacd 100644 Binary files a/app/assets/images/logo-black.png and b/app/assets/images/logo-black.png differ diff --git a/app/assets/images/logo-white.png b/app/assets/images/logo-white.png index bc2ef601a53..2299153caba 100644 Binary files a/app/assets/images/logo-white.png and b/app/assets/images/logo-white.png differ diff --git a/app/assets/images/monokai-scheme-preview.png b/app/assets/images/monokai-scheme-preview.png index 6791d1ee33d..fbb339c6a91 100644 Binary files a/app/assets/images/monokai-scheme-preview.png and b/app/assets/images/monokai-scheme-preview.png differ diff --git a/app/assets/images/move.png b/app/assets/images/move.png index 9d2d55ddf0b..6a0567f8f25 100644 Binary files a/app/assets/images/move.png and b/app/assets/images/move.png differ diff --git a/app/assets/images/no_avatar.png b/app/assets/images/no_avatar.png index dac3ab1bb89..8287acbce13 100644 Binary files a/app/assets/images/no_avatar.png and b/app/assets/images/no_avatar.png differ diff --git a/app/assets/images/no_group_avatar.png b/app/assets/images/no_group_avatar.png index a97d4515982..bfb31bb2184 100644 Binary files a/app/assets/images/no_group_avatar.png and b/app/assets/images/no_group_avatar.png differ diff --git a/app/assets/images/slider_handles.png b/app/assets/images/slider_handles.png index a6d477033fa..884378ec96a 100644 Binary files a/app/assets/images/slider_handles.png and b/app/assets/images/slider_handles.png differ diff --git a/app/assets/images/solarized-dark-scheme-preview.png b/app/assets/images/solarized-dark-scheme-preview.png index 8f904405310..7ed7336896b 100644 Binary files a/app/assets/images/solarized-dark-scheme-preview.png and b/app/assets/images/solarized-dark-scheme-preview.png differ diff --git a/app/assets/images/solarized-light-scheme-preview.png b/app/assets/images/solarized-light-scheme-preview.png index 7da5d2d2090..c50db75449b 100644 Binary files a/app/assets/images/solarized-light-scheme-preview.png and b/app/assets/images/solarized-light-scheme-preview.png differ diff --git a/app/assets/images/switch_icon.png b/app/assets/images/switch_icon.png index 6b8bde41bc9..c6b6c8d9521 100644 Binary files a/app/assets/images/switch_icon.png and b/app/assets/images/switch_icon.png differ diff --git a/app/assets/images/trans_bg.gif b/app/assets/images/trans_bg.gif index 5f6ed04a43c..1a1c9c15ec7 100644 Binary files a/app/assets/images/trans_bg.gif and b/app/assets/images/trans_bg.gif differ diff --git a/app/assets/images/white-scheme-preview.png b/app/assets/images/white-scheme-preview.png index d32b7485e1e..fc4c40b9227 100644 Binary files a/app/assets/images/white-scheme-preview.png and b/app/assets/images/white-scheme-preview.png differ -- cgit v1.2.1 From 33fea08944915f1d27c78ede2fa5d1f973b9eb49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Thu, 15 Jan 2015 23:35:32 +0100 Subject: Add placeholders to hipchat service --- app/models/project_services/hipchat_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index aafc3efa970..c4c563b3cca 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -32,8 +32,8 @@ class HipchatService < Service def fields [ - { type: 'text', name: 'token', placeholder: '' }, - { type: 'text', name: 'room', placeholder: '' }, + { type: 'text', name: 'token', placeholder: 'Room token' }, + { type: 'text', name: 'room', placeholder: 'Room name or ID' }, { type: 'text', name: 'server', placeholder: 'Leave blank for default. https://hipchat.example.com' } ] -- cgit v1.2.1 From e460e04e16abe5409b2e4918016a29b0415790ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Fri, 16 Jan 2015 14:38:53 +0100 Subject: Add Diff syntax colors for email-on-push notifications --- app/helpers/emails_helper.rb | 10 ++++++++++ app/views/layouts/notify.html.haml | 2 +- app/views/notify/repository_push_email.html.haml | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index 24d67c21d6b..b336263049c 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -29,4 +29,14 @@ module EmailsHelper end end end + + def add_email_highlight_css + Rugments::Themes::Github.render(:scope => '.highlight') + end + + def color_email_diff(diffcontent) + formatter = Rugments::Formatters::HTML.new(cssclass: 'highlight') + lexer = Rugments::Lexers::Diff.new + raw formatter.format(lexer.lex(diffcontent)) + end end diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index e81cf9e5bf6..a722db2f32c 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -16,7 +16,7 @@ font-size:small; color:#777 } - + #{add_email_highlight_css} %body %div.content = yield diff --git a/app/views/notify/repository_push_email.html.haml b/app/views/notify/repository_push_email.html.haml index d678147ec5d..b6fe445867c 100644 --- a/app/views/notify/repository_push_email.html.haml +++ b/app/views/notify/repository_push_email.html.haml @@ -23,7 +23,7 @@ = diff.new_path || diff.old_path %hr %pre - = diff.diff + = color_email_diff(diff.diff) %br - if @compare.timeout -- cgit v1.2.1 From 8243eb3f0e3ee06a793831ae0899bfe409a31903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Sat, 17 Jan 2015 14:12:49 +0100 Subject: Show tags in commit view --- app/controllers/projects/commit_controller.rb | 1 + app/helpers/commits_helper.rb | 6 ++++++ app/models/repository.rb | 17 +++++++++++++++++ app/views/projects/commit/_commit_box.html.haml | 7 +++++++ 4 files changed, 31 insertions(+) (limited to 'app') diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index dac858d8e16..470efbd2114 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -12,6 +12,7 @@ class Projects::CommitController < Projects::ApplicationController @line_notes = @project.notes.for_commit_id(commit.id).inline @branches = @project.repository.branch_names_contains(commit.id) + @tags = @project.repository.tag_names_contains(commit.id) @diffs = @commit.diffs @note = @project.build_commit_note(commit) @notes_count = @project.notes.for_commit_id(commit.id).count diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 36adeadd8a5..6a6d483ba66 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -65,6 +65,12 @@ module CommitsHelper branches.sort.map { |branch| link_to(branch, project_tree_path(project, branch)) }.join(", ").html_safe end + # Returns the sorted links to tags, separated by a comma + def commit_tags_links(project, tags) + sorted = VersionSorter.rsort(tags) + sorted.map { |tag| link_to(tag, project_commits_path(project, project.repository.find_tag(tag).name)) }.join(", ").html_safe + end + def link_to_browse_code(project, commit) if current_controller?(:projects, :commits) if @repo.blob_at(commit.id, @path) diff --git a/app/models/repository.rb b/app/models/repository.rb index 93994123a90..e93c76790c7 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -312,4 +312,21 @@ class Repository [] end end + + def tag_names_contains(sha) + args = %W(git tag --contains #{sha}) + names = Gitlab::Popen.popen(args, path_to_repo).first + + if names.respond_to?(:split) + names = names.split("\n").map(&:strip) + + names.each do |name| + name.slice! '* ' + end + + names + else + [] + end + end end diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index e149f017f84..1d4658432ae 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -50,6 +50,13 @@ %span.js-details-content.hide = commit_branches_links(@project, @branches) +- if @tags.any? + .commit-info-row + %span.cgray + Tags: + %span + = commit_tags_links(@project, @tags) + .commit-box %h3.commit-title = gfm escape_once(@commit.title) -- cgit v1.2.1 From ef0b15c55268fbf7ac8ee0bd0b5b8bc0fe265ac4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 17 Jan 2015 14:54:54 -0800 Subject: Fix commits pagination --- app/views/projects/commits/_commits.html.haml | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app') diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml index f279e3c37cd..2d0ca671fa0 100644 --- a/app/views/projects/commits/_commits.html.haml +++ b/app/views/projects/commits/_commits.html.haml @@ -1,3 +1,6 @@ +- unless defined?(project) + - project = @project + - @commits.group_by { |c| c.committed_date.to_date }.sort.reverse.each do |day, commits| .row.commits-row .col-md-2 -- cgit v1.2.1 From 20028523b5a2969b70a1fde9468c434b78f916ea Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Sat, 17 Jan 2015 15:37:27 -0800 Subject: Application admin scaffold --- app/controllers/admin/applications_controller.rb | 52 ++++++++++++++++++++++ app/controllers/oauth/applications_controller.rb | 6 +-- .../admin/applications/_delete_form.html.haml | 4 ++ app/views/admin/applications/_form.html.haml | 24 ++++++++++ app/views/admin/applications/edit.html.haml | 3 ++ app/views/admin/applications/index.html.haml | 16 +++++++ app/views/admin/applications/new.html.haml | 3 ++ app/views/admin/applications/show.html.haml | 26 +++++++++++ app/views/layouts/nav/_admin.html.haml | 6 +++ 9 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 app/controllers/admin/applications_controller.rb create mode 100644 app/views/admin/applications/_delete_form.html.haml create mode 100644 app/views/admin/applications/_form.html.haml create mode 100644 app/views/admin/applications/edit.html.haml create mode 100644 app/views/admin/applications/index.html.haml create mode 100644 app/views/admin/applications/new.html.haml create mode 100644 app/views/admin/applications/show.html.haml (limited to 'app') diff --git a/app/controllers/admin/applications_controller.rb b/app/controllers/admin/applications_controller.rb new file mode 100644 index 00000000000..cba19184dba --- /dev/null +++ b/app/controllers/admin/applications_controller.rb @@ -0,0 +1,52 @@ +class Admin::ApplicationsController < Admin::ApplicationController + before_action :set_application, only: [:show, :edit, :update, :destroy] + + def index + @applications = Doorkeeper::Application.where("owner_id IS NULL") + end + + def show + end + + def new + @application = Doorkeeper::Application.new + end + + def edit + end + + def create + @application = Doorkeeper::Application.new(application_params) + + if @application.save + flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) + redirect_to admin_application_url(@application) + else + render :new + end + end + + def update + if @application.update(application_params) + redirect_to admin_application_path(@application), notice: 'Application was successfully updated.' + else + render :edit + end + end + + def destroy + @application.destroy + redirect_to admin_applications_url, notice: 'Application was successfully destroyed.' + end + + private + + def set_application + @application = Doorkeeper::Application.where("owner_id IS NULL").find(params[:id]) + end + + # Only allow a trusted parameter "white list" through. + def application_params + params[:doorkeeper_application].permit(:name, :redirect_uri) + end +end diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb index 3407490e498..efa291d9397 100644 --- a/app/controllers/oauth/applications_controller.rb +++ b/app/controllers/oauth/applications_controller.rb @@ -9,10 +9,8 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController def create @application = Doorkeeper::Application.new(application_params) - if Doorkeeper.configuration.confirm_application_owner? - @application.owner = current_user - end - + @application.owner = current_user + if @application.save flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) redirect_to oauth_application_url(@application) diff --git a/app/views/admin/applications/_delete_form.html.haml b/app/views/admin/applications/_delete_form.html.haml new file mode 100644 index 00000000000..371ac55209f --- /dev/null +++ b/app/views/admin/applications/_delete_form.html.haml @@ -0,0 +1,4 @@ +- submit_btn_css ||= 'btn btn-link btn-remove btn-small' += form_tag admin_application_path(application) do + %input{:name => "_method", :type => "hidden", :value => "delete"}/ + = submit_tag 'Destroy', onclick: "return confirm('Are you sure?')", class: submit_btn_css \ No newline at end of file diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml new file mode 100644 index 00000000000..b77d188a38d --- /dev/null +++ b/app/views/admin/applications/_form.html.haml @@ -0,0 +1,24 @@ += form_for [:admin, @application], url: @url, html: {class: 'form-horizontal', role: 'form'} do |f| + - if application.errors.any? + .alert.alert-danger{"data-alert" => ""} + %p Whoops! Check your form for possible errors + = content_tag :div, class: "form-group#{' has-error' if application.errors[:name].present?}" do + = f.label :name, class: 'col-sm-2 control-label' + .col-sm-10 + = f.text_field :name, class: 'form-control' + = doorkeeper_errors_for application, :name + = content_tag :div, class: "form-group#{' has-error' if application.errors[:redirect_uri].present?}" do + = f.label :redirect_uri, class: 'col-sm-2 control-label' + .col-sm-10 + = f.text_area :redirect_uri, class: 'form-control' + = doorkeeper_errors_for application, :redirect_uri + %span.help-block + Use one line per URI + - if Doorkeeper.configuration.native_redirect_uri + %span.help-block + Use + %code= Doorkeeper.configuration.native_redirect_uri + for local tests + .form-actions + = f.submit 'Submit', class: "btn btn-primary wide" + = link_to "Cancel", admin_applications_path, class: "btn btn-default" diff --git a/app/views/admin/applications/edit.html.haml b/app/views/admin/applications/edit.html.haml new file mode 100644 index 00000000000..e408ae2f29d --- /dev/null +++ b/app/views/admin/applications/edit.html.haml @@ -0,0 +1,3 @@ +%h3.page-title Edit application +- @url = admin_application_path(@application) += render 'form', application: @application \ No newline at end of file diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml new file mode 100644 index 00000000000..b0af75573b0 --- /dev/null +++ b/app/views/admin/applications/index.html.haml @@ -0,0 +1,16 @@ +%h3.page-title Your applications +%p= link_to 'New Application', new_admin_application_path, class: 'btn btn-success' +%table.table.table-striped + %thead + %tr + %th Name + %th Callback URL + %th + %th + %tbody + - @applications.each do |application| + %tr{:id => "application_#{application.id}"} + %td= link_to application.name, admin_application_path(application) + %td= application.redirect_uri + %td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link' + %td= render 'delete_form', application: application \ No newline at end of file diff --git a/app/views/admin/applications/new.html.haml b/app/views/admin/applications/new.html.haml new file mode 100644 index 00000000000..7c62425f19c --- /dev/null +++ b/app/views/admin/applications/new.html.haml @@ -0,0 +1,3 @@ +%h3.page-title New application +- @url = admin_applications_path += render 'form', application: @application \ No newline at end of file diff --git a/app/views/admin/applications/show.html.haml b/app/views/admin/applications/show.html.haml new file mode 100644 index 00000000000..2abe390ce13 --- /dev/null +++ b/app/views/admin/applications/show.html.haml @@ -0,0 +1,26 @@ +%h3.page-title + Application: #{@application.name} + + +%table.table + %tr + %td + Application Id + %td + %code#application_id= @application.uid + %tr + %td + Secret: + %td + %code#secret= @application.secret + + %tr + %td + Callback url + %td + - @application.redirect_uri.split.each do |uri| + %div + %span.monospace= uri +.form-actions + = link_to 'Edit', edit_admin_application_path(@application), class: 'btn btn-primary wide pull-left' + = render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index fdc517617e3..d48dfcd4e94 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -45,3 +45,9 @@ %i.fa.fa-cogs %span Settings + + = nav_link(controller: :applications) do + = link_to admin_applications_path do + %i.fa.fa-unlock-alt + %span + Application -- cgit v1.2.1 From a81081aa72ad516d685152ea4790f9156262ab92 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 17 Jan 2015 16:17:34 -0800 Subject: Small improvements to CI --- app/controllers/admin/applications_controller.rb | 2 +- app/views/admin/applications/index.html.haml | 10 ++++++++-- app/views/layouts/nav/_admin.html.haml | 6 +++--- 3 files changed, 12 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/applications_controller.rb b/app/controllers/admin/applications_controller.rb index cba19184dba..471d24934a0 100644 --- a/app/controllers/admin/applications_controller.rb +++ b/app/controllers/admin/applications_controller.rb @@ -17,7 +17,7 @@ class Admin::ApplicationsController < Admin::ApplicationController def create @application = Doorkeeper::Application.new(application_params) - + if @application.save flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) redirect_to admin_application_url(@application) diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml index b0af75573b0..97991ca13e6 100644 --- a/app/views/admin/applications/index.html.haml +++ b/app/views/admin/applications/index.html.haml @@ -1,10 +1,15 @@ -%h3.page-title Your applications +%h3.page-title + System OAuth applications +%p.light + System OAuth application does not belong to certain user and can be managed only by admins +%hr %p= link_to 'New Application', new_admin_application_path, class: 'btn btn-success' %table.table.table-striped %thead %tr %th Name %th Callback URL + %th Clients %th %th %tbody @@ -12,5 +17,6 @@ %tr{:id => "application_#{application.id}"} %td= link_to application.name, admin_application_path(application) %td= application.redirect_uri + %td= application.access_tokens.count %td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link' - %td= render 'delete_form', application: application \ No newline at end of file + %td= render 'delete_form', application: application diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index d48dfcd4e94..d9c6670d1bc 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -11,7 +11,7 @@ Projects = nav_link(controller: :users) do = link_to admin_users_path do - %i.fa.fa-users + %i.fa.fa-user %span Users = nav_link(controller: :groups) do @@ -48,6 +48,6 @@ = nav_link(controller: :applications) do = link_to admin_applications_path do - %i.fa.fa-unlock-alt + %i.fa.fa-cloud %span - Application + Applications -- cgit v1.2.1 From d84a2ab641f7e69ff597954ad0fb3aa5fdffe1e4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 17 Jan 2015 23:01:45 -0800 Subject: Expand sidebar only for large devices --- app/assets/stylesheets/sections/nav_sidebar.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index dc1a889ed5f..9fb7c017d02 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -148,10 +148,10 @@ } } -@media (max-width: $screen-sm-max) { +@media (max-width: $screen-md-max) { @include folded-sidebar; } -@media(min-width: $screen-sm-max) { +@media(min-width: $screen-md-max) { @include expanded-sidebar; } -- cgit v1.2.1 From 1e9e3fc73dda9a76c1de1df373e7a5af7a584d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Sat, 17 Jan 2015 10:00:52 +0100 Subject: Make the project search case insensitive --- app/models/project.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index b0c379e6157..62ded86f878 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -183,7 +183,7 @@ class Project < ActiveRecord::Base end def search(query) - joins(:namespace).where("projects.archived = ?", false).where("projects.name LIKE :query OR projects.path LIKE :query OR namespaces.name LIKE :query OR projects.description LIKE :query", query: "%#{query}%") + joins(:namespace).where("projects.archived = ?", false).where("LOWER(projects.name) LIKE :query OR LOWER(projects.path) LIKE :query OR LOWER(namespaces.name) LIKE :query OR LOWER(projects.description) LIKE :query", query: "%#{query.downcase}%") end def search_by_title(query) -- cgit v1.2.1 From 5c801602189bdf179432e9ef5885f6c6fef438f2 Mon Sep 17 00:00:00 2001 From: Steven Burgart Date: Sun, 18 Jan 2015 10:29:37 -0500 Subject: Fix various typos signe-in -> signed-in go_to_gihub_for_permissions -> go_to_github_for_permissions descendand -> descendant behavour -> behaviour recepient_email -> recipient_email generate_fingerpint -> generate_fingerprint dependes -> depends Cant't -> Can't wisit -> visit notifcation -> notification sufficent_scope -> sufficient_scope? levet -> level --- app/controllers/application_controller.rb | 2 +- app/controllers/github_imports_controller.rb | 6 +++--- app/helpers/tree_helper.rb | 2 +- app/mailers/emails/merge_requests.rb | 2 +- app/mailers/notify.rb | 4 ++-- app/models/key.rb | 4 ++-- app/models/merge_request.rb | 4 ++-- app/models/network/graph.rb | 2 +- app/models/note.rb | 2 +- app/services/notification_service.rb | 2 +- app/services/oauth2/access_token_validation_service.rb | 4 ++-- app/services/projects/create_service.rb | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6da4f91c3f4..ad13a0ac3e4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -49,7 +49,7 @@ class ApplicationController < ActionController::Base end def authenticate_user!(*args) - # If user is not signe-in and tries to access root_path - redirect him to landing page + # If user is not signed-in and tries to access root_path - redirect him to landing page if current_application_settings.home_page_url.present? if current_user.nil? && controller_name == 'dashboard' && action_name == 'show' redirect_to current_application_settings.home_page_url and return diff --git a/app/controllers/github_imports_controller.rb b/app/controllers/github_imports_controller.rb index c96bef598be..86e20b16646 100644 --- a/app/controllers/github_imports_controller.rb +++ b/app/controllers/github_imports_controller.rb @@ -58,11 +58,11 @@ class GithubImportsController < ApplicationController def github_auth if current_user.github_access_token.blank? - go_to_gihub_for_permissions + go_to_github_for_permissions end end - def go_to_gihub_for_permissions + def go_to_github_for_permissions redirect_to client.auth_code.authorize_url({ redirect_uri: callback_github_import_url, scope: "repo, user, user:email" @@ -70,6 +70,6 @@ class GithubImportsController < ApplicationController end def github_unauthorized - go_to_gihub_for_permissions + go_to_github_for_permissions end end diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index d316213b1fd..b614fb67acb 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -113,7 +113,7 @@ module TreeHelper tree_join(@ref, file) end - # returns the relative path of the first subdir that doesn't have only one directory descendand + # returns the relative path of the first subdir that doesn't have only one directory descendant def flatten_tree(tree) subtree = Gitlab::Git::Tree.where(@repository, @commit.id, tree.path) if subtree.count == 1 && subtree.first.dir? diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb index 9ecdac87d72..7f6c855c301 100644 --- a/app/mailers/emails/merge_requests.rb +++ b/app/mailers/emails/merge_requests.rb @@ -56,7 +56,7 @@ module Emails end end - # Over rides default behavour to show source/target + # Over rides default behaviour to show source/target # Formats arguments into a String suitable for use as an email subject # # extra - Extra Strings to be inserted into the subject diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 6d671e6e0bd..5ae07d771fa 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -26,8 +26,8 @@ class Notify < ActionMailer::Base delay_for(2.seconds) end - def test_email(recepient_email, subject, body) - mail(to: recepient_email, + def test_email(recipient_email, subject, body) + mail(to: recipient_email, subject: subject, body: body.html_safe, content_type: 'text/html' diff --git a/app/models/key.rb b/app/models/key.rb index 65a426d1f8b..d2d1af68822 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -19,7 +19,7 @@ class Key < ActiveRecord::Base belongs_to :user - before_validation :strip_white_space, :generate_fingerpint + before_validation :strip_white_space, :generate_fingerprint validates :title, presence: true, length: { within: 0..255 } validates :key, presence: true, length: { within: 0..5000 }, format: { with: /\A(ssh|ecdsa)-.*\Z/ }, uniqueness: true @@ -76,7 +76,7 @@ class Key < ActiveRecord::Base private - def generate_fingerpint + def generate_fingerprint self.fingerprint = nil return unless key.present? diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index de0ee0e2c5a..9bc0afa6037 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -330,7 +330,7 @@ class MergeRequest < ActiveRecord::Base end # Return array of possible target branches - # dependes on target project of MR + # depends on target project of MR def target_branches if target_project.nil? [] @@ -340,7 +340,7 @@ class MergeRequest < ActiveRecord::Base end # Return array of possible source branches - # dependes on source project of MR + # depends on source project of MR def source_branches if source_project.nil? [] diff --git a/app/models/network/graph.rb b/app/models/network/graph.rb index 43979b5e807..7f761f2bdf2 100644 --- a/app/models/network/graph.rb +++ b/app/models/network/graph.rb @@ -84,7 +84,7 @@ module Network skip += self.class.max_count end else - # Cant't find the target commit in the repo. + # Can't find the target commit in the repo. offset = 0 end end diff --git a/app/models/note.rb b/app/models/note.rb index e99bc2668d6..b78c8b343a1 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -480,7 +480,7 @@ class Note < ActiveRecord::Base end # FIXME: Hack for polymorphic associations with STI - # For more information wisit http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Polymorphic+Associations + # For more information visit http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Polymorphic+Associations def noteable_type=(sType) super(sType.to_s.classify.constantize.base_class.to_s) end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 5a89c5d2936..72c9149378e 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -242,7 +242,7 @@ class NotificationService users end - # Build a list of users based on group notifcation settings + # Build a list of users based on group notification settings def select_users_group_setting(project, project_members, global_setting, users_global_level_watch) uids = users_group_notification(project, Notification::N_WATCH) diff --git a/app/services/oauth2/access_token_validation_service.rb b/app/services/oauth2/access_token_validation_service.rb index 95283489753..5a3b94129f1 100644 --- a/app/services/oauth2/access_token_validation_service.rb +++ b/app/services/oauth2/access_token_validation_service.rb @@ -13,7 +13,7 @@ module Oauth2::AccessTokenValidationService elsif token.revoked? return REVOKED - elsif !self.sufficent_scope?(token, scopes) + elsif !self.sufficient_scope?(token, scopes) return INSUFFICIENT_SCOPE else @@ -24,7 +24,7 @@ module Oauth2::AccessTokenValidationService protected # True if the token's scope is a superset of required scopes, # or the required scopes is empty. - def sufficent_scope?(token, scopes) + def sufficient_scope?(token, scopes) if scopes.blank? # if no any scopes required, the scopes of token is sufficient. return true diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 31226b7504b..139de70114b 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -7,7 +7,7 @@ module Projects def execute @project = Project.new(params) - # Reset visibility levet if is not allowed to set it + # Reset visibility level if is not allowed to set it unless Gitlab::VisibilityLevel.allowed_for?(current_user, params[:visibility_level]) @project.visibility_level = default_features.visibility_level end -- cgit v1.2.1 From b78c38e9dcb0011b5c9e34535cad965d6b9d7908 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 18 Jan 2015 19:03:50 -0800 Subject: Fix comment text overflow and wrong margin --- app/assets/stylesheets/sections/notes.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 117e5e7f977..a124d235783 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -61,8 +61,12 @@ ul.notes { font-size: 14px; } .note-body { - @include md-typography; overflow: auto; + .note-text { + overflow: auto; + word-wrap: break-word; + @include md-typography; + } } .note-header { padding-bottom: 3px; -- cgit v1.2.1 From 77adf81e870d2a8ec5faf296cca620dd7e485eb6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 18 Jan 2015 19:13:41 -0800 Subject: Fix tests --- app/models/project.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index 62ded86f878..a22f852de6b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -183,7 +183,12 @@ class Project < ActiveRecord::Base end def search(query) - joins(:namespace).where("projects.archived = ?", false).where("LOWER(projects.name) LIKE :query OR LOWER(projects.path) LIKE :query OR LOWER(namespaces.name) LIKE :query OR LOWER(projects.description) LIKE :query", query: "%#{query.downcase}%") + joins(:namespace).where("projects.archived = ?", false). + where("LOWER(projects.name) LIKE :query OR + LOWER(projects.path) LIKE :query OR + LOWER(namespaces.name) LIKE :query OR + LOWER(projects.description) LIKE :query", + query: "%#{query.try(:downcase)}%") end def search_by_title(query) -- cgit v1.2.1 From 3e17d15661a8c6bae2dc92fe09ed9e75a1f7a1a7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 18 Jan 2015 19:39:29 -0800 Subject: Improve edited ago helpers --- app/helpers/issues_helper.rb | 6 ++++-- app/helpers/notes_helper.rb | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index a5b393c1e3c..bcf108c5c48 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -67,8 +67,10 @@ module IssuesHelper ts = "#{time_ago_with_tooltip(issue.created_at, 'bottom', 'note_created_ago')}" if issue.updated_at != issue.created_at ts << capture_haml do - haml_tag :small do - haml_concat " (Edited #{time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_edited_ago')})" + haml_tag :span do + haml_concat '·' + haml_concat ' ' + haml_concat time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_edited_ago') end end end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 6d2244b8714..8f493f5d331 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -20,8 +20,10 @@ module NotesHelper ts = "#{time_ago_with_tooltip(note.created_at, 'bottom', 'note_created_ago')}" if note.updated_at != note.created_at ts << capture_haml do - haml_tag :small do - haml_concat " (Edited #{time_ago_with_tooltip(note.updated_at, 'bottom', 'note_edited_ago')})" + haml_tag :span do + haml_concat '·' + haml_concat ' ' + haml_concat time_ago_with_tooltip(note.updated_at, 'bottom', 'note_edited_ago') end end end -- cgit v1.2.1 From 3a46ea4ce666fb0276d71a55f8ee3c5fad76b66d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 18 Jan 2015 19:39:43 -0800 Subject: Few improvements to mobile UI --- app/assets/stylesheets/generic/mobile.scss | 4 ++++ app/assets/stylesheets/sections/issues.scss | 4 ++++ 2 files changed, 8 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss index 90703cde0d1..54e06661161 100644 --- a/app/assets/stylesheets/generic/mobile.scss +++ b/app/assets/stylesheets/generic/mobile.scss @@ -46,4 +46,8 @@ .page-title .new-issue-link { display: none; } + + .issue_edited_ago, .note_edited_ago { + display: none; + } } diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 26dc71c6d8f..fbfd9c8cd9b 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -166,3 +166,7 @@ form.edit-issue { .issue-title { margin-top: 0; } + +.context .select2-container { + width: 100% !important; +} -- cgit v1.2.1 From fd41e39906544e3e587ccd38491f4fa6cd445a99 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 18 Jan 2015 19:42:09 -0800 Subject: Votes block has less priority than assignee/milestone --- app/views/projects/issues/_discussion.html.haml | 8 ++++---- app/views/projects/merge_requests/_discussion.html.haml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index ec03f375d6b..b5d6a16a1e1 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -19,14 +19,14 @@ %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} = cross_project_reference(@project, @issue) %hr + .context + %cite.cgray + = render partial: 'issue_context', locals: { issue: @issue } + %hr .clearfix .votes-holder %h6 Votes #votes= render 'votes/votes_block', votable: @issue - %hr - .context - %cite.cgray - = render partial: 'issue_context', locals: { issue: @issue } - if @issue.labels.any? %hr diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index 6bb5c465596..64bae800785 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -14,13 +14,13 @@ %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} = cross_project_reference(@project, @merge_request) %hr - .votes-holder.hidden-sm.hidden-xs - %h6 Votes - #votes= render 'votes/votes_block', votable: @merge_request - %hr .context %cite.cgray = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } + %hr + .votes-holder.hidden-sm.hidden-xs + %h6 Votes + #votes= render 'votes/votes_block', votable: @merge_request - if @merge_request.labels.any? %hr -- cgit v1.2.1 From 85c0ce2e1a2f99de2e7155026cd97d5fe9765018 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 18 Jan 2015 19:53:46 -0800 Subject: Reduce sidebar width by 10px --- app/assets/stylesheets/main/variables.scss | 5 +++++ app/assets/stylesheets/sections/nav_sidebar.scss | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index e65f07bdc63..aded9cb549d 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -52,3 +52,8 @@ $nprogress-color: #c0392b; * Font sizes */ $list-font-size: 15px; + +/** + * Sidebar navigation width + */ +$sidebar_width: 240px; diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 9fb7c017d02..a61c053b8a9 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -1,3 +1,5 @@ + + .page-with-sidebar { background: #F5F5F5; @@ -100,17 +102,17 @@ @mixin expanded-sidebar { .page-with-sidebar { - padding-left: 250px; + padding-left: $sidebar_width; } .sidebar-wrapper { - width: 250px; + width: $sidebar_width; .nav-sidebar { margin-top: 20px; position: fixed; top: 45px; - width: 250px; + width: $sidebar_width; } } -- cgit v1.2.1 From a5f5849340b4ad38da21fcada446ef3eb01872b5 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 18 Jan 2015 20:11:17 -0800 Subject: Dont allow event content to overflow it UI limits --- app/assets/stylesheets/sections/events.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 3c3a0d92c6e..9582c995980 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -55,11 +55,12 @@ } .event-body { margin-left: 35px; - margin-right: 100px; + margin-right: 80px; color: #777; .event-note { margin-top: 5px; + word-wrap: break-word; .md { font-size: 13px; @@ -71,6 +72,7 @@ border-radius: 0; color: #777; margin: 0 20px; + overflow: hidden; } .note-image-attach { -- cgit v1.2.1 From 6bf58e76bd9b74239b668f09c1c38e89d5e53f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Mon, 19 Jan 2015 12:55:05 +0100 Subject: Remove unnecessary / from avatar url So http://localhost:3000//uploads/user/avatar/1/avatar.png becomes http://localhost:3000/uploads/user/avatar/1/avatar.png --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index 743410c22e3..06521d9fd5c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -497,7 +497,7 @@ class User < ActiveRecord::Base def avatar_url(size = nil) if avatar.present? - [gitlab_config.url, avatar.url].join("/") + [gitlab_config.url, avatar.url].join else GravatarService.new.execute(email, size) end -- cgit v1.2.1 From 3d2aaa169ea7cfa8d416103c70711a440c716dd9 Mon Sep 17 00:00:00 2001 From: Headless Date: Mon, 19 Jan 2015 16:07:37 +0300 Subject: show diff in submodules --- app/helpers/diff_helper.rb | 15 +++++++++++++++ app/helpers/submodule_helper.rb | 4 ++-- app/views/projects/diffs/_file.html.haml | 3 +++ app/views/projects/tree/_submodule_item.html.haml | 10 +--------- 4 files changed, 21 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index a15af0be01a..8c921cba543 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -135,4 +135,19 @@ module DiffHelper 'Side-by-side' end end + + def submodule_link(blob, ref) + tree, commit = submodule_links(blob, ref) + commit_id = if commit.nil? + blob.id[0..10] + else + link_to "#{blob.id[0..10]}", commit + end + + [ + content_tag(:span, link_to(truncate(blob.name, length: 40), tree)), + '@', + content_tag(:span, commit_id, class: 'monospace'), + ].join(' ').html_safe + end end diff --git a/app/helpers/submodule_helper.rb b/app/helpers/submodule_helper.rb index 09e5c08e621..841e7fd17f6 100644 --- a/app/helpers/submodule_helper.rb +++ b/app/helpers/submodule_helper.rb @@ -2,8 +2,8 @@ module SubmoduleHelper include Gitlab::ShellAdapter # links to files listing for submodule if submodule is a project on this server - def submodule_links(submodule_item) - url = @repository.submodule_url_for(@ref, submodule_item.path) + def submodule_links(submodule_item, ref = nil) + url = @repository.submodule_url_for(ref, submodule_item.path) return url, nil unless url =~ /([^\/:]+\/[^\/]+\.git)\Z/ diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml index 34d13502231..8d080f710d8 100644 --- a/app/views/projects/diffs/_file.html.haml +++ b/app/views/projects/diffs/_file.html.haml @@ -9,6 +9,9 @@ .diff-btn-group - if @commit.parent_ids.present? = view_file_btn(@commit.parent_id, diff_file, project) + - elsif diff_file.diff.submodule? + - submodule_item = project.repository.blob_at(@commit.id, diff_file.file_path) + = submodule_link(submodule_item, @commit.id) - else - if diff_file.renamed_file %span= "#{diff_file.old_path} renamed to #{diff_file.new_path}" diff --git a/app/views/projects/tree/_submodule_item.html.haml b/app/views/projects/tree/_submodule_item.html.haml index 46e9be4af83..20c70cac699 100644 --- a/app/views/projects/tree/_submodule_item.html.haml +++ b/app/views/projects/tree/_submodule_item.html.haml @@ -1,14 +1,6 @@ -- tree, commit = submodule_links(submodule_item) %tr{ class: "tree-item" } %td.tree-item-file-name %i.fa.fa-archive - %span - = link_to truncate(submodule_item.name, length: 40), tree - @ - %span.monospace - - if commit.nil? - #{truncate_sha(submodule_item.id)} - - else - = link_to "#{truncate_sha(submodule_item.id)}", commit + = submodule_link(submodule_item, @ref) %td %td.hidden-xs -- cgit v1.2.1 From 1809b3ee36b38cd47504114dfb1fed53206ebd15 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 19 Jan 2015 11:18:00 -0800 Subject: Spinach for admin applications --- app/views/admin/applications/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml index 97991ca13e6..f2fed51eaf8 100644 --- a/app/views/admin/applications/index.html.haml +++ b/app/views/admin/applications/index.html.haml @@ -12,7 +12,7 @@ %th Clients %th %th - %tbody + %tbody.oauth-applications - @applications.each do |application| %tr{:id => "application_#{application.id}"} %td= link_to application.name, admin_application_path(application) -- cgit v1.2.1 From 505a492cd87be7683827c5f46a05b6a7dddffc86 Mon Sep 17 00:00:00 2001 From: Michael Clarke Date: Wed, 5 Nov 2014 20:45:18 +0000 Subject: Only count the user's last vote --- app/assets/stylesheets/generic/typography.scss | 4 ++++ app/models/concerns/issuable.rb | 16 ++++++++++++++-- app/models/note.rb | 17 +++++++++++++++++ app/views/projects/notes/_note.html.haml | 26 ++++++++++++++++++-------- 4 files changed, 53 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss index 385a627b4be..58243bc5ba2 100644 --- a/app/assets/stylesheets/generic/typography.scss +++ b/app/assets/stylesheets/generic/typography.scss @@ -128,3 +128,7 @@ a:focus { textarea.js-gfm-input { font-family: $monospace_font; } + +.strikethrough { + text-decoration: line-through; +} \ No newline at end of file diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index f49708fd6eb..b8bee0d0ec0 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -88,7 +88,7 @@ module Issuable # Return the number of -1 comments (downvotes) def downvotes - notes.select(&:downvote?).size + filter_superceded_votes(notes.select(&:downvote?), notes).size end def downvotes_in_percent @@ -101,7 +101,7 @@ module Issuable # Return the number of +1 comments (upvotes) def upvotes - notes.select(&:upvote?).size + filter_superceded_votes(notes.select(&:upvote?), notes).size end def upvotes_in_percent @@ -154,4 +154,16 @@ module Issuable self.labels << label end end + + private + + def filter_superceded_votes(votes, notes) + filteredvotes = [] + votes + votes.each do |vote| + if vote.superceded?(notes) + filteredvotes.delete(vote) + end + end + filteredvotes + end end diff --git a/app/models/note.rb b/app/models/note.rb index e99bc2668d6..1b7e412e9c5 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -459,6 +459,23 @@ class Note < ActiveRecord::Base ) end + def superceded?(notes) + return false unless vote? + notes.each do |note| + next if note == self + if note.vote? && + self[:author_id] == note[:author_id] && + self[:created_at] <= note[:created_at] + return true + end + end + false + end + + def vote? + upvote? || downvote? + end + def votable? for_issue? || (for_merge_request? && !for_diff_line?) end diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 691c169b620..88c7b7ccf1a 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -28,14 +28,24 @@ %span.note-last-update = note_timestamp(note) - - if note.upvote? - %span.vote.upvote.label.label-success - %i.fa.fa-thumbs-up - \+1 - - if note.downvote? - %span.vote.downvote.label.label-danger - %i.fa.fa-thumbs-down - \-1 + - if note.superceded?(@notes) + - if note.upvote? + %span.vote.upvote.label.label-gray.strikethrough + %i.fa.fa-thumbs-up + \+1 + - if note.downvote? + %span.vote.downvote.label.label-gray.strikethrough + %i.fa.fa-thumbs-down + \-1 + - else + - if note.upvote? + %span.vote.upvote.label.label-success + %i.fa.fa-thumbs-up + \+1 + - if note.downvote? + %span.vote.downvote.label.label-danger + %i.fa.fa-thumbs-down + \-1 .note-body -- cgit v1.2.1 From 54f9432255fe96d70543ecbcb847be657b7b6978 Mon Sep 17 00:00:00 2001 From: Job van der Voort Date: Mon, 19 Jan 2015 22:25:09 -0800 Subject: fix border radius top left for descriptions --- app/assets/stylesheets/generic/gfm.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/gfm.scss b/app/assets/stylesheets/generic/gfm.scss index e257f053618..1427b6a5ae4 100644 --- a/app/assets/stylesheets/generic/gfm.scss +++ b/app/assets/stylesheets/generic/gfm.scss @@ -4,6 +4,7 @@ .issue-form, .merge-request-form, .wiki-form { .description { height: 20em; + border-top-left-radius: 0; } } @@ -17,4 +18,4 @@ .description { height: 14em; } -} \ No newline at end of file +} -- cgit v1.2.1 From 46755a7bfec1a35ff7967cf92ed8da3d911d32f0 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Tue, 20 Jan 2015 09:16:26 +0200 Subject: Disable 'check all issues' checkbox for unprivileged users. --- app/views/projects/issues/_issues.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 010ca3b68b3..816851a8abe 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -1,6 +1,6 @@ .append-bottom-10 .check-all-holder - = check_box_tag "check_all_issues", nil, false, class: "check_all_issues left" + = check_box_tag "check_all_issues", nil, false, class: "check_all_issues left", disabled: !can?(current_user, :modify_issue, @project) = render 'shared/issuable_filter' .clearfix -- cgit v1.2.1 From 4ffdb83e713b1ffa9578c02d31cfd0d9afe56ca7 Mon Sep 17 00:00:00 2001 From: jubianchi Date: Sun, 18 Jan 2015 01:34:34 +0100 Subject: Add action property to merge request hook --- app/services/merge_requests/base_service.rb | 5 ++++- app/services/merge_requests/close_service.rb | 2 +- app/services/merge_requests/merge_service.rb | 2 +- app/services/merge_requests/reopen_service.rb | 2 +- app/services/merge_requests/update_service.rb | 2 +- 5 files changed, 8 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb index 7f3421b8e4b..b4199d1c800 100644 --- a/app/services/merge_requests/base_service.rb +++ b/app/services/merge_requests/base_service.rb @@ -5,9 +5,12 @@ module MergeRequests Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil) end - def execute_hooks(merge_request) + def execute_hooks(merge_request, action = 'open') if merge_request.project hook_data = merge_request.to_hook_data(current_user) + merge_request_url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id) + hook_data[:object_attributes][:url] = merge_request_url + hook_data[:object_attributes][:action] = action merge_request.project.execute_hooks(hook_data, :merge_request_hooks) end end diff --git a/app/services/merge_requests/close_service.rb b/app/services/merge_requests/close_service.rb index 64e37a23e6b..4249a84f382 100644 --- a/app/services/merge_requests/close_service.rb +++ b/app/services/merge_requests/close_service.rb @@ -9,7 +9,7 @@ module MergeRequests event_service.close_mr(merge_request, current_user) notification_service.close_mr(merge_request, current_user) create_note(merge_request) - execute_hooks(merge_request) + execute_hooks(merge_request, 'close') end merge_request diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 5de7247d617..1e1614028f7 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -12,7 +12,7 @@ module MergeRequests notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) create_note(merge_request) - execute_hooks(merge_request) + execute_hooks(merge_request, 'merge') true rescue diff --git a/app/services/merge_requests/reopen_service.rb b/app/services/merge_requests/reopen_service.rb index bd68919a550..a2a9c933f63 100644 --- a/app/services/merge_requests/reopen_service.rb +++ b/app/services/merge_requests/reopen_service.rb @@ -5,7 +5,7 @@ module MergeRequests event_service.reopen_mr(merge_request, current_user) notification_service.reopen_mr(merge_request, current_user) create_note(merge_request) - execute_hooks(merge_request) + execute_hooks(merge_request, 'reopen') merge_request.reload_code merge_request.mark_as_unchecked end diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb index fc26619cd17..56c8510e0ae 100644 --- a/app/services/merge_requests/update_service.rb +++ b/app/services/merge_requests/update_service.rb @@ -38,7 +38,7 @@ module MergeRequests end merge_request.notice_added_references(merge_request.project, current_user) - execute_hooks(merge_request) + execute_hooks(merge_request, 'update') end merge_request -- cgit v1.2.1 From 47e061466968dac72ba488eee0d3c44f568b11ab Mon Sep 17 00:00:00 2001 From: GitLab Date: Tue, 20 Jan 2015 00:22:40 +0100 Subject: Disable turbolink on links pointing out to ci services --- app/views/projects/merge_requests/show/_mr_ci.html.haml | 6 +++--- app/views/projects/show.html.haml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/show/_mr_ci.html.haml b/app/views/projects/merge_requests/show/_mr_ci.html.haml index 941b15d3b32..ee7fd0ef157 100644 --- a/app/views/projects/merge_requests/show/_mr_ci.html.haml +++ b/app/views/projects/merge_requests/show/_mr_ci.html.haml @@ -3,21 +3,21 @@ %i.fa.fa-check %span CI build passed for #{@merge_request.last_commit_short_sha}. - = link_to "Build page", ci_build_details_path(@merge_request) + = link_to "Build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" .ci_widget.ci-failed{style: "display:none"} %i.fa.fa-times %span CI build failed for #{@merge_request.last_commit_short_sha}. - = link_to "Build page", ci_build_details_path(@merge_request) + = link_to "Build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - [:running, :pending].each do |status| .ci_widget{class: "ci-#{status}", style: "display:none"} %i.fa.fa-clock-o %span CI build #{status} for #{@merge_request.last_commit_short_sha}. - = link_to "Build page", ci_build_details_path(@merge_request) + = link_to "Build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" .ci_widget %i.fa.fa-spinner diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index af6e4567c1b..737a34decde 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -68,11 +68,11 @@ - @project.ci_services.each do |ci_service| - if ci_service.active? && ci_service.respond_to?(:builds_path) - if ci_service.respond_to?(:status_img_path) - = link_to ci_service.builds_path do + = link_to ci_service.builds_path, :'data-no-turbolink' => 'data-no-turbolink' do = image_tag ci_service.status_img_path, alt: "build status" - else %span.light CI provided by - = link_to ci_service.title, ci_service.builds_path + = link_to ci_service.title, ci_service.builds_path, :'data-no-turbolink' => 'data-no-turbolink' - if readme .tab-pane#tab-readme -- cgit v1.2.1 From 6da0ab7d60ecdf189190ac095aecdf174e73a03e Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Tue, 20 Jan 2015 11:52:55 -0800 Subject: Github Importer: AJAX update status --- app/controllers/github_imports_controller.rb | 7 ++++++- app/views/github_imports/create.js.haml | 6 ++++-- app/views/github_imports/status.html.haml | 27 +++++++++++++++++++++------ 3 files changed, 31 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/controllers/github_imports_controller.rb b/app/controllers/github_imports_controller.rb index c96bef598be..ac5cfd8d45d 100644 --- a/app/controllers/github_imports_controller.rb +++ b/app/controllers/github_imports_controller.rb @@ -22,6 +22,11 @@ class GithubImportsController < ApplicationController @repos.reject!{|repo| already_added_projects_names.include? repo.full_name} end + def jobs + jobs = current_user.created_projects.where(import_type: "github").to_json(:only => [:id, :import_status]) + render json: jobs + end + def create @repo_id = params[:repo_id].to_i repo = octo_client.repo(@repo_id) @@ -42,7 +47,7 @@ class GithubImportsController < ApplicationController namespace.add_owner(current_user) end - Gitlab::Github::ProjectCreator.new(repo, namespace, current_user).execute + @project = Gitlab::Github::ProjectCreator.new(repo, namespace, current_user).execute end private diff --git a/app/views/github_imports/create.js.haml b/app/views/github_imports/create.js.haml index 363dfeb4f54..cd4c9fbf360 100644 --- a/app/views/github_imports/create.js.haml +++ b/app/views/github_imports/create.js.haml @@ -12,5 +12,7 @@ target_field.find('input').prop("value", origin_namespace) - else :plain - $("table.import-jobs tbody").prepend($("tr#repo_#{@repo_id}")) - $("tr#repo_#{@repo_id}").addClass("active").find(".import-actions").html(" started") + job = $("tr#repo_#{@repo_id}") + job.attr("id", "project_#{@project.id}") + $("table.import-jobs tbody").prepend(job) + job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/github_imports/status.html.haml b/app/views/github_imports/status.html.haml index 47c60e4d45f..52a1e16cd04 100644 --- a/app/views/github_imports/status.html.haml +++ b/app/views/github_imports/status.html.haml @@ -3,9 +3,7 @@ Import repositories from GitHub.com %p.light - Select projects you want to import. - %span.pull-right - Reload to see the progress. + Select projects you want to import. %hr %table.table.import-jobs @@ -16,11 +14,11 @@ %th Status %tbody - @already_added_projects.each do |project| - %tr{id: "repo_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td= project.import_source %td %strong= link_to project.name_with_namespace, project - %td + %td.job-status - if project.import_status == 'finished' %span.cgreen %i.fa.fa-check @@ -33,7 +31,7 @@ %td= repo.full_name %td.import-target = repo.full_name - %td.import-actions + %td.import-actions.job-status = button_tag "Add", class: "btn btn-add-to-import" @@ -46,3 +44,20 @@ new_namespace = tr.find(".import-target input").prop("value") tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) $.post "#{github_import_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + + setInterval (-> + $.get "#{jobs_github_import_path}", (data)-> + $.each data, (i, job) -> + job_item = $("#project_" + job.id) + status_field = job_item.find(".job-status") + + if job.import_status == 'finished' + job_item.removeClass("active").addClass("success") + status_field.html(' done') + else if job.import_status == 'started' + status_field.html(" started") + else + status_field.html(job.import_status) + + ), 4000 -- cgit v1.2.1 From 9371c6b90136547e3622622510af9894fc27aeb0 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 20 Jan 2015 16:46:27 -0800 Subject: Add issue tracker services. --- .../project_services/issue_tracker_service.rb | 14 +++++ app/models/project_services/jira_service.rb | 59 ++++++++++++++++++++++ app/models/project_services/redmine_service.rb | 51 +++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 app/models/project_services/issue_tracker_service.rb create mode 100644 app/models/project_services/jira_service.rb create mode 100644 app/models/project_services/redmine_service.rb (limited to 'app') diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb new file mode 100644 index 00000000000..4ba2f5a9ca2 --- /dev/null +++ b/app/models/project_services/issue_tracker_service.rb @@ -0,0 +1,14 @@ +class IssueTrackerService < Service + + def project_url + # implement inside child + end + + def issues_url + # implement inside child + end + + def new_issue_url + # implement inside child + end +end diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb new file mode 100644 index 00000000000..f83f01c55b4 --- /dev/null +++ b/app/models/project_services/jira_service.rb @@ -0,0 +1,59 @@ +class JiraService < IssueTrackerService + + prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + + def title + if self.properties && self.properties['title'].present? + self.properties['title'] + else + 'JIRA' + end + end + + def description + if self.properties && self.properties['description'].present? + self.properties['description'] + else + 'Jira issue tracker' + end + end + + def to_param + 'jira' + end + + def fields + [ + { type: 'text', name: 'title', placeholder: title }, + { type: 'text', name: 'description', placeholder: description }, + { type: 'text', name: 'project_url', placeholder: 'Project url' }, + { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + ] + end + + def initialize_properties + if properties.nil? + if enabled_in_gitlab_config + self.properties = { + title: issues_tracker['title'], + project_url: issues_tracker['project_url'], + issues_url: issues_tracker['issues_url'], + new_issue_url: issues_tracker['new_issue_url'] + } + end + end + end + + private + + def enabled_in_gitlab_config + Gitlab.config.issues_tracker && + Gitlab.config.issues_tracker.values.any? && + issues_tracker + end + + def issues_tracker + Gitlab.config.issues_tracker['jira'] + end +end diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb new file mode 100644 index 00000000000..8052fb22461 --- /dev/null +++ b/app/models/project_services/redmine_service.rb @@ -0,0 +1,51 @@ +class RedmineService < IssueTrackerService + + prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + + def title + 'Redmine' + end + + def description + 'Redmine issue tracker' + end + + def to_param + 'redmine' + end + + def fields + [ + { type: 'text', name: 'title', placeholder: title }, + { type: 'text', name: 'description', placeholder: description }, + { type: 'text', name: 'project_url', placeholder: 'Project url' }, + { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + ] + end + + def initialize_properties + if properties.nil? + if enabled_in_gitlab_config + self.properties = { + title: issues_tracker['title'], + project_url: issues_tracker['project_url'], + issues_url: issues_tracker['issues_url'], + new_issue_url: issues_tracker['new_issue_url'] + } + end + end + end + + private + + def enabled_in_gitlab_config + Gitlab.config.issues_tracker && + Gitlab.config.issues_tracker.values.any? && + issues_tracker + end + + def issues_tracker + Gitlab.config.issues_tracker['redmine'] + end +end -- cgit v1.2.1 From 62c00661c43334f8e2bbed508d9517529dbee7e0 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 20 Jan 2015 16:47:29 -0800 Subject: Allow creation of the jira and redmine services. --- app/controllers/projects/services_controller.rb | 6 ++++-- app/models/project.rb | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index b2ce99aeb45..15f47ed9c9f 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -17,7 +17,8 @@ class Projects::ServicesController < Projects::ApplicationController def update if @service.update_attributes(service_params) - redirect_to edit_project_service_path(@project, @service.to_param) + redirect_to edit_project_service_path(@project, @service.to_param), + notice: 'Successfully updated.' else render 'edit' end @@ -41,7 +42,8 @@ class Projects::ServicesController < Projects::ApplicationController :title, :token, :type, :active, :api_key, :subdomain, :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, - :build_key, :server, :teamcity_url, :build_type + :build_key, :server, :teamcity_url, :build_type, + :description, :issues_url, :new_issue_url ) end end diff --git a/app/models/project.rb b/app/models/project.rb index a22f852de6b..a90081ce735 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -68,6 +68,9 @@ class Project < ActiveRecord::Base has_one :bamboo_service, dependent: :destroy has_one :teamcity_service, dependent: :destroy has_one :pushover_service, dependent: :destroy + has_one :jira_service, dependent: :destroy + has_one :redmine_service, dependent: :destroy + has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" has_one :forked_from_project, through: :forked_project_link # Merge Requests for target project should be removed with it @@ -321,7 +324,7 @@ class Project < ActiveRecord::Base def available_services_names %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla - emails_on_push gemnasium slack pushover buildbox bamboo teamcity) + emails_on_push gemnasium slack pushover buildbox bamboo teamcity jira redmine) end def gitlab_ci? -- cgit v1.2.1 From 09de0bfc37c54b84d5a49dbce8c11cfd2f3cfb80 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 20 Jan 2015 16:55:12 -0800 Subject: Redmine doesn't require title and description change --- app/models/project_services/redmine_service.rb | 2 -- 1 file changed, 2 deletions(-) (limited to 'app') diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index 8052fb22461..55841b50055 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -16,8 +16,6 @@ class RedmineService < IssueTrackerService def fields [ - { type: 'text', name: 'title', placeholder: title }, - { type: 'text', name: 'description', placeholder: description }, { type: 'text', name: 'project_url', placeholder: 'Project url' }, { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} -- cgit v1.2.1 From e9d6d1e51afa9f46f19748977739f7d2c078b84f Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 20 Jan 2015 16:55:35 -0800 Subject: Custom issue tracker service. --- app/models/project.rb | 3 +- .../custom_issue_tracker_service.rb | 38 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 app/models/project_services/custom_issue_tracker_service.rb (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index a90081ce735..e501ccb59f7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -70,6 +70,7 @@ class Project < ActiveRecord::Base has_one :pushover_service, dependent: :destroy has_one :jira_service, dependent: :destroy has_one :redmine_service, dependent: :destroy + has_one :custom_issue_tracker_service, dependent: :destroy has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" has_one :forked_from_project, through: :forked_project_link @@ -324,7 +325,7 @@ class Project < ActiveRecord::Base def available_services_names %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla - emails_on_push gemnasium slack pushover buildbox bamboo teamcity jira redmine) + emails_on_push gemnasium slack pushover buildbox bamboo teamcity jira redmine custom_issue_tracker) end def gitlab_ci? diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb new file mode 100644 index 00000000000..69e1b204bac --- /dev/null +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -0,0 +1,38 @@ +class CustomIssueTrackerService < IssueTrackerService + + prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + + def title + if self.properties && self.properties['title'].present? + self.properties['title'] + else + 'Custom Issue Tracker' + end + end + + def description + if self.properties && self.properties['description'].present? + self.properties['description'] + else + 'Custom issue tracker' + end + end + + def to_param + title.parameterize + end + + def fields + [ + { type: 'text', name: 'title', placeholder: title }, + { type: 'text', name: 'description', placeholder: description }, + { type: 'text', name: 'project_url', placeholder: 'Project url' }, + { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + ] + end + + def initialize_properties + self.properties = {} if properties.nil? + end +end -- cgit v1.2.1 From ab7a79bf3bb47fd1c9d82da0bb29a3cdf0246cdc Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Tue, 20 Jan 2015 15:23:37 -0800 Subject: developer can push to protected branches --- app/controllers/projects/merge_requests_controller.rb | 8 +------- app/helpers/branches_helper.rb | 9 ++------- app/helpers/tree_helper.rb | 6 +----- app/services/files/create_service.rb | 6 +----- app/services/files/delete_service.rb | 6 +----- app/services/files/update_service.rb | 6 +----- 6 files changed, 7 insertions(+), 34 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 3f702b0af97..912f9eb5b6b 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -233,13 +233,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController end def allowed_to_push_code?(project, branch) - action = if project.protected_branch?(branch) - :push_code_to_protected_branches - else - :push_code - end - - can?(current_user, action, project) + ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, branch) end def merge_request_params diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb index 2ec2cc96157..4a5edf6d101 100644 --- a/app/helpers/branches_helper.rb +++ b/app/helpers/branches_helper.rb @@ -11,12 +11,7 @@ module BranchesHelper def can_push_branch?(project, branch_name) return false unless project.repository.branch_names.include?(branch_name) - action = if project.protected_branch?(branch_name) - :push_code_to_protected_branches - else - :push_code - end - - current_user.can?(action, project) + + ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, branch_name) end end diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index d316213b1fd..133b0dfae9b 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -58,11 +58,7 @@ module TreeHelper ref ||= @ref return false unless project.repository.branch_names.include?(ref) - if project.protected_branch? ref - can?(current_user, :push_code_to_protected_branches, project) - else - can?(current_user, :push_code, project) - end + ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref) end def edit_blob_link(project, ref, path, options = {}) diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb index 82e4d7b684f..b90adeef00a 100644 --- a/app/services/files/create_service.rb +++ b/app/services/files/create_service.rb @@ -3,11 +3,7 @@ require_relative "base_service" module Files class CreateService < BaseService def execute - allowed = if project.protected_branch?(ref) - can?(current_user, :push_code_to_protected_branches, project) - else - can?(current_user, :push_code, project) - end + allowed = Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref) unless allowed return error("You are not allowed to create file in this branch") diff --git a/app/services/files/delete_service.rb b/app/services/files/delete_service.rb index ff5dc6ef34c..8e73c2e2727 100644 --- a/app/services/files/delete_service.rb +++ b/app/services/files/delete_service.rb @@ -3,11 +3,7 @@ require_relative "base_service" module Files class DeleteService < BaseService def execute - allowed = if project.protected_branch?(ref) - can?(current_user, :push_code_to_protected_branches, project) - else - can?(current_user, :push_code, project) - end + allowed = ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref) unless allowed return error("You are not allowed to push into this branch") diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb index a0f40154db0..b4986e1c5c6 100644 --- a/app/services/files/update_service.rb +++ b/app/services/files/update_service.rb @@ -3,11 +3,7 @@ require_relative "base_service" module Files class UpdateService < BaseService def execute - allowed = if project.protected_branch?(ref) - can?(current_user, :push_code_to_protected_branches, project) - else - can?(current_user, :push_code, project) - end + allowed = ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref) unless allowed return error("You are not allowed to push into this branch") -- cgit v1.2.1 From 855fe20165715e34deb1e7153d02c811003095e5 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Wed, 21 Jan 2015 14:02:30 -0600 Subject: Fix spinner icon to match others --- app/views/projects/merge_requests/show/_remove_source_branch.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/show/_remove_source_branch.html.haml b/app/views/projects/merge_requests/show/_remove_source_branch.html.haml index 4fe5935bcf3..9bf6a9d081c 100644 --- a/app/views/projects/merge_requests/show/_remove_source_branch.html.haml +++ b/app/views/projects/merge_requests/show/_remove_source_branch.html.haml @@ -12,6 +12,6 @@ Failed to remove source branch '#{@merge_request.source_branch}' .remove_source_branch_in_progress.hide - %i.fa.fa-refresh.fa-spin + %i.fa.fa-spinner.fa-spin   Removing source branch '#{@merge_request.source_branch}'. Please wait. Page will be automatically reloaded.   -- cgit v1.2.1 From ab2a6111ee029bffe908cff6b5ede51dccd89bb6 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 21 Jan 2015 13:36:27 -0800 Subject: Fix the sentence on notification page. --- app/views/profiles/notifications/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index 96fe91b9b20..bc6f76a2661 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -20,7 +20,7 @@ = radio_button_tag :notification_level, Notification::N_MENTION, @notification.mention?, class: 'trigger-submit' .level-title Mention - %p You will receive notifications only for comments where you was @mentioned + %p You will receive notifications only for comments in which you were @mentioned .radio = label_tag nil, class: '' do -- cgit v1.2.1 From ae1be437227d4bf7c19ae5eb4aab88d3d2cd8d53 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 21 Jan 2015 15:58:35 -0800 Subject: Make sidebar smaller by 10px --- app/assets/stylesheets/main/variables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index aded9cb549d..0f2c0632977 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -56,4 +56,4 @@ $list-font-size: 15px; /** * Sidebar navigation width */ -$sidebar_width: 240px; +$sidebar_width: 230px; -- cgit v1.2.1 From a5b255fbdfcd01f355de2dca76e379e12b43d6e6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 09:37:47 -0800 Subject: Code improvements according to styleguide --- app/models/concerns/issuable.rb | 8 ++++++-- app/models/note.rb | 7 +++++-- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index b8bee0d0ec0..fb038a3cc3f 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -124,10 +124,12 @@ module Issuable users << assignee if is_assigned? mentions = [] mentions << self.mentioned_users + notes.each do |note| users << note.author mentions << note.mentioned_users end + users.concat(mentions.reduce([], :|)).uniq end @@ -149,8 +151,8 @@ module Issuable def add_labels_by_names(label_names) label_names.each do |label_name| - label = project.labels.create_with( - color: Label::DEFAULT_COLOR).find_or_create_by(title: label_name.strip) + label = project.labels.create_with(color: Label::DEFAULT_COLOR). + find_or_create_by(title: label_name.strip) self.labels << label end end @@ -159,11 +161,13 @@ module Issuable def filter_superceded_votes(votes, notes) filteredvotes = [] + votes + votes.each do |vote| if vote.superceded?(notes) filteredvotes.delete(vote) end end + filteredvotes end end diff --git a/app/models/note.rb b/app/models/note.rb index cb879dc2ce3..0b988cc3e0f 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -461,14 +461,17 @@ class Note < ActiveRecord::Base def superceded?(notes) return false unless vote? + notes.each do |note| next if note == self + if note.vote? && - self[:author_id] == note[:author_id] && - self[:created_at] <= note[:created_at] + self[:author_id] == note[:author_id] && + self[:created_at] <= note[:created_at] return true end end + false end -- cgit v1.2.1 From 98ee4a1fa73183cacf6c470b56e34afccec1c5dc Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 09:40:03 -0800 Subject: Annotate models --- app/models/application_setting.rb | 15 +++++++++++++++ app/models/identity.rb | 12 +++++++++++- app/models/merge_request.rb | 1 + app/models/project.rb | 2 ++ app/models/project_services/bamboo_service.rb | 14 ++++++++++++++ app/models/project_services/teamcity_service.rb | 14 ++++++++++++++ app/models/protected_branch.rb | 11 ++++++----- app/models/user.rb | 5 ++--- 8 files changed, 65 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index aed4068f309..45ae79a75cc 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -1,3 +1,18 @@ +# == Schema Information +# +# Table name: application_settings +# +# id :integer not null, primary key +# default_projects_limit :integer +# signup_enabled :boolean +# signin_enabled :boolean +# gravatar_enabled :boolean +# sign_in_text :text +# created_at :datetime +# updated_at :datetime +# home_page_url :string(255) +# + class ApplicationSetting < ActiveRecord::Base validates :home_page_url, allow_blank: true, format: { with: URI::regexp(%w(http https)), message: "should be a valid url" }, diff --git a/app/models/identity.rb b/app/models/identity.rb index 5fb1850c30b..c7cdb63e3d2 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -1,5 +1,15 @@ +# == Schema Information +# +# Table name: identities +# +# id :integer not null, primary key +# extern_uid :string(255) +# provider :string(255) +# user_id :integer +# + class Identity < ActiveRecord::Base belongs_to :user validates :extern_uid, allow_blank: true, uniqueness: {scope: :provider} -end \ No newline at end of file +end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index ae6f88c2e6a..715257f905f 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -18,6 +18,7 @@ # iid :integer # description :text # position :integer default(0) +# locked_at :datetime # require Rails.root.join("app/models/commit") diff --git a/app/models/project.rb b/app/models/project.rb index 4785199b14c..f102c477404 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -24,6 +24,8 @@ # import_status :string(255) # repository_size :float default(0.0) # star_count :integer default(0), not null +# import_type :string(255) +# import_source :string(255) # class Project < ActiveRecord::Base diff --git a/app/models/project_services/bamboo_service.rb b/app/models/project_services/bamboo_service.rb index b9eec9ab21e..16e1b83da4b 100644 --- a/app/models/project_services/bamboo_service.rb +++ b/app/models/project_services/bamboo_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class BambooService < CiService include HTTParty diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb index 52b5862e4d1..dca718b5e8c 100644 --- a/app/models/project_services/teamcity_service.rb +++ b/app/models/project_services/teamcity_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class TeamcityService < CiService include HTTParty diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb index 1b06dd77523..97207ba1272 100644 --- a/app/models/protected_branch.rb +++ b/app/models/protected_branch.rb @@ -2,11 +2,12 @@ # # Table name: protected_branches # -# id :integer not null, primary key -# project_id :integer not null -# name :string(255) not null -# created_at :datetime -# updated_at :datetime +# id :integer not null, primary key +# project_id :integer not null +# name :string(255) not null +# created_at :datetime +# updated_at :datetime +# developers_can_push :boolean default(FALSE), not null # class ProtectedBranch < ActiveRecord::Base diff --git a/app/models/user.rb b/app/models/user.rb index 852f3fc48cf..69fe674df83 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -26,8 +26,6 @@ # bio :string(255) # failed_attempts :integer default(0) # locked_at :datetime -# extern_uid :string(255) -# provider :string(255) # username :string(255) # can_create_group :boolean default(TRUE), not null # can_create_team :boolean default(TRUE), not null @@ -36,7 +34,6 @@ # notification_level :integer default(1), not null # password_expires_at :datetime # created_by_id :integer -# last_credential_check_at :datetime # avatar :string(255) # confirmation_token :string(255) # confirmed_at :datetime @@ -44,6 +41,8 @@ # unconfirmed_email :string(255) # hide_no_ssh_key :boolean default(FALSE) # website_url :string(255) default(""), not null +# last_credential_check_at :datetime +# github_access_token :string(255) # require 'carrierwave/orm/activerecord' -- cgit v1.2.1 From 7afa4d5791bc9cf94eb3e33257d7f6f740c6bcf1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 11:14:29 -0800 Subject: Improve commit title --- app/assets/stylesheets/sections/commits.scss | 1 - 1 file changed, 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index 2fd2dcba475..2e274d06c12 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -101,7 +101,6 @@ .commit-title { margin: 0; - font-size: 20px; } .commit-description { -- cgit v1.2.1 From 7411fb36c5fc3b938e8b8228d217e645c9768a93 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 11:15:21 -0800 Subject: Show branches/tags as labels on commit page --- app/helpers/commits_helper.rb | 18 +++++++++++++-- app/views/projects/commit/_commit_box.html.haml | 30 ++++++++++++------------- 2 files changed, 30 insertions(+), 18 deletions(-) (limited to 'app') diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 8214df40073..2a3e51ada50 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -62,13 +62,27 @@ module CommitsHelper # Returns the sorted alphabetically links to branches, separated by a comma def commit_branches_links(project, branches) - branches.sort.map { |branch| link_to(branch, project_tree_path(project, branch)) }.join(", ").html_safe + branches.sort.map do |branch| + link_to(project_tree_path(project, branch)) do + content_tag :span, class: 'label label-gray' do + content_tag(:i, nil, class: 'fa fa-code-fork') + ' ' + + branch + end + end + end.join(" ").html_safe end # Returns the sorted links to tags, separated by a comma def commit_tags_links(project, tags) sorted = VersionSorter.rsort(tags) - sorted.map { |tag| link_to(tag, project_commits_path(project, project.repository.find_tag(tag).name)) }.join(", ").html_safe + sorted.map do |tag| + link_to(project_commits_path(project, project.repository.find_tag(tag).name)) do + content_tag :span, class: 'label label-gray' do + content_tag(:i, nil, class: 'fa fa-tag') + ' ' + + tag + end + end + end.join(" ").html_safe end def link_to_browse_code(project, commit) diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index 1d4658432ae..b41fb1437f2 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -37,25 +37,23 @@ - @commit.parents.each do |parent| = link_to parent.short_id, project_commit_path(@project, parent) -- if @branches.any? - .commit-info-row - %span.cgray - Exists in +.commit-info-row + - if @branches.any? %span - branch = commit_default_branch(@project, @branches) - = link_to(branch, project_tree_path(@project, branch)) - - if @branches.any? - and in - = link_to("#{pluralize(@branches.count, "other branch")}", "#", class: "js-details-expand") + = link_to(project_tree_path(@project, branch)) do + %span.label.label-gray + %i.fa.fa-code-fork + = branch + - if @branches.any? || @tags.any? + = link_to("#", class: "js-details-expand") do + %span.label.label-gray + \... %span.js-details-content.hide - = commit_branches_links(@project, @branches) - -- if @tags.any? - .commit-info-row - %span.cgray - Tags: - %span - = commit_tags_links(@project, @tags) + - if @branches.any? + = commit_branches_links(@project, @branches) + - if @tags.any? + = commit_tags_links(@project, @tags) .commit-box %h3.commit-title -- cgit v1.2.1 From a5f1b67ed4d5c46d1c243260cbfe86733fee075e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 11:24:05 -0800 Subject: Dont allow image overflow in comment form and timeline --- app/assets/stylesheets/generic/timeline.scss | 4 ++++ app/assets/stylesheets/sections/note_form.scss | 4 ++++ 2 files changed, 8 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index 82ee41b71bd..ee3bf9c1b2d 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -58,6 +58,10 @@ padding: 10px 15px; margin-left: 60px; + img { + max-width: 100%; + } + &:after { content: ''; display: block; diff --git a/app/assets/stylesheets/sections/note_form.scss b/app/assets/stylesheets/sections/note_form.scss index 26511d799f3..61a877a5e43 100644 --- a/app/assets/stylesheets/sections/note_form.scss +++ b/app/assets/stylesheets/sections/note_form.scss @@ -52,6 +52,10 @@ } } + img { + max-width: 100%; + } + .note_text { width: 100%; } -- cgit v1.2.1 From 130663e7ad099f057c19df9a024e029e182501d8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 11:48:20 -0800 Subject: Show modal window with instructions if GH OAuth is not enables --- app/views/projects/_github_import_modal.html.haml | 22 ++++++++++++++++++++++ app/views/projects/new.html.haml | 13 +++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 app/views/projects/_github_import_modal.html.haml (limited to 'app') diff --git a/app/views/projects/_github_import_modal.html.haml b/app/views/projects/_github_import_modal.html.haml new file mode 100644 index 00000000000..02c9ef45f2b --- /dev/null +++ b/app/views/projects/_github_import_modal.html.haml @@ -0,0 +1,22 @@ +%div#github_import_modal.modal.hide + .modal-dialog + .modal-content + .modal-header + %a.close{href: "#", "data-dismiss" => "modal"} × + %h3 GitHub OAuth import + .modal-body + You need to setup integration with GitHub first. + = link_to 'How to setup integration with GitHub', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/github.md' + + +:javascript + $(function(){ + var import_modal = $('#github_import_modal').modal({modal: true, show:false}); + $('.how_to_import_link').bind("click", function(e){ + e.preventDefault(); + import_modal.show(); + }); + $('.modal-header .close').bind("click", function(){ + import_modal.hide(); + }) + }) diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index ccd02acd761..3e0f9cbd80b 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -40,13 +40,18 @@ The import will time out after 4 minutes. For big repositories, use a clone/push combination. For SVN repositories, check #{link_to "this migrating from SVN doc.", "http://doc.gitlab.com/ce/workflow/migrating_from_svn.html"} - - if github_import_enabled? - .project-import.form-group - .col-sm-2 - .col-sm-10 + .project-import.form-group + .col-sm-2 + .col-sm-10 + - if github_import_enabled? = link_to status_github_import_path do %i.fa.fa-github Import projects from GitHub + - else + = link_to '#', class: 'how_to_import_link light' do + %i.fa.fa-github + Import projects from GitHub + = render 'github_import_modal' %hr.prepend-botton-10 -- cgit v1.2.1 From 4ade9bf24da50091e3a3fc310ca9070caed19a75 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 17:05:31 -0800 Subject: lighter hover color --- app/assets/stylesheets/main/variables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index 0f2c0632977..32fde32c42d 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -2,7 +2,7 @@ * General Colors */ $style_color: #474D57; -$hover: #FFECDB; +$hover: #FFF3EB; $box_bg: #F9F9F9; /* -- cgit v1.2.1 From 1511999d88d4a6a7c8a42f93dff93097b92682b1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 22 Jan 2015 17:51:35 -0800 Subject: Faster autocomplete for users/issues/emojiis Instead of loading all issues and merge requests we load only open one. This will reduce time load for autocomplete resources significantly --- app/controllers/projects_controller.rb | 15 ++++++++++++--- app/services/projects/autocomplete_service.rb | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 app/services/projects/autocomplete_service.rb (limited to 'app') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index e541b6fd872..7fc283ef3d4 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -101,11 +101,20 @@ class ProjectsController < ApplicationController def autocomplete_sources note_type = params['type'] note_id = params['type_id'] + autocomplete = ::Projects::AutocompleteService.new(@project) participants = ::Projects::ParticipantsService.new(@project).execute(note_type, note_id) + + emojis = Emoji.names.map do |e| + { + name: e, + path: view_context.image_url("emoji/#{e}.png") + } + end + @suggestions = { - emojis: Emoji.names.map { |e| { name: e, path: view_context.image_url("emoji/#{e}.png") } }, - issues: @project.issues.select([:iid, :title, :description]), - mergerequests: @project.merge_requests.select([:iid, :title, :description]), + emojis: emojis, + issues: autocomplete.issues, + mergerequests: autocomplete.merge_requests, members: participants } diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb new file mode 100644 index 00000000000..09fc25cc1b3 --- /dev/null +++ b/app/services/projects/autocomplete_service.rb @@ -0,0 +1,15 @@ +module Projects + class AutocompleteService < BaseService + def initialize(project) + @project = project + end + + def issues + @project.issues.opened.select([:iid, :title, :description]) + end + + def merge_requests + @project.merge_requests.opened.select([:iid, :title, :description]) + end + end +end -- cgit v1.2.1 From 22b7d2156c6d67deb85eccba5ca7e542a7f409e6 Mon Sep 17 00:00:00 2001 From: Hiroyuki Sato Date: Fri, 23 Jan 2015 20:36:53 +0900 Subject: Remember the project default tab for 30days --- app/assets/javascripts/project_show.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee index 02a7d7b731d..d0eaaad92b8 100644 --- a/app/assets/javascripts/project_show.js.coffee +++ b/app/assets/javascripts/project_show.js.coffee @@ -6,7 +6,7 @@ class @ProjectShow new Flash('Star toggle failed. Try again later.', 'alert') $("a[data-toggle='tab']").on "shown.bs.tab", (e) -> - $.cookie "default_view", $(e.target).attr("href") + $.cookie "default_view", $(e.target).attr("href"), { expires: 30 } defaultView = $.cookie("default_view") if defaultView -- cgit v1.2.1 From 737f6516e697ec5876fcdeb55acedfeefd24c9cc Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 23 Jan 2015 09:14:45 -0800 Subject: Update new services with initialization based on existing data. --- app/models/project_services/custom_issue_tracker_service.rb | 2 +- app/models/project_services/jira_service.rb | 12 +++++++++++- app/models/project_services/redmine_service.rb | 11 ++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb index 69e1b204bac..2476b62da89 100644 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -19,7 +19,7 @@ class CustomIssueTrackerService < IssueTrackerService end def to_param - title.parameterize + 'custom_issue_tracker' end def fields diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index f83f01c55b4..f8b04ddeea7 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -37,7 +37,7 @@ class JiraService < IssueTrackerService if enabled_in_gitlab_config self.properties = { title: issues_tracker['title'], - project_url: issues_tracker['project_url'], + project_url: set_project_url, issues_url: issues_tracker['issues_url'], new_issue_url: issues_tracker['new_issue_url'] } @@ -56,4 +56,14 @@ class JiraService < IssueTrackerService def issues_tracker Gitlab.config.issues_tracker['jira'] end + + def set_project_url + id = self.project.issues_tracker_id + + if id + issues_tracker['project_url'].gsub(":issues_tracker_id", id) + else + issues_tracker['project_url'] + end + end end diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index 55841b50055..03f7115d84e 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -27,7 +27,7 @@ class RedmineService < IssueTrackerService if enabled_in_gitlab_config self.properties = { title: issues_tracker['title'], - project_url: issues_tracker['project_url'], + project_url: set_project_url, issues_url: issues_tracker['issues_url'], new_issue_url: issues_tracker['new_issue_url'] } @@ -46,4 +46,13 @@ class RedmineService < IssueTrackerService def issues_tracker Gitlab.config.issues_tracker['redmine'] end + + def set_project_url + id = self.project.issue_tracker_id + if id + issues_tracker['project_url'].gsub(":issue_tracker_id", id) + else + issues_tracker['project_url'] + end + end end -- cgit v1.2.1 From 103a1bb06d00c0b3ee1f0148ee8fc809f4f276f8 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 23 Jan 2015 10:28:38 -0800 Subject: Use service settings instead of config file settings to present issues. --- app/helpers/issues_helper.rb | 11 +++-------- app/models/project.rb | 12 ++++++++++++ app/models/project_services/issue_tracker_service.rb | 4 ++++ app/models/project_services/redmine_service.rb | 4 ++-- 4 files changed, 21 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index bcf108c5c48..b6ca2a057f7 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -16,7 +16,7 @@ module IssuesHelper def url_for_project_issues(project = @project) return '' if project.nil? - if project.used_default_issues_tracker? || !external_issues_tracker_enabled? + if project.used_default_issues_tracker? || !project.external_issues_tracker_enabled? project_issues_path(project) else url = Gitlab.config.issues_tracker[project.issues_tracker]['project_url'] @@ -28,7 +28,7 @@ module IssuesHelper def url_for_new_issue(project = @project) return '' if project.nil? - if project.used_default_issues_tracker? || !external_issues_tracker_enabled? + if project.used_default_issues_tracker? || !project.external_issues_tracker_enabled? url = new_project_issue_path project_id: project else issues_tracker = Gitlab.config.issues_tracker[project.issues_tracker] @@ -41,7 +41,7 @@ module IssuesHelper def url_for_issue(issue_iid, project = @project) return '' if project.nil? - if project.used_default_issues_tracker? || !external_issues_tracker_enabled? + if project.used_default_issues_tracker? || !project.external_issues_tracker_enabled? url = project_issue_url project_id: project, id: issue_iid else url = Gitlab.config.issues_tracker[project.issues_tracker]['issues_url'] @@ -77,11 +77,6 @@ module IssuesHelper ts.html_safe end - # Checks if issues_tracker setting exists in gitlab.yml - def external_issues_tracker_enabled? - Gitlab.config.issues_tracker && Gitlab.config.issues_tracker.values.any? - end - def bulk_update_milestone_options options_for_select(['None (backlog)']) + options_from_collection_for_select(project_active_milestones, 'id', diff --git a/app/models/project.rb b/app/models/project.rb index e501ccb59f7..0fff5149970 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -309,6 +309,18 @@ class Project < ActiveRecord::Base self.issues_tracker == Project.issues_tracker.default_value end + def external_issues_tracker_enabled? + external_issues_trackers.any? + end + + def external_issues_trackers + services.select { |service| service.category == :issue_tracker } + end + + def external_issue_tracker + @external_issues_tracker ||= external_issues_trackers.select(&:activated?).first + end + def can_have_issues_tracker_id? self.issues_enabled && !self.used_default_issues_tracker? end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 4ba2f5a9ca2..664b55a5951 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -1,5 +1,9 @@ class IssueTrackerService < Service + def category + :issue_tracker + end + def project_url # implement inside child end diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index 03f7115d84e..71286d74b58 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -48,9 +48,9 @@ class RedmineService < IssueTrackerService end def set_project_url - id = self.project.issue_tracker_id + id = self.project.issues_tracker_id if id - issues_tracker['project_url'].gsub(":issue_tracker_id", id) + issues_tracker['project_url'].gsub(":issues_tracker_id", id) else issues_tracker['project_url'] end -- cgit v1.2.1 From 99736d45946c3c81f5c0e266722fece1272b7544 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 10:39:23 -0800 Subject: Make all avatars rounded for consistency --- app/assets/stylesheets/generic/avatar.scss | 5 +++-- app/assets/stylesheets/generic/timeline.scss | 2 +- app/assets/stylesheets/main/variables.scss | 2 ++ app/assets/stylesheets/sections/header.scss | 2 +- app/assets/stylesheets/sections/profile.scss | 9 --------- app/views/users/_groups.html.haml | 7 ++++--- 6 files changed, 11 insertions(+), 16 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 4f038b977e2..4e0e546872b 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -2,8 +2,9 @@ float: left; margin-right: 12px; width: 40px; - padding: 1px; - @include border-radius(4px); + height: 40px; + padding: 0; + @include border-radius($avatar_radius); &.avatar-inline { float: none; diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index ee3bf9c1b2d..f92a79f7a5f 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -42,7 +42,7 @@ background: #fff; color: #737881; float: left; - @include border-radius(40px); + @include border-radius($avatar_radius); @include box-shadow(0 0 0 3px #EEE); overflow: hidden; diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index 32fde32c42d..6bbce70a782 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -57,3 +57,5 @@ $list-font-size: 15px; * Sidebar navigation width */ $sidebar_width: 230px; + +$avatar_radius: 50%; diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index a5098b6da5b..047617e54ba 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -140,7 +140,7 @@ header { img { width: 26px; height: 26px; - @include border-radius(4px); + @include border-radius($avatar_radius); } } diff --git a/app/assets/stylesheets/sections/profile.scss b/app/assets/stylesheets/sections/profile.scss index 086875582f3..0ab62b7ae49 100644 --- a/app/assets/stylesheets/sections/profile.scss +++ b/app/assets/stylesheets/sections/profile.scss @@ -102,12 +102,3 @@ } } } - -.profile-groups-avatars { - margin: 0 5px 10px 0; - - img { - width: 50px; - height: 50px; - } -} diff --git a/app/views/users/_groups.html.haml b/app/views/users/_groups.html.haml index ea008c2dede..b9bd6aa3763 100644 --- a/app/views/users/_groups.html.haml +++ b/app/views/users/_groups.html.haml @@ -1,3 +1,4 @@ -- groups.each do |group| - = link_to group, class: 'profile-groups-avatars', :title => group.name do - - image_tag group_icon(group.path) +.clearfix + - groups.each do |group| + = link_to group, class: 'profile-groups-avatars', title: group.name do + = image_tag group_icon(group.path), class: 'avatar s40' -- cgit v1.2.1 From 7c701acf573f95cce7f8b1b7756de5d73404f09b Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 23 Jan 2015 11:01:09 -0800 Subject: Do a check which issue tracker is used inside the project. --- app/helpers/issues_helper.rb | 8 ++++---- app/models/project.rb | 10 +++++++--- app/views/layouts/nav/_project.html.haml | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index b6ca2a057f7..d3bb1d39203 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -16,7 +16,7 @@ module IssuesHelper def url_for_project_issues(project = @project) return '' if project.nil? - if project.used_default_issues_tracker? || !project.external_issues_tracker_enabled? + if project.using_issue_tracker? project_issues_path(project) else url = Gitlab.config.issues_tracker[project.issues_tracker]['project_url'] @@ -28,7 +28,7 @@ module IssuesHelper def url_for_new_issue(project = @project) return '' if project.nil? - if project.used_default_issues_tracker? || !project.external_issues_tracker_enabled? + if project.using_issue_tracker? url = new_project_issue_path project_id: project else issues_tracker = Gitlab.config.issues_tracker[project.issues_tracker] @@ -41,7 +41,7 @@ module IssuesHelper def url_for_issue(issue_iid, project = @project) return '' if project.nil? - if project.used_default_issues_tracker? || !project.external_issues_tracker_enabled? + if project.using_issue_tracker? url = project_issue_url project_id: project, id: issue_iid else url = Gitlab.config.issues_tracker[project.issues_tracker]['issues_url'] @@ -54,7 +54,7 @@ module IssuesHelper def title_for_issue(issue_iid, project = @project) return '' if project.nil? - if project.used_default_issues_tracker? + if project.default_issues_tracker? issue = project.issues.where(iid: issue_iid).first return issue.title if issue end diff --git a/app/models/project.rb b/app/models/project.rb index 0fff5149970..a79e74105b2 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -298,14 +298,14 @@ class Project < ActiveRecord::Base end def issue_exists?(issue_id) - if used_default_issues_tracker? + if default_issues_tracker? self.issues.where(iid: issue_id).first.present? else true end end - def used_default_issues_tracker? + def default_issues_tracker? self.issues_tracker == Project.issues_tracker.default_value end @@ -321,8 +321,12 @@ class Project < ActiveRecord::Base @external_issues_tracker ||= external_issues_trackers.select(&:activated?).first end + def using_issue_tracker? + default_issues_tracker? || !external_issues_tracker_enabled? + end + def can_have_issues_tracker_id? - self.issues_enabled && !self.used_default_issues_tracker? + self.issues_enabled && !self.default_issues_tracker? end def build_missing_services diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 94cee0bd50f..07ac4be2046 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -39,7 +39,7 @@ %i.fa.fa-exclamation-circle %span Issues - - if @project.used_default_issues_tracker? + - if @project.default_issues_tracker? %span.count.issue_counter= @project.issues.opened.count - if project_nav_tab? :merge_requests -- cgit v1.2.1 From 041bad0fe17a31eb7becde3a656a1d0e50dc85bf Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 23 Jan 2015 11:10:06 -0800 Subject: Manipulate external tracker issues urls generated from services. --- app/helpers/issues_helper.rb | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index d3bb1d39203..cfbbed842cd 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -19,9 +19,7 @@ module IssuesHelper if project.using_issue_tracker? project_issues_path(project) else - url = Gitlab.config.issues_tracker[project.issues_tracker]['project_url'] - url.gsub(':project_id', project.id.to_s). - gsub(':issues_tracker_id', project.issues_tracker_id.to_s) + project.external_issue_tracker.project_url end end @@ -31,10 +29,7 @@ module IssuesHelper if project.using_issue_tracker? url = new_project_issue_path project_id: project else - issues_tracker = Gitlab.config.issues_tracker[project.issues_tracker] - url = issues_tracker['new_issue_url'] - url.gsub(':project_id', project.id.to_s). - gsub(':issues_tracker_id', project.issues_tracker_id.to_s) + project.external_issue_tracker.new_issue_url end end @@ -44,10 +39,8 @@ module IssuesHelper if project.using_issue_tracker? url = project_issue_url project_id: project, id: issue_iid else - url = Gitlab.config.issues_tracker[project.issues_tracker]['issues_url'] - url.gsub(':id', issue_iid.to_s). - gsub(':project_id', project.id.to_s). - gsub(':issues_tracker_id', project.issues_tracker_id.to_s) + url = project.external_issue_tracker.issues_url + url.gsub(':id', issue_iid.to_s) end end -- cgit v1.2.1 From a720dde67c2b488117ed57f7f07ab55f8150c352 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Fri, 23 Jan 2015 11:55:41 -0800 Subject: Remove configuration option from project settings page for external issue trackers. --- app/helpers/projects_helper.rb | 12 ------------ app/models/project.rb | 2 +- app/models/service.rb | 8 ++++++++ app/views/projects/edit.html.haml | 9 --------- 4 files changed, 9 insertions(+), 22 deletions(-) (limited to 'app') diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 9a31d485188..fea78c6e387 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -72,18 +72,6 @@ module ProjectsHelper @project.milestones.active.order("due_date, title ASC") end - def project_issues_trackers(current_tracker = nil) - values = Project.issues_tracker.values.map do |tracker_key| - if tracker_key.to_sym == :gitlab - ['GitLab', tracker_key] - else - [Gitlab.config.issues_tracker[tracker_key]['title'] || tracker_key, tracker_key] - end - end - - options_for_select(values, current_tracker) - end - def link_to_toggle_star(title, starred, signed_in) cls = 'star-btn' cls += ' disabled' unless signed_in diff --git a/app/models/project.rb b/app/models/project.rb index a79e74105b2..4bf36255a56 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -137,7 +137,7 @@ class Project < ActiveRecord::Base scope :public_and_internal_only, -> { where(visibility_level: Project.public_and_internal_levels) } scope :non_archived, -> { where(archived: false) } - enumerize :issues_tracker, in: (Gitlab.config.issues_tracker.keys).append(:gitlab), default: :gitlab + enumerize :issues_tracker, in: (Service.issue_tracker_service_list).append(:gitlab), default: :gitlab state_machine :import_status, initial: :none do event :import_start do diff --git a/app/models/service.rb b/app/models/service.rb index 71c8aa39e45..42419475349 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -86,4 +86,12 @@ class Service < ActiveRecord::Base def async_execute(data) Sidekiq::Client.enqueue(ProjectServiceWorker, id, data) end + + def issue_tracker? + self.category == :issue_tracker + end + + def self.issue_tracker_service_list + Service.select(&:issue_tracker?).map{ |s| s.to_param } + end end diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index f2bb56b5664..fb4d8270731 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -50,15 +50,6 @@ = f.check_box :issues_enabled %span.descr Lightweight issue tracking system for this project - - if Project.issues_tracker.values.count > 1 - .form-group - = f.label :issues_tracker, "Issues tracker", class: 'control-label' - .col-sm-10= f.select(:issues_tracker, project_issues_trackers(@project.issues_tracker), {}, { disabled: !@project.issues_enabled }) - - .form-group - = f.label :issues_tracker_id, "Project name or id in issues tracker", class: 'control-label' - .col-sm-10= f.text_field :issues_tracker_id, disabled: !@project.can_have_issues_tracker_id?, class: 'form-control' - .form-group = f.label :merge_requests_enabled, "Merge Requests", class: 'control-label' .col-sm-10 -- cgit v1.2.1 From a42d84eca30956ca9255f93e6803efb43e1874cf Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 14:38:20 -0800 Subject: Faster autocomplete without unused description --- app/controllers/projects_controller.rb | 2 +- app/services/projects/autocomplete_service.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 7fc283ef3d4..ae9d942853d 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -119,7 +119,7 @@ class ProjectsController < ApplicationController } respond_to do |format| - format.json { render :json => @suggestions } + format.json { render json: @suggestions } end end diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb index 09fc25cc1b3..7408e09ed1e 100644 --- a/app/services/projects/autocomplete_service.rb +++ b/app/services/projects/autocomplete_service.rb @@ -5,11 +5,11 @@ module Projects end def issues - @project.issues.opened.select([:iid, :title, :description]) + @project.issues.opened.select([:iid, :title]) end def merge_requests - @project.merge_requests.opened.select([:iid, :title, :description]) + @project.merge_requests.opened.select([:iid, :title]) end end end -- cgit v1.2.1 From 893a68baf34bce26cb7cab0bc486b0b791308176 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 16:17:27 -0800 Subject: Cache autocomplete or emojis --- app/controllers/projects_controller.rb | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index ae9d942853d..89296b9aa4a 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -104,15 +104,8 @@ class ProjectsController < ApplicationController autocomplete = ::Projects::AutocompleteService.new(@project) participants = ::Projects::ParticipantsService.new(@project).execute(note_type, note_id) - emojis = Emoji.names.map do |e| - { - name: e, - path: view_context.image_url("emoji/#{e}.png") - } - end - @suggestions = { - emojis: emojis, + emojis: autocomplete_emojis, issues: autocomplete.issues, mergerequests: autocomplete.merge_requests, members: participants @@ -189,4 +182,15 @@ class ProjectsController < ApplicationController :wiki_enabled, :visibility_level, :import_url, :last_activity_at, :namespace_id ) end + + def autocomplete_emojis + Rails.cache.fetch("autocomplete-emoji-#{Emoji::VERSION}") do + Emoji.names.map do |e| + { + name: e, + path: view_context.image_url("emoji/#{e}.png") + } + end + end + end end -- cgit v1.2.1 From 3dfcb95f0d5a9851b3829f357bc53abb96c0e6ba Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 17:41:10 -0800 Subject: Use ruby 1.9 hash syntax --- app/controllers/passwords_controller.rb | 4 ++-- app/controllers/projects/protected_branches_controller.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb index 988ede3007b..dcbbe5baa4b 100644 --- a/app/controllers/passwords_controller.rb +++ b/app/controllers/passwords_controller.rb @@ -5,12 +5,12 @@ class PasswordsController < Devise::PasswordsController resource_found = resource_class.find_by_email(email) if resource_found && resource_found.ldap_user? flash[:alert] = "Cannot reset password for LDAP user." - respond_with({}, :location => after_sending_reset_password_instructions_path_for(resource_name)) and return + respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name)) and return end self.resource = resource_class.send_reset_password_instructions(resource_params) if successfully_sent?(resource) - respond_with({}, :location => after_sending_reset_password_instructions_path_for(resource_name)) + respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name)) else respond_with(resource) end diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb index 02160d973b3..f45df38b87c 100644 --- a/app/controllers/projects/protected_branches_controller.rb +++ b/app/controllers/projects/protected_branches_controller.rb @@ -24,7 +24,7 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController ) respond_to do |format| - format.json { render :json => protected_branch, status: :ok } + format.json { render json: protected_branch, status: :ok } end else respond_to do |format| -- cgit v1.2.1 From 0b404c3599841fba3c118ecd6eb996b074fcfa11 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 18:14:26 -0800 Subject: Show no-ssh error message for project page --- app/views/projects/empty.html.haml | 3 +++ 1 file changed, 3 insertions(+) (limited to 'app') diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 59f19c8b7a3..2e46de6bfe0 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -1,3 +1,6 @@ +- if current_user && can?(current_user, :download_code, @project) + = render 'shared/no_ssh' + = render "home_panel" %div.git-empty -- cgit v1.2.1 From a250fa5feb310ca6def85ae3b9947247ac2ecf98 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 18:17:55 -0800 Subject: Make new project button more visible --- app/assets/stylesheets/sections/dashboard.scss | 9 +++++++++ app/views/dashboard/_projects.html.haml | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index e540f7ff940..824f136d300 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -97,3 +97,12 @@ margin-right: 3px; width: 16px; } + +.dash-new-project { + background: $bg_success; + border: 1px solid $border_success; + + a { + color: #FFF; + } +} diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/_projects.html.haml index 304aa17eba8..0596738342f 100644 --- a/app/views/dashboard/_projects.html.haml +++ b/app/views/dashboard/_projects.html.haml @@ -3,8 +3,8 @@ .input-group = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'dash-filter form-control' - if current_user.can_create_project? - .input-group-addon - = link_to new_project_path, class: "" do + .input-group-addon.dash-new-project + = link_to new_project_path do %strong New project %ul.well-list.dash-list -- cgit v1.2.1 From 1b1277af46d894a0ed8b9ed625a0fe361863970c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 18:18:04 -0800 Subject: Fix avatar indentation --- app/assets/stylesheets/generic/avatar.scss | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 4e0e546872b..80514615559 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -8,10 +8,11 @@ &.avatar-inline { float: none; - margin-left: 3px; + margin-left: 4px; + margin-bottom: 2px; - &.s16 { margin-right: 2px; } - &.s24 { margin-right: 2px; } + &.s16 { margin-right: 4px; } + &.s24 { margin-right: 4px; } } &.s16 { width: 16px; height: 16px; margin-right: 6px; } -- cgit v1.2.1 From d3d64a4512566015d4ee523cddef4f393c194b45 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 20:41:51 -0800 Subject: Fix tooltip for groups on user page --- app/views/users/_groups.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/users/_groups.html.haml b/app/views/users/_groups.html.haml index b9bd6aa3763..32a1dc83b57 100644 --- a/app/views/users/_groups.html.haml +++ b/app/views/users/_groups.html.haml @@ -1,4 +1,4 @@ .clearfix - groups.each do |group| = link_to group, class: 'profile-groups-avatars', title: group.name do - = image_tag group_icon(group.path), class: 'avatar s40' + = image_tag group_icon(group.path), class: 'avatar avatar-inline s40' -- cgit v1.2.1 From a6bdf7d8769c1726084f42a510b6aed097fffbf2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 20:50:17 -0800 Subject: Show success/error message for test services button --- app/controllers/projects/services_controller.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index b2ce99aeb45..5ac6947c5de 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -25,9 +25,13 @@ class Projects::ServicesController < Projects::ApplicationController def test data = Gitlab::PushDataBuilder.build_sample(project, current_user) - @service.execute(data) + if @service.execute(data) + message = { notice: 'We sent a request to the provided URL' } + else + message = { alert: 'We tried to send a request to the provided URL but error occured' } + end - redirect_to :back + redirect_to :back, message end private -- cgit v1.2.1 From 5e98293b0e21a7fd9d62ce7272afef31b8414abb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 23 Jan 2015 21:03:12 -0800 Subject: Redesign services page --- app/views/projects/services/index.html.haml | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/views/projects/services/index.html.haml b/app/views/projects/services/index.html.haml index 7271dd830ca..4604c0afd8d 100644 --- a/app/views/projects/services/index.html.haml +++ b/app/views/projects/services/index.html.haml @@ -1,13 +1,22 @@ %h3.page-title Project services %p.light Project services allow you to integrate GitLab with other applications -%hr -%ul.bordered-list +%table.table + %thead + %tr + %th + %th Service + %th Desription + %th Last edit - @services.sort_by(&:title).each do |service| - %li - %h4 + %tr + %td + = boolean_to_icon service.activated? + %td = link_to edit_project_service_path(@project, service.to_param) do - = service.title - .pull-right - = boolean_to_icon service.activated? - %p= service.description + %strong= service.title + %td + = service.description + %td.light + = time_ago_in_words service.updated_at + ago -- cgit v1.2.1 From 7ac648911fb018dafa2708fe29ed59847fe875a1 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Sat, 24 Jan 2015 16:40:25 +0200 Subject: Add titles to links. Closes #1018. --- app/views/groups/_settings_nav.html.haml | 4 ++-- app/views/layouts/nav/_admin.html.haml | 18 +++++++++--------- app/views/layouts/nav/_dashboard.html.haml | 8 ++++---- app/views/layouts/nav/_group.html.haml | 10 +++++----- app/views/layouts/nav/_profile.html.haml | 19 +++++++++---------- app/views/layouts/nav/_project.html.haml | 19 +++++++++---------- app/views/projects/_settings_nav.html.haml | 12 ++++++------ 7 files changed, 44 insertions(+), 46 deletions(-) (limited to 'app') diff --git a/app/views/groups/_settings_nav.html.haml b/app/views/groups/_settings_nav.html.haml index 35180792a0d..e6aee22e529 100644 --- a/app/views/groups/_settings_nav.html.haml +++ b/app/views/groups/_settings_nav.html.haml @@ -1,11 +1,11 @@ %ul.sidebar-subnav = nav_link(path: 'groups#edit') do - = link_to edit_group_path(@group) do + = link_to edit_group_path(@group), title: 'Group' do %i.fa.fa-pencil-square-o %span Group = nav_link(path: 'groups#projects') do - = link_to projects_group_path(@group) do + = link_to projects_group_path(@group), title: 'Projects' do %i.fa.fa-folder %span Projects diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index d9c6670d1bc..66770adb5a5 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -5,49 +5,49 @@ %span Overview = nav_link(controller: :projects) do - = link_to admin_projects_path do + = link_to admin_projects_path, title: 'Projects' do %i.fa.fa-cube %span Projects = nav_link(controller: :users) do - = link_to admin_users_path do + = link_to admin_users_path, title: 'Users' do %i.fa.fa-user %span Users = nav_link(controller: :groups) do - = link_to admin_groups_path do + = link_to admin_groups_path, title: 'Groups' do %i.fa.fa-group %span Groups = nav_link(controller: :logs) do - = link_to admin_logs_path do + = link_to admin_logs_path, title: 'Logs' do %i.fa.fa-file-text %span Logs = nav_link(controller: :broadcast_messages) do - = link_to admin_broadcast_messages_path do + = link_to admin_broadcast_messages_path, title: 'Broadcast Messages' do %i.fa.fa-bullhorn %span Messages = nav_link(controller: :hooks) do - = link_to admin_hooks_path do + = link_to admin_hooks_path, title: 'Hooks' do %i.fa.fa-external-link %span Hooks = nav_link(controller: :background_jobs) do - = link_to admin_background_jobs_path do + = link_to admin_background_jobs_path, title: 'Background Jobs' do %i.fa.fa-cog %span Background Jobs = nav_link(controller: :application_settings) do - = link_to admin_application_settings_path do + = link_to admin_application_settings_path, title: 'Settings' do %i.fa.fa-cogs %span Settings = nav_link(controller: :applications) do - = link_to admin_applications_path do + = link_to admin_applications_path, title: 'Applications' do %i.fa.fa-cloud %span Applications diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index a2eaa2d83c5..48c7c999427 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -5,24 +5,24 @@ %span Activity = nav_link(path: 'dashboard#projects') do - = link_to projects_dashboard_path, class: 'shortcuts-projects' do + = link_to projects_dashboard_path, title: 'Projects', class: 'shortcuts-projects' do %i.fa.fa-cube %span Projects = nav_link(path: 'dashboard#issues') do - = link_to assigned_issues_dashboard_path, class: 'shortcuts-issues' do + = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'shortcuts-issues' do %i.fa.fa-exclamation-circle %span Issues %span.count= current_user.assigned_issues.opened.count = nav_link(path: 'dashboard#merge_requests') do - = link_to assigned_mrs_dashboard_path, class: 'shortcuts-merge_requests' do + = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests' do %i.fa.fa-tasks %span Merge Requests %span.count= current_user.assigned_merge_requests.opened.count = nav_link(controller: :help) do - = link_to help_path do + = link_to help_path, title: 'Help' do %i.fa.fa-question-circle %span Help diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 54468d077ab..ddd3df19eec 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -6,33 +6,33 @@ Activity - if current_user = nav_link(controller: [:group, :milestones]) do - = link_to group_milestones_path(@group) do + = link_to group_milestones_path(@group), title: 'Milestones' do %i.fa.fa-clock-o %span Milestones = nav_link(path: 'groups#issues') do - = link_to issues_group_path(@group) do + = link_to issues_group_path(@group), title: 'Issues' do %i.fa.fa-exclamation-circle %span Issues - if current_user %span.count= Issue.opened.of_group(@group).count = nav_link(path: 'groups#merge_requests') do - = link_to merge_requests_group_path(@group) do + = link_to merge_requests_group_path(@group), title: 'Merge Requests' do %i.fa.fa-tasks %span Merge Requests - if current_user %span.count= MergeRequest.opened.of_group(@group).count = nav_link(path: 'groups#members') do - = link_to members_group_path(@group) do + = link_to members_group_path(@group), title: 'Members' do %i.fa.fa-users %span Members - if can?(current_user, :manage_group, @group) = nav_link(html_options: { class: "#{"active" if group_settings_page?} separate-item" }) do - = link_to edit_group_path(@group), class: "tab no-highlight" do + = link_to edit_group_path(@group), title: 'Settings', class: "tab no-highlight" do %i.fa.fa-cogs %span Settings diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index cc50b9b570a..0914d2a167a 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -5,52 +5,51 @@ %span Profile = nav_link(controller: :accounts) do - = link_to profile_account_path do + = link_to profile_account_path, title: 'Account' do %i.fa.fa-gear %span Account = nav_link(path: ['profiles#applications', 'applications#edit', 'applications#show', 'applications#new']) do - = link_to applications_profile_path do + = link_to applications_profile_path, title: 'Applications' do %i.fa.fa-cloud %span Applications = nav_link(controller: :emails) do - = link_to profile_emails_path do + = link_to profile_emails_path, title: 'Emails' do %i.fa.fa-envelope-o %span Emails %span.count= current_user.emails.count + 1 - unless current_user.ldap_user? = nav_link(controller: :passwords) do - = link_to edit_profile_password_path do + = link_to edit_profile_password_path, title: 'Password' do %i.fa.fa-lock %span Password = nav_link(controller: :notifications) do - = link_to profile_notifications_path do + = link_to profile_notifications_path, title: 'Notifications' do %i.fa.fa-inbox %span Notifications = nav_link(controller: :keys) do - = link_to profile_keys_path do + = link_to profile_keys_path, title: 'SSH Keys' do %i.fa.fa-key %span SSH Keys %span.count= current_user.keys.count = nav_link(path: 'profiles#design') do - = link_to design_profile_path do + = link_to design_profile_path, title: 'Design' do %i.fa.fa-image %span Design = nav_link(controller: :groups) do - = link_to profile_groups_path do + = link_to profile_groups_path, title: 'Groups' do %i.fa.fa-group %span Groups = nav_link(path: 'profiles#history') do - = link_to history_profile_path do + = link_to history_profile_path, title: 'History' do %i.fa.fa-history %span History - diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 94cee0bd50f..502e350300a 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -6,36 +6,35 @@ Project - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do - = link_to project_tree_path(@project, @ref || @repository.root_ref), class: 'shortcuts-tree' do + = link_to project_tree_path(@project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree' do %i.fa.fa-files-o %span Files - - if project_nav_tab? :commits = nav_link(controller: %w(commit commits compare repositories tags branches)) do - = link_to project_commits_path(@project, @ref || @repository.root_ref), class: 'shortcuts-commits' do + = link_to project_commits_path(@project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits' do %i.fa.fa-history %span Commits - if project_nav_tab? :network = nav_link(controller: %w(network)) do - = link_to project_network_path(@project, @ref || @repository.root_ref), class: 'shortcuts-network' do + = link_to project_network_path(@project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network' do %i.fa.fa-code-fork %span Network - if project_nav_tab? :graphs = nav_link(controller: %w(graphs)) do - = link_to project_graph_path(@project, @ref || @repository.root_ref), class: 'shortcuts-graphs' do + = link_to project_graph_path(@project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs' do %i.fa.fa-area-chart %span Graphs - if project_nav_tab? :issues = nav_link(controller: %w(issues milestones labels)) do - = link_to url_for_project_issues, class: 'shortcuts-issues' do + = link_to url_for_project_issues, title: 'Issues', class: 'shortcuts-issues' do %i.fa.fa-exclamation-circle %span Issues @@ -44,7 +43,7 @@ - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do - = link_to project_merge_requests_path(@project), class: 'shortcuts-merge_requests' do + = link_to project_merge_requests_path(@project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do %i.fa.fa-tasks %span Merge Requests @@ -52,21 +51,21 @@ - if project_nav_tab? :wiki = nav_link(controller: :wikis) do - = link_to project_wiki_path(@project, :home), class: 'shortcuts-wiki' do + = link_to project_wiki_path(@project, :home), title: 'Wiki', class: 'shortcuts-wiki' do %i.fa.fa-book %span Wiki - if project_nav_tab? :snippets = nav_link(controller: :snippets) do - = link_to project_snippets_path(@project), class: 'shortcuts-snippets' do + = link_to project_snippets_path(@project), title: 'Snippets', class: 'shortcuts-snippets' do %i.fa.fa-file-text-o %span Snippets - if project_nav_tab? :settings = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_project_path(@project), class: "stat-tab tab no-highlight" do + = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do %i.fa.fa-cogs %span Settings diff --git a/app/views/projects/_settings_nav.html.haml b/app/views/projects/_settings_nav.html.haml index 64eda0bf286..646e48a1e1d 100644 --- a/app/views/projects/_settings_nav.html.haml +++ b/app/views/projects/_settings_nav.html.haml @@ -1,31 +1,31 @@ %ul.project-settings-nav.sidebar-subnav = nav_link(path: 'projects#edit') do - = link_to edit_project_path(@project), class: "stat-tab tab " do + = link_to edit_project_path(@project), title: 'Project', class: "stat-tab tab " do %i.fa.fa-pencil-square-o %span Project = nav_link(controller: [:team_members, :teams]) do - = link_to project_team_index_path(@project), class: "team-tab tab" do + = link_to project_team_index_path(@project), title: 'Members', class: "team-tab tab" do %i.fa.fa-users %span Members = nav_link(controller: :deploy_keys) do - = link_to project_deploy_keys_path(@project) do + = link_to project_deploy_keys_path(@project), title: 'Deploy Keys' do %i.fa.fa-key %span Deploy Keys = nav_link(controller: :hooks) do - = link_to project_hooks_path(@project) do + = link_to project_hooks_path(@project), title: 'Web Hooks' do %i.fa.fa-link %span Web Hooks = nav_link(controller: :services) do - = link_to project_services_path(@project) do + = link_to project_services_path(@project), title: 'Services' do %i.fa.fa-cogs %span Services = nav_link(controller: :protected_branches) do - = link_to project_protected_branches_path(@project) do + = link_to project_protected_branches_path(@project), title: 'Protected Branches' do %i.fa.fa-lock %span Protected branches -- cgit v1.2.1 From 42bac7f9f27b0e8fb113e452fc2106882262172d Mon Sep 17 00:00:00 2001 From: Steven Thonus Date: Sat, 25 Jan 2014 18:15:44 +0100 Subject: adding avatar to project settings page added avatar removal show project avatar on dashboard, projects page, project page added rspec and feature tests added project avatar from repository new default project icon added added copying af avatar to forking of project added generated icon fixed avatar fork hound fix style fix test fix --- app/assets/images/no_project_icon.png | Bin 0 -> 3387 bytes app/assets/javascripts/project.js.coffee | 10 +++++++++ app/assets/stylesheets/generic/avatar.scss | 13 +++++++++++ app/assets/stylesheets/sections/dashboard.scss | 6 +++++ app/controllers/projects/avatars_controller.rb | 29 +++++++++++++++++++++++++ app/helpers/application_helper.rb | 25 +++++++++++++++++++++ app/models/project.rb | 25 +++++++++++++++++++++ app/services/projects/fork_service.rb | 3 +++ app/views/dashboard/_project.html.haml | 2 ++ app/views/dashboard/projects.html.haml | 2 ++ app/views/projects/_home_panel.html.haml | 1 + app/views/projects/edit.html.haml | 28 +++++++++++++++++++++++- 12 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 app/assets/images/no_project_icon.png create mode 100644 app/controllers/projects/avatars_controller.rb (limited to 'app') diff --git a/app/assets/images/no_project_icon.png b/app/assets/images/no_project_icon.png new file mode 100644 index 00000000000..8e9529c67ec Binary files /dev/null and b/app/assets/images/no_project_icon.png differ diff --git a/app/assets/javascripts/project.js.coffee b/app/assets/javascripts/project.js.coffee index 5a9cc66c8f0..8588a9d27cd 100644 --- a/app/assets/javascripts/project.js.coffee +++ b/app/assets/javascripts/project.js.coffee @@ -18,3 +18,13 @@ class @Project $.cookie('hide_no_ssh_message', 'false', { path: path }) $(@).parents('.no-ssh-key-message').hide() e.preventDefault() + + # avatar + $('.js-choose-project-avatar-button').bind "click", -> + form = $(this).closest("form") + form.find(".js-project-avatar-input").click() + + $('.js-project-avatar-input').bind "change", -> + form = $(this).closest("form") + filename = $(this).val().replace(/^.*[\\\/]/, '') + form.find(".js-avatar-filename").text(filename) diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 80514615559..f04848ae6dc 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -23,3 +23,16 @@ &.s90 { width: 90px; height: 90px; margin-right: 15px; } &.s160 { width: 160px; height: 160px; margin-right: 20px; } } + +.identicon { + text-align: center; + vertical-align: top; + + &.s16 { font-size: 12px; line-height: 1.33; } + &.s24 { font-size: 18px; line-height: 1.33; } + &.s26 { font-size: 20px; line-height: 1.33; } + &.s32 { font-size: 24px; line-height: 1.33; } + &.s60 { font-size: 45px; line-height: 1.33; } + &.s90 { font-size: 68px; line-height: 1.33; } + &.s160 { font-size: 120px; line-height: 1.33; } +} \ No newline at end of file diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index 824f136d300..3135056db58 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -75,6 +75,9 @@ } } } +.project-avatar { + float: left; +} .project-description { overflow: hidden; @@ -92,6 +95,9 @@ } } +.dash-project-avatar { + float: left; +} .dash-project-access-icon { float: left; margin-right: 3px; diff --git a/app/controllers/projects/avatars_controller.rb b/app/controllers/projects/avatars_controller.rb new file mode 100644 index 00000000000..a482b90880d --- /dev/null +++ b/app/controllers/projects/avatars_controller.rb @@ -0,0 +1,29 @@ +class Projects::AvatarsController < Projects::ApplicationController + layout 'project' + + before_filter :project + + def show + @blob = @project.repository.blob_at_branch('master', @project.avatar_in_git) + if @blob + headers['X-Content-Type-Options'] = 'nosniff' + send_data( + @blob.data, + type: @blob.mime_type, + disposition: 'inline', + filename: @blob.name + ) + else + not_found! + end + end + + def destroy + @project.remove_avatar! + + @project.save + @project.reset_events_cache + + redirect_to edit_project_path(@project) + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f65e04af205..772400d55ec 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -50,6 +50,31 @@ module ApplicationHelper args.any? { |v| v.to_s.downcase == action_name } end + def project_icon(project_id, options = {}) + project = Project.find_with_namespace(project_id) + if project.avatar.present? + image_tag project.avatar.url, options + elsif options[:only_uploaded] + image_tag '/assets/no_project_icon.png', options + elsif project.avatar_in_git + image_tag project_avatar_path(project), options + else # generated icon + project_identicon(project, options) + end + end + + def project_identicon(project, options = {}) + options[:class] ||= '' + options[:class] << ' identicon' + bg_color = Digest::MD5.hexdigest(project.name)[0, 6] + brightness = bg_color[0, 2].hex + bg_color[2, 2].hex + bg_color[4, 2].hex + text_color = (brightness > 375) ? '#000' : '#fff' + content_tag(:div, class: options[:class], + style: "background-color: ##{ bg_color }; color: #{ text_color }") do + project.name[0, 1].upcase + end + end + def group_icon(group_path) group = Group.find_by(path: group_path) if group && group.avatar.present? diff --git a/app/models/project.rb b/app/models/project.rb index f102c477404..7160e704aa1 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -26,6 +26,7 @@ # star_count :integer default(0), not null # import_type :string(255) # import_source :string(255) +# avatar :string(255) # class Project < ActiveRecord::Base @@ -119,6 +120,11 @@ class Project < ActiveRecord::Base if: :import? validates :star_count, numericality: { greater_than_or_equal_to: 0 } validate :check_limit, on: :create + validate :avatar_type, + if: ->(project) { project.avatar && project.avatar_changed? } + validates :avatar, file_size: { maximum: 100.kilobytes.to_i } + + mount_uploader :avatar, AttachmentUploader # Scopes scope :without_user, ->(user) { where("projects.id NOT IN (:ids)", ids: user.authorized_projects.map(&:id) ) } @@ -338,6 +344,24 @@ class Project < ActiveRecord::Base @ci_service ||= ci_services.select(&:activated?).first end + def avatar_type + unless avatar.image? + errors.add :avatar, 'only images allowed' + end + end + + def avatar_in_git + @avatar_file ||= 'logo.png' if repository.blob_at_branch('master', 'logo.png') + @avatar_file ||= 'logo.jpg' if repository.blob_at_branch('master', 'logo.jpg') + @avatar_file ||= 'logo.gif' if repository.blob_at_branch('master', 'logo.gif') + @avatar_file + end + + # For compatibility with old code + def code + path + end + def items_for(entity) case entity when 'issue' then @@ -529,6 +553,7 @@ class Project < ActiveRecord::Base # Since we do cache @event we need to reset cache in special cases: # * when project was moved # * when project was renamed + # * when the project avatar changes # Events cache stored like events/23-20130109142513. # The cache key includes updated_at timestamp. # Thus it will automatically generate a new fragment diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 4930660055a..8bb0fcf9474 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -14,6 +14,9 @@ module Projects project.name = @from_project.name project.path = @from_project.path project.creator = @current_user + if @from_project.avatar && @from_project.avatar.image? + project.avatar = @from_project.avatar + end if namespace = @params[:namespace] project.namespace = namespace diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index 89ed5102754..7f19fb5a81c 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,4 +1,6 @@ = link_to project_path(project), class: dom_class(project) do + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s24') .dash-project-access-icon = visibility_level_icon(project.visibility_level) %span.str-truncated diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index 944441669e7..f60bcc72e1d 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -11,6 +11,8 @@ - @projects.each do |project| %li.my-project-row %h4.project-title + .project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s60') .project-access-icon = visibility_level_icon(project.visibility_level) = link_to project_path(project), class: dom_class(project) do diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 30d063c7a36..05910c6038c 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -2,6 +2,7 @@ .project-home-panel{:class => ("empty-project" if empty_repo)} .project-home-row .project-home-desc + = project_icon(@project.to_param, alt: '', class: 'avatar s32') - if @project.description.present? = escaped_autolink(@project.description) - if can?(current_user, :admin_project, @project) diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index f2bb56b5664..fc6499de3e2 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -7,7 +7,8 @@ %p.light Some settings, such as "Transfer Project", are hidden inside the danger area below. %hr .panel-body - = form_for @project, remote: true, html: { class: "edit_project form-horizontal" } do |f| + = form_for @project, remote: true, html: { multipart: true, class: "edit_project form-horizontal" }, authenticity_token: true do |f| + %fieldset .form-group.project_name_holder = f.label :name, class: 'control-label' do @@ -80,6 +81,31 @@ = f.check_box :snippets_enabled %span.descr Share code pastes with others out of git repository + %fieldset.features + %legend + Project avatar: + .form-group + .col-sm-2 + .col-sm-10 + = project_icon(@project.to_param, alt: '', class: 'avatar s160', only_uploaded: true) + %p.light + - if @project.avatar_in_git + Project avatar in repository: #{ @project.avatar_in_git } + %p.light + - if @project.avatar? + You can change your project avatar here + - else + You can upload an project avatar here + %a.choose-btn.btn.btn-small.js-choose-project-avatar-button + %i.icon-paper-clip + %span Choose File ... +   + %span.file_name.js-avatar-filename File name... + = f.file_field :avatar, class: "js-project-avatar-input hidden" + .light The maximum file size allowed is 100KB. + - if @project.avatar? + %hr + = link_to 'Remove avatar', project_avatar_path(@project), data: { confirm: "Project avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" .form-actions = f.submit 'Save changes', class: "btn btn-save" -- cgit v1.2.1 From 70c44a0da2bdeead90a99fe79e7c047d38b8ca5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Mon, 19 Jan 2015 21:37:20 +0100 Subject: Fix tests, merge conflicts, some minor issues and make the project avatar feature mergable --- app/assets/javascripts/dispatcher.js.coffee | 1 + app/assets/javascripts/project.js.coffee | 10 ---- app/assets/javascripts/project_avatar.js.coffee | 9 +++ app/controllers/projects_controller.rb | 20 +++---- app/helpers/application_helper.rb | 36 ++++++------ app/models/project.rb | 77 +++++++++++++------------ app/services/projects/fork_service.rb | 8 +-- app/views/groups/_projects.html.haml | 2 + app/views/projects/edit.html.haml | 7 ++- 9 files changed, 89 insertions(+), 81 deletions(-) create mode 100644 app/assets/javascripts/project_avatar.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index ef86c2781c9..1643ca941ff 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -96,6 +96,7 @@ class Dispatcher new Profile() when 'projects' new Project() + new ProjectAvatar() switch path[1] when 'edit' shortcut_handler = new ShortcutsNavigation() diff --git a/app/assets/javascripts/project.js.coffee b/app/assets/javascripts/project.js.coffee index 8588a9d27cd..5a9cc66c8f0 100644 --- a/app/assets/javascripts/project.js.coffee +++ b/app/assets/javascripts/project.js.coffee @@ -18,13 +18,3 @@ class @Project $.cookie('hide_no_ssh_message', 'false', { path: path }) $(@).parents('.no-ssh-key-message').hide() e.preventDefault() - - # avatar - $('.js-choose-project-avatar-button').bind "click", -> - form = $(this).closest("form") - form.find(".js-project-avatar-input").click() - - $('.js-project-avatar-input').bind "change", -> - form = $(this).closest("form") - filename = $(this).val().replace(/^.*[\\\/]/, '') - form.find(".js-avatar-filename").text(filename) diff --git a/app/assets/javascripts/project_avatar.js.coffee b/app/assets/javascripts/project_avatar.js.coffee new file mode 100644 index 00000000000..8bec6e2ccca --- /dev/null +++ b/app/assets/javascripts/project_avatar.js.coffee @@ -0,0 +1,9 @@ +class @ProjectAvatar + constructor: -> + $('.js-choose-project-avatar-button').bind 'click', -> + form = $(this).closest('form') + form.find('.js-project-avatar-input').click() + $('.js-project-avatar-input').bind 'change', -> + form = $(this).closest('form') + filename = $(this).val().replace(/^.*[\\\/]/, '') + form.find('.js-avatar-filename').text(filename) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 89296b9aa4a..ebe48265c63 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -14,7 +14,7 @@ class ProjectsController < ApplicationController end def edit - render 'edit', layout: "project_settings" + render 'edit', layout: 'project_settings' end def create @@ -36,7 +36,7 @@ class ProjectsController < ApplicationController format.html { redirect_to edit_project_path(@project), notice: 'Project was successfully updated.' } format.js else - format.html { render "edit", layout: "project_settings" } + format.html { render 'edit', layout: 'project_settings' } format.js end end @@ -66,17 +66,17 @@ class ProjectsController < ApplicationController format.html do if @project.repository_exists? if @project.empty_repo? - render "projects/empty", layout: user_layout + render 'projects/empty', layout: user_layout else @last_push = current_user.recent_push(@project.id) if current_user render :show, layout: user_layout end else - render "projects/no_repo", layout: user_layout + render 'projects/no_repo', layout: user_layout end end - format.json { pager_json("events/_events", @events.count) } + format.json { pager_json('events/_events', @events.count) } end end @@ -87,9 +87,9 @@ class ProjectsController < ApplicationController respond_to do |format| format.html do - flash[:alert] = "Project deleted." + flash[:alert] = 'Project deleted.' - if request.referer.include?("/admin") + if request.referer.include?('/admin') redirect_to admin_projects_path else redirect_to projects_dashboard_path @@ -141,7 +141,7 @@ class ProjectsController < ApplicationController if link_to_image format.json { render json: { link: link_to_image } } else - format.json { render json: "Invalid file.", status: :unprocessable_entity } + format.json { render json: 'Invalid file.', status: :unprocessable_entity } end end end @@ -172,14 +172,14 @@ class ProjectsController < ApplicationController end def user_layout - current_user ? "projects" : "public_projects" + current_user ? 'projects' : 'public_projects' end def project_params params.require(:project).permit( :name, :path, :description, :issues_tracker, :tag_list, :issues_enabled, :merge_requests_enabled, :snippets_enabled, :issues_tracker_id, :default_branch, - :wiki_enabled, :visibility_level, :import_url, :last_activity_at, :namespace_id + :wiki_enabled, :visibility_level, :import_url, :last_activity_at, :namespace_id, :avatar ) end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 772400d55ec..32fd0ed7bcc 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -54,10 +54,10 @@ module ApplicationHelper project = Project.find_with_namespace(project_id) if project.avatar.present? image_tag project.avatar.url, options - elsif options[:only_uploaded] - image_tag '/assets/no_project_icon.png', options elsif project.avatar_in_git image_tag project_avatar_path(project), options + elsif options[:only_uploaded] + image_tag '/assets/no_project_icon.png', options else # generated icon project_identicon(project, options) end @@ -107,24 +107,24 @@ module ApplicationHelper if project.repo_exists? time_ago_with_tooltip(project.repository.commit.committed_date) else - "Never" + 'Never' end rescue - "Never" + 'Never' end def grouped_options_refs repository = @project.repository options = [ - ["Branches", repository.branch_names], - ["Tags", VersionSorter.rsort(repository.tag_names)] + ['Branches', repository.branch_names], + ['Tags', VersionSorter.rsort(repository.tag_names)] ] # If reference is commit id - we should add it to branch/tag selectbox if(@ref && !options.flatten.include?(@ref) && @ref =~ /^[0-9a-zA-Z]{6,52}$/) - options << ["Commit", [@ref]] + options << ['Commit', [@ref]] end grouped_options_for_select(options, @ref || @project.default_branch) @@ -186,7 +186,7 @@ module ApplicationHelper path = controller.controller_path.split('/') namespace = path.first if path.second - [namespace, controller.controller_name, controller.action_name].compact.join(":") + [namespace, controller.controller_name, controller.action_name].compact.join(':') end # shortcut for gitlab config @@ -201,13 +201,13 @@ module ApplicationHelper def search_placeholder if @project && @project.persisted? - "Search in this project" + 'Search in this project' elsif @snippet || @snippets || @show_snippets 'Search snippets' elsif @group && @group.persisted? - "Search in this group" + 'Search in this group' else - "Search" + 'Search' end end @@ -218,7 +218,7 @@ module ApplicationHelper def time_ago_with_tooltip(date, placement = 'top', html_class = 'time_ago') capture_haml do haml_tag :time, date.to_s, - class: html_class, datetime: date.getutc.iso8601, title: date.stamp("Aug 21, 2011 9:23pm"), + class: html_class, datetime: date.getutc.iso8601, title: date.stamp('Aug 21, 2011 9:23pm'), data: { toggle: 'tooltip', placement: placement } haml_tag :script, "$('." + html_class + "').timeago().tooltip()" @@ -241,8 +241,8 @@ module ApplicationHelper end def spinner(text = nil, visible = false) - css_class = "loading" - css_class << " hide" unless visible + css_class = 'loading' + css_class << ' hide' unless visible content_tag :div, class: css_class do content_tag(:i, nil, class: 'fa fa-spinner fa-spin') + text @@ -259,17 +259,17 @@ module ApplicationHelper absolute_uri = nil end - # Add "nofollow" only to external links + # Add 'nofollow' only to external links if host && host != Gitlab.config.gitlab.host && absolute_uri if html_options if html_options[:rel] - html_options[:rel] << " nofollow" + html_options[:rel] << ' nofollow' else - html_options.merge!(rel: "nofollow") + html_options.merge!(rel: 'nofollow') end else html_options = Hash.new - html_options[:rel] = "nofollow" + html_options[:rel] = 'nofollow' end end diff --git a/app/models/project.rb b/app/models/project.rb index 7160e704aa1..97f23227484 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -14,7 +14,7 @@ # merge_requests_enabled :boolean default(TRUE), not null # wiki_enabled :boolean default(TRUE), not null # namespace_id :integer -# issues_tracker :string(255) default("gitlab"), not null +# issues_tracker :string(255) default('gitlab'), not null # issues_tracker_id :string(255) # snippets_enabled :boolean default(TRUE), not null # last_activity_at :datetime @@ -29,6 +29,9 @@ # avatar :string(255) # +require 'carrierwave/orm/activerecord' +require 'file_size_validator' + class Project < ActiveRecord::Base include Gitlab::ShellAdapter include Gitlab::VisibilityLevel @@ -50,8 +53,8 @@ class Project < ActiveRecord::Base attr_accessor :new_default_branch # Relations - belongs_to :creator, foreign_key: "creator_id", class_name: "User" - belongs_to :group, -> { where(type: Group) }, foreign_key: "namespace_id" + belongs_to :creator, foreign_key: 'creator_id', class_name: 'User' + belongs_to :group, -> { where(type: Group) }, foreign_key: 'namespace_id' belongs_to :namespace has_one :last_event, -> {order 'events.created_at DESC'}, class_name: 'Event', foreign_key: 'project_id' @@ -71,20 +74,20 @@ class Project < ActiveRecord::Base has_one :bamboo_service, dependent: :destroy has_one :teamcity_service, dependent: :destroy has_one :pushover_service, dependent: :destroy - has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" + has_one :forked_project_link, dependent: :destroy, foreign_key: 'forked_to_project_id' has_one :forked_from_project, through: :forked_project_link # Merge Requests for target project should be removed with it - has_many :merge_requests, dependent: :destroy, foreign_key: "target_project_id" + has_many :merge_requests, dependent: :destroy, foreign_key: 'target_project_id' # Merge requests from source project should be kept when source project was removed - has_many :fork_merge_requests, foreign_key: "source_project_id", class_name: MergeRequest + has_many :fork_merge_requests, foreign_key: 'source_project_id', class_name: MergeRequest has_many :issues, -> { order 'issues.state DESC, issues.created_at DESC' }, dependent: :destroy has_many :labels, dependent: :destroy has_many :services, dependent: :destroy has_many :events, dependent: :destroy has_many :milestones, dependent: :destroy has_many :notes, dependent: :destroy - has_many :snippets, dependent: :destroy, class_name: "ProjectSnippet" - has_many :hooks, dependent: :destroy, class_name: "ProjectHook" + has_many :snippets, dependent: :destroy, class_name: 'ProjectSnippet' + has_many :hooks, dependent: :destroy, class_name: 'ProjectHook' has_many :protected_branches, dependent: :destroy has_many :project_members, dependent: :destroy, as: :source, class_name: 'ProjectMember' has_many :users, through: :project_members @@ -116,27 +119,27 @@ class Project < ActiveRecord::Base validates_uniqueness_of :name, scope: :namespace_id validates_uniqueness_of :path, scope: :namespace_id validates :import_url, - format: { with: URI::regexp(%w(git http https)), message: "should be a valid url" }, + format: { with: URI::regexp(%w(git http https)), message: 'should be a valid url' }, if: :import? validates :star_count, numericality: { greater_than_or_equal_to: 0 } validate :check_limit, on: :create validate :avatar_type, if: ->(project) { project.avatar && project.avatar_changed? } - validates :avatar, file_size: { maximum: 100.kilobytes.to_i } + validates :avatar, file_size: { maximum: 200.kilobytes.to_i } mount_uploader :avatar, AttachmentUploader # Scopes - scope :without_user, ->(user) { where("projects.id NOT IN (:ids)", ids: user.authorized_projects.map(&:id) ) } - scope :without_team, ->(team) { team.projects.present? ? where("projects.id NOT IN (:ids)", ids: team.projects.map(&:id)) : scoped } - scope :not_in_group, ->(group) { where("projects.id NOT IN (:ids)", ids: group.project_ids ) } - scope :in_team, ->(team) { where("projects.id IN (:ids)", ids: team.projects.map(&:id)) } + scope :without_user, ->(user) { where('projects.id NOT IN (:ids)', ids: user.authorized_projects.map(&:id) ) } + scope :without_team, ->(team) { team.projects.present? ? where('projects.id NOT IN (:ids)', ids: team.projects.map(&:id)) : scoped } + scope :not_in_group, ->(group) { where('projects.id NOT IN (:ids)', ids: group.project_ids ) } + scope :in_team, ->(team) { where('projects.id IN (:ids)', ids: team.projects.map(&:id)) } scope :in_namespace, ->(namespace) { where(namespace_id: namespace.id) } scope :in_group_namespace, -> { joins(:group) } - scope :sorted_by_activity, -> { reorder("projects.last_activity_at DESC") } - scope :sorted_by_stars, -> { reorder("projects.star_count DESC") } + scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') } + scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } scope :personal, ->(user) { where(namespace_id: user.namespace_id) } - scope :joined, ->(user) { where("namespace_id != ?", user.namespace_id) } + scope :joined, ->(user) { where('namespace_id != ?', user.namespace_id) } scope :public_only, -> { where(visibility_level: Project::PUBLIC) } scope :public_and_internal_only, -> { where(visibility_level: Project.public_and_internal_levels) } scope :non_archived, -> { where(archived: false) } @@ -187,26 +190,26 @@ class Project < ActiveRecord::Base end def active - joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC") + joins(:issues, :notes, :merge_requests).order('issues.created_at, notes.created_at, merge_requests.created_at DESC') end def search(query) - joins(:namespace).where("projects.archived = ?", false). - where("LOWER(projects.name) LIKE :query OR + joins(:namespace).where('projects.archived = ?', false). + where('LOWER(projects.name) LIKE :query OR LOWER(projects.path) LIKE :query OR LOWER(namespaces.name) LIKE :query OR - LOWER(projects.description) LIKE :query", + LOWER(projects.description) LIKE :query', query: "%#{query.try(:downcase)}%") end def search_by_title(query) - where("projects.archived = ?", false).where("LOWER(projects.name) LIKE :query", query: "%#{query.downcase}%") + where('projects.archived = ?', false).where('LOWER(projects.name) LIKE :query', query: "%#{query.downcase}%") end def find_with_namespace(id) - return nil unless id.include?("/") + return nil unless id.include?('/') - id = id.split("/") + id = id.split('/') namespace = Namespace.find_by(path: id.first) return nil unless namespace @@ -224,7 +227,7 @@ class Project < ActiveRecord::Base when 'recently_updated' then reorder('projects.updated_at DESC') when 'last_updated' then reorder('projects.updated_at ASC') when 'largest_repository' then reorder('projects.repository_size DESC') - else reorder("namespaces.path, projects.name ASC") + else reorder('namespaces.path, projects.name ASC') end end end @@ -274,19 +277,19 @@ class Project < ActiveRecord::Base end def to_param - namespace.path + "/" + path + namespace.path + '/' + path end def web_url - [gitlab_config.url, path_with_namespace].join("/") + [gitlab_config.url, path_with_namespace].join('/') end def web_url_without_protocol - web_url.split("://")[1] + web_url.split('://')[1] end def build_commit_note(commit) - notes.new(commit_id: commit.id, noteable_type: "Commit") + notes.new(commit_id: commit.id, noteable_type: 'Commit') end def last_activity @@ -345,8 +348,8 @@ class Project < ActiveRecord::Base end def avatar_type - unless avatar.image? - errors.add :avatar, 'only images allowed' + unless self.avatar.image? + self.errors.add :avatar, 'only images allowed' end end @@ -384,7 +387,7 @@ class Project < ActiveRecord::Base end def team_member_by_name_or_email(name = nil, email = nil) - user = users.where("name like ? or email like ?", name, email).first + user = users.where('name like ? or email like ?', name, email).first project_members.where(user: user) if user end @@ -396,7 +399,7 @@ class Project < ActiveRecord::Base def name_with_namespace @name_with_namespace ||= begin if namespace - namespace.human_name + " / " + name + namespace.human_name + ' / ' + name else name end @@ -431,7 +434,7 @@ class Project < ActiveRecord::Base def valid_repo? repository.exists? rescue - errors.add(:path, "Invalid repository path") + errors.add(:path, 'Invalid repository path') false end @@ -490,7 +493,7 @@ class Project < ActiveRecord::Base end def http_url_to_repo - [gitlab_config.url, "/", path_with_namespace, ".git"].join('') + [gitlab_config.url, '/', path_with_namespace, '.git'].join('') end # Check if current branch name is marked as protected in the system @@ -618,7 +621,7 @@ class Project < ActiveRecord::Base if gitlab_shell.add_repository(path_with_namespace) true else - errors.add(:base, "Failed to create repository") + errors.add(:base, 'Failed to create repository') false end end @@ -631,7 +634,7 @@ class Project < ActiveRecord::Base ProjectWiki.new(self, self.owner).wiki true rescue ProjectWiki::CouldNotCreateWikiError => ex - errors.add(:base, "Failed create wiki") + errors.add(:base, 'Failed create wiki') false end end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 8bb0fcf9474..6b0d4aca3e1 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -14,7 +14,7 @@ module Projects project.name = @from_project.name project.path = @from_project.path project.creator = @current_user - if @from_project.avatar && @from_project.avatar.image? + if @from_project.avatar.present? && @from_project.avatar.image? project.avatar = @from_project.avatar end @@ -42,16 +42,16 @@ module Projects end #Now fork the repo unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path) - raise "forking failed in gitlab-shell" + raise 'forking failed in gitlab-shell' end project.ensure_satellite_exists end rescue => ex - project.errors.add(:base, "Fork transaction failed.") + project.errors.add(:base, 'Fork transaction failed.') project.destroy end else - project.errors.add(:base, "Invalid fork destination") + project.errors.add(:base, 'Invalid fork destination') end project diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 2c65b3049e3..2716ebf326b 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -12,6 +12,8 @@ - projects.each do |project| %li.project-row = link_to project_path(project), class: dom_class(project) do + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s24') .dash-project-access-icon = visibility_level_icon(project.visibility_level) %span.str-truncated diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index fc6499de3e2..28de1a778a7 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -87,7 +87,10 @@ .form-group .col-sm-2 .col-sm-10 - = project_icon(@project.to_param, alt: '', class: 'avatar s160', only_uploaded: true) + - if @project.avatar? + = project_icon(@project.to_param, alt: '', class: 'avatar s160') + - else + = project_icon(@project.to_param, alt: '', class: 'avatar s160', only_uploaded: true) %p.light - if @project.avatar_in_git Project avatar in repository: #{ @project.avatar_in_git } @@ -102,7 +105,7 @@   %span.file_name.js-avatar-filename File name... = f.file_field :avatar, class: "js-project-avatar-input hidden" - .light The maximum file size allowed is 100KB. + .light The maximum file size allowed is 200KB. - if @project.avatar? %hr = link_to 'Remove avatar', project_avatar_path(@project), data: { confirm: "Project avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" -- cgit v1.2.1 From b92449c73e3b80a85144de08e0062c74cb37e80d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 24 Jan 2015 22:03:30 -0800 Subject: Predefine colors for project identicons --- app/assets/stylesheets/generic/avatar.scss | 4 ++-- app/assets/stylesheets/sections/dashboard.scss | 2 +- app/helpers/application_helper.rb | 17 +++++++++++++---- app/views/dashboard/_project.html.haml | 4 ++-- app/views/groups/_projects.html.haml | 4 ++-- 5 files changed, 20 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index f04848ae6dc..b6886206739 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -29,10 +29,10 @@ vertical-align: top; &.s16 { font-size: 12px; line-height: 1.33; } - &.s24 { font-size: 18px; line-height: 1.33; } + &.s24 { font-size: 14px; line-height: 1.8; } &.s26 { font-size: 20px; line-height: 1.33; } &.s32 { font-size: 24px; line-height: 1.33; } &.s60 { font-size: 45px; line-height: 1.33; } &.s90 { font-size: 68px; line-height: 1.33; } &.s160 { font-size: 120px; line-height: 1.33; } -} \ No newline at end of file +} diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index 3135056db58..00795f990bf 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -100,7 +100,7 @@ } .dash-project-access-icon { float: left; - margin-right: 3px; + margin-right: 5px; width: 16px; } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 32fd0ed7bcc..f253ae91306 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -64,13 +64,22 @@ module ApplicationHelper end def project_identicon(project, options = {}) + allowed_colors = { + red: 'FFEBEE', + purple: 'F3E5F5', + indigo: 'E8EAF6', + blue: 'E3F2FD', + teal: 'E0F2F1', + orange: 'FBE9E7', + gray: 'EEEEEE' + } + options[:class] ||= '' options[:class] << ' identicon' - bg_color = Digest::MD5.hexdigest(project.name)[0, 6] - brightness = bg_color[0, 2].hex + bg_color[2, 2].hex + bg_color[4, 2].hex - text_color = (brightness > 375) ? '#000' : '#fff' + bg_key = project.id % 7 + content_tag(:div, class: options[:class], - style: "background-color: ##{ bg_color }; color: #{ text_color }") do + style: "background-color: ##{ allowed_colors.values[bg_key] }; color: #555") do project.name[0, 1].upcase end end diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index 7f19fb5a81c..76b95264fd8 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,8 +1,8 @@ = link_to project_path(project), class: dom_class(project) do - .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s24') .dash-project-access-icon = visibility_level_icon(project.visibility_level) + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s24') %span.str-truncated %span.namespace-name - if project.namespace diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 2716ebf326b..34221595fd7 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -12,10 +12,10 @@ - projects.each do |project| %li.project-row = link_to project_path(project), class: dom_class(project) do - .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s24') .dash-project-access-icon = visibility_level_icon(project.visibility_level) + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s24') %span.str-truncated %span.project-name = project.name -- cgit v1.2.1 From 3588a07b8379c98029598cac8050a1f90fd9c354 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 24 Jan 2015 23:08:52 -0800 Subject: Remove default project icon --- app/assets/images/no_project_icon.png | Bin 3387 -> 0 bytes app/helpers/application_helper.rb | 2 -- app/views/projects/edit.html.haml | 2 -- 3 files changed, 4 deletions(-) delete mode 100644 app/assets/images/no_project_icon.png (limited to 'app') diff --git a/app/assets/images/no_project_icon.png b/app/assets/images/no_project_icon.png deleted file mode 100644 index 8e9529c67ec..00000000000 Binary files a/app/assets/images/no_project_icon.png and /dev/null differ diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f253ae91306..104ae517a08 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -56,8 +56,6 @@ module ApplicationHelper image_tag project.avatar.url, options elsif project.avatar_in_git image_tag project_avatar_path(project), options - elsif options[:only_uploaded] - image_tag '/assets/no_project_icon.png', options else # generated icon project_identicon(project, options) end diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 28de1a778a7..fde9dc45fc6 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -89,8 +89,6 @@ .col-sm-10 - if @project.avatar? = project_icon(@project.to_param, alt: '', class: 'avatar s160') - - else - = project_icon(@project.to_param, alt: '', class: 'avatar s160', only_uploaded: true) %p.light - if @project.avatar_in_git Project avatar in repository: #{ @project.avatar_in_git } -- cgit v1.2.1 From 773b1eaf8f81ca6e11b19f2a0b1fcf5ff231399e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 24 Jan 2015 23:35:02 -0800 Subject: Fix avatar margin for project home page --- app/assets/stylesheets/sections/projects.scss | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 93c0c2bc518..70adc21a7a6 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -36,6 +36,10 @@ float: left; color: #666; font-size: 16px; + + .avatar { + margin-top: -5px; + } } .star-fork-buttons { -- cgit v1.2.1 From a4dad7085850aa62134ed23b90f3a045c3569663 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 24 Jan 2015 23:59:03 -0800 Subject: Fix project name truncation for dashboard --- app/assets/stylesheets/sections/dashboard.scss | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index 00795f990bf..90010781af0 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -112,3 +112,7 @@ color: #FFF; } } + +.dash-list .str-truncated { + max-width: 72%; +} -- cgit v1.2.1 From aad6ceaef9ccfba8e058012a0877b80c103a3838 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sun, 25 Jan 2015 16:33:54 +0100 Subject: Allow configuring protection of the default branch upon first push --- app/controllers/admin/application_settings_controller.rb | 1 + app/models/application_setting.rb | 2 ++ app/services/git_push_service.rb | 10 ++++++++-- app/views/admin/application_settings/_form.html.haml | 4 ++++ 4 files changed, 15 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index a937f484877..7458542fc73 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -22,6 +22,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController def application_setting_params params.require(:application_setting).permit( :default_projects_limit, + :default_branch_protection, :signup_enabled, :signin_enabled, :gravatar_enabled, diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 45ae79a75cc..3285a1a248e 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -4,6 +4,7 @@ # # id :integer not null, primary key # default_projects_limit :integer +# default_branch_protection :integer # signup_enabled :boolean # signin_enabled :boolean # gravatar_enabled :boolean @@ -25,6 +26,7 @@ class ApplicationSetting < ActiveRecord::Base def self.create_from_defaults create( default_projects_limit: Settings.gitlab['default_projects_limit'], + default_branch_protection: Settings.gitlab['default_branch_protection'], signup_enabled: Settings.gitlab['signup_enabled'], signin_enabled: Settings.gitlab['signin_enabled'], gravatar_enabled: Settings.gravatar['enabled'], diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 872b886c575..b45ca0a5e6b 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -1,5 +1,7 @@ class GitPushService attr_accessor :project, :user, :push_data, :push_commits + include Gitlab::CurrentSettings + include Gitlab::Access # This method will be called after each git update # and only if the provided user and project is present in GitLab. @@ -29,8 +31,12 @@ class GitPushService if is_default_branch?(ref) # Initial push to the default branch. Take the full history of that branch as "newly pushed". @push_commits = project.repository.commits(newrev) - # Default branch is protected by default - project.protected_branches.create({ name: project.default_branch }) + + # Set protection on the default branch if configured + if (current_application_settings.default_branch_protection != PROTECTION_NONE) + developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false + project.protected_branches.create({ name: project.default_branch, developers_can_push: developers_can_push }) + end else # Use the pushed commits that aren't reachable by the default branch # as a heuristic. This may include more commits than are actually pushed, but diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 9423a207068..bf0ee49d2f4 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -25,6 +25,10 @@ = f.label :default_projects_limit, class: 'control-label' .col-sm-10 = f.number_field :default_projects_limit, class: 'form-control' + .form-group + = f.label :default_branch_protection, class: 'control-label' + .col-sm-10 + = f.select :default_branch_protection, options_for_select(Gitlab::Access.protection_options, @application_setting.default_branch_protection), {}, class: 'form-control' .form-group = f.label :home_page_url, class: 'control-label' .col-sm-10 -- cgit v1.2.1 From c821412e305b3e7226485d561ce39ab0d419e990 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sun, 25 Jan 2015 18:36:11 +0100 Subject: indentation --- app/services/git_push_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index b45ca0a5e6b..c775f79ec29 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -34,7 +34,7 @@ class GitPushService # Set protection on the default branch if configured if (current_application_settings.default_branch_protection != PROTECTION_NONE) - developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false + developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false project.protected_branches.create({ name: project.default_branch, developers_can_push: developers_can_push }) end else -- cgit v1.2.1 From ce9686e3f56658f2fb8df8ad6e1335e338875df9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 25 Jan 2015 19:59:04 -0800 Subject: Include issue/mr participants in list of recipients for close/reopen emails --- app/services/notification_service.rb | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 72c9149378e..87366b65725 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -331,7 +331,14 @@ class NotificationService end def close_resource_email(target, project, current_user, method) - recipients = reject_muted_users([target.author, target.assignee], project) + participants = + if target.respond_to?(:participants) + target.participants + else + [target.author, target.assignee] + end + + recipients = reject_muted_users(participants, project) recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(current_user) @@ -362,7 +369,14 @@ class NotificationService end def reopen_resource_email(target, project, current_user, method, status) - recipients = reject_muted_users([target.author, target.assignee], project) + participants = + if target.respond_to?(:participants) + target.participants + else + [target.author, target.assignee] + end + + recipients = reject_muted_users(participants, project) recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq recipients.delete(current_user) -- cgit v1.2.1 From 2b02852507466c8cd7dc9a7db7a7e0dd4c7b5183 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 25 Jan 2015 20:31:02 -0800 Subject: Add issue/mr participants to reasign events Also refactor NotificationService a bit --- app/services/notification_service.rb | 52 +++++++++++------------------------- 1 file changed, 15 insertions(+), 37 deletions(-) (limited to 'app') diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 87366b65725..2fc63b9f4b7 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -314,15 +314,7 @@ class NotificationService end def new_resource_email(target, project, method) - if target.respond_to?(:participants) - recipients = target.participants - else - recipients = [] - end - - recipients = reject_muted_users(recipients, project) - recipients = reject_mention_users(recipients, project) - recipients = recipients.concat(project_watchers(project)).uniq + recipients = build_recipients(target, project) recipients.delete(target.author) recipients.each do |recipient| @@ -331,16 +323,7 @@ class NotificationService end def close_resource_email(target, project, current_user, method) - participants = - if target.respond_to?(:participants) - target.participants - else - [target.author, target.assignee] - end - - recipients = reject_muted_users(participants, project) - recipients = reject_mention_users(recipients, project) - recipients = recipients.concat(project_watchers(project)).uniq + recipients = build_recipients(target, project) recipients.delete(current_user) recipients.each do |recipient| @@ -350,17 +333,7 @@ class NotificationService def reassign_resource_email(target, project, current_user, method) assignee_id_was = previous_record(target, "assignee_id") - - recipients = User.where(id: [target.assignee_id, assignee_id_was]) - - # Add watchers to email list - recipients = recipients.concat(project_watchers(project)) - - # reject users with disabled notifications - recipients = reject_muted_users(recipients, project) - recipients = reject_mention_users(recipients, project) - - # Reject me from recipients if I reassign an item + recipients = build_recipients(target, project) recipients.delete(current_user) recipients.each do |recipient| @@ -369,21 +342,26 @@ class NotificationService end def reopen_resource_email(target, project, current_user, method, status) - participants = + recipients = build_recipients(target, project) + recipients.delete(current_user) + + recipients.each do |recipient| + mailer.send(method, recipient.id, target.id, status, current_user.id) + end + end + + def build_recipients(target, project) + recipients = if target.respond_to?(:participants) target.participants else [target.author, target.assignee] end - recipients = reject_muted_users(participants, project) + recipients = reject_muted_users(recipients, project) recipients = reject_mention_users(recipients, project) recipients = recipients.concat(project_watchers(project)).uniq - recipients.delete(current_user) - - recipients.each do |recipient| - mailer.send(method, recipient.id, target.id, status, current_user.id) - end + recipients end def mailer -- cgit v1.2.1 From 9d85ea3acff1c925118718996afc9daa39d679c7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 25 Jan 2015 22:49:05 -0800 Subject: Organize event order execution when update issue or mr --- app/services/issues/close_service.rb | 2 +- app/services/issues/update_service.rb | 2 +- app/services/merge_requests/auto_merge_service.rb | 2 +- app/services/merge_requests/close_service.rb | 2 +- app/services/merge_requests/merge_service.rb | 2 +- app/services/merge_requests/reopen_service.rb | 2 +- app/services/merge_requests/update_service.rb | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/services/issues/close_service.rb b/app/services/issues/close_service.rb index ffed13a12e1..f670019cc63 100644 --- a/app/services/issues/close_service.rb +++ b/app/services/issues/close_service.rb @@ -2,9 +2,9 @@ module Issues class CloseService < Issues::BaseService def execute(issue, commit = nil) if issue.close - notification_service.close_issue(issue, current_user) event_service.close_issue(issue, current_user) create_note(issue, commit) + notification_service.close_issue(issue, current_user) execute_hooks(issue, 'close') end diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index 0ee9635ed99..83e413d7248 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -23,8 +23,8 @@ module Issues end if issue.previous_changes.include?('assignee_id') - notification_service.reassigned_issue(issue, current_user) create_assignee_note(issue) + notification_service.reassigned_issue(issue, current_user) end issue.notice_added_references(issue.project, current_user) diff --git a/app/services/merge_requests/auto_merge_service.rb b/app/services/merge_requests/auto_merge_service.rb index b5d90a74e15..378b39bb9d6 100644 --- a/app/services/merge_requests/auto_merge_service.rb +++ b/app/services/merge_requests/auto_merge_service.rb @@ -11,9 +11,9 @@ module MergeRequests if Gitlab::Satellite::MergeAction.new(current_user, merge_request).merge!(commit_message) merge_request.merge - notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) create_note(merge_request) + notification_service.merge_mr(merge_request, current_user) execute_hooks(merge_request) true diff --git a/app/services/merge_requests/close_service.rb b/app/services/merge_requests/close_service.rb index 4249a84f382..47454f9f0c2 100644 --- a/app/services/merge_requests/close_service.rb +++ b/app/services/merge_requests/close_service.rb @@ -7,8 +7,8 @@ module MergeRequests if merge_request.close event_service.close_mr(merge_request, current_user) - notification_service.close_mr(merge_request, current_user) create_note(merge_request) + notification_service.close_mr(merge_request, current_user) execute_hooks(merge_request, 'close') end diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 1e1614028f7..327ead4ff3f 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -9,9 +9,9 @@ module MergeRequests def execute(merge_request, commit_message) merge_request.merge - notification_service.merge_mr(merge_request, current_user) create_merge_event(merge_request, current_user) create_note(merge_request) + notification_service.merge_mr(merge_request, current_user) execute_hooks(merge_request, 'merge') true diff --git a/app/services/merge_requests/reopen_service.rb b/app/services/merge_requests/reopen_service.rb index a2a9c933f63..8279ad2001b 100644 --- a/app/services/merge_requests/reopen_service.rb +++ b/app/services/merge_requests/reopen_service.rb @@ -3,8 +3,8 @@ module MergeRequests def execute(merge_request) if merge_request.reopen event_service.reopen_mr(merge_request, current_user) - notification_service.reopen_mr(merge_request, current_user) create_note(merge_request) + notification_service.reopen_mr(merge_request, current_user) execute_hooks(merge_request, 'reopen') merge_request.reload_code merge_request.mark_as_unchecked diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb index 56c8510e0ae..10c401756eb 100644 --- a/app/services/merge_requests/update_service.rb +++ b/app/services/merge_requests/update_service.rb @@ -33,8 +33,8 @@ module MergeRequests end if merge_request.previous_changes.include?('assignee_id') - notification_service.reassigned_merge_request(merge_request, current_user) create_assignee_note(merge_request) + notification_service.reassigned_merge_request(merge_request, current_user) end merge_request.notice_added_references(merge_request.project, current_user) -- cgit v1.2.1 From e20dba0299c1395cc8862c44b0b3933266abe001 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 00:23:16 -0800 Subject: Redesign way how project avatar displayed on project page --- app/assets/stylesheets/sections/projects.scss | 22 ++++++++++++++++++---- app/views/projects/_home_panel.html.haml | 3 ++- 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 70adc21a7a6..0a7671e3feb 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -16,6 +16,8 @@ .project-home-panel { margin-bottom: 15px; + position: relative; + padding-left: 85px; &.empty-project { border-bottom: 0px; @@ -23,6 +25,22 @@ margin-bottom: 0px; } + .project-identicon-holder { + position: absolute; + left: 0; + + .avatar { + width: 70px; + height: 70px; + @include border-radius(0px); + } + + .identicon { + font-size: 45px; + line-height: 1.6; + } + } + .project-home-dropdown { margin-left: 10px; float: right; @@ -36,10 +54,6 @@ float: left; color: #666; font-size: 16px; - - .avatar { - margin-top: -5px; - } } .star-fork-buttons { diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 05910c6038c..2ed49f83a7a 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -1,8 +1,9 @@ - empty_repo = @project.empty_repo? .project-home-panel{:class => ("empty-project" if empty_repo)} + .project-identicon-holder + = project_icon(@project.to_param, alt: '', class: 'avatar') .project-home-row .project-home-desc - = project_icon(@project.to_param, alt: '', class: 'avatar s32') - if @project.description.present? = escaped_autolink(@project.description) - if can?(current_user, :admin_project, @project) -- cgit v1.2.1 From 65e700472b471242475eb9d9e3a340c6ce24615a Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 Jan 2015 11:39:32 -0800 Subject: Update the issue tracker attribute on issue tracker change. --- app/controllers/projects/services_controller.rb | 3 +++ app/helpers/issues_helper.rb | 6 +++--- app/models/project.rb | 17 ++++++++--------- 3 files changed, 14 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 15f47ed9c9f..a2cb4ae1ae9 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -17,6 +17,9 @@ class Projects::ServicesController < Projects::ApplicationController def update if @service.update_attributes(service_params) + if @service.activated? && @service.category == :issue_tracker + @project.update_attributes(issues_tracker: @service.to_param) + end redirect_to edit_project_service_path(@project, @service.to_param), notice: 'Successfully updated.' else diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index cfbbed842cd..2bf430f9142 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -16,7 +16,7 @@ module IssuesHelper def url_for_project_issues(project = @project) return '' if project.nil? - if project.using_issue_tracker? + if project.default_issues_tracker? project_issues_path(project) else project.external_issue_tracker.project_url @@ -26,7 +26,7 @@ module IssuesHelper def url_for_new_issue(project = @project) return '' if project.nil? - if project.using_issue_tracker? + if project.default_issues_tracker? url = new_project_issue_path project_id: project else project.external_issue_tracker.new_issue_url @@ -36,7 +36,7 @@ module IssuesHelper def url_for_issue(issue_iid, project = @project) return '' if project.nil? - if project.using_issue_tracker? + if project.default_issues_tracker? url = project_issue_url project_id: project, id: issue_iid else url = project.external_issue_tracker.issues_url diff --git a/app/models/project.rb b/app/models/project.rb index 20b9a5a34dc..de31f14b98e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -308,11 +308,14 @@ class Project < ActiveRecord::Base end def default_issues_tracker? - self.issues_tracker == Project.issues_tracker.default_value - end - - def external_issues_tracker_enabled? - external_issues_trackers.any? + if external_issue_tracker + false + else + unless self.issues_tracker == Project.issues_tracker.default_value + self.update_attributes(issues_tracker: Project.issues_tracker.default_value) + end + true + end end def external_issues_trackers @@ -323,10 +326,6 @@ class Project < ActiveRecord::Base @external_issues_tracker ||= external_issues_trackers.select(&:activated?).first end - def using_issue_tracker? - default_issues_tracker? || !external_issues_tracker_enabled? - end - def can_have_issues_tracker_id? self.issues_enabled && !self.default_issues_tracker? end -- cgit v1.2.1 From 05b6bb4bf704c2a47d6b2717308ee2ad9b5eec81 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Mon, 26 Jan 2015 21:25:13 +0100 Subject: Don't require omniauth to be enabled, to use github importer --- app/helpers/projects_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index de232ab4e25..f780a8ffc3b 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -257,7 +257,7 @@ module ProjectsHelper end def github_import_enabled? - Gitlab.config.omniauth.enabled && enabled_oauth_providers.include?(:github) + enabled_oauth_providers.include?(:github) end end -- cgit v1.2.1 From 3e47ea5064f7e93cadb0ef347dfa27517552a4a0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 13:31:20 -0800 Subject: Files::CreateService can now commit file to empty repository --- app/services/files/create_service.rb | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb index b90adeef00a..2c457ef2cef 100644 --- a/app/services/files/create_service.rb +++ b/app/services/files/create_service.rb @@ -9,10 +9,6 @@ module Files return error("You are not allowed to create file in this branch") end - unless repository.branch_names.include?(ref) - return error("You can only create files if you are on top of a branch") - end - file_name = File.basename(path) file_path = path @@ -23,12 +19,21 @@ module Files ) end - blob = repository.blob_at_branch(ref, file_path) + if project.empty_repo? + # everything is ok because repo does not have a commits yet + else + unless repository.branch_names.include?(ref) + return error("You can only create files if you are on top of a branch") + end - if blob - return error("Your changes could not be committed, because file with such name exists") + blob = repository.blob_at_branch(ref, file_path) + + if blob + return error("Your changes could not be committed, because file with such name exists") + end end + new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, project, ref, file_path) created_successfully = new_file_action.commit!( params[:content], -- cgit v1.2.1 From 6a2384e0bc7d0b703c8f6af144c85af47eae6630 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 13:37:18 -0800 Subject: Make draft UI for creating new file in empty repository --- app/assets/stylesheets/generic/buttons.scss | 5 +++++ app/views/projects/empty.html.haml | 11 +++++++++++ 2 files changed, 16 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/buttons.scss b/app/assets/stylesheets/generic/buttons.scss index d098f1ecaa2..3b360275065 100644 --- a/app/assets/stylesheets/generic/buttons.scss +++ b/app/assets/stylesheets/generic/buttons.scss @@ -173,6 +173,11 @@ margin-right: 0px; } } + + &.btn-lg { + font-size: 15px; + line-height: 1.4; + } } .btn-block { diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 2e46de6bfe0..3a42fce43e9 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -3,6 +3,17 @@ = render "home_panel" +.center.well + %h3 + The repository for this project is empty + %p.lead + You can + = link_to '#', class: 'btn btn-new btn-lg' do + add a file +  or push it via command line. + +%h4 + %strong Command line instructions %div.git-empty %fieldset %legend Git global setup -- cgit v1.2.1 From c916124178645412a554a6b8b39c05bbd42269c8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 15:01:51 -0800 Subject: Explicitly set before_filter for ref-related controllers --- app/controllers/projects/blame_controller.rb | 2 +- app/controllers/projects/commits_controller.rb | 2 +- app/controllers/projects/network_controller.rb | 2 +- app/controllers/projects/raw_controller.rb | 2 +- app/controllers/projects/refs_controller.rb | 2 +- app/controllers/projects/tree_controller.rb | 9 +++++++-- 6 files changed, 12 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb index 367d1295f34..106f21b83e6 100644 --- a/app/controllers/projects/blame_controller.rb +++ b/app/controllers/projects/blame_controller.rb @@ -2,7 +2,7 @@ class Projects::BlameController < Projects::ApplicationController include ExtractsPath - # Authorize + before_filter :assign_ref_vars before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb index 9476b6c0284..0a85c36a758 100644 --- a/app/controllers/projects/commits_controller.rb +++ b/app/controllers/projects/commits_controller.rb @@ -3,7 +3,7 @@ require "base64" class Projects::CommitsController < Projects::ApplicationController include ExtractsPath - # Authorize + before_filter :assign_ref_vars before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/network_controller.rb b/app/controllers/projects/network_controller.rb index ada1aed0df7..59f2a745367 100644 --- a/app/controllers/projects/network_controller.rb +++ b/app/controllers/projects/network_controller.rb @@ -2,7 +2,7 @@ class Projects::NetworkController < Projects::ApplicationController include ExtractsPath include ApplicationHelper - # Authorize + before_filter :assign_ref_vars before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index fdbc4c5a098..84888265dc1 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -2,7 +2,7 @@ class Projects::RawController < Projects::ApplicationController include ExtractsPath - # Authorize + before_filter :assign_ref_vars before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index 67665f5f601..cede0ebe0ae 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -1,7 +1,7 @@ class Projects::RefsController < Projects::ApplicationController include ExtractsPath - # Authorize + before_filter :assign_ref_vars before_filter :authorize_download_code! before_filter :require_non_empty_project diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb index 4d033b36848..5b52640a4e1 100644 --- a/app/controllers/projects/tree_controller.rb +++ b/app/controllers/projects/tree_controller.rb @@ -1,7 +1,12 @@ # Controller for viewing a repository's file structure -class Projects::TreeController < Projects::BaseTreeController - def show +class Projects::TreeController < Projects::ApplicationController + include ExtractsPath + + before_filter :assign_ref_vars + before_filter :authorize_download_code! + before_filter :require_non_empty_project, except: [:new, :create] + def show if tree.entries.empty? if @repository.blob_at(@commit.id, @path) redirect_to project_blob_path(@project, File.join(@ref, @path)) and return -- cgit v1.2.1 From 59b08942aa3de480899f32f1a6f2f948329ae3fc Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 15:02:28 -0800 Subject: Refactor blob controllers --- app/controllers/projects/base_tree_controller.rb | 7 -- app/controllers/projects/blob_controller.rb | 98 ++++++++++++++++++++++-- app/controllers/projects/edit_tree_controller.rb | 60 --------------- app/controllers/projects/new_tree_controller.rb | 20 ----- 4 files changed, 93 insertions(+), 92 deletions(-) delete mode 100644 app/controllers/projects/base_tree_controller.rb delete mode 100644 app/controllers/projects/edit_tree_controller.rb delete mode 100644 app/controllers/projects/new_tree_controller.rb (limited to 'app') diff --git a/app/controllers/projects/base_tree_controller.rb b/app/controllers/projects/base_tree_controller.rb deleted file mode 100644 index a7b1b7b40e8..00000000000 --- a/app/controllers/projects/base_tree_controller.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Projects::BaseTreeController < Projects::ApplicationController - include ExtractsPath - - before_filter :authorize_download_code! - before_filter :require_non_empty_project -end - diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 2412800c493..00b82ff1df3 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -2,16 +2,70 @@ class Projects::BlobController < Projects::ApplicationController include ExtractsPath - # Authorize + # Raised when given an invalid file path + class InvalidPathError < StandardError; end + before_filter :authorize_download_code! - before_filter :require_non_empty_project + before_filter :require_non_empty_project, except: [:new, :create] before_filter :authorize_push_code!, only: [:destroy] + before_filter :assign_blob_vars + before_filter :commit, except: [:new, :create] + before_filter :blob, except: [:new, :create] + before_filter :from_merge_request, only: [:edit, :update] + before_filter :after_edit_path, only: [:edit, :update] + before_filter :require_branch_head, only: [:edit, :update] + + def new + commit unless @repository.empty? + end - before_filter :blob + def create + file_path = File.join(@path, File.basename(params[:file_name])) + result = Files::CreateService.new(@project, current_user, params, @ref, file_path).execute + + if result[:status] == :success + flash[:notice] = "Your changes have been successfully committed" + redirect_to project_blob_path(@project, File.join(@ref, file_path)) + else + flash[:alert] = result[:message] + render :show + end + end def show end + def edit + @last_commit = Gitlab::Git::Commit.last_for_path(@repository, @ref, @path).sha + end + + def update + result = Files::UpdateService. + new(@project, current_user, params, @ref, @path).execute + + if result[:status] == :success + flash[:notice] = "Your changes have been successfully committed" + + if from_merge_request + from_merge_request.reload_code + end + + redirect_to after_edit_path + else + flash[:alert] = result[:message] + render :show + end + end + + def preview + @content = params[:content] + diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', + include_diff_info: true) + @diff_lines = Gitlab::Diff::Parser.new.parse(diffy.diff.scan(/.*\n/)) + + render layout: false + end + def destroy result = Files::DeleteService.new(@project, current_user, params, @ref, @path).execute @@ -46,10 +100,44 @@ class Projects::BlobController < Projects::ApplicationController if @blob @blob - elsif tree.entries.any? - redirect_to project_tree_path(@project, File.join(@ref, @path)) and return else + if tree = @repository.tree(@commit.id, @path) + if tree.entries.any? + redirect_to project_tree_path(@project, File.join(@ref, @path)) and return + end + end + return not_found! end end + + def commit + @commit = @repository.commit(@ref) + + return not_found! unless @commit + end + + def assign_blob_vars + @id = params[:id] + @ref, @path = extract_ref(@id) + + + rescue InvalidPathError + not_found! + end + + def after_edit_path + @after_edit_path ||= + if from_merge_request + diffs_project_merge_request_path(from_merge_request.target_project, from_merge_request) + + "#file-path-#{hexdigest(@path)}" + else + project_blob_path(@project, @id) + end + end + + def from_merge_request + # If blob edit was initiated from merge request page + @from_merge_request ||= MergeRequest.find_by(id: params[:from_merge_request_id]) + end end diff --git a/app/controllers/projects/edit_tree_controller.rb b/app/controllers/projects/edit_tree_controller.rb deleted file mode 100644 index 65661c80410..00000000000 --- a/app/controllers/projects/edit_tree_controller.rb +++ /dev/null @@ -1,60 +0,0 @@ -class Projects::EditTreeController < Projects::BaseTreeController - before_filter :require_branch_head - before_filter :blob - before_filter :authorize_push_code! - before_filter :from_merge_request - before_filter :after_edit_path - - def show - @last_commit = Gitlab::Git::Commit.last_for_path(@repository, @ref, @path).sha - end - - def update - result = Files::UpdateService. - new(@project, current_user, params, @ref, @path).execute - - if result[:status] == :success - flash[:notice] = "Your changes have been successfully committed" - - if from_merge_request - from_merge_request.reload_code - end - - redirect_to after_edit_path - else - flash[:alert] = result[:message] - render :show - end - end - - def preview - @content = params[:content] - - diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', - include_diff_info: true) - @diff_lines = Gitlab::Diff::Parser.new.parse(diffy.diff.scan(/.*\n/)) - - render layout: false - end - - private - - def blob - @blob ||= @repository.blob_at(@commit.id, @path) - end - - def after_edit_path - @after_edit_path ||= - if from_merge_request - diffs_project_merge_request_path(from_merge_request.target_project, from_merge_request) + - "#file-path-#{hexdigest(@path)}" - else - project_blob_path(@project, @id) - end - end - - def from_merge_request - # If blob edit was initiated from merge request page - @from_merge_request ||= MergeRequest.find_by(id: params[:from_merge_request_id]) - end -end diff --git a/app/controllers/projects/new_tree_controller.rb b/app/controllers/projects/new_tree_controller.rb deleted file mode 100644 index ffba706b2f6..00000000000 --- a/app/controllers/projects/new_tree_controller.rb +++ /dev/null @@ -1,20 +0,0 @@ -class Projects::NewTreeController < Projects::BaseTreeController - before_filter :require_branch_head - before_filter :authorize_push_code! - - def show - end - - def update - file_path = File.join(@path, File.basename(params[:file_name])) - result = Files::CreateService.new(@project, current_user, params, @ref, file_path).execute - - if result[:status] == :success - flash[:notice] = "Your changes have been successfully committed" - redirect_to project_blob_path(@project, File.join(@ref, file_path)) - else - flash[:alert] = result[:message] - render :show - end - end -end -- cgit v1.2.1 From 21297e78afd5ddfbfdf62f471acf1ab2f0c2a892 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 15:03:14 -0800 Subject: Refactor blob helpers --- app/helpers/blob_helper.rb | 38 ++++++++++++++++++++++++++++++++++++++ app/helpers/projects_helper.rb | 6 +++++- app/helpers/tree_helper.rb | 38 -------------------------------------- 3 files changed, 43 insertions(+), 39 deletions(-) (limited to 'app') diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 3a282803963..e75eebd2da9 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -19,4 +19,42 @@ module BlobHelper def no_highlight_files %w(credits changelog copying copyright license authors) end + + def edit_blob_link(project, ref, path, options = {}) + blob = + begin + project.repository.blob_at(ref, path) + rescue + nil + end + + if blob && blob.text? + text = 'Edit' + after = options[:after] || '' + from_mr = options[:from_merge_request_id] + link_opts = {} + link_opts[:from_merge_request_id] = from_mr if from_mr + cls = 'btn btn-small' + if allowed_tree_edit?(project, ref) + link_to text, project_edit_blob_path(project, tree_join(ref, path), + link_opts), class: cls + else + content_tag :span, text, class: cls + ' disabled' + end + after.html_safe + else + '' + end + end + + def leave_edit_message + "Leave edit mode?\nAll unsaved changes will be lost." + end + + def editing_preview_title(filename) + if Gitlab::MarkdownHelper.previewable?(filename) + 'Preview' + else + 'Preview changes' + end + end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index de232ab4e25..9d2c99356af 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -187,7 +187,11 @@ module ProjectsHelper "Issues - " + title end elsif current_controller?(:blob) - "#{@project.path}\/#{@blob.path} at #{@ref} - " + title + if current_action?(:new) || current_action?(:create) + "New file at #{@ref}" + elsif @blob + "Edit file #{@blob.path} at #{@ref}" + end elsif current_controller?(:commits) "Commits at #{@ref} - " + title elsif current_controller?(:merge_requests) diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index 1d987a6ffc0..727ec3fb231 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -64,32 +64,6 @@ module TreeHelper ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref) end - def edit_blob_link(project, ref, path, options = {}) - blob = - begin - project.repository.blob_at(ref, path) - rescue - nil - end - - if blob && blob.text? - text = 'Edit' - after = options[:after] || '' - from_mr = options[:from_merge_request_id] - link_opts = {} - link_opts[:from_merge_request_id] = from_mr if from_mr - cls = 'btn btn-small' - if allowed_tree_edit?(project, ref) - link_to text, project_edit_tree_path(project, tree_join(ref, path), - link_opts), class: cls - else - content_tag :span, text, class: cls + ' disabled' - end + after.html_safe - else - '' - end - end - def tree_breadcrumbs(tree, max_links = 2) if @path.present? part_path = "" @@ -121,16 +95,4 @@ module TreeHelper return tree.name end end - - def leave_edit_message - "Leave edit mode?\nAll unsaved changes will be lost." - end - - def editing_preview_title(filename) - if Gitlab::MarkdownHelper.previewable?(filename) - 'Preview' - else - 'Diff' - end - end end -- cgit v1.2.1 From 752cb506c033c281064abb56093c41a7dac2735a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 15:03:30 -0800 Subject: Refactor blob views --- app/views/projects/blob/edit.html.haml | 62 ++++++++++++++++++++++++++ app/views/projects/blob/new.html.haml | 38 ++++++++++++++++ app/views/projects/blob/preview.html.haml | 25 +++++++++++ app/views/projects/edit_tree/preview.html.haml | 25 ----------- app/views/projects/edit_tree/show.html.haml | 57 ----------------------- app/views/projects/empty.html.haml | 2 +- app/views/projects/new_tree/show.html.haml | 38 ---------------- app/views/projects/tree/_tree.html.haml | 2 +- 8 files changed, 127 insertions(+), 122 deletions(-) create mode 100644 app/views/projects/blob/edit.html.haml create mode 100644 app/views/projects/blob/new.html.haml create mode 100644 app/views/projects/blob/preview.html.haml delete mode 100644 app/views/projects/edit_tree/preview.html.haml delete mode 100644 app/views/projects/edit_tree/show.html.haml delete mode 100644 app/views/projects/new_tree/show.html.haml (limited to 'app') diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml new file mode 100644 index 00000000000..883845c03f5 --- /dev/null +++ b/app/views/projects/blob/edit.html.haml @@ -0,0 +1,62 @@ +.file-editor + %ul.nav.nav-tabs.js-edit-mode + %li.active + = link_to '#editor' do + %i.fa.fa-edit + Edit file + + %li + = link_to '#preview', 'data-preview-url' => project_preview_blob_path(@project, @id) do + %i.fa.fa-eye + = editing_preview_title(@blob.name) + + = form_tag(project_update_blob_path(@project, @id), method: :put, class: "form-horizontal") do + = render 'projects/blob_editor', ref: @ref, path: @path, blob_data: @blob.data + = render 'shared/commit_message_container', params: params, + placeholder: "Update #{@blob.name}" + = hidden_field_tag 'last_commit', @last_commit + = hidden_field_tag 'content', '', id: "file-content" + = hidden_field_tag 'from_merge_request_id', params[:from_merge_request_id] + = render 'projects/commit_button', ref: @ref, + cancel_path: @after_edit_path + +:javascript + ace.config.set("modePath", gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}/ace") + ace.config.loadModule("ace/ext/searchbox"); + var ace_mode = "#{@blob.language.try(:ace_mode)}"; + var editor = ace.edit("editor"); + if (ace_mode) { + editor.getSession().setMode('ace/mode/' + ace_mode); + } + + disableButtonIfEmptyField("#commit_message", ".js-commit-button"); + + $(".js-commit-button").click(function(){ + $("#file-content").val(editor.getValue()); + $(".file-editor form").submit(); + }); + + var editModePanes = $('.js-edit-mode-pane'), + editModeLinks = $('.js-edit-mode a'); + + editModeLinks.click(function(event) { + event.preventDefault(); + + var currentLink = $(this), + paneId = currentLink.attr('href'), + currentPane = editModePanes.filter(paneId); + + editModeLinks.parent().removeClass('active hover'); + currentLink.parent().addClass('active hover'); + editModePanes.hide(); + + if (paneId == '#preview') { + currentPane.fadeIn(200); + $.post(currentLink.data('preview-url'), { content: editor.getValue() }, function(response) { + currentPane.empty().append(response); + }) + } else { + currentPane.fadeIn(200); + editor.focus() + } + }) diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml new file mode 100644 index 00000000000..57e830d5c56 --- /dev/null +++ b/app/views/projects/blob/new.html.haml @@ -0,0 +1,38 @@ +%h3.page-title New file +%hr +.file-editor + = form_tag(project_create_blob_path(@project, @id), method: :post, class: 'form-horizontal form-new-file') do + .form-group.commit_message-group + = label_tag 'file_name', class: 'control-label' do + File name + .col-sm-10 + .input-group + %span.input-group-addon + = @path[-1] == "/" ? @path : @path + "/" + = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", required: true, class: 'form-control' + %span.input-group-addon + on + %span= @ref + + .form-group.commit_message-group + = label_tag :encoding, class: "control-label" do + Encoding + .col-sm-10 + = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' + = render 'projects/blob_editor', ref: @ref + = render 'shared/commit_message_container', params: params, + placeholder: 'Add new file' + = hidden_field_tag 'content', '', id: 'file-content' + = render 'projects/commit_button', ref: @ref, + cancel_path: project_tree_path(@project, @id) + +:javascript + ace.config.set("modePath", gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}/ace-src-noconflict") + var editor = ace.edit("editor"); + + disableButtonIfAnyEmptyField($('.form-new-file'), '.form-control', '.btn-create') + + $(".js-commit-button").click(function(){ + $("#file-content").val(editor.getValue()); + $(".file-editor form").submit(); + }); diff --git a/app/views/projects/blob/preview.html.haml b/app/views/projects/blob/preview.html.haml new file mode 100644 index 00000000000..e7c3460ad78 --- /dev/null +++ b/app/views/projects/blob/preview.html.haml @@ -0,0 +1,25 @@ +.diff-file + .diff-content + - if gitlab_markdown?(@blob.name) + .file-content.wiki + = preserve do + = markdown(@content) + - elsif markup?(@blob.name) + .file-content.wiki + = raw render_markup(@blob.name, @content) + - else + .file-content.code + - unless @diff_lines.empty? + %table.text-file + - @diff_lines.each do |line| + %tr.line_holder{ class: "#{line.type}" } + - if line.type == "match" + %td.old_line= "..." + %td.new_line= "..." + %td.line_content.matched= line.text + - else + %td.old_line + %td.new_line + %td.line_content{class: "#{line.type}"}= raw diff_line_content(line.text) + - else + .nothing-here-block No changes. diff --git a/app/views/projects/edit_tree/preview.html.haml b/app/views/projects/edit_tree/preview.html.haml deleted file mode 100644 index e7c3460ad78..00000000000 --- a/app/views/projects/edit_tree/preview.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -.diff-file - .diff-content - - if gitlab_markdown?(@blob.name) - .file-content.wiki - = preserve do - = markdown(@content) - - elsif markup?(@blob.name) - .file-content.wiki - = raw render_markup(@blob.name, @content) - - else - .file-content.code - - unless @diff_lines.empty? - %table.text-file - - @diff_lines.each do |line| - %tr.line_holder{ class: "#{line.type}" } - - if line.type == "match" - %td.old_line= "..." - %td.new_line= "..." - %td.line_content.matched= line.text - - else - %td.old_line - %td.new_line - %td.line_content{class: "#{line.type}"}= raw diff_line_content(line.text) - - else - .nothing-here-block No changes. diff --git a/app/views/projects/edit_tree/show.html.haml b/app/views/projects/edit_tree/show.html.haml deleted file mode 100644 index 7e0789853af..00000000000 --- a/app/views/projects/edit_tree/show.html.haml +++ /dev/null @@ -1,57 +0,0 @@ -.file-editor - %ul.nav.nav-tabs.js-edit-mode - %li.active - = link_to 'Edit', '#editor' - %li - = link_to editing_preview_title(@blob.name), '#preview', 'data-preview-url' => preview_project_edit_tree_path(@project, @id) - - = form_tag(project_edit_tree_path(@project, @id), method: :put, class: "form-horizontal") do - = render 'projects/blob_editor', ref: @ref, path: @path, blob_data: @blob.data - = render 'shared/commit_message_container', params: params, - placeholder: "Update #{@blob.name}" - = hidden_field_tag 'last_commit', @last_commit - = hidden_field_tag 'content', '', id: "file-content" - = hidden_field_tag 'from_merge_request_id', params[:from_merge_request_id] - = render 'projects/commit_button', ref: @ref, - cancel_path: @after_edit_path - -:javascript - ace.config.set("modePath", gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}/ace") - ace.config.loadModule("ace/ext/searchbox"); - var ace_mode = "#{@blob.language.try(:ace_mode)}"; - var editor = ace.edit("editor"); - if (ace_mode) { - editor.getSession().setMode('ace/mode/' + ace_mode); - } - - disableButtonIfEmptyField("#commit_message", ".js-commit-button"); - - $(".js-commit-button").click(function(){ - $("#file-content").val(editor.getValue()); - $(".file-editor form").submit(); - }); - - var editModePanes = $('.js-edit-mode-pane'), - editModeLinks = $('.js-edit-mode a'); - - editModeLinks.click(function(event) { - event.preventDefault(); - - var currentLink = $(this), - paneId = currentLink.attr('href'), - currentPane = editModePanes.filter(paneId); - - editModeLinks.parent().removeClass('active hover'); - currentLink.parent().addClass('active hover'); - editModePanes.hide(); - - if (paneId == '#preview') { - currentPane.fadeIn(200); - $.post(currentLink.data('preview-url'), { content: editor.getValue() }, function(response) { - currentPane.empty().append(response); - }) - } else { - currentPane.fadeIn(200); - editor.focus() - } - }) diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 3a42fce43e9..776a7327bc2 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -8,7 +8,7 @@ The repository for this project is empty %p.lead You can - = link_to '#', class: 'btn btn-new btn-lg' do + = link_to project_new_blob_path(@project, 'master'), class: 'btn btn-new btn-lg' do add a file  or push it via command line. diff --git a/app/views/projects/new_tree/show.html.haml b/app/views/projects/new_tree/show.html.haml deleted file mode 100644 index cf7b768694f..00000000000 --- a/app/views/projects/new_tree/show.html.haml +++ /dev/null @@ -1,38 +0,0 @@ -%h3.page-title New file -%hr -.file-editor - = form_tag(project_new_tree_path(@project, @id), method: :put, class: 'form-horizontal form-new-file') do - .form-group.commit_message-group - = label_tag 'file_name', class: 'control-label' do - File name - .col-sm-10 - .input-group - %span.input-group-addon - = @path[-1] == "/" ? @path : @path + "/" - = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", required: true, class: 'form-control' - %span.input-group-addon - on - %span= @ref - - .form-group.commit_message-group - = label_tag :encoding, class: "control-label" do - Encoding - .col-sm-10 - = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' - = render 'projects/blob_editor', ref: @ref - = render 'shared/commit_message_container', params: params, - placeholder: 'Add new file' - = hidden_field_tag 'content', '', id: 'file-content' - = render 'projects/commit_button', ref: @ref, - cancel_path: project_tree_path(@project, @id) - -:javascript - ace.config.set("modePath", gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}/ace-src-noconflict") - var editor = ace.edit("editor"); - - disableButtonIfAnyEmptyField($('.form-new-file'), '.form-control', '.btn-create') - - $(".js-commit-button").click(function(){ - $("#file-content").val(editor.getValue()); - $(".file-editor form").submit(); - }); diff --git a/app/views/projects/tree/_tree.html.haml b/app/views/projects/tree/_tree.html.haml index 68ccd4d61bb..f902440b3f1 100644 --- a/app/views/projects/tree/_tree.html.haml +++ b/app/views/projects/tree/_tree.html.haml @@ -10,7 +10,7 @@ = link_to title, '#' - if current_user && can_push_branch?(@project, @ref) %li - = link_to project_new_tree_path(@project, @id), title: 'New file', id: 'new-file-link' do + = link_to project_new_blob_path(@project, @id), title: 'New file', id: 'new-file-link' do %small %i.fa.fa-plus -- cgit v1.2.1 From ed9137862773c8cd242e16a7945cf18a0b2e1ff9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 15:12:13 -0800 Subject: Fix blob controller rendering in case of errors --- app/controllers/projects/blob_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 00b82ff1df3..b471d57f698 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -28,7 +28,7 @@ class Projects::BlobController < Projects::ApplicationController redirect_to project_blob_path(@project, File.join(@ref, file_path)) else flash[:alert] = result[:message] - render :show + render :new end end @@ -53,7 +53,7 @@ class Projects::BlobController < Projects::ApplicationController redirect_to after_edit_path else flash[:alert] = result[:message] - render :show + render :edit end end -- cgit v1.2.1 From 2b8b060236535d3abe27d705be97523b0816da67 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 15:15:51 -0800 Subject: Make code font size a bit bigger so its easier to read it --- app/assets/stylesheets/generic/highlight.scss | 8 ++++---- app/assets/stylesheets/main/variables.scss | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/highlight.scss b/app/assets/stylesheets/generic/highlight.scss index 83dc7ab491a..839551ca8da 100644 --- a/app/assets/stylesheets/generic/highlight.scss +++ b/app/assets/stylesheets/generic/highlight.scss @@ -10,8 +10,8 @@ border: none; border-radius: 0; font-family: $monospace_font; - font-size: 12px !important; - line-height: 16px !important; + font-size: $code_font_size !important; + line-height: 1.4 !important; margin: 0; overflow: auto; overflow-y: hidden; @@ -38,8 +38,8 @@ a { font-family: $monospace_font; display: block; - font-size: 12px !important; - line-height: 16px !important; + font-size: $code_font_size !important; + line-height: 1.4 !important; white-space: nowrap; i { diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index 6bbce70a782..f2402a4fc30 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -59,3 +59,4 @@ $list-font-size: 15px; $sidebar_width: 230px; $avatar_radius: 50%; +$code_font_size: 13px; -- cgit v1.2.1 From 4641514cbfdcc56a0cbc5ad3444a92284df9a665 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 Jan 2015 15:59:40 -0800 Subject: Update rspec tests to the new external issue logic. --- app/assets/javascripts/dispatcher.js.coffee | 1 - app/assets/javascripts/project_new.js.coffee | 14 -------------- 2 files changed, 15 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index ef86c2781c9..9457f88817f 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -99,7 +99,6 @@ class Dispatcher switch path[1] when 'edit' shortcut_handler = new ShortcutsNavigation() - new ProjectNew() when 'new' new ProjectNew() when 'show' diff --git a/app/assets/javascripts/project_new.js.coffee b/app/assets/javascripts/project_new.js.coffee index f4a2ca813d2..836269c44f9 100644 --- a/app/assets/javascripts/project_new.js.coffee +++ b/app/assets/javascripts/project_new.js.coffee @@ -9,17 +9,3 @@ class @ProjectNew initEvents: -> disableButtonIfEmptyField '#project_name', '.project-submit' - - $('#project_issues_enabled').change -> - if ($(this).is(':checked') == true) - $('#project_issues_tracker').removeAttr('disabled') - else - $('#project_issues_tracker').attr('disabled', 'disabled') - - $('#project_issues_tracker').change() - - $('#project_issues_tracker').change -> - if ($(this).val() == gon.default_issues_tracker || $(this).is(':disabled')) - $('#project_issues_tracker_id').attr('disabled', 'disabled') - else - $('#project_issues_tracker_id').removeAttr('disabled') -- cgit v1.2.1 From 00a0d5aeeaf19ea4d72fd1890afac099026f1706 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 Jan 2015 16:24:11 -0800 Subject: Move repetition to the parent. --- .../project_services/issue_tracker_service.rb | 44 ++++++++++++++++++ app/models/project_services/jira_service.rb | 45 ------------------ app/models/project_services/redmine_service.rb | 54 ++++------------------ 3 files changed, 54 insertions(+), 89 deletions(-) (limited to 'app') diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 664b55a5951..7ff6e0f284d 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -15,4 +15,48 @@ class IssueTrackerService < Service def new_issue_url # implement inside child end + + def fields + [ + { type: 'text', name: 'description', placeholder: description }, + { type: 'text', name: 'project_url', placeholder: 'Project url' }, + { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + ] + end + + def initialize_properties + if properties.nil? + if enabled_in_gitlab_config + self.properties = { + title: issues_tracker['title'], + project_url: set_project_url, + issues_url: issues_tracker['issues_url'], + new_issue_url: issues_tracker['new_issue_url'] + } + end + end + end + + private + + def enabled_in_gitlab_config + Gitlab.config.issues_tracker && + Gitlab.config.issues_tracker.values.any? && + issues_tracker + end + + def issues_tracker + Gitlab.config.issues_tracker[to_param] + end + + def set_project_url + id = self.project.issues_tracker_id + + if id + issues_tracker['project_url'].gsub(":issues_tracker_id", id) + else + issues_tracker['project_url'] + end + end end diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index f8b04ddeea7..b0d668948d0 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -21,49 +21,4 @@ class JiraService < IssueTrackerService def to_param 'jira' end - - def fields - [ - { type: 'text', name: 'title', placeholder: title }, - { type: 'text', name: 'description', placeholder: description }, - { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} - ] - end - - def initialize_properties - if properties.nil? - if enabled_in_gitlab_config - self.properties = { - title: issues_tracker['title'], - project_url: set_project_url, - issues_url: issues_tracker['issues_url'], - new_issue_url: issues_tracker['new_issue_url'] - } - end - end - end - - private - - def enabled_in_gitlab_config - Gitlab.config.issues_tracker && - Gitlab.config.issues_tracker.values.any? && - issues_tracker - end - - def issues_tracker - Gitlab.config.issues_tracker['jira'] - end - - def set_project_url - id = self.project.issues_tracker_id - - if id - issues_tracker['project_url'].gsub(":issues_tracker_id", id) - else - issues_tracker['project_url'] - end - end end diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index 71286d74b58..11cce3e0561 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -3,56 +3,22 @@ class RedmineService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url def title - 'Redmine' + if self.properties && self.properties['title'].present? + self.properties['title'] + else + 'Redmine' + end end def description - 'Redmine issue tracker' + if self.properties && self.properties['description'].present? + self.properties['description'] + else + 'Redmine issue tracker' + end end def to_param 'redmine' end - - def fields - [ - { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} - ] - end - - def initialize_properties - if properties.nil? - if enabled_in_gitlab_config - self.properties = { - title: issues_tracker['title'], - project_url: set_project_url, - issues_url: issues_tracker['issues_url'], - new_issue_url: issues_tracker['new_issue_url'] - } - end - end - end - - private - - def enabled_in_gitlab_config - Gitlab.config.issues_tracker && - Gitlab.config.issues_tracker.values.any? && - issues_tracker - end - - def issues_tracker - Gitlab.config.issues_tracker['redmine'] - end - - def set_project_url - id = self.project.issues_tracker_id - if id - issues_tracker['project_url'].gsub(":issues_tracker_id", id) - else - issues_tracker['project_url'] - end - end end -- cgit v1.2.1 From e6b97d09470b01b5b65e87dab339c500f1bac45f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 18:56:56 -0800 Subject: Improve font sizes for code and diff --- app/assets/stylesheets/generic/highlight.scss | 4 ++-- app/assets/stylesheets/main/variables.scss | 1 + app/assets/stylesheets/sections/diff.scss | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/highlight.scss b/app/assets/stylesheets/generic/highlight.scss index 839551ca8da..e1ca86af816 100644 --- a/app/assets/stylesheets/generic/highlight.scss +++ b/app/assets/stylesheets/generic/highlight.scss @@ -11,7 +11,7 @@ border-radius: 0; font-family: $monospace_font; font-size: $code_font_size !important; - line-height: 1.4 !important; + line-height: $code_line_height !important; margin: 0; overflow: auto; overflow-y: hidden; @@ -39,7 +39,7 @@ font-family: $monospace_font; display: block; font-size: $code_font_size !important; - line-height: 1.4 !important; + line-height: $code_line_height !important; white-space: nowrap; i { diff --git a/app/assets/stylesheets/main/variables.scss b/app/assets/stylesheets/main/variables.scss index f2402a4fc30..acbf5be94a3 100644 --- a/app/assets/stylesheets/main/variables.scss +++ b/app/assets/stylesheets/main/variables.scss @@ -60,3 +60,4 @@ $sidebar_width: 230px; $avatar_radius: 50%; $code_font_size: 13px; +$code_line_height: 1.5; diff --git a/app/assets/stylesheets/sections/diff.scss b/app/assets/stylesheets/sections/diff.scss index 758f15c8013..da50dbe4715 100644 --- a/app/assets/stylesheets/sections/diff.scss +++ b/app/assets/stylesheets/sections/diff.scss @@ -37,7 +37,7 @@ overflow-y: hidden; background: #FFF; color: #333; - font-size: 12px; + font-size: $code_font_size; .old { span.idiff { background-color: #F99; @@ -64,8 +64,8 @@ margin: 0px; padding: 0px; td { - line-height: 18px; - font-size: 12px; + line-height: $code_line_height; + font-size: $code_font_size; } } -- cgit v1.2.1 From aac36b120ef86469feb05ae5db39205493f851ed Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 19:28:11 -0800 Subject: Fix app title when browse blob --- app/helpers/projects_helper.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app') diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 9d2c99356af..db4bb303d0f 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -189,6 +189,8 @@ module ProjectsHelper elsif current_controller?(:blob) if current_action?(:new) || current_action?(:create) "New file at #{@ref}" + elsif current_action?(:show) + "#{@blob.path} at #{@ref}" elsif @blob "Edit file #{@blob.path} at #{@ref}" end -- cgit v1.2.1 From a3d879d427c1236d26832dcd0312b3e0d6158bbe Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 20:57:42 -0800 Subject: Refactor web editor --- app/assets/javascripts/blob.js.coffee | 73 ------------------------- app/assets/javascripts/blob/blob.js.coffee | 73 +++++++++++++++++++++++++ app/assets/javascripts/blob/edit_blob.js.coffee | 40 ++++++++++++++ app/assets/javascripts/blob/new_blob.js.coffee | 17 ++++++ app/assets/stylesheets/sections/editor.scss | 22 ++++++++ app/views/projects/_blob_editor.html.haml | 15 ----- app/views/projects/blob/_editor.html.haml | 25 +++++++++ app/views/projects/blob/edit.html.haml | 42 +------------- app/views/projects/blob/new.html.haml | 30 +--------- 9 files changed, 181 insertions(+), 156 deletions(-) delete mode 100644 app/assets/javascripts/blob.js.coffee create mode 100644 app/assets/javascripts/blob/blob.js.coffee create mode 100644 app/assets/javascripts/blob/edit_blob.js.coffee create mode 100644 app/assets/javascripts/blob/new_blob.js.coffee delete mode 100644 app/views/projects/_blob_editor.html.haml create mode 100644 app/views/projects/blob/_editor.html.haml (limited to 'app') diff --git a/app/assets/javascripts/blob.js.coffee b/app/assets/javascripts/blob.js.coffee deleted file mode 100644 index a5f15f80c5c..00000000000 --- a/app/assets/javascripts/blob.js.coffee +++ /dev/null @@ -1,73 +0,0 @@ -class @BlobView - constructor: -> - # handle multi-line select - handleMultiSelect = (e) -> - [ first_line, last_line ] = parseSelectedLines() - [ line_number ] = parseSelectedLines($(this).attr("id")) - hash = "L#{line_number}" - - if e.shiftKey and not isNaN(first_line) and not isNaN(line_number) - if line_number < first_line - last_line = first_line - first_line = line_number - else - last_line = line_number - - hash = if first_line == last_line then "L#{first_line}" else "L#{first_line}-#{last_line}" - - setHash(hash) - e.preventDefault() - - # See if there are lines selected - # "#L12" and "#L34-56" supported - highlightBlobLines = (e) -> - [ first_line, last_line ] = parseSelectedLines() - - unless isNaN first_line - $("#tree-content-holder .highlight .line").removeClass("hll") - $("#LC#{line}").addClass("hll") for line in [first_line..last_line] - $.scrollTo("#L#{first_line}") unless e? - - # parse selected lines from hash - # always return first and last line (initialized to NaN) - parseSelectedLines = (str) -> - first_line = NaN - last_line = NaN - hash = str || window.location.hash - - if hash isnt "" - matches = hash.match(/\#?L(\d+)(\-(\d+))?/) - first_line = parseInt(matches?[1]) - last_line = parseInt(matches?[3]) - last_line = first_line if isNaN(last_line) - - [ first_line, last_line ] - - setHash = (hash) -> - hash = hash.replace(/^\#/, "") - nodes = $("#" + hash) - # if any nodes are using this id, they must be temporarily changed - # also, add a temporary div at the top of the screen to prevent scrolling - if nodes.length > 0 - scroll_top = $(document).scrollTop() - nodes.attr("id", "") - tmp = $("
    ") - .css({ position: "absolute", visibility: "hidden", top: scroll_top + "px" }) - .attr("id", hash) - .appendTo(document.body) - - window.location.hash = hash - - # restore the nodes - if nodes.length > 0 - tmp.remove() - nodes.attr("id", hash) - - # initialize multi-line select - $("#tree-content-holder .line-numbers a[id^=L]").on("click", handleMultiSelect) - - # Highlight the correct lines on load - highlightBlobLines() - - # Highlight the correct lines when the hash part of the URL changes - $(window).on("hashchange", highlightBlobLines) diff --git a/app/assets/javascripts/blob/blob.js.coffee b/app/assets/javascripts/blob/blob.js.coffee new file mode 100644 index 00000000000..a5f15f80c5c --- /dev/null +++ b/app/assets/javascripts/blob/blob.js.coffee @@ -0,0 +1,73 @@ +class @BlobView + constructor: -> + # handle multi-line select + handleMultiSelect = (e) -> + [ first_line, last_line ] = parseSelectedLines() + [ line_number ] = parseSelectedLines($(this).attr("id")) + hash = "L#{line_number}" + + if e.shiftKey and not isNaN(first_line) and not isNaN(line_number) + if line_number < first_line + last_line = first_line + first_line = line_number + else + last_line = line_number + + hash = if first_line == last_line then "L#{first_line}" else "L#{first_line}-#{last_line}" + + setHash(hash) + e.preventDefault() + + # See if there are lines selected + # "#L12" and "#L34-56" supported + highlightBlobLines = (e) -> + [ first_line, last_line ] = parseSelectedLines() + + unless isNaN first_line + $("#tree-content-holder .highlight .line").removeClass("hll") + $("#LC#{line}").addClass("hll") for line in [first_line..last_line] + $.scrollTo("#L#{first_line}") unless e? + + # parse selected lines from hash + # always return first and last line (initialized to NaN) + parseSelectedLines = (str) -> + first_line = NaN + last_line = NaN + hash = str || window.location.hash + + if hash isnt "" + matches = hash.match(/\#?L(\d+)(\-(\d+))?/) + first_line = parseInt(matches?[1]) + last_line = parseInt(matches?[3]) + last_line = first_line if isNaN(last_line) + + [ first_line, last_line ] + + setHash = (hash) -> + hash = hash.replace(/^\#/, "") + nodes = $("#" + hash) + # if any nodes are using this id, they must be temporarily changed + # also, add a temporary div at the top of the screen to prevent scrolling + if nodes.length > 0 + scroll_top = $(document).scrollTop() + nodes.attr("id", "") + tmp = $("
    ") + .css({ position: "absolute", visibility: "hidden", top: scroll_top + "px" }) + .attr("id", hash) + .appendTo(document.body) + + window.location.hash = hash + + # restore the nodes + if nodes.length > 0 + tmp.remove() + nodes.attr("id", hash) + + # initialize multi-line select + $("#tree-content-holder .line-numbers a[id^=L]").on("click", handleMultiSelect) + + # Highlight the correct lines on load + highlightBlobLines() + + # Highlight the correct lines when the hash part of the URL changes + $(window).on("hashchange", highlightBlobLines) diff --git a/app/assets/javascripts/blob/edit_blob.js.coffee b/app/assets/javascripts/blob/edit_blob.js.coffee new file mode 100644 index 00000000000..79433dab505 --- /dev/null +++ b/app/assets/javascripts/blob/edit_blob.js.coffee @@ -0,0 +1,40 @@ +class @EditBlob + constructor: (assets_path, mode)-> + ace.config.set "modePath", assets_path + '/ace' + ace.config.loadModule "ace/ext/searchbox" + if mode + ace_mode = mode + editor = ace.edit("editor") + editor.focus() + + if ace_mode + editor.getSession().setMode "ace/mode/" + ace_mode + + disableButtonIfEmptyField "#commit_message", ".js-commit-button" + $(".js-commit-button").click -> + $("#file-content").val editor.getValue() + $(".file-editor form").submit() + return + + editModePanes = $(".js-edit-mode-pane") + editModeLinks = $(".js-edit-mode a") + editModeLinks.click (event) -> + event.preventDefault() + currentLink = $(this) + paneId = currentLink.attr("href") + currentPane = editModePanes.filter(paneId) + editModeLinks.parent().removeClass "active hover" + currentLink.parent().addClass "active hover" + editModePanes.hide() + if paneId is "#preview" + currentPane.fadeIn 200 + $.post currentLink.data("preview-url"), + content: editor.getValue() + , (response) -> + currentPane.empty().append response + return + + else + currentPane.fadeIn 200 + editor.focus() + return diff --git a/app/assets/javascripts/blob/new_blob.js.coffee b/app/assets/javascripts/blob/new_blob.js.coffee new file mode 100644 index 00000000000..ed4b7c47936 --- /dev/null +++ b/app/assets/javascripts/blob/new_blob.js.coffee @@ -0,0 +1,17 @@ +class @NewBlob + constructor: (assets_path, mode)-> + ace.config.set "modePath", assets_path + '/ace' + ace.config.loadModule "ace/ext/searchbox" + if mode + ace_mode = mode + editor = ace.edit("editor") + editor.focus() + + if ace_mode + editor.getSession().setMode "ace/mode/" + ace_mode + + disableButtonIfEmptyField "#commit_message", ".js-commit-button" + $(".js-commit-button").click -> + $("#file-content").val editor.getValue() + $(".file-editor form").submit() + return diff --git a/app/assets/stylesheets/sections/editor.scss b/app/assets/stylesheets/sections/editor.scss index f62f46ee168..becd593331f 100644 --- a/app/assets/stylesheets/sections/editor.scss +++ b/app/assets/stylesheets/sections/editor.scss @@ -31,4 +31,26 @@ margin: 5px 8px 0 8px; } } + + .file-title { + @extend .monospace; + font-size: 14px; + } + + .editor-ref { + background: #fafafa; + padding: 18px 15px; + padding-left: 25px; + border-right: 1px solid #CCC; + display: inline-block; + margin: -10px -15px; + margin-right: 10px; + } + + .editor-file-name { + .new-file-name { + display: inline-block; + width: 200px; + } + } } diff --git a/app/views/projects/_blob_editor.html.haml b/app/views/projects/_blob_editor.html.haml deleted file mode 100644 index 1fb74b55c41..00000000000 --- a/app/views/projects/_blob_editor.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -.file-holder.file - .file-title - %i.icon-file - %span.file_name - %span.monospace.light #{ref} - - if local_assigns[:path] - = ': ' + local_assigns[:path] - .file-content.code - %pre.js-edit-mode-pane#editor - = params[:content] || local_assigns[:blob_data] - - if local_assigns[:path] - .js-edit-mode-pane#preview.hide - .center - %h2 - %i.icon-spinner.icon-spin diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml new file mode 100644 index 00000000000..a0d9ea57b1c --- /dev/null +++ b/app/views/projects/blob/_editor.html.haml @@ -0,0 +1,25 @@ +.file-holder.file + .file-title + .editor-ref + %i.fa.fa-code-fork + = ref + %span.editor-file-name + - if @path + %span.monospace + = @path + + - if current_action?(:new) || current_action?(:create) + \/ + = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", + required: true, class: 'form-control new-file-name' + .pull-right + = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' + + .file-content.code + %pre.js-edit-mode-pane#editor + = params[:content] || local_assigns[:blob_data] + - if local_assigns[:path] + .js-edit-mode-pane#preview.hide + .center + %h2 + %i.icon-spinner.icon-spin diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index 883845c03f5..c0734d9f476 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -11,7 +11,7 @@ = editing_preview_title(@blob.name) = form_tag(project_update_blob_path(@project, @id), method: :put, class: "form-horizontal") do - = render 'projects/blob_editor', ref: @ref, path: @path, blob_data: @blob.data + = render 'projects/blob/editor', ref: @ref, path: @path, blob_data: @blob.data = render 'shared/commit_message_container', params: params, placeholder: "Update #{@blob.name}" = hidden_field_tag 'last_commit', @last_commit @@ -21,42 +21,4 @@ cancel_path: @after_edit_path :javascript - ace.config.set("modePath", gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}/ace") - ace.config.loadModule("ace/ext/searchbox"); - var ace_mode = "#{@blob.language.try(:ace_mode)}"; - var editor = ace.edit("editor"); - if (ace_mode) { - editor.getSession().setMode('ace/mode/' + ace_mode); - } - - disableButtonIfEmptyField("#commit_message", ".js-commit-button"); - - $(".js-commit-button").click(function(){ - $("#file-content").val(editor.getValue()); - $(".file-editor form").submit(); - }); - - var editModePanes = $('.js-edit-mode-pane'), - editModeLinks = $('.js-edit-mode a'); - - editModeLinks.click(function(event) { - event.preventDefault(); - - var currentLink = $(this), - paneId = currentLink.attr('href'), - currentPane = editModePanes.filter(paneId); - - editModeLinks.parent().removeClass('active hover'); - currentLink.parent().addClass('active hover'); - editModePanes.hide(); - - if (paneId == '#preview') { - currentPane.fadeIn(200); - $.post(currentLink.data('preview-url'), { content: editor.getValue() }, function(response) { - currentPane.empty().append(response); - }) - } else { - currentPane.fadeIn(200); - editor.focus() - } - }) + new EditBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", "#{@blob.language.try(:ace_mode)}") diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 57e830d5c56..70f52332cc7 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -1,25 +1,7 @@ %h3.page-title New file -%hr .file-editor = form_tag(project_create_blob_path(@project, @id), method: :post, class: 'form-horizontal form-new-file') do - .form-group.commit_message-group - = label_tag 'file_name', class: 'control-label' do - File name - .col-sm-10 - .input-group - %span.input-group-addon - = @path[-1] == "/" ? @path : @path + "/" - = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", required: true, class: 'form-control' - %span.input-group-addon - on - %span= @ref - - .form-group.commit_message-group - = label_tag :encoding, class: "control-label" do - Encoding - .col-sm-10 - = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' - = render 'projects/blob_editor', ref: @ref + = render 'projects/blob/editor', ref: @ref = render 'shared/commit_message_container', params: params, placeholder: 'Add new file' = hidden_field_tag 'content', '', id: 'file-content' @@ -27,12 +9,4 @@ cancel_path: project_tree_path(@project, @id) :javascript - ace.config.set("modePath", gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}/ace-src-noconflict") - var editor = ace.edit("editor"); - - disableButtonIfAnyEmptyField($('.form-new-file'), '.form-control', '.btn-create') - - $(".js-commit-button").click(function(){ - $("#file-content").val(editor.getValue()); - $(".file-editor form").submit(); - }); + new NewBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", null) -- cgit v1.2.1 From 8ecf7d3207ca52d694f6d8ebd9bed96041c49a8c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 20:58:38 -0800 Subject: Improve web editor filename placeholder --- app/views/projects/blob/_editor.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index a0d9ea57b1c..96f188e4aa7 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -10,7 +10,7 @@ - if current_action?(:new) || current_action?(:create) \/ - = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", + = text_field_tag 'file_name', params[:file_name], placeholder: "File name", required: true, class: 'form-control new-file-name' .pull-right = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' -- cgit v1.2.1 From 33913f9b8fef1f8df45dc26239faf8fa4cffc982 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 Jan 2015 22:08:27 -0800 Subject: Make issue tracker service fields required. --- app/models/project.rb | 2 +- app/models/project_services/issue_tracker_service.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index de31f14b98e..43b61897a3c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -319,7 +319,7 @@ class Project < ActiveRecord::Base end def external_issues_trackers - services.select { |service| service.category == :issue_tracker } + services.select { |service| service.issue_tracker? } end def external_issue_tracker diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 7ff6e0f284d..fc7b2fe5acd 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -1,5 +1,7 @@ class IssueTrackerService < Service + validates :project_url, :issues_url, :new_issue_url, presence: true, if: :activated? + def category :issue_tracker end @@ -34,6 +36,8 @@ class IssueTrackerService < Service issues_url: issues_tracker['issues_url'], new_issue_url: issues_tracker['new_issue_url'] } + else + self.properties = {} end end end -- cgit v1.2.1 From 65e88f1e1aa247c9a89af82717aae791786ad276 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jan 2015 22:39:48 -0800 Subject: Fixed few tests and improved css style --- app/assets/javascripts/blob/edit_blob.js.coffee | 4 ++++ app/assets/javascripts/blob/new_blob.js.coffee | 4 ++++ app/assets/stylesheets/sections/editor.scss | 8 ++++---- app/views/projects/blob/edit.html.haml | 2 +- app/views/projects/blob/new.html.haml | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/blob/edit_blob.js.coffee b/app/assets/javascripts/blob/edit_blob.js.coffee index 79433dab505..6914ca759f6 100644 --- a/app/assets/javascripts/blob/edit_blob.js.coffee +++ b/app/assets/javascripts/blob/edit_blob.js.coffee @@ -6,6 +6,7 @@ class @EditBlob ace_mode = mode editor = ace.edit("editor") editor.focus() + @editor = editor if ace_mode editor.getSession().setMode "ace/mode/" + ace_mode @@ -38,3 +39,6 @@ class @EditBlob currentPane.fadeIn 200 editor.focus() return + + editor: -> + return @editor diff --git a/app/assets/javascripts/blob/new_blob.js.coffee b/app/assets/javascripts/blob/new_blob.js.coffee index ed4b7c47936..a6e27116b40 100644 --- a/app/assets/javascripts/blob/new_blob.js.coffee +++ b/app/assets/javascripts/blob/new_blob.js.coffee @@ -6,6 +6,7 @@ class @NewBlob ace_mode = mode editor = ace.edit("editor") editor.focus() + @editor = editor if ace_mode editor.getSession().setMode "ace/mode/" + ace_mode @@ -15,3 +16,6 @@ class @NewBlob $("#file-content").val editor.getValue() $(".file-editor form").submit() return + + editor: -> + return @editor diff --git a/app/assets/stylesheets/sections/editor.scss b/app/assets/stylesheets/sections/editor.scss index becd593331f..88aa256e56e 100644 --- a/app/assets/stylesheets/sections/editor.scss +++ b/app/assets/stylesheets/sections/editor.scss @@ -35,15 +35,15 @@ .file-title { @extend .monospace; font-size: 14px; + padding: 5px; } .editor-ref { - background: #fafafa; - padding: 18px 15px; - padding-left: 25px; + background: #f5f5f5; + padding: 11px 15px; border-right: 1px solid #CCC; display: inline-block; - margin: -10px -15px; + margin: -5px -5px; margin-right: 10px; } diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index c0734d9f476..b150b639888 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -21,4 +21,4 @@ cancel_path: @after_edit_path :javascript - new EditBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", "#{@blob.language.try(:ace_mode)}") + blob = new EditBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", "#{@blob.language.try(:ace_mode)}") diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 70f52332cc7..df6aedbe17d 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -9,4 +9,4 @@ cancel_path: project_tree_path(@project, @id) :javascript - new NewBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", null) + blob = new NewBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", null) -- cgit v1.2.1 From ededa98995208591c5792c0ece1a5ec0ef302127 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 Jan 2015 22:46:54 -0800 Subject: Shorter check in services controller. --- app/controllers/projects/services_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index c7cc38b9c67..09bccb4bf8f 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -17,7 +17,7 @@ class Projects::ServicesController < Projects::ApplicationController def update if @service.update_attributes(service_params) - if @service.activated? && @service.category == :issue_tracker + if @service.activated? && @service.issue_tracker? @project.update_attributes(issues_tracker: @service.to_param) end redirect_to edit_project_service_path(@project, @service.to_param), -- cgit v1.2.1 From 93bc2d5202e5802bd31419d05232b62355516a53 Mon Sep 17 00:00:00 2001 From: Boyan Tabakov Date: Thu, 21 Aug 2014 13:53:32 +0300 Subject: Added support for firing system hooks on group create/destroy and adding/removing users to group. Added tests and updated docs. Also adding 'user_id' field in the hooks for adding/removing user from team. --- app/models/group.rb | 15 +++++++++++++++ app/models/members/group_member.rb | 14 ++++++++++++-- app/services/system_hooks_service.rb | 23 +++++++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/group.rb b/app/models/group.rb index 733afa2fc07..e098dfb3cdf 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -25,6 +25,9 @@ class Group < Namespace mount_uploader :avatar, AttachmentUploader + after_create :post_create_hook + after_destroy :post_destroy_hook + def human_name name end @@ -74,6 +77,18 @@ class Group < Namespace projects.public_only.any? end + def post_create_hook + system_hook_service.execute_hooks_for(self, :create) + end + + def post_destroy_hook + system_hook_service.execute_hooks_for(self, :destroy) + end + + def system_hook_service + SystemHooksService.new + end + class << self def search(query) where("LOWER(namespaces.name) LIKE :query", query: "%#{query.downcase}%") diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb index b7f296b13fb..28d0b4483b4 100644 --- a/app/models/members/group_member.rb +++ b/app/models/members/group_member.rb @@ -27,8 +27,9 @@ class GroupMember < Member scope :with_group, ->(group) { where(source_id: group.id) } scope :with_user, ->(user) { where(user_id: user.id) } - after_create :notify_create + after_create :post_create_hook after_update :notify_update + after_destroy :post_destroy_hook def self.access_level_roles Gitlab::Access.options_with_owner @@ -42,8 +43,9 @@ class GroupMember < Member access_level end - def notify_create + def post_create_hook notification_service.new_group_member(self) + system_hook_service.execute_hooks_for(self, :create) end def notify_update @@ -52,6 +54,14 @@ class GroupMember < Member end end + def post_destroy_hook + system_hook_service.execute_hooks_for(self, :destroy) + end + + def system_hook_service + SystemHooksService.new + end + def notification_service NotificationService.new end diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb index 44e494525b3..46f6e91e808 100644 --- a/app/services/system_hooks_service.rb +++ b/app/services/system_hooks_service.rb @@ -60,6 +60,26 @@ class SystemHooksService access_level: model.human_access, project_visibility: Project.visibility_levels.key(model.project.visibility_level_field).downcase }) + when Group + owner = model.owner + + data.merge!( + name: model.name, + path: model.path, + group_id: model.id, + owner_name: owner.respond_to?(:name) ? owner.name : nil, + owner_email: owner.respond_to?(:email) ? owner.email : nil, + ) + when GroupMember + data.merge!( + group_name: model.group.name, + group_path: model.group.path, + group_id: model.group.id, + user_name: model.user.name, + user_email: model.user.email, + user_id: model.user.id, + group_access: model.human_access, + ) end end @@ -68,6 +88,9 @@ class SystemHooksService when ProjectMember return "user_add_to_team" if event == :create return "user_remove_from_team" if event == :destroy + when GroupMember + return 'user_add_to_group' if event == :create + return 'user_remove_from_group' if event == :destroy else "#{model.class.name.downcase}_#{event.to_s}" end -- cgit v1.2.1 From 233f9f0766f4316661f9464698d971069ea30e37 Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Tue, 27 Jan 2015 09:35:46 -0800 Subject: Prevent confusion between active users and 30 day users. --- app/views/admin/dashboard/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index dd95af426c4..32e0e4a6848 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -32,7 +32,7 @@ %span.light.pull-right = Milestone.count %p - Active users last 30 days + Users who signed in during last 30 days %span.light.pull-right = User.where("current_sign_in_at > ?", 30.days.ago).count .col-md-4 -- cgit v1.2.1 From 6182f1cabf08e75b01146198cbd09fdea0bfdb67 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 27 Jan 2015 09:48:42 -0800 Subject: Use larger avatar on application header --- app/assets/stylesheets/sections/header.scss | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index 047617e54ba..e255cbcada8 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -138,9 +138,10 @@ header { top: -1px; padding-right: 0px !important; img { - width: 26px; - height: 26px; - @include border-radius($avatar_radius); + width: 50px; + height: 50px; + margin: -15px; + margin-left: 5px; } } -- cgit v1.2.1 From 2fa36ddd9c9efcc4f0d40755f535867573a0483c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 27 Jan 2015 11:32:28 -0800 Subject: Replace p with h4 for empty repo text --- app/views/projects/empty.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 776a7327bc2..36628195b4e 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -6,7 +6,7 @@ .center.well %h3 The repository for this project is empty - %p.lead + %h4 You can = link_to project_new_blob_path(@project, 'master'), class: 'btn btn-new btn-lg' do add a file -- cgit v1.2.1 From 95db00c3e9b7658b1a2a38f62006371988eabe5c Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 27 Jan 2015 12:19:32 -0800 Subject: Still need the javascript on the project edit page. --- app/assets/javascripts/dispatcher.js.coffee | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index acce4ad5096..1643ca941ff 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -100,6 +100,7 @@ class Dispatcher switch path[1] when 'edit' shortcut_handler = new ShortcutsNavigation() + new ProjectNew() when 'new' new ProjectNew() when 'show' -- cgit v1.2.1 From b35f1d1c2f8741e777a670e06785b6ff47e7e764 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 27 Jan 2015 12:45:31 -0800 Subject: Increase font size for issue/mr titles --- app/assets/stylesheets/sections/issues.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index fbfd9c8cd9b..7a9d3334d96 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -163,8 +163,9 @@ form.edit-issue { } } -.issue-title { +h3.issue-title { margin-top: 0; + font-size: 2em; } .context .select2-container { -- cgit v1.2.1 From 35d6d1ce4669d1f3850862f3c144abaaf5b841d3 Mon Sep 17 00:00:00 2001 From: Visay Keo Date: Mon, 26 Jan 2015 12:12:16 +0700 Subject: Fix broadcast message to show up properly with new UI With the new UI, the broadcast message is the first level child element of the body tag and then render full width without respecting the width of the left sidebar. This makes the message goes under the left sidebar in smaller screen. This commit fixes the issue by moving the message element into the "page-with-sidebar" div so it will always render together with the main content area with same look as before. The rendering for the search, login and other view without left sidebar remains untouched. Releases: master, 7-7-stable Fixes: #1019 --- app/views/layouts/_page.html.haml | 1 + app/views/layouts/admin.html.haml | 1 - app/views/layouts/application.html.haml | 1 - app/views/layouts/group.html.haml | 1 - app/views/layouts/profile.html.haml | 1 - app/views/layouts/project_settings.html.haml | 1 - app/views/layouts/projects.html.haml | 1 - app/views/layouts/public_group.html.haml | 1 - app/views/layouts/public_projects.html.haml | 1 - app/views/layouts/public_users.html.haml | 1 - 10 files changed, 1 insertion(+), 9 deletions(-) (limited to 'app') diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 621365fa6aa..1263f44eca9 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,5 +1,6 @@ - if defined?(sidebar) .page-with-sidebar + = render "layouts/broadcast" .sidebar-wrapper = render(sidebar) .content-wrapper diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index fb62d5fea0a..dc8652cb145 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -2,6 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: "Admin area" %body{class: "#{app_theme} #{theme_type} admin", :'data-page' => body_data_page} - = render "layouts/broadcast" = render "layouts/head_panel", title: "Admin area" = render 'layouts/page', sidebar: 'layouts/nav/admin' diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index d40c9753b10..e5420a13605 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -2,6 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: "Dashboard" %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page } - = render "layouts/broadcast" = render "layouts/head_panel", title: "Dashboard" = render 'layouts/page', sidebar: 'layouts/nav/dashboard' diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index 72b0d03908d..98edcf3a140 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -2,6 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: group_head_title %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} - = render "layouts/broadcast" = render "layouts/head_panel", title: @group.name = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 941084cc4ad..89d816061e2 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -2,6 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: "Profile" %body{class: "#{app_theme} #{theme_type} profile", :'data-page' => body_data_page} - = render "layouts/broadcast" = render "layouts/head_panel", title: "Profile" = render 'layouts/page', sidebar: 'layouts/nav/profile' diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index 0f20bf38bfd..d2c9c2a991c 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -2,7 +2,6 @@ %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace %body{class: "#{app_theme} #{theme_type} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } - = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" - @project_settings_nav = true diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml index d4ee53db55c..c44a40c9c12 100644 --- a/app/views/layouts/projects.html.haml +++ b/app/views/layouts/projects.html.haml @@ -2,7 +2,6 @@ %html{ lang: "en"} = render "layouts/head", title: project_head_title %body{class: "#{app_theme} #{theme_type} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } - = render "layouts/broadcast" = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_group.html.haml b/app/views/layouts/public_group.html.haml index 64794104ac5..ae3d2bd8a89 100644 --- a/app/views/layouts/public_group.html.haml +++ b/app/views/layouts/public_group.html.haml @@ -2,6 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: group_head_title %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} - = render "layouts/broadcast" = render "layouts/public_head_panel", title: "group: #{@group.name}" = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/public_projects.html.haml b/app/views/layouts/public_projects.html.haml index 5964a29d522..027e9a53139 100644 --- a/app/views/layouts/public_projects.html.haml +++ b/app/views/layouts/public_projects.html.haml @@ -2,6 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} - = render "layouts/broadcast" = render "layouts/public_head_panel", title: project_title(@project) = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_users.html.haml b/app/views/layouts/public_users.html.haml index 0510ce34a7f..37767df33d2 100644 --- a/app/views/layouts/public_users.html.haml +++ b/app/views/layouts/public_users.html.haml @@ -2,6 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: @title %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} - = render "layouts/broadcast" = render "layouts/public_head_panel", title: @title = render 'layouts/page' -- cgit v1.2.1 From 50297f7134e878fba84168785ae461d14e08c572 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 27 Jan 2015 22:51:11 -0800 Subject: Fix gravatar size for head panel icon --- app/views/layouts/_head_panel.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index bdf27562c26..77bfe4f996e 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -43,6 +43,6 @@ %i.fa.fa-sign-out %li.hidden-xs = link_to current_user, class: "profile-pic", id: 'profile-pic' do - = image_tag avatar_icon(current_user.email, 26), alt: 'User activity' + = image_tag avatar_icon(current_user.email, 60), alt: 'User activity' = render 'shared/outdated_browser' -- cgit v1.2.1 From 8eb365c0a04b912d2e10eb16adeeb4216563be2c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 27 Jan 2015 22:54:46 -0800 Subject: Separate admin settings from other links --- app/views/layouts/nav/_admin.html.haml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 66770adb5a5..4813a4f16f5 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -40,14 +40,15 @@ %span Background Jobs - = nav_link(controller: :application_settings) do - = link_to admin_application_settings_path, title: 'Settings' do - %i.fa.fa-cogs - %span - Settings - = nav_link(controller: :applications) do = link_to admin_applications_path, title: 'Applications' do %i.fa.fa-cloud %span Applications + + = nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do + = link_to admin_application_settings_path, title: 'Settings' do + %i.fa.fa-cogs + %span + Settings + -- cgit v1.2.1 From 8633bbc9b852d8809f20db86a3cdfa2cd3b8dd95 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 02:41:36 -0500 Subject: Add `icon` helper method --- app/helpers/icons_helper.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb index aaa8f8d0077..61c03d90072 100644 --- a/app/helpers/icons_helper.rb +++ b/app/helpers/icons_helper.rb @@ -1,21 +1,30 @@ module IconsHelper + # Creates an icon tag given icon name(s) and possible icon modifiers. + # + # Right now this method simply delegates directly to `fa_icon` from the + # font-awesome-rails gem, but should we ever use a different icon pack in the + # future we won't have to change hundreds of method calls. + def icon(names, options = {}) + fa_icon(names, options) + end + def boolean_to_icon(value) if value.to_s == "true" - content_tag :i, nil, class: 'fa fa-circle cgreen' + icon('circle', class: 'cgreen') else - content_tag :i, nil, class: 'fa fa-power-off clgray' + icon('power-off', class: 'clgray') end end def public_icon - content_tag :i, nil, class: 'fa fa-globe' + icon('globe') end def internal_icon - content_tag :i, nil, class: 'fa fa-shield' + icon('shield') end def private_icon - content_tag :i, nil, class: 'fa fa-lock' + icon('lock') end end -- cgit v1.2.1 From fe831dcd6f4af535abba1a9dc350c4d8a0f809e9 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 03:30:27 -0500 Subject: Move `spinner` helper into IconsHelper Also updates it to use the new `icon` method. --- app/helpers/application_helper.rb | 9 --------- app/helpers/icons_helper.rb | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 104ae517a08..d00f1aac2d6 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -247,15 +247,6 @@ module ApplicationHelper Gitlab::MarkdownHelper.gitlab_markdown?(filename) end - def spinner(text = nil, visible = false) - css_class = 'loading' - css_class << ' hide' unless visible - - content_tag :div, class: css_class do - content_tag(:i, nil, class: 'fa fa-spinner fa-spin') + text - end - end - def link_to(name = nil, options = nil, html_options = nil, &block) begin uri = URI(options) diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb index 61c03d90072..18260f0ed4d 100644 --- a/app/helpers/icons_helper.rb +++ b/app/helpers/icons_helper.rb @@ -8,6 +8,15 @@ module IconsHelper fa_icon(names, options) end + def spinner(text = nil, visible = false) + css_class = 'loading' + css_class << ' hide' unless visible + + content_tag :div, class: css_class do + icon('spinner spin') + text + end + end + def boolean_to_icon(value) if value.to_s == "true" icon('circle', class: 'cgreen') -- cgit v1.2.1 From 4e7a4cd95696746bcab78a4f9ec071dd4089397a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 03:32:48 -0500 Subject: Use `icon` helper method in helper modules --- app/helpers/commits_helper.rb | 6 ++---- app/helpers/events_helper.rb | 11 +++++------ app/helpers/issues_helper.rb | 2 +- app/helpers/notes_helper.rb | 6 +++--- app/helpers/notifications_helper.rb | 8 ++++---- app/helpers/projects_helper.rb | 4 ++-- app/helpers/tree_helper.rb | 9 ++------- 7 files changed, 19 insertions(+), 27 deletions(-) (limited to 'app') diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 2a3e51ada50..1a322ac048f 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -65,8 +65,7 @@ module CommitsHelper branches.sort.map do |branch| link_to(project_tree_path(project, branch)) do content_tag :span, class: 'label label-gray' do - content_tag(:i, nil, class: 'fa fa-code-fork') + ' ' + - branch + icon('code-fork') + ' ' + branch end end end.join(" ").html_safe @@ -78,8 +77,7 @@ module CommitsHelper sorted.map do |tag| link_to(project_commits_path(project, project.repository.find_tag(tag).name)) do content_tag :span, class: 'label label-gray' do - content_tag(:i, nil, class: 'fa fa-tag') + ' ' + - tag + icon('tag') + ' ' + tag end end end.join(" ").html_safe diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 903a5009616..d05f6df5f9f 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -27,18 +27,17 @@ module EventsHelper content_tag :li, class: "filter_icon #{active}" do link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do - content_tag(:i, nil, class: icon_for_event[key]) + - content_tag(:span, ' ' + tooltip) + icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) end end end def icon_for_event { - EventFilter.push => 'fa fa-upload', - EventFilter.merged => 'fa fa-check-square-o', - EventFilter.comments => 'fa fa-comments', - EventFilter.team => 'fa fa-user', + EventFilter.push => 'upload', + EventFilter.merged => 'check-square-o', + EventFilter.comments => 'comments', + EventFilter.team => 'user', } end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 2bf430f9142..5fcc825acca 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -62,7 +62,7 @@ module IssuesHelper ts << capture_haml do haml_tag :span do haml_concat '·' - haml_concat ' ' + haml_concat icon('edit', title: 'edited') haml_concat time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_edited_ago') end end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 8f493f5d331..d41d5617396 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -22,7 +22,7 @@ module NotesHelper ts << capture_haml do haml_tag :span do haml_concat '·' - haml_concat ' ' + haml_concat icon('edit', title: 'edited') haml_concat time_ago_with_tooltip(note.updated_at, 'bottom', 'note_edited_ago') end end @@ -57,7 +57,7 @@ module NotesHelper button_tag(class: 'btn add-diff-note js-add-diff-note-button', data: data, title: 'Add a comment to this line') do - content_tag :i, nil, class: 'fa fa-comment-o' + icon('comment-o') end end @@ -74,7 +74,7 @@ module NotesHelper button_tag class: 'btn reply-btn js-discussion-reply-button', data: data, title: 'Add a reply' do - link_text = content_tag(:i, nil, class: 'fa fa-comment') + link_text = icon('comment') link_text << ' Reply' end end diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index bad380e98a8..f771fe761ef 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -1,13 +1,13 @@ module NotificationsHelper def notification_icon(notification) if notification.disabled? - content_tag :i, nil, class: 'fa fa-volume-off ns-mute' + icon('volume-off', class: 'ns-mute') elsif notification.participating? - content_tag :i, nil, class: 'fa fa-volume-down ns-part' + icon('volume-down', class: 'ns-part') elsif notification.watch? - content_tag :i, nil, class: 'fa fa-volume-up ns-watch' + icon('volume-up', class: 'ns-watch') else - content_tag :i, nil, class: 'fa fa-circle-o ns-default' + icon('circle-o', class: 'ns-default') end end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 351641e19af..0b01be79623 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -83,7 +83,7 @@ module ProjectsHelper ' Star' end - content_tag('i', ' ', class: 'fa fa-star') + toggle_text + icon('star') + toggle_text end count_html = content_tag('span', class: 'count') do @@ -107,7 +107,7 @@ module ProjectsHelper end def link_to_toggle_fork - out = content_tag(:i, '', class: 'fa fa-code-fork') + out = icon('code-fork') out << ' Fork' out << content_tag(:span, class: 'count') do @project.forks_count.to_s diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index 727ec3fb231..b6fb7a8aa5a 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -38,13 +38,8 @@ module TreeHelper # # type - String type of the tree item; either 'folder' or 'file' def tree_icon(type) - icon_class = if type == 'folder' - 'fa fa-folder' - else - 'fa fa-file-o' - end - - content_tag :i, nil, class: icon_class + icon_class = type == 'folder' ? 'folder' : 'file-o' + icon(icon_class) end def tree_hex_class(content) -- cgit v1.2.1 From 537cd66d7e4237f0df6db88b3225327c8e4140c5 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 28 Jan 2015 09:28:17 -0800 Subject: Add gitlab internal issue tracker service. --- app/controllers/application_controller.rb | 2 +- app/controllers/projects/services_controller.rb | 5 +---- app/models/project.rb | 24 ++++++++++++++++------ .../gitlab_issue_tracker_service.rb | 13 ++++++++++++ .../project_services/issue_tracker_service.rb | 4 ++++ 5 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 app/models/project_services/gitlab_issue_tracker_service.rb (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ad13a0ac3e4..36e13706768 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -181,7 +181,7 @@ class ApplicationController < ActionController::Base end def add_gon_variables - gon.default_issues_tracker = Project.issues_tracker.default_value + gon.default_issues_tracker = Project.new.default_issue_tracker.to_param gon.api_version = API::API.version gon.relative_url_root = Gitlab.config.gitlab.relative_url_root gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 09bccb4bf8f..5dda869a154 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -9,7 +9,7 @@ class Projects::ServicesController < Projects::ApplicationController def index @project.build_missing_services - @services = @project.services.reload + @services = @project.services.where.not(type: 'GitlabIssueTrackerService').reload end def edit @@ -17,9 +17,6 @@ class Projects::ServicesController < Projects::ApplicationController def update if @service.update_attributes(service_params) - if @service.activated? && @service.issue_tracker? - @project.update_attributes(issues_tracker: @service.to_param) - end redirect_to edit_project_service_path(@project, @service.to_param), notice: 'Successfully updated.' else diff --git a/app/models/project.rb b/app/models/project.rb index 12751bb77e6..9e31c019fd3 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -77,6 +77,7 @@ class Project < ActiveRecord::Base has_one :jira_service, dependent: :destroy has_one :redmine_service, dependent: :destroy has_one :custom_issue_tracker_service, dependent: :destroy + has_one :gitlab_issue_tracker_service, dependent: :destroy has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" @@ -149,8 +150,6 @@ class Project < ActiveRecord::Base scope :public_and_internal_only, -> { where(visibility_level: Project.public_and_internal_levels) } scope :non_archived, -> { where(archived: false) } - enumerize :issues_tracker, in: (Service.issue_tracker_service_list).append(:gitlab), default: :gitlab - state_machine :import_status, initial: :none do event :import_start do transition [:none, :finished] => :started @@ -317,19 +316,32 @@ class Project < ActiveRecord::Base end end + def default_issue_tracker + unless gitlab_issue_tracker_service + create_gitlab_issue_tracker_service + end + + gitlab_issue_tracker_service + end + + def issues_tracker + if external_issue_tracker + external_issue_tracker + else + default_issue_tracker + end + end + def default_issues_tracker? if external_issue_tracker false else - unless self.issues_tracker == Project.issues_tracker.default_value - self.update_attributes(issues_tracker: Project.issues_tracker.default_value) - end true end end def external_issues_trackers - services.select { |service| service.issue_tracker? } + services.select(&:issue_tracker?).reject(&:default?) end def external_issue_tracker diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb new file mode 100644 index 00000000000..46649a74751 --- /dev/null +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -0,0 +1,13 @@ +class GitlabIssueTrackerService < IssueTrackerService + + prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + + + def default? + true + end + + def to_param + 'gitlab' + end +end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index fc7b2fe5acd..810ecbe46fc 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -6,6 +6,10 @@ class IssueTrackerService < Service :issue_tracker end + def default? + false + end + def project_url # implement inside child end -- cgit v1.2.1 From 965cec68accf9e9c2137e433ab00283f2ae6987f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 28 Jan 2015 10:53:28 -0800 Subject: Project/Group access dropdown should contain link to permissions help page --- app/views/groups/_new_group_member.html.haml | 6 +++++- app/views/projects/team_members/_form.html.haml | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/groups/_new_group_member.html.haml b/app/views/groups/_new_group_member.html.haml index e590ddbf931..ed00153de7e 100644 --- a/app/views/groups/_new_group_member.html.haml +++ b/app/views/groups/_new_group_member.html.haml @@ -5,7 +5,11 @@ .form-group = f.label :access_level, "Group Access", class: 'control-label' - .col-sm-10= select_tag :access_level, options_for_select(GroupMember.access_level_roles, @users_group.access_level), class: "project-access-select select2" + .col-sm-10 + = select_tag :access_level, options_for_select(GroupMember.access_level_roles, @users_group.access_level), class: "project-access-select select2" + .help-block + Read more about role permissions + %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" .form-actions = f.submit 'Add users into group', class: "btn btn-create" diff --git a/app/views/projects/team_members/_form.html.haml b/app/views/projects/team_members/_form.html.haml index 2bf61fa12bb..ddf8cb76f78 100644 --- a/app/views/projects/team_members/_form.html.haml +++ b/app/views/projects/team_members/_form.html.haml @@ -17,7 +17,12 @@ %p 2. Set access level for them .form-group = f.label :access_level, "Project Access", class: 'control-label' - .col-sm-10= select_tag :access_level, options_for_select(Gitlab::Access.options, @user_project_relation.access_level), class: "project-access-select select2" + .col-sm-10 + = select_tag :access_level, options_for_select(Gitlab::Access.options, @user_project_relation.access_level), class: "project-access-select select2" + .help-block + Read more about role permissions + %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" + .form-actions = f.submit 'Add users', class: "btn btn-create" -- cgit v1.2.1 From b40809d73135ada0e82c826f96e6cb1dd6fbaa7c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 28 Jan 2015 11:25:13 -0800 Subject: Improve UX for widget if merge request can not be merged --- app/assets/stylesheets/sections/merge_requests.scss | 1 + app/views/projects/merge_requests/show/_mr_accept.html.haml | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 8bd32f41e2c..0e27c389387 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -122,6 +122,7 @@ background: $box_bg; margin-bottom: 20px; color: #666; + border: 1px solid #EEE; @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.09)); .ci_widget { diff --git a/app/views/projects/merge_requests/show/_mr_accept.html.haml b/app/views/projects/merge_requests/show/_mr_accept.html.haml index 11a111e5faa..f8ee6973637 100644 --- a/app/views/projects/merge_requests/show/_mr_accept.html.haml +++ b/app/views/projects/merge_requests/show/_mr_accept.html.haml @@ -45,10 +45,17 @@ .automerge_widget.cannot_be_merged.hide %h4 This request can't be merged with GitLab. - %p You should do it manually with %strong - = link_to "command line", "#modal_merge_info", class: "how_to_merge_link", title: "How To Merge", "data-toggle" => "modal" + = link_to "#modal_merge_info", class: "underlined-link how_to_merge_link", title: "How To Merge", "data-toggle" => "modal" do + command line + + %p + %button.btn.disabled + %i.fa.fa-warning + Accept Merge Request +   + This usually happens when git can not resolve conflicts between branches automatically. .automerge_widget.unchecked %p -- cgit v1.2.1 From c6c7552e41cba12ca84238bd466d522aa1712220 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 28 Jan 2015 13:19:32 -0800 Subject: Build the urls inside of the service. --- app/helpers/issues_helper.rb | 19 +++---------------- .../project_services/gitlab_issue_tracker_service.rb | 14 +++++++++++++- app/models/project_services/issue_tracker_service.rb | 4 ++++ 3 files changed, 20 insertions(+), 17 deletions(-) (limited to 'app') diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 2bf430f9142..9fe183e6e2f 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -16,32 +16,19 @@ module IssuesHelper def url_for_project_issues(project = @project) return '' if project.nil? - if project.default_issues_tracker? - project_issues_path(project) - else - project.external_issue_tracker.project_url - end + project.issues_tracker.project_url end def url_for_new_issue(project = @project) return '' if project.nil? - if project.default_issues_tracker? - url = new_project_issue_path project_id: project - else - project.external_issue_tracker.new_issue_url - end + project.issues_tracker.new_issue_url end def url_for_issue(issue_iid, project = @project) return '' if project.nil? - if project.default_issues_tracker? - url = project_issue_url project_id: project, id: issue_iid - else - url = project.external_issue_tracker.issues_url - url.gsub(':id', issue_iid.to_s) - end + project.issues_tracker.issue_url(issue_iid) end def title_for_issue(issue_iid, project = @project) diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 46649a74751..8e548a6d636 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -1,5 +1,5 @@ class GitlabIssueTrackerService < IssueTrackerService - + include Rails.application.routes.url_helpers prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url @@ -10,4 +10,16 @@ class GitlabIssueTrackerService < IssueTrackerService def to_param 'gitlab' end + + def project_url + project_issues_path(project) + end + + def new_issue_url + new_project_issue_path project_id: project + end + + def issue_url(iid) + "#{Gitlab.config.gitlab.url}#{project_issue_path project_id: project, id: iid}" + end end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 810ecbe46fc..632f053d17b 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -22,6 +22,10 @@ class IssueTrackerService < Service # implement inside child end + def issue_url(iid) + self.issues_url.gsub(':id', iid.to_s) + end + def fields [ { type: 'text', name: 'description', placeholder: description }, -- cgit v1.2.1 From 34b7472b33986db8894939b59116784f706d4759 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 28 Jan 2015 14:20:00 -0800 Subject: Improve wording for fork project page --- app/views/projects/forks/new.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index 54f2cef023b..13f3a4b2e85 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -1,5 +1,6 @@ %h3.page-title Fork project -%p.lead Select namespace where to fork this project +%p.lead + Click on icon with user or group to fork project there %hr .fork-namespaces -- cgit v1.2.1 From 68f7302474768351abf12767c7741823f56f35cd Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 28 Jan 2015 14:25:55 -0800 Subject: Add a scope for visible services, code styling changes for easier readability. --- app/controllers/projects/services_controller.rb | 2 +- app/models/project.rb | 6 +----- app/models/project_services/gitlab_issue_tracker_service.rb | 2 +- app/models/service.rb | 2 ++ 4 files changed, 5 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 5dda869a154..5b35cc90413 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -9,7 +9,7 @@ class Projects::ServicesController < Projects::ApplicationController def index @project.build_missing_services - @services = @project.services.where.not(type: 'GitlabIssueTrackerService').reload + @services = @project.services.visible.reload end def edit diff --git a/app/models/project.rb b/app/models/project.rb index 9e31c019fd3..b26c697a7b7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -317,11 +317,7 @@ class Project < ActiveRecord::Base end def default_issue_tracker - unless gitlab_issue_tracker_service - create_gitlab_issue_tracker_service - end - - gitlab_issue_tracker_service + gitlab_issue_tracker_service ||= create_gitlab_issue_tracker_service end def issues_tracker diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 8e548a6d636..25f5f23bdf9 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -20,6 +20,6 @@ class GitlabIssueTrackerService < IssueTrackerService end def issue_url(iid) - "#{Gitlab.config.gitlab.url}#{project_issue_path project_id: project, id: iid}" + "#{Gitlab.config.gitlab.url}#{project_issue_path(project_id: project, id: iid)}" end end diff --git a/app/models/service.rb b/app/models/service.rb index 42419475349..15948e63e41 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -26,6 +26,8 @@ class Service < ActiveRecord::Base validates :project_id, presence: true + scope :visible, -> { where.not(type: 'GitlabIssueTrackerService') } + def activated? active end -- cgit v1.2.1 From f2f7b5a18e91005deda8ea36d95fd159568d93a4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 28 Jan 2015 15:37:20 -0800 Subject: Better wording --- app/views/projects/forks/new.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index 13f3a4b2e85..959d5f08d47 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -1,6 +1,6 @@ %h3.page-title Fork project %p.lead - Click on icon with user or group to fork project there + Click to fork the project to a user or group %hr .fork-namespaces -- cgit v1.2.1 From 792ced2f4190226c3335967a8e5a30d3b72bd4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Wed, 28 Jan 2015 22:18:22 +0100 Subject: Add a commit calendar to the user profile --- app/assets/javascripts/application.js.coffee | 1 + app/assets/javascripts/calendar.js.coffee | 71 +++++++++++++++++++++ app/assets/stylesheets/application.scss | 1 + app/assets/stylesheets/generic/calendar.scss | 95 ++++++++++++++++++++++++++++ app/controllers/users_controller.rb | 25 +++++++- app/models/repository.rb | 31 ++++++++- app/views/events/_event.html.haml | 3 +- app/views/users/_calendar.html.haml | 9 +++ app/views/users/_calendar_onclick.html.haml | 25 ++++++++ app/views/users/show.html.haml | 2 + 10 files changed, 256 insertions(+), 7 deletions(-) create mode 100644 app/assets/javascripts/calendar.js.coffee create mode 100644 app/assets/stylesheets/generic/calendar.scss create mode 100644 app/views/users/_calendar.html.haml create mode 100644 app/views/users/_calendar_onclick.html.haml (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 337170605dc..4912c534b0e 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -39,6 +39,7 @@ #= require shortcuts_dashboard_navigation #= require shortcuts_issueable #= require shortcuts_network +#= require cal-heatmap #= require_tree . window.slugify = (text) -> diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee new file mode 100644 index 00000000000..e3bb420a278 --- /dev/null +++ b/app/assets/javascripts/calendar.js.coffee @@ -0,0 +1,71 @@ +class @calendar + options = + month: "short" + day: "numeric" + year: "numeric" + + constructor: (timestamps,starting_year,starting_month,activities_path) -> + cal = new CalHeatMap() + cal.init + itemName: ["commit"] + data: timestamps + start: new Date(starting_year, starting_month) + domainLabelFormat: "%b" + id: "cal-heatmap" + domain: "month" + subDomain: "day" + range: 12 + tooltip: true + domainDynamicDimension: false + colLimit: 4 + label: + position: "top" + domainMargin: 1 + legend: [ + 0 + 1 + 4 + 7 + ] + legendCellPadding: 3 + onClick: (date, count) -> + $.ajax + url: activities_path + data: + date: date + + dataType: "json" + success: (data) -> + $("#loading_commits").fadeIn() + calendar.calendarOnClick data, date, count + setTimeout (-> + $("#calendar_onclick_placeholder").fadeIn 500 + return + ), 400 + setTimeout (-> + $("#loading_commits").hide() + return + ), 400 + return + return + return + + @calendarOnClick: (data, date, nb)-> + $("#calendar_onclick_placeholder").hide() + $("#calendar_onclick_placeholder").html -> + "" + + ((if nb is null then "no" else nb)) + + " commit" + + ((if (nb isnt 1) then "s" else "")) + " " + + date.toLocaleDateString("en-US", options) + + "
    " + $.each data, (key, data) -> + $.each data, (index, data) -> + $("#calendar_onclick_placeholder").append -> + "Pushed " + ((if data is null then "no" else data)) + " commit" + + ((if (data isnt 1) then "s" else "")) + + " to
    " + + index + "
    " + return + return + return diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 3cf08782c3c..8f63a7fee64 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -8,6 +8,7 @@ *= require select2 *= require_self *= require dropzone/basic + *= require cal-heatmap */ @import "main/*"; diff --git a/app/assets/stylesheets/generic/calendar.scss b/app/assets/stylesheets/generic/calendar.scss new file mode 100644 index 00000000000..9483b26164e --- /dev/null +++ b/app/assets/stylesheets/generic/calendar.scss @@ -0,0 +1,95 @@ +.calendar_onclick_placeholder { + padding: 0 0 2px 0; +} + +.calendar_commit_activity { + padding: 5px 0 0; +} + +.calendar_onclick_second { + font-size: 14px; + display: block; +} + +.calendar_onclick_hr { + padding: 0; + margin: 10px 0; +} + +.calendar_commit_date { + color: #999; +} + +.calendar_activity_summary { + font-size: 14px; +} + +/** +* This overwrites the default values of the cal-heatmap gem +*/ +.calendar { + .qi { + background-color: #999; + fill: #fff; + } + + .q1 { + background-color: #dae289; + fill: #ededed; + } + + .q2 { + background-color: #cedb9c; + fill: #ACD5F2; + } + + .q3 { + background-color: #b5cf6b; + fill: #7FA8D1; + } + + .q4 { + background-color: #637939; + fill: #49729B; + } + + .q5 { + background-color: #3b6427; + fill: #254E77; + } + + .domain-background { + fill: none; + shape-rendering: crispedges; + } + + .ch-tooltip { + position: absolute; + display: none; + margin-top: 22px; + margin-left: 1px; + font-size: 13px; + padding: 3px; + font-weight: 550; + background-color: #222; + span { + position: absolute; + width: 200px; + text-align: center; + visibility: hidden; + border-radius: 10px; + &:after { + content: ''; + position: absolute; + top: 100%; + left: 50%; + margin-left: -8px; + width: 0; + height: 0; + border-top: 8px solid #000000; + border-right: 8px solid transparent; + border-left: 8px solid transparent; + } + } + } +} diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 67af1801bda..a5e80f7e008 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,5 +1,5 @@ class UsersController < ApplicationController - skip_before_filter :authenticate_user!, only: [:show] + skip_before_filter :authenticate_user!, only: [:show, :activities] layout :determine_layout def show @@ -10,7 +10,8 @@ class UsersController < ApplicationController end # Projects user can view - authorized_projects_ids = ProjectsFinder.new.execute(current_user).pluck(:id) + visible_projects = ProjectsFinder.new.execute(current_user) + authorized_projects_ids = visible_projects.pluck(:id) @projects = @user.personal_projects. where(id: authorized_projects_ids) @@ -24,12 +25,32 @@ class UsersController < ApplicationController @title = @user.name + user_repositories = visible_projects.map(&:repository) + @timestamps = Gitlab::CommitsCalendar.create_timestamp(user_repositories, + @user, false) + @starting_year = Gitlab::CommitsCalendar.starting_year(@timestamps) + @starting_month = Gitlab::CommitsCalendar.starting_month(@timestamps) + @last_commit_date = Gitlab::CommitsCalendar.last_commit_date(@timestamps) + respond_to do |format| format.html format.atom { render layout: false } end end + def activities + user = User.find_by_username!(params[:username]) + # Projects user can view + visible_projects = ProjectsFinder.new.execute(current_user) + + user_repositories = visible_projects.map(&:repository) + user_activities = Gitlab::CommitsCalendar.create_timestamp(user_repositories, + user, true) + user_activities = Gitlab::CommitsCalendar.commit_activity_match( + user_activities, params[:date]) + render json: user_activities.to_json + end + def determine_layout if current_user 'navless' diff --git a/app/models/repository.rb b/app/models/repository.rb index e93c76790c7..e44ecca865c 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -139,21 +139,46 @@ class Repository def graph_log Rails.cache.fetch(cache_key(:graph_log)) do + + # handle empty repos that don't have a root_ref set yet + unless raw_repository.root_ref.present? + raw_repository.root_ref = 'refs/heads/master' + end + commits = raw_repository.log(limit: 6000, skip_merges: true, - ref: root_ref) + ref: raw_repository.root_ref) + commits.map do |rugged_commit| - commit = Gitlab::Git::Commit.new(rugged_commit) + commit = Gitlab::Git::Commit.new(rugged_commit) { author_name: commit.author_name.force_encoding('UTF-8'), author_email: commit.author_email.force_encoding('UTF-8'), additions: commit.stats.additions, - deletions: commit.stats.deletions + deletions: commit.stats.deletions, + date: commit.committed_date } end end end + def graph_logs_by_user_email(user) + graph_log.select { |u_email| u_email[:author_email] == user.email } + end + + def timestamps_by_user_from_graph_log(user) + graph_logs_by_user_email(user).map { |graph_log| graph_log[:date].to_time.to_i } + end + + def commits_log_of_user_by_date(user) + timestamps_by_user_from_graph_log(user). + group_by { |commit_date| commit_date }. + inject({}) do |hash, (timestamp_date, commits)| + hash[timestamp_date] = commits.count + hash + end + end + def cache_key(type) "#{type}:#{path_with_namespace}" end diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index 61383315373..c7976ba564f 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -11,5 +11,4 @@ - elsif event.note? = render "events/event/note", event: event - else - = render "events/event/common", event: event - + = render "events/event/common", event: event \ No newline at end of file diff --git a/app/views/users/_calendar.html.haml b/app/views/users/_calendar.html.haml new file mode 100644 index 00000000000..70d5cca854d --- /dev/null +++ b/app/views/users/_calendar.html.haml @@ -0,0 +1,9 @@ +#cal-heatmap.calendar + :javascript + new calendar( + #{@timestamps.to_json}, + #{@starting_year}, + #{@starting_month}, + '#{user_activities_path}' + ); += render "calendar_onclick" diff --git a/app/views/users/_calendar_onclick.html.haml b/app/views/users/_calendar_onclick.html.haml new file mode 100644 index 00000000000..1514b56bb23 --- /dev/null +++ b/app/views/users/_calendar_onclick.html.haml @@ -0,0 +1,25 @@ +#calendar_commit_activity.calendar_commit_activity + %h4.activity_title Commit Activity: + + #loading_commits + %section.text-center + %h3 + %i.icon-spinner.icon-spin + + #calendar_onclick_placeholder.calendar_onclick_placeholder + %span.calendar_onclick_second.calendar_onclick_second + - if @timestamps.empty? + %span.calendar_activity_summary + %strong> #{@user.username} +   has no activity + - else + %span.calendar_activity_summary + %strong> #{@user.username} + 's last commit was on + %span.commit_date #{@last_commit_date} + + %hr.calendar_onclick_hr + +:javascript + $("#loading_commits").hide(); + diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 54f2666ce5d..0d214d31607 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -18,6 +18,8 @@ %h4 Groups: = render 'groups', groups: @groups %hr + %h4 Calendar: + = render 'calendar' %h4 User Activity: -- cgit v1.2.1 From ef315dda5f6b252151feb320af0abdea12690df4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 28 Jan 2015 16:59:25 -0800 Subject: Add light border to bootstrap panels --- app/assets/stylesheets/gl_bootstrap.scss | 3 --- app/assets/stylesheets/main/mixins.scss | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/gl_bootstrap.scss b/app/assets/stylesheets/gl_bootstrap.scss index 2a68d922bb7..6efa56544a5 100644 --- a/app/assets/stylesheets/gl_bootstrap.scss +++ b/app/assets/stylesheets/gl_bootstrap.scss @@ -1,9 +1,6 @@ /* * Twitter bootstrap with GitLab customizations/additions * - * Some unused bootstrap compontents like panels are not included. - * Other components like tabs are modified to GitLab style. - * */ $font-size-base: 13px !default; diff --git a/app/assets/stylesheets/main/mixins.scss b/app/assets/stylesheets/main/mixins.scss index 8435d1dae79..e54482d14c3 100644 --- a/app/assets/stylesheets/main/mixins.scss +++ b/app/assets/stylesheets/main/mixins.scss @@ -139,7 +139,7 @@ } @mixin panel-colored { - border: none; + border: 1px solid #EEE; background: $box_bg; @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.09)); -- cgit v1.2.1 From c39f80bdb412bc9cc7646de0929efe8cb5b870d4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 28 Jan 2015 23:00:41 -0800 Subject: Refactor commit calendar a bit. Fixed dates --- app/assets/javascripts/calendar.js.coffee | 16 ++++++++-------- app/controllers/users_controller.rb | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee index e3bb420a278..c5465f92076 100644 --- a/app/assets/javascripts/calendar.js.coffee +++ b/app/assets/javascripts/calendar.js.coffee @@ -4,7 +4,7 @@ class @calendar day: "numeric" year: "numeric" - constructor: (timestamps,starting_year,starting_month,activities_path) -> + constructor: (timestamps, starting_year, starting_month, activities_path) -> cal = new CalHeatMap() cal.init itemName: ["commit"] @@ -46,7 +46,7 @@ class @calendar $("#loading_commits").hide() return ), 400 - return + return return return @@ -54,17 +54,17 @@ class @calendar $("#calendar_onclick_placeholder").hide() $("#calendar_onclick_placeholder").html -> "" + - ((if nb is null then "no" else nb)) + - " commit" + - ((if (nb isnt 1) then "s" else "")) + " " + - date.toLocaleDateString("en-US", options) + + ((if nb is null then "no" else nb)) + + " commit" + + ((if (nb isnt 1) then "s" else "")) + " " + + date.toLocaleDateString("en-US", options) + "
    " $.each data, (key, data) -> $.each data, (index, data) -> $("#calendar_onclick_placeholder").append -> "Pushed " + ((if data is null then "no" else data)) + " commit" + - ((if (data isnt 1) then "s" else "")) + - " to " + + ((if (data isnt 1) then "s" else "")) + + " to " + index + "
    " return return diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index a5e80f7e008..28de2707778 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -28,8 +28,8 @@ class UsersController < ApplicationController user_repositories = visible_projects.map(&:repository) @timestamps = Gitlab::CommitsCalendar.create_timestamp(user_repositories, @user, false) - @starting_year = Gitlab::CommitsCalendar.starting_year(@timestamps) - @starting_month = Gitlab::CommitsCalendar.starting_month(@timestamps) + @starting_year = (Time.now - 1.year).strftime("%Y") + @starting_month = Date.today.strftime("%m").to_i @last_commit_date = Gitlab::CommitsCalendar.last_commit_date(@timestamps) respond_to do |format| -- cgit v1.2.1 From a9288e554e55e843b95ab6f8109a4c610af64c83 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 00:53:43 -0800 Subject: Cleanup and make contribution calendar faster --- app/assets/javascripts/calendar.js.coffee | 42 +++-------------------------- app/controllers/users_controller.rb | 19 +++---------- app/models/repository.rb | 31 ++++++++++----------- app/views/users/_calendar.html.haml | 6 ++--- app/views/users/_calendar_onclick.html.haml | 25 ----------------- app/views/users/show.html.haml | 4 ++- 6 files changed, 25 insertions(+), 102 deletions(-) delete mode 100644 app/views/users/_calendar_onclick.html.haml (limited to 'app') diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee index c5465f92076..6a0d5e43567 100644 --- a/app/assets/javascripts/calendar.js.coffee +++ b/app/assets/javascripts/calendar.js.coffee @@ -4,11 +4,13 @@ class @calendar day: "numeric" year: "numeric" - constructor: (timestamps, starting_year, starting_month, activities_path) -> + constructor: (timestamps, starting_year, starting_month) -> cal = new CalHeatMap() cal.init itemName: ["commit"] data: timestamps + domain: "year" + subDomain: "month" start: new Date(starting_year, starting_month) domainLabelFormat: "%b" id: "cal-heatmap" @@ -29,43 +31,5 @@ class @calendar ] legendCellPadding: 3 onClick: (date, count) -> - $.ajax - url: activities_path - data: - date: date - - dataType: "json" - success: (data) -> - $("#loading_commits").fadeIn() - calendar.calendarOnClick data, date, count - setTimeout (-> - $("#calendar_onclick_placeholder").fadeIn 500 - return - ), 400 - setTimeout (-> - $("#loading_commits").hide() - return - ), 400 - return - return - return - - @calendarOnClick: (data, date, nb)-> - $("#calendar_onclick_placeholder").hide() - $("#calendar_onclick_placeholder").html -> - "" + - ((if nb is null then "no" else nb)) + - " commit" + - ((if (nb isnt 1) then "s" else "")) + " " + - date.toLocaleDateString("en-US", options) + - "
    " - $.each data, (key, data) -> - $.each data, (index, data) -> - $("#calendar_onclick_placeholder").append -> - "Pushed " + ((if data is null then "no" else data)) + " commit" + - ((if (data isnt 1) then "s" else "")) + - " to " + - index + "
    " return - return return diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 28de2707778..9e5ea6cfa45 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -25,12 +25,12 @@ class UsersController < ApplicationController @title = @user.name + # Get user repositories and collect timestamps for commits user_repositories = visible_projects.map(&:repository) - @timestamps = Gitlab::CommitsCalendar.create_timestamp(user_repositories, - @user, false) + calendar = Gitlab::CommitsCalendar.new(user_repositories, @user) + @timestamps = calendar.timestamps @starting_year = (Time.now - 1.year).strftime("%Y") @starting_month = Date.today.strftime("%m").to_i - @last_commit_date = Gitlab::CommitsCalendar.last_commit_date(@timestamps) respond_to do |format| format.html @@ -38,19 +38,6 @@ class UsersController < ApplicationController end end - def activities - user = User.find_by_username!(params[:username]) - # Projects user can view - visible_projects = ProjectsFinder.new.execute(current_user) - - user_repositories = visible_projects.map(&:repository) - user_activities = Gitlab::CommitsCalendar.create_timestamp(user_repositories, - user, true) - user_activities = Gitlab::CommitsCalendar.commit_activity_match( - user_activities, params[:date]) - render json: user_activities.to_json - end - def determine_layout if current_user 'navless' diff --git a/app/models/repository.rb b/app/models/repository.rb index e44ecca865c..f6400f7aff1 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -139,39 +139,36 @@ class Repository def graph_log Rails.cache.fetch(cache_key(:graph_log)) do - - # handle empty repos that don't have a root_ref set yet - unless raw_repository.root_ref.present? - raw_repository.root_ref = 'refs/heads/master' - end - - commits = raw_repository.log(limit: 6000, skip_merges: true, - ref: raw_repository.root_ref) + commits = raw_repository.log(limit: 6000, + skip_merges: true, + ref: root_ref) commits.map do |rugged_commit| - commit = Gitlab::Git::Commit.new(rugged_commit) + { author_name: commit.author_name.force_encoding('UTF-8'), author_email: commit.author_email.force_encoding('UTF-8'), additions: commit.stats.additions, deletions: commit.stats.deletions, - date: commit.committed_date } end end end - def graph_logs_by_user_email(user) - graph_log.select { |u_email| u_email[:author_email] == user.email } - end + def timestamps_by_user_log(user) + args = %W(git log --author=#{user.email} --since=#{(Date.today - 1.year).to_s} --pretty=format:%cd --date=short) + dates = Gitlab::Popen.popen(args, path_to_repo).first.split("\n") - def timestamps_by_user_from_graph_log(user) - graph_logs_by_user_email(user).map { |graph_log| graph_log[:date].to_time.to_i } + if dates.present? + dates + else + [] + end end - def commits_log_of_user_by_date(user) - timestamps_by_user_from_graph_log(user). + def commits_per_day_for_user(user) + timestamps_by_user_log(user). group_by { |commit_date| commit_date }. inject({}) do |hash, (timestamp_date, commits)| hash[timestamp_date] = commits.count diff --git a/app/views/users/_calendar.html.haml b/app/views/users/_calendar.html.haml index 70d5cca854d..b16a7305a32 100644 --- a/app/views/users/_calendar.html.haml +++ b/app/views/users/_calendar.html.haml @@ -1,9 +1,7 @@ #cal-heatmap.calendar - :javascript + :javascript new calendar( #{@timestamps.to_json}, #{@starting_year}, - #{@starting_month}, - '#{user_activities_path}' + #{@starting_month} ); -= render "calendar_onclick" diff --git a/app/views/users/_calendar_onclick.html.haml b/app/views/users/_calendar_onclick.html.haml deleted file mode 100644 index 1514b56bb23..00000000000 --- a/app/views/users/_calendar_onclick.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -#calendar_commit_activity.calendar_commit_activity - %h4.activity_title Commit Activity: - - #loading_commits - %section.text-center - %h3 - %i.icon-spinner.icon-spin - - #calendar_onclick_placeholder.calendar_onclick_placeholder - %span.calendar_onclick_second.calendar_onclick_second - - if @timestamps.empty? - %span.calendar_activity_summary - %strong> #{@user.username} -   has no activity - - else - %span.calendar_activity_summary - %strong> #{@user.username} - 's last commit was on - %span.commit_date #{@last_commit_date} - - %hr.calendar_onclick_hr - -:javascript - $("#loading_commits").hide(); - diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 0d214d31607..c248a280475 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -18,8 +18,10 @@ %h4 Groups: = render 'groups', groups: @groups %hr + %h4 Calendar: - = render 'calendar' + %div= render 'calendar' + %hr %h4 User Activity: -- cgit v1.2.1 From 1f0e16569f1924ed967bff9f4f78bbee874251db Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 01:20:17 -0800 Subject: Load contribution calendar via AJAX --- app/controllers/users_controller.rb | 31 ++++++++++++++++++++----------- app/views/users/_calendar.html.haml | 7 ------- app/views/users/calendar.html.haml | 8 ++++++++ app/views/users/show.html.haml | 10 ++++++++-- 4 files changed, 36 insertions(+), 20 deletions(-) delete mode 100644 app/views/users/_calendar.html.haml create mode 100644 app/views/users/calendar.html.haml (limited to 'app') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9e5ea6cfa45..8c96f67a2a4 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,14 +1,7 @@ class UsersController < ApplicationController - skip_before_filter :authenticate_user!, only: [:show, :activities] layout :determine_layout def show - @user = User.find_by_username!(params[:username]) - - unless current_user || @user.public_profile? - return authenticate_user! - end - # Projects user can view visible_projects = ProjectsFinder.new.execute(current_user) authorized_projects_ids = visible_projects.pluck(:id) @@ -25,6 +18,15 @@ class UsersController < ApplicationController @title = @user.name + respond_to do |format| + format.html + format.atom { render layout: false } + end + end + + def calendar + visible_projects = ProjectsFinder.new.execute(current_user) + # Get user repositories and collect timestamps for commits user_repositories = visible_projects.map(&:repository) calendar = Gitlab::CommitsCalendar.new(user_repositories, @user) @@ -32,10 +34,7 @@ class UsersController < ApplicationController @starting_year = (Time.now - 1.year).strftime("%Y") @starting_month = Date.today.strftime("%m").to_i - respond_to do |format| - format.html - format.atom { render layout: false } - end + render 'calendar', layout: false end def determine_layout @@ -45,4 +44,14 @@ class UsersController < ApplicationController 'public_users' end end + + private + + def authenticate_user! + @user = User.find_by_username!(params[:username]) + + unless current_user || @user.public_profile? + return authenticate_user! + end + end end diff --git a/app/views/users/_calendar.html.haml b/app/views/users/_calendar.html.haml deleted file mode 100644 index b16a7305a32..00000000000 --- a/app/views/users/_calendar.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -#cal-heatmap.calendar - :javascript - new calendar( - #{@timestamps.to_json}, - #{@starting_year}, - #{@starting_month} - ); diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml new file mode 100644 index 00000000000..727faf23679 --- /dev/null +++ b/app/views/users/calendar.html.haml @@ -0,0 +1,8 @@ +%h4 Calendar: +#cal-heatmap.calendar + :javascript + new calendar( + #{@timestamps.to_json}, + #{@starting_year}, + #{@starting_month} + ); diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index c248a280475..445f43cd500 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -19,8 +19,9 @@ = render 'groups', groups: @groups %hr - %h4 Calendar: - %div= render 'calendar' + .user-calendar + %h4.center.light + %i.fa.fa-spinner.fa-spin %hr %h4 User Activity: @@ -36,3 +37,8 @@ = render 'profile', user: @user - if @projects.present? = render 'projects', projects: @projects + + +:coffeescript + $ -> + $(".user-calendar").load("#{user_calendar_path}") -- cgit v1.2.1 From 4ce18089f6d3f242bb48fd6c72161144b38b6e29 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Thu, 29 Jan 2015 17:13:38 +0200 Subject: Remove text about hidden settings. --- app/views/projects/edit.html.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 31bdbb562a1..367bd8806db 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -3,8 +3,7 @@ .project-edit-content %div %h3.page-title - Project settings: - %p.light Some settings, such as "Transfer Project", are hidden inside the danger area below. + Project settings %hr .panel-body = form_for @project, remote: true, html: { multipart: true, class: "edit_project form-horizontal" }, authenticity_token: true do |f| -- cgit v1.2.1 From 08582f153249d91d361977d7968126a420739a8b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 08:55:57 -0800 Subject: Improve user calendar authentification and tests --- app/controllers/users_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8c96f67a2a4..ff5e31067fb 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,4 +1,6 @@ class UsersController < ApplicationController + skip_before_filter :authenticate_user! + before_filter :set_user layout :determine_layout def show @@ -47,7 +49,7 @@ class UsersController < ApplicationController private - def authenticate_user! + def set_user @user = User.find_by_username!(params[:username]) unless current_user || @user.public_profile? -- cgit v1.2.1 From 4eafc188437e0214c09d59083586ea871b625b14 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 23:08:28 -0500 Subject: Refactor Repository to use new RepositoryCache class Abstracts away the lower-level implementation details from the Repository model. --- app/models/repository.rb | 61 +++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 37 deletions(-) (limited to 'app') diff --git a/app/models/repository.rb b/app/models/repository.rb index f6400f7aff1..4e45a6723b8 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -30,7 +30,7 @@ class Repository commit = Gitlab::Git::Commit.find(raw_repository, id) commit = Commit.new(commit) if commit commit - rescue Rugged::OdbError => ex + rescue Rugged::OdbError nil end @@ -61,25 +61,25 @@ class Repository end def add_branch(branch_name, ref) - Rails.cache.delete(cache_key(:branch_names)) + cache.expire(:branch_names) gitlab_shell.add_branch(path_with_namespace, branch_name, ref) end def add_tag(tag_name, ref, message = nil) - Rails.cache.delete(cache_key(:tag_names)) + cache.expire(:tag_names) gitlab_shell.add_tag(path_with_namespace, tag_name, ref, message) end def rm_branch(branch_name) - Rails.cache.delete(cache_key(:branch_names)) + cache.expire(:branch_names) gitlab_shell.rm_branch(path_with_namespace, branch_name) end def rm_tag(tag_name) - Rails.cache.delete(cache_key(:tag_names)) + cache.expire(:tag_names) gitlab_shell.rm_tag(path_with_namespace, tag_name) end @@ -97,19 +97,15 @@ class Repository end def branch_names - Rails.cache.fetch(cache_key(:branch_names)) do - raw_repository.branch_names - end + cache.fetch(:branch_names) { raw_repository.branch_names } end def tag_names - Rails.cache.fetch(cache_key(:tag_names)) do - raw_repository.tag_names - end + cache.fetch(:tag_names) { raw_repository.tag_names } end def commit_count - Rails.cache.fetch(cache_key(:commit_count)) do + cache.fetch(:commit_count) do begin raw_repository.commit_count(self.root_ref) rescue @@ -121,26 +117,19 @@ class Repository # Return repo size in megabytes # Cached in redis def size - Rails.cache.fetch(cache_key(:size)) do - raw_repository.size - end + cache.fetch(:size) { raw_repository.size } end def expire_cache - Rails.cache.delete(cache_key(:size)) - Rails.cache.delete(cache_key(:branch_names)) - Rails.cache.delete(cache_key(:tag_names)) - Rails.cache.delete(cache_key(:commit_count)) - Rails.cache.delete(cache_key(:graph_log)) - Rails.cache.delete(cache_key(:readme)) - Rails.cache.delete(cache_key(:version)) - Rails.cache.delete(cache_key(:contribution_guide)) + %i(size branch_names tag_names commit_count graph_log + readme version contribution_guide).each do |key| + cache.expire(key) + end end def graph_log - Rails.cache.fetch(cache_key(:graph_log)) do - commits = raw_repository.log(limit: 6000, - skip_merges: true, + cache.fetch(:graph_log) do + commits = raw_repository.log(limit: 6000, skip_merges: true, ref: root_ref) commits.map do |rugged_commit| @@ -176,10 +165,6 @@ class Repository end end - def cache_key(type) - "#{type}:#{path_with_namespace}" - end - def method_missing(m, *args, &block) raw_repository.send(m, *args, &block) end @@ -199,13 +184,11 @@ class Repository end def readme - Rails.cache.fetch(cache_key(:readme)) do - tree(:head).readme - end + cache.fetch(:readme) { tree(:head).readme } end def version - Rails.cache.fetch(cache_key(:version)) do + cache.fetch(:version) do tree(:head).blobs.find do |file| file.name.downcase == 'version' end @@ -213,9 +196,7 @@ class Repository end def contribution_guide - Rails.cache.fetch(cache_key(:contribution_guide)) do - tree(:head).contribution_guide - end + cache.fetch(:contribution_guide) { tree(:head).contribution_guide } end def head_commit @@ -351,4 +332,10 @@ class Repository [] end end + + private + + def cache + @cache ||= RepositoryCache.new(path_with_namespace) + end end -- cgit v1.2.1 From 5ec36902dd41d1e6383373006ab16f2d1303ee0d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 16:00:46 -0800 Subject: Fix calendar js --- app/assets/javascripts/calendar.js.coffee | 2 -- 1 file changed, 2 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee index 6a0d5e43567..70940e13858 100644 --- a/app/assets/javascripts/calendar.js.coffee +++ b/app/assets/javascripts/calendar.js.coffee @@ -9,8 +9,6 @@ class @calendar cal.init itemName: ["commit"] data: timestamps - domain: "year" - subDomain: "month" start: new Date(starting_year, starting_month) domainLabelFormat: "%b" id: "cal-heatmap" -- cgit v1.2.1 From f1cf49218fb40b61f82ff74dbb7eaba32b439a5a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 17:07:44 -0800 Subject: Improve contribution calendar on user page * cache user contributions for day * ignore forks in calendar contribtuions --- app/controllers/users_controller.rb | 9 +++------ app/models/project_contributions.rb | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 app/models/project_contributions.rb (limited to 'app') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ff5e31067fb..57d8ef09faf 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -28,13 +28,10 @@ class UsersController < ApplicationController def calendar visible_projects = ProjectsFinder.new.execute(current_user) - - # Get user repositories and collect timestamps for commits - user_repositories = visible_projects.map(&:repository) - calendar = Gitlab::CommitsCalendar.new(user_repositories, @user) + calendar = Gitlab::CommitsCalendar.new(visible_projects, @user) @timestamps = calendar.timestamps - @starting_year = (Time.now - 1.year).strftime("%Y") - @starting_month = Date.today.strftime("%m").to_i + @starting_year = calendar.starting_year + @starting_month = calendar.starting_month render 'calendar', layout: false end diff --git a/app/models/project_contributions.rb b/app/models/project_contributions.rb new file mode 100644 index 00000000000..8ab2d814a94 --- /dev/null +++ b/app/models/project_contributions.rb @@ -0,0 +1,23 @@ +class ProjectContributions + attr_reader :project, :user + + def initialize(project, user) + @project, @user = project, user + end + + def commits_log + repository = project.repository + + if !repository.exists? || repository.empty? + return {} + end + + Rails.cache.fetch(cache_key) do + repository.commits_per_day_for_user(user) + end + end + + def cache_key + "#{Date.today.to_s}-commits-log-#{project.id}-#{user.email}" + end +end -- cgit v1.2.1 From 31245a40c10a556998a9923be21b9ac947232824 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 17:13:28 -0800 Subject: Remove : from headers --- app/views/users/calendar.html.haml | 2 +- app/views/users/show.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml index 727faf23679..13bdc5ed1e7 100644 --- a/app/views/users/calendar.html.haml +++ b/app/views/users/calendar.html.haml @@ -1,4 +1,4 @@ -%h4 Calendar: +%h4 Calendar #cal-heatmap.calendar :javascript new calendar( diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 445f43cd500..e47fed5513e 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -15,7 +15,7 @@ .clearfix - if @groups.any? - %h4 Groups: + %h4 Groups = render 'groups', groups: @groups %hr @@ -24,7 +24,7 @@ %i.fa.fa-spinner.fa-spin %hr %h4 - User Activity: + User Activity - if current_user %span.rss-icon.pull-right -- cgit v1.2.1 From 78d7c5087bafc316d298ac01745579990e3dd93c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 17:30:51 -0800 Subject: Use tile avatars for user/group show pages --- app/assets/stylesheets/generic/avatar.scss | 4 ++++ app/views/groups/show.html.haml | 2 +- app/views/users/show.html.haml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index b6886206739..b88cdd83937 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -15,6 +15,10 @@ &.s24 { margin-right: 4px; } } + &.avatar-tile { + @include border-radius(0px); + } + &.s16 { width: 16px; height: 16px; margin-right: 6px; } &.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; } diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 81f0e1dd2d8..484bebca2d8 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,6 +1,6 @@ .dashboard %div - = image_tag group_icon(@group.path), class: "avatar s90" + = image_tag group_icon(@group.path), class: "avatar avatar-tile s90" .clearfix %h2 = @group.name diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index e47fed5513e..b05918b019e 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -1,7 +1,7 @@ .row .col-md-8 %h3.page-title - = image_tag avatar_icon(@user.email, 90), class: "avatar s90", alt: '' + = image_tag avatar_icon(@user.email, 90), class: "avatar avatar-tile s90", alt: '' = @user.name - if @user == current_user .pull-right -- cgit v1.2.1 From 0fe1c9b64869703b8d803d56955422dceabf6e37 Mon Sep 17 00:00:00 2001 From: Tim Bishop Date: Fri, 30 Jan 2015 23:49:01 +0000 Subject: Fix group search to check path as well as name. The API documentation says: "You can search for groups by name or path with: /groups?search=Rails" But you can't because the search query only checks the name, not the path. This fixes that. --- app/models/group.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/group.rb b/app/models/group.rb index e098dfb3cdf..042b79a7850 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -91,7 +91,7 @@ class Group < Namespace class << self def search(query) - where("LOWER(namespaces.name) LIKE :query", query: "%#{query.downcase}%") + where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%") end def sort(method) -- cgit v1.2.1 From a54e9e5459cd45173b5db76a8bcce76b2e050433 Mon Sep 17 00:00:00 2001 From: Marco Cyriacks Date: Fri, 30 Jan 2015 21:50:00 +0100 Subject: Fix raw image paste from clipboard This patch binds the textarea (markdown area) paste event to the handlePaste() function (that was already present). Furthermore the event processing is improved in the following way: - The default paste event handler of the browser is only disabled if the browser fully supports clipboardData AND there realy is image data in the event object. In all other cases (no support or no image) the default handler processes the text paste. - Some obsolete code was removed. - The pasteText() function (which is somehow buggy because it places the cursor at the end of the text independantly from its position before the paste) is only used to place the image link after image data was pasted. --- app/assets/javascripts/dropzone_input.js.coffee | 31 +++++++++++-------------- 1 file changed, 13 insertions(+), 18 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index a0f0d98a8dc..abb5bf519ee 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -13,6 +13,8 @@ class @DropzoneInput form_textarea = $(form).find("textarea.markdown-area") form_textarea.wrap "
    " + form_textarea.bind 'paste', (event) => + handlePaste(event) form_dropzone = $(form).find('.div-dropzone') form_dropzone.parent().addClass "div-dropzone-wrapper" @@ -133,24 +135,17 @@ class @DropzoneInput formatLink = (str) -> "![" + str.alt + "](" + str.url + ")" - handlePaste = (e) -> - e.preventDefault() - my_event = e.originalEvent - - if my_event.clipboardData and my_event.clipboardData.items - processItem(my_event) - - processItem = (e) -> - image = isImage(e) - if image - filename = getFilename(e) or "image.png" - text = "{{" + filename + "}}" - pasteText(text) - uploadFile image.getAsFile(), filename - - else - text = e.clipboardData.getData("text/plain") - pasteText(text) + handlePaste = (event) -> + pasteEvent = event.originalEvent + if pasteEvent.clipboardData and pasteEvent.clipboardData.items + image = isImage(pasteEvent) + if image + event.preventDefault() + + filename = getFilename(pasteEvent) or "image.png" + text = "{{" + filename + "}}" + pasteText(text) + uploadFile image.getAsFile(), filename isImage = (data) -> i = 0 -- cgit v1.2.1 From b4d9ceb26fc4bd9125cdbd6796a618415d8f6af7 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Tue, 29 Jul 2014 17:41:55 +0200 Subject: Add Asana service Also add ability to render "service.help" in markdown --- app/models/project.rb | 3 +- app/models/project_services/asana_service.rb | 103 +++++++++++++++++++++++++++ app/views/projects/services/_form.html.haml | 3 +- 3 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 app/models/project_services/asana_service.rb (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index b26c697a7b7..8c6fbfd66ac 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -68,6 +68,7 @@ class Project < ActiveRecord::Base has_one :hipchat_service, dependent: :destroy has_one :flowdock_service, dependent: :destroy has_one :assembla_service, dependent: :destroy + has_one :asana_service, dependent: :destroy has_one :gemnasium_service, dependent: :destroy has_one :slack_service, dependent: :destroy has_one :buildbox_service, dependent: :destroy @@ -359,7 +360,7 @@ class Project < ActiveRecord::Base end def available_services_names - %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla + %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla asana emails_on_push gemnasium slack pushover buildbox bamboo teamcity jira redmine custom_issue_tracker) end diff --git a/app/models/project_services/asana_service.rb b/app/models/project_services/asana_service.rb new file mode 100644 index 00000000000..174d69ae3cd --- /dev/null +++ b/app/models/project_services/asana_service.rb @@ -0,0 +1,103 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + +require 'asana' + +class AsanaService < Service + prop_accessor :api_key, :restrict_to_branch + validates :api_key, presence: true, if: :activated? + + def title + 'Asana' + end + + def description + 'Asana - Teamwork without email' + end + + def help + 'This service adds commit messages as comments to Asana tasks. Once enabled, commit messages +are checked for Asana task URLs (for example, `https://app.asana.com/0/123456/987654`) or task IDs +starting with # (for example, `#987654`). Every task ID found will get the commit comment added to it. + +You can also close a task with a message containing: `fix #123456`. + +You can find your Api Keys here: http://developer.asana.com/documentation/#api_keys' + end + + def to_param + 'asana' + end + + def fields + [ + { type: 'text', name: 'api_key', placeholder: 'User API token. User must have access to task, all comments will be attributed to this user.' }, + { type: 'text', name: 'restrict_to_branch', placeholder: 'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.' } + ] + end + + def execute(push) + Asana.configure do |client| + client.api_key = api_key + end + + user = push[:user_name] + branch = push[:ref].gsub('refs/heads/', '') + + branch_restriction = restrict_to_branch.to_s + + # check the branch restriction is poplulated and branch is not included + if branch_restriction.length > 0 && branch_restriction.index(branch) == nil + return + end + + project_name = project.name_with_namespace + push_msg = user + ' pushed to branch ' + branch + ' of ' + project_name + + push[:commits].each do |commit| + check_commit(' ( ' + commit[:url] + ' ): ' + commit[:message], push_msg) + end + end + + def check_commit(message, push_msg) + task_list = [] + close_list = [] + + message.split("\n").each do |line| + # look for a task ID or a full Asana url + task_list.concat(line.scan(/#(\d+)/)) + task_list.concat(line.scan(/https:\/\/app\.asana\.com\/\d+\/\d+\/(\d+)/)) + # look for a word starting with 'fix' followed by a task ID + close_list.concat(line.scan(/(fix\w*)\W*#(\d+)/i)) + end + + # post commit to every taskid found + task_list.each do |taskid| + task = Asana::Task.find(taskid[0]) + + if task + task.create_story(text: push_msg + ' ' + message) + end + end + + # close all tasks that had 'fix(ed/es/ing) #:id' in them + close_list.each do |taskid| + task = Asana::Task.find(taskid.last) + + if task + task.modify(completed: true) + end + end + end +end diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index 1151f22c7e8..ba270880881 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -19,7 +19,8 @@ - if @service.help.present? .bs-callout - = @service.help + = preserve do + = markdown @service.help .form-group = f.label :active, "Active", class: "control-label" -- cgit v1.2.1 From 3cd1eda5a4f8e4ac95ebab558e8965724481dd97 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Fri, 16 Jan 2015 12:49:50 +0100 Subject: Add restrict_to_branch to service controller And add restrict_to_branch to spec --- app/controllers/projects/services_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 5b35cc90413..b3110eacc18 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -47,7 +47,7 @@ class Projects::ServicesController < Projects::ApplicationController :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, :build_key, :server, :teamcity_url, :build_type, - :description, :issues_url, :new_issue_url + :description, :issues_url, :new_issue_url, :restrict_to_branch ) end end -- cgit v1.2.1 From f79b6af18a29f8ddececb9c64de5ff6d456d1d29 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 25 Jan 2015 10:35:16 +0100 Subject: Fix HoundCI --- app/models/project_services/asana_service.rb | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/models/project_services/asana_service.rb b/app/models/project_services/asana_service.rb index 174d69ae3cd..db1e7a2b1cb 100644 --- a/app/models/project_services/asana_service.rb +++ b/app/models/project_services/asana_service.rb @@ -27,13 +27,16 @@ class AsanaService < Service end def help - 'This service adds commit messages as comments to Asana tasks. Once enabled, commit messages -are checked for Asana task URLs (for example, `https://app.asana.com/0/123456/987654`) or task IDs -starting with # (for example, `#987654`). Every task ID found will get the commit comment added to it. + 'This service adds commit messages as comments to Asana tasks. +Once enabled, commit messages are checked for Asana task URLs +(for example, `https://app.asana.com/0/123456/987654`) or task IDs +starting with # (for example, `#987654`). Every task ID found will +get the commit comment added to it. You can also close a task with a message containing: `fix #123456`. -You can find your Api Keys here: http://developer.asana.com/documentation/#api_keys' +You can find your Api Keys here: +http://developer.asana.com/documentation/#api_keys' end def to_param @@ -42,8 +45,18 @@ You can find your Api Keys here: http://developer.asana.com/documentation/#api_k def fields [ - { type: 'text', name: 'api_key', placeholder: 'User API token. User must have access to task, all comments will be attributed to this user.' }, - { type: 'text', name: 'restrict_to_branch', placeholder: 'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.' } + { + type: 'text', + name: 'api_key', + placeholder: 'User API token. User must have access to task, +all comments will be attributed to this user.' + }, + { + type: 'text', + name: 'restrict_to_branch', + placeholder: 'Comma-separated list of branches which will be +automatically inspected. Leave blank to include all branches.' + } ] end -- cgit v1.2.1 From c0acb28c4ec710c90eb55dc996251a30001c8e79 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 10:24:40 -0800 Subject: Annotate models --- app/models/project.rb | 2 +- .../project_services/custom_issue_tracker_service.rb | 14 ++++++++++++++ .../project_services/gitlab_issue_tracker_service.rb | 14 ++++++++++++++ app/models/project_services/issue_tracker_service.rb | 14 ++++++++++++++ app/models/project_services/jira_service.rb | 14 ++++++++++++++ app/models/project_services/redmine_service.rb | 14 ++++++++++++++ 6 files changed, 71 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index b26c697a7b7..f3dddc28adb 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -14,7 +14,7 @@ # merge_requests_enabled :boolean default(TRUE), not null # wiki_enabled :boolean default(TRUE), not null # namespace_id :integer -# issues_tracker :string(255) default('gitlab'), not null +# issues_tracker :string(255) default("gitlab"), not null # issues_tracker_id :string(255) # snippets_enabled :boolean default(TRUE), not null # last_activity_at :datetime diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb index 2476b62da89..b6b79589f1d 100644 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class CustomIssueTrackerService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 25f5f23bdf9..25e399883b7 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class GitlabIssueTrackerService < IssueTrackerService include Rails.application.routes.url_helpers prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 632f053d17b..acc8b33178c 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class IssueTrackerService < Service validates :project_url, :issues_url, :new_issue_url, presence: true, if: :activated? diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index b0d668948d0..7a32b0e8c2c 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class JiraService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index 11cce3e0561..547b2401832 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class RedmineService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url -- cgit v1.2.1 From 2bd70b6a01b6b5b3406718d1f539f9f480cf3bec Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 15:47:51 -0800 Subject: Improve project icons for dashboard --- app/assets/stylesheets/sections/dashboard.scss | 10 ++++++++++ app/views/dashboard/_groups.html.haml | 3 ++- app/views/dashboard/_project.html.haml | 4 ++-- app/views/groups/_projects.html.haml | 4 ++-- app/views/users/_groups.html.haml | 4 ++-- 5 files changed, 18 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index 90010781af0..17c0cd81b93 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -97,7 +97,17 @@ .dash-project-avatar { float: left; + + .avatar { + margin-top: -8px; + margin-left: -15px; + @include border-radius(0px); + } + .identicon { + line-height: 40px; + } } + .dash-project-access-icon { float: left; margin-right: 5px; diff --git a/app/views/dashboard/_groups.html.haml b/app/views/dashboard/_groups.html.haml index ddabd6e0d52..ddf44270802 100644 --- a/app/views/dashboard/_groups.html.haml +++ b/app/views/dashboard/_groups.html.haml @@ -10,7 +10,8 @@ - groups.each do |group| %li.group-row = link_to group_path(id: group.path), class: dom_class(group) do - = image_tag group_icon(group.path), class: "avatar s24" + .dash-project-avatar + = image_tag group_icon(group.path), class: "avatar s40" %span.group-name.filter-title = truncate(group.name, length: 35) %span.arrow diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index 76b95264fd8..e9f411725a3 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,8 +1,8 @@ = link_to project_path(project), class: dom_class(project) do + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) - .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s24') %span.str-truncated %span.namespace-name - if project.namespace diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 34221595fd7..a2f1d28a275 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -12,10 +12,10 @@ - projects.each do |project| %li.project-row = link_to project_path(project), class: dom_class(project) do + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) - .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s24') %span.str-truncated %span.project-name = project.name diff --git a/app/views/users/_groups.html.haml b/app/views/users/_groups.html.haml index 32a1dc83b57..b66a8808f87 100644 --- a/app/views/users/_groups.html.haml +++ b/app/views/users/_groups.html.haml @@ -1,4 +1,4 @@ .clearfix - groups.each do |group| - = link_to group, class: 'profile-groups-avatars', title: group.name do - = image_tag group_icon(group.path), class: 'avatar avatar-inline s40' + = link_to group, class: 'profile-groups-avatars inline', title: group.name do + = image_tag group_icon(group.path), class: 'avatar avatar-tile s40' -- cgit v1.2.1 From 4f1d1fc51baf396d49f6b159c84e15194706847c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 19:30:09 -0800 Subject: Convert hashes to ruby 1.9 style --- app/controllers/github_imports_controller.rb | 4 ++-- app/helpers/emails_helper.rb | 2 +- app/helpers/merge_requests_helper.rb | 2 +- app/models/merge_request.rb | 2 +- app/models/project.rb | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/controllers/github_imports_controller.rb b/app/controllers/github_imports_controller.rb index 3c5448bc709..b73e3f7ffac 100644 --- a/app/controllers/github_imports_controller.rb +++ b/app/controllers/github_imports_controller.rb @@ -23,7 +23,7 @@ class GithubImportsController < ApplicationController end def jobs - jobs = current_user.created_projects.where(import_type: "github").to_json(:only => [:id, :import_status]) + jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) render json: jobs end @@ -58,7 +58,7 @@ class GithubImportsController < ApplicationController def octo_client Octokit.auto_paginate = true - @octo_client ||= Octokit::Client.new(:access_token => current_user.github_access_token) + @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token) end def github_auth diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index b336263049c..92cc9c426b8 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -31,7 +31,7 @@ module EmailsHelper end def add_email_highlight_css - Rugments::Themes::Github.render(:scope => '.highlight') + Rugments::Themes::Github.render(scope: '.highlight') end def color_email_diff(diffcontent) diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index fe6fd5832fc..2c9aeba570a 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -15,7 +15,7 @@ module MergeRequestsHelper end def new_mr_from_push_event(event, target_project) - return :merge_request => { + return merge_request: { source_project_id: event.project.id, target_project_id: target_project.id, source_branch: event.branch_name, diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 715257f905f..ad2e8d7879b 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -76,7 +76,7 @@ class MergeRequest < ActiveRecord::Base merge_request.save end - after_transition :locked => (any - :locked) do |merge_request, transition| + after_transition locked: (any - :locked) do |merge_request, transition| merge_request.locked_at = nil merge_request.save end diff --git a/app/models/project.rb b/app/models/project.rb index f3dddc28adb..f314ed9bd25 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -156,22 +156,22 @@ class Project < ActiveRecord::Base end event :import_finish do - transition :started => :finished + transition started: :finished end event :import_fail do - transition :started => :failed + transition started: :failed end event :import_retry do - transition :failed => :started + transition failed: :started end state :started state :finished state :failed - after_transition any => :started, :do => :add_import_job + after_transition any => :started, do: :add_import_job end class << self -- cgit v1.2.1 From afb8ecc3d1569520379a2d0613137c46d44a12ce Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:02:46 -0800 Subject: Fix syntax error --- app/helpers/merge_requests_helper.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 2c9aeba570a..4c640d4fc5f 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -15,11 +15,13 @@ module MergeRequestsHelper end def new_mr_from_push_event(event, target_project) - return merge_request: { - source_project_id: event.project.id, - target_project_id: target_project.id, - source_branch: event.branch_name, - target_branch: target_project.repository.root_ref + return { + merge_request: { + source_project_id: event.project.id, + target_project_id: target_project.id, + source_branch: event.branch_name, + target_branch: target_project.repository.root_ref + } } end -- cgit v1.2.1 From e89058268118e3b2be4ebaf5d7bf2c684b590437 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:36:54 -0800 Subject: Rubocop enabled for: Use spaces inside hash literal braces --- app/controllers/snippets_controller.rb | 2 +- app/helpers/compare_helper.rb | 4 ++-- app/helpers/projects_helper.rb | 2 +- app/models/hooks/web_hook.rb | 2 +- app/models/identity.rb | 2 +- app/models/project_services/custom_issue_tracker_service.rb | 4 ++-- app/models/project_services/gitlab_ci_service.rb | 2 +- app/models/project_services/issue_tracker_service.rb | 4 ++-- app/models/project_wiki.rb | 2 +- app/models/user.rb | 4 ++-- 10 files changed, 14 insertions(+), 14 deletions(-) (limited to 'app') diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb index 312e561b522..1ed3bc388fb 100644 --- a/app/controllers/snippets_controller.rb +++ b/app/controllers/snippets_controller.rb @@ -27,7 +27,7 @@ class SnippetsController < ApplicationController @snippets = SnippetsFinder.new.execute(current_user, { filter: :by_user, user: @user, - scope: params[:scope]}). + scope: params[:scope] }). page(params[:page]).per(20) if @user == current_user diff --git a/app/helpers/compare_helper.rb b/app/helpers/compare_helper.rb index 5ff19b88293..dd2e713a54e 100644 --- a/app/helpers/compare_helper.rb +++ b/app/helpers/compare_helper.rb @@ -1,7 +1,7 @@ module CompareHelper def compare_to_mr_button? @project.merge_requests_enabled && - params[:from].present? && + params[:from].present? && params[:to].present? && @repository.branch_names.include?(params[:from]) && @repository.branch_names.include?(params[:to]) && @@ -10,6 +10,6 @@ module CompareHelper end def compare_mr_path - new_project_merge_request_path(@project, merge_request: {source_branch: params[:to], target_branch: params[:from]}) + new_project_merge_request_path(@project, merge_request: { source_branch: params[:to], target_branch: params[:from] }) end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 0b01be79623..687b087e683 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -95,7 +95,7 @@ module ProjectsHelper class: cls, method: :post, remote: true, - data: {type: 'json'} + data: { type: 'json' } } diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index d1d522be194..327cb585ffa 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -44,7 +44,7 @@ class WebHook < ActiveRecord::Base } WebHook.post(post_url, body: data.to_json, - headers: {"Content-Type" => "application/json"}, + headers: { "Content-Type" => "application/json" }, verify: false, basic_auth: auth) end diff --git a/app/models/identity.rb b/app/models/identity.rb index c7cdb63e3d2..80e0e3a8a23 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -11,5 +11,5 @@ class Identity < ActiveRecord::Base belongs_to :user - validates :extern_uid, allow_blank: true, uniqueness: {scope: :provider} + validates :extern_uid, allow_blank: true, uniqueness: { scope: :provider } end diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb index b6b79589f1d..5845e2d3525 100644 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -41,8 +41,8 @@ class CustomIssueTrackerService < IssueTrackerService { type: 'text', name: 'title', placeholder: title }, { type: 'text', name: 'description', placeholder: description }, { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + { type: 'text', name: 'issues_url', placeholder: 'Issue url' }, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url' } ] end diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index fadebf968bc..248f749b310 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -81,7 +81,7 @@ class GitlabCiService < CiService def fields [ { type: 'text', name: 'token', placeholder: 'GitLab CI project specific token' }, - { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3'} + { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3' } ] end end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index acc8b33178c..b19c02bab44 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -44,8 +44,8 @@ class IssueTrackerService < Service [ { type: 'text', name: 'description', placeholder: description }, { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + { type: 'text', name: 'issues_url', placeholder: 'Issue url' }, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url' } ] end diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index f8a28ca9866..55438bee245 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -136,7 +136,7 @@ class ProjectWiki def commit_details(action, message = nil, title = nil) commit_message = message || default_message(action, title) - {email: @user.email, name: @user.name, message: commit_message} + { email: @user.email, name: @user.name, message: commit_message } end def default_message(action, title) diff --git a/app/models/user.rb b/app/models/user.rb index 69fe674df83..27724b3ccba 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -113,9 +113,9 @@ class User < ActiveRecord::Base # Validations # validates :name, presence: true - validates :email, presence: true, email: {strict_mode: true}, uniqueness: true + validates :email, presence: true, email: { strict_mode: true }, uniqueness: true validates :bio, length: { maximum: 255 }, allow_blank: true - validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0} + validates :projects_limit, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :username, presence: true, uniqueness: { case_sensitive: false }, exclusion: { in: Gitlab::Blacklist.path }, format: { with: Gitlab::Regex.username_regex, -- cgit v1.2.1 From aaae5e6f5ebc61f724e901f26e928f5e3bd9eb88 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:55:05 -0800 Subject: Rubocop: Style/AccessorMethodName enabled --- app/services/projects/image_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/services/projects/image_service.rb b/app/services/projects/image_service.rb index c79ddddd972..7ca7e82c4a3 100644 --- a/app/services/projects/image_service.rb +++ b/app/services/projects/image_service.rb @@ -14,14 +14,14 @@ module Projects uploader.store!(image) link = { 'alt' => File.basename(alt, '.*'), - 'url' => File.join(@root_url, uploader.url) + 'url' => File.join(@root_url, uploader.url) } else link = nil end end - protected + protected def upload_path base_dir = FileUploader.generate_dir -- cgit v1.2.1 From 9fbdbf8b3fff72ae37a320e7e9fac3b9224e3c53 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:57:10 -0800 Subject: Rubocop: Style/Alias enabled --- app/models/wiki_page.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index b9ab6702c53..32981a0e664 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -43,7 +43,7 @@ class WikiPage @attributes[:slug] end - alias :to_param :slug + alias_method :to_param, :slug # The formatted title of this page. def title -- cgit v1.2.1 From cc39bca3fa71930421f1c46844b4d02d5ff93e8b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:15:44 -0800 Subject: Rubocop: Style/AlignHash enabled --- app/controllers/projects/blob_controller.rb | 3 +-- app/helpers/application_helper.rb | 4 ++-- app/models/application_setting.rb | 3 ++- app/models/namespace.rb | 21 +++++++++++++-------- app/models/project.rb | 18 +++++++++++------- app/models/project_services/bamboo_service.rb | 18 ++++++++++++------ app/models/project_services/teamcity_service.rb | 15 +++++++++------ app/models/snippet.rb | 8 +++++--- app/models/user.rb | 10 ++++++---- 9 files changed, 61 insertions(+), 39 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index b471d57f698..dccb96ba1d1 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -59,8 +59,7 @@ class Projects::BlobController < Projects::ApplicationController def preview @content = params[:content] - diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', - include_diff_info: true) + diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true) @diff_lines = Gitlab::Diff::Parser.new.parse(diffy.diff.scan(/.*\n/)) render layout: false diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d00f1aac2d6..7417261a847 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -75,9 +75,9 @@ module ApplicationHelper options[:class] ||= '' options[:class] << ' identicon' bg_key = project.id % 7 + style = "background-color: ##{ allowed_colors.values[bg_key] }; color: #555" - content_tag(:div, class: options[:class], - style: "background-color: ##{ allowed_colors.values[bg_key] }; color: #555") do + content_tag(:div, class: options[:class], style: style) do project.name[0, 1].upcase end end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 45ae79a75cc..0b3d430add0 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -14,7 +14,8 @@ # class ApplicationSetting < ActiveRecord::Base - validates :home_page_url, allow_blank: true, + validates :home_page_url, + allow_blank: true, format: { with: URI::regexp(%w(http https)), message: "should be a valid url" }, if: :home_page_url_column_exist diff --git a/app/models/namespace.rb b/app/models/namespace.rb index ea4b48fdd7f..e7fd3024750 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -20,15 +20,20 @@ class Namespace < ActiveRecord::Base belongs_to :owner, class_name: "User" validates :owner, presence: true, unless: ->(n) { n.type == "Group" } - validates :name, presence: true, uniqueness: true, - length: { within: 0..255 }, - format: { with: Gitlab::Regex.name_regex, - message: Gitlab::Regex.name_regex_message } + validates :name, + presence: true, uniqueness: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.name_regex, + message: Gitlab::Regex.name_regex_message } + validates :description, length: { within: 0..255 } - validates :path, uniqueness: { case_sensitive: false }, presence: true, length: { within: 1..255 }, - exclusion: { in: Gitlab::Blacklist.path }, - format: { with: Gitlab::Regex.path_regex, - message: Gitlab::Regex.path_regex_message } + validates :path, + uniqueness: { case_sensitive: false }, + presence: true, + length: { within: 1..255 }, + exclusion: { in: Gitlab::Blacklist.path }, + format: { with: Gitlab::Regex.path_regex, + message: Gitlab::Regex.path_regex_message } delegate :name, to: :owner, allow_nil: true, prefix: true diff --git a/app/models/project.rb b/app/models/project.rb index f314ed9bd25..cfe40553ab5 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -108,13 +108,17 @@ class Project < ActiveRecord::Base # Validations validates :creator, presence: true, on: :create validates :description, length: { maximum: 2000 }, allow_blank: true - validates :name, presence: true, length: { within: 0..255 }, - format: { with: Gitlab::Regex.project_name_regex, - message: Gitlab::Regex.project_regex_message } - validates :path, presence: true, length: { within: 0..255 }, - exclusion: { in: Gitlab::Blacklist.path }, - format: { with: Gitlab::Regex.path_regex, - message: Gitlab::Regex.path_regex_message } + validates :name, + presence: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.project_name_regex, + message: Gitlab::Regex.project_regex_message } + validates :path, + presence: true, + length: { within: 0..255 }, + exclusion: { in: Gitlab::Blacklist.path }, + format: { with: Gitlab::Regex.path_regex, + message: Gitlab::Regex.path_regex_message } validates :issues_enabled, :merge_requests_enabled, :wiki_enabled, inclusion: { in: [true, false] } validates :visibility_level, diff --git a/app/models/project_services/bamboo_service.rb b/app/models/project_services/bamboo_service.rb index 16e1b83da4b..745609e5911 100644 --- a/app/models/project_services/bamboo_service.rb +++ b/app/models/project_services/bamboo_service.rb @@ -17,13 +17,19 @@ class BambooService < CiService prop_accessor :bamboo_url, :build_key, :username, :password - validates :bamboo_url, presence: true, - format: { with: URI::regexp }, if: :activated? + validates :bamboo_url, + presence: true, + format: { with: URI::regexp }, + if: :activated? validates :build_key, presence: true, if: :activated? - validates :username, presence: true, - if: ->(service) { service.password? }, if: :activated? - validates :password, presence: true, - if: ->(service) { service.username? }, if: :activated? + validates :username, + presence: true, + if: ->(service) { service.password? }, + if: :activated? + validates :password, + presence: true, + if: ->(service) { service.username? }, + if: :activated? attr_accessor :response diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb index dca718b5e8c..287f5c0e84e 100644 --- a/app/models/project_services/teamcity_service.rb +++ b/app/models/project_services/teamcity_service.rb @@ -17,13 +17,16 @@ class TeamcityService < CiService prop_accessor :teamcity_url, :build_type, :username, :password - validates :teamcity_url, presence: true, - format: { with: URI::regexp }, if: :activated? + validates :teamcity_url, + presence: true, + format: { with: URI::regexp }, if: :activated? validates :build_type, presence: true, if: :activated? - validates :username, presence: true, - if: ->(service) { service.password? }, if: :activated? - validates :password, presence: true, - if: ->(service) { service.username? }, if: :activated? + validates :username, + presence: true, + if: ->(service) { service.password? }, if: :activated? + validates :password, + presence: true, + if: ->(service) { service.username? }, if: :activated? attr_accessor :response diff --git a/app/models/snippet.rb b/app/models/snippet.rb index 9aba42a0622..a3222d29892 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -29,9 +29,11 @@ class Snippet < ActiveRecord::Base validates :author, presence: true validates :title, presence: true, length: { within: 0..255 } - validates :file_name, presence: true, length: { within: 0..255 }, - format: { with: Gitlab::Regex.path_regex, - message: Gitlab::Regex.path_regex_message } + validates :file_name, + presence: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.path_regex, + message: Gitlab::Regex.path_regex_message } validates :content, presence: true validates :visibility_level, inclusion: { in: Gitlab::VisibilityLevel.values } diff --git a/app/models/user.rb b/app/models/user.rb index 27724b3ccba..552a37c9533 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -116,10 +116,12 @@ class User < ActiveRecord::Base validates :email, presence: true, email: { strict_mode: true }, uniqueness: true validates :bio, length: { maximum: 255 }, allow_blank: true validates :projects_limit, presence: true, numericality: { greater_than_or_equal_to: 0 } - validates :username, presence: true, uniqueness: { case_sensitive: false }, - exclusion: { in: Gitlab::Blacklist.path }, - format: { with: Gitlab::Regex.username_regex, - message: Gitlab::Regex.username_regex_message } + validates :username, + presence: true, + uniqueness: { case_sensitive: false }, + exclusion: { in: Gitlab::Blacklist.path }, + format: { with: Gitlab::Regex.username_regex, + message: Gitlab::Regex.username_regex_message } validates :notification_level, inclusion: { in: Notification.notification_levels }, presence: true validate :namespace_uniq, if: ->(user) { user.username_changed? } -- cgit v1.2.1 From 368e9a0862dd7d58b009956e8f1ac51d2a549cda Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:26:40 -0800 Subject: Rubocop: Style/CaseIndentation enabled --- app/finders/notes_finder.rb | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/finders/notes_finder.rb b/app/finders/notes_finder.rb index bef82d7f0fd..6fe15b41060 100644 --- a/app/finders/notes_finder.rb +++ b/app/finders/notes_finder.rb @@ -7,18 +7,19 @@ class NotesFinder # Default to 0 to remain compatible with old clients last_fetched_at = Time.at(params.fetch(:last_fetched_at, 0).to_i) - notes = case target_type - when "commit" - project.notes.for_commit_id(target_id).not_inline.fresh - when "issue" - project.issues.find(target_id).notes.inc_author.fresh - when "merge_request" - project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh - when "snippet", "project_snippet" - project.snippets.find(target_id).notes.fresh - else - raise 'invalid target_type' - end + notes = + case target_type + when "commit" + project.notes.for_commit_id(target_id).not_inline.fresh + when "issue" + project.issues.find(target_id).notes.inc_author.fresh + when "merge_request" + project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh + when "snippet", "project_snippet" + project.snippets.find(target_id).notes.fresh + else + raise 'invalid target_type' + end # Use overlapping intervals to avoid worrying about race conditions notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP) -- cgit v1.2.1 From 7d48205c1a472c07969e4dc43965fa3090b84376 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:34:16 -0800 Subject: Rubocop: comment indentation --- app/helpers/notes_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index d41d5617396..8edcb8e6a80 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -1,5 +1,5 @@ module NotesHelper - # Helps to distinguish e.g. commit notes in mr notes list + # Helps to distinguish e.g. commit notes in mr notes list def note_for_main_target?(note) (@noteable.class.name == note.noteable_type && !note.for_diff_line?) end -- cgit v1.2.1 From 647ff6240ef5e8256a44b126aa7573812d5e70b7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:38:50 -0800 Subject: Rubocop: Style/ElseAlignment enabled --- app/controllers/projects/refs_controller.rb | 8 ++++---- app/helpers/commits_helper.rb | 13 +++++++------ app/models/commit.rb | 11 ++++++----- app/services/projects/participants_service.rb | 11 ++++++----- 4 files changed, 23 insertions(+), 20 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index cede0ebe0ae..b80472f8eb4 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -31,10 +31,10 @@ class Projects::RefsController < Projects::ApplicationController def logs_tree @offset = if params[:offset].present? - params[:offset].to_i - else - 0 - end + params[:offset].to_i + else + 0 + end @limit = 25 diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 1a322ac048f..b4ba14160ed 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -112,12 +112,13 @@ module CommitsHelper person_name = user.nil? ? source_name : user.name person_email = user.nil? ? source_email : user.email - text = if options[:avatar] - avatar = image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: "") - %Q{#{avatar} #{person_name}} - else - person_name - end + text = + if options[:avatar] + avatar = image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: "") + %Q{#{avatar} #{person_name}} + else + person_name + end options = { class: "commit-#{options[:source]}-link has_tooltip", diff --git a/app/models/commit.rb b/app/models/commit.rb index baccf286740..e0461809e10 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -88,11 +88,12 @@ class Commit # cut off, ellipses (`&hellp;`) are prepended to the commit message. def description title_end = safe_message.index("\n") - @description ||= if (!title_end && safe_message.length > 100) || (title_end && title_end > 100) - "…".html_safe << safe_message[80..-1] - else - safe_message.split("\n", 2)[1].try(:chomp) - end + @description ||= + if (!title_end && safe_message.length > 100) || (title_end && title_end > 100) + "…".html_safe << safe_message[80..-1] + else + safe_message.split("\n", 2)[1].try(:chomp) + end end def description? diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb index c4d2c0963b7..e3b33de8d02 100644 --- a/app/services/projects/participants_service.rb +++ b/app/services/projects/participants_service.rb @@ -5,11 +5,12 @@ module Projects end def execute(note_type, note_id) - participating = if note_type && note_id - participants_in(note_type, note_id) - else - [] - end + participating = + if note_type && note_id + participants_in(note_type, note_id) + else + [] + end team_members = sorted(@project.team.members) participants = all_members + team_members + participating participants.uniq -- cgit v1.2.1 From d04344373b899c1e54948ca46478f7b907a576d2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:53:27 -0800 Subject: Rubocop: no trailing newlines --- app/controllers/namespaces_controller.rb | 1 - app/controllers/projects/raw_controller.rb | 1 - app/helpers/projects_helper.rb | 1 - app/services/oauth2/access_token_validation_service.rb | 2 +- 4 files changed, 1 insertion(+), 4 deletions(-) (limited to 'app') diff --git a/app/controllers/namespaces_controller.rb b/app/controllers/namespaces_controller.rb index c59a2401cef..b7a9d8c1291 100644 --- a/app/controllers/namespaces_controller.rb +++ b/app/controllers/namespaces_controller.rb @@ -15,4 +15,3 @@ class NamespacesController < ApplicationController end end end - diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index 84888265dc1..c4ddc32e8c3 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -35,4 +35,3 @@ class Projects::RawController < Projects::ApplicationController end end end - diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 687b087e683..5cec6ae99d8 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -254,4 +254,3 @@ module ProjectsHelper enabled_oauth_providers.include?(:github) end end - diff --git a/app/services/oauth2/access_token_validation_service.rb b/app/services/oauth2/access_token_validation_service.rb index 5a3b94129f1..6194f6ce91e 100644 --- a/app/services/oauth2/access_token_validation_service.rb +++ b/app/services/oauth2/access_token_validation_service.rb @@ -38,4 +38,4 @@ module Oauth2::AccessTokenValidationService end end end -end \ No newline at end of file +end -- cgit v1.2.1 From 61cc6a9244f316f684cd887febd9dae1030a04b0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:59:28 -0800 Subject: Rubocop: indentation fixes Yay!!! --- app/controllers/projects/wikis_controller.rb | 20 ++++++++++---------- app/finders/snippets_finder.rb | 2 +- app/helpers/application_helper.rb | 2 +- app/helpers/tab_helper.rb | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 0e03956e738..0145207bf6f 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -16,16 +16,16 @@ class Projects::WikisController < Projects::ApplicationController if @page render 'show' elsif file = @project_wiki.find_file(params[:id], params[:version_id]) - if file.on_disk? - send_file file.on_disk_path, disposition: 'inline' - else - send_data( - file.raw_data, - type: file.mime_type, - disposition: 'inline', - filename: file.name - ) - end + if file.on_disk? + send_file file.on_disk_path, disposition: 'inline' + else + send_data( + file.raw_data, + type: file.mime_type, + disposition: 'inline', + filename: file.name + ) + end else return render('empty') unless can?(current_user, :write_wiki, @project) @page = WikiPage.new(@project_wiki) diff --git a/app/finders/snippets_finder.rb b/app/finders/snippets_finder.rb index 4b0c69f2d2f..07b5759443b 100644 --- a/app/finders/snippets_finder.rb +++ b/app/finders/snippets_finder.rb @@ -40,7 +40,7 @@ class SnippetsFinder when 'are_public' then snippets.are_public else - snippets + snippets end else snippets.public_and_internal diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7417261a847..1fbb44ee442 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -78,7 +78,7 @@ module ApplicationHelper style = "background-color: ##{ allowed_colors.values[bg_key] }; color: #555" content_tag(:div, class: options[:class], style: style) do - project.name[0, 1].upcase + project.name[0, 1].upcase end end diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index 639fc98c222..2142db29925 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -90,7 +90,7 @@ module TabHelper return "active" if current_page?(controller: "/projects", action: :edit, id: @project) if ['services', 'hooks', 'deploy_keys', 'team_members', 'protected_branches'].include? controller.controller_name - "active" + "active" end end -- cgit v1.2.1 From ae5743e9c1d32f905aa1c64bce34e20379c85322 Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Tue, 3 Feb 2015 10:44:41 +0100 Subject: Made diff colors a little less In Your Face Signed-off-by: Jeroen van Baarsen --- app/assets/stylesheets/sections/diff.scss | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/diff.scss b/app/assets/stylesheets/sections/diff.scss index da50dbe4715..f47ea329827 100644 --- a/app/assets/stylesheets/sections/diff.scss +++ b/app/assets/stylesheets/sections/diff.scss @@ -40,12 +40,12 @@ font-size: $code_font_size; .old { span.idiff { - background-color: #F99; + background-color: #f8cbcb; } } .new { span.idiff { - background-color: #8F8; + background-color: #a6f3a6; } } .unfold { @@ -84,7 +84,7 @@ padding: 0px; border: none; background: #F5F5F5; - color: #666; + color: rgba(0,0,0,0.3); padding: 0px 5px; border-right: 1px solid #ccc; text-align: right; @@ -96,7 +96,7 @@ float: left; width: 35px; font-weight: normal; - color: #666; + color: rgba(0,0,0,0.3); &:hover { text-decoration: underline; } @@ -114,13 +114,13 @@ .line_holder { &.old .old_line, &.old .new_line { - background: #FCC; - border-color: #E7BABA; + background: #ffdddd; + border-color: #f1c0c0; } &.new .old_line, &.new .new_line { - background: #CFC; - border-color: #B9ECB9; + background: #dbffdb; + border-color: #c1e9c1; } } .line_content { @@ -129,10 +129,10 @@ padding: 0px 0.5em; border: none; &.new { - background: #CFD; + background: #eaffea; } &.old { - background: #FDD; + background: #ffecec; } &.matched { color: #ccc; -- cgit v1.2.1 From 97d4ac40477788c1c43d2f32baefd1df1ceeb9f4 Mon Sep 17 00:00:00 2001 From: Jason Blanchard Date: Fri, 30 Jan 2015 23:21:31 -0500 Subject: Adds link to milestone and keeping resource context on smaller viewports for issues and merge requests --- app/views/projects/issues/_discussion.html.haml | 2 +- app/views/projects/issues/_issue_context.html.haml | 18 ++++++++---------- app/views/projects/issues/update.js.haml | 7 +++++++ .../projects/merge_requests/_discussion.html.haml | 4 ++-- .../projects/merge_requests/show/_context.html.haml | 18 +++++++++--------- app/views/projects/merge_requests/update.js.haml | 6 ++++++ 6 files changed, 33 insertions(+), 22 deletions(-) (limited to 'app') diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index b5d6a16a1e1..e04e1985f1f 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -13,7 +13,7 @@ = link_to_member(@project, participant, name: false, size: 24) .voting_notes#notes= render "projects/notes/notes_with_form" - .col-md-3.hidden-sm.hidden-xs + .col-md-3 %div .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} diff --git a/app/views/projects/issues/_issue_context.html.haml b/app/views/projects/issues/_issue_context.html.haml index 98777a58f9d..3daa18ba346 100644 --- a/app/views/projects/issues/_issue_context.html.haml +++ b/app/views/projects/issues/_issue_context.html.haml @@ -2,23 +2,21 @@ %div.prepend-top-20 %p Assignee: - + - if issue.assignee + = link_to_member(@project, @issue.assignee) + - else + none - if can?(current_user, :modify_issue, @issue) = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id) - - elsif issue.assignee - = link_to_member(@project, @issue.assignee) - - else - None %div.prepend-top-20 %p Milestone: + - if issue.milestone + #{link_to @issue.milestone.title, project_milestone_path(@project, @issue.milestone)} + - else + none - if can?(current_user, :modify_issue, @issue) = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) = hidden_field_tag :issue_context = f.submit class: 'btn' - - elsif issue.milestone - = link_to project_milestone_path(@project, @issue.milestone) do - = @issue.milestone.title - - else - None diff --git a/app/views/projects/issues/update.js.haml b/app/views/projects/issues/update.js.haml index 6e50667b084..7a5e0517556 100644 --- a/app/views/projects/issues/update.js.haml +++ b/app/views/projects/issues/update.js.haml @@ -3,8 +3,15 @@ :plain $("##{dom_id(@issue)}").fadeOut(); - elsif params[:issue_context] + $('.context').html("#{escape_javascript(render partial: 'issue_context', locals: { issue: @issue })}"); $('.context').effect('highlight'); - if @issue.milestone $('.milestone-nav-link').replaceWith("| Milestone #{escape_javascript(link_to @issue.milestone.title, project_milestone_path(@issue.project, @issue.milestone))}") - else $('.milestone-nav-link').html('') + + +$('select.select2').select2({width: 'resolve', dropdownAutoWidth: true}) +$('.edit-issue.inline-update input[type="submit"]').hide(); +new ProjectUsersSelect(); +new Issue(); diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index 64bae800785..f1f66569a9f 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -9,7 +9,7 @@ .col-md-9 = render "projects/merge_requests/show/participants" = render "projects/notes/notes_with_form" - .col-md-3.hidden-sm.hidden-xs + .col-md-3 .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} = cross_project_reference(@project, @merge_request) @@ -18,7 +18,7 @@ %cite.cgray = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } %hr - .votes-holder.hidden-sm.hidden-xs + .votes-holder %h6 Votes #votes= render 'votes/votes_block', votable: @merge_request diff --git a/app/views/projects/merge_requests/show/_context.html.haml b/app/views/projects/merge_requests/show/_context.html.haml index 5b6e64f0657..21718ca2acf 100644 --- a/app/views/projects/merge_requests/show/_context.html.haml +++ b/app/views/projects/merge_requests/show/_context.html.haml @@ -2,22 +2,22 @@ %div.prepend-top-20 %p Assignee: - + - if @merge_request.assignee + = link_to_member(@project, @merge_request.assignee) + - else + none - if can?(current_user, :modify_merge_request, @merge_request) = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @merge_request.assignee_id) - - elsif merge_request.assignee - = link_to_member(@project, @merge_request.assignee) - - else - None %div.prepend-top-20 %p Milestone: + - if @merge_request.milestone + %span.back-to-milestone + #{link_to @merge_request.milestone.title, project_milestone_path(@project, @merge_request.milestone)} + - else + none - if can?(current_user, :modify_merge_request, @merge_request) = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) = hidden_field_tag :merge_request_context = f.submit class: 'btn' - - elsif merge_request.milestone - = link_to merge_request.milestone.title, project_milestone_path - - else - None diff --git a/app/views/projects/merge_requests/update.js.haml b/app/views/projects/merge_requests/update.js.haml index 6f4c5dd7a3b..f5cc98c7fa4 100644 --- a/app/views/projects/merge_requests/update.js.haml +++ b/app/views/projects/merge_requests/update.js.haml @@ -1,2 +1,8 @@ - if params[:merge_request_context] + $('.context').html("#{escape_javascript(render partial: 'projects/merge_requests/show/context', locals: { issue: @issue })}"); $('.context').effect('highlight'); + + new ProjectUsersSelect(); + + $('select.select2').select2({width: 'resolve', dropdownAutoWidth: true}); + merge_request = new MergeRequest(); -- cgit v1.2.1 From ee955d7a125f9d18ac7ae334542ae68dd8d5114c Mon Sep 17 00:00:00 2001 From: Jason Blanchard Date: Fri, 30 Jan 2015 14:23:35 -0500 Subject: Adds persistent collapse button for left side bar --- app/assets/javascripts/sidebar.js.coffee | 10 ++++++ app/assets/stylesheets/sections/nav_sidebar.scss | 39 +++++++++++++++++++++++- app/helpers/nav_helper.rb | 5 +++ app/views/layouts/_collapse_button.html.haml | 4 +++ app/views/layouts/_page.html.haml | 4 ++- 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 app/helpers/nav_helper.rb create mode 100644 app/views/layouts/_collapse_button.html.haml (limited to 'app') diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee index c084d730d62..d1b165a2311 100644 --- a/app/assets/javascripts/sidebar.js.coffee +++ b/app/assets/javascripts/sidebar.js.coffee @@ -24,3 +24,13 @@ $ -> $(window).resize -> responsive_resize() return + +$(document).on("click", '.toggle-nav-collapse', (e) -> + e.preventDefault() + if $('.page-with-sidebar').hasClass('collapsed') + $('.page-with-sidebar').removeClass('collapsed') + $.cookie("collapsed_nav", "false", { path: '/' }) + else + $('.page-with-sidebar').addClass('collapsed') + $.cookie("collapsed_nav", "true", { path: '/' }) +) diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index a61c053b8a9..0c278aec3f5 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -110,7 +110,7 @@ .nav-sidebar { margin-top: 20px; - position: fixed; + position: relative; top: 45px; width: $sidebar_width; } @@ -150,6 +150,37 @@ } } +.collapse-nav { + position: relative; + top: 50px; + width: 230px; + text-align: right; + padding-right: 21px; +} + +.page-with-sidebar.collapsed { + + .collapse-nav { + width: 53px; + } + + padding-left: 50px; + + .sidebar-wrapper { + width: 52px; + overflow-x: hidden; + + .nav-sidebar { + width: 52px; + } + + .nav-sidebar li a > span { + display: none; + } + } +} + + @media (max-width: $screen-md-max) { @include folded-sidebar; } @@ -157,3 +188,9 @@ @media(min-width: $screen-md-max) { @include expanded-sidebar; } + +@media (max-width: $screen-md-max) { + .collapse-nav { + display: none; + } +} diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb new file mode 100644 index 00000000000..2b03269800e --- /dev/null +++ b/app/helpers/nav_helper.rb @@ -0,0 +1,5 @@ +module NavHelper + def nav_menu_collapsed? + cookies[:collapsed_nav] == 'true' + end +end diff --git a/app/views/layouts/_collapse_button.html.haml b/app/views/layouts/_collapse_button.html.haml new file mode 100644 index 00000000000..52c19f1d99d --- /dev/null +++ b/app/views/layouts/_collapse_button.html.haml @@ -0,0 +1,4 @@ +- if nav_menu_collapsed? + = link_to icon('plus-square'), '#', class: 'toggle-nav-collapse' +- else + = link_to icon('minus-square'), '#', class: 'toggle-nav-collapse' diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 1263f44eca9..e20aec89110 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,8 +1,10 @@ - if defined?(sidebar) - .page-with-sidebar + .page-with-sidebar{:class => ("collapsed" if nav_menu_collapsed?)} = render "layouts/broadcast" .sidebar-wrapper = render(sidebar) + .collapse-nav + = render :partial => 'layouts/collapse_button' .content-wrapper .container-fluid .content -- cgit v1.2.1 From b9d9ac82a9d650b659866ea26dcb4e7987f10381 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 2 Feb 2015 21:30:11 -0800 Subject: Commit page: async load branches info Conflicts: config/routes.rb --- app/controllers/projects/commit_controller.rb | 8 ++++++-- app/views/projects/commit/_commit_box.html.haml | 23 ++++++----------------- app/views/projects/commit/branches.html.haml | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 19 deletions(-) create mode 100644 app/views/projects/commit/branches.html.haml (limited to 'app') diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index 470efbd2114..96a782bdf7a 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -11,8 +11,6 @@ class Projects::CommitController < Projects::ApplicationController return git_not_found! unless @commit @line_notes = @project.notes.for_commit_id(commit.id).inline - @branches = @project.repository.branch_names_contains(commit.id) - @tags = @project.repository.tag_names_contains(commit.id) @diffs = @commit.diffs @note = @project.build_commit_note(commit) @notes_count = @project.notes.for_commit_id(commit.id).count @@ -31,6 +29,12 @@ class Projects::CommitController < Projects::ApplicationController end end + def branches + @branches = @project.repository.branch_names_contains(commit.id) + @tags = @project.repository.tag_names_contains(commit.id) + render layout: false + end + def commit @commit ||= @project.repository.commit(params[:id]) end diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index b41fb1437f2..dd28a35d41d 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -37,23 +37,8 @@ - @commit.parents.each do |parent| = link_to parent.short_id, project_commit_path(@project, parent) -.commit-info-row - - if @branches.any? - %span - - branch = commit_default_branch(@project, @branches) - = link_to(project_tree_path(@project, branch)) do - %span.label.label-gray - %i.fa.fa-code-fork - = branch - - if @branches.any? || @tags.any? - = link_to("#", class: "js-details-expand") do - %span.label.label-gray - \... - %span.js-details-content.hide - - if @branches.any? - = commit_branches_links(@project, @branches) - - if @tags.any? - = commit_tags_links(@project, @tags) +.commit-info-row.branches + %i.fa.fa-spinner.fa-spin .commit-box %h3.commit-title @@ -61,3 +46,7 @@ - if @commit.description.present? %pre.commit-description = preserve(gfm(escape_once(@commit.description))) + +:coffeescript + $ -> + $(".commit-info-row.branches").load("#{branches_project_commit_path(@project, @commit.id)}") \ No newline at end of file diff --git a/app/views/projects/commit/branches.html.haml b/app/views/projects/commit/branches.html.haml new file mode 100644 index 00000000000..b01e806210c --- /dev/null +++ b/app/views/projects/commit/branches.html.haml @@ -0,0 +1,16 @@ +- if @branches.any? + %span + - branch = commit_default_branch(@project, @branches) + = link_to(project_tree_path(@project, branch)) do + %span.label.label-gray + %i.fa.fa-code-fork + = branch + - if @branches.any? || @tags.any? + = link_to("#", class: "js-details-expand") do + %span.label.label-gray + \... + %span.js-details-content.hide + - if @branches.any? + = commit_branches_links(@project, @branches) + - if @tags.any? + = commit_tags_links(@project, @tags) \ No newline at end of file -- cgit v1.2.1 From 39bfe0aa1d3a17858accce3b8118fd9fe2926cc7 Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Tue, 3 Feb 2015 18:45:39 +0100 Subject: Also show colors in the sidebar of comment Signed-off-by: Jeroen van Baarsen --- app/views/projects/notes/discussions/_diff.html.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/projects/notes/discussions/_diff.html.haml b/app/views/projects/notes/discussions/_diff.html.haml index b4d1cce7980..f717c77a898 100644 --- a/app/views/projects/notes/discussions/_diff.html.haml +++ b/app/views/projects/notes/discussions/_diff.html.haml @@ -19,8 +19,10 @@ %td.new_line= "..." %td.line_content.matched= line.text - else - %td.old_line= raw(line.type == "new" ? " " : line.old_pos) - %td.new_line= raw(line.type == "old" ? " " : line.new_pos) + %td.old_line{class: line.type == "new" ? "new" : "old"} + = raw(line.type == "new" ? " " : line.old_pos) + %td.new_line{class: line.type == "new" ? "new" : "old"} + = raw(line.type == "old" ? " " : line.new_pos) %td.line_content{class: "noteable_line #{line.type} #{line_code}", "line_code" => line_code}= raw diff_line_content(line.text) - if line_code == note.line_code -- cgit v1.2.1 From e0d85078ba8b128ba6e0378ebd00a4e12d1e86ed Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Tue, 3 Feb 2015 11:23:59 -0800 Subject: Push can be multiple files. --- app/views/projects/empty.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 36628195b4e..d7dee2208de 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -10,7 +10,7 @@ You can = link_to project_new_blob_path(@project, 'master'), class: 'btn btn-new btn-lg' do add a file -  or push it via command line. +  or do a push via the command line. %h4 %strong Command line instructions -- cgit v1.2.1 From 254a63dcf7dcfe824eb0b7227e2cd63fac027f85 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 3 Feb 2015 13:11:33 -0800 Subject: Improve collapsing sidebar --- app/assets/javascripts/sidebar.js.coffee | 11 +++-- app/assets/stylesheets/sections/nav_sidebar.scss | 62 ++++++++---------------- app/helpers/application_helper.rb | 8 +++ app/views/layouts/_collapse_button.html.haml | 4 +- app/views/layouts/_page.html.haml | 4 +- 5 files changed, 41 insertions(+), 48 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee index d1b165a2311..5013bcdacd0 100644 --- a/app/assets/javascripts/sidebar.js.coffee +++ b/app/assets/javascripts/sidebar.js.coffee @@ -27,10 +27,15 @@ $(window).resize -> $(document).on("click", '.toggle-nav-collapse', (e) -> e.preventDefault() - if $('.page-with-sidebar').hasClass('collapsed') - $('.page-with-sidebar').removeClass('collapsed') + collapsed = 'page-sidebar-collapsed' + expanded = 'page-sidebar-expanded' + + if $('.page-with-sidebar').hasClass(collapsed) + $('.page-with-sidebar').removeClass(collapsed).addClass(expanded) + $('.toggle-nav-collapse i').removeClass('fa-angle-right').addClass('fa-angle-left') $.cookie("collapsed_nav", "false", { path: '/' }) else - $('.page-with-sidebar').addClass('collapsed') + $('.page-with-sidebar').removeClass(expanded).addClass(collapsed) + $('.toggle-nav-collapse i').removeClass('fa-angle-left').addClass('fa-angle-right') $.cookie("collapsed_nav", "true", { path: '/' }) ) diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 0c278aec3f5..b35043821da 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -1,5 +1,3 @@ - - .page-with-sidebar { background: #F5F5F5; @@ -101,16 +99,14 @@ } @mixin expanded-sidebar { - .page-with-sidebar { - padding-left: $sidebar_width; - } + padding-left: $sidebar_width; .sidebar-wrapper { width: $sidebar_width; .nav-sidebar { margin-top: 20px; - position: relative; + position: fixed; top: 45px; width: $sidebar_width; } @@ -122,9 +118,7 @@ } @mixin folded-sidebar { - .page-with-sidebar { - padding-left: 50px; - } + padding-left: 50px; .sidebar-wrapper { width: 52px; @@ -150,47 +144,33 @@ } } -.collapse-nav { - position: relative; - top: 50px; - width: 230px; - text-align: right; - padding-right: 21px; +.collapse-nav a { + position: fixed; + bottom: 15px; + padding: 10px; + background: #DDD; } -.page-with-sidebar.collapsed { - - .collapse-nav { - width: 53px; +@media (max-width: $screen-md-max) { + .page-sidebar-collapsed { + @include folded-sidebar; } - padding-left: 50px; - - .sidebar-wrapper { - width: 52px; - overflow-x: hidden; - - .nav-sidebar { - width: 52px; - } - - .nav-sidebar li a > span { - display: none; - } + .page-sidebar-expanded { + @include folded-sidebar; } -} - -@media (max-width: $screen-md-max) { - @include folded-sidebar; + .collapse-nav { + display: none; + } } @media(min-width: $screen-md-max) { - @include expanded-sidebar; -} + .page-sidebar-collapsed { + @include folded-sidebar; + } -@media (max-width: $screen-md-max) { - .collapse-nav { - display: none; + .page-sidebar-expanded { + @include expanded-sidebar; } } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1fbb44ee442..e45f4650309 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -315,4 +315,12 @@ module ApplicationHelper profile_key_path(key) end end + + def nav_sidebar_class + if nav_menu_collapsed? + "page-sidebar-collapsed" + else + "page-sidebar-expanded" + end + end end diff --git a/app/views/layouts/_collapse_button.html.haml b/app/views/layouts/_collapse_button.html.haml index 52c19f1d99d..b3b338b55bb 100644 --- a/app/views/layouts/_collapse_button.html.haml +++ b/app/views/layouts/_collapse_button.html.haml @@ -1,4 +1,4 @@ - if nav_menu_collapsed? - = link_to icon('plus-square'), '#', class: 'toggle-nav-collapse' + = link_to icon('angle-right'), '#', class: 'toggle-nav-collapse' - else - = link_to icon('minus-square'), '#', class: 'toggle-nav-collapse' + = link_to icon('angle-left'), '#', class: 'toggle-nav-collapse' diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index e20aec89110..98a3d2278a3 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,10 +1,10 @@ - if defined?(sidebar) - .page-with-sidebar{:class => ("collapsed" if nav_menu_collapsed?)} + .page-with-sidebar{ class: nav_sidebar_class } = render "layouts/broadcast" .sidebar-wrapper = render(sidebar) .collapse-nav - = render :partial => 'layouts/collapse_button' + = render partial: 'layouts/collapse_button' .content-wrapper .container-fluid .content -- cgit v1.2.1 From a89d7adfa44767e71cfb9005e5a3eed6a91b4d84 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 3 Feb 2015 13:57:28 -0800 Subject: Rescue connection reset for web hooks --- app/models/hooks/web_hook.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index 327cb585ffa..c8fa9c50918 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -48,7 +48,7 @@ class WebHook < ActiveRecord::Base verify: false, basic_auth: auth) end - rescue SocketError, Errno::ECONNREFUSED, Net::OpenTimeout => e + rescue SocketError, Errno::ECONNRESET, Errno::ECONNREFUSED, Net::OpenTimeout => e logger.error("WebHook Error => #{e}") false end -- cgit v1.2.1 From 7b233ea853df7c13be688c0e47636d2750453f31 Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Tue, 3 Feb 2015 16:55:31 -0800 Subject: Spelling improvement, add in a group, not into group. --- app/views/admin/groups/show.html.haml | 2 +- app/views/groups/_new_group_member.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index 8057de38805..d356aff6365 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -64,7 +64,7 @@ %div.prepend-top-10 = select_tag :access_level, options_for_select(GroupMember.access_level_roles), class: "project-access-select select2" %hr - = button_tag 'Add users into group', class: "btn btn-create" + = button_tag 'Add users to group', class: "btn btn-create" .panel.panel-default .panel-heading %h3.panel-title diff --git a/app/views/groups/_new_group_member.html.haml b/app/views/groups/_new_group_member.html.haml index ed00153de7e..345c0555a36 100644 --- a/app/views/groups/_new_group_member.html.haml +++ b/app/views/groups/_new_group_member.html.haml @@ -12,4 +12,4 @@ %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" .form-actions - = f.submit 'Add users into group', class: "btn btn-create" + = f.submit 'Add users to group', class: "btn btn-create" -- cgit v1.2.1 From f4ce0ddde44c278af9c7a9f198c9893d7db7472d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 4 Feb 2015 15:35:10 +0100 Subject: Show image attachments in browser instead of downloading them. Resolves #1702. --- app/controllers/files_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 7937454810d..9671245d3f4 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -5,7 +5,8 @@ class FilesController < ApplicationController if uploader.file_storage? if can?(current_user, :read_project, note.project) - send_file uploader.file.path, disposition: 'attachment' + disposition = uploader.image? ? 'inline' : 'attachment' + send_file uploader.file.path, disposition: disposition else not_found! end -- cgit v1.2.1 From 0e2fcb68d7d169574391b845df0973575fa41c08 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 4 Feb 2015 15:23:38 -0800 Subject: Disable project path blacklist Because since project always belongs to namespace it dont need such strict restrictions any more --- app/models/project.rb | 1 - 1 file changed, 1 deletion(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index cfe40553ab5..390e1457ca1 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -116,7 +116,6 @@ class Project < ActiveRecord::Base validates :path, presence: true, length: { within: 0..255 }, - exclusion: { in: Gitlab::Blacklist.path }, format: { with: Gitlab::Regex.path_regex, message: Gitlab::Regex.path_regex_message } validates :issues_enabled, :merge_requests_enabled, -- cgit v1.2.1 From ab22caa97e4c1d749f1acfa344c0b1c91eba598b Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Thu, 5 Feb 2015 15:56:28 +0100 Subject: Redirect signup page to signin page. Resolves #1916. --- app/controllers/registrations_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 97aa2d9bdb4..38d116a4ee3 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -1,6 +1,10 @@ class RegistrationsController < Devise::RegistrationsController before_filter :signup_enabled? + def new + redirect_to(new_user_session_path) + end + def destroy current_user.destroy -- cgit v1.2.1 From 9910b7ff99c3d7f89f512c1915ce40ed0c1696e3 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 4 Feb 2015 17:10:39 +0100 Subject: Allow groups to be mentioned. Resolves #1673. --- app/controllers/projects_controller.rb | 2 +- app/models/concerns/mentionable.rb | 9 ++++++--- app/services/projects/participants_service.rb | 11 ++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index ebe48265c63..462ab3d4749 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -102,7 +102,7 @@ class ProjectsController < ApplicationController note_type = params['type'] note_id = params['type_id'] autocomplete = ::Projects::AutocompleteService.new(@project) - participants = ::Projects::ParticipantsService.new(@project).execute(note_type, note_id) + participants = ::Projects::ParticipantsService.new(@project, current_user).execute(note_type, note_id) @suggestions = { emojis: autocomplete_emojis, diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb index 66f83b932d4..d640728519a 100644 --- a/app/models/concerns/mentionable.rb +++ b/app/models/concerns/mentionable.rb @@ -51,9 +51,12 @@ module Mentionable identifier = match.delete "@" if identifier == "all" users.push(*project.team.members.flatten) - else - id = User.find_by(username: identifier).try(:id) - users << User.find(id) unless id.blank? + elsif namespace = Namespace.find_by(path: identifier) + if namespace.type == "Group" + users.push(*namespace.users) + else + users << namespace.owner + end end end users.uniq diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb index e3b33de8d02..0be50fed7cc 100644 --- a/app/services/projects/participants_service.rb +++ b/app/services/projects/participants_service.rb @@ -1,7 +1,8 @@ module Projects class ParticipantsService < BaseService - def initialize(project) - @project = project + def initialize(project, user) + @project = project + @user = user end def execute(note_type, note_id) @@ -12,7 +13,7 @@ module Projects [] end team_members = sorted(@project.team.members) - participants = all_members + team_members + participating + participants = all_members + groups + team_members + participating participants.uniq end @@ -37,6 +38,10 @@ module Projects users.uniq.to_a.compact.sort_by(&:username).map { |user| { username: user.username, name: user.name } } end + def groups + @user.authorized_groups.sort_by(&:path).map { |group| { username: group.path, name: group.name } } + end + def all_members [{ username: "all", name: "Project and Group Members" }] end -- cgit v1.2.1 From 485e55f88c6f2a50f1d88188a015fb1572f8bd94 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Thu, 5 Feb 2015 15:56:58 +0100 Subject: Clean up devise views. --- app/assets/stylesheets/sections/login.scss | 5 ++++ app/views/devise/confirmations/new.html.haml | 7 +++--- app/views/devise/passwords/edit.html.haml | 11 +++++---- app/views/devise/passwords/new.html.haml | 7 +++--- app/views/devise/registrations/new.html.haml | 34 ++++++--------------------- app/views/devise/shared/_signup_box.html.haml | 2 +- 6 files changed, 27 insertions(+), 39 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/login.scss b/app/assets/stylesheets/sections/login.scss index 901733ef9ff..3a3644c12b7 100644 --- a/app/assets/stylesheets/sections/login.scss +++ b/app/assets/stylesheets/sections/login.scss @@ -46,6 +46,10 @@ .login-footer { margin-top: 10px; + + p:last-child { + margin-bottom: 0; + } } a.forgot { @@ -88,6 +92,7 @@ .devise-errors { h2 { + margin-top: 0; font-size: 14px; color: #a00; } diff --git a/app/views/devise/confirmations/new.html.haml b/app/views/devise/confirmations/new.html.haml index 8d17f39eba2..970ba147111 100644 --- a/app/views/devise/confirmations/new.html.haml +++ b/app/views/devise/confirmations/new.html.haml @@ -7,7 +7,8 @@ = devise_error_messages! .clearfix.append-bottom-20 = f.email_field :email, placeholder: 'Email', class: "form-control", required: true - .clearfix.append-bottom-10 + .clearfix = f.submit "Resend confirmation instructions", class: 'btn btn-success' - .login-footer - = render 'devise/shared/sign_in_link' + +.clearfix.prepend-top-20 + = render 'devise/shared/sign_in_link' diff --git a/app/views/devise/passwords/edit.html.haml b/app/views/devise/passwords/edit.html.haml index 1326cc0aac9..0640739b5d7 100644 --- a/app/views/devise/passwords/edit.html.haml +++ b/app/views/devise/passwords/edit.html.haml @@ -10,9 +10,10 @@ = f.password_field :password, class: "form-control top", placeholder: "New password", required: true %div = f.password_field :password_confirmation, class: "form-control bottom", placeholder: "Confirm new password", required: true - .clearfix.append-bottom-10 + .clearfix = f.submit "Change my password", class: "btn btn-primary" - .login-footer - %p - = link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) - = render 'devise/shared/sign_in_link' + +.clearfix.prepend-top-20 + %p + = link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) + = render 'devise/shared/sign_in_link' diff --git a/app/views/devise/passwords/new.html.haml b/app/views/devise/passwords/new.html.haml index b8af1b8693a..e8820daf58f 100644 --- a/app/views/devise/passwords/new.html.haml +++ b/app/views/devise/passwords/new.html.haml @@ -7,7 +7,8 @@ = devise_error_messages! .clearfix.append-bottom-20 = f.email_field :email, placeholder: "Email", class: "form-control", required: true - .clearfix.append-bottom-10 + .clearfix = f.submit "Reset password", class: "btn-primary btn" - .login-footer - = render 'devise/shared/sign_in_link' + +.clearfix.prepend-top-20 + = render 'devise/shared/sign_in_link' diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index d6a952f3dc5..c07e409d583 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -1,27 +1,7 @@ -.login-box - .login-heading - %h3 Sign up - .login-body - = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| - .devise-errors - = devise_error_messages! - %div - = f.text_field :name, class: "form-control top", placeholder: "Name", required: true - %div - = f.text_field :username, class: "form-control middle", placeholder: "Username", required: true - %div - = f.email_field :email, class: "form-control middle", placeholder: "Email", required: true - %div - = f.password_field :password, class: "form-control middle", placeholder: "Password", required: true - %div - = f.password_field :password_confirmation, class: "form-control bottom", placeholder: "Confirm password", required: true - %div - = f.submit "Sign up", class: "btn-create btn" - .login-footer - %p - %span.light - Have an account? - %strong - = link_to "Sign in", new_session_path(resource_name) - %p - = link_to "Forgot your password?", new_password_path(resource_name) += render 'devise/shared/signup_box' + +.clearfix.prepend-top-20 + = render 'devise/shared/sign_in_link' + %p + %span.light Did not receive confirmation email? + = link_to "Send again", new_confirmation_path(resource_name) \ No newline at end of file diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml index 5709c661288..8a6dc19ab64 100644 --- a/app/views/devise/shared/_signup_box.html.haml +++ b/app/views/devise/shared/_signup_box.html.haml @@ -11,7 +11,7 @@ = f.text_field :username, class: "form-control middle", placeholder: "Username", required: true %div = f.email_field :email, class: "form-control middle", placeholder: "Email", required: true - .form-group#password-strength + .form-group.append-bottom-20#password-strength = f.password_field :password, class: "form-control bottom", id: "user_password_sign_up", placeholder: "Password", required: true %div = f.submit "Sign up", class: "btn-create btn" -- cgit v1.2.1 From 58ecb06f74f9aa6af46f7110cb5753e1f30790cd Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Thu, 5 Feb 2015 21:26:57 +0100 Subject: Remove duplicates from group milestone participants list. --- app/models/group_milestone.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb index 33915313789..7e4f16ebf16 100644 --- a/app/models/group_milestone.rb +++ b/app/models/group_milestone.rb @@ -66,15 +66,15 @@ class GroupMilestone end def issues - @group_issues ||= milestones.map { |milestone| milestone.issues }.flatten.group_by(&:state) + @group_issues ||= milestones.map(&:issues).flatten.group_by(&:state) end def merge_requests - @group_merge_requests ||= milestones.map { |milestone| milestone.merge_requests }.flatten.group_by(&:state) + @group_merge_requests ||= milestones.map(&:merge_requests).flatten.group_by(&:state) end def participants - milestones.map { |milestone| milestone.participants.uniq }.reject(&:empty?).flatten + @group_participants ||= milestones.map(&:participants).flatten.compact.uniq end def opened_issues -- cgit v1.2.1 From 5194214e3a2f97accf0c8119b4cb39fd4fcef5db Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Tue, 27 Jan 2015 15:37:19 -0800 Subject: GitLab integration. Importer --- app/assets/images/authbuttons/gitlab_32.png | Bin 0 -> 1039 bytes app/assets/images/authbuttons/gitlab_64.png | Bin 0 -> 3013 bytes app/controllers/github_imports_controller.rb | 80 ---------------------- app/controllers/importers/githubs_controller.rb | 80 ++++++++++++++++++++++ app/controllers/importers/gitlabs_controller.rb | 69 +++++++++++++++++++ app/helpers/oauth_helper.rb | 4 +- app/helpers/projects_helper.rb | 4 ++ app/views/github_imports/create.js.haml | 18 ----- app/views/github_imports/status.html.haml | 63 ----------------- app/views/importers/githubs/create.js.haml | 18 +++++ app/views/importers/githubs/status.html.haml | 63 +++++++++++++++++ app/views/importers/gitlabs/create.js.haml | 18 +++++ app/views/importers/gitlabs/status.html.haml | 63 +++++++++++++++++ app/views/projects/_gitlab_import_modal.html.haml | 22 ++++++ app/views/projects/new.html.haml | 15 +++- app/workers/repository_import_worker.rb | 2 + 16 files changed, 355 insertions(+), 164 deletions(-) create mode 100644 app/assets/images/authbuttons/gitlab_32.png create mode 100644 app/assets/images/authbuttons/gitlab_64.png delete mode 100644 app/controllers/github_imports_controller.rb create mode 100644 app/controllers/importers/githubs_controller.rb create mode 100644 app/controllers/importers/gitlabs_controller.rb delete mode 100644 app/views/github_imports/create.js.haml delete mode 100644 app/views/github_imports/status.html.haml create mode 100644 app/views/importers/githubs/create.js.haml create mode 100644 app/views/importers/githubs/status.html.haml create mode 100644 app/views/importers/gitlabs/create.js.haml create mode 100644 app/views/importers/gitlabs/status.html.haml create mode 100644 app/views/projects/_gitlab_import_modal.html.haml (limited to 'app') diff --git a/app/assets/images/authbuttons/gitlab_32.png b/app/assets/images/authbuttons/gitlab_32.png new file mode 100644 index 00000000000..f3b78cb6efb Binary files /dev/null and b/app/assets/images/authbuttons/gitlab_32.png differ diff --git a/app/assets/images/authbuttons/gitlab_64.png b/app/assets/images/authbuttons/gitlab_64.png new file mode 100644 index 00000000000..ff2945fe89e Binary files /dev/null and b/app/assets/images/authbuttons/gitlab_64.png differ diff --git a/app/controllers/github_imports_controller.rb b/app/controllers/github_imports_controller.rb deleted file mode 100644 index b73e3f7ffac..00000000000 --- a/app/controllers/github_imports_controller.rb +++ /dev/null @@ -1,80 +0,0 @@ -class GithubImportsController < ApplicationController - before_filter :github_auth, except: :callback - - rescue_from Octokit::Unauthorized, with: :github_unauthorized - - def callback - token = client.auth_code.get_token(params[:code]).token - current_user.github_access_token = token - current_user.save - redirect_to status_github_import_url - end - - def status - @repos = octo_client.repos - octo_client.orgs.each do |org| - @repos += octo_client.repos(org.login) - end - - @already_added_projects = current_user.created_projects.where(import_type: "github") - already_added_projects_names = @already_added_projects.pluck(:import_source) - - @repos.reject!{|repo| already_added_projects_names.include? repo.full_name} - end - - def jobs - jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) - render json: jobs - end - - def create - @repo_id = params[:repo_id].to_i - repo = octo_client.repo(@repo_id) - target_namespace = params[:new_namespace].presence || repo.owner.login - existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) - - if existing_namespace - if existing_namespace.owner == current_user - namespace = existing_namespace - else - @already_been_taken = true - @target_namespace = target_namespace - @project_name = repo.name - render and return - end - else - namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) - namespace.add_owner(current_user) - end - - @project = Gitlab::Github::ProjectCreator.new(repo, namespace, current_user).execute - end - - private - - def client - @client ||= Gitlab::Github::Client.new.client - end - - def octo_client - Octokit.auto_paginate = true - @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token) - end - - def github_auth - if current_user.github_access_token.blank? - go_to_github_for_permissions - end - end - - def go_to_github_for_permissions - redirect_to client.auth_code.authorize_url({ - redirect_uri: callback_github_import_url, - scope: "repo, user, user:email" - }) - end - - def github_unauthorized - go_to_github_for_permissions - end -end diff --git a/app/controllers/importers/githubs_controller.rb b/app/controllers/importers/githubs_controller.rb new file mode 100644 index 00000000000..5bb64c4a6ce --- /dev/null +++ b/app/controllers/importers/githubs_controller.rb @@ -0,0 +1,80 @@ +class Importers::GithubsController < ApplicationController + before_filter :github_auth, except: :callback + + rescue_from Octokit::Unauthorized, with: :github_unauthorized + + def callback + token = client.auth_code.get_token(params[:code]).token + current_user.github_access_token = token + current_user.save + redirect_to status_importers_github_url + end + + def status + @repos = octo_client.repos + octo_client.orgs.each do |org| + @repos += octo_client.repos(org.login) + end + + @already_added_projects = current_user.created_projects.where(import_type: "github") + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.reject!{|repo| already_added_projects_names.include? repo.full_name} + end + + def jobs + jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id].to_i + repo = octo_client.repo(@repo_id) + target_namespace = params[:new_namespace].presence || repo.owner.login + existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) + + if existing_namespace + if existing_namespace.owner == current_user + namespace = existing_namespace + else + @already_been_taken = true + @target_namespace = target_namespace + @project_name = repo.name + render and return + end + else + namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) + namespace.add_owner(current_user) + end + + @project = Gitlab::Github::ProjectCreator.new(repo, namespace, current_user).execute + end + + private + + def client + @client ||= Gitlab::Github::Client.new.client + end + + def octo_client + Octokit.auto_paginate = true + @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token) + end + + def github_auth + if current_user.github_access_token.blank? + go_to_github_for_permissions + end + end + + def go_to_github_for_permissions + redirect_to client.auth_code.authorize_url({ + redirect_uri: callback_importers_github_url, + scope: "repo, user, user:email" + }) + end + + def github_unauthorized + go_to_github_for_permissions + end +end diff --git a/app/controllers/importers/gitlabs_controller.rb b/app/controllers/importers/gitlabs_controller.rb new file mode 100644 index 00000000000..d020c870a4f --- /dev/null +++ b/app/controllers/importers/gitlabs_controller.rb @@ -0,0 +1,69 @@ +class Importers::GitlabsController < ApplicationController + before_filter :gitlab_auth, except: :callback + + rescue_from OAuth2::Error, with: :gitlab_unauthorized + + def callback + token = client.get_token(params[:code], callback_importers_gitlab_url) + current_user.gitlab_access_token = token + current_user.save + redirect_to status_importers_gitlab_url + end + + def status + @repos = client.projects + + @already_added_projects = current_user.created_projects.where(import_type: "gitlab") + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.to_a.reject!{|repo| already_added_projects_names.include? repo["path_with_namespace"]} + end + + def jobs + jobs = current_user.created_projects.where(import_type: "gitlab").to_json(:only => [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id].to_i + repo = client.project(@repo_id) + target_namespace = params[:new_namespace].presence || repo["namespace"]["path"] + existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) + + if existing_namespace + if existing_namespace.owner == current_user + namespace = existing_namespace + else + @already_been_taken = true + @target_namespace = target_namespace + @project_name = repo["path"] + render and return + end + else + namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) + namespace.add_owner(current_user) + end + + @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user).execute + end + + private + + def client + @client ||= Gitlab::GitlabImport::Client.new(current_user.gitlab_access_token) + end + + def gitlab_auth + if current_user.gitlab_access_token.blank? + go_to_gitlab_for_permissions + end + end + + def go_to_gitlab_for_permissions + redirect_to client.authorize_url(callback_importers_gitlab_url) + end + + def gitlab_unauthorized + go_to_gitlab_for_permissions + end +end diff --git a/app/helpers/oauth_helper.rb b/app/helpers/oauth_helper.rb index df18db71c84..c7bc9307a58 100644 --- a/app/helpers/oauth_helper.rb +++ b/app/helpers/oauth_helper.rb @@ -4,7 +4,7 @@ module OauthHelper end def default_providers - [:twitter, :github, :google_oauth2, :ldap] + [:twitter, :github, :gitlab, :google_oauth2, :ldap] end def enabled_oauth_providers @@ -13,7 +13,7 @@ module OauthHelper def enabled_social_providers enabled_oauth_providers.select do |name| - [:twitter, :github, :google_oauth2].include?(name.to_sym) + [:twitter, :gitlab, :github, :google_oauth2].include?(name.to_sym) end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 5cec6ae99d8..36463892ebf 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -253,4 +253,8 @@ module ProjectsHelper def github_import_enabled? enabled_oauth_providers.include?(:github) end + + def gitlab_import_enabled? + enabled_oauth_providers.include?(:gitlab) + end end diff --git a/app/views/github_imports/create.js.haml b/app/views/github_imports/create.js.haml deleted file mode 100644 index cd4c9fbf360..00000000000 --- a/app/views/github_imports/create.js.haml +++ /dev/null @@ -1,18 +0,0 @@ -- if @already_been_taken - :plain - target_field = $("tr#repo_#{@repo_id} .import-target") - origin_target = target_field.text() - project_name = "#{@project_name}" - origin_namespace = "#{@target_namespace}" - target_field.empty() - target_field.append("

    This namespace already been taken! Please choose another one

    ") - target_field.append("") - target_field.append("/" + project_name) - target_field.data("project_name", project_name) - target_field.find('input').prop("value", origin_namespace) -- else - :plain - job = $("tr#repo_#{@repo_id}") - job.attr("id", "project_#{@project.id}") - $("table.import-jobs tbody").prepend(job) - job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/github_imports/status.html.haml b/app/views/github_imports/status.html.haml deleted file mode 100644 index 52a1e16cd04..00000000000 --- a/app/views/github_imports/status.html.haml +++ /dev/null @@ -1,63 +0,0 @@ -%h3.page-title - %i.fa.fa-github - Import repositories from GitHub.com - -%p.light - Select projects you want to import. - -%hr -%table.table.import-jobs - %thead - %tr - %th From GitHub - %th To GitLab - %th Status - %tbody - - @already_added_projects.each do |project| - %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td= project.import_source - %td - %strong= link_to project.name_with_namespace, project - %td.job-status - - if project.import_status == 'finished' - %span.cgreen - %i.fa.fa-check - done - - else - = project.human_import_status_name - - - @repos.each do |repo| - %tr{id: "repo_#{repo.id}"} - %td= repo.full_name - %td.import-target - = repo.full_name - %td.import-actions.job-status - = button_tag "Add", class: "btn btn-add-to-import" - - -:coffeescript - $(".btn-add-to-import").click () -> - new_namespace = null - tr = $(this).closest("tr") - id = tr.attr("id").replace("repo_", "") - if tr.find(".import-target input").length > 0 - new_namespace = tr.find(".import-target input").prop("value") - tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) - $.post "#{github_import_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' - - - setInterval (-> - $.get "#{jobs_github_import_path}", (data)-> - $.each data, (i, job) -> - job_item = $("#project_" + job.id) - status_field = job_item.find(".job-status") - - if job.import_status == 'finished' - job_item.removeClass("active").addClass("success") - status_field.html(' done') - else if job.import_status == 'started' - status_field.html(" started") - else - status_field.html(job.import_status) - - ), 4000 diff --git a/app/views/importers/githubs/create.js.haml b/app/views/importers/githubs/create.js.haml new file mode 100644 index 00000000000..cd4c9fbf360 --- /dev/null +++ b/app/views/importers/githubs/create.js.haml @@ -0,0 +1,18 @@ +- if @already_been_taken + :plain + target_field = $("tr#repo_#{@repo_id} .import-target") + origin_target = target_field.text() + project_name = "#{@project_name}" + origin_namespace = "#{@target_namespace}" + target_field.empty() + target_field.append("

    This namespace already been taken! Please choose another one

    ") + target_field.append("") + target_field.append("/" + project_name) + target_field.data("project_name", project_name) + target_field.find('input').prop("value", origin_namespace) +- else + :plain + job = $("tr#repo_#{@repo_id}") + job.attr("id", "project_#{@project.id}") + $("table.import-jobs tbody").prepend(job) + job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/importers/githubs/status.html.haml b/app/views/importers/githubs/status.html.haml new file mode 100644 index 00000000000..1c7e8209e6e --- /dev/null +++ b/app/views/importers/githubs/status.html.haml @@ -0,0 +1,63 @@ +%h3.page-title + %i.fa.fa-github + Import repositories from GitHub.com + +%p.light + Select projects you want to import. + +%hr +%table.table.import-jobs + %thead + %tr + %th From GitHub + %th To GitLab + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td= project.import_source + %td + %strong= link_to project.name_with_namespace, project + %td.job-status + - if project.import_status == 'finished' + %span.cgreen + %i.fa.fa-check + done + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo.id}"} + %td= repo.full_name + %td.import-target + = repo.full_name + %td.import-actions.job-status + = button_tag "Add", class: "btn btn-add-to-import" + + +:coffeescript + $(".btn-add-to-import").click () -> + new_namespace = null + tr = $(this).closest("tr") + id = tr.attr("id").replace("repo_", "") + if tr.find(".import-target input").length > 0 + new_namespace = tr.find(".import-target input").prop("value") + tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) + $.post "#{importers_github_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + + setInterval (-> + $.get "#{jobs_importers_github_path}", (data)-> + $.each data, (i, job) -> + job_item = $("#project_" + job.id) + status_field = job_item.find(".job-status") + + if job.import_status == 'finished' + job_item.removeClass("active").addClass("success") + status_field.html(' done') + else if job.import_status == 'started' + status_field.html(" started") + else + status_field.html(job.import_status) + + ), 4000 diff --git a/app/views/importers/gitlabs/create.js.haml b/app/views/importers/gitlabs/create.js.haml new file mode 100644 index 00000000000..cd4c9fbf360 --- /dev/null +++ b/app/views/importers/gitlabs/create.js.haml @@ -0,0 +1,18 @@ +- if @already_been_taken + :plain + target_field = $("tr#repo_#{@repo_id} .import-target") + origin_target = target_field.text() + project_name = "#{@project_name}" + origin_namespace = "#{@target_namespace}" + target_field.empty() + target_field.append("

    This namespace already been taken! Please choose another one

    ") + target_field.append("") + target_field.append("/" + project_name) + target_field.data("project_name", project_name) + target_field.find('input').prop("value", origin_namespace) +- else + :plain + job = $("tr#repo_#{@repo_id}") + job.attr("id", "project_#{@project.id}") + $("table.import-jobs tbody").prepend(job) + job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/importers/gitlabs/status.html.haml b/app/views/importers/gitlabs/status.html.haml new file mode 100644 index 00000000000..493c938cadb --- /dev/null +++ b/app/views/importers/gitlabs/status.html.haml @@ -0,0 +1,63 @@ +%h3.page-title + %i.fa.fa-github + Import repositories from GitLab.com + +%p.light + Select projects you want to import. + +%hr +%table.table.import-jobs + %thead + %tr + %th From GitLab.com + %th To GitLab private instance + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td= project.import_source + %td + %strong= link_to project.name_with_namespace, project + %td.job-status + - if project.import_status == 'finished' + %span.cgreen + %i.fa.fa-check + done + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo["id"]}"} + %td= repo["path_with_namespace"] + %td.import-target + = repo["path_with_namespace"] + %td.import-actions.job-status + = button_tag "Add", class: "btn btn-add-to-import" + + +:coffeescript + $(".btn-add-to-import").click () -> + new_namespace = null + tr = $(this).closest("tr") + id = tr.attr("id").replace("repo_", "") + if tr.find(".import-target input").length > 0 + new_namespace = tr.find(".import-target input").prop("value") + tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) + $.post "#{importers_gitlab_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + + setInterval (-> + $.get "#{jobs_importers_gitlab_path}", (data)-> + $.each data, (i, job) -> + job_item = $("#project_" + job.id) + status_field = job_item.find(".job-status") + + if job.import_status == 'finished' + job_item.removeClass("active").addClass("success") + status_field.html(' done') + else if job.import_status == 'started' + status_field.html(" started") + else + status_field.html(job.import_status) + + ), 4000 diff --git a/app/views/projects/_gitlab_import_modal.html.haml b/app/views/projects/_gitlab_import_modal.html.haml new file mode 100644 index 00000000000..d402098cbd4 --- /dev/null +++ b/app/views/projects/_gitlab_import_modal.html.haml @@ -0,0 +1,22 @@ +%div#gitlab_import_modal.modal.hide + .modal-dialog + .modal-content + .modal-header + %a.close{href: "#", "data-dismiss" => "modal"} × + %h3 GitLab OAuth import + .modal-body + You need to setup integration with GitLab first. + = link_to 'How to setup integration with GitLab', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/gitlab.md' + + +:javascript + $(function(){ + var import_modal = $('#gitlab_import_modal').modal({modal: true, show:false}); + $('.how_to_import_link').bind("click", function(e){ + e.preventDefault(); + import_modal.show(); + }); + $('.modal-header .close').bind("click", function(){ + import_modal.hide(); + }) + }) diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 3e0f9cbd80b..ae1dd88b696 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -44,7 +44,7 @@ .col-sm-2 .col-sm-10 - if github_import_enabled? - = link_to status_github_import_path do + = link_to status_importers_github_path do %i.fa.fa-github Import projects from GitHub - else @@ -52,6 +52,19 @@ %i.fa.fa-github Import projects from GitHub = render 'github_import_modal' + + .project-import.form-group + .col-sm-2 + .col-sm-10 + - if gitlab_import_enabled? + = link_to status_importers_gitlab_path do + %i.fa.fa-heart + Import projects from GitLab.com + - else + = link_to '#', class: 'how_to_import_link light' do + %i.fa.fa-heart + Import projects from GitLab.com + = render 'gitlab_import_modal' %hr.prepend-botton-10 diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index 0bcc42bc62c..1ceea7ff07f 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -12,6 +12,8 @@ class RepositoryImportWorker if project.import_type == 'github' result_of_data_import = Gitlab::Github::Importer.new(project).execute + elsif project.import_type == 'gitlab' + result_of_data_import = Gitlab::GitlabImport::Importer.new(project).execute else result_of_data_import = true end -- cgit v1.2.1 From 18231b0bb353fffa77b492e4b04fa61c9b3a25bb Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 2 Feb 2015 14:26:29 -0800 Subject: GitLab.com integration: refactoring --- app/controllers/importers/githubs_controller.rb | 4 ++-- app/workers/repository_import_worker.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/importers/githubs_controller.rb b/app/controllers/importers/githubs_controller.rb index 5bb64c4a6ce..b3d42e32dfa 100644 --- a/app/controllers/importers/githubs_controller.rb +++ b/app/controllers/importers/githubs_controller.rb @@ -47,13 +47,13 @@ class Importers::GithubsController < ApplicationController namespace.add_owner(current_user) end - @project = Gitlab::Github::ProjectCreator.new(repo, namespace, current_user).execute + @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user).execute end private def client - @client ||= Gitlab::Github::Client.new.client + @client ||= Gitlab::GithubImport::Client.new.client end def octo_client diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index 1ceea7ff07f..3fb41a528c2 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -11,7 +11,7 @@ class RepositoryImportWorker project.import_url) if project.import_type == 'github' - result_of_data_import = Gitlab::Github::Importer.new(project).execute + result_of_data_import = Gitlab::GithubImport::Importer.new(project).execute elsif project.import_type == 'gitlab' result_of_data_import = Gitlab::GitlabImport::Importer.new(project).execute else -- cgit v1.2.1 From 713bc152bde5396bb95a1555907bcd9a2847839d Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 2 Feb 2015 14:45:03 -0800 Subject: GitLab.com integration: small view fix --- app/views/importers/githubs/status.html.haml | 2 +- app/views/importers/gitlabs/status.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/importers/githubs/status.html.haml b/app/views/importers/githubs/status.html.haml index 1c7e8209e6e..af04ae0d1bf 100644 --- a/app/views/importers/githubs/status.html.haml +++ b/app/views/importers/githubs/status.html.haml @@ -17,7 +17,7 @@ %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td= project.import_source %td - %strong= link_to project.name_with_namespace, project + %strong= link_to project.path_with_namespace, project %td.job-status - if project.import_status == 'finished' %span.cgreen diff --git a/app/views/importers/gitlabs/status.html.haml b/app/views/importers/gitlabs/status.html.haml index 493c938cadb..d2ddd716220 100644 --- a/app/views/importers/gitlabs/status.html.haml +++ b/app/views/importers/gitlabs/status.html.haml @@ -17,7 +17,7 @@ %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} %td= project.import_source %td - %strong= link_to project.name_with_namespace, project + %strong= link_to project.path_with_namespace, project %td.job-status - if project.import_status == 'finished' %span.cgreen -- cgit v1.2.1 From 33349dd54928a0b074b4ae3ebfabf214799fc085 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 2 Feb 2015 17:01:07 -0800 Subject: GitLab.com integration: refactoring --- app/controllers/import/github_controller.rb | 80 +++++++++++++++++++++++++ app/controllers/import/gitlab_controller.rb | 69 +++++++++++++++++++++ app/controllers/importers/githubs_controller.rb | 80 ------------------------- app/controllers/importers/gitlabs_controller.rb | 69 --------------------- app/views/import/github/create.js.haml | 18 ++++++ app/views/import/github/status.html.haml | 63 +++++++++++++++++++ app/views/import/gitlab/create.js.haml | 18 ++++++ app/views/import/gitlab/status.html.haml | 63 +++++++++++++++++++ app/views/importers/githubs/create.js.haml | 18 ------ app/views/importers/githubs/status.html.haml | 63 ------------------- app/views/importers/gitlabs/create.js.haml | 18 ------ app/views/importers/gitlabs/status.html.haml | 63 ------------------- app/views/projects/new.html.haml | 4 +- 13 files changed, 313 insertions(+), 313 deletions(-) create mode 100644 app/controllers/import/github_controller.rb create mode 100644 app/controllers/import/gitlab_controller.rb delete mode 100644 app/controllers/importers/githubs_controller.rb delete mode 100644 app/controllers/importers/gitlabs_controller.rb create mode 100644 app/views/import/github/create.js.haml create mode 100644 app/views/import/github/status.html.haml create mode 100644 app/views/import/gitlab/create.js.haml create mode 100644 app/views/import/gitlab/status.html.haml delete mode 100644 app/views/importers/githubs/create.js.haml delete mode 100644 app/views/importers/githubs/status.html.haml delete mode 100644 app/views/importers/gitlabs/create.js.haml delete mode 100644 app/views/importers/gitlabs/status.html.haml (limited to 'app') diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb new file mode 100644 index 00000000000..3f0461ead51 --- /dev/null +++ b/app/controllers/import/github_controller.rb @@ -0,0 +1,80 @@ +class Import::GithubController < ApplicationController + before_filter :github_auth, except: :callback + + rescue_from Octokit::Unauthorized, with: :github_unauthorized + + def callback + token = client.auth_code.get_token(params[:code]).token + current_user.github_access_token = token + current_user.save + redirect_to status_import_github_url + end + + def status + @repos = octo_client.repos + octo_client.orgs.each do |org| + @repos += octo_client.repos(org.login) + end + + @already_added_projects = current_user.created_projects.where(import_type: "github") + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.reject!{|repo| already_added_projects_names.include? repo.full_name} + end + + def jobs + jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id].to_i + repo = octo_client.repo(@repo_id) + target_namespace = params[:new_namespace].presence || repo.owner.login + existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) + + if existing_namespace + if existing_namespace.owner == current_user + namespace = existing_namespace + else + @already_been_taken = true + @target_namespace = target_namespace + @project_name = repo.name + render and return + end + else + namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) + namespace.add_owner(current_user) + end + + @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user).execute + end + + private + + def client + @client ||= Gitlab::GithubImport::Client.new.client + end + + def octo_client + Octokit.auto_paginate = true + @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token) + end + + def github_auth + if current_user.github_access_token.blank? + go_to_github_for_permissions + end + end + + def go_to_github_for_permissions + redirect_to client.auth_code.authorize_url({ + redirect_uri: callback_import_github_url, + scope: "repo, user, user:email" + }) + end + + def github_unauthorized + go_to_github_for_permissions + end +end diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb new file mode 100644 index 00000000000..3712af6f024 --- /dev/null +++ b/app/controllers/import/gitlab_controller.rb @@ -0,0 +1,69 @@ +class Import::GitlabController < ApplicationController + before_filter :gitlab_auth, except: :callback + + rescue_from OAuth2::Error, with: :gitlab_unauthorized + + def callback + token = client.get_token(params[:code], callback_import_gitlab_url) + current_user.gitlab_access_token = token + current_user.save + redirect_to status_import_gitlab_url + end + + def status + @repos = client.projects + + @already_added_projects = current_user.created_projects.where(import_type: "gitlab") + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.to_a.reject!{|repo| already_added_projects_names.include? repo["path_with_namespace"]} + end + + def jobs + jobs = current_user.created_projects.where(import_type: "gitlab").to_json(:only => [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id].to_i + repo = client.project(@repo_id) + target_namespace = params[:new_namespace].presence || repo["namespace"]["path"] + existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) + + if existing_namespace + if existing_namespace.owner == current_user + namespace = existing_namespace + else + @already_been_taken = true + @target_namespace = target_namespace + @project_name = repo["path"] + render and return + end + else + namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) + namespace.add_owner(current_user) + end + + @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user).execute + end + + private + + def client + @client ||= Gitlab::GitlabImport::Client.new(current_user.gitlab_access_token) + end + + def gitlab_auth + if current_user.gitlab_access_token.blank? + go_to_gitlab_for_permissions + end + end + + def go_to_gitlab_for_permissions + redirect_to client.authorize_url(callback_import_gitlab_url) + end + + def gitlab_unauthorized + go_to_gitlab_for_permissions + end +end diff --git a/app/controllers/importers/githubs_controller.rb b/app/controllers/importers/githubs_controller.rb deleted file mode 100644 index b3d42e32dfa..00000000000 --- a/app/controllers/importers/githubs_controller.rb +++ /dev/null @@ -1,80 +0,0 @@ -class Importers::GithubsController < ApplicationController - before_filter :github_auth, except: :callback - - rescue_from Octokit::Unauthorized, with: :github_unauthorized - - def callback - token = client.auth_code.get_token(params[:code]).token - current_user.github_access_token = token - current_user.save - redirect_to status_importers_github_url - end - - def status - @repos = octo_client.repos - octo_client.orgs.each do |org| - @repos += octo_client.repos(org.login) - end - - @already_added_projects = current_user.created_projects.where(import_type: "github") - already_added_projects_names = @already_added_projects.pluck(:import_source) - - @repos.reject!{|repo| already_added_projects_names.include? repo.full_name} - end - - def jobs - jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) - render json: jobs - end - - def create - @repo_id = params[:repo_id].to_i - repo = octo_client.repo(@repo_id) - target_namespace = params[:new_namespace].presence || repo.owner.login - existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) - - if existing_namespace - if existing_namespace.owner == current_user - namespace = existing_namespace - else - @already_been_taken = true - @target_namespace = target_namespace - @project_name = repo.name - render and return - end - else - namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) - namespace.add_owner(current_user) - end - - @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user).execute - end - - private - - def client - @client ||= Gitlab::GithubImport::Client.new.client - end - - def octo_client - Octokit.auto_paginate = true - @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token) - end - - def github_auth - if current_user.github_access_token.blank? - go_to_github_for_permissions - end - end - - def go_to_github_for_permissions - redirect_to client.auth_code.authorize_url({ - redirect_uri: callback_importers_github_url, - scope: "repo, user, user:email" - }) - end - - def github_unauthorized - go_to_github_for_permissions - end -end diff --git a/app/controllers/importers/gitlabs_controller.rb b/app/controllers/importers/gitlabs_controller.rb deleted file mode 100644 index d020c870a4f..00000000000 --- a/app/controllers/importers/gitlabs_controller.rb +++ /dev/null @@ -1,69 +0,0 @@ -class Importers::GitlabsController < ApplicationController - before_filter :gitlab_auth, except: :callback - - rescue_from OAuth2::Error, with: :gitlab_unauthorized - - def callback - token = client.get_token(params[:code], callback_importers_gitlab_url) - current_user.gitlab_access_token = token - current_user.save - redirect_to status_importers_gitlab_url - end - - def status - @repos = client.projects - - @already_added_projects = current_user.created_projects.where(import_type: "gitlab") - already_added_projects_names = @already_added_projects.pluck(:import_source) - - @repos.to_a.reject!{|repo| already_added_projects_names.include? repo["path_with_namespace"]} - end - - def jobs - jobs = current_user.created_projects.where(import_type: "gitlab").to_json(:only => [:id, :import_status]) - render json: jobs - end - - def create - @repo_id = params[:repo_id].to_i - repo = client.project(@repo_id) - target_namespace = params[:new_namespace].presence || repo["namespace"]["path"] - existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) - - if existing_namespace - if existing_namespace.owner == current_user - namespace = existing_namespace - else - @already_been_taken = true - @target_namespace = target_namespace - @project_name = repo["path"] - render and return - end - else - namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) - namespace.add_owner(current_user) - end - - @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user).execute - end - - private - - def client - @client ||= Gitlab::GitlabImport::Client.new(current_user.gitlab_access_token) - end - - def gitlab_auth - if current_user.gitlab_access_token.blank? - go_to_gitlab_for_permissions - end - end - - def go_to_gitlab_for_permissions - redirect_to client.authorize_url(callback_importers_gitlab_url) - end - - def gitlab_unauthorized - go_to_gitlab_for_permissions - end -end diff --git a/app/views/import/github/create.js.haml b/app/views/import/github/create.js.haml new file mode 100644 index 00000000000..cd4c9fbf360 --- /dev/null +++ b/app/views/import/github/create.js.haml @@ -0,0 +1,18 @@ +- if @already_been_taken + :plain + target_field = $("tr#repo_#{@repo_id} .import-target") + origin_target = target_field.text() + project_name = "#{@project_name}" + origin_namespace = "#{@target_namespace}" + target_field.empty() + target_field.append("

    This namespace already been taken! Please choose another one

    ") + target_field.append("") + target_field.append("/" + project_name) + target_field.data("project_name", project_name) + target_field.find('input').prop("value", origin_namespace) +- else + :plain + job = $("tr#repo_#{@repo_id}") + job.attr("id", "project_#{@project.id}") + $("table.import-jobs tbody").prepend(job) + job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml new file mode 100644 index 00000000000..9797f5983ea --- /dev/null +++ b/app/views/import/github/status.html.haml @@ -0,0 +1,63 @@ +%h3.page-title + %i.fa.fa-github + Import repositories from GitHub.com + +%p.light + Select projects you want to import. + +%hr +%table.table.import-jobs + %thead + %tr + %th From GitHub + %th To GitLab + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td= project.import_source + %td + %strong= link_to project.path_with_namespace, project + %td.job-status + - if project.import_status == 'finished' + %span.cgreen + %i.fa.fa-check + done + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo.id}"} + %td= repo.full_name + %td.import-target + = repo.full_name + %td.import-actions.job-status + = button_tag "Add", class: "btn btn-add-to-import" + + +:coffeescript + $(".btn-add-to-import").click () -> + new_namespace = null + tr = $(this).closest("tr") + id = tr.attr("id").replace("repo_", "") + if tr.find(".import-target input").length > 0 + new_namespace = tr.find(".import-target input").prop("value") + tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) + $.post "#{import_github_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + + setInterval (-> + $.get "#{jobs_import_github_path}", (data)-> + $.each data, (i, job) -> + job_item = $("#project_" + job.id) + status_field = job_item.find(".job-status") + + if job.import_status == 'finished' + job_item.removeClass("active").addClass("success") + status_field.html(' done') + else if job.import_status == 'started' + status_field.html(" started") + else + status_field.html(job.import_status) + + ), 4000 diff --git a/app/views/import/gitlab/create.js.haml b/app/views/import/gitlab/create.js.haml new file mode 100644 index 00000000000..cd4c9fbf360 --- /dev/null +++ b/app/views/import/gitlab/create.js.haml @@ -0,0 +1,18 @@ +- if @already_been_taken + :plain + target_field = $("tr#repo_#{@repo_id} .import-target") + origin_target = target_field.text() + project_name = "#{@project_name}" + origin_namespace = "#{@target_namespace}" + target_field.empty() + target_field.append("

    This namespace already been taken! Please choose another one

    ") + target_field.append("") + target_field.append("/" + project_name) + target_field.data("project_name", project_name) + target_field.find('input').prop("value", origin_namespace) +- else + :plain + job = $("tr#repo_#{@repo_id}") + job.attr("id", "project_#{@project.id}") + $("table.import-jobs tbody").prepend(job) + job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml new file mode 100644 index 00000000000..ff0ab189c0b --- /dev/null +++ b/app/views/import/gitlab/status.html.haml @@ -0,0 +1,63 @@ +%h3.page-title + %i.fa.fa-github + Import repositories from GitLab.com + +%p.light + Select projects you want to import. + +%hr +%table.table.import-jobs + %thead + %tr + %th From GitLab.com + %th To GitLab private instance + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td= project.import_source + %td + %strong= link_to project.path_with_namespace, project + %td.job-status + - if project.import_status == 'finished' + %span.cgreen + %i.fa.fa-check + done + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo["id"]}"} + %td= repo["path_with_namespace"] + %td.import-target + = repo["path_with_namespace"] + %td.import-actions.job-status + = button_tag "Add", class: "btn btn-add-to-import" + + +:coffeescript + $(".btn-add-to-import").click () -> + new_namespace = null + tr = $(this).closest("tr") + id = tr.attr("id").replace("repo_", "") + if tr.find(".import-target input").length > 0 + new_namespace = tr.find(".import-target input").prop("value") + tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) + $.post "#{import_gitlab_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + + setInterval (-> + $.get "#{jobs_import_gitlab_path}", (data)-> + $.each data, (i, job) -> + job_item = $("#project_" + job.id) + status_field = job_item.find(".job-status") + + if job.import_status == 'finished' + job_item.removeClass("active").addClass("success") + status_field.html(' done') + else if job.import_status == 'started' + status_field.html(" started") + else + status_field.html(job.import_status) + + ), 4000 diff --git a/app/views/importers/githubs/create.js.haml b/app/views/importers/githubs/create.js.haml deleted file mode 100644 index cd4c9fbf360..00000000000 --- a/app/views/importers/githubs/create.js.haml +++ /dev/null @@ -1,18 +0,0 @@ -- if @already_been_taken - :plain - target_field = $("tr#repo_#{@repo_id} .import-target") - origin_target = target_field.text() - project_name = "#{@project_name}" - origin_namespace = "#{@target_namespace}" - target_field.empty() - target_field.append("

    This namespace already been taken! Please choose another one

    ") - target_field.append("") - target_field.append("/" + project_name) - target_field.data("project_name", project_name) - target_field.find('input').prop("value", origin_namespace) -- else - :plain - job = $("tr#repo_#{@repo_id}") - job.attr("id", "project_#{@project.id}") - $("table.import-jobs tbody").prepend(job) - job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/importers/githubs/status.html.haml b/app/views/importers/githubs/status.html.haml deleted file mode 100644 index af04ae0d1bf..00000000000 --- a/app/views/importers/githubs/status.html.haml +++ /dev/null @@ -1,63 +0,0 @@ -%h3.page-title - %i.fa.fa-github - Import repositories from GitHub.com - -%p.light - Select projects you want to import. - -%hr -%table.table.import-jobs - %thead - %tr - %th From GitHub - %th To GitLab - %th Status - %tbody - - @already_added_projects.each do |project| - %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td= project.import_source - %td - %strong= link_to project.path_with_namespace, project - %td.job-status - - if project.import_status == 'finished' - %span.cgreen - %i.fa.fa-check - done - - else - = project.human_import_status_name - - - @repos.each do |repo| - %tr{id: "repo_#{repo.id}"} - %td= repo.full_name - %td.import-target - = repo.full_name - %td.import-actions.job-status - = button_tag "Add", class: "btn btn-add-to-import" - - -:coffeescript - $(".btn-add-to-import").click () -> - new_namespace = null - tr = $(this).closest("tr") - id = tr.attr("id").replace("repo_", "") - if tr.find(".import-target input").length > 0 - new_namespace = tr.find(".import-target input").prop("value") - tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) - $.post "#{importers_github_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' - - - setInterval (-> - $.get "#{jobs_importers_github_path}", (data)-> - $.each data, (i, job) -> - job_item = $("#project_" + job.id) - status_field = job_item.find(".job-status") - - if job.import_status == 'finished' - job_item.removeClass("active").addClass("success") - status_field.html(' done') - else if job.import_status == 'started' - status_field.html(" started") - else - status_field.html(job.import_status) - - ), 4000 diff --git a/app/views/importers/gitlabs/create.js.haml b/app/views/importers/gitlabs/create.js.haml deleted file mode 100644 index cd4c9fbf360..00000000000 --- a/app/views/importers/gitlabs/create.js.haml +++ /dev/null @@ -1,18 +0,0 @@ -- if @already_been_taken - :plain - target_field = $("tr#repo_#{@repo_id} .import-target") - origin_target = target_field.text() - project_name = "#{@project_name}" - origin_namespace = "#{@target_namespace}" - target_field.empty() - target_field.append("

    This namespace already been taken! Please choose another one

    ") - target_field.append("") - target_field.append("/" + project_name) - target_field.data("project_name", project_name) - target_field.find('input').prop("value", origin_namespace) -- else - :plain - job = $("tr#repo_#{@repo_id}") - job.attr("id", "project_#{@project.id}") - $("table.import-jobs tbody").prepend(job) - job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/importers/gitlabs/status.html.haml b/app/views/importers/gitlabs/status.html.haml deleted file mode 100644 index d2ddd716220..00000000000 --- a/app/views/importers/gitlabs/status.html.haml +++ /dev/null @@ -1,63 +0,0 @@ -%h3.page-title - %i.fa.fa-github - Import repositories from GitLab.com - -%p.light - Select projects you want to import. - -%hr -%table.table.import-jobs - %thead - %tr - %th From GitLab.com - %th To GitLab private instance - %th Status - %tbody - - @already_added_projects.each do |project| - %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td= project.import_source - %td - %strong= link_to project.path_with_namespace, project - %td.job-status - - if project.import_status == 'finished' - %span.cgreen - %i.fa.fa-check - done - - else - = project.human_import_status_name - - - @repos.each do |repo| - %tr{id: "repo_#{repo["id"]}"} - %td= repo["path_with_namespace"] - %td.import-target - = repo["path_with_namespace"] - %td.import-actions.job-status - = button_tag "Add", class: "btn btn-add-to-import" - - -:coffeescript - $(".btn-add-to-import").click () -> - new_namespace = null - tr = $(this).closest("tr") - id = tr.attr("id").replace("repo_", "") - if tr.find(".import-target input").length > 0 - new_namespace = tr.find(".import-target input").prop("value") - tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) - $.post "#{importers_gitlab_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' - - - setInterval (-> - $.get "#{jobs_importers_gitlab_path}", (data)-> - $.each data, (i, job) -> - job_item = $("#project_" + job.id) - status_field = job_item.find(".job-status") - - if job.import_status == 'finished' - job_item.removeClass("active").addClass("success") - status_field.html(' done') - else if job.import_status == 'started' - status_field.html(" started") - else - status_field.html(job.import_status) - - ), 4000 diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index ae1dd88b696..713370e3bfe 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -44,7 +44,7 @@ .col-sm-2 .col-sm-10 - if github_import_enabled? - = link_to status_importers_github_path do + = link_to status_import_github_path do %i.fa.fa-github Import projects from GitHub - else @@ -57,7 +57,7 @@ .col-sm-2 .col-sm-10 - if gitlab_import_enabled? - = link_to status_importers_gitlab_path do + = link_to status_import_gitlab_path do %i.fa.fa-heart Import projects from GitLab.com - else -- cgit v1.2.1 From 592ed8738cccd68ced1c2fbf58d0ff16d66e8d14 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 2 Feb 2015 18:25:33 -0800 Subject: Gitlab.com integration: code folding --- app/controllers/import/github_controller.rb | 2 +- app/controllers/import/gitlab_controller.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index 3f0461ead51..08419a37476 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -19,7 +19,7 @@ class Import::GithubController < ApplicationController @already_added_projects = current_user.created_projects.where(import_type: "github") already_added_projects_names = @already_added_projects.pluck(:import_source) - @repos.reject!{|repo| already_added_projects_names.include? repo.full_name} + @repos.reject!{ |repo| already_added_projects_names.include? repo.full_name } end def jobs diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb index 3712af6f024..448fe6417be 100644 --- a/app/controllers/import/gitlab_controller.rb +++ b/app/controllers/import/gitlab_controller.rb @@ -16,11 +16,11 @@ class Import::GitlabController < ApplicationController @already_added_projects = current_user.created_projects.where(import_type: "gitlab") already_added_projects_names = @already_added_projects.pluck(:import_source) - @repos.to_a.reject!{|repo| already_added_projects_names.include? repo["path_with_namespace"]} + @repos.to_a.reject!{ |repo| already_added_projects_names.include? repo["path_with_namespace"] } end def jobs - jobs = current_user.created_projects.where(import_type: "gitlab").to_json(:only => [:id, :import_status]) + jobs = current_user.created_projects.where(import_type: "gitlab").to_json(only: [:id, :import_status]) render json: jobs end -- cgit v1.2.1 From 71668312c42426ed23e46c9a79f93e329f2b6625 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Thu, 5 Feb 2015 21:56:25 +0100 Subject: Submit comment on command-enter. Fixes #1869. --- app/assets/javascripts/notes.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index ac1353b8bb6..15597060c6b 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -59,7 +59,7 @@ class @Notes @notes_forms = '.js-main-target-form textarea, .js-discussion-note-form textarea' $(document).on('keypress', @notes_forms, (e)-> - if e.keyCode == 10 || (e.ctrlKey && e.keyCode == 13) + if e.keyCode == 10 || ((e.metaKey || e.ctrlKey) && e.keyCode == 13) $(@).parents('form').submit() ) -- cgit v1.2.1 From 62ed1c537e9b8aa85d354b377f18083fb71b8e05 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 14:20:55 -0800 Subject: Explicitly define ordering in models using default_scope --- app/controllers/admin/dashboard_controller.rb | 6 ++--- app/controllers/admin/groups_controller.rb | 2 +- app/controllers/admin/users_controller.rb | 4 ++-- app/controllers/profiles/keys_controller.rb | 2 +- app/models/broadcast_message.rb | 2 ++ app/models/concerns/internal_id.rb | 1 + app/models/concerns/sortable.rb | 32 +++++++++++++++++++++++++++ app/models/email.rb | 2 ++ app/models/event.rb | 1 + app/models/hooks/web_hook.rb | 1 + app/models/identity.rb | 1 + app/models/key.rb | 1 + app/models/label.rb | 2 ++ app/models/member.rb | 1 + app/models/merge_request_diff.rb | 2 ++ app/models/namespace.rb | 1 + app/models/note.rb | 1 + app/models/project.rb | 11 +++++---- app/models/service.rb | 1 + app/models/snippet.rb | 1 + app/models/user.rb | 6 ++--- 21 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 app/models/concerns/sortable.rb (limited to 'app') diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index be19139c9b1..c491e5c7550 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -1,7 +1,7 @@ class Admin::DashboardController < Admin::ApplicationController def index - @projects = Project.order("created_at DESC").limit(10) - @users = User.order("created_at DESC").limit(10) - @groups = Group.order("created_at DESC").limit(10) + @projects = Project.limit(10) + @users = User.limit(10) + @groups = Group.limit(10) end end diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 8c7d90a5d9f..ae610d4871c 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -2,7 +2,7 @@ class Admin::GroupsController < Admin::ApplicationController before_filter :group, only: [:edit, :show, :update, :destroy, :project_update, :project_teams_update] def index - @groups = Group.order('name ASC') + @groups = Group.order_name @groups = @groups.search(params[:name]) if params[:name].present? @groups = @groups.page(params[:page]).per(20) end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index aea8545d38e..932bfc777e6 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -5,13 +5,13 @@ class Admin::UsersController < Admin::ApplicationController @users = User.filter(params[:filter]) @users = @users.search(params[:name]) if params[:name].present? @users = @users.sort(@sort = params[:sort]) - @users = @users.alphabetically.page(params[:page]) + @users = @users.order_name.page(params[:page]) end def show @personal_projects = user.personal_projects @joined_projects = user.projects.joined(@user) - @keys = user.keys.order('id DESC') + @keys = user.keys end def new diff --git a/app/controllers/profiles/keys_controller.rb b/app/controllers/profiles/keys_controller.rb index 88414b13564..4e2bd0a9b4b 100644 --- a/app/controllers/profiles/keys_controller.rb +++ b/app/controllers/profiles/keys_controller.rb @@ -3,7 +3,7 @@ class Profiles::KeysController < ApplicationController skip_before_filter :authenticate_user!, only: [:get_keys] def index - @keys = current_user.keys.order('id DESC') + @keys = current_user.keys end def show diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb index 4d0c04bcc3d..05f5e979695 100644 --- a/app/models/broadcast_message.rb +++ b/app/models/broadcast_message.rb @@ -14,6 +14,8 @@ # class BroadcastMessage < ActiveRecord::Base + include Sortable + validates :message, presence: true validates :starts_at, presence: true validates :ends_at, presence: true diff --git a/app/models/concerns/internal_id.rb b/app/models/concerns/internal_id.rb index 821ed54fb98..e86357e3dee 100644 --- a/app/models/concerns/internal_id.rb +++ b/app/models/concerns/internal_id.rb @@ -1,5 +1,6 @@ module InternalId extend ActiveSupport::Concern + include Sortable included do validate :set_iid, on: :create diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb new file mode 100644 index 00000000000..49001cabc7c --- /dev/null +++ b/app/models/concerns/sortable.rb @@ -0,0 +1,32 @@ +# == Sortable concern +# +# Set default scope for ordering objects +# +module Sortable + extend ActiveSupport::Concern + + included do + # By default all models should be ordered + # by created_at field starting from newest + default_scope { order(created_at: :desc, id: :desc) } + scope :order_name, -> { reorder(name: :asc) } + scope :order_recent, -> { reorder(created_at: :desc, id: :desc) } + scope :order_oldest, -> { reorder(created_at: :asc, id: :asc) } + scope :order_recent_updated, -> { reorder(updated_at: :desc, id: :desc) } + scope :order_oldest_updated, -> { reorder(updated_at: :asc, id: :asc) } + end + + module ClassMethods + def sort(method) + case method.to_s + when 'name' then order_name_asc + when 'recent' then order_recent + when 'oldest' then order_oldest + when 'recent_updated' then order_recent_updated + when 'oldest_updated' then order_oldest_updated + else + self + end + end + end +end diff --git a/app/models/email.rb b/app/models/email.rb index 57f476bd519..556b0e9586e 100644 --- a/app/models/email.rb +++ b/app/models/email.rb @@ -10,6 +10,8 @@ # class Email < ActiveRecord::Base + include Sortable + belongs_to :user validates :user_id, presence: true diff --git a/app/models/event.rb b/app/models/event.rb index 2a6c690ab91..9a42d380f87 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -15,6 +15,7 @@ # class Event < ActiveRecord::Base + include Sortable default_scope { where.not(author_id: nil) } CREATED = 1 diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index c8fa9c50918..defef7216f2 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -16,6 +16,7 @@ # class WebHook < ActiveRecord::Base + include Sortable include HTTParty default_value_for :push_events, true diff --git a/app/models/identity.rb b/app/models/identity.rb index 80e0e3a8a23..b2c3792d1ce 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -9,6 +9,7 @@ # class Identity < ActiveRecord::Base + include Sortable belongs_to :user validates :extern_uid, allow_blank: true, uniqueness: { scope: :provider } diff --git a/app/models/key.rb b/app/models/key.rb index d2d1af68822..e2e59296eed 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -15,6 +15,7 @@ require 'digest/md5' class Key < ActiveRecord::Base + include Sortable include Gitlab::Popen belongs_to :user diff --git a/app/models/label.rb b/app/models/label.rb index 2b2b02e0645..c8f6a7cd48c 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -11,6 +11,8 @@ # class Label < ActiveRecord::Base + include Sortable + DEFAULT_COLOR = '#428BCA' belongs_to :project diff --git a/app/models/member.rb b/app/models/member.rb index 671ef466baa..fe3d2f40e87 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -14,6 +14,7 @@ # class Member < ActiveRecord::Base + include Sortable include Notifiable include Gitlab::Access diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index a71122d5e07..acac1ca4cf7 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -14,6 +14,8 @@ require Rails.root.join("app/models/commit") class MergeRequestDiff < ActiveRecord::Base + include Sortable + # Prevent store of diff # if commits amount more then 200 COMMITS_SAFE_SIZE = 200 diff --git a/app/models/namespace.rb b/app/models/namespace.rb index e7fd3024750..ba0b2b71cf9 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -14,6 +14,7 @@ # class Namespace < ActiveRecord::Base + include Sortable include Gitlab::ShellAdapter has_many :projects, dependent: :destroy diff --git a/app/models/note.rb b/app/models/note.rb index 0b988cc3e0f..a3f2980cebd 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -23,6 +23,7 @@ require 'file_size_validator' class Note < ActiveRecord::Base include Mentionable + default_scope { order(created_at: :asc, id: :asc) } default_value_for :system, false attr_mentionable :note diff --git a/app/models/project.rb b/app/models/project.rb index 390e1457ca1..246479624ee 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -33,6 +33,7 @@ require 'carrierwave/orm/activerecord' require 'file_size_validator' class Project < ActiveRecord::Base + include Sortable include Gitlab::ShellAdapter include Gitlab::VisibilityLevel include Gitlab::ConfigHelper @@ -53,7 +54,7 @@ class Project < ActiveRecord::Base attr_accessor :new_default_branch # Relations - belongs_to :creator, foreign_key: 'creator_id', class_name: 'User' + belongs_to :creator, foreign_key: 'creator_id', class_name: 'User' belongs_to :group, -> { where(type: Group) }, foreign_key: 'namespace_id' belongs_to :namespace @@ -86,7 +87,7 @@ class Project < ActiveRecord::Base has_many :merge_requests, dependent: :destroy, foreign_key: 'target_project_id' # Merge requests from source project should be kept when source project was removed has_many :fork_merge_requests, foreign_key: 'source_project_id', class_name: MergeRequest - has_many :issues, -> { order 'issues.state DESC, issues.created_at DESC' }, dependent: :destroy + has_many :issues, dependent: :destroy has_many :labels, dependent: :destroy has_many :services, dependent: :destroy has_many :events, dependent: :destroy @@ -139,14 +140,16 @@ class Project < ActiveRecord::Base mount_uploader :avatar, AttachmentUploader # Scopes + scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') } + scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } + scope :sorted_by_names, -> { joins(:namespace).reorder('namespaces.name ASC, projects.name ASC') } + scope :without_user, ->(user) { where('projects.id NOT IN (:ids)', ids: user.authorized_projects.map(&:id) ) } scope :without_team, ->(team) { team.projects.present? ? where('projects.id NOT IN (:ids)', ids: team.projects.map(&:id)) : scoped } scope :not_in_group, ->(group) { where('projects.id NOT IN (:ids)', ids: group.project_ids ) } scope :in_team, ->(team) { where('projects.id IN (:ids)', ids: team.projects.map(&:id)) } scope :in_namespace, ->(namespace) { where(namespace_id: namespace.id) } scope :in_group_namespace, -> { joins(:group) } - scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') } - scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } scope :personal, ->(user) { where(namespace_id: user.namespace_id) } scope :joined, ->(user) { where('namespace_id != ?', user.namespace_id) } scope :public_only, -> { where(visibility_level: Project::PUBLIC) } diff --git a/app/models/service.rb b/app/models/service.rb index 15948e63e41..caabe8e971d 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -15,6 +15,7 @@ # To add new service you should build a class inherited from Service # and implement a set of methods class Service < ActiveRecord::Base + include Sortable serialize :properties, JSON default_value_for :active, false diff --git a/app/models/snippet.rb b/app/models/snippet.rb index a3222d29892..82c1ab94446 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -16,6 +16,7 @@ # class Snippet < ActiveRecord::Base + include Sortable include Linguist::BlobHelper include Gitlab::VisibilityLevel diff --git a/app/models/user.rb b/app/models/user.rb index 552a37c9533..41c52440320 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -49,6 +49,7 @@ require 'carrierwave/orm/activerecord' require 'file_size_validator' class User < ActiveRecord::Base + include Sortable include Gitlab::ConfigHelper include TokenAuthenticatable extend Gitlab::ConfigHelper @@ -176,7 +177,6 @@ class User < ActiveRecord::Base scope :admins, -> { where(admin: true) } scope :blocked, -> { with_state(:blocked) } scope :active, -> { with_state(:active) } - scope :alphabetically, -> { order('name ASC') } scope :in_team, ->(team){ where(id: team.member_ids) } scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) } scope :not_in_project, ->(project) { project.users.present? ? where("id not in (:ids)", ids: project.users.map(&:id) ) : all } @@ -290,7 +290,7 @@ class User < ActiveRecord::Base def authorized_groups @authorized_groups ||= begin group_ids = (groups.pluck(:id) + authorized_projects.pluck(:namespace_id)) - Group.where(id: group_ids).order('namespaces.name ASC') + Group.where(id: group_ids) end end @@ -301,7 +301,7 @@ class User < ActiveRecord::Base project_ids = personal_projects.pluck(:id) project_ids.push(*groups_projects.pluck(:id)) project_ids.push(*projects.pluck(:id).uniq) - Project.where(id: project_ids).joins(:namespace).order('namespaces.name ASC') + Project.where(id: project_ids) end end -- cgit v1.2.1 From daa1796cf9bbdeb88a5b472c6bac34676fe8d8a9 Mon Sep 17 00:00:00 2001 From: Cameron Tacklind Date: Thu, 5 Feb 2015 14:25:40 -0800 Subject: Be less restrictive on key comment extraction --- app/views/profiles/keys/new.html.haml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/profiles/keys/new.html.haml b/app/views/profiles/keys/new.html.haml index c02b47b0ad5..ccec716d0c6 100644 --- a/app/views/profiles/keys/new.html.haml +++ b/app/views/profiles/keys/new.html.haml @@ -8,9 +8,9 @@ $('#key_key').on('focusout', function(){ var title = $('#key_title'), val = $('#key_key').val(), - key_mail = val.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+|\.[a-zA-Z0-9._-]+)/gi); + comment = val.match(/^\S+ \S+ (.+)$/); - if( key_mail && key_mail.length > 0 && title.val() == '' ){ - $('#key_title').val( key_mail ); + if( comment && comment.length > 1 && title.val() == '' ){ + $('#key_title').val( comment[1] ); } }); -- cgit v1.2.1 From e0aa5c371ea1c633a0648f13cd7bea35f3aea75c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 16:49:41 -0800 Subject: Fix method overlap for issue sorting --- app/models/concerns/internal_id.rb | 1 - app/models/concerns/sortable.rb | 4 ++-- app/models/issue.rb | 1 + app/models/merge_request.rb | 1 + app/models/milestone.rb | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/concerns/internal_id.rb b/app/models/concerns/internal_id.rb index e86357e3dee..821ed54fb98 100644 --- a/app/models/concerns/internal_id.rb +++ b/app/models/concerns/internal_id.rb @@ -1,6 +1,5 @@ module InternalId extend ActiveSupport::Concern - include Sortable included do validate :set_iid, on: :create diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index 49001cabc7c..dc46b2e5463 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -17,7 +17,7 @@ module Sortable end module ClassMethods - def sort(method) + def order_by(method) case method.to_s when 'name' then order_name_asc when 'recent' then order_recent @@ -25,7 +25,7 @@ module Sortable when 'recent_updated' then order_recent_updated when 'oldest_updated' then order_oldest_updated else - self + all end end end diff --git a/app/models/issue.rb b/app/models/issue.rb index 8a9e969248c..19e43ebd788 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -24,6 +24,7 @@ class Issue < ActiveRecord::Base include Issuable include InternalId include Taskable + include Sortable ActsAsTaggableOn.strict_case_match = true diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index ad2e8d7879b..f758126cfeb 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -28,6 +28,7 @@ class MergeRequest < ActiveRecord::Base include Issuable include Taskable include InternalId + include Sortable belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project" belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project" diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 8fd3e56d2ee..9bbb2bafb98 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -15,6 +15,7 @@ class Milestone < ActiveRecord::Base include InternalId + include Sortable belongs_to :project has_many :issues -- cgit v1.2.1 From 1ac20698a5122111c8e12de4cc59da837b0f9573 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 5 Feb 2015 10:31:36 -0800 Subject: gitlab.com importer: refactorig --- app/assets/javascripts/importer_status.js.coffee | 31 +++++++++++++++++++++++ app/controllers/import/base_controller.rb | 21 +++++++++++++++ app/controllers/import/github_controller.rb | 22 ++++------------ app/controllers/import/gitlab_controller.rb | 20 +++------------ app/views/import/base/create.js.haml | 18 +++++++++++++ app/views/import/github/create.js.haml | 18 ------------- app/views/import/github/status.html.haml | 28 ++------------------ app/views/import/gitlab/create.js.haml | 18 ------------- app/views/import/gitlab/status.html.haml | 28 ++------------------ app/views/projects/_github_import_modal.html.haml | 15 +---------- app/views/projects/_gitlab_import_modal.html.haml | 15 +---------- app/views/projects/new.html.haml | 8 ++++++ app/workers/repository_import_worker.rb | 14 +++++----- 13 files changed, 100 insertions(+), 156 deletions(-) create mode 100644 app/assets/javascripts/importer_status.js.coffee create mode 100644 app/controllers/import/base_controller.rb create mode 100644 app/views/import/base/create.js.haml delete mode 100644 app/views/import/github/create.js.haml delete mode 100644 app/views/import/gitlab/create.js.haml (limited to 'app') diff --git a/app/assets/javascripts/importer_status.js.coffee b/app/assets/javascripts/importer_status.js.coffee new file mode 100644 index 00000000000..268efd7c832 --- /dev/null +++ b/app/assets/javascripts/importer_status.js.coffee @@ -0,0 +1,31 @@ +class @ImporterStatus + constructor: (@jobs_url, @import_url) -> + this.initStatusPage() + this.setAutoUpdate() + + initStatusPage: -> + $(".btn-add-to-import").click (event) => + new_namespace = null + tr = $(event.currentTarget).closest("tr") + id = tr.attr("id").replace("repo_", "") + if tr.find(".import-target input").length > 0 + new_namespace = tr.find(".import-target input").prop("value") + tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) + $.post @import_url, {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + setAutoUpdate: -> + setInterval (=> + $.get @jobs_url, (data) => + $.each data, (i, job) => + job_item = $("#project_" + job.id) + status_field = job_item.find(".job-status") + + if job.import_status == 'finished' + job_item.removeClass("active").addClass("success") + status_field.html(' done') + else if job.import_status == 'started' + status_field.html(" started") + else + status_field.html(job.import_status) + + ), 4000 \ No newline at end of file diff --git a/app/controllers/import/base_controller.rb b/app/controllers/import/base_controller.rb new file mode 100644 index 00000000000..4df171dbcfe --- /dev/null +++ b/app/controllers/import/base_controller.rb @@ -0,0 +1,21 @@ +class Import::BaseController < ApplicationController + + private + + def get_or_create_namespace + existing_namespace = Namespace.find_by("path = ? OR name = ?", @target_namespace, @target_namespace) + + if existing_namespace + if existing_namespace.owner == current_user + namespace = existing_namespace + else + @already_been_taken = true + return false + end + else + namespace = Group.create(name: @target_namespace, path: @target_namespace, owner: current_user) + namespace.add_owner(current_user) + namespace + end + end +end diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index 08419a37476..108fc4396a6 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -1,4 +1,4 @@ -class Import::GithubController < ApplicationController +class Import::GithubController < Import::BaseController before_filter :github_auth, except: :callback rescue_from Octokit::Unauthorized, with: :github_unauthorized @@ -30,22 +30,10 @@ class Import::GithubController < ApplicationController def create @repo_id = params[:repo_id].to_i repo = octo_client.repo(@repo_id) - target_namespace = params[:new_namespace].presence || repo.owner.login - existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) - - if existing_namespace - if existing_namespace.owner == current_user - namespace = existing_namespace - else - @already_been_taken = true - @target_namespace = target_namespace - @project_name = repo.name - render and return - end - else - namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) - namespace.add_owner(current_user) - end + @target_namespace = params[:new_namespace].presence || repo.owner.login + @project_name = repo.name + + namespace = get_or_create_namespace || (render and return) @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user).execute end diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb index 448fe6417be..a51ea36aff8 100644 --- a/app/controllers/import/gitlab_controller.rb +++ b/app/controllers/import/gitlab_controller.rb @@ -1,4 +1,4 @@ -class Import::GitlabController < ApplicationController +class Import::GitlabController < Import::BaseController before_filter :gitlab_auth, except: :callback rescue_from OAuth2::Error, with: :gitlab_unauthorized @@ -27,22 +27,10 @@ class Import::GitlabController < ApplicationController def create @repo_id = params[:repo_id].to_i repo = client.project(@repo_id) - target_namespace = params[:new_namespace].presence || repo["namespace"]["path"] - existing_namespace = Namespace.find_by("path = ? OR name = ?", target_namespace, target_namespace) + @target_namespace = params[:new_namespace].presence || repo["namespace"]["path"] + @project_name = repo["name"] - if existing_namespace - if existing_namespace.owner == current_user - namespace = existing_namespace - else - @already_been_taken = true - @target_namespace = target_namespace - @project_name = repo["path"] - render and return - end - else - namespace = Group.create(name: target_namespace, path: target_namespace, owner: current_user) - namespace.add_owner(current_user) - end + namespace = get_or_create_namespace || (render and return) @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user).execute end diff --git a/app/views/import/base/create.js.haml b/app/views/import/base/create.js.haml new file mode 100644 index 00000000000..cd4c9fbf360 --- /dev/null +++ b/app/views/import/base/create.js.haml @@ -0,0 +1,18 @@ +- if @already_been_taken + :plain + target_field = $("tr#repo_#{@repo_id} .import-target") + origin_target = target_field.text() + project_name = "#{@project_name}" + origin_namespace = "#{@target_namespace}" + target_field.empty() + target_field.append("

    This namespace already been taken! Please choose another one

    ") + target_field.append("") + target_field.append("/" + project_name) + target_field.data("project_name", project_name) + target_field.find('input').prop("value", origin_namespace) +- else + :plain + job = $("tr#repo_#{@repo_id}") + job.attr("id", "project_#{@project.id}") + $("table.import-jobs tbody").prepend(job) + job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/github/create.js.haml b/app/views/import/github/create.js.haml deleted file mode 100644 index cd4c9fbf360..00000000000 --- a/app/views/import/github/create.js.haml +++ /dev/null @@ -1,18 +0,0 @@ -- if @already_been_taken - :plain - target_field = $("tr#repo_#{@repo_id} .import-target") - origin_target = target_field.text() - project_name = "#{@project_name}" - origin_namespace = "#{@target_namespace}" - target_field.empty() - target_field.append("

    This namespace already been taken! Please choose another one

    ") - target_field.append("") - target_field.append("/" + project_name) - target_field.data("project_name", project_name) - target_field.find('input').prop("value", origin_namespace) -- else - :plain - job = $("tr#repo_#{@repo_id}") - job.attr("id", "project_#{@project.id}") - $("table.import-jobs tbody").prepend(job) - job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 9797f5983ea..1676c3c26ae 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -34,30 +34,6 @@ %td.import-actions.job-status = button_tag "Add", class: "btn btn-add-to-import" - :coffeescript - $(".btn-add-to-import").click () -> - new_namespace = null - tr = $(this).closest("tr") - id = tr.attr("id").replace("repo_", "") - if tr.find(".import-target input").length > 0 - new_namespace = tr.find(".import-target input").prop("value") - tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) - $.post "#{import_github_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' - - - setInterval (-> - $.get "#{jobs_import_github_path}", (data)-> - $.each data, (i, job) -> - job_item = $("#project_" + job.id) - status_field = job_item.find(".job-status") - - if job.import_status == 'finished' - job_item.removeClass("active").addClass("success") - status_field.html(' done') - else if job.import_status == 'started' - status_field.html(" started") - else - status_field.html(job.import_status) - - ), 4000 + $ -> + new ImporterStatus("#{jobs_import_github_path}", "#{import_github_path}") diff --git a/app/views/import/gitlab/create.js.haml b/app/views/import/gitlab/create.js.haml deleted file mode 100644 index cd4c9fbf360..00000000000 --- a/app/views/import/gitlab/create.js.haml +++ /dev/null @@ -1,18 +0,0 @@ -- if @already_been_taken - :plain - target_field = $("tr#repo_#{@repo_id} .import-target") - origin_target = target_field.text() - project_name = "#{@project_name}" - origin_namespace = "#{@target_namespace}" - target_field.empty() - target_field.append("

    This namespace already been taken! Please choose another one

    ") - target_field.append("") - target_field.append("/" + project_name) - target_field.data("project_name", project_name) - target_field.find('input').prop("value", origin_namespace) -- else - :plain - job = $("tr#repo_#{@repo_id}") - job.attr("id", "project_#{@project.id}") - $("table.import-jobs tbody").prepend(job) - job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml index ff0ab189c0b..9aedacef04b 100644 --- a/app/views/import/gitlab/status.html.haml +++ b/app/views/import/gitlab/status.html.haml @@ -34,30 +34,6 @@ %td.import-actions.job-status = button_tag "Add", class: "btn btn-add-to-import" - :coffeescript - $(".btn-add-to-import").click () -> - new_namespace = null - tr = $(this).closest("tr") - id = tr.attr("id").replace("repo_", "") - if tr.find(".import-target input").length > 0 - new_namespace = tr.find(".import-target input").prop("value") - tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) - $.post "#{import_gitlab_url}", {repo_id: id, new_namespace: new_namespace}, dataType: 'script' - - - setInterval (-> - $.get "#{jobs_import_gitlab_path}", (data)-> - $.each data, (i, job) -> - job_item = $("#project_" + job.id) - status_field = job_item.find(".job-status") - - if job.import_status == 'finished' - job_item.removeClass("active").addClass("success") - status_field.html(' done') - else if job.import_status == 'started' - status_field.html(" started") - else - status_field.html(job.import_status) - - ), 4000 + $ -> + new ImporterStatus("#{jobs_import_gitlab_path}", "#{import_gitlab_url}") diff --git a/app/views/projects/_github_import_modal.html.haml b/app/views/projects/_github_import_modal.html.haml index 02c9ef45f2b..99325e66119 100644 --- a/app/views/projects/_github_import_modal.html.haml +++ b/app/views/projects/_github_import_modal.html.haml @@ -6,17 +6,4 @@ %h3 GitHub OAuth import .modal-body You need to setup integration with GitHub first. - = link_to 'How to setup integration with GitHub', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/github.md' - - -:javascript - $(function(){ - var import_modal = $('#github_import_modal').modal({modal: true, show:false}); - $('.how_to_import_link').bind("click", function(e){ - e.preventDefault(); - import_modal.show(); - }); - $('.modal-header .close').bind("click", function(){ - import_modal.hide(); - }) - }) + = link_to 'How to setup integration with GitHub', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/github.md' \ No newline at end of file diff --git a/app/views/projects/_gitlab_import_modal.html.haml b/app/views/projects/_gitlab_import_modal.html.haml index d402098cbd4..e7503f023b1 100644 --- a/app/views/projects/_gitlab_import_modal.html.haml +++ b/app/views/projects/_gitlab_import_modal.html.haml @@ -6,17 +6,4 @@ %h3 GitLab OAuth import .modal-body You need to setup integration with GitLab first. - = link_to 'How to setup integration with GitLab', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/gitlab.md' - - -:javascript - $(function(){ - var import_modal = $('#gitlab_import_modal').modal({modal: true, show:false}); - $('.how_to_import_link').bind("click", function(e){ - e.preventDefault(); - import_modal.show(); - }); - $('.modal-header .close').bind("click", function(){ - import_modal.hide(); - }) - }) + = link_to 'How to setup integration with GitLab', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/gitlab.md' \ No newline at end of file diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 713370e3bfe..61f6a66c386 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -92,3 +92,11 @@ %i.fa.fa-spinner.fa-spin Creating project & repository. %p Please wait a moment, this page will automatically refresh when ready. + +:coffeescript + $ -> + $('.how_to_import_link').bind 'click', (e) -> + e.preventDefault() + import_modal = $(this).parent().find(".modal").show() + $('.modal-header .close').bind 'click', -> + $(".modal").hide() \ No newline at end of file diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index 3fb41a528c2..5f9970d3795 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -10,13 +10,13 @@ class RepositoryImportWorker project.path_with_namespace, project.import_url) - if project.import_type == 'github' - result_of_data_import = Gitlab::GithubImport::Importer.new(project).execute - elsif project.import_type == 'gitlab' - result_of_data_import = Gitlab::GitlabImport::Importer.new(project).execute - else - result_of_data_import = true - end + result_of_data_import = if project.import_type == 'github' + Gitlab::GithubImport::Importer.new(project).execute + elsif project.import_type == 'gitlab' + Gitlab::GitlabImport::Importer.new(project).execute + else + true + end if result && result_of_data_import project.import_finish -- cgit v1.2.1 From bbca6a0abd9f5559fe4abbf2cb2100a0e4717ac8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 19:15:05 -0800 Subject: Refactor sorting in project --- app/controllers/admin/groups_controller.rb | 3 +- app/controllers/admin/users_controller.rb | 4 +- app/controllers/application_controller.rb | 4 +- app/controllers/dashboard_controller.rb | 2 +- app/helpers/sorting_helper.rb | 79 ++++++++++++++++++++++++++ app/models/concerns/issuable.rb | 10 +--- app/models/concerns/sortable.rb | 25 ++++---- app/models/group.rb | 26 ++++----- app/models/project.rb | 11 ++-- app/models/user.rb | 9 ++- app/views/admin/groups/index.html.haml | 21 +++++++ app/views/admin/projects/index.html.haml | 18 +++--- app/views/admin/users/index.html.haml | 24 ++++---- app/views/dashboard/_projects_filter.html.haml | 16 +++--- app/views/explore/groups/index.html.haml | 15 +++-- app/views/explore/projects/index.html.haml | 14 ++--- app/views/shared/_sort_dropdown.html.haml | 20 +++---- 17 files changed, 194 insertions(+), 107 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index ae610d4871c..65dc027c8eb 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -2,7 +2,8 @@ class Admin::GroupsController < Admin::ApplicationController before_filter :group, only: [:edit, :show, :update, :destroy, :project_update, :project_teams_update] def index - @groups = Group.order_name + @groups = Group.all + @groups = @groups.sort(@sort = params[:sort]) @groups = @groups.search(params[:name]) if params[:name].present? @groups = @groups.page(params[:page]).per(20) end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 932bfc777e6..e5d15528d78 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -2,10 +2,10 @@ class Admin::UsersController < Admin::ApplicationController before_filter :user, only: [:show, :edit, :update, :destroy] def index - @users = User.filter(params[:filter]) + @users = User.order_name_asc.filter(params[:filter]) @users = @users.search(params[:name]) if params[:name].present? @users = @users.sort(@sort = params[:sort]) - @users = @users.order_name.page(params[:page]) + @users = @users.page(params[:page]) end def show diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 36e13706768..6553027b430 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -254,7 +254,7 @@ class ApplicationController < ActionController::Base end def set_filters_params - params[:sort] ||= 'newest' + params[:sort] ||= 'created_desc' params[:scope] = 'all' if params[:scope].blank? params[:state] = 'opened' if params[:state].blank? @@ -280,7 +280,7 @@ class ApplicationController < ActionController::Base author_id = @filter_params[:author_id] milestone_id = @filter_params[:milestone_id] - @sort = @filter_params[:sort].try(:humanize) + @sort = @filter_params[:sort] @assignees = User.where(id: collection.pluck(:assignee_id)) @authors = User.where(id: collection.pluck(:author_id)) @milestones = Milestone.where(id: collection.pluck(:milestone_id)) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index cd876024ba3..9e59264e418 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -9,7 +9,7 @@ class DashboardController < ApplicationController # If user needs more - point to Dashboard#projects page @projects_limit = 30 - @groups = current_user.authorized_groups.sort_by(&:human_name) + @groups = current_user.authorized_groups.order_name_asc @has_authorized_projects = @projects.count > 0 @projects_count = @projects.count @projects = @projects.limit(@projects_limit) diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb index 492e065b713..bb12d43f397 100644 --- a/app/helpers/sorting_helper.rb +++ b/app/helpers/sorting_helper.rb @@ -1,4 +1,19 @@ module SortingHelper + def sort_options_hash + { + sort_value_name => sort_title_name, + sort_value_recently_updated => sort_title_recently_updated, + sort_value_oldest_updated => sort_title_oldest_updated, + sort_value_recently_created => sort_title_recently_created, + sort_value_oldest_created => sort_title_oldest_created, + sort_value_milestone_soon => sort_title_milestone_soon, + sort_value_milestone_later => sort_title_milestone_later, + sort_value_largest_repo => sort_title_largest_repo, + sort_value_recently_signin => sort_title_recently_signin, + sort_value_oldest_signin => sort_title_oldest_signin, + } + end + def sort_title_oldest_updated 'Oldest updated' end @@ -14,4 +29,68 @@ module SortingHelper def sort_title_recently_created 'Recently created' end + + def sort_title_milestone_soon + 'Milestone due soon' + end + + def sort_title_milestone_later + 'Milestone due later' + end + + def sort_title_name + 'Name' + end + + def sort_title_largest_repo + 'Largest repository' + end + + def sort_title_recently_signin + 'Recent sign in' + end + + def sort_title_oldest_signin + 'Oldest sign in' + end + + def sort_value_oldest_updated + 'updated_asc' + end + + def sort_value_recently_updated + 'updated_desc' + end + + def sort_value_oldest_created + 'created_asc' + end + + def sort_value_recently_created + 'created_desc' + end + + def sort_value_milestone_soon + 'milestone_due_asc' + end + + def sort_value_milestone_later + 'milestone_due_desc' + end + + def sort_value_name + 'name_asc' + end + + def sort_value_largest_repo + 'repository_size_desc' + end + + def sort_value_recently_signin + 'recent_sign_in' + end + + def sort_value_oldest_signin + 'oldest_sign_in' + end end diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index fb038a3cc3f..9bc0dfb3574 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -54,15 +54,7 @@ module Issuable end def sort(method) - case method.to_s - when 'newest' then reorder("#{table_name}.created_at DESC") - when 'oldest' then reorder("#{table_name}.created_at ASC") - when 'recently_updated' then reorder("#{table_name}.updated_at DESC") - when 'last_updated' then reorder("#{table_name}.updated_at ASC") - when 'milestone_due_soon' then joins(:milestone).reorder("milestones.due_date ASC") - when 'milestone_due_later' then joins(:milestone).reorder("milestones.due_date DESC") - else reorder("#{table_name}.created_at DESC") - end + order_by(method) end end diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index dc46b2e5463..c894dbda6ef 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -9,21 +9,26 @@ module Sortable # By default all models should be ordered # by created_at field starting from newest default_scope { order(created_at: :desc, id: :desc) } - scope :order_name, -> { reorder(name: :asc) } - scope :order_recent, -> { reorder(created_at: :desc, id: :desc) } - scope :order_oldest, -> { reorder(created_at: :asc, id: :asc) } - scope :order_recent_updated, -> { reorder(updated_at: :desc, id: :desc) } - scope :order_oldest_updated, -> { reorder(updated_at: :asc, id: :asc) } + + scope :order_name_asc, -> { reorder(name: :asc) } + scope :order_created_desc, -> { reorder(created_at: :desc, id: :desc) } + scope :order_created_asc, -> { reorder(created_at: :asc, id: :asc) } + scope :order_updated_desc, -> { reorder(updated_at: :desc, id: :desc) } + scope :order_updated_asc, -> { reorder(updated_at: :asc, id: :asc) } + scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } + scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } end module ClassMethods def order_by(method) case method.to_s - when 'name' then order_name_asc - when 'recent' then order_recent - when 'oldest' then order_oldest - when 'recent_updated' then order_recent_updated - when 'oldest_updated' then order_oldest_updated + when 'name_asc' then order_name_asc + when 'updated_asc' then order_updated_asc + when 'updated_desc' then order_updated_desc + when 'created_asc' then order_created_asc + when 'created_desc' then order_created_desc + when 'milestone_due_asc' then order_milestone_due_asc + when 'milestone_due_desc' then order_milestone_due_desc else all end diff --git a/app/models/group.rb b/app/models/group.rb index 042b79a7850..d6ec0be6081 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -28,6 +28,16 @@ class Group < Namespace after_create :post_create_hook after_destroy :post_destroy_hook + class << self + def search(query) + where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%") + end + + def sort(method) + order_by(method) + end + end + def human_name name end @@ -88,20 +98,4 @@ class Group < Namespace def system_hook_service SystemHooksService.new end - - class << self - def search(query) - where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%") - end - - def sort(method) - case method.to_s - when "newest" then reorder("namespaces.created_at DESC") - when "oldest" then reorder("namespaces.created_at ASC") - when "recently_updated" then reorder("namespaces.updated_at DESC") - when "last_updated" then reorder("namespaces.updated_at ASC") - else reorder("namespaces.path, namespaces.name ASC") - end - end - end end diff --git a/app/models/project.rb b/app/models/project.rb index 246479624ee..a793e21f12d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -231,13 +231,10 @@ class Project < ActiveRecord::Base end def sort(method) - case method.to_s - when 'newest' then reorder('projects.created_at DESC') - when 'oldest' then reorder('projects.created_at ASC') - when 'recently_updated' then reorder('projects.updated_at DESC') - when 'last_updated' then reorder('projects.updated_at ASC') - when 'largest_repository' then reorder('projects.repository_size DESC') - else reorder('namespaces.path, projects.name ASC') + if method == 'repository_size_desc' + reorder(repository_size: :desc, id: :desc) + else + order_by(method) end end end diff --git a/app/models/user.rb b/app/models/user.rb index 41c52440320..ba61ecf3981 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,11 +199,10 @@ class User < ActiveRecord::Base def sort(method) case method.to_s - when 'recent_sign_in' then reorder('users.last_sign_in_at DESC') - when 'oldest_sign_in' then reorder('users.last_sign_in_at ASC') - when 'recently_created' then reorder('users.created_at DESC') - when 'late_created' then reorder('users.created_at ASC') - else reorder("users.name ASC") + when 'recent_sign_in' then reorder(last_sign_in_at: :desc) + when 'oldest_sign_in' then reorder(last_sign_in_at: :asc) + else + order_by(method) end end diff --git a/app/views/admin/groups/index.html.haml b/app/views/admin/groups/index.html.haml index 1d7fef43184..8ae9a1edea9 100644 --- a/app/views/admin/groups/index.html.haml +++ b/app/views/admin/groups/index.html.haml @@ -8,10 +8,31 @@ %hr = form_tag admin_groups_path, method: :get, class: 'form-inline' do + = hidden_field_tag :sort, @sort .form-group = text_field_tag :name, params[:name], class: "form-control input-mn-300" = button_tag "Search", class: "btn submit btn-primary" + .pull-right + .dropdown.inline + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %span.light sort: + - if @sort.present? + = sort_options_hash[@sort] + - else + = sort_title_recently_created + %b.caret + %ul.dropdown-menu + %li + = link_to admin_groups_path(sort: sort_value_recently_created) do + = sort_title_recently_created + = link_to admin_groups_path(sort: sort_value_oldest_created) do + = sort_title_oldest_created + = link_to admin_groups_path(sort: sort_value_recently_updated) do + = sort_title_recently_updated + = link_to admin_groups_path(sort: sort_value_oldest_updated) do + = sort_title_oldest_updated + %hr %ul.bordered-list diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index aa59f38d213..36a4a2fb4af 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -47,24 +47,22 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to admin_projects_path(sort: nil) do - Name - = link_to admin_projects_path(sort: 'newest') do + = link_to admin_projects_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to admin_projects_path(sort: 'oldest') do + = link_to admin_projects_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to admin_projects_path(sort: 'recently_updated') do + = link_to admin_projects_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to admin_projects_path(sort: 'last_updated') do + = link_to admin_projects_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated - = link_to admin_projects_path(sort: 'largest_repository') do - Largest repository + = link_to admin_projects_path(sort: sort_value_largest_repo) do + = sort_title_largest_repo = link_to 'New Project', new_project_path, class: "btn btn-new" %ul.well-list - @projects.each do |project| diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 8e1ecb41a85..6e15cec467b 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -36,22 +36,26 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_name %b.caret %ul.dropdown-menu %li - = link_to admin_users_path(sort: nil) do - Name - = link_to admin_users_path(sort: 'recent_sign_in') do - Recent sign in - = link_to admin_users_path(sort: 'oldest_sign_in') do - Oldest sign in - = link_to admin_users_path(sort: 'recently_created') do + = link_to admin_users_path(sort: sort_value_name) do + = sort_title_name + = link_to admin_users_path(sort: sort_value_recently_signin) do + = sort_title_recently_signin + = link_to admin_users_path(sort: sort_value_oldest_signin) do + = sort_title_oldest_signin + = link_to admin_users_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to admin_users_path(sort: 'late_created') do + = link_to admin_users_path(sort: sort_value_oldest_created) do = sort_title_oldest_created + = link_to admin_users_path(sort: sort_value_recently_updated) do + = sort_title_recently_updated + = link_to admin_users_path(sort: sort_value_oldest_updated) do + = sort_title_oldest_updated = link_to 'New User', new_admin_user_path, class: "btn btn-new" %ul.well-list diff --git a/app/views/dashboard/_projects_filter.html.haml b/app/views/dashboard/_projects_filter.html.haml index 0e990ccfab4..7b5d46072e3 100644 --- a/app/views/dashboard/_projects_filter.html.haml +++ b/app/views/dashboard/_projects_filter.html.haml @@ -82,19 +82,19 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to projects_dashboard_filter_path(sort: nil) do - Name - = link_to projects_dashboard_filter_path(sort: 'newest') do + = link_to projects_dashboard_filter_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to projects_dashboard_filter_path(sort: 'oldest') do + = link_to projects_dashboard_filter_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to projects_dashboard_filter_path(sort: 'recently_updated') do + = link_to projects_dashboard_filter_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to projects_dashboard_filter_path(sort: 'last_updated') do + = link_to projects_dashboard_filter_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated + = link_to projects_dashboard_filter_path(sort: sort_value_name) do + = sort_title_name diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index 9b1d7d0416d..5cf514927af 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -1,6 +1,7 @@ .clearfix .pull-left = form_tag explore_groups_path, method: :get, class: 'form-inline form-tiny' do |f| + = hidden_field_tag :sort, @sort .form-group = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input input-mn-300", id: "groups_search" .form-group @@ -11,21 +12,19 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to explore_groups_path(sort: nil) do - Name - = link_to explore_groups_path(sort: 'newest') do + = link_to explore_groups_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to explore_groups_path(sort: 'oldest') do + = link_to explore_groups_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to explore_groups_path(sort: 'recently_updated') do + = link_to explore_groups_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to explore_groups_path(sort: 'last_updated') do + = link_to explore_groups_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated %hr diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml index 02586077d8c..02d02912791 100644 --- a/app/views/explore/projects/index.html.haml +++ b/app/views/explore/projects/index.html.haml @@ -11,21 +11,19 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to explore_projects_path(sort: nil) do - Name - = link_to explore_projects_path(sort: 'newest') do + = link_to explore_projects_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to explore_projects_path(sort: 'oldest') do + = link_to explore_projects_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to explore_projects_path(sort: 'recently_updated') do + = link_to explore_projects_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to explore_projects_path(sort: 'last_updated') do + = link_to explore_projects_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated %hr diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml index 3e6a62380f3..ba14c8643cd 100644 --- a/app/views/shared/_sort_dropdown.html.haml +++ b/app/views/shared/_sort_dropdown.html.haml @@ -2,21 +2,21 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort + = sort_options_hash[@sort] - else - Newest + = sort_title_recently_created %b.caret %ul.dropdown-menu.dropdown-menu-align-right %li - = link_to page_filter_path(sort: 'newest') do + = link_to page_filter_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to page_filter_path(sort: 'oldest') do + = link_to page_filter_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to page_filter_path(sort: 'recently_updated') do + = link_to page_filter_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to page_filter_path(sort: 'last_updated') do + = link_to page_filter_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated - = link_to page_filter_path(sort: 'milestone_due_soon') do - Milestone due soon - = link_to page_filter_path(sort: 'milestone_due_later') do - Milestone due later + = link_to page_filter_path(sort: sort_value_milestone_soon) do + = sort_title_milestone_soon + = link_to page_filter_path(sort: sort_value_milestone_later) do + = sort_title_milestone_later -- cgit v1.2.1 From c5be267e40c0ba05c2a7de6a71d154f1b5161160 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 20:21:21 -0800 Subject: Refactor issuable sorting a bit --- app/models/concerns/issuable.rb | 9 ++++++++- app/models/concerns/sortable.rb | 11 ++++++----- app/models/project.rb | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 9bc0dfb3574..f5e23e9dc2d 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -29,6 +29,8 @@ module Issuable scope :only_opened, -> { with_state(:opened) } scope :only_reopened, -> { with_state(:reopened) } scope :closed, -> { with_state(:closed) } + scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } + scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } delegate :name, :email, @@ -54,7 +56,12 @@ module Issuable end def sort(method) - order_by(method) + case method.to_s + when 'milestone_due_asc' then order_milestone_due_asc + when 'milestone_due_desc' then order_milestone_due_desc + else + order_by(method) + end end end diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index c894dbda6ef..cca1ee08fe8 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -10,25 +10,26 @@ module Sortable # by created_at field starting from newest default_scope { order(created_at: :desc, id: :desc) } - scope :order_name_asc, -> { reorder(name: :asc) } scope :order_created_desc, -> { reorder(created_at: :desc, id: :desc) } scope :order_created_asc, -> { reorder(created_at: :asc, id: :asc) } scope :order_updated_desc, -> { reorder(updated_at: :desc, id: :desc) } scope :order_updated_asc, -> { reorder(updated_at: :asc, id: :asc) } - scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } - scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } + + if column_names.include?('name') + scope :order_name_asc, -> { reorder(name: :asc) } + scope :order_name_desc, -> { reorder(name: :desc) } + end end module ClassMethods def order_by(method) case method.to_s when 'name_asc' then order_name_asc + when 'name_desc' then order_name_desc when 'updated_asc' then order_updated_asc when 'updated_desc' then order_updated_desc when 'created_asc' then order_created_asc when 'created_desc' then order_created_desc - when 'milestone_due_asc' then order_milestone_due_asc - when 'milestone_due_desc' then order_milestone_due_desc else all end diff --git a/app/models/project.rb b/app/models/project.rb index a793e21f12d..a9ead7830ab 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -140,7 +140,7 @@ class Project < ActiveRecord::Base mount_uploader :avatar, AttachmentUploader # Scopes - scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') } + scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) } scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } scope :sorted_by_names, -> { joins(:namespace).reorder('namespaces.name ASC, projects.name ASC') } -- cgit v1.2.1 From 8952fc015fae476a20051c01cf4217d82d30c83d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 20:29:41 -0800 Subject: Apply default scope to labels and remove one for notes --- app/controllers/projects/commits_controller.rb | 2 +- app/controllers/projects/labels_controller.rb | 2 +- app/controllers/projects/merge_requests_controller.rb | 2 +- app/finders/notes_finder.rb | 3 ++- app/models/label.rb | 4 +--- app/models/note.rb | 1 - app/views/shared/_issuable_filter.html.haml | 2 +- 7 files changed, 7 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb index 0a85c36a758..b133afe44b5 100644 --- a/app/controllers/projects/commits_controller.rb +++ b/app/controllers/projects/commits_controller.rb @@ -13,7 +13,7 @@ class Projects::CommitsController < Projects::ApplicationController @commits = @repo.commits(@ref, @path, @limit, @offset) @note_counts = Note.where(commit_id: @commits.map(&:id)). - group(:commit_id).count + group(:commit_id).count respond_to do |format| format.html diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 6c7bde9c5d5..b61fef3b627 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -7,7 +7,7 @@ class Projects::LabelsController < Projects::ApplicationController respond_to :js, :html def index - @labels = @project.labels.order_by_name.page(params[:page]).per(20) + @labels = @project.labels.page(params[:page]).per(20) end def new diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 912f9eb5b6b..01be318ede2 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -23,7 +23,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController def show @note_counts = Note.where(commit_id: @merge_request.commits.map(&:id)). - group(:commit_id).count + group(:commit_id).count respond_to do |format| format.html diff --git a/app/finders/notes_finder.rb b/app/finders/notes_finder.rb index 6fe15b41060..e2bd0a2560e 100644 --- a/app/finders/notes_finder.rb +++ b/app/finders/notes_finder.rb @@ -22,6 +22,7 @@ class NotesFinder end # Use overlapping intervals to avoid worrying about race conditions - notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP) + notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP). + order(created_at: :asc, id: :asc) end end diff --git a/app/models/label.rb b/app/models/label.rb index c8f6a7cd48c..9d7099c5652 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -11,8 +11,6 @@ # class Label < ActiveRecord::Base - include Sortable - DEFAULT_COLOR = '#428BCA' belongs_to :project @@ -30,7 +28,7 @@ class Label < ActiveRecord::Base format: { with: /\A[^&\?,&]+\z/ }, uniqueness: { scope: :project_id } - scope :order_by_name, -> { reorder("labels.title ASC") } + default_scope { order(title: :asc) } alias_attribute :name, :title diff --git a/app/models/note.rb b/app/models/note.rb index a3f2980cebd..0b988cc3e0f 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -23,7 +23,6 @@ require 'file_size_validator' class Note < ActiveRecord::Base include Mentionable - default_scope { order(created_at: :asc, id: :asc) } default_value_for :system, false attr_mentionable :note diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml index 4f683258fac..cd97481bb6c 100644 --- a/app/views/shared/_issuable_filter.html.haml +++ b/app/views/shared/_issuable_filter.html.haml @@ -98,7 +98,7 @@ = link_to page_filter_path(label_name: nil) do Any - if @project.labels.any? - - @project.labels.order_by_name.each do |label| + - @project.labels.each do |label| %li = link_to page_filter_path(label_name: label.name) do = render_colored_label(label) -- cgit v1.2.1 From b3c90dd51418d0c41df4ccd57d9480ea44b35eec Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 5 Feb 2015 16:57:27 -0800 Subject: GitHub importer refactoring --- app/controllers/import/github_controller.rb | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index 108fc4396a6..c869c7c86f3 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -4,16 +4,16 @@ class Import::GithubController < Import::BaseController rescue_from Octokit::Unauthorized, with: :github_unauthorized def callback - token = client.auth_code.get_token(params[:code]).token + token = client.get_token(params[:code]) current_user.github_access_token = token current_user.save redirect_to status_import_github_url end def status - @repos = octo_client.repos - octo_client.orgs.each do |org| - @repos += octo_client.repos(org.login) + @repos = client.repos + client.orgs.each do |org| + @repos += client.repos(org.login) end @already_added_projects = current_user.created_projects.where(import_type: "github") @@ -29,7 +29,7 @@ class Import::GithubController < Import::BaseController def create @repo_id = params[:repo_id].to_i - repo = octo_client.repo(@repo_id) + repo = client.repo(@repo_id) @target_namespace = params[:new_namespace].presence || repo.owner.login @project_name = repo.name @@ -41,12 +41,7 @@ class Import::GithubController < Import::BaseController private def client - @client ||= Gitlab::GithubImport::Client.new.client - end - - def octo_client - Octokit.auto_paginate = true - @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token) + @client ||= Gitlab::GithubImport::Client.new(current_user.github_access_token) end def github_auth @@ -56,10 +51,7 @@ class Import::GithubController < Import::BaseController end def go_to_github_for_permissions - redirect_to client.auth_code.authorize_url({ - redirect_uri: callback_import_github_url, - scope: "repo, user, user:email" - }) + redirect_to client.authorize_url(callback_import_github_url) end def github_unauthorized -- cgit v1.2.1 From 639c93b4f2bd492a214065b5fdc47da2f5d8614d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 6 Feb 2015 11:21:42 +0100 Subject: Don't have Markdown preview fail for long content by using POST rather than GET. See https://github.com/gitlabhq/gitlabhq/issues/8611. --- app/assets/javascripts/dropzone_input.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index abb5bf519ee..d98d5482937 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -50,7 +50,7 @@ class @DropzoneInput preview.text "Nothing to preview." else preview.text "Loading..." - $.get($(this).data("url"), + $.post($(this).data("url"), md_text: mdText ).success (previewData) -> preview.html previewData -- cgit v1.2.1 From 3e97ac2022c52a79640fccc97127f8bb059134fd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 6 Feb 2015 10:21:48 -0800 Subject: Add index on order columns --- app/finders/notes_finder.rb | 11 +++++------ app/models/note.rb | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/finders/notes_finder.rb b/app/finders/notes_finder.rb index e2bd0a2560e..ab252821b52 100644 --- a/app/finders/notes_finder.rb +++ b/app/finders/notes_finder.rb @@ -10,19 +10,18 @@ class NotesFinder notes = case target_type when "commit" - project.notes.for_commit_id(target_id).not_inline.fresh + project.notes.for_commit_id(target_id).not_inline when "issue" - project.issues.find(target_id).notes.inc_author.fresh + project.issues.find(target_id).notes.inc_author when "merge_request" - project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh + project.merge_requests.find(target_id).mr_and_commit_notes.inc_author when "snippet", "project_snippet" - project.snippets.find(target_id).notes.fresh + project.snippets.find(target_id).notes else raise 'invalid target_type' end # Use overlapping intervals to avoid worrying about race conditions - notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP). - order(created_at: :asc, id: :asc) + notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP).fresh end end diff --git a/app/models/note.rb b/app/models/note.rb index 0b988cc3e0f..39fe421fd7a 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -49,7 +49,7 @@ class Note < ActiveRecord::Base scope :not_inline, ->{ where(line_code: [nil, '']) } scope :system, ->{ where(system: true) } scope :common, ->{ where(noteable_type: ["", nil]) } - scope :fresh, ->{ order("created_at ASC, id ASC") } + scope :fresh, ->{ order(created_at: :asc, id: :asc) } scope :inc_author_project, ->{ includes(:project, :author) } scope :inc_author, ->{ includes(:author) } -- cgit v1.2.1 From 4cce10583d55360430e0f660ddf3c527f6a42026 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 6 Feb 2015 23:57:28 -0800 Subject: Fix tests for semaphore --- app/models/concerns/sortable.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index cca1ee08fe8..0ad2654867d 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -14,11 +14,8 @@ module Sortable scope :order_created_asc, -> { reorder(created_at: :asc, id: :asc) } scope :order_updated_desc, -> { reorder(updated_at: :desc, id: :desc) } scope :order_updated_asc, -> { reorder(updated_at: :asc, id: :asc) } - - if column_names.include?('name') - scope :order_name_asc, -> { reorder(name: :asc) } - scope :order_name_desc, -> { reorder(name: :desc) } - end + scope :order_name_asc, -> { reorder(name: :asc) } + scope :order_name_desc, -> { reorder(name: :desc) } end module ClassMethods -- cgit v1.2.1 From 36b255e57bae0dbfbb0e1767713bdd713c48d622 Mon Sep 17 00:00:00 2001 From: Aleks Bunin Date: Sat, 7 Feb 2015 12:35:50 -0500 Subject: Addex X-GitLab-Project header to GitLab emails. Fixes #8748. --- app/mailers/notify.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app') diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 5ae07d771fa..3b7152cb771 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -111,6 +111,7 @@ class Notify < ActionMailer::Base # See: mail_answer_thread def mail_new_thread(model, headers = {}, &block) headers['Message-ID'] = message_id(model) + headers['X-GitLab-Project'] = "#{@project.name} | " if @project mail(headers, &block) end @@ -125,6 +126,7 @@ class Notify < ActionMailer::Base def mail_answer_thread(model, headers = {}, &block) headers['In-Reply-To'] = message_id(model) headers['References'] = message_id(model) + headers['X-GitLab-Project'] = "#{@project.name} | " if @project if (headers[:subject]) headers[:subject].prepend('Re: ') -- cgit v1.2.1 From f228e17d39804e5cd5642e81a12df1cca19fd77d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 7 Feb 2015 11:38:58 -0800 Subject: Add project-avatar and group-avatar css classes --- app/assets/stylesheets/generic/avatar.scss | 2 +- app/assets/stylesheets/sections/dashboard.scss | 3 --- app/assets/stylesheets/sections/projects.scss | 1 - app/views/dashboard/_project.html.haml | 2 +- app/views/dashboard/projects.html.haml | 4 ++-- app/views/groups/edit.html.haml | 2 +- app/views/groups/show.html.haml | 2 +- app/views/projects/_home_panel.html.haml | 2 +- app/views/projects/edit.html.haml | 2 +- app/views/users/_groups.html.haml | 2 +- 10 files changed, 9 insertions(+), 13 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index b88cdd83937..700cc7e6947 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -15,7 +15,7 @@ &.s24 { margin-right: 4px; } } - &.avatar-tile { + &.group-avatar, &.project-avatar, &.avatar-tile { @include border-radius(0px); } diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index 17c0cd81b93..77d403cc687 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -75,9 +75,6 @@ } } } -.project-avatar { - float: left; -} .project-description { overflow: hidden; diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 0a7671e3feb..3bb3779c294 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -32,7 +32,6 @@ .avatar { width: 70px; height: 70px; - @include border-radius(0px); } .identicon { diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index e9f411725a3..f0fb2c1881b 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,6 +1,6 @@ = link_to project_path(project), class: dom_class(project) do .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s40') + = project_icon(project.to_param, alt: '', class: 'avatar project-avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) %span.str-truncated diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index f60bcc72e1d..dba3025b3cc 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -11,8 +11,8 @@ - @projects.each do |project| %li.my-project-row %h4.project-title - .project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s60') + .pull-left + = project_icon(project.to_param, alt: '', class: 'avatar project-avatar s60') .project-access-icon = visibility_level_icon(project.visibility_level) = link_to project_path(project), class: dom_class(project) do diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index a963c59586e..c4eb00e8925 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -12,7 +12,7 @@ .form-group .col-sm-2 .col-sm-10 - = image_tag group_icon(@group.to_param), alt: '', class: 'avatar s160' + = image_tag group_icon(@group.to_param), alt: '', class: 'avatar group-avatar s160' %p.light - if @group.avatar? You can change your group avatar here diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 484bebca2d8..f2e591c1939 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,6 +1,6 @@ .dashboard %div - = image_tag group_icon(@group.path), class: "avatar avatar-tile s90" + = image_tag group_icon(@group.path), class: "avatar group-avatar s90" .clearfix %h2 = @group.name diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 2ed49f83a7a..5697f9ea1af 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -1,7 +1,7 @@ - empty_repo = @project.empty_repo? .project-home-panel{:class => ("empty-project" if empty_repo)} .project-identicon-holder - = project_icon(@project.to_param, alt: '', class: 'avatar') + = project_icon(@project.to_param, alt: '', class: 'avatar project-avatar') .project-home-row .project-home-desc - if @project.description.present? diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 367bd8806db..737cda411bc 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -78,7 +78,7 @@ .col-sm-2 .col-sm-10 - if @project.avatar? - = project_icon(@project.to_param, alt: '', class: 'avatar s160') + = project_icon(@project.to_param, alt: '', class: 'avatar project-avatar s160') %p.light - if @project.avatar_in_git Project avatar in repository: #{ @project.avatar_in_git } diff --git a/app/views/users/_groups.html.haml b/app/views/users/_groups.html.haml index b66a8808f87..cb84570a6d5 100644 --- a/app/views/users/_groups.html.haml +++ b/app/views/users/_groups.html.haml @@ -1,4 +1,4 @@ .clearfix - groups.each do |group| = link_to group, class: 'profile-groups-avatars inline', title: group.name do - = image_tag group_icon(group.path), class: 'avatar avatar-tile s40' + = image_tag group_icon(group.path), class: 'avatar group-avatar s40' -- cgit v1.2.1 From 463d9f76e449849be15926a7df0564fbc9a35452 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 6 Feb 2015 16:21:26 +0100 Subject: Autosave and autorestore unsaved comments. Closes #1738. --- app/assets/javascripts/application.js.coffee | 1 + app/assets/javascripts/autosave.js.coffee | 33 ++++++++++++++++++++++++++++ app/assets/javascripts/notes.js.coffee | 17 ++++++++++++-- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/autosave.js.coffee (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 4912c534b0e..9c97582e6dd 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -17,6 +17,7 @@ #= require jquery.blockUI #= require jquery.turbolinks #= require turbolinks +#= require autosave #= require bootstrap #= require select2 #= require raphael diff --git a/app/assets/javascripts/autosave.js.coffee b/app/assets/javascripts/autosave.js.coffee new file mode 100644 index 00000000000..3450f4b55f7 --- /dev/null +++ b/app/assets/javascripts/autosave.js.coffee @@ -0,0 +1,33 @@ +class @Autosave + constructor: (field, key) -> + @field = field + + key = key.join("/") if key.join? + @key = "autosave/#{key}" + + @field.data "autosave", this + + @restore() + + @field.on "input", => @save() + + restore: -> + return unless window.localStorage? + + text = window.localStorage.getItem @key + @field.val text if text?.length > 0 + @field.trigger "input" + + save: -> + return unless window.localStorage? + + text = @field.val() + if text?.length > 0 + window.localStorage.setItem @key, text + else + @reset() + + reset: -> + return unless window.localStorage? + + window.localStorage.removeItem @key \ No newline at end of file diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 15597060c6b..37a7b31d3c8 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -170,6 +170,8 @@ class @Notes form.find(".js-md-write-button").click() form.find(".js-note-text").val("").trigger "input" + form.find(".js-note-text").data("autosave").reset() + ### Called when clicking the "Choose File" button. @@ -220,12 +222,22 @@ class @Notes # setup preview buttons form.find(".js-md-write-button, .js-md-preview-button").tooltip placement: "left" previewButton = form.find(".js-md-preview-button") - form.find(".js-note-text").on "input", -> + + textarea = form.find(".js-note-text") + + textarea.on "input", -> if $(this).val().trim() isnt "" previewButton.removeClass("turn-off").addClass "turn-on" else previewButton.removeClass("turn-on").addClass "turn-off" + new Autosave textarea, [ + "Note" + form.find("#note_commit_id").val() + form.find("#note_line_code").val() + form.find("#note_noteable_type").val() + form.find("#note_noteable_id").val() + ] # remove notify commit author checkbox for non-commit notes form.find(".js-notify-commit-author").remove() if form.find("#note_noteable_type").val() isnt "Commit" @@ -233,7 +245,6 @@ class @Notes new DropzoneInput(form) form.show() - ### Called in response to the new note form being submitted @@ -407,6 +418,8 @@ class @Notes removeDiscussionNoteForm: (form)-> row = form.closest("tr") + form.find(".js-note-text").data("autosave").reset() + # show the reply button (will only work for replies) form.prev(".js-discussion-reply-button").show() if row.is(".js-temp-notes-holder") -- cgit v1.2.1 From db7921f2d8349da8183dc716fdf62b6ab5bc697a Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 6 Feb 2015 22:42:02 +0100 Subject: Add "Import all projects" button to GitHub and GitLab import pages. Closes #1963. --- app/assets/javascripts/importer_status.js.coffee | 6 +++++- app/views/import/github/status.html.haml | 8 +++++--- app/views/import/gitlab/status.html.haml | 12 +++++++----- 3 files changed, 17 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/importer_status.js.coffee b/app/assets/javascripts/importer_status.js.coffee index 268efd7c832..e0e7771ab20 100644 --- a/app/assets/javascripts/importer_status.js.coffee +++ b/app/assets/javascripts/importer_status.js.coffee @@ -4,7 +4,7 @@ class @ImporterStatus this.setAutoUpdate() initStatusPage: -> - $(".btn-add-to-import").click (event) => + $(".js-add-to-import").click (event) => new_namespace = null tr = $(event.currentTarget).closest("tr") id = tr.attr("id").replace("repo_", "") @@ -12,6 +12,10 @@ class @ImporterStatus new_namespace = tr.find(".import-target input").prop("value") tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) $.post @import_url, {repo_id: id, new_namespace: new_namespace}, dataType: 'script' + + $(".js-import-all").click (event) => + $(".js-add-to-import").each -> + $(this).click() setAutoUpdate: -> setInterval (=> diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 1676c3c26ae..84d9903fe15 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -3,9 +3,11 @@ Import repositories from GitHub.com %p.light - Select projects you want to import. - + Select projects you want to import. %hr +%p + = button_tag 'Import all projects', class: "btn btn-success js-import-all" + %table.table.import-jobs %thead %tr @@ -32,7 +34,7 @@ %td.import-target = repo.full_name %td.import-actions.job-status - = button_tag "Add", class: "btn btn-add-to-import" + = button_tag "Import", class: "btn js-add-to-import" :coffeescript $ -> diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml index 9aedacef04b..d1e48dfad20 100644 --- a/app/views/import/gitlab/status.html.haml +++ b/app/views/import/gitlab/status.html.haml @@ -3,9 +3,11 @@ Import repositories from GitLab.com %p.light - Select projects you want to import. - + Select projects you want to import. %hr +%p + = button_tag 'Import all projects', class: "btn btn-success js-import-all" + %table.table.import-jobs %thead %tr @@ -32,8 +34,8 @@ %td.import-target = repo["path_with_namespace"] %td.import-actions.job-status - = button_tag "Add", class: "btn btn-add-to-import" + = button_tag "Import", class: "btn js-add-to-import" :coffeescript - $ -> - new ImporterStatus("#{jobs_import_gitlab_path}", "#{import_gitlab_url}") + $ -> + new ImporterStatus("#{jobs_import_gitlab_path}", "#{import_gitlab_path}") -- cgit v1.2.1 From 9dbd7e5aec921e43f3ea89c8e3357ca0174b0937 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Sat, 7 Feb 2015 00:23:58 +0100 Subject: Allow notification email to be set separately from primary email. Closes #1932. --- app/controllers/admin/users_controller.rb | 3 + app/controllers/profiles/emails_controller.rb | 3 + .../profiles/notifications_controller.rb | 22 +++++- app/mailers/emails/profile.rb | 6 +- app/mailers/emails/projects.rb | 2 +- app/mailers/notify.rb | 2 +- app/models/user.rb | 18 +++++ app/views/profiles/emails/index.html.haml | 6 +- app/views/profiles/notifications/show.html.haml | 79 +++++++++++++--------- 9 files changed, 102 insertions(+), 39 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index aea8545d38e..b4c78814a19 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -102,6 +102,9 @@ class Admin::UsersController < Admin::ApplicationController email = user.emails.find(params[:email_id]) email.destroy + user.set_notification_email + user.save if user.notification_email_changed? + respond_to do |format| format.html { redirect_to :back, notice: "Successfully removed email." } format.js { render nothing: true } diff --git a/app/controllers/profiles/emails_controller.rb b/app/controllers/profiles/emails_controller.rb index f3f0e69b83a..4a65c978e5c 100644 --- a/app/controllers/profiles/emails_controller.rb +++ b/app/controllers/profiles/emails_controller.rb @@ -18,6 +18,9 @@ class Profiles::EmailsController < ApplicationController @email = current_user.emails.find(params[:id]) @email.destroy + current_user.set_notification_email + current_user.save if current_user.notification_email_changed? + respond_to do |format| format.html { redirect_to profile_emails_url } format.js { render nothing: true } diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb index 638d1f9789b..433c19189af 100644 --- a/app/controllers/profiles/notifications_controller.rb +++ b/app/controllers/profiles/notifications_controller.rb @@ -2,6 +2,7 @@ class Profiles::NotificationsController < ApplicationController layout 'profile' def show + @user = current_user @notification = current_user.notification @project_members = current_user.project_members @group_members = current_user.group_members @@ -11,8 +12,7 @@ class Profiles::NotificationsController < ApplicationController type = params[:notification_type] @saved = if type == 'global' - current_user.notification_level = params[:notification_level] - current_user.save + current_user.update_attributes(user_params) elsif type == 'group' users_group = current_user.group_members.find(params[:notification_id]) users_group.notification_level = params[:notification_level] @@ -22,5 +22,23 @@ class Profiles::NotificationsController < ApplicationController project_member.notification_level = params[:notification_level] project_member.save end + + respond_to do |format| + format.html do + if @saved + flash[:notice] = "Notification settings saved" + else + flash[:alert] = "Failed to save new settings" + end + + redirect_to :back + end + + format.js + end + end + + def user_params + params.require(:user).permit(:notification_email, :notification_level) end end diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb index 6d7f8eb4b02..ab5b0765352 100644 --- a/app/mailers/emails/profile.rb +++ b/app/mailers/emails/profile.rb @@ -4,20 +4,20 @@ module Emails @user = User.find(user_id) @target_url = user_url(@user) @token = token - mail(to: @user.email, subject: subject("Account was created for you")) + mail(to: @user.notification_email, subject: subject("Account was created for you")) end def new_email_email(email_id) @email = Email.find(email_id) @user = @email.user - mail(to: @user.email, subject: subject("Email was added to your account")) + mail(to: @user.notification_email, subject: subject("Email was added to your account")) end def new_ssh_key_email(key_id) @key = Key.find(key_id) @user = @key.user @target_url = user_url(@user) - mail(to: @user.email, subject: subject("SSH key was added to your account")) + mail(to: @user.notification_email, subject: subject("SSH key was added to your account")) end end end diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb index d6edfd7059f..dc2ebc969c1 100644 --- a/app/mailers/emails/projects.rb +++ b/app/mailers/emails/projects.rb @@ -12,7 +12,7 @@ module Emails @user = User.find user_id @project = Project.find project_id @target_url = project_url(@project) - mail(to: @user.email, + mail(to: @user.notification_email, subject: subject("Project was moved")) end diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 5ae07d771fa..45fc53fcdb2 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -60,7 +60,7 @@ class Notify < ActionMailer::Base # Returns a String containing the User's email address. def recipient(recipient_id) if recipient = User.find(recipient_id) - recipient.email + recipient.notification_email end end diff --git a/app/models/user.rb b/app/models/user.rb index 552a37c9533..34dedb057d5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -43,6 +43,7 @@ # website_url :string(255) default(""), not null # last_credential_check_at :datetime # github_access_token :string(255) +# notification_email :string(255) # require 'carrierwave/orm/activerecord' @@ -114,6 +115,7 @@ class User < ActiveRecord::Base # validates :name, presence: true validates :email, presence: true, email: { strict_mode: true }, uniqueness: true + validates :notification_email, presence: true, email: { strict_mode: true } validates :bio, length: { maximum: 255 }, allow_blank: true validates :projects_limit, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :username, @@ -127,10 +129,12 @@ class User < ActiveRecord::Base validate :namespace_uniq, if: ->(user) { user.username_changed? } validate :avatar_type, if: ->(user) { user.avatar_changed? } validate :unique_email, if: ->(user) { user.email_changed? } + validate :owns_notification_email, if: ->(user) { user.notification_email_changed? } validates :avatar, file_size: { maximum: 200.kilobytes.to_i } before_validation :generate_password, on: :create before_validation :sanitize_attrs + before_validation :set_notification_email, if: ->(user) { user.email_changed? } before_save :ensure_authentication_token after_save :ensure_namespace_correct @@ -286,6 +290,10 @@ class User < ActiveRecord::Base self.errors.add(:email, 'has already been taken') if Email.exists?(email: self.email) end + def owns_notification_email + self.errors.add(:notification_email, "is not an email you own") unless self.all_emails.include?(self.notification_email) + end + # Groups user has access to def authorized_groups @authorized_groups ||= begin @@ -431,6 +439,12 @@ class User < ActiveRecord::Base end end + def set_notification_email + if self.notification_email.blank? || !self.all_emails.include?(self.notification_email) + self.notification_email = self.email + end + end + def requires_ldap_check? if !Gitlab.config.ldap.enabled false @@ -504,6 +518,10 @@ class User < ActiveRecord::Base end end + def all_emails + [self.email, *self.emails.map(&:email)] + end + def hook_attrs { name: name, diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml index ca980db2f3c..0b30e772336 100644 --- a/app/views/profiles/emails/index.html.haml +++ b/app/views/profiles/emails/index.html.haml @@ -3,7 +3,11 @@ %p.light Your %b Primary Email - will be used for account notifications, avatar detection and web based operations, such as edits and merges. + will be used for avatar detection and web based operations, such as edits and merges. + %br + Your + %b Notification Email + will be used for account notifications. %br All email addresses will be used to identify your commits. diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index bc6f76a2661..28bc5a426ac 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -1,40 +1,57 @@ %h3.page-title Notifications settings %p.light - GitLab uses the email specified in your profile for notifications + These are your global notification settings. %hr -= form_tag profile_notifications_path, method: :put, remote: true, class: 'update-notifications form-horizontal global-notifications-form' do + + += form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications form-horizontal global-notifications-form' } do |f| + -if @user.errors.any? + %div.alert.alert-danger + %ul + - @user.errors.full_messages.each do |msg| + %li= msg + = hidden_field_tag :notification_type, 'global' - = label_tag :notification_level, 'Notification level', class: 'control-label' - .col-sm-10 - .radio - = label_tag nil, class: '' do - = radio_button_tag :notification_level, Notification::N_DISABLED, @notification.disabled?, class: 'trigger-submit' - .level-title - Disabled - %p You will not get any notifications via email - - .radio - = label_tag nil, class: '' do - = radio_button_tag :notification_level, Notification::N_MENTION, @notification.mention?, class: 'trigger-submit' - .level-title - Mention - %p You will receive notifications only for comments in which you were @mentioned - - .radio - = label_tag nil, class: '' do - = radio_button_tag :notification_level, Notification::N_PARTICIPATING, @notification.participating?, class: 'trigger-submit' - .level-title - Participating - %p You will only receive notifications from related resources (e.g. from your commits or assigned issues) - - .radio - = label_tag nil, class: '' do - = radio_button_tag :notification_level, Notification::N_WATCH, @notification.watch?, class: 'trigger-submit' - .level-title - Watch - %p You will receive all notifications from projects in which you participate + .form-group + = f.label :notification_email, class: "control-label" + .col-sm-10 + = f.select :notification_email, @user.all_emails, { include_blank: false }, class: "form-control" + + .form-group + = f.label :notification_level, class: 'control-label' + .col-sm-10 + .radio + = f.label :notification_level, value: Notification::N_DISABLED do + = f.radio_button :notification_level, Notification::N_DISABLED + .level-title + Disabled + %p You will not get any notifications via email + + .radio + = f.label :notification_level, value: Notification::N_MENTION do + = f.radio_button :notification_level, Notification::N_MENTION + .level-title + Mention + %p You will receive notifications only for comments in which you were @mentioned + + .radio + = f.label :notification_level, value: Notification::N_PARTICIPATING do + = f.radio_button :notification_level, Notification::N_PARTICIPATING + .level-title + Participating + %p You will only receive notifications from related resources (e.g. from your commits or assigned issues) + + .radio + = f.label :notification_level, value: Notification::N_WATCH do + = f.radio_button :notification_level, Notification::N_WATCH + .level-title + Watch + %p You will receive all notifications from projects in which you participate + + .form-actions + = f.submit 'Save changes', class: "btn btn-save" .clearfix %hr -- cgit v1.2.1 From eef461d4a1751915d15b10af6d4f36e28b67cf20 Mon Sep 17 00:00:00 2001 From: Carlos Ribeiro Date: Fri, 6 Feb 2015 19:40:45 -0200 Subject: Fix showing overflow when have several items at sidebar --- app/views/layouts/nav/_project.html.haml | 138 +++++++++++++++++-------------- 1 file changed, 76 insertions(+), 62 deletions(-) (limited to 'app') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 6c2d5966cbe..8d572ddcd10 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -1,75 +1,89 @@ %ul.project-navigation.nav.nav-sidebar - = nav_link(path: 'projects#show', html_options: {class: "home"}) do - = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do - %i.fa.fa-dashboard - %span - Project - - if project_nav_tab? :files - = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do - = link_to project_tree_path(@project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree' do - %i.fa.fa-files-o + - if @project_settings_nav + = nav_link do + = link_to project_path(@project), title: 'Back to project', class: "" do + %i.fa.fa-angle-left %span - Files + Back to project - - if project_nav_tab? :commits - = nav_link(controller: %w(commit commits compare repositories tags branches)) do - = link_to project_commits_path(@project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits' do - %i.fa.fa-history + = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do + = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do + %i.fa.fa-cogs %span - Commits + Settings + %i.fa.fa-angle-down - - if project_nav_tab? :network - = nav_link(controller: %w(network)) do - = link_to project_network_path(@project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network' do - %i.fa.fa-code-fork - %span - Network + = render 'projects/settings_nav' - - if project_nav_tab? :graphs - = nav_link(controller: %w(graphs)) do - = link_to project_graph_path(@project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs' do - %i.fa.fa-area-chart + - else + = nav_link(path: 'projects#show', html_options: {class: "home"}) do + = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do + %i.fa.fa-dashboard %span - Graphs + Project + - if project_nav_tab? :files + = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do + = link_to project_tree_path(@project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree' do + %i.fa.fa-files-o + %span + Files - - if project_nav_tab? :issues - = nav_link(controller: %w(issues milestones labels)) do - = link_to url_for_project_issues, title: 'Issues', class: 'shortcuts-issues' do - %i.fa.fa-exclamation-circle - %span - Issues - - if @project.default_issues_tracker? - %span.count.issue_counter= @project.issues.opened.count + - if project_nav_tab? :commits + = nav_link(controller: %w(commit commits compare repositories tags branches)) do + = link_to project_commits_path(@project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits' do + %i.fa.fa-history + %span + Commits - - if project_nav_tab? :merge_requests - = nav_link(controller: :merge_requests) do - = link_to project_merge_requests_path(@project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do - %i.fa.fa-tasks - %span - Merge Requests - %span.count.merge_counter= @project.merge_requests.opened.count + - if project_nav_tab? :network + = nav_link(controller: %w(network)) do + = link_to project_network_path(@project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network' do + %i.fa.fa-code-fork + %span + Network - - if project_nav_tab? :wiki - = nav_link(controller: :wikis) do - = link_to project_wiki_path(@project, :home), title: 'Wiki', class: 'shortcuts-wiki' do - %i.fa.fa-book - %span - Wiki + - if project_nav_tab? :graphs + = nav_link(controller: %w(graphs)) do + = link_to project_graph_path(@project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs' do + %i.fa.fa-area-chart + %span + Graphs - - if project_nav_tab? :snippets - = nav_link(controller: :snippets) do - = link_to project_snippets_path(@project), title: 'Snippets', class: 'shortcuts-snippets' do - %i.fa.fa-file-text-o - %span - Snippets + - if project_nav_tab? :issues + = nav_link(controller: %w(issues milestones labels)) do + = link_to url_for_project_issues, title: 'Issues', class: 'shortcuts-issues' do + %i.fa.fa-exclamation-circle + %span + Issues + - if @project.default_issues_tracker? + %span.count.issue_counter= @project.issues.opened.count - - if project_nav_tab? :settings - = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do - %i.fa.fa-cogs - %span - Settings - %i.fa.fa-angle-down + - if project_nav_tab? :merge_requests + = nav_link(controller: :merge_requests) do + = link_to project_merge_requests_path(@project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do + %i.fa.fa-tasks + %span + Merge Requests + %span.count.merge_counter= @project.merge_requests.opened.count - - if @project_settings_nav - = render 'projects/settings_nav' + - if project_nav_tab? :wiki + = nav_link(controller: :wikis) do + = link_to project_wiki_path(@project, :home), title: 'Wiki', class: 'shortcuts-wiki' do + %i.fa.fa-book + %span + Wiki + + - if project_nav_tab? :snippets + = nav_link(controller: :snippets) do + = link_to project_snippets_path(@project), title: 'Snippets', class: 'shortcuts-snippets' do + %i.fa.fa-file-text-o + %span + Snippets + + - if project_nav_tab? :settings + = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do + = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do + %i.fa.fa-cogs + %span + Settings + %i.fa.fa-angle-down -- cgit v1.2.1 From 03c8bf39e10b52bc5e9f128fe53876ad8b398dac Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 8 Feb 2015 00:53:31 -0800 Subject: When add new social account - redirect to accounts page and show notice message --- app/controllers/omniauth_callbacks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index 442a1cf7518..bb9d65c9ed6 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -44,7 +44,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController if current_user # Add new authentication method current_user.identities.find_or_create_by(extern_uid: oauth['uid'], provider: oauth['provider']) - redirect_to profile_path + redirect_to profile_account_path, notice: 'Authentication method updated' else @user = Gitlab::OAuth::User.new(oauth) @user.save -- cgit v1.2.1 From 8681cb3137511e51e19f76aef9839be28f8fcd6a Mon Sep 17 00:00:00 2001 From: Nikita Verkhovin Date: Sat, 7 Feb 2015 17:14:55 +0600 Subject: Add labels notes --- app/helpers/labels_helper.rb | 2 +- app/models/note.rb | 30 +++++++++++++++++++++++++++ app/services/issuable_base_service.rb | 5 +++++ app/services/issues/update_service.rb | 7 +++++++ app/services/merge_requests/update_service.rb | 10 +++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 19d688c4bb8..add0fef512e 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -7,7 +7,7 @@ module LabelsHelper label_color = label.color || Label::DEFAULT_COLOR text_color = text_color_for_bg(label_color) - content_tag :span, class: 'label color-label', style: "background:#{label_color};color:#{text_color}" do + content_tag :span, class: 'label color-label', style: "background-color:#{label_color};color:#{text_color}" do label.name end end diff --git a/app/models/note.rb b/app/models/note.rb index 39fe421fd7a..ccd9783e7d4 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -121,6 +121,36 @@ class Note < ActiveRecord::Base }) end + def create_labels_change_note(noteable, project, author, added_labels, removed_labels) + labels_count = added_labels.count + removed_labels.count + added_labels = added_labels.map{ |label| "~#{label.id}" }.join(' ') + removed_labels = removed_labels.map{ |label| "~#{label.id}" }.join(' ') + message = '' + + if added_labels.present? + message << "added #{added_labels}" + end + + if added_labels.present? && removed_labels.present? + message << ' and ' + end + + if removed_labels.present? + message << "removed #{removed_labels}" + end + + message << ' ' << 'label'.pluralize(labels_count) + body = "_#{message.capitalize}_" + + create( + noteable: noteable, + project: project, + author: author, + note: body, + system: true + ) + end + def create_new_commits_note(noteable, project, author, commits) commits_text = ActionController::Base.helpers.pluralize(commits.size, 'new commit') body = "Added #{commits_text}:\n\n" diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index e3371ec3c1b..5e1906ad2ae 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -10,4 +10,9 @@ class IssuableBaseService < BaseService Note.create_milestone_change_note( issuable, issuable.project, current_user, issuable.milestone) end + + def create_labels_note(issuable, added_labels, removed_labels) + Note.create_labels_change_note( + issuable, issuable.project, current_user, added_labels, removed_labels) + end end diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index 83e413d7248..c61d67a7893 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -14,10 +14,17 @@ module Issues issue.update_nth_task(params[:task_num].to_i, false) end + old_labels = issue.labels.to_a + if params.present? && issue.update_attributes(params.except(:state_event, :task_num)) issue.reset_events_cache + if issue.labels != old_labels + create_labels_note( + issue, issue.labels - old_labels, old_labels - issue.labels) + end + if issue.previous_changes.include?('milestone_id') create_milestone_note(issue) end diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb index 10c401756eb..870b50bb60d 100644 --- a/app/services/merge_requests/update_service.rb +++ b/app/services/merge_requests/update_service.rb @@ -23,11 +23,21 @@ module MergeRequests merge_request.update_nth_task(params[:task_num].to_i, false) end + old_labels = merge_request.labels.to_a + if params.present? && merge_request.update_attributes( params.except(:state_event, :task_num) ) merge_request.reset_events_cache + if merge_request.labels != old_labels + create_labels_note( + merge_request, + merge_request.labels - old_labels, + old_labels - merge_request.labels + ) + end + if merge_request.previous_changes.include?('milestone_id') create_milestone_note(merge_request) end -- cgit v1.2.1 From af44c65030a1fbc4e29c3cf51e4d3c33b9666201 Mon Sep 17 00:00:00 2001 From: yglukhov Date: Mon, 9 Feb 2015 15:34:06 +0200 Subject: Diff headers made sticky --- app/assets/javascripts/application.js.coffee | 1 + app/assets/javascripts/diff.js.coffee | 2 ++ 2 files changed, 3 insertions(+) (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 9c97582e6dd..9c5ca879ec2 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -16,6 +16,7 @@ #= require jquery.scrollTo #= require jquery.blockUI #= require jquery.turbolinks +#= require jquery.sticky-kit.min #= require turbolinks #= require autosave #= require bootstrap diff --git a/app/assets/javascripts/diff.js.coffee b/app/assets/javascripts/diff.js.coffee index 52b4208524f..b0b312e7749 100644 --- a/app/assets/javascripts/diff.js.coffee +++ b/app/assets/javascripts/diff.js.coffee @@ -36,6 +36,8 @@ class @Diff ) ) + $('.diff-header').stick_in_parent(offset_top: $('.navbar').height()) + lineNumbers: (line) -> return ([0, 0]) unless line.children().length lines = line.children().slice(0, 2) -- cgit v1.2.1 From 8752cd3322f9d64b7eab0123048ece072e6b3a76 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 9 Feb 2015 18:11:06 +0100 Subject: Don't allow page to be scaled on mobile. --- app/views/layouts/_head.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index 17bcf8d3631..a6900f4a04b 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -18,7 +18,7 @@ = javascript_include_tag "application" = csrf_meta_tags = include_gon - %meta{name: 'viewport', content: 'width=device-width, initial-scale=1.0'} + %meta{name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1'} %meta{name: 'theme-color', content: '#474D57'} = render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id') -- cgit v1.2.1 From 00c7d533a04d8efe8aefa389e3212b977db7b5fc Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 9 Feb 2015 14:33:47 -0800 Subject: Default issue tracker fix for creating default issue service. --- app/models/project.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index 5adf13588a3..e53b268c8ea 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -321,7 +321,7 @@ class Project < ActiveRecord::Base end def default_issue_tracker - gitlab_issue_tracker_service ||= create_gitlab_issue_tracker_service + gitlab_issue_tracker_service || create_gitlab_issue_tracker_service end def issues_tracker -- cgit v1.2.1 From 3d369a5b85ecebdb884b43764b0b21ee2bfad0ad Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 10 Feb 2015 09:30:39 -0800 Subject: Remove settings from gitlab.yml.example which we already have in UI --- app/views/admin/application_settings/_form.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index bf0ee49d2f4..ae0c70a79c7 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -37,6 +37,7 @@ .form-group = f.label :sign_in_text, class: 'control-label' .col-sm-10 - = f.text_area :sign_in_text, class: 'form-control' + = f.text_area :sign_in_text, class: 'form-control', rows: 4 + .help-block Markdown enabled .form-actions = f.submit 'Save', class: 'btn btn-primary' -- cgit v1.2.1 From 7606b93c26ca58211d2cfbbad2e051dcd0ea7c32 Mon Sep 17 00:00:00 2001 From: Benjamin Kammerl Date: Wed, 11 Feb 2015 10:02:36 +0000 Subject: Change label color text field type to "color" --- app/views/projects/labels/_form.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/labels/_form.html.haml b/app/views/projects/labels/_form.html.haml index 72a01e1c271..c7380920b47 100644 --- a/app/views/projects/labels/_form.html.haml +++ b/app/views/projects/labels/_form.html.haml @@ -16,7 +16,7 @@ .col-sm-10 .input-group .input-group-addon.label-color-preview   - = f.text_field :color, placeholder: "#AA33EE", class: "form-control" + = f.color_field :color, placeholder: "#AA33EE", class: "form-control" .help-block 6 character hex values starting with a # sign. %br -- cgit v1.2.1 From d909ae73dc5bca391e6639af0d8f9fcacb7a00ea Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 11 Feb 2015 12:20:51 +0100 Subject: Actually submit comment on command-enter. Resolves #1869. --- app/assets/javascripts/notes.js.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 37a7b31d3c8..47c5ecdedf1 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -58,7 +58,8 @@ class @Notes $(document).on "visibilitychange", @visibilityChange @notes_forms = '.js-main-target-form textarea, .js-discussion-note-form textarea' - $(document).on('keypress', @notes_forms, (e)-> + # Chrome doesn't fire keypress or keyup for Command+Enter, so we need keydown. + $(document).on('keydown', @notes_forms, (e) -> if e.keyCode == 10 || ((e.metaKey || e.ctrlKey) && e.keyCode == 13) $(@).parents('form').submit() ) -- cgit v1.2.1 From 27e521720a77bcf70ad04a428aee650a8d240401 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 11 Feb 2015 17:40:03 +0100 Subject: Add horizontal scrolling to code blocks. --- app/assets/stylesheets/generic/common.scss | 4 ++++ app/assets/stylesheets/generic/highlight.scss | 1 + 2 files changed, 5 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 1a7e96f1d0c..3db821fdf76 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -333,6 +333,10 @@ table { margin-bottom: 9px; } +.wiki .code { + overflow-x: auto; +} + .footer-links a { margin-right: 15px; } diff --git a/app/assets/stylesheets/generic/highlight.scss b/app/assets/stylesheets/generic/highlight.scss index e1ca86af816..0f8225d6823 100644 --- a/app/assets/stylesheets/generic/highlight.scss +++ b/app/assets/stylesheets/generic/highlight.scss @@ -59,6 +59,7 @@ box-shadow: none; background: $box_bg; padding: 1em; + overflow-x: auto; code { font-family: $monospace_font; -- cgit v1.2.1 From 29e606deeca83c41d72f880d9574af5983686ab3 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 2 Feb 2015 15:11:19 -0800 Subject: Add ExternalIssue base model to make issue referencing more robust for external issue trackers. --- app/models/concerns/mentionable.rb | 7 ++++--- app/models/external_issue.rb | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 app/models/external_issue.rb (limited to 'app') diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb index d640728519a..50be458bf24 100644 --- a/app/models/concerns/mentionable.rb +++ b/app/models/concerns/mentionable.rb @@ -67,9 +67,10 @@ module Mentionable return [] if text.blank? ext = Gitlab::ReferenceExtractor.new ext.analyze(text, p) - (ext.issues_for + - ext.merge_requests_for + - ext.commits_for).uniq - [local_reference] + + (ext.issues_for(p) + + ext.merge_requests_for(p) + + ext.commits_for(p)).uniq - [local_reference] end # Create a cross-reference Note for each GFM reference to another Mentionable found in +mentionable_text+. diff --git a/app/models/external_issue.rb b/app/models/external_issue.rb new file mode 100644 index 00000000000..50efcb32f1b --- /dev/null +++ b/app/models/external_issue.rb @@ -0,0 +1,25 @@ +class ExternalIssue + def initialize(issue_identifier, project) + @issue_identifier, @project = issue_identifier, project + end + + def to_s + @issue_identifier.to_s + end + + def id + @issue_identifier.to_s + end + + def iid + @issue_identifier.to_s + end + + def ==(other) + other.is_a?(self.class) && (to_s == other.to_s) + end + + def project + @project + end +end -- cgit v1.2.1 From 55153660647741af22be2278d292de8a54bc0402 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 11 Feb 2015 09:24:40 -0800 Subject: Add template boolean to services. --- app/models/service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/service.rb b/app/models/service.rb index caabe8e971d..4a0f8dacecf 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -10,7 +10,7 @@ # updated_at :datetime # active :boolean default(FALSE), not null # properties :text -# +# tempalate :boolean default(FALSE) # To add new service you should build a class inherited from Service # and implement a set of methods -- cgit v1.2.1 From 09d3d351a1a80032c4e9bf185a15ff95819a4da0 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 11 Feb 2015 09:47:21 -0800 Subject: Remove not null constraint on project_id in services. --- app/models/service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/service.rb b/app/models/service.rb index 4a0f8dacecf..4c4fe085c22 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -5,12 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text -# tempalate :boolean default(FALSE) +# template :boolean default(FALSE) # To add new service you should build a class inherited from Service # and implement a set of methods -- cgit v1.2.1 From 452b3612cf41ef4c64f94416f7c10aa3acf78735 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 11 Feb 2015 22:15:10 +0100 Subject: Fix link to SSH help page. Closes #1981. --- app/views/profiles/keys/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index 809953960bb..c83c73ffcf9 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -6,7 +6,7 @@ SSH keys allow you to establish a secure connection between your computer and GitLab %br Before you can add an SSH key you need to - = link_to "generate it", help_page_path("ssh", "ssh") + = link_to "generate it", help_page_path("ssh", "README") %hr = render 'key_table' -- cgit v1.2.1 From 6b4ddf2cc13eda5dd6df64bab6f95f88d64cd2fa Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 11 Feb 2015 17:34:41 -0800 Subject: Add admin services templates. --- app/controllers/admin/services_controller.rb | 51 ++++++++++++++++++++++ app/models/project.rb | 21 +++++++-- .../project_services/issue_tracker_service.rb | 12 ++--- app/models/service.rb | 13 ++++-- .../_external_issues_tracker_template.html.haml | 22 ++++++++++ app/views/admin/services/_form.html.haml | 25 +++++++++++ app/views/admin/services/edit.html.haml | 1 + app/views/admin/services/index.html.haml | 22 ++++++++++ 8 files changed, 156 insertions(+), 11 deletions(-) create mode 100644 app/controllers/admin/services_controller.rb create mode 100644 app/views/admin/application_settings/_external_issues_tracker_template.html.haml create mode 100644 app/views/admin/services/_form.html.haml create mode 100644 app/views/admin/services/edit.html.haml create mode 100644 app/views/admin/services/index.html.haml (limited to 'app') diff --git a/app/controllers/admin/services_controller.rb b/app/controllers/admin/services_controller.rb new file mode 100644 index 00000000000..5697e1a5492 --- /dev/null +++ b/app/controllers/admin/services_controller.rb @@ -0,0 +1,51 @@ +class Admin::ServicesController < Admin::ApplicationController + before_filter :service, only: [:edit, :update] + + def index + @services = services_templates + end + + def edit + unless service.present? + redirect_to admin_application_settings_services_path, + alert: "Service is unknown or it doesn't exist" + end + end + + def update + if service.update_attributes(application_services_params[:service]) + redirect_to admin_application_settings_services_path, + notice: 'Application settings saved successfully' + else + render :edit + end + end + + private + + def services_templates + templates = [] + + allowed_templates.each do |service| + service_template = service.constantize + templates << service_template.where(template: true).first_or_create + end + + templates + end + + def allowed_templates + %w( JiraService RedmineService CustomIssueTrackerService ) + end + + def service + @service ||= Service.where(id: params[:id], template: true).first + end + + def application_services_params + params.permit(:id, + service: [ + :title, :project_url, :description, :issues_url, :new_issue_url + ]) + end +end diff --git a/app/models/project.rb b/app/models/project.rb index e53b268c8ea..f7cbbf3ace4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -353,15 +353,30 @@ class Project < ActiveRecord::Base end def build_missing_services + services_templates = Service.where(template: true) + available_services_names.each do |service_name| - service = services.find { |service| service.to_param == service_name } + service = find_service(services, service_name) # If service is available but missing in db - # we should create an instance. Ex `create_gitlab_ci_service` - service = self.send :"create_#{service_name}_service" if service.nil? + if service.nil? + # We should check if template for the service exists + template = find_service(services_templates, service_name) + + if template.nil? + # If no template, we should create an instance. Ex `create_gitlab_ci_service` + service = self.send :"create_#{service_name}_service" + else + Service.create_from_template(self.id, template) + end + end end end + def find_service(list, name) + list.find { |service| service.to_param == name } + end + def available_services_names %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla asana emails_on_push gemnasium slack pushover buildbox bamboo teamcity jira redmine custom_issue_tracker) diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index b19c02bab44..cb6426d180d 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -77,12 +77,14 @@ class IssueTrackerService < Service end def set_project_url - id = self.project.issues_tracker_id + if self.project + id = self.project.issues_tracker_id - if id - issues_tracker['project_url'].gsub(":issues_tracker_id", id) - else - issues_tracker['project_url'] + if id + issues_tracker['project_url'].gsub(":issues_tracker_id", id) + end end + + issues_tracker['project_url'] end end diff --git a/app/models/service.rb b/app/models/service.rb index 4c4fe085c22..0099dbe65c0 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -25,7 +25,7 @@ class Service < ActiveRecord::Base belongs_to :project has_one :service_hook - validates :project_id, presence: true + validates :project_id, presence: true, unless: Proc.new { |service| service.template? } scope :visible, -> { where.not(type: 'GitlabIssueTrackerService') } @@ -33,6 +33,10 @@ class Service < ActiveRecord::Base active end + def template? + template + end + def category :common end @@ -94,7 +98,10 @@ class Service < ActiveRecord::Base self.category == :issue_tracker end - def self.issue_tracker_service_list - Service.select(&:issue_tracker?).map{ |s| s.to_param } + def self.create_from_template(project_id, template) + service = template.dup + service.template = false + service.project_id = project_id + service if service.save end end diff --git a/app/views/admin/application_settings/_external_issues_tracker_template.html.haml b/app/views/admin/application_settings/_external_issues_tracker_template.html.haml new file mode 100644 index 00000000000..b998df44665 --- /dev/null +++ b/app/views/admin/application_settings/_external_issues_tracker_template.html.haml @@ -0,0 +1,22 @@ +- service.fields.each do |field| + TOPD + / - name = field[:name] + / - value = "V"#@service.send(name) unless field[:type] == 'password' + / - type = field[:type] + / - placeholder = field[:placeholder] + / - choices = field[:choices] + / - default_choice = field[:default_choice] + + / .form-group + / = f.label name, class: "control-label" + / .col-sm-10 + / - if type == 'text' + / = f.text_field name, class: "form-control", placeholder: placeholder + / - elsif type == 'textarea' + / = f.text_area name, rows: 5, class: "form-control", placeholder: placeholder + / - elsif type == 'checkbox' + / = f.check_box name + / - elsif type == 'select' + / = f.select name, options_for_select(choices, value ? value : default_choice), {}, { class: "form-control" } + / - elsif type == 'password' + / = f.password_field name, class: 'form-control' diff --git a/app/views/admin/services/_form.html.haml b/app/views/admin/services/_form.html.haml new file mode 100644 index 00000000000..e869f45e242 --- /dev/null +++ b/app/views/admin/services/_form.html.haml @@ -0,0 +1,25 @@ +%h3.page-title + = @service.title + = boolean_to_icon @service.activated? + +%p #{@service.description} template + += form_for :service, url: admin_application_settings_service_path, method: :put, html: { class: 'form-horizontal fieldset-form' } do |f| + - if @service.errors.any? + #error_explanation + .alert.alert-danger + - @service.errors.full_messages.each do |msg| + %p= msg + + - @service.fields.each do |field| + - name = field[:name] + - type = field[:type] + - placeholder = field[:placeholder] + + .form-group + = f.label name, class: "control-label" + .col-sm-10 + = f.text_field name, class: "form-control", placeholder: placeholder + + .form-actions + = f.submit 'Save', class: 'btn btn-save' diff --git a/app/views/admin/services/edit.html.haml b/app/views/admin/services/edit.html.haml new file mode 100644 index 00000000000..bcc5832792f --- /dev/null +++ b/app/views/admin/services/edit.html.haml @@ -0,0 +1 @@ += render 'form' diff --git a/app/views/admin/services/index.html.haml b/app/views/admin/services/index.html.haml new file mode 100644 index 00000000000..1d3e192a325 --- /dev/null +++ b/app/views/admin/services/index.html.haml @@ -0,0 +1,22 @@ +%h3.page-title Service templates +%p.light Service template allows you to set default values for project services + +%table.table + %thead + %tr + %th + %th Service + %th Desription + %th Last edit + - @services.sort_by(&:title).each do |service| + %tr + %td + = icon("copy", class: 'clgray') + %td + = link_to edit_admin_application_settings_service_path(service.id) do + %strong= service.title + %td + = service.description + %td.light + = time_ago_in_words service.updated_at + ago -- cgit v1.2.1 From b3f944a3983db179fdaee0a1f0618c94600be823 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 11 Feb 2015 18:08:53 -0800 Subject: Annotate services. Add a link to service template. --- app/models/project_services/asana_service.rb | 17 +++++++++-------- app/models/project_services/assembla_service.rb | 3 ++- app/models/project_services/bamboo_service.rb | 3 ++- app/models/project_services/buildbox_service.rb | 4 ++-- app/models/project_services/campfire_service.rb | 3 ++- app/models/project_services/ci_service.rb | 3 ++- .../custom_issue_tracker_service.rb | 3 ++- .../project_services/emails_on_push_service.rb | 3 ++- app/models/project_services/flowdock_service.rb | 3 ++- app/models/project_services/gemnasium_service.rb | 3 ++- app/models/project_services/gitlab_ci_service.rb | 3 ++- .../gitlab_issue_tracker_service.rb | 3 ++- app/models/project_services/hipchat_service.rb | 3 ++- .../project_services/issue_tracker_service.rb | 3 ++- app/models/project_services/jira_service.rb | 3 ++- .../project_services/pivotaltracker_service.rb | 3 ++- app/models/project_services/pushover_service.rb | 3 ++- app/models/project_services/redmine_service.rb | 3 ++- app/models/project_services/slack_service.rb | 3 ++- app/models/project_services/teamcity_service.rb | 3 ++- .../_external_issues_tracker_template.html.haml | 22 ---------------------- app/views/layouts/nav/_admin.html.haml | 6 ++++++ 22 files changed, 53 insertions(+), 50 deletions(-) delete mode 100644 app/views/admin/application_settings/_external_issues_tracker_template.html.haml (limited to 'app') diff --git a/app/models/project_services/asana_service.rb b/app/models/project_services/asana_service.rb index db1e7a2b1cb..66b72572b9c 100644 --- a/app/models/project_services/asana_service.rb +++ b/app/models/project_services/asana_service.rb @@ -2,14 +2,15 @@ # # Table name: services # -# id :integer not null, primary key -# type :string(255) -# title :string(255) -# project_id :integer not null -# created_at :datetime -# updated_at :datetime -# active :boolean default(FALSE), not null -# properties :text +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# template :boolean default(FALSE) # require 'asana' diff --git a/app/models/project_services/assembla_service.rb b/app/models/project_services/assembla_service.rb index 0b90a14f39c..cf7598f35eb 100644 --- a/app/models/project_services/assembla_service.rb +++ b/app/models/project_services/assembla_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class AssemblaService < Service diff --git a/app/models/project_services/bamboo_service.rb b/app/models/project_services/bamboo_service.rb index 745609e5911..df68803152f 100644 --- a/app/models/project_services/bamboo_service.rb +++ b/app/models/project_services/bamboo_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class BambooService < CiService diff --git a/app/models/project_services/buildbox_service.rb b/app/models/project_services/buildbox_service.rb index 0ab67b79fe4..058c890ae45 100644 --- a/app/models/project_services/buildbox_service.rb +++ b/app/models/project_services/buildbox_service.rb @@ -5,13 +5,13 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # - require "addressable/uri" class BuildboxService < CiService diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb index 3116c311052..14b6b87a0b7 100644 --- a/app/models/project_services/campfire_service.rb +++ b/app/models/project_services/campfire_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class CampfireService < Service diff --git a/app/models/project_services/ci_service.rb b/app/models/project_services/ci_service.rb index b1d5e49ede3..5a26c25b3c3 100644 --- a/app/models/project_services/ci_service.rb +++ b/app/models/project_services/ci_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # # Base class for CI services diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb index 5845e2d3525..b29d1c86881 100644 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class CustomIssueTrackerService < IssueTrackerService diff --git a/app/models/project_services/emails_on_push_service.rb b/app/models/project_services/emails_on_push_service.rb index b9071b98295..86693ad0c7e 100644 --- a/app/models/project_services/emails_on_push_service.rb +++ b/app/models/project_services/emails_on_push_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class EmailsOnPushService < Service diff --git a/app/models/project_services/flowdock_service.rb b/app/models/project_services/flowdock_service.rb index 86705f5dabd..13e2dfceb1a 100644 --- a/app/models/project_services/flowdock_service.rb +++ b/app/models/project_services/flowdock_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # require "flowdock-git-hook" diff --git a/app/models/project_services/gemnasium_service.rb b/app/models/project_services/gemnasium_service.rb index 18fdd204ecd..a2c87ae88f1 100644 --- a/app/models/project_services/gemnasium_service.rb +++ b/app/models/project_services/gemnasium_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # require "gemnasium/gitlab_service" diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index 248f749b310..f4b463e8199 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class GitlabCiService < CiService diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 25e399883b7..b1eab24df19 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class GitlabIssueTrackerService < IssueTrackerService diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index c4c563b3cca..003e06a4c80 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class HipchatService < Service diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index cb6426d180d..51b2fb3dcc7 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class IssueTrackerService < Service diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index 7a32b0e8c2c..a159c287485 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class JiraService < IssueTrackerService diff --git a/app/models/project_services/pivotaltracker_service.rb b/app/models/project_services/pivotaltracker_service.rb index 09e114f9cca..287812c57a5 100644 --- a/app/models/project_services/pivotaltracker_service.rb +++ b/app/models/project_services/pivotaltracker_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class PivotaltrackerService < Service diff --git a/app/models/project_services/pushover_service.rb b/app/models/project_services/pushover_service.rb index a9b23f97ba0..3a3af59390a 100644 --- a/app/models/project_services/pushover_service.rb +++ b/app/models/project_services/pushover_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class PushoverService < Service diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index 547b2401832..e1dc10415e0 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class RedmineService < IssueTrackerService diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb index 963f5440b6f..297d8bbb5d4 100644 --- a/app/models/project_services/slack_service.rb +++ b/app/models/project_services/slack_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class SlackService < Service diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb index 287f5c0e84e..c4b6ef5d9a9 100644 --- a/app/models/project_services/teamcity_service.rb +++ b/app/models/project_services/teamcity_service.rb @@ -5,11 +5,12 @@ # id :integer not null, primary key # type :string(255) # title :string(255) -# project_id :integer not null +# project_id :integer # created_at :datetime # updated_at :datetime # active :boolean default(FALSE), not null # properties :text +# template :boolean default(FALSE) # class TeamcityService < CiService diff --git a/app/views/admin/application_settings/_external_issues_tracker_template.html.haml b/app/views/admin/application_settings/_external_issues_tracker_template.html.haml deleted file mode 100644 index b998df44665..00000000000 --- a/app/views/admin/application_settings/_external_issues_tracker_template.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -- service.fields.each do |field| - TOPD - / - name = field[:name] - / - value = "V"#@service.send(name) unless field[:type] == 'password' - / - type = field[:type] - / - placeholder = field[:placeholder] - / - choices = field[:choices] - / - default_choice = field[:default_choice] - - / .form-group - / = f.label name, class: "control-label" - / .col-sm-10 - / - if type == 'text' - / = f.text_field name, class: "form-control", placeholder: placeholder - / - elsif type == 'textarea' - / = f.text_area name, rows: 5, class: "form-control", placeholder: placeholder - / - elsif type == 'checkbox' - / = f.check_box name - / - elsif type == 'select' - / = f.select name, options_for_select(choices, value ? value : default_choice), {}, { class: "form-control" } - / - elsif type == 'password' - / = f.password_field name, class: 'form-control' diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 4813a4f16f5..4f864926d08 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -46,6 +46,12 @@ %span Applications + = nav_link(controller: :application_settings) do + = link_to admin_application_settings_services_path, title: 'Service Templates' do + %i.fa.fa-copy + %span + Service Templates + = nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do = link_to admin_application_settings_path, title: 'Settings' do %i.fa.fa-cogs -- cgit v1.2.1 From f7e902453511feb9e0d1717755df8723a0a648ea Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Wed, 11 Feb 2015 18:36:40 -0800 Subject: Remove unecessary icon. --- app/views/admin/services/_form.html.haml | 1 - 1 file changed, 1 deletion(-) (limited to 'app') diff --git a/app/views/admin/services/_form.html.haml b/app/views/admin/services/_form.html.haml index e869f45e242..d7490274489 100644 --- a/app/views/admin/services/_form.html.haml +++ b/app/views/admin/services/_form.html.haml @@ -1,6 +1,5 @@ %h3.page-title = @service.title - = boolean_to_icon @service.activated? %p #{@service.description} template -- cgit v1.2.1 From e3ecdb4810c94d8f3d4f899923dcfe12ddb2be56 Mon Sep 17 00:00:00 2001 From: Kelvin Mutuma Date: Thu, 12 Feb 2015 05:41:47 +0300 Subject: Show assignees in the merge-requests index --- app/views/projects/merge_requests/_merge_request.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index dedb060a231..2649078307d 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -15,8 +15,8 @@ = merge_request.target_branch .merge-request-info %span.light= "##{merge_request.iid}" - - if merge_request.author - authored by #{link_to_member(merge_request.source_project, merge_request.author)} + - if merge_request.assignee + assigned to #{link_to_member(merge_request.source_project, merge_request.assignee)} - if merge_request.votes_count > 0 = render 'votes/votes_inline', votable: merge_request - if merge_request.notes.any? -- cgit v1.2.1 From 783ecc9a2fe8fa18c0fc7692ec6a56e8ea06838a Mon Sep 17 00:00:00 2001 From: Kelvin Mutuma Date: Thu, 12 Feb 2015 05:59:38 +0300 Subject: Show Work In progress if a merge request is not assigned --- app/views/projects/merge_requests/_merge_request.html.haml | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app') diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 2649078307d..5afc87fb6b1 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -17,6 +17,8 @@ %span.light= "##{merge_request.iid}" - if merge_request.assignee assigned to #{link_to_member(merge_request.source_project, merge_request.assignee)} + - else + Work In Progress - if merge_request.votes_count > 0 = render 'votes/votes_inline', votable: merge_request - if merge_request.notes.any? -- cgit v1.2.1 From 9f33898f7aa9c2269aef8aad6cbd9075ab2efd3e Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 12 Feb 2015 09:19:55 -0800 Subject: All services can have templates. --- app/controllers/admin/services_controller.rb | 14 +++++++------- app/models/project.rb | 7 +------ app/models/service.rb | 5 +++++ app/views/admin/services/_form.html.haml | 14 +++++++++++++- 4 files changed, 26 insertions(+), 14 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/services_controller.rb b/app/controllers/admin/services_controller.rb index 5697e1a5492..554a7d83d9f 100644 --- a/app/controllers/admin/services_controller.rb +++ b/app/controllers/admin/services_controller.rb @@ -26,18 +26,14 @@ class Admin::ServicesController < Admin::ApplicationController def services_templates templates = [] - allowed_templates.each do |service| - service_template = service.constantize + Service.available_services_names.each do |service| + service_template = service.concat("_service").camelize.constantize templates << service_template.where(template: true).first_or_create end templates end - def allowed_templates - %w( JiraService RedmineService CustomIssueTrackerService ) - end - def service @service ||= Service.where(id: params[:id], template: true).first end @@ -45,7 +41,11 @@ class Admin::ServicesController < Admin::ApplicationController def application_services_params params.permit(:id, service: [ - :title, :project_url, :description, :issues_url, :new_issue_url + :title, :token, :type, :active, :api_key, :subdomain, + :room, :recipients, :project_url, :webhook, + :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, + :build_key, :server, :teamcity_url, :build_type, + :description, :issues_url, :new_issue_url, :restrict_to_branch ]) end end diff --git a/app/models/project.rb b/app/models/project.rb index f7cbbf3ace4..56e1aa29040 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -355,7 +355,7 @@ class Project < ActiveRecord::Base def build_missing_services services_templates = Service.where(template: true) - available_services_names.each do |service_name| + Service.available_services_names.each do |service_name| service = find_service(services, service_name) # If service is available but missing in db @@ -377,11 +377,6 @@ class Project < ActiveRecord::Base list.find { |service| service.to_param == name } end - def available_services_names - %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla asana - emails_on_push gemnasium slack pushover buildbox bamboo teamcity jira redmine custom_issue_tracker) - end - def gitlab_ci? gitlab_ci_service && gitlab_ci_service.active end diff --git a/app/models/service.rb b/app/models/service.rb index 0099dbe65c0..f87d875c10a 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -98,6 +98,11 @@ class Service < ActiveRecord::Base self.category == :issue_tracker end + def self.available_services_names + %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla asana + emails_on_push gemnasium slack pushover buildbox bamboo teamcity jira redmine custom_issue_tracker) + end + def self.create_from_template(project_id, template) service = template.dup service.template = false diff --git a/app/views/admin/services/_form.html.haml b/app/views/admin/services/_form.html.haml index d7490274489..d8242e37621 100644 --- a/app/views/admin/services/_form.html.haml +++ b/app/views/admin/services/_form.html.haml @@ -12,13 +12,25 @@ - @service.fields.each do |field| - name = field[:name] + - value = @service.send(name) unless field[:type] == 'password' - type = field[:type] - placeholder = field[:placeholder] + - choices = field[:choices] + - default_choice = field[:default_choice] .form-group = f.label name, class: "control-label" .col-sm-10 - = f.text_field name, class: "form-control", placeholder: placeholder + - if type == 'text' + = f.text_field name, class: "form-control", placeholder: placeholder + - elsif type == 'textarea' + = f.text_area name, rows: 5, class: "form-control", placeholder: placeholder + - elsif type == 'checkbox' + = f.check_box name + - elsif type == 'select' + = f.select name, options_for_select(choices, value ? value : default_choice), {}, { class: "form-control" } + - elsif type == 'password' + = f.password_field name, class: 'form-control' .form-actions = f.submit 'Save', class: 'btn btn-save' -- cgit v1.2.1 From e8271226b1a474f097909b8006d78dd60bbca7be Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 12 Feb 2015 10:57:08 -0800 Subject: Use the service_name. --- app/controllers/admin/services_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/services_controller.rb b/app/controllers/admin/services_controller.rb index 554a7d83d9f..e80cabd6e18 100644 --- a/app/controllers/admin/services_controller.rb +++ b/app/controllers/admin/services_controller.rb @@ -26,8 +26,8 @@ class Admin::ServicesController < Admin::ApplicationController def services_templates templates = [] - Service.available_services_names.each do |service| - service_template = service.concat("_service").camelize.constantize + Service.available_services_names.each do |service_name| + service_template = service_name.concat("_service").camelize.constantize templates << service_template.where(template: true).first_or_create end -- cgit v1.2.1 From 6685661b549cdece3b93131af168b5174bc0403f Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 11 Feb 2015 14:12:43 +0100 Subject: Clean username acquired from OAuth/LDAP. Fixes #1967. --- app/models/user.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index 3a7dfabeafe..d7f688ec138 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -243,6 +243,22 @@ class User < ActiveRecord::Base def build_user(attrs = {}) User.new(attrs) end + + def clean_username(username) + username.gsub!(/@.*\z/, "") + username.gsub!(/\.git\z/, "") + username.gsub!(/\A-/, "") + username.gsub!(/[^a-zA-Z0-9_\-\.]/, "") + + counter = 0 + base = username + while by_login(username).present? + counter += 1 + username = "#{base}#{counter}" + end + + username + end end # -- cgit v1.2.1 From 1a89db5ffbca432c14eae9d364debc5b87b4635e Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 12 Feb 2015 13:02:58 -0800 Subject: Try to test settings added in the service. --- app/controllers/projects/services_controller.rb | 2 +- .../project_services/issue_tracker_service.rb | 23 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index b3110eacc18..2b3e70f7bdb 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -29,7 +29,7 @@ class Projects::ServicesController < Projects::ApplicationController if @service.execute(data) message = { notice: 'We sent a request to the provided URL' } else - message = { alert: 'We tried to send a request to the provided URL but error occured' } + message = { alert: 'We tried to send a request to the provided URL but an error occured' } end redirect_to :back, message diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 51b2fb3dcc7..3d927bb50d4 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -65,6 +65,29 @@ class IssueTrackerService < Service end end + def execute(data) + message = "#{self.type} was unable to reach #{self.project_url}. Check the url and try again." + result = false + + begin + url = URI.parse(self.project_url) + + if url.host && url.port + http = Net::HTTP.start(url.host, url.port, {open_timeout: 5, read_timeout: 5}) + response = http.head("/") + + if response + message = "#{self.type} received response #{response.code} when attempting to connect to #{self.project_url}" + result = true + end + end + rescue Timeout::Error, SocketError, Errno::ECONNRESET, Errno::ECONNREFUSED => error + message = "#{self.type} had an error when trying to connect to #{self.project_url}: #{error.message}" + end + Rails.logger.info(message) + result + end + private def enabled_in_gitlab_config -- cgit v1.2.1 From 8a37435738423853654ec622d59fbb2048ad7a1e Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 12 Feb 2015 13:21:47 -0800 Subject: Fix rubocop error. --- app/models/project_services/issue_tracker_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 3d927bb50d4..c991a34ecdb 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -73,7 +73,7 @@ class IssueTrackerService < Service url = URI.parse(self.project_url) if url.host && url.port - http = Net::HTTP.start(url.host, url.port, {open_timeout: 5, read_timeout: 5}) + http = Net::HTTP.start(url.host, url.port, { open_timeout: 5, read_timeout: 5 }) response = http.head("/") if response -- cgit v1.2.1 From eccf695640680050127c830887631d241dc7c8be Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 12 Feb 2015 17:06:55 -0800 Subject: Explained in the integration documentation how to enable external issue tracker --- app/models/project_services/jira_service.rb | 14 ++++++++++++++ app/views/admin/services/_form.html.haml | 4 ++++ app/views/layouts/nav/_admin.html.haml | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index a159c287485..4c056605ea8 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -14,9 +14,23 @@ # class JiraService < IssueTrackerService + include Rails.application.routes.url_helpers prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url + def help + issue_tracker_link = help_page_path("integration", "external-issue-tracker") + + line1 = "Setting `project_url`, `issues_url` and `new_issue_url` will "\ + "allow a user to easily navigate to the Jira issue tracker. "\ + "See the [integration doc](#{issue_tracker_link}) for details." + + line2 = 'Support for referencing commits and automatic closing of Jira issues directly ' \ + 'from GitLab is [available in GitLab EE.](http://doc.gitlab.com/ee/integration/jira.html)' + + [line1, line2].join("\n\n") + end + def title if self.properties && self.properties['title'].present? self.properties['title'] diff --git a/app/views/admin/services/_form.html.haml b/app/views/admin/services/_form.html.haml index d8242e37621..5df8849317b 100644 --- a/app/views/admin/services/_form.html.haml +++ b/app/views/admin/services/_form.html.haml @@ -9,6 +9,10 @@ .alert.alert-danger - @service.errors.full_messages.each do |msg| %p= msg + - if @service.help.present? + .bs-callout + = preserve do + = markdown @service.help - @service.fields.each do |field| - name = field[:name] diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 4f864926d08..74334b12e63 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -46,7 +46,7 @@ %span Applications - = nav_link(controller: :application_settings) do + = nav_link(controller: :services) do = link_to admin_application_settings_services_path, title: 'Service Templates' do %i.fa.fa-copy %span -- cgit v1.2.1 From 07d05d2df7d1b79406232e91a7354e0c7fd1877a Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 11:57:56 +0100 Subject: Move all event creation to EventCreateService. --- app/controllers/projects/tags_controller.rb | 2 +- app/models/event.rb | 23 ---------- app/models/members/project_member.rb | 17 +++----- app/services/create_branch_service.rb | 2 +- app/services/create_tag_service.rb | 2 +- app/services/delete_branch_service.rb | 2 +- app/services/event_create_service.rb | 68 ++++++++++++++++++++++------- app/services/git_push_service.rb | 11 +---- app/services/git_tag_push_service.rb | 11 +---- 9 files changed, 64 insertions(+), 74 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index 64b820160d3..22eb8f67f9a 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -27,7 +27,7 @@ class Projects::TagsController < Projects::ApplicationController tag = @repository.find_tag(params[:id]) if tag && @repository.rm_tag(tag.name) - Event.create_ref_event(@project, current_user, tag, 'rm', 'refs/tags') + EventCreateService.new.push_ref(@project, current_user, tag, 'rm', 'refs/tags') end respond_to do |format| diff --git a/app/models/event.rb b/app/models/event.rb index 9a42d380f87..3ead45a4bb4 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -49,29 +49,6 @@ class Event < ActiveRecord::Base scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent } class << self - def create_ref_event(project, user, ref, action = 'add', prefix = 'refs/heads') - commit = project.repository.commit(ref.target) - - if action.to_s == 'add' - before = '00000000' - after = commit.id - else - before = commit.id - after = '00000000' - end - - Event.create( - project: project, - action: Event::PUSHED, - data: { - ref: "#{prefix}/#{ref.name}", - before: before, - after: after - }, - author_id: user.id - ) - end - def reset_event_cache_for(target) Event.where(target_id: target.id, target_type: target.class.to_s). order('id DESC').limit(100). diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb index 30c09f768d7..ff05ab1590f 100644 --- a/app/models/members/project_member.rb +++ b/app/models/members/project_member.rb @@ -114,12 +114,8 @@ class ProjectMember < Member end def post_create_hook - Event.create( - project_id: self.project.id, - action: Event::JOINED, - author_id: self.user.id - ) + event_service.join_project(self.project, self.user) notification_service.new_team_member(self) unless owner? system_hook_service.execute_hooks_for(self, :create) end @@ -129,15 +125,14 @@ class ProjectMember < Member end def post_destroy_hook - Event.create( - project_id: self.project.id, - action: Event::LEFT, - author_id: self.user.id - ) - + event_service.leave_project(self.project, self.user) system_hook_service.execute_hooks_for(self, :destroy) end + def event_service + EventCreateService.new + end + def notification_service NotificationService.new end diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb index 901f67bafb3..5e971c7891c 100644 --- a/app/services/create_branch_service.rb +++ b/app/services/create_branch_service.rb @@ -17,7 +17,7 @@ class CreateBranchService < BaseService new_branch = repository.find_branch(branch_name) if new_branch - Event.create_ref_event(project, current_user, new_branch, 'add') + EventCreateService.new.push_ref(project, current_user, new_branch, 'add') return success(new_branch) else return error('Invalid reference name') diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb index 041c2287c36..a735d3f7f20 100644 --- a/app/services/create_tag_service.rb +++ b/app/services/create_tag_service.rb @@ -26,7 +26,7 @@ class CreateTagService < BaseService project.gitlab_ci_service.async_execute(push_data) end - Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags') + EventCreateService.new.push_ref(project, current_user, new_tag, 'add', 'refs/tags') success(new_tag) else error('Invalid reference name') diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb index cae6327fe72..c26aee2b0aa 100644 --- a/app/services/delete_branch_service.rb +++ b/app/services/delete_branch_service.rb @@ -25,7 +25,7 @@ class DeleteBranchService < BaseService end if repository.rm_branch(branch_name) - Event.create_ref_event(project, current_user, branch, 'rm') + EventCreateService.new.push_ref(project, current_user, branch, 'rm') success('Branch was removed') else return error('Failed to remove branch') diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb index 8d8a5873e62..bb3c37023a0 100644 --- a/app/services/event_create_service.rb +++ b/app/services/event_create_service.rb @@ -7,58 +7,94 @@ # class EventCreateService def open_issue(issue, current_user) - create_event(issue, current_user, Event::CREATED) + create_record_event(issue, current_user, Event::CREATED) end def close_issue(issue, current_user) - create_event(issue, current_user, Event::CLOSED) + create_record_event(issue, current_user, Event::CLOSED) end def reopen_issue(issue, current_user) - create_event(issue, current_user, Event::REOPENED) + create_record_event(issue, current_user, Event::REOPENED) end def open_mr(merge_request, current_user) - create_event(merge_request, current_user, Event::CREATED) + create_record_event(merge_request, current_user, Event::CREATED) end def close_mr(merge_request, current_user) - create_event(merge_request, current_user, Event::CLOSED) + create_record_event(merge_request, current_user, Event::CLOSED) end def reopen_mr(merge_request, current_user) - create_event(merge_request, current_user, Event::REOPENED) + create_record_event(merge_request, current_user, Event::REOPENED) end def merge_mr(merge_request, current_user) - create_event(merge_request, current_user, Event::MERGED) + create_record_event(merge_request, current_user, Event::MERGED) end def open_milestone(milestone, current_user) - create_event(milestone, current_user, Event::CREATED) + create_record_event(milestone, current_user, Event::CREATED) end def close_milestone(milestone, current_user) - create_event(milestone, current_user, Event::CLOSED) + create_record_event(milestone, current_user, Event::CLOSED) end def reopen_milestone(milestone, current_user) - create_event(milestone, current_user, Event::REOPENED) + create_record_event(milestone, current_user, Event::REOPENED) end def leave_note(note, current_user) - create_event(note, current_user, Event::COMMENTED) + create_record_event(note, current_user, Event::COMMENTED) + end + + def join_project(project, current_user) + create_event(project, current_user, Event::JOINED) + end + + def leave_project(project, current_user) + create_event(project, current_user, Event::LEFT) + end + + def push_ref(project, current_user, ref, action = 'add', prefix = 'refs/heads') + commit = project.repository.commit(ref.target) + + if action.to_s == 'add' + before = '00000000' + after = commit.id + else + before = commit.id + after = '00000000' + end + + data = { + ref: "#{prefix}/#{ref.name}", + before: before, + after: after + } + + push(project, current_user, data) + end + + def push(project, current_user, push_data) + create_event(project, current_user, Event::PUSHED, data: push_data) end private - def create_event(record, current_user, status) - Event.create( - project: record.project, - target_id: record.id, - target_type: record.class.name, + def create_record_event(record, current_user, status) + create_event(record.project, current_user, status, target_id: record.id, target_type: record.class.name) + end + + def create_event(project, current_user, status, attributes = {}) + attributes.reverse_merge!( + project: project, action: status, author_id: current_user.id ) + + Event.create(attributes) end end diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index c775f79ec29..f21e6ac207d 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -52,7 +52,7 @@ class GitPushService end @push_data = post_receive_data(oldrev, newrev, ref) - create_push_event(@push_data) + EventCreateService.new.push(project, user, @push_data) project.execute_hooks(@push_data.dup, :push_hooks) project.execute_services(@push_data.dup) end @@ -60,15 +60,6 @@ class GitPushService protected - def create_push_event(push_data) - Event.create!( - project: project, - action: Event::PUSHED, - data: push_data, - author_id: push_data[:user_id] - ) - end - # Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched, # close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables. def process_commit_messages(ref) diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb index c24809ad607..46d8987f12d 100644 --- a/app/services/git_tag_push_service.rb +++ b/app/services/git_tag_push_service.rb @@ -5,7 +5,7 @@ class GitTagPushService @project, @user = project, user @push_data = create_push_data(oldrev, newrev, ref) - create_push_event + EventCreateService.new.push(project, user, @push_data) project.repository.expire_cache project.execute_hooks(@push_data.dup, :tag_push_hooks) @@ -22,13 +22,4 @@ class GitTagPushService Gitlab::PushDataBuilder. build(project, user, oldrev, newrev, ref, []) end - - def create_push_event - Event.create!( - project: project, - action: Event::PUSHED, - data: push_data, - author_id: push_data[:user_id] - ) - end end -- cgit v1.2.1 From 522efa43fe9ff5828838a5d5ed49db23bfd88c95 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 12:00:12 +0100 Subject: Refactor event title generation for more consistent messages. Example: "User joined project Namespace / Project" rather than "User joined project at Namespace / Project" --- app/helpers/events_helper.rb | 53 +++++++++++++---------- app/models/event.rb | 72 ++++++++++++++++++-------------- app/views/events/event/_common.html.haml | 10 +++-- app/views/events/event/_note.html.haml | 6 ++- app/views/events/event/_push.html.haml | 2 +- 5 files changed, 85 insertions(+), 58 deletions(-) (limited to 'app') diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index d05f6df5f9f..ca64499675c 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -10,11 +10,15 @@ module EventsHelper end def event_action_name(event) - target = if event.target_type - event.target_type.titleize.downcase - else - 'project' - end + target = if event.target_type + if event.note? + event.note_target_type + else + event.target_type.titleize.downcase + end + else + 'project' + end [event.action_name, target].join(" ") end @@ -42,21 +46,30 @@ module EventsHelper end def event_feed_title(event) - if event.issue? - "#{event.author_name} #{event.action_name} issue ##{event.target_iid}: #{event.issue_title} at #{event.project_name}" - elsif event.merge_request? - "#{event.author_name} #{event.action_name} MR ##{event.target_iid}: #{event.merge_request_title} at #{event.project_name}" - elsif event.push? - "#{event.author_name} #{event.push_action_name} #{event.ref_type} #{event.ref_name} at #{event.project_name}" - elsif event.membership_changed? - "#{event.author_name} #{event.action_name} #{event.project_name}" - elsif event.note? && event.note_commit? - "#{event.author_name} commented on #{event.note_target_type} #{event.note_short_commit_id} at #{event.project_name}" - elsif event.note? - "#{event.author_name} commented on #{event.note_target_type} ##{truncate event.note_target_iid} at #{event.project_name}" - else - "" + words = [] + words << event.author_name + words << event_action_name(event) + + if event.push? + words << event.ref_type + words << event.ref_name + words << "at" + elsif event.commented? + if event.note_commit? + words << event.note_short_commit_id + else + words << "##{truncate event.note_target_iid}" + end + words << "at" + elsif event.target + words << "##{event.target_iid}:" + words << event.target.title if event.target.respond_to?(:title) + words << "at" end + + words << event.project_name + + words.join(" ") end def event_feed_url(event) @@ -96,8 +109,6 @@ module EventsHelper render "events/event_push", event: event elsif event.merge_request? render "events/event_merge_request", merge_request: event.merge_request - elsif event.push? - render "events/event_push", event: event elsif event.note? render "events/event_note", note: event.note end diff --git a/app/models/event.rb b/app/models/event.rb index 3ead45a4bb4..87be24e31a8 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -75,25 +75,43 @@ class Event < ActiveRecord::Base end def target_title - if target && target.respond_to?(:title) - target.title - end + target.title if target && target.respond_to?(:title) + end + + def created? + action == CREATED end def push? - action == self.class::PUSHED && valid_push? + action == PUSHED && valid_push? end def merged? - action == self.class::MERGED + action == MERGED end def closed? - action == self.class::CLOSED + action == CLOSED end def reopened? - action == self.class::REOPENED + action == REOPENED + end + + def joined? + action == JOINED + end + + def left? + action == LEFT + end + + def commented? + action == COMMENTED + end + + def membership_changed? + joined? || left? end def milestone? @@ -112,32 +130,32 @@ class Event < ActiveRecord::Base target_type == "MergeRequest" end - def joined? - action == JOINED - end - - def left? - action == LEFT - end - - def membership_changed? - joined? || left? + def milestone + target if milestone? end def issue - target if target_type == "Issue" + target if issue? end def merge_request - target if target_type == "MergeRequest" + target if merge_request? end def note - target if target_type == "Note" + target if note? end def action_name - if closed? + if push? + if new_ref? + "pushed new" + elsif rm_ref? + "deleted" + else + "pushed to" + end + elsif closed? "closed" elsif merged? "accepted" @@ -145,6 +163,8 @@ class Event < ActiveRecord::Base 'joined' elsif left? 'left' + elsif commented? + "commented on" else "opened" end @@ -213,16 +233,6 @@ class Event < ActiveRecord::Base tag? ? "tag" : "branch" end - def push_action_name - if new_ref? - "pushed new" - elsif rm_ref? - "deleted" - else - "pushed to" - end - end - def push_with_commits? md_ref? && commits.any? && commit_from && commit_to end diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml index a9d3adf41df..b0cfba0dea1 100644 --- a/app/views/events/event/_common.html.haml +++ b/app/views/events/event/_common.html.haml @@ -1,15 +1,17 @@ .event-title %span.author_name= link_to_author event - %span.event_label{class: event.action_name}= event_action_name(event) + %span.event_label{class: event.action_name} + = event_action_name(event) + - if event.target %strong= link_to "##{event.target_iid}", [event.project, event.target] - - else - %strong= gfm event.target_title - at + at + - if event.project = link_to_project event.project - else = event.project_name + - if event.target.respond_to?(:title) .event-body .event-note diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml index 6ec8e54fba5..0acb8538778 100644 --- a/app/views/events/event/_note.html.haml +++ b/app/views/events/event/_note.html.haml @@ -1,6 +1,10 @@ .event-title %span.author_name= link_to_author event - %span.event_label commented on #{event_note_title_html(event)} at + %span.event_label + = event.action_name + = event_note_title_html(event) + at + - if event.project = link_to_project event.project - else diff --git a/app/views/events/event/_push.html.haml b/app/views/events/event/_push.html.haml index b912b5e092f..4b645550517 100644 --- a/app/views/events/event/_push.html.haml +++ b/app/views/events/event/_push.html.haml @@ -1,6 +1,6 @@ .event-title %span.author_name= link_to_author event - %span.event_label.pushed #{event.push_action_name} #{event.ref_type} + %span.event_label.pushed #{event.action_name} #{event.ref_type} - if event.rm_ref? %strong= event.ref_name - else -- cgit v1.2.1 From 9b917b4a73ddd7607cd19847e89381fda0ec65d5 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 12:01:28 +0100 Subject: Add "User created project Namespace / Project" event --- app/models/event.rb | 12 ++++++++++++ app/models/members/project_member.rb | 8 +++++--- app/services/event_create_service.rb | 4 ++++ app/services/projects/create_service.rb | 12 +++++------- 4 files changed, 26 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/models/event.rb b/app/models/event.rb index 87be24e31a8..cae7f0be85b 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -61,6 +61,8 @@ class Event < ActiveRecord::Base true elsif membership_changed? true + elsif created_project? + true else (issue? || merge_request? || note? || milestone?) && target end @@ -114,6 +116,14 @@ class Event < ActiveRecord::Base joined? || left? end + def created_project? + created? && !target + end + + def created_target? + created? && target + end + def milestone? target_type == "Milestone" end @@ -165,6 +175,8 @@ class Event < ActiveRecord::Base 'left' elsif commented? "commented on" + elsif created_project? + "created" else "opened" end diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb index ff05ab1590f..e4791d0f0aa 100644 --- a/app/models/members/project_member.rb +++ b/app/models/members/project_member.rb @@ -114,9 +114,11 @@ class ProjectMember < Member end def post_create_hook - - event_service.join_project(self.project, self.user) - notification_service.new_team_member(self) unless owner? + unless owner? + event_service.join_project(self.project, self.user) + notification_service.new_team_member(self) + end + system_hook_service.execute_hooks_for(self, :create) end diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb index bb3c37023a0..ba9547b9242 100644 --- a/app/services/event_create_service.rb +++ b/app/services/event_create_service.rb @@ -58,6 +58,10 @@ class EventCreateService create_event(project, current_user, Event::LEFT) end + def create_project(project, current_user) + create_event(project, current_user, Event::CREATED) + end + def push_ref(project, current_user, ref, action = 'add', prefix = 'refs/heads') commit = project.repository.commit(ref.target) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 139de70114b..4fe790b98f1 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -52,13 +52,7 @@ module Projects end end - if @project.persisted? - if @project.wiki_enabled? - @project.create_wiki - end - - after_create_actions - end + after_create_actions if @project.persisted? @project rescue => ex @@ -79,6 +73,10 @@ module Projects def after_create_actions log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") + + @project.create_wiki if @project.wiki_enabled? + + event_service.create_project(@project, current_user) system_hook_service.execute_hooks_for(@project, :create) unless @project.group -- cgit v1.2.1 From ce08f919bfab73178b2f8c584f34fd8849834365 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 12:02:17 +0100 Subject: Add link to share via twitter to "created project" event. --- app/assets/stylesheets/sections/events.scss | 4 ++++ .../admin/application_settings_controller.rb | 1 + app/helpers/application_settings_helper.rb | 4 ++++ app/models/application_setting.rb | 2 ++ .../admin/application_settings/_form.html.haml | 5 ++++ app/views/events/_event.html.haml | 6 +++-- app/views/events/event/_created_project.html.haml | 27 ++++++++++++++++++++++ 7 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 app/views/events/event/_created_project.html.haml (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index 9582c995980..b7614513216 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -64,6 +64,10 @@ .md { font-size: 13px; + + iframe.twitter-share-button { + vertical-align: bottom; + } } pre { diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index 7458542fc73..2b0c500e97a 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -26,6 +26,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController :signup_enabled, :signin_enabled, :gravatar_enabled, + :twitter_sharing_enabled, :sign_in_text, :home_page_url ) diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 04299316102..1ee086da997 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -3,6 +3,10 @@ module ApplicationSettingsHelper current_application_settings.gravatar_enabled? end + def twitter_sharing_enabled? + current_application_settings.twitter_sharing_enabled? + end + def signup_enabled? current_application_settings.signup_enabled? end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 6d4e220b16c..f1d918e5457 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -8,6 +8,7 @@ # signup_enabled :boolean # signin_enabled :boolean # gravatar_enabled :boolean +# twitter_sharing_enabled :boolean # sign_in_text :text # created_at :datetime # updated_at :datetime @@ -30,6 +31,7 @@ class ApplicationSetting < ActiveRecord::Base default_branch_protection: Settings.gitlab['default_branch_protection'], signup_enabled: Settings.gitlab['signup_enabled'], signin_enabled: Settings.gitlab['signin_enabled'], + twitter_sharing_enabled: Settings.gitlab['twitter_sharing_enabled'], gravatar_enabled: Settings.gravatar['enabled'], sign_in_text: Settings.extra['sign_in_text'], ) diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index ae0c70a79c7..f528d69f431 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -19,6 +19,11 @@ = f.label :gravatar_enabled, class: 'control-label' .col-sm-10 = f.check_box :gravatar_enabled, class: 'checkbox' + .form-group + = f.label :twitter_sharing_enabled, "Twitter enabled", class: 'control-label' + .col-sm-10 + = f.check_box :twitter_sharing_enabled, class: 'checkbox' + %span.help-block Show users button to share their newly created public or internal projects on twitter %fieldset %legend Misc .form-group diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index c7976ba564f..02b1dec753c 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -3,12 +3,14 @@ .event-item-timestamp #{time_ago_with_tooltip(event.created_at)} - = cache event do + = cache [event, current_user] do = image_tag avatar_icon(event.author_email, 24), class: "avatar s24", alt:'' - if event.push? = render "events/event/push", event: event - - elsif event.note? + - elsif event.commented? = render "events/event/note", event: event + - elsif event.created_project? + = render "events/event/created_project", event: event - else = render "events/event/common", event: event \ No newline at end of file diff --git a/app/views/events/event/_created_project.html.haml b/app/views/events/event/_created_project.html.haml new file mode 100644 index 00000000000..0ebbb841cca --- /dev/null +++ b/app/views/events/event/_created_project.html.haml @@ -0,0 +1,27 @@ +.event-title + %span.author_name= link_to_author event + %span.event_label{class: event.action_name} + = event_action_name(event) + + - if event.project + = link_to_project event.project + - else + = event.project_name + +- if current_user == event.author && !event.project.private? && twitter_sharing_enabled? + .event-body + .event-note + .md + %p + Congratulations! Why not share your accomplishment with the world? + + %a.twitter-share-button{ | + href: "https://twitter.com/share", | + class: "twitter-share-button", | + "data-url" => event.project.web_url, | + "data-text" => "I just created a new project in GitLab! GitLab is version control on your server, like GitHub but better.", | + "data-size" => "medium", | + "data-related" => "gitlab", | + "data-count" => "none"} + Tweet + \ No newline at end of file -- cgit v1.2.1 From 161d15541a65ba167830f9a9bf5d181d0c5f4d77 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 12:39:11 +0100 Subject: Prevent autogenerated OAuth username to clash with existing namespace. --- app/models/namespace.rb | 4 ++++ app/models/user.rb | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/namespace.rb b/app/models/namespace.rb index ba0b2b71cf9..2c7ed376265 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -44,6 +44,10 @@ class Namespace < ActiveRecord::Base scope :root, -> { where('type IS NULL') } + def self.by_path(path) + where('lower(path) = :value', value: path.downcase).first + end + def self.search(query) where("name LIKE :query OR path LIKE :query", query: "%#{query}%") end diff --git a/app/models/user.rb b/app/models/user.rb index d7f688ec138..a97678999bc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -252,7 +252,7 @@ class User < ActiveRecord::Base counter = 0 base = username - while by_login(username).present? + while User.by_login(username).present? || Namespace.by_path(username).present? counter += 1 username = "#{base}#{counter}" end @@ -290,7 +290,8 @@ class User < ActiveRecord::Base def namespace_uniq namespace_name = self.username - if Namespace.find_by(path: namespace_name) + existing_namespace = Namespace.by_path(namespace_name) + if existing_namespace && existing_namespace != self.namespace self.errors.add :username, "already exists" end end -- cgit v1.2.1 From 34cc4c598232d2e27dcc99f5534dbe318e89cff9 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 14:31:42 +0100 Subject: Link head panel titles to relevant root page. --- app/controllers/snippets_controller.rb | 1 + app/controllers/users_controller.rb | 1 + app/views/layouts/admin.html.haml | 2 +- app/views/layouts/application.html.haml | 2 +- app/views/layouts/explore.html.haml | 4 ++-- app/views/layouts/group.html.haml | 2 +- app/views/layouts/navless.html.haml | 2 +- app/views/layouts/profile.html.haml | 2 +- app/views/layouts/public_group.html.haml | 2 +- app/views/layouts/public_users.html.haml | 2 +- app/views/layouts/search.html.haml | 2 +- 11 files changed, 12 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb index 1ed3bc388fb..6ac048e4b83 100644 --- a/app/controllers/snippets_controller.rb +++ b/app/controllers/snippets_controller.rb @@ -106,6 +106,7 @@ class SnippetsController < ApplicationController def set_title @title = 'Snippets' + @title_url = snippets_path end def snippet_params diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 57d8ef09faf..84a04c5ebe6 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -19,6 +19,7 @@ class UsersController < ApplicationController where(project_id: authorized_projects_ids).limit(30) @title = @user.name + @title_url = user_path(@user) respond_to do |format| format.html diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index dc8652cb145..e8751a6987e 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -2,5 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: "Admin area" %body{class: "#{app_theme} #{theme_type} admin", :'data-page' => body_data_page} - = render "layouts/head_panel", title: "Admin area" + = render "layouts/head_panel", title: link_to("Admin area", admin_root_path) = render 'layouts/page', sidebar: 'layouts/nav/admin' diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index e5420a13605..49123744ffa 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -2,5 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: "Dashboard" %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page } - = render "layouts/head_panel", title: "Dashboard" + = render "layouts/head_panel", title: link_to("Dashboard", root_path) = render 'layouts/page', sidebar: 'layouts/nav/dashboard' diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index 9813d846542..09855b222dc 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -5,9 +5,9 @@ %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" - if current_user - = render "layouts/head_panel", title: page_title + = render "layouts/head_panel", title: link_to(page_title, explore_root_path) - else - = render "layouts/public_head_panel", title: page_title + = render "layouts/public_head_panel", title: link_to(page_title, explore_root_path) .container.navless-container .content .explore-title diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index 98edcf3a140..fa0ed317ce1 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -2,5 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: group_head_title %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} - = render "layouts/head_panel", title: @group.name + = render "layouts/head_panel", title: link_to(@group.name, group_path(@group)) = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/navless.html.haml b/app/views/layouts/navless.html.haml index 730f3d09277..a3b55542bf7 100644 --- a/app/views/layouts/navless.html.haml +++ b/app/views/layouts/navless.html.haml @@ -3,7 +3,7 @@ = render "layouts/head", title: @title %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" - = render "layouts/head_panel", title: @title + = render "layouts/head_panel", title: defined?(@title_url) ? link_to(@title, @title_url) : @title .container.navless-container .content = render "layouts/flash" diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 89d816061e2..19d6efed78e 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -2,5 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: "Profile" %body{class: "#{app_theme} #{theme_type} profile", :'data-page' => body_data_page} - = render "layouts/head_panel", title: "Profile" + = render "layouts/head_panel", title: link_to("Profile", profile_path) = render 'layouts/page', sidebar: 'layouts/nav/profile' diff --git a/app/views/layouts/public_group.html.haml b/app/views/layouts/public_group.html.haml index ae3d2bd8a89..4b69329b8fe 100644 --- a/app/views/layouts/public_group.html.haml +++ b/app/views/layouts/public_group.html.haml @@ -2,5 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: group_head_title %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} - = render "layouts/public_head_panel", title: "group: #{@group.name}" + = render "layouts/public_head_panel", title: link_to(@group.name, group_path(@group)) = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/public_users.html.haml b/app/views/layouts/public_users.html.haml index 37767df33d2..3538a8b1699 100644 --- a/app/views/layouts/public_users.html.haml +++ b/app/views/layouts/public_users.html.haml @@ -2,5 +2,5 @@ %html{ lang: "en"} = render "layouts/head", title: @title %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} - = render "layouts/public_head_panel", title: @title + = render "layouts/public_head_panel", title: defined?(@title_url) ? link_to(@title, @title_url) : @title = render 'layouts/page' diff --git a/app/views/layouts/search.html.haml b/app/views/layouts/search.html.haml index 6d001e7ee1c..177e2073a0d 100644 --- a/app/views/layouts/search.html.haml +++ b/app/views/layouts/search.html.haml @@ -3,7 +3,7 @@ = render "layouts/head", title: "Search" %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} = render "layouts/broadcast" - = render "layouts/head_panel", title: "Search" + = render "layouts/head_panel", title: link_to("Search", search_path) .container.navless-container .content = render "layouts/flash" -- cgit v1.2.1 From 25e44d05300a6b5b35232b27b4ccb27f47f09a67 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 13:33:28 +0100 Subject: Allow users that signed up via OAuth to set their password in order to use Git over HTTP(S). --- app/assets/javascripts/project.js.coffee | 8 +++++++- app/controllers/admin/users_controller.rb | 2 +- app/controllers/profiles/passwords_controller.rb | 8 +++++--- app/controllers/profiles_controller.rb | 2 +- app/models/user.rb | 2 ++ app/views/profiles/passwords/edit.html.haml | 23 ++++++++++++++--------- app/views/profiles/passwords/new.html.haml | 9 +++++---- app/views/projects/empty.html.haml | 1 + app/views/projects/show.html.haml | 1 + app/views/shared/_clone_panel.html.haml | 16 ++++++++++++++-- app/views/shared/_no_password.html.haml | 8 ++++++++ app/views/shared/_no_ssh.html.haml | 2 +- 12 files changed, 60 insertions(+), 22 deletions(-) create mode 100644 app/views/shared/_no_password.html.haml (limited to 'app') diff --git a/app/assets/javascripts/project.js.coffee b/app/assets/javascripts/project.js.coffee index 5a9cc66c8f0..eb8c1fa1426 100644 --- a/app/assets/javascripts/project.js.coffee +++ b/app/assets/javascripts/project.js.coffee @@ -16,5 +16,11 @@ class @Project $('.hide-no-ssh-message').on 'click', (e) -> path = '/' $.cookie('hide_no_ssh_message', 'false', { path: path }) - $(@).parents('.no-ssh-key-message').hide() + $(@).parents('.no-ssh-key-message').remove() + e.preventDefault() + + $('.hide-no-password-message').on 'click', (e) -> + path = '/' + $.cookie('hide_no_password_message', 'false', { path: path }) + $(@).parents('.no-password-message').remove() e.preventDefault() diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 232f30b759d..ecedb31a7f8 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -121,7 +121,7 @@ class Admin::UsersController < Admin::ApplicationController params.require(:user).permit( :email, :remember_me, :bio, :name, :username, :skype, :linkedin, :twitter, :website_url, :color_scheme_id, :theme_id, :force_random_password, - :extern_uid, :provider, :password_expires_at, :avatar, :hide_no_ssh_key, + :extern_uid, :provider, :password_expires_at, :avatar, :hide_no_ssh_key, :hide_no_password, :projects_limit, :can_create_group, :admin, :key_id ) end diff --git a/app/controllers/profiles/passwords_controller.rb b/app/controllers/profiles/passwords_controller.rb index 1191ce47eba..0c614969a3f 100644 --- a/app/controllers/profiles/passwords_controller.rb +++ b/app/controllers/profiles/passwords_controller.rb @@ -11,7 +11,7 @@ class Profiles::PasswordsController < ApplicationController end def create - unless @user.valid_password?(user_params[:current_password]) + unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password]) redirect_to new_profile_password_path, alert: 'You must provide a valid current password' return end @@ -21,7 +21,8 @@ class Profiles::PasswordsController < ApplicationController result = @user.update_attributes( password: new_password, - password_confirmation: new_password_confirmation + password_confirmation: new_password_confirmation, + password_automatically_set: false ) if result @@ -39,8 +40,9 @@ class Profiles::PasswordsController < ApplicationController password_attributes = user_params.select do |key, value| %w(password password_confirmation).include?(key.to_s) end + password_attributes[:password_automatically_set] = false - unless @user.valid_password?(user_params[:current_password]) + unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password]) redirect_to edit_profile_password_path, alert: 'You must provide a valid current password' return end diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb index c0b7e2223a2..f7584c03411 100644 --- a/app/controllers/profiles_controller.rb +++ b/app/controllers/profiles_controller.rb @@ -67,7 +67,7 @@ class ProfilesController < ApplicationController params.require(:user).permit( :email, :password, :password_confirmation, :bio, :name, :username, :skype, :linkedin, :twitter, :website_url, :color_scheme_id, :theme_id, - :avatar, :hide_no_ssh_key, + :avatar, :hide_no_ssh_key, :hide_no_password ) end end diff --git a/app/models/user.rb b/app/models/user.rb index d7f688ec138..23d1e69e69a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -40,6 +40,7 @@ # confirmation_sent_at :datetime # unconfirmed_email :string(255) # hide_no_ssh_key :boolean default(FALSE) +# hide_no_password :boolean default(FALSE) # website_url :string(255) default(""), not null # last_credential_check_at :datetime # github_access_token :string(255) @@ -60,6 +61,7 @@ class User < ActiveRecord::Base default_value_for :can_create_group, gitlab_config.default_can_create_group default_value_for :can_create_team, false default_value_for :hide_no_ssh_key, false + default_value_for :hide_no_password, false default_value_for :projects_limit, current_application_settings.default_projects_limit default_value_for :theme_id, gitlab_config.default_theme diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml index 2a7d317aa3e..6b19db4eb5d 100644 --- a/app/views/profiles/passwords/edit.html.haml +++ b/app/views/profiles/passwords/edit.html.haml @@ -1,25 +1,30 @@ %h3.page-title Password %p.light - Change your password or recover your current one. + - if @user.password_automatically_set? + Set your password. + - else + Change your password or recover your current one. %hr .update-password = form_for @user, url: profile_password_path, method: :put, html: { class: 'form-horizontal' } do |f| %div %p.slead - You must provide current password in order to change it. - %br + - unless @user.password_automatically_set? + You must provide current password in order to change it. + %br After a successful password update you will be redirected to login page where you should login with your new password -if @user.errors.any? .alert.alert-danger %ul - @user.errors.full_messages.each do |msg| %li= msg - .form-group - = f.label :current_password, class: 'control-label' - .col-sm-10 - = f.password_field :current_password, required: true, class: 'form-control' - %div - = link_to "Forgot your password?", reset_profile_password_path, method: :put + - unless @user.password_automatically_set? + .form-group + = f.label :current_password, class: 'control-label' + .col-sm-10 + = f.password_field :current_password, required: true, class: 'form-control' + %div + = link_to "Forgot your password?", reset_profile_password_path, method: :put .form-group = f.label :password, 'New password', class: 'control-label' diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml index aef7348fd20..8bed6e0dbee 100644 --- a/app/views/profiles/passwords/new.html.haml +++ b/app/views/profiles/passwords/new.html.haml @@ -10,10 +10,11 @@ %ul - @user.errors.full_messages.each do |msg| %li= msg - - .form-group - = f.label :current_password, class: 'control-label' - .col-sm-10= f.password_field :current_password, required: true, class: 'form-control' + + - unless @user.password_automatically_set? + .form-group + = f.label :current_password, class: 'control-label' + .col-sm-10= f.password_field :current_password, required: true, class: 'form-control' .form-group = f.label :password, class: 'control-label' .col-sm-10= f.password_field :password, required: true, class: 'form-control' diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index d7dee2208de..b925bcb7fac 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -1,5 +1,6 @@ - if current_user && can?(current_user, :download_code, @project) = render 'shared/no_ssh' + = render 'shared/no_password' = render "home_panel" diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 737a34decde..435b2648404 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -1,5 +1,6 @@ - if current_user && can?(current_user, :download_code, @project) = render 'shared/no_ssh' + = render 'shared/no_password' = render "home_panel" diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml index 1cc6043f56b..df0bde76980 100644 --- a/app/views/shared/_clone_panel.html.haml +++ b/app/views/shared/_clone_panel.html.haml @@ -1,8 +1,20 @@ - project = project || @project .git-clone-holder.input-group .input-group-btn - %button{class: "btn #{ 'active' if default_clone_protocol == 'ssh' }", :"data-clone" => project.ssh_url_to_repo} SSH - %button{class: "btn #{ 'active' if default_clone_protocol == 'http' }", :"data-clone" => project.http_url_to_repo}= gitlab_config.protocol.upcase + %button{ | + class: "btn #{ 'active' if default_clone_protocol == 'ssh' }#{ ' has_tooltip' if current_user && current_user.require_ssh_key? }", | + :"data-clone" => project.ssh_url_to_repo, | + :"data-title" => "Add an SSH key to your profile
    to pull or push via SSH", + :"data-html" => "true", + :"data-container" => "body"} + SSH + %button{ | + class: "btn #{ 'active' if default_clone_protocol == 'http' }#{ ' has_tooltip' if current_user && current_user.password_automatically_set? }", | + :"data-clone" => project.http_url_to_repo, | + :"data-title" => "Set a password on your account
    to pull or push via #{gitlab_config.protocol.upcase}", + :"data-html" => "true", + :"data-container" => "body"} + = gitlab_config.protocol.upcase = text_field_tag :project_clone, default_url_to_repo(project), class: "one_click_select form-control", readonly: true - if project.kind_of?(Project) .input-group-addon diff --git a/app/views/shared/_no_password.html.haml b/app/views/shared/_no_password.html.haml new file mode 100644 index 00000000000..022097cda16 --- /dev/null +++ b/app/views/shared/_no_password.html.haml @@ -0,0 +1,8 @@ +- if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.password_automatically_set? + .no-password-message.alert.alert-warning.hidden-xs + You won't be able to pull or push project code via #{gitlab_config.protocol.upcase} until you #{link_to 'set a password', edit_profile_password_path} on your account + + .pull-right + = link_to "Don't show again", profile_path(user: {hide_no_password: true}), method: :put + | + = link_to 'Remind later', '#', class: 'hide-no-password-message' diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml index 8e6f802fd3b..1a2946baccb 100644 --- a/app/views/shared/_no_ssh.html.haml +++ b/app/views/shared/_no_ssh.html.haml @@ -1,4 +1,4 @@ -- if cookies[:hide_no_ssh_message].blank? && current_user.require_ssh_key? && !current_user.hide_no_ssh_key +- if cookies[:hide_no_ssh_message].blank? && !current_user.hide_no_ssh_key && current_user.require_ssh_key? .no-ssh-key-message.alert.alert-warning.hidden-xs You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', new_profile_key_path} to your profile -- cgit v1.2.1 From da1608196b2c8401939c727ec70efc9c342e4945 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 15:16:00 +0100 Subject: Add headings to signin/signup blocks on signin page. --- app/assets/stylesheets/sections/login.scss | 3 +-- app/views/devise/shared/_signin_box.html.haml | 8 ++++++-- app/views/devise/shared/_signup_box.html.haml | 8 ++++++-- 3 files changed, 13 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/login.scss b/app/assets/stylesheets/sections/login.scss index 3a3644c12b7..d366300511e 100644 --- a/app/assets/stylesheets/sections/login.scss +++ b/app/assets/stylesheets/sections/login.scss @@ -40,8 +40,7 @@ .login-heading h3 { font-weight: 300; line-height: 1.5; - margin: 0; - display: none; + margin: 0 0 10px 0; } .login-footer { diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index 70587329033..04d33132e91 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -1,6 +1,10 @@ .login-box - .login-heading - %h3 Sign in + - if signup_enabled? + .login-heading + %h3 Existing user? Sign in + - else + .login-heading + %h3 Sign in .login-body - if ldap_enabled? %ul.nav.nav-tabs diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml index 8a6dc19ab64..0db123d78ff 100644 --- a/app/views/devise/shared/_signup_box.html.haml +++ b/app/views/devise/shared/_signup_box.html.haml @@ -1,6 +1,10 @@ .login-box - .login-heading - %h3 Sign up + - if signin_enabled? + .login-heading + %h3 New user? Create an account + - else + .login-heading + %h3 Create an account .login-body = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| .devise-errors -- cgit v1.2.1 From 7c39e728ef348482bd8caeeeeba2316ace92f4e9 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 15:16:17 +0100 Subject: Move OAuth signin options just below signin box. --- app/views/devise/registrations/new.html.haml | 6 +----- app/views/devise/sessions/new.html.haml | 9 --------- app/views/devise/shared/_oauth_box.html.haml | 10 ---------- app/views/devise/shared/_signin_box.html.haml | 13 +++++++++++++ app/views/devise/shared/_signup_box.html.haml | 5 +++++ 5 files changed, 19 insertions(+), 24 deletions(-) delete mode 100644 app/views/devise/shared/_oauth_box.html.haml (limited to 'app') diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index c07e409d583..d3e37f7494c 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -1,7 +1,3 @@ = render 'devise/shared/signup_box' -.clearfix.prepend-top-20 - = render 'devise/shared/sign_in_link' - %p - %span.light Did not receive confirmation email? - = link_to "Send again", new_confirmation_path(resource_name) \ No newline at end of file += render 'devise/shared/sign_in_link' \ No newline at end of file diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index 6d8415613d1..fa2460518fc 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -1,15 +1,6 @@ %div = render 'devise/shared/signin_box' - - if Gitlab.config.omniauth.enabled && devise_mapping.omniauthable? - .prepend-top-20 - = render 'devise/shared/oauth_box' - - if signup_enabled? .prepend-top-20 = render 'devise/shared/signup_box' - -.clearfix.prepend-top-20 - %p - %span.light Did not receive confirmation email? - = link_to "Send again", new_confirmation_path(resource_name) diff --git a/app/views/devise/shared/_oauth_box.html.haml b/app/views/devise/shared/_oauth_box.html.haml deleted file mode 100644 index c2e1373de30..00000000000 --- a/app/views/devise/shared/_oauth_box.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -- providers = additional_providers -- if providers.present? - .login-box{:'data-no-turbolink' => 'data-no-turbolink'} - %span Sign in with   - - providers.each do |provider| - %span - - if default_providers.include?(provider) - = link_to authbutton(provider, 32), omniauth_authorize_path(resource_name, provider) - - else - = link_to provider.to_s.titleize, omniauth_authorize_path(resource_name, provider), class: "btn" diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index 04d33132e91..805cf816231 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -27,3 +27,16 @@ - else %div No authentication methods configured. + +- if Gitlab.config.omniauth.enabled && devise_mapping.omniauthable? + .clearfix.prepend-top-20 + %p + %span.light + Sign in with   + - providers = additional_providers + - providers.each do |provider| + %span.light + - if default_providers.include?(provider) + = link_to authbutton(provider, 32), omniauth_authorize_path(resource_name, provider) + - else + = link_to provider.to_s.titleize, omniauth_authorize_path(resource_name, provider), class: "btn" \ No newline at end of file diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml index 0db123d78ff..dcf60c90430 100644 --- a/app/views/devise/shared/_signup_box.html.haml +++ b/app/views/devise/shared/_signup_box.html.haml @@ -19,3 +19,8 @@ = f.password_field :password, class: "form-control bottom", id: "user_password_sign_up", placeholder: "Password", required: true %div = f.submit "Sign up", class: "btn-create btn" + +.clearfix.prepend-top-20 + %p + %span.light Did not receive confirmation email? + = link_to "Send again", new_confirmation_path(resource_name) \ No newline at end of file -- cgit v1.2.1 From 4a62a0f01a0058d1d260ddecb0341f48b5b2e26d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 15:30:54 +0100 Subject: Only send "Account was created for you" email when created by admin. --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index d7f688ec138..278f5c662df 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -556,7 +556,7 @@ class User < ActiveRecord::Base def post_create_hook log_info("User \"#{self.name}\" (#{self.email}) was created") - notification_service.new_user(self, @reset_token) + notification_service.new_user(self, @reset_token) if self.created_by_id system_hook_service.execute_hooks_for(self, :create) end -- cgit v1.2.1 From 055c2f1e33ffe0bae1b5f1ec6d5fea68ee055bad Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 15:43:02 +0100 Subject: Add "New Project" button to dashboard projects page. --- app/views/dashboard/_zero_authorized_projects.html.haml | 8 +++++--- app/views/dashboard/projects.html.haml | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/dashboard/_zero_authorized_projects.html.haml b/app/views/dashboard/_zero_authorized_projects.html.haml index f78ce69ef9e..6e76f95b34e 100644 --- a/app/views/dashboard/_zero_authorized_projects.html.haml +++ b/app/views/dashboard/_zero_authorized_projects.html.haml @@ -17,7 +17,8 @@ - if current_user.can_create_project? .link_holder = link_to new_project_path, class: "btn btn-new" do - New project » + %i.fa.fa-plus + New Project - if current_user.can_create_group? %hr @@ -31,7 +32,8 @@ Groups are the best way to manage projects and members. .link_holder = link_to new_group_path, class: "btn btn-new" do - New group » + %i.fa.fa-plus + New Group -if @publicish_project_count > 0 %hr @@ -47,4 +49,4 @@ Public projects are an easy way to allow everyone to have read-only access. .link_holder = link_to trending_explore_projects_path, class: "btn btn-new" do - Browse public projects » + Browse public projects diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index dba3025b3cc..21e44fb1c60 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -1,6 +1,10 @@ %h3.page-title My Projects + = link_to new_project_path, class: "btn btn-new pull-right" do + %i.fa.fa-plus + New Project + %p.light All projects you have access to are listed here. Public projects are not included here unless you are a member %hr -- cgit v1.2.1 From f989190ed4ea3f9b03451918b55384a2e23fe3af Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 13 Feb 2015 13:36:59 -0800 Subject: Show tooltips on collapsed sidebar --- app/assets/stylesheets/sections/nav_sidebar.scss | 2 +- app/views/layouts/_page.html.haml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index b35043821da..9c7d1a03a03 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -126,7 +126,7 @@ .nav-sidebar { margin-top: 20px; - position: absolute; + position: fixed; top: 45px; width: 52px; diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 98a3d2278a3..422966cdc55 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -17,3 +17,7 @@ = yield = yield :embedded_scripts + +:coffeescript + $('.page-sidebar-collapsed .nav-sidebar a').tooltip placement: "right" + -- cgit v1.2.1 From 9efb838be2d4a1b28f1378074af1f44442a7114a Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Sat, 14 Feb 2015 13:31:46 +0100 Subject: Change tweet text. --- app/views/events/event/_created_project.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/events/event/_created_project.html.haml b/app/views/events/event/_created_project.html.haml index 0ebbb841cca..551e0160530 100644 --- a/app/views/events/event/_created_project.html.haml +++ b/app/views/events/event/_created_project.html.haml @@ -19,9 +19,10 @@ href: "https://twitter.com/share", | class: "twitter-share-button", | "data-url" => event.project.web_url, | - "data-text" => "I just created a new project in GitLab! GitLab is version control on your server, like GitHub but better.", | + "data-text" => "I just created a new project in GitLab! GitLab is version control on your server.", | "data-size" => "medium", | "data-related" => "gitlab", | + "data-hashtags" => "gitlab", | "data-count" => "none"} Tweet \ No newline at end of file -- cgit v1.2.1 From 67afb5b145dd98ba92f653180d2b7ba470a59e37 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Sat, 14 Feb 2015 13:32:05 +0100 Subject: Make sure twitter widgets are loaded when rendered through turbolinks. --- app/views/events/event/_created_project.html.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/events/event/_created_project.html.haml b/app/views/events/event/_created_project.html.haml index 551e0160530..3c7153d235f 100644 --- a/app/views/events/event/_created_project.html.haml +++ b/app/views/events/event/_created_project.html.haml @@ -17,7 +17,6 @@ %a.twitter-share-button{ | href: "https://twitter.com/share", | - class: "twitter-share-button", | "data-url" => event.project.web_url, | "data-text" => "I just created a new project in GitLab! GitLab is version control on your server.", | "data-size" => "medium", | @@ -25,4 +24,4 @@ "data-hashtags" => "gitlab", | "data-count" => "none"} Tweet - \ No newline at end of file + %script{src: "//platform.twitter.com/widgets.js"} \ No newline at end of file -- cgit v1.2.1 From 76aad9b76ed756ca9ba2cbcdb399c815e542b3ae Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Sat, 24 Jan 2015 11:02:58 -0700 Subject: Upgrade to Rails 4.1.9 Make the following changes to deal with new behavior in Rails 4.1.2: * Use nested resources to avoid slashes in arguments to path helpers. --- app/controllers/admin/projects_controller.rb | 7 ++- app/controllers/application_controller.rb | 6 ++- app/controllers/projects/application_controller.rb | 8 +++- app/controllers/projects/avatars_controller.rb | 2 +- app/controllers/projects/blob_controller.rb | 11 ++--- app/controllers/projects/branches_controller.rb | 8 +++- app/controllers/projects/compare_controller.rb | 3 +- app/controllers/projects/deploy_keys_controller.rb | 9 ++-- app/controllers/projects/forks_controller.rb | 7 ++- app/controllers/projects/hooks_controller.rb | 4 +- app/controllers/projects/imports_controller.rb | 10 +++-- app/controllers/projects/issues_controller.rb | 8 ++-- app/controllers/projects/labels_controller.rb | 16 ++++--- .../projects/merge_requests_controller.rb | 11 ++++- app/controllers/projects/milestones_controller.rb | 5 ++- .../projects/protected_branches_controller.rb | 5 ++- app/controllers/projects/refs_controller.rb | 10 +++-- .../projects/repositories_controller.rb | 2 +- app/controllers/projects/services_controller.rb | 7 ++- app/controllers/projects/snippets_controller.rb | 7 +-- app/controllers/projects/tags_controller.rb | 4 +- .../projects/team_members_controller.rb | 13 ++++-- app/controllers/projects/tree_controller.rb | 5 ++- app/controllers/projects/wikis_controller.rb | 17 ++++++-- app/controllers/projects_controller.rb | 23 +++++++--- app/helpers/application_helper.rb | 2 +- app/helpers/blob_helper.rb | 8 +++- app/helpers/commits_helper.rb | 50 ++++++++++++++++++---- app/helpers/compare_helper.rb | 9 +++- app/helpers/events_helper.rb | 44 +++++++++++++------ app/helpers/issues_helper.rb | 6 ++- app/helpers/merge_requests_helper.rb | 6 ++- app/helpers/milestones_helper.rb | 2 +- app/helpers/notes_helper.rb | 6 ++- app/helpers/projects_helper.rb | 28 +++++++++--- app/helpers/search_helper.rb | 22 +++++----- app/helpers/snippets_helper.rb | 3 +- app/helpers/submodule_helper.rb | 29 +++++++------ app/helpers/tab_helper.rb | 3 +- app/mailers/emails/issues.rb | 8 ++-- app/mailers/emails/merge_requests.rb | 20 ++++++--- app/mailers/emails/notes.rb | 13 ++++-- app/mailers/emails/projects.rb | 12 ++++-- app/models/project.rb | 2 +- .../gitlab_issue_tracker_service.rb | 6 +-- app/services/projects/transfer_service.rb | 2 +- app/views/admin/dashboard/index.html.haml | 6 +-- app/views/admin/groups/show.html.haml | 2 +- app/views/admin/projects/index.html.haml | 20 ++++----- app/views/admin/projects/show.html.haml | 14 +++--- app/views/admin/users/show.html.haml | 4 +- app/views/dashboard/_project.html.haml | 4 +- app/views/dashboard/_projects.html.haml | 2 +- app/views/dashboard/projects.html.haml | 8 ++-- app/views/events/_commit.html.haml | 2 +- app/views/events/_event_last_push.html.haml | 2 +- app/views/events/_event_push.atom.haml | 2 +- app/views/events/event/_common.html.haml | 2 +- app/views/events/event/_push.html.haml | 4 +- app/views/explore/projects/_project.html.haml | 8 ++-- app/views/groups/_projects.html.haml | 4 +- app/views/groups/milestones/_issue.html.haml | 4 +- .../groups/milestones/_merge_request.html.haml | 4 +- app/views/groups/milestones/show.html.haml | 2 +- app/views/groups/projects.html.haml | 4 +- app/views/layouts/_head.html.haml | 4 +- app/views/layouts/_init_auto_complete.html.haml | 2 +- app/views/layouts/nav/_admin.html.haml | 2 +- app/views/layouts/nav/_project.html.haml | 22 +++++----- app/views/layouts/notify.html.haml | 2 +- .../notify/_reassigned_issuable_email.text.erb | 2 +- app/views/notify/closed_issue_email.text.haml | 2 +- .../notify/closed_merge_request_email.text.haml | 2 +- .../notify/issue_status_changed_email.text.erb | 2 +- .../notify/merge_request_status_email.text.haml | 2 +- .../notify/merged_merge_request_email.text.haml | 2 +- app/views/notify/new_issue_email.text.erb | 2 +- app/views/notify/new_merge_request_email.text.erb | 2 +- app/views/notify/note_commit_email.text.erb | 2 +- app/views/notify/note_issue_email.text.erb | 2 +- app/views/notify/note_merge_request_email.text.erb | 2 +- .../notify/project_access_granted_email.html.haml | 2 +- .../notify/project_access_granted_email.text.erb | 2 +- app/views/notify/project_was_moved_email.html.haml | 2 +- app/views/notify/project_was_moved_email.text.erb | 2 +- app/views/notify/repository_push_email.html.haml | 4 +- app/views/notify/repository_push_email.text.haml | 4 +- app/views/projects/_dropdown.html.haml | 10 ++--- app/views/projects/_home_panel.html.haml | 10 ++--- app/views/projects/_issuable_form.html.haml | 6 +-- app/views/projects/_issues_nav.html.haml | 16 +++---- app/views/projects/_md_preview.html.haml | 2 +- app/views/projects/_settings_nav.html.haml | 12 +++--- app/views/projects/blame/show.html.haml | 4 +- app/views/projects/blob/_actions.html.haml | 12 +++--- app/views/projects/blob/_blob.html.haml | 6 +-- app/views/projects/blob/_download.html.haml | 2 +- app/views/projects/blob/_remove.html.haml | 2 +- app/views/projects/blob/edit.html.haml | 4 +- app/views/projects/blob/new.html.haml | 4 +- app/views/projects/branches/_branch.html.haml | 6 +-- app/views/projects/branches/index.html.haml | 8 ++-- app/views/projects/branches/new.html.haml | 4 +- app/views/projects/commit/_commit_box.html.haml | 12 +++--- app/views/projects/commit/branches.html.haml | 4 +- app/views/projects/commits/_commit.html.haml | 4 +- app/views/projects/commits/_head.html.haml | 8 ++-- .../projects/commits/_inline_commit.html.haml | 4 +- app/views/projects/commits/show.atom.builder | 10 ++--- app/views/projects/commits/show.html.haml | 2 +- app/views/projects/compare/_form.html.haml | 2 +- .../projects/deploy_keys/_deploy_key.html.haml | 9 ++-- app/views/projects/deploy_keys/_form.html.haml | 4 +- app/views/projects/deploy_keys/index.html.haml | 4 +- app/views/projects/deploy_keys/show.html.haml | 4 +- app/views/projects/diffs/_file.html.haml | 2 +- app/views/projects/diffs/_image.html.haml | 4 +- app/views/projects/diffs/_warning.html.haml | 8 ++-- app/views/projects/edit.html.haml | 20 ++++----- app/views/projects/empty.html.haml | 4 +- app/views/projects/forks/error.html.haml | 2 +- app/views/projects/forks/new.html.haml | 2 +- app/views/projects/graphs/_head.html.haml | 4 +- app/views/projects/hooks/index.html.haml | 6 +-- app/views/projects/imports/new.html.haml | 2 +- app/views/projects/issues/_discussion.html.haml | 6 +-- app/views/projects/issues/_form.html.haml | 4 +- app/views/projects/issues/_issue.html.haml | 12 +++--- app/views/projects/issues/_issue_context.html.haml | 4 +- app/views/projects/issues/_issues.html.haml | 2 +- app/views/projects/issues/index.atom.builder | 6 +-- app/views/projects/issues/show.html.haml | 8 ++-- app/views/projects/issues/update.js.haml | 2 +- app/views/projects/labels/_form.html.haml | 4 +- app/views/projects/labels/_label.html.haml | 6 +-- app/views/projects/labels/edit.html.haml | 2 +- app/views/projects/labels/index.html.haml | 4 +- app/views/projects/labels/new.html.haml | 2 +- .../projects/merge_requests/_discussion.html.haml | 6 +-- app/views/projects/merge_requests/_form.html.haml | 4 +- app/views/projects/merge_requests/_head.html.haml | 2 +- .../merge_requests/_merge_request.html.haml | 4 +- .../projects/merge_requests/_new_compare.html.haml | 12 +++--- .../projects/merge_requests/_new_submit.html.haml | 10 ++--- app/views/projects/merge_requests/_show.html.haml | 18 ++++---- .../merge_requests/show/_context.html.haml | 4 +- .../merge_requests/show/_mr_accept.html.haml | 2 +- .../merge_requests/show/_mr_title.html.haml | 6 +-- app/views/projects/milestones/_form.html.haml | 10 ++--- app/views/projects/milestones/_issue.html.haml | 6 +-- .../projects/milestones/_merge_request.html.haml | 6 +-- app/views/projects/milestones/_milestone.html.haml | 10 ++--- app/views/projects/milestones/index.html.haml | 2 +- app/views/projects/milestones/show.html.haml | 10 ++--- app/views/projects/network/show.html.haml | 6 +-- app/views/projects/no_repo.html.haml | 6 +-- app/views/projects/notes/_edit_form.html.haml | 2 +- app/views/projects/notes/_form.html.haml | 4 +- app/views/projects/notes/_note.html.haml | 4 +- .../projects/notes/_notes_with_form.html.haml | 2 +- .../projects/notes/discussions/_active.html.haml | 2 +- .../projects/notes/discussions/_commit.html.haml | 2 +- .../protected_branches/_branches_list.html.haml | 8 ++-- .../projects/protected_branches/index.html.haml | 2 +- app/views/projects/refs/logs_tree.js.haml | 4 +- .../repositories/_download_archive.html.haml | 14 +++--- app/views/projects/repositories/_feed.html.haml | 4 +- app/views/projects/services/_form.html.haml | 6 +-- app/views/projects/services/index.html.haml | 2 +- app/views/projects/show.html.haml | 14 +++--- app/views/projects/snippets/edit.html.haml | 2 +- app/views/projects/snippets/index.html.haml | 2 +- app/views/projects/snippets/new.html.haml | 2 +- app/views/projects/snippets/show.html.haml | 10 ++--- app/views/projects/tags/_tag.html.haml | 4 +- app/views/projects/tags/index.html.haml | 2 +- app/views/projects/tags/new.html.haml | 4 +- app/views/projects/team_members/_form.html.haml | 4 +- .../projects/team_members/_team_member.html.haml | 4 +- app/views/projects/team_members/import.html.haml | 4 +- app/views/projects/team_members/index.html.haml | 4 +- app/views/projects/transfer.js.haml | 2 +- app/views/projects/tree/_blob_item.html.haml | 2 +- app/views/projects/tree/_tree.html.haml | 12 +++--- .../projects/tree/_tree_commit_column.html.haml | 2 +- app/views/projects/tree/_tree_item.html.haml | 2 +- app/views/projects/update.js.haml | 2 +- app/views/projects/wikis/_form.html.haml | 8 ++-- app/views/projects/wikis/_main_links.html.haml | 4 +- app/views/projects/wikis/_nav.html.haml | 6 +-- app/views/projects/wikis/_new.html.haml | 2 +- app/views/projects/wikis/edit.html.haml | 2 +- app/views/projects/wikis/history.html.haml | 2 +- app/views/projects/wikis/pages.html.haml | 2 +- app/views/projects/wikis/show.html.haml | 2 +- app/views/search/_results.html.haml | 2 +- app/views/search/results/_blob.html.haml | 2 +- app/views/search/results/_issue.html.haml | 2 +- app/views/search/results/_merge_request.html.haml | 2 +- app/views/search/results/_note.html.haml | 4 +- app/views/search/results/_project.html.haml | 2 +- app/views/search/results/_wiki_blob.html.haml | 2 +- app/views/shared/_issuable_filter.html.haml | 2 +- app/views/shared/_issues.html.haml | 2 +- app/views/shared/_merge_requests.html.haml | 2 +- app/views/shared/_ref_switcher.html.haml | 2 +- app/views/shared/snippets/_form.html.haml | 2 +- 207 files changed, 723 insertions(+), 537 deletions(-) (limited to 'app') diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb index 7c2388e81be..2b1fc862b7f 100644 --- a/app/controllers/admin/projects_controller.rb +++ b/app/controllers/admin/projects_controller.rb @@ -25,13 +25,16 @@ class Admin::ProjectsController < Admin::ApplicationController def transfer ::Projects::TransferService.new(@project, current_user, params.dup).execute - redirect_to [:admin, @project.reload] + @project.reload + redirect_to admin_namespace_project_path(@project.namespace, @project) end protected def project - @project = Project.find_with_namespace(params[:id]) + @project = Project.find_with_namespace( + [params[:namespace_id], '/', params[:id]].join('') + ) @project || render_404 end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6553027b430..eb3be08df56 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -93,6 +93,7 @@ class ApplicationController < ActionController::Base def project unless @project + namespace = params[:namespace_id] id = params[:project_id] || params[:id] # Redirect from @@ -104,7 +105,7 @@ class ApplicationController < ActionController::Base redirect_to request.original_url.gsub(/\.git\Z/, '') and return end - @project = Project.find_with_namespace(id) + @project = Project.find_with_namespace("#{namespace}/#{id}") if @project and can?(current_user, :read_project, @project) @project @@ -121,7 +122,8 @@ class ApplicationController < ActionController::Base def repository @repository ||= project.repository - rescue Grit::NoSuchPathError + rescue Grit::NoSuchPathError(e) + log_exception(e) nil end diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb index 7e4580017dd..4719933394f 100644 --- a/app/controllers/projects/application_controller.rb +++ b/app/controllers/projects/application_controller.rb @@ -8,7 +8,8 @@ class Projects::ApplicationController < ApplicationController # for non-signed users if !current_user id = params[:project_id] || params[:id] - @project = Project.find_with_namespace(id) + project_with_namespace = "#{params[:namespace_id]}/#{id}" + @project = Project.find_with_namespace(project_with_namespace) return if @project && @project.public? end @@ -26,7 +27,10 @@ class Projects::ApplicationController < ApplicationController def require_branch_head unless @repository.branch_names.include?(@ref) - redirect_to project_tree_path(@project, @ref), notice: "This action is not allowed unless you are on top of a branch" + redirect_to( + namespace_project_tree_path(@project.namespace, @project, @ref), + notice: "This action is not allowed unless you are on top of a branch" + ) end end end diff --git a/app/controllers/projects/avatars_controller.rb b/app/controllers/projects/avatars_controller.rb index a482b90880d..b90a95c3aab 100644 --- a/app/controllers/projects/avatars_controller.rb +++ b/app/controllers/projects/avatars_controller.rb @@ -24,6 +24,6 @@ class Projects::AvatarsController < Projects::ApplicationController @project.save @project.reset_events_cache - redirect_to edit_project_path(@project) + redirect_to edit_namespace_project_path(@project.namespace, @project) end end diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index dccb96ba1d1..cc42b1512dc 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -25,7 +25,7 @@ class Projects::BlobController < Projects::ApplicationController if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - redirect_to project_blob_path(@project, File.join(@ref, file_path)) + redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(@ref, file_path)) else flash[:alert] = result[:message] render :new @@ -70,7 +70,8 @@ class Projects::BlobController < Projects::ApplicationController if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - redirect_to project_tree_path(@project, @ref) + redirect_to namespace_project_tree_path(@project.namespace, @project, + @ref) else flash[:alert] = result[:message] render :show @@ -102,7 +103,7 @@ class Projects::BlobController < Projects::ApplicationController else if tree = @repository.tree(@commit.id, @path) if tree.entries.any? - redirect_to project_tree_path(@project, File.join(@ref, @path)) and return + redirect_to namespace_project_tree_path(@project.namespace, @project, File.join(@ref, @path)) and return end end @@ -128,10 +129,10 @@ class Projects::BlobController < Projects::ApplicationController def after_edit_path @after_edit_path ||= if from_merge_request - diffs_project_merge_request_path(from_merge_request.target_project, from_merge_request) + + diffs_namespace_project_merge_request_path(from_merge_request.target_project.namespace, from_merge_request.target_project, from_merge_request) + "#file-path-#{hexdigest(@path)}" else - project_blob_path(@project, @id) + namespace_project_blob_path(@project.namespace, @project, @id) end end diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index cff1a907dc2..4d002aba972 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -24,7 +24,8 @@ class Projects::BranchesController < Projects::ApplicationController if result[:status] == :success @branch = result[:branch] - redirect_to project_tree_path(@project, @branch.name) + redirect_to namespace_project_tree_path(@project.namespace, @project, + @branch.name) else @error = result[:message] render action: 'new' @@ -36,7 +37,10 @@ class Projects::BranchesController < Projects::ApplicationController @branch_name = params[:id] respond_to do |format| - format.html { redirect_to project_branches_path(@project) } + format.html do + redirect_to namespace_project_branches_path(@project.namespace, + @project) + end format.js end end diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb index ffb8c2e4af1..0e12bbdc49f 100644 --- a/app/controllers/projects/compare_controller.rb +++ b/app/controllers/projects/compare_controller.rb @@ -25,6 +25,7 @@ class Projects::CompareController < Projects::ApplicationController end def create - redirect_to project_compare_path(@project, params[:from], params[:to]) + redirect_to namespace_project_compare_path(@project.namespace, @project, + params[:from], params[:to]) end end diff --git a/app/controllers/projects/deploy_keys_controller.rb b/app/controllers/projects/deploy_keys_controller.rb index 024b9520d30..b7cc305899c 100644 --- a/app/controllers/projects/deploy_keys_controller.rb +++ b/app/controllers/projects/deploy_keys_controller.rb @@ -25,7 +25,8 @@ class Projects::DeployKeysController < Projects::ApplicationController @key = DeployKey.new(deploy_key_params) if @key.valid? && @project.deploy_keys << @key - redirect_to project_deploy_keys_path(@project) + redirect_to namespace_project_deploy_keys_path(@project.namespace, + @project) else render "new" end @@ -44,13 +45,15 @@ class Projects::DeployKeysController < Projects::ApplicationController def enable @project.deploy_keys << available_keys.find(params[:id]) - redirect_to project_deploy_keys_path(@project) + redirect_to namespace_project_deploy_keys_path(@project.namespace, + @project) end def disable @project.deploy_keys_projects.where(deploy_key_id: params[:id]).last.destroy - redirect_to project_deploy_keys_path(@project) + redirect_to namespace_project_deploy_keys_path(@project.namespace, + @project) end protected diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb index a0481d11582..72f73bedf54 100644 --- a/app/controllers/projects/forks_controller.rb +++ b/app/controllers/projects/forks_controller.rb @@ -9,11 +9,14 @@ class Projects::ForksController < Projects::ApplicationController end def create - namespace = Namespace.find(params[:namespace_id]) + namespace = Namespace.find(params[:namespace_key]) @forked_project = ::Projects::ForkService.new(project, current_user, namespace: namespace).execute if @forked_project.saved? && @forked_project.forked? - redirect_to(@forked_project, notice: 'Project was successfully forked.') + redirect_to( + namespace_project_path(@forked_project.namespace, @forked_project), + notice: 'Project was successfully forked.' + ) else @title = 'Fork project' render :error diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb index 2d6c3111192..ba95bb13e1f 100644 --- a/app/controllers/projects/hooks_controller.rb +++ b/app/controllers/projects/hooks_controller.rb @@ -16,7 +16,7 @@ class Projects::HooksController < Projects::ApplicationController @hook.save if @hook.valid? - redirect_to project_hooks_path(@project) + redirect_to namespace_project_hooks_path(@project.namespace, @project) else @hooks = @project.hooks.select(&:persisted?) render :index @@ -43,7 +43,7 @@ class Projects::HooksController < Projects::ApplicationController def destroy hook.destroy - redirect_to project_hooks_path(@project) + redirect_to namespace_project_hooks_path(@project.namespace, @project) end private diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb index b8350642804..e2f957a640c 100644 --- a/app/controllers/projects/imports_controller.rb +++ b/app/controllers/projects/imports_controller.rb @@ -20,7 +20,7 @@ class Projects::ImportsController < Projects::ApplicationController end end - redirect_to project_import_path(@project) + redirect_to namespace_project_import_path(@project.namespace, @project) end def show @@ -28,7 +28,8 @@ class Projects::ImportsController < Projects::ApplicationController if @project.import_finished? redirect_to(@project) and return else - redirect_to new_project_import_path(@project) and return + redirect_to new_namespace_project_import_path(@project.namespace, + @project) && return end end end @@ -37,13 +38,14 @@ class Projects::ImportsController < Projects::ApplicationController def require_no_repo if @project.repository_exists? - redirect_to(@project) and return + redirect_to(namespace_project_path(@project.namespace, @project)) and return end end def redirect_if_progress if @project.import_in_progress? - redirect_to project_import_path(@project) and return + redirect_to namespace_project_import_path(@project.namespace, @project) && + return end end end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 42e207cf376..d1bf842ec1a 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -60,7 +60,8 @@ class Projects::IssuesController < Projects::ApplicationController respond_to do |format| format.html do if @issue.valid? - redirect_to project_issue_path(@project, @issue) + redirect_to namespace_project_issue_path(@project.namespace, + @project, @issue) else render :new end @@ -78,7 +79,7 @@ class Projects::IssuesController < Projects::ApplicationController format.js format.html do if @issue.valid? - redirect_to [@project, @issue] + redirect_to [@project.namespace, @project, @issue] else render :edit end @@ -128,7 +129,8 @@ class Projects::IssuesController < Projects::ApplicationController issue = @project.issues.find_by(id: params[:id]) if issue - redirect_to project_issue_path(@project, issue) + redirect_to namespace_project_issue_path(@project.namespace, @project, + issue) return else raise ActiveRecord::RecordNotFound.new diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index b61fef3b627..5e31fce4b0e 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -18,7 +18,7 @@ class Projects::LabelsController < Projects::ApplicationController @label = @project.labels.create(label_params) if @label.valid? - redirect_to project_labels_path(@project) + redirect_to namespace_project_labels_path(@project.namespace, @project) else render 'new' end @@ -29,7 +29,7 @@ class Projects::LabelsController < Projects::ApplicationController def update if @label.update_attributes(label_params) - redirect_to project_labels_path(@project) + redirect_to namespace_project_labels_path(@project.namespace, @project) else render 'edit' end @@ -39,11 +39,12 @@ class Projects::LabelsController < Projects::ApplicationController Gitlab::IssuesLabels.generate(@project) if params[:redirect] == 'issues' - redirect_to project_issues_path(@project) + redirect_to namespace_project_issues_path(@project.namespace, @project) elsif params[:redirect] == 'merge_requests' - redirect_to project_merge_requests_path(@project) + redirect_to namespace_project_merge_requests_path(@project.namespace, + @project) else - redirect_to project_labels_path(@project) + redirect_to namespace_project_labels_path(@project.namespace, @project) end end @@ -51,7 +52,10 @@ class Projects::LabelsController < Projects::ApplicationController @label.destroy respond_to do |format| - format.html { redirect_to project_labels_path(@project), notice: 'Label was removed' } + format.html do + redirect_to(namespace_project_labels_path(@project.namespace, @project), + notice: 'Label was removed') + end format.js end end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 01be318ede2..98e4775e409 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -78,7 +78,12 @@ class Projects::MergeRequestsController < Projects::ApplicationController @merge_request = MergeRequests::CreateService.new(project, current_user, merge_request_params).execute if @merge_request.valid? - redirect_to project_merge_request_path(@merge_request.target_project, @merge_request), notice: 'Merge request was successfully created.' + redirect_to( + namespace_project_merge_request_path(@merge_request.target_project.namespace, + @merge_request.target_project, + @merge_request), + notice: 'Merge request was successfully created.' + ) else @source_project = @merge_request.source_project @target_project = @merge_request.target_project @@ -93,7 +98,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController respond_to do |format| format.js format.html do - redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully updated.' + redirect_to([@merge_request.target_project.namespace.becomes(Namespace), + @merge_request.target_project, @merge_request], + notice: 'Merge request was successfully updated.') end end else diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb index 95801f8b8fb..97eaabb15c3 100644 --- a/app/controllers/projects/milestones_controller.rb +++ b/app/controllers/projects/milestones_controller.rb @@ -40,7 +40,8 @@ class Projects::MilestonesController < Projects::ApplicationController @milestone = Milestones::CreateService.new(project, current_user, milestone_params).execute if @milestone.save - redirect_to project_milestone_path(@project, @milestone) + redirect_to namespace_project_milestone_path(@project.namespace, + @project, @milestone) else render "new" end @@ -67,7 +68,7 @@ class Projects::MilestonesController < Projects::ApplicationController @milestone.destroy respond_to do |format| - format.html { redirect_to project_milestones_path } + format.html { redirect_to namespace_project_milestones_path } format.js { render nothing: true } end end diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb index f45df38b87c..ac36ac6fcd3 100644 --- a/app/controllers/projects/protected_branches_controller.rb +++ b/app/controllers/projects/protected_branches_controller.rb @@ -12,7 +12,8 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController def create @project.protected_branches.create(protected_branch_params) - redirect_to project_protected_branches_path(@project) + redirect_to namespace_project_protected_branches_path(@project.namespace, + @project) end def update @@ -37,7 +38,7 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController @project.protected_branches.find(params[:id]).destroy respond_to do |format| - format.html { redirect_to project_protected_branches_path } + format.html { redirect_to namespace_project_protected_branches_path } format.js { render nothing: true } end end diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index b80472f8eb4..ec41cafda4d 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -9,13 +9,15 @@ class Projects::RefsController < Projects::ApplicationController respond_to do |format| format.html do new_path = if params[:destination] == "tree" - project_tree_path(@project, (@id)) + namespace_project_tree_path(@project.namespace, @project, + (@id)) elsif params[:destination] == "blob" - project_blob_path(@project, (@id)) + namespace_project_blob_path(@project.namespace, @project, + (@id)) elsif params[:destination] == "graph" - project_network_path(@project, @id, @options) + namespace_project_network_path(@project.namespace, @project, @id, @options) else - project_commits_path(@project, @id) + namespace_project_commits_path(@project.namespace, @project, @id) end redirect_to new_path diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index 3a90c1c806d..8a997370dd7 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -7,7 +7,7 @@ class Projects::RepositoriesController < Projects::ApplicationController def create @project.create_repository - redirect_to @project + redirect_to namespace_project_path(@project.namespace, @project) end def archive diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 2b3e70f7bdb..5c29a6550f5 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -17,8 +17,11 @@ class Projects::ServicesController < Projects::ApplicationController def update if @service.update_attributes(service_params) - redirect_to edit_project_service_path(@project, @service.to_param), - notice: 'Successfully updated.' + redirect_to( + edit_namespace_project_service_path(@project.namespace, @project, + @service.to_param, notice: + 'Successfully updated.') + ) else render 'edit' end diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb index 25c887deafa..6c250e4ffed 100644 --- a/app/controllers/projects/snippets_controller.rb +++ b/app/controllers/projects/snippets_controller.rb @@ -32,7 +32,8 @@ class Projects::SnippetsController < Projects::ApplicationController @snippet.author = current_user if @snippet.save - redirect_to project_snippet_path(@project, @snippet) + redirect_to namespace_project_snippet_path(@project.namespace, @project, + @snippet) else respond_with(@snippet) end @@ -43,7 +44,7 @@ class Projects::SnippetsController < Projects::ApplicationController def update if @snippet.update_attributes(snippet_params) - redirect_to project_snippet_path(@project, @snippet) + redirect_to namespace_project_snippet_path(@project.namespace, @project, @snippet) else respond_with(@snippet) end @@ -60,7 +61,7 @@ class Projects::SnippetsController < Projects::ApplicationController @snippet.destroy - redirect_to project_snippets_path(@project) + redirect_to namespace_project_snippets_path(@project.namespace, @project) end def raw diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index 64b820160d3..dafbb4d51ea 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -16,7 +16,7 @@ class Projects::TagsController < Projects::ApplicationController if result[:status] == :success @tag = result[:tag] - redirect_to project_tags_path(@project) + redirect_to namespace_project_tags_path(@project.namespace, @project) else @error = result[:message] render action: 'new' @@ -31,7 +31,7 @@ class Projects::TagsController < Projects::ApplicationController end respond_to do |format| - format.html { redirect_to project_tags_path } + format.html { redirect_to namespace_project_tags_path } format.js end end diff --git a/app/controllers/projects/team_members_controller.rb b/app/controllers/projects/team_members_controller.rb index 0791e6080fb..71b0ab7ee82 100644 --- a/app/controllers/projects/team_members_controller.rb +++ b/app/controllers/projects/team_members_controller.rb @@ -21,7 +21,8 @@ class Projects::TeamMembersController < Projects::ApplicationController if params[:redirect_to] redirect_to params[:redirect_to] else - redirect_to project_team_index_path(@project) + redirect_to namespace_project_team_index_path(@project.namespace, + @project) end end @@ -32,7 +33,7 @@ class Projects::TeamMembersController < Projects::ApplicationController unless @user_project_relation.valid? flash[:alert] = "User should have at least one role" end - redirect_to project_team_index_path(@project) + redirect_to namespace_project_team_index_path(@project.namespace, @project) end def destroy @@ -40,7 +41,10 @@ class Projects::TeamMembersController < Projects::ApplicationController @user_project_relation.destroy respond_to do |format| - format.html { redirect_to project_team_index_path(@project) } + format.html do + redirect_to namespace_project_team_index_path(@project.namespace, + @project) + end format.js { render nothing: true } end end @@ -59,7 +63,8 @@ class Projects::TeamMembersController < Projects::ApplicationController status = @project.team.import(giver) notice = status ? "Successfully imported" : "Import failed" - redirect_to project_team_index_path(project), notice: notice + redirect_to(namespace_project_team_index_path(project.namespace, project), + notice: notice) end protected diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb index 5b52640a4e1..c7112a3cc10 100644 --- a/app/controllers/projects/tree_controller.rb +++ b/app/controllers/projects/tree_controller.rb @@ -9,7 +9,10 @@ class Projects::TreeController < Projects::ApplicationController def show if tree.entries.empty? if @repository.blob_at(@commit.id, @path) - redirect_to project_blob_path(@project, File.join(@ref, @path)) and return + redirect_to( + namespace_project_blob_path(@project.namespace, @project, + File.join(@ref, @path)) + ) and return else return not_found! end diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 0145207bf6f..69824dca944 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -45,7 +45,7 @@ class Projects::WikisController < Projects::ApplicationController return render('empty') unless can?(current_user, :write_wiki, @project) if @page.update(content, format, message) - redirect_to [@project, @page], notice: 'Wiki was successfully updated.' + redirect_to [@project.namespace.becomes(Namespace), @project, @page], notice: 'Wiki was successfully updated.' else render 'edit' end @@ -55,7 +55,10 @@ class Projects::WikisController < Projects::ApplicationController @page = WikiPage.new(@project_wiki) if @page.create(wiki_params) - redirect_to project_wiki_path(@project, @page), notice: 'Wiki was successfully updated.' + redirect_to( + namespace_project_wiki_path(@project.namespace, @project, @page), + notice: 'Wiki was successfully updated.' + ) else render action: "edit" end @@ -65,7 +68,10 @@ class Projects::WikisController < Projects::ApplicationController @page = @project_wiki.find_page(params[:id]) unless @page - redirect_to(project_wiki_path(@project, :home), notice: "Page not found") + redirect_to( + namespace_project_wiki_path(@project.namespace, @project, :home), + notice: "Page not found" + ) end end @@ -73,7 +79,10 @@ class Projects::WikisController < Projects::ApplicationController @page = @project_wiki.find_page(params[:id]) @page.delete if @page - redirect_to project_wiki_path(@project, :home), notice: "Page was successfully deleted" + redirect_to( + namespace_project_wiki_path(@project.namespace, @project, :home), + notice: "Page was successfully deleted" + ) end def git_access diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 462ab3d4749..cf039d5f132 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -21,7 +21,10 @@ class ProjectsController < ApplicationController @project = ::Projects::CreateService.new(current_user, project_params).execute if @project.saved? - redirect_to project_path(@project), notice: 'Project was successfully created.' + redirect_to( + namespace_project_path(@project.namespace, @project), + notice: 'Project was successfully created.' + ) else render 'new' end @@ -33,7 +36,12 @@ class ProjectsController < ApplicationController respond_to do |format| if status flash[:notice] = 'Project was successfully updated.' - format.html { redirect_to edit_project_path(@project), notice: 'Project was successfully updated.' } + format.html do + redirect_to( + edit_namespace_project_path(@project.namespace, @project), + notice: 'Project was successfully updated.' + ) + end format.js else format.html { render 'edit', layout: 'project_settings' } @@ -43,7 +51,8 @@ class ProjectsController < ApplicationController end def transfer - ::Projects::TransferService.new(project, current_user, project_params).execute + transfer_params = params.permit(:new_namespace_id) + ::Projects::TransferService.new(project, current_user, transfer_params).execute if @project.errors[:namespace_id].present? flash[:alert] = @project.errors[:namespace_id].first end @@ -51,7 +60,7 @@ class ProjectsController < ApplicationController def show if @project.import_in_progress? - redirect_to project_import_path(@project) + redirect_to namespace_project_import_path(@project.namespace, @project) return end @@ -90,7 +99,7 @@ class ProjectsController < ApplicationController flash[:alert] = 'Project deleted.' if request.referer.include?('/admin') - redirect_to admin_projects_path + redirect_to admin_namespace_projects_path else redirect_to projects_dashboard_path end @@ -121,7 +130,7 @@ class ProjectsController < ApplicationController @project.archive! respond_to do |format| - format.html { redirect_to @project } + format.html { redirect_to namespace_project_path(@project.namespace, @project) } end end @@ -130,7 +139,7 @@ class ProjectsController < ApplicationController @project.unarchive! respond_to do |format| - format.html { redirect_to @project } + format.html { redirect_to namespace_project_path(@project.namespace, @project) } end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e45f4650309..c3c77d9880f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -55,7 +55,7 @@ module ApplicationHelper if project.avatar.present? image_tag project.avatar.url, options elsif project.avatar_in_git - image_tag project_avatar_path(project), options + image_tag namespace_project_avatar_path(project.namespace, project), options else # generated icon project_identicon(project, options) end diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index e75eebd2da9..f5f27223d5b 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -36,8 +36,12 @@ module BlobHelper link_opts[:from_merge_request_id] = from_mr if from_mr cls = 'btn btn-small' if allowed_tree_edit?(project, ref) - link_to text, project_edit_blob_path(project, tree_join(ref, path), - link_opts), class: cls + link_to(text, + namespace_project_edit_blob_path(project.namespace, project, + tree_join(ref, path), + link_opts), + class: cls + ) else content_tag :span, text, class: cls + ' disabled' end + after.html_safe diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index b4ba14160ed..5aae697e2f0 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -37,7 +37,10 @@ module CommitsHelper # Add the root project link and the arrow icon crumbs = content_tag(:li) do - link_to(@project.path, project_commits_path(@project, @ref)) + link_to( + @project.path, + namespace_project_commits_path(@project.namespace, @project, @ref) + ) end if @path @@ -46,7 +49,14 @@ module CommitsHelper parts.each_with_index do |part, i| crumbs << content_tag(:li) do # The text is just the individual part, but the link needs all the parts before it - link_to part, project_commits_path(@project, tree_join(@ref, parts[0..i].join('/'))) + link_to( + part, + namespace_project_commits_path( + @project.namespace, + @project, + tree_join(@ref, parts[0..i].join('/')) + ) + ) end end end @@ -63,7 +73,9 @@ module CommitsHelper # Returns the sorted alphabetically links to branches, separated by a comma def commit_branches_links(project, branches) branches.sort.map do |branch| - link_to(project_tree_path(project, branch)) do + link_to( + namespace_project_tree_path(project.namespace, project, branch) + ) do content_tag :span, class: 'label label-gray' do icon('code-fork') + ' ' + branch end @@ -75,7 +87,10 @@ module CommitsHelper def commit_tags_links(project, tags) sorted = VersionSorter.rsort(tags) sorted.map do |tag| - link_to(project_commits_path(project, project.repository.find_tag(tag).name)) do + link_to( + namespace_project_commits_path(project.namespace, project, + project.repository.find_tag(tag).name) + ) do content_tag :span, class: 'label label-gray' do icon('tag') + ' ' + tag end @@ -86,12 +101,26 @@ module CommitsHelper def link_to_browse_code(project, commit) if current_controller?(:projects, :commits) if @repo.blob_at(commit.id, @path) - return link_to "Browse File »", project_blob_path(project, tree_join(commit.id, @path)), class: "pull-right" + return link_to( + "Browse File »", + namespace_project_blob_path(project.namespace, project, + tree_join(commit.id, @path)), + class: "pull-right" + ) elsif @path.present? - return link_to "Browse Dir »", project_tree_path(project, tree_join(commit.id, @path)), class: "pull-right" + return link_to( + "Browse Dir »", + namespace_project_tree_path(project.namespace, project, + tree_join(commit.id, @path)), + class: "pull-right" + ) end end - link_to "Browse Code »", project_tree_path(project, commit), class: "pull-right" + link_to( + "Browse Code »", + namespace_project_tree_path(project.namespace, project, commit), + class: "pull-right" + ) end protected @@ -133,8 +162,11 @@ module CommitsHelper end def view_file_btn(commit_sha, diff, project) - link_to project_blob_path(project, tree_join(commit_sha, diff.new_path)), - class: 'btn btn-small view-file js-view-file' do + link_to( + namespace_project_blob_path(project.namespace, project, + tree_join(commit_sha, diff.new_path)), + class: 'btn btn-small view-file js-view-file' + ) do raw('View file @') + content_tag(:span, commit_sha[0..6], class: 'commit-short-id') end diff --git a/app/helpers/compare_helper.rb b/app/helpers/compare_helper.rb index dd2e713a54e..01847c6b807 100644 --- a/app/helpers/compare_helper.rb +++ b/app/helpers/compare_helper.rb @@ -10,6 +10,13 @@ module CompareHelper end def compare_mr_path - new_project_merge_request_path(@project, merge_request: { source_branch: params[:to], target_branch: params[:from] }) + new_namespace_project_merge_request_path( + @project.namespace, + @project, + merge_request: { + source_branch: params[:to], + target_branch: params[:from] + } + ) end end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index d05f6df5f9f..6e7aa521302 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -61,17 +61,23 @@ module EventsHelper def event_feed_url(event) if event.issue? - project_issue_url(event.project, event.issue) + namespace_project_issue_url(event.project.namespace, event.project, + event.issue) elsif event.merge_request? - project_merge_request_url(event.project, event.merge_request) + namespace_project_merge_request_url(event.project.namespace, + event.project, event.merge_request) elsif event.note? && event.note_commit? - project_commit_url(event.project, event.note_target) + namespace_project_commit_url(event.project.namespace, event.project, + event.note_target) elsif event.note? if event.note_target if event.note_commit? - project_commit_path(event.project, event.note_commit_id, anchor: dom_id(event.target)) + namespace_project_commit_path(event.project.namespace, event.project, + event.note_commit_id, + anchor: dom_id(event.target)) elsif event.note_project_snippet? - project_snippet_path(event.project, event.note_target) + namespace_project_snippet_path(event.project.namespace, + event.project, event.note_target) else event_note_target_path(event) end @@ -79,12 +85,16 @@ module EventsHelper elsif event.push? if event.push_with_commits? if event.commits_count > 1 - project_compare_url(event.project, from: event.commit_from, to: event.commit_to) + namespace_project_compare_url(event.project.namespace, event.project, + from: event.commit_from, to: + event.commit_to) else - project_commit_url(event.project, id: event.commit_to) + namespace_project_commit_url(event.project.namespace, event.project, + id: event.commit_to) end else - project_commits_url(event.project, event.ref_name) + namespace_project_commits_url(event.project.namespace, event.project, + event.ref_name) end end end @@ -105,20 +115,30 @@ module EventsHelper def event_note_target_path(event) if event.note? && event.note_commit? - project_commit_path(event.project, event.note_target) + namespace_project_commit_path(event.project.namespace, event.project, + event.note_target) else - polymorphic_path([event.project, event.note_target], anchor: dom_id(event.target)) + polymorphic_path([event.project.namespace.becomes(Namespace), + event.project, event.note_target], + anchor: dom_id(event.target)) end end def event_note_title_html(event) if event.note_target if event.note_commit? - link_to project_commit_path(event.project, event.note_commit_id, anchor: dom_id(event.target)), class: "commit_short_id" do + link_to( + namespace_project_commit_path(event.project.namespace, event.project, + event.note_commit_id, + anchor: dom_id(event.target)), + class: "commit_short_id" + ) do "#{event.note_target_type} #{event.note_short_commit_id}" end elsif event.note_project_snippet? - link_to(project_snippet_path(event.project, event.note_target)) do + link_to(namespace_project_snippet_path(event.project.namespace, + event.project, + event.note_target)) do "#{event.note_target_type} ##{truncate event.note_target_id}" end else diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index e1c1078344e..15c5dcb6a25 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -93,8 +93,10 @@ module IssuesHelper def issue_to_atom(xml, issue) xml.entry do - xml.id project_issue_url(issue.project, issue) - xml.link href: project_issue_url(issue.project, issue) + xml.id namespace_project_issue_url(issue.project.namespace, + issue.project, issue) + xml.link href: namespace_project_issue_url(issue.project.namespace, + issue.project, issue) xml.title truncate(issue.title, length: 80) xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") xml.media :thumbnail, width: "40", height: "40", url: avatar_icon(issue.author_email) diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 4c640d4fc5f..3b1589da57f 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -1,14 +1,16 @@ module MergeRequestsHelper def new_mr_path_from_push_event(event) target_project = event.project.forked_from_project || event.project - new_project_merge_request_path( + new_namespace_project_merge_request_path( + event.project.namespace, event.project, new_mr_from_push_event(event, target_project) ) end def new_mr_path_for_fork_from_push_event(event) - new_project_merge_request_path( + new_namespace_project_merge_request_path( + event.project.namespace, event.project, new_mr_from_push_event(event, event.project.forked_from_project) ) diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb index 6847123d2d4..47fa147dccf 100644 --- a/app/helpers/milestones_helper.rb +++ b/app/helpers/milestones_helper.rb @@ -1,7 +1,7 @@ module MilestonesHelper def milestones_filter_path(opts = {}) if @project - project_milestones_path(@project, opts) + namespace_project_milestones_path(@project.namespace, @project, opts) elsif @group group_milestones_path(@group, opts) end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 8edcb8e6a80..92ecb2abe4d 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -11,7 +11,11 @@ module NotesHelper def link_to_commit_diff_line_note(note) if note.for_commit_diff_line? - link_to "#{note.diff_file_name}:L#{note.diff_new_line}", project_commit_path(@project, note.noteable, anchor: note.line_code) + link_to( + "#{note.diff_file_name}:L#{note.diff_new_line}", + namespace_project_commit_path(@project.namespace, @project, + note.noteable, anchor: note.line_code) + ) end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 36463892ebf..900afde4d9b 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -4,7 +4,7 @@ module ProjectsHelper end def link_to_project(project) - link_to project do + link_to [project.namespace.becomes(Namespace), project] do title = content_tag(:span, project.name, class: 'project-name') if project.namespace @@ -42,12 +42,20 @@ module ProjectsHelper def project_title(project) if project.group content_tag :span do - link_to(simple_sanitize(project.group.name), group_path(project.group)) + ' / ' + link_to(simple_sanitize(project.name), project_path(project)) + link_to( + simple_sanitize(project.group.name), group_path(project.group) + ) + ' / ' + + link_to(simple_sanitize(project.name), + namespace_project_path(project.namespace, project)) end else owner = project.namespace.owner content_tag :span do - link_to(simple_sanitize(owner.name), user_path(owner)) + ' / ' + link_to(simple_sanitize(project.name), project_path(project)) + link_to( + simple_sanitize(owner.name), user_path(owner) + ) + ' / ' + + link_to(simple_sanitize(project.name), + namespace_project_path(project.namespace, project)) end end end @@ -100,7 +108,10 @@ module ProjectsHelper content_tag 'span', class: starred ? 'turn-on' : 'turn-off' do - link_to toggle_star_project_path(@project), link_opts do + link_to( + toggle_star_namespace_project_path(@project.namespace, @project), + link_opts + ) do toggle_html + ' ' + count_html end end @@ -222,7 +233,12 @@ module ProjectsHelper def contribution_guide_url(project) if project && project.repository.contribution_guide - project_blob_path(project, tree_join(project.default_branch, project.repository.contribution_guide.name)) + namespace_project_blob_path( + project.namespace, + project, + tree_join(project.default_branch, + project.repository.contribution_guide.name) + ) end end @@ -236,7 +252,7 @@ module ProjectsHelper def project_wiki_path_with_version(proj, page, version, is_newest) url_params = is_newest ? {} : { version_id: version } - project_wiki_path(proj, page, url_params) + namespace_project_wiki_path(proj.namespace, proj, page, url_params) end def project_status_css_class(status) diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 65b9408cfa1..cb829037697 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -52,16 +52,16 @@ module SearchHelper ref = @ref || @project.repository.root_ref [ - { label: "#{prefix} - Files", url: project_tree_path(@project, ref) }, - { label: "#{prefix} - Commits", url: project_commits_path(@project, ref) }, - { label: "#{prefix} - Network", url: project_network_path(@project, ref) }, - { label: "#{prefix} - Graph", url: project_graph_path(@project, ref) }, - { label: "#{prefix} - Issues", url: project_issues_path(@project) }, - { label: "#{prefix} - Merge Requests", url: project_merge_requests_path(@project) }, - { label: "#{prefix} - Milestones", url: project_milestones_path(@project) }, - { label: "#{prefix} - Snippets", url: project_snippets_path(@project) }, - { label: "#{prefix} - Team", url: project_team_index_path(@project) }, - { label: "#{prefix} - Wiki", url: project_wikis_path(@project) }, + { label: "#{prefix} - Files", url: namespace_project_tree_path(@project.namespace, @project, ref) }, + { label: "#{prefix} - Commits", url: namespace_project_commits_path(@project.namespace, @project, ref) }, + { label: "#{prefix} - Network", url: namespace_project_network_path(@project.namespace, @project, ref) }, + { label: "#{prefix} - Graph", url: namespace_project_graph_path(@project.namespace, @project, ref) }, + { label: "#{prefix} - Issues", url: namespace_project_issues_path(@project.namespace, @project) }, + { label: "#{prefix} - Merge Requests", url: namespace_project_merge_requests_path(@project.namespace, @project) }, + { label: "#{prefix} - Milestones", url: namespace_project_milestones_path(@project.namespace, @project) }, + { label: "#{prefix} - Snippets", url: namespace_project_snippets_path(@project.namespace, @project) }, + { label: "#{prefix} - Team", url: namespace_project_team_index_path(@project.namespace, @project) }, + { label: "#{prefix} - Wiki", url: namespace_project_wikis_path(@project.namespace, @project) }, ] else [] @@ -84,7 +84,7 @@ module SearchHelper sorted_by_stars.non_archived.limit(limit).map do |p| { label: "project: #{search_result_sanitize(p.name_with_namespace)}", - url: project_path(p) + url: namespace_project_path(p.namespace, p) } end end diff --git a/app/helpers/snippets_helper.rb b/app/helpers/snippets_helper.rb index b0abc2cae33..906cb12cd48 100644 --- a/app/helpers/snippets_helper.rb +++ b/app/helpers/snippets_helper.rb @@ -11,7 +11,8 @@ module SnippetsHelper def reliable_snippet_path(snippet) if snippet.project_id? - project_snippet_path(snippet.project, snippet) + namespace_project_snippet_path(snippet.project.namespace, + snippet.project, snippet) else snippet_path(snippet) end diff --git a/app/helpers/submodule_helper.rb b/app/helpers/submodule_helper.rb index 841e7fd17f6..525266fb3b5 100644 --- a/app/helpers/submodule_helper.rb +++ b/app/helpers/submodule_helper.rb @@ -5,19 +5,22 @@ module SubmoduleHelper def submodule_links(submodule_item, ref = nil) url = @repository.submodule_url_for(ref, submodule_item.path) - return url, nil unless url =~ /([^\/:]+\/[^\/]+\.git)\Z/ + return url, nil unless url =~ /([^\/:]+)\/([^\/]+\.git)\Z/ - project = $1 + namespace = $1 + project = $2 project.chomp!('.git') - if self_url?(url, project) - return project_path(project), project_tree_path(project, submodule_item.id) + if self_url?(url, namespace, project) + return namespace_project_path(namespace, project), + namespace_project_tree_path(namespace, project, + submodule_item.id) elsif relative_self_url?(url) relative_self_links(url, submodule_item.id) elsif github_dot_com_url?(url) - standard_links('github.com', project, submodule_item.id) + standard_links('github.com', namespace, project, submodule_item.id) elsif gitlab_dot_com_url?(url) - standard_links('gitlab.com', project, submodule_item.id) + standard_links('gitlab.com', namespace, project, submodule_item.id) else return url, nil end @@ -33,9 +36,10 @@ module SubmoduleHelper url =~ /gitlab\.com[\/:][^\/]+\/[^\/]+\Z/ end - def self_url?(url, project) - return true if url == [ Gitlab.config.gitlab.url, '/', project, '.git' ].join('') - url == gitlab_shell.url_to_repo(project) + def self_url?(url, namespace, project) + return true if url == [ Gitlab.config.gitlab.url, '/', namespace, '/', + project, '.git' ].join('') + url == gitlab_shell.url_to_repo([namespace, '/', project].join('')) end def relative_self_url?(url) @@ -43,8 +47,8 @@ module SubmoduleHelper url =~ /^((\.\/)?(\.\.\/))(?!(\.\.)|(.*\/)).*\.git\Z/ || url =~ /^((\.\/)?(\.\.\/){2})(?!(\.\.))([^\/]*)\/(?!(\.\.)|(.*\/)).*\.git\Z/ end - def standard_links(host, project, commit) - base = [ 'https://', host, '/', project ].join('') + def standard_links(host, namespace, project, commit) + base = [ 'https://', host, '/', namespace, '/', project ].join('') return base, [ base, '/tree/', commit ].join('') end @@ -54,6 +58,7 @@ module SubmoduleHelper else base = [ @project.group.path, '/', url[/([^\/]*)\.git/, 1] ].join('') end - return project_path(base), project_tree_path(base, commit) + return namespace_project_path(base.namespace, base), + namespace_project_tree_path(base.namespace, base, commit) end end diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index 2142db29925..7a401a274d3 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -97,7 +97,8 @@ module TabHelper def branches_tab_class if current_controller?(:protected_branches) || current_controller?(:branches) || - current_page?(project_repository_path(@project)) + current_page?(namespace_project_repository_path(@project.namespace, + @project)) 'active' end end diff --git a/app/mailers/emails/issues.rb b/app/mailers/emails/issues.rb index e5346235963..687bac3aa31 100644 --- a/app/mailers/emails/issues.rb +++ b/app/mailers/emails/issues.rb @@ -3,7 +3,7 @@ module Emails def new_issue_email(recipient_id, issue_id) @issue = Issue.find(issue_id) @project = @issue.project - @target_url = project_issue_url(@project, @issue) + @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) mail_new_thread(@issue, from: sender(@issue.author_id), to: recipient(recipient_id), @@ -14,7 +14,7 @@ module Emails @issue = Issue.find(issue_id) @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id @project = @issue.project - @target_url = project_issue_url(@project, @issue) + @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) mail_answer_thread(@issue, from: sender(updated_by_user_id), to: recipient(recipient_id), @@ -25,7 +25,7 @@ module Emails @issue = Issue.find issue_id @project = @issue.project @updated_by = User.find updated_by_user_id - @target_url = project_issue_url(@project, @issue) + @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) mail_answer_thread(@issue, from: sender(updated_by_user_id), to: recipient(recipient_id), @@ -37,7 +37,7 @@ module Emails @issue_status = status @project = @issue.project @updated_by = User.find updated_by_user_id - @target_url = project_issue_url(@project, @issue) + @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) mail_answer_thread(@issue, from: sender(updated_by_user_id), to: recipient(recipient_id), diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb index 7f6c855c301..512a8f7ea6b 100644 --- a/app/mailers/emails/merge_requests.rb +++ b/app/mailers/emails/merge_requests.rb @@ -3,7 +3,9 @@ module Emails def new_merge_request_email(recipient_id, merge_request_id) @merge_request = MergeRequest.find(merge_request_id) @project = @merge_request.project - @target_url = project_merge_request_url(@project, @merge_request) + @target_url = namespace_project_merge_request_url(@project.namespace, + @project, + @merge_request) mail_new_thread(@merge_request, from: sender(@merge_request.author_id), to: recipient(recipient_id), @@ -14,7 +16,9 @@ module Emails @merge_request = MergeRequest.find(merge_request_id) @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id @project = @merge_request.project - @target_url = project_merge_request_url(@project, @merge_request) + @target_url = namespace_project_merge_request_url(@project.namespace, + @project, + @merge_request) mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), @@ -25,7 +29,9 @@ module Emails @merge_request = MergeRequest.find(merge_request_id) @updated_by = User.find updated_by_user_id @project = @merge_request.project - @target_url = project_merge_request_url(@project, @merge_request) + @target_url = namespace_project_merge_request_url(@project.namespace, + @project, + @merge_request) mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), @@ -35,7 +41,9 @@ module Emails def merged_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) @merge_request = MergeRequest.find(merge_request_id) @project = @merge_request.project - @target_url = project_merge_request_url(@project, @merge_request) + @target_url = namespace_project_merge_request_url(@project.namespace, + @project, + @merge_request) mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), @@ -47,7 +55,9 @@ module Emails @mr_status = status @project = @merge_request.project @updated_by = User.find updated_by_user_id - @target_url = project_merge_request_url(@project, @merge_request) + @target_url = namespace_project_merge_request_url(@project.namespace, + @project, + @merge_request) set_reference("merge_request_#{merge_request_id}") mail_answer_thread(@merge_request, from: sender(updated_by_user_id), diff --git a/app/mailers/emails/notes.rb b/app/mailers/emails/notes.rb index ef9af726a6c..ff251209e01 100644 --- a/app/mailers/emails/notes.rb +++ b/app/mailers/emails/notes.rb @@ -4,7 +4,9 @@ module Emails @note = Note.find(note_id) @commit = @note.noteable @project = @note.project - @target_url = project_commit_url(@project, @commit, anchor: "note_#{@note.id}") + @target_url = namespace_project_commit_url(@project.namespace, @project, + @commit, anchor: + "note_#{@note.id}") mail_answer_thread(@commit, from: sender(@note.author_id), to: recipient(recipient_id), @@ -15,7 +17,9 @@ module Emails @note = Note.find(note_id) @issue = @note.noteable @project = @note.project - @target_url = project_issue_url(@project, @issue, anchor: "note_#{@note.id}") + @target_url = namespace_project_issue_url(@project.namespace, @project, + @issue, anchor: + "note_#{@note.id}") mail_answer_thread(@issue, from: sender(@note.author_id), to: recipient(recipient_id), @@ -26,7 +30,10 @@ module Emails @note = Note.find(note_id) @merge_request = @note.noteable @project = @note.project - @target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{@note.id}") + @target_url = namespace_project_merge_request_url(@project.namespace, + @project, + @merge_request, anchor: + "note_#{@note.id}") mail_answer_thread(@merge_request, from: sender(@note.author_id), to: recipient(recipient_id), diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb index dc2ebc969c1..4bc40b35f2d 100644 --- a/app/mailers/emails/projects.rb +++ b/app/mailers/emails/projects.rb @@ -3,7 +3,7 @@ module Emails def project_access_granted_email(user_project_id) @project_member = ProjectMember.find user_project_id @project = @project_member.project - @target_url = project_url(@project) + @target_url = namespace_project_url(@project.namespace, @project) mail(to: @project_member.user.email, subject: subject("Access to project was granted")) end @@ -11,7 +11,7 @@ module Emails def project_was_moved_email(project_id, user_id) @user = User.find user_id @project = Project.find project_id - @target_url = project_url(@project) + @target_url = namespace_project_url(@project.namespace, @project) mail(to: @user.notification_email, subject: subject("Project was moved")) end @@ -24,10 +24,14 @@ module Emails @diffs = compare.diffs @branch = branch if @commits.length > 1 - @target_url = project_compare_url(@project, from: @commits.first, to: @commits.last) + @target_url = namespace_project_compare_url(@project.namespace, + @project, + from: @commits.first, + to: @commits.last) @subject = "#{@commits.length} new commits pushed to repository" else - @target_url = project_commit_url(@project, @commits.first) + @target_url = namespace_project_commit_url(@project.namespace, + @project, @commits.first) @subject = @commits.first.title end diff --git a/app/models/project.rb b/app/models/project.rb index 56e1aa29040..91ab788083d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -285,7 +285,7 @@ class Project < ActiveRecord::Base end def to_param - namespace.path + '/' + path + path end def web_url diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index b1eab24df19..782cf42ce55 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -27,14 +27,14 @@ class GitlabIssueTrackerService < IssueTrackerService end def project_url - project_issues_path(project) + namespace_project_issues_path(project.namespace, project) end def new_issue_url - new_project_issue_path project_id: project + new_namespace_project_issue_path namespace_id: project.namespace, project_id: project end def issue_url(iid) - "#{Gitlab.config.gitlab.url}#{project_issue_path(project_id: project, id: iid)}" + "#{Gitlab.config.gitlab.url}#{namespace_project_issue_path(namespace_id: project.namespace, project_id: project, id: iid)}" end end diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index e39fe882cb1..3372cfc11d0 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -12,7 +12,7 @@ module Projects class TransferError < StandardError; end def execute - namespace_id = params[:namespace_id] + namespace_id = params[:new_namespace_id] namespace = Namespace.find_by(id: namespace_id) if allowed_transfer?(current_user, project, namespace) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 32e0e4a6848..931b0c5c107 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -85,10 +85,10 @@ .light-well %h4 Projects .data - = link_to admin_projects_path do + = link_to admin_namespaces_projects_path do %h1= Project.count %hr - = link_to 'New Project', new_project_path, class: "btn btn-new" + = link_to('New Project', new_project_path, class: "btn btn-new") .col-sm-4 .light-well %h4 Users @@ -112,7 +112,7 @@ %hr - @projects.each do |project| %p - = link_to project.name_with_namespace, [:admin, project], class: 'str-truncated' + = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated' %span.light.pull-right #{time_ago_with_tooltip(project.created_at)} diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index d356aff6365..bb7f1972925 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -41,7 +41,7 @@ - @projects.each do |project| %li %strong - = link_to project.name_with_namespace, [:admin, project] + = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] %span.label.label-gray = repository_size(project) %span.pull-right.light diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 36a4a2fb4af..dffb4f0d82d 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -1,7 +1,7 @@ .row .col-md-3 .admin-filter - = form_tag admin_projects_path, method: :get, class: '' do + = form_tag admin_namespaces_projects_path, method: :get, class: '' do .form-group = label_tag :name, 'Name:' = text_field_tag :name, params[:name], class: "form-control" @@ -36,7 +36,7 @@ %hr = hidden_field_tag :sort, params[:sort] = button_tag "Search", class: "btn submit btn-primary" - = link_to "Reset", admin_projects_path, class: "btn btn-cancel" + = link_to "Reset", admin_namespaces_projects_path, class: "btn btn-cancel" .col-md-9 .panel.panel-default @@ -53,15 +53,15 @@ %b.caret %ul.dropdown-menu %li - = link_to admin_projects_path(sort: sort_value_recently_created) do + = link_to admin_namespaces_projects_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to admin_projects_path(sort: sort_value_oldest_created) do + = link_to admin_namespaces_projects_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to admin_projects_path(sort: sort_value_recently_updated) do + = link_to admin_namespaces_projects_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to admin_projects_path(sort: sort_value_oldest_updated) do + = link_to admin_namespaces_projects_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated - = link_to admin_projects_path(sort: sort_value_largest_repo) do + = link_to admin_namespaces_projects_path(sort: sort_value_largest_repo) do = sort_title_largest_repo = link_to 'New Project', new_project_path, class: "btn btn-new" %ul.well-list @@ -70,12 +70,12 @@ .list-item-name %span{ class: visibility_level_color(project.visibility_level) } = visibility_level_icon(project.visibility_level) - = link_to project.name_with_namespace, [:admin, project] + = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] .pull-right %span.label.label-gray = repository_size(project) - = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" - = link_to 'Destroy', [project], data: { confirm: remove_project_message(project) }, method: :delete, class: "btn btn-small btn-remove" + = link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-small" + = link_to 'Destroy', [project.namespace.becomes(Namespace), project], data: { confirm: remove_project_message(project) }, method: :delete, class: "btn btn-small btn-remove" - if @projects.blank? .nothing-here-block 0 projects matches = paginate @projects, theme: "gitlab" diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 6d536199851..3bcf1cc9ede 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -1,6 +1,6 @@ %h3.page-title Project: #{@project.name_with_namespace} - = link_to edit_project_path(@project), class: "btn pull-right" do + = link_to edit_namespace_project_path(@project.namespace, @project), class: "btn pull-right" do %i.fa.fa-pencil-square-o Edit %hr @@ -13,7 +13,7 @@ %li %span.light Name: %strong - = link_to @project.name, project_path(@project) + = link_to @project.name, namespace_project_path(@project.namespace, @project) %li %span.light Namespace: %strong @@ -79,11 +79,11 @@ .panel-heading Transfer project .panel-body - = form_for @project, url: transfer_admin_project_path(@project), method: :put, html: { class: 'form-horizontal' } do |f| + = form_for @project, url: transfer_admin_namespace_project_path(@project.namespace, @project), method: :put, html: { class: 'form-horizontal' } do |f| .form-group - = f.label :namespace_id, "Namespace", class: 'control-label' + = f.label :new_namespace_id, "Namespace", class: 'control-label' .col-sm-10 - = namespace_select_tag :namespace_id, selected: params[:namespace_id], class: 'input-large' + = namespace_select_tag :new_namespace_id, selected: params[:namespace_id], class: 'input-large' .form-group .col-sm-2 @@ -111,7 +111,7 @@ %small (#{@project.users.count}) .pull-right - = link_to project_team_index_path(@project), class: "btn btn-tiny" do + = link_to namespace_project_team_index_path(@project.namespace, @project), class: "btn btn-tiny" do %i.fa.fa-pencil-square-o Manage Access %ul.well-list.team_members @@ -126,7 +126,7 @@ %span.light Owner - else %span.light= project_member.human_access - = link_to project_team_member_path(@project, user), data: { confirm: remove_from_project_team_message(@project, user)}, method: :delete, remote: true, class: "btn btn-small btn-remove" do + = link_to namespace_project_team_member_path(@project.namespace, @project, user), data: { confirm: remove_from_project_team_message(@project, user)}, method: :delete, remote: true, class: "btn btn-small btn-remove" do %i.fa.fa-times .panel-footer = paginate @project_members, param_name: 'project_members_page', theme: 'gitlab' diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 88e71aa170f..90267897503 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -206,7 +206,7 @@ - tm = project.team.find_tm(@user.id) %li.project_member .list-item-name - = link_to admin_project_path(project), class: dom_class(project) do + = link_to admin_namespace_project_path(project.namespace, project), class: dom_class(project) do = project.name_with_namespace - if tm @@ -217,7 +217,7 @@ %span.light= tm.human_access - if tm.respond_to? :project - = link_to project_team_member_path(project, @user), data: { confirm: remove_from_project_team_message(project, @user) }, remote: true, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from project' do + = link_to namespace_project_team_member_path(project.namespace, project, @user), data: { confirm: remove_from_project_team_message(project, @user) }, remote: true, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from project' do %i.fa.fa-times #ssh-keys.tab-pane = render 'profiles/keys/key_table', admin: true diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index f0fb2c1881b..d638a161f40 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,6 +1,6 @@ -= link_to project_path(project), class: dom_class(project) do += link_to namespace_project_path(project.namespace, project), class: dom_class(project) do .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar project-avatar s40') + = project_icon("#{project.namespace.to_param}/#{project.to_param}", alt: '', class: 'avatar project-avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) %span.str-truncated diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/_projects.html.haml index 0596738342f..252dbf78882 100644 --- a/app/views/dashboard/_projects.html.haml +++ b/app/views/dashboard/_projects.html.haml @@ -20,6 +20,6 @@ %span.light #{@projects_limit} of #{pluralize(@projects_count, 'project')} displayed. .pull-right - = link_to projects_dashboard_path do + = link_to namespace_projects_dashboard_path do Show all %i.fa.fa-angle-right diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index 21e44fb1c60..1cea654dc1e 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -16,10 +16,10 @@ %li.my-project-row %h4.project-title .pull-left - = project_icon(project.to_param, alt: '', class: 'avatar project-avatar s60') + = project_icon("#{project.namespace.to_param}/#{project.to_param}", alt: '', class: 'avatar project-avatar s60') .project-access-icon = visibility_level_icon(project.visibility_level) - = link_to project_path(project), class: dom_class(project) do + = link_to namespace_project_path(project.namespace, project), class: dom_class(project) do = project.name_with_namespace - if project.forked_from_project @@ -27,11 +27,11 @@ %small %i.fa.fa-code-fork Forked from: - = link_to project.forked_from_project.name_with_namespace, project_path(project.forked_from_project) + = link_to project.forked_from_project.name_with_namespace, namespace_project_path(project.namespace, project.forked_from_project) - if current_user.can_leave_project?(project) .pull-right - = link_to leave_project_team_members_path(project), data: { confirm: "Leave project?"}, method: :delete, remote: true, class: "btn-tiny btn remove-row", title: 'Leave project' do + = link_to leave_namespace_project_team_members_path(project.namespace, project), data: { confirm: "Leave project?"}, method: :delete, remote: true, class: "btn-tiny btn remove-row", title: 'Leave project' do %i.fa.fa-sign-out Leave diff --git a/app/views/events/_commit.html.haml b/app/views/events/_commit.html.haml index f0c34def145..c86ce9ae651 100644 --- a/app/views/events/_commit.html.haml +++ b/app/views/events/_commit.html.haml @@ -1,5 +1,5 @@ %li.commit .commit-row-title - = link_to truncate_sha(commit[:id]), project_commit_path(project, commit[:id]), class: "commit_short_id", alt: '' + = link_to truncate_sha(commit[:id]), namespace_project_commit_path(project.namespace, project, commit[:id]), class: "commit_short_id", alt: ''   = gfm event_commit_title(commit[:message]), project diff --git a/app/views/events/_event_last_push.html.haml b/app/views/events/_event_last_push.html.haml index 4c9a39bcc27..cb40aa9970b 100644 --- a/app/views/events/_event_last_push.html.haml +++ b/app/views/events/_event_last_push.html.haml @@ -2,7 +2,7 @@ .event-last-push .event-last-push-text %span You pushed to - = link_to project_commits_path(event.project, event.ref_name) do + = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do %strong= event.ref_name at %strong= link_to_project event.project diff --git a/app/views/events/_event_push.atom.haml b/app/views/events/_event_push.atom.haml index 2b63519edac..0ffd2aa0b98 100644 --- a/app/views/events/_event_push.atom.haml +++ b/app/views/events/_event_push.atom.haml @@ -2,7 +2,7 @@ - event.commits.first(15).each do |commit| %p %strong= commit[:author][:name] - = link_to "(##{truncate_sha(commit[:id])})", project_commit_path(event.project, id: commit[:id]) + = link_to "(##{truncate_sha(commit[:id])})", namespace_project_commit_path(event.project.namespace, event.project, id: commit[:id]) %i at = commit[:timestamp].to_time.to_s(:short) diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml index a9d3adf41df..b3f32dab79c 100644 --- a/app/views/events/event/_common.html.haml +++ b/app/views/events/event/_common.html.haml @@ -2,7 +2,7 @@ %span.author_name= link_to_author event %span.event_label{class: event.action_name}= event_action_name(event) - if event.target - %strong= link_to "##{event.target_iid}", [event.project, event.target] + %strong= link_to "##{event.target_iid}", [event.project.namespace.becomes(Namespace), event.project, event.target] - else %strong= gfm event.target_title at diff --git a/app/views/events/event/_push.html.haml b/app/views/events/event/_push.html.haml index b912b5e092f..092d246a94c 100644 --- a/app/views/events/event/_push.html.haml +++ b/app/views/events/event/_push.html.haml @@ -4,7 +4,7 @@ - if event.rm_ref? %strong= event.ref_name - else - = link_to project_commits_path(event.project, event.ref_name) do + = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do %strong= event.ref_name at = link_to_project event.project @@ -21,5 +21,5 @@ %li.commits-stat - if event.commits_count > 2 %span ... and #{event.commits_count - 2} more commits. - = link_to project_compare_path(event.project, from: event.commit_from, to: event.commit_to) do + = link_to namespace_project_compare_path(event.project.namespace, event.project, from: event.commit_from, to: event.commit_to) do %strong Compare → #{truncate_sha(event.commit_from)}...#{truncate_sha(event.commit_to)} diff --git a/app/views/explore/projects/_project.html.haml b/app/views/explore/projects/_project.html.haml index ffbddbae4d6..cdd6ede36a1 100644 --- a/app/views/explore/projects/_project.html.haml +++ b/app/views/explore/projects/_project.html.haml @@ -2,7 +2,7 @@ %h4.project-title .project-access-icon = visibility_level_icon(project.visibility_level) - = link_to project.name_with_namespace, project + = link_to project.name_with_namespace, [project.namespace.becomes(Namespace), project] - if current_page?(starred_explore_projects_path) %strong.pull-right @@ -16,11 +16,11 @@ .repo-info - unless project.empty_repo? - = link_to pluralize(project.repository.round_commit_count, 'commit'), project_commits_path(project, project.default_branch) + = link_to pluralize(project.repository.round_commit_count, 'commit'), namespace_project_commits_path(project.namespace, project, project.default_branch) · - = link_to pluralize(project.repository.branch_names.count, 'branch'), project_branches_path(project) + = link_to pluralize(project.repository.branch_names.count, 'branch'), namespace_project_branches_path(project.namespace, project) · - = link_to pluralize(project.repository.tag_names.count, 'tag'), project_tags_path(project) + = link_to pluralize(project.repository.tag_names.count, 'tag'), namespace_project_tags_path(project.namespace, project) - else %i.fa.fa-exclamation-triangle Empty repository diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index a2f1d28a275..5fe93f4e083 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -11,9 +11,9 @@ .nothing-here-block This group has no projects yet - projects.each do |project| %li.project-row - = link_to project_path(project), class: dom_class(project) do + = link_to namespace_project_path(project.namespace, project), class: dom_class(project) do .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s40') + = project_icon("#{project.namespace.to_param}/#{project.to_param}", alt: '', class: 'avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) %span.str-truncated diff --git a/app/views/groups/milestones/_issue.html.haml b/app/views/groups/milestones/_issue.html.haml index c95c2e89670..27d0c62df8c 100644 --- a/app/views/groups/milestones/_issue.html.haml +++ b/app/views/groups/milestones/_issue.html.haml @@ -2,9 +2,9 @@ %span.milestone-row - project = issue.project %strong #{project.name} · - = link_to [project, issue] do + = link_to [project.namespace.becomes(Namespace), project, issue] do %span.cgray ##{issue.iid} - = link_to_gfm issue.title, [project, issue], title: issue.title + = link_to_gfm issue.title, [project.namespace.becomes(Namespace), project, issue], title: issue.title .pull-right.assignee-icon - if issue.assignee = image_tag avatar_icon(issue.assignee.email, 16), class: "avatar s16" diff --git a/app/views/groups/milestones/_merge_request.html.haml b/app/views/groups/milestones/_merge_request.html.haml index e0c903bfdb2..b2d2097dfab 100644 --- a/app/views/groups/milestones/_merge_request.html.haml +++ b/app/views/groups/milestones/_merge_request.html.haml @@ -2,9 +2,9 @@ %span.milestone-row - project = merge_request.project %strong #{project.name} · - = link_to [project, merge_request] do + = link_to [project.namespace.becomes(Namespace), project, merge_request] do %span.cgray ##{merge_request.iid} - = link_to_gfm merge_request.title, [project, merge_request], title: merge_request.title + = link_to_gfm merge_request.title, [project.namespace.becomes(Namespace), project, merge_request], title: merge_request.title .pull-right.assignee-icon - if merge_request.assignee = image_tag avatar_icon(merge_request.assignee.email, 16), class: "avatar s16" diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml index 7bcac56c37b..e3606d167ad 100644 --- a/app/views/groups/milestones/show.html.haml +++ b/app/views/groups/milestones/show.html.haml @@ -28,7 +28,7 @@ - @group_milestone.milestones.each do |milestone| %tr %td - = link_to "#{milestone.project.name}", project_milestone_path(milestone.project, milestone) + = link_to "#{milestone.project.name}", namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) %td = milestone.issues.opened.count %td diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml index 40c81e8cd5b..8c829654fb0 100644 --- a/app/views/groups/projects.html.haml +++ b/app/views/groups/projects.html.haml @@ -16,8 +16,8 @@ %span.label.label-gray = repository_size(project) .pull-right - = link_to 'Members', project_team_index_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" - = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" + = link_to 'Members', namespace_project_team_index_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-small" + = link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-small" = link_to 'Remove', project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn btn-small btn-remove" - if @projects.blank? .nothing-here-block This group has no projects yet diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index a6900f4a04b..bece8061fb9 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -30,6 +30,6 @@ = auto_discovery_link_tag :atom, projects_url(:atom, private_token: current_user.private_token), title: "Dashboard feed" - if @project && !@project.new_record? - if current_controller?(:tree, :commits) - = auto_discovery_link_tag(:atom, project_commits_url(@project, @ref, format: :atom, private_token: current_user.private_token), title: "Recent commits to #{@project.name}:#{@ref}") + = auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom, private_token: current_user.private_token), title: "Recent commits to #{@project.name}:#{@ref}") - if current_controller?(:issues) - = auto_discovery_link_tag(:atom, project_issues_url(@project, :atom, private_token: current_user.private_token), title: "#{@project.name} issues") + = auto_discovery_link_tag(:atom, namespace_project_issues_url(@project.namespace, @project, :atom, private_token: current_user.private_token), title: "#{@project.name} issues") diff --git a/app/views/layouts/_init_auto_complete.html.haml b/app/views/layouts/_init_auto_complete.html.haml index 353f7ce34f1..3c58f10e759 100644 --- a/app/views/layouts/_init_auto_complete.html.haml +++ b/app/views/layouts/_init_auto_complete.html.haml @@ -1,3 +1,3 @@ :javascript - GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_project_path(@project, type: @noteable.class, type_id: params[:id])}" + GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_namespace_project_path(@project.namespace, @project, type: @noteable.class, type_id: params[:id])}" GitLab.GfmAutoComplete.setup(); diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 74334b12e63..2f38d596c65 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -5,7 +5,7 @@ %span Overview = nav_link(controller: :projects) do - = link_to admin_projects_path, title: 'Projects' do + = link_to admin_namespaces_projects_path, title: 'Projects' do %i.fa.fa-cube %span Projects diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 8d572ddcd10..62a51047c3c 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -1,13 +1,13 @@ %ul.project-navigation.nav.nav-sidebar - if @project_settings_nav = nav_link do - = link_to project_path(@project), title: 'Back to project', class: "" do + = link_to namespace_project_path(@project.namespace, @project), title: 'Back to project', class: "" do %i.fa.fa-angle-left %span Back to project = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do + = link_to edit_namespace_project_path(@project.namespace, @project), title: 'Settings', class: "stat-tab tab no-highlight" do %i.fa.fa-cogs %span Settings @@ -17,34 +17,34 @@ - else = nav_link(path: 'projects#show', html_options: {class: "home"}) do - = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do + = link_to namespace_project_path(@project.namespace, @project), title: 'Project', class: 'shortcuts-project' do %i.fa.fa-dashboard %span Project - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do - = link_to project_tree_path(@project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree' do + = link_to namespace_project_tree_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree' do %i.fa.fa-files-o %span Files - if project_nav_tab? :commits = nav_link(controller: %w(commit commits compare repositories tags branches)) do - = link_to project_commits_path(@project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits' do + = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits' do %i.fa.fa-history %span Commits - if project_nav_tab? :network = nav_link(controller: %w(network)) do - = link_to project_network_path(@project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network' do + = link_to namespace_project_network_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network' do %i.fa.fa-code-fork %span Network - if project_nav_tab? :graphs = nav_link(controller: %w(graphs)) do - = link_to project_graph_path(@project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs' do + = link_to namespace_project_graph_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs' do %i.fa.fa-area-chart %span Graphs @@ -60,7 +60,7 @@ - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do - = link_to project_merge_requests_path(@project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do + = link_to namespace_project_merge_requests_path(@project.namespace, @project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do %i.fa.fa-tasks %span Merge Requests @@ -68,21 +68,21 @@ - if project_nav_tab? :wiki = nav_link(controller: :wikis) do - = link_to project_wiki_path(@project, :home), title: 'Wiki', class: 'shortcuts-wiki' do + = link_to namespace_project_wiki_path(@project.namespace, @project, :home), title: 'Wiki', class: 'shortcuts-wiki' do %i.fa.fa-book %span Wiki - if project_nav_tab? :snippets = nav_link(controller: :snippets) do - = link_to project_snippets_path(@project), title: 'Snippets', class: 'shortcuts-snippets' do + = link_to namespace_project_snippets_path(@project.namespace, @project), title: 'Snippets', class: 'shortcuts-snippets' do %i.fa.fa-file-text-o %span Snippets - if project_nav_tab? :settings = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do + = link_to edit_namespace_project_path(@project.namespace, @project), title: 'Settings', class: "stat-tab tab no-highlight" do %i.fa.fa-cogs %span Settings diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index a722db2f32c..8cca80e5248 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -28,4 +28,4 @@ #{link_to "View it on GitLab", @target_url} = email_action @target_url - if @project - You're receiving this notification because you are a member of the #{link_to_unless @target_url, @project.name_with_namespace, project_url(@project)} project team. + You're receiving this notification because you are a member of the #{link_to_unless @target_url, @project.name_with_namespace, namespace_project_url(@project.namespace, @project)} project team. diff --git a/app/views/notify/_reassigned_issuable_email.text.erb b/app/views/notify/_reassigned_issuable_email.text.erb index 817d030c362..855d37429d9 100644 --- a/app/views/notify/_reassigned_issuable_email.text.erb +++ b/app/views/notify/_reassigned_issuable_email.text.erb @@ -1,6 +1,6 @@ Reassigned <%= issuable.class.model_name.human.titleize %> <%= issuable.iid %> -<%= url_for([issuable.project, issuable, {only_path: false}]) %> +<%= url_for([issuable.project.namespace.becomes(Namespace), issuable.project, issuable, {only_path: false}]) %> Assignee changed <%= "from #{@previous_assignee.name}" if @previous_assignee -%> to <%= "#{issuable.assignee_id ? issuable.assignee_name : 'Unassigned'}" %> diff --git a/app/views/notify/closed_issue_email.text.haml b/app/views/notify/closed_issue_email.text.haml index 49f160a0d5f..ac703b31edd 100644 --- a/app/views/notify/closed_issue_email.text.haml +++ b/app/views/notify/closed_issue_email.text.haml @@ -1,3 +1,3 @@ = "Issue was closed by #{@updated_by.name}" -Issue ##{@issue.iid}: #{project_issue_url(@issue.project, @issue)} +Issue ##{@issue.iid}: #{namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)} diff --git a/app/views/notify/closed_merge_request_email.text.haml b/app/views/notify/closed_merge_request_email.text.haml index d6b76e906c5..59db86b08bc 100644 --- a/app/views/notify/closed_merge_request_email.text.haml +++ b/app/views/notify/closed_merge_request_email.text.haml @@ -1,6 +1,6 @@ = "Merge Request ##{@merge_request.iid} was closed by #{@updated_by.name}" -Merge Request url: #{project_merge_request_url(@merge_request.target_project, @merge_request)} +Merge Request url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} = merge_path_description(@merge_request, 'to') diff --git a/app/views/notify/issue_status_changed_email.text.erb b/app/views/notify/issue_status_changed_email.text.erb index 4200881f7e8..e6ab3fcde77 100644 --- a/app/views/notify/issue_status_changed_email.text.erb +++ b/app/views/notify/issue_status_changed_email.text.erb @@ -1,4 +1,4 @@ Issue was <%= @issue_status %> by <%= @updated_by.name %> -Issue <%= @issue.iid %>: <%= url_for(project_issue_url(@issue.project, @issue)) %> +Issue <%= @issue.iid %>: <%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)) %> diff --git a/app/views/notify/merge_request_status_email.text.haml b/app/views/notify/merge_request_status_email.text.haml index 8750bf86e2c..b96dd0fd8ab 100644 --- a/app/views/notify/merge_request_status_email.text.haml +++ b/app/views/notify/merge_request_status_email.text.haml @@ -1,6 +1,6 @@ = "Merge Request ##{@merge_request.iid} was #{@mr_status} by #{@updated_by.name}" -Merge Request url: #{project_merge_request_url(@merge_request.target_project, @merge_request)} +Merge Request url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} = merge_path_description(@merge_request, 'to') diff --git a/app/views/notify/merged_merge_request_email.text.haml b/app/views/notify/merged_merge_request_email.text.haml index 360da60bc3f..9db75bdb19e 100644 --- a/app/views/notify/merged_merge_request_email.text.haml +++ b/app/views/notify/merged_merge_request_email.text.haml @@ -1,6 +1,6 @@ = "Merge Request ##{@merge_request.iid} was merged" -Merge Request Url: #{project_merge_request_url(@merge_request.target_project, @merge_request)} +Merge Request Url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} = merge_path_description(@merge_request, 'to') diff --git a/app/views/notify/new_issue_email.text.erb b/app/views/notify/new_issue_email.text.erb index d36f54eb1ca..0cc62935498 100644 --- a/app/views/notify/new_issue_email.text.erb +++ b/app/views/notify/new_issue_email.text.erb @@ -1,5 +1,5 @@ New Issue was created. -Issue <%= @issue.iid %>: <%= url_for(project_issue_url(@issue.project, @issue)) %> +Issue <%= @issue.iid %>: <%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)) %> Author: <%= @issue.author_name %> Asignee: <%= @issue.assignee_name %> diff --git a/app/views/notify/new_merge_request_email.text.erb b/app/views/notify/new_merge_request_email.text.erb index 16be4bb619f..f08039ad045 100644 --- a/app/views/notify/new_merge_request_email.text.erb +++ b/app/views/notify/new_merge_request_email.text.erb @@ -1,6 +1,6 @@ New Merge Request #<%= @merge_request.iid %> -<%= url_for(project_merge_request_url(@merge_request.target_project, @merge_request)) %> +<%= url_for(namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)) %> <%= merge_path_description(@merge_request, 'to') %> Author: <%= @merge_request.author_name %> diff --git a/app/views/notify/note_commit_email.text.erb b/app/views/notify/note_commit_email.text.erb index aab8e5cfb6c..aaeaf5fdf73 100644 --- a/app/views/notify/note_commit_email.text.erb +++ b/app/views/notify/note_commit_email.text.erb @@ -1,6 +1,6 @@ New comment for Commit <%= @commit.short_id %> -<%= url_for(project_commit_url(@note.project, id: @commit.id, anchor: "note_#{@note.id}")) %> +<%= url_for(namespace_project_commit_url(@note.project.namespace, @note.project, id: @commit.id, anchor: "note_#{@note.id}")) %> Author: <%= @note.author_name %> diff --git a/app/views/notify/note_issue_email.text.erb b/app/views/notify/note_issue_email.text.erb index 8a61f54a337..e33cbcd70f2 100644 --- a/app/views/notify/note_issue_email.text.erb +++ b/app/views/notify/note_issue_email.text.erb @@ -1,6 +1,6 @@ New comment for Issue <%= @issue.iid %> -<%= url_for(project_issue_url(@issue.project, @issue, anchor: "note_#{@note.id}")) %> +<%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue, anchor: "note_#{@note.id}")) %> Author: <%= @note.author_name %> diff --git a/app/views/notify/note_merge_request_email.text.erb b/app/views/notify/note_merge_request_email.text.erb index 79e72ca16c6..1d1411992a6 100644 --- a/app/views/notify/note_merge_request_email.text.erb +++ b/app/views/notify/note_merge_request_email.text.erb @@ -1,6 +1,6 @@ New comment for Merge Request <%= @merge_request.iid %> -<%= url_for(project_merge_request_url(@merge_request.target_project, @merge_request, anchor: "note_#{@note.id}")) %> +<%= url_for(namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, anchor: "note_#{@note.id}")) %> <%= @note.author_name %> diff --git a/app/views/notify/project_access_granted_email.html.haml b/app/views/notify/project_access_granted_email.html.haml index 4596205f39b..dfc30a2d360 100644 --- a/app/views/notify/project_access_granted_email.html.haml +++ b/app/views/notify/project_access_granted_email.html.haml @@ -1,5 +1,5 @@ %p = "You have been granted #{@project_member.human_access} access to project" %p - = link_to project_url(@project) do + = link_to namespace_project_url(@project.namespace, @project) do = @project.name_with_namespace diff --git a/app/views/notify/project_access_granted_email.text.erb b/app/views/notify/project_access_granted_email.text.erb index de24feb802f..68eb1611ba7 100644 --- a/app/views/notify/project_access_granted_email.text.erb +++ b/app/views/notify/project_access_granted_email.text.erb @@ -1,4 +1,4 @@ You have been granted <%= @project_member.human_access %> access to project <%= @project.name_with_namespace %> -<%= url_for(project_url(@project)) %> +<%= url_for(namespace_project_url(@project.namespace, @project)) %> diff --git a/app/views/notify/project_was_moved_email.html.haml b/app/views/notify/project_was_moved_email.html.haml index fe248584e55..f53de2de287 100644 --- a/app/views/notify/project_was_moved_email.html.haml +++ b/app/views/notify/project_was_moved_email.html.haml @@ -2,7 +2,7 @@ Project was moved to another location %p The project is now located under - = link_to project_url(@project) do + = link_to namespace_project_url(@project.namespace, @project) do = @project.name_with_namespace %p To update the remote url in your local repository run (for ssh): diff --git a/app/views/notify/project_was_moved_email.text.erb b/app/views/notify/project_was_moved_email.text.erb index 664148fb3ba..b3f18b35a4d 100644 --- a/app/views/notify/project_was_moved_email.text.erb +++ b/app/views/notify/project_was_moved_email.text.erb @@ -1,7 +1,7 @@ Project was moved to another location The project is now located under -<%= project_url(@project) %> +<%= namespace_project_url(@project.namespace, @project) %> To update the remote url in your local repository run (for ssh): diff --git a/app/views/notify/repository_push_email.html.haml b/app/views/notify/repository_push_email.html.haml index b6fe445867c..a45d1dedcd1 100644 --- a/app/views/notify/repository_push_email.html.haml +++ b/app/views/notify/repository_push_email.html.haml @@ -1,11 +1,11 @@ -%h3 #{@author.name} pushed to #{@branch} at #{link_to @project.name_with_namespace, project_url(@project)} +%h3 #{@author.name} pushed to #{@branch} at #{link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project)} %h4 Commits: %ul - @commits.each do |commit| %li - %strong #{link_to commit.short_id, project_commit_url(@project, commit)} + %strong #{link_to commit.short_id, namespace_project_commit_url(@project.namespace, @project, commit)} %div %span by #{commit.author_name} %i at #{commit.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ")} diff --git a/app/views/notify/repository_push_email.text.haml b/app/views/notify/repository_push_email.text.haml index 6f5f9eda2c5..fa355cb5269 100644 --- a/app/views/notify/repository_push_email.text.haml +++ b/app/views/notify/repository_push_email.text.haml @@ -1,9 +1,9 @@ -#{@author.name} pushed to #{@branch} at #{link_to @project.name_with_namespace, project_url(@project)} +#{@author.name} pushed to #{@branch} at #{link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project)} \ Commits: - @commits.each do |commit| - #{link_to commit.short_id, project_commit_url(@project, commit)} by #{commit.author_name} + #{link_to commit.short_id, namespace_project_commit_url(@project.namespace, @project, commit)} by #{commit.author_name} #{commit.safe_message} \- - - - - \ diff --git a/app/views/projects/_dropdown.html.haml b/app/views/projects/_dropdown.html.haml index 6ff46970336..2d5120f283b 100644 --- a/app/views/projects/_dropdown.html.haml +++ b/app/views/projects/_dropdown.html.haml @@ -9,24 +9,24 @@ New issue - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) %li - = link_to new_project_merge_request_path(@project), title: "New Merge Request" do + = link_to new_namespace_project_merge_request_path(@project.namespace, @project), title: "New Merge Request" do New merge request - if @project.snippets_enabled && can?(current_user, :write_snippet, @project) %li - = link_to new_project_snippet_path(@project), title: "New Snippet" do + = link_to new_namespace_project_snippet_path(@project.namespace, @project), title: "New Snippet" do New snippet - if can?(current_user, :admin_team_member, @project) %li - = link_to new_project_team_member_path(@project), title: "New project member" do + = link_to new_namespace_project_team_member_path(@project.namespace, @project), title: "New project member" do New project member - if can? current_user, :push_code, @project %li.divider %li - = link_to new_project_branch_path(@project) do + = link_to new_namespace_project_branch_path(@project.namespace, @project) do %i.fa.fa-code-fork Git branch %li - = link_to new_project_tag_path(@project) do + = link_to new_namespace_project_tag_path(@project.namespace, @project) do %i.fa.fa-tag Git tag diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 5697f9ea1af..60d461da664 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -1,28 +1,28 @@ - empty_repo = @project.empty_repo? .project-home-panel{:class => ("empty-project" if empty_repo)} .project-identicon-holder - = project_icon(@project.to_param, alt: '', class: 'avatar project-avatar') + = project_icon("#{@project.namespace.to_param}/#{@project.to_param}", alt: '', class: 'avatar project-avatar') .project-home-row .project-home-desc - if @project.description.present? = escaped_autolink(@project.description) - if can?(current_user, :admin_project, @project) – - = link_to 'Edit', edit_project_path + = link_to 'Edit', edit_namespace_project_path - elsif !@project.empty_repo? && @repository.readme - readme = @repository.readme – - = link_to project_blob_path(@project, tree_join(@repository.root_ref, readme.name)) do + = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)) do = readme.name .star-fork-buttons - unless @project.empty_repo? .fork-buttons - if current_user && can?(current_user, :fork_project, @project) && @project.namespace != current_user.namespace - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 - = link_to project_path(current_user.fork_of(@project)), title: 'Go to my fork' do + = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to my fork' do = link_to_toggle_fork - else - = link_to new_project_fork_path(@project), title: "Fork project" do + = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project" do = link_to_toggle_fork .star-buttons diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml index 9e2e214b3e8..52a31610e6c 100644 --- a/app/views/projects/_issuable_form.html.haml +++ b/app/views/projects/_issuable_form.html.haml @@ -53,7 +53,7 @@ %span.light No open milestones available.   - if can? current_user, :admin_milestone, issuable.project - = link_to 'Create new milestone', new_project_milestone_path(issuable.project), target: :blank + = link_to 'Create new milestone', new_namespace_project_milestone_path(issuable.project.namespace, issuable.project), target: :blank .form-group = f.label :label_ids, class: 'control-label' do %i.fa.fa-tag @@ -66,7 +66,7 @@ %span.light No labels yet.   - if can? current_user, :admin_label, issuable.project - = link_to 'Create new label', new_project_label_path(issuable.project), target: :blank + = link_to 'Create new label', new_namespace_project_label_path(issuable.project.namespace, issuable.project), target: :blank .form-actions - if !issuable.project.empty_repo? && contribution_guide_url(issuable.project) && !issuable.persisted? @@ -82,4 +82,4 @@ - cancel_project = issuable.source_project - else - cancel_project = issuable.project - = link_to 'Cancel', [cancel_project, issuable], class: 'btn btn-cancel' + = link_to 'Cancel', [cancel_project.namespace.becomes(Namespace), cancel_project, issuable], class: 'btn btn-cancel' diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml index f4e3d9a1093..3f14616af2c 100644 --- a/app/views/projects/_issues_nav.html.haml +++ b/app/views/projects/_issues_nav.html.haml @@ -1,20 +1,20 @@ %ul.nav.nav-tabs - if project_nav_tab? :issues = nav_link(controller: :issues) do - = link_to project_issues_path(@project), class: "tab" do + = link_to namespace_project_issues_path(@project.namespace, @project), class: "tab" do %i.fa.fa-exclamation-circle Issues - if project_nav_tab? :merge_requests = nav_link(controller: :merge_requests) do - = link_to project_merge_requests_path(@project), class: "tab" do + = link_to namespace_project_merge_requests_path(@project.namespace, @project), class: "tab" do %i.fa.fa-tasks Merge Requests = nav_link(controller: :milestones) do - = link_to project_milestones_path(@project), class: "tab" do + = link_to namespace_project_milestones_path(@project.namespace, @project), class: "tab" do %i.fa.fa-clock-o Milestones = nav_link(controller: :labels) do - = link_to project_labels_path(@project), class: "tab" do + = link_to namespace_project_labels_path(@project.namespace, @project), class: "tab" do %i.fa.fa-tags Labels @@ -22,13 +22,13 @@ - if current_controller?(:issues) - if current_user %li.hidden-xs - = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do + = link_to namespace_project_issues_path(@project.namespace, @project, :atom, { private_token: current_user.private_token }) do %i.fa.fa-rss %li.pull-right .pull-right .pull-left - = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do + = form_tag namespace_project_issues_path(@project.namespace, @project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do .append-right-10.hidden-xs.hidden-sm = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } = hidden_field_tag :state, params['state'] @@ -38,7 +38,7 @@ = hidden_field_tag :label_id, params['label_id'] - if can? current_user, :write_issue, @project - = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do + = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do %i.fa.fa-plus New Issue @@ -46,6 +46,6 @@ %li.pull-right .pull-right - if can? current_user, :write_merge_request, @project - = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do + = link_to new_namespace_project_merge_request_path(@project.namespace, @project), class: "btn btn-new pull-left", title: "New Merge Request" do %i.fa.fa-plus New Merge Request diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml index cb75149434f..a2c8ee1d116 100644 --- a/app/views/projects/_md_preview.html.haml +++ b/app/views/projects/_md_preview.html.haml @@ -4,7 +4,7 @@ Write %li = link_to '#md-preview-holder', class: 'js-md-preview-button', - data: { url: markdown_preview_project_path(@project) } do + data: { url: markdown_preview_namespace_project_path(@project.namespace, @project) } do Preview %div .md-write-holder diff --git a/app/views/projects/_settings_nav.html.haml b/app/views/projects/_settings_nav.html.haml index 646e48a1e1d..1a18bb065ad 100644 --- a/app/views/projects/_settings_nav.html.haml +++ b/app/views/projects/_settings_nav.html.haml @@ -1,31 +1,31 @@ %ul.project-settings-nav.sidebar-subnav = nav_link(path: 'projects#edit') do - = link_to edit_project_path(@project), title: 'Project', class: "stat-tab tab " do + = link_to edit_namespace_project_path(@project.namespace, @project), title: 'Project', class: "stat-tab tab " do %i.fa.fa-pencil-square-o %span Project = nav_link(controller: [:team_members, :teams]) do - = link_to project_team_index_path(@project), title: 'Members', class: "team-tab tab" do + = link_to namespace_project_team_index_path(@project.namespace, @project), title: 'Members', class: "team-tab tab" do %i.fa.fa-users %span Members = nav_link(controller: :deploy_keys) do - = link_to project_deploy_keys_path(@project), title: 'Deploy Keys' do + = link_to namespace_project_deploy_keys_path(@project.namespace, @project), title: 'Deploy Keys' do %i.fa.fa-key %span Deploy Keys = nav_link(controller: :hooks) do - = link_to project_hooks_path(@project), title: 'Web Hooks' do + = link_to namespace_project_hooks_path(@project.namespace, @project), title: 'Web Hooks' do %i.fa.fa-link %span Web Hooks = nav_link(controller: :services) do - = link_to project_services_path(@project), title: 'Services' do + = link_to namespace_project_services_path(@project.namespace, @project), title: 'Services' do %i.fa.fa-cogs %span Services = nav_link(controller: :protected_branches) do - = link_to project_protected_branches_path(@project), title: 'Protected Branches' do + = link_to namespace_project_protected_branches_path(@project.namespace, @project), title: 'Protected Branches' do %i.fa.fa-lock %span Protected branches diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml index 51a2f20d1e2..5a33d18e631 100644 --- a/app/views/projects/blame/show.html.haml +++ b/app/views/projects/blame/show.html.haml @@ -15,11 +15,11 @@ %tr %td.blame-commit %span.commit - = link_to commit.short_id, project_commit_path(@project, commit), class: "commit_short_id" + = link_to commit.short_id, namespace_project_commit_path(@project.namespace, @project, commit), class: "commit_short_id"   = commit_author_link(commit, avatar: true, size: 16)   - = link_to_gfm truncate(commit.title, length: 20), project_commit_path(@project, commit.id), class: "row_title" + = link_to_gfm truncate(commit.title, length: 20), namespace_project_commit_path(@project.namespace, @project, commit.id), class: "row_title" %td.lines.blame-numbers %pre - (since...(since + lines.count)).each do |i| diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml index f428ae41ef4..b5b29540bb6 100644 --- a/app/views/projects/blob/_actions.html.haml +++ b/app/views/projects/blob/_actions.html.haml @@ -1,19 +1,19 @@ .btn-group.tree-btn-group = edit_blob_link(@project, @ref, @path) - = link_to 'Raw', project_raw_path(@project, @id), + = link_to 'Raw', namespace_project_raw_path(@project.namespace, @project, @id), class: 'btn btn-small', target: '_blank' -# only show normal/blame view links for text files - if @blob.text? - - if current_page? project_blame_path(@project, @id) - = link_to 'Normal View', project_blob_path(@project, @id), + - if current_page? namespace_project_blame_path(@project.namespace, @project, @id) + = link_to 'Normal View', namespace_project_blob_path(@project.namespace, @project, @id), class: 'btn btn-small' - else - = link_to 'Blame', project_blame_path(@project, @id), + = link_to 'Blame', namespace_project_blame_path(@project.namespace, @project, @id), class: 'btn btn-small' unless @blob.empty? - = link_to 'History', project_commits_path(@project, @id), + = link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), class: 'btn btn-small' - if @ref != @commit.sha - = link_to 'Permalink', project_blob_path(@project, + = link_to 'Permalink', namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.sha, @path)), class: 'btn btn-small' - if allowed_tree_edit? diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index 68f3b08b8c8..64cc3fad6cf 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -1,17 +1,17 @@ %ul.breadcrumb.repo-breadcrumb %li %i.fa.fa-angle-right - = link_to project_tree_path(@project, @ref) do + = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do = @project.path - tree_breadcrumbs(@tree, 6) do |title, path| %li - if path - if path.end_with?(@path) - = link_to project_blob_path(@project, path) do + = link_to namespace_project_blob_path(@project.namespace, @project, path) do %strong = truncate(title, length: 40) - else - = link_to truncate(title, length: 40), project_tree_path(@project, path) + = link_to truncate(title, length: 40), namespace_project_tree_path(@project.namespace, @project, path) - else = link_to title, '#' diff --git a/app/views/projects/blob/_download.html.haml b/app/views/projects/blob/_download.html.haml index c24eeea4931..f2c5e95ecf4 100644 --- a/app/views/projects/blob/_download.html.haml +++ b/app/views/projects/blob/_download.html.haml @@ -1,6 +1,6 @@ .file-content.blob_file.blob-no-preview .center - = link_to project_raw_path(@project, @id) do + = link_to namespace_project_raw_path(@project.namespace, @project, @id) do %h1.light %i.fa.fa-download %h4 diff --git a/app/views/projects/blob/_remove.html.haml b/app/views/projects/blob/_remove.html.haml index c5568315cb1..09559a4967b 100644 --- a/app/views/projects/blob/_remove.html.haml +++ b/app/views/projects/blob/_remove.html.haml @@ -9,7 +9,7 @@ %strong= @ref .modal-body - = form_tag project_blob_path(@project, @id), method: :delete, class: 'form-horizontal' do + = form_tag namespace_project_blob_path(@project.namespace, @project, @id), method: :delete, class: 'form-horizontal' do = render 'shared/commit_message_container', params: params, placeholder: 'Removed this file because...' .form-group diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index b150b639888..6884ad1f2f3 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -6,11 +6,11 @@ Edit file %li - = link_to '#preview', 'data-preview-url' => project_preview_blob_path(@project, @id) do + = link_to '#preview', 'data-preview-url' => namespace_project_preview_blob_path(@project.namespace, @project, @id) do %i.fa.fa-eye = editing_preview_title(@blob.name) - = form_tag(project_update_blob_path(@project, @id), method: :put, class: "form-horizontal") do + = form_tag(namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put, class: "form-horizontal") do = render 'projects/blob/editor', ref: @ref, path: @path, blob_data: @blob.data = render 'shared/commit_message_container', params: params, placeholder: "Update #{@blob.name}" diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index df6aedbe17d..45865d552ae 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -1,12 +1,12 @@ %h3.page-title New file .file-editor - = form_tag(project_create_blob_path(@project, @id), method: :post, class: 'form-horizontal form-new-file') do + = form_tag(namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'form-horizontal form-new-file') do = render 'projects/blob/editor', ref: @ref = render 'shared/commit_message_container', params: params, placeholder: 'Add new file' = hidden_field_tag 'content', '', id: 'file-content' = render 'projects/commit_button', ref: @ref, - cancel_path: project_tree_path(@project, @id) + cancel_path: namespace_project_tree_path(@project.namespace, @project, @id) :javascript blob = new NewBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", null) diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index 8e58f3c247a..8de629b03e9 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -1,7 +1,7 @@ - commit = @repository.commit(branch.target) %li(class="js-branch-#{branch.name}") %h4 - = link_to project_tree_path(@project, branch.name) do + = link_to namespace_project_tree_path(@project.namespace, @project, branch.name) do %strong.str-truncated= branch.name - if branch.name == @repository.root_ref %span.label.label-info default @@ -13,12 +13,12 @@ - if can?(current_user, :download_code, @project) = render 'projects/repositories/download_archive', ref: branch.name, btn_class: 'btn-grouped btn-group-small' - if branch.name != @repository.root_ref - = link_to project_compare_index_path(@project, from: @repository.root_ref, to: branch.name), class: 'btn btn-grouped btn-small', method: :post, title: "Compare" do + = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: branch.name), class: 'btn btn-grouped btn-small', method: :post, title: "Compare" do %i.fa.fa-files-o Compare - if can_remove_branch?(@project, branch.name) - = link_to project_branch_path(@project, branch.name), class: 'btn btn-grouped btn-small btn-remove remove-row', method: :delete, data: { confirm: 'Removed branch cannot be restored. Are you sure?'}, remote: true do + = link_to namespace_project_branch_path(@project.namespace, @project, branch.name), class: 'btn btn-grouped btn-small btn-remove remove-row', method: :delete, data: { confirm: 'Removed branch cannot be restored. Are you sure?'}, remote: true do %i.fa.fa-trash-o - if commit diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml index d2aefd815a1..f77d02a97fb 100644 --- a/app/views/projects/branches/index.html.haml +++ b/app/views/projects/branches/index.html.haml @@ -3,7 +3,7 @@ Branches .pull-right - if can? current_user, :push_code, @project - = link_to new_project_branch_path(@project), class: 'btn btn-create' do + = link_to new_namespace_project_branch_path(@project.namespace, @project), class: 'btn btn-create' do %i.fa.fa-add-sign New branch   @@ -17,11 +17,11 @@ %b.caret %ul.dropdown-menu %li - = link_to project_branches_path(sort: nil) do + = link_to namespace_project_branches_path(sort: nil) do Name - = link_to project_branches_path(sort: 'recently_updated') do + = link_to namespace_project_branches_path(sort: 'recently_updated') do = sort_title_recently_updated - = link_to project_branches_path(sort: 'last_updated') do + = link_to namespace_project_branches_path(sort: 'last_updated') do = sort_title_oldest_updated %hr - unless @branches.empty? diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml index 2719bcc33bc..e5fcb98c68c 100644 --- a/app/views/projects/branches/new.html.haml +++ b/app/views/projects/branches/new.html.haml @@ -5,7 +5,7 @@ %h3.page-title %i.fa.fa-code-fork New branch -= form_tag project_branches_path, method: :post, id: "new-branch-form", class: "form-horizontal" do += form_tag namespace_project_branches_path, method: :post, id: "new-branch-form", class: "form-horizontal" do .form-group = label_tag :branch_name, 'Name for new branch', class: 'control-label' .col-sm-10 @@ -16,7 +16,7 @@ = text_field_tag :ref, params[:ref], placeholder: 'existing branch name, tag or commit SHA', required: true, tabindex: 2, class: 'form-control' .form-actions = button_tag 'Create branch', class: 'btn btn-create', tabindex: 3 - = link_to 'Cancel', project_branches_path(@project), class: 'btn btn-cancel' + = link_to 'Cancel', namespace_project_branches_path(@project.namespace, @project), class: 'btn btn-cancel' :javascript disableButtonIfAnyEmptyField($("#new-branch-form"), ".form-control", ".btn-create"); diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index dd28a35d41d..7409f702c5d 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -10,15 +10,15 @@ Download as %span.caret %ul.dropdown-menu - %li= link_to "Email Patches", project_commit_path(@project, @commit, format: :patch) - %li= link_to "Plain Diff", project_commit_path(@project, @commit, format: :diff) - = link_to project_tree_path(@project, @commit), class: "btn btn-primary btn-grouped" do + %li= link_to "Email Patches", namespace_project_commit_path(@project.namespace, @project, @commit, format: :patch) + %li= link_to "Plain Diff", namespace_project_commit_path(@project.namespace, @project, @commit, format: :diff) + = link_to namespace_project_tree_path(@project.namespace, @project, @commit), class: "btn btn-primary btn-grouped" do %span Browse Code » %div %p %span.light Commit - = link_to @commit.id, project_commit_path(@project, @commit) + = link_to @commit.id, namespace_project_commit_path(@project.namespace, @project, @commit) .commit-info-row %span.light Authored by %strong @@ -35,7 +35,7 @@ .commit-info-row %span.cgray= pluralize(@commit.parents.count, "parent") - @commit.parents.each do |parent| - = link_to parent.short_id, project_commit_path(@project, parent) + = link_to parent.short_id, namespace_project_commit_path(@project.namespace, @project, parent) .commit-info-row.branches %i.fa.fa-spinner.fa-spin @@ -49,4 +49,4 @@ :coffeescript $ -> - $(".commit-info-row.branches").load("#{branches_project_commit_path(@project, @commit.id)}") \ No newline at end of file + $(".commit-info-row.branches").load("#{branches_namespace_project_commit_path(@project.namespace, @project, @commit.id)}") diff --git a/app/views/projects/commit/branches.html.haml b/app/views/projects/commit/branches.html.haml index b01e806210c..82aac1fbd15 100644 --- a/app/views/projects/commit/branches.html.haml +++ b/app/views/projects/commit/branches.html.haml @@ -1,7 +1,7 @@ - if @branches.any? %span - branch = commit_default_branch(@project, @branches) - = link_to(project_tree_path(@project, branch)) do + = link_to(namespace_project_tree_path(@project.namespace, @project, branch)) do %span.label.label-gray %i.fa.fa-code-fork = branch @@ -13,4 +13,4 @@ - if @branches.any? = commit_branches_links(@project, @branches) - if @tags.any? - = commit_tags_links(@project, @tags) \ No newline at end of file + = commit_tags_links(@project, @tags) diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 1eb17f760dc..09c3f83fb3e 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -1,9 +1,9 @@ %li.commit.js-toggle-container .commit-row-title - = link_to commit.short_id, project_commit_path(project, commit), class: "commit_short_id" + = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id"   %span.str-truncated - = link_to_gfm commit.title, project_commit_path(project, commit.id), class: "commit-row-message" + = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" - if commit.description? %a.text-expander.js-toggle-button ... diff --git a/app/views/projects/commits/_head.html.haml b/app/views/projects/commits/_head.html.haml index 0c9d906481b..83e4d24cf5f 100644 --- a/app/views/projects/commits/_head.html.haml +++ b/app/views/projects/commits/_head.html.haml @@ -1,15 +1,15 @@ %ul.nav.nav-tabs = nav_link(controller: [:commit, :commits]) do - = link_to 'Commits', project_commits_path(@project, @repository.root_ref) + = link_to 'Commits', namespace_project_commits_path(@project.namespace, @project, @repository.root_ref) = nav_link(controller: :compare) do - = link_to 'Compare', project_compare_index_path(@project, from: @repository.root_ref, to: @ref || @repository.root_ref) + = link_to 'Compare', namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref) = nav_link(html_options: {class: branches_tab_class}) do - = link_to project_branches_path(@project) do + = link_to namespace_project_branches_path(@project.namespace, @project) do Branches %span.badge.js-totalbranch-count= @repository.branches.size = nav_link(controller: :tags) do - = link_to project_tags_path(@project) do + = link_to namespace_project_tags_path(@project.namespace, @project) do Tags %span.badge.js-totaltags-count= @repository.tags.length diff --git a/app/views/projects/commits/_inline_commit.html.haml b/app/views/projects/commits/_inline_commit.html.haml index 574599aa2d2..c03bc3f9df9 100644 --- a/app/views/projects/commits/_inline_commit.html.haml +++ b/app/views/projects/commits/_inline_commit.html.haml @@ -1,8 +1,8 @@ %li.commit.inline-commit .commit-row-title - = link_to commit.short_id, project_commit_path(project, commit), class: "commit_short_id" + = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id"   %span.str-truncated - = link_to_gfm commit.title, project_commit_path(project, commit.id), class: "commit-row-message" + = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" .pull-right #{time_ago_with_tooltip(commit.committed_date)} diff --git a/app/views/projects/commits/show.atom.builder b/app/views/projects/commits/show.atom.builder index 32c82edb248..9211de72b1b 100644 --- a/app/views/projects/commits/show.atom.builder +++ b/app/views/projects/commits/show.atom.builder @@ -1,15 +1,15 @@ xml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "Recent commits to #{@project.name}:#{@ref}" - xml.link :href => project_commits_url(@project, @ref, format: :atom), :rel => "self", :type => "application/atom+xml" - xml.link :href => project_commits_url(@project, @ref), :rel => "alternate", :type => "text/html" - xml.id project_commits_url(@project, @ref) + xml.link :href => namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom), :rel => "self", :type => "application/atom+xml" + xml.link :href => namespace_project_commits_url(@project.namespace, @project, @ref), :rel => "alternate", :type => "text/html" + xml.id namespace_project_commits_url(@project.namespace, @project, @ref) xml.updated @commits.first.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ") if @commits.any? @commits.each do |commit| xml.entry do - xml.id project_commit_url(@project, :id => commit.id) - xml.link :href => project_commit_url(@project, :id => commit.id) + xml.id namespace_project_commit_url(@project.namespace, @project, :id => commit.id) + xml.link :href => namespace_project_commit_url(@project.namespace, @project, :id => commit.id) xml.title truncate(commit.title, :length => 80) xml.updated commit.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ") xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(commit.author_email) diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index b80639763c8..7ea855e1a4e 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -5,7 +5,7 @@ - if current_user && current_user.private_token .commits-feed-holder.hidden-xs.hidden-sm - = link_to project_commits_path(@project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Feed", class: 'btn' do + = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Feed", class: 'btn' do %i.fa.fa-rss Commits feed diff --git a/app/views/projects/compare/_form.html.haml b/app/views/projects/compare/_form.html.haml index cb0a3747f7d..dfb1dded9ea 100644 --- a/app/views/projects/compare/_form.html.haml +++ b/app/views/projects/compare/_form.html.haml @@ -1,4 +1,4 @@ -= form_tag project_compare_index_path(@project), method: :post, class: 'form-inline' do += form_tag namespace_project_compare_index_path(@project.namespace, @project), method: :post, class: 'form-inline' do .clearfix.append-bottom-20 - if params[:to] && params[:from] = link_to 'switch', {from: params[:to], to: params[:from]}, {class: 'commits-compare-switch has_tooltip', title: 'Switch base of comparison'} diff --git a/app/views/projects/deploy_keys/_deploy_key.html.haml b/app/views/projects/deploy_keys/_deploy_key.html.haml index a0345dbd9c3..52da85cbdfa 100644 --- a/app/views/projects/deploy_keys/_deploy_key.html.haml +++ b/app/views/projects/deploy_keys/_deploy_key.html.haml @@ -1,19 +1,20 @@ %li .pull-right - if @available_keys.include?(deploy_key) - = link_to enable_project_deploy_key_path(@project, deploy_key), class: 'btn btn-small', method: :put do + = link_to enable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), class: 'btn btn-small', method: :put do %i.fa.fa-plus Enable - else - if deploy_key.projects.count > 1 - = link_to disable_project_deploy_key_path(@project, deploy_key), class: 'btn btn-small', method: :put do + = link_to disable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), class: 'btn btn-small', method: :put do %i.fa.fa-power-off Disable - else - = link_to 'Remove', project_deploy_key_path(@project, deploy_key), data: { confirm: 'You are going to remove deploy key. Are you sure?'}, method: :delete, class: "btn btn-remove delete-key btn-small pull-right" + = link_to 'Remove', namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), data: { confirm: 'You are going to remove deploy key. Are you sure?'}, method: :delete, class: "btn btn-remove delete-key btn-small pull-right" - = link_to project_deploy_key_path(deploy_key.projects.include?(@project) ? @project : deploy_key.projects.first, deploy_key) do + = key_project = deploy_key.projects.include?(@project) ? @project : deploy_key.projects.first + = link_to namespace_project_deploy_key_path(key_project.namespace, key_project, deploy_key) do %i.fa.fa-key %strong= deploy_key.title diff --git a/app/views/projects/deploy_keys/_form.html.haml b/app/views/projects/deploy_keys/_form.html.haml index 162ef05b367..91675b3738e 100644 --- a/app/views/projects/deploy_keys/_form.html.haml +++ b/app/views/projects/deploy_keys/_form.html.haml @@ -1,5 +1,5 @@ %div - = form_for [@project, @key], url: project_deploy_keys_path, html: { class: 'deploy-key-form form-horizontal' } do |f| + = form_for [@project.namespace.becomes(Namespace), @project, @key], url: namespace_project_deploy_keys_path, html: { class: 'deploy-key-form form-horizontal' } do |f| -if @key.errors.any? .alert.alert-danger %ul @@ -19,5 +19,5 @@ .form-actions = f.submit 'Create', class: "btn-create btn" - = link_to "Cancel", project_deploy_keys_path(@project), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_deploy_keys_path(@project.namespace, @project), class: "btn btn-cancel" diff --git a/app/views/projects/deploy_keys/index.html.haml b/app/views/projects/deploy_keys/index.html.haml index 6f475e0b395..c02a18146eb 100644 --- a/app/views/projects/deploy_keys/index.html.haml +++ b/app/views/projects/deploy_keys/index.html.haml @@ -1,7 +1,7 @@ %h3.page-title Deploy keys allow read-only access to the repository - = link_to new_project_deploy_key_path(@project), class: "btn btn-new pull-right", title: "New Deploy Key" do + = link_to new_namespace_project_deploy_key_path(@project.namespace, @project), class: "btn btn-new pull-right", title: "New Deploy Key" do %i.fa.fa-plus New Deploy Key @@ -20,7 +20,7 @@ = render @enabled_keys - if @enabled_keys.blank? .light-well - .nothing-here-block Create a #{link_to 'new deploy key', new_project_deploy_key_path(@project)} or add an existing one + .nothing-here-block Create a #{link_to 'new deploy key', new_namespace_project_deploy_key_path(@project.namespace, @project)} or add an existing one .col-md-6.available-keys %h5 %strong Deploy keys diff --git a/app/views/projects/deploy_keys/show.html.haml b/app/views/projects/deploy_keys/show.html.haml index c66e6bc69c3..405b5bcd0d3 100644 --- a/app/views/projects/deploy_keys/show.html.haml +++ b/app/views/projects/deploy_keys/show.html.haml @@ -5,9 +5,9 @@ created on = @key.created_at.stamp("Aug 21, 2011") .back-link - = link_to project_deploy_keys_path(@project) do + = link_to namespace_project_deploy_keys_path(@project.namespace, @project) do ← To keys list %hr %pre= @key.key .pull-right - = link_to 'Remove', project_deploy_key_path(@project, @key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn-remove btn delete-key" + = link_to 'Remove', namespace_project_deploy_key_path(@project.namespace, @project, @key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn-remove btn delete-key" diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml index 8d080f710d8..2569e91ccfa 100644 --- a/app/views/projects/diffs/_file.html.haml +++ b/app/views/projects/diffs/_file.html.haml @@ -1,6 +1,6 @@ - blob = project.repository.blob_for_diff(@commit, diff_file.diff) - return unless blob -- blob_diff_path = diff_project_blob_path(project, tree_join(@commit.id, diff_file.file_path)) +- blob_diff_path = namespace_project_blob_diff_path(project.namespace, project, tree_join(@commit.id, diff_file.file_path)) .diff-file{id: "diff-#{i}", data: {blob_diff_path: blob_diff_path }} .diff-header{id: "file-path-#{hexdigest(diff_file.new_path || diff_file.old_path)}"} - if diff_file.deleted_file diff --git a/app/views/projects/diffs/_image.html.haml b/app/views/projects/diffs/_image.html.haml index 900646dd0a4..058b71b21f5 100644 --- a/app/views/projects/diffs/_image.html.haml +++ b/app/views/projects/diffs/_image.html.haml @@ -10,7 +10,7 @@ %div.two-up.view %span.wrap .frame.deleted - %a{href: project_blob_path(@project, tree_join(@commit.parent_id, diff.old_path))} + %a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.parent_id, diff.old_path))} %img{src: "data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"} %p.image-info.hide %span.meta-filesize= "#{number_to_human_size old_file.size}" @@ -22,7 +22,7 @@ %span.meta-height %span.wrap .frame.added - %a{href: project_blob_path(@project, tree_join(@commit.id, diff.new_path))} + %a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path))} %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} %p.image-info.hide %span.meta-filesize= "#{number_to_human_size file.size}" diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml index 86ed6bbeaa2..de091038e30 100644 --- a/app/views/projects/diffs/_warning.html.haml +++ b/app/views/projects/diffs/_warning.html.haml @@ -7,11 +7,11 @@ - if current_controller?(:commit) or current_controller?(:merge_requests) - if current_controller?(:commit) - = link_to "Plain diff", project_commit_path(@project, @commit, format: :diff), class: "btn btn-warning btn-small" - = link_to "Email patch", project_commit_path(@project, @commit, format: :patch), class: "btn btn-warning btn-small" + = link_to "Plain diff", namespace_project_commit_path(@project.namespace, @project, @commit, format: :diff), class: "btn btn-warning btn-small" + = link_to "Email patch", namespace_project_commit_path(@project.namespace, @project, @commit, format: :patch), class: "btn btn-warning btn-small" - elsif @merge_request && @merge_request.persisted? - = link_to "Plain diff", project_merge_request_path(@project, @merge_request, format: :diff), class: "btn btn-warning btn-small" - = link_to "Email patch", project_merge_request_path(@project, @merge_request, format: :patch), class: "btn btn-warning btn-small" + = link_to "Plain diff", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :diff), class: "btn btn-warning btn-small" + = link_to "Email patch", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :patch), class: "btn btn-warning btn-small" %p To preserve performance only %strong #{allowed_diff_size} of #{diffs.size} diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 737cda411bc..8240c186616 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -6,7 +6,7 @@ Project settings %hr .panel-body - = form_for @project, remote: true, html: { multipart: true, class: "edit_project form-horizontal" }, authenticity_token: true do |f| + = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit_project form-horizontal" }, authenticity_token: true do |f| %fieldset .form-group.project_name_holder @@ -78,7 +78,7 @@ .col-sm-2 .col-sm-10 - if @project.avatar? - = project_icon(@project.to_param, alt: '', class: 'avatar project-avatar s160') + = project_icon("#{@project.namespace.to_param}/#{@project.to_param}", alt: '', class: 'avatar project-avatar s160') %p.light - if @project.avatar_in_git Project avatar in repository: #{ @project.avatar_in_git } @@ -96,7 +96,7 @@ .light The maximum file size allowed is 200KB. - if @project.avatar? %hr - = link_to 'Remove avatar', project_avatar_path(@project), data: { confirm: "Project avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" + = link_to 'Remove avatar', namespace_project_avatar_path(@project.namespace, @project), data: { confirm: "Project avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" .form-actions = f.submit 'Save changes', class: "btn btn-save" @@ -116,7 +116,7 @@ The project can be committed to. %br %strong Once active this project shows up in the search and on the dashboard. - = link_to 'Unarchive', unarchive_project_path(@project), + = link_to 'Unarchive', unarchive_namespace_project_path(@project.namespace, @project), data: { confirm: "Are you sure that you want to unarchive this project?\nWhen this project is unarchived it is active and can be committed to again." }, method: :post, class: "btn btn-success" - else @@ -130,7 +130,7 @@ It is hidden from the dashboard and doesn't show up in searches. %br %strong Archived projects cannot be committed to! - = link_to 'Archive', archive_project_path(@project), + = link_to 'Archive', archive_namespace_project_path(@project.namespace, @project), data: { confirm: "Are you sure that you want to archive this project?\nAn archived project cannot be committed to." }, method: :post, class: "btn btn-warning" - else @@ -140,7 +140,7 @@ .panel-heading Rename repository .errors-holder .panel-body - = form_for(@project, html: { class: 'form-horizontal' }) do |f| + = form_for([@project.namespace.becomes(Namespace), @project], html: { class: 'form-horizontal' }) do |f| .form-group.project_name_holder = f.label :name, class: 'control-label' do Project name @@ -168,13 +168,13 @@ .panel-heading Transfer project .errors-holder .panel-body - = form_for(@project, url: transfer_project_path(@project), method: :put, remote: true, html: { class: 'transfer-project form-horizontal' }) do |f| + = form_for([@project.namespace.becomes(Namespace), @project], url: transfer_namespace_project_path(@project.namespace, @project), method: :put, remote: true, html: { class: 'transfer-project form-horizontal' }) do |f| .form-group - = f.label :namespace_id, class: 'control-label' do + = label_tag :new_namespace_id, nil, class: 'control-label' do %span Namespace .col-sm-10 .form-group - = f.select :namespace_id, namespaces_options(@project.namespace_id), { prompt: 'Choose a project namespace' }, { class: 'select2' } + = select_tag :new_namespace_id, namespaces_options(@project.namespace_id), { prompt: 'Choose a project namespace', class: 'select2' } %ul %li Be careful. Changing the project's namespace can have unintended side effects. %li You can only transfer the project to namespaces you manage. @@ -188,7 +188,7 @@ .panel.panel-default.panel.panel-danger .panel-heading Remove project .panel-body - = form_tag(project_path(@project), method: :delete, html: { class: 'form-horizontal'}) do + = form_tag(namespace_project_path(@project.namespace, @project), method: :delete, html: { class: 'form-horizontal'}) do %p Removing the project will delete its repository and all related resources including issues, merge requests etc. %br diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index b925bcb7fac..49806ceaa96 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -9,7 +9,7 @@ The repository for this project is empty %h4 You can - = link_to project_new_blob_path(@project, 'master'), class: 'btn btn-new btn-lg' do + = link_to namespace_project_new_blob_path(@project.namespace, @project, 'master'), class: 'btn btn-new btn-lg' do add a file  or do a push via the command line. @@ -46,4 +46,4 @@ - if can? current_user, :remove_project, @project .prepend-top-20 - = link_to 'Remove project', @project, data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" + = link_to 'Remove project', [@project.namespace.becomes(Namespace), @project], data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml index 76d3aa5bf00..8eb4f795971 100644 --- a/app/views/projects/forks/error.html.haml +++ b/app/views/projects/forks/error.html.haml @@ -15,6 +15,6 @@ = @forked_project.errors.full_messages.first %p - = link_to new_project_fork_path(@project), title: "Fork", class: "btn" do + = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork", class: "btn" do %i.fa.fa-code-fork Try to Fork again diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index 959d5f08d47..5a6c46f3208 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -18,7 +18,7 @@ = namespace.path - else .thumbnail.fork-thumbnail - = link_to project_fork_path(@project, namespace_id: namespace.id), title: "Fork here", method: "POST", class: 'has_tooltip' do + = link_to namespace_project_fork_path(@project.namespace, @project, namespace_key: namespace.id), title: "Fork here", method: "POST", class: 'has_tooltip' do = image_tag namespace_icon(namespace, 200) .caption %h4=namespace.human_name diff --git a/app/views/projects/graphs/_head.html.haml b/app/views/projects/graphs/_head.html.haml index 9f37a760e61..9383df13305 100644 --- a/app/views/projects/graphs/_head.html.haml +++ b/app/views/projects/graphs/_head.html.haml @@ -1,5 +1,5 @@ %ul.nav.nav-tabs = nav_link(action: :show) do - = link_to 'Contributors', project_graph_path + = link_to 'Contributors', namespace_project_graph_path = nav_link(action: :commits) do - = link_to 'Commits', commits_project_graph_path + = link_to 'Commits', commits_namespace_project_graph_path diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml index 9a003c87f68..e70cf5c3884 100644 --- a/app/views/projects/hooks/index.html.haml +++ b/app/views/projects/hooks/index.html.haml @@ -7,7 +7,7 @@ %hr.clearfix -= form_for [@project, @hook], as: :hook, url: project_hooks_path(@project), html: { class: 'form-horizontal' } do |f| += form_for [@project.namespace.becomes(Namespace), @project, @hook], as: :hook, url: namespace_project_hooks_path(@project.namespace, @project), html: { class: 'form-horizontal' } do |f| -if @hook.errors.any? .alert.alert-danger - @hook.errors.full_messages.each do |msg| @@ -58,8 +58,8 @@ - @hooks.each do |hook| %li .pull-right - = link_to 'Test Hook', test_project_hook_path(@project, hook), class: "btn btn-small btn-grouped" - = link_to 'Remove', project_hook_path(@project, hook), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove btn-small btn-grouped" + = link_to 'Test Hook', test_namespace_project_hook_path(@project.namespace, @project, hook), class: "btn btn-small btn-grouped" + = link_to 'Remove', namespace_project_hook_path(@project.namespace, @project, hook), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove btn-small btn-grouped" .clearfix %span.monospace= hook.url %p diff --git a/app/views/projects/imports/new.html.haml b/app/views/projects/imports/new.html.haml index 6c3083e49f5..097374e1128 100644 --- a/app/views/projects/imports/new.html.haml +++ b/app/views/projects/imports/new.html.haml @@ -6,7 +6,7 @@ %hr -= form_for @project, url: project_import_path(@project), method: :post, html: { class: 'form-horizontal' } do |f| += form_for @project, url: namespace_project_import_path(@project.namespace, @project), method: :post, html: { class: 'form-horizontal' } do |f| .form-group.import-url-data = f.label :import_url, class: 'control-label' do %span Import existing git repo diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index e04e1985f1f..c7c8af2f2c0 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -1,9 +1,9 @@ - content_for :note_actions do - if can?(current_user, :modify_issue, @issue) - if @issue.closed? - = link_to 'Reopen Issue', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' + = link_to 'Reopen Issue', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' - else - = link_to 'Close Issue', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" + = link_to 'Close Issue', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" .row .col-md-9 .participants @@ -33,5 +33,5 @@ %h6 Labels .issue-show-labels - @issue.labels.each do |label| - = link_to project_issues_path(@project, label_name: label.name) do + = link_to namespace_project_issues_path(@project.namespace, @project, label_name: label.name) do %p= render_colored_label(label) diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 2a7b44955cd..679e84c3666 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -2,7 +2,7 @@ %h3.page-title= @issue.new_record? ? "New Issue" : "Edit Issue ##{@issue.iid}" %hr - = form_for [@project, @issue], html: { class: 'form-horizontal issue-form gfm-form' } do |f| + = form_for [@project.namespace.becomes(Namespace), @project, @issue], html: { class: 'form-horizontal issue-form gfm-form' } do |f| = render 'projects/issuable_form', f: f, issuable: @issue :javascript @@ -11,4 +11,4 @@ e.preventDefault(); }); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_image_path_upload = "#{upload_image_namespace_project_path @project.namespace, @project}"; diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index dc6510be858..a5f9a5653e3 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -1,11 +1,11 @@ -%li{ id: dom_id(issue), class: issue_css_classes(issue), url: project_issue_path(issue.project, issue) } +%li{ id: dom_id(issue), class: issue_css_classes(issue), url: namespace_project_issue_path(issue.project.namespace, issue.project, issue) } - if controller.controller_name == 'issues' .issue-check = check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue", disabled: !can?(current_user, :modify_issue, issue) .issue-title %span.str-truncated - = link_to_gfm issue.title, project_issue_path(issue.project, issue), class: "row_title" + = link_to_gfm issue.title, namespace_project_issue_path(issue.project.namespace, issue.project, issue), class: "row_title" - if issue.closed? %small.pull-right CLOSED @@ -33,16 +33,16 @@ .issue-labels - issue.labels.each do |label| - = link_to project_issues_path(issue.project, label_name: label.name) do + = link_to namespace_project_issues_path(issue.project.namespace, issue.project, label_name: label.name) do = render_colored_label(label) .issue-actions - if can? current_user, :modify_issue, issue - if issue.closed? - = link_to 'Reopen', project_issue_path(issue.project, issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-small btn-grouped reopen_issue btn-reopen", remote: true + = link_to 'Reopen', namespace_project_issue_path(issue.project.namespace, issue.project, issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-small btn-grouped reopen_issue btn-reopen", remote: true - else - = link_to 'Close', project_issue_path(issue.project, issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-small btn-grouped close_issue btn-close", remote: true - = link_to edit_project_issue_path(issue.project, issue), class: "btn btn-small edit-issue-link btn-grouped" do + = link_to 'Close', namespace_project_issue_path(issue.project.namespace, issue.project, issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-small btn-grouped close_issue btn-close", remote: true + = link_to edit_namespace_project_issue_path(issue.project.namespace, issue.project, issue), class: "btn btn-small edit-issue-link btn-grouped" do %i.fa.fa-pencil-square-o Edit diff --git a/app/views/projects/issues/_issue_context.html.haml b/app/views/projects/issues/_issue_context.html.haml index 3daa18ba346..9804658bebe 100644 --- a/app/views/projects/issues/_issue_context.html.haml +++ b/app/views/projects/issues/_issue_context.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f| += form_for [@project.namespace.becomes(Namespace), @project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f| %div.prepend-top-20 %p Assignee: @@ -13,7 +13,7 @@ %p Milestone: - if issue.milestone - #{link_to @issue.milestone.title, project_milestone_path(@project, @issue.milestone)} + #{link_to @issue.milestone.title, namespace_project_milestone_path(@project.namespace, @project, @issue.milestone)} - else none - if can?(current_user, :modify_issue, @issue) diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 816851a8abe..73ce78133d5 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -5,7 +5,7 @@ .clearfix .issues_bulk_update.hide - = form_tag bulk_update_project_issues_path(@project), method: :post do + = form_tag bulk_update_namespace_project_issues_path(@project.namespace, @project), method: :post do = select_tag('update[status]', options_for_select([['Open', 'open'], ['Closed', 'closed']]), prompt: "Status") = project_users_select_tag('update[assignee_id]', placeholder: 'Assignee') = select_tag('update[milestone_id]', bulk_update_milestone_options, prompt: "Milestone") diff --git a/app/views/projects/issues/index.atom.builder b/app/views/projects/issues/index.atom.builder index 61e651da932..126f2c07faa 100644 --- a/app/views/projects/issues/index.atom.builder +++ b/app/views/projects/issues/index.atom.builder @@ -1,9 +1,9 @@ xml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "#{@project.name} issues" - xml.link :href => project_issues_url(@project, :atom), :rel => "self", :type => "application/atom+xml" - xml.link :href => project_issues_url(@project), :rel => "alternate", :type => "text/html" - xml.id project_issues_url(@project) + xml.link :href => namespace_project_issues_url(@project.namespace, @project, :atom), :rel => "self", :type => "application/atom+xml" + xml.link :href => namespace_project_issues_url(@project.namespace, @project), :rel => "alternate", :type => "text/html" + xml.id namespace_project_issues_url(@project.namespace, @project) xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? @issues.each do |issue| diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 75411c6d86f..ca38a4e765d 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -10,16 +10,16 @@ .pull-right - if can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do + = link_to new_namespace_project_issue_path(@project.namespace, @project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do %i.fa.fa-plus New Issue - if can?(current_user, :modify_issue, @issue) - if @issue.closed? - = link_to 'Reopen', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" + = link_to 'Reopen', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" - else - = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" + = link_to 'Close', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" - = link_to edit_project_issue_path(@project, @issue), class: "btn btn-grouped issuable-edit" do + = link_to edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: "btn btn-grouped issuable-edit" do %i.fa.fa-pencil-square-o Edit diff --git a/app/views/projects/issues/update.js.haml b/app/views/projects/issues/update.js.haml index 7a5e0517556..82c0e653759 100644 --- a/app/views/projects/issues/update.js.haml +++ b/app/views/projects/issues/update.js.haml @@ -6,7 +6,7 @@ $('.context').html("#{escape_javascript(render partial: 'issue_context', locals: { issue: @issue })}"); $('.context').effect('highlight'); - if @issue.milestone - $('.milestone-nav-link').replaceWith("| Milestone #{escape_javascript(link_to @issue.milestone.title, project_milestone_path(@issue.project, @issue.milestone))}") + $('.milestone-nav-link').replaceWith("| Milestone #{escape_javascript(link_to @issue.milestone.title, namespace_project_milestone_path(@issue.project.namespace, @issue.project, @issue.milestone))}") - else $('.milestone-nav-link').html('') diff --git a/app/views/projects/labels/_form.html.haml b/app/views/projects/labels/_form.html.haml index c7380920b47..95912536e42 100644 --- a/app/views/projects/labels/_form.html.haml +++ b/app/views/projects/labels/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @label], html: { class: 'form-horizontal label-form' } do |f| += form_for [@project.namespace.becomes(Namespace), @project, @label], html: { class: 'form-horizontal label-form' } do |f| -if @label.errors.any? .row .col-sm-10.col-sm-offset-2 @@ -29,5 +29,5 @@ .form-actions = f.submit 'Save', class: 'btn btn-save js-save-button' - = link_to "Cancel", project_labels_path(@project), class: 'btn btn-cancel' + = link_to "Cancel", namespace_project_labels_path(@project.namespace, @project), class: 'btn btn-cancel' diff --git a/app/views/projects/labels/_label.html.haml b/app/views/projects/labels/_label.html.haml index 03a8f0921b7..82829452862 100644 --- a/app/views/projects/labels/_label.html.haml +++ b/app/views/projects/labels/_label.html.haml @@ -2,9 +2,9 @@ = render_colored_label(label) .pull-right %strong.append-right-20 - = link_to project_issues_path(@project, label_name: label.name) do + = link_to namespace_project_issues_path(@project.namespace, @project, label_name: label.name) do = pluralize label.open_issues_count, 'open issue' - if can? current_user, :admin_label, @project - = link_to 'Edit', edit_project_label_path(@project, label), class: 'btn' - = link_to 'Remove', project_label_path(@project, label), class: 'btn btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} + = link_to 'Edit', edit_namespace_project_label_path(@project.namespace, @project, label), class: 'btn' + = link_to 'Remove', namespace_project_label_path(@project.namespace, @project, label), class: 'btn btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} diff --git a/app/views/projects/labels/edit.html.haml b/app/views/projects/labels/edit.html.haml index 52435c5d892..e003d1dfe7f 100644 --- a/app/views/projects/labels/edit.html.haml +++ b/app/views/projects/labels/edit.html.haml @@ -2,7 +2,7 @@ Edit label %span.light #{@label.name} .back-link - = link_to project_labels_path(@project) do + = link_to namespace_project_labels_path(@project.namespace, @project) do ← To labels list %hr = render 'form' diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index c7c17c7797e..c53d75b1bb6 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -1,7 +1,7 @@ = render "projects/issues_nav" - if can? current_user, :admin_label, @project - = link_to new_project_label_path(@project), class: "pull-right btn btn-new" do + = link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do New label %h3.page-title Labels @@ -14,4 +14,4 @@ = paginate @labels, theme: 'gitlab' - else .light-well - .nothing-here-block Create first label or #{link_to 'generate', generate_project_labels_path(@project), method: :post} default set of labels + .nothing-here-block Create first label or #{link_to 'generate', generate_namespace_project_labels_path(@project.namespace, @project), method: :post} default set of labels diff --git a/app/views/projects/labels/new.html.haml b/app/views/projects/labels/new.html.haml index 850da0b192b..0683ed5d4fb 100644 --- a/app/views/projects/labels/new.html.haml +++ b/app/views/projects/labels/new.html.haml @@ -1,6 +1,6 @@ %h3 New label .back-link - = link_to project_labels_path(@project) do + = link_to namespace_project_labels_path(@project.namespace, @project) do ← To labels list %hr = render 'form' diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index f1f66569a9f..e3d3e69a9d3 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -1,9 +1,9 @@ - content_for :note_actions do - if can?(current_user, :modify_merge_request, @merge_request) - if @merge_request.open? - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" + = link_to 'Close', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" - if @merge_request.closed? - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" + = link_to 'Reopen', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" .row .col-md-9 @@ -27,5 +27,5 @@ %h6 Labels .merge-request-show-labels - @merge_request.labels.each do |label| - = link_to project_merge_requests_path(@project, label_name: label.name) do + = link_to namespace_project_merge_requests_path(@project.namespace, @project, label_name: label.name) do %p= render_colored_label(label) diff --git a/app/views/projects/merge_requests/_form.html.haml b/app/views/projects/merge_requests/_form.html.haml index d52e64666a0..893c7daf3cf 100644 --- a/app/views/projects/merge_requests/_form.html.haml +++ b/app/views/projects/merge_requests/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @merge_request], html: { class: 'merge-request-form form-horizontal gfm-form' } do |f| += form_for [@project.namespace.becomes(Namespace), @project, @merge_request], html: { class: 'merge-request-form form-horizontal gfm-form' } do |f| .merge-request-form-info = render 'projects/issuable_form', f: f, issuable: @merge_request @@ -9,4 +9,4 @@ e.preventDefault(); }); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_image_path_upload = "#{upload_image_namespace_project_path @project.namespace, @project}"; diff --git a/app/views/projects/merge_requests/_head.html.haml b/app/views/projects/merge_requests/_head.html.haml index 35a86e6511c..19e4dab874b 100644 --- a/app/views/projects/merge_requests/_head.html.haml +++ b/app/views/projects/merge_requests/_head.html.haml @@ -1,5 +1,5 @@ .top-tabs - = link_to project_merge_requests_path(@project), class: "tab #{'active' if current_page?(project_merge_requests_path(@project)) }" do + = link_to namespace_project_merge_requests_path(@project.namespace, @project), class: "tab #{'active' if current_page?(namespace_project_merge_requests_path(@project.namespace, @project)) }" do %span Merge Requests diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 5afc87fb6b1..3567401817b 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -1,6 +1,6 @@ %li{ class: mr_css_classes(merge_request) } .merge-request-title - = link_to_gfm truncate(merge_request.title, length: 80), project_merge_request_path(merge_request.target_project, merge_request), class: "row_title" + = link_to_gfm truncate(merge_request.title, length: 80), namespace_project_merge_request_path(merge_request.target_project.namespace, merge_request.target_project, merge_request), class: "row_title" - if merge_request.merged? %small.pull-right %i.fa.fa-check @@ -38,5 +38,5 @@ .merge-request-labels - merge_request.labels.each do |label| - = link_to project_merge_requests_path(merge_request.project, label_name: label.name) do + = link_to namespace_project_merge_requests_path(merge_request.project.namespace, merge_request.project, label_name: label.name) do = render_colored_label(label) diff --git a/app/views/projects/merge_requests/_new_compare.html.haml b/app/views/projects/merge_requests/_new_compare.html.haml index 99726172154..17e76059fdb 100644 --- a/app/views/projects/merge_requests/_new_compare.html.haml +++ b/app/views/projects/merge_requests/_new_compare.html.haml @@ -1,7 +1,7 @@ %h3.page-title Compare branches for new Merge Request %hr -= form_for [@project, @merge_request], url: new_project_merge_request_path(@project), method: :get, html: { class: "merge-request-form form-inline" } do |f| += form_for [@project.namespace.becomes(Namespace), @project, @merge_request], url: new_namespace_project_merge_request_path(@project.namespace, @project), method: :get, html: { class: "merge-request-form form-inline" } do |f| .hide.alert.alert-danger.mr-compare-errors .merge-request-branches.row .col-md-6 @@ -60,19 +60,19 @@ , target_branch = $("#merge_request_target_branch") , target_project = $("#merge_request_target_project_id"); - $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: source_branch.val() }); - $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: target_branch.val() }); + $.get("#{branch_from_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {ref: source_branch.val() }); + $.get("#{branch_to_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: target_project.val(),ref: target_branch.val() }); target_project.on("change", function() { - $.get("#{update_branches_project_merge_requests_path(@source_project)}", {target_project_id: $(this).val() }); + $.get("#{update_branches_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: $(this).val() }); }); source_branch.on("change", function() { - $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: $(this).val() }); + $.get("#{branch_from_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {ref: $(this).val() }); $(".mr-compare-errors").fadeOut(); $(".mr-compare-btn").enable(); }); target_branch.on("change", function() { - $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: $(this).val() }); + $.get("#{branch_to_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: target_project.val(),ref: $(this).val() }); $(".mr-compare-errors").fadeOut(); $(".mr-compare-btn").enable(); }); diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index ac374532ffd..2a3fce0df30 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -7,9 +7,9 @@ %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} %span.pull-right - = link_to 'Change branches', new_project_merge_request_path(@project) + = link_to 'Change branches', new_namespace_project_merge_request_path(@project.namespace, @project) -= form_for [@project, @merge_request], html: { class: "merge-request-form form-horizontal gfm-form" } do |f| += form_for [@project.namespace.becomes(Namespace), @project, @merge_request], html: { class: "merge-request-form form-horizontal gfm-form" } do |f| .merge-request-form-info .form-group = f.label :title, class: 'control-label' do @@ -54,7 +54,7 @@ %span.light No open milestones available.   - if can? current_user, :admin_milestone, @merge_request.target_project - = link_to 'Create new milestone', new_project_milestone_path(@merge_request.target_project), target: :blank + = link_to 'Create new milestone', new_namespace_project_milestone_path(@merge_request.target_project.namespace, @merge_request.target_project), target: :blank .form-group = f.label :label_ids, class: 'control-label' do %i.fa.fa-tag @@ -66,7 +66,7 @@ %span.light No labels yet.   - if can? current_user, :admin_label, @merge_request.target_project - = link_to 'Create new label', new_project_label_path(@merge_request.target_project), target: :blank + = link_to 'Create new label', new_namespace_project_label_path(@merge_request.target_project.namespace, @merge_request.target_project), target: :blank .form-actions - if contribution_guide_url(@target_project) @@ -113,7 +113,7 @@ e.preventDefault(); }); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_image_path_upload = "#{upload_image_namespace_project_path @project.namespace, @project}"; :javascript var merge_request diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 8e31a7e3fe4..45c3a419d97 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,4 +1,4 @@ -.merge-request{'data-url' => project_merge_request_path(@project, @merge_request)} +.merge-request{'data-url' => namespace_project_merge_request_path(@project.namespace, @project, @merge_request)} = render "projects/merge_requests/show/mr_title" %hr = render "projects/merge_requests/show/mr_box" @@ -9,7 +9,7 @@ - if @merge_request.for_fork? %strong.label-branch< - if @merge_request.source_project - = link_to @merge_request.source_project_namespace, project_path(@merge_request.source_project) + = link_to @merge_request.source_project_namespace, namespace_project_path(@merge_request.source_project.namespace, @merge_request.source_project) - else \ #{@merge_request.source_project_namespace} \:#{@merge_request.source_branch} @@ -27,8 +27,8 @@ Download as %span.caret %ul.dropdown-menu - %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) - %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) + %li= link_to "Email Patches", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :patch) + %li= link_to "Plain Diff", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :diff) = render "projects/merge_requests/show/how_to_merge" = render "projects/merge_requests/show/state_widget" @@ -36,17 +36,17 @@ - if @commits.present? %ul.nav.nav-tabs.merge-request-tabs %li.notes-tab{data: {action: 'notes'}} - = link_to project_merge_request_path(@project, @merge_request) do + = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request) do %i.fa.fa-comments Discussion %span.badge= @merge_request.mr_and_commit_notes.count %li.commits-tab{data: {action: 'commits'}} - = link_to project_merge_request_path(@project, @merge_request), title: 'Commits' do + = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request), title: 'Commits' do %i.fa.fa-history Commits %span.badge= @commits.size %li.diffs-tab{data: {action: 'diffs'}} - = link_to diffs_project_merge_request_path(@project, @merge_request) do + = link_to diffs_namespace_project_merge_request_path(@project.namespace, @project, @merge_request) do %i.fa.fa-list-alt Changes %span.badge= @merge_request.diffs.size @@ -67,9 +67,9 @@ var merge_request; merge_request = new MergeRequest({ - url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}", + url_to_automerge_check: "#{automerge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", check_enable: #{@merge_request.unchecked? ? "true" : "false"}, - url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}", + url_to_ci_check: "#{ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", ci_enable: #{@project.ci_service ? "true" : "false"}, current_status: "#{@merge_request.merge_status_name}", action: "#{controller.action_name}" diff --git a/app/views/projects/merge_requests/show/_context.html.haml b/app/views/projects/merge_requests/show/_context.html.haml index 21718ca2acf..ddf21f75063 100644 --- a/app/views/projects/merge_requests/show/_context.html.haml +++ b/app/views/projects/merge_requests/show/_context.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f| += form_for [@project.namespace.becomes(Namespace), @project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f| %div.prepend-top-20 %p Assignee: @@ -14,7 +14,7 @@ Milestone: - if @merge_request.milestone %span.back-to-milestone - #{link_to @merge_request.milestone.title, project_milestone_path(@project, @merge_request.milestone)} + #{link_to @merge_request.milestone.title, namespace_project_milestone_path(@project.namespace, @project, @merge_request.milestone)} - else none - if can?(current_user, :modify_merge_request, @merge_request) diff --git a/app/views/projects/merge_requests/show/_mr_accept.html.haml b/app/views/projects/merge_requests/show/_mr_accept.html.haml index f8ee6973637..12ab184973c 100644 --- a/app/views/projects/merge_requests/show/_mr_accept.html.haml +++ b/app/views/projects/merge_requests/show/_mr_accept.html.haml @@ -12,7 +12,7 @@ - if @show_merge_controls .automerge_widget.can_be_merged.hide .clearfix - = form_for [:automerge, @project, @merge_request], remote: true, method: :post do |f| + = form_for [:automerge, @project.namespace.becomes(Namespace), @project, @merge_request], remote: true, method: :post do |f| .accept-merge-holder.clearfix.js-toggle-container .accept-action = f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request" diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml index 0f20eba382c..4c230953cb3 100644 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ b/app/views/projects/merge_requests/show/_mr_title.html.haml @@ -14,9 +14,9 @@ .issue-btn-group.pull-right - if can?(current_user, :modify_merge_request, @merge_request) - if @merge_request.open? - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-grouped btn-close", title: "Close merge request" - = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn btn-grouped issuable-edit", id: "edit_merge_request" do + = link_to 'Close', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-grouped btn-close", title: "Close merge request" + = link_to edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), class: "btn btn-grouped issuable-edit", id: "edit_merge_request" do %i.fa.fa-pencil-square-o Edit - if @merge_request.closed? - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link", title: "Close merge request" + = link_to 'Reopen', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link", title: "Close merge request" diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index 0f51a347f01..46132eed0b9 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -1,11 +1,11 @@ %h3.page-title= @milestone.new_record? ? "New Milestone" : "Edit Milestone ##{@milestone.iid}" .back-link - = link_to project_milestones_path(@project) do + = link_to namespace_project_milestones_path(@project.namespace, @project) do ← To milestones %hr -= form_for [@project, @milestone], html: {class: 'form-horizontal milestone-form gfm-form'} do |f| += form_for [@project.namespace.becomes(Namespace), @project, @milestone], html: {class: 'form-horizontal milestone-form gfm-form'} do |f| -if @milestone.errors.any? .alert.alert-danger %ul @@ -38,10 +38,10 @@ .form-actions - if @milestone.new_record? = f.submit 'Create milestone', class: "btn-create btn" - = link_to "Cancel", project_milestones_path(@project), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_milestones_path(@project.namespace, @project), class: "btn btn-cancel" -else = f.submit 'Save changes', class: "btn-save btn" - = link_to "Cancel", project_milestone_path(@project, @milestone), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_milestone_path(@project.namespace, @project, @milestone), class: "btn btn-cancel" :javascript @@ -51,4 +51,4 @@ onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } }).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $('#milestone_due_date').val())); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_image_path_upload = "#{upload_image_namespace_project_path @project.namespace, @project}"; diff --git a/app/views/projects/milestones/_issue.html.haml b/app/views/projects/milestones/_issue.html.haml index b5ec0fc9882..36463371f4f 100644 --- a/app/views/projects/milestones/_issue.html.haml +++ b/app/views/projects/milestones/_issue.html.haml @@ -1,8 +1,8 @@ -%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => project_issue_path(@project, issue) } +%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => namespace_project_issue_path(@project.namespace, @project, issue) } %span.str-truncated - = link_to [@project, issue] do + = link_to [@project.namespace.becomes(Namespace), @project, issue] do %span.cgray ##{issue.iid} - = link_to_gfm issue.title, [@project, issue], title: issue.title + = link_to_gfm issue.title, [@project.namespace.becomes(Namespace), @project, issue], title: issue.title .pull-right.assignee-icon - if issue.assignee = image_tag avatar_icon(issue.assignee.email, 16), class: "avatar s16" diff --git a/app/views/projects/milestones/_merge_request.html.haml b/app/views/projects/milestones/_merge_request.html.haml index d54cb3f8e74..3180c1d91b9 100644 --- a/app/views/projects/milestones/_merge_request.html.haml +++ b/app/views/projects/milestones/_merge_request.html.haml @@ -1,5 +1,5 @@ -%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => project_merge_request_path(@project, merge_request) } +%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => namespace_project_merge_request_path(@project.namespace, @project, merge_request) } %span.str-truncated - = link_to [@project, merge_request] do + = link_to [@project.namespace.becomes(Namespace), @project, merge_request] do %span.cgray ##{merge_request.iid} - = link_to_gfm merge_request.title, [@project, merge_request], title: merge_request.title + = link_to_gfm merge_request.title, [@project.namespace.becomes(Namespace), @project, merge_request], title: merge_request.title diff --git a/app/views/projects/milestones/_milestone.html.haml b/app/views/projects/milestones/_milestone.html.haml index 1002b9513ff..d32b2ba271f 100644 --- a/app/views/projects/milestones/_milestone.html.haml +++ b/app/views/projects/milestones/_milestone.html.haml @@ -1,12 +1,12 @@ %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone) } .pull-right - if can?(current_user, :admin_milestone, milestone.project) and milestone.active? - = link_to edit_project_milestone_path(milestone.project, milestone), class: "btn btn-small edit-milestone-link btn-grouped" do + = link_to edit_namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), class: "btn btn-small edit-milestone-link btn-grouped" do %i.fa.fa-pencil-square-o Edit - = link_to 'Close Milestone', project_milestone_path(@project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-small btn-close" + = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-small btn-close" %h4 - = link_to_gfm truncate(milestone.title, length: 100), project_milestone_path(milestone.project, milestone) + = link_to_gfm truncate(milestone.title, length: 100), namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) - if milestone.expired? and not milestone.closed? %span.cred (Expired) %small @@ -16,10 +16,10 @@ - else %div %div - = link_to project_issues_path(milestone.project, milestone_id: milestone.id) do + = link_to namespace_project_issues_path(milestone.project.namespace, milestone.project, milestone_id: milestone.id) do = pluralize milestone.issues.count, 'Issue'   - = link_to project_merge_requests_path(milestone.project, milestone_id: milestone.id) do + = link_to namespace_project_merge_requests_path(milestone.project.namespace, milestone.project, milestone_id: milestone.id) do = pluralize milestone.merge_requests.count, 'Merge Request'   %span.light #{milestone.percent_complete}% complete diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 04a1b9243d5..084c6d010da 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -3,7 +3,7 @@ %h3.page-title Milestones - if can? current_user, :admin_milestone, @project - = link_to new_project_milestone_path(@project), class: "pull-right btn btn-new", title: "New Milestone" do + = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "pull-right btn btn-new", title: "New Milestone" do %i.fa.fa-plus New Milestone diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index 031b5a31895..3107766e993 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -12,13 +12,13 @@ = @milestone.expires_at .pull-right - if can?(current_user, :admin_milestone, @project) - = link_to edit_project_milestone_path(@project, @milestone), class: "btn btn-grouped" do + = link_to edit_namespace_project_milestone_path(@project.namespace, @project, @milestone), class: "btn btn-grouped" do %i.fa.fa-pencil-square-o Edit - if @milestone.active? - = link_to 'Close Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-grouped" + = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-grouped" - else - = link_to 'Reopen Milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-grouped" + = link_to 'Reopen Milestone', namespace_project_milestone_path(@project.namespace, @project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-grouped" %hr - if @milestone.issues.any? && @milestone.can_be_closed? @@ -63,10 +63,10 @@ %span.badge= @users.count .pull-right - = link_to new_project_issue_path(@project, issue: { milestone_id: @milestone.id }), class: "btn btn-grouped", title: "New Issue" do + = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { milestone_id: @milestone.id }), class: "btn btn-grouped", title: "New Issue" do %i.fa.fa-plus New Issue - = link_to 'Browse Issues', project_issues_path(@milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link btn-grouped" + = link_to 'Browse Issues', namespace_project_issues_path(@milestone.project.namespace, @milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link btn-grouped" .tab-content .tab-pane.active#tab-issues diff --git a/app/views/projects/network/show.html.haml b/app/views/projects/network/show.html.haml index 4a21b84fb85..c36bad1e94b 100644 --- a/app/views/projects/network/show.html.haml +++ b/app/views/projects/network/show.html.haml @@ -1,7 +1,7 @@ = render "head" .project-network .controls - = form_tag project_network_path(@project, @id), method: :get, class: 'form-inline network-form' do |f| + = form_tag namespace_project_network_path(@project.namespace, @project, @id), method: :get, class: 'form-inline network-form' do |f| = text_field_tag :extended_sha1, @options[:extended_sha1], placeholder: "Input an extended SHA1 syntax", class: 'search-input form-control input-mx-250 search-sha' = button_tag class: 'btn btn-success btn-search-sha' do %i.fa.fa-search @@ -18,8 +18,8 @@ disableButtonIfEmptyField('#extended_sha1', '.btn-search-sha') network_graph = new Network({ - url: '#{project_network_path(@project, @ref, @options.merge(format: :json))}', - commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}', + url: '#{namespace_project_network_path(@project.namespace, @project, @ref, @options.merge(format: :json))}', + commit_url: '#{namespace_project_commit_path(@project.namespace, @project, 'ae45ca32').gsub("ae45ca32", "%s")}', ref: '#{@ref}', commit_id: '#{@commit.id}' }) diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml index dd576243510..e8fd90efd1f 100644 --- a/app/views/projects/no_repo.html.haml +++ b/app/views/projects/no_repo.html.haml @@ -9,14 +9,14 @@ %hr .no-repo-actions - = link_to project_repository_path(@project), method: :post, class: 'btn btn-primary' do + = link_to namespace_project_repository_path(@project.namespace, @project), method: :post, class: 'btn btn-primary' do Create empty bare repository %strong.prepend-left-10.append-right-10 or - = link_to new_project_import_path(@project), class: 'btn' do + = link_to new_namespace_project_import_path(@project.namespace, @project), class: 'btn' do Import repository - if can? current_user, :remove_project, @project .prepend-top-20 - = link_to 'Remove project', @project, data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" + = link_to 'Remove project', namespace_project_path(@project.namespace, @project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml index 59e2b3f1b0b..9fda7aafd51 100644 --- a/app/views/projects/notes/_edit_form.html.haml +++ b/app/views/projects/notes/_edit_form.html.haml @@ -1,5 +1,5 @@ .note-edit-form - = form_for note, url: project_note_path(@project, note), method: :put, remote: true, authenticity_token: true do |f| + = form_for note, url: namespace_project_note_path(@project.namespace, @project, note), method: :put, remote: true, authenticity_token: true do |f| = render layout: 'projects/md_preview' do = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text' diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 3879a0f10da..28c11aa5548 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @note], remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new_note js-new-note-form common-note-form gfm-form" }, authenticity_token: true do |f| += form_for [@project.namespace.becomes(Namespace), @project, @note], remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new_note js-new-note-form common-note-form gfm-form" }, authenticity_token: true do |f| = note_target_fields = f.hidden_field :commit_id = f.hidden_field :line_code @@ -29,4 +29,4 @@ = f.file_field :attachment, class: "js-note-attachment-input hidden" :javascript - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_image_path_upload = "#{upload_image_namespace_project_path @project.namespace, @project}"; diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 88c7b7ccf1a..0be3ded6df3 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -17,7 +17,7 @@ %i.fa.fa-pencil-square-o Edit   - = link_to project_note_path(@project, note), title: "Remove comment", method: :delete, data: { confirm: 'Are you sure you want to remove this comment?' }, remote: true, class: "danger js-note-delete" do + = link_to namespace_project_note_path(@project.namespace, @project, note), title: "Remove comment", method: :delete, data: { confirm: 'Are you sure you want to remove this comment?' }, remote: true, class: "danger js-note-delete" do %i.fa.fa-trash-o.cred Remove - if note.system @@ -63,7 +63,7 @@ = link_to note.attachment.secure_url, target: "_blank" do %i.fa.fa-paperclip = note.attachment_identifier - = link_to delete_attachment_project_note_path(@project, note), + = link_to delete_attachment_namespace_project_note_path(@project.namespace, @project, note), title: "Delete this attachment", method: :delete, remote: true, data: { confirm: 'Are you sure you want to remove the attachment?' }, class: "danger js-note-attachment-delete" do %i.fa.fa-trash-o.cred .clear diff --git a/app/views/projects/notes/_notes_with_form.html.haml b/app/views/projects/notes/_notes_with_form.html.haml index 04ee17a40a0..813e37276bd 100644 --- a/app/views/projects/notes/_notes_with_form.html.haml +++ b/app/views/projects/notes/_notes_with_form.html.haml @@ -7,4 +7,4 @@ = render "projects/notes/form" :javascript - new Notes("#{project_notes_path(target_id: @noteable.id, target_type: @noteable.class.name.underscore)}", #{@notes.map(&:id).to_json}, #{Time.now.to_i}) + new Notes("#{namespace_project_notes_path(namespace_id: @project.namespace, target_id: @noteable.id, target_type: @noteable.class.name.underscore)}", #{@notes.map(&:id).to_json}, #{Time.now.to_i}) diff --git a/app/views/projects/notes/discussions/_active.html.haml b/app/views/projects/notes/discussions/_active.html.haml index 52c06ec172d..7c6f7243173 100644 --- a/app/views/projects/notes/discussions/_active.html.haml +++ b/app/views/projects/notes/discussions/_active.html.haml @@ -8,7 +8,7 @@ %div = link_to_member(@project, note.author, avatar: false) started a discussion - = link_to diffs_project_merge_request_path(note.project, note.noteable, anchor: note.line_code) do + = link_to diffs_namespace_project_merge_request_path(note.project.namespace, note.project, note.noteable, anchor: note.line_code) do %strong on the diff .last-update.hide.js-toggle-content - last_note = discussion_notes.last diff --git a/app/views/projects/notes/discussions/_commit.html.haml b/app/views/projects/notes/discussions/_commit.html.haml index 94f16a5f02e..62609cfc1c8 100644 --- a/app/views/projects/notes/discussions/_commit.html.haml +++ b/app/views/projects/notes/discussions/_commit.html.haml @@ -8,7 +8,7 @@ %div = link_to_member(@project, note.author, avatar: false) started a discussion on commit - = link_to(note.noteable.short_id, project_commit_path(note.project, note.noteable), class: 'monospace') + = link_to(note.noteable.short_id, namespace_project_commit_path(note.project.namespace, note.project, note.noteable), class: 'monospace') .last-update.hide.js-toggle-content - last_note = discussion_notes.last last updated by diff --git a/app/views/projects/protected_branches/_branches_list.html.haml b/app/views/projects/protected_branches/_branches_list.html.haml index e422799f55c..5406b80dc16 100644 --- a/app/views/projects/protected_branches/_branches_list.html.haml +++ b/app/views/projects/protected_branches/_branches_list.html.haml @@ -11,10 +11,10 @@ %tbody - @branches.each do |branch| - - @url = project_protected_branch_path(@project, branch) + - @url = namespace_project_protected_branch_path(@project.namespace, @project, branch) %tr %td - = link_to project_commits_path(@project, branch.name) do + = link_to namespace_project_commits_path(@project.namespace, @project, branch.name) do %strong= branch.name - if @project.root_ref?(branch.name) %span.label.label-info default @@ -22,7 +22,7 @@ = check_box_tag "developers_can_push", branch.id, branch.developers_can_push, "data-url" => @url %td - if commit = branch.commit - = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do + = link_to namespace_project_commit_path(@project.namespace, @project, commit.id), class: 'commit_short_id' do = commit.short_id · #{time_ago_with_tooltip(commit.committed_date)} @@ -31,4 +31,4 @@ %td .pull-right - if can? current_user, :admin_project, @project - = link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small" + = link_to 'Unprotect', [@project.namespace.becomes(Namespace), @project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small" diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml index 2164c874c74..dc20e96732e 100644 --- a/app/views/projects/protected_branches/index.html.haml +++ b/app/views/projects/protected_branches/index.html.haml @@ -11,7 +11,7 @@ %p Read more about #{link_to "project permissions", help_page_path("permissions", "permissions"), class: "underlined-link"} - if can? current_user, :admin_project, @project - = form_for [@project, @protected_branch], html: { class: 'form-horizontal' } do |f| + = form_for [@project.namespace.becomes(Namespace), @project, @protected_branch], html: { class: 'form-horizontal' } do |f| -if @protected_branch.errors.any? .alert.alert-danger %ul diff --git a/app/views/projects/refs/logs_tree.js.haml b/app/views/projects/refs/logs_tree.js.haml index 948a21aa816..49ce6c0888e 100644 --- a/app/views/projects/refs/logs_tree.js.haml +++ b/app/views/projects/refs/logs_tree.js.haml @@ -11,9 +11,9 @@ - if @logs.present? :plain var current_url = location.href.replace(/\/?$/, '/'); - var log_url = '#{project_tree_url(@project, tree_join(@ref, @path || '/'))}'.replace(/\/?$/, '/'); + var log_url = '#{namespace_project_tree_url(@project.namespace, @project, tree_join(@ref, @path || '/'))}'.replace(/\/?$/, '/'); if(current_url == log_url) { // Load 10 more commit log for each file in tree // if we still on the same page - ajaxGet('#{logs_file_project_ref_path(@project, @ref, @path || '/', offset: (@offset + @limit))}'); + ajaxGet('#{logs_file_namespace_project_ref_path(@project.namespace, @project, @ref, @path || '/', offset: (@offset + @limit))}'); } diff --git a/app/views/projects/repositories/_download_archive.html.haml b/app/views/projects/repositories/_download_archive.html.haml index ce69adeb48c..26669fb00a9 100644 --- a/app/views/projects/repositories/_download_archive.html.haml +++ b/app/views/projects/repositories/_download_archive.html.haml @@ -3,7 +3,7 @@ - split_button = split_button || false - if split_button == true %span.btn-group{class: btn_class} - = link_to archive_project_repository_path(@project, ref: ref, format: 'zip'), class: 'btn', rel: 'nofollow' do + = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), class: 'btn', rel: 'nofollow' do %i.fa.fa-download %span Download zip %a.btn.dropdown-toggle{ 'data-toggle' => 'dropdown' } @@ -12,26 +12,26 @@ Select Archive Format %ul.dropdown-menu{ role: 'menu' } %li - = link_to archive_project_repository_path(@project, ref: ref, format: 'zip'), rel: 'nofollow' do + = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), rel: 'nofollow' do %i.fa.fa-download %span Download zip %li - = link_to archive_project_repository_path(@project, ref: ref, format: 'tar.gz'), rel: 'nofollow' do + = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.gz'), rel: 'nofollow' do %i.fa.fa-download %span Download tar.gz %li - = link_to archive_project_repository_path(@project, ref: ref, format: 'tar.bz2'), rel: 'nofollow' do + = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.bz2'), rel: 'nofollow' do %i.fa.fa-download %span Download tar.bz2 %li - = link_to archive_project_repository_path(@project, ref: ref, format: 'tar'), rel: 'nofollow' do + = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar'), rel: 'nofollow' do %i.fa.fa-download %span Download tar - else %span.btn-group{class: btn_class} - = link_to archive_project_repository_path(@project, ref: ref, format: 'zip'), class: 'btn', rel: 'nofollow' do + = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), class: 'btn', rel: 'nofollow' do %i.fa.fa-download %span zip - = link_to archive_project_repository_path(@project, ref: ref, format: 'tar.gz'), class: 'btn', rel: 'nofollow' do + = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.gz'), class: 'btn', rel: 'nofollow' do %i.fa.fa-download %span tar.gz diff --git a/app/views/projects/repositories/_feed.html.haml b/app/views/projects/repositories/_feed.html.haml index c77ffff43fe..f3526ad0747 100644 --- a/app/views/projects/repositories/_feed.html.haml +++ b/app/views/projects/repositories/_feed.html.haml @@ -1,7 +1,7 @@ - commit = update %tr %td - = link_to project_commits_path(@project, commit.head.name) do + = link_to namespace_project_commits_path(@project.namespace, @project, commit.head.name) do %strong = commit.head.name - if @project.root_ref?(commit.head.name) @@ -9,7 +9,7 @@ %td %div - = link_to project_commits_path(@project, commit.id) do + = link_to namespace_project_commits_path(@project.namespace, @project, commit.id) do %code= commit.short_id = image_tag avatar_icon(commit.author_email), class: "", width: 16, alt: '' = gfm escape_once(truncate(commit.title, length: 40)) diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index ba270880881..8db6d67e06b 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -5,12 +5,12 @@ %p= @service.description .back-link - = link_to project_services_path(@project) do + = link_to namespace_project_services_path(@project.namespace, @project) do ← to services %hr -= form_for(@service, as: :service, url: project_service_path(@project, @service.to_param), method: :put, html: { class: 'form-horizontal' }) do |f| += form_for(@service, as: :service, url: namespace_project_service_path(@project.namespace, @project, @service.to_param), method: :put, html: { class: 'form-horizontal' }) do |f| - if @service.errors.any? .alert.alert-danger %ul @@ -53,4 +53,4 @@ = f.submit 'Save', class: 'btn btn-save'   - if @service.valid? && @service.activated? && @service.can_test? - = link_to 'Test settings', test_project_service_path(@project, @service.to_param), class: 'btn' + = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service.to_param), class: 'btn' diff --git a/app/views/projects/services/index.html.haml b/app/views/projects/services/index.html.haml index 4604c0afd8d..d615d128653 100644 --- a/app/views/projects/services/index.html.haml +++ b/app/views/projects/services/index.html.haml @@ -13,7 +13,7 @@ %td = boolean_to_icon service.activated? %td - = link_to edit_project_service_path(@project, service.to_param) do + = link_to edit_namespace_project_service_path(@project.namespace, @project, service.to_param) do %strong= service.title %td = service.description diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 435b2648404..abebbc7049d 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -15,9 +15,9 @@ Readme .project-home-links - unless @project.empty_repo? - = link_to pluralize(number_with_delimiter(@repository.commit_count), 'commit'), project_commits_path(@project, @ref || @repository.root_ref) - = link_to pluralize(number_with_delimiter(@repository.branch_names.count), 'branch'), project_branches_path(@project) - = link_to pluralize(number_with_delimiter(@repository.tag_names.count), 'tag'), project_tags_path(@project) + = link_to pluralize(number_with_delimiter(@repository.commit_count), 'commit'), namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) + = link_to pluralize(number_with_delimiter(@repository.branch_names.count), 'branch'), namespace_project_branches_path(@project.namespace, @project) + = link_to pluralize(number_with_delimiter(@repository.tag_names.count), 'tag'), namespace_project_tags_path(@project.namespace, @project) %span.light.prepend-left-20= repository_size .tab-content @@ -42,15 +42,15 @@ %i.fa.fa-code-fork.project-fork-icon Forked from: %br - = link_to @project.forked_from_project.name_with_namespace, project_path(@project.forked_from_project) + = link_to @project.forked_from_project.name_with_namespace, namespace_project_path(@project.namespace, @project.forked_from_project) - unless @project.empty_repo? - = link_to project_compare_index_path(@project, from: @repository.root_ref, to: @ref || @repository.root_ref), class: 'btn btn-block' do + = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref), class: 'btn btn-block' do Compare code - if @repository.version - version = @repository.version - = link_to project_blob_path(@project, tree_join(@repository.root_ref, version.name)), class: 'btn btn-block' do + = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, version.name)), class: 'btn btn-block' do Version: %span.count = @repository.blob_by_oid(version.id).data @@ -78,7 +78,7 @@ - if readme .tab-pane#tab-readme %article.readme-holder#README - = link_to project_blob_path(@project, tree_join(@repository.root_ref, readme.name)) do + = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)) do %h4.readme-file-title %i.fa.fa-file = readme.name diff --git a/app/views/projects/snippets/edit.html.haml b/app/views/projects/snippets/edit.html.haml index f6a5bf9e4ff..2d4d5d030ab 100644 --- a/app/views/projects/snippets/edit.html.haml +++ b/app/views/projects/snippets/edit.html.haml @@ -1,4 +1,4 @@ %h3.page-title Edit snippet %hr -= render "shared/snippets/form", url: project_snippet_path(@project, @snippet) += render "shared/snippets/form", url: namespace_project_snippet_path(@project.namespace, @project, @snippet) diff --git a/app/views/projects/snippets/index.html.haml b/app/views/projects/snippets/index.html.haml index e60f9a44322..e2d8ec673a1 100644 --- a/app/views/projects/snippets/index.html.haml +++ b/app/views/projects/snippets/index.html.haml @@ -1,7 +1,7 @@ %h3.page-title Snippets - if can? current_user, :write_project_snippet, @project - = link_to new_project_snippet_path(@project), class: "btn btn-new pull-right", title: "New Snippet" do + = link_to new_namespace_project_snippet_path(@project.namespace, @project), class: "btn btn-new pull-right", title: "New Snippet" do Add new snippet %p.light diff --git a/app/views/projects/snippets/new.html.haml b/app/views/projects/snippets/new.html.haml index 10f684b6316..bb659dba0cf 100644 --- a/app/views/projects/snippets/new.html.haml +++ b/app/views/projects/snippets/new.html.haml @@ -1,4 +1,4 @@ %h3.page-title New snippet %hr -= render "shared/snippets/form", url: project_snippets_path(@project, @snippet) += render "shared/snippets/form", url: namespace_project_snippets_path(@project.namespace, @project, @snippet) diff --git a/app/views/projects/snippets/show.html.haml b/app/views/projects/snippets/show.html.haml index ada0d30c496..345848fa6d1 100644 --- a/app/views/projects/snippets/show.html.haml +++ b/app/views/projects/snippets/show.html.haml @@ -2,7 +2,7 @@ = @snippet.title .pull-right - = link_to new_project_snippet_path(@project), class: "btn btn-new", title: "New Snippet" do + = link_to new_namespace_project_snippet_path(@project.namespace, @project), class: "btn btn-new", title: "New Snippet" do Add new snippet %hr @@ -17,7 +17,7 @@ = @snippet.author_name .back-link - = link_to project_snippets_path(@project) do + = link_to namespace_project_snippets_path(@project.namespace, @project) do ← project snippets .file-holder @@ -28,10 +28,10 @@ .options .btn-group - if can?(current_user, :modify_project_snippet, @snippet) - = link_to "edit", edit_project_snippet_path(@project, @snippet), class: "btn btn-small", title: 'Edit Snippet' - = link_to "raw", raw_project_snippet_path(@project, @snippet), class: "btn btn-small", target: "_blank" + = link_to "edit", edit_namespace_project_snippet_path(@project.namespace, @project, @snippet), class: "btn btn-small", title: 'Edit Snippet' + = link_to "raw", raw_namespace_project_snippet_path(@project.namespace, @project, @snippet), class: "btn btn-small", target: "_blank" - if can?(current_user, :admin_project_snippet, @snippet) - = link_to "remove", project_snippet_path(@project, @snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-small btn-remove", title: 'Delete Snippet' + = link_to "remove", namespace_project_snippet_path(@project.namespace, @project, @snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-small btn-remove", title: 'Delete Snippet' = render 'shared/snippets/blob' %div#notes= render "projects/notes/notes_with_form" diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index 4ab102ba96c..8da07222cba 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -1,7 +1,7 @@ - commit = @repository.commit(tag.target) %li %h4 - = link_to project_commits_path(@project, tag.name), class: "" do + = link_to namespace_project_commits_path(@project.namespace, @project, tag.name), class: "" do %i.fa.fa-tag = tag.name - if tag.message.present? @@ -11,7 +11,7 @@ - if can? current_user, :download_code, @project = render 'projects/repositories/download_archive', ref: tag.name, btn_class: 'btn-grouped btn-group-small' - if can?(current_user, :admin_project, @project) - = link_to project_tag_path(@project, tag.name), class: 'btn btn-small btn-remove remove-row grouped', method: :delete, data: { confirm: 'Removed tag cannot be restored. Are you sure?'}, remote: true do + = link_to namespace_project_tag_path(@project.namespace, @project, tag.name), class: 'btn btn-small btn-remove remove-row grouped', method: :delete, data: { confirm: 'Removed tag cannot be restored. Are you sure?'}, remote: true do %i.fa.fa-trash-o - if commit diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml index ac74e3b6d36..f1bc2bc9a2b 100644 --- a/app/views/projects/tags/index.html.haml +++ b/app/views/projects/tags/index.html.haml @@ -4,7 +4,7 @@ Git Tags - if can? current_user, :push_code, @project .pull-right - = link_to new_project_tag_path(@project), class: 'btn btn-create new-tag-btn' do + = link_to new_namespace_project_tag_path(@project.namespace, @project), class: 'btn btn-create new-tag-btn' do %i.fa.fa-add-sign New tag diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index 289c52a2e3f..655044438d5 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -5,7 +5,7 @@ %h3.page-title %i.fa.fa-code-fork New tag -= form_tag project_tags_path, method: :post, id: "new-tag-form", class: "form-horizontal" do += form_tag namespace_project_tags_path, method: :post, id: "new-tag-form", class: "form-horizontal" do .form-group = label_tag :tag_name, 'Name for new tag', class: 'control-label' .col-sm-10 @@ -22,7 +22,7 @@ .light (Optional) Entering a message will create an annotated tag. .form-actions = button_tag 'Create tag', class: 'btn btn-create', tabindex: 3 - = link_to 'Cancel', project_tags_path(@project), class: 'btn btn-cancel' + = link_to 'Cancel', namespace_project_tags_path(@project.namespace, @project), class: 'btn btn-cancel' :javascript disableButtonIfAnyEmptyField($("#new-tag-form"), ".form-control", ".btn-create"); diff --git a/app/views/projects/team_members/_form.html.haml b/app/views/projects/team_members/_form.html.haml index ddf8cb76f78..166b6362a07 100644 --- a/app/views/projects/team_members/_form.html.haml +++ b/app/views/projects/team_members/_form.html.haml @@ -1,7 +1,7 @@ %h3.page-title New project member(s) -= form_for @user_project_relation, as: :project_member, url: project_team_members_path(@project), html: { class: "form-horizontal users-project-form" } do |f| += form_for @user_project_relation, as: :project_member, url: namespace_project_team_members_path(@project.namespace, @project), html: { class: "form-horizontal users-project-form" } do |f| -if @user_project_relation.errors.any? .alert.alert-danger %ul @@ -26,4 +26,4 @@ .form-actions = f.submit 'Add users', class: "btn btn-create" - = link_to "Cancel", project_team_index_path(@project), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_team_index_path(@project.namespace, @project), class: "btn btn-cancel" diff --git a/app/views/projects/team_members/_team_member.html.haml b/app/views/projects/team_members/_team_member.html.haml index 7a9c0939ba0..61c50af31bf 100644 --- a/app/views/projects/team_members/_team_member.html.haml +++ b/app/views/projects/team_members/_team_member.html.haml @@ -4,10 +4,10 @@ - if current_user_can_admin_project - unless @project.personal? && user == current_user .pull-left - = form_for(member, as: :project_member, url: project_team_member_path(@project, member.user)) do |f| + = form_for(member, as: :project_member, url: namespace_project_team_member_path(@project.namespace, @project, member.user)) do |f| = f.select :access_level, options_for_select(ProjectMember.access_roles, member.access_level), {}, class: "trigger-submit"   - = link_to project_team_member_path(@project, user), data: { confirm: remove_from_project_team_message(@project, user)}, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from team' do + = link_to namespace_project_team_member_path(@project.namespace, @project, user), data: { confirm: remove_from_project_team_message(@project, user)}, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from team' do %i.fa.fa-minus.fa-inverse = image_tag avatar_icon(user.email, 32), class: "avatar s32" %p diff --git a/app/views/projects/team_members/import.html.haml b/app/views/projects/team_members/import.html.haml index d1f46c61b2e..9e31d47117e 100644 --- a/app/views/projects/team_members/import.html.haml +++ b/app/views/projects/team_members/import.html.haml @@ -3,12 +3,12 @@ %p.light Only project members will be imported. Group members will be skipped. %hr -= form_tag apply_import_project_team_members_path(@project), method: 'post', class: 'form-horizontal' do += form_tag apply_import_namespace_project_team_members_path(@project.namespace, @project), method: 'post', class: 'form-horizontal' do .form-group = label_tag :source_project_id, "Project", class: 'control-label' .col-sm-10= select_tag(:source_project_id, options_from_collection_for_select(current_user.authorized_projects, :id, :name_with_namespace), prompt: "Select project", class: "select2 lg", required: true) .form-actions = button_tag 'Import project members', class: "btn btn-create" - = link_to "Cancel", project_team_index_path(@project), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_team_index_path(@project.namespace, @project), class: "btn btn-cancel" diff --git a/app/views/projects/team_members/index.html.haml b/app/views/projects/team_members/index.html.haml index ecb7c689e8a..fcc879a58df 100644 --- a/app/views/projects/team_members/index.html.haml +++ b/app/views/projects/team_members/index.html.haml @@ -3,9 +3,9 @@ - if can? current_user, :admin_team_member, @project %span.pull-right - = link_to new_project_team_member_path(@project), class: "btn btn-new btn-grouped", title: "New project member" do + = link_to new_namespace_project_team_member_path(@project.namespace, @project), class: "btn btn-new btn-grouped", title: "New project member" do New project member - = link_to import_project_team_members_path(@project), class: "btn btn-grouped", title: "Import members from another project" do + = link_to import_namespace_project_team_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do Import members %p.light diff --git a/app/views/projects/transfer.js.haml b/app/views/projects/transfer.js.haml index 6d083c5c516..17b9fecfeb1 100644 --- a/app/views/projects/transfer.js.haml +++ b/app/views/projects/transfer.js.haml @@ -1,2 +1,2 @@ :plain - location.href = "#{edit_project_path(@project)}"; + location.href = "#{edit_namespace_project_path(@project.namespace, @project)}"; diff --git a/app/views/projects/tree/_blob_item.html.haml b/app/views/projects/tree/_blob_item.html.haml index 393ef0e24bd..b253fe896e3 100644 --- a/app/views/projects/tree/_blob_item.html.haml +++ b/app/views/projects/tree/_blob_item.html.haml @@ -2,7 +2,7 @@ %td.tree-item-file-name = tree_icon(type) %span.str-truncated - = link_to blob_item.name, project_blob_path(@project, tree_join(@id || @commit.id, blob_item.name)) + = link_to blob_item.name, namespace_project_blob_path(@project.namespace, @project, tree_join(@id || @commit.id, blob_item.name)) %td.tree_time_ago.cgray = render 'spinner' %td.hidden-xs.tree_commit diff --git a/app/views/projects/tree/_tree.html.haml b/app/views/projects/tree/_tree.html.haml index f902440b3f1..d304690d162 100644 --- a/app/views/projects/tree/_tree.html.haml +++ b/app/views/projects/tree/_tree.html.haml @@ -1,16 +1,16 @@ %ul.breadcrumb.repo-breadcrumb %li - = link_to project_tree_path(@project, @ref) do + = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do = @project.path - tree_breadcrumbs(tree, 6) do |title, path| %li - if path - = link_to truncate(title, length: 40), project_tree_path(@project, path) + = link_to truncate(title, length: 40), namespace_project_tree_path(@project.namespace, @project, path) - else = link_to title, '#' - if current_user && can_push_branch?(@project, @ref) %li - = link_to project_new_blob_path(@project, @id), title: 'New file', id: 'new-file-link' do + = link_to namespace_project_new_blob_path(@project.namespace, @project, @id), title: 'New file', id: 'new-file-link' do %small %i.fa.fa-plus @@ -27,15 +27,15 @@ %i.fa.fa-angle-right   %small.light - = link_to @commit.short_id, project_commit_path(@project, @commit) + = link_to @commit.short_id, namespace_project_commit_path(@project.namespace, @project, @commit) – = truncate(@commit.title, length: 50) - = link_to 'History', project_commits_path(@project, @id), class: 'pull-right' + = link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), class: 'pull-right' - if @path.present? %tr.tree-item %td.tree-item-file-name - = link_to "..", project_tree_path(@project, up_dir_path), class: 'prepend-left-10' + = link_to "..", namespace_project_tree_path(@project.namespace, @project, up_dir_path), class: 'prepend-left-10' %td %td.hidden-xs diff --git a/app/views/projects/tree/_tree_commit_column.html.haml b/app/views/projects/tree/_tree_commit_column.html.haml index bd50dd4d9a2..50521264a61 100644 --- a/app/views/projects/tree/_tree_commit_column.html.haml +++ b/app/views/projects/tree/_tree_commit_column.html.haml @@ -1,3 +1,3 @@ %span.str-truncated %span.tree_author= commit_author_link(commit, avatar: true, size: 16) - = link_to_gfm commit.title, project_commit_path(@project, commit.id), class: "tree-commit-link" + = link_to_gfm commit.title, namespace_project_commit_path(@project.namespace, @project, commit.id), class: "tree-commit-link" diff --git a/app/views/projects/tree/_tree_item.html.haml b/app/views/projects/tree/_tree_item.html.haml index 5adbf93ff8f..94342bc9b2b 100644 --- a/app/views/projects/tree/_tree_item.html.haml +++ b/app/views/projects/tree/_tree_item.html.haml @@ -3,7 +3,7 @@ = tree_icon(type) %span.str-truncated - path = flatten_tree(tree_item) - = link_to path, project_tree_path(@project, tree_join(@id || @commit.id, path)) + = link_to path, namespace_project_tree_path(@project.namespace, @project, tree_join(@id || @commit.id, path)) %td.tree_time_ago.cgray = render 'spinner' %td.hidden-xs.tree_commit diff --git a/app/views/projects/update.js.haml b/app/views/projects/update.js.haml index cbb21f2b9fb..4f3f4cab8d5 100644 --- a/app/views/projects/update.js.haml +++ b/app/views/projects/update.js.haml @@ -1,6 +1,6 @@ - if @project.valid? :plain - location.href = "#{edit_project_path(@project)}"; + location.href = "#{edit_namespace_project_path(@project.namespace, @project)}"; - else :plain $(".project-edit-errors").html("#{escape_javascript(render('errors'))}"); diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml index 111484c8316..1e1400058e1 100644 --- a/app/views/projects/wikis/_form.html.haml +++ b/app/views/projects/wikis/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal wiki-form gfm-form' } do |f| += form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal wiki-form gfm-form' } do |f| -if @page.errors.any? #error_explanation .alert.alert-danger @@ -37,11 +37,11 @@ .form-actions - if @page && @page.persisted? = f.submit 'Save changes', class: "btn-save btn" - = link_to "Cancel", project_wiki_path(@project, @page), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-cancel" - else = f.submit 'Create page', class: "btn-create btn" - = link_to "Cancel", project_wiki_path(@project, :home), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_wiki_path(@project.namespace, @project, :home), class: "btn btn-cancel" :javascript - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_image_path_upload = "#{upload_image_namespace_project_path @project.namespace, @project}"; diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml index 30410bc95e0..633214a4e86 100644 --- a/app/views/projects/wikis/_main_links.html.haml +++ b/app/views/projects/wikis/_main_links.html.haml @@ -1,8 +1,8 @@ %span.pull-right - if (@page && @page.persisted?) - = link_to history_project_wiki_path(@project, @page), class: "btn btn-grouped" do + = link_to history_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do Page History - if can?(current_user, :write_wiki, @project) - = link_to edit_project_wiki_path(@project, @page), class: "btn btn-grouped" do + = link_to edit_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do %i.fa.fa-pencil-square-o Edit diff --git a/app/views/projects/wikis/_nav.html.haml b/app/views/projects/wikis/_nav.html.haml index 90539fde583..693c3facb32 100644 --- a/app/views/projects/wikis/_nav.html.haml +++ b/app/views/projects/wikis/_nav.html.haml @@ -1,12 +1,12 @@ %ul.nav.nav-tabs = nav_link(html_options: {class: params[:id] == 'home' ? 'active' : '' }) do - = link_to 'Home', project_wiki_path(@project, :home) + = link_to 'Home', namespace_project_wiki_path(@project.namespace, @project, :home) = nav_link(path: 'wikis#pages') do - = link_to 'Pages', pages_project_wikis_path(@project) + = link_to 'Pages', pages_namespace_project_wikis_path(@project.namespace, @project) = nav_link(path: 'wikis#git_access') do - = link_to git_access_project_wikis_path(@project) do + = link_to git_access_namespace_project_wikis_path(@project.namespace, @project) do %i.fa.fa-download Git Access diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml index 1ce292a02df..6834969de8b 100644 --- a/app/views/projects/wikis/_new.html.haml +++ b/app/views/projects/wikis/_new.html.haml @@ -7,7 +7,7 @@ .modal-body = label_tag :new_wiki_path do %span Page slug - = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => project_wikis_path(@project) + = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project) %p.hint Please don't use spaces. .modal-footer diff --git a/app/views/projects/wikis/edit.html.haml b/app/views/projects/wikis/edit.html.haml index 5347caf000a..5567f1af22a 100644 --- a/app/views/projects/wikis/edit.html.haml +++ b/app/views/projects/wikis/edit.html.haml @@ -9,5 +9,5 @@ .pull-right - if @page.persisted? && can?(current_user, :admin_wiki, @project) - = link_to project_wiki_path(@project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-small btn-remove" do + = link_to namespace_project_wiki_path(@project.namespace, @project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-small btn-remove" do Delete this page diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index 9c9a9933dcf..91291f753f7 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -1,7 +1,7 @@ = render 'nav' %h3.page-title %span.light History for - = link_to @page.title, project_wiki_path(@project, @page) + = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) %table.table %thead diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index 264b48ec36c..ee233d9086f 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -5,7 +5,7 @@ - @wiki_pages.each do |wiki_page| %li %h4 - = link_to wiki_page.title, project_wiki_path(@project, wiki_page) + = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) %small (#{wiki_page.format}) .pull-right %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index ede4fef9e24..a6263e93f67 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -5,7 +5,7 @@ - if @page.historical? .warning_message This is an old version of this page. - You can view the #{link_to "most recent version", project_wiki_path(@project, @page)} or browse the #{link_to "history", history_project_wiki_path(@project, @page)}. + You can view the #{link_to "most recent version", namespace_project_wiki_path(@project.namespace, @project, @page)} or browse the #{link_to "history", history_namespace_project_wiki_path(@project.namespace, @project, @page)}. %hr diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml index 58bcff9dbe3..796dd752a4c 100644 --- a/app/views/search/_results.html.haml +++ b/app/views/search/_results.html.haml @@ -2,7 +2,7 @@ #{@search_results.total_count} results found - unless @show_snippets - if @project - for #{link_to @project.name_with_namespace, @project} + for #{link_to @project.name_with_namespace, [@project.namespace.becomes(Namespace), @project]} - elsif @group for #{link_to @group.name, @group} diff --git a/app/views/search/results/_blob.html.haml b/app/views/search/results/_blob.html.haml index dae641dab4f..84e9be82c44 100644 --- a/app/views/search/results/_blob.html.haml +++ b/app/views/search/results/_blob.html.haml @@ -1,7 +1,7 @@ .blob-result .file-holder .file-title - = link_to project_blob_path(@project, tree_join(blob.ref, blob.filename), :anchor => "L" + blob.startline.to_s) do + = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(blob.ref, blob.filename), :anchor => "L" + blob.startline.to_s) do %i.fa.fa-file %strong = blob.filename diff --git a/app/views/search/results/_issue.html.haml b/app/views/search/results/_issue.html.haml index 7868f958261..ce8ddff9556 100644 --- a/app/views/search/results/_issue.html.haml +++ b/app/views/search/results/_issue.html.haml @@ -1,6 +1,6 @@ .search-result-row %h4 - = link_to [issue.project, issue] do + = link_to [issue.project.namespace.becomes(Namespace), issue.project, issue] do %span.term.str-truncated= issue.title .pull-right ##{issue.iid} - if issue.description.present? diff --git a/app/views/search/results/_merge_request.html.haml b/app/views/search/results/_merge_request.html.haml index 56b185283bd..2efa616d664 100644 --- a/app/views/search/results/_merge_request.html.haml +++ b/app/views/search/results/_merge_request.html.haml @@ -1,6 +1,6 @@ .search-result-row %h4 - = link_to [merge_request.target_project, merge_request] do + = link_to [merge_request.target_project.namespace.becomes(Namespace), merge_request.target_project, merge_request] do %span.term.str-truncated= merge_request.title .pull-right ##{merge_request.iid} - if merge_request.description.present? diff --git a/app/views/search/results/_note.html.haml b/app/views/search/results/_note.html.haml index a44a4542df5..5fcba2b7e93 100644 --- a/app/views/search/results/_note.html.haml +++ b/app/views/search/results/_note.html.haml @@ -9,7 +9,7 @@ = link_to project do = project.name_with_namespace · - = link_to project_commit_path(project, note.commit_id, anchor: dom_id(note)) do + = link_to namespace_project_commit_path(project.namespace, project, note.commit_id, anchor: dom_id(note)) do Commit #{truncate_sha(note.commit_id)} - else = link_to project do @@ -17,7 +17,7 @@ · %span #{note.noteable_type.titleize} ##{note.noteable.iid} · - = link_to [project, note.noteable, anchor: dom_id(note)] do + = link_to [project.namespace.becomes(Namespace), project, note.noteable, anchor: dom_id(note)] do = note.noteable.title .note-search-result diff --git a/app/views/search/results/_project.html.haml b/app/views/search/results/_project.html.haml index 301b65eca29..195cf06c8ea 100644 --- a/app/views/search/results/_project.html.haml +++ b/app/views/search/results/_project.html.haml @@ -1,6 +1,6 @@ .search-result-row %h4 - = link_to project do + = link_to [project.namespace.becomes(Namespace), project] do %span.term= project.name_with_namespace - if project.description.present? %span.light.term= project.description diff --git a/app/views/search/results/_wiki_blob.html.haml b/app/views/search/results/_wiki_blob.html.haml index c7bc596eb14..f9c5810e3d0 100644 --- a/app/views/search/results/_wiki_blob.html.haml +++ b/app/views/search/results/_wiki_blob.html.haml @@ -1,7 +1,7 @@ .blob-result .file-holder .file-title - = link_to project_wiki_path(@project, wiki_blob.filename) do + = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_blob.filename) do %i.fa.fa-file %strong = wiki_blob.filename diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml index cd97481bb6c..0e094d8844b 100644 --- a/app/views/shared/_issuable_filter.html.haml +++ b/app/views/shared/_issuable_filter.html.haml @@ -104,7 +104,7 @@ = render_colored_label(label) - else %li - = link_to generate_project_labels_path(@project, redirect: request.original_url), method: :post do + = link_to generate_namespace_project_labels_path(@project.namespace, @project, redirect: request.original_url), method: :post do %i.fa.fa-plus-circle Create default labels diff --git a/app/views/shared/_issues.html.haml b/app/views/shared/_issues.html.haml index e976f897dc9..0dbb6a04393 100644 --- a/app/views/shared/_issues.html.haml +++ b/app/views/shared/_issues.html.haml @@ -4,7 +4,7 @@ - project = group[0] .panel-heading = link_to_project project - = link_to 'show all', project_issues_path(project), class: 'pull-right' + = link_to 'show all', namespace_project_issues_path(project.namespace, project), class: 'pull-right' %ul.well-list.issues-list - group[1].each do |issue| diff --git a/app/views/shared/_merge_requests.html.haml b/app/views/shared/_merge_requests.html.haml index 39a1ee38f8e..c02c5af008a 100644 --- a/app/views/shared/_merge_requests.html.haml +++ b/app/views/shared/_merge_requests.html.haml @@ -4,7 +4,7 @@ - project = group[0] .panel-heading = link_to_project project - = link_to 'show all', project_merge_requests_path(project), class: 'pull-right' + = link_to 'show all', namespace_project_merge_requests_path(project.namespace, project), class: 'pull-right' %ul.well-list.mr-list - group[1].each do |merge_request| = render 'projects/merge_requests/merge_request', merge_request: merge_request diff --git a/app/views/shared/_ref_switcher.html.haml b/app/views/shared/_ref_switcher.html.haml index 4d9534f49b1..eb2e1919e19 100644 --- a/app/views/shared/_ref_switcher.html.haml +++ b/app/views/shared/_ref_switcher.html.haml @@ -1,4 +1,4 @@ -= form_tag switch_project_refs_path(@project), method: :get, class: "project-refs-form" do += form_tag switch_namespace_project_refs_path(@project.namespace, @project), method: :get, class: "project-refs-form" do = select_tag "ref", grouped_options_refs, class: "project-refs-select select2 select2-sm" = hidden_field_tag :destination, destination - if defined?(path) diff --git a/app/views/shared/snippets/_form.html.haml b/app/views/shared/snippets/_form.html.haml index f729f129e45..4e0663ea208 100644 --- a/app/views/shared/snippets/_form.html.haml +++ b/app/views/shared/snippets/_form.html.haml @@ -30,7 +30,7 @@ = f.submit 'Save', class: "btn-save btn" - if @snippet.respond_to?(:project) - = link_to "Cancel", project_snippets_path(@project), class: "btn btn-cancel" + = link_to "Cancel", namespace_project_snippets_path(@project.namespace, @project), class: "btn btn-cancel" - else = link_to "Cancel", snippets_path(@project), class: "btn btn-cancel" -- cgit v1.2.1 From ee804e2d94018f633c6e400b443ef514b5d7a10f Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Sat, 14 Feb 2015 12:13:31 -0800 Subject: Better English in the performance diff message. --- app/views/projects/diffs/_warning.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml index 86ed6bbeaa2..cdcd3d21167 100644 --- a/app/views/projects/diffs/_warning.html.haml +++ b/app/views/projects/diffs/_warning.html.haml @@ -15,5 +15,5 @@ %p To preserve performance only %strong #{allowed_diff_size} of #{diffs.size} - files displayed. + files are displayed. -- cgit v1.2.1 From 49d509935284c2f07c8f5cb53a31d5787c6ef7ab Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Sat, 14 Feb 2015 13:26:08 -0700 Subject: Avoid duplicate application rows Iterate over authorized applications instead of tokens to avoid multiple rows for the same authorized app. --- app/controllers/profiles_controller.rb | 3 +++ app/views/profiles/applications.html.haml | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb index f7584c03411..e3e36505f0b 100644 --- a/app/controllers/profiles_controller.rb +++ b/app/controllers/profiles_controller.rb @@ -16,6 +16,9 @@ class ProfilesController < ApplicationController def applications @applications = current_user.oauth_applications @authorized_tokens = current_user.oauth_authorized_tokens + @authorized_apps = @authorized_tokens.map do |token| + token.application + end.uniq end def update diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml index cb24e4a3dde..4b5817e10bf 100644 --- a/app/views/profiles/applications.html.haml +++ b/app/views/profiles/applications.html.haml @@ -36,12 +36,12 @@ %th Scope %th %tbody - - @authorized_tokens.each do |token| - - application = token.application - %tr{:id => "application_#{application.id}"} - %td= application.name + - @authorized_apps.each do |app| + - token = app.authorized_tokens.order('created_at desc').first + %tr{:id => "application_#{app.id}"} + %td= app.name %td= token.created_at %td= token.scopes - %td= render 'doorkeeper/authorized_applications/delete_form', application: application + %td= render 'doorkeeper/authorized_applications/delete_form', application: app - else %p.light You dont have any authorized applications -- cgit v1.2.1 From 1da7781cb313d4df2514a1bfc6ad125e9539371c Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Sat, 14 Feb 2015 20:11:45 -0700 Subject: Add items to "quick help" Modify the quick help list to add links to the pricing and feature comparison pages of about.gitlab.com. --- app/views/help/index.html.haml | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'app') diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml index 7b8193abfdf..64494e3e6b5 100644 --- a/app/views/help/index.html.haml +++ b/app/views/help/index.html.haml @@ -42,3 +42,9 @@ %li Use = link_to 'shortcuts', '#', onclick: 'Shortcuts.showHelp(event)' + %li + Get a + = link_to 'support subscription', 'https://about.gitlab.com/pricing/' + %li + = link_to 'Compare', 'https://about.gitlab.com/features/#compare' + GitLab editions -- cgit v1.2.1 From 9e0467c38efb1a279b87cf17df5fb1b9b85aa0fe Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Sun, 15 Feb 2015 15:43:18 -0700 Subject: Fix application client count Display the number of unique users with an access token instead of the total number of access tokens per application in the admin area. --- app/views/admin/applications/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml index f2fed51eaf8..0632888dc82 100644 --- a/app/views/admin/applications/index.html.haml +++ b/app/views/admin/applications/index.html.haml @@ -17,6 +17,6 @@ %tr{:id => "application_#{application.id}"} %td= link_to application.name, admin_application_path(application) %td= application.redirect_uri - %td= application.access_tokens.count + %td= application.access_tokens.map { |t| t.resource_owner_id }.uniq.count %td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link' %td= render 'delete_form', application: application -- cgit v1.2.1 From e0f61a59b4e9be1fc2f20320a0400793318b8a9f Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Sun, 15 Feb 2015 20:50:53 -0700 Subject: Use shorter map() syntax --- app/controllers/profiles_controller.rb | 4 +--- app/views/admin/applications/index.html.haml | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb index e3e36505f0b..a7863aba756 100644 --- a/app/controllers/profiles_controller.rb +++ b/app/controllers/profiles_controller.rb @@ -16,9 +16,7 @@ class ProfilesController < ApplicationController def applications @applications = current_user.oauth_applications @authorized_tokens = current_user.oauth_authorized_tokens - @authorized_apps = @authorized_tokens.map do |token| - token.application - end.uniq + @authorized_apps = @authorized_tokens.map(&:application).uniq end def update diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml index 0632888dc82..d550278710e 100644 --- a/app/views/admin/applications/index.html.haml +++ b/app/views/admin/applications/index.html.haml @@ -17,6 +17,6 @@ %tr{:id => "application_#{application.id}"} %td= link_to application.name, admin_application_path(application) %td= application.redirect_uri - %td= application.access_tokens.map { |t| t.resource_owner_id }.uniq.count + %td= application.access_tokens.map(&:resource_owner_id).uniq.count %td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link' %td= render 'delete_form', application: application -- cgit v1.2.1 From 87b413592499ddcf1149d9e2b580f76a13bf625c Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Sun, 15 Feb 2015 21:51:23 -0800 Subject: Subscription should be a link on its own. --- app/views/help/index.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml index 64494e3e6b5..af39dfeac5b 100644 --- a/app/views/help/index.html.haml +++ b/app/views/help/index.html.haml @@ -43,8 +43,8 @@ Use = link_to 'shortcuts', '#', onclick: 'Shortcuts.showHelp(event)' %li - Get a - = link_to 'support subscription', 'https://about.gitlab.com/pricing/' + Get a support + = link_to 'subscription', 'https://about.gitlab.com/pricing/' %li = link_to 'Compare', 'https://about.gitlab.com/features/#compare' GitLab editions -- cgit v1.2.1 From 29a997cde978d45b3d6bd75df8f9226288e3abcb Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 16 Feb 2015 18:25:57 +0100 Subject: Properly clear notes bindings to prevent double comments on Ctrl-Enter. --- app/assets/javascripts/notes.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 47c5ecdedf1..c9c27a39f8d 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -77,7 +77,7 @@ class @Notes $(document).off "click", ".js-discussion-reply-button" $(document).off "click", ".js-add-diff-note-button" $(document).off "visibilitychange" - $(document).off "keypress", @notes_forms + $(document).off "keydown", @notes_forms $(document).off "keyup", ".js-note-text" $(document).off "click", ".js-note-target-reopen" $(document).off "click", ".js-note-target-close" -- cgit v1.2.1 From b0a9dbdfb132412837f4ca10cee1406560cb2b08 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 16 Feb 2015 10:14:07 -0800 Subject: Remove top margin for issue/mr title --- app/assets/stylesheets/generic/typography.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss index 58243bc5ba2..c547ebb3aaf 100644 --- a/app/assets/stylesheets/generic/typography.scss +++ b/app/assets/stylesheets/generic/typography.scss @@ -17,6 +17,10 @@ h3.page-title { font-size: 22px; } +h4.page-title { + margin-top: 0px; +} + h6 { color: #888; text-transform: uppercase; @@ -131,4 +135,4 @@ textarea.js-gfm-input { .strikethrough { text-decoration: line-through; -} \ No newline at end of file +} -- cgit v1.2.1 From 7d5f86f6cbd187e75a6ba164ad6bfd036977dd07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= Date: Mon, 9 Feb 2015 14:35:48 +0100 Subject: Fix broken access control and refactor avatar upload This commit moves the note folder from /public/uploads/note to /uploads/note and changes the uploader accordingly. Now it's no longer possible to avoid the access control by modifing the url. The Avatar upload has been refactored to use an own uploader as well to cleanly seperate the two upload types. --- app/controllers/files_controller.rb | 4 +++- app/models/group.rb | 2 +- app/models/project.rb | 2 +- app/models/user.rb | 2 +- app/uploaders/attachment_uploader.rb | 8 +------- app/uploaders/avatar_uploader.rb | 32 ++++++++++++++++++++++++++++++++ 6 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 app/uploaders/avatar_uploader.rb (limited to 'app') diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 9671245d3f4..561af8084c3 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -6,7 +6,9 @@ class FilesController < ApplicationController if uploader.file_storage? if can?(current_user, :read_project, note.project) disposition = uploader.image? ? 'inline' : 'attachment' - send_file uploader.file.path, disposition: disposition + # Replace old notes location in /public with the new one in / and send the file + path = uploader.file.path.gsub("#{Rails.root}/public",Rails.root.to_s) + send_file path, disposition: disposition else not_found! end diff --git a/app/models/group.rb b/app/models/group.rb index d6ec0be6081..da9621a2a1a 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -23,7 +23,7 @@ class Group < Namespace validate :avatar_type, if: ->(user) { user.avatar_changed? } validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - mount_uploader :avatar, AttachmentUploader + mount_uploader :avatar, AvatarUploader after_create :post_create_hook after_destroy :post_destroy_hook diff --git a/app/models/project.rb b/app/models/project.rb index 56e1aa29040..e2c7f76eb09 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -138,7 +138,7 @@ class Project < ActiveRecord::Base if: ->(project) { project.avatar && project.avatar_changed? } validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - mount_uploader :avatar, AttachmentUploader + mount_uploader :avatar, AvatarUploader # Scopes scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) } diff --git a/app/models/user.rb b/app/models/user.rb index d4018f0c897..2ffcd1478d8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -177,7 +177,7 @@ class User < ActiveRecord::Base end end - mount_uploader :avatar, AttachmentUploader + mount_uploader :avatar, AvatarUploader # Scopes scope :admins, -> { where(admin: true) } diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index b122b6c8658..22742d287a4 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -3,10 +3,8 @@ class AttachmentUploader < CarrierWave::Uploader::Base storage :file - after :store, :reset_events_cache - def store_dir - "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + "#{Rails.root}/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end def image? @@ -29,8 +27,4 @@ class AttachmentUploader < CarrierWave::Uploader::Base def file_storage? self.class.storage == CarrierWave::Storage::File end - - def reset_events_cache(file) - model.reset_events_cache if model.is_a?(User) - end end diff --git a/app/uploaders/avatar_uploader.rb b/app/uploaders/avatar_uploader.rb new file mode 100644 index 00000000000..7cad044555b --- /dev/null +++ b/app/uploaders/avatar_uploader.rb @@ -0,0 +1,32 @@ +# encoding: utf-8 + +class AvatarUploader < CarrierWave::Uploader::Base + storage :file + + after :store, :reset_events_cache + + def store_dir + "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + def image? + img_ext = %w(png jpg jpeg gif bmp tiff) + if file.respond_to?(:extension) + img_ext.include?(file.extension.downcase) + else + # Not all CarrierWave storages respond to :extension + ext = file.path.split('.').last.downcase + img_ext.include?(ext) + end + rescue + false + end + + def file_storage? + self.class.storage == CarrierWave::Storage::File + end + + def reset_events_cache(file) + model.reset_events_cache if model.is_a?(User) + end +end -- cgit v1.2.1 From ebd39fc082b09177e0777e5de5729c3f98495e87 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 16 Feb 2015 18:42:52 +0100 Subject: Nitpicking. --- app/controllers/files_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 561af8084c3..15523cbc2e7 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -5,9 +5,10 @@ class FilesController < ApplicationController if uploader.file_storage? if can?(current_user, :read_project, note.project) - disposition = uploader.image? ? 'inline' : 'attachment' # Replace old notes location in /public with the new one in / and send the file - path = uploader.file.path.gsub("#{Rails.root}/public",Rails.root.to_s) + path = uploader.file.path.gsub("#{Rails.root}/public", Rails.root.to_s) + + disposition = uploader.image? ? 'inline' : 'attachment' send_file path, disposition: disposition else not_found! -- cgit v1.2.1 From 904c382f6abb3c1ee3b3a7c5de0579b1cf2e3bea Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 17 Feb 2015 00:16:28 -0800 Subject: Fix code rendering for snippets --- app/views/shared/_file_highlight.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml index 52b48ff7451..fba69dd0f3f 100644 --- a/app/views/shared/_file_highlight.html.haml +++ b/app/views/shared/_file_highlight.html.haml @@ -7,4 +7,5 @@ = link_to "#L#{i}", id: "L#{i}", rel: "#L#{i}" do %i.fa.fa-link = i - = highlight(blob.name, blob.data) + :preserve + #{highlight(blob.name, blob.data)} -- cgit v1.2.1 From 080449f8af56e1aa0d80c921d0bc6ea4a61f1c38 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Feb 2015 14:14:27 +0100 Subject: Make sure Markdown previews always use the same styling as the eventual destination. --- app/assets/javascripts/notes.js.coffee | 8 ++++---- app/views/projects/_issuable_form.html.haml | 2 +- app/views/projects/_md_preview.html.haml | 2 +- app/views/projects/merge_requests/_new_submit.html.haml | 2 +- app/views/projects/milestones/_form.html.haml | 2 +- app/views/projects/notes/_edit_form.html.haml | 2 +- app/views/projects/notes/_form.html.haml | 2 +- app/views/projects/wikis/_form.html.haml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 47c5ecdedf1..6d4eade1287 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -272,7 +272,7 @@ class @Notes note_li = $(".note-row-" + note.id) note_li.replaceWith(note.html) note_li.find('.note-edit-form').hide() - note_li.find('.note-text').show() + note_li.find('.note-body > .note-text').show() ### Called in response to clicking the edit note link @@ -284,7 +284,7 @@ class @Notes showEditForm: (e) -> e.preventDefault() note = $(this).closest(".note") - note.find(".note-text").hide() + note.find(".note-body > .note-text").hide() note.find(".note-header").hide() base_form = note.find(".note-edit-form") form = base_form.clone().insertAfter(base_form) @@ -311,7 +311,7 @@ class @Notes cancelEdit: (e) -> e.preventDefault() note = $(this).closest(".note") - note.find(".note-text").show() + note.find(".note-body > .note-text").show() note.find(".note-header").show() note.find(".current-note-edit-form").remove() @@ -345,7 +345,7 @@ class @Notes removeAttachment: -> note = $(this).closest(".note") note.find(".note-attachment").remove() - note.find(".note-text").show() + note.find(".note-body > .note-text").show() note.find(".js-note-attachment-delete").hide() note.find(".note-edit-form").hide() diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml index 9e2e214b3e8..5a57673b584 100644 --- a/app/views/projects/_issuable_form.html.haml +++ b/app/views/projects/_issuable_form.html.haml @@ -15,7 +15,7 @@ = f.label :description, 'Description', class: 'control-label' .col-sm-10 - = render layout: 'projects/md_preview' do + = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' .col-sm-12.hint diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml index cb75149434f..d7d5c8a3401 100644 --- a/app/views/projects/_md_preview.html.haml +++ b/app/views/projects/_md_preview.html.haml @@ -10,4 +10,4 @@ .md-write-holder = yield .md-preview-holder.hide - .js-md-preview + .js-md-preview{class: (preview_class if defined?(preview_class))} diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index ac374532ffd..bca3e45bf19 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -19,7 +19,7 @@ .form-group.issuable-description = f.label :description, 'Description', class: 'control-label' .col-sm-10 - = render layout: 'projects/md_preview' do + = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' .col-sm-12-hint diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index 0f51a347f01..b3b170d7114 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -21,7 +21,7 @@ .form-group.milestone-description = f.label :description, "Description", class: "control-label" .col-sm-10 - = render layout: 'projects/md_preview' do + = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' .hint .pull-left Milestones are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml index 59e2b3f1b0b..cdc76f5d96f 100644 --- a/app/views/projects/notes/_edit_form.html.haml +++ b/app/views/projects/notes/_edit_form.html.haml @@ -1,6 +1,6 @@ .note-edit-form = form_for note, url: project_note_path(@project, note), method: :put, remote: true, authenticity_token: true do |f| - = render layout: 'projects/md_preview' do + = render layout: 'projects/md_preview', locals: { preview_class: "note-text" } do = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text' diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 3879a0f10da..1a4e06289f8 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -5,7 +5,7 @@ = f.hidden_field :noteable_id = f.hidden_field :noteable_type - = render layout: 'projects/md_preview' do + = render layout: 'projects/md_preview', locals: { preview_class: "note-text" } do = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text' diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml index 111484c8316..84731e43e95 100644 --- a/app/views/projects/wikis/_form.html.haml +++ b/app/views/projects/wikis/_form.html.haml @@ -22,7 +22,7 @@ .form-group.wiki-content = f.label :content, class: 'control-label' .col-sm-10 - = render layout: 'projects/md_preview' do + = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do = render 'projects/zen', f: f, attr: :content, classes: 'description form-control' .col-sm-12.hint .pull-left Wiki content is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'} -- cgit v1.2.1 From 57e91940dd719564f395116c7d91870396b0d58b Mon Sep 17 00:00:00 2001 From: Marco Cyriacks Date: Tue, 17 Feb 2015 20:52:03 +0100 Subject: Add new style to "New group" button The new group button style was changed to have the same look as the new project button (green background). --- app/assets/stylesheets/sections/dashboard.scss | 9 +++++++++ app/views/dashboard/_groups.html.haml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index 77d403cc687..feb9a4ad295 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -120,6 +120,15 @@ } } +.dash-new-group { + background: $bg_success; + border: 1px solid $border_success; + + a { + color: #FFF; + } +} + .dash-list .str-truncated { max-width: 72%; } diff --git a/app/views/dashboard/_groups.html.haml b/app/views/dashboard/_groups.html.haml index ddf44270802..e3df43d8892 100644 --- a/app/views/dashboard/_groups.html.haml +++ b/app/views/dashboard/_groups.html.haml @@ -3,7 +3,7 @@ .input-group = search_field_tag :filter_group, nil, placeholder: 'Filter by name', class: 'dash-filter form-control' - if current_user.can_create_group? - .input-group-addon + .input-group-addon.dash-new-group = link_to new_group_path, class: "" do %strong New group %ul.well-list.dash-list -- cgit v1.2.1 From 9bf8480b4a0d3ea6e284c4bd8bf26243f3f3f6f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Sat, 14 Feb 2015 16:04:45 +0100 Subject: Generalize the image upload in markdown This commit generalizes the image upload via drag and drop so it supports all files. It also adds access control for these files. --- app/assets/javascripts/dropzone_input.js.coffee | 21 +++++---- app/controllers/files_controller.rb | 29 +++++++++++- app/controllers/projects_controller.rb | 18 +++---- app/services/projects/file_service.rb | 55 ++++++++++++++++++++++ app/services/projects/image_service.rb | 39 --------------- app/uploaders/file_uploader.rb | 19 +++++++- app/views/projects/_issuable_form.html.haml | 2 +- app/views/projects/issues/_form.html.haml | 2 +- app/views/projects/merge_requests/_form.html.haml | 2 +- .../projects/merge_requests/_new_submit.html.haml | 5 +- app/views/projects/milestones/_form.html.haml | 4 +- app/views/projects/notes/_edit_form.html.haml | 2 +- app/views/projects/notes/_form.html.haml | 6 +-- app/views/projects/wikis/_form.html.haml | 5 +- 14 files changed, 135 insertions(+), 74 deletions(-) create mode 100644 app/services/projects/file_service.rb delete mode 100644 app/services/projects/image_service.rb (limited to 'app') diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index d98d5482937..bed8471b39a 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -9,7 +9,7 @@ class @DropzoneInput iconPicture = "" iconSpinner = "" btnAlert = "" - project_image_path_upload = window.project_image_path_upload or null + project_file_path_upload = window.project_file_path_upload or null form_textarea = $(form).find("textarea.markdown-area") form_textarea.wrap "
    " @@ -72,13 +72,12 @@ class @DropzoneInput form.find(".md-preview-holder").hide() dropzone = form_dropzone.dropzone( - url: project_image_path_upload + url: project_file_path_upload dictDefaultMessage: "" clickable: true - paramName: "markdown_img" + paramName: "markdown_file" maxFilesize: 10 uploadMultiple: false - acceptedFiles: "image/jpg,image/jpeg,image/gif,image/png" headers: "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") @@ -133,7 +132,10 @@ class @DropzoneInput child = $(dropzone[0]).children("textarea") formatLink = (str) -> - "![" + str.alt + "](" + str.url + ")" + text = "[" + str.alt + "](" + str.url + ")" + if str.is_image is true + text = "!" + text + text handlePaste = (event) -> pasteEvent = event.originalEvent @@ -177,9 +179,9 @@ class @DropzoneInput uploadFile = (item, filename) -> formData = new FormData() - formData.append "markdown_img", item, filename + formData.append "markdown_file", item, filename $.ajax - url: project_image_path_upload + url: project_file_path_upload type: "POST" data: formData dataType: "json" @@ -234,4 +236,7 @@ class @DropzoneInput return formatLink: (str) -> - "![" + str.alt + "](" + str.url + ")" + text = "[" + str.alt + "](" + str.url + ")" + if str.is_image is true + text = "!" + text + text diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 15523cbc2e7..a86340dd9bb 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -1,5 +1,5 @@ class FilesController < ApplicationController - def download + def download_notes note = Note.find(params[:id]) uploader = note.attachment @@ -14,7 +14,32 @@ class FilesController < ApplicationController not_found! end else - redirect_to uploader.url + not_found! end end + + def download_files + namespace_id = params[:namespace] + project_id = params[:project] + folder_id = params[:folder_id] + filename = params[:filename] + project_with_namespace="#{namespace_id}/#{project_id}" + filename_with_id="#{folder_id}/#{filename}" + + project = Project.find_with_namespace(project_with_namespace) + + uploader = FileUploader.new("#{Rails.root}/uploads","#{project_with_namespace}/#{folder_id}") + uploader.retrieve_from_store!(filename) + + if can?(current_user, :read_project, project) + download(uploader) + else + not_found! + end + end + + def download(uploader) + disposition = uploader.image? ? 'inline' : 'attachment' + send_file uploader.file.path, disposition: disposition + end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 462ab3d4749..b430278903a 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -134,12 +134,13 @@ class ProjectsController < ApplicationController end end - def upload_image - link_to_image = ::Projects::ImageService.new(repository, params, root_url).execute + def upload_file + link_to_file = ::Projects::FileService.new(repository, params, root_url). + execute respond_to do |format| - if link_to_image - format.json { render json: { link: link_to_image } } + if link_to_file + format.json { render json: { link: link_to_file } } else format.json { render json: 'Invalid file.', status: :unprocessable_entity } end @@ -158,13 +159,8 @@ class ProjectsController < ApplicationController private - def upload_path - base_dir = FileUploader.generate_dir - File.join(repository.path_with_namespace, base_dir) - end - - def accepted_images - %w(png jpg jpeg gif) + def invalid_file(error) + render json: { message: error.message }, status: :internal_server_error end def set_title diff --git a/app/services/projects/file_service.rb b/app/services/projects/file_service.rb new file mode 100644 index 00000000000..8c149bf53a1 --- /dev/null +++ b/app/services/projects/file_service.rb @@ -0,0 +1,55 @@ +module Projects + class FileService < BaseService + include Rails.application.routes.url_helpers + def initialize(repository, params, root_url) + @repository, @params, @root_url = repository, params.dup, root_url + end + + def execute + uploader = FileUploader.new("#{Rails.root}/uploads", upload_path, accepted_files) + file = @params['markdown_file'] + + if file + alt = file.original_filename + uploader.store!(file) + filename = nil + if image?(file) + filename=File.basename(alt, '.*') + else + filename=File.basename(alt) + end + link = { + 'alt' => filename, + 'url' => uploader.secure_url, + 'is_image' => image?(file) + } + else + link = nil + end + end + + protected + + def accepted_files + # insert accepted mime types here (e.g %w(jpg jpeg gif png)) + nil + end + + def accepted_images + %w(jpg jpeg gif png) + end + + def image?(file) + accepted_images.map { |format| file.content_type.include? format }.any? + end + + def upload_path + base_dir = FileUploader.generate_dir + File.join(@repository.path_with_namespace, base_dir) + end + + def correct_mime_type?(file) + accepted_files.map { |format| image.content_type.include? format }.any? + end + end +end diff --git a/app/services/projects/image_service.rb b/app/services/projects/image_service.rb deleted file mode 100644 index 7ca7e82c4a3..00000000000 --- a/app/services/projects/image_service.rb +++ /dev/null @@ -1,39 +0,0 @@ -module Projects - class ImageService < BaseService - include Rails.application.routes.url_helpers - def initialize(repository, params, root_url) - @repository, @params, @root_url = repository, params.dup, root_url - end - - def execute - uploader = FileUploader.new('uploads', upload_path, accepted_images) - image = @params['markdown_img'] - - if image && correct_mime_type?(image) - alt = image.original_filename - uploader.store!(image) - link = { - 'alt' => File.basename(alt, '.*'), - 'url' => File.join(@root_url, uploader.url) - } - else - link = nil - end - end - - protected - - def upload_path - base_dir = FileUploader.generate_dir - File.join(@repository.path_with_namespace, base_dir) - end - - def accepted_images - %w(png jpg jpeg gif) - end - - def correct_mime_type?(image) - accepted_images.map{ |format| image.content_type.include? format }.any? - end - end -end diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index 0fa987c93f6..ac7bd5b27ec 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -21,7 +21,7 @@ class FileUploader < CarrierWave::Uploader::Base end def extension_white_list - @allowed_extensions + @allowed_extensions || super end def store!(file) @@ -38,4 +38,21 @@ class FileUploader < CarrierWave::Uploader::Base def self.generate_dir SecureRandom.hex(5) end + + def secure_url + Gitlab.config.gitlab.relative_url_root + "/files/#{@path}/#{@filename}" + end + + def image? + img_ext = %w(png jpg jpeg gif bmp tiff) + if file.respond_to?(:extension) + img_ext.include?(file.extension.downcase) + else + # Not all CarrierWave storages respond to :extension + ext = file.path.split('.').last.downcase + img_ext.include?(ext) + end + rescue + false + end end diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml index 5a57673b584..18897b055aa 100644 --- a/app/views/projects/_issuable_form.html.haml +++ b/app/views/projects/_issuable_form.html.haml @@ -23,7 +23,7 @@ Parsed with #{link_to 'GitLab Flavored Markdown', help_page_path('markdown', 'markdown'), target: '_blank'}. .pull-right - Attach images (JPG, PNG, GIF) by dragging & dropping + Attach files by dragging & dropping or #{link_to 'selecting them', '#', class: 'markdown-selector' }. .clearfix diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 2a7b44955cd..975980bd6bd 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -11,4 +11,4 @@ e.preventDefault(); }); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_file_path_upload = "#{upload_file_project_path @project}"; diff --git a/app/views/projects/merge_requests/_form.html.haml b/app/views/projects/merge_requests/_form.html.haml index d52e64666a0..28c4734e14f 100644 --- a/app/views/projects/merge_requests/_form.html.haml +++ b/app/views/projects/merge_requests/_form.html.haml @@ -9,4 +9,4 @@ e.preventDefault(); }); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_file_path_upload = "#{upload_file_project_path @project}"; diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index bca3e45bf19..0653b30fcca 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -27,7 +27,7 @@ Parsed with #{link_to 'Gitlab Flavored Markdown', help_page_path('markdown', 'markdown'), target: '_blank'}. .pull-right - Attach images (JPG, PNG, GIF) by dragging & dropping + Attach files by dragging & dropping or #{link_to 'selecting them', '#', class: 'markdown-selector'}. .clearfix @@ -113,10 +113,11 @@ e.preventDefault(); }); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_file_path_upload = "#{upload_file_project_path @project}"; :javascript var merge_request merge_request = new MergeRequest({ action: 'commits' }); + diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index b3b170d7114..5fbb668570c 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -25,7 +25,7 @@ = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' .hint .pull-left Milestones are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. - .pull-left Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + .pull-left Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. .clearfix .error-alert .col-md-6 @@ -51,4 +51,4 @@ onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } }).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $('#milestone_due_date').val())); - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_file_path_upload = "#{upload_file_project_path @project}"; diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml index cdc76f5d96f..4ba59078318 100644 --- a/app/views/projects/notes/_edit_form.html.haml +++ b/app/views/projects/notes/_edit_form.html.haml @@ -6,7 +6,7 @@ .comment-hints.clearfix .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. + .pull-right Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. .note-form-actions .buttons diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 1a4e06289f8..fe3dab569f4 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @note], remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new_note js-new-note-form common-note-form gfm-form" }, authenticity_token: true do |f| += form_for [@project, @note], remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new_note js-new-note-form common-note-form" }, authenticity_token: true do |f| = note_target_fields = f.hidden_field :commit_id = f.hidden_field :line_code @@ -11,7 +11,7 @@ .comment-hints.clearfix .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. + .pull-right Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. .note-form-actions @@ -29,4 +29,4 @@ = f.file_field :attachment, class: "js-note-attachment-input hidden" :javascript - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_file_path_upload = "#{upload_file_project_path @project}"; diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml index 84731e43e95..0afee138c8b 100644 --- a/app/views/projects/wikis/_form.html.haml +++ b/app/views/projects/wikis/_form.html.haml @@ -26,7 +26,7 @@ = render 'projects/zen', f: f, attr: :content, classes: 'description form-control' .col-sm-12.hint .pull-left Wiki content is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'} - .pull-right Attach images (JPG, PNG, GIF) by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. + .pull-right Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. .clearfix .error-alert @@ -43,5 +43,6 @@ = link_to "Cancel", project_wiki_path(@project, :home), class: "btn btn-cancel" :javascript - window.project_image_path_upload = "#{upload_image_project_path @project}"; + window.project_file_path_upload = "#{upload_file_project_path @project}"; + -- cgit v1.2.1 From 9729cc584f5758395960416f308a9c45f698cdee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Sat, 14 Feb 2015 19:52:45 +0100 Subject: implement Project::UploadsController --- app/controllers/files_controller.rb | 29 ++------------------------ app/controllers/projects/uploads_controller.rb | 16 ++++++++++++++ app/uploaders/file_uploader.rb | 4 +++- 3 files changed, 21 insertions(+), 28 deletions(-) create mode 100644 app/controllers/projects/uploads_controller.rb (limited to 'app') diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index a86340dd9bb..15523cbc2e7 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -1,5 +1,5 @@ class FilesController < ApplicationController - def download_notes + def download note = Note.find(params[:id]) uploader = note.attachment @@ -14,32 +14,7 @@ class FilesController < ApplicationController not_found! end else - not_found! + redirect_to uploader.url end end - - def download_files - namespace_id = params[:namespace] - project_id = params[:project] - folder_id = params[:folder_id] - filename = params[:filename] - project_with_namespace="#{namespace_id}/#{project_id}" - filename_with_id="#{folder_id}/#{filename}" - - project = Project.find_with_namespace(project_with_namespace) - - uploader = FileUploader.new("#{Rails.root}/uploads","#{project_with_namespace}/#{folder_id}") - uploader.retrieve_from_store!(filename) - - if can?(current_user, :read_project, project) - download(uploader) - else - not_found! - end - end - - def download(uploader) - disposition = uploader.image? ? 'inline' : 'attachment' - send_file uploader.file.path, disposition: disposition - end end diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb new file mode 100644 index 00000000000..1c9fb1c86fb --- /dev/null +++ b/app/controllers/projects/uploads_controller.rb @@ -0,0 +1,16 @@ +class Projects::UploadsController < Projects::ApplicationController + layout 'project' + + before_filter :project + + def show + folder_id = params[:folder_id] + filename = params[:filename] + + uploader = FileUploader.new("#{Rails.root}/uploads","#{@project.path_with_namespace}/#{folder_id}") + uploader.retrieve_from_store!(filename) + + disposition = uploader.image? ? 'inline' : 'attachment' + send_file uploader.file.path, disposition: disposition + end +end diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index ac7bd5b27ec..51ae8040e52 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -40,7 +40,9 @@ class FileUploader < CarrierWave::Uploader::Base end def secure_url - Gitlab.config.gitlab.relative_url_root + "/files/#{@path}/#{@filename}" + path_array = @path.split('/') + path = File.join(path_array[0],path_array[1],'uploads',path_array[2]) + Gitlab.config.gitlab.relative_url_root + "/#{path}/#{@filename}" end def image? -- cgit v1.2.1 From d2ebdf664b42d4fac6b2e060ef79aa9fe0b0e72d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 16 Feb 2015 19:58:40 +0100 Subject: Refactor. --- app/assets/javascripts/dropzone_input.js.coffee | 26 +++++----- app/controllers/files_controller.rb | 17 ++++--- app/controllers/projects/uploads_controller.rb | 37 ++++++++++++--- app/controllers/projects_controller.rb | 17 ------- app/services/projects/file_service.rb | 55 ---------------------- app/services/projects/upload_service.rb | 22 +++++++++ app/uploaders/attachment_uploader.rb | 2 +- app/uploaders/file_uploader.rb | 38 +++++---------- app/views/projects/issues/_form.html.haml | 2 +- app/views/projects/merge_requests/_form.html.haml | 2 +- .../projects/merge_requests/_new_submit.html.haml | 2 +- app/views/projects/milestones/_form.html.haml | 2 +- app/views/projects/notes/_form.html.haml | 2 +- app/views/projects/wikis/_form.html.haml | 2 +- 14 files changed, 93 insertions(+), 133 deletions(-) delete mode 100644 app/services/projects/file_service.rb create mode 100644 app/services/projects/upload_service.rb (limited to 'app') diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index bed8471b39a..2d9b496b132 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -9,7 +9,7 @@ class @DropzoneInput iconPicture = "" iconSpinner = "" btnAlert = "" - project_file_path_upload = window.project_file_path_upload or null + project_uploads_path = window.project_uploads_path or null form_textarea = $(form).find("textarea.markdown-area") form_textarea.wrap "
    " @@ -72,10 +72,10 @@ class @DropzoneInput form.find(".md-preview-holder").hide() dropzone = form_dropzone.dropzone( - url: project_file_path_upload + url: project_uploads_path dictDefaultMessage: "" clickable: true - paramName: "markdown_file" + paramName: "file" maxFilesize: 10 uploadMultiple: false headers: @@ -131,10 +131,9 @@ class @DropzoneInput child = $(dropzone[0]).children("textarea") - formatLink = (str) -> - text = "[" + str.alt + "](" + str.url + ")" - if str.is_image is true - text = "!" + text + formatLink = (link) -> + text = "[#{link.alt}](#{link.url})" + text = "!#{text}" if link.is_image text handlePaste = (event) -> @@ -179,9 +178,9 @@ class @DropzoneInput uploadFile = (item, filename) -> formData = new FormData() - formData.append "markdown_file", item, filename + formData.append "file", item, filename $.ajax - url: project_file_path_upload + url: project_uploads_path type: "POST" data: formData dataType: "json" @@ -235,8 +234,7 @@ class @DropzoneInput $(@).closest('.gfm-form').find('.div-dropzone').click() return - formatLink: (str) -> - text = "[" + str.alt + "](" + str.url + ")" - if str.is_image is true - text = "!" + text - text + formatLink: (link) -> + text = "[#{link.alt}](#{link.url})" + text = "!#{text}" if link.is_image + text \ No newline at end of file diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 15523cbc2e7..267239b7b84 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -3,18 +3,21 @@ class FilesController < ApplicationController note = Note.find(params[:id]) uploader = note.attachment - if uploader.file_storage? - if can?(current_user, :read_project, note.project) - # Replace old notes location in /public with the new one in / and send the file + if can?(current_user, :read_project, note.project) + if uploader.file_storage? path = uploader.file.path.gsub("#{Rails.root}/public", Rails.root.to_s) - disposition = uploader.image? ? 'inline' : 'attachment' - send_file path, disposition: disposition + if File.exist?(path) + disposition = uploader.image? ? 'inline' : 'attachment' + send_file path, disposition: disposition + else + not_found! + end else - not_found! + redirect_to uploader.url end else - redirect_to uploader.url + not_found! end end end diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb index 1c9fb1c86fb..355163ac879 100644 --- a/app/controllers/projects/uploads_controller.rb +++ b/app/controllers/projects/uploads_controller.rb @@ -3,14 +3,37 @@ class Projects::UploadsController < Projects::ApplicationController before_filter :project + def create + link_to_file = ::Projects::UploadService.new(repository, params[:file]). + execute + + respond_to do |format| + if link_to_file + format.json do + render json: { link: link_to_file } + end + else + format.json do + render json: 'Invalid file.', status: :unprocessable_entity + end + end + end + end + def show - folder_id = params[:folder_id] - filename = params[:filename] - - uploader = FileUploader.new("#{Rails.root}/uploads","#{@project.path_with_namespace}/#{folder_id}") - uploader.retrieve_from_store!(filename) + uploader = FileUploader.new(project, params[:secret]) + + if uploader.file_storage? + uploader.retrieve_from_store!(params[:filename]) - disposition = uploader.image? ? 'inline' : 'attachment' - send_file uploader.file.path, disposition: disposition + if uploader.file.exists? + disposition = uploader.image? ? 'inline' : 'attachment' + send_file uploader.file.path, disposition: disposition + else + not_found! + end + else + redirect_to uploader.url + end end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index b430278903a..9be66b6b9f9 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -134,19 +134,6 @@ class ProjectsController < ApplicationController end end - def upload_file - link_to_file = ::Projects::FileService.new(repository, params, root_url). - execute - - respond_to do |format| - if link_to_file - format.json { render json: { link: link_to_file } } - else - format.json { render json: 'Invalid file.', status: :unprocessable_entity } - end - end - end - def toggle_star current_user.toggle_star(@project) @project.reload @@ -159,10 +146,6 @@ class ProjectsController < ApplicationController private - def invalid_file(error) - render json: { message: error.message }, status: :internal_server_error - end - def set_title @title = 'New Project' end diff --git a/app/services/projects/file_service.rb b/app/services/projects/file_service.rb deleted file mode 100644 index 8c149bf53a1..00000000000 --- a/app/services/projects/file_service.rb +++ /dev/null @@ -1,55 +0,0 @@ -module Projects - class FileService < BaseService - include Rails.application.routes.url_helpers - def initialize(repository, params, root_url) - @repository, @params, @root_url = repository, params.dup, root_url - end - - def execute - uploader = FileUploader.new("#{Rails.root}/uploads", upload_path, accepted_files) - file = @params['markdown_file'] - - if file - alt = file.original_filename - uploader.store!(file) - filename = nil - if image?(file) - filename=File.basename(alt, '.*') - else - filename=File.basename(alt) - end - link = { - 'alt' => filename, - 'url' => uploader.secure_url, - 'is_image' => image?(file) - } - else - link = nil - end - end - - protected - - def accepted_files - # insert accepted mime types here (e.g %w(jpg jpeg gif png)) - nil - end - - def accepted_images - %w(jpg jpeg gif png) - end - - def image?(file) - accepted_images.map { |format| file.content_type.include? format }.any? - end - - def upload_path - base_dir = FileUploader.generate_dir - File.join(@repository.path_with_namespace, base_dir) - end - - def correct_mime_type?(file) - accepted_files.map { |format| image.content_type.include? format }.any? - end - end -end diff --git a/app/services/projects/upload_service.rb b/app/services/projects/upload_service.rb new file mode 100644 index 00000000000..a186c97628f --- /dev/null +++ b/app/services/projects/upload_service.rb @@ -0,0 +1,22 @@ +module Projects + class UploadService < BaseService + def initialize(project, file) + @project, @file = project, file + end + + def execute + return nil unless @file + + uploader = FileUploader.new(@project) + uploader.store!(@file) + + filename = uploader.image? ? uploader.file.basename : uploader.file.filename + + { + 'alt' => filename, + 'url' => uploader.secure_url, + 'is_image' => uploader.image? + } + end + end +end diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index 22742d287a4..58dc6e90c1e 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -21,7 +21,7 @@ class AttachmentUploader < CarrierWave::Uploader::Base end def secure_url - Gitlab.config.gitlab.relative_url_root + "/files/#{model.class.to_s.underscore}/#{model.id}/#{file.filename}" + File.join(Gitlab.config.gitlab.relative_url_root, "files", model.class.to_s.underscore, model.id.to_s, file.filename) end def file_storage? diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index 51ae8040e52..c040f6bbe92 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -2,47 +2,33 @@ class FileUploader < CarrierWave::Uploader::Base storage :file - def initialize(base_dir, path = '', allowed_extensions = nil) - @base_dir = base_dir - @path = path - @allowed_extensions = allowed_extensions + def initialize(project, secret = self.class.generate_secret) + @project = project + @secret = secret end def base_dir - @base_dir + "#{Rails.root}/uploads" end def store_dir - File.join(@base_dir, @path) + File.join(base_dir, @project.path_with_namespace, @secret) end def cache_dir - File.join(@base_dir, 'tmp', @path) + File.join(base_dir, 'tmp', @project.path_with_namespace, @secret) end - def extension_white_list - @allowed_extensions || super - end - - def store!(file) - @filename = self.class.generate_filename(file) - super - end - - def self.generate_filename(file) - original_filename = File.basename(file.original_filename, '.*') - extension = File.extname(file.original_filename) - new_filename = Digest::MD5.hexdigest(original_filename) + extension - end - - def self.generate_dir + def self.generate_secret SecureRandom.hex(5) end def secure_url - path_array = @path.split('/') - path = File.join(path_array[0],path_array[1],'uploads',path_array[2]) - Gitlab.config.gitlab.relative_url_root + "/#{path}/#{@filename}" + File.join(Gitlab.config.gitlab.relative_url_root, @project.path_with_namespace, "uploads", @secret, file.filename) + end + + def file_storage? + self.class.storage == CarrierWave::Storage::File end def image? diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 975980bd6bd..afeeed6edf4 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -11,4 +11,4 @@ e.preventDefault(); }); - window.project_file_path_upload = "#{upload_file_project_path @project}"; + window.project_uploads_path = "#{project_uploads_path @project}"; diff --git a/app/views/projects/merge_requests/_form.html.haml b/app/views/projects/merge_requests/_form.html.haml index 28c4734e14f..c1a05e4586f 100644 --- a/app/views/projects/merge_requests/_form.html.haml +++ b/app/views/projects/merge_requests/_form.html.haml @@ -9,4 +9,4 @@ e.preventDefault(); }); - window.project_file_path_upload = "#{upload_file_project_path @project}"; + window.project_uploads_path = "#{project_uploads_path @project}"; diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index 0653b30fcca..4cf2a05b1a3 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -113,7 +113,7 @@ e.preventDefault(); }); - window.project_file_path_upload = "#{upload_file_project_path @project}"; + window.project_uploads_path = "#{project_uploads_path @project}"; :javascript var merge_request diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index 5fbb668570c..dbcd23eee05 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -51,4 +51,4 @@ onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } }).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $('#milestone_due_date').val())); - window.project_file_path_upload = "#{upload_file_project_path @project}"; + window.project_uploads_path = "#{project_uploads_path @project}"; diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index fe3dab569f4..9f9efc782d5 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -29,4 +29,4 @@ = f.file_field :attachment, class: "js-note-attachment-input hidden" :javascript - window.project_file_path_upload = "#{upload_file_project_path @project}"; + window.project_uploads_path = "#{project_uploads_path @project}"; diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml index 0afee138c8b..b1579878ed1 100644 --- a/app/views/projects/wikis/_form.html.haml +++ b/app/views/projects/wikis/_form.html.haml @@ -43,6 +43,6 @@ = link_to "Cancel", project_wiki_path(@project, :home), class: "btn btn-cancel" :javascript - window.project_file_path_upload = "#{upload_file_project_path @project}"; + window.project_uploads_path = "#{project_uploads_path @project}"; -- cgit v1.2.1 From ab401a6132411294cee03cf4e0902ec75c2c42dc Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 16 Feb 2015 22:08:44 +0100 Subject: Remove note attachment file selector. --- app/assets/javascripts/notes.js.coffee | 13 ------------- app/views/projects/notes/_edit_form.html.haml | 10 +--------- app/views/projects/notes/_form.html.haml | 8 -------- 3 files changed, 1 insertion(+), 30 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 1c090bd06dc..90e6fd6d154 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -39,9 +39,6 @@ class @Notes # reset main target form after submit $(document).on "ajax:complete", ".js-main-target-form", @resetMainTargetForm - # attachment button - $(document).on "click", ".js-choose-note-attachment-button", @chooseNoteAttachment - # update the file name when an attachment is selected $(document).on "change", ".js-note-attachment-input", @updateFormAttachment @@ -73,7 +70,6 @@ class @Notes $(document).off "click", ".js-note-delete" $(document).off "click", ".js-note-attachment-delete" $(document).off "ajax:complete", ".js-main-target-form" - $(document).off "click", ".js-choose-note-attachment-button" $(document).off "click", ".js-discussion-reply-button" $(document).off "click", ".js-add-diff-note-button" $(document).off "visibilitychange" @@ -173,15 +169,6 @@ class @Notes form.find(".js-note-text").data("autosave").reset() - ### - Called when clicking the "Choose File" button. - - Opens the file selection dialog. - ### - chooseNoteAttachment: -> - form = $(this).closest("form") - form.find(".js-note-attachment-input").click() - ### Shows the main form and does some setup on it. diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml index 4ba59078318..ca097f3d55a 100644 --- a/app/views/projects/notes/_edit_form.html.haml +++ b/app/views/projects/notes/_edit_form.html.haml @@ -11,12 +11,4 @@ .note-form-actions .buttons = f.submit 'Save Comment', class: "btn btn-primary btn-save btn-grouped js-comment-button" - = link_to 'Cancel', "#", class: "btn btn-cancel note-edit-cancel" - - .note-form-option.hidden-xs - %a.choose-btn.btn.js-choose-note-attachment-button - %i.fa.fa-paperclip - %span Choose File ... -   - %span.file_name.js-attachment-filename - = f.file_field :attachment, class: "js-note-attachment-input hidden" + = link_to 'Cancel', "#", class: "btn btn-cancel note-edit-cancel" \ No newline at end of file diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 9f9efc782d5..8b331ef819f 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -20,13 +20,5 @@ = yield(:note_actions) %a.btn.grouped.js-close-discussion-note-form Cancel - .note-form-option.hidden-xs - %a.choose-btn.btn.js-choose-note-attachment-button - %i.fa.fa-paperclip - %span Choose File ... -   - %span.file_name.js-attachment-filename - = f.file_field :attachment, class: "js-note-attachment-input hidden" - :javascript window.project_uploads_path = "#{project_uploads_path @project}"; -- cgit v1.2.1 From ab65be7a2f5d46a681d882f4f90d1f0438c64b02 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 16 Feb 2015 22:08:55 +0100 Subject: Use longer upload secret. --- app/uploaders/file_uploader.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index c040f6bbe92..bdfbfc668bd 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -20,7 +20,7 @@ class FileUploader < CarrierWave::Uploader::Base end def self.generate_secret - SecureRandom.hex(5) + SecureRandom.hex end def secure_url -- cgit v1.2.1 From 99fb4d387fbcddc56292b788a84b1e62d27765dd Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 16 Feb 2015 22:09:17 +0100 Subject: Add paperclip icon to links to uploads in notes. --- app/assets/stylesheets/sections/notes.scss | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 5494845eb8c..40adc8b3ba7 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -66,6 +66,22 @@ ul.notes { overflow: auto; word-wrap: break-word; @include md-typography; + + a[href*="/uploads/"] { + &:before { + margin-right: 4px; + + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + content: "\f0c6"; + } + + &:hover:before { + text-decoration: none; + } + } } } .note-header { -- cgit v1.2.1 From 4036fb167ddce47db8ad4d885000b2c9db96595d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 16 Feb 2015 22:09:52 +0100 Subject: Change textarea upload hover icon from picture to paperclip. --- app/assets/javascripts/dropzone_input.js.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index 2d9b496b132..06e9f0001ae 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -6,7 +6,7 @@ class @DropzoneInput divHover = "
    " divSpinner = "
    " divAlert = "
    " - iconPicture = "" + iconPaperclip = "" iconSpinner = "" btnAlert = "" project_uploads_path = window.project_uploads_path or null @@ -19,7 +19,7 @@ class @DropzoneInput form_dropzone = $(form).find('.div-dropzone') form_dropzone.parent().addClass "div-dropzone-wrapper" form_dropzone.append divHover - $(".div-dropzone-hover").append iconPicture + $(".div-dropzone-hover").append iconPaperclip form_dropzone.append divSpinner $(".div-dropzone-spinner").append iconSpinner $(".div-dropzone-spinner").css -- cgit v1.2.1 From 896c046217ab44e7e685f0c2ca2d4f3835d63d44 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 17 Feb 2015 16:14:49 -0800 Subject: Affix assignee/milestone block --- app/assets/javascripts/issue.js.coffee | 6 ++ app/assets/javascripts/merge_request.js.coffee | 6 ++ app/assets/stylesheets/sections/issuable.scss | 25 ++++++++ app/assets/stylesheets/sections/issues.scss | 11 +++- .../stylesheets/sections/merge_requests.scss | 9 ++- app/views/projects/issues/_discussion.html.haml | 40 ++++++------- app/views/projects/issues/show.html.haml | 69 +++++++++++----------- .../projects/merge_requests/_discussion.html.haml | 37 ++++++------ app/views/projects/merge_requests/_show.html.haml | 65 ++++++++++---------- 9 files changed, 162 insertions(+), 106 deletions(-) create mode 100644 app/assets/stylesheets/sections/issuable.scss (limited to 'app') diff --git a/app/assets/javascripts/issue.js.coffee b/app/assets/javascripts/issue.js.coffee index 45c248e6fb6..9b7c1be8355 100644 --- a/app/assets/javascripts/issue.js.coffee +++ b/app/assets/javascripts/issue.js.coffee @@ -15,3 +15,9 @@ class @Issue "issue" updateTaskState ) + + $('.issuable-affix').affix offset: + top: -> + @top = $('.issue-details').outerHeight(true) + 25 + bottom: -> + @bottom = $('.footer').outerHeight(true) diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee index 5bcbd56852d..757592842eb 100644 --- a/app/assets/javascripts/merge_request.js.coffee +++ b/app/assets/javascripts/merge_request.js.coffee @@ -20,6 +20,12 @@ class @MergeRequest if $("a.btn-close").length $("li.task-list-item input:checkbox").prop("disabled", false) + $('.issuable-affix').affix offset: + top: -> + @top = $('.merge-request-details').outerHeight(true) + 70 + bottom: -> + @bottom = $('.footer').outerHeight(true) + # Local jQuery finder $: (selector) -> this.$el.find(selector) diff --git a/app/assets/stylesheets/sections/issuable.scss b/app/assets/stylesheets/sections/issuable.scss new file mode 100644 index 00000000000..75bd39853bd --- /dev/null +++ b/app/assets/stylesheets/sections/issuable.scss @@ -0,0 +1,25 @@ +@media (max-width: $screen-sm-max) { + .issuable-affix { + margin-top: 20px; + } +} + +@media (max-width: $screen-md-max) { + .issuable-affix { + position: static; + } +} + +@media (min-width: $screen-md-max) { + .issuable-affix { + &.affix-top { + position: static; + } + + &.affix { + position: fixed; + top: 70px; + width: 220px; + } + } +} diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 7a9d3334d96..ccfc9b704a6 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -94,8 +94,15 @@ } } -.issue-show-labels .color-label { - padding: 6px 10px; +.issue-show-labels { + a { + margin-right: 5px; + margin-bottom: 5px; + display: inline-block; + .color-label { + padding: 6px 10px; + } + } } form.edit-issue { diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 0e27c389387..6662a38344a 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -95,7 +95,14 @@ color: #999; .merge-request-labels { - display: inline-block; + a { + margin-right: 5px; + margin-bottom: 5px; + display: inline-block; + .color-label { + padding: 6px 10px; + } + } } } } diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index e04e1985f1f..3a278058944 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -14,24 +14,24 @@ .voting_notes#notes= render "projects/notes/notes_with_form" .col-md-3 - %div - .clearfix - %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @issue) - %hr - .context - %cite.cgray - = render partial: 'issue_context', locals: { issue: @issue } - %hr - .clearfix - .votes-holder - %h6 Votes - #votes= render 'votes/votes_block', votable: @issue - - - if @issue.labels.any? + .issuable-affix + .clearfix + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @issue) %hr - %h6 Labels - .issue-show-labels - - @issue.labels.each do |label| - = link_to project_issues_path(@project, label_name: label.name) do - %p= render_colored_label(label) + .context + %cite.cgray + = render partial: 'issue_context', locals: { issue: @issue } + %hr + .clearfix + .votes-holder + %h6 Votes + #votes= render 'votes/votes_block', votable: @issue + + - if @issue.labels.any? + %hr + %h6 Labels + .issue-show-labels + - @issue.labels.each do |label| + = link_to project_issues_path(@project, label_name: label.name) do + = render_colored_label(label) diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 75411c6d86f..bf343cbb7af 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -1,37 +1,40 @@ -%h4.page-title - .issue-box{ class: issue_box_class(@issue) } - - if @issue.closed? - Closed - - else - Open - Issue ##{@issue.iid} - %small.creator - · created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} +.issue + .issue-details + %h4.page-title + .issue-box{ class: issue_box_class(@issue) } + - if @issue.closed? + Closed + - else + Open + Issue ##{@issue.iid} + %small.creator + · created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)} - .pull-right - - if can?(current_user, :write_issue, @project) - = link_to new_project_issue_path(@project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do - %i.fa.fa-plus - New Issue - - if can?(current_user, :modify_issue, @issue) - - if @issue.closed? - = link_to 'Reopen', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" - - else - = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" + .pull-right + - if can?(current_user, :write_issue, @project) + = link_to new_project_issue_path(@project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do + %i.fa.fa-plus + New Issue + - if can?(current_user, :modify_issue, @issue) + - if @issue.closed? + = link_to 'Reopen', project_issue_path(@project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" + - else + = link_to 'Close', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" - = link_to edit_project_issue_path(@project, @issue), class: "btn btn-grouped issuable-edit" do - %i.fa.fa-pencil-square-o - Edit + = link_to edit_project_issue_path(@project, @issue), class: "btn btn-grouped issuable-edit" do + %i.fa.fa-pencil-square-o + Edit -%hr -%h3.issue-title - = gfm escape_once(@issue.title) -%div - - if @issue.description.present? - .description - .wiki - = preserve do - = markdown(@issue.description, parse_tasks: true) + %hr + %h3.issue-title + = gfm escape_once(@issue.title) + %div + - if @issue.description.present? + .description + .wiki + = preserve do + = markdown(@issue.description, parse_tasks: true) -%hr -= render "projects/issues/discussion" + %hr + .issue-discussion + = render "projects/issues/discussion" diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index f1f66569a9f..51e65f874c2 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -10,22 +10,23 @@ = render "projects/merge_requests/show/participants" = render "projects/notes/notes_with_form" .col-md-3 - .clearfix - %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @merge_request) - %hr - .context - %cite.cgray - = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } - %hr - .votes-holder - %h6 Votes - #votes= render 'votes/votes_block', votable: @merge_request - - - if @merge_request.labels.any? + .issuable-affix + .clearfix + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @merge_request) + %hr + .context + %cite.cgray + = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } %hr - %h6 Labels - .merge-request-show-labels - - @merge_request.labels.each do |label| - = link_to project_merge_requests_path(@project, label_name: label.name) do - %p= render_colored_label(label) + .votes-holder + %h6 Votes + #votes= render 'votes/votes_block', votable: @merge_request + + - if @merge_request.labels.any? + %hr + %h6 Labels + .merge-request-show-labels + - @merge_request.labels.each do |label| + = link_to project_merge_requests_path(@project, label_name: label.name) do + = render_colored_label(label) diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 8e31a7e3fe4..af7044160c1 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,37 +1,38 @@ .merge-request{'data-url' => project_merge_request_path(@project, @merge_request)} - = render "projects/merge_requests/show/mr_title" - %hr - = render "projects/merge_requests/show/mr_box" - %hr - .append-bottom-20 - .slead - %span From - - if @merge_request.for_fork? - %strong.label-branch< - - if @merge_request.source_project - = link_to @merge_request.source_project_namespace, project_path(@merge_request.source_project) - - else - \ #{@merge_request.source_project_namespace} - \:#{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} - - else - %strong.label-branch #{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_branch} - - if @merge_request.open? - %span.pull-right - .btn-group - %a.btn.dropdown-toggle{ data: {toggle: :dropdown} } - %i.fa.fa-download - Download as - %span.caret - %ul.dropdown-menu - %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) - %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) + .merge-request-details + = render "projects/merge_requests/show/mr_title" + %hr + = render "projects/merge_requests/show/mr_box" + %hr + .append-bottom-20 + .slead + %span From + - if @merge_request.for_fork? + %strong.label-branch< + - if @merge_request.source_project + = link_to @merge_request.source_project_namespace, project_path(@merge_request.source_project) + - else + \ #{@merge_request.source_project_namespace} + \:#{@merge_request.source_branch} + %span into + %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} + - else + %strong.label-branch #{@merge_request.source_branch} + %span into + %strong.label-branch #{@merge_request.target_branch} + - if @merge_request.open? + %span.pull-right + .btn-group + %a.btn.dropdown-toggle{ data: {toggle: :dropdown} } + %i.fa.fa-download + Download as + %span.caret + %ul.dropdown-menu + %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch) + %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff) - = render "projects/merge_requests/show/how_to_merge" - = render "projects/merge_requests/show/state_widget" + = render "projects/merge_requests/show/how_to_merge" + = render "projects/merge_requests/show/state_widget" - if @commits.present? %ul.nav.nav-tabs.merge-request-tabs -- cgit v1.2.1 From ff492307b9fb0cd0f016a358cbf1228392f764d1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 17 Feb 2015 16:27:40 -0800 Subject: Dont show gitlab.com import for gitlab.com :) --- app/views/projects/new.html.haml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 61f6a66c386..6f5851d61a1 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -52,7 +52,7 @@ %i.fa.fa-github Import projects from GitHub = render 'github_import_modal' - + .project-import.form-group .col-sm-2 .col-sm-10 @@ -60,7 +60,7 @@ = link_to status_import_gitlab_path do %i.fa.fa-heart Import projects from GitLab.com - - else + - elsif request.host != 'gitlab.com' = link_to '#', class: 'how_to_import_link light' do %i.fa.fa-heart Import projects from GitLab.com @@ -99,4 +99,4 @@ e.preventDefault() import_modal = $(this).parent().find(".modal").show() $('.modal-header .close').bind 'click', -> - $(".modal").hide() \ No newline at end of file + $(".modal").hide() -- cgit v1.2.1 From 70edf950fe6baf90bb98c904d9132924e55e50d6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 17 Feb 2015 22:40:00 -0800 Subject: Show contributed projects on user page and stars for it --- app/controllers/users_controller.rb | 3 +++ app/views/explore/projects/_project.html.haml | 8 +++----- app/views/users/_projects.html.haml | 27 +++++++++++++++++++++------ app/views/users/show.html.haml | 4 +--- 4 files changed, 28 insertions(+), 14 deletions(-) (limited to 'app') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 84a04c5ebe6..e4f588c6a60 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -8,6 +8,9 @@ class UsersController < ApplicationController visible_projects = ProjectsFinder.new.execute(current_user) authorized_projects_ids = visible_projects.pluck(:id) + @contributed_projects = Project.where(id: authorized_projects_ids). + in_group_namespace + @projects = @user.personal_projects. where(id: authorized_projects_ids) diff --git a/app/views/explore/projects/_project.html.haml b/app/views/explore/projects/_project.html.haml index ffbddbae4d6..b093ec00c57 100644 --- a/app/views/explore/projects/_project.html.haml +++ b/app/views/explore/projects/_project.html.haml @@ -3,11 +3,9 @@ .project-access-icon = visibility_level_icon(project.visibility_level) = link_to project.name_with_namespace, project - - - if current_page?(starred_explore_projects_path) - %strong.pull-right - %i.fa.fa-star - = pluralize project.star_count, 'star' + %span.pull-right + %i.fa.fa-star + = project.star_count .project-info - if project.description.present? diff --git a/app/views/users/_projects.html.haml b/app/views/users/_projects.html.haml index 1d38f8e8ab8..c925a48f550 100644 --- a/app/views/users/_projects.html.haml +++ b/app/views/users/_projects.html.haml @@ -1,6 +1,21 @@ -.panel.panel-default - .panel-heading Personal projects - %ul.well-list - - projects.each do |project| - %li - = link_to_project project +- if @contributed_projects.present? + .panel.panel-default + .panel-heading Projects contributed to + %ul.well-list + - @contributed_projects.sort_by(&:star_count).reverse.each do |project| + %li + = link_to_project project + %span.pull-right.light + %i.fa.fa-star + = project.star_count + +- if @projects.present? + .panel.panel-default + .panel-heading Personal projects + %ul.well-list + - @projects.sort_by(&:star_count).reverse.each do |project| + %li + = link_to_project project + %span.pull-right.light + %i.fa.fa-star + = project.star_count diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index b05918b019e..5e82d5780cf 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -35,9 +35,7 @@ = render @events .col-md-4 = render 'profile', user: @user - - if @projects.present? - = render 'projects', projects: @projects - + = render 'projects' :coffeescript $ -> -- cgit v1.2.1 From a8a328b1513c0aa442faaf8e8dd6f06f86ac3211 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 00:16:42 -0800 Subject: DB performance improvements to GitLab --- app/controllers/dashboard_controller.rb | 15 +++++++++------ app/controllers/groups_controller.rb | 17 +++++++++++------ app/controllers/projects_controller.rb | 13 ++++++++----- app/controllers/users_controller.rb | 7 ++++--- app/helpers/application_helper.rb | 8 +++++++- app/views/dashboard/_activities.html.haml | 7 +------ app/views/dashboard/_project.html.haml | 2 +- app/views/groups/_projects.html.haml | 2 +- app/views/groups/show.html.haml | 5 +---- app/views/projects/_home_panel.html.haml | 2 +- 10 files changed, 44 insertions(+), 34 deletions(-) (limited to 'app') diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 9e59264e418..ee9dc343337 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -12,11 +12,7 @@ class DashboardController < ApplicationController @groups = current_user.authorized_groups.order_name_asc @has_authorized_projects = @projects.count > 0 @projects_count = @projects.count - @projects = @projects.limit(@projects_limit) - - @events = Event.in_projects(current_user.authorized_projects.pluck(:id)) - @events = @event_filter.apply_filter(@events) - @events = @events.limit(20).offset(params[:offset] || 0) + @projects = @projects.includes(:namespace).limit(@projects_limit) @last_push = current_user.recent_push @@ -24,7 +20,14 @@ class DashboardController < ApplicationController respond_to do |format| format.html - format.json { pager_json("events/_events", @events.count) } + + format.json do + @events = Event.in_projects(current_user.authorized_projects.pluck(:id)) + @events = @event_filter.apply_filter(@events).includes(:target, project: :namespace) + @events = @events.limit(20).offset(params[:offset] || 0) + pager_json("events/_events", @events.count) + end + format.atom { render layout: false } end end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index aad3709090e..7b7531f1426 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -10,11 +10,11 @@ class GroupsController < ApplicationController # Load group projects before_filter :load_projects, except: [:new, :create, :projects, :edit, :update] + before_filter :event_filter, only: :show + before_filter :set_title, only: [:new, :create] layout :determine_layout - before_filter :set_title, only: [:new, :create] - def new @group = Group.new end @@ -32,14 +32,19 @@ class GroupsController < ApplicationController end def show - @events = Event.in_projects(project_ids) - @events = event_filter.apply_filter(@events) - @events = @events.limit(20).offset(params[:offset] || 0) @last_push = current_user.recent_push if current_user + @projects = @projects.includes(:namespace) respond_to do |format| format.html - format.json { pager_json("events/_events", @events.count) } + + format.json do + @events = Event.in_projects(project_ids) + @events = event_filter.apply_filter(@events).includes(:target, project: :namespace) + @events = @events.limit(20).offset(params[:offset] || 0) + pager_json("events/_events", @events.count) + end + format.atom { render layout: false } end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 462ab3d4749..fb58ddd06e7 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -5,9 +5,10 @@ class ProjectsController < ApplicationController # Authorize before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive] + before_filter :set_title, only: [:new, :create] + before_filter :event_filter, only: :show layout 'navless', only: [:new, :create, :fork] - before_filter :set_title, only: [:new, :create] def new @project = Project.new @@ -56,9 +57,6 @@ class ProjectsController < ApplicationController end limit = (params[:limit] || 20).to_i - @events = @project.events.recent - @events = event_filter.apply_filter(@events) - @events = @events.limit(limit).offset(params[:offset] || 0) @show_star = !(current_user && current_user.starred?(@project)) @@ -76,7 +74,12 @@ class ProjectsController < ApplicationController end end - format.json { pager_json('events/_events', @events.count) } + format.json do + @events = @project.events.recent + @events = event_filter.apply_filter(@events).includes(:target, project: :namespace) + @events = @events.limit(limit).offset(params[:offset] || 0) + pager_json('events/_events', @events.count) + end end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index e4f588c6a60..b4de500fcf1 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -9,17 +9,18 @@ class UsersController < ApplicationController authorized_projects_ids = visible_projects.pluck(:id) @contributed_projects = Project.where(id: authorized_projects_ids). - in_group_namespace + in_group_namespace.includes(:namespace) @projects = @user.personal_projects. - where(id: authorized_projects_ids) + where(id: authorized_projects_ids).includes(:namespace) # Collect only groups common for both users @groups = @user.groups & GroupsFinder.new.execute(current_user) # Get user activity feed for projects common for both users @events = @user.recent_events. - where(project_id: authorized_projects_ids).limit(30) + where(project_id: authorized_projects_ids). + includes(:target, project: :namespace).limit(30) @title = @user.name @title_url = user_path(@user) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e45f4650309..f65c5335a62 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -51,7 +51,13 @@ module ApplicationHelper end def project_icon(project_id, options = {}) - project = Project.find_with_namespace(project_id) + project = + if project_id.is_a?(Project) + project = project_id + else + Project.find_with_namespace(project_id) + end + if project.avatar.present? image_tag project.avatar.url, options elsif project.avatar_in_git diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml index fdf96dd6f56..c1fc1602d0a 100644 --- a/app/views/dashboard/_activities.html.haml +++ b/app/views/dashboard/_activities.html.haml @@ -1,9 +1,4 @@ = render "events/event_last_push", event: @last_push = render 'shared/event_filter' - -- if @events.any? - .content_list -- else - .nothing-here-block Projects activity will be displayed here - +.content_list = spinner diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index f0fb2c1881b..fa9179cb249 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,6 +1,6 @@ = link_to project_path(project), class: dom_class(project) do .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar project-avatar s40') + = project_icon(project, alt: '', class: 'avatar project-avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) %span.str-truncated diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index a2f1d28a275..b505760fa8f 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -13,7 +13,7 @@ %li.project-row = link_to project_path(project), class: dom_class(project) do .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s40') + = project_icon(project, alt: '', class: 'avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) %span.str-truncated diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index f2e591c1939..d5af859ee62 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -13,10 +13,7 @@ - if current_user = render "events/event_last_push", event: @last_push = render 'shared/event_filter' - - if @events.any? - .content_list - - else - .nothing-here-block Project activity will be displayed here + .content_list = spinner %aside.side.col-md-4 = render "projects", projects: @projects diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 5697f9ea1af..d8545dd2c85 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -1,7 +1,7 @@ - empty_repo = @project.empty_repo? .project-home-panel{:class => ("empty-project" if empty_repo)} .project-identicon-holder - = project_icon(@project.to_param, alt: '', class: 'avatar project-avatar') + = project_icon(@project, alt: '', class: 'avatar project-avatar') .project-home-row .project-home-desc - if @project.description.present? -- cgit v1.2.1 From a04ac76117aec7262d223f3dd61a97c7ff88f3a7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 00:23:01 -0800 Subject: Fix MR labels css --- app/assets/stylesheets/sections/merge_requests.scss | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 6662a38344a..81cd6d745b6 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -95,14 +95,7 @@ color: #999; .merge-request-labels { - a { - margin-right: 5px; - margin-bottom: 5px; - display: inline-block; - .color-label { - padding: 6px 10px; - } - } + display: inline-block; } } } @@ -192,6 +185,13 @@ } } -.merge-request-show-labels .label { - padding: 6px 10px; +.merge-request-show-labels { + a { + margin-right: 5px; + margin-bottom: 5px; + display: inline-block; + .color-label { + padding: 6px 10px; + } + } } -- cgit v1.2.1 From 15bee7e0ffa2f7eccd700da0238ad7a7e66ddbb0 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 18 Feb 2015 09:40:42 +0100 Subject: Fix Markdown relative links to files with anchors. --- app/helpers/gitlab_markdown_helper.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 800cacdc2c2..ab30f498c01 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -110,7 +110,7 @@ module GitlabMarkdownHelper end def link_to_ignore?(link) - if link =~ /\#\w+/ + if link =~ /\A\#\w+/ # ignore anchors like true else @@ -122,10 +122,11 @@ module GitlabMarkdownHelper ["http://","https://", "ftp://", "mailto:"] end - def rebuild_path(path) - path.gsub!(/(#.*)/, "") + def rebuild_path(file_path) + file_path = file_path.dup + file_path.gsub!(/(#.*)/, "") id = $1 || "" - file_path = relative_file_path(path) + file_path = relative_file_path(file_path) file_path = sanitize_slashes(file_path) [ -- cgit v1.2.1 From 63f11a68c5e9edf36d062bd4f029d81a0861ef82 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 09:38:46 -0800 Subject: Fix event loading with associations --- app/controllers/dashboard_controller.rb | 15 +++++++++++---- app/controllers/groups_controller.rb | 15 +++++++++++---- app/controllers/projects_controller.rb | 2 +- app/controllers/users_controller.rb | 2 +- app/models/event.rb | 1 + 5 files changed, 25 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index ee9dc343337..eca7b39bcdf 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -22,13 +22,14 @@ class DashboardController < ApplicationController format.html format.json do - @events = Event.in_projects(current_user.authorized_projects.pluck(:id)) - @events = @event_filter.apply_filter(@events).includes(:target, project: :namespace) - @events = @events.limit(20).offset(params[:offset] || 0) + load_events pager_json("events/_events", @events.count) end - format.atom { render layout: false } + format.atom do + load_events + render layout: false + end end end @@ -77,4 +78,10 @@ class DashboardController < ApplicationController def load_projects @projects = current_user.authorized_projects.sorted_by_activity.non_archived end + + def load_events + @events = Event.in_projects(current_user.authorized_projects.pluck(:id)) + @events = @event_filter.apply_filter(@events).with_associations + @events = @events.limit(20).offset(params[:offset] || 0) + end end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 7b7531f1426..d011523c94f 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -39,13 +39,14 @@ class GroupsController < ApplicationController format.html format.json do - @events = Event.in_projects(project_ids) - @events = event_filter.apply_filter(@events).includes(:target, project: :namespace) - @events = @events.limit(20).offset(params[:offset] || 0) + load_events pager_json("events/_events", @events.count) end - format.atom { render layout: false } + format.atom do + load_events + render layout: false + end end end @@ -154,4 +155,10 @@ class GroupsController < ApplicationController def group_params params.require(:group).permit(:name, :description, :path, :avatar) end + + def load_events + @events = Event.in_projects(project_ids) + @events = event_filter.apply_filter(@events).with_associations + @events = @events.limit(20).offset(params[:offset] || 0) + end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index fb58ddd06e7..b0fde88babc 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -76,7 +76,7 @@ class ProjectsController < ApplicationController format.json do @events = @project.events.recent - @events = event_filter.apply_filter(@events).includes(:target, project: :namespace) + @events = event_filter.apply_filter(@events).with_associations @events = @events.limit(limit).offset(params[:offset] || 0) pager_json('events/_events', @events.count) end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index b4de500fcf1..8c5605c8b4b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -20,7 +20,7 @@ class UsersController < ApplicationController # Get user activity feed for projects common for both users @events = @user.recent_events. where(project_id: authorized_projects_ids). - includes(:target, project: :namespace).limit(30) + with_associations.limit(30) @title = @user.name @title_url = user_path(@user) diff --git a/app/models/event.rb b/app/models/event.rb index cae7f0be85b..5579ab1dbb0 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -47,6 +47,7 @@ class Event < ActiveRecord::Base scope :recent, -> { order("created_at DESC") } scope :code_push, -> { where(action: PUSHED) } scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent } + scope :with_associations, -> { includes(project: :namespace) } class << self def reset_event_cache_for(target) -- cgit v1.2.1 From 9a5199f00577e759b14e1a2058400105f90e7cf4 Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Wed, 18 Feb 2015 19:06:58 +0100 Subject: Add missing color codes for line anchors, fixes #8628 --- app/assets/stylesheets/highlight/dark.scss | 1 + app/assets/stylesheets/highlight/monokai.scss | 5 +++++ app/assets/stylesheets/highlight/solarized_dark.scss | 5 +++++ app/assets/stylesheets/highlight/solarized_light.scss | 5 +++++ app/assets/stylesheets/highlight/white.scss | 5 +++++ 5 files changed, 21 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/highlight/dark.scss b/app/assets/stylesheets/highlight/dark.scss index 4095d35b05f..fcd4d47bace 100644 --- a/app/assets/stylesheets/highlight/dark.scss +++ b/app/assets/stylesheets/highlight/dark.scss @@ -12,6 +12,7 @@ border-left: 1px solid #666; } + // highlight line via anchor pre.hll { background-color: #fff !important; } diff --git a/app/assets/stylesheets/highlight/monokai.scss b/app/assets/stylesheets/highlight/monokai.scss index 730018e3e28..bcd2e716657 100644 --- a/app/assets/stylesheets/highlight/monokai.scss +++ b/app/assets/stylesheets/highlight/monokai.scss @@ -12,6 +12,11 @@ border-left: 1px solid #555; } + // highlight line via anchor + pre.hll { + background-color: #49483e !important; + } + .hll { background-color: #49483e } .c { color: #75715e } /* Comment */ .err { color: #960050; background-color: #1e0010 } /* Error */ diff --git a/app/assets/stylesheets/highlight/solarized_dark.scss b/app/assets/stylesheets/highlight/solarized_dark.scss index be6904100ec..4a6b759bd2c 100644 --- a/app/assets/stylesheets/highlight/solarized_dark.scss +++ b/app/assets/stylesheets/highlight/solarized_dark.scss @@ -12,6 +12,11 @@ border-left: 1px solid #113b46; } + // highlight line via anchor + pre.hll { + background-color: #073642 !important; + } + /* Solarized Dark For use with Jekyll and Pygments diff --git a/app/assets/stylesheets/highlight/solarized_light.scss b/app/assets/stylesheets/highlight/solarized_light.scss index 55be6e30383..7254f4d7ac1 100644 --- a/app/assets/stylesheets/highlight/solarized_light.scss +++ b/app/assets/stylesheets/highlight/solarized_light.scss @@ -12,6 +12,11 @@ border-left: 1px solid #c5d0d4; } + // highlight line via anchor + pre.hll { + background-color: #eee8d5 !important; + } + /* Solarized Light For use with Jekyll and Pygments diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss index 050a5d241a6..4d6f5dfd91e 100644 --- a/app/assets/stylesheets/highlight/white.scss +++ b/app/assets/stylesheets/highlight/white.scss @@ -12,6 +12,11 @@ border-left: 1px solid #bbb; } + // highlight line via anchor + pre.hll { + background-color: #f8eec7 !important; + } + .hll { background-color: #f8f8f8 } .c { color: #999988; font-style: italic; } .err { color: #a61717; background-color: #e3d2d2; } -- cgit v1.2.1 From 2f0a764d310a8fc6628f560debfa930ef2842297 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 13:28:24 -0800 Subject: Fix user page performance and authorization --- app/controllers/users_controller.rb | 17 ++++++++++------- app/models/user.rb | 11 +++++++++-- 2 files changed, 19 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8c5605c8b4b..4c2fe4c3c8d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -4,11 +4,8 @@ class UsersController < ApplicationController layout :determine_layout def show - # Projects user can view - visible_projects = ProjectsFinder.new.execute(current_user) - authorized_projects_ids = visible_projects.pluck(:id) - - @contributed_projects = Project.where(id: authorized_projects_ids). + @contributed_projects = Project. + where(id: authorized_projects_ids & @user.contributed_projects_ids). in_group_namespace.includes(:namespace) @projects = @user.personal_projects. @@ -32,8 +29,8 @@ class UsersController < ApplicationController end def calendar - visible_projects = ProjectsFinder.new.execute(current_user) - calendar = Gitlab::CommitsCalendar.new(visible_projects, @user) + projects = Project.where(id: authorized_projects_ids & @user.contributed_projects_ids) + calendar = Gitlab::CommitsCalendar.new(projects, @user) @timestamps = calendar.timestamps @starting_year = calendar.starting_year @starting_month = calendar.starting_month @@ -58,4 +55,10 @@ class UsersController < ApplicationController return authenticate_user! end end + + def authorized_projects_ids + # Projects user can view + @authorized_projects_ids ||= + ProjectsFinder.new.execute(current_user).pluck(:id) + end end diff --git a/app/models/user.rb b/app/models/user.rb index 2ffcd1478d8..ed9a0168747 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -255,7 +255,7 @@ class User < ActiveRecord::Base counter = 0 base = username while User.by_login(username).present? || Namespace.by_path(username).present? - counter += 1 + counter += 1 username = "#{base}#{counter}" end @@ -459,7 +459,7 @@ class User < ActiveRecord::Base def set_notification_email if self.notification_email.blank? || !self.all_emails.include?(self.notification_email) - self.notification_email = self.email + self.notification_email = self.email end end @@ -607,4 +607,11 @@ class User < ActiveRecord::Base def oauth_authorized_tokens Doorkeeper::AccessToken.where(resource_owner_id: self.id, revoked_at: nil) end + + def contributed_projects_ids + Event.where(author_id: self). + reorder(project_id: :desc). + select('DISTINCT(project_id)'). + map(&:project_id) + end end -- cgit v1.2.1 From 155b2d46ae19bebeb9b40794fb9b2e3f6e3ab993 Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Wed, 18 Feb 2015 13:48:57 -0800 Subject: Say unassigned instead of WIP for merge requests since it might not fit everyones workflow. --- app/views/projects/merge_requests/_merge_request.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 5afc87fb6b1..1686ca0e876 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -18,7 +18,7 @@ - if merge_request.assignee assigned to #{link_to_member(merge_request.source_project, merge_request.assignee)} - else - Work In Progress + Unassigned - if merge_request.votes_count > 0 = render 'votes/votes_inline', votable: merge_request - if merge_request.notes.any? -- cgit v1.2.1 From 138aa81e60f18214e0a95a6ffc6ec1ddbc27925a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 14:20:26 -0800 Subject: Get contributed projects only if push event exists --- app/models/user.rb | 1 + app/views/users/calendar.html.haml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index ed9a0168747..ba148f492a4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -610,6 +610,7 @@ class User < ActiveRecord::Base def contributed_projects_ids Event.where(author_id: self). + code_push. reorder(project_id: :desc). select('DISTINCT(project_id)'). map(&:project_id) diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml index 13bdc5ed1e7..1d1c974da24 100644 --- a/app/views/users/calendar.html.haml +++ b/app/views/users/calendar.html.haml @@ -1,4 +1,4 @@ -%h4 Calendar +%h4 Commits calendar #cal-heatmap.calendar :javascript new calendar( -- cgit v1.2.1 From 716544085ce3d100f466103ba5d7c00a771ba6ca Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 15:16:13 -0800 Subject: Get contributed projects for last year only --- app/models/user.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index ba148f492a4..3bbbd23c1bd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -610,6 +610,7 @@ class User < ActiveRecord::Base def contributed_projects_ids Event.where(author_id: self). + where("created_at > ?", Time.now - 1.year). code_push. reorder(project_id: :desc). select('DISTINCT(project_id)'). -- cgit v1.2.1 From 86d5e20664856a0f6635ba184dd85a4f342f8b8f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 16:40:22 -0800 Subject: Respect star ordering on explore page --- app/controllers/explore/projects_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb index d75fd8e72fa..0e5891ae807 100644 --- a/app/controllers/explore/projects_controller.rb +++ b/app/controllers/explore/projects_controller.rb @@ -18,7 +18,7 @@ class Explore::ProjectsController < ApplicationController def starred @starred_projects = ProjectsFinder.new.execute(current_user) - @starred_projects = @starred_projects.order('star_count DESC') + @starred_projects = @starred_projects.reorder('star_count DESC') @starred_projects = @starred_projects.page(params[:page]).per(10) end end -- cgit v1.2.1 From 3c2139ed172c607467ec6cf412d7ed33147bac22 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 18 Feb 2015 22:23:24 -0800 Subject: Fix trending projects ordering --- app/finders/trending_projects_finder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/finders/trending_projects_finder.rb b/app/finders/trending_projects_finder.rb index 32d7968924a..a79bd47d986 100644 --- a/app/finders/trending_projects_finder.rb +++ b/app/finders/trending_projects_finder.rb @@ -8,7 +8,7 @@ class TrendingProjectsFinder # for period of time - ex. month projects.joins(:notes).where('notes.created_at > ?', start_date). select("projects.*, count(notes.id) as ncount"). - group("projects.id").order("ncount DESC") + group("projects.id").reorder("ncount DESC") end private -- cgit v1.2.1 From 7c3147e6e969a7ae97e2f8d05e536abeeb7d3936 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 08:57:33 -0800 Subject: Revert "Nitpicking." This reverts commit ebd39fc082b09177e0777e5de5729c3f98495e87. --- app/controllers/files_controller.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 15523cbc2e7..561af8084c3 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -5,10 +5,9 @@ class FilesController < ApplicationController if uploader.file_storage? if can?(current_user, :read_project, note.project) - # Replace old notes location in /public with the new one in / and send the file - path = uploader.file.path.gsub("#{Rails.root}/public", Rails.root.to_s) - disposition = uploader.image? ? 'inline' : 'attachment' + # Replace old notes location in /public with the new one in / and send the file + path = uploader.file.path.gsub("#{Rails.root}/public",Rails.root.to_s) send_file path, disposition: disposition else not_found! -- cgit v1.2.1 From 8184a6564454faf0f9ae9dfee1377c3407d08447 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 08:57:35 -0800 Subject: Revert "Fix broken access control and refactor avatar upload" This reverts commit 7d5f86f6cbd187e75a6ba164ad6bfd036977dd07. --- app/controllers/files_controller.rb | 4 +--- app/models/group.rb | 2 +- app/models/project.rb | 2 +- app/models/user.rb | 2 +- app/uploaders/attachment_uploader.rb | 8 +++++++- app/uploaders/avatar_uploader.rb | 32 -------------------------------- 6 files changed, 11 insertions(+), 39 deletions(-) delete mode 100644 app/uploaders/avatar_uploader.rb (limited to 'app') diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 561af8084c3..9671245d3f4 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -6,9 +6,7 @@ class FilesController < ApplicationController if uploader.file_storage? if can?(current_user, :read_project, note.project) disposition = uploader.image? ? 'inline' : 'attachment' - # Replace old notes location in /public with the new one in / and send the file - path = uploader.file.path.gsub("#{Rails.root}/public",Rails.root.to_s) - send_file path, disposition: disposition + send_file uploader.file.path, disposition: disposition else not_found! end diff --git a/app/models/group.rb b/app/models/group.rb index da9621a2a1a..d6ec0be6081 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -23,7 +23,7 @@ class Group < Namespace validate :avatar_type, if: ->(user) { user.avatar_changed? } validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - mount_uploader :avatar, AvatarUploader + mount_uploader :avatar, AttachmentUploader after_create :post_create_hook after_destroy :post_destroy_hook diff --git a/app/models/project.rb b/app/models/project.rb index e2c7f76eb09..56e1aa29040 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -138,7 +138,7 @@ class Project < ActiveRecord::Base if: ->(project) { project.avatar && project.avatar_changed? } validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - mount_uploader :avatar, AvatarUploader + mount_uploader :avatar, AttachmentUploader # Scopes scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) } diff --git a/app/models/user.rb b/app/models/user.rb index 3bbbd23c1bd..a9776b633a6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -177,7 +177,7 @@ class User < ActiveRecord::Base end end - mount_uploader :avatar, AvatarUploader + mount_uploader :avatar, AttachmentUploader # Scopes scope :admins, -> { where(admin: true) } diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index 22742d287a4..b122b6c8658 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -3,8 +3,10 @@ class AttachmentUploader < CarrierWave::Uploader::Base storage :file + after :store, :reset_events_cache + def store_dir - "#{Rails.root}/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end def image? @@ -27,4 +29,8 @@ class AttachmentUploader < CarrierWave::Uploader::Base def file_storage? self.class.storage == CarrierWave::Storage::File end + + def reset_events_cache(file) + model.reset_events_cache if model.is_a?(User) + end end diff --git a/app/uploaders/avatar_uploader.rb b/app/uploaders/avatar_uploader.rb deleted file mode 100644 index 7cad044555b..00000000000 --- a/app/uploaders/avatar_uploader.rb +++ /dev/null @@ -1,32 +0,0 @@ -# encoding: utf-8 - -class AvatarUploader < CarrierWave::Uploader::Base - storage :file - - after :store, :reset_events_cache - - def store_dir - "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" - end - - def image? - img_ext = %w(png jpg jpeg gif bmp tiff) - if file.respond_to?(:extension) - img_ext.include?(file.extension.downcase) - else - # Not all CarrierWave storages respond to :extension - ext = file.path.split('.').last.downcase - img_ext.include?(ext) - end - rescue - false - end - - def file_storage? - self.class.storage == CarrierWave::Storage::File - end - - def reset_events_cache(file) - model.reset_events_cache if model.is_a?(User) - end -end -- cgit v1.2.1 From 1d6050104c17d7924d5cce0e6ddb35f5da45a08e Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Thu, 19 Feb 2015 17:16:46 +0100 Subject: Correctly set default projects limit for new users. --- app/models/user.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index 3bbbd23c1bd..13d4eae0044 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -55,14 +55,13 @@ class User < ActiveRecord::Base include Gitlab::ConfigHelper include TokenAuthenticatable extend Gitlab::ConfigHelper - extend Gitlab::CurrentSettings + include Gitlab::CurrentSettings default_value_for :admin, false default_value_for :can_create_group, gitlab_config.default_can_create_group default_value_for :can_create_team, false default_value_for :hide_no_ssh_key, false default_value_for :hide_no_password, false - default_value_for :projects_limit, current_application_settings.default_projects_limit default_value_for :theme_id, gitlab_config.default_theme devise :database_authenticatable, :lockable, :async, @@ -141,6 +140,7 @@ class User < ActiveRecord::Base before_save :ensure_authentication_token after_save :ensure_namespace_correct + after_initialize :set_projects_limit after_create :post_create_hook after_destroy :post_destroy_hook @@ -463,6 +463,13 @@ class User < ActiveRecord::Base end end + def set_projects_limit + connection_default_value_defined = new_record? && !projects_limit_changed? + return unless self.projects_limit.nil? || connection_default_value_defined + + self.projects_limit = current_application_settings.default_projects_limit + end + def requires_ldap_check? if !Gitlab.config.ldap.enabled false -- cgit v1.2.1 From ee26dae63e312e236a6e7f4c79ee1e382c4082a2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 15:02:49 -0800 Subject: Update bootstrap-sass gem --- app/assets/stylesheets/sections/merge_requests.scss | 2 ++ app/views/admin/projects/index.html.haml | 14 ++++++-------- app/views/devise/sessions/_new_base.html.haml | 8 ++++---- app/views/projects/_visibility_level.html.haml | 2 +- .../projects/merge_requests/show/_mr_accept.html.haml | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index 81cd6d745b6..a3eabb5e330 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -24,6 +24,7 @@ .accept-control { display: inline-block; + margin: 0; margin-left: 20px; padding: 10px 0; line-height: 20px; @@ -31,6 +32,7 @@ .remove_source_checkbox { margin: 0; + font-weight: bold; } } } diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 36a4a2fb4af..70121c84b4d 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -13,15 +13,13 @@ .form-group %strong Activity .checkbox - = label_tag :with_push, 'Not empty' - = check_box_tag :with_push, 1, params[:with_push] -   - %span.light Projects with push events + = label_tag :with_push do + = check_box_tag :with_push, 1, params[:with_push] + %span Projects with push events .checkbox - = label_tag :abandoned, 'Abandoned' - = check_box_tag :abandoned, 1, params[:abandoned] -   - %span.light No activity over 6 month + = label_tag :abandoned do + = check_box_tag :abandoned, 1, params[:abandoned] + %span No activity over 6 month %fieldset %strong Visibility level: diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml index ab9085f0ba7..54a39726771 100644 --- a/app/views/devise/sessions/_new_base.html.haml +++ b/app/views/devise/sessions/_new_base.html.haml @@ -2,11 +2,11 @@ = f.text_field :login, class: "form-control top", placeholder: "Username or Email", autofocus: "autofocus" = f.password_field :password, class: "form-control bottom", placeholder: "Password" - if devise_mapping.rememberable? - .remember-me - %label.checkbox.remember_me{for: "user_remember_me"} + .remember-me.checkbox + %label{for: "user_remember_me"} = f.check_box :remember_me %span Remember me - .pull-right - = link_to "Forgot your password?", new_password_path(resource_name) + .pull-right + = link_to "Forgot your password?", new_password_path(resource_name) %div = f.submit "Sign in", class: "btn btn-save" diff --git a/app/views/projects/_visibility_level.html.haml b/app/views/projects/_visibility_level.html.haml index 5f34e66b3ed..42c8e685224 100644 --- a/app/views/projects/_visibility_level.html.haml +++ b/app/views/projects/_visibility_level.html.haml @@ -7,8 +7,8 @@ - Gitlab::VisibilityLevel.values.each do |level| .radio - restricted = restricted_visibility_levels.include?(level) - = f.radio_button :visibility_level, level, checked: (visibility_level == level), disabled: restricted = label :project_visibility_level, level do + = f.radio_button :visibility_level, level, checked: (visibility_level == level), disabled: restricted = visibility_level_icon(level) .option-title = visibility_level_label(level) diff --git a/app/views/projects/merge_requests/show/_mr_accept.html.haml b/app/views/projects/merge_requests/show/_mr_accept.html.haml index f8ee6973637..d58d20a9442 100644 --- a/app/views/projects/merge_requests/show/_mr_accept.html.haml +++ b/app/views/projects/merge_requests/show/_mr_accept.html.haml @@ -17,7 +17,7 @@ .accept-action = f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request" - if can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && !@merge_request.for_fork? - .accept-control + .accept-control.checkbox = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do = check_box_tag :should_remove_source_branch Remove source-branch -- cgit v1.2.1 From 6177256033f045e14161c8672223da84c6db56dc Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 15:46:48 -0800 Subject: Move labels/milestones tabs to side navigation --- app/views/layouts/nav/_project.html.haml | 10 +++++ app/views/projects/_issues_nav.html.haml | 51 ----------------------- app/views/projects/issues/index.html.haml | 25 ++++++++++- app/views/projects/labels/index.html.haml | 2 - app/views/projects/merge_requests/index.html.haml | 9 +++- app/views/projects/milestones/index.html.haml | 1 - app/views/projects/milestones/show.html.haml | 1 - 7 files changed, 42 insertions(+), 57 deletions(-) delete mode 100644 app/views/projects/_issues_nav.html.haml (limited to 'app') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 8d572ddcd10..ecbd821b1b9 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -49,6 +49,11 @@ %span Graphs + = nav_link(controller: :milestones) do + = link_to project_milestones_path(@project), title: 'Milestones' do + %i.fa.fa-clock-o + Milestones + - if project_nav_tab? :issues = nav_link(controller: %w(issues milestones labels)) do = link_to url_for_project_issues, title: 'Issues', class: 'shortcuts-issues' do @@ -66,6 +71,11 @@ Merge Requests %span.count.merge_counter= @project.merge_requests.opened.count + = nav_link(controller: :labels) do + = link_to project_labels_path(@project), title: 'Labels' do + %i.fa.fa-tags + Labels + - if project_nav_tab? :wiki = nav_link(controller: :wikis) do = link_to project_wiki_path(@project, :home), title: 'Wiki', class: 'shortcuts-wiki' do diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml deleted file mode 100644 index f4e3d9a1093..00000000000 --- a/app/views/projects/_issues_nav.html.haml +++ /dev/null @@ -1,51 +0,0 @@ -%ul.nav.nav-tabs - - if project_nav_tab? :issues - = nav_link(controller: :issues) do - = link_to project_issues_path(@project), class: "tab" do - %i.fa.fa-exclamation-circle - Issues - - if project_nav_tab? :merge_requests - = nav_link(controller: :merge_requests) do - = link_to project_merge_requests_path(@project), class: "tab" do - %i.fa.fa-tasks - Merge Requests - = nav_link(controller: :milestones) do - = link_to project_milestones_path(@project), class: "tab" do - %i.fa.fa-clock-o - Milestones - = nav_link(controller: :labels) do - = link_to project_labels_path(@project), class: "tab" do - %i.fa.fa-tags - Labels - - - - if current_controller?(:issues) - - if current_user - %li.hidden-xs - = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do - %i.fa.fa-rss - - %li.pull-right - .pull-right - .pull-left - = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do - .append-right-10.hidden-xs.hidden-sm - = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } - = hidden_field_tag :state, params['state'] - = hidden_field_tag :scope, params['scope'] - = hidden_field_tag :assignee_id, params['assignee_id'] - = hidden_field_tag :milestone_id, params['milestone_id'] - = hidden_field_tag :label_id, params['label_id'] - - - if can? current_user, :write_issue, @project - = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do - %i.fa.fa-plus - New Issue - - - if current_controller?(:merge_requests) - %li.pull-right - .pull-right - - if can? current_user, :write_merge_request, @project - = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do - %i.fa.fa-plus - New Merge Request diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index 0d00d6bfded..669ba224177 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -1,4 +1,27 @@ -= render "projects/issues_nav" +%h3.page-title + Issues + - if current_user + .hidden-xs.inline + = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do + %small + %i.fa.fa-rss + .pull-right + .pull-left + = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do + .append-right-10.hidden-xs.hidden-sm + = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } + = hidden_field_tag :state, params['state'] + = hidden_field_tag :scope, params['scope'] + = hidden_field_tag :assignee_id, params['assignee_id'] + = hidden_field_tag :milestone_id, params['milestone_id'] + = hidden_field_tag :label_id, params['label_id'] + - if can? current_user, :write_issue, @project + = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do + %i.fa.fa-plus + New Issue + + +%hr .issues-holder = render "issues" diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index c7c17c7797e..1ad7bdeffe5 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -1,5 +1,3 @@ -= render "projects/issues_nav" - - if can? current_user, :admin_label, @project = link_to new_project_label_path(@project), class: "pull-right btn btn-new" do New label diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index 2654ea70990..e4ee583c798 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,5 +1,12 @@ -= render "projects/issues_nav" +%h3.page-title + Merge Requests + .pull-right + - if can? current_user, :write_merge_request, @project + = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do + %i.fa.fa-plus + New Merge Request +%hr .merge-requests-holder .append-bottom-10 = render 'shared/issuable_filter' diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 04a1b9243d5..7bad9c98548 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -1,4 +1,3 @@ -= render "projects/issues_nav" .milestones_content %h3.page-title Milestones diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index 031b5a31895..0187c65bc2c 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -1,4 +1,3 @@ -= render "projects/issues_nav" %h4.page-title .issue-box{ class: issue_box_class(@milestone) } - if @milestone.closed? -- cgit v1.2.1 From b876793d031247bed2aa3b31dc9ebb960bef47e0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 15:47:10 -0800 Subject: Restlye issueable filters to be more compact --- app/assets/javascripts/issues.js.coffee | 6 +- app/views/projects/issues/_issues.html.haml | 15 --- app/views/projects/issues/index.html.haml | 25 ++-- app/views/shared/_issuable_filter.html.haml | 193 ++++++++++++++-------------- 4 files changed, 120 insertions(+), 119 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee index 2499ad5ad80..6513f4bcefc 100644 --- a/app/assets/javascripts/issues.js.coffee +++ b/app/assets/javascripts/issues.js.coffee @@ -15,7 +15,7 @@ $(this).html totalIssues + 1 else $(this).html totalIssues - 1 - $("body").on "click", ".issues-filters .dropdown-menu a", -> + $("body").on "click", ".issues-other-filters .dropdown-menu a", -> $('.issues-list').block( message: null, overlayCSS: @@ -77,9 +77,9 @@ ids.push $(value).attr("data-id") $("#update_issues_ids").val ids - $(".issues-filters").hide() + $(".issues-other-filters").hide() $(".issues_bulk_update").show() else $("#update_issues_ids").val [] $(".issues_bulk_update").hide() - $(".issues-filters").show() + $(".issues-other-filters").show() diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 816851a8abe..5d243adb5fe 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -1,18 +1,3 @@ -.append-bottom-10 - .check-all-holder - = check_box_tag "check_all_issues", nil, false, class: "check_all_issues left", disabled: !can?(current_user, :modify_issue, @project) - = render 'shared/issuable_filter' - - .clearfix - .issues_bulk_update.hide - = form_tag bulk_update_project_issues_path(@project), method: :post do - = select_tag('update[status]', options_for_select([['Open', 'open'], ['Closed', 'closed']]), prompt: "Status") - = project_users_select_tag('update[assignee_id]', placeholder: 'Assignee') - = select_tag('update[milestone_id]', bulk_update_milestone_options, prompt: "Milestone") - = hidden_field_tag 'update[issues_ids]', [] - = hidden_field_tag :status, params[:status] - = button_tag "Update issues", class: "btn update_selected_issues btn-save" - .panel.panel-default %ul.well-list.issues-list = render @issues diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index 669ba224177..0d0e3e3c82f 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -1,12 +1,11 @@ -%h3.page-title - Issues - - if current_user - .hidden-xs.inline - = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }) do - %small - %i.fa.fa-rss +.append-bottom-10 .pull-right .pull-left + - if current_user + .hidden-xs.pull-left + = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }), class: 'btn append-right-10' do + %i.fa.fa-rss + = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do .append-right-10.hidden-xs.hidden-sm = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } @@ -21,7 +20,17 @@ %i.fa.fa-plus New Issue + = render 'shared/issuable_filter' + + .clearfix + .issues_bulk_update.hide + = form_tag bulk_update_project_issues_path(@project), method: :post do + = select_tag('update[status]', options_for_select([['Open', 'open'], ['Closed', 'closed']]), prompt: "Status") + = project_users_select_tag('update[assignee_id]', placeholder: 'Assignee') + = select_tag('update[milestone_id]', bulk_update_milestone_options, prompt: "Milestone") + = hidden_field_tag 'update[issues_ids]', [] + = hidden_field_tag :status, params[:status] + = button_tag "Update issues", class: "btn update_selected_issues btn-save" -%hr .issues-holder = render "issues" diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml index cd97481bb6c..707c668dd89 100644 --- a/app/views/shared/_issuable_filter.html.haml +++ b/app/views/shared/_issuable_filter.html.haml @@ -1,6 +1,6 @@ .issues-filters - .pull-left.append-right-20 - %ul.nav.nav-pills.nav-compact + .issues-state-filters + %ul.nav.nav-tabs %li{class: ("active" if params[:state] == 'opened')} = link_to page_filter_path(state: 'opened') do %i.fa.fa-exclamation-circle @@ -14,99 +14,106 @@ %i.fa.fa-compass All - .dropdown.inline.assignee-filter - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-user - %span.light assignee: - - if @assignee.present? - %strong= @assignee.name - - elsif params[:assignee_id] == "0" - Unassigned - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to page_filter_path(assignee_id: nil) do - Any - = link_to page_filter_path(assignee_id: 0) do - Unassigned - - @assignees.sort_by(&:name).each do |user| - %li - = link_to page_filter_path(assignee_id: user.id) do - = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' - = user.name - - .dropdown.inline.prepend-left-10.author-filter - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-user - %span.light author: - - if @author.present? - %strong= @author.name - - elsif params[:author_id] == "0" - Unassigned - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to page_filter_path(author_id: nil) do - Any - = link_to page_filter_path(author_id: 0) do - Unassigned - - @authors.sort_by(&:name).each do |user| - %li - = link_to page_filter_path(author_id: user.id) do - = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' - = user.name - - .dropdown.inline.prepend-left-10.milestone-filter - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-clock-o - %span.light milestone: - - if @milestone.present? - %strong= @milestone.title - - elsif params[:milestone_id] == "0" - None (backlog) - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to page_filter_path(milestone_id: nil) do - Any - = link_to page_filter_path(milestone_id: 0) do - None (backlog) - - @milestones.each do |milestone| - %li - = link_to page_filter_path(milestone_id: milestone.id) do - %strong= milestone.title - %small.light= milestone.expires_at + %div + - if controller.controller_name == 'issues' + .check-all-holder + = check_box_tag "check_all_issues", nil, false, + class: "check_all_issues left", + disabled: !can?(current_user, :modify_issue, @project) + .issues-other-filters + .dropdown.inline.assignee-filter + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-user + %span.light assignee: + - if @assignee.present? + %strong= @assignee.name + - elsif params[:assignee_id] == "0" + Unassigned + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to page_filter_path(assignee_id: nil) do + Any + = link_to page_filter_path(assignee_id: 0) do + Unassigned + - @assignees.sort_by(&:name).each do |user| + %li + = link_to page_filter_path(assignee_id: user.id) do + = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' + = user.name - - if @project - .dropdown.inline.prepend-left-10.labels-filter - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-tags - %span.light label: - - if params[:label_name].present? - %strong= params[:label_name] - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to page_filter_path(label_name: nil) do + .dropdown.inline.prepend-left-10.author-filter + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-user + %span.light author: + - if @author.present? + %strong= @author.name + - elsif params[:author_id] == "0" + Unassigned + - else Any - - if @project.labels.any? - - @project.labels.each do |label| + %b.caret + %ul.dropdown-menu + %li + = link_to page_filter_path(author_id: nil) do + Any + = link_to page_filter_path(author_id: 0) do + Unassigned + - @authors.sort_by(&:name).each do |user| %li - = link_to page_filter_path(label_name: label.name) do - = render_colored_label(label) - - else + = link_to page_filter_path(author_id: user.id) do + = image_tag avatar_icon(user.email), class: "avatar s16", alt: '' + = user.name + + .dropdown.inline.prepend-left-10.milestone-filter + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-clock-o + %span.light milestone: + - if @milestone.present? + %strong= @milestone.title + - elsif params[:milestone_id] == "0" + None (backlog) + - else + Any + %b.caret + %ul.dropdown-menu %li - = link_to generate_project_labels_path(@project, redirect: request.original_url), method: :post do - %i.fa.fa-plus-circle - Create default labels + = link_to page_filter_path(milestone_id: nil) do + Any + = link_to page_filter_path(milestone_id: 0) do + None (backlog) + - @milestones.each do |milestone| + %li + = link_to page_filter_path(milestone_id: milestone.id) do + %strong= milestone.title + %small.light= milestone.expires_at + + - if @project + .dropdown.inline.prepend-left-10.labels-filter + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %i.fa.fa-tags + %span.light label: + - if params[:label_name].present? + %strong= params[:label_name] + - else + Any + %b.caret + %ul.dropdown-menu + %li + = link_to page_filter_path(label_name: nil) do + Any + - if @project.labels.any? + - @project.labels.each do |label| + %li + = link_to page_filter_path(label_name: label.name) do + = render_colored_label(label) + - else + %li + = link_to generate_project_labels_path(@project, redirect: request.original_url), method: :post do + %i.fa.fa-plus-circle + Create default labels - .pull-right - = render 'shared/sort_dropdown' + .pull-right + = render 'shared/sort_dropdown' -- cgit v1.2.1 From 4511bc1f3d7b28a01a0d35d69eea14b80f6bf91f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 15:56:23 -0800 Subject: Prettify milestones page --- app/views/projects/merge_requests/index.html.haml | 14 +++++--------- app/views/projects/milestones/index.html.haml | 13 +++++-------- app/views/shared/_milestones_filter.html.haml | 2 +- 3 files changed, 11 insertions(+), 18 deletions(-) (limited to 'app') diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index e4ee583c798..35e85156951 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,14 +1,10 @@ -%h3.page-title - Merge Requests - .pull-right - - if can? current_user, :write_merge_request, @project - = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do - %i.fa.fa-plus - New Merge Request - -%hr .merge-requests-holder .append-bottom-10 + .pull-right + - if can? current_user, :write_merge_request, @project + = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do + %i.fa.fa-plus + New Merge Request = render 'shared/issuable_filter' .panel.panel-default %ul.well-list.mr-list diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 7bad9c98548..6060f1bf860 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -1,11 +1,8 @@ -.milestones_content - %h3.page-title - Milestones - - if can? current_user, :admin_milestone, @project - = link_to new_project_milestone_path(@project), class: "pull-right btn btn-new", title: "New Milestone" do - %i.fa.fa-plus - New Milestone - +.pull-right + - if can? current_user, :admin_milestone, @project + = link_to new_project_milestone_path(@project), class: "pull-right btn btn-new", title: "New Milestone" do + %i.fa.fa-plus + New Milestone = render 'shared/milestones_filter' .milestones diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml index 208f1b77372..f685ae7726c 100644 --- a/app/views/shared/_milestones_filter.html.haml +++ b/app/views/shared/_milestones_filter.html.haml @@ -1,5 +1,5 @@ .milestones-filters.append-bottom-10 - %ul.nav.nav-pills.nav-compact + %ul.nav.nav-tabs %li{class: ("active" if params[:state].blank? || params[:state] == 'opened')} = link_to milestones_filter_path(state: 'opened') do %i.fa.fa-exclamation-circle -- cgit v1.2.1 From 78aa1bb4e2aa355c8567ab660756a1bfc884df36 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 16:16:41 -0800 Subject: Fix tab highlighting --- app/views/layouts/nav/_project.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index ecbd821b1b9..6fbaeb45e32 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -55,7 +55,7 @@ Milestones - if project_nav_tab? :issues - = nav_link(controller: %w(issues milestones labels)) do + = nav_link(controller: :issues) do = link_to url_for_project_issues, title: 'Issues', class: 'shortcuts-issues' do %i.fa.fa-exclamation-circle %span -- cgit v1.2.1 From ad67bf51d2c9c0a3d3061346336cd85f482931b5 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 16:24:59 -0800 Subject: Fix collapsing of milestones and labels items --- app/views/layouts/nav/_project.html.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 6fbaeb45e32..caf319899f8 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -52,7 +52,8 @@ = nav_link(controller: :milestones) do = link_to project_milestones_path(@project), title: 'Milestones' do %i.fa.fa-clock-o - Milestones + %span + Milestones - if project_nav_tab? :issues = nav_link(controller: :issues) do @@ -74,7 +75,8 @@ = nav_link(controller: :labels) do = link_to project_labels_path(@project), title: 'Labels' do %i.fa.fa-tags - Labels + %span + Labels - if project_nav_tab? :wiki = nav_link(controller: :wikis) do -- cgit v1.2.1 From c2623d2e203914840a5a9173b7e12aa77597d869 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 16:27:20 -0800 Subject: Sidebar items should be same height for collapsed and expanded version --- app/assets/stylesheets/sections/nav_sidebar.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 9c7d1a03a03..e9b97c5ea3e 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -65,7 +65,7 @@ color: #555; display: block; text-decoration: none; - padding: 6px 15px; + padding: 8px 15px; font-size: 13px; line-height: 20px; text-shadow: 0 1px 2px #FFF; @@ -133,7 +133,7 @@ li a { padding-left: 18px; font-size: 14px; - padding: 10px 15px; + padding: 8px 15px; text-align: center; & > span { -- cgit v1.2.1 From 00ac564423249c5be50e44d44ef822b4b686a931 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 16:46:19 -0800 Subject: Improve sidebar active state --- app/assets/stylesheets/sections/nav_sidebar.scss | 7 +++++-- app/views/layouts/nav/_project.html.haml | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index e9b97c5ea3e..de97be30b7d 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -40,9 +40,12 @@ .nav-sidebar li { &.active a { - color: #111; - background: #EEE; + color: #333; + background: #FFF; font-weight: bold; + border: 1px solid #EEE; + border-right: 1px solid transparent; + border-left: 3px solid $style_color; &.no-highlight { background: none; diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index caf319899f8..96d156e00d6 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -6,7 +6,7 @@ %span Back to project - = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do + = nav_link(html_options: {class: "separate-item"}) do = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do %i.fa.fa-cogs %span -- cgit v1.2.1 From 6a6a33452288542aa93354f6ce5a7720721e0688 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 17:24:34 -0800 Subject: Fix active tab tests --- app/assets/stylesheets/sections/nav_sidebar.scss | 1 + app/views/layouts/nav/_project.html.haml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index de97be30b7d..3ef2a578b7f 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -49,6 +49,7 @@ &.no-highlight { background: none; + border: none; } i { diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 96d156e00d6..caf319899f8 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -6,7 +6,7 @@ %span Back to project - = nav_link(html_options: {class: "separate-item"}) do + = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do %i.fa.fa-cogs %span -- cgit v1.2.1 From ee6c4a2cca65d56c01156950d62dfb2f01839cb9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 18:23:10 -0800 Subject: Improve commits UI --- app/assets/stylesheets/sections/commits.scss | 21 ++++++++++++++++++--- app/views/projects/commits/_commit.html.haml | 7 ++++--- app/views/projects/commits/_commits.html.haml | 9 +++++---- 3 files changed, 27 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index 2e274d06c12..f6723eb308f 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -136,10 +136,13 @@ /** * COMMIT ROW */ -li.commit { +ul li.commit { + padding: 8px 0; + .commit-row-title { font-size: $list-font-size; - margin-bottom: 2px; + line-height: 20px; + margin-bottom: 5px; .notes_count { float: right; @@ -199,7 +202,7 @@ li.commit { } .committed_ago { - float: right; + display: inline-block; } } @@ -245,3 +248,15 @@ li.commit { z-index: 2; } } + +.commits-row { + ul { + margin: 0; + } + + .commits-row-date { + font-size: 15px; + line-height: 20px; + margin-bottom: 5px; + } +} diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 1eb17f760dc..1bf1ada1680 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -1,8 +1,6 @@ %li.commit.js-toggle-container .commit-row-title - = link_to commit.short_id, project_commit_path(project, commit), class: "commit_short_id" -   - %span.str-truncated + %strong.str-truncated = link_to_gfm commit.title, project_commit_path(project, commit.id), class: "commit-row-message" - if commit.description? %a.text-expander.js-toggle-button ... @@ -27,5 +25,8 @@ .commit-row-info = commit_author_link(commit, avatar: true, size: 16) + authored .committed_ago #{time_ago_with_tooltip(commit.committed_date)}   + .pull-right + = link_to commit.short_id, project_commit_path(project, commit), class: "commit_short_id" diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml index 2d0ca671fa0..0cd9ce1f371 100644 --- a/app/views/projects/commits/_commits.html.haml +++ b/app/views/projects/commits/_commits.html.haml @@ -3,12 +3,13 @@ - @commits.group_by { |c| c.committed_date.to_date }.sort.reverse.each do |day, commits| .row.commits-row - .col-md-2 - %h4 + .col-md-2.hidden-xs.hidden-sm + %h5.commits-row-date %i.fa.fa-calendar %span= day.stamp("28 Aug, 2010") - %p= pluralize(commits.count, 'commit') - .col-md-10 + .light + = pluralize(commits.count, 'commit') + .col-md-10.col-sm-12 %ul.bordered-list = render commits, project: project %hr.lists-separator -- cgit v1.2.1 From 83e2a1ca12372279cf7948b4d4b3e8a11c50e428 Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Thu, 19 Feb 2015 21:07:54 -0700 Subject: Update path helper references Use the path helpers for nested project resources, for Rails 4.1.9 compatibility. --- app/views/layouts/nav/_project.html.haml | 4 ++-- app/views/projects/issues/index.html.haml | 8 ++++---- app/views/projects/merge_requests/index.html.haml | 2 +- app/views/projects/merge_requests/show/_diffs.html.haml | 2 +- .../projects/merge_requests/show/_remove_source_branch.html.haml | 2 +- app/views/search/results/_snippet_title.html.haml | 2 +- app/views/snippets/_snippet.html.haml | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 67e2721bb4a..4d859e817ac 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -50,7 +50,7 @@ Graphs = nav_link(controller: :milestones) do - = link_to project_milestones_path(@project), title: 'Milestones' do + = link_to namespace_project_milestones_path(@project.namespace, @project), title: 'Milestones' do %i.fa.fa-clock-o %span Milestones @@ -73,7 +73,7 @@ %span.count.merge_counter= @project.merge_requests.opened.count = nav_link(controller: :labels) do - = link_to project_labels_path(@project), title: 'Labels' do + = link_to namespace_project_labels_path(@project.namespace, @project), title: 'Labels' do %i.fa.fa-tags %span Labels diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index 0d0e3e3c82f..7defc8787a9 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -3,10 +3,10 @@ .pull-left - if current_user .hidden-xs.pull-left - = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }), class: 'btn append-right-10' do + = link_to namespace_project_issues_path(@project.namespace, @project, :atom, { private_token: current_user.private_token }), class: 'btn append-right-10' do %i.fa.fa-rss - = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do + = form_tag namespace_project_issues_path(@project.namespace, @project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do .append-right-10.hidden-xs.hidden-sm = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } = hidden_field_tag :state, params['state'] @@ -16,7 +16,7 @@ = hidden_field_tag :label_id, params['label_id'] - if can? current_user, :write_issue, @project - = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do + = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do %i.fa.fa-plus New Issue @@ -24,7 +24,7 @@ .clearfix .issues_bulk_update.hide - = form_tag bulk_update_project_issues_path(@project), method: :post do + = form_tag bulk_update_namespace_project_issues_path(@project.namespace, @project), method: :post do = select_tag('update[status]', options_for_select([['Open', 'open'], ['Closed', 'closed']]), prompt: "Status") = project_users_select_tag('update[assignee_id]', placeholder: 'Assignee') = select_tag('update[milestone_id]', bulk_update_milestone_options, prompt: "Milestone") diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index 35e85156951..e3b9a28033b 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -2,7 +2,7 @@ .append-bottom-10 .pull-right - if can? current_user, :write_merge_request, @project - = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do + = link_to new_namespace_project_merge_request_path(@project.namespace, @project), class: "btn btn-new pull-left", title: "New Merge Request" do %i.fa.fa-plus New Merge Request = render 'shared/issuable_filter' diff --git a/app/views/projects/merge_requests/show/_diffs.html.haml b/app/views/projects/merge_requests/show/_diffs.html.haml index d361c5f579a..eb1640891e6 100644 --- a/app/views/projects/merge_requests/show/_diffs.html.haml +++ b/app/views/projects/merge_requests/show/_diffs.html.haml @@ -8,5 +8,5 @@ Changes view for this comparison is extremely large. %p You can - = link_to "download it", project_merge_request_path(@merge_request.target_project, @merge_request, format: :diff), class: "vlink" + = link_to "download it", namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, format: :diff), class: "vlink" instead. diff --git a/app/views/projects/merge_requests/show/_remove_source_branch.html.haml b/app/views/projects/merge_requests/show/_remove_source_branch.html.haml index 9bf6a9d081c..0a642b7e6d0 100644 --- a/app/views/projects/merge_requests/show/_remove_source_branch.html.haml +++ b/app/views/projects/merge_requests/show/_remove_source_branch.html.haml @@ -4,7 +4,7 @@ - elsif can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && @merge_request.merged? .remove_source_branch_widget %p Changes merged into #{@merge_request.target_branch}. You can remove source branch now - = link_to project_branch_path(@merge_request.source_project, @source_branch), remote: true, method: :delete, class: "btn btn-primary btn-small remove_source_branch" do + = link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @source_branch), remote: true, method: :delete, class: "btn btn-primary btn-small remove_source_branch" do %i.fa.fa-times Remove Source Branch diff --git a/app/views/search/results/_snippet_title.html.haml b/app/views/search/results/_snippet_title.html.haml index f7e5ee5e20e..c414acb6a11 100644 --- a/app/views/search/results/_snippet_title.html.haml +++ b/app/views/search/results/_snippet_title.html.haml @@ -11,7 +11,7 @@ %small.pull-right.cgray - if snippet_title.project_id? - = link_to snippet_title.project.name_with_namespace, project_path(snippet_title.project) + = link_to snippet_title.project.name_with_namespace, namespace_project_path(snippet_title.project.namespace, snippet_title.project) .snippet-info = "##{snippet_title.id}" diff --git a/app/views/snippets/_snippet.html.haml b/app/views/snippets/_snippet.html.haml index c584dd8dfb6..5bb28664349 100644 --- a/app/views/snippets/_snippet.html.haml +++ b/app/views/snippets/_snippet.html.haml @@ -11,7 +11,7 @@ %small.pull-right.cgray - if snippet.project_id? - = link_to snippet.project.name_with_namespace, project_path(snippet.project) + = link_to snippet.project.name_with_namespace, namespace_project_path(snippet.project.namespace, snippet.project) .snippet-info = "##{snippet.id}" -- cgit v1.2.1 From 906f8efd29ad7d4abb95e8e3507d5a6aa700d653 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 20:45:21 -0800 Subject: Refactor commits css --- app/assets/stylesheets/sections/commit.scss | 131 ++++++++++++ app/assets/stylesheets/sections/commits.scss | 302 +++++++-------------------- app/views/projects/commits/_commit.html.haml | 2 +- 3 files changed, 212 insertions(+), 223 deletions(-) create mode 100644 app/assets/stylesheets/sections/commit.scss (limited to 'app') diff --git a/app/assets/stylesheets/sections/commit.scss b/app/assets/stylesheets/sections/commit.scss new file mode 100644 index 00000000000..0e2d9571a45 --- /dev/null +++ b/app/assets/stylesheets/sections/commit.scss @@ -0,0 +1,131 @@ +.commit-title{ + display: block; +} + +.commit-title{ + margin-bottom: 10px; +} + +.commit-author, .commit-committer{ + display: block; + color: #999; + font-weight: normal; + font-style: italic; +} + +.commit-author strong, .commit-committer strong{ + font-weight: bold; + font-style: normal; +} + +.commit-description { + background: none; + border: none; + margin: 0; + padding: 0; + margin-top: 10px; +} + +.commit-stat-summary { + color: #666; + font-size: 14px; + font-weight: normal; + padding: 10px 0; +} + +.commit-info-row { + margin-bottom: 10px; + .avatar { + @extend .avatar-inline; + } + .commit-committer-link, + .commit-author-link { + color: #444; + font-weight: bold; + } +} + +.commit-committer-link, +.commit-author-link { + font-size: 13px; + color: #555; + &:hover { + color: #999; + } +} + +.commit-box { + margin: 10px 0; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + padding: 20px 0; + + .commit-title { + margin: 0; + } + + .commit-description { + margin-top: 15px; + } +} + +.file-stats a { + color: $style_color; +} + +.file-stats { + .new-file { + a { + color: #090; + } + i { + color: #1BCF00; + } + } + .renamed-file { + i { + color: #FE9300; + } + } + .deleted-file { + a { + color: #B00; + } + i { + color: #EE0000; + } + } + .edit-file{ + i{ + color: #555; + } + } +} + +/* + * Commit message textarea for web editor and + * custom merge request message + */ +.commit-message-container { + background-color: $body-bg; + position: relative; + font-family: $monospace_font; + $left: 12px; + .max-width-marker { + width: 72ch; + color: rgba(0, 0, 0, 0.0); + font-family: inherit; + left: $left; + height: 100%; + border-right: 1px solid mix($input-border, white); + position: absolute; + z-index: 1; + } + > textarea { + background-color: rgba(0, 0, 0, 0.0); + font-family: inherit; + padding-left: $left; + position: relative; + z-index: 2; + } +} diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index f6723eb308f..fa5a3b09693 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -1,77 +1,3 @@ -/** - * Commit file - */ -.commit-committer-link, -.commit-author-link { - font-size: 13px; - color: #555; - &:hover { - color: #999; - } -} - -/** COMMIT BLOCK **/ -.commit-title{ - display: block; -} -.commit-title{ - margin-bottom: 10px; -} -.commit-author, .commit-committer{ - display: block; - color: #999; - font-weight: normal; - font-style: italic; -} -.commit-author strong, .commit-committer strong{ - font-weight: bold; - font-style: normal; -} - - -.file-stats a { - color: $style_color; -} - -.file-stats { - .new-file { - a { - color: #090; - } - i { - color: #1BCF00; - } - } - .renamed-file { - i { - color: #FE9300; - } - } - .deleted-file { - a { - color: #B00; - } - i { - color: #EE0000; - } - } - .edit-file{ - i{ - color: #555; - } - } -} - -.label_commit { - @include border-radius(4px); - padding: 2px 4px; - font-size: 13px; - background: #474D57; - color: #fff; - font-family: $monospace_font; -} - - .commits-compare-switch{ background: image-url("switch_icon.png") no-repeat center center; width: 32px; @@ -85,136 +11,104 @@ background-color: #EEE; } -.commit-description { - background: none; - border: none; - margin: 0; - padding: 0; - margin-top: 10px; -} - -.commit-box { - margin: 10px 0; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding: 20px 0; - - .commit-title { - margin: 0; - } - - .commit-description { - margin-top: 15px; - } -} - - -.commit-stat-summary { - color: #666; - font-size: 14px; - font-weight: normal; - padding: 10px 0; -} - -.commit-info-row { - margin-bottom: 10px; - .avatar { - @extend .avatar-inline; - } - .commit-committer-link, - .commit-author-link { - color: #444; - font-weight: bold; - } -} .lists-separator { margin: 10px 0; border-top: 1px dashed #CCC; } -/** - * COMMIT ROW - */ -ul li.commit { - padding: 8px 0; - - .commit-row-title { - font-size: $list-font-size; - line-height: 20px; - margin-bottom: 5px; - - .notes_count { - float: right; - margin-right: 10px; - } - - .commit_short_id { - min-width: 65px; - font-family: $monospace_font; - } - - .str-truncated { - max-width: 70%; - } +.commits-row { + ul { + margin: 0; - .commit-row-message { - color: #333; - &:hover { - color: #444; - text-decoration: underline; + li.commit { + padding: 8px 0; + + .commit-row-title { + font-size: $list-font-size; + line-height: 20px; + margin-bottom: 2px; + + .notes_count { + float: right; + margin-right: 10px; + } + + .commit_short_id { + min-width: 65px; + font-family: $monospace_font; + } + + .str-truncated { + max-width: 70%; + } + + .commit-row-message { + color: #333; + &:hover { + color: #444; + text-decoration: underline; + } + } + + .text-expander { + background: #eee; + color: #555; + padding: 0 5px; + cursor: pointer; + margin-left: 4px; + &:hover { + background-color: #ddd; + } + } } - } - .text-expander { - background: #eee; - color: #555; - padding: 0 5px; - cursor: pointer; - margin-left: 4px; - &:hover { - background-color: #ddd; + .commit-row-description { + font-size: 14px; + border-left: 1px solid #EEE; + padding: 10px 15px; + margin: 5px 0 10px 5px; + background: #f9f9f9; + display: none; + + pre { + border: none; + background: inherit; + padding: 0; + margin: 0; + } } - } - } - .commit-row-description { - font-size: 14px; - border-left: 1px solid #EEE; - padding: 10px 15px; - margin: 5px 0 10px 5px; - background: #f9f9f9; - display: none; + .commit-row-info { + color: #777; + line-height: 24px; - pre { - border: none; - background: inherit; - padding: 0; - margin: 0; - } - } + a { + color: #777; + } - .commit-row-info { - color: #777; + .committed_ago { + display: inline-block; + } + } - a { - color: #777; - } + &.inline-commit { + .commit-row-title { + font-size: 13px; + } - .committed_ago { - display: inline-block; + .committed_ago { + float: right; + @extend .cgray; + } + } } } - &.inline-commit { - .commit-row-title { - font-size: 13px; - } - - .committed_ago { - float: right; - @extend .cgray; - } + .commits-row-date { + font-size: 15px; + line-height: 20px; + margin-bottom: 5px; } } @@ -224,39 +118,3 @@ ul li.commit { padding: 4px 12px; } } - -.commit-message-container { - background-color: $body-bg; - position: relative; - font-family: $monospace_font; - $left: 12px; - .max-width-marker { - width: 72ch; - color: rgba(0, 0, 0, 0.0); - font-family: inherit; - left: $left; - height: 100%; - border-right: 1px solid mix($input-border, white); - position: absolute; - z-index: 1; - } - > textarea { - background-color: rgba(0, 0, 0, 0.0); - font-family: inherit; - padding-left: $left; - position: relative; - z-index: 2; - } -} - -.commits-row { - ul { - margin: 0; - } - - .commits-row-date { - font-size: 15px; - line-height: 20px; - margin-bottom: 5px; - } -} diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 1bf1ada1680..64f528f482e 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -24,7 +24,7 @@ = preserve(gfm(escape_once(commit.description))) .commit-row-info - = commit_author_link(commit, avatar: true, size: 16) + = commit_author_link(commit, avatar: true, size: 24) authored .committed_ago #{time_ago_with_tooltip(commit.committed_date)}   -- cgit v1.2.1 From 692aa78380c4c494ab2367516d68c862f35d7c76 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 21:55:47 -0800 Subject: Improve issue and merge request lists UI --- app/assets/stylesheets/sections/commits.scss | 161 +++++++++++---------- app/assets/stylesheets/sections/issues.scss | 1 + .../stylesheets/sections/merge_requests.scss | 1 + app/views/projects/issues/_issue.html.haml | 16 +- .../merge_requests/_merge_request.html.haml | 39 ++--- 5 files changed, 115 insertions(+), 103 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index fa5a3b09693..20e6011afb2 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -23,85 +23,6 @@ li.commit { padding: 8px 0; - - .commit-row-title { - font-size: $list-font-size; - line-height: 20px; - margin-bottom: 2px; - - .notes_count { - float: right; - margin-right: 10px; - } - - .commit_short_id { - min-width: 65px; - font-family: $monospace_font; - } - - .str-truncated { - max-width: 70%; - } - - .commit-row-message { - color: #333; - &:hover { - color: #444; - text-decoration: underline; - } - } - - .text-expander { - background: #eee; - color: #555; - padding: 0 5px; - cursor: pointer; - margin-left: 4px; - &:hover { - background-color: #ddd; - } - } - } - - .commit-row-description { - font-size: 14px; - border-left: 1px solid #EEE; - padding: 10px 15px; - margin: 5px 0 10px 5px; - background: #f9f9f9; - display: none; - - pre { - border: none; - background: inherit; - padding: 0; - margin: 0; - } - } - - .commit-row-info { - color: #777; - line-height: 24px; - - a { - color: #777; - } - - .committed_ago { - display: inline-block; - } - } - - &.inline-commit { - .commit-row-title { - font-size: 13px; - } - - .committed_ago { - float: right; - @extend .cgray; - } - } } } @@ -114,7 +35,89 @@ .commits-feed-holder { float: right; + .btn { padding: 4px 12px; } } + +li.commit { + .commit-row-title { + font-size: $list-font-size; + line-height: 20px; + margin-bottom: 2px; + + .notes_count { + float: right; + margin-right: 10px; + } + + .commit_short_id { + min-width: 65px; + font-family: $monospace_font; + } + + .str-truncated { + max-width: 70%; + } + + .commit-row-message { + color: #444; + + &:hover { + text-decoration: underline; + } + } + + .text-expander { + background: #eee; + color: #555; + padding: 0 5px; + cursor: pointer; + margin-left: 4px; + &:hover { + background-color: #ddd; + } + } + } + + .commit-row-description { + font-size: 14px; + border-left: 1px solid #EEE; + padding: 10px 15px; + margin: 5px 0 10px 5px; + background: #f9f9f9; + display: none; + + pre { + border: none; + background: inherit; + padding: 0; + margin: 0; + } + } + + .commit-row-info { + color: #777; + line-height: 24px; + + a { + color: #777; + } + + .committed_ago { + display: inline-block; + } + } + + &.inline-commit { + .commit-row-title { + font-size: 13px; + } + + .committed_ago { + float: right; + @extend .cgray; + } + } +} diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index ccfc9b704a6..356e8864389 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -6,6 +6,7 @@ .issue-title { margin-bottom: 5px; font-size: $list-font-size; + font-weight: bold; } .issue-info { diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss index a3eabb5e330..0d2d8b0173e 100644 --- a/app/assets/stylesheets/sections/merge_requests.scss +++ b/app/assets/stylesheets/sections/merge_requests.scss @@ -91,6 +91,7 @@ .merge-request-title { margin-bottom: 5px; font-size: $list-font-size; + font-weight: bold; } .merge-request-info { diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index dc6510be858..240fcc2b527 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -6,9 +6,15 @@ .issue-title %span.str-truncated = link_to_gfm issue.title, project_issue_path(issue.project, issue), class: "row_title" - - if issue.closed? - %small.pull-right - CLOSED + .pull-right + - if issue.closed? + %span + CLOSED + - if issue.notes.any? +   + %span + %i.fa.fa-comments + = issue.notes.count .issue-info %span.light= "##{issue.iid}" @@ -16,10 +22,6 @@ assigned to #{link_to_member(@project, issue.assignee)} - if issue.votes_count > 0 = render 'votes/votes_inline', votable: issue - - if issue.notes.any? - %span - %i.fa.fa-comments - = issue.notes.count - if issue.milestone %span %i.fa.fa-clock-o diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 1686ca0e876..be09f3a938d 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -1,18 +1,26 @@ %li{ class: mr_css_classes(merge_request) } .merge-request-title - = link_to_gfm truncate(merge_request.title, length: 80), project_merge_request_path(merge_request.target_project, merge_request), class: "row_title" - - if merge_request.merged? - %small.pull-right - %i.fa.fa-check - MERGED - - else - %span.pull-right.hidden-xs - - if merge_request.for_fork? - %span.light - #{merge_request.source_project_namespace}: - = truncate merge_request.source_branch, length: 25 - %i.fa.fa-angle-right.light - = merge_request.target_branch + %span.str-truncated + = link_to_gfm merge_request.title, project_merge_request_path(merge_request.target_project, merge_request), class: "row_title" + .pull-right + - if merge_request.merged? + %span + %i.fa.fa-check + MERGED + - elsif merge_request.closed? + %span + %i.fa.fa-close + CLOSED + - else + %span.hidden-xs.hidden-sm + %span.label-branch< + %i.fa.fa-code-fork + %span= merge_request.target_branch + - if merge_request.notes.any? +   + %span + %i.fa.fa-comments + = merge_request.mr_and_commit_notes.count .merge-request-info %span.light= "##{merge_request.iid}" - if merge_request.assignee @@ -21,10 +29,6 @@ Unassigned - if merge_request.votes_count > 0 = render 'votes/votes_inline', votable: merge_request - - if merge_request.notes.any? - %span - %i.fa.fa-comments - = merge_request.mr_and_commit_notes.count - if merge_request.milestone_id? %span %i.fa.fa-clock-o @@ -33,6 +37,7 @@ %span.task-status = merge_request.task_status + .pull-right.hidden-xs %small updated #{time_ago_with_tooltip(merge_request.updated_at, 'bottom', 'merge_request_updated_ago')} -- cgit v1.2.1 From 56af5f5cf9b10246af62c4dc7064fffa516709db Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 22:42:54 -0800 Subject: Improve commits page UI --- app/assets/stylesheets/sections/commits.scss | 2 +- app/views/projects/commits/_commit.html.haml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/commits.scss b/app/assets/stylesheets/sections/commits.scss index 20e6011afb2..683aca73593 100644 --- a/app/assets/stylesheets/sections/commits.scss +++ b/app/assets/stylesheets/sections/commits.scss @@ -14,7 +14,7 @@ .lists-separator { margin: 10px 0; - border-top: 1px dashed #CCC; + border-color: #DDD; } .commits-row { diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 64f528f482e..5774a48d7b8 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -5,7 +5,8 @@ - if commit.description? %a.text-expander.js-toggle-button ... - = link_to_browse_code(project, commit) + .pull-right + = link_to commit.short_id, project_commit_path(project, commit), class: "commit_short_id" .notes_count - if @note_counts @@ -28,5 +29,4 @@ authored .committed_ago #{time_ago_with_tooltip(commit.committed_date)}   - .pull-right - = link_to commit.short_id, project_commit_path(project, commit), class: "commit_short_id" + = link_to_browse_code(project, commit) -- cgit v1.2.1 From 74ccfa8f7979a297f547be70a2e965d5336aec75 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 23:05:40 -0800 Subject: Remove overflow-y style that cause overflow-x strange behaviour on mac --- app/assets/stylesheets/sections/nav_sidebar.scss | 1 - 1 file changed, 1 deletion(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 3ef2a578b7f..5cf82a17663 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -12,7 +12,6 @@ .sidebar-wrapper { z-index: 99; - overflow-y: auto; background: #F5F5F5; } -- cgit v1.2.1 From abc65bbbf3bbabeb1f03b3e55dda32732624cfde Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 19 Feb 2015 23:18:21 -0800 Subject: Improve sidebar navigation UI for mobile devices --- app/assets/stylesheets/sections/nav_sidebar.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 5cf82a17663..17923ca499b 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -40,7 +40,7 @@ .nav-sidebar li { &.active a { color: #333; - background: #FFF; + background: #FFF !important; font-weight: bold; border: 1px solid #EEE; border-right: 1px solid transparent; @@ -77,7 +77,7 @@ &:hover { text-decoration: none; color: #333; - background: #DDD; + background: #EEE; } &:active, &:focus { @@ -125,7 +125,6 @@ .sidebar-wrapper { width: 52px; - overflow-x: hidden; .nav-sidebar { margin-top: 20px; @@ -139,6 +138,7 @@ padding: 8px 15px; text-align: center; + & > span { display: none; } -- cgit v1.2.1 From 50df9a7cb91cdaafe569f473dd24d15ff04312c6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 20 Feb 2015 00:11:25 -0800 Subject: Minor css improvements * lighter color for comments count * better UI for issue assigee.milestone block --- app/assets/stylesheets/sections/issuable.scss | 16 +++++++++++ app/assets/stylesheets/sections/note_form.scss | 2 +- app/views/projects/commits/_commit.html.haml | 5 ++-- app/views/projects/issues/_discussion.html.haml | 6 ++-- app/views/projects/issues/_issue.html.haml | 2 +- app/views/projects/issues/_issue_context.html.haml | 20 ++++++++----- .../projects/merge_requests/_discussion.html.haml | 3 +- .../merge_requests/_merge_request.html.haml | 2 +- .../merge_requests/show/_context.html.haml | 33 +++++++++++++--------- .../merge_requests/show/_participants.html.haml | 2 +- 10 files changed, 59 insertions(+), 32 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/issuable.scss b/app/assets/stylesheets/sections/issuable.scss index 75bd39853bd..d8d12338859 100644 --- a/app/assets/stylesheets/sections/issuable.scss +++ b/app/assets/stylesheets/sections/issuable.scss @@ -23,3 +23,19 @@ } } } + +.issuable-context-title { + font-size: 15px; + line-height: 1.4; + margin-bottom: 5px; + + .avatar { + margin-left: 0; + } + + label { + color: #666; + font-weight: normal; + margin-right: 4px; + } +} diff --git a/app/assets/stylesheets/sections/note_form.scss b/app/assets/stylesheets/sections/note_form.scss index 61a877a5e43..a0522030785 100644 --- a/app/assets/stylesheets/sections/note_form.scss +++ b/app/assets/stylesheets/sections/note_form.scss @@ -169,7 +169,7 @@ color: #999; background: #FFF; padding: 5px; - margin-top: -7px; + margin-top: -11px; border: 1px solid #DDD; font-size: 13px; } diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 5774a48d7b8..e4a22db06d4 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -16,8 +16,9 @@ - note_count = notes.count - if note_count > 0 - %span.label.label-gray - %i.fa.fa-comment= note_count + %span.light + %i.fa.fa-comments + = note_count - if commit.description? .commit-row-description.js-toggle-content diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index 3a278058944..89572c9a735 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -7,8 +7,7 @@ .row .col-md-9 .participants - %cite.cgray - = pluralize(@issue.participants.count, 'participant') + %span= pluralize(@issue.participants.count, 'participant') - @issue.participants.each do |participant| = link_to_member(@project, participant, name: false, size: 24) @@ -20,8 +19,7 @@ = cross_project_reference(@project, @issue) %hr .context - %cite.cgray - = render partial: 'issue_context', locals: { issue: @issue } + = render partial: 'issue_context', locals: { issue: @issue } %hr .clearfix .votes-holder diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 240fcc2b527..225e85515b2 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -6,7 +6,7 @@ .issue-title %span.str-truncated = link_to_gfm issue.title, project_issue_path(issue.project, issue), class: "row_title" - .pull-right + .pull-right.light - if issue.closed? %span CLOSED diff --git a/app/views/projects/issues/_issue_context.html.haml b/app/views/projects/issues/_issue_context.html.haml index 3daa18ba346..1ea1c83b135 100644 --- a/app/views/projects/issues/_issue_context.html.haml +++ b/app/views/projects/issues/_issue_context.html.haml @@ -1,19 +1,25 @@ = form_for [@project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f| %div.prepend-top-20 - %p - Assignee: + .issuable-context-title + %label + Assignee: - if issue.assignee - = link_to_member(@project, @issue.assignee) + %strong= link_to_member(@project, @issue.assignee, size: 24) - else none - if can?(current_user, :modify_issue, @issue) = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id) - %div.prepend-top-20 - %p - Milestone: + %div.prepend-top-20.clearfix + .issuable-context-title + %label + Milestone: - if issue.milestone - #{link_to @issue.milestone.title, project_milestone_path(@project, @issue.milestone)} + %span.back-to-milestone + = link_to project_milestone_path(@project, @issue.milestone) do + %strong + %i.fa.fa-clock-o + = @issue.milestone.title - else none - if can?(current_user, :modify_issue, @issue) diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index 51e65f874c2..ca4ce26c676 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -16,8 +16,7 @@ = cross_project_reference(@project, @merge_request) %hr .context - %cite.cgray - = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } + = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } %hr .votes-holder %h6 Votes diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index be09f3a938d..1c13e8cf31f 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -2,7 +2,7 @@ .merge-request-title %span.str-truncated = link_to_gfm merge_request.title, project_merge_request_path(merge_request.target_project, merge_request), class: "row_title" - .pull-right + .pull-right.light - if merge_request.merged? %span %i.fa.fa-check diff --git a/app/views/projects/merge_requests/show/_context.html.haml b/app/views/projects/merge_requests/show/_context.html.haml index 21718ca2acf..e9e00b756d5 100644 --- a/app/views/projects/merge_requests/show/_context.html.haml +++ b/app/views/projects/merge_requests/show/_context.html.haml @@ -1,23 +1,30 @@ = form_for [@project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f| %div.prepend-top-20 - %p - Assignee: + .issuable-context-title + %label + Assignee: - if @merge_request.assignee - = link_to_member(@project, @merge_request.assignee) + %strong= link_to_member(@project, @merge_request.assignee, size: 24) - else none - - if can?(current_user, :modify_merge_request, @merge_request) - = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @merge_request.assignee_id) + .issuable-context-selectbox + - if can?(current_user, :modify_merge_request, @merge_request) + = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @merge_request.assignee_id) - %div.prepend-top-20 - %p - Milestone: + %div.prepend-top-20.clearfix + .issuable-context-title + %label + Milestone: - if @merge_request.milestone %span.back-to-milestone - #{link_to @merge_request.milestone.title, project_milestone_path(@project, @merge_request.milestone)} + = link_to project_milestone_path(@project, @merge_request.milestone) do + %strong + %i.fa.fa-clock-o + = @merge_request.milestone.title - else none - - if can?(current_user, :modify_merge_request, @merge_request) - = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) - = hidden_field_tag :merge_request_context - = f.submit class: 'btn' + .issuable-context-selectbox + - if can?(current_user, :modify_merge_request, @merge_request) + = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) + = hidden_field_tag :merge_request_context + = f.submit class: 'btn' diff --git a/app/views/projects/merge_requests/show/_participants.html.haml b/app/views/projects/merge_requests/show/_participants.html.haml index 15a97404cb0..4f34af1737d 100644 --- a/app/views/projects/merge_requests/show/_participants.html.haml +++ b/app/views/projects/merge_requests/show/_participants.html.haml @@ -1,4 +1,4 @@ .participants - %cite.cgray #{@merge_request.participants.count} participants + %span #{@merge_request.participants.count} participants - @merge_request.participants.each do |participant| = link_to_member(@project, participant, name: false, size: 24) -- cgit v1.2.1 From 675f59540687d40357182df2582c92d8c2bedb49 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 20 Feb 2015 00:20:17 -0800 Subject: Bigger and bold title for issue/mr show pages --- app/assets/stylesheets/sections/issues.scss | 4 ++-- app/views/projects/issues/show.html.haml | 2 +- app/views/projects/merge_requests/show/_mr_box.html.haml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index 356e8864389..b909725bff5 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -171,9 +171,9 @@ form.edit-issue { } } -h3.issue-title { +h2.issue-title { margin-top: 0; - font-size: 2em; + font-weight: bold; } .context .select2-container { diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index bf343cbb7af..2fa58c0e0b2 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -26,7 +26,7 @@ Edit %hr - %h3.issue-title + %h2.issue-title = gfm escape_once(@issue.title) %div - if @issue.description.present? diff --git a/app/views/projects/merge_requests/show/_mr_box.html.haml b/app/views/projects/merge_requests/show/_mr_box.html.haml index ab1284547ad..ada9ae58b8f 100644 --- a/app/views/projects/merge_requests/show/_mr_box.html.haml +++ b/app/views/projects/merge_requests/show/_mr_box.html.haml @@ -1,4 +1,4 @@ -%h3.issue-title +%h2.issue-title = gfm escape_once(@merge_request.title) %div -- cgit v1.2.1 From 0632e85c82eeb76c9b61e497655c9cf2ef5dc262 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 10:23:34 +0100 Subject: Fix commit comments on first line of diff not rendering in Merge Request Discussion view. --- app/models/note.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/models/note.rb b/app/models/note.rb index ccd9783e7d4..e6c258ffbe9 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -409,19 +409,19 @@ class Note < ActiveRecord::Base prev_lines = [] diff_lines.each do |line| - if generate_line_code(line) != self.line_code - if line.type == "match" - prev_lines.clear - prev_match_line = line - else - prev_lines.push(line) - prev_lines.shift if prev_lines.length >= max_number_of_lines - end + if line.type == "match" + prev_lines.clear + prev_match_line = line else prev_lines << line - return prev_lines + + break if generate_line_code(line) == self.line_code + + prev_lines.shift if prev_lines.length >= max_number_of_lines end end + + prev_lines end def diff_lines -- cgit v1.2.1 From 00ca490259de684f4240de4f61728b8eaefbb13e Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 13:13:48 +0100 Subject: Use controllers to serve uploads, with XSS prevention and access control. --- app/controllers/projects/uploads_controller.rb | 19 +++++++++++++++++++ app/controllers/uploads_controller.rb | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 app/controllers/projects/uploads_controller.rb create mode 100644 app/controllers/uploads_controller.rb (limited to 'app') diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb new file mode 100644 index 00000000000..b922b56418a --- /dev/null +++ b/app/controllers/projects/uploads_controller.rb @@ -0,0 +1,19 @@ +class Projects::UploadsController < Projects::ApplicationController + layout "project" + + before_filter :project + + def show + path = File.join(project.path_with_namespace, params[:secret]) + uploader = FileUploader.new('uploads', path) + + uploader.retrieve_from_store!(params[:filename]) + + if uploader.file.exists? + # Right now, these are always images, so we can safely render them inline. + send_file uploader.file.path, disposition: 'inline' + else + not_found! + end + end +end \ No newline at end of file diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb new file mode 100644 index 00000000000..d5877977258 --- /dev/null +++ b/app/controllers/uploads_controller.rb @@ -0,0 +1,17 @@ +class UploadsController < ApplicationController + def show + model = params[:model].camelize.constantize.find(params[:id]) + uploader = model.send(params[:mounted_as]) + + if uploader.file_storage? + if !model.respond_to?(:project) || can?(current_user, :read_project, model.project) + disposition = uploader.image? ? 'inline' : 'attachment' + send_file uploader.file.path, disposition: disposition + else + not_found! + end + else + redirect_to uploader.url + end + end +end -- cgit v1.2.1 From e0edea4ae949a006c051768d073737436ba50b2b Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 14:35:29 +0100 Subject: Fix commits calendar vertical days. --- app/assets/javascripts/calendar.js.coffee | 3 --- 1 file changed, 3 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee index 70940e13858..19ea4ccc4cf 100644 --- a/app/assets/javascripts/calendar.js.coffee +++ b/app/assets/javascripts/calendar.js.coffee @@ -16,11 +16,8 @@ class @calendar subDomain: "day" range: 12 tooltip: true - domainDynamicDimension: false - colLimit: 4 label: position: "top" - domainMargin: 1 legend: [ 0 1 -- cgit v1.2.1 From c801df81fb48272b670b7448e3898a98cdb8b742 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 14:39:35 +0100 Subject: Satisfy Rubocop. --- app/controllers/projects/uploads_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb index b922b56418a..2b4da35bc7f 100644 --- a/app/controllers/projects/uploads_controller.rb +++ b/app/controllers/projects/uploads_controller.rb @@ -16,4 +16,4 @@ class Projects::UploadsController < Projects::ApplicationController not_found! end end -end \ No newline at end of file +end -- cgit v1.2.1 From 8830cfaa60806fa637785535b3ca35a8c3b9dcff Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 15:06:06 +0100 Subject: Base new MR title on commit title if there's only one. --- app/services/merge_requests/build_service.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb index 859c3f56b2b..30e0cbae024 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -16,9 +16,6 @@ module MergeRequests return build_failed(merge_request, nil) end - # Generate suggested MR title based on source branch name - merge_request.title = merge_request.source_branch.titleize.humanize - compare_result = CompareService.new.execute( current_user, merge_request.source_project, @@ -52,6 +49,14 @@ module MergeRequests merge_request.compare_failed = false end + commits = merge_request.compare_commits + merge_request.title = \ + if commits && commits.count == 1 + commits.first.title + else + merge_request.source_branch.titleize.humanize + end + merge_request rescue Gitlab::Satellite::BranchesWithoutParent -- cgit v1.2.1 From 4ef6ffaad3e9b7a29b438722e5e101de78521ec7 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 15:19:50 +0100 Subject: Split up AttachmentUploader. --- app/models/group.rb | 2 +- app/models/project.rb | 2 +- app/models/user.rb | 2 +- app/uploaders/attachment_uploader.rb | 10 ---------- app/uploaders/avatar_uploader.rb | 32 ++++++++++++++++++++++++++++++++ app/views/events/event/_note.html.haml | 6 +++--- app/views/projects/notes/_note.html.haml | 6 +++--- 7 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 app/uploaders/avatar_uploader.rb (limited to 'app') diff --git a/app/models/group.rb b/app/models/group.rb index d6ec0be6081..da9621a2a1a 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -23,7 +23,7 @@ class Group < Namespace validate :avatar_type, if: ->(user) { user.avatar_changed? } validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - mount_uploader :avatar, AttachmentUploader + mount_uploader :avatar, AvatarUploader after_create :post_create_hook after_destroy :post_destroy_hook diff --git a/app/models/project.rb b/app/models/project.rb index 56e1aa29040..e2c7f76eb09 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -138,7 +138,7 @@ class Project < ActiveRecord::Base if: ->(project) { project.avatar && project.avatar_changed? } validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - mount_uploader :avatar, AttachmentUploader + mount_uploader :avatar, AvatarUploader # Scopes scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) } diff --git a/app/models/user.rb b/app/models/user.rb index 21ccc76978e..a723b1289b6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -177,7 +177,7 @@ class User < ActiveRecord::Base end end - mount_uploader :avatar, AttachmentUploader + mount_uploader :avatar, AvatarUplaoder # Scopes scope :admins, -> { where(admin: true) } diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index b122b6c8658..a9691bee46e 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -3,8 +3,6 @@ class AttachmentUploader < CarrierWave::Uploader::Base storage :file - after :store, :reset_events_cache - def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end @@ -22,15 +20,7 @@ class AttachmentUploader < CarrierWave::Uploader::Base false end - def secure_url - Gitlab.config.gitlab.relative_url_root + "/files/#{model.class.to_s.underscore}/#{model.id}/#{file.filename}" - end - def file_storage? self.class.storage == CarrierWave::Storage::File end - - def reset_events_cache(file) - model.reset_events_cache if model.is_a?(User) - end end diff --git a/app/uploaders/avatar_uploader.rb b/app/uploaders/avatar_uploader.rb new file mode 100644 index 00000000000..7cad044555b --- /dev/null +++ b/app/uploaders/avatar_uploader.rb @@ -0,0 +1,32 @@ +# encoding: utf-8 + +class AvatarUploader < CarrierWave::Uploader::Base + storage :file + + after :store, :reset_events_cache + + def store_dir + "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + def image? + img_ext = %w(png jpg jpeg gif bmp tiff) + if file.respond_to?(:extension) + img_ext.include?(file.extension.downcase) + else + # Not all CarrierWave storages respond to :extension + ext = file.path.split('.').last.downcase + img_ext.include?(ext) + end + rescue + false + end + + def file_storage? + self.class.storage == CarrierWave::Storage::File + end + + def reset_events_cache(file) + model.reset_events_cache if model.is_a?(User) + end +end diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml index 0acb8538778..4ef18c09060 100644 --- a/app/views/events/event/_note.html.haml +++ b/app/views/events/event/_note.html.haml @@ -18,9 +18,9 @@ - note = event.target - if note.attachment.url - if note.attachment.image? - = link_to note.attachment.secure_url, target: '_blank' do - = image_tag note.attachment.secure_url, class: 'note-image-attach' + = link_to note.attachment.url, target: '_blank' do + = image_tag note.attachment.url, class: 'note-image-attach' - else - = link_to note.attachment.secure_url, target: "_blank", class: 'note-file-attach' do + = link_to note.attachment.url, target: "_blank", class: 'note-file-attach' do %i.fa.fa-paperclip = note.attachment_identifier diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index 88c7b7ccf1a..cfeba00d271 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -57,10 +57,10 @@ - if note.attachment.url .note-attachment - if note.attachment.image? - = link_to note.attachment.secure_url, target: '_blank' do - = image_tag note.attachment.secure_url, class: 'note-image-attach' + = link_to note.attachment.url, target: '_blank' do + = image_tag note.attachment.url, class: 'note-image-attach' .attachment - = link_to note.attachment.secure_url, target: "_blank" do + = link_to note.attachment.url, target: "_blank" do %i.fa.fa-paperclip = note.attachment_identifier = link_to delete_attachment_project_note_path(@project, note), -- cgit v1.2.1 From 7f1adc3d9cdc5c3f1c0fcbf6c72d89b8ee062af5 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 15:56:12 +0100 Subject: Fix URL to uploaded file. --- app/controllers/projects/uploads_controller.rb | 2 +- app/services/projects/upload_service.rb | 3 +-- app/uploaders/file_uploader.rb | 4 ++++ 3 files changed, 6 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb index 53b92d8643d..9020e86c44e 100644 --- a/app/controllers/projects/uploads_controller.rb +++ b/app/controllers/projects/uploads_controller.rb @@ -4,7 +4,7 @@ class Projects::UploadsController < Projects::ApplicationController before_filter :project def create - link_to_file = ::Projects::UploadService.new(repository, params[:file]). + link_to_file = ::Projects::UploadService.new(project, params[:file]). execute respond_to do |format| diff --git a/app/services/projects/upload_service.rb b/app/services/projects/upload_service.rb index b2466b52ad9..a186c97628f 100644 --- a/app/services/projects/upload_service.rb +++ b/app/services/projects/upload_service.rb @@ -1,6 +1,5 @@ module Projects class UploadService < BaseService - include Rails.application.routes.url_helpers def initialize(project, file) @project, @file = project, file end @@ -15,7 +14,7 @@ module Projects { 'alt' => filename, - 'url' => project_upload_url(@project, secret: uploader.secret, filename: uploader.file.filename), + 'url' => uploader.secure_url, 'is_image' => uploader.image? } end diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index 36a28f93c49..f9673abbfe8 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -25,6 +25,10 @@ class FileUploader < CarrierWave::Uploader::Base SecureRandom.hex end + def secure_url + File.join(Gitlab.config.gitlab.url, @project.path_with_namespace, "uploads", @secret, file.filename) + end + def file_storage? self.class.storage == CarrierWave::Storage::File end -- cgit v1.2.1 From 938a1381fc89d39df9c440aad2f95e3b93d80f3b Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 14:39:35 +0100 Subject: Satisfy Rubocop. --- app/controllers/projects/uploads_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb index b922b56418a..2b4da35bc7f 100644 --- a/app/controllers/projects/uploads_controller.rb +++ b/app/controllers/projects/uploads_controller.rb @@ -16,4 +16,4 @@ class Projects::UploadsController < Projects::ApplicationController not_found! end end -end \ No newline at end of file +end -- cgit v1.2.1 From 00408f37e34f37f1299df6957f62bfa7ff341749 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 16:30:15 +0100 Subject: Move 'require_non_empty_project' filter to front so 'assign_ref_vars' doesn't 404. --- app/controllers/projects/blame_controller.rb | 2 +- app/controllers/projects/blob_controller.rb | 2 +- app/controllers/projects/branches_controller.rb | 1 - app/controllers/projects/commit_controller.rb | 2 +- app/controllers/projects/commits_controller.rb | 2 +- app/controllers/projects/compare_controller.rb | 2 +- app/controllers/projects/forks_controller.rb | 2 +- app/controllers/projects/graphs_controller.rb | 2 +- app/controllers/projects/network_controller.rb | 2 +- app/controllers/projects/raw_controller.rb | 2 +- app/controllers/projects/refs_controller.rb | 2 +- app/controllers/projects/repositories_controller.rb | 2 +- app/controllers/projects/tree_controller.rb | 2 +- 13 files changed, 12 insertions(+), 13 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb index 106f21b83e6..489a6ae5666 100644 --- a/app/controllers/projects/blame_controller.rb +++ b/app/controllers/projects/blame_controller.rb @@ -2,9 +2,9 @@ class Projects::BlameController < Projects::ApplicationController include ExtractsPath + before_filter :require_non_empty_project before_filter :assign_ref_vars before_filter :authorize_download_code! - before_filter :require_non_empty_project def show @blob = @repository.blob_at(@commit.id, @path) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index dccb96ba1d1..8071f13173d 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -5,8 +5,8 @@ class Projects::BlobController < Projects::ApplicationController # Raised when given an invalid file path class InvalidPathError < StandardError; end - before_filter :authorize_download_code! before_filter :require_non_empty_project, except: [:new, :create] + before_filter :authorize_download_code! before_filter :authorize_push_code!, only: [:destroy] before_filter :assign_blob_vars before_filter :commit, except: [:new, :create] diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index cff1a907dc2..f7bb36c40bb 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -2,7 +2,6 @@ class Projects::BranchesController < Projects::ApplicationController include ActionView::Helpers::SanitizeHelper # Authorize before_filter :require_non_empty_project - before_filter :authorize_download_code! before_filter :authorize_push_code!, only: [:create, :destroy] diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index 96a782bdf7a..87e39f1363a 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -3,8 +3,8 @@ # Not to be confused with CommitsController, plural. class Projects::CommitController < Projects::ApplicationController # Authorize - before_filter :authorize_download_code! before_filter :require_non_empty_project + before_filter :authorize_download_code! before_filter :commit def show diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb index b133afe44b5..4b6ab437476 100644 --- a/app/controllers/projects/commits_controller.rb +++ b/app/controllers/projects/commits_controller.rb @@ -3,9 +3,9 @@ require "base64" class Projects::CommitsController < Projects::ApplicationController include ExtractsPath + before_filter :require_non_empty_project before_filter :assign_ref_vars before_filter :authorize_download_code! - before_filter :require_non_empty_project def show @repo = @project.repository diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb index ffb8c2e4af1..8a359042d7b 100644 --- a/app/controllers/projects/compare_controller.rb +++ b/app/controllers/projects/compare_controller.rb @@ -1,7 +1,7 @@ class Projects::CompareController < Projects::ApplicationController # Authorize - before_filter :authorize_download_code! before_filter :require_non_empty_project + before_filter :authorize_download_code! def index end diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb index a0481d11582..414da0bbdc9 100644 --- a/app/controllers/projects/forks_controller.rb +++ b/app/controllers/projects/forks_controller.rb @@ -1,7 +1,7 @@ class Projects::ForksController < Projects::ApplicationController # Authorize - before_filter :authorize_download_code! before_filter :require_non_empty_project + before_filter :authorize_download_code! def new @namespaces = current_user.manageable_namespaces diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb index 4a318cb7d56..752474b4a4c 100644 --- a/app/controllers/projects/graphs_controller.rb +++ b/app/controllers/projects/graphs_controller.rb @@ -1,7 +1,7 @@ class Projects::GraphsController < Projects::ApplicationController # Authorize - before_filter :authorize_download_code! before_filter :require_non_empty_project + before_filter :authorize_download_code! def show respond_to do |format| diff --git a/app/controllers/projects/network_controller.rb b/app/controllers/projects/network_controller.rb index 59f2a745367..83d1c1dacae 100644 --- a/app/controllers/projects/network_controller.rb +++ b/app/controllers/projects/network_controller.rb @@ -2,9 +2,9 @@ class Projects::NetworkController < Projects::ApplicationController include ExtractsPath include ApplicationHelper + before_filter :require_non_empty_project before_filter :assign_ref_vars before_filter :authorize_download_code! - before_filter :require_non_empty_project def show respond_to do |format| diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index c4ddc32e8c3..b1a029ce696 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -2,9 +2,9 @@ class Projects::RawController < Projects::ApplicationController include ExtractsPath + before_filter :require_non_empty_project before_filter :assign_ref_vars before_filter :authorize_download_code! - before_filter :require_non_empty_project def show @blob = @repository.blob_at(@commit.id, @path) diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index b80472f8eb4..0adecded17e 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -1,9 +1,9 @@ class Projects::RefsController < Projects::ApplicationController include ExtractsPath + before_filter :require_non_empty_project before_filter :assign_ref_vars before_filter :authorize_download_code! - before_filter :require_non_empty_project def switch respond_to do |format| diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index 3a90c1c806d..320c3965265 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -1,7 +1,7 @@ class Projects::RepositoriesController < Projects::ApplicationController # Authorize - before_filter :authorize_download_code! before_filter :require_non_empty_project, except: :create + before_filter :authorize_download_code! before_filter :authorize_admin_project!, only: :create def create diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb index 5b52640a4e1..70cd5a62ff5 100644 --- a/app/controllers/projects/tree_controller.rb +++ b/app/controllers/projects/tree_controller.rb @@ -2,9 +2,9 @@ class Projects::TreeController < Projects::ApplicationController include ExtractsPath + before_filter :require_non_empty_project, except: [:new, :create] before_filter :assign_ref_vars before_filter :authorize_download_code! - before_filter :require_non_empty_project, except: [:new, :create] def show if tree.entries.empty? -- cgit v1.2.1 From 157b4b4b1f41267375d3b32c9c1606a538eb8488 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Fri, 20 Feb 2015 17:38:41 +0000 Subject: Add gitorious.org importer --- app/controllers/import/gitorious_controller.rb | 43 ++++++++++++++++++++++++++ app/views/import/gitorious/status.html.haml | 41 ++++++++++++++++++++++++ app/views/projects/new.html.haml | 7 +++++ 3 files changed, 91 insertions(+) create mode 100644 app/controllers/import/gitorious_controller.rb create mode 100644 app/views/import/gitorious/status.html.haml (limited to 'app') diff --git a/app/controllers/import/gitorious_controller.rb b/app/controllers/import/gitorious_controller.rb new file mode 100644 index 00000000000..627b4a171b8 --- /dev/null +++ b/app/controllers/import/gitorious_controller.rb @@ -0,0 +1,43 @@ +class Import::GitoriousController < Import::BaseController + + def new + redirect_to client.authorize_url(callback_import_gitorious_url) + end + + def callback + session[:gitorious_repos] = params[:repos] + redirect_to status_import_gitorious_url + end + + def status + @repos = client.repos + + @already_added_projects = current_user.created_projects.where(import_type: "gitorious") + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.to_a.reject! { |repo| already_added_projects_names.include? repo.full_name } + end + + def jobs + jobs = current_user.created_projects.where(import_type: "gitorious").to_json(only: [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id] + repo = client.repo(@repo_id) + @target_namespace = params[:new_namespace].presence || repo.namespace + @project_name = repo.name + + namespace = get_or_create_namespace || (render and return) + + @project = Gitlab::GitoriousImport::ProjectCreator.new(repo, namespace, current_user).execute + end + + private + + def client + @client ||= Gitlab::GitoriousImport::Client.new(session[:gitorious_repos]) + end + +end diff --git a/app/views/import/gitorious/status.html.haml b/app/views/import/gitorious/status.html.haml new file mode 100644 index 00000000000..35ed0a717de --- /dev/null +++ b/app/views/import/gitorious/status.html.haml @@ -0,0 +1,41 @@ +%h3.page-title + %i.fa.fa-gitorious + Import repositories from Gitorious.org + +%p.light + Select projects you want to import. +%hr +%p + = button_tag 'Import all projects', class: "btn btn-success js-import-all" + +%table.table.import-jobs + %thead + %tr + %th From Gitorious + %th To GitLab + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td= project.import_source + %td + %strong= link_to project.path_with_namespace, project + %td.job-status + - if project.import_status == 'finished' + %span.cgreen + %i.fa.fa-check + done + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo.id}"} + %td= repo.full_name + %td.import-target + = repo.full_name + %td.import-actions.job-status + = button_tag "Import", class: "btn js-add-to-import" + +:coffeescript + $ -> + new ImporterStatus("#{jobs_import_gitorious_path}", "#{import_gitorious_path}") diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 6f5851d61a1..33162ded4a6 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -66,6 +66,13 @@ Import projects from GitLab.com = render 'gitlab_import_modal' + .project-import.form-group + .col-sm-2 + .col-sm-10 + = link_to new_import_gitorious_path do + %i.fa.fa-heart + Import projects from Gitorious.org + %hr.prepend-botton-10 .form-group -- cgit v1.2.1 From 2f76ccdfac59f7bb6875e0a7753a390d4f6f2b38 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 22:17:38 +0100 Subject: Base new MR description on commit description if there's only one. --- app/services/merge_requests/build_service.rb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'app') diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb index 30e0cbae024..a44b91166e8 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -50,12 +50,13 @@ module MergeRequests end commits = merge_request.compare_commits - merge_request.title = \ - if commits && commits.count == 1 - commits.first.title - else - merge_request.source_branch.titleize.humanize - end + if commits && commits.count == 1 + commit = commits.first + merge_request.title = commit.title + merge_request.description = commit.description.try(:strip) + else + merge_request.title = merge_request.source_branch.titleize.humanize + end merge_request -- cgit v1.2.1 From 198d75b3a8516e75c595c5baaa6359c239bc800d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 20 Feb 2015 14:58:42 +0100 Subject: Initialize ZenMode on commit show and milestone edit pages. --- app/assets/javascripts/dispatcher.js.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index 1643ca941ff..ed1bdd6ca33 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -26,7 +26,7 @@ class Dispatcher new ZenMode() when 'projects:milestones:show' new Milestone() - when 'projects:milestones:new' + when 'projects:milestones:new', 'projects:milestones:edit' new ZenMode() when 'projects:issues:new','projects:issues:edit' GitLab.GfmAutoComplete.setup() @@ -54,6 +54,7 @@ class Dispatcher when 'projects:commit:show' new Commit() new Diff() + new ZenMode() shortcut_handler = new ShortcutsNavigation() when 'projects:commits:show' shortcut_handler = new ShortcutsNavigation() -- cgit v1.2.1 From 71e146999c405ab301cd3c3e3aa03b89d46c461e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 21 Feb 2015 11:13:24 -0800 Subject: Render gitlab.com import block only if host is not gitlab.com --- app/views/projects/new.html.haml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 33162ded4a6..5216f308110 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -53,18 +53,19 @@ Import projects from GitHub = render 'github_import_modal' - .project-import.form-group - .col-sm-2 - .col-sm-10 - - if gitlab_import_enabled? - = link_to status_import_gitlab_path do - %i.fa.fa-heart - Import projects from GitLab.com - - elsif request.host != 'gitlab.com' - = link_to '#', class: 'how_to_import_link light' do - %i.fa.fa-heart - Import projects from GitLab.com - = render 'gitlab_import_modal' + - unless request.host == 'gitlab.com' + .project-import.form-group + .col-sm-2 + .col-sm-10 + - if gitlab_import_enabled? + = link_to status_import_gitlab_path do + %i.fa.fa-heart + Import projects from GitLab.com + - else + = link_to '#', class: 'how_to_import_link light' do + %i.fa.fa-heart + Import projects from GitLab.com + = render 'gitlab_import_modal' .project-import.form-group .col-sm-2 -- cgit v1.2.1 From 52902f54346acb8076594a85e34f16605790b49f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 21 Feb 2015 18:28:32 -0800 Subject: Improve projects UI a bit --- app/assets/stylesheets/generic/avatar.scss | 8 ++++---- app/assets/stylesheets/sections/dashboard.scss | 1 - app/views/dashboard/_projects_filter.html.haml | 4 ++-- app/views/dashboard/projects.html.haml | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 700cc7e6947..8595887c3b9 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -35,8 +35,8 @@ &.s16 { font-size: 12px; line-height: 1.33; } &.s24 { font-size: 14px; line-height: 1.8; } &.s26 { font-size: 20px; line-height: 1.33; } - &.s32 { font-size: 24px; line-height: 1.33; } - &.s60 { font-size: 45px; line-height: 1.33; } - &.s90 { font-size: 68px; line-height: 1.33; } - &.s160 { font-size: 120px; line-height: 1.33; } + &.s32 { font-size: 22px; line-height: 32px; } + &.s60 { font-size: 32px; line-height: 60px; } + &.s90 { font-size: 36px; line-height: 90px; } + &.s160 { font-size: 96px; line-height: 1.33; } } diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index feb9a4ad295..d8fd83d44b7 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -84,7 +84,6 @@ margin-left: 10px; float: left; margin-right: 15px; - font-size: 20px; margin-bottom: 15px; i { diff --git a/app/views/dashboard/_projects_filter.html.haml b/app/views/dashboard/_projects_filter.html.haml index 7b5d46072e3..d87ca861aed 100644 --- a/app/views/dashboard/_projects_filter.html.haml +++ b/app/views/dashboard/_projects_filter.html.haml @@ -1,6 +1,6 @@ .dash-projects-filters.append-bottom-20 - .pull-left.append-right-20 - %ul.nav.nav-pills.nav-compact + .append-right-20 + %ul.nav.nav-tabs = nav_tab :scope, nil do = link_to projects_dashboard_filter_path(scope: nil) do All diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index 21e44fb1c60..69c64d6c71d 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -20,7 +20,7 @@ .project-access-icon = visibility_level_icon(project.visibility_level) = link_to project_path(project), class: dom_class(project) do - = project.name_with_namespace + %strong= project.name_with_namespace - if project.forked_from_project   -- cgit v1.2.1 From 87b04868a11a840d04a86ea1f8b2af9ec94efbd8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 21 Feb 2015 22:01:27 -0800 Subject: Create Aside js class for handling all sidebars in UI for mobile devices --- app/assets/javascripts/application.js.coffee | 4 +- app/assets/javascripts/aside.js.coffee | 17 ++++++++ app/assets/javascripts/sidebar.js.coffee | 27 ------------- app/assets/stylesheets/application.scss | 5 --- app/assets/stylesheets/generic/mobile.scss | 20 ++++++++++ app/assets/stylesheets/generic/sidebar.scss | 46 ---------------------- app/views/dashboard/show.html.haml | 7 ++-- app/views/groups/show.html.haml | 4 +- app/views/projects/issues/_discussion.html.haml | 6 ++- .../projects/merge_requests/_discussion.html.haml | 6 ++- app/views/projects/show.html.haml | 4 +- 11 files changed, 56 insertions(+), 90 deletions(-) create mode 100644 app/assets/javascripts/aside.js.coffee delete mode 100644 app/assets/stylesheets/generic/sidebar.scss (limited to 'app') diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 9c97582e6dd..e9042b56416 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -32,7 +32,6 @@ #= require nprogress #= require nprogress-turbolinks #= require dropzone -#= require semantic-ui/sidebar #= require mousetrap #= require mousetrap/pause #= require shortcuts @@ -115,7 +114,6 @@ if location.hash window.addEventListener "hashchange", shiftWindow $ -> - # Click a .one_click_select field, select the contents $(".one_click_select").on 'click', -> $(@).select() @@ -183,6 +181,8 @@ $ -> form = btn.closest("form") new ConfirmDangerModal(form, text) + new Aside() + (($) -> # Disable an element and add the 'disabled' Bootstrap class $.fn.extend disable: -> diff --git a/app/assets/javascripts/aside.js.coffee b/app/assets/javascripts/aside.js.coffee new file mode 100644 index 00000000000..85473101944 --- /dev/null +++ b/app/assets/javascripts/aside.js.coffee @@ -0,0 +1,17 @@ +class @Aside + constructor: -> + $(document).off "click", "a.show-aside" + $(document).on "click", 'a.show-aside', (e) -> + e.preventDefault() + btn = $(e.currentTarget) + icon = btn.find('i') + console.log('1') + + if icon.hasClass('fa-angle-left') + btn.parent().find('section').hide() + btn.parent().find('aside').fadeIn() + icon.removeClass('fa-angle-left').addClass('fa-angle-right') + else + btn.parent().find('aside').hide() + btn.parent().find('section').fadeIn() + icon.removeClass('fa-angle-right').addClass('fa-angle-left') diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee index 5013bcdacd0..7febcba0e94 100644 --- a/app/assets/javascripts/sidebar.js.coffee +++ b/app/assets/javascripts/sidebar.js.coffee @@ -1,30 +1,3 @@ -responsive_resize = -> - current_width = $(window).width() - if current_width < 985 - $('.responsive-side').addClass("ui right wide sidebar") - else - $('.responsive-side').removeClass("ui right wide sidebar") - -$ -> - # Depending on window size, set the sidebar offscreen. - responsive_resize() - - $('.sidebar-expand-button').click -> - $('.ui.sidebar') - .sidebar({overlay: true}) - .sidebar('toggle') - - # Hide sidebar on click outside of sidebar - $(document).mouseup (e) -> - container = $(".ui.sidebar") - container.sidebar "hide" if not container.is(e.target) and container.has(e.target).length is 0 - return - -# On resize, check if sidebar should be offscreen. -$(window).resize -> - responsive_resize() - return - $(document).on("click", '.toggle-nav-collapse', (e) -> e.preventDefault() collapsed = 'page-sidebar-collapsed' diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 8f63a7fee64..e5bb5e21bb0 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -55,8 +55,3 @@ * Styles for JS behaviors. */ @import "behaviors.scss"; - -/** -* Styles for responsive sidebar -*/ -@import "semantic-ui/modules/sidebar"; diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss index 54e06661161..2bb69f4aa7e 100644 --- a/app/assets/stylesheets/generic/mobile.scss +++ b/app/assets/stylesheets/generic/mobile.scss @@ -50,4 +50,24 @@ .issue_edited_ago, .note_edited_ago { display: none; } + + aside { + display: none; + } + + .show-aside { + display: block !important; + } +} + +.show-aside { + display: none; + position: fixed; + right: 0px; + top: 30%; + padding: 5px 15px; + background: #EEE; + font-size: 20px; + color: #777; + @include box-shadow(0 1px 2px #DDD); } diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss deleted file mode 100644 index f6311ef74e8..00000000000 --- a/app/assets/stylesheets/generic/sidebar.scss +++ /dev/null @@ -1,46 +0,0 @@ -.ui.sidebar { - z-index: 1000 !important; - background: #fff; - padding: 10px; - width: 285px; -} - -.ui.right.sidebar { - border-left: 1px solid #e1e1e1; - border-right: 0; -} - -.sidebar-expand-button { - cursor: pointer; - transition: all 0.4s; - -moz-transition: all 0.4s; - -webkit-transition: all 0.4s; -} - -.fixed.sidebar-expand-button { - background: #f9f9f9; - color: #555; - padding: 9px 12px 6px 14px; - border: 1px solid #E1E1E1; - border-right: 0; - position: fixed; - top: 108px; - right: 0px; - margin-right: 0; - &:hover { - background: #ddd; - color: #333; - padding-right: 25px; - } -} - -.btn.btn-default.sidebar-expand-button { - margin-left: 12px; - display: inline-block !important; -} - -@media (min-width: 767px) { -.btn.btn-default.sidebar-expand-button { - display: none!important; - } -} diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml index 10951af6a09..f973f4829a0 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/show.html.haml @@ -2,11 +2,10 @@ .dashboard.row %section.activities.col-md-8 = render 'activities' - %aside.side.col-md-4.left.responsive-side + %aside.col-md-4 = render 'sidebar' - - .fixed.sidebar-expand-button.hidden-lg.hidden-md - %i.fa.fa-list.fa-2x + = link_to '#aside', class: 'show-aside' do + %i.fa.fa-angle-left - else = render "zero_authorized_projects" diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index d5af859ee62..a453889f744 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -9,7 +9,7 @@ = escaped_autolink(@group.description) %hr .row - %section.activities.col-md-8.hidden-sm.hidden-xs + %section.activities.col-md-8 - if current_user = render "events/event_last_push", event: @last_push = render 'shared/event_filter' @@ -17,3 +17,5 @@ = spinner %aside.side.col-md-4 = render "projects", projects: @projects + = link_to '#aside', class: 'show-aside' do + %i.fa.fa-angle-left diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index 89572c9a735..15f5208a645 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -5,14 +5,14 @@ - else = link_to 'Close Issue', project_issue_path(@project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" .row - .col-md-9 + %section.col-md-9 .participants %span= pluralize(@issue.participants.count, 'participant') - @issue.participants.each do |participant| = link_to_member(@project, participant, name: false, size: 24) .voting_notes#notes= render "projects/notes/notes_with_form" - .col-md-3 + %aside.col-md-3 .issuable-affix .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} @@ -33,3 +33,5 @@ - @issue.labels.each do |label| = link_to project_issues_path(@project, label_name: label.name) do = render_colored_label(label) + = link_to '#aside', class: 'show-aside' do + %i.fa.fa-angle-left diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index ca4ce26c676..69bbdf49396 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -6,10 +6,10 @@ = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" .row - .col-md-9 + %section.col-md-9 = render "projects/merge_requests/show/participants" = render "projects/notes/notes_with_form" - .col-md-3 + %aside.col-md-3 .issuable-affix .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} @@ -29,3 +29,5 @@ - @merge_request.labels.each do |label| = link_to project_merge_requests_path(@project, label_name: label.name) do = render_colored_label(label) + = link_to '#aside', class: 'show-aside' do + %i.fa.fa-angle-left diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 435b2648404..c71123c4fbf 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -23,12 +23,14 @@ .tab-content .tab-pane.active#tab-activity .row + = link_to '#aside', class: 'show-aside' do + %i.fa.fa-angle-left %section.col-md-9 = render "events/event_last_push", event: @last_push = render 'shared/event_filter' .content_list = spinner - %aside.col-md-3.project-side.hidden-sm.hidden-xs + %aside.col-md-3.project-side .clearfix - if @project.archived? .alert.alert-warning -- cgit v1.2.1 From 5f232b5687b447e7eac40f58c56628da22580de6 Mon Sep 17 00:00:00 2001 From: Vinnie Okada Date: Sun, 22 Feb 2015 16:01:49 -0700 Subject: Improve error messages when file editing fails Give more specific errors in API responses and web UI flash messages when a file update fails. --- app/services/base_service.rb | 7 +++++-- app/services/files/update_service.rb | 14 ++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/services/base_service.rb b/app/services/base_service.rb index bb51795df7c..52ab29f1492 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -37,11 +37,14 @@ class BaseService private - def error(message) - { + def error(message, http_status = nil) + result = { message: message, status: :error } + + result[:http_status] = http_status if http_status + result end def success diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb index b4986e1c5c6..bcf0e7f3cee 100644 --- a/app/services/files/update_service.rb +++ b/app/services/files/update_service.rb @@ -20,17 +20,19 @@ module Files end edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, project, ref, path) - created_successfully = edit_file_action.commit!( + edit_file_action.commit!( params[:content], params[:commit_message], params[:encoding] ) - if created_successfully - success - else - error("Your changes could not be committed. Maybe the file was changed by another process or there was nothing to commit?") - end + success + rescue Gitlab::Satellite::CheckoutFailed => ex + error("Your changes could not be committed because ref '#{ref}' could not be checked out", 400) + rescue Gitlab::Satellite::CommitFailed => ex + error("Your changes could not be committed. Maybe there was nothing to commit?", 409) + rescue Gitlab::Satellite::PushFailed => ex + error("Your changes could not be committed. Maybe the file was changed by another process?", 409) end end end -- cgit v1.2.1 From b19b8c679a136234094443e2d4a345f136a0bcc1 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Mon, 23 Feb 2015 02:31:12 +0100 Subject: Give last_activity_at a default value so it will always be set --- app/models/project.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index 91ab788083d..04189839d6d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -48,6 +48,12 @@ class Project < ActiveRecord::Base default_value_for :wall_enabled, false default_value_for :snippets_enabled, gitlab_config_features.snippets + # set last_activity_at to the same as updated_at + before_create :set_last_activity_at + def set_last_activity_at + self.last_activity_at = self.updated_at + end + ActsAsTaggableOn.strict_case_match = true acts_as_taggable_on :tags -- cgit v1.2.1 From d4bfdd34baa9eea2e89223b039f15cd4d4b3e5ae Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Mon, 23 Feb 2015 04:03:12 +0100 Subject: use update_column and set to created_at like elsewhere --- app/models/project.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/project.rb b/app/models/project.rb index 04189839d6d..967e4de22a9 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -48,10 +48,10 @@ class Project < ActiveRecord::Base default_value_for :wall_enabled, false default_value_for :snippets_enabled, gitlab_config_features.snippets - # set last_activity_at to the same as updated_at - before_create :set_last_activity_at + # set last_activity_at to the same as created_at + after_create :set_last_activity_at def set_last_activity_at - self.last_activity_at = self.updated_at + update_column(:last_activity_at, self.created_at) end ActsAsTaggableOn.strict_case_match = true -- cgit v1.2.1 From 19327e6535a69000f1cf89b1f92a3c19fc1d546e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 22 Feb 2015 22:06:43 -0800 Subject: Fix dashboard for projects > 30 --- app/views/dashboard/_projects.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/_projects.html.haml index 252dbf78882..0596738342f 100644 --- a/app/views/dashboard/_projects.html.haml +++ b/app/views/dashboard/_projects.html.haml @@ -20,6 +20,6 @@ %span.light #{@projects_limit} of #{pluralize(@projects_count, 'project')} displayed. .pull-right - = link_to namespace_projects_dashboard_path do + = link_to projects_dashboard_path do Show all %i.fa.fa-angle-right -- cgit v1.2.1 From 9459e9db2470e9c50488811d1d0fcdd025a327d0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sun, 22 Feb 2015 22:26:09 -0800 Subject: Fix updating issue 500 error --- app/controllers/projects/issues_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index d1bf842ec1a..73b58285c61 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -79,7 +79,7 @@ class Projects::IssuesController < Projects::ApplicationController format.js format.html do if @issue.valid? - redirect_to [@project.namespace, @project, @issue] + redirect_to [@project.namespace.becomes(Namespace), @project, @issue] else render :edit end -- cgit v1.2.1 From 48eeb006f08a1bdea9cd8ad4dc49819a8daccf51 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Mon, 23 Feb 2015 15:10:56 +0100 Subject: Correct spelling of 'a project avatar' --- app/views/projects/edit.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 8240c186616..b4c36beda88 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -86,7 +86,7 @@ - if @project.avatar? You can change your project avatar here - else - You can upload an project avatar here + You can upload a project avatar here %a.choose-btn.btn.btn-small.js-choose-project-avatar-button %i.icon-paper-clip %span Choose File ... -- cgit v1.2.1 From 846f83177448832bd04ea0167b34541b5d3b71c6 Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Mon, 23 Feb 2015 10:40:06 -0800 Subject: Fixes grammatical consistency and small changes This commit adds consistency to small things like periods, commas, etc. Also gives additional information to buttons and headers. Fixes #2002, #2005, #2003 --- app/views/profiles/accounts/show.html.haml | 8 ++++---- app/views/profiles/applications.html.haml | 4 +++- app/views/profiles/design.html.haml | 4 ++-- app/views/profiles/emails/index.html.haml | 4 ++-- app/views/profiles/groups/index.html.haml | 4 ++-- app/views/profiles/history.html.haml | 4 ++-- app/views/profiles/keys/index.html.haml | 6 +++--- app/views/profiles/notifications/show.html.haml | 7 +++---- app/views/profiles/passwords/edit.html.haml | 4 ++-- app/views/profiles/show.html.haml | 4 ++-- 10 files changed, 25 insertions(+), 24 deletions(-) (limited to 'app') diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index 53a50f6796b..f124637c07b 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -1,5 +1,5 @@ %h3.page-title - Account settings + Account Settings %p.light You can change your username and private token here. - if current_user.ldap_user? @@ -10,7 +10,7 @@ .account-page %fieldset.update-token %legend - Private token + Reset Private token %div = form_for @user, url: reset_private_token_profile_path, method: :put do |f| .data @@ -25,7 +25,7 @@ - if current_user.private_token = text_field_tag "token", current_user.private_token, class: "form-control" %div - = f.submit 'Reset', data: { confirm: "Are you sure?" }, class: "btn btn-primary btn-build-token" + = f.submit 'Reset private token', data: { confirm: "Are you sure?" }, class: "btn btn-primary btn-build-token" - else %span You don`t have one yet. Click generate to fix it. = f.submit 'Generate', class: "btn success btn-build-token" @@ -43,7 +43,7 @@ - if show_profile_username_tab? %fieldset.update-username %legend - Username + Change Username = form_for @user, url: update_username_profile_path, method: :put, remote: true do |f| %p Changing your username will change path to all personal projects! diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml index 4b5817e10bf..c8c522e9812 100644 --- a/app/views/profiles/applications.html.haml +++ b/app/views/profiles/applications.html.haml @@ -1,5 +1,7 @@ %h3.page-title - OAuth2 + Application Settings +%p.light + OAuth2 protocol settings below. %fieldset.oauth-applications %legend Your applications diff --git a/app/views/profiles/design.html.haml b/app/views/profiles/design.html.haml index 0d8075b7d43..8d09595fd4f 100644 --- a/app/views/profiles/design.html.haml +++ b/app/views/profiles/design.html.haml @@ -1,7 +1,7 @@ %h3.page-title - My appearance settings + Design Settings %p.light - Appearance settings saved to your profile and available across all devices + Appearance settings will be saved to your profile and made available across all devices. %hr = form_for @user, url: profile_path, remote: true, method: :put do |f| diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml index 0b30e772336..3bbad6fdf7b 100644 --- a/app/views/profiles/emails/index.html.haml +++ b/app/views/profiles/emails/index.html.haml @@ -1,5 +1,5 @@ %h3.page-title - My email addresses + Email Settings %p.light Your %b Primary Email @@ -34,4 +34,4 @@ .col-sm-10 = f.text_field :email, class: 'form-control' .form-actions - = f.submit 'Add', class: 'btn btn-create' + = f.submit 'Add email address', class: 'btn btn-create' diff --git a/app/views/profiles/groups/index.html.haml b/app/views/profiles/groups/index.html.haml index e9ffca8faf4..daf76636ff2 100644 --- a/app/views/profiles/groups/index.html.haml +++ b/app/views/profiles/groups/index.html.haml @@ -1,12 +1,12 @@ %h3.page-title - Group membership + Group Membership - if current_user.can_create_group? %span.pull-right = link_to new_group_path, class: "btn btn-new" do %i.fa.fa-plus New Group %p.light - Group members have access to all a group's projects + Group members have access to all group projects. %hr .panel.panel-default .panel-heading diff --git a/app/views/profiles/history.html.haml b/app/views/profiles/history.html.haml index 3951c47b5f2..9cafe03b8b3 100644 --- a/app/views/profiles/history.html.haml +++ b/app/views/profiles/history.html.haml @@ -1,7 +1,7 @@ %h3.page-title - Account history + My Account History %p.light - All events created by your account are listed here + All events created by your account are listed below. %hr .profile_history = render @events diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index c83c73ffcf9..965d5e032f9 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -1,12 +1,12 @@ %h3.page-title - My SSH keys (#{@keys.count}) + SSH Keys Settings .pull-right = link_to "Add SSH Key", new_profile_key_path, class: "btn btn-new" %p.light - SSH keys allow you to establish a secure connection between your computer and GitLab + My SSH keys: #{@keys.count} %br Before you can add an SSH key you need to - = link_to "generate it", help_page_path("ssh", "README") + = link_to "generate it.", help_page_path("ssh", "README") %hr = render 'key_table' diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index 28bc5a426ac..e3cd323927e 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -1,10 +1,9 @@ %h3.page-title - Notifications settings + Notifications Settings %p.light These are your global notification settings. %hr - = form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications form-horizontal global-notifications-form' } do |f| -if @user.errors.any? %div.alert.alert-danger @@ -60,7 +59,7 @@ %p You can also specify notification level per group or per project. %br - By default all projects and groups uses notification level set above. + By default, all projects and groups will use the notification level set above. %h4 Groups: %ul.bordered-list - @group_members.each do |users_group| @@ -69,7 +68,7 @@ .col-md-6 %p - To specify notification level per project of a group you belong to, + To specify the notification level per project of a group you belong to, %br you need to be a member of the project itself, not only its group. %h4 Projects: diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml index 6b19db4eb5d..3b1ebbfaf59 100644 --- a/app/views/profiles/passwords/edit.html.haml +++ b/app/views/profiles/passwords/edit.html.haml @@ -1,4 +1,4 @@ -%h3.page-title Password +%h3.page-title Password Settings %p.light - if @user.password_automatically_set? Set your password. @@ -12,7 +12,7 @@ - unless @user.password_automatically_set? You must provide current password in order to change it. %br - After a successful password update you will be redirected to login page where you should login with your new password + After a successful password update, you will be redirected to the login page where you can log in with your new password. -if @user.errors.any? .alert.alert-danger %ul diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index 640104fdad1..b2808c46c00 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -1,7 +1,7 @@ %h3.page-title - Profile settings + Profile Settings %p.light - This information appears on your profile. + This information will appear on your profile. - if current_user.ldap_user? Some options are unavailable for LDAP accounts %hr -- cgit v1.2.1 From 5d2dda9744eb902e397410f8f4b94af3a0acb1df Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Mon, 23 Feb 2015 11:39:08 -0800 Subject: Added information to tooltips Tooltips now have meaning by mentioning their function ("Filter by..."). Fixes #1992 --- app/helpers/events_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 063916a8df8..d38b546e1b2 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -30,7 +30,7 @@ module EventsHelper end content_tag :li, class: "filter_icon #{active}" do - link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do + link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => 'Filter by ' + tooltip.downcase do icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) end end -- cgit v1.2.1 From 5ce2d44b136aae8e9e42397474a0e75bc6b32ded Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Mon, 23 Feb 2015 11:51:18 -0800 Subject: Added Profile tooltip For consistency sake, the profile in the navbar has a tooltip. --- app/views/layouts/_head_panel.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index 77bfe4f996e..d5928d2ed25 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -42,7 +42,7 @@ = link_to destroy_user_session_path, class: "logout", method: :delete, title: "Logout", class: 'has_bottom_tooltip', 'data-original-title' => 'Logout' do %i.fa.fa-sign-out %li.hidden-xs - = link_to current_user, class: "profile-pic", id: 'profile-pic' do + = link_to current_user, class: "profile-pic has_bottom_tooltip", id: 'profile-pic', 'data-original-title' => 'Your profile' do = image_tag avatar_icon(current_user.email, 60), alt: 'User activity' = render 'shared/outdated_browser' -- cgit v1.2.1 From e35fe204795bbb19d46f34af49c1ad4f7148e68f Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Mon, 23 Feb 2015 13:38:04 -0800 Subject: Filter icons look like proper buttons The filter icons (Push events, Merge events, Comments, Team) now have a border that signifies they can be pushed. This not only keeps it in line with the rest of the application buttons, but it makes it more obvious, especially for the Merge events button with a checkbox icon. --- app/helpers/events_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 063916a8df8..db0d4a26611 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -30,7 +30,7 @@ module EventsHelper end content_tag :li, class: "filter_icon #{active}" do - link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do + link_to request.path, class: 'btn has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) end end -- cgit v1.2.1 From 0e1d31a734c576421bdb798f3f8e6bf9381c854b Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Mon, 23 Feb 2015 13:52:02 -0800 Subject: Git Clone btn more apparent Added a faint background to the button to show that it is in an active state for the user. White background is often hard to tell if something is being pushed, so adding a "shadow" makes it a bit easier to tell. Fixes #1998 --- app/assets/stylesheets/sections/projects.scss | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app') diff --git a/app/assets/stylesheets/sections/projects.scss b/app/assets/stylesheets/sections/projects.scss index 3bb3779c294..8bad9b139f4 100644 --- a/app/assets/stylesheets/sections/projects.scss +++ b/app/assets/stylesheets/sections/projects.scss @@ -111,6 +111,8 @@ color: $link_color; &.active { + background-color: #f5f5f5; + border: 1px solid rgba(0,0,0,0.195); color: #333; font-weight: bold; } -- cgit v1.2.1 From b3fd0ca04d498504e93894378be98dc1bda7e259 Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Mon, 23 Feb 2015 14:27:52 -0800 Subject: Toggle sidebar button more obvious The toggle is now at the top of the sidebar because it is not noticeable near the bottom. By placing it at the top, users will immediately know that they can have more space if they desire versus on the bottom, they will have to search for it and that's not desired. Fixes #2044 --- app/assets/stylesheets/sections/nav_sidebar.scss | 18 +++++++++++++----- app/views/layouts/_collapse_button.html.haml | 4 ++-- 2 files changed, 15 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 17923ca499b..8841068b6a6 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -108,7 +108,7 @@ width: $sidebar_width; .nav-sidebar { - margin-top: 20px; + margin-top: 29px; position: fixed; top: 45px; width: $sidebar_width; @@ -127,7 +127,7 @@ width: 52px; .nav-sidebar { - margin-top: 20px; + margin-top: 29px; position: fixed; top: 45px; width: 52px; @@ -144,14 +144,22 @@ } } } + + .collapse-nav a { + left: 0px; + padding: 5px 23px 3px 22px; + } } } .collapse-nav a { position: fixed; - bottom: 15px; - padding: 10px; - background: #DDD; + top: 47px; + padding: 5px 13px 3px 13px; + left: 197px; + background: #EEE; + color: black; + border: 1px solid rgba(0,0,0,0.035); } @media (max-width: $screen-md-max) { diff --git a/app/views/layouts/_collapse_button.html.haml b/app/views/layouts/_collapse_button.html.haml index b3b338b55bb..2ed51d87ca1 100644 --- a/app/views/layouts/_collapse_button.html.haml +++ b/app/views/layouts/_collapse_button.html.haml @@ -1,4 +1,4 @@ - if nav_menu_collapsed? - = link_to icon('angle-right'), '#', class: 'toggle-nav-collapse' + = link_to icon('angle-right'), '#', class: 'toggle-nav-collapse', title: "Open/Close" - else - = link_to icon('angle-left'), '#', class: 'toggle-nav-collapse' + = link_to icon('angle-left'), '#', class: 'toggle-nav-collapse', title: "Open/Close" -- cgit v1.2.1 From 746dd89ab010299f731c195082087d32f25698df Mon Sep 17 00:00:00 2001 From: DJ Mountney Date: Mon, 23 Feb 2015 16:19:03 -0800 Subject: Fix 404 when deleting a project The deletion from the admin section was redirecting to the wrong address. --- app/controllers/projects_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 38341b1c8c6..d1583e6ebfb 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -102,7 +102,7 @@ class ProjectsController < ApplicationController flash[:alert] = 'Project deleted.' if request.referer.include?('/admin') - redirect_to admin_namespace_projects_path + redirect_to admin_namespaces_projects_path else redirect_to projects_dashboard_path end -- cgit v1.2.1 From b0dfe434c60da7d04ddf23f7a3e85af97d377568 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 23 Feb 2015 12:38:30 -0800 Subject: Using gitlab url to build links for gitlab issue tracker and add a spec. Fix rubocop warnings in path. --- app/models/project_services/gitlab_issue_tracker_service.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 782cf42ce55..05c048e4e45 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -27,14 +27,20 @@ class GitlabIssueTrackerService < IssueTrackerService end def project_url - namespace_project_issues_path(project.namespace, project) + "#{gitlab_url}#{namespace_project_issues_path(project.namespace, project)}" end def new_issue_url - new_namespace_project_issue_path namespace_id: project.namespace, project_id: project + "#{gitlab_url}#{new_namespace_project_issue_path(namespace_id: project.namespace, project_id: project)}" end def issue_url(iid) - "#{Gitlab.config.gitlab.url}#{namespace_project_issue_path(namespace_id: project.namespace, project_id: project, id: iid)}" + "#{gitlab_url}#{namespace_project_issue_path(namespace_id: project.namespace, project_id: project, id: iid)}" + end + + private + + def gitlab_url + Gitlab.config.gitlab.relative_url_root.chomp("/") if Gitlab.config.gitlab.relative_url_root end end -- cgit v1.2.1 From 12589d339070d86b57a4f97778a48b1b9cc5a0a1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 23 Feb 2015 18:43:39 -0800 Subject: Improve sidebar menu for project settings --- app/assets/stylesheets/sections/nav_sidebar.scss | 2 +- app/views/layouts/nav/_project.html.haml | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 17923ca499b..8e02b375074 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -47,7 +47,7 @@ border-left: 3px solid $style_color; &.no-highlight { - background: none; + background: none !important; border: none; } diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 4d859e817ac..15b489c7d99 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -6,12 +6,7 @@ %span Back to project - = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_namespace_project_path(@project.namespace, @project), title: 'Settings', class: "stat-tab tab no-highlight" do - %i.fa.fa-cogs - %span - Settings - %i.fa.fa-angle-down + %li.separate-item = render 'projects/settings_nav' @@ -98,4 +93,3 @@ %i.fa.fa-cogs %span Settings - %i.fa.fa-angle-down -- cgit v1.2.1 From 897a2de54c1d5cbead4589d44a3d173c14849f23 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 23 Feb 2015 19:35:42 -0800 Subject: Allow non authenticated access to avatars --- app/controllers/uploads_controller.rb | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'app') diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index d5877977258..73b124bb34c 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -1,4 +1,7 @@ class UploadsController < ApplicationController + skip_before_filter :authenticate_user!, :reject_blocked + before_filter :authorize_access + def show model = params[:model].camelize.constantize.find(params[:id]) uploader = model.send(params[:mounted_as]) @@ -14,4 +17,10 @@ class UploadsController < ApplicationController redirect_to uploader.url end end + + def authorize_access + unless params[:mounted_as] == 'avatar' + authenticate_user! && reject_blocked + end + end end -- cgit v1.2.1 From c9829146f88ff87460add83a3719db3e2593f278 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 23 Feb 2015 22:21:49 +0100 Subject: LDAP users don't need to set a password to Git over HTTP. --- app/models/user.rb | 5 +++++ app/views/shared/_clone_panel.html.haml | 2 +- app/views/shared/_no_password.html.haml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index 21ccc76978e..08ad619a90c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -45,6 +45,7 @@ # last_credential_check_at :datetime # github_access_token :string(255) # notification_email :string(255) +# password_automatically_set :boolean default(FALSE) # require 'carrierwave/orm/activerecord' @@ -350,6 +351,10 @@ class User < ActiveRecord::Base keys.count == 0 end + def require_password? + password_automatically_set? && !ldap_user? + end + def can_change_username? gitlab_config.username_changing_enabled end diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml index df0bde76980..a1121750ca3 100644 --- a/app/views/shared/_clone_panel.html.haml +++ b/app/views/shared/_clone_panel.html.haml @@ -9,7 +9,7 @@ :"data-container" => "body"} SSH %button{ | - class: "btn #{ 'active' if default_clone_protocol == 'http' }#{ ' has_tooltip' if current_user && current_user.password_automatically_set? }", | + class: "btn #{ 'active' if default_clone_protocol == 'http' }#{ ' has_tooltip' if current_user && current_user.require_password? }", | :"data-clone" => project.http_url_to_repo, | :"data-title" => "Set a password on your account
    to pull or push via #{gitlab_config.protocol.upcase}", :"data-html" => "true", diff --git a/app/views/shared/_no_password.html.haml b/app/views/shared/_no_password.html.haml index 022097cda16..a43bf33751a 100644 --- a/app/views/shared/_no_password.html.haml +++ b/app/views/shared/_no_password.html.haml @@ -1,4 +1,4 @@ -- if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.password_automatically_set? +- if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.require_password? .no-password-message.alert.alert-warning.hidden-xs You won't be able to pull or push project code via #{gitlab_config.protocol.upcase} until you #{link_to 'set a password', edit_profile_password_path} on your account -- cgit v1.2.1 From 64ca07c3b95c6b1e9444d9139858b11a6097c1ca Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 23 Feb 2015 21:27:41 -0800 Subject: Better readme title --- app/assets/stylesheets/sections/tree.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/tree.scss b/app/assets/stylesheets/sections/tree.scss index ff9464e217f..60a1c00b04b 100644 --- a/app/assets/stylesheets/sections/tree.scss +++ b/app/assets/stylesheets/sections/tree.scss @@ -120,13 +120,13 @@ } .readme-holder { - border-top: 1px dashed #CCC; - padding-top: 10px; - .readme-file-title { font-size: 14px; + font-weight: bold; margin-bottom: 20px; color: #777; + border-bottom: 1px solid #DDD; + padding: 10px 0; } } -- cgit v1.2.1 From f6add983d332758cd1ae22732da762cff608af1e Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Tue, 24 Feb 2015 09:42:07 +0000 Subject: Use proper Gitorious icons on import pages --- app/assets/images/gitorious-logo-black.png | Bin 0 -> 809 bytes app/assets/images/gitorious-logo-blue.png | Bin 0 -> 495 bytes app/assets/stylesheets/sections/import.scss | 18 ++++++++++++++++++ app/views/import/gitorious/status.html.haml | 2 +- app/views/projects/new.html.haml | 2 +- 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/gitorious-logo-black.png create mode 100644 app/assets/images/gitorious-logo-blue.png create mode 100644 app/assets/stylesheets/sections/import.scss (limited to 'app') diff --git a/app/assets/images/gitorious-logo-black.png b/app/assets/images/gitorious-logo-black.png new file mode 100644 index 00000000000..78f17a9af79 Binary files /dev/null and b/app/assets/images/gitorious-logo-black.png differ diff --git a/app/assets/images/gitorious-logo-blue.png b/app/assets/images/gitorious-logo-blue.png new file mode 100644 index 00000000000..4962cffba31 Binary files /dev/null and b/app/assets/images/gitorious-logo-blue.png differ diff --git a/app/assets/stylesheets/sections/import.scss b/app/assets/stylesheets/sections/import.scss new file mode 100644 index 00000000000..3df4bb84bd2 --- /dev/null +++ b/app/assets/stylesheets/sections/import.scss @@ -0,0 +1,18 @@ +i.icon-gitorious { + display: inline-block; + background-position: 0px 0px; + background-size: contain; + background-repeat: no-repeat; +} + +i.icon-gitorious-small { + background-image: image-url('gitorious-logo-blue.png'); + width: 13px; + height: 13px; +} + +i.icon-gitorious-big { + background-image: image-url('gitorious-logo-black.png'); + width: 18px; + height: 18px; +} diff --git a/app/views/import/gitorious/status.html.haml b/app/views/import/gitorious/status.html.haml index 35ed0a717de..8ede5c3e840 100644 --- a/app/views/import/gitorious/status.html.haml +++ b/app/views/import/gitorious/status.html.haml @@ -1,5 +1,5 @@ %h3.page-title - %i.fa.fa-gitorious + %i.icon-gitorious.icon-gitorious-big Import repositories from Gitorious.org %p.light diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 33162ded4a6..c37ae8d31d2 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -70,7 +70,7 @@ .col-sm-2 .col-sm-10 = link_to new_import_gitorious_path do - %i.fa.fa-heart + %i.icon-gitorious.icon-gitorious-small Import projects from Gitorious.org %hr.prepend-botton-10 -- cgit v1.2.1 From 71a844cdaee129d4e300c20cbb27db009cf81b73 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Sat, 14 Feb 2015 18:18:05 +0200 Subject: Web Editor: save to new branch --- app/controllers/projects/blob_controller.rb | 26 +++++++++++++++++++++++--- app/services/files/create_service.rb | 3 ++- app/services/files/update_service.rb | 3 ++- app/views/projects/blob/edit.html.haml | 7 +++++++ app/views/projects/blob/new.html.haml | 7 +++++++ 5 files changed, 41 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 1207548eae0..4b7eb4df298 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -1,6 +1,7 @@ # Controller for viewing a file's blame class Projects::BlobController < Projects::ApplicationController include ExtractsPath + include ActionView::Helpers::SanitizeHelper # Raised when given an invalid file path class InvalidPathError < StandardError; end @@ -21,11 +22,18 @@ class Projects::BlobController < Projects::ApplicationController def create file_path = File.join(@path, File.basename(params[:file_name])) - result = Files::CreateService.new(@project, current_user, params, @ref, file_path).execute + result = Files::CreateService.new( + @project, + current_user, + params.merge(new_branch: sanitized_new_branch_name), + @ref, + file_path + ).execute if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(@ref, file_path)) + ref = sanitized_new_branch_name.presence || @ref + redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(ref, file_path)) else flash[:alert] = result[:message] render :new @@ -41,7 +49,13 @@ class Projects::BlobController < Projects::ApplicationController def update result = Files::UpdateService. - new(@project, current_user, params, @ref, @path).execute + new( + @project, + current_user, + params.merge(new_branch: sanitized_new_branch_name), + @ref, + @path + ).execute if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" @@ -131,6 +145,8 @@ class Projects::BlobController < Projects::ApplicationController if from_merge_request diffs_namespace_project_merge_request_path(from_merge_request.target_project.namespace, from_merge_request.target_project, from_merge_request) + "#file-path-#{hexdigest(@path)}" + elsif sanitized_new_branch_name.present? + namespace_project_blob_path(@project.namespace, @project, File.join(sanitized_new_branch_name, @path)) else namespace_project_blob_path(@project.namespace, @project, @id) end @@ -140,4 +156,8 @@ class Projects::BlobController < Projects::ApplicationController # If blob edit was initiated from merge request page @from_merge_request ||= MergeRequest.find_by(id: params[:from_merge_request_id]) end + + def sanitized_new_branch_name + @new_branch ||= sanitize(strip_tags(params[:new_branch])) + end end diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb index 2c457ef2cef..de5322e990a 100644 --- a/app/services/files/create_service.rb +++ b/app/services/files/create_service.rb @@ -38,7 +38,8 @@ module Files created_successfully = new_file_action.commit!( params[:content], params[:commit_message], - params[:encoding] + params[:encoding], + params[:new_branch] ) if created_successfully diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb index bcf0e7f3cee..328cf3a4b06 100644 --- a/app/services/files/update_service.rb +++ b/app/services/files/update_service.rb @@ -23,7 +23,8 @@ module Files edit_file_action.commit!( params[:content], params[:commit_message], - params[:encoding] + params[:encoding], + params[:new_branch] ) success diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index 6884ad1f2f3..1f61a0b940c 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -14,6 +14,13 @@ = render 'projects/blob/editor', ref: @ref, path: @path, blob_data: @blob.data = render 'shared/commit_message_container', params: params, placeholder: "Update #{@blob.name}" + + .form-group.branch + = label_tag 'branch', class: 'control-label' do + Branch + .col-sm-10 + = text_field_tag 'new_branch', @ref, class: "form-control" + = hidden_field_tag 'last_commit', @last_commit = hidden_field_tag 'content', '', id: "file-content" = hidden_field_tag 'from_merge_request_id', params[:from_merge_request_id] diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 45865d552ae..d78a01f6422 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -4,6 +4,13 @@ = render 'projects/blob/editor', ref: @ref = render 'shared/commit_message_container', params: params, placeholder: 'Add new file' + + .form-group.branch + = label_tag 'branch', class: 'control-label' do + Branch + .col-sm-10 + = text_field_tag 'new_branch', @ref, class: "form-control" + = hidden_field_tag 'content', '', id: 'file-content' = render 'projects/commit_button', ref: @ref, cancel_path: namespace_project_tree_path(@project.namespace, @project, @id) -- cgit v1.2.1 From ad6d6232342558705c54ba70a94f9d7ddbd00f8c Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 17 Feb 2015 16:59:50 +0100 Subject: Add Bitbucket importer. --- app/assets/images/authbuttons/bitbucket_32.png | Bin 0 -> 2713 bytes app/assets/images/authbuttons/bitbucket_64.png | Bin 0 -> 2163 bytes app/controllers/import/bitbucket_controller.rb | 74 +++++++++++++++++++++ app/helpers/oauth_helper.rb | 4 +- app/helpers/projects_helper.rb | 4 ++ app/models/project.rb | 2 +- app/models/user.rb | 1 + app/views/import/base/create.js.haml | 7 ++ app/views/import/bitbucket/status.html.haml | 44 ++++++++++++ app/views/import/github/status.html.haml | 2 +- app/views/import/gitlab/status.html.haml | 2 +- .../projects/_bitbucket_import_modal.html.haml | 9 +++ app/views/projects/new.html.haml | 13 ++++ app/workers/repository_import_worker.rb | 2 + 14 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 app/assets/images/authbuttons/bitbucket_32.png create mode 100644 app/assets/images/authbuttons/bitbucket_64.png create mode 100644 app/controllers/import/bitbucket_controller.rb create mode 100644 app/views/import/bitbucket/status.html.haml create mode 100644 app/views/projects/_bitbucket_import_modal.html.haml (limited to 'app') diff --git a/app/assets/images/authbuttons/bitbucket_32.png b/app/assets/images/authbuttons/bitbucket_32.png new file mode 100644 index 00000000000..27702eb973d Binary files /dev/null and b/app/assets/images/authbuttons/bitbucket_32.png differ diff --git a/app/assets/images/authbuttons/bitbucket_64.png b/app/assets/images/authbuttons/bitbucket_64.png new file mode 100644 index 00000000000..4b90a57bc7d Binary files /dev/null and b/app/assets/images/authbuttons/bitbucket_64.png differ diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb new file mode 100644 index 00000000000..27e91f49f2b --- /dev/null +++ b/app/controllers/import/bitbucket_controller.rb @@ -0,0 +1,74 @@ +class Import::BitbucketController < Import::BaseController + before_filter :bitbucket_auth, except: :callback + + # rescue_from OAuth::Error, with: :bitbucket_unauthorized + + def callback + request_token = session.delete(:oauth_request_token) + raise "Session expired!" if request_token.nil? + + request_token.symbolize_keys! + + access_token = client.get_token(request_token, params[:oauth_verifier], callback_import_bitbucket_url) + + current_user.bitbucket_access_token = access_token.token + current_user.bitbucket_access_token_secret = access_token.secret + + current_user.save + redirect_to status_import_bitbucket_url + end + + def status + @repos = client.projects + + @already_added_projects = current_user.created_projects.where(import_type: "bitbucket") + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.to_a.reject!{ |repo| already_added_projects_names.include? "#{repo["owner"]}/#{repo["slug"]}" } + end + + def jobs + jobs = current_user.created_projects.where(import_type: "bitbucket").to_json(only: [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id] || "" + repo = client.project(@repo_id.gsub("___", "/")) + @target_namespace = params[:new_namespace].presence || repo["owner"] + @project_name = repo["slug"] + + namespace = get_or_create_namespace || (render and return) + + unless Gitlab::BitbucketImport::KeyAdder.new(repo, current_user).execute + @access_denied = true + render + return + end + + @project = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, current_user).execute + end + + private + + def client + @client ||= Gitlab::BitbucketImport::Client.new(current_user.bitbucket_access_token, current_user.bitbucket_access_token_secret) + end + + def bitbucket_auth + if current_user.bitbucket_access_token.blank? + go_to_bitbucket_for_permissions + end + end + + def go_to_bitbucket_for_permissions + request_token = client.request_token(callback_import_bitbucket_url) + session[:oauth_request_token] = request_token + + redirect_to client.authorize_url(request_token, callback_import_bitbucket_url) + end + + def bitbucket_unauthorized + go_to_bitbucket_for_permissions + end +end diff --git a/app/helpers/oauth_helper.rb b/app/helpers/oauth_helper.rb index c7bc9307a58..848d74c18c3 100644 --- a/app/helpers/oauth_helper.rb +++ b/app/helpers/oauth_helper.rb @@ -4,7 +4,7 @@ module OauthHelper end def default_providers - [:twitter, :github, :gitlab, :google_oauth2, :ldap] + [:twitter, :github, :gitlab, :bitbucket, :google_oauth2, :ldap] end def enabled_oauth_providers @@ -13,7 +13,7 @@ module OauthHelper def enabled_social_providers enabled_oauth_providers.select do |name| - [:twitter, :gitlab, :github, :google_oauth2].include?(name.to_sym) + [:twitter, :gitlab, :github, :bitbucket, :google_oauth2].include?(name.to_sym) end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 900afde4d9b..8a48a9d3946 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -273,4 +273,8 @@ module ProjectsHelper def gitlab_import_enabled? enabled_oauth_providers.include?(:gitlab) end + + def bitbucket_import_enabled? + enabled_oauth_providers.include?(:bitbucket) + end end diff --git a/app/models/project.rb b/app/models/project.rb index 91ab788083d..d858f7f2937 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -130,7 +130,7 @@ class Project < ActiveRecord::Base validates_uniqueness_of :name, scope: :namespace_id validates_uniqueness_of :path, scope: :namespace_id validates :import_url, - format: { with: URI::regexp(%w(git http https)), message: 'should be a valid url' }, + format: { with: URI::regexp(%w(ssh git http https)), message: 'should be a valid url' }, if: :import? validates :star_count, numericality: { greater_than_or_equal_to: 0 } validate :check_limit, on: :create diff --git a/app/models/user.rb b/app/models/user.rb index 08ad619a90c..b381ee27120 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -46,6 +46,7 @@ # github_access_token :string(255) # notification_email :string(255) # password_automatically_set :boolean default(FALSE) +# bitbucket_access_token :string(255) # require 'carrierwave/orm/activerecord' diff --git a/app/views/import/base/create.js.haml b/app/views/import/base/create.js.haml index cd4c9fbf360..8ebdf4f1a20 100644 --- a/app/views/import/base/create.js.haml +++ b/app/views/import/base/create.js.haml @@ -10,9 +10,16 @@ target_field.append("/" + project_name) target_field.data("project_name", project_name) target_field.find('input').prop("value", origin_namespace) +- elsif @access_denied + :plain + job = $("tr#repo_#{@repo_id}") + job.find(".import-actions").html("

    Access denied! Please verify you can add deploy keys to this repository.

    "") - else :plain job = $("tr#repo_#{@repo_id}") job.attr("id", "project_#{@project.id}") + target_field = job.find(".import-target") + target_field.empty() + target_field.append('#{link_to @project.path_with_namespace, @project}') $("table.import-jobs tbody").prepend(job) job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/bitbucket/status.html.haml b/app/views/import/bitbucket/status.html.haml new file mode 100644 index 00000000000..7a2613e4b03 --- /dev/null +++ b/app/views/import/bitbucket/status.html.haml @@ -0,0 +1,44 @@ +%h3.page-title + %i.fa.fa-bitbucket + Import repositories from Bitbucket + +%p.light + Select projects you want to import. +%hr +%p + = button_tag 'Import all projects', class: "btn btn-success js-import-all" + +%table.table.import-jobs + %thead + %tr + %th From Bitbucket + %th To GitLab + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td= project.import_source + %td + %strong= link_to project.path_with_namespace, project + %td.job-status + - if project.import_status == 'finished' + %span.cgreen + %i.fa.fa-check + done + - elsif project.import_status == 'started' + %i.fa.fa-spinner.fa-spin + started + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo["owner"]}___#{repo["slug"]}"} + %td= "#{repo["owner"]}/#{repo["slug"]}" + %td.import-target + = "#{repo["owner"]}/#{repo["slug"]}" + %td.import-actions.job-status + = button_tag "Import", class: "btn js-add-to-import" + +:coffeescript + $ -> + new ImporterStatus("#{jobs_import_bitbucket_path}", "#{import_bitbucket_path}") diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 84d9903fe15..b1538b1a41e 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -1,6 +1,6 @@ %h3.page-title %i.fa.fa-github - Import repositories from GitHub.com + Import repositories from GitHub %p.light Select projects you want to import. diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml index d1e48dfad20..43db102994f 100644 --- a/app/views/import/gitlab/status.html.haml +++ b/app/views/import/gitlab/status.html.haml @@ -1,5 +1,5 @@ %h3.page-title - %i.fa.fa-github + %i.fa.fa-heart Import repositories from GitLab.com %p.light diff --git a/app/views/projects/_bitbucket_import_modal.html.haml b/app/views/projects/_bitbucket_import_modal.html.haml new file mode 100644 index 00000000000..dd7aacc7e6e --- /dev/null +++ b/app/views/projects/_bitbucket_import_modal.html.haml @@ -0,0 +1,9 @@ +%div#bitbucket_import_modal.modal.hide + .modal-dialog + .modal-content + .modal-header + %a.close{href: "#", "data-dismiss" => "modal"} × + %h3 GitHub OAuth import + .modal-body + You need to setup integration with Bitbucket first. + = link_to 'How to setup integration with Bitbucket', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/bitbucket.md' \ No newline at end of file diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 5216f308110..875c092fd1a 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -53,6 +53,19 @@ Import projects from GitHub = render 'github_import_modal' + .project-import.form-group + .col-sm-2 + .col-sm-10 + - if bitbucket_import_enabled? + = link_to status_import_bitbucket_path do + %i.fa.fa-bitbucket + Import projects from Bitbucket + - else + = link_to '#', class: 'how_to_import_link light' do + %i.fa.fa-bitbucket + Import projects from Bitbucket + = render 'bitbucket_import_modal' + - unless request.host == 'gitlab.com' .project-import.form-group .col-sm-2 diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index 5f9970d3795..d7e759fb470 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -14,6 +14,8 @@ class RepositoryImportWorker Gitlab::GithubImport::Importer.new(project).execute elsif project.import_type == 'gitlab' Gitlab::GitlabImport::Importer.new(project).execute + elsif project.import_type == 'bitbucket' + Gitlab::BitbucketImport::Importer.new(project).execute else true end -- cgit v1.2.1 From 448817c4de965bf7286f33a3447937987a8864a1 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 17 Feb 2015 22:52:32 +0100 Subject: Load public key in initializer. --- app/controllers/application_controller.rb | 13 +++++++++++++ app/controllers/import/bitbucket_controller.rb | 5 +++++ app/controllers/import/github_controller.rb | 5 +++++ app/controllers/import/gitlab_controller.rb | 5 +++++ app/helpers/oauth_helper.rb | 2 ++ app/helpers/projects_helper.rb | 12 ------------ 6 files changed, 30 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index eb3be08df56..7940b5cb3f4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -16,6 +16,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :abilities, :can?, :current_application_settings + helper_method :github_import_enabled?, :gitlab_import_enabled?, :bitbucket_import_enabled? rescue_from Encoding::CompatibilityError do |exception| log_exception(exception) @@ -313,4 +314,16 @@ class ApplicationController < ActionController::Base set_filter_values(merge_requests) merge_requests end + + def github_import_enabled? + OauthHelper.enabled_oauth_providers.include?(:github) + end + + def gitlab_import_enabled? + OauthHelper.enabled_oauth_providers.include?(:gitlab) + end + + def bitbucket_import_enabled? + OauthHelper.enabled_oauth_providers.include?(:bitbucket) && Gitlab::BitbucketImport.public_key.present? + end end diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb index 27e91f49f2b..89de5c5205f 100644 --- a/app/controllers/import/bitbucket_controller.rb +++ b/app/controllers/import/bitbucket_controller.rb @@ -1,4 +1,5 @@ class Import::BitbucketController < Import::BaseController + before_filter :verify_bitbucket_import_enabled before_filter :bitbucket_auth, except: :callback # rescue_from OAuth::Error, with: :bitbucket_unauthorized @@ -55,6 +56,10 @@ class Import::BitbucketController < Import::BaseController @client ||= Gitlab::BitbucketImport::Client.new(current_user.bitbucket_access_token, current_user.bitbucket_access_token_secret) end + def verify_bitbucket_import_enabled + not_found! unless bitbucket_import_enabled? + end + def bitbucket_auth if current_user.bitbucket_access_token.blank? go_to_bitbucket_for_permissions diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index c869c7c86f3..dc7668ee6fd 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -1,4 +1,5 @@ class Import::GithubController < Import::BaseController + before_filter :verify_github_import_enabled before_filter :github_auth, except: :callback rescue_from Octokit::Unauthorized, with: :github_unauthorized @@ -44,6 +45,10 @@ class Import::GithubController < Import::BaseController @client ||= Gitlab::GithubImport::Client.new(current_user.github_access_token) end + def verify_github_import_enabled + not_found! unless github_import_enabled? + end + def github_auth if current_user.github_access_token.blank? go_to_github_for_permissions diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb index a51ea36aff8..74f992b4699 100644 --- a/app/controllers/import/gitlab_controller.rb +++ b/app/controllers/import/gitlab_controller.rb @@ -1,4 +1,5 @@ class Import::GitlabController < Import::BaseController + before_filter :verify_gitlab_import_enabled before_filter :gitlab_auth, except: :callback rescue_from OAuth2::Error, with: :gitlab_unauthorized @@ -41,6 +42,10 @@ class Import::GitlabController < Import::BaseController @client ||= Gitlab::GitlabImport::Client.new(current_user.gitlab_access_token) end + def verify_gitlab_import_enabled + not_found! unless gitlab_import_enabled? + end + def gitlab_auth if current_user.gitlab_access_token.blank? go_to_gitlab_for_permissions diff --git a/app/helpers/oauth_helper.rb b/app/helpers/oauth_helper.rb index 848d74c18c3..1a0ad17b607 100644 --- a/app/helpers/oauth_helper.rb +++ b/app/helpers/oauth_helper.rb @@ -20,4 +20,6 @@ module OauthHelper def additional_providers enabled_oauth_providers.reject{|provider| provider.to_s.starts_with?('ldap')} end + + extend self end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 8a48a9d3946..c85ad12634d 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -265,16 +265,4 @@ module ProjectsHelper "success" end end - - def github_import_enabled? - enabled_oauth_providers.include?(:github) - end - - def gitlab_import_enabled? - enabled_oauth_providers.include?(:gitlab) - end - - def bitbucket_import_enabled? - enabled_oauth_providers.include?(:bitbucket) - end end -- cgit v1.2.1 From 6979b3afd50f86550e523ed66ef22fd153e6cbc8 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 18 Feb 2015 17:00:26 +0100 Subject: Delete deploy key from Bitbucket after importing. --- app/workers/repository_import_worker.rb | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'app') diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index d7e759fb470..437640d2305 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -6,27 +6,27 @@ class RepositoryImportWorker def perform(project_id) project = Project.find(project_id) - result = gitlab_shell.send(:import_repository, + + import_result = gitlab_shell.send(:import_repository, project.path_with_namespace, project.import_url) + return project.import_fail unless import_result - result_of_data_import = if project.import_type == 'github' - Gitlab::GithubImport::Importer.new(project).execute - elsif project.import_type == 'gitlab' - Gitlab::GitlabImport::Importer.new(project).execute - elsif project.import_type == 'bitbucket' - Gitlab::BitbucketImport::Importer.new(project).execute - else - true - end + data_import_result = if project.import_type == 'github' + Gitlab::GithubImport::Importer.new(project).execute + elsif project.import_type == 'gitlab' + Gitlab::GitlabImport::Importer.new(project).execute + elsif project.import_type == 'bitbucket' + Gitlab::BitbucketImport::Importer.new(project).execute + else + true + end + return project.import_fail unless data_import_result - if result && result_of_data_import - project.import_finish - project.save - project.satellite.create unless project.satellite.exists? - project.update_repository_size - else - project.import_fail - end + project.import_finish + project.save + project.satellite.create unless project.satellite.exists? + project.update_repository_size + Gitlab::BitbucketImport::KeyDeleter.new(project).execute if project.import_type == 'bitbucket' end end -- cgit v1.2.1 From a938b3eeb4684f5747f63c23385f870ccbf43d2d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 18 Feb 2015 17:00:39 +0100 Subject: Link to original repo on import status pages. --- app/views/import/bitbucket/status.html.haml | 6 ++++-- app/views/import/github/status.html.haml | 9 +++++++-- app/views/import/gitlab/status.html.haml | 11 ++++++++--- 3 files changed, 19 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/views/import/bitbucket/status.html.haml b/app/views/import/bitbucket/status.html.haml index 7a2613e4b03..cb8c29259cf 100644 --- a/app/views/import/bitbucket/status.html.haml +++ b/app/views/import/bitbucket/status.html.haml @@ -17,7 +17,8 @@ %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td= project.import_source + %td + = link_to project.import_source, "https://bitbucket.org/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, project %td.job-status @@ -33,7 +34,8 @@ - @repos.each do |repo| %tr{id: "repo_#{repo["owner"]}___#{repo["slug"]}"} - %td= "#{repo["owner"]}/#{repo["slug"]}" + %td + = link_to "#{repo["owner"]}/#{repo["slug"]}", "https://bitbucket.org/#{repo["owner"]}/#{repo["slug"]}", target: "_blank" %td.import-target = "#{repo["owner"]}/#{repo["slug"]}" %td.import-actions.job-status diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index b1538b1a41e..dc8ec5e7ae0 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -17,7 +17,8 @@ %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td= project.import_source + %td + = link_to project.import_source, "https://github.com/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, project %td.job-status @@ -25,12 +26,16 @@ %span.cgreen %i.fa.fa-check done + - elsif project.import_status == 'started' + %i.fa.fa-spinner.fa-spin + started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo.id}"} - %td= repo.full_name + %td + = link_to repo.full_name, "https://github.com/#{repo.full_name}", target: "_blank" %td.import-target = repo.full_name %td.import-actions.job-status diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml index 43db102994f..841e660b08f 100644 --- a/app/views/import/gitlab/status.html.haml +++ b/app/views/import/gitlab/status.html.haml @@ -12,12 +12,13 @@ %thead %tr %th From GitLab.com - %th To GitLab private instance + %th To this GitLab instance %th Status %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td= project.import_source + %td + = link_to project.import_source, "https://gitlab.com/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, project %td.job-status @@ -25,12 +26,16 @@ %span.cgreen %i.fa.fa-check done + - elsif project.import_status == 'started' + %i.fa.fa-spinner.fa-spin + started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo["id"]}"} - %td= repo["path_with_namespace"] + %td + = link_to repo["path_with_namespace"], "https://gitlab.com/#{repo["path_with_namespace"]}", target: "_blank" %td.import-target = repo["path_with_namespace"] %td.import-actions.job-status -- cgit v1.2.1 From 20691df230332022cb4d5008d84c7ee6e6c8dbfd Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 18 Feb 2015 22:42:52 +0100 Subject: Add Bitbucket integration docs. --- app/views/import/bitbucket/status.html.haml | 2 +- app/views/import/github/status.html.haml | 2 +- app/views/import/gitlab/status.html.haml | 2 +- app/views/projects/_bitbucket_import_modal.html.haml | 10 +++++++--- app/views/projects/_github_import_modal.html.haml | 10 +++++++--- app/views/projects/_gitlab_import_modal.html.haml | 10 +++++++--- 6 files changed, 24 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/views/import/bitbucket/status.html.haml b/app/views/import/bitbucket/status.html.haml index cb8c29259cf..90c97393b51 100644 --- a/app/views/import/bitbucket/status.html.haml +++ b/app/views/import/bitbucket/status.html.haml @@ -1,6 +1,6 @@ %h3.page-title %i.fa.fa-bitbucket - Import repositories from Bitbucket + Import projects from Bitbucket %p.light Select projects you want to import. diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index dc8ec5e7ae0..957022f382f 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -1,6 +1,6 @@ %h3.page-title %i.fa.fa-github - Import repositories from GitHub + Import projects from GitHub %p.light Select projects you want to import. diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml index 841e660b08f..db161681206 100644 --- a/app/views/import/gitlab/status.html.haml +++ b/app/views/import/gitlab/status.html.haml @@ -1,6 +1,6 @@ %h3.page-title %i.fa.fa-heart - Import repositories from GitLab.com + Import projects from GitLab.com %p.light Select projects you want to import. diff --git a/app/views/projects/_bitbucket_import_modal.html.haml b/app/views/projects/_bitbucket_import_modal.html.haml index dd7aacc7e6e..5c52f91927d 100644 --- a/app/views/projects/_bitbucket_import_modal.html.haml +++ b/app/views/projects/_bitbucket_import_modal.html.haml @@ -3,7 +3,11 @@ .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × - %h3 GitHub OAuth import + %h3 Import projects from Bitbucket .modal-body - You need to setup integration with Bitbucket first. - = link_to 'How to setup integration with Bitbucket', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/bitbucket.md' \ No newline at end of file + To enable importing projects from Bitbucket, + - if current_user.admin? + you need to + - else + your GitLab administrator needs to + == #{link_to 'setup OAuth integration', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/butbucket.md'}. \ No newline at end of file diff --git a/app/views/projects/_github_import_modal.html.haml b/app/views/projects/_github_import_modal.html.haml index 99325e66119..e88a0f7d689 100644 --- a/app/views/projects/_github_import_modal.html.haml +++ b/app/views/projects/_github_import_modal.html.haml @@ -3,7 +3,11 @@ .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × - %h3 GitHub OAuth import + %h3 Import projects from GitHub .modal-body - You need to setup integration with GitHub first. - = link_to 'How to setup integration with GitHub', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/github.md' \ No newline at end of file + To enable importing projects from GitHub, + - if current_user.admin? + you need to + - else + your GitLab administrator needs to + == #{link_to 'setup OAuth integration', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/github.md'}. \ No newline at end of file diff --git a/app/views/projects/_gitlab_import_modal.html.haml b/app/views/projects/_gitlab_import_modal.html.haml index e7503f023b1..52212b6ae02 100644 --- a/app/views/projects/_gitlab_import_modal.html.haml +++ b/app/views/projects/_gitlab_import_modal.html.haml @@ -3,7 +3,11 @@ .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × - %h3 GitLab OAuth import + %h3 Import projects from GitLab.com .modal-body - You need to setup integration with GitLab first. - = link_to 'How to setup integration with GitLab', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/gitlab.md' \ No newline at end of file + To enable importing projects from GitLab.com, + - if current_user.admin? + you need to + - else + your GitLab administrator needs to + == #{link_to 'setup OAuth integration', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/gitlab.md'}. \ No newline at end of file -- cgit v1.2.1 From bc80efb1fd2978a328fdc89a3164f60bcf7ed604 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Sat, 21 Feb 2015 11:07:35 +0100 Subject: Bring Gitorious import page in line with others. --- app/views/import/gitorious/status.html.haml | 11 ++++++++--- app/views/projects/new.html.haml | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/views/import/gitorious/status.html.haml b/app/views/import/gitorious/status.html.haml index 35ed0a717de..c7617ca43df 100644 --- a/app/views/import/gitorious/status.html.haml +++ b/app/views/import/gitorious/status.html.haml @@ -1,6 +1,6 @@ %h3.page-title %i.fa.fa-gitorious - Import repositories from Gitorious.org + Import projects from Gitorious %p.light Select projects you want to import. @@ -17,7 +17,8 @@ %tbody - @already_added_projects.each do |project| %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td= project.import_source + %td + = link_to project.import_source, "https://gitorious.org/#{project.import_source}", target: "_blank" %td %strong= link_to project.path_with_namespace, project %td.job-status @@ -25,12 +26,16 @@ %span.cgreen %i.fa.fa-check done + - elsif project.import_status == 'started' + %i.fa.fa-spinner.fa-spin + started - else = project.human_import_status_name - @repos.each do |repo| %tr{id: "repo_#{repo.id}"} - %td= repo.full_name + %td + = link_to repo.full_name, "https://gitorious.org/#{repo.full_name}", target: "_blank" %td.import-target = repo.full_name %td.import-actions.job-status diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 875c092fd1a..f3d166ffb8f 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -85,7 +85,7 @@ .col-sm-10 = link_to new_import_gitorious_path do %i.fa.fa-heart - Import projects from Gitorious.org + Import projects from Gitorious %hr.prepend-botton-10 -- cgit v1.2.1 From 16c767814a921ab0d7ad3c551bb439a9e270f7b7 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Sat, 21 Feb 2015 11:08:05 +0100 Subject: Re-enable rescuing from Bitbucket OAuth errors. --- app/controllers/import/bitbucket_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb index 89de5c5205f..83ebc5fddca 100644 --- a/app/controllers/import/bitbucket_controller.rb +++ b/app/controllers/import/bitbucket_controller.rb @@ -2,7 +2,7 @@ class Import::BitbucketController < Import::BaseController before_filter :verify_bitbucket_import_enabled before_filter :bitbucket_auth, except: :callback - # rescue_from OAuth::Error, with: :bitbucket_unauthorized + rescue_from OAuth::Error, with: :bitbucket_unauthorized def callback request_token = session.delete(:oauth_request_token) -- cgit v1.2.1 From 46bcf40b2cbc818837c855bebaef1b621e7c5283 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 24 Feb 2015 15:08:42 +0100 Subject: Add ".org" back to Gitorious mentions. --- app/views/import/gitorious/status.html.haml | 4 ++-- app/views/projects/new.html.haml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/views/import/gitorious/status.html.haml b/app/views/import/gitorious/status.html.haml index c7617ca43df..7f1456fef55 100644 --- a/app/views/import/gitorious/status.html.haml +++ b/app/views/import/gitorious/status.html.haml @@ -1,6 +1,6 @@ %h3.page-title %i.fa.fa-gitorious - Import projects from Gitorious + Import projects from Gitorious.org %p.light Select projects you want to import. @@ -11,7 +11,7 @@ %table.table.import-jobs %thead %tr - %th From Gitorious + %th From Gitorious.org %th To GitLab %th Status %tbody diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index f3d166ffb8f..875c092fd1a 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -85,7 +85,7 @@ .col-sm-10 = link_to new_import_gitorious_path do %i.fa.fa-heart - Import projects from Gitorious + Import projects from Gitorious.org %hr.prepend-botton-10 -- cgit v1.2.1 From 1bf9fa8c7fc027b5273c143949e57eac9bef52a4 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 24 Feb 2015 16:28:23 +0100 Subject: Exclude forks from profile contributions list. --- app/controllers/users_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 4c2fe4c3c8d..8a13394dbac 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -6,7 +6,9 @@ class UsersController < ApplicationController def show @contributed_projects = Project. where(id: authorized_projects_ids & @user.contributed_projects_ids). - in_group_namespace.includes(:namespace) + in_group_namespace. + includes(:namespace). + reject(&:forked?) @projects = @user.personal_projects. where(id: authorized_projects_ids).includes(:namespace) -- cgit v1.2.1 From ea31726781296efa9c2493c3f01aa62ca77b45fe Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Tue, 24 Feb 2015 09:06:59 -0800 Subject: Added a margin and a couple styles Added a background, rather than an outline, which should reduce clutter on the screen. --- app/assets/stylesheets/sections/events.scss | 10 ++++++++-- app/helpers/events_helper.rb | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss index b7614513216..a477359dc88 100644 --- a/app/assets/stylesheets/sections/events.scss +++ b/app/assets/stylesheets/sections/events.scss @@ -184,6 +184,12 @@ } } -.event_filter li a { - padding: 5px 10px; +.event_filter { + + li a { + padding: 5px 10px; + background: rgba(0,0,0,0.045); + margin-left: 4px; + } + } diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index db0d4a26611..063916a8df8 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -30,7 +30,7 @@ module EventsHelper end content_tag :li, class: "filter_icon #{active}" do - link_to request.path, class: 'btn has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do + link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) end end -- cgit v1.2.1 From f7c948223d000e4488d864d50f3292a6c7afeaf7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 24 Feb 2015 09:08:34 -0800 Subject: Fix access to attachments uploaded with 'Choose file' button for public access --- app/controllers/files_controller.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app') diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 9671245d3f4..a130bcba9c9 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -1,4 +1,6 @@ class FilesController < ApplicationController + skip_before_filter :authenticate_user!, :reject_blocked + def download note = Note.find(params[:id]) uploader = note.attachment -- cgit v1.2.1 From 5179c5830bb3d8602eb25cc00f53be697c6010ac Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 24 Feb 2015 16:28:40 +0100 Subject: Contributed projects either have user pushes or created MRs. --- app/models/user.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index 21ccc76978e..0c133f0e1e0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -618,9 +618,10 @@ class User < ActiveRecord::Base def contributed_projects_ids Event.where(author_id: self). where("created_at > ?", Time.now - 1.year). - code_push. + where("action = :pushed OR (target_type = 'MergeRequest' AND action = :created)", + pushed: Event::PUSHED, created: Event::CREATED). reorder(project_id: :desc). - select('DISTINCT(project_id)'). - map(&:project_id) + select(:project_id). + uniq end end -- cgit v1.2.1 From 5b6d6bbc195c438de0babb9a1f0b6971bbd5673e Mon Sep 17 00:00:00 2001 From: Sabba Petri Date: Tue, 24 Feb 2015 09:42:35 -0800 Subject: Added square caret to Back to Settings button This was done to show difference between Open/Close toggle, which was using the same arrow as Back to Settings button previously. --- app/views/layouts/nav/_project.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 15b489c7d99..ef31537b84e 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -2,7 +2,7 @@ - if @project_settings_nav = nav_link do = link_to namespace_project_path(@project.namespace, @project), title: 'Back to project', class: "" do - %i.fa.fa-angle-left + %i.fa.fa-caret-square-o-left %span Back to project -- cgit v1.2.1 From f43c0429c25dff42aec395a24057eb8d37ff449d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 24 Feb 2015 21:31:54 -0800 Subject: Improve admin projects and users pages for mobile devices --- app/assets/stylesheets/generic/mobile.scss | 1 + app/views/admin/projects/index.html.haml | 6 ++++-- app/views/admin/users/index.html.haml | 6 ++++-- 3 files changed, 9 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss index 2bb69f4aa7e..b3727c33672 100644 --- a/app/assets/stylesheets/generic/mobile.scss +++ b/app/assets/stylesheets/generic/mobile.scss @@ -69,5 +69,6 @@ background: #EEE; font-size: 20px; color: #777; + z-index: 100; @include box-shadow(0 1px 2px #DDD); } diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 0f9cdfc9e8e..3780500a447 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -1,5 +1,7 @@ .row - .col-md-3 + = link_to '#aside', class: 'show-aside' do + %i.fa.fa-angle-left + %aside.col-md-3 .admin-filter = form_tag admin_namespaces_projects_path, method: :get, class: '' do .form-group @@ -36,7 +38,7 @@ = button_tag "Search", class: "btn submit btn-primary" = link_to "Reset", admin_namespaces_projects_path, class: "btn btn-cancel" - .col-md-9 + %section.col-md-9 .panel.panel-default .panel-heading Projects (#{@projects.total_count}) diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 6e15cec467b..4a4f0549ada 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -1,5 +1,7 @@ .row - .col-md-3 + = link_to '#aside', class: 'show-aside' do + %i.fa.fa-angle-left + %aside.col-md-3 .admin-filter %ul.nav.nav-pills.nav-stacked %li{class: "#{'active' unless params[:filter]}"} @@ -27,7 +29,7 @@ %hr = link_to 'Reset', admin_users_path, class: "btn btn-cancel" - .col-md-9 + %section.col-md-9 .panel.panel-default .panel-heading Users (#{@users.total_count}) -- cgit v1.2.1 From 6fe057cc7b4ec4c7483422ea0fe2b4eb28e315df Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 24 Feb 2015 21:40:47 -0800 Subject: Fix header avatar size --- app/assets/stylesheets/sections/header.scss | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index e255cbcada8..363bc2e9a24 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -86,7 +86,7 @@ header { .container { width: 100% !important; - padding-left: 0px; + padding: 0px; } /** @@ -134,14 +134,13 @@ header { } .profile-pic { - position: relative; - top: -1px; - padding-right: 0px !important; + padding: 0px !important; + width: 46px; + height: 46px; + margin-left: 5px; img { - width: 50px; - height: 50px; - margin: -15px; - margin-left: 5px; + width: 46px; + height: 46px; } } -- cgit v1.2.1 From 1faf3676aa023395c468d4e89224726c8e5b9b7d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 24 Feb 2015 22:19:14 -0800 Subject: Refactor gitlab themes css --- app/assets/stylesheets/sections/header.scss | 62 ------------------------ app/assets/stylesheets/themes/dark-theme.scss | 69 +++++++++++++++++++++++++++ app/assets/stylesheets/themes/ui_color.scss | 40 +--------------- app/assets/stylesheets/themes/ui_gray.scss | 30 +----------- app/assets/stylesheets/themes/ui_mars.scss | 36 +------------- app/assets/stylesheets/themes/ui_modern.scss | 40 +--------------- 6 files changed, 77 insertions(+), 200 deletions(-) create mode 100644 app/assets/stylesheets/themes/dark-theme.scss (limited to 'app') diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index 363bc2e9a24..28fbe03ee75 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -173,68 +173,6 @@ header { @include transition(all 0.15s ease-in 0s); } } - - - /* - * Dark header - * - */ - &.header-dark { - &.navbar-gitlab { - .navbar-inner { - background: #708090; - border-bottom: 1px solid #AAA; - - .navbar-toggle { color: #fff; } - - .nav > li > a { - color: #AAA; - - &:hover, &:focus, &:active { - background: none; - color: #FFF; - } - } - } - } - - .turbolink-spinner { - color: #FFF; - } - - .search { - .search-input { - background-color: #D2D5DA; - background-color: rgba(255, 255, 255, 0.5); - border: 1px solid #AAA; - - &:focus { - background-color: white; - } - } - } - .search-input::-webkit-input-placeholder { - color: #666; - } - .app_logo { - a { - h1 { - background: image-url('logo-white.png') no-repeat center center; - background-size: 32px; - color: #fff; - } - } - } - .title { - a { - color: #FFF; - &:hover { - text-decoration: underline; - } - } - color: #fff; - } - } } .search .search-input { diff --git a/app/assets/stylesheets/themes/dark-theme.scss b/app/assets/stylesheets/themes/dark-theme.scss new file mode 100644 index 00000000000..abb1ba6686d --- /dev/null +++ b/app/assets/stylesheets/themes/dark-theme.scss @@ -0,0 +1,69 @@ +@mixin dark-theme($color-light, $color, $color-darker, $color-dark) { + header { + &.navbar-gitlab { + .navbar-inner { + background: $color; + + .navbar-toggle { + color: #FFF; + } + + .app_logo, .navbar-toggle { + &:hover { + background-color: $color-darker; + } + + h1 { + background: image-url('logo-white.png') no-repeat center center; + background-size: 32px; + color: #FFF; + } + } + + .app_logo { + background-color: $color-dark; + } + + .title { + color: #FFF; + + a { + color: #FFF; + &:hover { + text-decoration: underline; + } + } + } + + .search { + .search-input { + background-color: $color-light; + background-color: rgba(255, 255, 255, 0.5); + border: 1px solid $color-light; + + &:focus { + background-color: white; + } + } + } + + .search-input::-webkit-input-placeholder { + color: #666; + } + + .nav > li > a { + color: $color-light; + + &:hover, &:focus, &:active { + background: none; + color: #FFF; + } + } + + .search-input { + border-color: $color-light; + } + } + } + } +} diff --git a/app/assets/stylesheets/themes/ui_color.scss b/app/assets/stylesheets/themes/ui_color.scss index 3c441a8e098..7ac6903b2e4 100644 --- a/app/assets/stylesheets/themes/ui_color.scss +++ b/app/assets/stylesheets/themes/ui_color.scss @@ -1,42 +1,6 @@ /** - * This file represent some UI that can be changed - * during web app restyle or theme select. - * - * Next items should be placed there - * - link colors - * - header restyles - * + * Violet GitLab UI theme */ .ui_color { - /* - * Application Header - * - */ - header { - @extend .header-dark; - &.navbar-gitlab { - .navbar-inner { - background: #548; - border-bottom: 1px solid #436; - .app_logo, .navbar-toggle { - &:hover { - background-color: #436; - } - } - .app_logo { - background-color: #325; - } - .nav > li > a { - color: #98C; - } - .search-input { - border-color: #98C; - } - } - } - } - - .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - background: #659; - } + @include dark-theme(#98C, #548, #436, #325); } diff --git a/app/assets/stylesheets/themes/ui_gray.scss b/app/assets/stylesheets/themes/ui_gray.scss index 8df08ccaeec..9257e5f4d40 100644 --- a/app/assets/stylesheets/themes/ui_gray.scss +++ b/app/assets/stylesheets/themes/ui_gray.scss @@ -1,32 +1,6 @@ /** - * This file represent some UI that can be changed - * during web app restyle or theme select. - * - * Next items should be placed there - * - link colors - * - header restyles - * + * Gray GitLab UI theme */ .ui_gray { - /* - * Application Header - * - */ - header { - @extend .header-dark; - &.navbar-gitlab { - .navbar-inner { - background: #373737; - border-bottom: 1px solid #272727; - .app_logo, .navbar-toggle { - &:hover { - background-color: #272727; - } - } - .app_logo { - background-color: #222; - } - } - } - } + @include dark-theme(#979797, #373737, #272727, #222222); } diff --git a/app/assets/stylesheets/themes/ui_mars.scss b/app/assets/stylesheets/themes/ui_mars.scss index b08cbda6c4f..4caf5843d9b 100644 --- a/app/assets/stylesheets/themes/ui_mars.scss +++ b/app/assets/stylesheets/themes/ui_mars.scss @@ -1,38 +1,6 @@ /** - * This file represent some UI that can be changed - * during web app restyle or theme select. - * - * Next items should be placed there - * - link colors - * - header restyles - * + * Classic GitLab UI theme */ .ui_mars { - /* - * Application Header - * - */ - header { - @extend .header-dark; - &.navbar-gitlab { - .navbar-inner { - background: #474D57; - border-bottom: 1px solid #373D47; - .app_logo, .navbar-toggle { - &:hover { - background-color: #373D47; - } - } - .app_logo { - background-color: #24272D; - } - .nav > li > a { - color: #979DA7; - } - .search-input { - border-color: #979DA7; - } - } - } - } + @include dark-theme(#979DA7, #474D57, #373D47, #24272D); } diff --git a/app/assets/stylesheets/themes/ui_modern.scss b/app/assets/stylesheets/themes/ui_modern.scss index 34f39614ca4..70449882317 100644 --- a/app/assets/stylesheets/themes/ui_modern.scss +++ b/app/assets/stylesheets/themes/ui_modern.scss @@ -1,42 +1,6 @@ /** - * This file represent some UI that can be changed - * during web app restyle or theme select. - * - * Next items should be placed there - * - link colors - * - header restyles - * + * Modern GitLab UI theme */ .ui_modern { - /* - * Application Header - * - */ - header { - @extend .header-dark; - &.navbar-gitlab { - .navbar-inner { - background: #019875; - border-bottom: 1px solid #019875; - .app_logo, .navbar-toggle { - &:hover { - background-color: #018865; - } - } - .app_logo { - background-color: #017855; - } - .nav > li > a { - color: #ADC; - } - .search-input { - border-color: #8ba; - } - } - } - } - - .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - background: #019875; - } + @include dark-theme(#ADC, #019875, #018865, #017855); } -- cgit v1.2.1 From 6e559be6c68b921e12518816a824724564e3e315 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 24 Feb 2015 22:58:47 -0800 Subject: Refactor header logo and setup expectation on it size --- app/assets/images/logo-black.png | Bin 2608 -> 3897 bytes app/assets/images/logo-white.png | Bin 7331 -> 7699 bytes app/assets/stylesheets/sections/header.scss | 20 ++++++++------------ app/assets/stylesheets/themes/dark-theme.scss | 6 ------ app/helpers/appearances_helper.rb | 8 ++++++++ app/views/layouts/_head_panel.html.haml | 2 +- app/views/layouts/_public_head_panel.html.haml | 4 +--- 7 files changed, 18 insertions(+), 22 deletions(-) (limited to 'app') diff --git a/app/assets/images/logo-black.png b/app/assets/images/logo-black.png index 49cdc16cacd..a58645ed7b0 100644 Binary files a/app/assets/images/logo-black.png and b/app/assets/images/logo-black.png differ diff --git a/app/assets/images/logo-white.png b/app/assets/images/logo-white.png index 2299153caba..917bcfcb7e7 100644 Binary files a/app/assets/images/logo-white.png and b/app/assets/images/logo-white.png differ diff --git a/app/assets/stylesheets/sections/header.scss b/app/assets/stylesheets/sections/header.scss index 28fbe03ee75..26b4d04106e 100644 --- a/app/assets/stylesheets/sections/header.scss +++ b/app/assets/stylesheets/sections/header.scss @@ -100,18 +100,14 @@ header { a { float: left; - padding: 0px; - margin: 0 6px; - - h1 { - margin: 0; - background: image-url('logo-black.png') no-repeat center center; - background-size: 32px; - float: left; - height: 46px; - width: 40px; - @include header-font; - text-indent: -9999px; + padding: 5px 0; + height: 46px; + width: 52px; + text-align: center; + + img { + width: 36px; + height: 36px; } } &:hover { diff --git a/app/assets/stylesheets/themes/dark-theme.scss b/app/assets/stylesheets/themes/dark-theme.scss index abb1ba6686d..b7b22a8724e 100644 --- a/app/assets/stylesheets/themes/dark-theme.scss +++ b/app/assets/stylesheets/themes/dark-theme.scss @@ -12,12 +12,6 @@ &:hover { background-color: $color-darker; } - - h1 { - background: image-url('logo-white.png') no-repeat center center; - background-size: 32px; - color: #FFF; - } } .app_logo { diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb index 96e5d43a369..21e8557abc7 100644 --- a/app/helpers/appearances_helper.rb +++ b/app/helpers/appearances_helper.rb @@ -14,4 +14,12 @@ module AppearancesHelper def brand_text nil end + + def brand_header_logo + if theme_type == 'light_theme' + image_tag 'logo-black.png' + else + image_tag 'logo-white.png' + end + end end diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index d5928d2ed25..fc8a487ece7 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -3,7 +3,7 @@ .container %div.app_logo = link_to root_path, class: "home has_bottom_tooltip", title: "Dashboard" do - %h1 GITLAB + = brand_header_logo %h1.title= title %button.navbar-toggle{"data-target" => ".navbar-collapse", "data-toggle" => "collapse", type: "button"} diff --git a/app/views/layouts/_public_head_panel.html.haml b/app/views/layouts/_public_head_panel.html.haml index e912fea2aee..bd6bb3c720d 100644 --- a/app/views/layouts/_public_head_panel.html.haml +++ b/app/views/layouts/_public_head_panel.html.haml @@ -2,10 +2,8 @@ .navbar-inner .container %div.app_logo - %span.separator = link_to explore_root_path, class: "home" do - %h1 GITLAB - %span.separator + = brand_header_logo %h1.title= title %button.navbar-toggle{"data-target" => ".navbar-collapse", "data-toggle" => "collapse", type: "button"} -- cgit v1.2.1 From ee343661e18ccd95f2c74e7bc0d0116a100270ea Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 24 Feb 2015 23:17:11 -0800 Subject: Get rid of black logo --- app/assets/images/logo-black.png | Bin 3897 -> 0 bytes app/assets/stylesheets/themes/ui_basic.scss | 11 +++++++++-- app/helpers/appearances_helper.rb | 6 +----- 3 files changed, 10 insertions(+), 7 deletions(-) delete mode 100644 app/assets/images/logo-black.png (limited to 'app') diff --git a/app/assets/images/logo-black.png b/app/assets/images/logo-black.png deleted file mode 100644 index a58645ed7b0..00000000000 Binary files a/app/assets/images/logo-black.png and /dev/null differ diff --git a/app/assets/stylesheets/themes/ui_basic.scss b/app/assets/stylesheets/themes/ui_basic.scss index 0dad9917b55..097d5c5b73c 100644 --- a/app/assets/stylesheets/themes/ui_basic.scss +++ b/app/assets/stylesheets/themes/ui_basic.scss @@ -10,8 +10,15 @@ background: #F1F1F1; border-bottom: 1px solid #DDD; - .app_logo { - background-color: #DDD; + .title { + color: #555; + + a { + color: #555; + &:hover { + text-decoration: underline; + } + } } .nav > li > a { diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb index 21e8557abc7..bb8d5683807 100644 --- a/app/helpers/appearances_helper.rb +++ b/app/helpers/appearances_helper.rb @@ -16,10 +16,6 @@ module AppearancesHelper end def brand_header_logo - if theme_type == 'light_theme' - image_tag 'logo-black.png' - else - image_tag 'logo-white.png' - end + image_tag 'logo-white.png' end end -- cgit v1.2.1 From 878e86bf64ce09938c1f2cc4dd1555029969a7c2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 24 Feb 2015 23:26:32 -0800 Subject: Remove unnecessary theme_type from body class --- app/views/layouts/admin.html.haml | 2 +- app/views/layouts/application.html.haml | 2 +- app/views/layouts/errors.html.haml | 2 +- app/views/layouts/explore.html.haml | 2 +- app/views/layouts/group.html.haml | 2 +- app/views/layouts/navless.html.haml | 2 +- app/views/layouts/profile.html.haml | 2 +- app/views/layouts/project_settings.html.haml | 2 +- app/views/layouts/projects.html.haml | 2 +- app/views/layouts/public_group.html.haml | 2 +- app/views/layouts/public_projects.html.haml | 2 +- app/views/layouts/public_users.html.haml | 2 +- app/views/layouts/search.html.haml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) (limited to 'app') diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index e8751a6987e..ab84e87c300 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -1,6 +1,6 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Admin area" - %body{class: "#{app_theme} #{theme_type} admin", :'data-page' => body_data_page} + %body{class: "#{app_theme} admin", :'data-page' => body_data_page} = render "layouts/head_panel", title: link_to("Admin area", admin_root_path) = render 'layouts/page', sidebar: 'layouts/nav/admin' diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 49123744ffa..6bd8ac4adb8 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,6 +1,6 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Dashboard" - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page } + %body{class: "#{app_theme} application", :'data-page' => body_data_page } = render "layouts/head_panel", title: link_to("Dashboard", root_path) = render 'layouts/page', sidebar: 'layouts/nav/dashboard' diff --git a/app/views/layouts/errors.html.haml b/app/views/layouts/errors.html.haml index e7d875173e6..e51fd4cb820 100644 --- a/app/views/layouts/errors.html.haml +++ b/app/views/layouts/errors.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Error" - %body{class: "#{app_theme} #{theme_type} application"} + %body{class: "#{app_theme} application"} = render "layouts/head_panel", title: "" if current_user .container.navless-container = render "layouts/flash" diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index 09855b222dc..2bd0b8d85c9 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -2,7 +2,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: page_title - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" - if current_user = render "layouts/head_panel", title: link_to(page_title, explore_root_path) diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index fa0ed317ce1..f4a6bee15f6 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -1,6 +1,6 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/head_panel", title: link_to(@group.name, group_path(@group)) = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/navless.html.haml b/app/views/layouts/navless.html.haml index a3b55542bf7..4d0278251a6 100644 --- a/app/views/layouts/navless.html.haml +++ b/app/views/layouts/navless.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: defined?(@title_url) ? link_to(@title, @title_url) : @title .container.navless-container diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 19d6efed78e..2b5be7fc372 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -1,6 +1,6 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Profile" - %body{class: "#{app_theme} #{theme_type} profile", :'data-page' => body_data_page} + %body{class: "#{app_theme} profile", :'data-page' => body_data_page} = render "layouts/head_panel", title: link_to("Profile", profile_path) = render 'layouts/page', sidebar: 'layouts/nav/profile' diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index d2c9c2a991c..0a0039dec16 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} #{theme_type} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" - @project_settings_nav = true diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml index c44a40c9c12..dde0964f47f 100644 --- a/app/views/layouts/projects.html.haml +++ b/app/views/layouts/projects.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: project_head_title - %body{class: "#{app_theme} #{theme_type} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } + %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } = render "layouts/head_panel", title: project_title(@project) = render "layouts/init_auto_complete" = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_group.html.haml b/app/views/layouts/public_group.html.haml index 4b69329b8fe..b9b1d03e08e 100644 --- a/app/views/layouts/public_group.html.haml +++ b/app/views/layouts/public_group.html.haml @@ -1,6 +1,6 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/public_head_panel", title: link_to(@group.name, group_path(@group)) = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/public_projects.html.haml b/app/views/layouts/public_projects.html.haml index 027e9a53139..04fa7c84e73 100644 --- a/app/views/layouts/public_projects.html.haml +++ b/app/views/layouts/public_projects.html.haml @@ -1,6 +1,6 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/public_head_panel", title: project_title(@project) = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_users.html.haml b/app/views/layouts/public_users.html.haml index 3538a8b1699..71c16bd1684 100644 --- a/app/views/layouts/public_users.html.haml +++ b/app/views/layouts/public_users.html.haml @@ -1,6 +1,6 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: @title - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/public_head_panel", title: defined?(@title_url) ? link_to(@title, @title_url) : @title = render 'layouts/page' diff --git a/app/views/layouts/search.html.haml b/app/views/layouts/search.html.haml index 177e2073a0d..f9d8db06e10 100644 --- a/app/views/layouts/search.html.haml +++ b/app/views/layouts/search.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head", title: "Search" - %body{class: "#{app_theme} #{theme_type} application", :'data-page' => body_data_page} + %body{class: "#{app_theme} application", :'data-page' => body_data_page} = render "layouts/broadcast" = render "layouts/head_panel", title: link_to("Search", search_path) .container.navless-container -- cgit v1.2.1 From 9c6f0487950f1b510d7222885ed8591607b4fe9b Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Wed, 25 Feb 2015 12:18:15 +0200 Subject: Fix GitLab importer. Hide already imported projects --- app/controllers/import/gitlab_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb index a51ea36aff8..c18178abf76 100644 --- a/app/controllers/import/gitlab_controller.rb +++ b/app/controllers/import/gitlab_controller.rb @@ -16,7 +16,7 @@ class Import::GitlabController < Import::BaseController @already_added_projects = current_user.created_projects.where(import_type: "gitlab") already_added_projects_names = @already_added_projects.pluck(:import_source) - @repos.to_a.reject!{ |repo| already_added_projects_names.include? repo["path_with_namespace"] } + @repos = @repos.to_a.reject{ |repo| already_added_projects_names.include? repo["path_with_namespace"] } end def jobs -- cgit v1.2.1 From 00c631573f1f7564cfd8d823dce761fc6c76e2bc Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 25 Feb 2015 15:16:24 +0100 Subject: Fix Gitorious import status page hiding of already added projects. --- app/controllers/import/gitorious_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/import/gitorious_controller.rb b/app/controllers/import/gitorious_controller.rb index 627b4a171b8..6067a87ee04 100644 --- a/app/controllers/import/gitorious_controller.rb +++ b/app/controllers/import/gitorious_controller.rb @@ -15,7 +15,7 @@ class Import::GitoriousController < Import::BaseController @already_added_projects = current_user.created_projects.where(import_type: "gitorious") already_added_projects_names = @already_added_projects.pluck(:import_source) - @repos.to_a.reject! { |repo| already_added_projects_names.include? repo.full_name } + @repos.reject! { |repo| already_added_projects_names.include? repo.full_name } end def jobs -- cgit v1.2.1 From a672b4688309dc356922bd3f9c61b8ae9de018f8 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 25 Feb 2015 17:34:01 +0100 Subject: Include number of affected people in all/group mention autocomplete item. --- app/services/projects/participants_service.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb index 0be50fed7cc..f6f9aceef95 100644 --- a/app/services/projects/participants_service.rb +++ b/app/services/projects/participants_service.rb @@ -35,15 +35,21 @@ module Projects end def sorted(users) - users.uniq.to_a.compact.sort_by(&:username).map { |user| { username: user.username, name: user.name } } + users.uniq.to_a.compact.sort_by(&:username).map do |user| + { username: user.username, name: user.name } + end end def groups - @user.authorized_groups.sort_by(&:path).map { |group| { username: group.path, name: group.name } } + @user.authorized_groups.sort_by(&:path).map do |group| + count = group.users.count + { username: group.path, name: "#{group.name} (#{count})" } + end end def all_members - [{ username: "all", name: "Project and Group Members" }] + count = @project.team.members.flatten.count + [{ username: "all", name: "All Project and Group Members (#{count})" }] end end end -- cgit v1.2.1 From 1511506f724d2ac33c2c8221035109961b36b28a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 25 Feb 2015 15:17:20 -0800 Subject: Fix git syntax issue --- app/models/repository.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/repository.rb b/app/models/repository.rb index 4e45a6723b8..bbf35f04bbc 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -238,7 +238,7 @@ class Repository end def last_commit_for_path(sha, path) - args = %W(git rev-list --max-count 1 #{sha} -- #{path}) + args = %W(git rev-list --max-count=1 #{sha} -- #{path}) sha = Gitlab::Popen.popen(args, path_to_repo).first.strip commit(sha) end -- cgit v1.2.1 From 1da71cc520dd09098d8f756de3f58b8e2f153fcd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 25 Feb 2015 19:34:16 -0800 Subject: Introduce shortcuts for routing helpers --- app/controllers/projects/avatars_controller.rb | 2 +- app/controllers/projects/repositories_controller.rb | 2 +- app/controllers/projects_controller.rb | 8 ++++---- app/helpers/gitlab_routing_helper.rb | 18 ++++++++++++++++++ app/helpers/projects_helper.rb | 4 ++-- app/views/admin/projects/show.html.haml | 4 ++-- app/views/dashboard/_project.html.haml | 2 +- app/views/dashboard/projects.html.haml | 2 +- app/views/groups/_projects.html.haml | 2 +- app/views/layouts/nav/_project.html.haml | 6 +++--- app/views/projects/_settings_nav.html.haml | 2 +- app/views/projects/diffs/_warning.html.haml | 4 ++-- app/views/projects/issues/_discussion.html.haml | 4 ++-- app/views/projects/issues/_issue.html.haml | 8 ++++---- app/views/projects/issues/show.html.haml | 4 ++-- .../projects/merge_requests/_discussion.html.haml | 4 ++-- app/views/projects/merge_requests/_show.html.haml | 10 +++++----- .../projects/merge_requests/show/_mr_title.html.haml | 4 ++-- app/views/projects/milestones/_issue.html.haml | 2 +- app/views/projects/milestones/_merge_request.html.haml | 2 +- app/views/projects/no_repo.html.haml | 2 +- 21 files changed, 57 insertions(+), 39 deletions(-) create mode 100644 app/helpers/gitlab_routing_helper.rb (limited to 'app') diff --git a/app/controllers/projects/avatars_controller.rb b/app/controllers/projects/avatars_controller.rb index b90a95c3aab..a482b90880d 100644 --- a/app/controllers/projects/avatars_controller.rb +++ b/app/controllers/projects/avatars_controller.rb @@ -24,6 +24,6 @@ class Projects::AvatarsController < Projects::ApplicationController @project.save @project.reset_events_cache - redirect_to edit_namespace_project_path(@project.namespace, @project) + redirect_to edit_project_path(@project) end end diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index 245dfb7bb9a..cbb888b25e8 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -7,7 +7,7 @@ class Projects::RepositoriesController < Projects::ApplicationController def create @project.create_repository - redirect_to namespace_project_path(@project.namespace, @project) + redirect_to project_path(@project) end def archive diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 8a055cc2a36..5486a97e51d 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -23,7 +23,7 @@ class ProjectsController < ApplicationController if @project.saved? redirect_to( - namespace_project_path(@project.namespace, @project), + project_path(@project), notice: 'Project was successfully created.' ) else @@ -39,7 +39,7 @@ class ProjectsController < ApplicationController flash[:notice] = 'Project was successfully updated.' format.html do redirect_to( - edit_namespace_project_path(@project.namespace, @project), + edit_project_path(@project), notice: 'Project was successfully updated.' ) end @@ -133,7 +133,7 @@ class ProjectsController < ApplicationController @project.archive! respond_to do |format| - format.html { redirect_to namespace_project_path(@project.namespace, @project) } + format.html { redirect_to project_path(@project) } end end @@ -142,7 +142,7 @@ class ProjectsController < ApplicationController @project.unarchive! respond_to do |format| - format.html { redirect_to namespace_project_path(@project.namespace, @project) } + format.html { redirect_to project_path(@project) } end end diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb new file mode 100644 index 00000000000..932e0d29149 --- /dev/null +++ b/app/helpers/gitlab_routing_helper.rb @@ -0,0 +1,18 @@ +# Shorter routing method for project and project items +module GitlabRoutingHelper + def project_path(project, *args) + namespace_project_path(project.namespace, project, *args) + end + + def edit_project_path(project, *args) + edit_namespace_project_path(project.namespace, project, *args) + end + + def issue_path(entity, *args) + namespace_project_issue_path(entity.project.namespace, entity.project, entity, *args) + end + + def merge_request_path(entity, *args) + namespace_project_merge_request_path(entity.project.namespace, entity.project, entity, *args) + end +end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index c85ad12634d..a5d7372bbe5 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -46,7 +46,7 @@ module ProjectsHelper simple_sanitize(project.group.name), group_path(project.group) ) + ' / ' + link_to(simple_sanitize(project.name), - namespace_project_path(project.namespace, project)) + project_path(project)) end else owner = project.namespace.owner @@ -55,7 +55,7 @@ module ProjectsHelper simple_sanitize(owner.name), user_path(owner) ) + ' / ' + link_to(simple_sanitize(project.name), - namespace_project_path(project.namespace, project)) + project_path(project)) end end end diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 3bcf1cc9ede..1421c2ea909 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -1,6 +1,6 @@ %h3.page-title Project: #{@project.name_with_namespace} - = link_to edit_namespace_project_path(@project.namespace, @project), class: "btn pull-right" do + = link_to edit_project_path(@project), class: "btn pull-right" do %i.fa.fa-pencil-square-o Edit %hr @@ -13,7 +13,7 @@ %li %span.light Name: %strong - = link_to @project.name, namespace_project_path(@project.namespace, @project) + = link_to @project.name, project_path(@project) %li %span.light Namespace: %strong diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index 3dd69df523d..fa9179cb249 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,4 +1,4 @@ -= link_to namespace_project_path(project.namespace, project), class: dom_class(project) do += link_to project_path(project), class: dom_class(project) do .dash-project-avatar = project_icon(project, alt: '', class: 'avatar project-avatar s40') .dash-project-access-icon diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index e57e1e0939e..15db8592547 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -19,7 +19,7 @@ = project_icon("#{project.namespace.to_param}/#{project.to_param}", alt: '', class: 'avatar project-avatar s60') .project-access-icon = visibility_level_icon(project.visibility_level) - = link_to namespace_project_path(project.namespace, project), class: dom_class(project) do + = link_to project_path(project), class: dom_class(project) do %strong= project.name_with_namespace - if project.forked_from_project diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 2f28470f8be..b505760fa8f 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -11,7 +11,7 @@ .nothing-here-block This group has no projects yet - projects.each do |project| %li.project-row - = link_to namespace_project_path(project.namespace, project), class: dom_class(project) do + = link_to project_path(project), class: dom_class(project) do .dash-project-avatar = project_icon(project, alt: '', class: 'avatar s40') .dash-project-access-icon diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index ef31537b84e..d340ab1796a 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -1,7 +1,7 @@ %ul.project-navigation.nav.nav-sidebar - if @project_settings_nav = nav_link do - = link_to namespace_project_path(@project.namespace, @project), title: 'Back to project', class: "" do + = link_to project_path(@project), title: 'Back to project', class: "" do %i.fa.fa-caret-square-o-left %span Back to project @@ -12,7 +12,7 @@ - else = nav_link(path: 'projects#show', html_options: {class: "home"}) do - = link_to namespace_project_path(@project.namespace, @project), title: 'Project', class: 'shortcuts-project' do + = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do %i.fa.fa-dashboard %span Project @@ -89,7 +89,7 @@ - if project_nav_tab? :settings = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_namespace_project_path(@project.namespace, @project), title: 'Settings', class: "stat-tab tab no-highlight" do + = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do %i.fa.fa-cogs %span Settings diff --git a/app/views/projects/_settings_nav.html.haml b/app/views/projects/_settings_nav.html.haml index 1a18bb065ad..7fc3d44034f 100644 --- a/app/views/projects/_settings_nav.html.haml +++ b/app/views/projects/_settings_nav.html.haml @@ -1,6 +1,6 @@ %ul.project-settings-nav.sidebar-subnav = nav_link(path: 'projects#edit') do - = link_to edit_namespace_project_path(@project.namespace, @project), title: 'Project', class: "stat-tab tab " do + = link_to edit_project_path(@project), title: 'Project', class: "stat-tab tab " do %i.fa.fa-pencil-square-o %span Project diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml index 5725c84600f..c9a6b3ebd9e 100644 --- a/app/views/projects/diffs/_warning.html.haml +++ b/app/views/projects/diffs/_warning.html.haml @@ -10,8 +10,8 @@ = link_to "Plain diff", namespace_project_commit_path(@project.namespace, @project, @commit, format: :diff), class: "btn btn-warning btn-small" = link_to "Email patch", namespace_project_commit_path(@project.namespace, @project, @commit, format: :patch), class: "btn btn-warning btn-small" - elsif @merge_request && @merge_request.persisted? - = link_to "Plain diff", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :diff), class: "btn btn-warning btn-small" - = link_to "Email patch", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :patch), class: "btn btn-warning btn-small" + = link_to "Plain diff", merge_request_path(@merge_request, format: :diff), class: "btn btn-warning btn-small" + = link_to "Email patch", merge_request_path(@merge_request, format: :patch), class: "btn btn-warning btn-small" %p To preserve performance only %strong #{allowed_diff_size} of #{diffs.size} diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index 2bd3d8a73e1..fc3e35640dc 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -1,9 +1,9 @@ - content_for :note_actions do - if can?(current_user, :modify_issue, @issue) - if @issue.closed? - = link_to 'Reopen Issue', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' + = link_to 'Reopen Issue', issue_path(@issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' - else - = link_to 'Close Issue', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" + = link_to 'Close Issue', issue_path(@issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" .row %section.col-md-9 .participants diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 8af8da1d13e..01e2133e283 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -1,11 +1,11 @@ -%li{ id: dom_id(issue), class: issue_css_classes(issue), url: namespace_project_issue_path(issue.project.namespace, issue.project, issue) } +%li{ id: dom_id(issue), class: issue_css_classes(issue), url: issue_path(issue) } - if controller.controller_name == 'issues' .issue-check = check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue", disabled: !can?(current_user, :modify_issue, issue) .issue-title %span.str-truncated - = link_to_gfm issue.title, namespace_project_issue_path(issue.project.namespace, issue.project, issue), class: "row_title" + = link_to_gfm issue.title, issue_path(issue), class: "row_title" .pull-right.light - if issue.closed? %span @@ -41,9 +41,9 @@ .issue-actions - if can? current_user, :modify_issue, issue - if issue.closed? - = link_to 'Reopen', namespace_project_issue_path(issue.project.namespace, issue.project, issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-small btn-grouped reopen_issue btn-reopen", remote: true + = link_to 'Reopen', issue_path(issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-small btn-grouped reopen_issue btn-reopen", remote: true - else - = link_to 'Close', namespace_project_issue_path(issue.project.namespace, issue.project, issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-small btn-grouped close_issue btn-close", remote: true + = link_to 'Close', issue_path(issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-small btn-grouped close_issue btn-close", remote: true = link_to edit_namespace_project_issue_path(issue.project.namespace, issue.project, issue), class: "btn btn-small edit-issue-link btn-grouped" do %i.fa.fa-pencil-square-o Edit diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 6849a15e7e9..bd28d8a1db2 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -17,9 +17,9 @@ New Issue - if can?(current_user, :modify_issue, @issue) - if @issue.closed? - = link_to 'Reopen', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" + = link_to 'Reopen', issue_path(@issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" - else - = link_to 'Close', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" + = link_to 'Close', issue_path(@issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" = link_to edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: "btn btn-grouped issuable-edit" do %i.fa.fa-pencil-square-o diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index 2df35aac025..79a093dc775 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -1,9 +1,9 @@ - content_for :note_actions do - if can?(current_user, :modify_merge_request, @merge_request) - if @merge_request.open? - = link_to 'Close', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" + = link_to 'Close', merge_request_path(@merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" - if @merge_request.closed? - = link_to 'Reopen', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" + = link_to 'Reopen', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request" .row %section.col-md-9 diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index a53aed2f38a..ca4ceecb225 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,4 +1,4 @@ -.merge-request{'data-url' => namespace_project_merge_request_path(@project.namespace, @project, @merge_request)} +.merge-request{'data-url' => merge_request_path(@merge_request)} .merge-request-details = render "projects/merge_requests/show/mr_title" %hr @@ -28,8 +28,8 @@ Download as %span.caret %ul.dropdown-menu - %li= link_to "Email Patches", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :patch) - %li= link_to "Plain Diff", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :diff) + %li= link_to "Email Patches", merge_request_path(@merge_request, format: :patch) + %li= link_to "Plain Diff", merge_request_path(@merge_request, format: :diff) = render "projects/merge_requests/show/how_to_merge" = render "projects/merge_requests/show/state_widget" @@ -37,12 +37,12 @@ - if @commits.present? %ul.nav.nav-tabs.merge-request-tabs %li.notes-tab{data: {action: 'notes'}} - = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request) do + = link_to merge_request_path(@merge_request) do %i.fa.fa-comments Discussion %span.badge= @merge_request.mr_and_commit_notes.count %li.commits-tab{data: {action: 'commits'}} - = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request), title: 'Commits' do + = link_to merge_request_path(@merge_request), title: 'Commits' do %i.fa.fa-history Commits %span.badge= @commits.size diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml index 4c230953cb3..46e92a9c558 100644 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ b/app/views/projects/merge_requests/show/_mr_title.html.haml @@ -14,9 +14,9 @@ .issue-btn-group.pull-right - if can?(current_user, :modify_merge_request, @merge_request) - if @merge_request.open? - = link_to 'Close', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-grouped btn-close", title: "Close merge request" + = link_to 'Close', merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-grouped btn-close", title: "Close merge request" = link_to edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), class: "btn btn-grouped issuable-edit", id: "edit_merge_request" do %i.fa.fa-pencil-square-o Edit - if @merge_request.closed? - = link_to 'Reopen', namespace_project_merge_request_path(@project.namespace, @project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link", title: "Close merge request" + = link_to 'Reopen', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link", title: "Close merge request" diff --git a/app/views/projects/milestones/_issue.html.haml b/app/views/projects/milestones/_issue.html.haml index 36463371f4f..26c83841a22 100644 --- a/app/views/projects/milestones/_issue.html.haml +++ b/app/views/projects/milestones/_issue.html.haml @@ -1,4 +1,4 @@ -%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => namespace_project_issue_path(@project.namespace, @project, issue) } +%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => issue_path(issue) } %span.str-truncated = link_to [@project.namespace.becomes(Namespace), @project, issue] do %span.cgray ##{issue.iid} diff --git a/app/views/projects/milestones/_merge_request.html.haml b/app/views/projects/milestones/_merge_request.html.haml index 3180c1d91b9..46f2df1b183 100644 --- a/app/views/projects/milestones/_merge_request.html.haml +++ b/app/views/projects/milestones/_merge_request.html.haml @@ -1,4 +1,4 @@ -%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => namespace_project_merge_request_path(@project.namespace, @project, merge_request) } +%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => merge_request_path(merge_request) } %span.str-truncated = link_to [@project.namespace.becomes(Namespace), @project, merge_request] do %span.cgray ##{merge_request.iid} diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml index e8fd90efd1f..720957e8336 100644 --- a/app/views/projects/no_repo.html.haml +++ b/app/views/projects/no_repo.html.haml @@ -19,4 +19,4 @@ - if can? current_user, :remove_project, @project .prepend-top-20 - = link_to 'Remove project', namespace_project_path(@project.namespace, @project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" + = link_to 'Remove project', project_path(@project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" -- cgit v1.2.1 From 0a4dec24c8effab297c195301f1213ab09d94633 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 25 Feb 2015 19:41:17 -0800 Subject: Add explanation to routing method --- app/helpers/gitlab_routing_helper.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'app') diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb index 932e0d29149..f0eb50a0e17 100644 --- a/app/helpers/gitlab_routing_helper.rb +++ b/app/helpers/gitlab_routing_helper.rb @@ -1,4 +1,17 @@ # Shorter routing method for project and project items +# Since update to rails 4.1.9 we are now allowed to use `/` in project routing +# so we use nested routing for project resources which include project and +# project namespace. To avoid writing long methods every time we define shortcuts for +# some of routing. +# +# For example instead of this: +# +# namespace_project_merge_request_path(merge_request.project.namespace, merge_request.projects, merge_request) +# +# We can simply use shortcut: +# +# merge_request_path(merge_request) +# module GitlabRoutingHelper def project_path(project, *args) namespace_project_path(project.namespace, project, *args) -- cgit v1.2.1 From 128012dba8737b0dc65d41a3eb1690c9d8797a34 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 25 Feb 2015 19:50:01 -0800 Subject: More use of shortcut routes --- app/controllers/projects/issues_controller.rb | 8 +++----- app/controllers/projects/merge_requests_controller.rb | 4 +--- app/views/projects/merge_requests/_merge_request.html.haml | 2 +- app/views/projects/merge_requests/show/_diffs.html.haml | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 73b58285c61..6a2af08a199 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -60,8 +60,7 @@ class Projects::IssuesController < Projects::ApplicationController respond_to do |format| format.html do if @issue.valid? - redirect_to namespace_project_issue_path(@project.namespace, - @project, @issue) + redirect_to issue_path(@issue) else render :new end @@ -79,7 +78,7 @@ class Projects::IssuesController < Projects::ApplicationController format.js format.html do if @issue.valid? - redirect_to [@project.namespace.becomes(Namespace), @project, @issue] + redirect_to issue_path(@issue) else render :edit end @@ -129,8 +128,7 @@ class Projects::IssuesController < Projects::ApplicationController issue = @project.issues.find_by(id: params[:id]) if issue - redirect_to namespace_project_issue_path(@project.namespace, @project, - issue) + redirect_to issue_path(issue) return else raise ActiveRecord::RecordNotFound.new diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 98e4775e409..f07923d6d9e 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -79,9 +79,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController if @merge_request.valid? redirect_to( - namespace_project_merge_request_path(@merge_request.target_project.namespace, - @merge_request.target_project, - @merge_request), + merge_request_path(@merge_request) notice: 'Merge request was successfully created.' ) else diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index d94636712be..1eba1a96b7b 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -1,7 +1,7 @@ %li{ class: mr_css_classes(merge_request) } .merge-request-title %span.str-truncated - = link_to_gfm merge_request.title, namespace_project_merge_request_path(merge_request.target_project.namespace, merge_request.target_project, merge_request), class: "row_title" + = link_to_gfm merge_request.title, merge_request_path(merge_request), class: "row_title" .pull-right.light - if merge_request.merged? %span diff --git a/app/views/projects/merge_requests/show/_diffs.html.haml b/app/views/projects/merge_requests/show/_diffs.html.haml index eb1640891e6..cfef1d5e4cc 100644 --- a/app/views/projects/merge_requests/show/_diffs.html.haml +++ b/app/views/projects/merge_requests/show/_diffs.html.haml @@ -8,5 +8,5 @@ Changes view for this comparison is extremely large. %p You can - = link_to "download it", namespace_project_merge_request_path(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, format: :diff), class: "vlink" + = link_to "download it", merge_request_path(@merge_request, format: :diff), class: "vlink" instead. -- cgit v1.2.1 From e993b59b7dcaf795abb82af3f548f35aff01c6a8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 25 Feb 2015 19:53:45 -0800 Subject: Dont render project entity --- app/views/projects/deploy_keys/_deploy_key.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/projects/deploy_keys/_deploy_key.html.haml b/app/views/projects/deploy_keys/_deploy_key.html.haml index 52da85cbdfa..230e164f24c 100644 --- a/app/views/projects/deploy_keys/_deploy_key.html.haml +++ b/app/views/projects/deploy_keys/_deploy_key.html.haml @@ -13,7 +13,7 @@ = link_to 'Remove', namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), data: { confirm: 'You are going to remove deploy key. Are you sure?'}, method: :delete, class: "btn btn-remove delete-key btn-small pull-right" - = key_project = deploy_key.projects.include?(@project) ? @project : deploy_key.projects.first + - key_project = deploy_key.projects.include?(@project) ? @project : deploy_key.projects.first = link_to namespace_project_deploy_key_path(key_project.namespace, key_project, deploy_key) do %i.fa.fa-key %strong= deploy_key.title -- cgit v1.2.1 From c254cb03d8ddfb217341c2f83223ba30228f3088 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 25 Feb 2015 20:00:28 -0800 Subject: Fix affix for issue and merge request with image in description --- app/assets/javascripts/issue.js.coffee | 11 ++++++----- app/assets/javascripts/merge_request.js.coffee | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/assets/javascripts/issue.js.coffee b/app/assets/javascripts/issue.js.coffee index 9b7c1be8355..f2753170478 100644 --- a/app/assets/javascripts/issue.js.coffee +++ b/app/assets/javascripts/issue.js.coffee @@ -16,8 +16,9 @@ class @Issue updateTaskState ) - $('.issuable-affix').affix offset: - top: -> - @top = $('.issue-details').outerHeight(true) + 25 - bottom: -> - @bottom = $('.footer').outerHeight(true) + $('.issue-details').waitForImages -> + $('.issuable-affix').affix offset: + top: -> + @top = $('.issue-details').outerHeight(true) + 25 + bottom: -> + @bottom = $('.footer').outerHeight(true) diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee index 757592842eb..ec686315435 100644 --- a/app/assets/javascripts/merge_request.js.coffee +++ b/app/assets/javascripts/merge_request.js.coffee @@ -20,11 +20,12 @@ class @MergeRequest if $("a.btn-close").length $("li.task-list-item input:checkbox").prop("disabled", false) - $('.issuable-affix').affix offset: - top: -> - @top = $('.merge-request-details').outerHeight(true) + 70 - bottom: -> - @bottom = $('.footer').outerHeight(true) + $('.merge-request-details').waitForImages -> + $('.issuable-affix').affix offset: + top: -> + @top = $('.merge-request-details').outerHeight(true) + 91 + bottom: -> + @bottom = $('.footer').outerHeight(true) # Local jQuery finder $: (selector) -> -- cgit v1.2.1 From e53dd7526f69545ca86fc6935ad8077592628772 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 25 Feb 2015 04:29:33 -0500 Subject: Allow mass-unassigning of issues Fixes #867 [ci skip] --- app/assets/javascripts/project_users_select.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/project_users_select.js.coffee b/app/assets/javascripts/project_users_select.js.coffee index 7fb33926096..885f0d58a6a 100644 --- a/app/assets/javascripts/project_users_select.js.coffee +++ b/app/assets/javascripts/project_users_select.js.coffee @@ -15,7 +15,7 @@ class @ProjectUsersSelect name: 'Unassigned', avatar: null, username: 'none', - id: '' + id: -1 } data.results.unshift(nullUser) -- cgit v1.2.1 From e27f5aef462e5cf32f23fbb3137b98011c0c0ddf Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 25 Feb 2015 22:17:46 -0800 Subject: Fix sticky diff header --- app/assets/javascripts/diff.js.coffee | 3 ++- app/assets/javascripts/merge_request.js.coffee | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/assets/javascripts/diff.js.coffee b/app/assets/javascripts/diff.js.coffee index b0b312e7749..05f5af42571 100644 --- a/app/assets/javascripts/diff.js.coffee +++ b/app/assets/javascripts/diff.js.coffee @@ -1,6 +1,7 @@ class @Diff UNFOLD_COUNT = 20 constructor: -> + $(document).off('click', '.js-unfold') $(document).on('click', '.js-unfold', (event) => target = $(event.target) unfoldBottom = target.hasClass('js-unfold-bottom') @@ -36,7 +37,7 @@ class @Diff ) ) - $('.diff-header').stick_in_parent(offset_top: $('.navbar').height()) + $('.diff-header').stick_in_parent(recalc_every: 1, offset_top: $('.navbar').height()) lineNumbers: (line) -> return ([0, 0]) unless line.children().length diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee index 757592842eb..805bf0203cb 100644 --- a/app/assets/javascripts/merge_request.js.coffee +++ b/app/assets/javascripts/merge_request.js.coffee @@ -95,6 +95,7 @@ class @MergeRequest this.$('.merge-request-tabs .diffs-tab').addClass 'active' this.loadDiff() unless @diffs_loaded this.$('.diffs').show() + $(".diff-header").trigger("sticky_kit:recalc") when 'commits' this.$('.merge-request-tabs .commits-tab').addClass 'active' this.$('.commits').show() -- cgit v1.2.1 From d3c44b1a6c470990cd79d2e4feec3d1d9b450496 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 25 Feb 2015 10:59:50 +0100 Subject: Fix import status page project links for new Rails. --- app/views/import/base/create.js.haml | 2 +- app/views/import/bitbucket/status.html.haml | 2 +- app/views/import/github/status.html.haml | 2 +- app/views/import/gitlab/status.html.haml | 2 +- app/views/import/gitorious/status.html.haml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/views/import/base/create.js.haml b/app/views/import/base/create.js.haml index 8ebdf4f1a20..8d10722628f 100644 --- a/app/views/import/base/create.js.haml +++ b/app/views/import/base/create.js.haml @@ -20,6 +20,6 @@ job.attr("id", "project_#{@project.id}") target_field = job.find(".import-target") target_field.empty() - target_field.append('#{link_to @project.path_with_namespace, @project}') + target_field.append('#{link_to @project.path_with_namespace, [@project.namespace.becomes(Namespace), @project]}') $("table.import-jobs tbody").prepend(job) job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/bitbucket/status.html.haml b/app/views/import/bitbucket/status.html.haml index 90c97393b51..bcbbaadf3e0 100644 --- a/app/views/import/bitbucket/status.html.haml +++ b/app/views/import/bitbucket/status.html.haml @@ -20,7 +20,7 @@ %td = link_to project.import_source, "https://bitbucket.org/#{project.import_source}", target: "_blank" %td - %strong= link_to project.path_with_namespace, project + %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span.cgreen diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 957022f382f..883090a3026 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -20,7 +20,7 @@ %td = link_to project.import_source, "https://github.com/#{project.import_source}", target: "_blank" %td - %strong= link_to project.path_with_namespace, project + %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span.cgreen diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml index db161681206..41ac073eae1 100644 --- a/app/views/import/gitlab/status.html.haml +++ b/app/views/import/gitlab/status.html.haml @@ -20,7 +20,7 @@ %td = link_to project.import_source, "https://gitlab.com/#{project.import_source}", target: "_blank" %td - %strong= link_to project.path_with_namespace, project + %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span.cgreen diff --git a/app/views/import/gitorious/status.html.haml b/app/views/import/gitorious/status.html.haml index e06e068fdb4..ebe24747a05 100644 --- a/app/views/import/gitorious/status.html.haml +++ b/app/views/import/gitorious/status.html.haml @@ -20,7 +20,7 @@ %td = link_to project.import_source, "https://gitorious.org/#{project.import_source}", target: "_blank" %td - %strong= link_to project.path_with_namespace, project + %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] %td.job-status - if project.import_status == 'finished' %span.cgreen -- cgit v1.2.1 From 449cf43a55a34553fae591db7d69d1505b4daa53 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Thu, 26 Feb 2015 09:03:34 -0800 Subject: Add z index for diff header so sticky header stays on top on diff comments. --- app/assets/stylesheets/sections/diff.scss | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/assets/stylesheets/sections/diff.scss b/app/assets/stylesheets/sections/diff.scss index f47ea329827..54311a68852 100644 --- a/app/assets/stylesheets/sections/diff.scss +++ b/app/assets/stylesheets/sections/diff.scss @@ -8,6 +8,7 @@ border-bottom: 1px solid #CCC; padding: 5px 5px 5px 10px; color: #555; + z-index: 10; > span { font-family: $monospace_font; -- cgit v1.2.1 From 6de4e4a622a98d86a44e9adf2fca15ff30c478c7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 26 Feb 2015 09:34:20 -0800 Subject: Include route helper shortcut in controller --- app/controllers/application_controller.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7940b5cb3f4..df1a588313e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,6 +2,7 @@ require 'gon' class ApplicationController < ActionController::Base include Gitlab::CurrentSettings + include GitlabRoutingHelper before_filter :authenticate_user_from_token! before_filter :authenticate_user! -- cgit v1.2.1 From 6ac0a0217cfcfa9915d5380337b9e5dd25b699ea Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 26 Feb 2015 16:44:52 -0800 Subject: Fix syntax issue --- app/controllers/projects/merge_requests_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index f07923d6d9e..26d4c51773f 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -79,7 +79,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController if @merge_request.valid? redirect_to( - merge_request_path(@merge_request) + merge_request_path(@merge_request), notice: 'Merge request was successfully created.' ) else -- cgit v1.2.1 From 804a2488cfd6704726c0dc7e6b0facc7e2ff7ce3 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 27 Feb 2015 10:47:37 +0100 Subject: Fix and test User#contributed_projects_ids. --- app/models/user.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/models/user.rb b/app/models/user.rb index 27ac93f4841..55768a351e3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -629,5 +629,6 @@ class User < ActiveRecord::Base reorder(project_id: :desc). select(:project_id). uniq + .map(&:project_id) end end -- cgit v1.2.1