From 0b955ea0288d1ce5034a0e43bab1d270a41b83d2 Mon Sep 17 00:00:00 2001 From: Epoc Date: Sat, 11 Apr 2020 15:53:47 +0200 Subject: [PATCH 01/31] Add general toggle of the new feature --- html/options.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/html/options.html b/html/options.html index 89c2fe1..22078f8 100644 --- a/html/options.html +++ b/html/options.html @@ -17,6 +17,9 @@
Available placeholders: {MR_TITLE}, {MR_ID}, {MR_URL}, {MR_DIFFS_URL}, {MR_AUTHOR_NAME}, {MR_STATUS}, {MR_SOURCE_BRANCH_NAME}, {MR_TARGET_BRANCH_NAME}
+
+ +
From d1c8e71ad4f4ab6ffb8ed600f967964d029a7bd4 Mon Sep 17 00:00:00 2001 From: Epoc Date: Sat, 11 Apr 2020 16:10:04 +0200 Subject: [PATCH 02/31] Options page --- html/options.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/html/options.html b/html/options.html index 33a70dc..751d84e 100644 --- a/html/options.html +++ b/html/options.html @@ -18,7 +18,12 @@
Available placeholders: {MR_TITLE}, {MR_ID}, {MR_URL}, {MR_DIFFS_URL}, {MR_AUTHOR_NAME}, {MR_STATUS}, {MR_SOURCE_BRANCH_NAME}, {MR_TARGET_BRANCH_NAME}
- + +
+
From d6d449e31d1a769695c889c56d0a049f3a818db1 Mon Sep 17 00:00:00 2001 From: Epoc Date: Sat, 11 Apr 2020 18:58:52 +0200 Subject: [PATCH 03/31] Continuing option page --- css/options.css | 20 ++++++++++++++++++-- html/options.html | 10 +++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/css/options.css b/css/options.css index 1fcaefd..bf98b09 100644 --- a/css/options.css +++ b/css/options.css @@ -9,6 +9,10 @@ width: 100%; } +.w50 { + width: 50%; +} + .is-hidden { display: none; } @@ -28,14 +32,26 @@ padding-top: 5px; } +.ptm { + padding-top: 10px; +} + .pbs { padding-bottom: 5px; } -.man { - margin: 0; +.pbm { + padding-bottom: 10px; +} + +.prm { + padding-right: 10px; } .pll { padding-left: 30px; +} + +.man { + margin: 0; } \ No newline at end of file diff --git a/html/options.html b/html/options.html index 751d84e..fd6029d 100644 --- a/html/options.html +++ b/html/options.html @@ -18,12 +18,12 @@
Available placeholders: {MR_TITLE}, {MR_ID}, {MR_URL}, {MR_DIFFS_URL}, {MR_AUTHOR_NAME}, {MR_STATUS}, {MR_SOURCE_BRANCH_NAME}, {MR_TARGET_BRANCH_NAME}
- +
-
-
-
Where should the Jira ticket ID be searched in?
+
+
Where should the Jira ticket ID be searched in?
Note: the position of the Jira ticket ID in the source branch name and in the Merge Request title doesn't matter
From 2bbde0fa29809bb9c213ebb4fb8d0f66dc3ab8c3 Mon Sep 17 00:00:00 2001 From: Epoc Date: Sun, 12 Apr 2020 19:25:04 +0200 Subject: [PATCH 05/31] Continuing options page --- html/options.html | 6 +++--- js/options.js | 26 +++++++++++++++++++++++++- js/preferences.js | 5 ++++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/html/options.html b/html/options.html index d8a61e0..940ca3c 100644 --- a/html/options.html +++ b/html/options.html @@ -23,10 +23,10 @@
-
-
+
diff --git a/js/options.js b/js/options.js index fa13142..596011a 100644 --- a/js/options.js +++ b/js/options.js @@ -22,6 +22,11 @@ this.enableButtonsToCopySourceAndTargetBranchesNameCheckbox = document.querySelector('input#enable_buttons_to_copy_source_and_target_branches_name'); this.enableButtonToCopyMrInfoCheckbox = document.querySelector('input#enable_button_to_copy_mr_info'); this.copyMrInfoFormatTextarea = document.querySelector('textarea#copy_mr_info_format'); + + this.jiraTicketLinkOptionsDiv = document.querySelector('div#jira-ticket-link-options'); + this.enableJiraTicketLinkCheckbox = document.querySelector('input#enable_jira_ticket_link'); + this.baseJiraUrlInput = document.querySelector('input#base_jira_url'); + this.jiraTicketIdDetectionLocationRadioButtons = Array.from(document.querySelectorAll('input[name="jira_ticket_id_detection_location"]')); } /** @@ -37,6 +42,14 @@ self.enableButtonToCopyMrInfoCheckbox.dispatchEvent(new CustomEvent('change')); self.copyMrInfoFormatTextarea.value = preferences.copy_mr_info_format; + self.enableJiraTicketLinkCheckbox.checked = preferences.enable_jira_ticket_link; + self.enableJiraTicketLinkCheckbox.dispatchEvent(new CustomEvent('change')); + + self.baseJiraUrlInput.value = preferences.base_jira_url; + + self.jiraTicketIdDetectionLocationRadioButtons.find(function(el) { + return el.value == preferences.jira_ticket_id_detection_location; + }).checked = true; }); } @@ -55,16 +68,27 @@ this.enableButtonToCopyMrInfoCheckbox.addEventListener('change', function() { self.copyMrInfoFormatTextarea.parentNode.parentNode.classList.toggle('is-hidden', !this.checked); }); + + this.enableJiraTicketLinkCheckbox.addEventListener('change', function() { + self.jiraTicketLinkOptionsDiv.classList.toggle('is-hidden', !this.checked); + }); } /** * Take all DOM nodes values and persist them in the local storage. */ saveOptionsToStorage() { + let jira_ticket_id_detection_location = this.jiraTicketIdDetectionLocationRadioButtons.find(function(el) { + return el.checked; + }).value; + this.preferencesManager.setAll({ enable_buttons_to_copy_source_and_target_branches_name: this.enableButtonsToCopySourceAndTargetBranchesNameCheckbox.checked, enable_button_to_copy_mr_info: this.enableButtonToCopyMrInfoCheckbox.checked, - copy_mr_info_format: this.copyMrInfoFormatTextarea.value + copy_mr_info_format: this.copyMrInfoFormatTextarea.value, + enable_jira_ticket_link: this.enableJiraTicketLinkCheckbox.checked, + base_jira_url: this.baseJiraUrlInput.value, + jira_ticket_id_detection_location: jira_ticket_id_detection_location }); } } diff --git a/js/preferences.js b/js/preferences.js index 7b0ccfd..fd4a4c0 100644 --- a/js/preferences.js +++ b/js/preferences.js @@ -8,7 +8,10 @@ return { enable_buttons_to_copy_source_and_target_branches_name: true, enable_button_to_copy_mr_info: true, - copy_mr_info_format: 'MR {MR_ID} (from {MR_AUTHOR_NAME}): {MR_TITLE}\n{MR_URL}' + copy_mr_info_format: 'MR {MR_ID} (from {MR_AUTHOR_NAME}): {MR_TITLE}\n{MR_URL}', + enable_jira_ticket_link: false, + base_jira_url: '', + jira_ticket_id_detection_location: 'source_branch_name' }; } From 466bbe817fa643df47f38b161c2f9019af03d04f Mon Sep 17 00:00:00 2001 From: Epoc Date: Sun, 12 Apr 2020 19:31:28 +0200 Subject: [PATCH 06/31] Thing --- js/options.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/options.js b/js/options.js index fe38fbc..a10bb5a 100644 --- a/js/options.js +++ b/js/options.js @@ -45,6 +45,7 @@ self.enableButtonToCopyMrInfoCheckbox.dispatchEvent(new CustomEvent('change')); self.copyMrInfoFormatTextarea.value = preferences.copy_mr_info_format; + self.enableJiraTicketLinkCheckbox.checked = preferences.enable_jira_ticket_link; self.enableJiraTicketLinkCheckbox.dispatchEvent(new CustomEvent('change')); From 25e64f12403baf971385b201bbc42d0d05333b50 Mon Sep 17 00:00:00 2001 From: Epoc Date: Sun, 12 Apr 2020 19:46:08 +0200 Subject: [PATCH 07/31] Update requried attribute accordingly --- js/options.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/js/options.js b/js/options.js index 916c865..6983af1 100644 --- a/js/options.js +++ b/js/options.js @@ -76,6 +76,11 @@ this.enableJiraTicketLinkCheckbox.addEventListener('change', function() { self.jiraTicketLinkOptionsDiv.classList.toggle('is-hidden', !this.checked); + self.baseJiraUrlInput.toggleAttribute('required', this.checked); + + self.jiraTicketIdDetectionLocationRadioButtons.forEach(function(el) { + el.toggleAttribute('required', this.checked); + }, this); }); } From e142a57baf310f4d919dc466f4e9fe3a106facf8 Mon Sep 17 00:00:00 2001 From: Epoc Date: Sun, 12 Apr 2020 19:59:07 +0200 Subject: [PATCH 08/31] Update screenshot --- screenshot.png | Bin 18060 -> 19077 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshot.png b/screenshot.png index 9b8e76abf3cff865f76830e5a50444e4136b27f9..244f17d8cd5f1183a5a35e20396b79d69eb736eb 100644 GIT binary patch literal 19077 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 literal 18060 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 From d613bb95206dfdf401523937e61a6c5ef1601c62 Mon Sep 17 00:00:00 2001 From: Epoc Date: Mon, 13 Apr 2020 16:59:00 +0200 Subject: [PATCH 09/31] Beging UI --- js/content.js | 12 ++++++++++++ scripts/settings.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/js/content.js b/js/content.js index 472c0e8..ffdfbdf 100644 --- a/js/content.js +++ b/js/content.js @@ -212,6 +212,18 @@ this.setDataAttributesToMergeRequestContainer(mergeRequestContainer, mergeRequest); + // ----------------------------------------------- + // Jira ticket link + + if (this.preferences.enable_jira_ticket_link) { + let jiraTicketLink = '' + 'API-265' + ' '; + + this.parseHtmlAndPrepend( + mergeRequestContainer.querySelector('.merge-request-title'), + jiraTicketLink + ); + } + // ----------------------------------------------- // Copy MR info button diff --git a/scripts/settings.py b/scripts/settings.py index 8002a20..3f52f65 100644 --- a/scripts/settings.py +++ b/scripts/settings.py @@ -1,7 +1,7 @@ MANIFEST_FILE = { 'manifest_version': 2, 'name': 'GitLab Merge Requests lists enhancer', - 'version': '1.2.0', + 'version': '1.3.0', 'description': 'An extension that enhance all Merge Requests lists on any instance of Gitlab and GitLab.com.', 'homepage_url': 'https://github.com/EpocDotFr/gitlab-merge-requests-lists-enhancer', 'author': 'Maxime \'Epoc\' G.', From 4b429af0275cbc7009e42df3db02f34369a778e0 Mon Sep 17 00:00:00 2001 From: Epoc Date: Mon, 13 Apr 2020 17:46:16 +0200 Subject: [PATCH 10/31] It works --- html/options.html | 2 +- js/content.js | 65 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/html/options.html b/html/options.html index 9846d84..b4db941 100644 --- a/html/options.html +++ b/html/options.html @@ -26,7 +26,7 @@
diff --git a/js/content.js b/js/content.js index 5ab36ae..0e8ec3c 100644 --- a/js/content.js +++ b/js/content.js @@ -213,10 +213,12 @@ this.setDataAttributesToMergeRequestContainer(mergeRequestContainer, mergeRequest); // ----------------------------------------------- - // Jira ticket link + // Jira ticket link (data attributes are set in setDataAttributesToMergeRequestContainer, above) - if (this.preferences.enable_jira_ticket_link) { - let jiraTicketLink = '' + 'API-265' + ' '; + if (('jiraTicketId' in mergeRequestContainer.dataset) && ('jiraTicketUrl' in mergeRequestContainer.dataset)) { + let jiraTicketLink = '' + + mergeRequestContainer.dataset.jiraTicketId + + ' '; this.parseHtmlAndPrepend( mergeRequestContainer.querySelector('.merge-request-title'), @@ -288,6 +290,63 @@ mergeRequestContainer.dataset.status = mergeRequest.state; mergeRequestContainer.dataset.sourceBranchName = mergeRequest.source_branch; mergeRequestContainer.dataset.targetBranchName = mergeRequest.target_branch; + + if (this.preferences.enable_jira_ticket_link) { + let jiraTicketId = this.findFirstJiraTicketId(mergeRequest); + + if (jiraTicketId) { + mergeRequestContainer.dataset.jiraTicketId = jiraTicketId; + mergeRequestContainer.dataset.jiraTicketUrl = this.createJiraTicketUrl(jiraTicketId); + } + } + } + + /** + * Finds a Jira ticket ID in the given Merge Request object. Finding location may be different regarding + * user's preferences. + */ + findFirstJiraTicketId(mergeRequest) { + let textToSearchJiraTicketIdIn = null; + + switch (this.preferences.jira_ticket_id_detection_location) { + case 'source_branch_name': + textToSearchJiraTicketIdIn = mergeRequest.source_branch; + + break; + case 'merge_request_title': + textToSearchJiraTicketIdIn = mergeRequest.title; + + break; + default: + console.error('Invalid detection location'); + + return null; + } + + let jiraTicketIdRegex = new RegExp('[A-Z]{1,10}-\\d+'); + let results = jiraTicketIdRegex.exec(textToSearchJiraTicketIdIn); + + if (!results) { + return null; + } + + return results[0]; + } + + /** + * Creates an URL to a given Jira ticket ID, pointing to the Jira base URL the user has defined in its + * preferences. + */ + createJiraTicketUrl(jiraTicketId) { + let baseJiraUrl = new URL(this.preferences.base_jira_url); + + if (!baseJiraUrl.pathname.endsWith('/')) { + baseJiraUrl.pathname += '/'; + } + + baseJiraUrl.pathname += 'browse/' + jiraTicketId; + + return baseJiraUrl.toString(); } /** From abfd2227cb0cded94379b2ae140016f312b1b0f8 Mon Sep 17 00:00:00 2001 From: Epoc Date: Tue, 14 Apr 2020 19:28:03 +0200 Subject: [PATCH 11/31] Improve options page --- html/options.html | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/html/options.html b/html/options.html index 4bbb49a..ddf3723 100644 --- a/html/options.html +++ b/html/options.html @@ -30,8 +30,13 @@
Available placeholders: {MR_TITLE}, {MR_ID}, {MR_URL}, {MR_DIFFS_URL}, {MR_AUTHOR_NAME}, {MR_STATUS}, {MR_SOURCE_BRANCH_NAME}, {MR_TARGET_BRANCH_NAME}
-
- +
+
+ +
+
+ +