erp_forms 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/GPL-3-LICENSE +674 -0
- data/README.rdoc +2 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/erp_forms/application.js +9 -0
- data/app/assets/stylesheets/erp_forms/application.css +7 -0
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/base_controller.rb +47 -0
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/data_controller.rb +87 -0
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/forms_controller.rb +79 -0
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/models_controller.rb +45 -0
- data/app/helpers/erp_forms/application_helper.rb +4 -0
- data/app/models/dynamic_datum.rb +65 -0
- data/app/models/dynamic_form.rb +191 -0
- data/app/models/dynamic_form_document.rb +29 -0
- data/app/models/dynamic_form_model.rb +42 -0
- data/app/views/layouts/application.html.erb +14 -0
- data/app/views/layouts/erp_forms/application.html.erb +14 -0
- data/app/widgets/dynamic_forms/base.rb +61 -0
- data/app/widgets/dynamic_forms/javascript/dynamic_forms.js +109 -0
- data/app/widgets/dynamic_forms/views/error.html.erb +4 -0
- data/app/widgets/dynamic_forms/views/index.html.erb +8 -0
- data/app/widgets/dynamic_forms/views/success.html.erb +4 -0
- data/config/routes.rb +6 -0
- data/db/data_migrations/20110608185830_create_default_dynamic_models_and_forms.rb +30 -0
- data/db/data_migrations/20110822170240_update_contact_form_validation.rb +22 -0
- data/db/data_migrations/20110828190913_create_desktop_app_dynamic_forms.rb +18 -0
- data/db/data_migrations/20110830170240_update_contact_form.rb +23 -0
- data/db/migrate/20110530193446_dynamic_forms.rb +82 -0
- data/lib/erp_forms/dynamic_attributes_patch.rb +10 -0
- data/lib/erp_forms/dynamic_form_field.rb +130 -0
- data/lib/erp_forms/dynamic_grid_column.rb +108 -0
- data/lib/erp_forms/engine.rb +22 -0
- data/lib/erp_forms/extensions/active_record/has_dynamic_data.rb +54 -0
- data/lib/erp_forms/extensions/active_record/has_dynamic_forms.rb +70 -0
- data/lib/erp_forms/extensions/extensions.rb +6 -0
- data/lib/erp_forms/extensions/railties/action_view.rb +20 -0
- data/lib/erp_forms/version.rb +3 -0
- data/lib/erp_forms.rb +11 -0
- data/lib/tasks/erp_forms_tasks.rake +4 -0
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/center_region.js +23 -0
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/dynamic_data_grid.js +81 -0
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/form_builder.js +93 -0
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/module.js +37 -0
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/west_region.js +468 -0
- data/public/javascripts/erp_app/shared/dynamic_forms/dynamic_forms_validation.js +4 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -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/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +8 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/spec.rb +27 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -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 +12 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/models/dynamic_datum_spec.rb +9 -0
- data/spec/models/dynamic_form_document_spec.rb +11 -0
- data/spec/models/dynamic_form_model_spec.rb +11 -0
- data/spec/models/dynamic_form_spec.rb +11 -0
- data/spec/spec_helper.rb +60 -0
- metadata +183 -0
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
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
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'ErpForms'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
24
|
+
load 'rails/tasks/engine.rake'
|
25
|
+
|
26
|
+
Bundler::GemHelper.install_tasks
|
27
|
+
|
28
|
+
require "rspec/core/rake_task"
|
29
|
+
RSpec::Core::RakeTask.new(:spec)
|
30
|
+
task :default => :spec
|
@@ -0,0 +1,9 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into including all the files listed below.
|
2
|
+
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
|
3
|
+
// be included in the compiled file accessible from http://example.com/assets/application.js
|
4
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
5
|
+
// the compiled file.
|
6
|
+
//
|
7
|
+
//= require jquery
|
8
|
+
//= require jquery_ujs
|
9
|
+
//= require_tree .
|
@@ -0,0 +1,7 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
3
|
+
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
4
|
+
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
5
|
+
*= require_self
|
6
|
+
*= require_tree .
|
7
|
+
*/
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class ErpForms::ErpApp::Desktop::DynamicForms::BaseController < ::ErpApp::Desktop::BaseController
|
2
|
+
IGNORED_PARAMS = %w{action controller uuid widget_name widget_action dynamic_form_id dynamic_form_model_id model_name use_dynamic_form authenticity_token}
|
3
|
+
|
4
|
+
protected
|
5
|
+
def build_section_hash(website_section, website)
|
6
|
+
website_section_hash = {
|
7
|
+
:text => website_section.title,
|
8
|
+
:siteName => website.title,
|
9
|
+
:siteId => website.id,
|
10
|
+
:type => website_section.type,
|
11
|
+
:isSecured => !website_section.roles.empty?,
|
12
|
+
:isSection => true,
|
13
|
+
:inMenu => website_section.in_menu,
|
14
|
+
:hasLayout => !website_section.layout.blank?,
|
15
|
+
:id => "section_#{website_section.id}",
|
16
|
+
:url => "http://#{website.hosts.first.host}/#{website_section.permalink}"
|
17
|
+
}
|
18
|
+
|
19
|
+
if website_section.is_a?(Blog) || website_section.type == 'Blog'
|
20
|
+
website_section_hash[:isBlog] = true
|
21
|
+
website_section_hash[:iconCls] = 'icon-blog'
|
22
|
+
website_section_hash[:leaf] = true
|
23
|
+
else
|
24
|
+
unless website_section.children.empty?
|
25
|
+
website_section_hash[:leaf] = false
|
26
|
+
website_section_hash[:children] = []
|
27
|
+
website_section.positioned_children.each do |child|
|
28
|
+
website_section_hash[:children] << build_section_hash(child, website)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
website_section_hash[:leaf] = true
|
32
|
+
end
|
33
|
+
website_section_hash[:iconCls] = website_section_hash[:isSecured] ? 'icon-document_lock' : 'icon-document'
|
34
|
+
end
|
35
|
+
|
36
|
+
website_section_hash
|
37
|
+
end
|
38
|
+
|
39
|
+
def page
|
40
|
+
offset = params[:start].to_f
|
41
|
+
offset > 0 ? (offset / params[:limit].to_f).to_i + 1 : 1
|
42
|
+
end
|
43
|
+
|
44
|
+
def per_page
|
45
|
+
params[:limit].nil? ? 20 : params[:limit].to_i
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class ErpForms::ErpApp::Desktop::DynamicForms::DataController < ErpForms::ErpApp::Desktop::DynamicForms::BaseController
|
2
|
+
|
3
|
+
# setup dynamic data grid
|
4
|
+
def setup
|
5
|
+
form = DynamicForm.get_form(params[:model_name])
|
6
|
+
definition = form.definition_object
|
7
|
+
|
8
|
+
columns = []
|
9
|
+
definition.each do |field_hash|
|
10
|
+
field_hash[:width] = 120
|
11
|
+
columns << DynamicGridColumn.build_column(field_hash)
|
12
|
+
end
|
13
|
+
|
14
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Updated By", :name => 'updated_username', :xtype => 'textfield' })
|
15
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Created By", :name => 'created_username', :xtype => 'textfield' })
|
16
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Created At", :name => 'created_at', :xtype => 'datefield', :width => 75 })
|
17
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Updated At", :name => 'updated_at', :xtype => 'datefield', :width => 75 })
|
18
|
+
columns << DynamicGridColumn.build_edit_column("Ext.getCmp('DynamicFormDataGridPanel').editRecord(rec,'#{params[:model_name]}');")
|
19
|
+
columns << DynamicGridColumn.build_delete_column("Ext.getCmp('DynamicFormDataGridPanel').deleteRecord(rec,'#{params[:model_name]}');")
|
20
|
+
|
21
|
+
definition << DynamicFormField.textfield({ :fieldLabel => "Updated By", :name => 'updated_username' })
|
22
|
+
definition << DynamicFormField.textfield({ :fieldLabel => "Created By", :name => 'created_username' })
|
23
|
+
definition << DynamicFormField.datefield({ :fieldLabel => "Created At", :name => 'created_at' })
|
24
|
+
definition << DynamicFormField.datefield({ :fieldLabel => "Updated At", :name => 'updated_at' })
|
25
|
+
definition << DynamicFormField.hidden({ :fieldLabel => "ID", :name => 'id' })
|
26
|
+
|
27
|
+
render :inline => "{
|
28
|
+
\"success\": true,
|
29
|
+
\"columns\": [#{columns.join(',')}],
|
30
|
+
\"fields\": #{definition.to_json}
|
31
|
+
}"
|
32
|
+
end
|
33
|
+
|
34
|
+
# get dynamic data records
|
35
|
+
def index
|
36
|
+
sort = params[:sort] || 'created_at'
|
37
|
+
dir = params[:dir] || 'DESC'
|
38
|
+
|
39
|
+
myDynamicObject = DynamicFormModel.get_constant(params[:model_name])
|
40
|
+
|
41
|
+
dynamic_records = myDynamicObject.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
|
42
|
+
|
43
|
+
wi = []
|
44
|
+
dynamic_records.each do |i|
|
45
|
+
wihash = i.data.dynamic_attributes_without_prefix
|
46
|
+
# puts i.data.created_by.inspect
|
47
|
+
wihash[:id] = i.id
|
48
|
+
wihash[:created_username] = i.data.created_by.nil? ? '' : i.data.created_by.username
|
49
|
+
wihash[:updated_username] = i.data.updated_by.nil? ? '' : i.data.updated_by.username
|
50
|
+
wihash[:created_at] = i.data.created_at
|
51
|
+
wihash[:updated_at] = i.data.updated_at
|
52
|
+
wi << wihash
|
53
|
+
end
|
54
|
+
|
55
|
+
render :inline => "{ total:#{dynamic_records.total_entries}, data:#{wi.to_json} }"
|
56
|
+
end
|
57
|
+
|
58
|
+
# create a dynamic data record
|
59
|
+
def create
|
60
|
+
@myDynamicObject = DynamicFormModel.get_instance(params[:model_name])
|
61
|
+
puts current_user.inspect
|
62
|
+
params[:created_by] = current_user unless current_user.nil?
|
63
|
+
params[:created_with_form_id] = params[:dynamic_form_id] if params[:dynamic_form_id]
|
64
|
+
@myDynamicObject = DynamicFormModel.save_all_attributes(@myDynamicObject, params, ErpForms::ErpApp::Desktop::DynamicForms::BaseController::IGNORED_PARAMS)
|
65
|
+
|
66
|
+
render :json => @myDynamicObject ? {:success => true} : {:success => false}
|
67
|
+
end
|
68
|
+
|
69
|
+
# update a dynamic data record
|
70
|
+
def update
|
71
|
+
@myDynamicObject = DynamicFormModel.get_constant(params[:model_name]).find(params[:id])
|
72
|
+
|
73
|
+
params[:updated_by] = current_user unless current_user.nil?
|
74
|
+
params[:updated_with_form_id] = params[:dynamic_form_id] if params[:dynamic_form_id]
|
75
|
+
@myDynamicObject = DynamicFormModel.save_all_attributes(@myDynamicObject, params, ErpForms::ErpApp::Desktop::DynamicForms::BaseController::IGNORED_PARAMS)
|
76
|
+
|
77
|
+
render :json => @myDynamicObject ? {:success => true} : {:success => false}
|
78
|
+
end
|
79
|
+
|
80
|
+
# delete a dynamic data record
|
81
|
+
def delete
|
82
|
+
@myDynamicObject = DynamicFormModel.get_constant(params[:model_name])
|
83
|
+
@myDynamicObject.destroy(params[:id])
|
84
|
+
render :json => {:success => true}
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
class ErpForms::ErpApp::Desktop::DynamicForms::FormsController < ErpForms::ErpApp::Desktop::DynamicForms::BaseController
|
2
|
+
|
3
|
+
# get tree of dynamic models and forms
|
4
|
+
def get_tree
|
5
|
+
models = params[:node] == "root" ? DynamicFormModel.all(:order => :model_name) : DynamicFormModel.find_all_by_id(id)
|
6
|
+
tree = []
|
7
|
+
|
8
|
+
models.each do |form_model|
|
9
|
+
# DynamicFormDocument only exists for the purpose of Extending
|
10
|
+
next if form_model.model_name == 'DynamicFormDocument'
|
11
|
+
|
12
|
+
model_hash = {
|
13
|
+
:text => form_model.model_name,
|
14
|
+
:iconCls => 'icon-data',
|
15
|
+
:id => "form_model_#{form_model.id}",
|
16
|
+
:modelId => form_model.id,
|
17
|
+
:isModel => true,
|
18
|
+
:isForm => false,
|
19
|
+
:leaf => false,
|
20
|
+
:children => []
|
21
|
+
}
|
22
|
+
|
23
|
+
#handle sections
|
24
|
+
form_model.dynamic_forms.each do |form|
|
25
|
+
form_hash = {
|
26
|
+
:text => form.description,
|
27
|
+
:iconCls => (form.default ? 'icon-document_ok' : 'icon-document'),
|
28
|
+
:id => "form_#{form.id}",
|
29
|
+
:formId => form.id,
|
30
|
+
:isModel => false,
|
31
|
+
:isDefault => form.default,
|
32
|
+
:modelName => form_model.model_name,
|
33
|
+
:isForm => true,
|
34
|
+
:leaf => true
|
35
|
+
}
|
36
|
+
|
37
|
+
model_hash[:children] << form_hash
|
38
|
+
end
|
39
|
+
|
40
|
+
#added website to main tree
|
41
|
+
tree << model_hash
|
42
|
+
end
|
43
|
+
|
44
|
+
render :json => tree
|
45
|
+
end
|
46
|
+
|
47
|
+
# get a single form definition
|
48
|
+
def get_definition
|
49
|
+
form = DynamicForm.get_form(params[:model_name], params[:internal_identifier])
|
50
|
+
|
51
|
+
render :json => form.definition
|
52
|
+
end
|
53
|
+
|
54
|
+
# get a single form
|
55
|
+
def get
|
56
|
+
form = DynamicForm.find(params[:id]).to_extjs_formpanel(
|
57
|
+
{ :url => "/erp_forms/erp_app/desktop/dynamic_forms/data/#{params[:form_action]}",
|
58
|
+
:record_id => params[:id]
|
59
|
+
})
|
60
|
+
|
61
|
+
render :json => form
|
62
|
+
end
|
63
|
+
|
64
|
+
# delete dynamic form
|
65
|
+
def delete
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
# update dynamic form
|
70
|
+
def update
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
# create dynamic form
|
75
|
+
def create
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class ErpForms::ErpApp::Desktop::DynamicForms::ModelsController < ErpForms::ErpApp::Desktop::DynamicForms::BaseController
|
2
|
+
|
3
|
+
# get dynamic form models
|
4
|
+
# used in dynamic forms widget combo box
|
5
|
+
def index
|
6
|
+
models = []
|
7
|
+
dynamic_form_models = DynamicFormModel.where("model_name != 'DynamicFormDocument'").order('model_name ASC')
|
8
|
+
dynamic_form_models.each do |m|
|
9
|
+
model_hash = {
|
10
|
+
:id => m.id,
|
11
|
+
:model_name => m.model_name,
|
12
|
+
}
|
13
|
+
|
14
|
+
models << model_hash
|
15
|
+
end
|
16
|
+
|
17
|
+
render :json => models
|
18
|
+
end
|
19
|
+
|
20
|
+
# set default form for this model
|
21
|
+
def set_default_form
|
22
|
+
myDynamicObject = DynamicFormModel.get_constant(params[:model_name])
|
23
|
+
myDynamicObject.set_default(params[:id])
|
24
|
+
|
25
|
+
render :json => {success => true}
|
26
|
+
end
|
27
|
+
|
28
|
+
# delete a dynamic form model
|
29
|
+
def delete
|
30
|
+
DynamicFormModel.destroy(params[:id])
|
31
|
+
|
32
|
+
render :json => {success => true}
|
33
|
+
end
|
34
|
+
|
35
|
+
# create a dynamic form model
|
36
|
+
def create
|
37
|
+
model_name = params[:model_name]
|
38
|
+
DynamicFormModel.create({
|
39
|
+
:model_name => model_name
|
40
|
+
})
|
41
|
+
|
42
|
+
render :json => {success => true}
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class DynamicDatum < ActiveRecord::Base
|
2
|
+
DYNAMIC_ATTRIBUTE_PREFIX = 'dyn_'
|
3
|
+
|
4
|
+
has_dynamic_attributes :dynamic_attribute_prefix => DYNAMIC_ATTRIBUTE_PREFIX, :destroy_dynamic_attribute_for_nil => false
|
5
|
+
|
6
|
+
belongs_to :reference, :polymorphic => true
|
7
|
+
belongs_to :created_with_form, :class_name => "DynamicForm"
|
8
|
+
belongs_to :updated_with_form, :class_name => "DynamicForm"
|
9
|
+
belongs_to :created_by, :class_name => "User"
|
10
|
+
belongs_to :updated_by, :class_name => "User"
|
11
|
+
|
12
|
+
def dynamic_attributes_without_prefix
|
13
|
+
attrs = {}
|
14
|
+
self.dynamic_attributes.each do |k,v|
|
15
|
+
attrs[k[DYNAMIC_ATTRIBUTE_PREFIX.length..(k.length)]] = v
|
16
|
+
end
|
17
|
+
|
18
|
+
attrs
|
19
|
+
end
|
20
|
+
|
21
|
+
=begin
|
22
|
+
# this was used for sorting dynamic sttributes under Ruby 1.8.7 which did not have ordered hashes
|
23
|
+
# it is now obsolete under Ruby 1.9
|
24
|
+
# leave it here for reference for the time being in case we find that dynamic attributes are stored in the wrong order in the DB
|
25
|
+
# using ordered hashes assumes that dynamic attributes are stored in order in the database
|
26
|
+
def sorted_dynamic_attributes(with_prefix=true)
|
27
|
+
if !self.updated_with_form.nil?
|
28
|
+
form = self.updated_with_form
|
29
|
+
elsif !self.created_with_form.nil?
|
30
|
+
form = self.created_with_form
|
31
|
+
else
|
32
|
+
form = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
unless form.nil?
|
36
|
+
if with_prefix
|
37
|
+
keys = form.definition_object.collect{|f| DYNAMIC_ATTRIBUTE_PREFIX + f[:name]}
|
38
|
+
else
|
39
|
+
keys = form.definition_object.collect{|f| f[:name]}
|
40
|
+
end
|
41
|
+
|
42
|
+
sorted = []
|
43
|
+
keys.each do |key|
|
44
|
+
attribute = {}
|
45
|
+
if with_prefix
|
46
|
+
attribute[key] = self.dynamic_attributes[key]
|
47
|
+
else
|
48
|
+
attribute[key] = self.dynamic_attributes_without_prefix[key]
|
49
|
+
end
|
50
|
+
|
51
|
+
sorted << attribute
|
52
|
+
end
|
53
|
+
|
54
|
+
return sorted
|
55
|
+
else
|
56
|
+
if with_prefix
|
57
|
+
return self.dynamic_attributes
|
58
|
+
else
|
59
|
+
return self.dynamic_attributes_without_prefix
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
=end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
class DynamicForm < ActiveRecord::Base
|
2
|
+
belongs_to :dynamic_form_model
|
3
|
+
|
4
|
+
validates_uniqueness_of :internal_identifier, :scope => :model_name
|
5
|
+
|
6
|
+
def self.class_exists?(class_name)
|
7
|
+
result = nil
|
8
|
+
begin
|
9
|
+
klass = Module.const_get(class_name)
|
10
|
+
result = klass.is_a?(Class) ? ((klass.superclass == ActiveRecord::Base or klass.superclass == DynamicModel) ? true : nil) : nil
|
11
|
+
rescue NameError
|
12
|
+
result = nil
|
13
|
+
end
|
14
|
+
result
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.get_form(klass_name, internal_identifier='')
|
18
|
+
result = nil
|
19
|
+
if internal_identifier and internal_identifier != ''
|
20
|
+
result = DynamicForm.find_by_model_name_and_internal_identifier(klass_name, internal_identifier)
|
21
|
+
else
|
22
|
+
result = DynamicForm.find_by_model_name_and_default(klass_name, true)
|
23
|
+
end
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
# parse JSON definition into a ruby object
|
28
|
+
# returns an array of hashes
|
29
|
+
def definition_object
|
30
|
+
o = JSON.parse(self.definition)
|
31
|
+
o.map do |i|
|
32
|
+
i = i.symbolize_keys
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def definition_with_validation
|
37
|
+
add_validation(self.definition_object)
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_validation(def_object)
|
41
|
+
def_object.each do |item|
|
42
|
+
if item[:validator_function] and item[:validator_function] != ""
|
43
|
+
item[:validator] = NonEscapeJsonString.new("function(v){ regex = this.initialConfig.validation_regex; return #{item[:validator_function]}; }")
|
44
|
+
elsif item[:validation_regex] and item[:validation_regex] != ""
|
45
|
+
item[:validator] = NonEscapeJsonString.new("function(v){ return validate_regex(v, this.initialConfig.validation_regex); }")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def_object
|
50
|
+
end
|
51
|
+
|
52
|
+
# check field against form definition to see if field still exists
|
53
|
+
# returns true if field does not exist
|
54
|
+
def deprecated_field?(field_name)
|
55
|
+
result = true
|
56
|
+
definition_object.each do |field|
|
57
|
+
result = false if field[:name] == field_name.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
result
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.concat_fields_to_build_definition(array_of_fields)
|
64
|
+
array_of_fields.to_json
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_extjs_formpanel(options={})
|
68
|
+
form_hash = {
|
69
|
+
:xtype => 'form',
|
70
|
+
:id => 'dynamic_form_panel',
|
71
|
+
:url => options[:url],
|
72
|
+
:title => self.description,
|
73
|
+
:frame => true,
|
74
|
+
:bodyStyle => 'padding: 5px 5px 0;'
|
75
|
+
}
|
76
|
+
|
77
|
+
form_hash[:width] = options[:width] if options[:width]
|
78
|
+
form_hash[:baseParams] = {}
|
79
|
+
form_hash[:baseParams][:id] = options[:record_id] if options[:record_id]
|
80
|
+
form_hash[:baseParams][:dynamic_form_id] = self.id
|
81
|
+
form_hash[:baseParams][:dynamic_form_model_id] = self.dynamic_form_model_id
|
82
|
+
form_hash[:baseParams][:model_name] = self.model_name
|
83
|
+
form_hash[:listeners] = {:afterrender => NonEscapeJsonString.new("function(form) {Ext.getCmp('dynamic_form_panel').getComponent(0).focus(false);}")}
|
84
|
+
form_hash[:items] = definition_with_validation
|
85
|
+
form_hash[:buttons] = []
|
86
|
+
form_hash[:buttons][0] = {
|
87
|
+
:text => 'Submit',
|
88
|
+
:listeners => NonEscapeJsonString.new("{
|
89
|
+
\"click\":function(button){
|
90
|
+
var formPanel = Ext.getCmp('dynamic_form_panel');
|
91
|
+
formPanel.getForm().submit({
|
92
|
+
reset:true,
|
93
|
+
success:function(form, action){
|
94
|
+
Ext.getCmp('dynamic_form_panel').findParentByType('window').close();
|
95
|
+
if (Ext.getCmp('DynamicFormDataGridPanel')){
|
96
|
+
Ext.getCmp('DynamicFormDataGridPanel').query('shared_dynamiceditablegrid')[0].store.load();
|
97
|
+
}
|
98
|
+
},
|
99
|
+
failure:function(form, action){
|
100
|
+
Ext.Msg.alert(action.response.responseText);
|
101
|
+
}
|
102
|
+
});
|
103
|
+
}
|
104
|
+
}")
|
105
|
+
}
|
106
|
+
form_hash[:buttons][1] = {
|
107
|
+
:text => 'Cancel',
|
108
|
+
:listeners => NonEscapeJsonString.new("{
|
109
|
+
\"click\":function(button){
|
110
|
+
Ext.getCmp('dynamic_form_panel').findParentByType('window').close();
|
111
|
+
}
|
112
|
+
}")
|
113
|
+
}
|
114
|
+
|
115
|
+
form_hash
|
116
|
+
end
|
117
|
+
|
118
|
+
# convert form definition to ExtJS form
|
119
|
+
# definition is essentially the formpanel items
|
120
|
+
#
|
121
|
+
# options hash:
|
122
|
+
# :url => pass in URL for form to post to
|
123
|
+
# :widget_result_id =>
|
124
|
+
# :width =>
|
125
|
+
def to_extjs_widget(options={})
|
126
|
+
options[:width] = "'auto'" if options[:width].nil?
|
127
|
+
|
128
|
+
#NOTE: The random nbsp; forces IE to eval this javascript!
|
129
|
+
javascript = " <script type=\"text/javascript\">
|
130
|
+
Ext.onReady(function(){
|
131
|
+
Ext.QuickTips.init();
|
132
|
+
|
133
|
+
var dynamic_form = Ext.create('Ext.form.Panel',{
|
134
|
+
id: 'dynamic_form_panel',
|
135
|
+
url:'#{options[:url]}',
|
136
|
+
title: '#{self.description}',"
|
137
|
+
|
138
|
+
javascript += "\"width\": #{options[:width]}," if options[:width]
|
139
|
+
|
140
|
+
javascript += "frame: true,
|
141
|
+
bodyStyle:'padding: 5px 5px 0;',
|
142
|
+
renderTo: 'dynamic_form_target',
|
143
|
+
baseParams: {
|
144
|
+
dynamic_form_id: #{self.id},
|
145
|
+
dynamic_form_model_id: #{self.dynamic_form_model_id},
|
146
|
+
model_name: '#{self.model_name}'
|
147
|
+
},
|
148
|
+
items: #{definition_with_validation},
|
149
|
+
listeners: {
|
150
|
+
afterrender: function(form) {
|
151
|
+
Ext.getCmp('dynamic_form_panel').getComponent(0).focus(false);
|
152
|
+
}
|
153
|
+
},
|
154
|
+
buttons: [{
|
155
|
+
text: 'Submit',
|
156
|
+
listeners:{
|
157
|
+
'click':function(button){
|
158
|
+
|
159
|
+
var formPanel = Ext.getCmp('dynamic_form_panel');
|
160
|
+
formPanel.getForm().submit({
|
161
|
+
reset:true,
|
162
|
+
success:function(form, action){
|
163
|
+
json_hash = Ext.decode(action.response.responseText);
|
164
|
+
Ext.get('#{options[:widget_result_id]}').dom.innerHTML = json_hash.response;
|
165
|
+
var scriptTags = Ext.get('#{options[:widget_result_id]}').dom.getElementsByTagName('script');
|
166
|
+
Ext.each(scriptTags, function(scriptTag){
|
167
|
+
eval(scriptTag.text);
|
168
|
+
});
|
169
|
+
},
|
170
|
+
failure:function(form, action){
|
171
|
+
if (action.response){
|
172
|
+
json_hash = Ext.decode(action.response.responseText);
|
173
|
+
Ext.get('#{options[:widget_result_id]}').dom.innerHTML = json_hash.response;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
});
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
},{
|
181
|
+
text: 'Cancel'
|
182
|
+
}]
|
183
|
+
});
|
184
|
+
});
|
185
|
+
|
186
|
+
</script>"
|
187
|
+
#logger.info javascript
|
188
|
+
javascript
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class DynamicFormDocument < ActiveRecord::Base
|
2
|
+
belongs_to :dynamic_form_model
|
3
|
+
|
4
|
+
has_dynamic_forms
|
5
|
+
has_dynamic_data
|
6
|
+
|
7
|
+
# declare a subclass
|
8
|
+
# pass in name of subclass
|
9
|
+
def self.declare(klass_name)
|
10
|
+
Object.send(:remove_const, klass_name) if Object.const_defined?(klass_name) and !Rails.configuration.cache_classes
|
11
|
+
Object.const_set(klass_name, Class.new(DynamicFormDocument)) unless Object.const_defined?(klass_name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def send_email
|
15
|
+
WebsiteInquiryMailer.deliver_inquiry(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.class_exists?(class_name)
|
19
|
+
result = nil
|
20
|
+
begin
|
21
|
+
klass = Module.const_get(class_name)
|
22
|
+
result = klass.is_a?(Class) ? ((klass.superclass == ActiveRecord::Base or klass.superclass == DynamicModel) ? true : nil) : nil
|
23
|
+
rescue NameError
|
24
|
+
result = nil
|
25
|
+
end
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class DynamicFormModel < ActiveRecord::Base
|
2
|
+
has_many :dynamic_form_documents
|
3
|
+
has_many :dynamic_forms, :dependent => :destroy
|
4
|
+
|
5
|
+
def self.get_constant(klass_name)
|
6
|
+
result = nil
|
7
|
+
begin
|
8
|
+
result = klass_name.constantize
|
9
|
+
rescue
|
10
|
+
DynamicFormDocument.declare(klass_name)
|
11
|
+
result = klass_name.constantize
|
12
|
+
end
|
13
|
+
result
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.get_instance(klass_name)
|
17
|
+
DynamicFormModel.get_constant(klass_name).new
|
18
|
+
end
|
19
|
+
|
20
|
+
# handles both static and dynamic attributes
|
21
|
+
def self.save_all_attributes(dynamicObject, params, ignored_params=[])
|
22
|
+
|
23
|
+
params.each do |k,v|
|
24
|
+
unless ignored_params.include?(k.to_s) or k == '' or k == '_'
|
25
|
+
if dynamicObject.attributes.include?(k)
|
26
|
+
dynamicObject.send(k + '=', v)
|
27
|
+
else
|
28
|
+
if ['created_by','updated_by','created_at','updated_at','created_with_form_id','updated_with_form_id'].include?(k)
|
29
|
+
key = k + '='
|
30
|
+
else
|
31
|
+
key = DynamicDatum::DYNAMIC_ATTRIBUTE_PREFIX + k + '='
|
32
|
+
end
|
33
|
+
|
34
|
+
dynamicObject.data.send(key, v)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
(dynamicObject.valid? and dynamicObject.save) ? dynamicObject : nil
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>ErpForms</title>
|
5
|
+
<%= stylesheet_link_tag "erp_forms/application" %>
|
6
|
+
<%= javascript_include_tag "erp_forms/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>ErpForms</title>
|
5
|
+
<%= stylesheet_link_tag "erp_forms/application" %>
|
6
|
+
<%= javascript_include_tag "erp_forms/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|