assetable 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|