Skip to content
This repository was archived by the owner on Aug 31, 2023. It is now read-only.

Change prefix from WIP to Draft #16

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ A browser extension that enhance all Merge Requests lists on any instance of Git
- Ticket ID is automatically detected in source branch name or Merge Request title
- Base Jira URL is configured in extension preferences
- The ticket ID or an icon can be displayed as the link label (configured in extension preferences)
- WIP toggle button (can be enabled/disabled in the extension preferences)
- Draft toggle button (can be enabled/disabled in the extension preferences)
- Show an indicator when there's unresolved discussions left on Merge Requests
- Can be enabled/disabled in the extension preferences
- Note the **All discussions must be resolved** option must be enabled for this feature to be working as expected. This option is enabled per project and is located in **Settings > General > Merge Requests > Merge checks**
Expand Down
5 changes: 3 additions & 2 deletions html/options.html
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@
</div>
<div class="pts row">
<div class="w40p txt-center browser-style">
<input type="checkbox" id="enable_button_to_toggle_wip_status">
<input type="checkbox" id="enable_button_to_toggle_draft_status">
</div>
<div class="fluid">
<label for="enable_button_to_toggle_wip_status">Enable button allowing to toggle WIP status</label>
<label for="enable_button_to_toggle_draft_status">Enable button allowing to toggle Draft status</label>
</div>
</div>
<div class="pbs pll">
Expand All @@ -76,6 +76,7 @@
<div class="txt-center pts pbs"><button type="submit" class="browser-style">Save preferences</button></div>
</form>

<script src="../js/common.js"></script>
<script src="../js/preferences.js"></script>
<script src="../js/options.js"></script>
</body>
Expand Down
37 changes: 37 additions & 0 deletions js/background.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
(function(globals) {
'use strict';

class BackgroundScript {
/**
* The background script of the extension.
*/
constructor() {
if ('chrome' in globals && globals.chrome) { // Firefox and Edge uses `browser`, Chrome and Opera uses `chrome`
globals.browser = globals.chrome;
}

if (!('browser' in globals) || !globals.browser) {
console.error('Unsupported browser');
}

this.listenToExtensionUpdates();
}

/**
* Attach a callback to the `onInstalled` runtime event, which handles stuff related to extension updates.
*/
listenToExtensionUpdates() {
let self = this;

globals.browser.runtime.onInstalled.addListener(function(details) {
if (!('reason' in details) || details.reason != 'update') {
return;
}

// TODO enable_button_to_toggle_wip_status => enable_button_to_toggle_draft_status
});
}
}

let bs = new BackgroundScript();
}(this));
123 changes: 123 additions & 0 deletions js/common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
(function(globals) {
'use strict';

globals.Gmrle = globals.Gmrle || {};

// This function has been stolen from https://github.com/locutusjs/locutus/blob/master/src/php/info/version_compare.js
globals.Gmrle.versionCompare = function(v1, v2, operator) {
// discuss at: https://locutus.io/php/version_compare/
// original by: Philippe Jausions (https://pear.php.net/user/jausions)
// original by: Aidan Lister (https://aidanlister.com/)
// reimplemented by: Kankrelune (https://www.webfaktory.info/)
// improved by: Brett Zamir (https://brett-zamir.me)
// improved by: Scott Baker
// improved by: Theriault (https://github.com/Theriault)
// example 1: version_compare('8.2.5rc', '8.2.5a')
// returns 1: 1
// example 2: version_compare('8.2.50', '8.2.52', '<')
// returns 2: true
// example 3: version_compare('5.3.0-dev', '5.3.0')
// returns 3: -1
// example 4: version_compare('4.1.0.52','4.01.0.51')
// returns 4: 1

// Important: compare must be initialized at 0.
let i
let x
let compare = 0

// vm maps textual PHP versions to negatives so they're less than 0.
// PHP currently defines these as CASE-SENSITIVE. It is important to
// leave these as negatives so that they can come before numerical versions
// and as if no letters were there to begin with.
// (1alpha is < 1 and < 1.1 but > 1dev1)
// If a non-numerical value can't be mapped to this table, it receives
// -7 as its value.
const vm = {
dev: -6,
alpha: -5,
a: -5,
beta: -4,
b: -4,
RC: -3,
rc: -3,
'#': -2,
p: 1,
pl: 1
}

// This function will be called to prepare each version argument.
// It replaces every _, -, and + with a dot.
// It surrounds any nonsequence of numbers/dots with dots.
// It replaces sequences of dots with a single dot.
// version_compare('4..0', '4.0') === 0
// Important: A string of 0 length needs to be converted into a value
// even less than an unexisting value in vm (-7), hence [-8].
// It's also important to not strip spaces because of this.
// version_compare('', ' ') === 1
const _prepVersion = function (v) {
v = ('' + v).replace(/[_\-+]/g, '.')
v = v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.')
return (!v.length ? [-8] : v.split('.'))
}
// This converts a version component to a number.
// Empty component becomes 0.
// Non-numerical component becomes a negative number.
// Numerical component becomes itself as an integer.
const _numVersion = function (v) {
return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10))
}

v1 = _prepVersion(v1)
v2 = _prepVersion(v2)
x = Math.max(v1.length, v2.length)

for (i = 0; i < x; i++) {
if (v1[i] === v2[i]) {
continue
}
v1[i] = _numVersion(v1[i])
v2[i] = _numVersion(v2[i])
if (v1[i] < v2[i]) {
compare = -1
break
} else if (v1[i] > v2[i]) {
compare = 1
break
}
}

if (!operator) {
return compare
}

// Important: operator is CASE-SENSITIVE.
// "No operator" seems to be treated as "<."
// Any other values seem to make the function return null.
switch (operator) {
case '>':
case 'gt':
return (compare > 0)
case '>=':
case 'ge':
return (compare >= 0)
case '<=':
case 'le':
return (compare <= 0)
case '===':
case '=':
case 'eq':
return (compare === 0)
case '<>':
case '!==':
case 'ne':
return (compare !== 0)
case '':
case '<':
case 'lt':
return (compare < 0)
default:
return null
}
};
}(this));
36 changes: 18 additions & 18 deletions js/content.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,8 @@
self.attachClickEventToCopyMergeRequestInfoButtons();
}

