diff --git a/app/assets/javascripts/browse_everything/behavior.js b/app/assets/javascripts/browse_everything/behavior.js index e9ec801b..a0b5d54a 100644 --- a/app/assets/javascripts/browse_everything/behavior.js +++ b/app/assets/javascripts/browse_everything/behavior.js @@ -32,6 +32,9 @@ BrowseEverythingForm.prototype.appendFileInputElements = function(resource) { var provider_input = $("").val( resource.$element.data('ev-provider') ); this.$form.append(provider_input); + + var type_input = $("").val( resource.$element.data('ev-type') ); + this.$form.append(type_input); }; /** @@ -58,6 +61,9 @@ BrowseEverythingForm.prototype.appendDirectoryInputElements = function(resource) // Add the provider var provider_input = $("").val( resource.$element.data('ev-provider') ); this.$form.append(provider_input); + + var type_input = $("").val( resource.$element.data('ev-type') ); + this.$form.append(type_input); }; /** diff --git a/app/services/browser_factory.rb b/app/services/browser_factory.rb index d39eede3..054cae1e 100644 --- a/app/services/browser_factory.rb +++ b/app/services/browser_factory.rb @@ -2,18 +2,34 @@ class BrowserFactory class << self - def build(session:, url_options:) - browser = BrowseEverything::Browser.new(url_options) - browser.providers.each_value do |provider_handler| + # Construct a Browser object with session information + # @param [ActionDispatch::Session] session + # @param [Hash] url_options the options for the URL generation in the provider + # @return [Browser] + def build(session: nil, url_options: {}) + new_browser = browser(url_options: url_options) + return new_browser if session.nil? + + new_browser.providers.each_value do |provider_handler| # The authentication token must be set here - provider_session = BrowseEverythingSession::ProviderSession.for(session: session, name: provider_handler.key.to_sym) + provider_name = provider_handler.key + provider_session = BrowseEverythingSession::ProviderSession.for(session: session, name: provider_name.to_sym) provider_handler.token = provider_session.token if provider_session.token end - browser + new_browser end - def for(name:, url_options: {}) - browser(url_options: url_options).providers[name] + # Retrieve an existing Provider by its name + # @param [String] name the name of the provider + # @param [ActionDispatch::Session] session + # @param [Hash] url_options the options for the URL generation in the provider + # @return [BrowseEverything::Driver::Base] + # + # @todo This should be renamed to #provider_for + def for(name:, session: nil, url_options: {}) + current_browser = build(session: session, url_options: url_options) + provider = current_browser.providers[name] + provider || BrowseEverything::Driver::Base.new(url_options: url_options) end end diff --git a/app/views/browse_everything/_files.html.erb b/app/views/browse_everything/_files.html.erb index f19c2d20..cfa6044a 100644 --- a/app/views/browse_everything/_files.html.erb +++ b/app/views/browse_everything/_files.html.erb @@ -30,6 +30,7 @@ data-ev-file-date="<%= file.mtime %>" <%= file.container? ? 'data-ev-container' : '' %> data-ev-provider="<%= file.provider_name %>" + data-ev-type="<%= file.type %>" data-tt-id="<%= path %>" data-tt-parent-id="<%= parent %>" data-tt-branch="<%= file.container? ? 'true' : 'false' %>"> diff --git a/lib/browse_everything/driver/base.rb b/lib/browse_everything/driver/base.rb index 81b19d76..b16a80f2 100644 --- a/lib/browse_everything/driver/base.rb +++ b/lib/browse_everything/driver/base.rb @@ -2,6 +2,9 @@ module BrowseEverything module Driver + DEFAULT_CONTAINER_MEDIA_TYPE = 'application/x-directory' + DEFAULT_BYTESTREAM_MEDIA_TYPE = 'application/octet-stream' + # Abstract class for provider classes class Base include BrowseEverything::Engine.routes.url_helpers @@ -44,13 +47,20 @@ def mime_type(extname) # Generate the default content media/MIME type for a container resource # @return [String] def container_mime_type - 'application/x-directory' + DEFAULT_CONTAINER_MEDIA_TYPE + end + + # Generate the default content media/MIME type for a bytestream + # @return [String] + def bytestream_mime_type + DEFAULT_BYTESTREAM_MEDIA_TYPE end + alias file_mime_type bytestream_mime_type end # Constructor # @param config_values [Hash] configuration for the driver - def initialize(config_values) + def initialize(config_values = {}) @config = config_values @sorter = self.class.sorter || self.class.default_sorter validate_config diff --git a/lib/browse_everything/driver/file_system.rb b/lib/browse_everything/driver/file_system.rb index 8dfd5652..d414f128 100644 --- a/lib/browse_everything/driver/file_system.rb +++ b/lib/browse_everything/driver/file_system.rb @@ -3,10 +3,6 @@ module BrowseEverything module Driver class FileSystem < Base - def self.container_mime_type - 'application/x-directory' - end - def icon 'file' end @@ -79,6 +75,7 @@ def link_for(path, _file_name = '', _file_size = 0, _container = false, _access_ file_size: file_size, container: container, directory: container, + type: container ? self.class.container_mime_type : self.class.file_mime_type, provider: 'file_system' } diff --git a/lib/browse_everything/driver/google_drive.rb b/lib/browse_everything/driver/google_drive.rb index 63cecf5f..62d49583 100644 --- a/lib/browse_everything/driver/google_drive.rb +++ b/lib/browse_everything/driver/google_drive.rb @@ -222,6 +222,7 @@ def link_for(id, file_name = '', file_size = 0, container = false, access_token file_name: file_name, file_size: file_size, container: container, + type: container ? self.class.container_mime_type : self.class.file_mime_type, provider: :google_drive, auth_token: access_token, auth_header: auth_header diff --git a/lib/browse_everything/file_entry.rb b/lib/browse_everything/file_entry.rb index f711e4db..41216668 100644 --- a/lib/browse_everything/file_entry.rb +++ b/lib/browse_everything/file_entry.rb @@ -29,12 +29,7 @@ def container? end def provider - return @provider unless @provider.nil? - - provider = BrowserFactory.for(name: provider_name) - return BrowseEverything::Driver::Base.new({}) if provider.nil? - - @provider = provider + @provider ||= BrowserFactory.for(name: provider_name) end def mime_type