Created
February 21, 2019 18:08
-
-
Save wbatty/7e062dedc12523347eec2e31c554438d to your computer and use it in GitHub Desktop.
Quick Teamwork Project List Download
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const API_KEY = /*Your API Key */; | |
const PAGE_COUNT = 3; // NUmber of pages to fetch (for some reason fetch does not retrieve headers from teamwork api) | |
const FIELDS = ['id', 'name']; // fields you want in the CSV | |
let companyId = /* Your company id*/; | |
let status = 'ACTIVE'; | |
getPageUrls(PAGE_COUNT, { status, companyId }) | |
.then(fetchPages) | |
.then(isolateAndFlattenProjects) | |
.then(extractFields) | |
.then(buildCsvContent) | |
.then(buildLinkAndTriggerDownload); | |
function buildQueryString(queryOptions) | |
{ | |
return Object.entries(queryOptions).map(option => option.join('=')).join('&'); | |
} | |
function getPageNumbers(pageCount) | |
{ | |
let maxPageIndex = pageCount + 1; | |
return [...Array(maxPageIndex).keys()].slice(1, maxPageIndex); | |
} | |
function getPageUrls(pageCount, options) | |
{ | |
let pageUrls = getPageNumbers(pageCount).map(function(page){ | |
let pageOptions = Object.assign({ page }, options); | |
let queryString = buildQueryString(pageOptions); | |
return `https://teamwork.digitalreportingservices.com/projects.json?${queryString}`; | |
}); | |
return Promise.resolve(pageUrls); | |
} | |
function fetchPages(pageUrls) | |
{ | |
let pageRequests = pageUrls.map(function(pageUrl){ | |
return fetch(pageUrl, { | |
headers: new Headers({ | |
'Authorization' : `BASIC ${btoa(`${API_KEY}:xxx`)}`, | |
}) | |
}).then(function(response){ | |
return response.json() | |
}); | |
}) | |
return Promise.all(pageRequests); | |
} | |
function isolateAndFlattenProjects(results) | |
{ | |
return [].concat(...results.map(result => result.projects)); | |
} | |
function extractFields(projects) | |
{ | |
return projects.map(function(project){ | |
return FIELDS.map(field => project[field]); | |
}) | |
} | |
function buildCsvContent(rows) | |
{ | |
let rowContent = [FIELDS].concat(rows).map(function(lineAsArray){ | |
return lineAsArray.map(function(cell){ | |
cell = cell.match(/[,\s']/g) ? `"${cell}"` : cell; | |
return cell; | |
}).join(','); | |
}); | |
return encodeURI(`data:text/csv;charset=utf-8,${rowContent.join('\n')}`); | |
} | |
function buildLinkAndTriggerDownload(csvContent) | |
{ | |
let link = document.createElement("a"); | |
link.setAttribute('href', csvContent); | |
link.setAttribute('download', 'teamwork-project-list.csv'); | |
link.style.display = 'none'; | |
link.click = function(e){ | |
e.target.parentElement.removeChild(e.target); | |
}; | |
document.body.appendChild(link); | |
link.dispatchEvent(new MouseEvent('click')); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment