<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="boutons">
<h4>Milestones ouvertes</h4>
<ul id="ouvertes">
</ul>
<h4>Milestones fermées</h4>
<ul id="fermees">
</ul>
</div>
<hr>
<div>
<textarea id="md" readonly>
Ici sera inscrit la liste des tickets
</textarea>
</div>
</body>
</html>
#md {
width: 100%;
}
// Créé les boutons lorsque le DOM est chargé
document.addEventListener('DOMContentLoaded', init, false);
var ouvertes;
var fermees;
var divMD;
function init() {
ouvertes = document.getElementById('ouvertes');
fermees = document.getElementById('fermees');
divMD = document.getElementById('md');
// requete GitHub pour avoir les milestones
getMilestones();
}
function getMilestones(page) {
// Fonction qui va créer l'url avec les paramètres puis
// envoyer la requête
var requete = new XMLHttpRequest(); // créer un objet de requête
var url = "https://api.github.com/repos/zestedesavoir/zds-site/" +
"milestones?state=all&per_page=100";
if(page) {
console.log("ajoute num page " + page);
url += "&page=" + page;
}
console.log("url : " + url);
requete.open('GET', url, true); // On construit la requête
requete.send(null); // On envoie !
requete.onreadystatechange = function() { // on attend le retour
if (requete.readyState == 4) { // Revenu !
if (requete.status == 200) {// Retour s'est bien passé !
// peuplage des champs
var donnees = JSON.parse(requete.responseText);
var headers = requete.getAllResponseHeaders().toLowerCase();
//console.log(donnees);
//console.log(headers);
for(i=0; i<donnees.length; i++) {
var puce = document.createElement("li");
var lien = document.createElement("a");
lien.innerText = donnees[i].title;
lien.href = "#";//donnees[i].url;
lien.title = donnees[i].description;
lien.addEventListener("click",
getTickets.bind(null, donnees[i], ""),
false);
puce.appendChild(lien);
if(donnees[i].state === "open")
ouvertes.appendChild(puce);
else
fermees.appendChild(puce);
}
} else { // Retour s'est mal passé :(
console.log(requete.statusText);
}
}
};
}
function readHeaders(headers) {
// retourne l'indice de la prochaine page
var nextPageNumber = 0;
return nextPageNumber;
}
function getTickets(milestone, page) {
// Fonction qui va créer l'url avec les paramètres puis
// envoyer la requête
var requete = new XMLHttpRequest(); // créer un objet de requête
var url = "https://api.github.com/repos/zestedesavoir/zds-site/" +
"issues?milestone=" + milestone.number +
"&state=all&per_page=100";
if(page) {
console.log("ajoute num page " + page);
url += "&page=" + page;
}
console.log("url : " + url);
requete.open('GET', url, true); // On construit la requête
requete.send(null); // On envoie !
requete.onreadystatechange = function() { // on attend le retour
if (requete.readyState == 4) { // Revenu !
if (requete.status == 200) {// Retour s'est bien passé !
// peuplage des champs
var donnees = JSON.parse(requete.responseText);
var headers = requete.getAllResponseHeaders().toLowerCase();
console.log(donnees);
console.log(headers);
var openTickets = [];
var closedBugs = [];
var closedEvos = [];
var closedUnks = [];
for(i=0; i<donnees.length; i++) {
if(donnees[i].state === "open") {
openTickets.push(donnees[i]);
} else {
closedUnks.push(donnees[i]);
for(j=0; j<donnees[i].labels.length; j++) {
if(donnees[i].labels[j].name.toLowerCase() === "evolution") {
closedEvos.push(donnees[i]);
closedUnks.pop();
} else if(donnees[i].labels[j].name.toLowerCase() === "bug") {
closedBugs.push(donnees[i]);
closedUnks.pop();
}
}
}
}
console.log(openTickets);
console.log(closedBugs);
console.log(closedEvos);
console.log(closedUnks);
// fait l'affichage
var contenu = "";
contenu += "Rapport pour le jalon **[" + milestone.title + "]" +
"(https://github.com/zestedesavoir/zds-site/milestones/" +
milestone.title + ")** " +
"*(" + milestone.description + ")*\n\n";
contenu += "" + (openTickets.length+closedBugs.length+closedEvos.length+closedUnks.length) +
" tickets sont compris dans ce jalon " +
"(" + openTickets.length + " ouverts et " +
"" + (closedBugs.length+closedEvos.length+closedUnks.length) + " fermés)\n\n";
contenu += "# Tickets toujours ouvert\n\n";
contenu += mdarray(openTickets);
contenu += "# Tickets fermé\n\n";
contenu += "## Corrections de bug\n\n";
contenu += mdarray(closedBugs);
contenu += "## Evolutions\n\n";
contenu += mdarray(closedEvos);
contenu += "## Non défini\n\n";
contenu += mdarray(closedUnks);
md.innerHTML = contenu;
md.rows = openTickets.length+closedBugs.length+closedEvos.length+closedUnks.length + 30;
} else { // Retour s'est mal passé :(
console.log(requete.statusText);
}
}
};
}
function mdarray(tickets) {
if(tickets.length === 0)
return "Aucun ticket\n\n";
var content = "";
content += "Ticket # | Titre | Label(s)\n";
content += "---------|-------|---------\n";
for(i=0; i<tickets.length; i++) {
var labels = "";
for(j=0; j<tickets[i].labels.length; j++) {
labels += tickets[i].labels[j].name + ', ';
}
content += "[#"+tickets[i].number+"]("+tickets[i].html_url+") | "+tickets[i].title+" | "+labels+"\n";
}
content += "\n";
return content;
}
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |