editable_content 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 wmerrell
1
+ Copyright (c) 2010 Will Merrell
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -1,9 +1,142 @@
1
1
  = editable_content
2
2
 
3
- Description goes here.
3
+ This plugin manages sections of a page that can be edited by users. I use it to
4
+ manage various boilerplate sections that need to be changed occasionally such as
5
+ welcome messages, contact form instructions, and things like that.
6
+
7
+ The editing fuctionality uses Textile markup and is extended to uses Radius tags
8
+ to embed function calls that are evaluated and expanded at run time. This allow
9
+ you to include any custom functionality that you care to write.
10
+
11
+ == Requirements
12
+
13
+ This gem is for Rails 3 and above only. While I developed most of these
14
+ techniques under Rails 2, that version was too complicated to release.
15
+
16
+ This gem requires the JQuery javascript library and the JQuery UI library. This
17
+ gem assumes that these files are already included in your page, and does not
18
+ add them.
19
+
20
+ This gem uses the MarkItUp javascript editor library (http://markitup.jaysalvat.com/home/)
21
+ to create the popup editor. You will need that code in your /public/javascript/
22
+ directory in order for this to work. The stylesheets and javascript for this
23
+ will be added automatically on the pages that use an editor.
24
+
25
+ This gem also requires the Radius and Redcloth gems.
26
+
27
+ == Installation
28
+
29
+ Install the gem:
30
+
31
+ gem install editable_content
32
+
33
+ Add it to your Gemfile:
34
+
35
+ gem "editable_content"
36
+
37
+ This gem inserts stylesheets and javascript into the generated page to create a
38
+ popup editor to edit the section of the page. To allow this, your page must have
39
+ hooks to support adding the required code. Add the following lines to the <head>
40
+ section of the layout file used to genrate the page that will have the editable
41
+ field.
42
+
43
+ <%= yield :stylesheet_list %>
44
+ <%= yield :javascript_list %>
45
+ <script type="text/javascript">
46
+ <%= yield :javascript_data %>
47
+ </script>
48
+
49
+ In addition make sure the layout file includes jquery.js, jquery-ui.js and a
50
+ UI theme css file.
51
+
52
+
53
+ == Basic Usage
54
+
55
+ Use getContent to create a variable that holds the current content. In this
56
+ example +"maintext"+ is the name of the field, and +@maintext_content+ is the variable
57
+ that holds the content. Put the following line in the controller for your action:
58
+
59
+ @maintext_content = getContent("maintext")
60
+
61
+ Next put the following lines in the view file for your action:
62
+
63
+ <%= insert_editable_content -%> # include once only
64
+ <%= create_content_editor("maintext") -%> # include once for each field
65
+
66
+ Finally display the content somewhere in your view file:
67
+
68
+ <%= @maintext_content %>
69
+
70
+ You may use as many editable fields on a page as you wish, as long as each has a
71
+ unique name for the field and variable. These name can be any valid rails
72
+ variable name that you want.
73
+
74
+
75
+ == Security
76
+
77
+ It will usually be desirable to restrict who can edit a field. You will almost
78
+ never want the general public to be able to edit most of your fields. It is
79
+ assumed that you will have some sort of user authentication, but that is beyond
80
+ the scope of this gem. This uses a global variable to control access. If the
81
+ variable is true, the current user can edit all fields. If it is false then the
82
+ current user cannot edit any field, they are display only.
83
+
84
+ The way to use this is to set the variable during the page generation process.
85
+ The easiest way to do this is with a before filter that determines whether the
86
+ current user has permission to edit or not. I use this code in my
87
+ application_controller.rb:
88
+
89
+ before_filter proc{ setEditableAuthorization(current_user.is?( :editor )) }
90
+
91
+ You can use any code that evaluates to true or false as the parameter to
92
+ +setEditableAuthorization+.
93
+
94
+
95
+ == Additional Functionality
96
+
97
+ This gem includes a function called +processContent+ that allows you to use the
98
+ Textile/Radius engine to expand any text and return it as formated HTML. With
99
+ this you can use any textarea or textfield to enter text that will be rendered
100
+ as HTML.
101
+
102
+ == Extending Custom Funtionality
103
+
104
+ The Radius context used to evaluate Radius tags is exposed via a global variable
105
+ called +$editable_content_radius_context+. To use this create a model file as
106
+ follows, and include it in your application_controller.rb file.
107
+
108
+ module ExtendContent
109
+
110
+ $editable_content_radius_context.with do |c|
111
+
112
+ c.define_tag 'test' do |tag|
113
+ number = (tag.attr['times'] || '1').to_i
114
+ result = ''
115
+ number.times { result << 'test ' }
116
+ result
117
+ end
118
+
119
+ c.define_tag 'user' do |tag|
120
+ if (!tag.attr['email'].blank?) || (!tag.attr['id'].blank?)
121
+ if !tag.attr['email'].blank?
122
+ item = User.where(:email=>tag.attr['email']).email
123
+ elsif !tag.attr['id'].blank?
124
+ item = User.find(tag.attr['id']).email
125
+ end
126
+ else
127
+ item = "unknown"
128
+ end
129
+ item
130
+ end
131
+
132
+ end # end of context
133
+
134
+ end # end of module
135
+
136
+
4
137
 
5
138
  == Note on Patches/Pull Requests
6
-
139
+
7
140
  * Fork the project.
8
141
  * Make your feature addition or bug fix.
9
142
  * Add tests for it. This is important so I don't break it in a
@@ -14,4 +147,4 @@ Description goes here.
14
147
 
15
148
  == Copyright
16
149
 
17
- Copyright (c) 2010 wmerrell. See LICENSE for details.
150
+ Copyright (c) 2010 Will Merrell. See LICENSE for details.
@@ -1,9 +1,13 @@
1
- require 'rails'
1
+ require 'rails' if defined?(Rails) && Rails::VERSION::MAJOR == 3
2
+ require 'action_controller'
3
+ require 'action_view'
4
+
2
5
  require 'radius'
3
6
  require 'redcloth'
4
- require 'editable_content/engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
7
+
8
+ require 'editable_content/engine'
5
9
  require 'editable_content/controller_helper'
6
- require 'editable_content/application_helpers'
10
+ require 'editable_content/view_helpers'
7
11
 
8
12
  module EditableContent
9
13
  end
@@ -1,64 +1,112 @@
1
1
  module EditableContent
2
- module ActionControllerExtensions
3
- module ControllerFunctions
4
-
5
- def getContent(name="")
6
- text = "<div id=\"ec_edit_frame_#{name}\">" + getInnerContent(name, controller_name(), action_name()) + "</div>"
7
- if $editable_content_authorization
8
- text = "<img id=\"ec_edit_button_#{name}\" class=\"edit_icon\" width=\"16\" height=\"16\" src=\"/images/pencil.png\" title=\"Edit this Content\" alt=\"Edit this Content Button\" />" + text
9
- end
10
- text.html_safe
2
+ module ControllerFunctions
3
+
4
+ #
5
+ # This function retrieves the editable content from the database.
6
+ # If +setEditableAuthorization+ is set to true then a button
7
+ # to launch the editor is prepended to the content.
8
+ #
9
+ # Each editable field needs will need one editor and they are created with
10
+ # the +create_content_editor+ function in the view file.
11
+ #
12
+ # === Parameters:
13
+ # *name* This is the name of the field. This is the same name that will be
14
+ # passed into the +create_content_editor+ function.
15
+ #
16
+ # === Usage:
17
+ # def index
18
+ # @content = getContent("maintext")
19
+ # end
20
+ #
21
+ def getContent(name="")
22
+ text = "<div id=\"ec_edit_frame_#{name}\">" + getInnerContent(name, controller_name(), action_name()) + "</div>"
23
+ if $editable_content_authorization
24
+ text = "<img id=\"ec_edit_button_#{name}\" class=\"edit_icon\" width=\"16\" height=\"16\" src=\"/images/pencil.png\" title=\"Edit this Content\" alt=\"Edit this Content Button\" />" + text
11
25
  end
26
+ text.html_safe
27
+ end
12
28
 
13
- def processContent(content)
14
- if content
15
- text = parseContent(content.gsub(/&#39;/, "'"))
16
- else
17
- text = "<div class=\"error\">No Content.</div>".html_safe
18
- end
29
+ #
30
+ # This function formats the supplied content using the same processor that
31
+ # editable content uses.
32
+ #
33
+ # === Parameters:
34
+ # *content* The text to be converted. This expects a textile formated string
35
+ # and returns html formated text suitable for display.
36
+ #
37
+ # === Usage:
38
+ # def index
39
+ # @content = processContent("This is *textile* _text_.")
40
+ # end
41
+ #
42
+ def processContent(content=nil)
43
+ if content
44
+ text = parseContent(content.gsub(/&#39;/, "'"))
45
+ else
46
+ text = "<div class=\"error\">No Content.</div>".html_safe
19
47
  end
48
+ end
20
49
 
21
- private
50
+ # This is used to set up the permissions for the editable content system.
51
+ # This allows you to control who can edit a editable content field.
52
+ #
53
+ # === Parameters:
54
+ # *permission* A boolean value. If +true+ the editor is created and enabled,
55
+ # if +false+ the editor is not created.
56
+ #
57
+ # === Usage:
58
+ # The easiest way to use the permissions system is to use a +before_filter+
59
+ # in the application_controller, like this:
60
+ #
61
+ # before_filter proc{ setEditableAuthorization(current_user.is?( :editor )) }
62
+ #
63
+ # In this example, if the current user is an editor then they can edit fields.
64
+ #
65
+ def setEditableAuthorization(permission = false)
66
+ $editable_content_authorization = permission
67
+ end
22
68
 
23
- def getInnerContent(name, controller, action)
24
- content = EcContent.first( :conditions => { :name => name, :controller => controller, :action => action} )
25
- if !content
26
- text = "<div class=\"error\">No Content for #{controller}:#{action}.#{name}.</div>"
27
- content = EcContent.new({ :name => name, :controller => controller, :action => action, :body => text })
28
- content.save
69
+ private
70
+
71
+ def getInnerContent(name, controller, action)
72
+ content = EcContent.first( :conditions => { :name => name, :controller => controller, :action => action} )
73
+ if !content
74
+ text = "<div class=\"error\">No Content for #{controller}:#{action}.#{name}.</div>"
75
+ content = EcContent.new({ :name => name, :controller => controller, :action => action, :body => text })
76
+ content.save
77
+ else
78
+ if content.body.blank?
79
+ text = "<div class=\"error\">Content.body for #{controller}:#{action}.#{name} is blank.</div>"
29
80
  else
30
- if content.body.blank?
31
- text = "<div class=\"error\">Content.body for #{controller}:#{action}.#{name} is blank.</div>"
32
- else
33
- text = parseContent(content.body.gsub(/&#39;/, "'"))
34
- end
81
+ text = parseContent(content.body.gsub(/&#39;/, "'"))
35
82
  end
36
- text.html_safe
37
83
  end
84
+ text.html_safe
85
+ end
38
86
 
39
- def parseContent(content)
40
- parser = Radius::Parser.new($editable_content_radius_context, :tag_prefix => 'r')
41
- text = RedCloth.new(parser.parse(content)).to_html.html_safe
42
- end
87
+ def parseContent(content)
88
+ parser = Radius::Parser.new($editable_content_radius_context, :tag_prefix => 'r')
89
+ text = RedCloth.new(parser.parse(content)).to_html.html_safe
90
+ end
43
91
 
44
- # Define tags on a context that will be available to a template:
45
- $editable_content_radius_context = Radius::Context.new do |c|
92
+ # Define tags on a context that will be available to a template:
93
+ $editable_content_radius_context = Radius::Context.new do |c|
46
94
 
47
- c.define_tag 'repeat' do |tag|
48
- number = (tag.attr['times'] || '1').to_i
49
- result = ''
50
- number.times { result << tag.expand }
51
- result
52
- end
95
+ c.define_tag 'repeat' do |tag|
96
+ number = (tag.attr['times'] || '1').to_i
97
+ result = ''
98
+ number.times { result << tag.expand }
99
+ result
100
+ end
53
101
 
54
- c.define_tag 'hello' do |tag|
55
- "Hello #{tag.attr['name'] || 'World'}!"
56
- end
102
+ c.define_tag 'hello' do |tag|
103
+ "Hello #{tag.attr['name'] || 'World'}!"
104
+ end
57
105
 
58
- c.define_tag 'lorem' do |tag|
59
- word_count = (tag.attr['wordcount'] || '20').to_i
60
- # ===== words
61
- words =<<EOS
106
+ c.define_tag 'lorem' do |tag|
107
+ word_count = (tag.attr['wordcount'] || '20').to_i
108
+ # ===== words
109
+ words =<<EOS
62
110
  lorem ipsum dolor sit amet consectetuer adipiscing elit integer in mi a mauris ornare sagittis
63
111
  suspendisse potenti suspendisse dapibus dignissim dolor nam sapien tellus tempus et tempus ac
64
112
  tincidunt in arcu duis dictum proin magna nulla pellentesque non commodo et iaculis sit amet
@@ -130,48 +178,47 @@ quam nulla nulla nunc accumsan nunc sit amet scelerisque porttitor nibh pede
130
178
  tristique mattis purus eros non velit aenean sagittis commodo erat aliquam id lacus morbi
131
179
  vulputate vestibulum elit
132
180
  EOS
133
- words.gsub!(/\n/,' ')
134
- words.gsub!(/ */,' ')
135
- words.strip!
136
- words = words.split(/ /)
137
-
138
- lorem = ""
139
-
140
- # ===== total
141
- twn = 0
142
- twc = word_count
143
- while twn < twc
144
-
145
- # ===== paragraph
146
- pwn = 0
147
- pwc = rand(100)+50
148
- while pwn < pwc and twn < twc do
149
-
150
- # ===== sentence
151
- swn = 0
152
- swc = rand(10)+3
153
- while swn < swc and pwn < pwc and twn < twc do
154
- word = words[rand(words.length)]
155
- if swn == 0
156
- lorem << "#{word.capitalize} "
157
- else
158
- lorem << "#{word} "
159
- end
160
- twn +=1
161
- pwn +=1
162
- swn +=1
181
+ words.gsub!(/\n/,' ')
182
+ words.gsub!(/ */,' ')
183
+ words.strip!
184
+ words = words.split(/ /)
185
+
186
+ lorem = ""
187
+
188
+ # ===== total
189
+ twn = 0
190
+ twc = word_count
191
+ while twn < twc
192
+
193
+ # ===== paragraph
194
+ pwn = 0
195
+ pwc = rand(100)+50
196
+ while pwn < pwc and twn < twc do
197
+
198
+ # ===== sentence
199
+ swn = 0
200
+ swc = rand(10)+3
201
+ while swn < swc and pwn < pwc and twn < twc do
202
+ word = words[rand(words.length)]
203
+ if swn == 0
204
+ lorem << "#{word.capitalize} "
205
+ else
206
+ lorem << "#{word} "
163
207
  end
164
- lorem << ". "
208
+ twn +=1
209
+ pwn +=1
210
+ swn +=1
165
211
  end
166
- lorem << "\n\n"
212
+ lorem << ". "
167
213
  end
168
- lorem = lorem.gsub!(/ \./,'.')
169
- end # end of lorem
214
+ lorem << "\n\n"
215
+ end
216
+ lorem = lorem.gsub!(/ \./,'.')
217
+ end # end of lorem
170
218
 
171
- end # end of $context
219
+ end # end of $context
172
220
 
173
- end
174
221
  end
175
222
  end
176
223
 
177
- ActionController::Base.send :include, EditableContent::ActionControllerExtensions::ControllerFunctions
224
+ ActionController::Base.send :include, EditableContent::ControllerFunctions
@@ -0,0 +1,138 @@
1
+ module EditableContent
2
+ module ViewHelpers
3
+
4
+ #
5
+ # This function inserts the code needed for editing editable content
6
+ # into the head section of the page.
7
+ #
8
+ # Each editable field needs will need one editor and they are created with
9
+ # the +create_content_editor+ function
10
+ #
11
+ # === Note
12
+ # This function creates an unobtursive javascript event handler that
13
+ # launches the editor. It uses +content_for+ to save the code in
14
+ # the following variables: +stylesheet_list+, +javascript_list+,
15
+ # and +javascript_data+. It assumes that you will have the following
16
+ # in your head section.
17
+ #
18
+ # <%= yield :stylesheet_list %>
19
+ # <%= yield :javascript_list %>
20
+ # <script type="text/javascript">
21
+ # <%= yield :javascript_data %>
22
+ # </script>
23
+ #
24
+ # === Usage
25
+ # <%= insert_editable_content -%>
26
+ # <%= create_content_editor("maintext") -%>
27
+ # <%= create_content_editor("contacttext") -%>
28
+ #
29
+ def insert_editable_content()
30
+ if $editable_content_authorization
31
+ content_for(:stylesheet_list) { stylesheet_link_tag "markitup/skins/simple/style.css" }
32
+ content_for(:stylesheet_list) { stylesheet_link_tag "markitup/sets/textile/style.css" }
33
+ content_for(:javascript_list) { javascript_include_tag "markitup/jquery.markitup.js" }
34
+ content_for(:javascript_list) { javascript_include_tag "markitup/sets/textile/set.js" }
35
+ content_for(:javascript_data) { <<-SCRIPTDATA
36
+
37
+ var content_id = 0;
38
+ var content_name = "";
39
+
40
+ function openEditor(name, controller, action) {
41
+ content_name = name;
42
+ $.get("/contents/edit",
43
+ {p_name:name, p_controller:controller, p_action:action},
44
+ jQuery.proxy(this, function(data) {
45
+ content_id = data.id;
46
+ $("#ec_edit_textarea").val(data.content);
47
+ $("#ec_edit_dialog_form").dialog('open');
48
+ }));
49
+ }
50
+
51
+ $(function() {
52
+ // a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
53
+ $("#ec_edit_dialog_form").dialog("destroy");
54
+
55
+ $("#ec_edit_textarea").markItUp(mySettings);
56
+
57
+ $("#ec_edit_dialog_form").dialog({
58
+ autoOpen: false,
59
+ height: 375,
60
+ width: 1000,
61
+ modal: true,
62
+ buttons: {
63
+ 'Save': function() {
64
+ $.post("/contents/update",
65
+ {p_id:content_id, p_content:$("#ec_edit_textarea").val()},
66
+ jQuery.proxy(this, function(data) {
67
+ $("#ec_edit_frame_" + content_name).html(data);
68
+ })
69
+ );
70
+ $(this).dialog('close');
71
+ },
72
+ Cancel: function() {
73
+ $(this).dialog('close');
74
+ }
75
+ },
76
+ close: function() {
77
+ $("#ec_edit_textarea").html("");
78
+ }
79
+ });
80
+ });
81
+ SCRIPTDATA
82
+ }
83
+
84
+ editor_text = <<EDITOR_FORM
85
+ <div id="ec_edit_dialog_form" title="Edit Content" style="padding: 0; display: none;">
86
+ <form style="padding: 5px 0 0 0;" >
87
+ <textarea name="ec_edit_textarea" id="ec_edit_textarea" cols="80" style="width: 99.5%; height: 200px; min_height: 200px;" class="ui_widget_content ui_corner_all" ></textarea>
88
+ </form>
89
+ </div>
90
+ EDITOR_FORM
91
+ editor_text.html_safe
92
+ end
93
+ end
94
+
95
+ #
96
+ # This function inserts the code needed to create the editor for a field
97
+ # into the head section of the page.
98
+ # Each editable field needs one editor and this is the function that
99
+ # creates it.
100
+ #
101
+ # === Parameters
102
+ # *name* This is the name of the field. This is the same name that will be
103
+ # passed into the +getContent+ function
104
+ #
105
+ # === Note
106
+ # This function creates an unobtursive javascript event handler that
107
+ # launches the editor. It uses +content_for+ to save the code in
108
+ # the +javascript_data+ variable. It assumes that you will have the following
109
+ # in your head section.
110
+ #
111
+ # <script type="text/javascript">
112
+ # <%= yield :javascript_data %>
113
+ # </script>
114
+ #
115
+ # === Usage
116
+ # <%= insert_editable_content -%>
117
+ # <%= create_content_editor("maintext") -%>
118
+ # <%= create_content_editor("contacttext") -%>
119
+ #
120
+ #
121
+ def create_content_editor(name)
122
+ if $editable_content_authorization
123
+ content_for(:javascript_data) { <<-SCRIPTDATA
124
+ $(function() {
125
+ $("#ec_edit_button_#{name}").click( function(event) {
126
+ openEditor("#{name}", "#{controller_name()}", "#{action_name()}");
127
+ event.preventDefault();
128
+ });
129
+ });
130
+ SCRIPTDATA
131
+ }
132
+ end
133
+ end
134
+
135
+ end
136
+ end
137
+
138
+ ActionView::Base.send :include, EditableContent::ViewHelpers
@@ -10,14 +10,14 @@ class EditableContentGenerator < Rails::Generators::Base
10
10
  class_option :"skip-migration", :type => :boolean, :desc => "Don't generate a migration for the EcContent table"
11
11
  class_option :"skip-routes", :type => :boolean, :desc => "Don't generate the routes for Editable Contents"
12
12
 
13
- def install_routes(*args)
13
+ def install_routes(*args) #:nodoc:
14
14
  unless options["skip-routes"]
15
15
  route "get '/contents/edit', :as => :edit_content"
16
16
  route "post '/contents/update', :as => :update_content"
17
17
  end
18
18
  end
19
19
 
20
- def copy_files(*args)
20
+ def copy_files(*args) #:nodoc:
21
21
  migration_template MIGRATIONS_FILE, "db/migrate/create_ec_contents.rb" unless options["skip-migration"]
22
22
  end
23
23
 
data/test/helper.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
+ require 'bundler'
4
+ Bundler.setup
3
5
  require 'shoulda'
4
6
 
5
7
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: editable_content
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 4
8
+ - 5
9
9
  - 0
10
- version: 0.4.0
10
+ version: 0.5.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Will Merrell
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-13 00:00:00 -05:00
18
+ date: 2010-12-19 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -79,9 +79,9 @@ files:
79
79
  - app/views/contents/edit.html.erb
80
80
  - app/views/layouts/contents.html.erb
81
81
  - lib/editable_content.rb
82
- - lib/editable_content/application_helpers.rb
83
82
  - lib/editable_content/controller_helper.rb
84
83
  - lib/editable_content/engine.rb
84
+ - lib/editable_content/view_helpers.rb
85
85
  - lib/generators/editable_content_generator.rb
86
86
  - LICENSE
87
87
  - README.rdoc
@@ -1,88 +0,0 @@
1
- module EditableContent
2
- module ActionControllerExtensions
3
- module ApplicationHelpers
4
- def insert_editable_content()
5
- if $editable_content_authorization
6
- content_for(:stylesheet_list) { stylesheet_link_tag "markitup/skins/simple/style.css" }
7
- content_for(:stylesheet_list) { stylesheet_link_tag "markitup/sets/textile/style.css" }
8
- content_for(:javascript_list) { javascript_include_tag "markitup/jquery.markitup.js" }
9
- content_for(:javascript_list) { javascript_include_tag "markitup/sets/textile/set.js" }
10
- content_for(:javascript_data) { <<-SCRIPTDATA
11
-
12
- var content_id = 0;
13
- var content_name = "";
14
-
15
- function openEditor(name, controller, action) {
16
- content_name = name;
17
- $.get("/contents/edit",
18
- {p_name:name, p_controller:controller, p_action:action},
19
- jQuery.proxy(this, function(data) {
20
- content_id = data.id;
21
- $("#ec_edit_textarea").val(data.content);
22
- $("#ec_edit_dialog_form").dialog('open');
23
- }));
24
- }
25
-
26
- $(function() {
27
- // a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
28
- $("#ec_edit_dialog_form").dialog("destroy");
29
-
30
- $("#ec_edit_textarea").markItUp(mySettings);
31
-
32
- $("#ec_edit_dialog_form").dialog({
33
- autoOpen: false,
34
- height: 375,
35
- width: 1000,
36
- modal: true,
37
- buttons: {
38
- 'Save': function() {
39
- $.post("/contents/update",
40
- {p_id:content_id, p_content:$("#ec_edit_textarea").val()},
41
- jQuery.proxy(this, function(data) {
42
- $("#ec_edit_frame_" + content_name).html(data);
43
- })
44
- );
45
- $(this).dialog('close');
46
- },
47
- Cancel: function() {
48
- $(this).dialog('close');
49
- }
50
- },
51
- close: function() {
52
- $("#ec_edit_textarea").html("");
53
- }
54
- });
55
- });
56
- SCRIPTDATA
57
- }
58
-
59
- editor_text = <<EDITOR_FORM
60
- <div id="ec_edit_dialog_form" title="Edit Content" style="padding: 0; display: none;">
61
- <form style="padding: 5px 0 0 0;" >
62
- <textarea name="ec_edit_textarea" id="ec_edit_textarea" cols="80" style="width: 99.5%; height: 200px; min_height: 200px;" class="ui_widget_content ui_corner_all" ></textarea>
63
- </form>
64
- </div>
65
- EDITOR_FORM
66
- editor_text.html_safe
67
- end
68
- end
69
-
70
- def create_content_editor(name)
71
- if $editable_content_authorization
72
- content_for(:javascript_data) { <<-SCRIPTDATA
73
- $(function() {
74
- $("#ec_edit_button_#{name}").click( function(event) {
75
- openEditor("#{name}", "#{controller_name()}", "#{action_name()}");
76
- event.preventDefault();
77
- });
78
- });
79
- SCRIPTDATA
80
- }
81
- end
82
- end
83
-
84
- end
85
- end
86
- end
87
-
88
- ActionView::Base.send :include, EditableContent::ActionControllerExtensions::ApplicationHelpers