From dd681f9d07652e95ee7757969ece5e47330b74be Mon Sep 17 00:00:00 2001 From: ghosh-abhinaba Date: Thu, 24 Jul 2025 17:01:34 +0530 Subject: [PATCH 1/9] update: activity widget ux --- .../homepage/components/activity_widget.vue | 168 +++++++++++++----- 1 file changed, 126 insertions(+), 42 deletions(-) diff --git a/app/assets/javascripts/homepage/components/activity_widget.vue b/app/assets/javascripts/homepage/components/activity_widget.vue index c888f20169e8c4..1b60cc3e3e5369 100644 --- a/app/assets/javascripts/homepage/components/activity_widget.vue +++ b/app/assets/javascripts/homepage/components/activity_widget.vue @@ -1,17 +1,38 @@ + + -- GitLab From c4ce35e0d77a9ce93812e7c578ce6e92d9e52940 Mon Sep 17 00:00:00 2001 From: ghosh-abhinaba Date: Thu, 24 Jul 2025 17:05:05 +0530 Subject: [PATCH 2/9] update: activity widget ux --- app/assets/javascripts/homepage/components/activity_widget.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/homepage/components/activity_widget.vue b/app/assets/javascripts/homepage/components/activity_widget.vue index 1b60cc3e3e5369..31f35ce402da86 100644 --- a/app/assets/javascripts/homepage/components/activity_widget.vue +++ b/app/assets/javascripts/homepage/components/activity_widget.vue @@ -1,3 +1,5 @@ +/* eslint-disable */ + - - -- GitLab From 87ab26f493b0beae9512dd0d053d264a1aa29950 Mon Sep 17 00:00:00 2001 From: ghosh-abhinaba Date: Thu, 24 Jul 2025 20:05:21 +0530 Subject: [PATCH 4/9] chore: updated activity widget --- .../homepage/components/activity_widget.vue | 73 +++++-------------- 1 file changed, 19 insertions(+), 54 deletions(-) diff --git a/app/assets/javascripts/homepage/components/activity_widget.vue b/app/assets/javascripts/homepage/components/activity_widget.vue index 0684a76bf44020..8882e393379341 100644 --- a/app/assets/javascripts/homepage/components/activity_widget.vue +++ b/app/assets/javascripts/homepage/components/activity_widget.vue @@ -4,21 +4,15 @@ import { GlAlert, GlSkeletonLoader } from '@gitlab/ui'; import * as Sentry from '~/sentry/sentry_browser_wrapper'; import axios from '~/lib/utils/axios_utils'; import SafeHtml from '~/vue_shared/directives/safe_html'; -import VisibilityChangeDetector from './visibility_change_detector.vue'; import { localTimeAgo } from '~/lib/utils/datetime_utility'; import { s__ } from '~/locale'; +import VisibilityChangeDetector from './visibility_change_detector.vue'; const MAX_EVENTS = 10; export default { - components: { - GlAlert, - GlSkeletonLoader, - VisibilityChangeDetector, - }, - directives: { - SafeHtml, - }, + components: { GlAlert, GlSkeletonLoader, VisibilityChangeDetector }, + directives: { SafeHtml }, data() { return { activityFeedHtml: null, @@ -34,23 +28,18 @@ export default { async reload() { this.isLoading = true; this.hasError = false; - try { const { data } = await axios.get( - `/users/${encodeURIComponent(gon.current_username)}/activity?limit=${MAX_EVENTS}&is_personal_homepage=1`, + `/users/${encodeURIComponent(gon.current_username)}/activity?limit=${MAX_EVENTS}&is_personal_homepage=1` ); - if (data.html) { const parser = new DOMParser(); - const resp = parser.parseFromString(data.html, 'text/html'); - - const timestamps = resp.querySelectorAll('.js-timeago'); + const doc = parser.parseFromString(data.html, 'text/html'); + const timestamps = doc.querySelectorAll('.js-timeago'); if (timestamps.length) localTimeAgo(timestamps); - - this.activityFeedHtml = resp.body.innerHTML; - + this.activityFeedHtml = doc.body.innerHTML; await nextTick(); - this.parseActivityItems(resp); + this.parseActivityItems(doc); } } catch (e) { Sentry.captureException(e); @@ -59,25 +48,17 @@ export default { this.isLoading = false; } }, - - parseActivityItems(parsedDoc) { - const listItems = parsedDoc.querySelectorAll('li'); - - this.activityItems = Array.from(listItems).map((li, index) => { + parseActivityItems(doc) { + this.activityItems = Array.from(doc.querySelectorAll('li')).map(li => { const timeEl = li.querySelector('.js-timeago, time, [data-original-title]'); const timestamp = timeEl - ? timeEl.getAttribute('data-original-title') || timeEl.textContent || timeEl.title + ? (timeEl.dataset.originalTitle || timeEl.textContent || timeEl.title) : ''; - const iconEl = li.querySelector('svg, i, [role="img"]'); const iconHtml = iconEl ? iconEl.outerHTML : ''; - const clone = li.cloneNode(true); - if (iconEl) clone.querySelectorAll('svg, i, [role="img"]').forEach((e) => e.remove()); - clone - .querySelectorAll('.js-timeago, time, [data-original-title]') - .forEach((e) => e.remove()); - + if (iconEl) clone.querySelectorAll('svg, i, [role="img"]').forEach(e => e.remove()); + clone.querySelectorAll('.js-timeago, time, [data-original-title]').forEach(e => e.remove()); return { content: clone.innerHTML.trim(), iconHtml, @@ -92,7 +73,6 @@ export default {