activeadmin-dropzone 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 74480bcea1a316b00f4b781c897db8ae2d634437
4
- data.tar.gz: f96b7231b674a67d5a49dc08eed023f24f5103f6
3
+ metadata.gz: 79023d46a4a0bd3ac710587deeeb8aeeeb1a35f7
4
+ data.tar.gz: e6751d2a887c04f89711d514f7ef5fbd9af57d4c
5
5
  SHA512:
6
- metadata.gz: 58682aa89a27c13bf4ed1f19874e31425ca4adc35b9b464955bd9660c726d0bf50a47eb51b3e51540ca089512585d42363842567e97fc10129222e6b331071a0
7
- data.tar.gz: 25d7736c92bc3e4f47ec30649577fee5e0026d62534d5c4cac91f4a3f267abbc2017509f6f2f5b9c77d5c2326f9a306baa2b14964ca4b2e60f67c1c290a01db7
6
+ metadata.gz: 08cf6b8bcbd6ca7cb758909e0fbe3abc2d2f0d11d32fbaf8696cb55cf9784aa992640fb046a02a2bf6a5ffff45dc3b98fb8e1e8df208a31fbba9b5d8d10f2f1b
7
+ data.tar.gz: 244efdb55a81efa871450bc96930d98eef45e8ce326cf349c1828cd214339a3b1dd5c88ad7c1c28b7650dba61115487a152b14a215b3444c055f7dcc8190404a
data/.DS_Store CHANGED
Binary file
data/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # activeadmin-dropzone
2
+
3
+ Easy to use integration of drag&drop files upload via [dropzone.js](http://www.dropzonejs.com) for [ActiveAdmin](http://www.activeadmin.info).
4
+
5
+ ## Requirements
6
+
7
+ * [ActiveAdmin](http://www.activeadmin.info);
8
+ * [Paperclip](https://github.com/thoughtbot/paperclip) gem;
9
+ * ActiveRecord;
10
+ * Separate models for file's container and files.
11
+
12
+ ## Install
13
+
14
+ Add line to your Gemfile:
15
+
16
+ gem 'activeadmin-dropzone', '~> 0.2.1'
17
+
18
+ Add `dropzone` to your file container's class:
19
+
20
+ class Post
21
+ dropzone :images
22
+ end
23
+
24
+ Add `dropzone_item` to your file's class:
25
+
26
+ class Image
27
+ dropzone_item
28
+ end
29
+
30
+ Add `input` to your ActiveAdmin form:
31
+
32
+ f.input :images, as: :dropzone
33
+
34
+ ## Configuration
35
+
36
+ You can customize columns used for upload by passing `Hash` to the `dropzone_item` method. Here are the default values:
37
+
38
+ dropzone_item title: :title,
39
+ position: :position,
40
+ data: :data,
41
+ file_size: :file_size,
42
+ url: :url
43
+
44
+ ## Contributing to activeadmin-dropzone
45
+
46
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
47
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
48
+ * Fork the project.
49
+ * Start a feature/bugfix branch.
50
+ * Commit and push until you are happy with your contribution.
51
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
52
+
53
+ ## Copyright
54
+
55
+ Copyright (c) 2014 Maxim Gladkov. See LICENSE.txt for
56
+ further details.
data/Rakefile CHANGED
@@ -15,10 +15,10 @@ require 'jeweler'
15
15
  Jeweler::Tasks.new do |gem|
16
16
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
17
  gem.name = "activeadmin-dropzone"
18
- gem.homepage = "http://github.com/maximgladkov/activeadmin-dropzone"
18
+ gem.homepage = "http://maximgladkov.com/blog/activeadmin-dropzone-gem"
19
19
  gem.license = "MIT"
20
- gem.summary = %Q{Gem adds support of dropzone.js for ActiveAdmin}
21
- gem.email = "maksim.gladkov@gmail.com"
20
+ gem.summary = %Q{Easy to use integration of drag&drop files upload via dropzone.js for ActiveAdmin}
21
+ gem.email = "contact@maximgladkov.com"
22
22
  gem.authors = ["Maxim Gladkov"]
23
23
  # dependencies defined in Gemfile
24
24
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.1
@@ -5,15 +5,15 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "activeadmin-dropzone"
8
- s.version = "0.1.1"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Maxim Gladkov"]
12
- s.date = "2014-01-14"
13
- s.email = "maksim.gladkov@gmail.com"
12
+ s.date = "2014-02-25"
13
+ s.email = "contact@maximgladkov.com"
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE.txt",
16
- "README.rdoc"
16
+ "README.md"
17
17
  ]
18
18
  s.files = [
19
19
  ".DS_Store",
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  "Gemfile",
22
22
  "Gemfile.lock",
23
23
  "LICENSE.txt",
24
- "README.rdoc",
24
+ "README.md",
25
25
  "Rakefile",
26
26
  "VERSION",
27
27
  "activeadmin-dropzone.gemspec",
@@ -36,18 +36,21 @@ Gem::Specification.new do |s|
36
36
  "app/helpers/active_admin/views_helper.rb",
37
37
  "app/inputs/dropzone_input.rb",
38
38
  "app/views/application/_dropzone.html.erb",
39
+ "config/locales/en.yml",
40
+ "config/locales/ru.yml",
39
41
  "config/routes.rb",
42
+ "lib/.DS_Store",
40
43
  "lib/activeadmin-dropzone.rb",
41
44
  "lib/activeadmin-dropzone/active_record/dropzone.rb",
42
45
  "lib/activeadmin-dropzone/engine.rb",
43
46
  "test/helper.rb",
44
47
  "test/test_activeadmin-dropzone.rb"
45
48
  ]
46
- s.homepage = "http://github.com/maximgladkov/activeadmin-dropzone"
49
+ s.homepage = "http://maximgladkov.com/blog/activeadmin-dropzone-gem"
47
50
  s.licenses = ["MIT"]
48
51
  s.require_paths = ["lib"]
49
52
  s.rubygems_version = "2.0.3"
50
- s.summary = "Gem adds support of dropzone.js for ActiveAdmin"
53
+ s.summary = "Easy to use integration of drag&drop files upload via dropzone.js for ActiveAdmin"
51
54
 
52
55
  if s.respond_to? :specification_version then
53
56
  s.specification_version = 4
@@ -1,6 +1,9 @@
1
1
  //= require dropzone
2
2
 
3
3
  .dropzone {
4
+ margin: 10px 20px;
5
+ border: 1px solid #ccc;
6
+
4
7
  a {
5
8
  text-decoration: none;
6
9
  font-size: 13px;
@@ -26,6 +29,13 @@
26
29
  }
27
30
  }
28
31
 
32
+ .dropzone-hint {
33
+ margin: 0 0 0 20px;
34
+ font-size: 0.95em;
35
+ font-style: italic;
36
+ color: #666;
37
+ }
38
+
29
39
  .sortable-placeholder {
30
40
  position: relative;
31
41
  display: inline-block;
@@ -3,7 +3,8 @@ class DropzoneController < ApplicationController
3
3
  def upload
4
4
  dropzone_class = params[:dropzone_class].constantize
5
5
  dropzone_object = dropzone_class.new
6
- dropzone_object.send "#{ dropzone_class.dropzone_field }=", params[:file]
6
+ dropzone_object.send "#{ dropzone_class.dropzone_field(:type) }=", params[:dropzonable_class] if dropzone_class.dropzone_field?(:type)
7
+ dropzone_object.send "#{ dropzone_class.dropzone_field(:data) }=", params[:file]
7
8
 
8
9
  if dropzone_object.save
9
10
  render json: dropzone_object.to_json
@@ -1,11 +1,18 @@
1
1
  module ActiveAdmin::ViewsHelper
2
2
 
3
3
  def render_mock_dropzone_files(dropzone_objects)
4
- unless dropzone_objects.empty?
5
- dropzone_objects.map do |dropzone_object|
6
- "{ id: #{ dropzone_object.id }, name: '#{ dropzone_object.send dropzone_object.class.dropzone_title_field }', size: #{ dropzone_object.send dropzone_object.class.dropzone_file_size_field }, url: '#{ dropzone_object.send dropzone_object.class.dropzone_url_field }' }"
7
- end.join(', ').html_safe
8
- end
4
+ dropzone_objects.map do |dropzone_object|
5
+ {
6
+ id: dropzone_object.id,
7
+ name: dropzone_object.send(dropzone_object.class.dropzone_field(:title)),
8
+ size: dropzone_object.send(dropzone_object.class.dropzone_field(:file_size)),
9
+ url: dropzone_object.send(dropzone_object.class.dropzone_field(:url))
10
+ }
11
+ end.map do |hash|
12
+ hash.map{ |(k, v)| "#{ k }: '#{ v }'" }.join(',')
13
+ end.map do |string|
14
+ "{#{ string }}"
15
+ end.join(', ').html_safe
9
16
  end
10
17
 
11
18
  end
@@ -1,38 +1,39 @@
1
- <div id="dropzone_<%= method %>_<%= cycle(*(1..999).to_a, name: method) %>" class="dropzone" style="margin: 10px 20px; border: 1px solid #ccc">
2
- <span class="notice">Перетащите сюда файлы или нажмите для загрузки</span>
3
- <input type="hidden" name="<%= object.class.to_s.downcase %>[<%= method %>_attributes][-1]" value="" />
1
+ <div id="dropzone_<%= method %>_<%= cycle(*(1..999).to_a, name: method) %>" class="dropzone">
2
+ <span class="notice"><%=t 'dropzone.drag_or_click' %></span>
3
+ <%= hidden_field_tag "#{ object.class.model_name.singular }[#{ method }_attributes][-1]", "" %>
4
4
  <% object.send(method).each_with_index do |dropzone_object, index| %>
5
- <input type="hidden" name="<%= object.class.to_s.downcase %>[<%= method %>_attributes][<%= dropzone_object.id %>][<%= object.class.dropzone_title_field %>]" value="<%= dropzone_object.send(object.class.dropzone_title_field) %>" />
5
+ <%= hidden_field_tag "#{ object.class.model_name.singular }[#{ method }_attributes][#{ dropzone_object.id }][#{ object.class.send("dropzone_#{ method }_field", :title) }]", dropzone_object.send(object.class.send("dropzone_#{ method }_field", :title)) %>
6
6
  <% end %>
7
7
  </div>
8
8
 
9
9
  <% unless options[:hint].blank? %>
10
- <p class="inline-hints" style="margin: 0 0 0 20px; font-size: 0.95em; font-style: italic; color: #666;"><%= options[:hint] %></p>
10
+ <p class="inline-hints dropzone-hint"><%= options[:hint] %></p>
11
11
  <% end %>
12
12
 
13
13
  <script>
14
14
  (function() {
15
- var mockFiles = [<%= render_mock_dropzone_files(object.send(method)) %>];
16
15
  Dropzone.autoDiscover = false;
16
+
17
+ var mockFiles = [<%= render_mock_dropzone_files(object.send(method)) %>];
17
18
  var dropzone_id = "#dropzone_<%= method %>_<%= current_cycle(method) %>";
18
19
  var dropzone = new Dropzone(dropzone_id, {
19
- url: '<%= upload_dropzone_path(dropzone_class: method.to_s.classify) %>',
20
+ url: '<%= upload_dropzone_path(dropzonable_class: object.class, dropzone_class: object.class.send("dropzone_#{ method }_class")) %>',
20
21
  addRemoveLinks: true,
21
- dictCancelUpload: 'Отменить',
22
- dictRemoveFile: 'Удалить',
22
+ dictCancelUpload: '<%=t "dropzone.cancel" %>',
23
+ dictRemoveFile: '<%=t "dropzone.remove" %>',
23
24
  maxFiles: <%= defined?(max_files) ? '1' : 'null' %>,
24
25
  sending: function(file, xhr, formData) {
25
26
  xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').prop('content'));
26
27
  },
27
28
  success: function(file, data) {
28
- $(dropzone_id).append('<input type="hidden" name="<%= object.class.to_s.downcase %>[<%= method %>_attributes][' + data.id + '][<%= object.class.dropzone_title_field %>]" value="" />');
29
+ $(dropzone_id).append('<input type="hidden" name="<%= object.class.model_name.singular %>[<%= method %>_attributes][' + data.id + '][<%= object.class.send("dropzone_#{ method }_field", :title) %>]" value="" />');
29
30
  $(file.previewElement).attr('data-id', data.id);
30
31
  $(file.previewElement).attr('data-url', data.url);
31
32
  return file.previewElement.classList.add("dz-success");
32
33
  },
33
34
  removedfile: function(file) {
34
- $(dropzone_id + ' input[name="<%= object.class.to_s.downcase %>[images_attributes][' + file.id + '][<%= object.class.dropzone_title_field %>]"]').remove();
35
- $(dropzone_id + ' input[name="<%= object.class.to_s.downcase %>[images_attributes][' + file.id + '][<%= object.class.dropzone_position_field %>]"]').remove();
35
+ $(dropzone_id + ' input[name="<%= object.class.model_name.singular %>[images_attributes][' + file.id + '][<%= object.class.send("dropzone_#{ method }_field", :title) %>]"]').remove();
36
+ $(dropzone_id + ' input[name="<%= object.class.model_name.singular %>[images_attributes][' + file.id + '][<%= object.class.send("dropzone_#{ method }_field", :position) %>]"]').remove();
36
37
  $(file.previewElement).remove();
37
38
  $(dropzone_id).sortable('refresh');
38
39
  }
@@ -48,8 +49,9 @@
48
49
  $(file.previewElement).attr('data-id', file.id);
49
50
 
50
51
  $(file.previewElement).find('.dz-filename, img').on('click', function() {
51
- var input = $(dropzone_id + ' input[name="<%= object.class.to_s.downcase %>[<%= method %>_attributes][' + file.id + '][<%= object.class.dropzone_title_field %>]"]');
52
- var title = prompt("Название изображения: ", $(file.previewElement).find('.dz-filename span').text());
52
+ var id = $(this).parents('.dz-preview:first').attr('data-id');
53
+ var input = $(dropzone_id + ' input[name="<%= object.class.model_name.singular %>[<%= method %>_attributes][' + id + '][<%= object.class.send("dropzone_#{ method }_field", :title) %>]"]');
54
+ var title = prompt("<%=t 'dropzone.title' %>: ", $(file.previewElement).find('.dz-filename span').text());
53
55
  $(file.previewElement).find('.dz-filename span').text(title);
54
56
  input.val(title);
55
57
  });
@@ -59,7 +61,7 @@
59
61
  var position = 0;
60
62
  $(dropzone_id + ' .dz-preview').each(function() {
61
63
  var id = $(this).attr('data-id');
62
- $(dropzone_id).append('<input type="hidden" name="<%= object.class.to_s.downcase %>[<%= method %>_attributes][' + id + '][<%= object.class.dropzone_position_field %>]" value="' + (position++) + '" />');
64
+ $(dropzone_id).append('<input type="hidden" name="<%= object.class.model_name.singular %>[<%= method %>_attributes][' + id + '][<%= object.class.send("dropzone_#{ method }_field", :position) %>]" value="' + (position++) + '" />');
63
65
  });
64
66
  };
65
67
 
@@ -76,7 +78,7 @@
76
78
 
77
79
  $('form').submit(function(e) {
78
80
  if (dropzone.getQueuedFiles().length > 0 || dropzone.getUploadingFiles().length > 0) {
79
- if (confirm("Некоторые файлы еще не загрузились на сервер. Вы действительно хотите сохранить без них?") == true) {
81
+ if (confirm("<%=t 'dropzone.are_you_sure' %>") == true) {
80
82
  generate_dropzone_position_elements();
81
83
  } else {
82
84
  e.preventDefault();
@@ -0,0 +1,7 @@
1
+ en:
2
+ dropzone:
3
+ drag_or_click: 'Drag files here or click to upload'
4
+ cancel: 'Cancel'
5
+ remove: 'Remove'
6
+ title: 'Title'
7
+ are_you_sure: 'Several images have not been uploaded to the server yet. Are you sure to submit form without these images?'
@@ -0,0 +1,7 @@
1
+ ru:
2
+ dropzone:
3
+ drag_or_click: 'Перетащите сюда файлы или нажмите для загрузки'
4
+ cancel: 'Отменить'
5
+ remove: 'Удалить'
6
+ title: 'Название'
7
+ are_you_sure: 'Некоторые файлы еще не загрузились на сервер. Вы действительно хотите сохранить без них?'
data/config/routes.rb CHANGED
@@ -1,5 +1,8 @@
1
- Rails.application.routes.prepend do
2
-
3
- post '/dropzone/upload' => 'dropzone#upload', as: :upload_dropzone
1
+ # temporary fix double route error
2
+ unless defined?(Rails.application.routes.url_helpers.upload_dropzone_path)
3
+ Rails.application.routes.draw do
4
+
5
+ post '/dropzone/upload' => 'dropzone#upload', as: :upload_dropzone
4
6
 
7
+ end
5
8
  end
data/lib/.DS_Store ADDED
Binary file
@@ -2,42 +2,78 @@ module Activeadmin
2
2
  module Dropzone
3
3
  extend ActiveSupport::Concern
4
4
 
5
- included do
6
- end
7
-
8
5
  module ClassMethods
9
6
  def dropzone(association_name)
10
7
  class_eval %Q(
8
+ def self.dropzone_#{ association_name }_class
9
+ self.reflect_on_association(:#{ association_name }).class_name.constantize
10
+ end
11
+
11
12
  def #{ association_name }_attributes=(attributes)
12
- reflection = self.class.reflect_on_association(:#{ association_name })
13
+ original_collection = self.#{ association_name }.to_a
14
+
15
+ ActiveRecord::Base.transaction do
16
+ self.#{ association_name } = self.class.dropzone_#{ association_name }_class.find(attributes.select{ |id, hash| !id.blank? and id != '-1' }.map{ |id, hash| id.to_i })
17
+
18
+ self.#{ association_name }.each do |dropzone_object|
19
+ attribute = attributes[dropzone_object.id.to_s]
20
+ changes = {}
21
+
22
+ title_field = self.class.dropzone_#{ association_name }_class.dropzone_field(:title)
23
+ if dropzone_object.respond_to?(title_field) and dropzone_object.send(title_field) != attribute['title']
24
+ changes[title_field] = attribute['title']
25
+ end
26
+
27
+ position_field = self.class.dropzone_#{ association_name }_class.dropzone_field(:position)
28
+ if dropzone_object.respond_to?(position_field) and dropzone_object.send(position_field) != attribute['position'].to_i
29
+ changes[position_field] = attribute['position']
30
+ end
13
31
 
14
- p "self.class.reflect_on_association(:#{ association_name })"
32
+ unless changes.empty?
33
+ dropzone_object.update_attributes changes
34
+ end
35
+ end
15
36
 
16
- self.#{ association_name } = reflection.class_name.constantize.find(attributes.select{ |id, hash| !id.blank? and id != '-1' }.map{ |id, hash| id.to_i })
37
+ self.update_attribute :#{ association_name }_count, self.#{ association_name }.size if self.respond_to?(:#{ association_name }_count)
17
38
 
18
- self.#{ association_name }.each do |dropzone_object|
19
- if dropzone_object.title != attributes[dropzone_object.id.to_s]['title'] or dropzone_object.position != attributes[dropzone_object.id.to_s]['position'].to_i
20
- dropzone_object.update_attributes title: attributes[dropzone_object.id.to_s]['title'], position: attributes[dropzone_object.id.to_s]['position']
39
+ (original_collection - self.#{ association_name }).each do |object|
40
+ object.destroy
21
41
  end
22
42
  end
43
+ end
44
+
45
+ def self.dropzone_#{ association_name }_field(key)
46
+ dropzone_#{ association_name }_class.dropzone_field(key)
47
+ end
23
48
 
24
- self.update_attribute :#{ association_name }_count, self.#{ association_name }.size
49
+ def self.dropzone_#{ association_name }_field?(key)
50
+ dropzone_#{ association_name }_class.dropzone_field?(key)
25
51
  end
26
52
  )
53
+ end
54
+
55
+ def dropzone_item(options = {})
56
+ options = {
57
+ title: :title,
58
+ position: :position,
59
+ data: :data,
60
+ file_size: :data_file_size,
61
+ url: :data_url
62
+ }.deep_merge(options)
27
63
 
28
- class_eval do
29
- def self.dropzone_title_field
30
- :title
64
+ class_eval %Q(
65
+ def self.dropzone_field(key)
66
+ #{ options }[key.to_sym]
31
67
  end
32
68
 
33
- def self.dropzone_position_field
34
- :position
69
+ def self.dropzone_field?(key)
70
+ #{ options }.keys.include? key.to_sym
35
71
  end
36
72
 
37
- def self.dropzone_field
38
- :image
73
+ def #{ options[:data] }_url
74
+ #{ options[:data] }.url
39
75
  end
40
- end
76
+ )
41
77
  end
42
78
  end
43
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeadmin-dropzone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maxim Gladkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-14 00:00:00.000000000 Z
11
+ date: 2014-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jeweler
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description:
42
- email: maksim.gladkov@gmail.com
42
+ email: contact@maximgladkov.com
43
43
  executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files:
46
46
  - LICENSE.txt
47
- - README.rdoc
47
+ - README.md
48
48
  files:
49
49
  - .DS_Store
50
50
  - .document
51
51
  - Gemfile
52
52
  - Gemfile.lock
53
53
  - LICENSE.txt
54
- - README.rdoc
54
+ - README.md
55
55
  - Rakefile
56
56
  - VERSION
57
57
  - activeadmin-dropzone.gemspec
@@ -66,13 +66,16 @@ files:
66
66
  - app/helpers/active_admin/views_helper.rb
67
67
  - app/inputs/dropzone_input.rb
68
68
  - app/views/application/_dropzone.html.erb
69
+ - config/locales/en.yml
70
+ - config/locales/ru.yml
69
71
  - config/routes.rb
72
+ - lib/.DS_Store
70
73
  - lib/activeadmin-dropzone.rb
71
74
  - lib/activeadmin-dropzone/active_record/dropzone.rb
72
75
  - lib/activeadmin-dropzone/engine.rb
73
76
  - test/helper.rb
74
77
  - test/test_activeadmin-dropzone.rb
75
- homepage: http://github.com/maximgladkov/activeadmin-dropzone
78
+ homepage: http://maximgladkov.com/blog/activeadmin-dropzone-gem
76
79
  licenses:
77
80
  - MIT
78
81
  metadata: {}
@@ -95,5 +98,5 @@ rubyforge_project:
95
98
  rubygems_version: 2.0.3
96
99
  signing_key:
97
100
  specification_version: 4
98
- summary: Gem adds support of dropzone.js for ActiveAdmin
101
+ summary: Easy to use integration of drag&drop files upload via dropzone.js for ActiveAdmin
99
102
  test_files: []
data/README.rdoc DELETED
@@ -1,19 +0,0 @@
1
- = activeadmin-dropzone
2
-
3
- Description goes here.
4
-
5
- == Contributing to activeadmin-dropzone
6
-
7
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
- * Fork the project.
10
- * Start a feature/bugfix branch.
11
- * Commit and push until you are happy with your contribution.
12
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2013 Maxim Gladkov. See LICENSE.txt for
18
- further details.
19
-