2017-03-08 18:41:05 +00:00
|
|
|
/** !
|
2016-03-04 15:17:35 +00:00
|
|
|
* Google Drive File Picker Example
|
|
|
|
* By Daniel Lo Nigro (http://dan.cx/)
|
|
|
|
*/
|
2017-03-08 18:41:05 +00:00
|
|
|
(function () {
|
|
|
|
/**
|
|
|
|
* Initialise a Google Driver file picker
|
|
|
|
*/
|
|
|
|
var FilePicker = window.FilePicker = function (options) {
|
|
|
|
// Config
|
|
|
|
this.apiKey = options.apiKey
|
|
|
|
this.clientId = options.clientId
|
2016-03-04 15:17:35 +00:00
|
|
|
|
2017-03-08 18:41:05 +00:00
|
|
|
// Elements
|
|
|
|
this.buttonEl = options.buttonEl
|
2016-03-04 15:17:35 +00:00
|
|
|
|
2017-03-08 18:41:05 +00:00
|
|
|
// Events
|
|
|
|
this.onSelect = options.onSelect
|
|
|
|
this.buttonEl.on('click', this.open.bind(this))
|
|
|
|
|
|
|
|
// Disable the button until the API loads, as it won't work properly until then.
|
|
|
|
this.buttonEl.prop('disabled', true)
|
|
|
|
|
|
|
|
// Load the drive API
|
|
|
|
window.gapi.client.setApiKey(this.apiKey)
|
|
|
|
window.gapi.client.load('drive', 'v2', this._driveApiLoaded.bind(this))
|
|
|
|
window.google.load('picker', '1', { callback: this._pickerApiLoaded.bind(this) })
|
|
|
|
}
|
|
|
|
|
|
|
|
FilePicker.prototype = {
|
|
|
|
/**
|
|
|
|
* Open the file picker.
|
|
|
|
*/
|
|
|
|
open: function () {
|
|
|
|
// Check if the user has already authenticated
|
|
|
|
var token = window.gapi.auth.getToken()
|
|
|
|
if (token) {
|
|
|
|
this._showPicker()
|
|
|
|
} else {
|
|
|
|
// The user has not yet authenticated with Google
|
|
|
|
// We need to do the authentication before displaying the Drive picker.
|
|
|
|
this._doAuth(false, function () { this._showPicker() }.bind(this))
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show the file picker once authentication has been done.
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_showPicker: function () {
|
|
|
|
var accessToken = window.gapi.auth.getToken().access_token
|
|
|
|
var view = new window.google.picker.DocsView()
|
|
|
|
view.setMimeTypes('text/markdown,text/html')
|
|
|
|
view.setIncludeFolders(true)
|
|
|
|
view.setOwnedByMe(true)
|
|
|
|
this.picker = new window.google.picker.PickerBuilder()
|
|
|
|
.enableFeature(window.google.picker.Feature.NAV_HIDDEN)
|
|
|
|
.addView(view)
|
|
|
|
.setAppId(this.clientId)
|
|
|
|
.setOAuthToken(accessToken)
|
|
|
|
.setCallback(this._pickerCallback.bind(this))
|
|
|
|
.build()
|
|
|
|
.setVisible(true)
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when a file has been selected in the Google Drive file picker.
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_pickerCallback: function (data) {
|
|
|
|
if (data[window.google.picker.Response.ACTION] === window.google.picker.Action.PICKED) {
|
|
|
|
var file = data[window.google.picker.Response.DOCUMENTS][0]
|
|
|
|
var id = file[window.google.picker.Document.ID]
|
|
|
|
var request = window.gapi.client.drive.files.get({
|
|
|
|
fileId: id
|
|
|
|
})
|
|
|
|
request.execute(this._fileGetCallback.bind(this))
|
|
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
|
|
* Called when file details have been retrieved from Google Drive.
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_fileGetCallback: function (file) {
|
|
|
|
if (this.onSelect) {
|
|
|
|
this.onSelect(file)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when the Google Drive file picker API has finished loading.
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_pickerApiLoaded: function () {
|
|
|
|
this.buttonEl.prop('disabled', false)
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when the Google Drive API has finished loading.
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_driveApiLoaded: function () {
|
|
|
|
this._doAuth(true)
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Authenticate with Google Drive via the Google JavaScript API.
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_doAuth: function (immediate, callback) {
|
|
|
|
window.gapi.auth.authorize({
|
|
|
|
client_id: this.clientId,
|
|
|
|
scope: 'https://www.googleapis.com/auth/drive.readonly',
|
|
|
|
immediate: immediate
|
|
|
|
}, callback || function () {})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}())
|