if (self.userAuthenticated && self.preferences.enable_button_to_toggle_wip_status) {
self.attachClickEventToToggleWipStatusButtons();
if (self.userAuthenticated && self.preferences.enable_button_to_toggle_draft_status) {
self.attachClickEventToToggleDraftStatusButtons();
}
});
}
Expand Down Expand Up @@ -316,16 +316,16 @@
this.setDataAttributesToMergeRequestNode(mergeRequestNode, mergeRequest);

// -----------------------------------------------
// Toggle WIP status button
// Toggle Draft status button

if (this.userAuthenticated && this.preferences.enable_button_to_toggle_wip_status) {
let toggleWipStatusButton = '<button class="btn btn-secondary btn-md btn-default btn-transparent btn-clipboard has-tooltip gmrle-toggle-wip-status" title="Toggle WIP status" style="padding-left: 0">' +
if (this.userAuthenticated && this.preferences.enable_button_to_toggle_draft_status) {
let toggleDraftStatusButton = '<button class="btn btn-secondary btn-md btn-default btn-transparent btn-clipboard has-tooltip gmrle-toggle-draft-status" title="Toggle Draft status" style="padding-left: 0">' +
this.buildSpriteIcon('lock') +
'</button> ';

this.parseHtmlAndPrepend(
mergeRequestNode.querySelector('.merge-request-title'),
toggleWipStatusButton
toggleDraftStatusButton
);
}

Expand Down Expand Up @@ -443,7 +443,7 @@
mergeRequestNode.dataset.status = mergeRequest.state;
mergeRequestNode.dataset.sourceBranchName = mergeRequest.source_branch;
mergeRequestNode.dataset.targetBranchName = mergeRequest.target_branch;
mergeRequestNode.dataset.isWip = mergeRequest.work_in_progress;
mergeRequestNode.dataset.isDraft = ('draft' in mergeRequest) ? mergeRequest.draft : mergeRequest.work_in_progress;

if (this.preferences.enable_jira_ticket_link) {
let jiraTicketId = this.findFirstJiraTicketId(mergeRequest);
Expand Down Expand Up @@ -537,33 +537,33 @@
}

/**
* Attach a click event to all buttons inserted by the extension allowing to toggle Merge Request WIP status.
* Attach a click event to all buttons inserted by the extension allowing to toggle Merge Request Draft status.
*/
attachClickEventToToggleWipStatusButtons() {
attachClickEventToToggleDraftStatusButtons() {
let self = this;

document.querySelectorAll('button.gmrle-toggle-wip-status').forEach(function(el) {
document.querySelectorAll('button.gmrle-toggle-draft-status').forEach(function(el) {
el.addEventListener('click', function(e) {
e.preventDefault();

self.toggleMergeRequestWipStatus(this.closest('.merge-request'), this);
self.toggleMergeRequestDraftStatus(this.closest('.merge-request'), this);
});
});
}

/**
* Actually toggle a given Merge Request WIP status.
* Actually toggle a given Merge Request Draft status.
*/
toggleMergeRequestWipStatus(mergeRequestNode, toggleButton) {
toggleMergeRequestDraftStatus(mergeRequestNode, toggleButton) {
toggleButton.disabled = true;

let isWip = mergeRequestNode.dataset.isWip == 'true';
let isDraft = mergeRequestNode.dataset.isDraft == 'true';
let newTitle = '';

if (isWip) {
newTitle = mergeRequestNode.dataset.title.replace(new RegExp('^WIP:'), '').trim();
if (isDraft) {
newTitle = mergeRequestNode.dataset.title.replace(new RegExp('^(Draft|WIP):', 'i'), '').trim();
} else {
newTitle = 'WIP: ' + mergeRequestNode.dataset.title.trim();
newTitle = 'Draft: ' + mergeRequestNode.dataset.title.trim();
}

this.apiClient.updateProjectMergeRequest(
Expand All @@ -573,7 +573,7 @@
title: newTitle
}
).then(function(responseData) {
mergeRequestNode.dataset.isWip = responseData.work_in_progress;
mergeRequestNode.dataset.isDraft = ('draft' in responseData) ? responseData.draft : responseData.work_in_progress;
mergeRequestNode.dataset.title = responseData.title;

mergeRequestNode.querySelector('.merge-request-title-text a').textContent = responseData.title;
Expand Down
Loading