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,41 @@
1
+ module RailsAdminImageManager
2
+ class ApplicationController < ActionController::Base
3
+
4
+ protect_from_forgery with: :exception
5
+
6
+ before_action :_authenticate!
7
+ before_action :_authorize!
8
+ before_action :_check_permissions
9
+
10
+ def _current_user
11
+ instance_eval(&RailsAdmin::Config.current_user_method)
12
+ end
13
+
14
+ private
15
+
16
+ def _authenticate!
17
+ instance_eval(&RailsAdmin::Config.authenticate_with)
18
+ end
19
+
20
+ def _authorize!
21
+ instance_eval(&RailsAdmin::Config.authorize_with)
22
+ end
23
+
24
+ def _check_permissions(action=:read)
25
+ @authorization_adapter.try(:authorize, action, file_model)
26
+ end
27
+
28
+ def file_model
29
+ RailsAdmin::AbstractModel.new(to_model_name("::RailsAdminImageManager::File"))
30
+ end
31
+
32
+ def to_model_name(param)
33
+ param.split('~').collect(&:camelize).join('::')
34
+ end
35
+
36
+ def filter_by?(param)
37
+ params[param].present?
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,8 @@
1
+ module RailsAdminImageManager
2
+ class HomeController < RailsAdminImageManager::ApplicationController
3
+
4
+ def index
5
+ redirect_to image_manager_index_path
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,117 @@
1
+ module RailsAdminImageManager
2
+ class ImagesController < RailsAdminImageManager::ApplicationController
3
+
4
+ def index
5
+ respond_to do |format|
6
+ format.html {
7
+ @tags = RailsAdminImageManager::Tag.with_files
8
+ }
9
+
10
+ format.json {
11
+ images = RailsAdminImageManager::File.select(:id, :name, :image_file_name, :created_at).order(:name).page(params[:page])
12
+ images = images.filter_by_text(params[:search]) if filter_by?(:search)
13
+ images = images.filter_by_tags(params[:tags].map{|i| i.to_i }) if filter_by?(:tags)
14
+ images = images.order_by_date(params[:date]) if filter_by?(:date)
15
+ images = images.order_by_title(params[:title]) if filter_by?(:title)
16
+
17
+ images.each do |image|
18
+ image.src = image.image.url(:index)
19
+ end
20
+
21
+ data = { items: images, total_count: images.total_count, limit_value: images.limit_value, readonly: readonly? }
22
+
23
+ render json: data, methods: [:src, :tags_list], status: :ok
24
+ }
25
+ end
26
+ end
27
+
28
+ def tags
29
+ respond_to do |format|
30
+ format.json {
31
+ tags = RailsAdminImageManager::Tag.with_files
32
+ render json: tags, status: :ok
33
+ }
34
+ end
35
+ end
36
+
37
+ def new
38
+ _check_permissions(:create)
39
+ render json: {msg: 'ok'}, status: :ok
40
+ end
41
+
42
+ def show
43
+ _check_permissions(:update)
44
+
45
+ image = RailsAdminImageManager::File.select(:id, :name, :description, :copyright, :image_file_name).find_by!(id: params[:id])
46
+ image.src = image.image.url(:show)
47
+ image.src_for_wysiwyg = {width: params[:width], height: params[:height]} if filter_by?(:width) && filter_by?(:height)
48
+
49
+ data = { image: image, readonly: readonly? }
50
+
51
+ render json: data, methods: [:src, :src_for_wysiwyg, :tags_list], status: :ok
52
+ end
53
+
54
+ def update
55
+ _check_permissions(:update)
56
+
57
+ my_params = images_params
58
+ image = RailsAdminImageManager::File.find(my_params[:id])
59
+
60
+ # Handling dynamic tag creating when receiving a string
61
+ tags = []
62
+ images_params[:tags].each do |tag_string|
63
+ tags << RailsAdminImageManager::Tag.retrieve_or_create_tag(tag_string)
64
+ end
65
+ my_params[:tags] = tags
66
+
67
+ # Updating image object
68
+ if image.present? && image.update_attributes(my_params)
69
+ render json: image, status: :ok
70
+ else
71
+ render json: image.errors, status: :unprocessable_entity
72
+ end
73
+ end
74
+
75
+ def create
76
+ _check_permissions(:create)
77
+
78
+ my_params = images_params
79
+
80
+ # Handling dynamic tag creating when receiving a string
81
+ tags = []
82
+ images_params[:tags].each do |tag_string|
83
+ tags << RailsAdminImageManager::Tag.retrieve_or_create_tag(tag_string)
84
+ end
85
+ my_params[:tags] = tags
86
+
87
+ image = RailsAdminImageManager::File.new(my_params)
88
+ if image.save()
89
+ render json: image, status: :ok
90
+ else
91
+ render json: image.errors, status: :unprocessable_entity
92
+ end
93
+ end
94
+
95
+ def destroy
96
+ _check_permissions(:destroy)
97
+
98
+ image = RailsAdminImageManager::File.find(params[:id])
99
+ if image.destroy
100
+ render json: image, status: :ok
101
+ else
102
+ render json: image.errors, status: :unprocessable_entity
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def readonly?
109
+ return false if @authorization_adapter.nil?
110
+ !@authorization_adapter.authorized?(:update, file_model)
111
+ end
112
+
113
+ def images_params
114
+ params.require(:image).permit(:id, :name, :description, :copyright, :src, :image_file_name, tags: [])
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,4 @@
1
+ module RailsAdminImageManager
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module RailsAdminImageManager
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module RailsAdminImageManager
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,78 @@
1
+ require 'kaminari'
2
+
3
+ module RailsAdminImageManager
4
+ class File < ApplicationRecord
5
+
6
+ # == Extensions ===========================================================
7
+
8
+ paginates_per RailsAdminImageManager.options[:paginates_per]
9
+
10
+ # == Constants ============================================================
11
+
12
+ # == Attributes ===========================================================
13
+
14
+ has_dynamic_attached_file :image, styles: { show: '680x480', index: '250x250#', rails_admin: '75x75' }, url: '/rails_admin_image_manager/:id/:style/:filename'
15
+
16
+ attr_accessor :src
17
+ attr_accessor :src_for_wysiwyg
18
+
19
+ # == Callbacks ============================================================
20
+ before_validation :decode_base64_image
21
+
22
+ # == Relationships ========================================================
23
+
24
+ has_and_belongs_to_many :tags, class_name: 'RailsAdminImageManager::Tag', join_table: 'image_manager_files_tags', foreign_key: :image_manager_file_id, association_foreign_key: :image_manager_tag_id
25
+
26
+ accepts_nested_attributes_for :tags
27
+ # == Validations ==========================================================
28
+
29
+ validates_presence_of :name
30
+
31
+ validates_attachment :image, presence: true, content_type: { content_type: /\Aimage\/.*\Z/ }
32
+
33
+ # == Scopes ===============================================================
34
+
35
+ scope :filter_by_text, -> (text) { where("image_manager_files.name LIKE ? OR image_manager_files.description LIKE ?", "%#{text}%", "%#{text}%") }
36
+ scope :filter_by_tags, -> (tags) { joins(:tags).where('image_manager_files_tags.image_manager_tag_id IN (?)', tags).distinct }
37
+ scope :order_by_date, -> (term) { order("created_at #{term}") }
38
+ scope :order_by_title, -> (term) { order("name #{term}") }
39
+
40
+ # == Instance Methods =====================================================
41
+
42
+ # To avoid the 500 error when the foreign key constraint fails
43
+ def destroy
44
+ begin
45
+ super
46
+ rescue
47
+ return false
48
+ end
49
+ end
50
+
51
+ def decode_base64_image
52
+ if src.present? && src.include?('data:image')
53
+ new_image = Paperclip.io_adapters.for(src)
54
+ new_image.original_filename = image_file_name
55
+ self.image = new_image
56
+ end
57
+ end
58
+
59
+ def src_for_wysiwyg=(params)
60
+ width = params[:width].to_i
61
+ height = params[:height].to_i
62
+ if width > 0 && height > 0
63
+ @src_for_wysiwyg = image.dynamic_url("#{width}x#{height}")
64
+ else
65
+ @src_for_wysiwyg = image(:rails_admin)
66
+ end
67
+ end
68
+
69
+ def tags_list
70
+ tags.collect { |t| t.name }
71
+ end
72
+
73
+ # == Class Methods ========================================================
74
+
75
+ self.table_name = 'image_manager_files'
76
+
77
+ end
78
+ end
@@ -0,0 +1,41 @@
1
+ module RailsAdminImageManager
2
+ class Tag < ApplicationRecord
3
+
4
+ # == Extensions ===========================================================
5
+
6
+ # == Constants ============================================================
7
+
8
+ # == Attributes ===========================================================
9
+
10
+ # == Callbacks ============================================================
11
+
12
+ # == Relationships ========================================================
13
+
14
+ has_and_belongs_to_many :files, class_name: 'RailsAdminImageManager::File', join_table: 'image_manager_files_tags', foreign_key: :image_manager_tag_id, association_foreign_key: :image_manager_file_id
15
+
16
+ # == Validations ==========================================================
17
+
18
+ validates_presence_of :name
19
+
20
+ validates_uniqueness_of :name
21
+
22
+ # == Scopes ===============================================================
23
+
24
+ scope :with_files, -> { joins(:files).distinct }
25
+
26
+ # == Instance Methods =====================================================
27
+
28
+ # == Class Methods ========================================================
29
+
30
+ self.table_name = 'image_manager_tags'
31
+
32
+ def self.retrieve_or_create_tag(tag_string)
33
+ tag = RailsAdminImageManager::Tag.find_by({name: tag_string})
34
+ if tag.present?
35
+ return tag
36
+ else
37
+ return RailsAdminImageManager::Tag.new({name: tag_string})
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Rails admin image manager</title>
5
+ <%= stylesheet_link_tag "rails_admin_image_manager/application", media: "all" %>
6
+ <%= javascript_include_tag "rails_admin_image_manager/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <script type="text/javascript">
11
+ window.AJAX_ENDPOINT = "<%= root_path %>"
12
+ </script>
13
+ <div id="vue-image-manager" data-default-path="<%= images_path %>"
14
+ <%== (params["CKEditor"].present?) ? "ck-id=\"#{params["CKEditor"]}\" ck-fn=\"#{params["CKEditorFuncNum"]}\"" : '' %>
15
+ <%== (params["selectImage"].present?) ? " ck-selected-image-id=\"#{params["selectImage"]}\"" : '' %>
16
+ <%== (params["inputId"].present?) ? " input-id=\"#{params["inputId"]}\"" : '' %>
17
+ >
18
+ <%= yield %>
19
+ <progress-overlay></progress-overlay>
20
+ <image-insert-overlay></image-insert-overlay>
21
+ <notification-overlay></notification-overlay>
22
+ <confirmation-overlay></confirmation-overlay>
23
+ </div>
24
+
25
+ </body>
26
+ </html>
@@ -0,0 +1,45 @@
1
+ <%= javascript_include_tag 'rails_admin_image_manager/base' %>
2
+
3
+ <%= form.send field.view_helper, field.method_name, field.html_attributes.merge({style: (field.editor_options[:hidden_input]==true ? "visibility:hidden;position:absolute" : "")}) %>
4
+ <%= image_tag field.preview_image_path, style: "padding: 0 0 10px; display: block;", data: {'manager-preview': form.dom_id(field)} %>
5
+
6
+ <%= link_to t(field.value.present? ? 'admin.image_manager_picker.edit' : 'admin.image_manager_picker.browse').capitalize, RailsAdminImageManager.editor[:imageManagerBrowserUrl], class: "btn btn-default js-image-manager-picker-browse" %>
7
+
8
+ <% # The deselect button for rails %>
9
+ <% if field.value.present? && !form.object.class.managed_file_is_mandatory?(field.method_name) %>
10
+ <a class="btn btn-default" data-toggle="button" href="#" onclick="$(this).siblings('[type=checkbox]').click(); $(this).siblings('.toggle').toggle('slow'); jQuery(this).toggleClass('btn-danger btn-info'); return false">
11
+ <i class="icon-black icon-trash"></i>
12
+ <%= t('admin.image_manager_picker.deselect') %>
13
+ </a>
14
+ <%= form.check_box field.delete_method, style: 'display:none;' %>
15
+ <% end %>
16
+
17
+ <% # The deselect button for JS %>
18
+ <% if !field.value.present? && !form.object.class.managed_file_is_mandatory?(field.method_name) %>
19
+ <a id="deselect_<%=form.dom_id(field)%>" style="display:none;" class="btn btn-default js-image-manager-deselect" data-toggle="button" href="#">
20
+ <i class="icon-black icon-trash"></i>
21
+ <%= t('admin.image_manager_picker.deselect') %>
22
+ </a>
23
+ <% end %>
24
+
25
+ <script type="text/javascript">
26
+ $(function(){
27
+ $('#<%=form.dom_id(field)%>_field a.js-image-manager-picker-browse').click(function(e){
28
+ e.preventDefault();
29
+ var input = $('#<%=form.dom_id(field)%>')
30
+ var params = {}
31
+ params.inputId = "<%= form.dom_id(field) %>"
32
+ var url = addQueryString('/admin/image-manager/images', params);
33
+ popup(url, 1105, 500);
34
+ })
35
+ })
36
+
37
+ $(function(){
38
+ $('#<%=form.dom_id(field)%>_field a.js-image-manager-deselect').click(function(e){
39
+ e.preventDefault();
40
+ $('#<%=form.dom_id(field)%>').val('');
41
+ $("[data-manager-preview='<%=form.dom_id(field)%>']").attr('src','data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');
42
+ $('#deselect_<%=form.dom_id(field)%>').hide();
43
+ })
44
+ })
45
+ </script>
@@ -0,0 +1,2 @@
1
+
2
+ <router-view></router-view>
@@ -0,0 +1,87 @@
1
+ RailsAdmin.config do |config|
2
+ config.model RailsAdminImageManager::File do
3
+ navigation_label I18n.t('admin.navigation_label.file')
4
+
5
+ list do
6
+ field :name do
7
+ searchable true
8
+ filterable false
9
+ end
10
+
11
+ field :description do
12
+ visible false
13
+ searchable true
14
+ filterable false
15
+ end
16
+
17
+ field :image do
18
+ thumb_method :rails_admin
19
+ searchable true
20
+ filterable false
21
+ end
22
+
23
+ field :image_file_name do
24
+ visible false
25
+ searchable true
26
+ filterable false
27
+ end
28
+
29
+ field :tags do
30
+ label I18n.t('activerecord.models.rails_admin_image_manager/tag.other')
31
+ searchable [{image_manager_tags: :name}]
32
+ queryable true
33
+ #filterable false
34
+ filterable true
35
+ end
36
+
37
+ # This filter has been commented because there is a bug in Rails Admin when using an enum filterable
38
+ # and a custom searchable param. The search field is treated has a string instead has an enum,
39
+ # which cause RailsAdmin to crash with the following error when selecting multiple tags:
40
+ # undefined method `downcase' for ["27", "24"]:Array
41
+ # rails_admin (1.1.1) lib/rails_admin/adapters/active_record.rb:229:in `build_statement_for_string_or_text'
42
+ #
43
+ # field :image_manager_tag_id, :enum do
44
+ # label I18n.t('activerecord.models.rails_admin_image_manager/tag.other')
45
+ # visible false
46
+ # enum do
47
+ # RailsAdminImageManager::Tag.all.order(:name).map { |c| [c.name, c.id] }
48
+ # end
49
+ # searchable [{image_manager_tags: :id}]
50
+ # filterable true
51
+ # end
52
+ end
53
+
54
+ edit do
55
+ field :url do
56
+ read_only true
57
+ help ''
58
+ visible do
59
+ bindings[:object].id.present?
60
+ end
61
+ pretty_value do
62
+ "<a href='#{bindings[:object].image.url}' target='_blank'>#{bindings[:object].image.url}</a>".html_safe
63
+ end
64
+ end
65
+ field :name
66
+ field :image do
67
+ thumb_method :show
68
+ end
69
+ field :description
70
+ field :copyright
71
+ field :tags do
72
+ nested_form false
73
+ end
74
+ end
75
+
76
+ show do
77
+ field :name
78
+ field :image do
79
+ thumb_method :show
80
+ end
81
+ field :tags
82
+ field :created_at
83
+ field :updated_at
84
+ end
85
+
86
+ end
87
+ end