assetable 0.1.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 +15 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +181 -0
- data/Rakefile +23 -0
- data/app/assets/images/assetable/icon-upload.png +0 -0
- data/app/assets/images/assetable/icons/icon-ai.png +0 -0
- data/app/assets/images/assetable/icons/icon-css.png +0 -0
- data/app/assets/images/assetable/icons/icon-desmos.png +0 -0
- data/app/assets/images/assetable/icons/icon-doc.png +0 -0
- data/app/assets/images/assetable/icons/icon-document.png +0 -0
- data/app/assets/images/assetable/icons/icon-docx.png +0 -0
- data/app/assets/images/assetable/icons/icon-eps.png +0 -0
- data/app/assets/images/assetable/icons/icon-flash.png +0 -0
- data/app/assets/images/assetable/icons/icon-html.png +0 -0
- data/app/assets/images/assetable/icons/icon-jpg.png +0 -0
- data/app/assets/images/assetable/icons/icon-js.png +0 -0
- data/app/assets/images/assetable/icons/icon-mov.png +0 -0
- data/app/assets/images/assetable/icons/icon-mp3.png +0 -0
- data/app/assets/images/assetable/icons/icon-mp4.png +0 -0
- data/app/assets/images/assetable/icons/icon-pdf.png +0 -0
- data/app/assets/images/assetable/icons/icon-php.png +0 -0
- data/app/assets/images/assetable/icons/icon-png.png +0 -0
- data/app/assets/images/assetable/icons/icon-ppt.png +0 -0
- data/app/assets/images/assetable/icons/icon-pptx.png +0 -0
- data/app/assets/images/assetable/icons/icon-txt.png +0 -0
- data/app/assets/images/assetable/icons/icon-xls.png +0 -0
- data/app/assets/images/assetable/icons/icon-xlsx.png +0 -0
- data/app/assets/images/assetable/icons/icon-xml.png +0 -0
- data/app/assets/javascripts/assetable/asset_gallery.js.coffee +74 -0
- data/app/assets/javascripts/assetable/assetable_uploader.js.coffee +204 -0
- data/app/assets/javascripts/assetable/gallery.js.coffee +33 -0
- data/app/assets/javascripts/assetable/uploader.js.coffee +10 -0
- data/app/assets/javascripts/vendor/bootstrap-modal.js +246 -0
- data/app/assets/javascripts/vendor/jquery-ui-1.10.3.custom.js +2252 -0
- data/app/assets/stylesheets/assetable/_assetable.css.sass +9 -0
- data/app/assets/stylesheets/assetable/_bootstrap.css.sass +5 -0
- data/app/assets/stylesheets/assetable/components/_buttons.css.sass +99 -0
- data/app/assets/stylesheets/assetable/components/_close.css.sass +28 -0
- data/app/assets/stylesheets/assetable/components/_forms.css.sass +219 -0
- data/app/assets/stylesheets/assetable/components/_gallery.css.sass +118 -0
- data/app/assets/stylesheets/assetable/components/_modals.css.sass +116 -0
- data/app/assets/stylesheets/assetable/components/_progress.css.sass +91 -0
- data/app/assets/stylesheets/assetable/components/_uploader.css.sass +175 -0
- data/app/assets/stylesheets/assetable/core/_mixins.css.sass +754 -0
- data/app/assets/stylesheets/assetable/core/_utilities.css.sass +5 -0
- data/app/assets/stylesheets/assetable/core/_variables.css.sass +165 -0
- data/app/controllers/assetable/assets_controller.rb +38 -0
- data/app/controllers/assetable/external_services_controller.rb +36 -0
- data/app/models/asset.rb +53 -0
- data/app/models/asset_attachment.rb +4 -0
- data/app/models/document.rb +5 -0
- data/app/models/external_service.rb +14 -0
- data/app/models/gallery.rb +7 -0
- data/app/models/image.rb +5 -0
- data/app/models/video.rb +5 -0
- data/app/uploaders/document_uploader.rb +50 -0
- data/app/uploaders/image_uploader.rb +67 -0
- data/app/uploaders/video_uploader.rb +40 -0
- data/app/views/assetable/assets/_asset.html.haml +20 -0
- data/app/views/assetable/assets/_gallery.html.haml +12 -0
- data/app/views/assetable/external_services/new.html.haml +31 -0
- data/config/initializers/carrierwave.rb +6 -0
- data/config/initializers/gallery_input.rb +37 -0
- data/config/initializers/uploader_input.rb +80 -0
- data/config/routes.rb +8 -0
- data/db/migrate/20131122232735_create_assets.rb +19 -0
- data/db/migrate/20131123172825_create_asset_attachments.rb +15 -0
- data/db/migrate/20131125200943_create_galleries.rb +14 -0
- data/lib/assetable.rb +18 -0
- data/lib/assetable/config.rb +23 -0
- data/lib/assetable/core.rb +41 -0
- data/lib/assetable/engine.rb +15 -0
- data/lib/assetable/version.rb +3 -0
- data/lib/tasks/assetable_tasks.rake +4 -0
- data/test/fixtures/asset_attachments.yml +11 -0
- data/test/fixtures/assets.yml +11 -0
- data/test/fixtures/images.yml +11 -0
- data/test/fixtures/videos.yml +11 -0
- data/test/models/asset_attachment_test.rb +7 -0
- data/test/models/asset_test.rb +7 -0
- data/test/models/image_test.rb +7 -0
- data/test/models/video_test.rb +7 -0
- metadata +371 -0
@@ -0,0 +1,165 @@
|
|
1
|
+
// Defaults
|
2
|
+
// -------------------------
|
3
|
+
|
4
|
+
$brand-primary: #428bca !default
|
5
|
+
$brand-success: #5cb85c !default
|
6
|
+
$brand-warning: #f0ad4e !default
|
7
|
+
$brand-danger: #d9534f !default
|
8
|
+
$brand-info: #5bc0de !default
|
9
|
+
|
10
|
+
$link-color: $brand-primary !default
|
11
|
+
$link-hover-color: darken($link-color, 15%) !default
|
12
|
+
|
13
|
+
$font-size-base: 14px !default
|
14
|
+
$line-height-base: 1.42857 !default
|
15
|
+
$line-height-computed: floor($font-size-base * $line-height-base) !default
|
16
|
+
|
17
|
+
$border-radius-base: 4px !default
|
18
|
+
$border-radius-large: 6px !default
|
19
|
+
|
20
|
+
$padding-base-vertical: 6px !default
|
21
|
+
$padding-base-horizontal: 12px !default
|
22
|
+
|
23
|
+
// Grays
|
24
|
+
// -------------------------
|
25
|
+
|
26
|
+
$gray-darker: lighten(#000, 13.5%) !default
|
27
|
+
$gray-dark: lighten(#000, 20%) !default
|
28
|
+
$gray: lighten(#000, 33.5%) !default
|
29
|
+
$gray-light: lighten(#000, 60%) !default
|
30
|
+
$gray-lighter: lighten(#000, 93.5%) !default
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
// Uploader defaults
|
35
|
+
// -------------------------
|
36
|
+
|
37
|
+
$droppable-bg: #feefd6 !default
|
38
|
+
$uploader-width: 200px !default
|
39
|
+
$uploader-padding: 20px !default
|
40
|
+
$uploader-border-radius: 3px !default
|
41
|
+
$uploader-background-color: transparent !default
|
42
|
+
$uploader-border: 1px dotted #ddd !default
|
43
|
+
|
44
|
+
// Images
|
45
|
+
$uploader-image: image-url('assetable/icon-upload.png') !default
|
46
|
+
|
47
|
+
// Text attributes
|
48
|
+
$uploader-text-color: #555 !default
|
49
|
+
$uploader-link-color: #3498db !default
|
50
|
+
|
51
|
+
// Gallery
|
52
|
+
$assetable-gallery-footer-height: 55px !default
|
53
|
+
$assetable-gallery-header-height: 55px !default
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
// Progress bars
|
58
|
+
// -------------------------
|
59
|
+
|
60
|
+
$brand-primary: #428bca !default
|
61
|
+
$brand-success: #5cb85c !default
|
62
|
+
$brand-warning: #f0ad4e !default
|
63
|
+
$brand-danger: #d9534f !default
|
64
|
+
$brand-info: #5bc0de !default
|
65
|
+
|
66
|
+
$progress-bg: whitesmoke !default
|
67
|
+
$progress-bar-color: #333 !default
|
68
|
+
$progress-bar-height: 20px !default
|
69
|
+
|
70
|
+
$progress-bar-bg: $brand-primary !default
|
71
|
+
$progress-bar-success-bg: $brand-success !default
|
72
|
+
$progress-bar-warning-bg: $brand-warning !default
|
73
|
+
$progress-bar-danger-bg: $brand-danger !default
|
74
|
+
$progress-bar-info-bg: $brand-info !default
|
75
|
+
|
76
|
+
$progress-bar-border-radius: 2px !default
|
77
|
+
$progress-bar-font-size: $font-size-base !default
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
// Modals
|
83
|
+
// -------------------------
|
84
|
+
|
85
|
+
$zindex-modal-background: 1040 !default
|
86
|
+
$zindex-modal: 1050 !default
|
87
|
+
|
88
|
+
$modal-inner-padding: 20px !default
|
89
|
+
|
90
|
+
$modal-title-padding: 15px !default
|
91
|
+
$modal-title-line-height: $line-height-base !default
|
92
|
+
|
93
|
+
$modal-content-bg: white !default
|
94
|
+
$modal-content-border-color: rgba(0, 0, 0, 0.2) !default
|
95
|
+
$modal-content-fallback-border-color: #999999 !default
|
96
|
+
|
97
|
+
$modal-backdrop-bg: black !default
|
98
|
+
$modal-header-border-color: #e5e5e5 !default
|
99
|
+
$modal-footer-border-color: $modal-header-border-color !default
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
// Close
|
104
|
+
// ------------------------
|
105
|
+
$close-color: black !default
|
106
|
+
$close-font-weight: bold !default
|
107
|
+
$close-text-shadow: 0 1px 0 white !default
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
// Forms
|
113
|
+
// -------------------------
|
114
|
+
|
115
|
+
$input-bg: white !default
|
116
|
+
$input-bg-disabled: $gray-lighter !default
|
117
|
+
|
118
|
+
$input-color: $gray !default
|
119
|
+
$input-border: #cccccc !default
|
120
|
+
$input-border-radius: $border-radius-base !default
|
121
|
+
$input-border-focus: #66afe9 !default
|
122
|
+
|
123
|
+
$input-color-placeholder: $gray-light !default
|
124
|
+
|
125
|
+
$input-height-base: $line-height-computed + $padding-base-vertical * 2 + 2 !default
|
126
|
+
|
127
|
+
$legend-color: $gray-dark !default
|
128
|
+
$legend-border-color: #e5e5e5 !default
|
129
|
+
|
130
|
+
$input-group-addon-bg: $gray-lighter !default
|
131
|
+
$input-group-addon-border-color: $input-border !default
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
// Buttons
|
137
|
+
// -------------------------
|
138
|
+
|
139
|
+
$btn-font-weight: normal !default
|
140
|
+
|
141
|
+
$btn-default-color: #333333 !default
|
142
|
+
$btn-default-bg: white !default
|
143
|
+
$btn-default-border: #cccccc !default
|
144
|
+
|
145
|
+
$btn-primary-color: white !default
|
146
|
+
$btn-primary-bg: $brand-primary !default
|
147
|
+
$btn-primary-border: darken($btn-primary-bg, 5%) !default
|
148
|
+
|
149
|
+
$btn-success-color: white !default
|
150
|
+
$btn-success-bg: $brand-success !default
|
151
|
+
$btn-success-border: darken($btn-success-bg, 5%) !default
|
152
|
+
|
153
|
+
$btn-warning-color: white !default
|
154
|
+
$btn-warning-bg: $brand-warning !default
|
155
|
+
$btn-warning-border: darken($btn-warning-bg, 5%) !default
|
156
|
+
|
157
|
+
$btn-danger-color: white !default
|
158
|
+
$btn-danger-bg: $brand-danger !default
|
159
|
+
$btn-danger-border: darken($btn-danger-bg, 5%) !default
|
160
|
+
|
161
|
+
$btn-info-color: white !default
|
162
|
+
$btn-info-bg: $brand-info !default
|
163
|
+
$btn-info-border: darken($btn-info-bg, 5%) !default
|
164
|
+
|
165
|
+
$btn-link-disabled-color: $gray-light !default
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class Assetable::AssetsController < ActionController::Base
|
2
|
+
|
3
|
+
respond_to :html, :json
|
4
|
+
|
5
|
+
def index
|
6
|
+
@assets = Asset.page(params[:page]).per(20)
|
7
|
+
render json: { success: true, html: render_to_string(partial: "assetable/assets/gallery", locals: {assets: @assets, fieldname: params[:fieldname]})}
|
8
|
+
end
|
9
|
+
|
10
|
+
# Create a new asset
|
11
|
+
def create
|
12
|
+
# Get the content type
|
13
|
+
content_type = params[:file].content_type
|
14
|
+
asset_params = {name: params[:file].original_filename, filename: params[:file]}
|
15
|
+
|
16
|
+
puts "params:: #{params.inspect}"
|
17
|
+
puts "content_type:: #{content_type}"
|
18
|
+
|
19
|
+
# Create the appropriate model
|
20
|
+
if content_type.split("/").first == "image"
|
21
|
+
@asset = Image.new(asset_params)
|
22
|
+
elsif content_type.split("/").first == "video"
|
23
|
+
@asset = Video.new(asset_params)
|
24
|
+
elsif content_type.split("/").first == "application"
|
25
|
+
@asset = Document.new(asset_params)
|
26
|
+
end
|
27
|
+
|
28
|
+
puts "@asset:: #{@asset.inspect}"
|
29
|
+
|
30
|
+
# Return
|
31
|
+
if @asset.errors.empty? and @asset.save
|
32
|
+
render json: { success: true, html: render_to_string(partial: "assetable/assets/asset", locals: { asset: @asset, fieldname: params[:fieldname]})}
|
33
|
+
else
|
34
|
+
render json: { status: "error", errors: @asset.errors }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Assetable::ExternalServicesController < ActionController::Base
|
2
|
+
|
3
|
+
respond_to :html, :json
|
4
|
+
|
5
|
+
# def index
|
6
|
+
# @assets = Asset.page(params[:page]).per(20)
|
7
|
+
# render json: { success: true, html: render_to_string(partial: "assetable/assets/gallery", locals: {assets: @assets, fieldname: params[:fieldname]})}
|
8
|
+
# end
|
9
|
+
|
10
|
+
# New template
|
11
|
+
def new
|
12
|
+
@external_service = ExternalService.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# Create a new external service asset
|
16
|
+
def create
|
17
|
+
@external_service = ExternalService.new(permitted_params)
|
18
|
+
|
19
|
+
if @external_service.errors.empty? and @external_service.save
|
20
|
+
render json: { success: true, html: render_to_string(partial: "assetable/assets/asset", locals: { asset: @external_service, fieldname: params[:fieldname]})}
|
21
|
+
else
|
22
|
+
puts "errors:: #{@external_service.errors.full_messages}"
|
23
|
+
render json: { status: "error", errors: @external_service.errors.full_messages, html: render_to_string(:new) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Permitted params for the model
|
28
|
+
def permitted_params
|
29
|
+
params.require(:external_service).permit(
|
30
|
+
:name,
|
31
|
+
:body,
|
32
|
+
:content_type
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/app/models/asset.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
class Asset < ActiveRecord::Base
|
2
|
+
|
3
|
+
has_many :asset_attachments, :as => :assetable, :dependent => :destroy
|
4
|
+
has_many :assetable, :through => :asset_attachments
|
5
|
+
|
6
|
+
before_save :update_asset_attributes
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
# File Type Helpers
|
11
|
+
# ---------------------------------------------------------------------
|
12
|
+
|
13
|
+
# Is the asset a image?
|
14
|
+
def image?
|
15
|
+
self.type == "Image"
|
16
|
+
end
|
17
|
+
|
18
|
+
# Is the asset a document?
|
19
|
+
def document?
|
20
|
+
self.type == "Document"
|
21
|
+
end
|
22
|
+
|
23
|
+
# Is the asset a video?
|
24
|
+
def video?
|
25
|
+
self.type == "Video"
|
26
|
+
end
|
27
|
+
|
28
|
+
def external_service?
|
29
|
+
self.type == "ExternalService"
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# File meta and helpers
|
34
|
+
# ---------------------------------------------------------------------
|
35
|
+
|
36
|
+
# Get the file type extension from the filename
|
37
|
+
def extension
|
38
|
+
filename = File.extname(self.filename.to_s)
|
39
|
+
filename[0] = '' # remove the dot, i.e. (.docx or .pptx)
|
40
|
+
filename
|
41
|
+
end
|
42
|
+
|
43
|
+
# Add some custom attributes to the asset
|
44
|
+
def update_asset_attributes
|
45
|
+
if !self.external_service? and self.present? and self.changed?
|
46
|
+
self.content_type = self.filename.file.content_type
|
47
|
+
self.file_size = self.filename.file.size
|
48
|
+
self.width, self.height = `identify -format "%wx%h" #{self.filename.file.path}`.split(/x/) unless self.document?
|
49
|
+
self.checksum = Digest::MD5.file(self.filename.file.path).to_s
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class ExternalService < Asset
|
2
|
+
|
3
|
+
validates_presence_of :name, :body
|
4
|
+
|
5
|
+
# G
|
6
|
+
def self.possible_content_types
|
7
|
+
if user_defined_document_types = Assetable.external_document_types
|
8
|
+
return user_defined_document_types
|
9
|
+
else
|
10
|
+
return ["iFrame", "Third Party API"]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/app/models/image.rb
ADDED
data/app/models/video.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class DocumentUploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
# Choose what kind of storage to use for this uploader:
|
6
|
+
storage Assetable.storage
|
7
|
+
|
8
|
+
# Override the directory where uploaded files will be stored.
|
9
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
10
|
+
def store_dir
|
11
|
+
if model.present?
|
12
|
+
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
13
|
+
else
|
14
|
+
"uploads/#{mounted_as}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
19
|
+
# def default_url
|
20
|
+
# # For Rails 3.1+ asset pipeline compatibility:
|
21
|
+
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
|
22
|
+
#
|
23
|
+
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
|
24
|
+
# end
|
25
|
+
|
26
|
+
# Process files as they are uploaded:
|
27
|
+
# process :scale => [200, 300]
|
28
|
+
#
|
29
|
+
# def scale(width, height)
|
30
|
+
# # do something
|
31
|
+
# end
|
32
|
+
|
33
|
+
# Create different versions of your uploaded files:
|
34
|
+
# version :thumb do
|
35
|
+
# process :scale => [50, 50]
|
36
|
+
# end
|
37
|
+
|
38
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
39
|
+
# For images you might use something like this:
|
40
|
+
# def extension_white_list
|
41
|
+
# %w(jpg jpeg gif png)
|
42
|
+
# end
|
43
|
+
|
44
|
+
# Override the filename of the uploaded files:
|
45
|
+
# Avoid using model.id or version_name here, see uploader/store.rb for details.
|
46
|
+
# def filename
|
47
|
+
# "something.jpg" if original_filename
|
48
|
+
# end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class ImageUploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MimeTypes
|
6
|
+
# Include RMagick or MiniMagick support:
|
7
|
+
include CarrierWave::RMagick
|
8
|
+
|
9
|
+
# Choose what kind of storage to use for this uploader:
|
10
|
+
storage Assetable.storage
|
11
|
+
|
12
|
+
# More reliable content types
|
13
|
+
process :set_content_type
|
14
|
+
|
15
|
+
# Override the directory where uploaded files will be stored.
|
16
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
17
|
+
def store_dir
|
18
|
+
if model.present?
|
19
|
+
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
20
|
+
else
|
21
|
+
"uploads/#{mounted_as}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
26
|
+
# For images you might use something like this:
|
27
|
+
def extension_white_list
|
28
|
+
%w(jpg jpeg gif png)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
32
|
+
# def default_url
|
33
|
+
# # For Rails 3.1+ asset pipeline compatibility:
|
34
|
+
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
|
35
|
+
#
|
36
|
+
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
|
37
|
+
# end
|
38
|
+
|
39
|
+
version :preview do
|
40
|
+
process :resize_to_fill => [150, 150]
|
41
|
+
end
|
42
|
+
|
43
|
+
# Process files as they are uploaded:
|
44
|
+
# process :scale => [200, 300]
|
45
|
+
#
|
46
|
+
# def scale(width, height)
|
47
|
+
# # do something
|
48
|
+
# end
|
49
|
+
|
50
|
+
# Create different versions of your uploaded files:
|
51
|
+
# version :thumb do
|
52
|
+
# process :scale => [50, 50]
|
53
|
+
# end
|
54
|
+
|
55
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
56
|
+
# For images you might use something like this:
|
57
|
+
# def extension_white_list
|
58
|
+
# %w(jpg jpeg gif png)
|
59
|
+
# end
|
60
|
+
|
61
|
+
# Override the filename of the uploaded files:
|
62
|
+
# Avoid using model.id or version_name here, see uploader/store.rb for details.
|
63
|
+
# def filename
|
64
|
+
# "something.jpg" if original_filename
|
65
|
+
# end
|
66
|
+
|
67
|
+
end
|