define(['jquery', 'underscore', 'backbone', 'models/SolrResult'], function($, _, Backbone, SolrResult, template) { 'use strict'; var DownloadButtonView = Backbone.View.extend({ tagName: "a", className: "btn download", initialize: function(options){ if(!options) var options = {} this.model = options.model || new SolrResult(); }, events: { "click" : "download" }, render: function(){ var fileName = this.model.get("fileName") || ""; if( typeof fileName == "string" ){ fileName = fileName.trim(); } //Add the href and id attributes this.$el.attr("href", this.model.get("url")) .attr("data-id", this.model.get("id")) .attr("download", fileName); //Check for CORS downloads. For CORS, the 'download' attribute may not work, // so open in a new tab. if( this.model.get("url").indexOf(window.location.origin) == -1 ){ this.$el.attr("target", "_blank"); } //For packages if(this.model.type == "Package"){ this.$el.text("Download All") .addClass("btn-primary"); //if the Package Model has no Solr index document associated with it, then we // can assume the resource map object is private. So disable the download button. if( !this.model.get("indexDoc") ){ this.$el.attr("disabled", "disabled") .addClass("disabled") .attr("href", "") .tooltip({ trigger: "hover", placement: "top", delay: 500, title: "This dataset may contain private data, so each data file should be downloaded individually." }); } } //For individual DataONEObjects else{ this.$el.text("Download"); } //Add a download icon this.$el.append( $(document.createElement("i")).addClass("icon icon-cloud-download") ); //If this is a Download All button for a package but it's too large, then disable the button with a message if(this.model.type == "Package" && this.model.getTotalSize() > MetacatUI.appModel.get("maxDownloadSize")){ this.$el.addClass("tooltip-this") .attr("disabled", "disabled") .attr("data-title", "This dataset is too large to download as a package. Please download the files individually or contact us for alternate data access.") .attr("data-placement", "top") .attr("data-trigger", "hover") .attr("data-container", "body"); // Removing the `href` attribute while disabling the download button. this.$el.removeAttr("href"); // Removing pointer as cursor and setting to default this.$el.css("cursor","default"); } }, download: function(e){ // Checking if the Download All button is disabled because the package is too large var isDownloadDisabled = (this.$el.attr("disabled") === "disabled" || this.$el.is(".disabled")) ? true : false; // Do nothing if the `disabled` attribute is set!. // If the download is already in progress, don't try to download again if(isDownloadDisabled || this.$el.is(".in-progress")) { e.preventDefault(); return; } //If the user isn't logged in, let the browser handle the download normally if( MetacatUI.appUserModel.get("tokenChecked") && !MetacatUI.appUserModel.get("loggedIn") ){ return; } //If the authentication hasn't been checked yet, wait for it else if( !MetacatUI.appUserModel.get("tokenChecked") ){ var view = this; this.listenTo(MetacatUI.appUserModel, "change:tokenChecked", function(){ view.download(e); }); return; } //If the user is logged in but the object is public, download normally else if( this.model.get("isPublic") ){ //If this is a "Download All" button for a package, and at least object is private, then // we need to download via XHR with credentials if( this.model.type == "Package" ){ //If we found a private object, download the package via XHR so we can send the auth token. var privateObject = _.find(this.model.get("members"), function(m){ return m.get("isPublic") !== true; }); //If no private object is found, download normally. // This may still fail when there is a private object that the logged-in user doesn't have access to. if( !privateObject ){ return; } } //All other object types (data and metadata objects) can be downloaded normally else{ return; } } e.preventDefault(); //Show that the download has started this.$el.addClass("in-progress"); var buttonHTML = this.$el.html(); this.$el.html("Downloading... "); //Fire the download event via the SolrResult model this.model.downloadWithCredentials(); this.listenToOnce(this.model, "downloadComplete", function(){ //Show that the download is complete this.$el.html("Complete ") .addClass("complete") .removeClass("in-progress error"); var view = this; //Put the download button back to normal setTimeout(function(){ //After one second, change the background color with an animation view.$el.removeClass("complete") .html(buttonHTML); }, 2000); }); this.listenToOnce(this.model, "downloadError", function(){ //Show that the download failed to compelete. this.$el.html("Error ") .addClass("error") .removeClass("in-progress") .tooltip({ trigger: "hover", placement: "top", title: "Something went wrong while trying to download. Click to try again." }); }); } }); return DownloadButtonView; });