radiant-forms-extension 2.0.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.
Files changed (43) hide show
  1. data/.gitignore +3 -0
  2. data/README.md +117 -0
  3. data/Rakefile +137 -0
  4. data/VERSION +1 -0
  5. data/app/controllers/admin/forms_controller.rb +10 -0
  6. data/app/controllers/forms_controller.rb +35 -0
  7. data/app/models/form.rb +5 -0
  8. data/app/models/form_page.rb +7 -0
  9. data/app/models/response.rb +11 -0
  10. data/app/views/admin/forms/_fields.html.haml +56 -0
  11. data/app/views/admin/forms/_filters.html.haml +7 -0
  12. data/app/views/admin/forms/_form.html.haml +6 -0
  13. data/app/views/admin/forms/_header.html.haml +3 -0
  14. data/app/views/admin/forms/edit.html.haml +15 -0
  15. data/app/views/admin/forms/index.html.haml +20 -0
  16. data/app/views/admin/forms/new.html.haml +15 -0
  17. data/app/views/admin/forms/remove.html.haml +20 -0
  18. data/config/locales/en.yml +3 -0
  19. data/config/routes.rb +9 -0
  20. data/cucumber.yml +1 -0
  21. data/db/migrate/001_create_forms.rb +16 -0
  22. data/db/migrate/002_create_user_observer.rb +15 -0
  23. data/db/migrate/003_rename_output_to_content.rb +9 -0
  24. data/db/migrate/004_create_responses.rb +13 -0
  25. data/forms_extension.rb +24 -0
  26. data/lib/forms/admin_ui.rb +23 -0
  27. data/lib/forms/application_controller_extensions.rb +20 -0
  28. data/lib/forms/extension_methods.rb +14 -0
  29. data/lib/forms/page_extensions.rb +6 -0
  30. data/lib/forms/site_controller_extensions.rb +19 -0
  31. data/lib/forms/tags.rb +277 -0
  32. data/lib/tasks/forms_extension_tasks.rake +55 -0
  33. data/public/images/admin/extensions/form/form.png +0 -0
  34. data/radiant-forms-extension.gemspec +87 -0
  35. data/spec/controllers/forms_controller_spec.rb +150 -0
  36. data/spec/datasets/forms.rb +30 -0
  37. data/spec/lib/forms/extension_methods_spec.rb +41 -0
  38. data/spec/lib/forms/tags_spec.rb +122 -0
  39. data/spec/models/form_spec.rb +40 -0
  40. data/spec/models/response_spec.rb +31 -0
  41. data/spec/spec.opts +7 -0
  42. data/spec/spec_helper.rb +18 -0
  43. metadata +102 -0
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ */.DS_Store
3
+ pkg
data/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # Radiant Forms Extension
2
+
3
+ This extension allows a developer to create forms which can take on multiple tasks
4
+
5
+ The idea was taken from the mailer extension, everything mail specific is used in [radiant-forms_mail-extension](http://github.com/squaretalent/radiant-forms_mail-extension)
6
+
7
+ Using forms 'DRY's up the process of creating and reusing forms across a site (well I think so at least).
8
+
9
+ ## Installation
10
+
11
+ git clone git://github.com/squaretalent/radiant-forms-extension vendor/extensions/forms
12
+ rake radiant:extensions:forms:migrate
13
+ rake radiant:extensions:forms:update
14
+
15
+ ## Usage
16
+
17
+ A new tab will be present under design, a form has the following properties
18
+
19
+ * **title** reference for when you call the form tag (no spaces)
20
+ * **action** a specification action to submit the form to (posting to external sites etc)
21
+ * **redirect_to** location to send the redirection to, will go to posting page otherwise
22
+ * **body** output which will be shown on a radiant page
23
+ * **content** presentation of data after form is submitted (useful when sending emails)
24
+ * **config** configuration for the addons which will use that form
25
+
26
+ Include the form in a page using a radius tag
27
+ <r:form name="form_title" />
28
+
29
+ ## Usage
30
+
31
+ ### Body
32
+
33
+ <ol>
34
+ <li>
35
+ <r:label for='contact[name]'>
36
+ <span class='title'>Your Name</span>
37
+ <r:text name='contact[name]' />
38
+ </r:label>
39
+ </li>
40
+ <li>
41
+ <r:label for='contact[email]'>
42
+ <span class='title'>Your Email</span>
43
+ <r:text name='contact[email]' />
44
+ </r:label>
45
+ </li>
46
+ <li>
47
+ <r:submit value='Send My Name' />
48
+ </li>
49
+ </ol>
50
+
51
+ ### Content
52
+
53
+ <h2>Contact from <r:get name='contact[name]' /></h2>
54
+
55
+ <p>You can get back to them on <r:get name='contact[email]' /></p>
56
+
57
+ <p>Cheers, <br /> <strong>Cool Mailer</strong></p>
58
+
59
+ ### Config
60
+
61
+ *assuming you have forms_mail installed as well*
62
+
63
+ mail:
64
+ field:
65
+ from: contact[email]
66
+ recipients: info@company.com
67
+
68
+ ### Response
69
+
70
+ <html>
71
+ <head>Some Terribly Designed Radiant Page</head>
72
+ <body>
73
+ <r:forms:response>
74
+
75
+ <h2>Thank you for contacting us <r:get name='contact[name]' /></h2>
76
+
77
+ <!-- We need to clear the response, sort of like flash data -->
78
+ <r:clear />
79
+
80
+ </r:forms:response>
81
+ </body>
82
+ </html>
83
+
84
+ ## Addons
85
+
86
+ ### The Market
87
+
88
+ * [radiant-forms_mail-extension](http://github.com/squaretalent/radiant-forms_mail-extension) -
89
+ A showcase of how to use addons, allows you to send emails directly from the page
90
+
91
+ ### Controller
92
+
93
+ Must be named **FormsBlahController** and contain an inherited FormsExtensionController of the same name
94
+
95
+ class FormsBlahController < FormsExtensionController
96
+
97
+ def create
98
+ # @form = Form which the data comes from
99
+ # @page = Page which submitted the form (data contains submitted information)
100
+
101
+ # return = {
102
+ # :hash => 'these details will be returned to the result page namespaced under blah'
103
+ # }
104
+ end
105
+
106
+ end
107
+
108
+ Any form configured with a **blah** block will know to call this controllers create method
109
+
110
+ blah:
111
+ key: value
112
+ another: value
113
+
114
+ ### Functionality
115
+
116
+ I'm going to let you sort that out, you have the create action with input and output
117
+ from here you can decide how your form addon is going to behave.
data/Rakefile ADDED
@@ -0,0 +1,137 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = "radiant-forms-extension"
5
+ gem.summary = %Q{Forms Extension for Radiant CMS}
6
+ gem.description = %Q{Send data from a page to a form handler, extendable with addons}
7
+ gem.email = "dirk.kelly@squaretalent.com"
8
+ gem.homepage = "http://github.com/squaretalent/radiant-forms-extension"
9
+ gem.authors = ["dirkkelly"]
10
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
11
+ end
12
+ Jeweler::GemcutterTasks.new
13
+ rescue LoadError
14
+ puts "Jeweler (or a dependency) not available. This is only required if you plan to package forms as a gem."
15
+ end
16
+
17
+ # In rails 1.2, plugins aren't available in the path until they're loaded.
18
+ # Check to see if the rspec plugin is installed first and require
19
+ # it if it is. If not, use the gem version.
20
+
21
+ # Determine where the RSpec plugin is by loading the boot
22
+ unless defined? RADIANT_ROOT
23
+ ENV["RAILS_ENV"] = "test"
24
+ case
25
+ when ENV["RADIANT_ENV_FILE"]
26
+ require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
27
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
28
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
29
+ else
30
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
31
+ end
32
+ end
33
+
34
+ require 'rake'
35
+ require 'rake/rdoctask'
36
+ require 'rake/testtask'
37
+
38
+ rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
39
+ $LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
40
+ require 'spec/rake/spectask'
41
+ require 'cucumber'
42
+ require 'cucumber/rake/task'
43
+
44
+ # Cleanup the RADIANT_ROOT constant so specs will load the environment
45
+ Object.send(:remove_const, :RADIANT_ROOT)
46
+
47
+ extension_root = File.expand_path(File.dirname(__FILE__))
48
+
49
+ task :default => :spec
50
+ task :stats => "spec:statsetup"
51
+
52
+ desc "Run all specs in spec directory"
53
+ Spec::Rake::SpecTask.new(:spec) do |t|
54
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
55
+ t.spec_files = FileList['spec/**/*_spec.rb']
56
+ end
57
+
58
+ task :features => 'spec:integration'
59
+
60
+ namespace :spec do
61
+ desc "Run all specs in spec directory with RCov"
62
+ Spec::Rake::SpecTask.new(:rcov) do |t|
63
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
64
+ t.spec_files = FileList['spec/**/*_spec.rb']
65
+ t.rcov = true
66
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
67
+ end
68
+
69
+ desc "Print Specdoc for all specs"
70
+ Spec::Rake::SpecTask.new(:doc) do |t|
71
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
72
+ t.spec_files = FileList['spec/**/*_spec.rb']
73
+ end
74
+
75
+ [:models, :controllers, :views, :helpers].each do |sub|
76
+ desc "Run the specs under spec/#{sub}"
77
+ Spec::Rake::SpecTask.new(sub) do |t|
78
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
79
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
80
+ end
81
+ end
82
+
83
+ desc "Run the Cucumber features"
84
+ Cucumber::Rake::Task.new(:integration) do |t|
85
+ t.fork = true
86
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'pretty')]
87
+ # t.feature_pattern = "#{extension_root}/features/**/*.feature"
88
+ t.profile = "default"
89
+ end
90
+
91
+ # Setup specs for stats
92
+ task :statsetup do
93
+ require 'code_statistics'
94
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
95
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
96
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
97
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
98
+ ::CodeStatistics::TEST_TYPES << "Model specs"
99
+ ::CodeStatistics::TEST_TYPES << "View specs"
100
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
101
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
102
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
103
+ end
104
+
105
+ namespace :db do
106
+ namespace :fixtures do
107
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
108
+ task :load => :environment do
109
+ require 'active_record/fixtures'
110
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
111
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
112
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ desc 'Generate documentation for the forms extension.'
120
+ Rake::RDocTask.new(:rdoc) do |rdoc|
121
+ rdoc.rdoc_dir = 'rdoc'
122
+ rdoc.title = 'FormsExtension'
123
+ rdoc.options << '--line-numbers' << '--inline-source'
124
+ rdoc.rdoc_files.include('README')
125
+ rdoc.rdoc_files.include('lib/**/*.rb')
126
+ end
127
+
128
+ # For extensions that are in transition
129
+ desc 'Test the forms extension.'
130
+ Rake::TestTask.new(:test) do |t|
131
+ t.libs << 'lib'
132
+ t.pattern = 'test/**/*_test.rb'
133
+ t.verbose = true
134
+ end
135
+
136
+ # Load any custom rakefiles for extension
137
+ Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 2.0.0
@@ -0,0 +1,10 @@
1
+ class Admin::FormsController < Admin::ResourceController
2
+
3
+ skip_before_filter :verify_authenticity_token, :only => :create
4
+
5
+ only_allow_access_to :index, :show, :new, :create, :edit, :update, :remove, :destroy,
6
+ :when => [ :designer, :admin ],
7
+ :denied_url => { :controller => 'admin/pages', :action => 'index' },
8
+ :denied_message => 'You must have designer privileges to perform this action.'
9
+
10
+ end
@@ -0,0 +1,35 @@
1
+ class FormsController < ApplicationController
2
+
3
+ no_login_required
4
+
5
+ skip_before_filter :verify_authenticity_token
6
+
7
+ # POST /forms/1
8
+ #----------------------------------------------------------------------------
9
+ def create
10
+ @page = Page.find(params[:page_id])
11
+ @form = Form.find(params[:form_id])
12
+ @page.data = params
13
+
14
+ response = current_response
15
+ response.result = params
16
+
17
+ begin
18
+ @form[:config] = YAML::load("--- !map:HashWithIndifferentAccess\n"+@form[:config]).symbolize_keys
19
+ rescue
20
+ raise "Form '#{@form.title}' has not been configured"
21
+ end
22
+
23
+ @form[:config].each do |ext, config|
24
+ ext_controller = ("Forms#{ext.to_s.capitalize}Controller".constantize).new(@form, @page)
25
+ response.result = response.result.merge({ "#{ext}_ext" => ext_controller.create })
26
+ end
27
+
28
+ if response.save
29
+ redirect_to (@form.redirect_to.nil? ? @page.url : @form.redirect_to)
30
+ else
31
+ raise "Form '#{@form.name}' could not be submitted. Sorry"
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,5 @@
1
+ class Form < ActiveRecord::Base
2
+
3
+ validates_presence_of :title
4
+
5
+ end
@@ -0,0 +1,7 @@
1
+ class FormPage < Page
2
+
3
+ def cache?
4
+ false
5
+ end
6
+
7
+ end
@@ -0,0 +1,11 @@
1
+ class Response < ActiveRecord::Base
2
+
3
+ def result
4
+ ActiveSupport::JSON.decode(self.result_json) unless self.result_json.nil?
5
+ end
6
+
7
+ def result=(result)
8
+ self.result_json = ActiveSupport::JSON.encode(result)
9
+ end
10
+
11
+ end
@@ -0,0 +1,56 @@
1
+ - form_for [:admin, @form], :html => {:onsubmit_status => onsubmit_status(@form)}, :html => { :enctype => 'multipart/form-data' } do |form_form|
2
+ .form_top
3
+ - render_region :form_top do |form_top|
4
+ -# empty
5
+
6
+ .form_area
7
+ - render_region :form do |form|
8
+ - form.edit_title do
9
+ %p.title
10
+ = form_form.label :title, 'Title'
11
+ = form_form.text_field :title, :class => 'textbox activate', :maxlength => 255
12
+
13
+ .drawer
14
+ .drawer_contents#attributes
15
+ %table.fieldset
16
+ %tr
17
+ %th.label= form_form.label :action, 'Action'
18
+ %td.field= form_form.text_field :action, :class => 'textbox', :maxlength => 100, :size => 100
19
+ %tr
20
+ %th.label= form_form.label :redirect_to, 'Redirect To'
21
+ %td.field= form_form.text_field :redirect_to, :class => 'textbox', :maxlength => 100, :size => 100
22
+ .drawer_handle
23
+ %a.toggle{:href=>'#attributes', :rel=>"toggle[attributes]", :class=>"#{(meta_errors? ? 'less' : 'more')}"}= meta_label
24
+
25
+ - form.edit_content do
26
+ #tab_control
27
+ #tabs.tabs
28
+ #parts.pages
29
+ #form_body.page{'data-caption'=>'body'}
30
+ = render '/admin/forms/filters'
31
+ = form_form.text_area :body, :class => 'textarea large', :style => 'width: 100%'
32
+ #form_content.page{'data-caption'=>'content'}
33
+ = render '/admin/forms/filters'
34
+ = form_form.text_area :content, :class => 'textarea large', :style => 'width: 100%'
35
+ #form_config.page{'data-caption'=>'config'}
36
+ %p
37
+ %span.reference_links
38
+ Available
39
+ = form_form.text_area :config, :class => 'textarea large', :style => 'width: 100%'
40
+
41
+ .form_bottom
42
+ - render_region :form_bottom do |form_bottom|
43
+ - form_bottom.edit_buttons do
44
+ %p.buttons{:style=>"clear: left"}
45
+ = save_model_button(@form)
46
+ = save_model_and_continue_editing_button(@form)
47
+ or
48
+ = link_to t('cancel'), admin_forms_url
49
+ - form_bottom.edit_timestamp do
50
+ %p.updated_line
51
+ = updated_stamp @form
52
+
53
+ - content_for :page_css do
54
+ :sass
55
+ th.label
56
+ :width 75px !important
@@ -0,0 +1,7 @@
1
+ %p
2
+ %span.reference_links
3
+ = t('reference')
4
+ %span#filter_reference_link_body
5
+ = link_to t('filter'), '/admin/reference/filters?filter_name=Textile', :class => 'popup'
6
+ %span#tag_reference_link_body
7
+ = link_to t('available_tags'), '/admin/reference/tags', :class => 'popup'
@@ -0,0 +1,6 @@
1
+ %tr.node.level_1
2
+ %td.snippet
3
+ = image('extensions/form/form', :alt => '')
4
+ %span= link_to form.title, edit_admin_form_path(form)
5
+ %td.remove
6
+ = link_to t('remove'), remove_admin_form_path(form)
@@ -0,0 +1,3 @@
1
+ -# include_stylesheet 'admin/former'
2
+
3
+ -# include_javascript 'admin/former'
@@ -0,0 +1,15 @@
1
+ - body_classes << "reversed"
2
+
3
+ - render_region :main do |main|
4
+ - main.edit_header do
5
+ %h1= "Edit Form"
6
+
7
+ - main.edit_form do
8
+ = render :partial => 'fields'
9
+ = hidden_field_tag 'page_part_index_field'
10
+
11
+ - content_for :page_css do
12
+ :sass
13
+ .tab
14
+ .close
15
+ :display none
@@ -0,0 +1,20 @@
1
+ - @page_title = 'Forms - ' + default_page_title
2
+
3
+ .outset
4
+ = render 'header'
5
+ #forms_table
6
+ %table.index
7
+ %thead
8
+ %tr
9
+ %th.form Form
10
+ %th.modify Modify
11
+ %tbody#forms_table_body
12
+ - if @forms.size != 0
13
+ = render :partial => 'form', :collection => @forms
14
+ -else
15
+ %tr
16
+ %td.empty{:colspan => 2} No Forms
17
+
18
+ #actions
19
+ %ul
20
+ %li= link_to "New Form", new_admin_form_path
@@ -0,0 +1,15 @@
1
+ - body_classes << "reversed"
2
+
3
+ - render_region :main do |main|
4
+ - main.edit_header do
5
+ %h1= "New Form"
6
+
7
+ - main.edit_form do
8
+ = render :partial => 'fields'
9
+ = hidden_field_tag 'page_part_index_field'
10
+
11
+ - content_for :page_css do
12
+ :sass
13
+ .tab
14
+ .close
15
+ :display none
@@ -0,0 +1,20 @@
1
+ %h1 Remove Form
2
+
3
+ %p
4
+ Are you sure you want to
5
+ %strong.warning permanently remove
6
+ the following form?
7
+
8
+ %table.index#form{ :cellpadding => "0", :cellspacing => "0", :border => "0" }
9
+ %tbody
10
+ %tr.node.level-1{ :onmouseover => "Element.addClassName(this, 'highlight');", :onmouseout => "Element.removeClassName(this, 'highlight');" }
11
+ %td.asset
12
+ = image('form.png', :alt => '')
13
+ = @form.title
14
+
15
+
16
+ - form_for [:admin, @form], :html => { :method => 'delete', :onsubmit_status => "Removing Form&#8230;" } do
17
+ %p.buttons
18
+ %input.button{ :type => "submit", :value => "Delete Form" }
19
+ or
20
+ = link_to 'Cancel', admin_forms_path
@@ -0,0 +1,3 @@
1
+ ---
2
+ en:
3
+ forms: Forms
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+
3
+ map.namespace :admin, :member => { :remove => :get } do |admin|
4
+ admin.resources :forms
5
+ end
6
+
7
+ map.resources :forms, :only => [ :create ]
8
+
9
+ end
data/cucumber.yml ADDED
@@ -0,0 +1 @@
1
+ default: --format progress features --tags ~@proposed,~@in_progress
@@ -0,0 +1,16 @@
1
+ class CreateForms < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :forms do |t|
4
+ t.string :title
5
+ t.string :action
6
+ t.string :redirect_to
7
+ t.text :body
8
+ t.text :output
9
+ t.text :config
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :forms
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ class CreateUserObserver < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :forms, :created_by, :integer
4
+ add_column :forms, :updated_by, :integer
5
+ add_column :forms, :created_at, :datetime
6
+ add_column :forms, :updated_at, :datetime
7
+ end
8
+
9
+ def self.down
10
+ remove_column :forms, :created_by
11
+ remove_column :forms, :updated_by
12
+ remove_column :forms, :created_at
13
+ remove_column :forms, :updated_at
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ class RenameOutputToContent < ActiveRecord::Migration
2
+ def self.up
3
+ rename_column :forms, :output, :content
4
+ end
5
+
6
+ def self.down
7
+ rename_column :forms, :content, :output
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class CreateResponses < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :responses do |t|
4
+ t.text :result_json
5
+ t.timestamps
6
+ end
7
+
8
+ end
9
+
10
+ def self.down
11
+ drop_table :responses
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ class FormsExtension < Radiant::Extension
2
+ version '2.0'
3
+ description 'Radiant Form extension. Site wide, useful form management'
4
+ url 'http://github.com/squaretalent/radiant-forms-extension'
5
+
6
+ extension_config do |config|
7
+ if RAILS_ENV == :test
8
+ config.gem 'rr', :version => '0.10.11'
9
+ end
10
+ end
11
+
12
+ def activate
13
+ Radiant::AdminUI.send(:include, Forms::AdminUI) unless defined? admin.form
14
+ admin.form = Radiant::AdminUI.load_default_form_regions
15
+
16
+ Page.class_eval { include Forms::Tags, Forms::PageExtensions }
17
+ ApplicationController.send(:include, Forms::ApplicationControllerExtensions)
18
+ SiteController.send(:include, Forms::SiteControllerExtensions)
19
+
20
+ tab 'Design' do
21
+ add_item 'Forms', '/admin/forms', :after => 'Snippets'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ module Forms
2
+ module AdminUI
3
+
4
+ def self.included(base)
5
+ base.class_eval do
6
+ attr_accessor :form
7
+ alias_method :forms, :form
8
+ protected
9
+ def load_default_form_regions
10
+ returning OpenStruct.new do |form|
11
+ form.edit = Radiant::AdminUI::RegionSet.new do |edit|
12
+ edit.main.concat %w{edit_header edit_form}
13
+ edit.form.concat %w{edit_title edit_content}
14
+ edit.form_bottom.concat %w{edit_buttons edit_timestamp}
15
+ end
16
+ form.new = form.edit
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ module Forms
2
+ module ApplicationControllerExtensions
3
+ def self.included(base)
4
+ base.class_eval {
5
+ helper_method :current_response
6
+
7
+ def current_response
8
+ if request.session[:form_response]
9
+ @response = Response.find(request.session[:form_response])
10
+ else
11
+ @response = Response.create
12
+ request.session = @response.id
13
+ end
14
+
15
+ @response
16
+ end
17
+ }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module Forms
2
+ module ExtensionMethods
3
+ def self.included(base)
4
+ attr_accessor :form, :page, :data
5
+ base.class_eval do
6
+ def initialize(form, page)
7
+ @form = form
8
+ @data = page.data
9
+ @page = page
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ module Forms
2
+ module PageExtensions
3
+ attr_accessor :last_form
4
+ attr_accessor :data
5
+ end
6
+ end