diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-21 12:10:22 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-21 12:10:22 +0000 |
commit | 9e68395a98e71e2a0e9a6200f15ad1e7bae9ea87 (patch) | |
tree | b8508b7503f056b2438cc2fef6f2f9b1edfa0279 /app | |
parent | 202268ad93e9a1556f5700326be5ec89bd641a97 (diff) | |
download | gitlab-ce-9e68395a98e71e2a0e9a6200f15ad1e7bae9ea87.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/repository/components/table/index.vue | 26 | ||||
-rw-r--r-- | app/assets/javascripts/repository/components/tree_content.vue | 19 | ||||
-rw-r--r-- | app/graphql/resolvers/project_members_resolver.rb | 10 | ||||
-rw-r--r-- | app/graphql/types/group_member_type.rb | 2 | ||||
-rw-r--r-- | app/graphql/types/member_interface.rb | 20 | ||||
-rw-r--r-- | app/graphql/types/project_member_type.rb | 9 | ||||
-rw-r--r-- | app/graphql/types/project_type.rb | 2 | ||||
-rw-r--r-- | app/helpers/environments_helper.rb | 78 | ||||
-rw-r--r-- | app/models/merge_request.rb | 11 |
9 files changed, 99 insertions, 78 deletions
diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue index d0cc617d755..fd70a6419fc 100644 --- a/app/assets/javascripts/repository/components/table/index.vue +++ b/app/assets/javascripts/repository/components/table/index.vue @@ -1,5 +1,5 @@ <script> -import { GlSkeletonLoading } from '@gitlab/ui'; +import { GlSkeletonLoading, GlButton } from '@gitlab/ui'; import { sprintf, __ } from '../../../locale'; import getRefMixin from '../../mixins/get_ref'; import projectPathQuery from '../../queries/project_path.query.graphql'; @@ -13,6 +13,7 @@ export default { TableHeader, TableRow, ParentRow, + GlButton, }, mixins: [getRefMixin], apollo: { @@ -39,6 +40,10 @@ export default { required: false, default: '', }, + hasMore: { + type: Boolean, + required: true, + }, }, data() { return { @@ -65,6 +70,11 @@ export default { return !this.isLoading && ['', '/'].indexOf(this.path) === -1; }, }, + methods: { + showMore() { + this.$emit('showMore'); + }, + }, }; </script> @@ -110,6 +120,20 @@ export default { <td><gl-skeleton-loading :lines="1" class="ml-auto h-auto w-50" /></td> </tr> </template> + <template v-if="hasMore"> + <tr> + <td align="center" colspan="3" class="gl-p-0!"> + <gl-button + variant="link" + class="gl-display-flex gl-w-full gl-py-4!" + :loading="isLoading" + @click="showMore" + > + {{ s__('ProjectFileTree|Show more') }} + </gl-button> + </td> + </tr> + </template> </tbody> </table> </div> diff --git a/app/assets/javascripts/repository/components/tree_content.vue b/app/assets/javascripts/repository/components/tree_content.vue index fe3065a2145..365b6cbb550 100644 --- a/app/assets/javascripts/repository/components/tree_content.vue +++ b/app/assets/javascripts/repository/components/tree_content.vue @@ -1,5 +1,4 @@ <script> -import { GlButton } from '@gitlab/ui'; import { deprecatedCreateFlash as createFlash } from '~/flash'; import { __ } from '../../locale'; import FileTable from './table/index.vue'; @@ -17,7 +16,6 @@ export default { components: { FileTable, FilePreview, - GlButton, }, mixins: [getRefMixin], apollo: { @@ -127,7 +125,7 @@ export default { .concat(data.trees.pageInfo, data.submodules.pageInfo, data.blobs.pageInfo) .find(({ hasNextPage }) => hasNextPage); }, - showMore() { + handleShowMore() { this.clickedShowMore = true; this.fetchFiles(); }, @@ -142,20 +140,9 @@ export default { :entries="entries" :is-loading="isLoadingFiles" :loading-path="loadingPath" + :has-more="hasShowMore" + @showMore="handleShowMore" /> - <div - v-if="hasShowMore" - class="gl-border-1 gl-border-gray-100 gl-rounded-base gl-border-t-none gl-border-b-solid gl-border-l-solid gl-border-r-solid gl-rounded-top-right-none gl-rounded-top-left-none gl-mt-n1" - > - <gl-button - variant="link" - class="gl-display-flex gl-w-full gl-py-4!" - :loading="isLoadingFiles" - @click="showMore" - > - {{ s__('ProjectFileTree|Show more') }} - </gl-button> - </div> <file-preview v-if="readme" :blob="readme" /> </div> </template> diff --git a/app/graphql/resolvers/project_members_resolver.rb b/app/graphql/resolvers/project_members_resolver.rb index 3846531762e..7ee635014f4 100644 --- a/app/graphql/resolvers/project_members_resolver.rb +++ b/app/graphql/resolvers/project_members_resolver.rb @@ -2,19 +2,23 @@ module Resolvers class ProjectMembersResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + argument :search, GraphQL::STRING_TYPE, required: false, description: 'Search query' - type Types::ProjectMemberType, null: true + type Types::MemberInterface, null: true + + authorize :read_project_member alias_method :project, :object def resolve(**args) - return Member.none unless project.present? + authorize!(project) MembersFinder - .new(project, context[:current_user], params: args) + .new(project, current_user, params: args) .execute end end diff --git a/app/graphql/types/group_member_type.rb b/app/graphql/types/group_member_type.rb index ffffa3247db..6cca0a50647 100644 --- a/app/graphql/types/group_member_type.rb +++ b/app/graphql/types/group_member_type.rb @@ -8,7 +8,7 @@ module Types implements MemberInterface graphql_name 'GroupMember' - description 'Represents a Group Member' + description 'Represents a Group Membership' field :group, Types::GroupType, null: true, description: 'Group that a User is a member of', diff --git a/app/graphql/types/member_interface.rb b/app/graphql/types/member_interface.rb index 976836221bc..fed7272c0e3 100644 --- a/app/graphql/types/member_interface.rb +++ b/app/graphql/types/member_interface.rb @@ -4,6 +4,9 @@ module Types module MemberInterface include BaseInterface + field :id, GraphQL::ID_TYPE, null: false, + description: 'ID of the member' + field :access_level, Types::AccessLevelType, null: true, description: 'GitLab::Access level' @@ -18,5 +21,22 @@ module Types field :expires_at, Types::TimeType, null: true, description: 'Date and time the membership expires' + + field :user, Types::UserType, null: false, + description: 'User that is associated with the member object', + resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(User, obj.user_id).find } + + definition_methods do + def resolve_type(object, context) + case object + when GroupMember + Types::GroupMemberType + when ProjectMember + Types::ProjectMemberType + else + raise ::Gitlab::Graphql::Errors::BaseError, "Unknown member type #{object.class.name}" + end + end + end end end diff --git a/app/graphql/types/project_member_type.rb b/app/graphql/types/project_member_type.rb index e9ccb51886b..f08781238d0 100644 --- a/app/graphql/types/project_member_type.rb +++ b/app/graphql/types/project_member_type.rb @@ -3,7 +3,7 @@ module Types class ProjectMemberType < BaseObject graphql_name 'ProjectMember' - description 'Represents a Project Member' + description 'Represents a Project Membership' expose_permissions Types::PermissionTypes::Project @@ -11,13 +11,6 @@ module Types authorize :read_project - field :id, GraphQL::ID_TYPE, null: false, - description: 'ID of the member' - - field :user, Types::UserType, null: false, - description: 'User that is associated with the member object', - resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(User, obj.user_id).find } - field :project, Types::ProjectType, null: true, description: 'Project that User is a member of', resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, obj.source_id).find } diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index 5562db69de6..36e37654812 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -159,7 +159,7 @@ module Types resolver: Resolvers::ProjectMilestonesResolver field :project_members, - Types::ProjectMemberType.connection_type, + Types::MemberInterface.connection_type, description: 'Members of the project', resolver: Resolvers::ProjectMembersResolver diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb index 39be8ae9f60..7f0c59f65a0 100644 --- a/app/helpers/environments_helper.rb +++ b/app/helpers/environments_helper.rb @@ -12,8 +12,8 @@ module EnvironmentsHelper def environments_folder_list_view_data { "endpoint" => folder_project_environments_path(@project, @folder, format: :json), - "folder-name" => @folder, - "can-read-environment" => can?(current_user, :read_environment, @project).to_s + "folder_name" => @folder, + "can_read_environment" => can?(current_user, :read_environment, @project).to_s } end @@ -33,11 +33,11 @@ module EnvironmentsHelper def environment_logs_data(project, environment) { - "environment-name": environment.name, - "environments-path": project_environments_path(project, format: :json), - "environment-id": environment.id, - "cluster-applications-documentation-path" => help_page_path('user/clusters/applications.md', anchor: 'elastic-stack'), - "clusters-path": project_clusters_path(project, format: :json) + "environment_name": environment.name, + "environments_path": project_environments_path(project, format: :json), + "environment_id": environment.id, + "cluster_applications_documentation_path" => help_page_path('user/clusters/applications.md', anchor: 'elastic-stack'), + "clusters_path": project_clusters_path(project, format: :json) } end @@ -51,18 +51,18 @@ module EnvironmentsHelper return {} unless project { - 'settings-path' => edit_project_service_path(project, 'prometheus'), - 'clusters-path' => project_clusters_path(project), - 'dashboards-endpoint' => project_performance_monitoring_dashboards_path(project, format: :json), - 'default-branch' => project.default_branch, - 'project-path' => project_path(project), - 'tags-path' => project_tags_path(project), - 'external-dashboard-url' => project.metrics_setting_external_dashboard_url, - 'custom-metrics-path' => project_prometheus_metrics_path(project), - 'validate-query-path' => validate_query_project_prometheus_metrics_path(project), - 'custom-metrics-available' => "#{custom_metrics_available?(project)}", - 'prometheus-alerts-available' => "#{can?(current_user, :read_prometheus_alerts, project)}", - 'dashboard-timezone' => project.metrics_setting_dashboard_timezone.to_s.upcase + 'settings_path' => edit_project_service_path(project, 'prometheus'), + 'clusters_path' => project_clusters_path(project), + 'dashboards_endpoint' => project_performance_monitoring_dashboards_path(project, format: :json), + 'default_branch' => project.default_branch, + 'project_path' => project_path(project), + 'tags_path' => project_tags_path(project), + 'external_dashboard_url' => project.metrics_setting_external_dashboard_url, + 'custom_metrics_path' => project_prometheus_metrics_path(project), + 'validate_query_path' => validate_query_project_prometheus_metrics_path(project), + 'custom_metrics_available' => "#{custom_metrics_available?(project)}", + 'prometheus_alerts_available' => "#{can?(current_user, :read_prometheus_alerts, project)}", + 'dashboard_timezone' => project.metrics_setting_dashboard_timezone.to_s.upcase } end @@ -70,11 +70,11 @@ module EnvironmentsHelper return {} unless environment { - 'metrics-dashboard-base-path' => metrics_dashboard_base_path(environment, project), - 'current-environment-name' => environment.name, - 'has-metrics' => "#{environment.has_metrics?}", - 'prometheus-status' => "#{environment.prometheus_status}", - 'environment-state' => "#{environment.state}" + 'metrics_dashboard_base_path' => metrics_dashboard_base_path(environment, project), + 'current_environment_name' => environment.name, + 'has_metrics' => "#{environment.has_metrics?}", + 'prometheus_status' => "#{environment.prometheus_status}", + 'environment_state' => "#{environment.state}" } end @@ -93,26 +93,26 @@ module EnvironmentsHelper return {} unless project && environment { - 'metrics-endpoint' => additional_metrics_project_environment_path(project, environment, format: :json), - 'dashboard-endpoint' => metrics_dashboard_project_environment_path(project, environment, format: :json), - 'deployments-endpoint' => project_environment_deployments_path(project, environment, format: :json), - 'alerts-endpoint' => project_prometheus_alerts_path(project, environment_id: environment.id, format: :json), - 'operations-settings-path' => project_settings_operations_path(project), - 'can-access-operations-settings' => can?(current_user, :admin_operations, project).to_s, - 'panel-preview-endpoint' => project_metrics_dashboards_builder_path(project, format: :json) + 'metrics_endpoint' => additional_metrics_project_environment_path(project, environment, format: :json), + 'dashboard_endpoint' => metrics_dashboard_project_environment_path(project, environment, format: :json), + 'deployments_endpoint' => project_environment_deployments_path(project, environment, format: :json), + 'alerts_endpoint' => project_prometheus_alerts_path(project, environment_id: environment.id, format: :json), + 'operations_settings_path' => project_settings_operations_path(project), + 'can_access_operations_settings' => can?(current_user, :admin_operations, project).to_s, + 'panel_preview_endpoint' => project_metrics_dashboards_builder_path(project, format: :json) } end def static_metrics_data { - 'documentation-path' => help_page_path('administration/monitoring/prometheus/index.md'), - 'add-dashboard-documentation-path' => help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'), - 'empty-getting-started-svg-path' => image_path('illustrations/monitoring/getting_started.svg'), - 'empty-loading-svg-path' => image_path('illustrations/monitoring/loading.svg'), - 'empty-no-data-svg-path' => image_path('illustrations/monitoring/no_data.svg'), - 'empty-no-data-small-svg-path' => image_path('illustrations/chart-empty-state-small.svg'), - 'empty-unable-to-connect-svg-path' => image_path('illustrations/monitoring/unable_to_connect.svg'), - 'custom-dashboard-base-path' => Gitlab::Metrics::Dashboard::RepoDashboardFinder::DASHBOARD_ROOT + 'documentation_path' => help_page_path('administration/monitoring/prometheus/index.md'), + 'add_dashboard_documentation_path' => help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'), + 'empty_getting_started_svg_path' => image_path('illustrations/monitoring/getting_started.svg'), + 'empty_loading_svg_path' => image_path('illustrations/monitoring/loading.svg'), + 'empty_no_data_svg_path' => image_path('illustrations/monitoring/no_data.svg'), + 'empty_no_data_small_svg_path' => image_path('illustrations/chart-empty-state-small.svg'), + 'empty_unable_to_connect_svg_path' => image_path('illustrations/monitoring/unable_to_connect.svg'), + 'custom_dashboard_base_path' => Gitlab::Metrics::Dashboard::RepoDashboardFinder::DASHBOARD_ROOT } end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 36e458d9353..ff72aa7f563 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -105,7 +105,6 @@ class MergeRequest < ApplicationRecord after_create :ensure_merge_request_diff after_update :clear_memoized_shas - after_update :clear_memoized_source_branch_exists after_update :reload_diff_if_branch_changed after_commit :ensure_metrics, on: [:create, :update], unless: :importing? after_commit :expire_etag_cache, unless: :importing? @@ -871,10 +870,6 @@ class MergeRequest < ApplicationRecord clear_memoization(:target_branch_head) end - def clear_memoized_source_branch_exists - clear_memoization(:source_branch_exists) - end - def reload_diff_if_branch_changed if (saved_change_to_source_branch? || saved_change_to_target_branch?) && (source_branch_head && target_branch_head) @@ -1126,11 +1121,9 @@ class MergeRequest < ApplicationRecord end def source_branch_exists? - strong_memoize(:source_branch_exists) do - next false unless self.source_project + return false unless self.source_project - self.source_project.repository.branch_exists?(self.source_branch) - end + self.source_project.repository.branch_exists?(self.source_branch) end def target_branch_exists? |