From 18533c388ddb671c453a78404e7d2463f3c7a1ed Mon Sep 17 00:00:00 2001 From: Bengt Brodersen Date: Wed, 20 May 2015 08:05:08 +0200 Subject: [PATCH] first trello integration --- bookmarklet.js | 174 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 125 insertions(+), 49 deletions(-) diff --git a/bookmarklet.js b/bookmarklet.js index 2ce4e0c..6a63225 100644 --- a/bookmarklet.js +++ b/bookmarklet.js @@ -9,7 +9,8 @@ } var isDev = /.*jira.atlassian.com\/secure\/RapidBoard.jspa\?.*projectKey=ANERDS.*/g.test(document.URL) // Jira - || /.*pivotaltracker.com\/n\/projects\/510733.*/g.test(document.URL); // PivotTracker + || /.*pivotaltracker.com\/n\/projects\/510733.*/g.test(document.URL) // PivotTracker + || ( /.*trello.com\/.*/g.test(document.URL) && jQuery("span.js-member-name").text() =='Bengt Brodersen'); // Trello var isProd = !isDev; var appFunctions = null; var printScopeDeviderToken = "Attachment"; @@ -42,9 +43,17 @@ addDateFunctions(); if (jQuery("meta[name='application-name'][ content='JIRA']").length > 0) { + console.log("App: " + "Jira"); appFunctions = jiraFunctions; - } else if (/.*\pivotaltracker.com\/.*/g.test(document.URL)) { - appFunctions = pivotalTrackerFunctions + } else if (/.*pivotaltracker.com\/.*/g.test(document.URL)) { + console.log("App: " + "PivotalTracker"); + appFunctions = pivotalTrackerFunctions; + } else if (/.*trello.com\/.*/g.test(document.URL)) { + console.log("App: " + "Trello"); + appFunctions = trelloFunctions; + } else { + alert("Unsupported app.Please create an issue at https://github.com/qoomon/Jira-Issue-Card-Printer"); + return; } if (isProd){ @@ -87,7 +96,7 @@ jQuery("#card-print-dialog-title").text("Card Print - Loading " + issueKeyList.length + " issues..."); renderCards(issueKeyList, function() { jQuery("#card-print-dialog-title").text("Card Print"); - // print(); + //print(); }); } @@ -224,7 +233,11 @@ card.find('.summary').text(data.summary); //Description - card.find('.description').html(data.description); + if (data.description) { + card.find('.description').html(data.description); + } else { + card.find(".description").addClass("hidden"); + } //Assignee if (data.assignee) { @@ -636,7 +649,7 @@ } .card-header:after, .card-footer:after { - content:" "; + content: ""; display: block; clear: both; height:0 @@ -712,16 +725,18 @@ margin-right: 1.1rem; margin-bottom: 0.2rem; min-height: 1.2rem; + width: auto; } .content-header { position: relative; font-size: 1.1rem; line-height: 1.1rem; - //margin-bottom: 0.6rem; + width: auto; } .card-footer { position: absolute; - bottom: 0rem; + bottom: 0; + width: 100%; } .summary { font-weight: bold; @@ -733,21 +748,11 @@ line-height: 0.6rem; overflow: hidden; } - .description:after { - content: ""; - text-align: right; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 0.6em; - background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1)); - } .key { position: absolute; float: left; width: auto; - min-width: 4.4rem; + min-width: 3.0rem; height: 1.5rem; left: 2.5rem; margin-top: 1.2rem; @@ -761,6 +766,8 @@ .type-icon { position: relative; float: left; + width: 3.15rem; + height: 3.15rem; background-color: GREENYELLOW; background-image: url(https://googledrive.com/host/0Bwgd0mVaLU_KU0N5b3JyRnJaNTA/resources/icons/Objects.png); background-repeat: no-repeat; @@ -805,10 +812,10 @@ } .due-icon { position: relative; - float:right; + float: right; width: 2.5rem; height: 2.5rem; - margin-top: 0.4rem; + margin-top: 0.45rem; background-color: MEDIUMPURPLE; background-image: url(https://googledrive.com/host/0Bwgd0mVaLU_KU0N5b3JyRnJaNTA/resources/icons/AlarmClock.png); background-repeat: no-repeat; @@ -820,19 +827,17 @@ .due-date { position: relative; float: right; - right: -0.6rem; width: auto; min-width: 2.8rem; - height: auto; + height: 1.3rem; + right: -0.6rem; margin-top: 1.3rem; - padding-top: 0.2rem; - padding-bottom: 0.2rem; padding-left: 0.3rem; padding-right: 0.6rem; text-align: center; font-weight: bold; font-size: 0.7rem; - line-height: 0.7rem; + line-height: 1.0rem; } .attachment { position: relative; @@ -846,7 +851,6 @@ -webkit-background-size: 70%; background-size: 70%; background-position: center; - } .assignee { position: relative; @@ -1191,9 +1195,9 @@ //############################################################################################################################ //############################################################################################################################ - var jiraFunctions = { + var jiraFunctions = (function (module) { - getSelectedIssueKeyList: function() { + module.getSelectedIssueKeyList = function() { //Browse if (/.*\/browse\/.*/g.test(document.URL)) { return jQuery("a[data-issue-key][id='key-val']").map(function() { @@ -1209,10 +1213,10 @@ } return []; - }, + }; - getCardData: function(issueKey, callback) { - jiraFunctions.getIssueData(issueKey, function(data) { + module.getCardData= function(issueKey, callback) { + module.getIssueData(issueKey, function(data) { var issueData = {}; @@ -1266,9 +1270,9 @@ callback(issueData); }); - }, + }; - getIssueData: function(issueKey, callback, async) { + module.getIssueData = function(issueKey, callback, async) { async = typeof async !== 'undefined' ? async : true; //https://docs.atlassian.com/jira/REST/latest/ var url = '/rest/api/2/issue/' + issueKey + '?expand=renderedFields,names'; @@ -1293,15 +1297,17 @@ callback(responseData); }, }); - } - } + }; - var pivotalTrackerFunctions = { + return module; + }({})); - getSelectedIssueKeyList: function() { + var pivotalTrackerFunctions = (function (module) { + + module.getSelectedIssueKeyList = function() { //Single Story if (/.*\/stories\/.*/g.test(document.URL)) { - return [document.URL.replace(/.*\/stories\/(.*)\??/, '$1')]; + return [document.URL.replace(/.*\/stories\/([^?]*).*/, '$1')]; // TODO } // Board @@ -1312,10 +1318,10 @@ } return []; - }, + }; - getCardData: function(issueKey, callback) { - pivotalTrackerFunctions.getIssueData(issueKey, function(data) { + module.getCardData = function(issueKey, callback) { + module.getIssueData(issueKey, function(data) { var issueData = {}; @@ -1326,9 +1332,6 @@ issueData.summary = data.name; issueData.description = data.description; - if (issueData.description) { - issueData.description = issueData.description - } if (data.owned_by && data.owned_by.length > 0) { issueData.assignee = data.owner_ids[0].name; @@ -1361,9 +1364,9 @@ callback(issueData); }); - }, + }; - getIssueData: function(issueKey, callback, async) { + module.getIssueData = function(issueKey, callback, async) { async = typeof async !== 'undefined' ? async : true; //http://www.pivotaltracker.com/help/api var url = 'https://www.pivotaltracker.com/services/v5/stories/' + issueKey + "?fields=name,kind,description,story_type,owned_by(name),comments(file_attachments(kind)),estimate,deadline"; @@ -1380,6 +1383,79 @@ callback(responseData); }, }); - } - } + }; + + return module; + }({})); + + var trelloFunctions = (function (module) { + + module.getSelectedIssueKeyList = function() { + //Card View + if (/.*\/c\/.*/g.test(document.URL)) { + return [document.URL.replace(/.*\/c\/([^/]*).*/g, '$1')]; + } + + return []; + }; + + module.getCardData = function(issueKey, callback) { + module.getIssueData(issueKey, function(data) { + + var issueData = {}; + + issueData.key = data.idShort; + + // TODO get kind from label name + // issueData.type = data.kind.toLowerCase(); + + issueData.summary = data.name; + + issueData.description = data.desc; + + if (data.members && data.members.length > 0) { + issueData.assignee = data.members[0].fullName; + issueData.avatarUrl = "https://trello-avatars.s3.amazonaws.com/"+data.members[0].avatarHash+"/170.png"; + } + + if (data.due) { + issueData.dueDate = new Date(data.due).format('D d.m.'); + } + + issueData.hasAttachment = data.attachments > 0; + if (issueData.description) { + var printScope = issueData.description.indexOf(printScopeDeviderToken); + if (printScope >= 0) { + issueData.description = issueData.description.substring(0, printScope); + issueData.hasAttachment = true; + } + } + + issueData.url = data.shortUrl; + + callback(issueData); + }); + }; + + module.getIssueData = function(issueKey, callback, async) { + async = typeof async !== 'undefined' ? async : true; + //http://www.pivotaltracker.com/help/api + var url = "https://trello.com/1/cards/" + issueKey + "?members=true"; + console.log("IssueUrl: " + url); + //console.log("Issue: " + issueKey + " Loading..."); + jQuery.ajax({ + type: 'GET', + url: url, + data: {}, + dataType: 'json', + async: async, + success: function(responseData) { + //console.log("Issue: " + issueKey + " Loaded!"); + callback(responseData); + }, + }); + }; + + return module; + }({})); })();