From b8f7c07c5c9f72be1de14996577258e8903ff51a Mon Sep 17 00:00:00 2001 From: iamkunalb Date: Mon, 8 Apr 2019 13:51:31 +1200 Subject: [PATCH 1/4] Button bug when clonig repo fixed --- app/misc/authenticate.ts | 3 +++ app/misc/router.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/app/misc/authenticate.ts b/app/misc/authenticate.ts index ae2f1e4..5bbef82 100644 --- a/app/misc/authenticate.ts +++ b/app/misc/authenticate.ts @@ -238,6 +238,9 @@ function cloneRepo() { $('#repo-modal').modal('hide'); switchToMainPanel(); + let butt = document.getElementById("cloneButton"); + butt.innerHTML = 'Clone'; + butt.setAttribute('class', 'btn btn-primary'); } function signInOrOut() { diff --git a/app/misc/router.ts b/app/misc/router.ts index 28f3c10..5c01e5b 100644 --- a/app/misc/router.ts +++ b/app/misc/router.ts @@ -29,6 +29,9 @@ function checkSignedIn() { $('#repo-name').removeAttr("data-target"); } else { // Ensure repo modal is connected + let butt = document.getElementById("cloneButton"); + butt.innerHTML = 'Clone'; + butt.setAttribute('class', 'btn btn-primary'); $('#repo-name').attr("data-target", "#repo-modal"); } } From 5ecdbe0b54d3860a500657400fa4d45bde56ad44 Mon Sep 17 00:00:00 2001 From: iamkunalb Date: Mon, 8 Apr 2019 17:19:20 +1200 Subject: [PATCH 2/4] Fixing unclear message on incorrect credentials --- app/misc/authenticate.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/misc/authenticate.ts b/app/misc/authenticate.ts index 5bbef82..7421e1f 100644 --- a/app/misc/authenticate.ts +++ b/app/misc/authenticate.ts @@ -119,7 +119,13 @@ function getUserInfo(callback) { var ghme = client.me(); ghme.info(function(err, data, head) { if (err) { - displayModal(err); + if (err == "Error: Bad credentials" || "Error: Requires authentication"){ + $('#username').css('border-color', 'red'); + $('#password').css('border-color', 'red'); + // displayModal("Error: Incorrect Username or Password"); + }else{ + displayModal(err); + } } else { // assigning the check box to a variable to check the value let rememberLogin: any = (document.getElementById("rememberLogin")); From 52e69143ac297ff59e1f5cdc0007eb1a395f877b Mon Sep 17 00:00:00 2001 From: iamkunalb Date: Mon, 8 Apr 2019 18:44:08 +1200 Subject: [PATCH 3/4] Updated the error to look cool --- Pong-Game | 1 + VisualGit_SE701_2019_3 | 1 + .../authenticate/authenticate.component.html | 2 +- .../graphPanel/graph.panel.component.html | 3 +++ app/misc/authenticate.ts | 23 ++++++++++++------ app/misc/pexels-photo-414612.jpeg | Bin 0 -> 27635 bytes app/misc/repo.ts | 5 ++++ dummy | 1 + stylesheets/styles.css | 12 +++++++++ 9 files changed, 40 insertions(+), 8 deletions(-) create mode 160000 Pong-Game create mode 160000 VisualGit_SE701_2019_3 create mode 100644 app/misc/pexels-photo-414612.jpeg create mode 160000 dummy diff --git a/Pong-Game b/Pong-Game new file mode 160000 index 0000000..5ac99d6 --- /dev/null +++ b/Pong-Game @@ -0,0 +1 @@ +Subproject commit 5ac99d63f8ee85e52eeb35cb5546a374278be9c7 diff --git a/VisualGit_SE701_2019_3 b/VisualGit_SE701_2019_3 new file mode 160000 index 0000000..eed8a4b --- /dev/null +++ b/VisualGit_SE701_2019_3 @@ -0,0 +1 @@ +Subproject commit eed8a4bacba291c09ef5d614e2ab4390b27ff373 diff --git a/app/components/authenticate/authenticate.component.html b/app/components/authenticate/authenticate.component.html index dfa3ae4..1228f04 100644 --- a/app/components/authenticate/authenticate.component.html +++ b/app/components/authenticate/authenticate.component.html @@ -18,7 +18,7 @@

VisualGit


- +
diff --git a/app/components/graphPanel/graph.panel.component.html b/app/components/graphPanel/graph.panel.component.html index a03ac31..7766f87 100644 --- a/app/components/graphPanel/graph.panel.component.html +++ b/app/components/graphPanel/graph.panel.component.html @@ -23,6 +23,9 @@ +
+ +
diff --git a/app/misc/authenticate.ts b/app/misc/authenticate.ts index 7421e1f..36bc9c9 100644 --- a/app/misc/authenticate.ts +++ b/app/misc/authenticate.ts @@ -119,13 +119,22 @@ function getUserInfo(callback) { var ghme = client.me(); ghme.info(function(err, data, head) { if (err) { - if (err == "Error: Bad credentials" || "Error: Requires authentication"){ - $('#username').css('border-color', 'red'); - $('#password').css('border-color', 'red'); - // displayModal("Error: Incorrect Username or Password"); - }else{ - displayModal(err); - } + if (err == "Error: Bad credentials" || "Error: Requires authentication"){ + $('#username').css('border-color', 'red'); + $('#password').css('border-color', 'red'); + var username = document.getElementById('username'); + var password = document.getElementById('password'); + username.classList.add('error'); + password.classList.add('error'); + + // remove the class after the animation completes + setTimeout(function() { + username.classList.remove('error'); + password.classList.remove('error'); + }, 300); + }else{ + displayModal(err); + } } else { // assigning the check box to a variable to check the value let rememberLogin: any = (document.getElementById("rememberLogin")); diff --git a/app/misc/pexels-photo-414612.jpeg b/app/misc/pexels-photo-414612.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1f4a8fcee8a1ba1be55732120255e9d88ff68e1e GIT binary patch literal 27635 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 Date: Thu, 11 Apr 2019 12:56:14 +1200 Subject: [PATCH 4/4] Made changes asked by reviewer --- Pong-Game | 1 - VisualGit_SE701_2019_3 | 1 - .../authenticate/authenticate.component.html | 69 +- app/misc/authenticate.ts | 406 ++++---- app/misc/pexels-photo-414612.jpeg | Bin 27635 -> 0 bytes app/misc/repo.ts | 879 +++++++++--------- app/misc/router.ts | 218 ++--- dummy | 1 - 8 files changed, 784 insertions(+), 791 deletions(-) delete mode 160000 Pong-Game delete mode 160000 VisualGit_SE701_2019_3 delete mode 100644 app/misc/pexels-photo-414612.jpeg delete mode 160000 dummy diff --git a/Pong-Game b/Pong-Game deleted file mode 160000 index 5ac99d6..0000000 --- a/Pong-Game +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5ac99d63f8ee85e52eeb35cb5546a374278be9c7 diff --git a/VisualGit_SE701_2019_3 b/VisualGit_SE701_2019_3 deleted file mode 160000 index eed8a4b..0000000 --- a/VisualGit_SE701_2019_3 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit eed8a4bacba291c09ef5d614e2ab4390b27ff373 diff --git a/app/components/authenticate/authenticate.component.html b/app/components/authenticate/authenticate.component.html index 1228f04..0016bd4 100644 --- a/app/components/authenticate/authenticate.component.html +++ b/app/components/authenticate/authenticate.component.html @@ -1,39 +1,40 @@
-
- -

-
- -
-
+ + +

+
+ +
+
-
- -
-
-
- Remember Login
- -
-
- -
-
- -
- -
-
- - - -
+
+ +
+
+
+ Remember Login
- +
+
+ +
+
-
- -
+
+ +
+
+ + + +
+ + + +
+ +
\ No newline at end of file diff --git a/app/misc/authenticate.ts b/app/misc/authenticate.ts index 36bc9c9..ccdaba9 100644 --- a/app/misc/authenticate.ts +++ b/app/misc/authenticate.ts @@ -23,36 +23,36 @@ let signedAfter = false; //Called then user pushes to sign out even if they have commited changes but not pushed; prompts a confirmation modal function CommitNoPush() { - if (CommitButNoPush == 1) { - $("#modalW2").modal(); - } + if (CommitButNoPush == 1) { + $("#modalW2").modal(); + } } function signInHead(callback) { - encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); - continuedWithoutSignIn = false; - signedAfter = true; - if (signed == 1){ - if ((changes == 1) || (CommitButNoPush == 1)){ - $("#modalW2").modal(); - } - else { - getUserInfo(callback); - } - } - else{ - getUserInfo(callback); - } + encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); + continuedWithoutSignIn = false; + signedAfter = true; + if (signed == 1) { + if ((changes == 1) || (CommitButNoPush == 1)) { + $("#modalW2").modal(); + } + else { + getUserInfo(callback); + } + } + else { + getUserInfo(callback); + } } function LogInAfterConfirm(callback) { - encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); - getUserInfo(callback); + encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); + getUserInfo(callback); } function ModalSignIn(callback) { - encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); - getUserInfo(callback); + encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); + getUserInfo(callback); } @@ -65,224 +65,224 @@ function loginWithSaved(callback) { } function searchRepoName() { - let ul = document.getElementById("repo-dropdown"); + let ul = document.getElementById("repo-dropdown"); - ul.innerHTML = ''; // clears the dropdown menu which shows all the repos + ul.innerHTML = ''; // clears the dropdown menu which shows all the repos - // Gets users name and password - encryptTemp(document.getElementById("username").value, document.getElementById("password").value); + // Gets users name and password + encryptTemp(document.getElementById("username").value, document.getElementById("password").value); - cred = Git.Cred.userpassPlaintextNew(getUsernameTemp(), getPasswordTemp()); + cred = Git.Cred.userpassPlaintextNew(getUsernameTemp(), getPasswordTemp()); - client = github.client({ - username: getUsernameTemp(), - password: getPasswordTemp() - }); + client = github.client({ + username: getUsernameTemp(), + password: getPasswordTemp() + }); - var ghme = client.me(); - ghme.repos(function (err, data, head) { var ghme = client.me(); + ghme.repos(function (err, data, head) { + var ghme = client.me(); - for (let i = 0; i < data.length; i++) { + for (let i = 0; i < data.length; i++) { - let rep = Object.values(data)[i]; - console.log("url of repo: " + rep['html_url']); - - // Searches from the text input and adds to the list if repo name is found - if (parseInt(rep['forks_count']) == 0) { - if (rep['full_name'].search(document.getElementById("searchRep").value) != -1) { - displayBranch(rep['full_name'], "repo-dropdown", "selectRepo(this)"); - repoList[rep['full_name']] = rep['html_url']; - } - } + let rep = Object.values(data)[i]; + console.log("url of repo: " + rep['html_url']); - } - }); + // Searches from the text input and adds to the list if repo name is found + if (parseInt(rep['forks_count']) == 0) { + if (rep['full_name'].search(document.getElementById("searchRep").value) != -1) { + displayBranch(rep['full_name'], "repo-dropdown", "selectRepo(this)"); + repoList[rep['full_name']] = rep['html_url']; + } + } + + } + }); } function getUserInfo(callback) { - - if (signedAfter === true){ // if the trys to login after clicking "continues without sign in" - encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); - } - else { - encryptTemp(document.getElementById("username").value, document.getElementById("password").value); - } - - cred = Git.Cred.userpassPlaintextNew(getUsernameTemp(), getPasswordTemp()); - - client = github.client({ - username: getUsernameTemp(), - password: getPasswordTemp() - }); - var ghme = client.me(); - ghme.info(function(err, data, head) { - if (err) { - if (err == "Error: Bad credentials" || "Error: Requires authentication"){ - $('#username').css('border-color', 'red'); - $('#password').css('border-color', 'red'); - var username = document.getElementById('username'); - var password = document.getElementById('password'); - username.classList.add('error'); - password.classList.add('error'); - - // remove the class after the animation completes - setTimeout(function() { - username.classList.remove('error'); - password.classList.remove('error'); - }, 300); - }else{ - displayModal(err); - } - } else { - // assigning the check box to a variable to check the value - let rememberLogin: any = (document.getElementById("rememberLogin")); - - // username and password values taken to be stored. - let username: any = (document.getElementById("username")).value; - let password: any = (document.getElementById("password")).value; - if (rememberLogin.checked == true) { - encrypt(username, password); + + if (signedAfter === true) { // if the trys to login after clicking "continues without sign in" + encryptTemp(document.getElementById("Email1").value, document.getElementById("Password1").value); } - avaterImg = Object.values(data)[2] - // let doc = document.getElementById("avater"); - // doc.innerHTML = ""; - // var elem = document.createElement("img"); - // elem.width = 40; - // elem.height = 40; - // elem.src = avaterImg; - // doc.appendChild(elem); - // doc = document.getElementById("log"); - // doc.innerHTML = 'sign out'; - document.getElementById("githubname").innerHTML = data["login"] - var docGitUser = document.getElementById("githubname"); - //docGitUser.innerHTML = Object.values(data)[0]; - - let doc = document.getElementById("avatar"); - //doc.innerHTML = 'Sign out'; //HAD TO REMOVE THIS LINE OR THE PROGRAM BROKE. - signed = 1; - - callback(); + else { + encryptTemp(document.getElementById("username").value, document.getElementById("password").value); } - }); - - ghme.repos(function(err, data, head) { - if (err) { - return; - } else { - displayUsername(); - document.getElementById("avatar").innerHTML = "Sign out"; - console.log("number of repos: " + data.length); - for (let i = 0; i < data.length; i++) { - let rep = Object.values(data)[i]; - console.log("url of repo: " + rep['html_url']); - - if(rep['fork'] == false) { - if(parseInt(rep['forks_count']) == 0) { - displayBranch(rep['full_name'], "repo-dropdown", "selectRepo(this)"); - repoList[rep['full_name']] = rep['html_url']; - } - else { - //Create a collapseable list for the forked repo - createDropDownFork(rep['full_name'],"repo-dropdown","showDropDown(this)"); - repoList[rep['full_name']] = rep['html_url']; - //Reiterate through and get all the forks of the repo and add to list - for(let i = 0; i < data.length; i++) { - let rep2 = Object.values(data)[i]; - if(rep2['name'] == rep['name']) { - displayBranch("   " +rep2['full_name'],rep['full_name'],"selectRepo(this)") - repoList["   "+rep2['full_name']] = rep2['html_url']; - } + + cred = Git.Cred.userpassPlaintextNew(getUsernameTemp(), getPasswordTemp()); + + client = github.client({ + username: getUsernameTemp(), + password: getPasswordTemp() + }); + var ghme = client.me(); + ghme.info(function (err, data, head) { + if (err) { + if (err == "Error: Bad credentials" || "Error: Requires authentication") { + $('#username').css('border-color', 'red'); + $('#password').css('border-color', 'red'); + var username = document.getElementById('username'); + var password = document.getElementById('password'); + username.classList.add('error'); + password.classList.add('error'); + + // remove the class after the animation completes + setTimeout(function () { + username.classList.remove('error'); + password.classList.remove('error'); + }, 300); + } else { + displayModal(err); + } + } else { + // assigning the check box to a variable to check the value + let rememberLogin: any = (document.getElementById("rememberLogin")); + + // username and password values taken to be stored. + let username: any = (document.getElementById("username")).value; + let password: any = (document.getElementById("password")).value; + if (rememberLogin.checked == true) { + encrypt(username, password); } - } + avaterImg = Object.values(data)[2] + // let doc = document.getElementById("avater"); + // doc.innerHTML = ""; + // var elem = document.createElement("img"); + // elem.width = 40; + // elem.height = 40; + // elem.src = avaterImg; + // doc.appendChild(elem); + // doc = document.getElementById("log"); + // doc.innerHTML = 'sign out'; + document.getElementById("githubname").innerHTML = data["login"] + var docGitUser = document.getElementById("githubname"); + //docGitUser.innerHTML = Object.values(data)[0]; + + let doc = document.getElementById("avatar"); + //doc.innerHTML = 'Sign out'; //HAD TO REMOVE THIS LINE OR THE PROGRAM BROKE. + signed = 1; + + callback(); } - } - } - }); + }); + + ghme.repos(function (err, data, head) { + if (err) { + return; + } else { + displayUsername(); + document.getElementById("avatar").innerHTML = "Sign out"; + console.log("number of repos: " + data.length); + for (let i = 0; i < data.length; i++) { + let rep = Object.values(data)[i]; + console.log("url of repo: " + rep['html_url']); + + if (rep['fork'] == false) { + if (parseInt(rep['forks_count']) == 0) { + displayBranch(rep['full_name'], "repo-dropdown", "selectRepo(this)"); + repoList[rep['full_name']] = rep['html_url']; + } + else { + //Create a collapseable list for the forked repo + createDropDownFork(rep['full_name'], "repo-dropdown", "showDropDown(this)"); + repoList[rep['full_name']] = rep['html_url']; + //Reiterate through and get all the forks of the repo and add to list + for (let i = 0; i < data.length; i++) { + let rep2 = Object.values(data)[i]; + if (rep2['name'] == rep['name']) { + displayBranch("   " + rep2['full_name'], rep['full_name'], "selectRepo(this)") + repoList["   " + rep2['full_name']] = rep2['html_url']; + } + } + } + } + } + } + }); } //Converts string to base 64 to be used for Basic Authorization in external API calls function make_base_auth(user, password) { - var tok = user + ':' + password; - var hash = btoa(tok); - return 'Basic ' + hash; + var tok = user + ':' + password; + var hash = btoa(tok); + return 'Basic ' + hash; } function showDropDown(ele) { - //If the forked Repo is clicked collapse or uncollapse the forked repo list - let div = document.getElementById(ele.className) - if(div.style.display === 'none') { - div.style.display = 'block'; - } - else { - div.style.display = 'none'; - } + //If the forked Repo is clicked collapse or uncollapse the forked repo list + let div = document.getElementById(ele.className) + if (div.style.display === 'none') { + div.style.display = 'block'; + } + else { + div.style.display = 'none'; + } } function selectRepo(ele) { - url = repoList[ele.innerHTML]; - let butt = document.getElementById("cloneButton"); - butt.innerHTML = 'Clone ' + ele.innerHTML; - butt.setAttribute('class', 'btn btn-primary'); - console.log("selected " + ele.innerHTML + " as repository"); + url = repoList[ele.innerHTML]; + let butt = document.getElementById("cloneButton"); + butt.innerHTML = 'Clone ' + ele.innerHTML; + butt.setAttribute('class', 'btn btn-primary'); + console.log("selected " + ele.innerHTML + " as repository"); } function cloneRepo() { - if (url === null) { - updateModalText("Web URL for repo could not be found. Try cloning by providing the repo's web URL directly in the 'Add repository' window"); - return; - } - - console.log("cloning " + url); - let splitUrl = url.split("/"); - let local; - if (splitUrl.length >= 2) { - local = splitUrl[splitUrl.length - 1]; - } - console.log("cloning " + local); - - if (local == null) { - updateModalText("Error: could not define name of repo"); - return; - } - - downloadFunc(url, local); - url = null; - $('#repo-modal').modal('hide'); - - switchToMainPanel(); - let butt = document.getElementById("cloneButton"); - butt.innerHTML = 'Clone'; - butt.setAttribute('class', 'btn btn-primary'); + if (url === null) { + updateModalText("Web URL for repo could not be found. Try cloning by providing the repo's web URL directly in the 'Add repository' window"); + return; + } + + console.log("cloning " + url); + let splitUrl = url.split("/"); + let local; + if (splitUrl.length >= 2) { + local = splitUrl[splitUrl.length - 1]; + } + console.log("cloning " + local); + + if (local == null) { + updateModalText("Error: could not define name of repo"); + return; + } + + downloadFunc(url, local); + url = null; + $('#repo-modal').modal('hide'); + + switchToMainPanel(); + let butt = document.getElementById("cloneButton"); + butt.innerHTML = 'Clone'; + butt.setAttribute('class', 'btn btn-primary'); } function signInOrOut() { - let doc = document.getElementById("avatar"); - if(doc.innerHTML === "Sign In"){ - doc.innerHTML = ""; - } - else if(doc.innerHTML === ""){ - doc.innerHTML = "Sign In"; - } - - if (doc.innerHTML === "Sign out") { - $("#avatar").removeAttr("data-toggle"); - - if (changes == 1 || CommitButNoPush == 1) { - $("#modalW2").modal(); - } else { - redirectToHomePage(); + let doc = document.getElementById("avatar"); + if (doc.innerHTML === "Sign In") { + doc.innerHTML = ""; + } + else if (doc.innerHTML === "") { + doc.innerHTML = "Sign In"; + } + + if (doc.innerHTML === "Sign out") { + $("#avatar").removeAttr("data-toggle"); + + if (changes == 1 || CommitButNoPush == 1) { + $("#modalW2").modal(); + } else { + redirectToHomePage(); + } } - } } function redirectToHomePage() { - window.onbeforeunload = Confirmed; - window.location.href = "index.html"; - signed = 0; - changes = 0; - CommitButNoPush = 0; - //LogInAfterConfirm(); + window.onbeforeunload = Confirmed; + window.location.href = "index.html"; + signed = 0; + changes = 0; + CommitButNoPush = 0; + //LogInAfterConfirm(); } diff --git a/app/misc/pexels-photo-414612.jpeg b/app/misc/pexels-photo-414612.jpeg deleted file mode 100644 index 1f4a8fcee8a1ba1be55732120255e9d88ff68e1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27635 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 20) { + for (var i = 0; i < repoLocalPath.length; i++) { + if (repoLocalPath[i] == "/") { + breakStringFrom = i; + } + } + repoLocalPath = "..." + repoLocalPath.slice(breakStringFrom, repoLocalPath.length); + } + document.getElementById("repo-name").innerHTML = repoLocalPath; + document.getElementById("branch-name").innerHTML = branch + ''; }, function (err) { - console.log("repo.ts, line 273, could not find referenced branch" + err); + //If the repository has no commits, getCurrentBranch will throw an error. + //Default values will be set for the branch labels + window.alert("Warning:\n" + + "No branches have been found in this repository.\n" + + "This is likely because there have been no commits made."); + console.log("No branches found. Setting default label values to master"); + console.log("Updating the labels and graph"); + drawGraph(); + document.getElementById("repo-name").innerHTML = repoLocalPath; + //default label set to master + document.getElementById("branch-name").innerHTML = "master" + ''; }); - if (branchList[i].isRemote()) { - if (localBranches.indexOf(bp) < 0) { - displayBranch(bp, "branch-dropdown", "checkoutRemoteBranch(this)"); - } - } else { - localBranches.push(bp); - displayBranch(bp, "branch-dropdown", "checkoutLocalBranch(this)"); - } - - } - }) - .then(function () { - console.log("Updating the graph and the labels"); - drawGraph(); - let breakStringFrom; - if(repoLocalPath.length > 20){ - for(var i = 0; i < repoLocalPath.length ; i++ ){ - if(repoLocalPath[i] == "/"){ - breakStringFrom = i; - } - } - repoLocalPath = "..." + repoLocalPath.slice(breakStringFrom,repoLocalPath.length); - } - document.getElementById("repo-name").innerHTML = repoLocalPath; - document.getElementById("branch-name").innerHTML = branch + ''; - }, function (err) { - //If the repository has no commits, getCurrentBranch will throw an error. - //Default values will be set for the branch labels - window.alert("Warning:\n" + - "No branches have been found in this repository.\n" + - "This is likely because there have been no commits made."); - console.log("No branches found. Setting default label values to master"); - console.log("Updating the labels and graph"); - drawGraph(); - document.getElementById("repo-name").innerHTML = repoLocalPath; - //default label set to master - document.getElementById("branch-name").innerHTML = "master" + ''; - }); } function getAllBranches() { - let repos; - Git.Repository.open(repoFullPath) - .then(function (repo) { - repos = repo; - return repo.getReferenceNames(Git.Reference.TYPE.LISTALL); - }) - .then(function (branchList) { - clearBranchElement(); - for (let i = 0; i < branchList.length; i++) { - console.log("branch discovered: " + branchList[i]); - let bp = branchList[i].split("/"); - if (bp[1] !== "remotes") { - displayBranch(bp[bp.length - 1], "branch-dropdown", "checkoutLocalBranch(this)"); - } - Git.Reference.nameToId(repos, branchList[i]).then(function (oid) { - // Use oid - console.log("old id " + oid); + let repos; + Git.Repository.open(repoFullPath) + .then(function (repo) { + repos = repo; + return repo.getReferenceNames(Git.Reference.TYPE.LISTALL); + }) + .then(function (branchList) { + clearBranchElement(); + for (let i = 0; i < branchList.length; i++) { + console.log("branch discovered: " + branchList[i]); + let bp = branchList[i].split("/"); + if (bp[1] !== "remotes") { + displayBranch(bp[bp.length - 1], "branch-dropdown", "checkoutLocalBranch(this)"); + } + Git.Reference.nameToId(repos, branchList[i]).then(function (oid) { + // Use oid + console.log("old id " + oid); + }); + } }); - } - }); } function getOtherBranches() { - let list; - let repos; - Git.Repository.open(repoFullPath) - .then(function (repo) { - repos = repo; - return repo.getReferenceNames(Git.Reference.TYPE.LISTALL); - }) - .then(function (branchList) { - clearMergeElement(); - list = branchList; - }) - .then(function () { - return repos.getCurrentBranch() - }) - .then(function (ref) { - let name = ref.name().split("/"); - console.log("merging remote branch with tracked local branch"); - clearBranchElement(); - for (let i = 0; i < list.length; i++) { - let bp = list[i].split("/"); - if (bp[1] !== "remotes" && bp[bp.length - 1] !== name[name.length - 1]) { - displayBranch(bp[bp.length - 1], "merge-dropdown", "mergeLocalBranches(this)"); - } - } - }) + let list; + let repos; + Git.Repository.open(repoFullPath) + .then(function (repo) { + repos = repo; + return repo.getReferenceNames(Git.Reference.TYPE.LISTALL); + }) + .then(function (branchList) { + clearMergeElement(); + list = branchList; + }) + .then(function () { + return repos.getCurrentBranch() + }) + .then(function (ref) { + let name = ref.name().split("/"); + console.log("merging remote branch with tracked local branch"); + clearBranchElement(); + for (let i = 0; i < list.length; i++) { + let bp = list[i].split("/"); + if (bp[1] !== "remotes" && bp[bp.length - 1] !== name[name.length - 1]) { + displayBranch(bp[bp.length - 1], "merge-dropdown", "mergeLocalBranches(this)"); + } + } + }) } function clearMergeElement() { - let ul = document.getElementById("merge-dropdown"); - ul.innerHTML = ''; + let ul = document.getElementById("merge-dropdown"); + ul.innerHTML = ''; } function clearBranchElement() { - let ul = document.getElementById("branch-dropdown"); - let li = document.getElementById("create-branch"); - ul.innerHTML = ''; - ul.appendChild(li); + let ul = document.getElementById("branch-dropdown"); + let li = document.getElementById("create-branch"); + ul.innerHTML = ''; + ul.appendChild(li); } function displayBranch(name, id, onclick) { - let ul = document.getElementById(id); - let li = document.createElement("li"); - let a = document.createElement("a"); - a.setAttribute("href", "#"); - a.setAttribute("class", "list-group-item"); - a.setAttribute("onclick", onclick + ";event.stopPropagation()"); - li.setAttribute("role", "presentation") - a.appendChild(document.createTextNode(name)); - a.innerHTML = name; - li.appendChild(a); - - // Adding a delete button beside the branch - if ((id == "branch-dropdown") && (name.toLowerCase() != "master")) { - var button = document.createElement("Button"); - button.innerHTML = "Delete"; - button.classList.add('btn-danger'); - - // Function to execute when button is clicked - $(button).click(function () { - // Display delete branch warning modal - $('#branch-to-delete').val(name); - document.getElementById("displayedBranchName").innerHTML = name; - $('#delete-branch-modal').modal(); - }); - li.appendChild(button); // Add delete button to the branch dropdown list - } - ul.appendChild(li); + let ul = document.getElementById(id); + let li = document.createElement("li"); + let a = document.createElement("a"); + a.setAttribute("href", "#"); + a.setAttribute("class", "list-group-item"); + a.setAttribute("onclick", onclick + ";event.stopPropagation()"); + li.setAttribute("role", "presentation") + a.appendChild(document.createTextNode(name)); + a.innerHTML = name; + li.appendChild(a); + + // Adding a delete button beside the branch + if ((id == "branch-dropdown") && (name.toLowerCase() != "master")) { + var button = document.createElement("Button"); + button.innerHTML = "Delete"; + button.classList.add('btn-danger'); + + // Function to execute when button is clicked + $(button).click(function () { + // Display delete branch warning modal + $('#branch-to-delete').val(name); + document.getElementById("displayedBranchName").innerHTML = name; + $('#delete-branch-modal').modal(); + }); + li.appendChild(button); // Add delete button to the branch dropdown list + } + ul.appendChild(li); } function createDropDownFork(name, id, onclick) { - let ul = document.getElementById(id); - let button = document.createElement("div"); - let div = document.createElement("ul"); - let innerText = document.createTextNode("↨" + name + " (Forked List)"); - button.className = name; - button.appendChild(innerText); - div.setAttribute("id", name); - div.setAttribute("role", "menu"); - div.setAttribute("class", "list-group") - button.setAttribute("onclick", onclick) - button.appendChild(div); - ul.appendChild(button); + let ul = document.getElementById(id); + let button = document.createElement("div"); + let div = document.createElement("ul"); + let innerText = document.createTextNode("↨" + name + " (Forked List)"); + button.className = name; + button.appendChild(innerText); + div.setAttribute("id", name); + div.setAttribute("role", "menu"); + div.setAttribute("class", "list-group") + button.setAttribute("onclick", onclick) + button.appendChild(div); + ul.appendChild(button); } function checkoutLocalBranch(element) { - let bn; - console.log(typeof element); - if (typeof element === "string") { - bn = element; - } else { - bn = element.innerHTML; - } - console.log("name of branch being checked out: " + bn); - Git.Repository.open(repoFullPath) - .then(function (repo) { - displayModal("Drawing graph, please wait"); - addCommand("git checkout " + bn); - repo.checkoutBranch("refs/heads/" + bn) - .then(function () { - refreshAll(repo); - }, function (err) { - console.log("repo.tx, line 271, cannot checkout local branch: " + err); - }); - }) + let bn; + console.log(typeof element); + if (typeof element === "string") { + bn = element; + } else { + bn = element.innerHTML; + } + console.log("name of branch being checked out: " + bn); + Git.Repository.open(repoFullPath) + .then(function (repo) { + displayModal("Drawing graph, please wait"); + addCommand("git checkout " + bn); + repo.checkoutBranch("refs/heads/" + bn) + .then(function () { + refreshAll(repo); + }, function (err) { + console.log("repo.tx, line 271, cannot checkout local branch: " + err); + }); + }) } function checkoutRemoteBranch(element) { - let bn; - if (typeof element === "string") { - bn = element; - } else { - bn = element.innerHTML; - } - console.log("current branch name: " + bn); - let repos; - Git.Repository.open(repoFullPath) - .then(function (repo) { - repos = repo; - addCommand("git fetch"); - addCommand("git checkout -b " + bn); - let cid = remoteName[bn]; - console.log("name of remote branch: " + cid); - return Git.Commit.lookup(repo, cid); - }) - .then(function (commit) { - console.log("commiting"); - return Git.Branch.create(repos, bn, commit, 0); - }) - .then(function (code) { - console.log("name of local branch " + bn); - repos.mergeBranches(bn, "origin/" + bn) - .then(function () { - displayModal("Drawing graph, please wait"); - refreshAll(repos); - console.log("Pull successful"); - }); - }, function (err) { - console.log("repo.ts, line 306, could not pull from repository" + err); - }) + let bn; + if (typeof element === "string") { + bn = element; + } else { + bn = element.innerHTML; + } + console.log("current branch name: " + bn); + let repos; + Git.Repository.open(repoFullPath) + .then(function (repo) { + repos = repo; + addCommand("git fetch"); + addCommand("git checkout -b " + bn); + let cid = remoteName[bn]; + console.log("name of remote branch: " + cid); + return Git.Commit.lookup(repo, cid); + }) + .then(function (commit) { + console.log("commiting"); + return Git.Branch.create(repos, bn, commit, 0); + }) + .then(function (code) { + console.log("name of local branch " + bn); + repos.mergeBranches(bn, "origin/" + bn) + .then(function () { + displayModal("Drawing graph, please wait"); + refreshAll(repos); + console.log("Pull successful"); + }); + }, function (err) { + console.log("repo.ts, line 306, could not pull from repository" + err); + }) } function updateLocalPath() { - let text = document.getElementById("repoClone").value; - let splitText = text.split(/\.|:|\//); - if (splitText.length >= 2) { - document.getElementById("repoSave").value = splitText[splitText.length - 2]; - } + let text = document.getElementById("repoClone").value; + let splitText = text.split(/\.|:|\//); + if (splitText.length >= 2) { + document.getElementById("repoSave").value = splitText[splitText.length - 2]; + } } // function initModal() { @@ -541,13 +536,13 @@ function updateLocalPath() { // } function displayModal(text) { -// initModal(); -// handleModal(); - document.getElementById("modal-text-box").innerHTML = text; - $('#modal').modal('show'); + // initModal(); + // handleModal(); + document.getElementById("modal-text-box").innerHTML = text; + $('#modal').modal('show'); } function updateModalText(text) { - document.getElementById("modal-text-box").innerHTML = text; - $('#modal').modal('show'); + document.getElementById("modal-text-box").innerHTML = text; + $('#modal').modal('show'); } diff --git a/app/misc/router.ts b/app/misc/router.ts index 5c01e5b..1fc70de 100644 --- a/app/misc/router.ts +++ b/app/misc/router.ts @@ -4,190 +4,190 @@ let gray = "#5b6969"; let continuedWithoutSignIn = false; function collapseSignPanel() { - $("#nav-collapse1").collapse("hide"); + $("#nav-collapse1").collapse("hide"); } function switchToClonePanel() { - console.log("switch to clone panel"); - hideAuthenticatePanel(); - hideFilePanel(); - hideGraphPanel(); - displayClonePanel(); + console.log("switch to clone panel"); + hideAuthenticatePanel(); + hideFilePanel(); + hideGraphPanel(); + displayClonePanel(); } function switchToMainPanel() { - hideAuthenticatePanel(); - hideAddRepositoryPanel(); - displayFilePanel(); - displayGraphPanel(); + hideAuthenticatePanel(); + hideAddRepositoryPanel(); + displayFilePanel(); + displayGraphPanel(); } function checkSignedIn() { - if (continuedWithoutSignIn) { - displayModal("You need to sign in"); - // Don't open the repo modal - $('#repo-name').removeAttr("data-target"); - } else { - // Ensure repo modal is connected - let butt = document.getElementById("cloneButton"); - butt.innerHTML = 'Clone'; - butt.setAttribute('class', 'btn btn-primary'); - $('#repo-name').attr("data-target", "#repo-modal"); - } + if (continuedWithoutSignIn) { + displayModal("You need to sign in"); + // Don't open the repo modal + $('#repo-name').removeAttr("data-target"); + } else { + // Ensure repo modal is connected + let butt = document.getElementById("cloneButton"); + butt.innerHTML = 'Clone'; + butt.setAttribute('class', 'btn btn-primary'); + $('#repo-name').attr("data-target", "#repo-modal"); + } } function switchToAddRepositoryPanelWhenNotSignedIn() { - document.getElementById("avatar").innerHTML= "Sign In" ; - continuedWithoutSignIn = true; - switchToAddRepositoryPanel(); + document.getElementById("avatar").innerHTML = "Sign In"; + continuedWithoutSignIn = true; + switchToAddRepositoryPanel(); } function switchToAddRepositoryPanel() { - console.log("Switching to add repo panel"); - hideAuthenticatePanel(); - hideFilePanel(); - hideGraphPanel(); - displayAddRepositoryPanel(); - displayUsername(); - document.getElementById("repoOpen").value = ""; + console.log("Switching to add repo panel"); + hideAuthenticatePanel(); + hideFilePanel(); + hideGraphPanel(); + displayAddRepositoryPanel(); + displayUsername(); + document.getElementById("repoOpen").value = ""; } function wait(ms) { - var start = new Date().getTime(); - var end = start; - while (end < start + ms) { - end = new Date().getTime(); - } + var start = new Date().getTime(); + var end = start; + while (end < start + ms) { + end = new Date().getTime(); + } } function displayUsername() { - console.log(getUsername()); - let existing_username = document.getElementById("githubname").innerHTML; - if (getUsername() != null && existing_username == null) { - document.getElementById("githubname").innerHTML = getUsername(); - } + console.log(getUsername()); + let existing_username = document.getElementById("githubname").innerHTML; + if (getUsername() != null && existing_username == null) { + document.getElementById("githubname").innerHTML = getUsername(); + } } function displayClonePanel() { - document.getElementById("add-repository-panel").style.zIndex = "10"; - $("#open-local-repository").hide(); + document.getElementById("add-repository-panel").style.zIndex = "10"; + $("#open-local-repository").hide(); } function displayFilePanel() { - document.getElementById("file-panel").style.zIndex = "10"; - document.getElementById("commit-message-input").style="visibility: visible"; - document.getElementById("commit-button").style="visiblity: visible"; - document.getElementById("fileEdit-button").style="visiblity: visible"; + document.getElementById("file-panel").style.zIndex = "10"; + document.getElementById("commit-message-input").style = "visibility: visible"; + document.getElementById("commit-button").style = "visiblity: visible"; + document.getElementById("fileEdit-button").style = "visiblity: visible"; } function displayGraphPanel() { - document.getElementById("graph-panel").style.zIndex = "10"; + document.getElementById("graph-panel").style.zIndex = "10"; } function displayAddRepositoryPanel() { - document.getElementById("add-repository-panel").style.zIndex = "10"; - $("#open-local-repository").show(); + document.getElementById("add-repository-panel").style.zIndex = "10"; + $("#open-local-repository").show(); } function hideFilePanel() { - document.getElementById("file-panel").style.zIndex = "-10"; - document.getElementById("commit-message-input").style="visibility: hidden"; - document.getElementById("commit-button").style="visibility: hidden"; - document.getElementById("fileEdit-button").style="visibility: hidden"; + document.getElementById("file-panel").style.zIndex = "-10"; + document.getElementById("commit-message-input").style = "visibility: hidden"; + document.getElementById("commit-button").style = "visibility: hidden"; + document.getElementById("fileEdit-button").style = "visibility: hidden"; } function hideGraphPanel() { - document.getElementById("graph-panel").style.zIndex = "-10"; + document.getElementById("graph-panel").style.zIndex = "-10"; } function hideAddRepositoryPanel() { - document.getElementById("add-repository-panel").style.zIndex = "-10"; + document.getElementById("add-repository-panel").style.zIndex = "-10"; } function displayDiffPanel() { - document.getElementById("graph-panel").style.width = "60%"; - document.getElementById("diff-panel").style.width = "40%"; - displayDiffPanelButtons(); + document.getElementById("graph-panel").style.width = "60%"; + document.getElementById("diff-panel").style.width = "40%"; + displayDiffPanelButtons(); } function hideDiffPanel() { - document.getElementById("diff-panel").style.width = "0"; - document.getElementById("graph-panel").style.width = "100%"; - disableDiffPanelEditOnHide(); - hideDiffPanelButtons(); + document.getElementById("diff-panel").style.width = "0"; + document.getElementById("graph-panel").style.width = "100%"; + disableDiffPanelEditOnHide(); + hideDiffPanelButtons(); } function hideDiffPanelIfNoChange() { - let filename = document.getElementById("diff-panel-file-name") == null ? null : document.getElementById("diff-panel-file-name").innerHTML; - let filePaths = document.getElementsByClassName('file-path'); - let nochange = true; - for (let i = 0; i < filePaths.length; i++) { - if (filePaths[i].innerHTML === filename) { - - nochange = false; + let filename = document.getElementById("diff-panel-file-name") == null ? null : document.getElementById("diff-panel-file-name").innerHTML; + let filePaths = document.getElementsByClassName('file-path'); + let nochange = true; + for (let i = 0; i < filePaths.length; i++) { + if (filePaths[i].innerHTML === filename) { + + nochange = false; + } + } + if (nochange == true) { + hideDiffPanel(); } - } - if (nochange == true){ - hideDiffPanel(); - } - filename = null; + filename = null; } function hideAuthenticatePanel() { - document.getElementById("authenticate").style.zIndex = "-20"; + document.getElementById("authenticate").style.zIndex = "-20"; } function displayAuthenticatePanel() { - document.getElementById("authenticate").style.zIndex = "20"; + document.getElementById("authenticate").style.zIndex = "20"; } function displayDiffPanelButtons() { - document.getElementById("save-button").style.visibility = "visible"; - document.getElementById("cancel-button").style.visibility = "visible"; + document.getElementById("save-button").style.visibility = "visible"; + document.getElementById("cancel-button").style.visibility = "visible"; } function hideDiffPanelButtons() { - document.getElementById("save-button").style.visibility = "hidden"; - document.getElementById("cancel-button").style.visibility = "hidden"; - disableSaveCancelButton(); - disableDiffPanelEditOnHide(); + document.getElementById("save-button").style.visibility = "hidden"; + document.getElementById("cancel-button").style.visibility = "hidden"; + disableSaveCancelButton(); + disableDiffPanelEditOnHide(); } function disableSaveCancelButton() { - let saveButton = document.getElementById("save-button"); - let cancelButton = document.getElementById("cancel-button"); - saveButton.disabled = true; - saveButton.style.backgroundColor = gray; - cancelButton.disabled = true; - cancelButton.style.backgroundColor = gray; + let saveButton = document.getElementById("save-button"); + let cancelButton = document.getElementById("cancel-button"); + saveButton.disabled = true; + saveButton.style.backgroundColor = gray; + cancelButton.disabled = true; + cancelButton.style.backgroundColor = gray; } function enableSaveCancelButton() { - let saveButton = document.getElementById("save-button"); - let cancelButton = document.getElementById("cancel-button"); - saveButton.disabled = false; - saveButton.style.backgroundColor = blue; - cancelButton.disabled = false; - cancelButton.style.backgroundColor = blue; + let saveButton = document.getElementById("save-button"); + let cancelButton = document.getElementById("cancel-button"); + saveButton.disabled = false; + saveButton.style.backgroundColor = blue; + cancelButton.disabled = false; + cancelButton.style.backgroundColor = blue; } function disableDiffPanelEditOnHide() { - let doc = document.getElementById("diff-panel-body"); - doc.contentEditable = "false"; + let doc = document.getElementById("diff-panel-body"); + doc.contentEditable = "false"; } function useSaved() { - let file = 'data.json'; - // check if the data.json file exists - fs.exists(file, (exist) => { - if (exist) { - console.log('button has been pressed: logging in with saved credentials'); - decrypt(); - loginWithSaved(switchToMainPanel); - } else { - // if data,json file doesn't exist show a pop up. - window.alert("No saved credentials exist"); - } - }); + let file = 'data.json'; + // check if the data.json file exists + fs.exists(file, (exist) => { + if (exist) { + console.log('button has been pressed: logging in with saved credentials'); + decrypt(); + loginWithSaved(switchToMainPanel); + } else { + // if data,json file doesn't exist show a pop up. + window.alert("No saved credentials exist"); + } + }); } diff --git a/dummy b/dummy deleted file mode 160000 index 6183d68..0000000 --- a/dummy +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6183d68563ad5707a82ab2144c055cbb2781ef76