Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-03-10 15:07:07 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-03-10 15:07:07 +0300
commite3624c5be1696597bc6b351f56f1a84c2b13211b (patch)
treef7478638f22c2dcc7f1d987b8c578508324e4644 /app
parent74c7e01089dc2245462723574b102665ef3a6440 (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.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue6
-rw-r--r--app/graphql/mutations/saved_replies/base.rb31
-rw-r--r--app/graphql/mutations/saved_replies/create.rb26
-rw-r--r--app/graphql/types/mutation_type.rb1
-rw-r--r--app/graphql/types/saved_reply_type.rb21
-rw-r--r--app/graphql/types/user_interface.rb4
-rw-r--r--app/policies/user_policy.rb2
-rw-r--r--app/policies/users/saved_reply_policy.rb7
-rw-r--r--app/presenters/user_presenter.rb8
-rw-r--r--app/services/users/saved_replies/create_service.rb29
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