diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-03-31 10:07:13 +0200 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-03-31 10:07:13 +0200 |
commit | ed6f524c49ad1356e6b7ce35a6fe79632e24b015 (patch) | |
tree | 5a3e6d7bc13be35b7cb518baf394530c65e71e96 /app | |
parent | 5ac61d7b241b2332513650e2287cfde09d9c1fb7 (diff) | |
parent | 0af8587d88bd03d107438343b7895ad30f7a9308 (diff) | |
download | gitlab-ce-ed6f524c49ad1356e6b7ce35a6fe79632e24b015.tar.gz |
Merge branch 'master' into fix/issue-move-rewrite-uploads
* master: (27 commits)
Fix commit comment alignment
minor cleanup in system_hook_spec
Pre-calculate Emoji digests
Clear .todo listener
Change window.location to use turbolinks
Make entire todo row clickable
Add 8.6.2 CHANGELOG items
Ensure uploads dir exists when running backup specs
Move CarrierWave test env config to separate file
Remove console logs
Off the event initially
Collapsed sidebar opens over instead of pushing content.
Sidebar collapse update issue
User selection from collapsed sidebar
Add json response for user avatar in merge request
Make changed values visible in minimized sidebar.
Fixed MergeRequestController spec
We need `sha` reference from `diff_base_commit` to generate the diff
Use `diff_base_commit` instead of `target_branch` to generate diffs
Isolate CarrierWave uploads in test enviroment
...
Diffstat (limited to 'app')
19 files changed, 148 insertions, 48 deletions
diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee index dd0465b9358..dbcad9c0514 100644 --- a/app/assets/javascripts/gl_dropdown.js.coffee +++ b/app/assets/javascripts/gl_dropdown.js.coffee @@ -195,6 +195,8 @@ class GitLabDropdown if @options.filterable @dropdown.find(".dropdown-input-field").focus() + @dropdown.trigger('shown.gl.dropdown') + hidden: (e) => if @options.filterable @dropdown @@ -209,6 +211,8 @@ class GitLabDropdown if @options.hidden @options.hidden.call(@,e) + @dropdown.trigger('hidden.gl.dropdown') + # Render the full menu renderMenu: (html) -> diff --git a/app/assets/javascripts/issuable_context.js.coffee b/app/assets/javascripts/issuable_context.js.coffee index 6fc924d3d66..2f19513a831 100644 --- a/app/assets/javascripts/issuable_context.js.coffee +++ b/app/assets/javascripts/issuable_context.js.coffee @@ -9,7 +9,7 @@ class @IssuableContext $(".issuable-sidebar .inline-update").on "change", ".js-assignee", -> $(this).submit() - $(document).on "click",".edit-link", (e) -> + $(document).off("click", ".edit-link").on "click",".edit-link", (e) -> $block = $(@).parents('.block') $selectbox = $block.find('.selectbox') if $selectbox.is(':visible') diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index e69a9e3e4b1..d1fe116397a 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -16,6 +16,7 @@ class @LabelsSelect abilityName = $dropdown.data('ability-name') $selectbox = $dropdown.closest('.selectbox') $block = $selectbox.closest('.block') + $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span') $value = $block.find('.value') $loading = $block.find('.block-loading').fadeOut() @@ -142,6 +143,7 @@ class @LabelsSelect if not selected.length data[abilityName].label_ids = [''] $loading.fadeIn() + $dropdown.trigger('loading.gl.dropdown') $.ajax( type: 'PUT' url: issueUpdateURL @@ -149,15 +151,20 @@ class @LabelsSelect data: data ).done (data) -> $loading.fadeOut() + $dropdown.trigger('loaded.gl.dropdown') $selectbox.hide() data.issueURLSplit = issueURLSplit - if not data.labels.length - template = labelNoneHTMLTemplate() - else + labelCount = 0 + if data.labels.length template = labelHTMLTemplate(data) - href = $value - .show() - .html(template) + labelCount = data.labels.length + else + template = labelNoneHTMLTemplate() + $value + .removeAttr('style') + .html(template) + $sidebarCollapsedValue.text(labelCount) + $value .find('a') .each((i) -> @@ -226,7 +233,8 @@ class @LabelsSelect hidden: -> $selectbox.hide() - $value.show() + # display:block overrides the hide-collapse rule + $value.removeAttr('style') if $dropdown.hasClass 'js-multiselect' saveLabelData() diff --git a/app/assets/javascripts/milestone_select.js.coffee b/app/assets/javascripts/milestone_select.js.coffee index d61d03791fa..e2a7d5fbba2 100644 --- a/app/assets/javascripts/milestone_select.js.coffee +++ b/app/assets/javascripts/milestone_select.js.coffee @@ -18,6 +18,7 @@ class @MilestoneSelect abilityName = $dropdown.data('ability-name') $selectbox = $dropdown.closest('.selectbox') $block = $selectbox.closest('.block') + $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon') $value = $block.find('.value') $loading = $block.find('.block-loading').fadeOut() @@ -80,18 +81,14 @@ class @MilestoneSelect milestone.name is selectedMilestone hidden: -> $selectbox.hide() - $value.show() - clicked: (selected) -> + + # display:block overrides the hide-collapse rule + $value.removeAttr('style') + clicked: (e) -> if $dropdown.hasClass 'js-filter-bulk-update' return - if $dropdown.hasClass('js-filter-submit') - if selected.name? - selectedMilestone = selected.name - else if selected.title? - selectedMilestone = selected.title - else - selectedMilestone = '' + if $dropdown.hasClass 'js-filter-submit' $dropdown.parents('form').submit() else selected = $selectbox @@ -102,20 +99,22 @@ class @MilestoneSelect data[abilityName].milestone_id = selected $loading .fadeIn() + $dropdown.trigger('loading.gl.dropdown') $.ajax( type: 'PUT' url: issueUpdateURL data: data ).done (data) -> + $dropdown.trigger('loaded.gl.dropdown') $loading.fadeOut() $selectbox.hide() - $milestoneLink = $value - .show() - .find('a') + $value.removeAttr('style') if data.milestone? data.milestone.namespace = _this.currentProject.namespace data.milestone.path = _this.currentProject.path $value.html(milestoneLinkTemplate(data.milestone)) + $sidebarCollapsedValue.find('span').text(data.milestone.title) else $value.html(milestoneLinkNoneTemplate) - ) + $sidebarCollapsedValue.find('span').text('No') + )
\ No newline at end of file diff --git a/app/assets/javascripts/right_sidebar.js.coffee b/app/assets/javascripts/right_sidebar.js.coffee new file mode 100644 index 00000000000..67403554340 --- /dev/null +++ b/app/assets/javascripts/right_sidebar.js.coffee @@ -0,0 +1,55 @@ +class @Sidebar + constructor: (currentUser) -> + @addEventListeners() + + addEventListeners: -> + $('aside').on('click', '.sidebar-collapsed-icon', @sidebarCollapseClicked) + $('.dropdown').on('hidden.gl.dropdown', @sidebarDropdownHidden) + $('.dropdown').on('loading.gl.dropdown', @sidebarDropdownLoading) + $('.dropdown').on('loaded.gl.dropdown', @sidebarDropdownLoaded) + + sidebarDropdownLoading: (e) -> + $sidebarCollapsedIcon = $(@).closest('.block').find('.sidebar-collapsed-icon') + img = $sidebarCollapsedIcon.find('img') + i = $sidebarCollapsedIcon.find('i') + $loading = $('<i class="fa fa-spinner fa-spin"></i>') + if img.length + img.before($loading) + img.hide() + else if i.length + i.before($loading) + i.hide() + + sidebarDropdownLoaded: (e) -> + $sidebarCollapsedIcon = $(@).closest('.block').find('.sidebar-collapsed-icon') + img = $sidebarCollapsedIcon.find('img') + $sidebarCollapsedIcon.find('i.fa-spin').remove() + i = $sidebarCollapsedIcon.find('i') + if img.length + img.show() + else + i.show() + + + sidebarCollapseClicked: (e) -> + e.preventDefault() + $block = $(@).closest('.block') + + $('aside') + .find('.gutter-toggle') + .trigger('click') + $editLink = $block.find('.edit-link') + + if $editLink.length + $editLink.trigger('click') + $block.addClass('collapse-after-update') + $('.page-with-sidebar').addClass('with-overlay') + + sidebarDropdownHidden: (e) -> + $block = $(@).closest('.block') + if $block.hasClass('collapse-after-update') + $block.removeClass('collapse-after-update') + $('.page-with-sidebar').removeClass('with-overlay') + $('aside') + .find('.gutter-toggle') + .trigger('click')
\ No newline at end of file diff --git a/app/assets/javascripts/todos.js.coffee b/app/assets/javascripts/todos.js.coffee index b6b4bd90e6a..ec2df6c5b73 100644 --- a/app/assets/javascripts/todos.js.coffee +++ b/app/assets/javascripts/todos.js.coffee @@ -6,10 +6,12 @@ class @Todos clearListeners: -> $('.done-todo').off('click') $('.js-todos-mark-all').off('click') + $('.todo').off('click') initBtnListeners: -> $('.done-todo').on('click', @doneClicked) $('.js-todos-mark-all').on('click', @allDoneClicked) + $('.todo').on('click', @goToTodoUrl) doneClicked: (e) => e.preventDefault() @@ -54,3 +56,6 @@ class @Todos updateBadges: (data) -> $('.todos-pending .badge, .todos-pending-count').text data.count $('.todos-done .badge').text data.done_count + + goToTodoUrl: -> + Turbolinks.visit($(this).data('url')) diff --git a/app/assets/javascripts/users_select.js.coffee b/app/assets/javascripts/users_select.js.coffee index aec13e54c98..eee9b6e690e 100644 --- a/app/assets/javascripts/users_select.js.coffee +++ b/app/assets/javascripts/users_select.js.coffee @@ -19,6 +19,7 @@ class @UsersSelect $block = $selectbox.closest('.block') abilityName = $dropdown.data('ability-name') $value = $block.find('.value') + $collapsedSidebar = $block.find('.sidebar-collapsed-user') $loading = $block.find('.block-loading').fadeOut() $block.on('click', '.js-assign-yourself', (e) => @@ -32,12 +33,14 @@ class @UsersSelect data[abilityName].assignee_id = selected $loading .fadeIn() + $dropdown.trigger('loading.gl.dropdown') $.ajax( type: 'PUT' dataType: 'json' url: issueURL data: data ).done (data) -> + $dropdown.trigger('loaded.gl.dropdown') $loading.fadeOut() $selectbox.hide() @@ -51,11 +54,22 @@ class @UsersSelect name: 'Unassigned' username: '' avatar: '' + $value.html(assigneeTemplate(user)) + $collapsedSidebar.html(collapsedAssigneeTemplate(user)) - $value.html(noAssigneeTemplate(user)) - $value.find('a').attr('href') - noAssigneeTemplate = _.template( + collapsedAssigneeTemplate = _.template( + '<% if( avatar ) { %> + <a class="author_link" href="/u/<%= username %>"> + <img width="24" class="avatar avatar-inline s24" alt="" src="<%= avatar %>"> + <span class="author">Toni Boehm</span> + </a> + <% } else { %> + <i class="fa fa-user"></i> + <% } %>' + ) + + assigneeTemplate = _.template( '<% if (username) { %> <a class="author_link " href="/u/<%= username %>"> <% if( avatar ) { %> @@ -131,7 +145,8 @@ class @UsersSelect hidden: (e) -> $selectbox.hide() - $value.show() + # display:block overrides the hide-collapse rule + $value.removeAttr('style') clicked: (user) -> page = $('body').data 'page' diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index 9d188317783..18189e985c4 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -288,6 +288,10 @@ @media (min-width: $screen-sm-min) { padding-right: $sidebar_collapsed_width; } + + .sidebar-collapsed-icon { + cursor: pointer; + } } .right-sidebar-expanded { @@ -300,4 +304,8 @@ @media (min-width: $screen-md-min) { padding-right: $gutter_width; } + + &.with-overlay { + padding-right: $sidebar_collapsed_width; + } } diff --git a/app/assets/stylesheets/pages/todos.scss b/app/assets/stylesheets/pages/todos.scss index f983e9829e6..e909e15f74c 100644 --- a/app/assets/stylesheets/pages/todos.scss +++ b/app/assets/stylesheets/pages/todos.scss @@ -13,6 +13,12 @@ } } +.todo { + &:hover { + cursor: pointer; + } +} + .todo-item { .todo-title { @include str-truncated(calc(100% - 174px)); diff --git a/app/controllers/projects/badges_controller.rb b/app/controllers/projects/badges_controller.rb index 6ff47c4033a..6d4d4360988 100644 --- a/app/controllers/projects/badges_controller.rb +++ b/app/controllers/projects/badges_controller.rb @@ -2,11 +2,12 @@ class Projects::BadgesController < Projects::ApplicationController before_action :no_cache_headers def build + badge = Gitlab::Badge::Build.new(project, params[:ref]) + respond_to do |format| format.html { render_404 } format.svg do - image = Ci::ImageForBuildService.new.execute(project, ref: params[:ref]) - send_file(image.path, filename: image.name, disposition: 'inline', type: 'image/svg+xml') + send_data(badge.data, type: badge.type, disposition: 'inline') end end end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 6189de09f27..62451ac73a9 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -57,8 +57,8 @@ 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) } + format.diff { render text: @merge_request.to_diff } + format.patch { render text: @merge_request.to_patch } end end @@ -154,7 +154,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @merge_request.target_project, @merge_request]) end format.json do - render json: @merge_request.to_json(include: [:milestone, :labels, :assignee]) + render json: @merge_request.to_json(include: [:milestone, :labels, assignee: { methods: :avatar_url }]) end end else diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 928817ba811..62f53664db3 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -138,7 +138,7 @@ class ProjectsController < Projects::ApplicationController participants = ::Projects::ParticipantsService.new(@project, current_user).execute(note_type, note_id) @suggestions = { - emojis: autocomplete_emojis, + emojis: AwardEmoji.urls, issues: autocomplete.issues, mergerequests: autocomplete.merge_requests, members: participants @@ -235,17 +235,6 @@ class ProjectsController < Projects::ApplicationController ) end - def autocomplete_emojis - Rails.cache.fetch("autocomplete-emoji-#{Gemojione::VERSION}") do - Emoji.emojis.map do |name, emoji| - { - name: name, - path: view_context.image_url("#{emoji["unicode"]}.png") - } - end - end - end - def repo_exists? project.repository_exists? && !project.empty_repo? end diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 8cbc9eefc7b..826e5f96fa1 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -110,6 +110,10 @@ class Notify < BaseMailer headers['Reply-To'] = address + fallback_reply_message_id = "<reply-#{reply_key}@#{Gitlab.config.gitlab.host}>".freeze + headers['References'] ||= '' + headers['References'] << ' ' << fallback_reply_message_id + @reply_by_email = true end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 7c61a7ae18c..1245cc16d6a 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -331,15 +331,15 @@ class MergeRequest < ActiveRecord::Base # Returns the raw diff for this merge request # # see "git diff" - def to_diff(current_user) - target_project.repository.diff_text(target_branch, source_sha) + def to_diff + target_project.repository.diff_text(diff_base_commit.sha, source_sha) end # Returns the commit as a series of email patches. # # see "git format-patch" - def to_patch(current_user) - target_project.repository.format_patch(target_branch, source_sha) + def to_patch + target_project.repository.format_patch(diff_base_commit.sha, source_sha) end def hook_attrs diff --git a/app/models/repository.rb b/app/models/repository.rb index c07e8072043..ff24b75dcd1 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -335,6 +335,8 @@ class Repository # Runs code just before a repository is deleted. def before_delete + expire_exists_cache + expire_cache if exists? expire_root_ref_cache diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml index e3a4d64df01..25d2b64e381 100644 --- a/app/views/dashboard/todos/_todo.html.haml +++ b/app/views/dashboard/todos/_todo.html.haml @@ -1,4 +1,4 @@ -%li{class: "todo todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) } +%li{class: "todo todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo), data:{url: todo_target_path(todo)} } .todo-item.todo-block = image_tag avatar_icon(todo.author_email, 40), class: 'avatar s40', alt:'' diff --git a/app/views/projects/notes/discussions/_commit.html.haml b/app/views/projects/notes/discussions/_commit.html.haml index f67ec8db942..8d0a1af787c 100644 --- a/app/views/projects/notes/discussions/_commit.html.haml +++ b/app/views/projects/notes/discussions/_commit.html.haml @@ -9,7 +9,7 @@ Show/hide discussion %div = link_to_member(@project, note.author, avatar: false) - %p started a discussion on #{commit_description} + started a discussion on #{commit_description} - if commit = link_to(commit.short_id, namespace_project_commit_path(note.project.namespace, note.project, note.noteable), class: 'monospace') .last-update.hide.js-toggle-content diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index 451c64da2c4..47e544acf52 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -150,3 +150,4 @@ new LabelsSelect(); new IssuableContext('#{current_user.to_json(only: [:username, :id, :name])}'); new Subscription('.subscription') + new Sidebar();
\ No newline at end of file diff --git a/app/workers/project_cache_worker.rb b/app/workers/project_cache_worker.rb index 55cb6af232e..ccefd0f71a0 100644 --- a/app/workers/project_cache_worker.rb +++ b/app/workers/project_cache_worker.rb @@ -5,6 +5,9 @@ class ProjectCacheWorker def perform(project_id) project = Project.find(project_id) + + return unless project.repository.exists? + project.update_repository_size project.update_commit_count |