diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-18 18:09:26 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-18 18:09:26 +0300 |
commit | b6b9abb7cdb61f18d6fc5222e52486d7f6c482dc (patch) | |
tree | 1515d3bd2dec5e8f2705212f4548d3d8e6259a49 /app | |
parent | ba12560b3fcd6e24d0ab7e14ae71917a9a81f6aa (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
8 files changed, 73 insertions, 11 deletions
diff --git a/app/assets/javascripts/environments/components/kubernetes_pods.vue b/app/assets/javascripts/environments/components/kubernetes_pods.vue index e43bc838708..1220347e440 100644 --- a/app/assets/javascripts/environments/components/kubernetes_pods.vue +++ b/app/assets/javascripts/environments/components/kubernetes_pods.vue @@ -97,7 +97,7 @@ export default { <div v-else-if="podStats && !error" - class="gl-display-flex gl-flex-wrap-wrap gl-sm-flex-wrap-nowrap gl-mx-n3 gl-mt-n3" + class="gl-display-flex gl-flex-wrap-wrap gl-sm-flex-nowrap gl-mx-n3 gl-mt-n3" > <gl-single-stat v-for="(stat, index) in podStats" diff --git a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue index 23570a374f0..99f9d5e872c 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue @@ -6,6 +6,7 @@ import ReviewerAvatarLink from './reviewer_avatar_link.vue'; const LOADING_STATE = 'loading'; const SUCCESS_STATE = 'success'; +const JUST_APPROVED = 'approved'; export default { i18n: { @@ -42,7 +43,7 @@ export default { }, watch: { users: { - handler(users) { + handler(users, previousUsers) { this.loadingStates = users.reduce( (acc, user) => ({ ...acc, @@ -50,11 +51,35 @@ export default { }), this.loadingStates, ); + if (previousUsers) { + users.forEach((user) => { + const userPreviousState = previousUsers.find(({ id }) => id === user.id); + if ( + userPreviousState && + user.mergeRequestInteraction.approved && + !userPreviousState.mergeRequestInteraction.approved + ) { + this.showApprovalAnimation(user.id); + } + }); + } }, immediate: true, }, }, methods: { + showApprovalAnimation(userId) { + this.loadingStates[userId] = JUST_APPROVED; + + setTimeout(() => { + this.loadingStates[userId] = null; + }, 1500); + }, + approveAnimation(userId) { + return { + 'merge-request-approved-icon': this.loadingStates[userId] === JUST_APPROVED, + }; + }, approvedByTooltipTitle(user) { return sprintf(s__('MergeRequest|Approved by @%{username}'), user); }, @@ -128,6 +153,7 @@ export default { :title="approvedByTooltipTitle(user)" name="status-success" class="float-right gl-my-2 gl-ml-auto gl-text-green-500 gl-flex-shrink-0" + :class="approveAnimation(user.id)" data-testid="approved" /> <gl-icon diff --git a/app/assets/javascripts/work_items/components/work_item_actions.vue b/app/assets/javascripts/work_items/components/work_item_actions.vue index 5dfae18b698..0e0c6bca802 100644 --- a/app/assets/javascripts/work_items/components/work_item_actions.vue +++ b/app/assets/javascripts/work_items/components/work_item_actions.vue @@ -86,6 +86,11 @@ export default { default: false, }, }, + data() { + return { + initialSubscribed: this.subscribedToNotifications, + }; + }, computed: { i18n() { return { @@ -94,6 +99,16 @@ export default { }; }, }, + watch: { + subscribedToNotifications() { + /** + * To toggle the value if mutation fails, assign the + * subscribedToNotifications boolean value directly + * to data prop. + */ + this.initialSubscribed = this.subscribedToNotifications; + }, + }, methods: { handleToggleWorkItemConfidentiality() { this.track('click_toggle_work_item_confidentiality'); @@ -180,7 +195,7 @@ export default { > <div class="gl-px-5 gl-pb-2 gl-pt-1"> <gl-toggle - :value="subscribedToNotifications" + v-model="initialSubscribed" :label="$options.i18n.notifications" :data-testid="$options.notificationsToggleTestId" label-position="left" diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index 7afbb7a4bed..946f2b28859 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -271,6 +271,24 @@ } } +.merge-request-approved-icon { + animation: approval-animate 350ms ease-in; +} + +@include keyframes(approval-animate) { + 0% { + transform: scale(0); + } + + 75% { + transform: scale(1.4); + } + + 100% { + transform: scale(1); + } +} + .assignee-grid, .reviewer-grid { [data-css-area='attention'] { diff --git a/app/controllers/projects/cycle_analytics_controller.rb b/app/controllers/projects/cycle_analytics_controller.rb index f3dea88862f..da0bda19602 100644 --- a/app/controllers/projects/cycle_analytics_controller.rb +++ b/app/controllers/projects/cycle_analytics_controller.rb @@ -6,10 +6,10 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController include CycleAnalyticsParams include GracefulTimeoutHandling include ProductAnalyticsTracking + include Gitlab::Utils::StrongMemoize extend ::Gitlab::Utils::Override before_action :authorize_read_cycle_analytics! - before_action :load_value_stream, only: :show track_event :show, name: 'p_analytics_valuestream', @@ -51,12 +51,13 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController override :all_cycle_analytics_params def all_cycle_analytics_params - super.merge({ namespace: @project.project_namespace, value_stream: @value_stream }) + super.merge({ namespace: @project.project_namespace, value_stream: value_stream }) end - def load_value_stream - @value_stream = Analytics::CycleAnalytics::ValueStream.build_default_value_stream(@project.project_namespace) + def value_stream + Analytics::CycleAnalytics::ValueStream.build_default_value_stream(@project.project_namespace) end + strong_memoize_attr :value_stream def cycle_analytics_json { @@ -74,3 +75,5 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController project end end + +Projects::CycleAnalyticsController.prepend_mod diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb index bf223cfe41c..5bbc89a9d65 100644 --- a/app/helpers/sidebars_helper.rb +++ b/app/helpers/sidebars_helper.rb @@ -70,8 +70,8 @@ module SidebarsHelper total_merge_requests_count: format_user_bar_count(user_merge_requests_counts[:total]), create_new_menu_groups: create_new_menu_groups(group: group, project: project), merge_request_menu: create_merge_request_menu(user), - projects_path: projects_path, - groups_path: groups_path, + projects_path: dashboard_projects_path, + groups_path: dashboard_groups_path, support_path: support_url, display_whats_new: display_whats_new?, whats_new_most_recent_release_items_count: whats_new_most_recent_release_items_count, diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index c02f3021069..856eba5aadc 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -182,7 +182,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated AnchorData.new( true, - statistic_icon('deployments') + + statistic_icon('rocket-launch') + n_('%{strong_start}%{release_count}%{strong_end} Release', '%{strong_start}%{release_count}%{strong_end} Releases', releases_count).html_safe % { release_count: number_with_delimiter(releases_count), strong_start: '<strong class="project-stat-value">'.html_safe, diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml index ada2ea3ab67..53db00c1638 100644 --- a/app/views/profiles/emails/index.html.haml +++ b/app/views/profiles/emails/index.html.haml @@ -55,7 +55,7 @@ %li= s_('Profiles|Public email') - if email.email == current_user.notification_email_or_default %li= s_('Profiles|Notification email') - .gl-display-flex.gl-justify-content-end.gl-align-items-flex-end.gl-flex-grow-1.gl-flex-wrap-wrap-reverse.gl-gap-3 + .gl-display-flex.gl-justify-content-end.gl-align-items-flex-end.gl-flex-grow-1.gl-flex-wrap-reverse.gl-gap-3 - unless email.confirmed? - confirm_title = "#{email.confirmation_sent_at ? _('Resend confirmation email') : _('Send confirmation email')}" = link_to confirm_title, resend_confirmation_instructions_profile_email_path(email), method: :put, class: 'gl-button btn btn-sm btn-default' |