bootstrap_refile 0.0.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6ba7c473753c6e2aa933e40c6aacfa6d90f71614
4
+ data.tar.gz: 1af4eef11284c53d217ea53a1d8b11691179f32d
5
+ SHA512:
6
+ metadata.gz: 73f24c6950ad409362b7bf4ee1088c812ff2a6bcf1f66ab433ae6e81b27479212fededadc8e9e300988d6c793380297875457e6ec8ee9908fe46c808b33e228a
7
+ data.tar.gz: 5236baff08ef97e33961ae45ee29bc71a80ce8c8366158d04c7c47d290b72481a323a60b720d0fdf20f69c76fd2fccee93d1f14ea2d278a7946c1fe5ec9c1bf2
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bootstrap_refile.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Joshua Novak
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # Bootstrap Refile
2
+
3
+ A bootstrap styled single file uploader for refile with progress bar and image preview.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'bootstrap_refile'
11
+ ```
12
+
13
+ `bundle install` and restart your server to make the files available through the pipeline.
14
+
15
+ Add this line to your javascript file ( after `//= require refile` ):
16
+
17
+ ```js
18
+ //= require bootstrap_refile
19
+ ```
20
+
21
+
22
+ Add this line to your stylesheet:
23
+
24
+ ```scss
25
+ @import "bootstrap_refile";
26
+ ```
27
+
28
+
29
+ ## Usage
30
+
31
+ ``` erb
32
+ <%= form_for @user do |form| %>
33
+ <%= form.bootstrap_attachment_field :profile_image %>
34
+ <% end %>
35
+ ```
36
+
37
+ If you want to change the style of the progress bar you can pass it in:
38
+
39
+ ``` erb
40
+ <%= form_for @user do |form| %>
41
+ <%= form.attachment_field :profile_image, progress_class: 'progress-bar-danger' %>
42
+ <% end %>
43
+ ```
44
+
45
+ Options:
46
+
47
+ - progress_class
48
+ - remove_class
49
+ - select_class
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,60 @@
1
+ $(document).on("upload:start", "input[type=file]", function(e) {
2
+ var refileUploadContainer = $(this).closest(".refile-upload");
3
+
4
+ $(this).closest("form").find("input[type=submit]").attr("disabled", true);
5
+ //refileUploadContainer.find('.progress').css('opacity', 1);
6
+ });
7
+
8
+ $(document).on("upload:progress", "input[type=file]", function(e) {
9
+ var refileUploadContainer = $(this).closest(".refile-upload");
10
+
11
+ var detail = e.originalEvent.detail;
12
+ var progress = Math.round(detail.loaded / detail.total * 100);
13
+ var progressBar = refileUploadContainer.find('.progress-bar');
14
+ progressBar.css('width', progress + '%');
15
+ progressBar.attr('aria-valuenow', progress);
16
+ progressBar.find('.sr-only').text(progress + '% Complete');
17
+ });
18
+
19
+ $(document).on("upload:complete", "input[type=file]", function(e) {
20
+ var refileUploadContainer = $(this).closest(".refile-upload");
21
+
22
+ if(!refileUploadContainer.find("input.uploading").length) {
23
+ $(this).closest("form").find("input[type=submit]").removeAttr("disabled");
24
+ var progressBar = refileUploadContainer.find('.progress-bar');
25
+ progressBar.css('width', '0%');
26
+ progressBar.attr('aria-valuenow', 0);
27
+ progressBar.find('.sr-only').text('0% Complete');
28
+ //refileUploadContainer.find('.progress').css('opacity', 0);
29
+ }
30
+ });
31
+
32
+ $(document).on("change", "input[type=file]", function() {
33
+ fileIcons = {
34
+ 'default': 'fa-file-o',
35
+ 'pdf': 'fa-file-pdf-o',
36
+ 'xls': 'fa-file-excel-o',
37
+ 'xlsx': 'fa-file-excel-o',
38
+ 'csv': 'fa-file-excel-o',
39
+ 'doc': 'fa-file-word-o',
40
+ 'docx': 'fa-file-word-o',
41
+ 'jpg': 'fa-file-image-o',
42
+ 'jpeg': 'fa-file-image-o',
43
+ 'png': 'fa-file-image-o',
44
+ 'gif': 'fa-file-image-o'
45
+ }
46
+
47
+ if (this.files.length == 0) return;
48
+
49
+ var refileUploadContainer = $(this).closest(".refile-upload");
50
+ var fileName = this.files[0].name;
51
+ var fileExt = fileName.split('.').pop().toLowerCase();
52
+ var attachmentIcon = (fileIcons[fileExt])? fileIcons[fileExt] : fileIcons['default']
53
+
54
+ refileUploadContainer.addClass('filled').addClass((fileExt != '')? 'filled-type-' + fileExt : '');
55
+ refileUploadContainer.find('.file-info').html('<i class="fa ' + attachmentIcon + '"></i> ' + fileName);
56
+
57
+ var reader = new FileReader();
58
+ reader.onload = function (e) { refileUploadContainer.find("img.preview").attr("src", e.target.result); };
59
+ reader.readAsDataURL(this.files[0]);
60
+ });
@@ -0,0 +1,106 @@
1
+ .refile-upload {
2
+
3
+ .progress {
4
+ height: 10px;
5
+ // opacity: 0;
6
+ margin-bottom: 10px;
7
+ }
8
+
9
+ .file-info {
10
+ font-size: 12px;
11
+ opacity: .5;
12
+ margin-bottom: 10px;
13
+ white-space: nowrap;
14
+ overflow: hidden;
15
+ text-overflow: ellipsis;
16
+ }
17
+
18
+ .file-preview {
19
+ border: none;
20
+ border-radius: 0;
21
+
22
+ .file-preview-frame {
23
+ box-shadow: none;
24
+ border: none;
25
+ height: auto !important;
26
+
27
+ &:hover,
28
+ &:active,
29
+ &:focus {
30
+ box-shadow: none;
31
+ border: none;
32
+ }
33
+
34
+ // img {
35
+ // width: 100%;
36
+ // max-width: 150px;
37
+ // height: auto !important;
38
+ // }
39
+ }
40
+
41
+ .fileinput-remove {
42
+ display: none;
43
+ }
44
+ }
45
+
46
+ // img.preview {
47
+ // width: 100%;
48
+ // max-width: 150px;
49
+ // height: auto;
50
+ // }
51
+
52
+ // .drop {
53
+ // padding: 15px;
54
+ // border: 2px #f1f1f1 dashed;
55
+ // border-radius: 5px;
56
+ // line-height: 34px;
57
+ // }
58
+
59
+ .btn-file {
60
+ position: relative;
61
+ overflow: hidden;
62
+ }
63
+
64
+ .btn-file input[type=file] {
65
+ position: absolute;
66
+ top: 0;
67
+ right: 0;
68
+ min-width: 100%;
69
+ min-height: 100%;
70
+ font-size: 100px;
71
+ text-align: right;
72
+ filter: alpha(opacity=0);
73
+ opacity: 0;
74
+ outline: none;
75
+ background: white;
76
+ cursor: inherit;
77
+ display: block;
78
+ }
79
+
80
+ .btn-remove {
81
+ display: none;
82
+ }
83
+
84
+ &.filled {
85
+ .btn-remove {
86
+ display: inline-block;
87
+ }
88
+
89
+ .btn-file {
90
+ display: none;
91
+ }
92
+
93
+ .thumbnail {
94
+ display: none;
95
+ }
96
+
97
+ &.filled-type-jpg,
98
+ &.filled-type-jpeg,
99
+ &.filled-type-png,
100
+ &.filled-type-gif {
101
+ .thumbnail {
102
+ display: block;
103
+ }
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bootstrap_refile/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bootstrap_refile"
8
+ spec.version = BootstrapRefile::VERSION
9
+ spec.authors = ["Joshua Novak"]
10
+ spec.email = ["JoshuaNovak919@gmail.com"]
11
+ spec.summary = "A bootstrap styled single uploader for refile."
12
+ spec.description = "A bootstrap styled single uploader for refile."
13
+ spec.homepage = "https://github.com/JoshuaNovak919/bootstrap_refile"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "railties", ">= 3.1"
22
+ spec.add_dependency "refile"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.7"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ end
@@ -0,0 +1,107 @@
1
+ module BootstrapRefile
2
+ # Rails view helpers which aid in using Refile from views.
3
+ module AttachmentHelper
4
+ # Form builder extension
5
+ module FormBuilder
6
+ # @see BootstrapAttachmentHelper#attachment_field
7
+ def bootstrap_attachment_field(method, options = {})
8
+ self.multipart = true
9
+ @template.bootstrap_attachment_field(@object_name, method, objectify_options(options))
10
+ end
11
+ end
12
+
13
+ # Generates a form field which can be used with records which have
14
+ # attachments. This will generate both a file field as well as a hidden
15
+ # field which tracks the id of the file in the cache before it is
16
+ # permanently stored.
17
+ #
18
+ # @param object_name The name of the object to generate a field for
19
+ # @param method The name of the field
20
+ # @param [Hash] options
21
+ # @option options [Object] object Set by the form builder, currently required for direct/presigned uploads to work.
22
+ # @option options [Boolean] direct If set to true, adds the appropriate data attributes for direct uploads with refile.js.
23
+ # @option options [Boolean] presign If set to true, adds the appropriate data attributes for presigned uploads with refile.js.
24
+ # @return [ActiveSupport::SafeBuffer] The generated form field
25
+ def bootstrap_attachment_field(object_name, method, object:, **options)
26
+ file_icons = {
27
+ 'default' => 'fa-file-o',
28
+ 'pdf' => 'fa-file-pdf-o',
29
+ 'xls' => 'fa-file-excel-o',
30
+ 'xlsx' => 'fa-file-excel-o',
31
+ 'csv' => 'fa-file-excel-o',
32
+ 'doc' => 'fa-file-word-o',
33
+ 'docx' => 'fa-file-word-o',
34
+ 'jpg' => 'fa-file-image-o',
35
+ 'jpeg' => 'fa-file-image-o',
36
+ 'png' => 'fa-file-image-o',
37
+ 'gif' => 'fa-file-image-o'
38
+ }
39
+
40
+ options[:remove_class] ||= 'btn-primary'
41
+ options[:select_class] ||= 'btn-primary'
42
+ options[:progress_class] ||= ''
43
+
44
+ options[:data] ||= {}
45
+
46
+ attachment_name = method.to_s.humanize
47
+
48
+ file_exists = (!object["#{method}_id"].nil?)
49
+ file_extension = (file_exists)? File.extname(object["#{method}_filename"].to_s).gsub(/\./, '') : ''
50
+ file_name = (file_exists && !object["#{method}_filename"].to_s.blank?)? object["#{method}_filename"].to_s : 'No file selected'
51
+
52
+ image_url = (file_exists)? attachment_url(object, method.to_sym, :fit, 300, 300) : "http://placehold.it/300x200&text=#{attachment_name}"
53
+ image_tag = image_tag(image_url, class: 'preview img-responsive')
54
+
55
+ remove_attachment = check_box(object_name, "remove_#{method}".to_sym, { class: 'btn btn-primary' })
56
+ attacher = object.send(:"#{method}_attacher")
57
+ options[:accept] = attacher.accept
58
+
59
+ if options[:direct]
60
+ host = options[:host] || Refile.host || request.base_url
61
+ backend_name = Refile.backends.key(attacher.cache)
62
+
63
+ url = ::File.join(host, main_app.refile_app_path, backend_name)
64
+ options[:data].merge!(direct: true, as: "file", url: url)
65
+ end
66
+
67
+ if options[:presigned] and attacher.cache.respond_to?(:presign)
68
+ options[:data].merge!(direct: true).merge!(attacher.cache.presign.as_json)
69
+ end
70
+
71
+ attachment_field = hidden_field(object_name, method, value: attacher.data.to_json, object: object, id: nil)
72
+ attachment_field += file_field(object_name, method, options)
73
+
74
+ attachment_icon = (file_exists && file_icons[file_extension])? file_icons[file_extension] : file_icons['default']
75
+
76
+ result = <<-EOD
77
+ <div class="refile-upload #{(file_exists)? 'filled' : ''} #{(!file_extension.blank?)? "filled-type-#{file_extension}" : ''}">
78
+ <h4>#{attachment_name}</h4>
79
+ <div class="row">
80
+ <div class="col-sm-5">
81
+ <span class="thumbnail">#{image_tag}</span>
82
+ </div>
83
+ <div class="col-sm-7">
84
+ <div class="progress">
85
+ <div class="progress-bar #{options[:progress_class]}" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
86
+ <span class="sr-only">0% Complete</span>
87
+ </div>
88
+ </div>
89
+ <div class="file-info"><i class="fa #{attachment_icon}"></i> #{file_name}</div>
90
+ <span class="btn-group btn-remove" data-toggle="buttons">
91
+ <label class="btn #{options[:remove_class]}">
92
+ Remove #{attachment_name}
93
+ #{remove_attachment}
94
+ </label>
95
+ </span>
96
+ <span class="btn #{options[:select_class]} btn-file">
97
+ Select #{attachment_name}
98
+ #{attachment_field}
99
+ </span>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ EOD
104
+ return result.html_safe
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,3 @@
1
+ module BootstrapRefile
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,13 @@
1
+ require "bootstrap_refile/version"
2
+ require "bootstrap_refile/rails/attachment_helper"
3
+
4
+ module BootstrapRefile
5
+ module Rails
6
+ class Engine < ::Rails::Engine
7
+ initializer "refile.setup", before: :load_environment_config do
8
+ ActionView::Base.send(:include, BootstrapRefile::AttachmentHelper)
9
+ ActionView::Helpers::FormBuilder.send(:include, AttachmentHelper::FormBuilder)
10
+ end
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bootstrap_refile
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Joshua Novak
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: refile
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description: A bootstrap styled single uploader for refile.
70
+ email:
71
+ - JoshuaNovak919@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - app/assets/javascripts/bootstrap_refile.js
82
+ - app/assets/stylesheets/bootstrap_refile.scss
83
+ - bootstrap_refile.gemspec
84
+ - lib/bootstrap_refile.rb
85
+ - lib/bootstrap_refile/rails/attachment_helper.rb
86
+ - lib/bootstrap_refile/version.rb
87
+ homepage: https://github.com/JoshuaNovak919/bootstrap_refile
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.2.2
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: A bootstrap styled single uploader for refile.
111
+ test_files: []