rails_admin_image_manager 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +125 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/config/rails_admin_image_manager_manifest.js +2 -0
  6. data/app/assets/fonts/FontAwesome.otf +0 -0
  7. data/app/assets/fonts/Simple-Line-Icons.eot +0 -0
  8. data/app/assets/fonts/Simple-Line-Icons.svg +1369 -0
  9. data/app/assets/fonts/Simple-Line-Icons.ttf +0 -0
  10. data/app/assets/fonts/Simple-Line-Icons.woff +0 -0
  11. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  12. data/app/assets/fonts/fontawesome-webfont.svg +2671 -0
  13. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/app/assets/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  17. data/app/assets/fonts/glyphicons-halflings-regular.svg +288 -0
  18. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  19. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  20. data/app/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  21. data/app/assets/images/rails_admin_image_manager/image.png +0 -0
  22. data/app/assets/javascripts/rails_admin_image_manager/app-compiled.js.erb +34896 -0
  23. data/app/assets/javascripts/rails_admin_image_manager/app-vue.js +51 -0
  24. data/app/assets/javascripts/rails_admin_image_manager/application.js +17 -0
  25. data/app/assets/javascripts/rails_admin_image_manager/base.js.erb +62 -0
  26. data/app/assets/javascripts/rails_admin_image_manager/ckeditor_plugin.js.erb +58 -0
  27. data/app/assets/javascripts/rails_admin_image_manager/components/confirmationOverlay.vue +69 -0
  28. data/app/assets/javascripts/rails_admin_image_manager/components/imageInsertButton.vue +41 -0
  29. data/app/assets/javascripts/rails_admin_image_manager/components/imageInsertOverlay.vue +92 -0
  30. data/app/assets/javascripts/rails_admin_image_manager/components/imageListing.vue +167 -0
  31. data/app/assets/javascripts/rails_admin_image_manager/components/imageShow.vue +112 -0
  32. data/app/assets/javascripts/rails_admin_image_manager/components/imageTagSelector.vue +94 -0
  33. data/app/assets/javascripts/rails_admin_image_manager/components/imageUpload.vue +94 -0
  34. data/app/assets/javascripts/rails_admin_image_manager/components/listingFilter.vue +32 -0
  35. data/app/assets/javascripts/rails_admin_image_manager/components/notificationOverlay.vue +47 -0
  36. data/app/assets/javascripts/rails_admin_image_manager/components/progressOverlay.vue +37 -0
  37. data/app/assets/javascripts/rails_admin_image_manager/components/searchAutocomplete.vue +140 -0
  38. data/app/assets/javascripts/rails_admin_image_manager/editor/image_manager_picker.js.erb +41 -0
  39. data/app/assets/javascripts/rails_admin_image_manager/filters/index.js +7 -0
  40. data/app/assets/javascripts/rails_admin_image_manager/libs/helpers.js +13 -0
  41. data/app/assets/javascripts/rails_admin_image_manager/libs/lazyload.js +63 -0
  42. data/app/assets/javascripts/rails_admin_image_manager/router/index.js +55 -0
  43. data/app/assets/javascripts/rails_admin_image_manager/stores/ckeditor.js +25 -0
  44. data/app/assets/javascripts/rails_admin_image_manager/stores/index.js +16 -0
  45. data/app/assets/javascripts/rails_admin_image_manager/stores/medias.js +342 -0
  46. data/app/assets/javascripts/rails_admin_image_manager/stores/overlay.js +57 -0
  47. data/app/assets/javascripts/rails_admin_image_manager/stores/railsAdmin.js +28 -0
  48. data/app/assets/javascripts/rails_admin_image_manager/vendors/fuse.min.js +9 -0
  49. data/app/assets/javascripts/rails_admin_image_manager/vendors/oneui.min.js +8 -0
  50. data/app/assets/javascripts/rails_admin_image_manager/vendors/underscore.min.js +6 -0
  51. data/app/assets/stylesheets/rails_admin_image_manager/_font.scss +2845 -0
  52. data/app/assets/stylesheets/rails_admin_image_manager/application.css +16 -0
  53. data/app/assets/stylesheets/rails_admin_image_manager/global.css.erb +3723 -0
  54. data/app/assets/stylesheets/rails_admin_image_manager/global.sass +1 -0
  55. data/app/assets/stylesheets/rails_admin_image_manager/vendors/bootstrap.min.css +5 -0
  56. data/app/assets/stylesheets/rails_admin_image_manager/vendors/oneui.css +8865 -0
  57. data/app/controllers/rails_admin_image_manager/application_controller.rb +41 -0
  58. data/app/controllers/rails_admin_image_manager/home_controller.rb +8 -0
  59. data/app/controllers/rails_admin_image_manager/images_controller.rb +117 -0
  60. data/app/helpers/rails_admin_image_manager/application_helper.rb +4 -0
  61. data/app/jobs/rails_admin_image_manager/application_job.rb +4 -0
  62. data/app/models/rails_admin_image_manager/application_record.rb +5 -0
  63. data/app/models/rails_admin_image_manager/file.rb +78 -0
  64. data/app/models/rails_admin_image_manager/tag.rb +41 -0
  65. data/app/views/layouts/rails_admin_image_manager/application.html.erb +26 -0
  66. data/app/views/rails_admin/main/_form_image_manager_picker.html.erb +45 -0
  67. data/app/views/rails_admin_image_manager/images/index.html.erb +2 -0
  68. data/config/initializers/rails_admin/image_manager_file.rb +87 -0
  69. data/config/initializers/rails_admin/image_manager_tag.rb +22 -0
  70. data/config/locales/rails_admin_image_manager.en.yml +33 -0
  71. data/config/locales/rails_admin_image_manager.fr.yml +33 -0
  72. data/config/routes.rb +12 -0
  73. data/db/migrate/20170626000000_create_image_manager.rb +37 -0
  74. data/lib/dynamic_paperclip_patch.rb +92 -0
  75. data/lib/generators/rails_admin_image_manager/install/install_generator.rb +22 -0
  76. data/lib/paperclip_patch.rb +22 -0
  77. data/lib/rails_admin_image_manager.rb +46 -0
  78. data/lib/rails_admin_image_manager/engine.rb +36 -0
  79. data/lib/rails_admin_image_manager/has_managed_file.rb +47 -0
  80. data/lib/rails_admin_image_manager/rails_admin/config/fields/types/image_manager_picker.rb +49 -0
  81. data/lib/rails_admin_image_manager/version.rb +3 -0
  82. data/lib/tasks/rails_admin_image_manager_tasks.rake +4 -0
  83. metadata +253 -0
