activeadmin-settings 0.2.6 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/app/{controller → controllers}/activeadmin_settings/admin_users_controller.rb +0 -0
- data/app/controllers/activeadmin_settings/pictures_controller.rb +19 -0
- data/app/{controller → controllers}/activeadmin_settings/settings_controller.rb +0 -0
- data/app/models/activeadmin_settings/picture.rb +48 -0
- data/app/uploaders/activeadmin_settings/redactor_picture_uploader.rb +97 -0
- data/app/views/admin/settings/_settings_table.html.erb +8 -4
- data/config/routes.rb +3 -0
- data/lib/activeadmin-settings.rb +13 -0
- data/lib/activeadmin-settings/version.rb +1 -1
- data/vendor/assets/javascripts/activeadmin_settings/index.js.coffee +1 -0
- data/vendor/assets/javascripts/activeadmin_settings/settings.js.coffee +0 -2
- data/vendor/assets/javascripts/activeadmin_settings/tabs.js.coffee +26 -0
- data/vendor/assets/javascripts/redactor/css/docstyle.css +139 -0
- data/vendor/assets/javascripts/redactor/css/style.css +135 -0
- data/vendor/assets/javascripts/redactor/css/wym.css +151 -0
- data/vendor/assets/javascripts/redactor/index.js +1 -0
- data/vendor/assets/javascripts/redactor/langs/bg.js +67 -0
- data/vendor/assets/javascripts/redactor/langs/by.js +65 -0
- data/vendor/assets/javascripts/redactor/langs/cs.js +77 -0
- data/vendor/assets/javascripts/redactor/langs/de.js +70 -0
- data/vendor/assets/javascripts/redactor/langs/en.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/eo.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/es.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/fa.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/fi.js +69 -0
- data/vendor/assets/javascripts/redactor/langs/fr.js +76 -0
- data/vendor/assets/javascripts/redactor/langs/hr.js +69 -0
- data/vendor/assets/javascripts/redactor/langs/hu.js +67 -0
- data/vendor/assets/javascripts/redactor/langs/it.js +68 -0
- data/vendor/assets/javascripts/redactor/langs/ja.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/ko.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/lv.js +65 -0
- data/vendor/assets/javascripts/redactor/langs/nl.js +69 -0
- data/vendor/assets/javascripts/redactor/langs/pl.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/pt_br.js +72 -0
- data/vendor/assets/javascripts/redactor/langs/ru.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/sk.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/sq.js +69 -0
- data/vendor/assets/javascripts/redactor/langs/tr.js +66 -0
- data/vendor/assets/javascripts/redactor/langs/ua.js +67 -0
- data/vendor/assets/javascripts/redactor/langs/zh_cn.js +67 -0
- data/vendor/assets/javascripts/redactor/langs/zh_tw.js +66 -0
- data/vendor/assets/javascripts/redactor/redactor.js.erb +3375 -0
- data/vendor/assets/stylesheets/activeadmin_settings.css.scss +4 -1
- data/vendor/assets/stylesheets/redactor/css/docstyle.css +139 -0
- data/vendor/assets/stylesheets/redactor/css/redactor.css +410 -0
- data/vendor/assets/stylesheets/redactor/css/style.css +135 -0
- data/vendor/assets/stylesheets/redactor/css/wym.css +151 -0
- data/vendor/assets/stylesheets/redactor/img/icons.png +0 -0
- data/vendor/assets/stylesheets/redactor/index.css +1 -0
- metadata +44 -4
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class ActiveadminSettings::PicturesController < ApplicationController
|
2
|
+
before_filter :authenticate_admin_user!
|
3
|
+
|
4
|
+
def index
|
5
|
+
@pictures = ActiveadminSettings::Picture.all
|
6
|
+
render :json => @pictures
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
@picture = ActiveadminSettings::Picture.new
|
11
|
+
@picture.data = params[:file]
|
12
|
+
|
13
|
+
if @picture.save
|
14
|
+
render :json => { :filelink => @picture.url }
|
15
|
+
else
|
16
|
+
render :nothing => true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
File without changes
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class ActiveadminSettings::Picture
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Timestamps
|
4
|
+
|
5
|
+
# Fields
|
6
|
+
field :data_file_size
|
7
|
+
field :data_content_type
|
8
|
+
field :width, :type => Integer
|
9
|
+
field :height, :type => Integer
|
10
|
+
|
11
|
+
# Features
|
12
|
+
mount_uploader :data, ActiveadminSettings::RedactorPictureUploader
|
13
|
+
|
14
|
+
# Scopes
|
15
|
+
default_scope order_by(:created_at => :desc)
|
16
|
+
|
17
|
+
# Helpers
|
18
|
+
def has_dimensions?
|
19
|
+
respond_to?(:width) && respond_to?(:height)
|
20
|
+
end
|
21
|
+
|
22
|
+
def image?
|
23
|
+
ActiveadminSettings::IMAGE_TYPES.include?(data_content_type)
|
24
|
+
end
|
25
|
+
|
26
|
+
def url
|
27
|
+
data.url
|
28
|
+
end
|
29
|
+
|
30
|
+
def image
|
31
|
+
url
|
32
|
+
end
|
33
|
+
|
34
|
+
def thumb
|
35
|
+
data.thumb.url
|
36
|
+
end
|
37
|
+
|
38
|
+
def as_json_methods
|
39
|
+
[:image, :thumb]
|
40
|
+
end
|
41
|
+
|
42
|
+
def as_json(options = nil)
|
43
|
+
options = {
|
44
|
+
:methods => as_json_methods
|
45
|
+
}
|
46
|
+
super options
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
class ActiveadminSettings::RedactorPictureUploader < CarrierWave::Uploader::Base
|
3
|
+
|
4
|
+
# Include RMagick or ImageScience support:
|
5
|
+
# include CarrierWave::RMagick
|
6
|
+
include CarrierWave::MiniMagick
|
7
|
+
# include CarrierWave::ImageScience
|
8
|
+
|
9
|
+
# Instance
|
10
|
+
def strip
|
11
|
+
manipulate! do |img|
|
12
|
+
img.strip
|
13
|
+
img = yield(img) if block_given?
|
14
|
+
img
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# process :quality => 85
|
19
|
+
def quality(percentage)
|
20
|
+
manipulate! do |img|
|
21
|
+
img.quality(percentage)
|
22
|
+
img = yield(img) if block_given?
|
23
|
+
img
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def extract_content_type
|
28
|
+
if file.content_type == 'application/octet-stream' || file.content_type.blank?
|
29
|
+
content_type = MIME::Types.type_for(original_filename).first
|
30
|
+
else
|
31
|
+
content_type = file.content_type
|
32
|
+
end
|
33
|
+
|
34
|
+
model.data_content_type = content_type.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_size
|
38
|
+
model.data_file_size = file.size
|
39
|
+
end
|
40
|
+
|
41
|
+
def read_dimensions
|
42
|
+
if model.image? && model.has_dimensions?
|
43
|
+
magick = ::MiniMagick::Image.new(current_path)
|
44
|
+
model.width, model.height = magick[:width], magick[:height]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Override the directory where uploaded files will be stored.
|
49
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
50
|
+
def store_dir
|
51
|
+
"system/settings/redactor/pictures/#{model.id}"
|
52
|
+
end
|
53
|
+
|
54
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
55
|
+
# def default_url
|
56
|
+
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
|
57
|
+
# end
|
58
|
+
|
59
|
+
# Process files as they are uploaded:
|
60
|
+
# process :scale => [200, 300]
|
61
|
+
#
|
62
|
+
# def scale(width, height)
|
63
|
+
# # do something
|
64
|
+
# end
|
65
|
+
|
66
|
+
process :read_dimensions
|
67
|
+
|
68
|
+
# Create different versions of your uploaded files:
|
69
|
+
version :thumb do
|
70
|
+
process :resize_to_fill => [118, 100]
|
71
|
+
end
|
72
|
+
|
73
|
+
#version :content do
|
74
|
+
# process :resize_to_limit => [800, 800]
|
75
|
+
#end
|
76
|
+
|
77
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
78
|
+
# For images you might use something like this:
|
79
|
+
def extension_white_list
|
80
|
+
ActiveadminSettings.image_file_types
|
81
|
+
end
|
82
|
+
|
83
|
+
# Override the filename of the uploaded files:
|
84
|
+
# Avoid using model.id or version_name here, see uploader/store.rb for details.
|
85
|
+
# def filename
|
86
|
+
# "something.jpg" if original_filename
|
87
|
+
# end
|
88
|
+
|
89
|
+
|
90
|
+
# Class
|
91
|
+
def self.extended(base)
|
92
|
+
base.class_eval do
|
93
|
+
process :extract_content_type
|
94
|
+
process :set_size
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -12,12 +12,12 @@
|
|
12
12
|
</thead>
|
13
13
|
<tbody>
|
14
14
|
<% settings.each do |setting| %>
|
15
|
-
<tr class="odd" id="setting_<%= setting.id %>">
|
16
|
-
<td
|
15
|
+
<tr class="odd option-type-<%= setting.type %>" id="setting_<%= setting.id %>">
|
16
|
+
<td>
|
17
17
|
<strong><%= setting.name %></strong></br>
|
18
18
|
<em><%= setting.description %></em>
|
19
19
|
</td>
|
20
|
-
<td
|
20
|
+
<td>
|
21
21
|
<div class="form <%= setting.type %>">
|
22
22
|
<%= semantic_form_for setting,
|
23
23
|
:method => :put,
|
@@ -29,6 +29,10 @@
|
|
29
29
|
<%= f.input :remove_file, :as => :boolean %>
|
30
30
|
<% when "text" %>
|
31
31
|
<%= f.input :string, :as => :text %>
|
32
|
+
<% when "html" %>
|
33
|
+
<%= f.input :string,
|
34
|
+
:as => :text,
|
35
|
+
:input_html => { :class => "settings-redactor" } %>
|
32
36
|
<% else %>
|
33
37
|
<%= f.input :string, :placeholder => "Default: " + setting.default_value %>
|
34
38
|
<% end %>
|
@@ -36,7 +40,7 @@
|
|
36
40
|
<% end %>
|
37
41
|
</div>
|
38
42
|
</td>
|
39
|
-
<td
|
43
|
+
<td>
|
40
44
|
<a href="#" class="member_link update_link"
|
41
45
|
data-id="#setting_<%= setting.id %>">
|
42
46
|
Update
|
data/config/routes.rb
CHANGED
data/lib/activeadmin-settings.rb
CHANGED
@@ -4,6 +4,19 @@ module ActiveadminSettings
|
|
4
4
|
require 'activeadmin-settings/engine'
|
5
5
|
require 'activeadmin-settings/helper'
|
6
6
|
|
7
|
+
IMAGE_TYPES = [ 'image/jpeg',
|
8
|
+
'image/png',
|
9
|
+
'image/gif',
|
10
|
+
'image/jpg',
|
11
|
+
'image/pjpeg',
|
12
|
+
'image/tiff',
|
13
|
+
'image/x-png' ]
|
14
|
+
|
15
|
+
mattr_accessor :image_file_types
|
16
|
+
@@image_file_types = ["jpg", "jpeg", "png", "gif", "tiff"]
|
17
|
+
|
18
|
+
|
19
|
+
# Load configuration from config/activeadmin_settings.yml
|
7
20
|
def self.load_config
|
8
21
|
config_file = ::Rails.root.join("config/activeadmin_settings.yml")
|
9
22
|
@load_config = {}
|
@@ -1,6 +1,32 @@
|
|
1
1
|
# Tabs
|
2
|
+
|
3
|
+
enable_redactor = ->
|
4
|
+
# Workaround for redactor and easytabs integration,
|
5
|
+
# the problem is that not current redactors are not
|
6
|
+
# clickable after init.
|
7
|
+
|
8
|
+
window.redactor_settings =
|
9
|
+
buttons: ['html', '|',
|
10
|
+
'formatting', '|',
|
11
|
+
'bold', 'italic', 'deleted', '|',
|
12
|
+
'unorderedlist', 'orderedlist', 'outdent', 'indent', '|',
|
13
|
+
'image', 'video', 'file', 'table', 'link', '|',
|
14
|
+
'alignleft', 'aligncenter', 'alignright', 'justify', '|',
|
15
|
+
'fullscreen' ]
|
16
|
+
|
17
|
+
# after tab was clicked there is a workaround to turn on redactor
|
18
|
+
$('#settings_tabs').bind 'easytabs:after', (event, $clicked, $targetPanel, settings) ->
|
19
|
+
text_input = $targetPanel.find('.settings-redactor')
|
20
|
+
if text_input.css("display") != "none"
|
21
|
+
text_input.redactor window.redactor_settings
|
22
|
+
|
23
|
+
# init redactor for the first visible tab
|
24
|
+
$('#settings_tabs .settings-redactor:visible').redactor window.redactor_settings
|
25
|
+
|
2
26
|
$ ->
|
3
27
|
$('#settings_tabs').easytabs
|
4
28
|
animate:true
|
5
29
|
animationSpeed:0
|
6
30
|
tabActiveClass:"selected"
|
31
|
+
|
32
|
+
enable_redactor()
|
@@ -0,0 +1,139 @@
|
|
1
|
+
html {
|
2
|
+
padding: 0;
|
3
|
+
margin: 0;
|
4
|
+
}
|
5
|
+
body {
|
6
|
+
font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif;
|
7
|
+
font-size: 15px;
|
8
|
+
margin: 0;
|
9
|
+
padding: 0;
|
10
|
+
overflow-x: hidden;
|
11
|
+
background: #f4f4f4;
|
12
|
+
}
|
13
|
+
#page {
|
14
|
+
max-width: 900px;
|
15
|
+
width: 74%;
|
16
|
+
margin: 20px auto;
|
17
|
+
padding: 15px 50px;
|
18
|
+
background: #fff;
|
19
|
+
border: 1px solid #ddd;
|
20
|
+
}
|
21
|
+
#page:focus {
|
22
|
+
outline: none;
|
23
|
+
}
|
24
|
+
|
25
|
+
a {
|
26
|
+
color: #15c;
|
27
|
+
}
|
28
|
+
|
29
|
+
object,
|
30
|
+
embed,
|
31
|
+
video,
|
32
|
+
iframe {
|
33
|
+
width: auto;
|
34
|
+
max-width: 100%;
|
35
|
+
}
|
36
|
+
video,
|
37
|
+
iframe {
|
38
|
+
height: auto;
|
39
|
+
}
|
40
|
+
|
41
|
+
::selection {
|
42
|
+
background-color: #333;
|
43
|
+
color: #fff;
|
44
|
+
text-shadow: none;
|
45
|
+
}
|
46
|
+
|
47
|
+
div,
|
48
|
+
p,
|
49
|
+
ul,
|
50
|
+
ol,
|
51
|
+
table,
|
52
|
+
dl,
|
53
|
+
blockquote,
|
54
|
+
pre,
|
55
|
+
iframe,
|
56
|
+
object,
|
57
|
+
hr {
|
58
|
+
margin-bottom: 15px;
|
59
|
+
line-height: 1.5em;
|
60
|
+
}
|
61
|
+
blockquote {
|
62
|
+
margin-left: 3em;
|
63
|
+
font-style: italic;
|
64
|
+
color: #777;
|
65
|
+
}
|
66
|
+
ul, ol {
|
67
|
+
padding-left: 2em;
|
68
|
+
}
|
69
|
+
ul ul,
|
70
|
+
ol ol,
|
71
|
+
ul ol,
|
72
|
+
ol ul {
|
73
|
+
border: none;
|
74
|
+
margin: 2px !important;
|
75
|
+
padding: 0;
|
76
|
+
padding-left: 2em;
|
77
|
+
}
|
78
|
+
dl dt { font-weight: bold; }
|
79
|
+
dd { margin-left: 1em;}
|
80
|
+
|
81
|
+
table {
|
82
|
+
border-collapse: collapse;
|
83
|
+
font-size: 1em;
|
84
|
+
}
|
85
|
+
table td {
|
86
|
+
border: 1px solid #ddd;
|
87
|
+
padding: 5px;
|
88
|
+
}
|
89
|
+
table thead td {
|
90
|
+
border-bottom: 2px solid #000 !important;
|
91
|
+
font-weight: bold;
|
92
|
+
}
|
93
|
+
code, pre {
|
94
|
+
font-family: monospace sans-serif;
|
95
|
+
}
|
96
|
+
code {
|
97
|
+
background-color: #d8d7d7;
|
98
|
+
}
|
99
|
+
pre {
|
100
|
+
padding: 1em;
|
101
|
+
border: 1px dashed #ccc;
|
102
|
+
background: #f5f5f5;
|
103
|
+
overflow: auto;
|
104
|
+
}
|
105
|
+
hr {
|
106
|
+
display: block;
|
107
|
+
height: 1px;
|
108
|
+
border: 0;
|
109
|
+
border-top: 1px solid #ccc;
|
110
|
+
}
|
111
|
+
|
112
|
+
h1, h2, h3, h4,h5 {
|
113
|
+
font-weight: bold;
|
114
|
+
}
|
115
|
+
|
116
|
+
h1 {
|
117
|
+
font-size: 36px;
|
118
|
+
line-height: 40px;
|
119
|
+
margin-bottom: 10px;
|
120
|
+
}
|
121
|
+
h2 {
|
122
|
+
font-size: 30px;
|
123
|
+
line-height: 36px;
|
124
|
+
margin-bottom: 15px;
|
125
|
+
}
|
126
|
+
h3 {
|
127
|
+
font-size: 24px;
|
128
|
+
line-height: 30px;
|
129
|
+
margin-bottom: 10px;
|
130
|
+
}
|
131
|
+
h4 {
|
132
|
+
font-size: 18px;
|
133
|
+
line-height: 24px;
|
134
|
+
margin-bottom: 10px;
|
135
|
+
}
|
136
|
+
h4 {
|
137
|
+
font-size: 1em;
|
138
|
+
margin-bottom: 10px;
|
139
|
+
}
|
@@ -0,0 +1,135 @@
|
|
1
|
+
html {
|
2
|
+
padding: 0;
|
3
|
+
margin: 0;
|
4
|
+
}
|
5
|
+
body {
|
6
|
+
font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif;
|
7
|
+
font-size: 15px;
|
8
|
+
margin: 0;
|
9
|
+
padding: 0;
|
10
|
+
overflow-x: hidden;
|
11
|
+
background: #fff;
|
12
|
+
}
|
13
|
+
#page {
|
14
|
+
margin: 20px;
|
15
|
+
background: #fff;
|
16
|
+
}
|
17
|
+
#page:focus {
|
18
|
+
outline: none;
|
19
|
+
}
|
20
|
+
|
21
|
+
a {
|
22
|
+
color: #15c;
|
23
|
+
}
|
24
|
+
|
25
|
+
object,
|
26
|
+
embed,
|
27
|
+
video,
|
28
|
+
iframe {
|
29
|
+
width: auto;
|
30
|
+
max-width: 100%;
|
31
|
+
}
|
32
|
+
video,
|
33
|
+
iframe {
|
34
|
+
height: auto;
|
35
|
+
}
|
36
|
+
|
37
|
+
::selection {
|
38
|
+
background-color: #333;
|
39
|
+
color: #fff;
|
40
|
+
text-shadow: none;
|
41
|
+
}
|
42
|
+
|
43
|
+
div,
|
44
|
+
p,
|
45
|
+
ul,
|
46
|
+
ol,
|
47
|
+
table,
|
48
|
+
dl,
|
49
|
+
blockquote,
|
50
|
+
pre,
|
51
|
+
iframe,
|
52
|
+
object,
|
53
|
+
hr {
|
54
|
+
margin-bottom: 15px;
|
55
|
+
line-height: 1.5em;
|
56
|
+
}
|
57
|
+
blockquote {
|
58
|
+
margin-left: 3em;
|
59
|
+
font-style: italic;
|
60
|
+
color: #777;
|
61
|
+
}
|
62
|
+
ul, ol {
|
63
|
+
padding-left: 2em;
|
64
|
+
}
|
65
|
+
ul ul,
|
66
|
+
ol ol,
|
67
|
+
ul ol,
|
68
|
+
ol ul {
|
69
|
+
border: none;
|
70
|
+
margin: 2px !important;
|
71
|
+
padding: 0;
|
72
|
+
padding-left: 2em;
|
73
|
+
}
|
74
|
+
dl dt { font-weight: bold; }
|
75
|
+
dd { margin-left: 1em;}
|
76
|
+
|
77
|
+
table {
|
78
|
+
border-collapse: collapse;
|
79
|
+
font-size: 1em;
|
80
|
+
}
|
81
|
+
table td {
|
82
|
+
border: 1px solid #ddd;
|
83
|
+
padding: 5px;
|
84
|
+
}
|
85
|
+
table thead td {
|
86
|
+
border-bottom: 2px solid #000 !important;
|
87
|
+
font-weight: bold;
|
88
|
+
}
|
89
|
+
code, pre {
|
90
|
+
font-family: monospace sans-serif;
|
91
|
+
}
|
92
|
+
code {
|
93
|
+
background-color: #d8d7d7;
|
94
|
+
}
|
95
|
+
pre {
|
96
|
+
padding: 1em;
|
97
|
+
border: 1px dashed #ccc;
|
98
|
+
background: #f5f5f5;
|
99
|
+
overflow: auto;
|
100
|
+
}
|
101
|
+
hr {
|
102
|
+
display: block;
|
103
|
+
height: 1px;
|
104
|
+
border: 0;
|
105
|
+
border-top: 1px solid #ccc;
|
106
|
+
}
|
107
|
+
|
108
|
+
h1, h2, h3, h4,h5 {
|
109
|
+
font-weight: bold;
|
110
|
+
}
|
111
|
+
|
112
|
+
h1 {
|
113
|
+
font-size: 36px;
|
114
|
+
line-height: 40px;
|
115
|
+
margin-bottom: 10px;
|
116
|
+
}
|
117
|
+
h2 {
|
118
|
+
font-size: 30px;
|
119
|
+
line-height: 38px;
|
120
|
+
margin-bottom: 15px;
|
121
|
+
}
|
122
|
+
h3 {
|
123
|
+
font-size: 24px;
|
124
|
+
line-height: 30px;
|
125
|
+
margin-bottom: 10px;
|
126
|
+
}
|
127
|
+
h4 {
|
128
|
+
font-size: 18px;
|
129
|
+
line-height: 24px;
|
130
|
+
margin-bottom: 10px;
|
131
|
+
}
|
132
|
+
h5 {
|
133
|
+
font-size: 1em;
|
134
|
+
margin-bottom: 10px;
|
135
|
+
}
|