activeadmin-settings 0.2.6 → 0.2.7
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.
- 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
|
+
}
|