@@ -0,0 +1,22 @@
1
+ RailsAdmin.config do |config|
2
+ config.model RailsAdminImageManager::Tag do
3
+ navigation_label I18n.t('admin.navigation_label.tag')
4
+
5
+ list do
6
+ field :name do
7
+ filterable false
8
+ end
9
+ end
10
+
11
+ edit do
12
+ field :name
13
+ end
14
+
15
+ show do
16
+ field :name
17
+ field :created_at
18
+ field :updated_at
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,33 @@
1
+ en:
2
+ admin:
3
+ navigation_label:
4
+ file: Image manager
5
+ tag: Image manager
6
+ image_manager_picker:
7
+ browse: Select or upload an image
8
+ edit: Select or upload an other image
9
+ deselect: Deselect this image
10
+
11
+ activerecord:
12
+ models:
13
+ rails_admin_image_manager/file:
14
+ one: Image
15
+ other: Images
16
+ rails_admin_image_manager/tag:
17
+ one: Tag
18
+ other: Tags
19
+
20
+ attributes:
21
+ rails_admin_image_manager/file:
22
+ url: URL
23
+ name: Title
24
+ description: Description
25
+ copyright: Copyright (author)
26
+ image: Image
27
+ tags: Tags
28
+ created_at: Creation date
29
+ updated_at: Last modification date
30
+ rails_admin_image_manager/tag:
31
+ name: Tag
32
+ created_at: Creation date
33
+ updated_at: Last modification date
@@ -0,0 +1,33 @@
1
+ fr:
2
+ admin:
3
+ navigation_label:
4
+ file: Gestionnaire d'images
5
+ tag: Gestionnaire d'images
6
+ image_manager_picker:
7
+ browse: Sélectionner ou télécharger une image
8
+ edit: Sélectionner ou télécharger une autre image
9
+ deselect: Désélectionner cette image
10
+
11
+ activerecord:
12
+ models:
13
+ rails_admin_image_manager/file:
14
+ one: Image
15
+ other: Images
16
+ rails_admin_image_manager/tag:
17
+ one: Étiquette
18
+ other: Étiquettes
19
+
20
+ attributes:
21
+ rails_admin_image_manager/file:
22
+ url: URL
23
+ name: Titre
24
+ description: Description
25
+ copyright: Droits (auteur)
26
+ image: Image
27
+ tags: Étiquettes
28
+ created_at: Date de création
29
+ updated_at: Date de dernière modification
30
+ rails_admin_image_manager/tag:
31
+ name: Étiquette
32
+ created_at: Date de création
33
+ updated_at: Date de dernière modification
data/config/routes.rb ADDED
@@ -0,0 +1,12 @@
1
+ RailsAdminImageManager::Engine.routes.draw do
2
+
3
+ root 'home#index'
4
+ get '/tags' => 'images#tags', as: 'image_manager_tag_index'
5
+ get '/images' => 'images#index', as: 'image_manager_index'
6
+ get '/images/new' => 'images#new'
7
+ get '/images/:id' => 'images#show'
8
+ put '/images' => 'images#update'
9
+ post '/images' => 'images#create'
10
+ delete '/images' => 'images#destroy'
11
+
12
+ end
@@ -0,0 +1,37 @@
1
+ class CreateImageManager < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :image_manager_files do |t|
4
+ t.string :name, null: false
5
+ t.text :description
6
+ t.string :copyright
7
+ t.string :image_file_name
8
+ t.string :image_content_type
9
+ t.integer :image_file_size
10
+ t.datetime :image_updated_at
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ # ---------------------------------------------
16
+
17
+ create_table :image_manager_tags do |t|
18
+ t.string :name, null: false
19
+
20
+ t.timestamps
21
+ end
22
+
23
+ add_index :image_manager_tags, :name, unique: true
24
+
25
+ # ---------------------------------------------
26
+
27
+ create_join_table :image_manager_files, :image_manager_tags do |t|
28
+ t.integer :image_manager_file_id
29
+ t.integer :image_manager_tag_id
30
+ end
31
+
32
+ execute "ALTER TABLE image_manager_files_tags ADD PRIMARY KEY (image_manager_file_id, image_manager_tag_id)"
33
+
34
+ add_foreign_key :image_manager_files_tags, :image_manager_files, on_update: :cascade, on_delete: :cascade
35
+ add_foreign_key :image_manager_files_tags, :image_manager_tags, on_update: :cascade, on_delete: :cascade
36
+ end
37
+ end
@@ -0,0 +1,92 @@
1
+ module DynamicPaperclip
2
+ # Patch to avoid the following error :
3
+ # actionpack-5.1.4/lib/action_dispatch/middleware/stack.rb:35:in `build': undefined method `new' for "DynamicPaperclip::AttachmentStyleGenerator":String (NoMethodError). Did you mean? next
4
+ # https://github.com/mbouchard/dynamic_paperclip/commit/ad6c209cdd08efb202140faaa6aa647987726409
5
+ class Railtie < Rails::Railtie
6
+ initializer 'dynamic_paperclip_patch.insert_middleware' do |app|
7
+ app.config.middleware.use DynamicPaperclip::AttachmentStyleGenerator
8
+ end
9
+
10
+ config.before_configuration do
11
+ initializers.delete_if do |initializer|
12
+ true if initializer.name == 'dynamic_paperclip.insert_middleware'
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ module DynamicPaperclip
19
+ class Attachment < Paperclip::Attachment
20
+ def dynamic_url(definition)
21
+ raise DynamicPaperclip::Errors::SecretNotSet, "No secret has been configured. Please run the dynamic_paperclip:install generator." unless DynamicPaperclip.config.secret.present?
22
+
23
+ style_name = StyleNaming.dynamic_style_name_from_definition(definition)
24
+
25
+ url = url(style_name)
26
+
27
+ # iXmedia
28
+ # Fix to avoid url with 2 "?" when timestamp is used in paperclip
29
+ # Ex: "/system/rails_admin_image_manager/files/images/000/000/001/dynamic_10x10/test.jpg?1498751741?s=c3ac6269a728f8e9a8d625ef84455a082bdd3bbf
30
+ # delimiter_char = url.match(/\?.+=/) ? '&' : '?'
31
+ delimiter_char = url.match(/\?/) ? '&' : '?'
32
+
33
+ "#{url}#{delimiter_char}s=#{UrlSecurity.generate_hash(style_name)}"
34
+ end
35
+ end
36
+ end
37
+
38
+ require 'action_dispatch/http/response.rb'
39
+
40
+ module DynamicPaperclip
41
+ class AttachmentStyleGenerator
42
+
43
+ def call(env)
44
+ request = Rack::Request.new(env)
45
+
46
+ DynamicPaperclip::AttachmentRegistry.each_definition do |klass, name, options|
47
+ if match = regexp_for_attachment_url(klass, (options[:url] || Attachment.default_options[:url])).match(request.path)
48
+ id = id_from_partition(match[:id])
49
+ attachment = klass.find(id).send(name)
50
+
51
+ # iXmedia
52
+ # Fix to avoid error: uninitialized constant ActionController::DataStreaming::FileBody
53
+ # When the filename is wrong
54
+ # Return a 404 instead
55
+ if !attachment.exists? || attachment.original_filename != URI.unescape(match[:filename])
56
+ return [404, {}, []]
57
+ end
58
+
59
+ # The definition will be escaped twice in the URL, so we need to unescape it once.
60
+ # We should always reference dynamic style names after escaping once - that's how they reside on the FS.
61
+ style_name = StyleNaming.dynamic_style_name_from_definition(CGI.unescape(match[:definition]), false)
62
+
63
+ # Validate URL hash against requested style name
64
+ if DynamicPaperclip::UrlSecurity.valid_hash?(request.params['s'], style_name)
65
+
66
+ # Only process style if it doesn't exist,
67
+ # otherwise we may just be fielding a request for
68
+ # an existing style
69
+ attachment.process_dynamic_style style_name unless attachment.exists?(style_name)
70
+
71
+ return [
72
+ 200,
73
+ {
74
+ 'Content-Type' => attachment.content_type,
75
+ 'Content-Transfer-Encoding' => 'binary',
76
+ 'Content-Disposition' => "inline; filename=#{File.basename(attachment.path(style_name))}"
77
+ },
78
+ ActionDispatch::Response::FileBody.new(attachment.path(style_name))
79
+ ]
80
+ else
81
+ # Invalid hash, just 403
82
+
83
+ return [403, {}, []]
84
+ end
85
+ end
86
+ end
87
+
88
+ @app.call env
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,22 @@
1
+ require 'rails/generators'
2
+ module RailsAdminImageManager
3
+ module Generators
4
+ class InstallGenerator < Rails::Generators::Base
5
+
6
+ # desc "Installs RailsAdminImageManager into your app. Get wealthy."
7
+
8
+ def setup_route
9
+ route "mount RailsAdminImageManager::Engine => '/admin/image-manager', as: 'image_manager'"
10
+ end
11
+
12
+ def create_migrations
13
+ rake "rails_admin_image_manager:install:migrations"
14
+ end
15
+
16
+ def configure_dynamic_paperclip
17
+ generate "dynamic_paperclip:install"
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # We will replace every underscores (_) in the filename for a hyphen (-)
2
+ # This must be done in a patch because Paperclip has hardcoded that all :restricted_characters
3
+ # will be replaced by an underscore in the FilenameCleaner class: https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/filename_cleaner.rb
4
+ # For this reason, we can't add the underscore char to the :restricted_characters config.
5
+
6
+ module Paperclip
7
+ class FilenameCleaner
8
+ def call(filename)
9
+ # Dirty hack to keep the dot in the filename (it's removed by the parameterize function)
10
+ placeholder = '-p-l-a-c-e-h-o-l-d-e-r-'
11
+ filename.sub!('.', placeholder)
12
+ filename = filename.parameterize()
13
+ filename.sub!(placeholder, '.')
14
+
15
+ if @invalid_character_regex
16
+ filename = filename.gsub(@invalid_character_regex, "_").gsub("_", "-")
17
+ else
18
+ filename
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,46 @@
1
+ require "rails_admin_image_manager/rails_admin/config/fields/types/image_manager_picker"
2
+ require "rails_admin_image_manager/has_managed_file"
3
+ require "rails_admin_image_manager/engine"
4
+
5
+ module RailsAdminImageManager
6
+ extend ActiveSupport::Autoload
7
+
8
+ # configuration for picker
9
+ mattr_accessor :placeholder_image
10
+ @@placeholder_image = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" # a transparent pixel
11
+
12
+ mattr_accessor :hidden_input
13
+ @@hidden_input = true
14
+ # end configuration for picker
15
+
16
+ # Configuration defaults (these map directly to ckeditor settings)
17
+ mattr_accessor :editor
18
+ @@editor = {
19
+ imageManagerBrowserUrl: '/admin/image_manager/',
20
+ }
21
+ # End configuration defaults
22
+
23
+ mattr_accessor :paginates_per
24
+ @@paginates_per = 15
25
+
26
+ def self.options(overrides={})
27
+ # merge in editor settings configured elsewhere
28
+
29
+ base = {
30
+ placeholder_image: self.placeholder_image,
31
+ hidden_input: self.hidden_input,
32
+ paginates_per: self.paginates_per
33
+ }
34
+ editor_options = self.editor.merge(base)
35
+
36
+ # merge in local overrides
37
+ editor_options.merge!(overrides) if overrides
38
+
39
+ editor_options
40
+ end
41
+
42
+ end
43
+
44
+ ActiveSupport.on_load(:active_record) do
45
+ extend RailsAdminImageManager::HasManagedFile
46
+ end
@@ -0,0 +1,36 @@
1
+ require 'paperclip'
2
+ require 'paperclip_patch'
3
+ require 'dynamic_paperclip'
4
+ require 'dynamic_paperclip_patch'
5
+
6
+ module RailsAdminImageManager
7
+ class Engine < ::Rails::Engine
8
+ isolate_namespace RailsAdminImageManager
9
+
10
+ initializer :add_to_precompile do |app|
11
+ app.config.assets.precompile += %w( rails_admin_image_manager/base.js.erb )
12
+ end
13
+
14
+ initializer :reload_rails_admin_configs do |app|
15
+ Rails.application.config.to_prepare do
16
+ RailsAdmin::ApplicationController.class_eval do
17
+ before_action :reload_rails_admin_image_manager, if: :reload_rails_image_manager? # Reloading RailsAdmin Config Automatically
18
+
19
+ def reload_rails_admin_image_manager
20
+ gem_dir = Gem::Specification.find_by_name("rails_admin_image_manager").gem_dir
21
+
22
+ Dir.foreach("#{gem_dir}/config/initializers/rails_admin") do |item|
23
+ next if item == '.' or item == '..'
24
+ load("#{gem_dir}/config/initializers/rails_admin/#{item}")
25
+ end
26
+ end
27
+
28
+ def reload_rails_image_manager?
29
+ Rails.env.development?
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,47 @@
1
+ module RailsAdminImageManager
2
+ module HasManagedFile
3
+
4
+ def has_managed_file(attribute, id, options={})
5
+ var_options_name = "@has_managed_file_#{attribute}_options"
6
+ var_options_value = instance_variable_get(var_options_name)
7
+
8
+ # If the same attribute is passed twice, we'll skip it
9
+ if var_options_value.nil?
10
+ instance_variable_set(var_options_name, options)
11
+
12
+ add_managed_file_belongs_to(attribute)
13
+ add_managed_file_validates_presence_of(id) if managed_file_options_mandatory(options)
14
+ add_managed_file_before_validation(attribute, id) unless managed_file_options_mandatory(options)
15
+ end
16
+ end
17
+
18
+ def managed_file_is_mandatory?(attribute)
19
+ validators_on(attribute).any?{|validator| validator.kind_of?(ActiveModel::Validations::PresenceValidator)}
20
+ end
21
+
22
+ private
23
+
24
+ def managed_file_options_mandatory(options)
25
+ options.key?(:mandatory) && options[:mandatory] == true ? true : false
26
+ end
27
+
28
+ def add_managed_file_belongs_to(attribute)
29
+ belongs_to attribute, class_name: "RailsAdminImageManager::File"
30
+ end
31
+
32
+ def add_managed_file_validates_presence_of(id)
33
+ validates_presence_of id
34
+ end
35
+
36
+ def add_managed_file_before_validation(attribute, id)
37
+ attr_accessor "#{id}_deselect"
38
+
39
+ define_method "#{id}_deselect=" do |val|
40
+ attribute_will_change!("#{id}_deselect") if val == '1'
41
+ instance_variable_set("@#{id}_deselect", val)
42
+ end
43
+
44
+ before_validation { send("#{attribute}=", nil) if send("#{id}_deselect") == '1' }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,49 @@
1
+ #require 'rails_admin/config/fields/types/string'
2
+ module RailsAdmin::Config::Fields::Types
3
+ class ImageManagerPicker < RailsAdmin::Config::Fields::Base
4
+ RailsAdmin::Config::Fields::Types::register(:image_manager_picker, self)
5
+
6
+ register_instance_option(:config) do
7
+ {}
8
+ end
9
+
10
+ register_instance_option(:partial) do
11
+ :form_image_manager_picker
12
+ end
13
+
14
+ register_instance_option(:delete_method) do
15
+ "#{name}_deselect"
16
+ end
17
+
18
+ register_instance_option :allowed_methods do
19
+ [method_name, delete_method].compact
20
+ end
21
+
22
+ def editor_options
23
+ RailsAdminImageManager.options(config)
24
+ end
25
+
26
+ def preview_image_path
27
+ if value.to_s.html_safe != ""
28
+ if (true if Float(value) rescue false)
29
+ # if the value is numeric we assume its an object id
30
+ # Check if the id exist otherwise show placeholder image
31
+ if RailsAdminImageManager::File.exists?(value)
32
+ image_manager_file = RailsAdminImageManager::File.find(value)
33
+ image_manager_file.image.url(:rails_admin)
34
+ else
35
+ editor_options[:placeholder_image]
36
+ end
37
+ else
38
+ # if not, we assume its a url
39
+ value.to_s
40
+ end
41
+ else
42
+ # no value, show placeholder image
43
+ editor_options[:placeholder_image]
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+ end