effective_regions 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +580 -0
- data/Rakefile +23 -0
- data/app/assets/images/effective/templates/image_and_title.png +0 -0
- data/app/assets/javascripts/effective/snippets/current_user_info.js.coffee +24 -0
- data/app/controllers/effective/regions_controller.rb +154 -0
- data/app/helpers/effective_regions_helper.rb +108 -0
- data/app/models/concerns/acts_as_regionable.rb +34 -0
- data/app/models/effective/access_denied.rb +17 -0
- data/app/models/effective/region.rb +44 -0
- data/app/models/effective/snippets/current_user_info.rb +12 -0
- data/app/models/effective/snippets/snippet.rb +69 -0
- data/app/models/effective/templates/image_and_title.rb +13 -0
- data/app/models/effective/templates/template.rb +26 -0
- data/app/views/effective/snippets/_current_user_info.html.haml +10 -0
- data/app/views/effective/templates/_image_and_title.html.haml +5 -0
- data/config/routes.rb +19 -0
- data/db/migrate/01_create_effective_regions.rb.erb +23 -0
- data/lib/effective_regions.rb +57 -0
- data/lib/effective_regions/engine.rb +27 -0
- data/lib/effective_regions/version.rb +3 -0
- data/lib/generators/effective_regions/install_generator.rb +32 -0
- data/lib/generators/templates/README +1 -0
- data/lib/generators/templates/effective_regions.rb +71 -0
- data/lib/tasks/effective_regions_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +59 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +16 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +20 -0
- data/spec/dummy/log/test.log +2 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/effective_regions_spec.rb +7 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/factories.rb +1 -0
- metadata +199 -0
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
|
8
|
+
# Our tasks
|
9
|
+
load 'lib/tasks/effective_regions_tasks.rake'
|
10
|
+
|
11
|
+
# Testing tasks
|
12
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
13
|
+
load 'rails/tasks/engine.rake'
|
14
|
+
|
15
|
+
Bundler::GemHelper.install_tasks
|
16
|
+
|
17
|
+
require 'rspec/core'
|
18
|
+
require 'rspec/core/rake_task'
|
19
|
+
|
20
|
+
desc "Run all specs in spec directory (excluding plugin specs)"
|
21
|
+
RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
|
22
|
+
|
23
|
+
task :default => :spec
|
Binary file
|
@@ -0,0 +1,24 @@
|
|
1
|
+
CKEDITOR.dialog.add 'current_user_info', (editor) ->
|
2
|
+
title: 'Current User info',
|
3
|
+
minWidth: 200,
|
4
|
+
minHeight: 100,
|
5
|
+
contents: [
|
6
|
+
{
|
7
|
+
id: 'current_user_info',
|
8
|
+
elements: [
|
9
|
+
{
|
10
|
+
id: 'method',
|
11
|
+
type: 'select',
|
12
|
+
label: 'Current User Info',
|
13
|
+
items: [
|
14
|
+
['E-mail', 'email'],
|
15
|
+
['Full Name', 'full_name'],
|
16
|
+
['First Name', 'first_name'],
|
17
|
+
['Last Name', 'last_name']
|
18
|
+
],
|
19
|
+
setup: (widget) -> this.setValue(widget.data.method),
|
20
|
+
commit: (widget) -> widget.setData('method', this.getValue())
|
21
|
+
}
|
22
|
+
]
|
23
|
+
}
|
24
|
+
]
|
@@ -0,0 +1,154 @@
|
|
1
|
+
module Effective
|
2
|
+
class RegionsController < ApplicationController
|
3
|
+
respond_to :html, :json
|
4
|
+
layout false
|
5
|
+
|
6
|
+
before_filter :authenticate_user! if defined?(Devise)
|
7
|
+
skip_log_page_views :quiet => true, :only => [:snippet, :snippets, :templates] if defined?(EffectiveLogging)
|
8
|
+
|
9
|
+
skip_before_filter :verify_authenticity_token, :only => [:update]
|
10
|
+
|
11
|
+
def edit
|
12
|
+
EffectiveRegions.authorized?(self, :edit, Effective::Region.new())
|
13
|
+
|
14
|
+
cookies['effective_regions_editting'] = {:value => request.referrer, :path => '/'}
|
15
|
+
|
16
|
+
# TODO: turn this into a cookie or something better.
|
17
|
+
redirect_to request.url.gsub('/edit', '') + '?edit=true'
|
18
|
+
end
|
19
|
+
|
20
|
+
def update
|
21
|
+
javascript_should_refresh_page = ''
|
22
|
+
|
23
|
+
Effective::Region.transaction do
|
24
|
+
(request.fullpath.slice!(0..4) rescue nil) if request.fullpath.to_s.starts_with?('/edit') # This is so the before_save_method can reference the real current page
|
25
|
+
|
26
|
+
region_params.each do |key, vals| # article_section_2_title => {:content => '<p></p>'}
|
27
|
+
to_save = nil # Which object, the regionable, or the region (if global) to save
|
28
|
+
|
29
|
+
regionable, title = find_regionable(key)
|
30
|
+
|
31
|
+
if regionable
|
32
|
+
EffectiveRegions.authorized?(self, :update, regionable) # can I update the regionable object?
|
33
|
+
|
34
|
+
region = regionable.regions.find { |region| region.title == title }
|
35
|
+
region ||= regionable.regions.build(:title => title)
|
36
|
+
|
37
|
+
to_save = regionable
|
38
|
+
else
|
39
|
+
region = Effective::Region.global.where(:title => title).first_or_initialize
|
40
|
+
EffectiveRegions.authorized?(self, :update, region) # can I update the global region?
|
41
|
+
|
42
|
+
to_save = region
|
43
|
+
end
|
44
|
+
|
45
|
+
region.content = cleanup(vals[:content])
|
46
|
+
|
47
|
+
region.snippets = HashWithIndifferentAccess.new()
|
48
|
+
(vals[:snippets] || []).each { |snippet, vals| region.snippets[snippet] = vals }
|
49
|
+
|
50
|
+
# Last chance for a developer to make some changes here
|
51
|
+
if (run_before_save_method(region, regionable) rescue nil) == :refresh
|
52
|
+
javascript_should_refresh_page = 'refresh'
|
53
|
+
end
|
54
|
+
|
55
|
+
to_save.save!
|
56
|
+
end
|
57
|
+
|
58
|
+
render :text => javascript_should_refresh_page, :status => 200
|
59
|
+
return
|
60
|
+
end
|
61
|
+
|
62
|
+
render :text => 'error', :status => :unprocessable_entity
|
63
|
+
end
|
64
|
+
|
65
|
+
def snippets
|
66
|
+
EffectiveRegions.authorized?(self, :edit, Effective::Region.new())
|
67
|
+
|
68
|
+
retval = {}
|
69
|
+
EffectiveRegions.snippets.each do |snippet|
|
70
|
+
retval[snippet.class_name] = {
|
71
|
+
:dialog_url => snippet.snippet_dialog_url,
|
72
|
+
:label => snippet.snippet_label,
|
73
|
+
:description => snippet.snippet_description,
|
74
|
+
:inline => snippet.snippet_inline,
|
75
|
+
:editables => snippet.snippet_editables,
|
76
|
+
:tag => snippet.snippet_tag.to_s
|
77
|
+
#:template => ActionView::Base.new(ActionController::Base.view_paths, {}, ActionController::Base.new).render(:partial => snippet.to_partial_path, :object => snippet, :locals => {:snippet => snippet})
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
render :json => retval
|
82
|
+
end
|
83
|
+
|
84
|
+
def snippet # This is a GET. CKEDITOR passes us data, we need to render the non-editable content
|
85
|
+
klass = "Effective::Snippets::#{region_params[:name].try(:classify)}".safe_constantize
|
86
|
+
|
87
|
+
if klass.present?
|
88
|
+
@snippet = klass.new(region_params[:data])
|
89
|
+
render :partial => @snippet.to_partial_path, :object => @snippet, :locals => {:snippet => @snippet, :snippet_preview => true}
|
90
|
+
else
|
91
|
+
render :text => "Missing class Effective::Snippets::#{region_params[:name].try(:classify)}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def templates
|
96
|
+
EffectiveRegions.authorized?(self, :edit, Effective::Region.new())
|
97
|
+
|
98
|
+
retval = EffectiveRegions.templates.map do |template|
|
99
|
+
{
|
100
|
+
:title => template.title,
|
101
|
+
:description => template.description,
|
102
|
+
:image => template.image || "#{template.class_name}.png",
|
103
|
+
:html => render_to_string(:partial => template.to_partial_path, :object => template, :locals => {:template => template})
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
render :json => retval
|
108
|
+
end
|
109
|
+
|
110
|
+
protected
|
111
|
+
|
112
|
+
def find_regionable(key)
|
113
|
+
regionable = nil
|
114
|
+
title = nil
|
115
|
+
|
116
|
+
if(class_name, id, title = key.scan(/(\w+)_(\d+)_(\w+)/).flatten).present?
|
117
|
+
regionable = (class_name.classify.safe_constantize).find(id) rescue nil
|
118
|
+
end
|
119
|
+
|
120
|
+
return regionable, (title || key)
|
121
|
+
end
|
122
|
+
|
123
|
+
def cleanup(str)
|
124
|
+
(str || '').tap do |str|
|
125
|
+
str.chomp!('<p> </p>') # Remove any trailing empty <p>'s
|
126
|
+
str.gsub!("\n", '')
|
127
|
+
str.strip!
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def region_params
|
132
|
+
begin
|
133
|
+
params.require(:effective_regions).permit!
|
134
|
+
rescue => e
|
135
|
+
params[:effective_regions]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
def run_before_save_method(region, regionable)
|
142
|
+
return nil if region == nil
|
143
|
+
|
144
|
+
if EffectiveRegions.before_save_method.respond_to?(:call)
|
145
|
+
view_context.instance_exec(region, (regionable || :global), &EffectiveRegions.before_save_method)
|
146
|
+
elsif EffectiveRegions.before_save_method.kind_of?(Symbol)
|
147
|
+
self.instance_exec(self, region, (regionable || :global), &EffectiveRegions.before_save_method)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module EffectiveRegionsHelper
|
2
|
+
def effective_region(*args)
|
3
|
+
options = args.extract_options!
|
4
|
+
block_given? ? ckeditor_region(args, options) { yield } : ckeditor_region(args, options)
|
5
|
+
end
|
6
|
+
|
7
|
+
def simple_effective_region(*args)
|
8
|
+
(options = args.extract_options!).merge!(:type => :simple)
|
9
|
+
block_given? ? ckeditor_region(args, options) { yield } : ckeditor_region(args, options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def snippet_effective_region(*args)
|
13
|
+
(options = args.extract_options!).merge!(:type => :snippets)
|
14
|
+
block_given? ? ckeditor_region(args, options) { yield } : ckeditor_region(args, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def wrapped_snippet_effective_region(*args)
|
18
|
+
(options = args.extract_options!).merge!(:type => :wrapped_snippets)
|
19
|
+
block_given? ? ckeditor_region(args, options) { yield } : ckeditor_region(args, options)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Loads the Ckeditor Javascript & Stylesheets only when in edit mode
|
23
|
+
def effective_regions_include_tags
|
24
|
+
if effectively_editting?
|
25
|
+
javascript_include_tag('effective_ckeditor') + stylesheet_link_tag('effective_ckeditor')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def effectively_editting?
|
30
|
+
@effectively_editting ||= request.fullpath.include?('?edit=true')
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def ckeditor_region(args, options = {}, &block)
|
36
|
+
obj = args.first
|
37
|
+
title = args.last.to_s.parameterize
|
38
|
+
editable_tag = options.delete(:editable_tag) || :div
|
39
|
+
|
40
|
+
# Set up the editable div options we need to send to ckeditor
|
41
|
+
if effectively_editting?
|
42
|
+
opts = {
|
43
|
+
:contenteditable => true,
|
44
|
+
'data-effective-ckeditor' => (options.delete(:type) || :full).to_s,
|
45
|
+
'data-allowed-snippets' => [options.delete(:snippets)].flatten.compact.to_json,
|
46
|
+
:style => ['-webkit-user-modify: read-write;', options.delete(:style), ('display: inline;' if options.delete(:inline))].compact.join(' '),
|
47
|
+
:class => ['effective-region', options.delete(:class)].compact.join(' ')
|
48
|
+
}.merge(options)
|
49
|
+
end
|
50
|
+
|
51
|
+
if obj.kind_of?(ActiveRecord::Base)
|
52
|
+
raise StandardError.new('Object passed to effective_region helper must declare act_as_regionable') unless obj.respond_to?(:acts_as_regionable)
|
53
|
+
|
54
|
+
region = obj.regions.find { |region| region.title == title }
|
55
|
+
|
56
|
+
if effectively_editting?
|
57
|
+
can_edit = (EffectiveRegions.authorized?(controller, :update, obj) rescue false)
|
58
|
+
opts[:id] = [model_name_from_record_or_class(obj).param_key(), obj.id, title].join('_')
|
59
|
+
end
|
60
|
+
else # This is a global region
|
61
|
+
regions = (@effective_regions_global ||= Effective::Region.global.to_a)
|
62
|
+
region = regions.find { |region| region.title == title } || Effective::Region.new(:title => title)
|
63
|
+
|
64
|
+
if effectively_editting?
|
65
|
+
can_edit = (EffectiveRegions.authorized?(controller, :update, region) rescue false)
|
66
|
+
opts[:id] = title.to_s.parameterize
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if effectively_editting? && can_edit # If we need the editable div
|
71
|
+
content_tag(editable_tag, opts) do
|
72
|
+
region.try(:content).present? ? render_region(region, true) : ((capture(&block).strip.html_safe) if block_given?)
|
73
|
+
end
|
74
|
+
else
|
75
|
+
region.try(:content).present? ? render_region(region, false) : ((capture(&block).strip.html_safe) if block_given?)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def render_region(region, can_edit = true)
|
80
|
+
return '' unless region
|
81
|
+
|
82
|
+
region.content.tap do |html|
|
83
|
+
html.scan(/\[(snippet_\d+)\]/).flatten.uniq.each do |id| # find snippet_1 and replace with snippet content
|
84
|
+
snippet = region.snippet_objects.find { |snippet| snippet.id == id }
|
85
|
+
html.gsub!("[#{id}]", render_snippet(snippet, can_edit)) if snippet
|
86
|
+
end
|
87
|
+
end.html_safe
|
88
|
+
end
|
89
|
+
|
90
|
+
def render_snippet(snippet, can_edit = true)
|
91
|
+
return '' unless snippet
|
92
|
+
|
93
|
+
if Rails.env.production?
|
94
|
+
content = render(:partial => snippet.to_partial_path, :object => snippet, :locals => {:snippet => snippet}) rescue ''
|
95
|
+
else
|
96
|
+
content = render(:partial => snippet.to_partial_path, :object => snippet, :locals => {:snippet => snippet})
|
97
|
+
end
|
98
|
+
|
99
|
+
if effectively_editting? && can_edit
|
100
|
+
content_tag(snippet.snippet_tag, content, :data => {'effective-snippet' => snippet.class_name, 'snippet-data' => snippet.data().to_json})
|
101
|
+
else
|
102
|
+
content
|
103
|
+
end.html_safe
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ActsAsRegionable
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
def acts_as_regionable(*options)
|
6
|
+
@acts_as_regionable_opts = options || []
|
7
|
+
include ::ActsAsRegionable
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
included do
|
12
|
+
has_many :regions, :as => :regionable, :class_name => 'Effective::Region', :dependent => :delete_all, :autosave => true
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
end
|
17
|
+
|
18
|
+
def acts_as_regionable
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def snippet_objects(klass = nil)
|
23
|
+
objs = regions.map { |region| region.snippet_objects }.flatten
|
24
|
+
|
25
|
+
if klass
|
26
|
+
objs = objs.select { |obj| obj.class == klass }
|
27
|
+
else
|
28
|
+
objs
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
unless defined?(Effective::AccessDenied)
|
2
|
+
module Effective
|
3
|
+
class AccessDenied < StandardError
|
4
|
+
attr_reader :action, :subject
|
5
|
+
|
6
|
+
def initialize(message = nil, action = nil, subject = nil)
|
7
|
+
@message = message
|
8
|
+
@action = action
|
9
|
+
@subject = subject
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
@message || I18n.t(:'unauthorized.default', :default => 'Access Denied')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Effective
|
2
|
+
class Region < ActiveRecord::Base
|
3
|
+
self.table_name = EffectiveRegions.regions_table_name.to_s
|
4
|
+
|
5
|
+
belongs_to :regionable, :polymorphic => true
|
6
|
+
|
7
|
+
structure do
|
8
|
+
title :string, :validates => [:presence]
|
9
|
+
content :text
|
10
|
+
snippets :text
|
11
|
+
|
12
|
+
timestamps
|
13
|
+
end
|
14
|
+
|
15
|
+
serialize :snippets, HashWithIndifferentAccess
|
16
|
+
|
17
|
+
scope :global, -> { where("#{EffectiveRegions.regions_table_name}.regionable_type IS NULL").where("#{EffectiveRegions.regions_table_name}.regionable_id IS NULL") }
|
18
|
+
|
19
|
+
def snippets
|
20
|
+
self[:snippets] || HashWithIndifferentAccess.new()
|
21
|
+
end
|
22
|
+
|
23
|
+
# Hash of the Snippets objectified
|
24
|
+
#
|
25
|
+
# Returns a Hash of {'snippet_1' => CurrentUserInfo.new(snippets[:key]['options'])}
|
26
|
+
def snippet_objects
|
27
|
+
@snippet_objects ||= snippets.map do |key, snippet| # Key here is 'snippet_1'
|
28
|
+
if snippet['class_name']
|
29
|
+
klass = "Effective::Snippets::#{snippet['class_name'].classify}".safe_constantize
|
30
|
+
klass.new(snippet.merge!(:region => self, :id => key)) if klass
|
31
|
+
end
|
32
|
+
end.compact
|
33
|
+
end
|
34
|
+
|
35
|
+
def global?
|
36
|
+
regionable_id == nil && regionable_type == nil
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'virtus'
|
2
|
+
|
3
|
+
module Effective
|
4
|
+
module Snippets
|
5
|
+
class Snippet
|
6
|
+
include Virtus.model
|
7
|
+
|
8
|
+
attribute :id, String # This will be snippet_12345
|
9
|
+
attribute :region, Effective::Region # The region Object
|
10
|
+
|
11
|
+
# SO I have to add some restrictions on how snippets are built:
|
12
|
+
|
13
|
+
# Each Snippet has to be a block (or inline) element with nested children.
|
14
|
+
# It has to start with a root object
|
15
|
+
|
16
|
+
# That root object has to do {snippet_data(snippet)}
|
17
|
+
|
18
|
+
|
19
|
+
def initialize(atts = {})
|
20
|
+
(atts || {}).each { |k, v| self.send("#{k}=", v) if respond_to?("#{k}=") }
|
21
|
+
end
|
22
|
+
|
23
|
+
def id
|
24
|
+
super.presence || "snippet_#{object_id}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def data
|
28
|
+
self.attributes.reject { |k, v| [:region, :id].include?(k) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_partial_path
|
32
|
+
"effective/snippets/#{class_name}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def class_name
|
36
|
+
@class_name ||= self.class.name.demodulize.underscore.to_sym
|
37
|
+
end
|
38
|
+
|
39
|
+
### The following methods are used for the CKEditor widget creation.
|
40
|
+
def snippet_label
|
41
|
+
class_name.to_s.humanize
|
42
|
+
end
|
43
|
+
|
44
|
+
def snippet_description
|
45
|
+
"Insert #{snippet_label}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def snippet_dialog_url
|
49
|
+
"/assets/effective/snippets/#{class_name}.js"
|
50
|
+
end
|
51
|
+
|
52
|
+
# This is the tag that the ckeditor snippet will be created as
|
53
|
+
# It supports divs and spans, but that's it
|
54
|
+
# No ULs, or LIs
|
55
|
+
def snippet_tag
|
56
|
+
:div
|
57
|
+
end
|
58
|
+
|
59
|
+
def snippet_inline
|
60
|
+
[:span].include?(snippet_tag)
|
61
|
+
end
|
62
|
+
|
63
|
+
def snippet_editables
|
64
|
+
false
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|