Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added functionality to show content of a merge request and navigate the merge request diffs #76

Open
wants to merge 7 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
6 changes: 4 additions & 2 deletions content/src/scripts/components/Pane/Pane.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { TabIdentifierClient } from "chrome-tab-identifier";

import SVG from "../SVG";
import TreeList from "../../containers/TreeList/TreeList";
import Filter from "../../containers/Filter/Filter";
import Resizer from "../../containers/Resizer";
import { OptionsContext } from "../../contexts/OptionsContext";
import { fetchURLDetails } from "../../utils/url";
Expand Down Expand Up @@ -109,10 +110,11 @@ function Pane({
tabId={tabId}
/>
) : null}
<Filter />
</div>
</div>
</div >
<Resizer />
</div>
</div >
);
}

Expand Down
2 changes: 1 addition & 1 deletion content/src/scripts/components/Toggler/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
transform-origin: top left;
border-radius: 0px 0px 4px 4px;
cursor: pointer;
z-index: 10;
z-index: 1000;
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

needed by some very high z index on the diff tree of gitlab

box-shadow: 0px 0px 5px #000000d9;
color: white;
background: rgb(77, 61, 146);
Expand Down
27 changes: 19 additions & 8 deletions content/src/scripts/components/TreeItem/TreeItem.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { fetchURLDetails } from "../../utils/url";
import fileIcons from "../../utils/file-icons";

import "./styles.css";
import { isMergeRequestShown, isRepositoryShown, grabMergeRequestIdFromCurrentUrl } from "../../../../../event/src/actions/API";
import { sha1 } from ".";

