diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-25 12:10:42 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-25 12:10:42 +0300 |
commit | e65c1d31c934772eb571e221482d88fb7d21ceea (patch) | |
tree | b0d605571654bb2e11a0bc65e2f33c3a08f22a4b | |
parent | 4ae91e9f5004d78168b5b50f9ce51db045e479d0 (diff) |
Add latest changes from gitlab-org/gitlab@master
19 files changed, 152 insertions, 35 deletions
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml index d6538600e3b..423cbc5f285 100644 --- a/.gitlab/ci/rules.gitlab-ci.yml +++ b/.gitlab/ci/rules.gitlab-ci.yml @@ -127,6 +127,7 @@ - "{,ee/}{,spec/}{db,migrations}/**/*" - "{,ee/}{,spec/}lib/{,ee/}gitlab/background_migration/**/*" - "config/prometheus/common_metrics.yml" # Used by Gitlab::DatabaseImporters::CommonMetrics::Importer + - "{,ee/}app/models/project_statistics.rb" # Used to calculate sizes in migration specs .backstage-patterns: &backstage-patterns - "Dangerfile" diff --git a/app/assets/javascripts/milestone_select.js b/app/assets/javascripts/milestone_select.js index cf1239436d6..53598165384 100644 --- a/app/assets/javascripts/milestone_select.js +++ b/app/assets/javascripts/milestone_select.js @@ -76,6 +76,10 @@ export default class MilestoneSelect { let getMilestones = Api.projectMilestones; const reqParams = { state: 'active', include_parent_milestones: true }; + if (term) { + reqParams.search = term.trim(); + } + if (!contextId) { contextId = $dropdown.get(0).dataset.groupId; delete reqParams.include_parent_milestones; @@ -162,6 +166,7 @@ export default class MilestoneSelect { `; }, filterable: true, + filterRemote: true, search: { fields: ['title'], }, diff --git a/app/assets/javascripts/vue_shared/components/todo_button.vue b/app/assets/javascripts/vue_shared/components/todo_button.vue new file mode 100644 index 00000000000..debf19ccca6 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/todo_button.vue @@ -0,0 +1,28 @@ +<script> +import { GlButton } from '@gitlab/ui'; +import { __ } from '~/locale'; + +export default { + components: { + GlButton, + }, + props: { + isTodo: { + type: Boolean, + required: false, + default: true, + }, + }, + computed: { + buttonLabel() { + return this.isTodo ? __('Mark as done') : __('Add a To-Do'); + }, + }, +}; +</script> + +<template> + <gl-button v-bind="$attrs" :aria-label="buttonLabel" @click="$emit('click', $event)"> + {{ buttonLabel }} + </gl-button> +</template> diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index 8c4bfdf68cc..ccf11058b5b 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -151,3 +151,7 @@ ul.wiki-pages-list.content-list { .empty-state-wiki .text-content { max-width: 490px; // Widen to allow for the Confluence button } + +.wiki-form .markdown-area { + max-height: none; +} diff --git a/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml b/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml index 10cbf6a2f7a..379a6c3084a 100644 --- a/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml +++ b/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml @@ -1,4 +1,4 @@ -= icon('spinner spin fw') += loading_icon(css_class: "gl-vertical-align-text-bottom mr-1") Validating GitLab CI configuration… = link_to 'Learn more', help_page_path('ci/yaml/README') diff --git a/app/views/projects/blob/viewers/_loading.html.haml b/app/views/projects/blob/viewers/_loading.html.haml index 5fbe9b0df0c..18fd0d87ce6 100644 --- a/app/views/projects/blob/viewers/_loading.html.haml +++ b/app/views/projects/blob/viewers/_loading.html.haml @@ -1,2 +1,2 @@ -.text-center.gl-mt-3.gl-mb-3 - = icon('spinner spin 2x', 'aria-hidden' => 'true', 'aria-label' => 'Loading content…', class: 'qa-spinner') +.text-center.gl-mt-4.gl-mb-3 + = loading_icon(size: "md", css_class: "qa-spinner") diff --git a/app/views/projects/blob/viewers/_loading_auxiliary.html.haml b/app/views/projects/blob/viewers/_loading_auxiliary.html.haml index c7dc9e3250a..5a6c1a493a5 100644 --- a/app/views/projects/blob/viewers/_loading_auxiliary.html.haml +++ b/app/views/projects/blob/viewers/_loading_auxiliary.html.haml @@ -1,2 +1,2 @@ -= icon('spinner spin fw') += loading_icon(css_class: "gl-vertical-align-text-bottom") Analyzing file… diff --git a/app/views/projects/blob/viewers/_route_map_loading.html.haml b/app/views/projects/blob/viewers/_route_map_loading.html.haml index 1d768bd1ca4..8610847fbc9 100644 --- a/app/views/projects/blob/viewers/_route_map_loading.html.haml +++ b/app/views/projects/blob/viewers/_route_map_loading.html.haml @@ -1,4 +1,4 @@ -= icon('spinner spin fw') += loading_icon(css_class: "gl-vertical-align-text-bottom gl-mr-1") Validating Route Map… = link_to 'Learn more', help_page_path('ci/environments/index.md', anchor: 'going-from-source-files-to-public-pages') diff --git a/app/views/projects/blob/viewers/_sketch.html.haml b/app/views/projects/blob/viewers/_sketch.html.haml index aa8d1dd326f..08c21258d3f 100644 --- a/app/views/projects/blob/viewers/_sketch.html.haml +++ b/app/views/projects/blob/viewers/_sketch.html.haml @@ -1,3 +1,3 @@ .file-content#js-sketch-viewer{ data: { endpoint: blob_raw_path } } - .js-loading-icon.text-center.gl-mt-3.gl-mb-3.js-loading-icon{ 'aria-label' => 'Loading Sketch preview' } - = icon('spinner spin 2x', 'aria-hidden' => 'true'); + .text-center.gl-mt-4.gl-mb-3.js-loading-icon + = loading_icon(size: "md") diff --git a/app/views/projects/blob/viewers/_stl.html.haml b/app/views/projects/blob/viewers/_stl.html.haml index 6983c3cc81b..44c986595df 100644 --- a/app/views/projects/blob/viewers/_stl.html.haml +++ b/app/views/projects/blob/viewers/_stl.html.haml @@ -1,6 +1,6 @@ .file-content.is-stl-loading .text-center#js-stl-viewer{ data: { endpoint: blob_raw_path } } - = icon('spinner spin 2x', class: 'gl-mt-3 gl-mb-3', 'aria-hidden' => 'true', 'aria-label' => 'Loading') + = loading_icon(size: "md", css_class: "gl-mt-4 gl-mb-3") .text-center.gl-mt-3.gl-mb-3.stl-controls .btn-group %button.btn.btn-default.btn-sm.js-material-changer{ data: { type: 'wireframe' } } diff --git a/changelogs/unreleased/Resolve-Migrate--fa-spinner-app-views-projects-blob-viewers.yml b/changelogs/unreleased/Resolve-Migrate--fa-spinner-app-views-projects-blob-viewers.yml new file mode 100644 index 00000000000..a832d2a63ef --- /dev/null +++ b/changelogs/unreleased/Resolve-Migrate--fa-spinner-app-views-projects-blob-viewers.yml @@ -0,0 +1,5 @@ +--- +title: Migrate .fa-spinner to .spinner for app/views/projects/blob/viewers +merge_request: 25046 +author: nuwe1 +type: other diff --git a/doc/development/database/strings_and_the_text_data_type.md b/doc/development/database/strings_and_the_text_data_type.md index 0e77e3972e0..b73dfa859fb 100644 --- a/doc/development/database/strings_and_the_text_data_type.md +++ b/doc/development/database/strings_and_the_text_data_type.md @@ -38,6 +38,8 @@ For example, consider a migration that creates a table with two text columns, ```ruby class CreateDbGuides < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + DOWNTIME = false disable_ddl_transaction! @@ -179,6 +181,7 @@ in a post-deployment migration, ```ruby class AddTextLimitMigration < ActiveRecord::Migration[6.0] include Gitlab::Database::MigrationHelpers + DOWNTIME = false disable_ddl_transaction! diff --git a/lib/gitlab/analytics/unique_visits.rb b/lib/gitlab/analytics/unique_visits.rb index ad746ebbd42..292048dcad9 100644 --- a/lib/gitlab/analytics/unique_visits.rb +++ b/lib/gitlab/analytics/unique_visits.rb @@ -14,23 +14,23 @@ module Gitlab # @param [ActiveSupport::TimeWithZone] end_date end of time frame # @return [Integer] number of unique visitors def unique_visits_for(targets:, start_date: 7.days.ago, end_date: start_date + 1.week) - target_ids = if targets == :analytics - self.class.analytics_ids - elsif targets == :compliance - self.class.compliance_ids - else - Array(targets) - end + events = if targets == :analytics + self.class.analytics_events + elsif targets == :compliance + self.class.compliance_events + else + Array(targets) + end - Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: target_ids, start_date: start_date, end_date: end_date) + Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: events, start_date: start_date, end_date: end_date) end class << self - def analytics_ids + def analytics_events Gitlab::UsageDataCounters::HLLRedisCounter.events_for_category('analytics') end - def compliance_ids + def compliance_events Gitlab::UsageDataCounters::HLLRedisCounter.events_for_category('compliance') end end diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb index 7f3025ff983..1ba21d99277 100644 --- a/lib/gitlab/usage_data.rb +++ b/lib/gitlab/usage_data.rb @@ -589,8 +589,8 @@ module Gitlab end def analytics_unique_visits_data - results = ::Gitlab::Analytics::UniqueVisits.analytics_ids.each_with_object({}) do |target_id, hash| - hash[target_id] = redis_usage_data { unique_visit_service.unique_visits_for(targets: target_id) } + results = ::Gitlab::Analytics::UniqueVisits.analytics_events.each_with_object({}) do |target, hash| + hash[target] = redis_usage_data { unique_visit_service.unique_visits_for(targets: target) } end results['analytics_unique_visits_for_any_target'] = redis_usage_data { unique_visit_service.unique_visits_for(targets: :analytics) } results['analytics_unique_visits_for_any_target_monthly'] = redis_usage_data { unique_visit_service.unique_visits_for(targets: :analytics, start_date: 4.weeks.ago.to_date, end_date: Date.current) } @@ -599,8 +599,8 @@ module Gitlab end def compliance_unique_visits_data - results = ::Gitlab::Analytics::UniqueVisits.compliance_ids.each_with_object({}) do |target_id, hash| - hash[target_id] = redis_usage_data { unique_visit_service.unique_visits_for(targets: target_id) } + results = ::Gitlab::Analytics::UniqueVisits.compliance_events.each_with_object({}) do |target, hash| + hash[target] = redis_usage_data { unique_visit_service.unique_visits_for(targets: target) } end results['compliance_unique_visits_for_any_target'] = redis_usage_data { unique_visit_service.unique_visits_for(targets: :compliance) } results['compliance_unique_visits_for_any_target_monthly'] = redis_usage_data { unique_visit_service.unique_visits_for(targets: :compliance, start_date: 4.weeks.ago.to_date, end_date: Date.current) } diff --git a/spec/features/cycle_analytics_spec.rb b/spec/features/cycle_analytics_spec.rb index 0294ebbe13f..34f9fbcedb7 100644 --- a/spec/features/cycle_analytics_spec.rb +++ b/spec/features/cycle_analytics_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' RSpec.describe 'Value Stream Analytics', :js do - let(:user) { create(:user) } - let(:guest) { create(:user) } - let(:project) { create(:project, :repository) } + let_it_be(:user) { create(:user) } + let_it_be(:guest) { create(:user) } + let_it_be(:project) { create(:project, :repository) } let(:issue) { create(:issue, project: project, created_at: 2.days.ago) } let(:milestone) { create(:milestone, project: project) } let(:mr) { create_merge_request_closing_issue(user, project, issue, commit_message: "References #{issue.to_reference}") } @@ -13,9 +13,11 @@ RSpec.describe 'Value Stream Analytics', :js do context 'as an allowed user' do context 'when project is new' do - before do + before(:all) do project.add_maintainer(user) + end + before do sign_in(user) visit project_cycle_analytics_path(project) diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb index 39bf535c715..cc631cc6dd0 100644 --- a/spec/features/issues/user_edits_issue_spec.rb +++ b/spec/features/issues/user_edits_issue_spec.rb @@ -4,13 +4,17 @@ require "spec_helper" RSpec.describe "Issues > User edits issue", :js do let_it_be(:project) { create(:project_empty_repo, :public) } + let_it_be(:project_with_milestones) { create(:project_empty_repo, :public) } let_it_be(:user) { create(:user) } let_it_be(:issue) { create(:issue, project: project, author: user, assignees: [user]) } + let_it_be(:issue_with_milestones) { create(:issue, project: project_with_milestones, author: user, assignees: [user]) } let_it_be(:label) { create(:label, project: project) } let_it_be(:milestone) { create(:milestone, project: project) } + let_it_be(:milestones) { create_list(:milestone, 25, project: project_with_milestones) } before do project.add_developer(user) + project_with_milestones.add_developer(user) sign_in(user) end @@ -218,6 +222,23 @@ RSpec.describe "Issues > User edits issue", :js do end end end + + it 'allows user to search milestone' do + visit project_issue_path(project_with_milestones, issue_with_milestones) + + page.within('.milestone') do + click_link 'Edit' + wait_for_requests + # We need to enclose search string in quotes for exact match as all the milestone titles + # within tests are prefixed with `My title`. + find('.dropdown-input-field', visible: true).send_keys "\"#{milestones[0].title}\"" + wait_for_requests + + page.within '.dropdown-content' do + expect(page).to have_content milestones[0].title + end + end + end end context 'by unauthorized user' do diff --git a/spec/frontend/vue_shared/components/todo_button_spec.js b/spec/frontend/vue_shared/components/todo_button_spec.js new file mode 100644 index 00000000000..482b5de11f6 --- /dev/null +++ b/spec/frontend/vue_shared/components/todo_button_spec.js @@ -0,0 +1,48 @@ +import { shallowMount, mount } from '@vue/test-utils'; +import { GlButton } from '@gitlab/ui'; +import TodoButton from '~/vue_shared/components/todo_button.vue'; + +describe('Todo Button', () => { + let wrapper; + + const createComponent = (props = {}, mountFn = shallowMount) => { + wrapper = mountFn(TodoButton, { + propsData: { + ...props, + }, + }); + }; + + afterEach(() => { + wrapper.destroy(); + }); + + it('renders GlButton', () => { + createComponent(); + + expect(wrapper.find(GlButton).exists()).toBe(true); + }); + + it('emits click event when clicked', () => { + createComponent({}, mount); + wrapper.find(GlButton).trigger('click'); + + expect(wrapper.emitted().click).toBeTruthy(); + }); + + it.each` + label | isTodo + ${'Mark as done'} | ${true} + ${'Add a To-Do'} | ${false} + `('sets correct label when isTodo is $isTodo', ({ label, isTodo }) => { + createComponent({ isTodo }); + + expect(wrapper.find(GlButton).text()).toBe(label); + }); + + it('binds additional props to GlButton', () => { + createComponent({ loading: true }); + + expect(wrapper.find(GlButton).props('loading')).toBe(true); + }); +}); diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb index 45deec259f1..4bbb64c8e4a 100644 --- a/spec/lib/gitlab/usage_data_spec.rb +++ b/spec/lib/gitlab/usage_data_spec.rb @@ -960,8 +960,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do subject { described_class.analytics_unique_visits_data } it 'returns the number of unique visits to pages with analytics features' do - ::Gitlab::Analytics::UniqueVisits.analytics_ids.each do |target_id| - expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:unique_visits_for).with(targets: target_id).and_return(123) + ::Gitlab::Analytics::UniqueVisits.analytics_events.each do |target| + expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:unique_visits_for).with(targets: target).and_return(123) end expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:unique_visits_for).with(targets: :analytics).and_return(543) @@ -996,8 +996,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do described_class.clear_memoization(:unique_visit_service) allow_next_instance_of(::Gitlab::Analytics::UniqueVisits) do |instance| - ::Gitlab::Analytics::UniqueVisits.compliance_ids.each do |target_id| - allow(instance).to receive(:unique_visits_for).with(targets: target_id).and_return(123) + ::Gitlab::Analytics::UniqueVisits.compliance_events.each do |target| + allow(instance).to receive(:unique_visits_for).with(targets: target).and_return(123) end allow(instance).to receive(:unique_visits_for).with(targets: :compliance).and_return(543) diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb index 9ff822899ab..da15b0f0453 100644 --- a/spec/models/packages/package_spec.rb +++ b/spec/models/packages/package_spec.rb @@ -84,7 +84,7 @@ RSpec.describe Packages::Package, type: :model do end describe 'validations' do - subject { create(:package) } + subject { build(:package) } it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_uniqueness_of(:name).scoped_to(:project_id, :version, :package_type) } @@ -95,7 +95,7 @@ RSpec.describe Packages::Package, type: :model do it { is_expected.not_to allow_value("my(dom$$$ain)com.my-app").for(:name) } context 'conan package' do - subject { create(:conan_package) } + subject { build_stubbed(:conan_package) } let(:fifty_one_characters) {'f_b' * 17} @@ -112,7 +112,7 @@ RSpec.describe Packages::Package, type: :model do describe '#version' do RSpec.shared_examples 'validating version to be SemVer compliant for' do |factory_name| context "for #{factory_name}" do - subject { create(factory_name) } + subject { build_stubbed(factory_name) } it { is_expected.to allow_value('1.2.3').for(:version) } it { is_expected.to allow_value('1.2.3-beta').for(:version) } @@ -126,7 +126,7 @@ RSpec.describe Packages::Package, type: :model do end context 'conan package' do - subject { create(:conan_package) } + subject { build_stubbed(:conan_package) } let(:fifty_one_characters) {'1.2' * 17} @@ -142,7 +142,7 @@ RSpec.describe Packages::Package, type: :model do end context 'maven package' do - subject { create(:maven_package) } + subject { build_stubbed(:maven_package) } it { is_expected.to allow_value('0').for(:version) } it { is_expected.to allow_value('1').for(:version) } |