effective_bootstrap 0.3.22 → 0.4.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 +4 -4
- data/app/assets/javascripts/effective_bootstrap.js +1 -0
- data/app/assets/javascripts/effective_ck_editor/initialize.js.coffee +72 -0
- data/app/assets/javascripts/effective_ck_editor/input.js +1 -0
- data/app/assets/javascripts/effective_file/initialize.js.coffee +2 -0
- data/app/assets/stylesheets/effective_file/input.scss +8 -4
- data/app/models/effective/form_builder.rb +4 -0
- data/app/models/effective/form_input.rb +1 -1
- data/app/models/effective/form_inputs/ck_editor.rb +48 -0
- data/app/models/effective/form_inputs/file_field.rb +75 -5
- data/lib/effective_bootstrap/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b583f66f6d1a4bb7cbb97779f5328740b08b1c1f
|
4
|
+
data.tar.gz: bbe3c4203d1b0ff0cdf5cc5b486b7513432953ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cc537b958cf168a041b967bde69d3453a277301f026f50695ee99baa3a1e7c565288ab1356c6b09f1e955cc5a0418525d59c742803356509d79d536140ec57d
|
7
|
+
data.tar.gz: f8e1f99e6f71b1e9476d9efe6166e028aa465a29148cd205e82170d4d772ac4e4aa6a85334575a14c7577eb9447ced2ea56bb26205e2d98c5263b0e71f8bf42c
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# http://eonasdan.github.io/bootstrap-datetimepicker/Options/
|
2
|
+
(this.EffectiveBootstrap || {}).effective_ck_editor = ($element, options) ->
|
3
|
+
setupCkeditor($element)
|
4
|
+
initCkeditor($element, $element.data('input-js-options'))
|
5
|
+
|
6
|
+
# This is a one-time initialization that is done to check that all the scripts are properly set up
|
7
|
+
setupCkeditor = ($inputs) ->
|
8
|
+
return unless $inputs.length > 0
|
9
|
+
|
10
|
+
input_js_options = $inputs.first().data('input-js-options') || {}
|
11
|
+
|
12
|
+
ckeditor_present = ((try CKEDITOR.version) || '').length > 0
|
13
|
+
$head = $('head')
|
14
|
+
|
15
|
+
unless ckeditor_present
|
16
|
+
$head.append("<link href='#{input_js_options['effective_ckeditor_css_path']}' type='text/css', media='screen' rel='stylesheet' />")
|
17
|
+
jQuery.ajax({url: input_js_options['effective_ckeditor_js_path'], dataType: 'script', cache: true, async: false})
|
18
|
+
|
19
|
+
initCkeditor = ($element, input_options) ->
|
20
|
+
options =
|
21
|
+
toolbar: (input_options['toolbar'] || 'full')
|
22
|
+
effectiveRegionType: 'full'
|
23
|
+
customConfig: ''
|
24
|
+
enterMode: CKEDITOR.ENTER_P
|
25
|
+
shiftEnterMode: CKEDITOR.ENTER_BR
|
26
|
+
startupOutlineBlocks: true
|
27
|
+
startupShowBorders: true
|
28
|
+
disableNativeTableHandles: true
|
29
|
+
disableNativeSpellChecker: false
|
30
|
+
extraPlugins: 'effective_regions,effective_assets'
|
31
|
+
removePlugins: 'elementspath'
|
32
|
+
format_tags: 'p;h1;h2;h3;h4;h5;h6;pre;div'
|
33
|
+
templates: 'effective_regions'
|
34
|
+
templates_files: []
|
35
|
+
templates_replaceContent: false
|
36
|
+
filebrowserWindowHeight: 600
|
37
|
+
filebrowserWindowWidth: 800
|
38
|
+
filebrowserBrowseUrl: window.CKEDITOR_FILE_BROWSE_URL
|
39
|
+
filebrowserImageBrowseUrl: window.CKEDITOR_FILE_BROWSE_URL + '?only=images'
|
40
|
+
toolbar_full: [
|
41
|
+
{ name: 'html', items: ['Sourcedialog', '-', 'ShowBlocks'] },
|
42
|
+
{ name: 'editing', items: ['Undo', 'Redo'] },
|
43
|
+
{ name: 'clipboard', items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord'] },
|
44
|
+
{ name: 'justify', items: ['JustifyLeft', 'JustifyCenter', 'JustifyRight']},
|
45
|
+
{ name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat'] },
|
46
|
+
{ name: 'lists', items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent'] },
|
47
|
+
'/'
|
48
|
+
{ name: 'definedstyles', items: ['Styles', 'Format'] },
|
49
|
+
{ name: 'links', items: ['Link', 'Unlink', '-', 'Anchor'] },
|
50
|
+
{ name: 'insert', items: ['Image', 'oembed'] },
|
51
|
+
{ name: 'lists', items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent'] },
|
52
|
+
{ name: 'insert2', items: ['Table', 'EffectiveReferences', 'Blockquote', 'HorizontalRule', 'PageBreak'] },
|
53
|
+
{ name: 'colors', items: ['TextColor', 'BGColor'] },
|
54
|
+
{ name: 'snippets', items: ['Templates', 'InsertSnippet'] }
|
55
|
+
],
|
56
|
+
toolbar_simple: [
|
57
|
+
{ name: 'definedstyles', items: ['Format'] },
|
58
|
+
{ name: 'html', items: ['ShowBlocks'] },
|
59
|
+
{ name: 'justify', items: ['JustifyLeft', 'JustifyCenter', 'JustifyRight']}
|
60
|
+
{ name: 'basicstyles', items: ['Bold', 'Italic', 'Underline'] },
|
61
|
+
{ name: 'insert', items: ['Link', 'Table'] },
|
62
|
+
{ name: 'lists', items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent'] },
|
63
|
+
]
|
64
|
+
|
65
|
+
options[k] = v for k, v of ($element.data('input-js-options') || {})
|
66
|
+
|
67
|
+
ckeditor = CKEDITOR.replace($element.attr('id'), options)
|
68
|
+
|
69
|
+
ckeditor.on 'insertElement', (event) ->
|
70
|
+
element = $(event.data.$)
|
71
|
+
if element.is('table')
|
72
|
+
element.removeAttr('style').addClass('table')
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require ./initialize
|
@@ -15,3 +15,5 @@ $(document).on 'direct-upload:error', (event) ->
|
|
15
15
|
$(document).on 'direct-upload:end', (event) ->
|
16
16
|
$("[data-direct-upload-id=#{event.detail.id}]").addClass('direct-upload--complete')
|
17
17
|
|
18
|
+
$(document).on 'change', "input[type='file'][data-click-submit]", (event) ->
|
19
|
+
$(event.currentTarget).closest('form').find('button[type=submit],input[type=submit]').first().click()
|
@@ -1,5 +1,4 @@
|
|
1
|
-
.direct-uploads {
|
2
|
-
}
|
1
|
+
.direct-uploads {}
|
3
2
|
|
4
3
|
.direct-upload {
|
5
4
|
display: inline-block;
|
@@ -12,8 +11,8 @@
|
|
12
11
|
line-height: 13px;
|
13
12
|
}
|
14
13
|
|
15
|
-
.direct-upload--pending {
|
16
|
-
opacity: 0.6;
|
14
|
+
.direct-upload--pending {
|
15
|
+
opacity: 0.6;
|
17
16
|
}
|
18
17
|
|
19
18
|
.direct-upload__progress {
|
@@ -38,3 +37,8 @@
|
|
38
37
|
input[type=file][data-direct-upload-url][disabled] {
|
39
38
|
display: none;
|
40
39
|
}
|
40
|
+
|
41
|
+
// Attachments
|
42
|
+
table.effective_file_attachments {
|
43
|
+
img { max-width: 128px; max-height: 128px;}
|
44
|
+
}
|
@@ -34,6 +34,10 @@ module Effective
|
|
34
34
|
Effective::FormInputs::Checks.new(name, options, builder: self).to_html
|
35
35
|
end
|
36
36
|
|
37
|
+
def ck_editor(name, options = {}, &block)
|
38
|
+
Effective::FormInputs::CkEditor.new(name, options, builder: self).to_html(&block)
|
39
|
+
end
|
40
|
+
|
37
41
|
def date_field(name, options = {})
|
38
42
|
Effective::FormInputs::DateField.new(name, options, builder: self).to_html { super(name, options) }
|
39
43
|
end
|
@@ -7,7 +7,7 @@ module Effective
|
|
7
7
|
EXCLUSIVE_CLASS_SUFFIXES = ['-primary', '-secondary', '-success', '-danger', '-warning', '-info', '-light', '-dark']
|
8
8
|
|
9
9
|
delegate :object, to: :@builder
|
10
|
-
delegate :capture, :content_tag, :link_to, :icon, to: :@template
|
10
|
+
delegate :capture, :content_tag, :link_to, :icon, :asset_path, to: :@template
|
11
11
|
|
12
12
|
# So this takes in the options for an entire form group.
|
13
13
|
def initialize(name, options, builder:, html_options: nil)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Effective
|
2
|
+
module FormInputs
|
3
|
+
class CkEditor < Effective::FormInput
|
4
|
+
|
5
|
+
def build_input(&block)
|
6
|
+
content = value.presence || (capture(&block) if block_given?)
|
7
|
+
@builder.super_text_area(name, (options[:input] || {}).merge(autocomplete: 'off'))
|
8
|
+
end
|
9
|
+
|
10
|
+
def input_html_options
|
11
|
+
{ class: 'effective_ck_editor form-control', id: unique_id }
|
12
|
+
end
|
13
|
+
|
14
|
+
def input_js_options
|
15
|
+
{
|
16
|
+
effective_ckeditor_js_path: asset_path('effective_ckeditor.js'),
|
17
|
+
effective_ckeditor_css_path: asset_path('effective_ckeditor.css'),
|
18
|
+
contentsCss: contentsCss,
|
19
|
+
toolbar: toolbar,
|
20
|
+
height: height,
|
21
|
+
width: width
|
22
|
+
}.compact
|
23
|
+
end
|
24
|
+
|
25
|
+
def contentsCss
|
26
|
+
@contents_css ||= case (obj = options.delete(:contentsCss))
|
27
|
+
when :bootstrap
|
28
|
+
'https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css'
|
29
|
+
when false then nil
|
30
|
+
else obj || asset_path('application.css')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def toolbar
|
35
|
+
@toolbar ||= (options.delete(:toolbar) || :full)
|
36
|
+
end
|
37
|
+
|
38
|
+
def height
|
39
|
+
@height ||= options.delete(:height)
|
40
|
+
end
|
41
|
+
|
42
|
+
def width
|
43
|
+
@width ||= options.delete(:width)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -3,7 +3,14 @@ module Effective
|
|
3
3
|
class FileField < Effective::FormInput
|
4
4
|
|
5
5
|
def build_input(&block)
|
6
|
-
|
6
|
+
case attachments_style
|
7
|
+
when :card
|
8
|
+
build_attachments + build_uploads + super
|
9
|
+
when :table, :ck_assets
|
10
|
+
super + build_uploads + build_attachments
|
11
|
+
else
|
12
|
+
raise('unsupported attachments_style, try :card or :table')
|
13
|
+
end
|
7
14
|
end
|
8
15
|
|
9
16
|
def input_html_options
|
@@ -11,8 +18,9 @@ module Effective
|
|
11
18
|
class: 'form-control form-control-file btn btn-outline-secondary',
|
12
19
|
multiple: multiple?,
|
13
20
|
direct_upload: true,
|
14
|
-
'data-progress-template': progress_template
|
15
|
-
|
21
|
+
'data-progress-template': progress_template,
|
22
|
+
'data-click-submit': (true if click_submit?),
|
23
|
+
}.compact
|
16
24
|
end
|
17
25
|
|
18
26
|
def multiple?
|
@@ -24,10 +32,63 @@ module Effective
|
|
24
32
|
|
25
33
|
attachments = object.send(name).respond_to?(:length) ? object.send(name) : [object.send(name)]
|
26
34
|
|
27
|
-
|
35
|
+
case attachments_style
|
36
|
+
when :card
|
37
|
+
build_card_attachments(attachments)
|
38
|
+
when :table, :ck_assets
|
39
|
+
build_table_attachments(attachments)
|
40
|
+
else
|
41
|
+
raise('unsupported attachments_style, try :card or :table')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def build_table_attachments(attachments)
|
46
|
+
content_tag(:table, class: 'table table-hover effective_file_attachments') do
|
47
|
+
content_tag(:thead) do
|
48
|
+
content_tag(:tr) do
|
49
|
+
content_tag(:th, 'Image') +
|
50
|
+
content_tag(:th, 'Title') +
|
51
|
+
content_tag(:th, 'Size') +
|
52
|
+
content_tag(:th, '')
|
53
|
+
end
|
54
|
+
end +
|
55
|
+
content_tag(:tbody) do
|
56
|
+
attachments.map { |attachment| content_tag(:tr, build_table_attachment(attachment)) }.join.html_safe
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def build_table_attachment(attachment)
|
62
|
+
url = (@template.url_for(attachment) rescue false)
|
63
|
+
return unless url
|
64
|
+
|
65
|
+
content_tag(:td) do
|
66
|
+
if attachment.image?
|
67
|
+
content_tag(:img, '', class: '', src: url, alt: attachment.filename.to_s)
|
68
|
+
end
|
69
|
+
end +
|
70
|
+
|
71
|
+
content_tag(:td, link_to(attachment.filename, url)) +
|
72
|
+
content_tag(:td, (attachment.content_type + '<br>' + @template.number_to_human_size(attachment.byte_size)).html_safe) +
|
73
|
+
|
74
|
+
content_tag(:td) do
|
75
|
+
if attachments_style == :ck_assets
|
76
|
+
content = if attachment.image?
|
77
|
+
content_tag(:img, '', class: '', src: url, alt: attachment.filename.to_s)
|
78
|
+
else
|
79
|
+
link_to(attachment.filename, url)
|
80
|
+
end
|
81
|
+
|
82
|
+
link_to('Attach', url, class: 'btn btn-primary', 'data-effective-file-insert-ck-asset': true, 'data-asset': content, 'data-asset-id': 3)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def build_card_attachments(attachments)
|
88
|
+
content_tag(:div, attachments.map { |attachment| build_card_attachment(attachment) }.join.html_safe, class: 'effective_file_attachments row')
|
28
89
|
end
|
29
90
|
|
30
|
-
def
|
91
|
+
def build_card_attachment(attachment)
|
31
92
|
url = (@template.url_for(attachment) rescue false)
|
32
93
|
return unless url
|
33
94
|
|
@@ -63,6 +124,15 @@ module Effective
|
|
63
124
|
end
|
64
125
|
end
|
65
126
|
|
127
|
+
def click_submit?
|
128
|
+
return @click_submit unless @click_submit.nil?
|
129
|
+
@click_submit ||= (options.delete(:click_submit) || false)
|
130
|
+
end
|
131
|
+
|
132
|
+
def attachments_style
|
133
|
+
@attachments_style ||= (options[:input].delete(:attachments_style) || options[:input].delete(:attachment_style) || :card)
|
134
|
+
end
|
135
|
+
|
66
136
|
end
|
67
137
|
end
|
68
138
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_bootstrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -375,6 +375,8 @@ files:
|
|
375
375
|
- app/assets/javascripts/effective_bootstrap/logic.js.coffee
|
376
376
|
- app/assets/javascripts/effective_checks/initialize.js.coffee
|
377
377
|
- app/assets/javascripts/effective_checks/input.js
|
378
|
+
- app/assets/javascripts/effective_ck_editor/initialize.js.coffee
|
379
|
+
- app/assets/javascripts/effective_ck_editor/input.js
|
378
380
|
- app/assets/javascripts/effective_date/initialize.js.coffee
|
379
381
|
- app/assets/javascripts/effective_date/input.js
|
380
382
|
- app/assets/javascripts/effective_datetime/bootstrap-datetimepicker.js
|
@@ -439,6 +441,7 @@ files:
|
|
439
441
|
- app/models/effective/form_input.rb
|
440
442
|
- app/models/effective/form_inputs/check_box.rb
|
441
443
|
- app/models/effective/form_inputs/checks.rb
|
444
|
+
- app/models/effective/form_inputs/ck_editor.rb
|
442
445
|
- app/models/effective/form_inputs/collection_input.rb
|
443
446
|
- app/models/effective/form_inputs/date_field.rb
|
444
447
|
- app/models/effective/form_inputs/datetime_field.rb
|