ds_media_library 0.1.0
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 +7 -0
- data/.gitignore +13 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +77 -0
- data/Rakefile +9 -0
- data/app/assets/javascripts/ds_media_library.coffee +45 -0
- data/app/assets/javascripts/toggle_all_checkboxes.coffee +6 -0
- data/app/controllers/ds_media_library/folders_controller.rb +37 -0
- data/app/controllers/ds_media_library/resources_controller.rb +71 -0
- data/app/models/ds_media_library/folder.rb +43 -0
- data/app/views/ds_media_library/_folder.html.slim +11 -0
- data/app/views/ds_media_library/_form_helper.html.slim +30 -0
- data/app/views/ds_media_library/_image_preview.html.slim +17 -0
- data/app/views/ds_media_library/_resource.html.slim +27 -0
- data/app/views/ds_media_library/resources/_folder.html.slim +14 -0
- data/app/views/ds_media_library/resources/_resource.html.slim +12 -0
- data/app/views/ds_media_library/resources/folder_form.html.slim +19 -0
- data/app/views/ds_media_library/resources/form.html.slim +31 -0
- data/app/views/ds_media_library/resources/index.html.slim +28 -0
- data/app/views/shared/_image_preview.html.slim +17 -0
- data/app/views/shared/_submit.html.slim +6 -0
- data/bin/console +14 -0
- data/bin/server +5 -0
- data/bin/setup +5 -0
- data/config/routes.rb +8 -0
- data/ds_media_library.gemspec +44 -0
- data/dummy/app.rb +53 -0
- data/dummy/database.rb +55 -0
- data/dummy/views.rb +114 -0
- data/lib/ds_media_library/engine.rb +32 -0
- data/lib/ds_media_library/form_helper.rb +86 -0
- data/lib/ds_media_library/version.rb +3 -0
- data/lib/ds_media_library.rb +10 -0
- data/tmp/.keep +0 -0
- metadata +348 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ds_media_library/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ds_media_library"
|
8
|
+
spec.version = DSMediaLibrary::VERSION
|
9
|
+
spec.authors = ["Micah Geisel"]
|
10
|
+
spec.email = ["micah@botandrose.com"]
|
11
|
+
|
12
|
+
spec.summary = 'Downstream Media Library Rails Engine'
|
13
|
+
spec.description = 'Downstream Media Library Rails Engine'
|
14
|
+
spec.homepage = "https://github.com/botandrose/ds_media_library"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
+
spec.add_development_dependency "cucumber-rails"
|
28
|
+
spec.add_development_dependency "chop"
|
29
|
+
spec.add_development_dependency "sqlite3"
|
30
|
+
spec.add_development_dependency "poltergeist"
|
31
|
+
spec.add_development_dependency "phantomjs"
|
32
|
+
spec.add_development_dependency "capybara-screenshot"
|
33
|
+
spec.add_development_dependency "database_cleaner"
|
34
|
+
spec.add_development_dependency "byebug"
|
35
|
+
|
36
|
+
spec.add_dependency "rails"
|
37
|
+
spec.add_dependency "slim"
|
38
|
+
spec.add_dependency "ds_node"
|
39
|
+
spec.add_dependency "awesome_nested_set"
|
40
|
+
spec.add_dependency "sass-rails"
|
41
|
+
spec.add_dependency "coffee-rails"
|
42
|
+
spec.add_dependency "jquery-rails"
|
43
|
+
spec.add_dependency "jquery-ui-rails"
|
44
|
+
end
|
data/dummy/app.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require "rails/all"
|
3
|
+
require "ds_media_library"
|
4
|
+
|
5
|
+
module Dummy; end
|
6
|
+
|
7
|
+
class Dummy::App < Rails::Application
|
8
|
+
config.secret_key_base = "test"
|
9
|
+
config.eager_load = false
|
10
|
+
config.logger = Logger.new("/dev/stdout")
|
11
|
+
config.logger = Logger.new("/dev/null")
|
12
|
+
end
|
13
|
+
|
14
|
+
ENV["DATABASE_URL"] = "sqlite3:tmp/test.sqlite3"
|
15
|
+
|
16
|
+
Dummy::App.initialize!
|
17
|
+
|
18
|
+
class ApplicationController < ActionController::Base
|
19
|
+
def self.expose *methods
|
20
|
+
methods.each do |method|
|
21
|
+
attr_reader method
|
22
|
+
helper_method method
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
layout "test"
|
27
|
+
|
28
|
+
def show
|
29
|
+
@widget = Widget.first_or_create!
|
30
|
+
end
|
31
|
+
|
32
|
+
def update
|
33
|
+
Widget.first_or_create!.update! params.require(:widget).permit!
|
34
|
+
redirect_to "/", notice: "Widget updated"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Dummy::App.routes.draw do
|
39
|
+
mount DSMediaLibrary::Engine => "/media_library"
|
40
|
+
root to: "application#show"
|
41
|
+
patch "/" => "application#update"
|
42
|
+
end
|
43
|
+
|
44
|
+
# app's soft delete leaves files in place, so clean them up
|
45
|
+
at_exit do
|
46
|
+
begin
|
47
|
+
Rails.public_path.rmtree
|
48
|
+
rescue Errno::ENOENT
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
require_relative "./database"
|
53
|
+
require_relative "./views"
|
data/dummy/database.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# sqlite3 hates our mysql indexes
|
2
|
+
ActiveRecord::Migration.class_eval do
|
3
|
+
def add_index *; end
|
4
|
+
|
5
|
+
def create_table name, options
|
6
|
+
options.delete(:options)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
ActiveRecord::Migration.suppress_messages do
|
12
|
+
ActiveRecord::Schema.define(version: 20170822210346) do
|
13
|
+
create_table "widgets", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
14
|
+
t.integer "cat_picture_id"
|
15
|
+
t.string "dog_picture_ids"
|
16
|
+
end
|
17
|
+
|
18
|
+
create_table "folders", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
19
|
+
t.string "name"
|
20
|
+
t.integer "parent_id"
|
21
|
+
t.integer "lft", null: false
|
22
|
+
t.integer "rgt", null: false
|
23
|
+
t.datetime "created_at", null: false
|
24
|
+
t.datetime "updated_at", null: false
|
25
|
+
t.integer "depth", default: 0, null: false
|
26
|
+
t.index ["lft"], name: "index_folders_on_lft"
|
27
|
+
t.index ["parent_id"], name: "index_folders_on_parent_id"
|
28
|
+
t.index ["rgt"], name: "index_folders_on_rgt"
|
29
|
+
end
|
30
|
+
|
31
|
+
create_table "resources", primary_key: "resourcesid", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
32
|
+
t.string "resourcestype"
|
33
|
+
t.decimal "resourcesduration", precision: 10, default: "0"
|
34
|
+
t.integer "resourceswidth", default: 0
|
35
|
+
t.integer "resourcesheight", default: 0
|
36
|
+
t.string "resourcesfilename"
|
37
|
+
t.string "resourcesoriginalfilename"
|
38
|
+
t.string "resourcespath", default: "resources/"
|
39
|
+
t.integer "resourcesthumbid"
|
40
|
+
t.string "resourceshash"
|
41
|
+
t.integer "resourcesparentid", default: 0
|
42
|
+
t.integer "resourcesparentindex", default: 0
|
43
|
+
t.datetime "created_at", null: false
|
44
|
+
t.datetime "updated_at", null: false
|
45
|
+
t.integer "folder_id"
|
46
|
+
t.boolean "hidden", default: false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class Widget < ActiveRecord::Base
|
52
|
+
ds_resource :cat_picture
|
53
|
+
belongs_to_many_ds_resources :dog_pictures
|
54
|
+
end
|
55
|
+
|
data/dummy/views.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
class InMemoryResolver < ActionView::Resolver
|
2
|
+
cattr_accessor(:store) { Hash.new }
|
3
|
+
|
4
|
+
def find_templates(name, prefix, partial, details, outside_app_allowed = false)
|
5
|
+
key = [prefix, name].join("/")
|
6
|
+
if contents = store[key]
|
7
|
+
[ActionView::Template.new(
|
8
|
+
contents,
|
9
|
+
"app/views/#{key}",
|
10
|
+
ActionView::Template.handler_for_extension(:slim),
|
11
|
+
virtual_path: key,
|
12
|
+
format: :html,
|
13
|
+
updated_at: Time.zone.now,
|
14
|
+
)]
|
15
|
+
else
|
16
|
+
[]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
ApplicationController.prepend_view_path InMemoryResolver.new
|
22
|
+
|
23
|
+
InMemoryResolver.store["layouts/test"] = <<-SLIM
|
24
|
+
sass:
|
25
|
+
.hidden
|
26
|
+
display: none
|
27
|
+
|
28
|
+
.media-nest
|
29
|
+
display: none
|
30
|
+
|
31
|
+
.expand-input:checked ~ .media-nest
|
32
|
+
display: block
|
33
|
+
|
34
|
+
.media-button, .flash-notice, .flash-alert
|
35
|
+
text-transform: uppercase
|
36
|
+
|
37
|
+
.modal-input
|
38
|
+
opacity: 0.001
|
39
|
+
&:checked ~ .modal-wrapper
|
40
|
+
left: 0
|
41
|
+
opacity: 1
|
42
|
+
.modal-content
|
43
|
+
display: inline-block
|
44
|
+
.modal-bg
|
45
|
+
background: white
|
46
|
+
opacity: 1
|
47
|
+
|
48
|
+
.modal-wrapper
|
49
|
+
position: fixed
|
50
|
+
display: -webkit-flex
|
51
|
+
display: flex
|
52
|
+
top: 0
|
53
|
+
left: -100vw
|
54
|
+
width: 100vw
|
55
|
+
height: 100vh
|
56
|
+
z-index: 9999
|
57
|
+
text-align: left
|
58
|
+
|
59
|
+
.modal-bg
|
60
|
+
background: rgba(#808080, 0.85)
|
61
|
+
opacity: 0
|
62
|
+
position: absolute
|
63
|
+
z-index: 2
|
64
|
+
width: 100vw
|
65
|
+
height: 100vh
|
66
|
+
top: 0
|
67
|
+
left: 0
|
68
|
+
|
69
|
+
.modal-content
|
70
|
+
display: none
|
71
|
+
margin: auto 0
|
72
|
+
width: 94vw
|
73
|
+
height: 100vh
|
74
|
+
padding: 40px
|
75
|
+
z-index: 3
|
76
|
+
|
77
|
+
.modal-close
|
78
|
+
position: absolute
|
79
|
+
top: -10px
|
80
|
+
right: 40px
|
81
|
+
margin: 0
|
82
|
+
width: 40px
|
83
|
+
height: 40px
|
84
|
+
line-height: 40px
|
85
|
+
text-align: center
|
86
|
+
|
87
|
+
h1 TEST
|
88
|
+
|
89
|
+
nav
|
90
|
+
ul
|
91
|
+
li = link_to "Widget", "/"
|
92
|
+
li = link_to "Manage Media Library", "/media_library"
|
93
|
+
|
94
|
+
.flash-notice = flash.notice
|
95
|
+
.flash-alert = flash.alert
|
96
|
+
|
97
|
+
= yield
|
98
|
+
|
99
|
+
= javascript_include_tag "ds_media_library"
|
100
|
+
SLIM
|
101
|
+
|
102
|
+
InMemoryResolver.store["application/show"] = <<-SLIM
|
103
|
+
= form_for @widget, url: "/" do |form|
|
104
|
+
.field
|
105
|
+
= form.label :cat_picture
|
106
|
+
= form.media_library :cat_picture
|
107
|
+
|
108
|
+
.field
|
109
|
+
= form.label :dog_pictures
|
110
|
+
= form.media_library :dog_pictures, multiple: true
|
111
|
+
|
112
|
+
= form.submit "Save"
|
113
|
+
SLIM
|
114
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "ds_node"
|
2
|
+
require "slim"
|
3
|
+
require "jquery-rails"
|
4
|
+
require "jquery-ui-rails"
|
5
|
+
require "coffee-rails"
|
6
|
+
|
7
|
+
module DSMediaLibrary
|
8
|
+
class Engine < Rails::Engine
|
9
|
+
initializer "ds_media_library.form_helper" do
|
10
|
+
ActionView::Helpers::FormBuilder.class_eval do
|
11
|
+
prepend FormHelper
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
initializer "ds_media_library.ds_node" do
|
16
|
+
DSNode::Resource.class_eval do
|
17
|
+
belongs_to :folder, class_name: "DSMediaLibrary::Folder", required: false
|
18
|
+
|
19
|
+
def css_class
|
20
|
+
"media-link"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
initializer "ds_media_library.assets" do
|
26
|
+
config.assets.precompile += %w( ds_media_library.js )
|
27
|
+
end
|
28
|
+
|
29
|
+
isolate_namespace DSMediaLibrary
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "active_support/number_helper"
|
2
|
+
|
3
|
+
module DSMediaLibrary
|
4
|
+
module FormHelper
|
5
|
+
def media_library field, label: field.to_s.humanize, multiple: false, optional: false, dimensions: nil, helptext: nil, preview: true, required: false, &block
|
6
|
+
helper = MediaLibrary.new(object.send(field), field, label, multiple, optional, dimensions, helptext, preview, required, block)
|
7
|
+
@template.render "ds_media_library/form_helper", form: self, helper: helper
|
8
|
+
end
|
9
|
+
|
10
|
+
class MediaLibrary < Struct.new(:object, :field, :label, :multiple, :optional, :dimensions, :helptext, :preview, :required, :block)
|
11
|
+
def ids
|
12
|
+
Array(object).map(&:id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def single_field
|
16
|
+
field.to_s.singularize.to_sym
|
17
|
+
end
|
18
|
+
|
19
|
+
def file_field_name
|
20
|
+
if multiple
|
21
|
+
:"new_#{single_field}_files"
|
22
|
+
else
|
23
|
+
:"#{field}_file"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove_field_name
|
28
|
+
if multiple
|
29
|
+
:"remove_#{single_field}_ids"
|
30
|
+
else
|
31
|
+
:"remove_#{field}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def field_id_name
|
36
|
+
if multiple
|
37
|
+
:"#{single_field}_ids"
|
38
|
+
else
|
39
|
+
:"#{field}_id"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def html_id
|
44
|
+
"media-modal-#{field}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def label_css_class
|
48
|
+
"optional" if optional
|
49
|
+
end
|
50
|
+
|
51
|
+
def helptext
|
52
|
+
super || dimensions.present? && "#{label.pluralize} must be #{number_with_delimiter(width)}px wide by #{number_with_delimiter(height)}px tall."
|
53
|
+
end
|
54
|
+
|
55
|
+
def width
|
56
|
+
dimensions.split("x").first if dimensions
|
57
|
+
end
|
58
|
+
|
59
|
+
def height
|
60
|
+
dimensions.split("x").last if dimensions
|
61
|
+
end
|
62
|
+
|
63
|
+
def root
|
64
|
+
@root ||= Folder.root
|
65
|
+
end
|
66
|
+
|
67
|
+
def root_folders
|
68
|
+
root.children
|
69
|
+
end
|
70
|
+
|
71
|
+
def root_resources
|
72
|
+
root.resources
|
73
|
+
end
|
74
|
+
|
75
|
+
def original_file_name
|
76
|
+
object.original_file_name if object.present?
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def number_with_delimiter number
|
82
|
+
ActiveSupport::NumberHelper.number_to_delimited(number)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/tmp/.keep
ADDED
File without changes
|