function TreeItem({
width,
Expand Down Expand Up @@ -34,14 +36,23 @@ function TreeItem({
} else {
setClicked(true);
const URLDetails = fetchURLDetails();
if ("compatibility-mode" in options && options["compatibility-mode"]) {
window.location.href = `${window.location.origin}/${
URLDetails.dirFormatted
}/blob/${URLDetails.branchName}/${path.join("/")}`;
} else {
window.location.href = `${window.location.origin}/${
URLDetails.dirFormatted
}/-/blob/${URLDetails.branchName}/${path.join("/")}`;
if (isRepositoryShown()) {
if ("compatibility-mode" in options && options["compatibility-mode"]) {
window.location.href = `${window.location.origin}/${URLDetails.dirFormatted
}/blob/${URLDetails.branchName}/${path.join("/")}`;
} else {
window.location.href = `${window.location.origin}/${URLDetails.dirFormatted
}/-/blob/${URLDetails.branchName}/${path.join("/")}`;
}
} else if (isMergeRequestShown()) {
let hash = sha1(path);
let mergeRequestId = grabMergeRequestIdFromCurrentUrl();
if (!window.location.href.includes('diffs')) {
window.location.href = (window.location.origin + "/" + URLDetails.dirFormatted + "/-/merge_requests/" + mergeRequestId + "/diffs#" + hash);
} else {
window.location.hash = hash;
window.location.reload();
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overkill if you ask me but somehow the window did not refresh when changing the hash only

}
}
}
};
Expand Down
141 changes: 141 additions & 0 deletions content/src/scripts/components/TreeItem/index.js
Original file line number Diff line number Diff line change
@@ -1 +1,142 @@
export { default } from "./TreeItem";

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

copied the whole function from google, as I was not able to import crypto sha1 into node.js somehow. I bet you can, then you can remove this entire block


function rotate_left(n, s) {
var t4 = (n << s) | (n >>> (32 - s));
return t4;
};
function lsb_hex(val) {
var str = '';
var i;
var vh;
var vl;
for (i = 0; i <= 6; i += 2) {
vh = (val >>> (i * 4 + 4)) & 0x0f;
vl = (val >>> (i * 4)) & 0x0f;
str += vh.toString(16) + vl.toString(16);
}
return str;
};
function cvt_hex(val) {
var str = '';
var i;
var v;
for (i = 7; i >= 0; i--) {
v = (val >>> (i * 4)) & 0x0f;
str += v.toString(16);
}
return str;
};
function Utf8Encode(string) {
string = string.replace(/\r\n/g, '\n');
var utftext = '';
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if ((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
};

/**
* Secure Hash Algorithm (SHA1)
* http://www.webtoolkit.info/
**/
export const sha1 = (msg) => {

var blockstart;
var i, j;
var W = new Array(80);
var H0 = 0x67452301;
var H1 = 0xEFCDAB89;
var H2 = 0x98BADCFE;
var H3 = 0x10325476;
var H4 = 0xC3D2E1F0;
var A, B, C, D, E;
var temp;
msg = Utf8Encode(msg);
var msg_len = msg.length;
var word_array = new Array();
for (i = 0; i < msg_len - 3; i += 4) {
j = msg.charCodeAt(i) << 24 | msg.charCodeAt(i + 1) << 16 |
msg.charCodeAt(i + 2) << 8 | msg.charCodeAt(i + 3);
word_array.push(j);
}
switch (msg_len % 4) {
case 0:
i = 0x080000000;
break;
case 1:
i = msg.charCodeAt(msg_len - 1) << 24 | 0x0800000;
break;
case 2:
i = msg.charCodeAt(msg_len - 2) << 24 | msg.charCodeAt(msg_len - 1) << 16 | 0x08000;
break;
case 3:
i = msg.charCodeAt(msg_len - 3) << 24 | msg.charCodeAt(msg_len - 2) << 16 | msg.charCodeAt(msg_len - 1) << 8 | 0x80;
break;
}
word_array.push(i);
while ((word_array.length % 16) != 14) word_array.push(0);
word_array.push(msg_len >>> 29);
word_array.push((msg_len << 3) & 0x0ffffffff);
for (blockstart = 0; blockstart < word_array.length; blockstart += 16) {
for (i = 0; i < 16; i++) W[i] = word_array[blockstart + i];
for (i = 16; i <= 79; i++) W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
A = H0;
B = H1;
C = H2;
D = H3;
E = H4;
for (i = 0; i <= 19; i++) {
temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 20; i <= 39; i++) {
temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 40; i <= 59; i++) {
temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 60; i <= 79; i++) {
temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
H0 = (H0 + A) & 0x0ffffffff;
H1 = (H1 + B) & 0x0ffffffff;
H2 = (H2 + C) & 0x0ffffffff;
H3 = (H3 + D) & 0x0ffffffff;
H4 = (H4 + E) & 0x0ffffffff;
}
var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);

return temp.toLowerCase();
}
49 changes: 49 additions & 0 deletions content/src/scripts/containers/Filter/Filter.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React, { useState, useEffect } from "react";
import {
isMergeRequestShown
} from "../../../../../event/src/actions/API";

import "./styles.css";


function Filter({

}) {

// const [checkedTests, setCheckedTest] = useState();
// useEffect(() => {
// handleChange = () => {
// setCheckedTest(!checkedTests, () => {
// window.location.reload();
// });
// };
// }, []);

return (
<div className="spantree-filter-body">
{isMergeRequestShown() ? (
<div className="spantree-filter-header">
<input type="checkbox" id="filterTests" name="tests" />
{/* <input type="checkbox" id="filterTests" name="tests" onClick={handleChange} defaultChecked={checkedTests} /> */}
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could not get it to work that the checkbox state is properly stored and the checkbox is checked... the idea of these checkboxes is to filter out unwanted changes from the flat tree of changes

<label style={{ paddingRight: "5px" }} >filter src/test</label>

<input type="checkbox" id="filterRemoved" name="removed" />
<label style={{ paddingRight: "5px" }} >filter removed</label>

<input type="checkbox" id="filterRenamed" name="renamed" />
<label style={{ paddingRight: "5px" }} >filter renamed</label>

<br />

<input type="checkbox" id="filteredNewFiles" name="new files" />
<label style={{ paddingRight: "5px" }} >filter new files</label>

<input type="checkbox" id="filteredImports" name="imports" />
<label style={{ paddingRight: "5px" }} >filter imports</label >
</div >
) : null}
</div>
);
}

export default Filter;
1 change: 1 addition & 0 deletions content/src/scripts/containers/Filter/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from "./Filter";
7 changes: 7 additions & 0 deletions content/src/scripts/containers/Filter/styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.spantree-filter-header {
height: 50px;
background-color: rgb(77, 61, 146);
border-bottom: 1px #404040 solid;
color: white;
padding: 5px;
}
12 changes: 12 additions & 0 deletions content/src/scripts/containers/TreeList/TreeList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ function TreeList({
setClicked,
getInitialTree,
closeDir,
filtersEnabled,
}) {
const [loading, setLoading] = useState(true);
const [rendering, setRendering] = useState(false);
Expand All @@ -80,6 +81,16 @@ function TreeList({
return firstPageLoad;
};

const buildFilterMap = () => {
let map = new Map();
map['test'] = document.getElementById('filterTests').checked;
map['removed'] = document.getElementById('filterRemoved').checked;
map['renamed'] = document.getElementById('filterRenamed').checked;
map['imports'] = document.getElementById('filteredImports').checked;
map['newFile'] = document.getElementById('filteredNewFiles').checked;
return map;
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this 'backend' logic works as soon as the checkboxes are checked and the state of these is fixed properly

}

useEffect(() => {
if (URLDetails.baseRemovedURL.length === 0) {
setRendering(false);
Expand All @@ -99,6 +110,7 @@ function TreeList({
branchName: URLDetails.branchName,
tabId,
},
buildFilterMap(),
);
}
setFirstPageLoad(false);
Expand Down
2 changes: 1 addition & 1 deletion content/src/scripts/containers/TreeList/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
.spantree-tree-list {
scroll-behavior: smooth;
overflow-y: auto;
height: calc(100vh - 40px);
height: calc(100vh - 90px);
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

less space due to the 50px of the filter area.
Maybe there is a way to have -40 for repository view and -90 on merge request view, I wasnt able to do this without copy the entire css style and make it conditional on the pane...

}

.spantree-tree-list::-webkit-scrollbar-track {
Expand Down
41 changes: 23 additions & 18 deletions content/src/scripts/containers/app/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ import { browserKey } from "../../utils/browser";
import searchBarWorkerJS from "../../utils/searchBarWorker";
import WebWorker from "./WebWorker";

import {
isRepositoryShown,
isMergeRequestShown
} from "../../../../../event/src/actions/API";

import "./App.css";

const importFileIconCSS = `${browserKey()}-extension://${chrome.i18n.getMessage(
Expand Down Expand Up @@ -45,7 +50,7 @@ class App extends Component {
};
this.shouldShowSpanTree = () => {
return (
document.querySelector(".qa-branches-select") !== null &&
(isRepositoryShown() || isMergeRequestShown()) &&
document.querySelector(".nav-sidebar") !== null
);
};
Expand Down Expand Up @@ -96,24 +101,24 @@ class App extends Component {
<link rel="stylesheet" type="text/css" href={importFileIconCSS} />
{this.props.opened[tabId]
? ReactDOM.createPortal(
<Pane
toggleOpened={this.toggleOpenedThisTab}
width={this.props.width}
firstPageLoad={this.state.firstPageLoad}
setFirstPageLoad={this.setFirstPageLoad}
reloading={this.state.reloading}
setReloading={this.setReloading}
setShowSearchbarTrue={() => this.setShowSearchbar(true)}
/>,
parentDiv,
)
<Pane
toggleOpened={this.toggleOpenedThisTab}
width={this.props.width}
firstPageLoad={this.state.firstPageLoad}
setFirstPageLoad={this.setFirstPageLoad}
reloading={this.state.reloading}
setReloading={this.setReloading}
setShowSearchbarTrue={() => this.setShowSearchbar(true)}
/>,
parentDiv,
)
: ReactDOM.createPortal(
<Toggler
handleClick={this.toggleOpenedThisTab}
pinned={this.props.pinned}
/>,
document.getElementById("rcr-anchor"),
)}
<Toggler
handleClick={this.toggleOpenedThisTab}
pinned={this.props.pinned}
/>,
document.getElementById("rcr-anchor"),
)}
<SearchBar
worker={this.searchBarWorker}
showSearchbar={this.state.showSearchbar}
Expand Down
Loading