SankeySheets/scripts/Picker.js
2015-06-06 09:19:41 +01:00

144 lines
4 KiB
JavaScript

// Picker dialog
var Picker = (function(picker) {
'use strict';
picker.settings = {
height:520,
width:600,
title:"Select a folder, or file to replace",
defaultSVGName:"sankeysnip.svg",
mime:"image/svg+xml",
mimeFolder:"application/vnd.google-apps.folder"
};
var token_,
key_,
name_=picker.settings.defaultSVGName;
/**
* set the access token
* @param {string} token the oauth token
* @return {Picker} self
*/
picker.setToken = function (token) {
token_ = token;
return picker;
};
/**
* set the developer key
* @param {string} key the developer key
* @return {Picker} self
*/
picker.setKey = function (key) {
key_ = key;
return picker;
};
/**
* set the filename
* @param {string} key the developer key
* @return {Picker} self
*/
picker.setName = function (name) {
name_ = name;
return picker;
};
/**
* open a picker dialog
* @param {string} content the content to write
* @param {function} success what to do when done.
* @param {function} failure what do to on failure
*/
picker.writeContent = function (content, success, failure) {
var docsView = new google.picker.DocsView()
.setIncludeFolders(true)
.setMimeTypes(picker.settings.mime)
.setSelectFolderEnabled(true)
.setOwnedByMe(true)
.setMode(google.picker.DocsViewMode.GRID);
var googlePicker = new google.picker.PickerBuilder()
.addView(docsView)
.setOAuthToken(token_)
.setDeveloperKey(key_)
.setTitle(picker.settings.title)
.setSize(picker.settings.width *.9,picker.settings.height*.9)
.setCallback( function (pickResult) {
if (pickResult[google.picker.Response.ACTION] === google.picker.Action.PICKED){
var doc = pickResult[google.picker.Response.DOCUMENTS][0];
var id = doc[google.picker.Document.ID];
var url = doc[google.picker.Document.URL];
var title = doc[google.picker.Document.NAME];
var mime = doc[google.picker.Document.MIME_TYPE];
var parentId = doc[google.picker.Document.PARENT_ID];
// now we have the folder, write the content using the drive API
gapi.client.load('drive', 'v2').then(function() {
// use the token inherited from Apps Script
gapi.auth.setToken({
access_token: token_
});
if (mime === picker.settings.mimeFolder) {
// writing a new file to a folder
return prepareFileAndContent (content,id).then (success, failure);
}
else {
// replacing the contents of an existing file
return prepareFileAndContent (content,parentId,id).then (success, failure);
}
});
}
})
.setOrigin('https://docs.google.com')
.build();
googlePicker.setVisible(true);
};
function prepareFileAndContent (content,folderId,fileId) {
const boundary = '-------314159265358979323846';
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delim = "\r\n--" + boundary + "--";
var resource = {
'title': name_,
'parents':[{id:folderId}],
'mimeType':picker.settings.mime,
'description':'Created by sankey snip (http://ramblings.mcpher.com/Home/excelquirks/addons/sankeyaddon) on ' + new Date().toString()
};
var multipartRequestBody =
delimiter +
'Content-Type: application/json\r\n\r\n' +
JSON.stringify(resource) +
delimiter +
'Content-Type: ' +
picker.settings.mime + '\r\n' + '\r\n' +
content +
close_delim;
return gapi.client.request({
'path': '/upload/drive/v2/files'+ (fileId ? '/' + fileId : '' ) + '?uploadType=multipart',
'method': fileId ? 'PUT': 'POST',
'headers': {'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'},
'body': multipartRequestBody
});
}
return picker;
})(Picker || {});