diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-10 15:07:07 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-10 15:07:07 +0300 |
commit | e3624c5be1696597bc6b351f56f1a84c2b13211b (patch) | |
tree | f7478638f22c2dcc7f1d987b8c578508324e4644 /app | |
parent | 74c7e01089dc2245462723574b102665ef3a6440 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue | 2 | ||||
-rw-r--r-- | app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue | 6 | ||||
-rw-r--r-- | app/graphql/mutations/saved_replies/base.rb | 31 | ||||
-rw-r--r-- | app/graphql/mutations/saved_replies/create.rb | 26 | ||||
-rw-r--r-- | app/graphql/types/mutation_type.rb | 1 | ||||
-rw-r--r-- | app/graphql/types/saved_reply_type.rb | 21 | ||||
-rw-r--r-- | app/graphql/types/user_interface.rb | 4 | ||||
-rw-r--r-- | app/policies/user_policy.rb | 2 | ||||
-rw-r--r-- | app/policies/users/saved_reply_policy.rb | 7 | ||||
-rw-r--r-- | app/presenters/user_presenter.rb | 8 | ||||
-rw-r--r-- | app/services/users/saved_replies/create_service.rb | 29 |
11 files changed, 134 insertions, 3 deletions
diff --git a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue index b9f0b5012ac..bd0f4cd5dd7 100644 --- a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue +++ b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue @@ -137,7 +137,7 @@ export default { <gl-form-input data-qa-selector="githubish_import_filter_field" name="filter" - :placeholder="__('Filter your repositories by name')" + :placeholder="__('Filter by name')" autofocus size="lg" @keyup.enter="setFilter($event.target.value)" diff --git a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue index 688f6372a4e..cd4d9398899 100644 --- a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue +++ b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue @@ -352,6 +352,8 @@ export default { return Promise.resolve(); }, initPolling() { + if (this.startingPollInterval <= 0) return; + this.pollingInterval = new SmartInterval({ callback: this.checkStatus, startingInterval: this.startingPollInterval, @@ -435,10 +437,10 @@ export default { notify.notifyMe(title, message, this.mr.gitlabLogo); }, resumePolling() { - this.pollingInterval.resume(); + this.pollingInterval?.resume(); }, stopPolling() { - this.pollingInterval.stopTimer(); + this.pollingInterval?.stopTimer(); }, bindEventHubListeners() { eventHub.$on('MRWidgetUpdateRequested', (cb) => { diff --git a/app/graphql/mutations/saved_replies/base.rb b/app/graphql/mutations/saved_replies/base.rb new file mode 100644 index 00000000000..bc9723b76f7 --- /dev/null +++ b/app/graphql/mutations/saved_replies/base.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Mutations + module SavedReplies + class Base < BaseMutation + field :saved_reply, Types::SavedReplyType, + null: true, + description: 'Updated saved reply.' + + private + + def present_result(result) + if result.success? + { + saved_reply: result[:saved_reply], + errors: [] + } + else + { + saved_reply: nil, + errors: result.message + } + end + end + + def feature_enabled? + Feature.enabled?(:saved_replies, current_user, default_enabled: :yaml) + end + end + end +end diff --git a/app/graphql/mutations/saved_replies/create.rb b/app/graphql/mutations/saved_replies/create.rb new file mode 100644 index 00000000000..d97461a1c2a --- /dev/null +++ b/app/graphql/mutations/saved_replies/create.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Mutations + module SavedReplies + class Create < Base + graphql_name 'SavedReplyCreate' + + authorize :create_saved_replies + + argument :name, GraphQL::Types::String, + required: true, + description: copy_field_description(Types::SavedReplyType, :name) + + argument :content, GraphQL::Types::String, + required: true, + description: copy_field_description(Types::SavedReplyType, :content) + + def resolve(name:, content:) + raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless feature_enabled? + + result = ::Users::SavedReplies::CreateService.new(current_user: current_user, name: name, content: content).execute + present_result(result) + end + end + end +end diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb index 9efbde2da6b..812104e0fd3 100644 --- a/app/graphql/types/mutation_type.rb +++ b/app/graphql/types/mutation_type.rb @@ -129,6 +129,7 @@ module Types mount_mutation Mutations::WorkItems::CreateFromTask mount_mutation Mutations::WorkItems::Delete mount_mutation Mutations::WorkItems::Update + mount_mutation Mutations::SavedReplies::Create end end diff --git a/app/graphql/types/saved_reply_type.rb b/app/graphql/types/saved_reply_type.rb new file mode 100644 index 00000000000..329f431b10e --- /dev/null +++ b/app/graphql/types/saved_reply_type.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Types + class SavedReplyType < BaseObject + graphql_name 'SavedReply' + + authorize :read_saved_replies + + field :id, Types::GlobalIDType[::Users::SavedReply], + null: false, + description: 'Global ID of the saved reply.' + + field :content, GraphQL::Types::String, + null: false, + description: 'Content of the saved reply.' + + field :name, GraphQL::Types::String, + null: false, + description: 'Name of the saved reply.' + end +end diff --git a/app/graphql/types/user_interface.rb b/app/graphql/types/user_interface.rb index 2cefde8392e..2c9592a7f5a 100644 --- a/app/graphql/types/user_interface.rb +++ b/app/graphql/types/user_interface.rb @@ -115,6 +115,10 @@ module Types extras: [:lookahead], complexity: 5, resolver: ::Resolvers::TimelogResolver + field :saved_replies, + Types::SavedReplyType.connection_type, + null: true, + description: 'Saved replies authored by the user.' field :gitpod_enabled, GraphQL::Types::Boolean, null: true, description: 'Whether Gitpod is enabled at the user level.' diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index 018c061af9f..115325803a1 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -23,9 +23,11 @@ class UserPolicy < BasePolicy enable :destroy_user enable :update_user enable :update_user_status + enable :create_saved_replies enable :read_user_personal_access_tokens enable :read_group_count enable :read_user_groups + enable :read_saved_replies end rule { default }.enable :read_user_profile diff --git a/app/policies/users/saved_reply_policy.rb b/app/policies/users/saved_reply_policy.rb new file mode 100644 index 00000000000..be76c526012 --- /dev/null +++ b/app/policies/users/saved_reply_policy.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Users + class SavedReplyPolicy < BasePolicy + delegate { @subject.user } + end +end diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index 33aa725faac..dc775fb4160 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -19,6 +19,14 @@ class UserPresenter < Gitlab::View::Presenter::Delegated profile_path(user: { gitpod_enabled: true }) if application_gitpod_enabled? end + delegator_override :saved_replies + def saved_replies + return ::Users::SavedReply.none unless Feature.enabled?(:saved_replies, current_user, default_enabled: :yaml) + return ::Users::SavedReply.none unless current_user.can?(:read_saved_replies, user) + + user.saved_replies + end + private def can?(*args) diff --git a/app/services/users/saved_replies/create_service.rb b/app/services/users/saved_replies/create_service.rb new file mode 100644 index 00000000000..21378ec4435 --- /dev/null +++ b/app/services/users/saved_replies/create_service.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Users + module SavedReplies + class CreateService + def initialize(current_user:, name:, content:) + @current_user = current_user + @name = name + @content = content + end + + def execute + saved_reply = saved_replies.build(name: name, content: content) + + if saved_reply.save + ServiceResponse.success(payload: { saved_reply: saved_reply }) + else + ServiceResponse.error(message: saved_reply.errors.full_messages) + end + end + + private + + attr_reader :current_user, :name, :content + + delegate :saved_replies, to: :current_user + end + end +end |