action_admin 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/admin/upload-preview.svg +34 -0
- data/app/assets/stylesheets/action_admin/action-admin.scss +59 -1
- data/app/assets/stylesheets/action_admin/action-admin/tinymce.scss +16 -0
- data/app/controllers/concerns/action_admin/actionable.rb +10 -1
- data/app/helpers/action_admin/admin_helper.rb +8 -0
- data/app/inputs/action_admin/attachment_input.rb +1 -1
- data/app/inputs/action_admin/upload_input.rb +62 -0
- data/app/views/admin/common/_dropzone_template.html.slim +11 -0
- data/app/views/admin/common/_media_modal.html.slim +59 -0
- data/app/views/admin/records/edit.html.slim +1 -1
- data/app/views/admin/records/new.html.slim +1 -1
- data/app/views/admin/templates/_upload.html.slim +22 -0
- data/app/views/layouts/admin.html.slim +2 -0
- data/lib/action_admin/engine.rb +2 -1
- data/lib/action_admin/header.rb +2 -2
- data/lib/action_admin/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c130d9173df9250a76f41a1fb2687c8042ac842
|
4
|
+
data.tar.gz: d26a179831e85af820d332744ad27b64c15e2380
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c081bec36607b46f36237b4782fcd56f871bcfbd3a7c2bc55d1695df3452260751d25512991006f73b2940214acced809d883389306f2f046626119ffc5f882
|
7
|
+
data.tar.gz: e3168380227a10278a910c516a423b840bb5c16a458dd9d637df1046724367e2eeecc996978a1aaf5312604e036845d32908473be8481d6b457387e9827218d1
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<svg
|
3
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
4
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
5
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
6
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
8
|
+
id="svg2"
|
9
|
+
height="250"
|
10
|
+
width="250"
|
11
|
+
version="1.1">
|
12
|
+
<defs
|
13
|
+
id="defs4" />
|
14
|
+
<metadata
|
15
|
+
id="metadata7">
|
16
|
+
<rdf:RDF>
|
17
|
+
<cc:Work
|
18
|
+
rdf:about="">
|
19
|
+
<dc:format>image/svg+xml</dc:format>
|
20
|
+
<dc:type
|
21
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
22
|
+
<dc:title></dc:title>
|
23
|
+
</cc:Work>
|
24
|
+
</rdf:RDF>
|
25
|
+
</metadata>
|
26
|
+
<path
|
27
|
+
d="M 0,-1.5258789e-5 H 250 V 250 H 0 Z"
|
28
|
+
id="rect3126"
|
29
|
+
style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.79056942" />
|
30
|
+
<path
|
31
|
+
d="m 161.401,117.51166 c -2.14973,-18.309425 -17.6266,-32.511675 -36.40113,-32.511675 -18.77454,0 -34.25114,14.20225 -36.40087,32.511675 -13.03272,0 -23.599,10.63051 -23.599,23.74417 0,13.11364 10.5649,23.74415 23.59762,23.74415 h 72.80477 c 13.03271,0 23.59761,-10.63051 23.59761,-23.74415 0,-13.11366 -10.56627,-23.74417 -23.599,-23.74417 z m -58.41308,32.26113 c -2.27933,0 -4.12723,-1.85937 -4.12723,-4.15286 0,-2.29349 1.8479,-4.15287 4.12723,-4.15287 2.27934,0 4.12724,1.85938 4.12724,4.15287 0,2.29377 -1.84762,4.15286 -4.12724,4.15286 z m 22.01195,0 c -2.27935,0 -4.12725,-1.85937 -4.12725,-4.15286 0,-2.29349 1.8479,-4.15287 4.12725,-4.15287 2.27933,0 4.12723,1.85938 4.12723,4.15287 0,2.29349 -1.84762,4.15286 -4.12723,4.15286 z m 22.01194,0 c -2.27935,0 -4.12725,-1.85937 -4.12725,-4.15286 0,-2.29349 1.8479,-4.15287 4.12725,-4.15287 2.27933,0 4.12723,1.85938 4.12723,4.15287 0,2.29349 -1.84763,4.15286 -4.12723,4.15286 z"
|
32
|
+
id="path3149"
|
33
|
+
style="fill:#808080;fill-opacity:1" />
|
34
|
+
</svg>
|
@@ -1,12 +1,70 @@
|
|
1
1
|
@import "foundation-components";
|
2
2
|
@import "bedrock-components";
|
3
3
|
|
4
|
+
|
5
|
+
// Panels
|
6
|
+
|
4
7
|
.panel {
|
5
8
|
|
6
|
-
.input:last-child {
|
9
|
+
.input:last-child:not(.error) {
|
7
10
|
|
8
11
|
input, textarea, select, .select2 {
|
9
12
|
margin-bottom: 0;
|
10
13
|
}
|
11
14
|
}
|
15
|
+
|
16
|
+
.input.error:last-child {
|
17
|
+
|
18
|
+
.form-error {
|
19
|
+
margin-bottom: 0;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
|
25
|
+
// Invalid Inputs
|
26
|
+
|
27
|
+
.input.error {
|
28
|
+
|
29
|
+
input, textarea, select {
|
30
|
+
@include form-input-error;
|
31
|
+
}
|
32
|
+
|
33
|
+
&.attachment {
|
34
|
+
@include form-input-error;
|
35
|
+
border: 1px solid;
|
36
|
+
color: $alert-color;
|
37
|
+
position: relative;
|
38
|
+
padding-bottom: $global-padding * 2;
|
39
|
+
|
40
|
+
.no-content {
|
41
|
+
color: $alert-color;
|
42
|
+
}
|
43
|
+
|
44
|
+
.form-error {
|
45
|
+
text-align: center;
|
46
|
+
position: absolute;
|
47
|
+
bottom: 0;
|
48
|
+
left: 0;
|
49
|
+
width: 100%;
|
50
|
+
background: $alert-color;
|
51
|
+
color: $white;
|
52
|
+
margin: 0;
|
53
|
+
padding: ($global-padding / 4) ($global-padding / 2);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
}
|
58
|
+
|
59
|
+
.input-group-list {
|
60
|
+
|
61
|
+
.input.error {
|
62
|
+
|
63
|
+
.form-error {
|
64
|
+
margin: 0;
|
65
|
+
background: $alert-color;
|
66
|
+
color: $white;
|
67
|
+
padding: ($global-padding / 4) ($global-padding / 2);
|
68
|
+
}
|
69
|
+
}
|
12
70
|
}
|
@@ -4,3 +4,19 @@
|
|
4
4
|
@include foundation-typography;
|
5
5
|
@include foundation-button;
|
6
6
|
@include foundation-forms;
|
7
|
+
|
8
|
+
|
9
|
+
// Custom styles
|
10
|
+
|
11
|
+
body {
|
12
|
+
margin: $global-margin / 2;
|
13
|
+
font-size: inherit !important;
|
14
|
+
}
|
15
|
+
|
16
|
+
img[data-mce-style*="float: left"] {
|
17
|
+
margin-right: $global-margin;
|
18
|
+
}
|
19
|
+
|
20
|
+
img[data-mce-style*="float: right"] {
|
21
|
+
margin-left: $global-margin;
|
22
|
+
}
|
@@ -6,7 +6,10 @@ module ActionAdmin
|
|
6
6
|
include Controller
|
7
7
|
|
8
8
|
class_attribute :action_header
|
9
|
-
|
9
|
+
class_attribute :_action_templates
|
10
|
+
|
11
|
+
self.action_header = Header.new
|
12
|
+
self._action_templates = {}
|
10
13
|
end
|
11
14
|
|
12
15
|
class_methods do
|
@@ -16,6 +19,12 @@ module ActionAdmin
|
|
16
19
|
self.action_header.action(nil)
|
17
20
|
end
|
18
21
|
|
22
|
+
def action_template(action, template, options={})
|
23
|
+
self._action_templates = self._action_templates.merge(
|
24
|
+
action => options.merge(partial: "admin/templates/#{template}")
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
19
28
|
def header(action, &block)
|
20
29
|
self.action_header.action(action)
|
21
30
|
yield self.action_header
|
@@ -38,5 +38,13 @@ module ActionAdmin
|
|
38
38
|
def admin_present_many(records, presenter=nil)
|
39
39
|
records.to_a.map { |r| admin_present(r, presenter) }
|
40
40
|
end
|
41
|
+
|
42
|
+
def admin_render_template(fallback)
|
43
|
+
template = Hash(controller._action_templates[:"#{action_name}"])
|
44
|
+
partial = template.fetch :partial, fallback
|
45
|
+
options = template.except(:partial)
|
46
|
+
|
47
|
+
render partial, options
|
48
|
+
end
|
41
49
|
end
|
42
50
|
end
|
@@ -34,7 +34,7 @@ module ActionAdmin
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def attachment(image_url=nil)
|
37
|
-
image = content_tag :img, nil, src: image_url, class: 'width-100 margin-bottom-1', data: { src:
|
37
|
+
image = content_tag :img, nil, src: image_url, class: 'width-100 margin-bottom-1', data: { src: 'file.preview.url', url: "#{template.root_url.chomp('/')}[src]" }
|
38
38
|
button = content_tag :a, 'Remove Thumbnail', class: 'button alert small hollow margin-0', data: { remove: '' }
|
39
39
|
|
40
40
|
content_tag :div, hidden_input + image + button, class: 'attachment text-center', data: { list_item: '' }
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module ActionAdmin
|
2
|
+
class UploadInput < SimpleForm::Inputs::FileInput
|
3
|
+
def input(wrapper_options)
|
4
|
+
out = ActiveSupport::SafeBuffer.new
|
5
|
+
data = { file_input: '', previews_container: "##{input_html_id}-preview" }
|
6
|
+
html = content_tag :div, input_placeholder, id: input_html_id, class: 'dropzone', data: data
|
7
|
+
|
8
|
+
out << html
|
9
|
+
out << input_template
|
10
|
+
end
|
11
|
+
|
12
|
+
def input_placeholder
|
13
|
+
span = content_tag :span, 'Drop file here', class: 'margin-bottom-1'
|
14
|
+
icon = content_tag :i, nil, class: 'mdi mdi-upload'
|
15
|
+
button = content_tag :label, 'Upload File', for: attr_html_id, class: 'button success small hollow margin-0'
|
16
|
+
content = content_tag :div, icon + span + file_input + button, class: 'no-content'
|
17
|
+
image = attachment(attachment_url) if attachment_url.present?
|
18
|
+
|
19
|
+
content_tag(:div, content, class: 'dz-message bordered') +
|
20
|
+
content_tag(:div, image, id: "#{input_html_id}-preview")
|
21
|
+
end
|
22
|
+
|
23
|
+
def file_input
|
24
|
+
@builder.file_field(attribute_name, input_html_options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def hidden_input
|
28
|
+
if object.respond_to?("#{attribute_name}_cache")
|
29
|
+
@builder.hidden_field("#{attribute_name}_cache")
|
30
|
+
else
|
31
|
+
''.html_safe
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def attr_html_id
|
36
|
+
file_input[/id=\"(.*)\"/, 1]
|
37
|
+
end
|
38
|
+
|
39
|
+
def input_html_id
|
40
|
+
attr_html_id.dasherize
|
41
|
+
end
|
42
|
+
|
43
|
+
def attachment_url
|
44
|
+
object.send(attribute_name).try(:url)
|
45
|
+
end
|
46
|
+
|
47
|
+
def attachment(image_url=nil)
|
48
|
+
image = content_tag :img, nil, src: image_url, class: 'width-100 margin-bottom-1', 'dz-thumbnail' => ''
|
49
|
+
button = content_tag :a, 'Remove File', class: 'button alert small hollow margin-0', 'dz-remove' => ''
|
50
|
+
|
51
|
+
content_tag :div, hidden_input + image + button, class: 'text-center'
|
52
|
+
end
|
53
|
+
|
54
|
+
def input_template
|
55
|
+
content_tag :script, attachment, id: "#{input_html_id}-preview-template", type: 'text/template'
|
56
|
+
end
|
57
|
+
|
58
|
+
def label(wrapper_options)
|
59
|
+
''
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
script#dropzone-preview-template type="text/template"
|
2
|
+
.attachment
|
3
|
+
.thumbnail
|
4
|
+
img data-dz-thumbnail="" src=asset_url('admin/upload-preview.svg')
|
5
|
+
span.filename data-dz-name=""
|
6
|
+
span.size data-dz-size=""
|
7
|
+
.progress.success
|
8
|
+
span.progress-meter data-dz-uploadprogress=""
|
9
|
+
i.icon-success.mdi.mdi-check
|
10
|
+
i.icon-error.mdi.mdi-close
|
11
|
+
.message data-dz-errormessage=""
|
@@ -0,0 +1,59 @@
|
|
1
|
+
ruby:
|
2
|
+
current_record = Medium.new
|
3
|
+
options = {
|
4
|
+
dropzone_upload: "",
|
5
|
+
clickable: "#media-modal-upload-button",
|
6
|
+
previews_container: "#media-modal-upload-previews",
|
7
|
+
param_name: "medium[file]",
|
8
|
+
thumbnail_height: "300",
|
9
|
+
thumbnail_width: "300"
|
10
|
+
}
|
11
|
+
|
12
|
+
#media-modal.reveal.full.reveal-panel data-media-reveal="" data-media-url=admin_media_url(per_page: 10000, format: :json)
|
13
|
+
.panel
|
14
|
+
.panel-header.border
|
15
|
+
= 'Add Media'
|
16
|
+
button.close-button aria-label='Close modal' data-close="" type="button"
|
17
|
+
span aria-hidden="true" ×
|
18
|
+
|
19
|
+
.panel-header.border.padding-0
|
20
|
+
ul#media-modal-tabs.tabs.padding-0.border-none data-tabs=""
|
21
|
+
li.tabs-title.is-active
|
22
|
+
a aria-selected="true" href="#media-modal-library"
|
23
|
+
i.mdi.mdi-play-circle-outline
|
24
|
+
| Library
|
25
|
+
li.tabs-title
|
26
|
+
a href="#media-modal-uploads"
|
27
|
+
i.mdi.mdi-upload
|
28
|
+
| Upload
|
29
|
+
|
30
|
+
.panel-content.border.padding-0
|
31
|
+
.tabs-content.border-none.padding-0 data-tabs-content="media-modal-tabs"
|
32
|
+
#media-modal-library.tabs-panel.is-active
|
33
|
+
.attachments-grid data-list-select=""
|
34
|
+
#media-modal-uploads.tabs-panel
|
35
|
+
= admin_form_for([:admin, current_record], html: { id: 'media-modal-upload', class: 'dropzone', data: options }) do |f|
|
36
|
+
= f.input :file, as: :hidden
|
37
|
+
|
38
|
+
.dz-message.bordered.margin-bottom-1
|
39
|
+
.no-content
|
40
|
+
i.mdi.mdi-upload
|
41
|
+
span = 'Drop files here to upload'
|
42
|
+
a#media-modal-upload-button.button.success.hollow.margin-top-1 = 'Select Files'
|
43
|
+
|
44
|
+
#media-modal-upload-previews.attachments-grid
|
45
|
+
|
46
|
+
.panel-footer
|
47
|
+
.grid-x
|
48
|
+
.cell.auto
|
49
|
+
button.button.hollow.alert.margin-0 aria-label='Close modal' data-close="" type="button" = 'Close'
|
50
|
+
|
51
|
+
.cell.shrink
|
52
|
+
button.button.margin-0 aria-label='Insert Media' data-insert="" type="button" = 'Insert Media'
|
53
|
+
|
54
|
+
script#media-modal-item-template type="text/template"
|
55
|
+
.attachment data-list-item=""
|
56
|
+
.thumbnail
|
57
|
+
img data-src="file.small.url" data-url="#{root_url.chomp('/')}[src]" src=asset_url('admin/upload-preview.svg')
|
58
|
+
span.filename data-text="name"
|
59
|
+
span.check-button.mdi.mdi-check
|
@@ -1 +1 @@
|
|
1
|
-
=
|
1
|
+
= admin_render_template 'form'
|
@@ -1 +1 @@
|
|
1
|
-
=
|
1
|
+
= admin_render_template 'form'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
ruby:
|
2
|
+
options = {
|
3
|
+
dropzone_upload: "",
|
4
|
+
clickable: "#media-upload-button",
|
5
|
+
previews_container: "#media-upload-previews",
|
6
|
+
param_name: "#{current_record.class.model_name.singular}[#{field}]",
|
7
|
+
thumbnail_height: "300",
|
8
|
+
thumbnail_width: "300"
|
9
|
+
}
|
10
|
+
|
11
|
+
= admin_form_for([:admin, current_record], html: { id: 'media-upload', class: 'dropzone', data: options }) do |f|
|
12
|
+
= f.input field, as: :hidden
|
13
|
+
|
14
|
+
.panel
|
15
|
+
.panel-content
|
16
|
+
.dz-message.bordered
|
17
|
+
.no-content
|
18
|
+
i.mdi.mdi-upload
|
19
|
+
span = 'Drop files here to upload'
|
20
|
+
a#media-upload-button.button.success.hollow.margin-top-1 = 'Select Files'
|
21
|
+
|
22
|
+
#media-upload-previews.attachments-grid
|
@@ -20,6 +20,8 @@ html
|
|
20
20
|
= render 'admin/common/header'
|
21
21
|
= yield
|
22
22
|
= render 'admin/common/footer'
|
23
|
+
= render 'admin/common/media_modal'
|
24
|
+
= render 'admin/common/dropzone_template'
|
23
25
|
|
24
26
|
#offcanvas.off-canvas.position-right data-off-canvas=""
|
25
27
|
= render 'admin/common/messagebar'
|
data/lib/action_admin/engine.rb
CHANGED
@@ -11,7 +11,8 @@ module ActionAdmin
|
|
11
11
|
app.config.assets.paths << root.join('app', 'assets', 'images', sf).to_s
|
12
12
|
end
|
13
13
|
|
14
|
-
app.config.assets.precompile += %w(admin/application.js admin/application.css admin/tinymce-editor.css
|
14
|
+
app.config.assets.precompile += %w(admin/application.js admin/application.css admin/tinymce-editor.css)
|
15
|
+
app.config.assets.precompile += %w(images/admin/*.* admin/*.svg admin/*.png)
|
15
16
|
end
|
16
17
|
|
17
18
|
initializer 'action_admin', before: :load_config_initializers do
|
data/lib/action_admin/header.rb
CHANGED
@@ -51,8 +51,8 @@ module ActionAdmin
|
|
51
51
|
return {} unless context.controller.respond_to? :permitted_params
|
52
52
|
|
53
53
|
{
|
54
|
-
show: { label: 'View', icon: 'eye', url: :record_path },
|
55
|
-
index: { label: 'Back', icon: 'arrow-left', url: :records_path, html: { class: '
|
54
|
+
show: { label: 'View', icon: 'eye', url: :record_path, html: { class: 'success' } },
|
55
|
+
index: { label: 'Back', icon: 'arrow-left', url: :records_path, html: { class: 'secondary' } },
|
56
56
|
new: { label: 'New', icon: 'plus', url: :new_record_path, html: { class: 'success' } },
|
57
57
|
edit: { label: 'Edit', icon: 'pencil', url: :edit_record_path, html: { class: 'warning' } },
|
58
58
|
destroy: { label: 'Delete', icon: 'delete', url: :record_path, html: { class: 'alert' }, method: 'delete' }
|
data/lib/action_admin/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonian Guveli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -175,6 +175,7 @@ files:
|
|
175
175
|
- README.md
|
176
176
|
- Rakefile
|
177
177
|
- app/assets/images/admin/logo.svg
|
178
|
+
- app/assets/images/admin/upload-preview.svg
|
178
179
|
- app/assets/javascripts/action_admin/action-admin.js
|
179
180
|
- app/assets/javascripts/admin/application.js
|
180
181
|
- app/assets/stylesheets/action_admin/action-admin.scss
|
@@ -202,6 +203,7 @@ files:
|
|
202
203
|
- app/inputs/action_admin/tag_list_input.rb
|
203
204
|
- app/inputs/action_admin/tinymce_input.rb
|
204
205
|
- app/inputs/action_admin/title_input.rb
|
206
|
+
- app/inputs/action_admin/upload_input.rb
|
205
207
|
- app/presenters/action_admin/presenter.rb
|
206
208
|
- app/presenters/concerns/action_admin/presentable.rb
|
207
209
|
- app/views/action_admin/devise/confirmations/new.html.slim
|
@@ -214,9 +216,11 @@ files:
|
|
214
216
|
- app/views/action_admin/devise/unlocks/new.html.slim
|
215
217
|
- app/views/action_admin/welcome/index.html.slim
|
216
218
|
- app/views/admin/common/_alerts.html.slim
|
219
|
+
- app/views/admin/common/_dropzone_template.html.slim
|
217
220
|
- app/views/admin/common/_footer.html.slim
|
218
221
|
- app/views/admin/common/_header.html.slim
|
219
222
|
- app/views/admin/common/_logobar.html.slim
|
223
|
+
- app/views/admin/common/_media_modal.html.slim
|
220
224
|
- app/views/admin/common/_messagebar.html.slim
|
221
225
|
- app/views/admin/common/_noresults.html.slim
|
222
226
|
- app/views/admin/common/_sidebar.html.slim
|
@@ -231,6 +235,7 @@ files:
|
|
231
235
|
- app/views/admin/records/index.html.slim
|
232
236
|
- app/views/admin/records/new.html.slim
|
233
237
|
- app/views/admin/records/show.html.slim
|
238
|
+
- app/views/admin/templates/_upload.html.slim
|
234
239
|
- app/views/layouts/admin.html.slim
|
235
240
|
- app/views/layouts/admin/devise.html.slim
|
236
241
|
- config/initializers/admin_simple_form.rb
|