effective_bootstrap 0.10.9 → 0.10.10
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_article_editor/initialize.js.coffee +24 -1
- data/app/assets/javascripts/effective_bootstrap/form.js.coffee +12 -0
- data/app/controllers/concerns/effective_bootstrap/save_tabs.rb +20 -0
- data/app/helpers/effective_article_editor_helper.rb +21 -0
- data/app/helpers/effective_bootstrap_helper.rb +24 -5
- data/app/models/effective/form_inputs/article_editor.rb +10 -2
- data/config/effective_bootstrap.rb +4 -0
- data/lib/effective_bootstrap/engine.rb +9 -0
- data/lib/effective_bootstrap/version.rb +1 -1
- data/lib/effective_bootstrap.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2397e2be81dbb9b78de24f2397762cfe44458a7f1d351d60d32a86769add1d9c
|
4
|
+
data.tar.gz: 6405deac6426fc49962d3da0dd30b006dcf5f113ceff08335c03f029d589a37a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 655c9ec56944dc576cf61a0ed8a6d2dfdb784cf4e4532f9a4b0e32b9c15ffcd6a2717682a5229f44df8d582b1aa734d9ee65d0762b71029fa210da21812238f7
|
7
|
+
data.tar.gz: 8ab4a5452665c92b72d0f018059df0e72a8e71ad8a1a6ad013849fb78f54909879ed823dac1c384159cc4c0c319c8c88675fabc6a266c6272bb2bc2d48f79de6
|
@@ -1,13 +1,36 @@
|
|
1
1
|
# https://imperavi.com/article/
|
2
2
|
|
3
3
|
uploadActiveStorage = (editor, data) ->
|
4
|
+
rails_url = '/rails/active_storage/blobs/redirect/'
|
5
|
+
|
4
6
|
for file in data.files
|
5
7
|
upload = new ActiveStorage.DirectUpload(file, '/rails/active_storage/direct_uploads')
|
6
8
|
|
7
9
|
upload.create (error, blob) =>
|
8
|
-
url =
|
10
|
+
url = rails_url + blob.signed_id + '/' + blob.filename
|
9
11
|
editor.complete({ file: { url: url, name: blob.filename, content_type: blob.content_type }}, data.e)
|
10
12
|
|
13
|
+
# We append this nested attachment html
|
14
|
+
attachment = $('<action-text-attachment>')
|
15
|
+
.attr('sgid', blob.attachable_sgid)
|
16
|
+
.attr('class', 'effective-article-editor-attachment')
|
17
|
+
|
18
|
+
attachment = $('<div>').append(attachment).html()
|
19
|
+
|
20
|
+
doc = editor.app.editor.getLayout()
|
21
|
+
|
22
|
+
doc
|
23
|
+
.find("img[src^='#{rails_url}']:not(.effective-article-editor-attachment)")
|
24
|
+
.after(attachment)
|
25
|
+
.addClass('effective-article-editor-attachment')
|
26
|
+
|
27
|
+
doc
|
28
|
+
.find("a[data-file][data-name='#{file.name}']:not(.action-text-attachment)")
|
29
|
+
.after(attachment)
|
30
|
+
.addClass('effective-article-editor-attachment')
|
31
|
+
.removeAttr('data-file')
|
32
|
+
.removeAttr('data-name')
|
33
|
+
|
11
34
|
insertUploadByDrop = (response, e) ->
|
12
35
|
if @app.block.is()
|
13
36
|
instance = @app.block.get()
|
@@ -19,6 +19,8 @@ this.EffectiveForm ||= new class
|
|
19
19
|
submitting: ($form) ->
|
20
20
|
$form.addClass('form-is-valid').removeClass('form-is-invalid')
|
21
21
|
@spin()
|
22
|
+
@saveTabs($form)
|
23
|
+
|
22
24
|
setTimeout((-> EffectiveForm.disable($form)), 0)
|
23
25
|
|
24
26
|
if ($form.attr('method') || '').toLowerCase() == 'get' || (@current_submit.length > 0 && @current_submit.hasClass('form-actions-reset'))
|
@@ -59,6 +61,16 @@ this.EffectiveForm ||= new class
|
|
59
61
|
|
60
62
|
spin: -> @current_submit.addClass('form-current-submit') if @current_submit.length > 0
|
61
63
|
|
64
|
+
saveTabs: ($form) ->
|
65
|
+
$tabs = $form.parents('div.tab-pane[data-tab-label]')
|
66
|
+
$tabs = @current_submit.parents('div.tab-pane[data-tab-label]') if $tabs.length == 0
|
67
|
+
|
68
|
+
$form.find("input[name='_tabs[]']").remove()
|
69
|
+
|
70
|
+
$tabs.each (i, element) ->
|
71
|
+
label = $(element).data('tab-label')
|
72
|
+
$form.append("<input type='hidden' name='_tabs[]' value='#{label}'>")
|
73
|
+
|
62
74
|
beforeAjax: ($form) ->
|
63
75
|
return unless $form.data('remote')
|
64
76
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EffectiveBootstrap
|
2
|
+
module SaveTabs
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
|
7
|
+
# If there is a params[:_tabs], save it to the session
|
8
|
+
before_action(if: -> { params[:_tabs] }) do
|
9
|
+
session[:_tabs] = params[:_tabs]
|
10
|
+
end
|
11
|
+
|
12
|
+
# After we're done, delete it from session
|
13
|
+
after_action(if: -> { session[:_tabs] }) do
|
14
|
+
session.delete(:_tabs) unless response.redirect?
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EffectiveArticleEditorHelper
|
4
|
+
|
5
|
+
def render_article_editor_action_text_content(content)
|
6
|
+
raise('expected content to be an content') unless content.kind_of?(ActionText::Content)
|
7
|
+
|
8
|
+
rendered = render_action_text_content(content)
|
9
|
+
|
10
|
+
if rendered.include?('effective-article-editor')
|
11
|
+
doc = Nokogiri::HTML(rendered)
|
12
|
+
doc.search('action-text-attachment').each { |fragment| fragment.remove }
|
13
|
+
|
14
|
+
# Filter out <html><body>\n and \n</body></html>
|
15
|
+
rendered = doc.inner_html.to_s[13..-16].html_safe
|
16
|
+
end
|
17
|
+
|
18
|
+
rendered
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -488,24 +488,43 @@ module EffectiveBootstrapHelper
|
|
488
488
|
# If you pass active 'label' it will make that tab active. Otherwise first.
|
489
489
|
# Unique will make sure the tab html IDs are unique
|
490
490
|
# $('#tab-demographics').tab('show')
|
491
|
-
def tabs(active: nil, unique: false, list: {}, content: {}, &block)
|
491
|
+
def tabs(active: nil, unique: false, ignore_save_tab: false, list: {}, content: {}, &block)
|
492
492
|
raise 'expected a block' unless block_given?
|
493
493
|
|
494
|
-
|
495
|
-
|
494
|
+
# The Active Tab might be set from a previous form submission, or passed into helper
|
495
|
+
tab_active = session[:_tabs].try(:pop) unless ignore_save_tab
|
496
|
+
tab_active ||= active
|
497
|
+
|
498
|
+
# If an active tab is passed, we validate we have a tab with that label, or fallback to first
|
499
|
+
if tab_active.present?
|
500
|
+
@_tab_mode = :validate
|
501
|
+
@_tab_labels = []
|
502
|
+
yield
|
503
|
+
|
504
|
+
tab_active = nil unless @_tab_labels.include?(tab_active)
|
505
|
+
end
|
506
|
+
|
507
|
+
tab_active ||= :first
|
496
508
|
@_tab_unique = effective_bootstrap_unique_id if unique
|
497
509
|
|
510
|
+
# Generate the html in two passes
|
498
511
|
content_tag(:ul, {class: 'nav nav-tabs', role: 'tablist'}.merge(list)) do
|
512
|
+
@_tab_mode = :tablist
|
513
|
+
@_tab_active = tab_active
|
514
|
+
|
499
515
|
yield # Yield to tab the first time
|
500
516
|
end +
|
501
517
|
content_tag(:div, {class: 'tab-content'}.merge(content)) do
|
502
518
|
@_tab_mode = :content
|
503
|
-
@_tab_active =
|
519
|
+
@_tab_active = tab_active
|
520
|
+
|
504
521
|
yield # Yield to tab the second time
|
505
522
|
end
|
506
523
|
end
|
507
524
|
|
508
525
|
def tab(label, options = {}, &block)
|
526
|
+
(@_tab_labels.push(label) and return) if @_tab_mode == :validate
|
527
|
+
|
509
528
|
controls = options.delete(:controls) || label.to_s.parameterize.gsub('_', '-')
|
510
529
|
controls = controls[1..-1] if controls[0] == '#'
|
511
530
|
controls = "#{controls}-#{@_tab_unique}" if @_tab_unique
|
@@ -522,7 +541,7 @@ module EffectiveBootstrapHelper
|
|
522
541
|
end
|
523
542
|
else # Inserting the content into the tab itself
|
524
543
|
classes = ['tab-pane', 'fade', ('show active' if active), options[:class].presence].compact.join(' ')
|
525
|
-
content_tag(:div, id: controls, class: classes, role: 'tabpanel', 'aria-labelledby': ('tab-' + controls)) do
|
544
|
+
content_tag(:div, id: controls, class: classes, role: 'tabpanel', 'aria-labelledby': ('tab-' + controls), 'data-tab-label': label) do
|
526
545
|
yield
|
527
546
|
end
|
528
547
|
end
|
@@ -69,8 +69,16 @@ module Effective
|
|
69
69
|
}
|
70
70
|
end
|
71
71
|
|
72
|
+
def content
|
73
|
+
if defined?(ActionText::RichText) && value.kind_of?(ActionText::RichText)
|
74
|
+
return value.body.to_html
|
75
|
+
end
|
76
|
+
|
77
|
+
value
|
78
|
+
end
|
79
|
+
|
72
80
|
def build_input(&block)
|
73
|
-
@builder.super_text_area(name, options[:input])
|
81
|
+
@builder.super_text_area(name, options[:input].merge(value: content))
|
74
82
|
end
|
75
83
|
|
76
84
|
def input_html_options
|
@@ -86,7 +94,7 @@ module Effective
|
|
86
94
|
(@template.asset_pack_path('application.css') if @template.respond_to?(:asset_pack_path)),
|
87
95
|
(@template.asset_path('application.css') if @template.respond_to?(:asset_path)),
|
88
96
|
('/assets/effective_bootstrap_article_editor.css')
|
89
|
-
]
|
97
|
+
].compact
|
90
98
|
end
|
91
99
|
|
92
100
|
def active_storage
|
@@ -2,4 +2,8 @@ EffectiveBootstrap.setup do |config|
|
|
2
2
|
# Replaces rails_ujs data-confirm with a custom inline implementation.
|
3
3
|
# You will need to recompile assets (or "rm -rf tmp/") if you change this.
|
4
4
|
config.use_custom_data_confirm = true
|
5
|
+
|
6
|
+
# Adds a before_action to ApplicationController
|
7
|
+
# To save and restore the active bootstrap tabs
|
8
|
+
config.save_tabs = true
|
5
9
|
end
|
@@ -21,5 +21,14 @@ module EffectiveBootstrap
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
# Adds a before_action to application controller
|
25
|
+
initializer 'effective_bootstrap.action_controller' do |app|
|
26
|
+
if EffectiveBootstrap.save_tabs
|
27
|
+
app.config.to_prepare do
|
28
|
+
ApplicationController.send(:include, EffectiveBootstrap::SaveTabs)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
24
33
|
end
|
25
34
|
end
|
data/lib/effective_bootstrap.rb
CHANGED
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.10.
|
4
|
+
version: 0.10.10
|
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: 2022-
|
11
|
+
date: 2022-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -640,6 +640,8 @@ files:
|
|
640
640
|
- app/assets/stylesheets/effective_select/overrides.scss
|
641
641
|
- app/assets/stylesheets/effective_select/select2.css
|
642
642
|
- app/assets/stylesheets/effective_select_or_text/input.scss
|
643
|
+
- app/controllers/concerns/effective_bootstrap/save_tabs.rb
|
644
|
+
- app/helpers/effective_article_editor_helper.rb
|
643
645
|
- app/helpers/effective_bootstrap_helper.rb
|
644
646
|
- app/helpers/effective_editor_helper.rb
|
645
647
|
- app/helpers/effective_form_builder_helper.rb
|