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