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
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-09-12 00:09:40 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-09-12 00:09:40 +0300
commitab82d93f5ba566b67dd1300da1cafe3ecdd13122 (patch)
treea1a9ea7b560159b49647bde0b81d3b396a077391 /app/assets/javascripts/super_sidebar
parent9e40efa6a6cb39c0a4a6d7d43f7445e2d6e25172 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/super_sidebar')
-rw-r--r--app/assets/javascripts/super_sidebar/components/super_sidebar.vue3
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_bar.vue2
-rw-r--r--app/assets/javascripts/super_sidebar/utils.js51
3 files changed, 49 insertions, 7 deletions
diff --git a/app/assets/javascripts/super_sidebar/components/super_sidebar.vue b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
index da1d82c1a78..fa366deeac8 100644
--- a/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
+++ b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
@@ -61,9 +61,10 @@ export default {
is_logged_in: isLoggedIn,
current_context: currentContext,
username,
+ track_visits_path: trackVisitsPath,
} = this.sidebarData;
if (isLoggedIn && currentContext.namespace) {
- trackContextAccess(username, currentContext);
+ trackContextAccess(username, currentContext, trackVisitsPath);
}
},
mounted() {
diff --git a/app/assets/javascripts/super_sidebar/components/user_bar.vue b/app/assets/javascripts/super_sidebar/components/user_bar.vue
index 8112b479c19..89fad519b89 100644
--- a/app/assets/javascripts/super_sidebar/components/user_bar.vue
+++ b/app/assets/javascripts/super_sidebar/components/user_bar.vue
@@ -37,8 +37,6 @@ export default {
GlIcon,
},
i18n: {
- createNew: __('Create new...'),
- homepage: __('Homepage'),
issues: __('Issues'),
mergeRequests: __('Merge requests'),
searchKbdHelp: sprintf(
diff --git a/app/assets/javascripts/super_sidebar/utils.js b/app/assets/javascripts/super_sidebar/utils.js
index 72a62ed6b71..e756651f3c0 100644
--- a/app/assets/javascripts/super_sidebar/utils.js
+++ b/app/assets/javascripts/super_sidebar/utils.js
@@ -2,6 +2,7 @@ import * as Sentry from '@sentry/browser';
import AccessorUtilities from '~/lib/utils/accessor';
import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/frequent_items/constants';
import { truncateNamespace } from '~/lib/utils/text_utility';
+import axios from '~/lib/utils/axios_utils';
/**
* This takes an array of project or groups that were stored in the local storage, to be shown in
@@ -37,11 +38,43 @@ export const getTopFrequentItems = (items, maxCount) => {
return frequentItems.slice(0, maxCount);
};
-const updateItemAccess = (contextItem, { lastAccessedOn, frequency = 0 } = {}) => {
+/**
+ * This tracks projects' and groups' visits in order to suggest a list of frequently visited
+ * entities to the user. Currently, this track visits in two ways:
+ * - The legacy approach uses a simple counting algorithm and stores the data in the local storage.
+ * - The above approach is being migrated to a backend-based one, where visits will be stored in the
+ * DB, and suggestions will be made through a smarter algorithm. When we are ready to transition
+ * to the newer approach, the legacy one will be cleaned up.
+ * @param {object} item The project/group item being tracked.
+ * @param {string} namespace A string indicating whether the tracked entity is a project or a group.
+ * @param {string} trackVisitsPath The API endpoint to track visits server-side.
+ * @returns {void}
+ */
+const updateItemAccess = (
+ contextItem,
+ { lastAccessedOn, frequency = 0 } = {},
+ namespace,
+ trackVisitsPath,
+) => {
const now = Date.now();
const neverAccessed = !lastAccessedOn;
const shouldUpdate = neverAccessed || Math.abs(now - lastAccessedOn) / FIFTEEN_MINUTES_IN_MS > 1;
+ if (shouldUpdate && gon.features?.serverSideFrecentNamespaces) {
+ try {
+ axios({
+ url: trackVisitsPath,
+ method: 'POST',
+ data: {
+ type: namespace,
+ id: contextItem.id,
+ },
+ });
+ } catch (e) {
+ Sentry.captureException(e);
+ }
+ }
+
return {
...contextItem,
frequency: shouldUpdate ? frequency + 1 : frequency,
@@ -49,7 +82,7 @@ const updateItemAccess = (contextItem, { lastAccessedOn, frequency = 0 } = {}) =
};
};
-export const trackContextAccess = (username, context) => {
+export const trackContextAccess = (username, context, trackVisitsPath) => {
if (!AccessorUtilities.canUseLocalStorage()) {
return false;
}
@@ -62,9 +95,19 @@ export const trackContextAccess = (username, context) => {
);
if (existingItemIndex > -1) {
- storedItems[existingItemIndex] = updateItemAccess(context.item, storedItems[existingItemIndex]);
+ storedItems[existingItemIndex] = updateItemAccess(
+ context.item,
+ storedItems[existingItemIndex],
+ context.namespace,
+ trackVisitsPath,
+ );
} else {
- const newItem = updateItemAccess(context.item);
+ const newItem = updateItemAccess(
+ context.item,
+ storedItems[existingItemIndex],
+ context.namespace,
+ trackVisitsPath,
+ );
if (storedItems.length === FREQUENT_ITEMS.MAX_COUNT) {
sortItemsByFrequencyAndLastAccess(storedItems);
storedItems.pop();