Skip to content

Instantly share code, notes, and snippets.

@wbatty
Created February 21, 2019 18:08
Show Gist options
  • Save wbatty/7e062dedc12523347eec2e31c554438d to your computer and use it in GitHub Desktop.
Save wbatty/7e062dedc12523347eec2e31c554438d to your computer and use it in GitHub Desktop.
Quick Teamwork Project List Download
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