From 62b1e71a0d1898496a937b8300a364a905f874fa Mon Sep 17 00:00:00 2001 From: Chaoyue Zhao Date: Tue, 18 Feb 2025 21:55:05 -0500 Subject: [PATCH 1/5] Change Permalink button into dropdown item Add a new permalink_dropdown_item.vue component that copies permalink to clipboard with a successful toast. Show new component to blob overflow menu when `blob_overflow_menu` flag is on. --- .../blob/blob_line_permalink_updater.js | 15 +- app/assets/javascripts/blob/utils.js | 5 +- .../header_area/blob_button_group.vue | 2 +- .../components/header_area/blob_controls.vue | 1 + .../header_area/blob_overflow_menu.vue | 3 + .../header_area/permalink_dropdown_item.vue | 80 ++++++++ locale/gitlab.pot | 6 + .../blobs/blob_line_permalink_updater_spec.rb | 174 +++++++++++++----- .../header_area/blob_overflow_menu_spec.js | 8 + .../permalink_dropdown_item_spec.js | 123 +++++++++++++ 10 files changed, 370 insertions(+), 47 deletions(-) create mode 100644 app/assets/javascripts/repository/components/header_area/permalink_dropdown_item.vue create mode 100644 spec/frontend/repository/components/header_area/permalink_dropdown_item_spec.js diff --git a/app/assets/javascripts/blob/blob_line_permalink_updater.js b/app/assets/javascripts/blob/blob_line_permalink_updater.js index 928035d7c1ef7e..7d3165a417b1ef 100644 --- a/app/assets/javascripts/blob/blob_line_permalink_updater.js +++ b/app/assets/javascripts/blob/blob_line_permalink_updater.js @@ -1,4 +1,4 @@ -import { getLocationHash } from '../lib/utils/url_utility'; +import { getLocationHash } from '~/lib/utils/url_utility'; import { getPageParamValue, getPageSearchString } from './utils'; const lineNumberRe = /^(L|LC)[0-9]+/; @@ -11,16 +11,27 @@ const updateLineNumbersOnBlobPermalinks = (linksToUpdate) => { [].concat(Array.prototype.slice.call(linksToUpdate)).forEach((permalinkButton) => { const baseHref = permalinkButton.dataset.originalHref || + permalinkButton.dataset.clipboardText?.split('#')[0] || (() => { - const href = permalinkButton.getAttribute('href'); + const href = + permalinkButton.getAttribute('href') || + // eslint-disable-next-line unicorn/prefer-dom-node-dataset + permalinkButton.getAttribute('data-clipboard-text')?.split('#')[0]; // eslint-disable-next-line no-param-reassign permalinkButton.dataset.originalHref = href; + // eslint-disable-next-line no-param-reassign + permalinkButton.dataset.clipboardText = href; return href; })(); const lineNum = parseInt(hash.split('L')[1], 10); const page = getPageParamValue(lineNum); const searchString = getPageSearchString(baseHref, page); permalinkButton.setAttribute('href', `${baseHref}${searchString}${hashUrlString}`); + // eslint-disable-next-line unicorn/prefer-dom-node-dataset + permalinkButton.setAttribute( + 'data-clipboard-text', + `${baseHref}${searchString}${hashUrlString}`, + ); }); } }; diff --git a/app/assets/javascripts/blob/utils.js b/app/assets/javascripts/blob/utils.js index 0ecc8be1027211..b245a5c630518a 100644 --- a/app/assets/javascripts/blob/utils.js +++ b/app/assets/javascripts/blob/utils.js @@ -24,7 +24,9 @@ export const getPageSearchString = (path, page) => { export function moveToFilePermalink() { const fileBlobPermalinkUrlElement = document.querySelector('.js-data-file-blob-permalink-url'); - const permalink = fileBlobPermalinkUrlElement?.getAttribute('href'); + const permalink = + fileBlobPermalinkUrlElement?.getAttribute('href') || + fileBlobPermalinkUrlElement?.getAttribute('data-clipboard-text'); if (!permalink) { return; @@ -49,7 +51,6 @@ function eventHasModifierKeys(event) { export function shortcircuitPermalinkButton() { const fileBlobPermalinkUrlElement = document.querySelector('.js-data-file-blob-permalink-url'); - fileBlobPermalinkUrlElement?.addEventListener('click', (e) => { if (!eventHasModifierKeys(e)) { e.preventDefault(); diff --git a/app/assets/javascripts/repository/components/header_area/blob_button_group.vue b/app/assets/javascripts/repository/components/header_area/blob_button_group.vue index bcaecfc0b5d8a5..bcbbb5138b4f9d 100644 --- a/app/assets/javascripts/repository/components/header_area/blob_button_group.vue +++ b/app/assets/javascripts/repository/components/header_area/blob_button_group.vue @@ -110,7 +110,7 @@ export default {