diff --git a/app/assets/javascripts/pages/users/activity_calendar.js b/app/assets/javascripts/pages/users/activity_calendar.js
index 13bba06d425bbf111d9417c949d613da9d0a28c9..dbb0fe585791f777f5dc827e5c1deb246730b375 100644
--- a/app/assets/javascripts/pages/users/activity_calendar.js
+++ b/app/assets/javascripts/pages/users/activity_calendar.js
@@ -72,7 +72,7 @@ export default class ActivityCalendar {
this.clickDay = this.clickDay.bind(this);
this.currentSelectedDate = '';
this.daySpace = 1;
- this.daySize = 15;
+ this.daySize = 14;
this.daySizeWithSpace = this.daySize + this.daySpace * 2;
this.monthNames = [
__('Jan'),
@@ -131,7 +131,6 @@ export default class ActivityCalendar {
this.renderDays();
this.renderMonths();
this.renderDayTitles();
- this.renderKey();
}
// Add extra padding for the last month label if it is also the last column
@@ -257,25 +256,6 @@ export default class ActivityCalendar {
.text((date) => this.monthNames[date.month]);
}
- renderKey() {
- this.svg
- .append('g')
- .attr('transform', `translate(18, ${this.daySizeWithSpace * 8 + 16})`)
- .selectAll('rect')
- .data(CONTRIB_LEGENDS)
- .enter()
- .append('rect')
- .attr('width', this.daySize)
- .attr('height', this.daySize)
- .attr('x', (_, i) => this.daySizeWithSpace * i)
- .attr('y', 0)
- .attr('data-level', (_, i) => i)
- .attr('class', 'user-contrib-cell has-tooltip contrib-legend')
- .attr('title', (x) => x.title)
- .attr('data-container', 'body')
- .attr('data-html', true);
- }
-
clickDay(stamp) {
if (this.currentSelectedDate !== stamp.date) {
this.currentSelectedDate = stamp.date;
diff --git a/app/assets/javascripts/pages/users/show/index.js b/app/assets/javascripts/pages/users/show/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbb5e29c689ce16b49f530ce039c180ac2c7e2bb
--- /dev/null
+++ b/app/assets/javascripts/pages/users/show/index.js
@@ -0,0 +1,3 @@
+import initReadMore from '~/read_more';
+
+initReadMore();
diff --git a/app/assets/javascripts/pages/users/user_overview_block.js b/app/assets/javascripts/pages/users/user_overview_block.js
index 8d2d66d812e840fb74b96b23220c2d6eb875b19c..48c5e9a6c12d9ef262d17e9fee1274c7383c7845 100644
--- a/app/assets/javascripts/pages/users/user_overview_block.js
+++ b/app/assets/javascripts/pages/users/user_overview_block.js
@@ -16,7 +16,12 @@ export default class UserOverviewBlock {
loadData() {
const containerEl = document.querySelector(this.container);
- const loadingEl = containerEl.querySelector(`.loading`);
+
+ if (!containerEl) {
+ return;
+ }
+
+ const loadingEl = containerEl.querySelector('.loading');
loadingEl.classList.remove('hide');
diff --git a/app/assets/javascripts/pages/users/user_tabs.js b/app/assets/javascripts/pages/users/user_tabs.js
index 79eb3902116f3683688d7de46c44d6a55c338201..b5acc39e8df25fd9e8bab51751a0f3cf071c8244 100644
--- a/app/assets/javascripts/pages/users/user_tabs.js
+++ b/app/assets/javascripts/pages/users/user_tabs.js
@@ -67,17 +67,32 @@ import UserOverviewBlock from './user_overview_block';
const CALENDAR_TEMPLATE = `
-
+
+
+
+
`;
-const CALENDAR_PERIOD_6_MONTHS = 6;
const CALENDAR_PERIOD_12_MONTHS = 12;
-/* computation based on
- * width = (group + 1) * this.daySizeWithSpace + this.getExtraWidthPadding(group);
- * (see activity_calendar.js)
- */
-const OVERVIEW_CALENDAR_BREAKPOINT = 918;
export default class UserTabs {
constructor({ defaultAction, action, parentEl }) {
@@ -197,10 +212,11 @@ export default class UserTabs {
this.loadActivityCalendar();
UserTabs.renderMostRecentBlocks('#js-overview .activities-block', {
- requestParams: { limit: 15 },
+ requestParams: { limit: 10 },
});
+
UserTabs.renderMostRecentBlocks('#js-overview .projects-block', {
- requestParams: { limit: 10, skip_pagination: true, skip_namespace: true, compact_mode: true },
+ requestParams: { limit: 3, skip_pagination: true, skip_namespace: true, card_mode: true },
});
this.loaded.overview = true;
@@ -240,7 +256,7 @@ export default class UserTabs {
}
static renderActivityCalendar(data, $calendarWrap) {
- const monthsAgo = UserTabs.getVisibleCalendarPeriod($calendarWrap);
+ const monthsAgo = UserTabs.getVisibleCalendarPeriod();
const calendarActivitiesPath = $calendarWrap.data('calendarActivitiesPath');
const utcOffset = $calendarWrap.data('utcOffset');
const calendarHint = __('Issues, merge requests, pushes, and comments.');
@@ -259,6 +275,10 @@ export default class UserTabs {
firstDayOfWeek: gon.first_day_of_week,
monthsAgo,
});
+
+ // Scroll to end
+ const calendarContainer = document.querySelector('.js-contrib-calendar');
+ calendarContainer.scrollLeft = calendarContainer.scrollWidth;
}
toggleLoading(status) {
@@ -283,10 +303,7 @@ export default class UserTabs {
return this.$parentEl.find('.nav-links a.active').data('action');
}
- static getVisibleCalendarPeriod($calendarWrap) {
- const width = $calendarWrap.width();
- return width < OVERVIEW_CALENDAR_BREAKPOINT
- ? CALENDAR_PERIOD_6_MONTHS
- : CALENDAR_PERIOD_12_MONTHS;
+ static getVisibleCalendarPeriod() {
+ return CALENDAR_PERIOD_12_MONTHS;
}
}
diff --git a/app/assets/javascripts/profile/components/activity_calendar.vue b/app/assets/javascripts/profile/components/activity_calendar.vue
index d359b478d35c0523851b6549f0c947e233a86301..afb4ed943e79fc14c7c6a0a1cb416d8b27348d63 100644
--- a/app/assets/javascripts/profile/components/activity_calendar.vue
+++ b/app/assets/javascripts/profile/components/activity_calendar.vue
@@ -78,8 +78,8 @@ export default {
-
-
+
+
-
-
-
-
- {{ $options.i18n.calendarHint }}
-
-
+
+
+
+ {{ $options.i18n.calendarHint }}
+
diff --git a/app/assets/javascripts/profile/components/overview_tab.vue b/app/assets/javascripts/profile/components/overview_tab.vue
index 8cfa3fb3eea188ed45158038df5dacf477b274ec..148bdbc43b124d539e7df95e3833de102222cbe7 100644
--- a/app/assets/javascripts/profile/components/overview_tab.vue
+++ b/app/assets/javascripts/profile/components/overview_tab.vue
@@ -40,7 +40,7 @@ export default {
try {
const { data: events } = await axios.get(this.userActivityPath, {
- params: { limit: 10 },
+ params: { limit: 5 },
});
this.events = events;
} catch (error) {
@@ -54,19 +54,19 @@ export default {
-
-
-
+
+
{{ $options.i18n.activity }}
{{ $options.i18n.viewAll }}
+
-
+
diff --git a/app/assets/javascripts/profile/components/profile_tabs.vue b/app/assets/javascripts/profile/components/profile_tabs.vue
index e24167eb4fa713defd1aec55ef1791a64495357a..a15794ac07d517454862c2b0efa53dbf364f3d16 100644
--- a/app/assets/javascripts/profile/components/profile_tabs.vue
+++ b/app/assets/javascripts/profile/components/profile_tabs.vue
@@ -81,7 +81,7 @@ export default {
},
async mounted() {
try {
- const response = await getUserProjects(this.userId, { per_page: 10 });
+ const response = await getUserProjects(this.userId, { per_page: 3 });
this.personalProjects = convertObjectPropsToCamelCase(response.data, { deep: true }).map(
(project) => {
// This API does not return the `visibility` key if user is signed out.
diff --git a/app/assets/javascripts/profile/components/user_achievements.vue b/app/assets/javascripts/profile/components/user_achievements.vue
index 7ce6b61c4aca7ca73334202aeba0d051e7ead561..2a5e9175fa284faea0515c0e493e90a3f8f00c31 100644
--- a/app/assets/javascripts/profile/components/user_achievements.vue
+++ b/app/assets/javascripts/profile/components/user_achievements.vue
@@ -67,12 +67,16 @@ export default {
i18n: {
awardedBy: s__('Achievements|Awarded %{timeAgo} by %{namespace}'),
awardedByUnknownNamespace: s__('Achievements|Awarded %{timeAgo} by a private namespace'),
+ achievementsLabel: s__('Achievements|Achievements'),
},
};
-
+
+
+ {{ $options.i18n.achievementsLabel }}
+
{{
diff --git a/app/assets/javascripts/read_more.js b/app/assets/javascripts/read_more.js
index 692f375bb940bcb2abc7b30c6f74dfec23e94ce4..e6289f7f32b63af63bb8dbf243a55348d549606f 100644
--- a/app/assets/javascripts/read_more.js
+++ b/app/assets/javascripts/read_more.js
@@ -16,6 +16,8 @@
*
*
*
+ * If data-height is present it will use it to determine if the button should be shown or not.
+ *
*/
export default function initReadMore(triggerSelector = '.js-read-more-trigger') {
const triggerEls = document.querySelectorAll(triggerSelector);
@@ -29,6 +31,11 @@ export default function initReadMore(triggerSelector = '.js-read-more-trigger')
return;
}
+ if (targetEl?.getAttribute('data-height') > targetEl.clientHeight) {
+ triggerEl.remove();
+ return;
+ }
+
triggerEl.addEventListener(
'click',
() => {
diff --git a/app/assets/javascripts/users/profile/actions/components/user_actions_app.vue b/app/assets/javascripts/users/profile/actions/components/user_actions_app.vue
index f994cad6881b618133afc6795e179ab3dffa54e0..dbaf5ed814218217c34ad1a009b47c0b567871ef 100644
--- a/app/assets/javascripts/users/profile/actions/components/user_actions_app.vue
+++ b/app/assets/javascripts/users/profile/actions/components/user_actions_app.vue
@@ -1,10 +1,11 @@