erp_forms 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 (75) hide show
  1. data/GPL-3-LICENSE +674 -0
  2. data/README.rdoc +2 -0
  3. data/Rakefile +30 -0
  4. data/app/assets/javascripts/erp_forms/application.js +9 -0
  5. data/app/assets/stylesheets/erp_forms/application.css +7 -0
  6. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/base_controller.rb +47 -0
  7. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/data_controller.rb +87 -0
  8. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/forms_controller.rb +79 -0
  9. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/models_controller.rb +45 -0
  10. data/app/helpers/erp_forms/application_helper.rb +4 -0
  11. data/app/models/dynamic_datum.rb +65 -0
  12. data/app/models/dynamic_form.rb +191 -0
  13. data/app/models/dynamic_form_document.rb +29 -0
  14. data/app/models/dynamic_form_model.rb +42 -0
  15. data/app/views/layouts/application.html.erb +14 -0
  16. data/app/views/layouts/erp_forms/application.html.erb +14 -0
  17. data/app/widgets/dynamic_forms/base.rb +61 -0
  18. data/app/widgets/dynamic_forms/javascript/dynamic_forms.js +109 -0
  19. data/app/widgets/dynamic_forms/views/error.html.erb +4 -0
  20. data/app/widgets/dynamic_forms/views/index.html.erb +8 -0
  21. data/app/widgets/dynamic_forms/views/success.html.erb +4 -0
  22. data/config/routes.rb +6 -0
  23. data/db/data_migrations/20110608185830_create_default_dynamic_models_and_forms.rb +30 -0
  24. data/db/data_migrations/20110822170240_update_contact_form_validation.rb +22 -0
  25. data/db/data_migrations/20110828190913_create_desktop_app_dynamic_forms.rb +18 -0
  26. data/db/data_migrations/20110830170240_update_contact_form.rb +23 -0
  27. data/db/migrate/20110530193446_dynamic_forms.rb +82 -0
  28. data/lib/erp_forms/dynamic_attributes_patch.rb +10 -0
  29. data/lib/erp_forms/dynamic_form_field.rb +130 -0
  30. data/lib/erp_forms/dynamic_grid_column.rb +108 -0
  31. data/lib/erp_forms/engine.rb +22 -0
  32. data/lib/erp_forms/extensions/active_record/has_dynamic_data.rb +54 -0
  33. data/lib/erp_forms/extensions/active_record/has_dynamic_forms.rb +70 -0
  34. data/lib/erp_forms/extensions/extensions.rb +6 -0
  35. data/lib/erp_forms/extensions/railties/action_view.rb +20 -0
  36. data/lib/erp_forms/version.rb +3 -0
  37. data/lib/erp_forms.rb +11 -0
  38. data/lib/tasks/erp_forms_tasks.rake +4 -0
  39. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/center_region.js +23 -0
  40. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/dynamic_data_grid.js +81 -0
  41. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/form_builder.js +93 -0
  42. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/module.js +37 -0
  43. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/west_region.js +468 -0
  44. data/public/javascripts/erp_app/shared/dynamic_forms/dynamic_forms_validation.js +4 -0
  45. data/spec/dummy/Rakefile +7 -0
  46. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  47. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  48. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  49. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  50. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  51. data/spec/dummy/config/application.rb +45 -0
  52. data/spec/dummy/config/boot.rb +10 -0
  53. data/spec/dummy/config/database.yml +8 -0
  54. data/spec/dummy/config/environment.rb +5 -0
  55. data/spec/dummy/config/environments/spec.rb +27 -0
  56. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  57. data/spec/dummy/config/initializers/inflections.rb +10 -0
  58. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  59. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  60. data/spec/dummy/config/initializers/session_store.rb +8 -0
  61. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  62. data/spec/dummy/config/locales/en.yml +5 -0
  63. data/spec/dummy/config/routes.rb +4 -0
  64. data/spec/dummy/config.ru +4 -0
  65. data/spec/dummy/public/404.html +26 -0
  66. data/spec/dummy/public/422.html +26 -0
  67. data/spec/dummy/public/500.html +26 -0
  68. data/spec/dummy/public/favicon.ico +0 -0
  69. data/spec/dummy/script/rails +6 -0
  70. data/spec/models/dynamic_datum_spec.rb +9 -0
  71. data/spec/models/dynamic_form_document_spec.rb +11 -0
  72. data/spec/models/dynamic_form_model_spec.rb +11 -0
  73. data/spec/models/dynamic_form_spec.rb +11 -0
  74. data/spec/spec_helper.rb +60 -0
  75. metadata +183 -0
@@ -0,0 +1,61 @@
1
+ module Widgets
2
+ module DynamicForms
3
+ class Base < ErpApp::Widgets::Base
4
+ def index
5
+ render
6
+ end
7
+
8
+ def new
9
+ @website = Website.find_by_host(request.host_with_port)
10
+
11
+ @myDynamicObject = DynamicFormModel.get_instance(params[:model_name])
12
+
13
+ params[:created_by] = current_user unless current_user.nil?
14
+ params[:created_with_form_id] = params[:dynamic_form_id] if params[:dynamic_form_id] and params[:is_html_form].blank?
15
+ params[:website_id] = @website.id
16
+ @myDynamicObject = DynamicFormModel.save_all_attributes(@myDynamicObject, params, ErpApp::Widgets::Base::IGNORED_PARAMS)
17
+
18
+ if @myDynamicObject
19
+ render :json => {
20
+ :success => true,
21
+ :response => render_to_string(:template => "success", :layout => false)
22
+ }
23
+ else
24
+ render :json => {
25
+ :success => false,
26
+ :response => render_to_string(:template => "error", :layout => false)
27
+ }
28
+ end
29
+ end
30
+
31
+ #should not be modified
32
+ #modify at your own risk
33
+ def locate
34
+ File.dirname(__FILE__)
35
+ end
36
+
37
+ class << self
38
+ def title
39
+ "Dynamic Forms"
40
+ end
41
+
42
+ def views_location
43
+ File.join(File.dirname(__FILE__),"/views")
44
+ end
45
+
46
+ def widget_name
47
+ File.basename(File.dirname(__FILE__))
48
+ end
49
+
50
+ def base_layout
51
+ begin
52
+ file = File.join(File.dirname(__FILE__),"/views/layouts/base.html.erb")
53
+ IO.read(file)
54
+ rescue
55
+ return nil
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,109 @@
1
+ Compass.ErpApp.Widgets.DynamicForms = {
2
+ addDynamicForm:function(){
3
+ var addDynamicFormWidgetWindow = Ext.create("Ext.window.Window",{
4
+ layout:'fit',
5
+ width:375,
6
+ title:'Add DynamicForm Widget',
7
+ height:190,
8
+ plain: true,
9
+ buttonAlign:'center',
10
+ items: Ext.create("Ext.form.Panel",{
11
+ labelWidth: 100,
12
+ frame:false,
13
+ bodyStyle:'padding:5px 5px 0',
14
+ defaults: {
15
+ width: 325
16
+ },
17
+ items: [
18
+ {
19
+ xtype:'combo',
20
+ id:'WidgetDynamicFormModelName',
21
+ value:'',
22
+ loadingText:'Retrieving Dynamic Form Models ...',
23
+ store:Ext.create('Ext.data.Store',{
24
+ proxy:{
25
+ type:'ajax',
26
+ reader:{
27
+ type:'json',
28
+ root: 'dynamic_form_model'
29
+ },
30
+ url:'/erp_forms/erp_app/desktop/dynamic_forms/models/index'
31
+ },
32
+ fields:[
33
+ {
34
+ name:'id'
35
+ },
36
+ {
37
+ name:'model_name'
38
+
39
+ }
40
+ ]
41
+ }),
42
+ forceSelection:true,
43
+ editable:true,
44
+ fieldLabel:'Dynamic Form Model Name (Class)',
45
+ autoSelect:true,
46
+ typeAhead: true,
47
+ mode: 'remote',
48
+ displayField:'model_name',
49
+ valueField:'model_name',
50
+ triggerAction: 'all',
51
+ allowBlank:false
52
+ },
53
+ {
54
+ xtype:'textfield',
55
+ fieldLabel:'Form Width in Pixels',
56
+ allowBlank:false,
57
+ value:'410',
58
+ id:'WidgetDynamicFormWidth'
59
+ }
60
+ ]
61
+ }),
62
+ buttons: [{
63
+ text:'Submit',
64
+ listeners:{
65
+ 'click':function(button){
66
+ var tpl = null;
67
+ var content = null;
68
+ var window = button.findParentByType('window');
69
+ var formPanel = window.query('form')[0];
70
+ var basicForm = formPanel.getForm();
71
+
72
+ var WidgetDynamicFormModelName = basicForm.findField('WidgetDynamicFormModelName');
73
+ var data = {};
74
+ data.WidgetDynamicFormModelName = WidgetDynamicFormModelName.getValue();
75
+
76
+ var WidgetDynamicFormWidth = basicForm.findField('WidgetDynamicFormWidth');
77
+ data.WidgetDynamicFormWidth = WidgetDynamicFormWidth.getValue();
78
+ tpl = new Ext.XTemplate(
79
+ "<% # Optional Parameters:\n",
80
+ " # internal_identifier: Models can have multiple forms\n",
81
+ " # Leave blank if you want to use the default form\n",
82
+ " # Specify internal_identifier to choose a specific form %>\n",
83
+ "<%= render_widget :dynamic_forms,\n",
84
+ " :params => {:model_name => '{WidgetDynamicFormModelName}',\n",
85
+ " :internal_identifier => '',\n",
86
+ " :width => {WidgetDynamicFormWidth}} %>");
87
+ content = tpl.apply(data);
88
+
89
+ //add rendered template to center region editor
90
+ Ext.getCmp('knitkitCenterRegion').addContentToActiveCodeMirror(content);
91
+ addDynamicFormWidgetWindow.close();
92
+ }
93
+ }
94
+ },{
95
+ text: 'Close',
96
+ handler: function(){
97
+ addDynamicFormWidgetWindow.close();
98
+ }
99
+ }]
100
+ });
101
+ addDynamicFormWidgetWindow.show();
102
+ }
103
+ }
104
+
105
+ Compass.ErpApp.Widgets.AvailableWidgets.push({
106
+ name:'Dynamic Forms',
107
+ iconUrl:'/images/icons/document_text/document_text_48x48.png',
108
+ onClick:Compass.ErpApp.Widgets.DynamicForms.addDynamicForm
109
+ });
@@ -0,0 +1,4 @@
1
+ <div>
2
+ <h1>An Error Occurred</h1>
3
+
4
+ </div>
@@ -0,0 +1,8 @@
1
+ <div id="<%=widget_result_id %>"></div>
2
+
3
+ <%=raw render_dynamic_form(params[:model_name], {
4
+ :internal_identifier => params[:internal_identifier],
5
+ :width => (params[:width] ? params[:width].to_i : nil)
6
+ }) %>
7
+
8
+ <div id="dynamic_form_target"></div>
@@ -0,0 +1,4 @@
1
+ <div>
2
+ <h1>Thank you.</h1>
3
+ <p>Your form has been processed successfully.</p>
4
+ </div>
data/config/routes.rb ADDED
@@ -0,0 +1,6 @@
1
+ ErpForms::Engine.routes.draw do
2
+ #dynamic_forms
3
+ match '/erp_app/desktop/dynamic_forms/data/:action(/:model_name)' => 'erp_app/desktop/dynamic_forms/data'
4
+ match '/erp_app/desktop/dynamic_forms/forms/:action' => 'erp_app/desktop/dynamic_forms/forms'
5
+ match '/erp_app/desktop/dynamic_forms/models/:action' => 'erp_app/desktop/dynamic_forms/models'
6
+ end
@@ -0,0 +1,30 @@
1
+ class CreateDefaultDynamicModelsAndForms
2
+
3
+ def self.up
4
+ #insert data here
5
+ DynamicFormModel.create(:model_name => 'DynamicFormDocument')
6
+
7
+ fields = []
8
+
9
+ fields << DynamicFormField.textfield({:fieldLabel => 'First Name', :name => 'first_name', :width => 250, :allowblank => false })
10
+ fields << DynamicFormField.textfield({:fieldLabel => 'Last Name', :name => 'last_name', :width => 250, :allowblank => false })
11
+ fields << DynamicFormField.email({:fieldLabel => 'Email', :name => 'email', :width => 250, :allowblank => false })
12
+ fields << DynamicFormField.textarea({:fieldLabel => 'Message', :name => 'message', :width => 400, :height => 200, :allowblank => false })
13
+
14
+ d = DynamicForm.new
15
+ d.description = 'Contact Form'
16
+ d.definition = fields.to_json
17
+ d.model_name = 'WebsiteInquiry'
18
+ d.internal_identifier = 'contact_us'
19
+ d.default = true
20
+ d.dynamic_form_model = DynamicFormModel.create(:model_name => 'WebsiteInquiry')
21
+ d.save
22
+ end
23
+
24
+ def self.down
25
+ #remove data here
26
+ DynamicFormModel.delete_all
27
+ DynamicForm.delete_all
28
+ end
29
+
30
+ end
@@ -0,0 +1,22 @@
1
+ class UpdateContactFormValidation
2
+
3
+ def self.up
4
+ fields = []
5
+
6
+ fields << DynamicFormField.textfield({:fieldLabel => 'First Name', :name => 'first_name', :width => '200' })
7
+ fields << DynamicFormField.textfield({:fieldLabel => 'Last Name', :name => 'last_name', :width => '200' })
8
+ fields << DynamicFormField.email({:fieldLabel => 'Email', :name => 'email', :width => '200' })
9
+ fields << DynamicFormField.textarea({:fieldLabel => 'Message', :name => 'message', :width => '200' })
10
+
11
+ d = DynamicForm.find_by_internal_identifier('contact_us')
12
+ unless d.nil?
13
+ d.definition = fields.to_json
14
+ d.save
15
+ end
16
+ end
17
+
18
+ def self.down
19
+ # do nothing
20
+ end
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ class CreateDesktopAppDynamicForms
2
+ def self.up
3
+ app = DesktopApplication.create(
4
+ :description => 'Dynamic Forms',
5
+ :icon => 'icon-document',
6
+ :javascript_class_name => 'Compass.ErpApp.Desktop.Applications.DynamicForms',
7
+ :internal_identifier => 'dynamic_forms',
8
+ :shortcut_id => 'dynamic_forms-win'
9
+ )
10
+ app.preference_types << PreferenceType.iid('desktop_shortcut')
11
+ app.preference_types << PreferenceType.iid('autoload_application')
12
+ app.save #probably redundant
13
+ end
14
+
15
+ def self.down
16
+ DesktopApplication.destroy_all(['internal_identifier = ?','dynamic_forms'])
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ class UpdateContactForm
2
+
3
+ def self.up
4
+ fields = []
5
+
6
+ fields << DynamicFormField.textfield({:fieldLabel => 'First Name', :name => 'first_name', :width => 250, :allowblank => false })
7
+ fields << DynamicFormField.textfield({:fieldLabel => 'Last Name', :name => 'last_name', :width => 250, :allowblank => false })
8
+ fields << DynamicFormField.email({:fieldLabel => 'Email', :name => 'email', :width => 250, :allowblank => false })
9
+ fields << DynamicFormField.textarea({:fieldLabel => 'Message', :name => 'message', :width => 400, :height => 200, :allowblank => false })
10
+
11
+ d = DynamicForm.find_by_internal_identifier('contact_us')
12
+ unless d.nil?
13
+ puts "updating form"
14
+ d.definition = fields.to_json
15
+ d.save
16
+ end
17
+ end
18
+
19
+ def self.down
20
+ # do nothing
21
+ end
22
+
23
+ end
@@ -0,0 +1,82 @@
1
+ class DynamicForms < ActiveRecord::Migration
2
+ def self.up
3
+ unless table_exists?(:dynamic_form_models)
4
+ create_table :dynamic_form_models do |t|
5
+ t.string :model_name
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ unless table_exists?(:dynamic_form_documents)
12
+ create_table :dynamic_form_documents do |t|
13
+ t.integer :dynamic_form_model_id
14
+ t.string :type
15
+
16
+ t.timestamps
17
+ end
18
+
19
+ add_index :dynamic_form_documents, :dynamic_form_model_id
20
+ add_index :dynamic_form_documents, :type
21
+ end
22
+
23
+ unless table_exists?(:dynamic_forms)
24
+ create_table :dynamic_forms do |t|
25
+ t.string :description
26
+ t.text :definition
27
+ t.integer :dynamic_form_model_id
28
+ t.string :model_name
29
+ t.string :internal_identifier
30
+ t.boolean :default
31
+
32
+ t.integer :created_by_id
33
+ t.integer :updated_by_id
34
+
35
+ t.timestamps
36
+ end
37
+
38
+ add_index :dynamic_forms, :created_by_id
39
+ add_index :dynamic_forms, :updated_by_id
40
+ add_index :dynamic_forms, :dynamic_form_model_id
41
+ add_index :dynamic_forms, :model_name
42
+ add_index :dynamic_forms, :internal_identifier
43
+ end
44
+
45
+ unless table_exists?(:dynamic_data)
46
+ create_table :dynamic_data do |t|
47
+ t.string :reference_type
48
+ t.integer :reference_id
49
+ t.text :dynamic_attributes
50
+
51
+ t.integer :created_with_form_id
52
+ t.integer :updated_with_form_id
53
+
54
+ t.integer :created_by_id
55
+ t.integer :updated_by_id
56
+
57
+ t.timestamps
58
+ end
59
+
60
+ add_index :dynamic_data, :created_with_form_id
61
+ add_index :dynamic_data, :updated_with_form_id
62
+ add_index :dynamic_data, :created_by_id
63
+ add_index :dynamic_data, :updated_by_id
64
+ add_index :dynamic_data, :reference_type
65
+ add_index :dynamic_data, :reference_id
66
+ end
67
+
68
+ end
69
+
70
+ def self.down
71
+ [ :dynamic_form_models,
72
+ :dynamic_form_documents,
73
+ :dynamic_forms,
74
+ :dynamic_data
75
+ ].each do |tbl|
76
+ if table_exists?(tbl)
77
+ drop_table tbl
78
+ end
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,10 @@
1
+
2
+ DynamicAttributes.module_eval do
3
+ # Overrides the initializer to take dynamic attributes into account
4
+ def initialize(attributes = nil, options = {})
5
+ dynamic_attributes = {}
6
+ (attributes ||= {}).each{|att,value| dynamic_attributes[att] = value if att.to_s.starts_with?(self.dynamic_attribute_prefix) }
7
+ super(attributes.except(*dynamic_attributes.keys), options)
8
+ set_dynamic_attributes(dynamic_attributes)
9
+ end
10
+ end
@@ -0,0 +1,130 @@
1
+ class DynamicFormField
2
+ =begin
3
+ Field Options TODO
4
+ searchable
5
+
6
+ Field Types TODO
7
+ special:
8
+ password
9
+ file upload
10
+
11
+ complex (for future implementation):
12
+ concatenated
13
+ calculated
14
+ related
15
+ =end
16
+
17
+ # options = {
18
+ # :fieldLabel => Field label text string
19
+ # :name => Field variable name string
20
+ # :allowblank => required true or false
21
+ # :value => prepopulated default value string
22
+ # :readonly => disabled true or false
23
+ # :maxlength => maxLength integer
24
+ # :width => size integer
25
+ # :validation_regex => regex string
26
+ # }
27
+
28
+ ##################
29
+ # SPECIAL FIELDS #
30
+ ##################
31
+ def self.email(options={})
32
+ options[:validation_regex] = "^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$"
33
+ DynamicFormField.basic_field('textfield', options)
34
+ end
35
+
36
+ def self.numberfield(options={})
37
+ DynamicFormField.basic_field('numberfield', options)
38
+ end
39
+
40
+ def self.datefield(options={})
41
+ DynamicFormField.basic_field('datefield', options)
42
+ end
43
+
44
+ def self.timefield(options={})
45
+ DynamicFormField.basic_field('timefield', options)
46
+ end
47
+
48
+ def self.yesno(selections=[], options={})
49
+ selections = [['yes', 'Yes'],['no', 'No']]
50
+ DynamicFormField.basic_field('combo', options, selections)
51
+ end
52
+
53
+ ################
54
+ # BASIC FIELDS #
55
+ ################
56
+ # selections is an array of tuples, i.e. [['AL', 'Alabama'],['AK', 'Alaska']] - [value, text]
57
+ def self.combobox(selections=[], options={})
58
+ DynamicFormField.basic_field('combo', options, selections)
59
+ end
60
+
61
+ def self.textfield(options={})
62
+ DynamicFormField.basic_field('textfield', options)
63
+ end
64
+
65
+ def self.textarea(options={})
66
+ options[:height] = 100 if options[:height].nil?
67
+ DynamicFormField.basic_field('textarea', options)
68
+ end
69
+
70
+ def self.checkbox(options={})
71
+ DynamicFormField.basic_field('checkbox', options)
72
+ end
73
+
74
+ def self.hidden(options={})
75
+ DynamicFormField.basic_field('hidden', options)
76
+ end
77
+
78
+ def self.basic_field(xtype, options={}, selections=[])
79
+ options = DynamicFormField.set_default_field_options(options)
80
+
81
+ field = {
82
+ :xtype => xtype,
83
+ :fieldLabel => options[:fieldLabel],
84
+ :name => options[:name],
85
+ :value => options[:value],
86
+ :allowBlank => options[:allowblank],
87
+ :readOnly => options[:readonly],
88
+ :width =>options[:width],
89
+ :height => options[:height],
90
+ :labelWidth => options[:labelwidth]
91
+ }
92
+
93
+ field[:maxLength] = options[:maxlength] unless options[:maxlength].nil?
94
+
95
+ if selections and selections != []
96
+ field[:store] = selections.to_json
97
+ end
98
+
99
+ if options[:validation_regex] or options[:validator_function]
100
+ field[:validateOnBlur] = true
101
+ end
102
+
103
+ if options[:validation_regex] and options[:validation_regex] != ''
104
+ field[:validation_regex] = options[:validation_regex]
105
+ end
106
+
107
+ if options[:validator_function] and options[:validator_function] != ''
108
+ field[:validator_function] = options[:validator_function]
109
+ end
110
+
111
+ field
112
+ end
113
+
114
+ def self.set_default_field_options(options={})
115
+
116
+ options[:fieldLabel] = '' if options[:fieldLabel].nil?
117
+ options[:name] = '' if options[:name].nil?
118
+ options[:allowblank] = true if options[:allowblank].nil?
119
+ options[:value] = '' if options[:value].nil?
120
+ options[:readonly] = false if options[:readonly].nil?
121
+ options[:maxlength] = nil if options[:maxlength].nil?
122
+ options[:width] = 200 if options[:width].nil?
123
+ options[:height] = nil if options[:height].nil?
124
+ options[:validation_regex] = '' if options[:validation_regex].nil?
125
+ options[:labelwidth] = 75 if options[:labelwidth].nil?
126
+
127
+ options
128
+ end
129
+
130
+ end
@@ -0,0 +1,108 @@
1
+ class DynamicGridColumn
2
+
3
+ def self.build_column(field_hash, options={})
4
+ field_hash.symbolize_keys!
5
+ header = field_hash[:fieldLabel]
6
+ type = DynamicGridColumn.convert_xtype_to_column_type(field_hash[:xtype])
7
+ data_index = field_hash[:name]
8
+
9
+ if type == 'date'
10
+ renderer = "Ext.util.Format.dateRenderer('m/d/Y')"
11
+ else
12
+ renderer = ''
13
+ end
14
+
15
+ col = "{
16
+ \"header\":\"#{header}\",
17
+ \"type\":\"#{type}\",
18
+ \"dataIndex\":\"#{data_index}\""
19
+
20
+ if options[:width]
21
+ col << ",\"width\":#{options[:width]}"
22
+ end
23
+
24
+ col += ",
25
+ \"renderer\": #{renderer}" if renderer != ''
26
+
27
+ if options[:editor]
28
+ readonly = field_hash[:readonly].blank? ? false : field_hash[:readonly]
29
+ col += ",
30
+ {
31
+ \"xtype\": \"#{field_hash[:xtype]}\",
32
+ \"readOnly\": \"#{readonly}\""
33
+
34
+ if field_hash[:validation_regex] and field_hash[:validation_regex] != ''
35
+ col += ",
36
+ \"validateOnBlur\": true,
37
+ \"validator\": function(v){
38
+ var pattern = /#{field_hash[:validation_regex]}/;
39
+ var regex = new RegExp(pattern);
40
+ return regex.test(v);
41
+ }"
42
+ end
43
+ col += "}"
44
+ end
45
+
46
+ col += "}"
47
+
48
+ col
49
+ end
50
+
51
+ def self.build_delete_column(action='')
52
+ action = "var messageBox = Ext.MessageBox.confirm(
53
+ 'Confirm', 'Are you sure?',
54
+ function(btn){
55
+ if (btn == 'yes'){
56
+ #{action}
57
+ }
58
+ });"
59
+ DynamicGridColumn.build_action_column("Delete", "/images/icons/delete/delete_16x16.png", action)
60
+ end
61
+
62
+ def self.build_view_column(action='')
63
+ DynamicGridColumn.build_action_column("View", "/images/icons/document_view/document_view_16x16.png", action)
64
+ end
65
+
66
+ def self.build_edit_column(action='')
67
+ DynamicGridColumn.build_action_column("Edit", "/images/icons/document_edit/document_edit_16x16.png", action)
68
+ end
69
+
70
+ def self.build_action_column(header, icon, action)
71
+ col = '{
72
+ "menuDisabled":true,
73
+ "resizable":false,
74
+ "xtype":"actioncolumn",
75
+ "header":"'+header+'",
76
+ "align":"center",
77
+ "width":50,
78
+ "items":[{
79
+ "icon":"'+icon+'",
80
+ "tooltip":"'+header+'",
81
+ "handler" :function(grid, rowIndex, colIndex){
82
+ var rec = grid.getStore().getAt(rowIndex);
83
+ '+action+'
84
+ }
85
+ }]
86
+ }'
87
+
88
+ col
89
+ end
90
+
91
+ def self.convert_xtype_to_column_type(xtype)
92
+ case xtype
93
+ when 'textfield'
94
+ return 'string'
95
+ when 'datefield'
96
+ return 'date'
97
+ when 'textarea'
98
+ return 'string'
99
+ when 'numberfield'
100
+ return 'number'
101
+ when 'actioncolumn'
102
+ return 'actioncolumn'
103
+ else
104
+ return 'string'
105
+ end
106
+ end
107
+
108
+ end
@@ -0,0 +1,22 @@
1
+ require 'dynamic_attributes'
2
+
3
+ module ErpForms
4
+ class Engine < Rails::Engine
5
+ isolate_namespace ErpForms
6
+
7
+ initializer "erp_forms.merge_public" do |app|
8
+ app.middleware.insert_before Rack::Lock, ::ActionDispatch::Static, "#{root}/public"
9
+ end
10
+
11
+ ActiveSupport.on_load(:active_record) do
12
+ include ErpForms::Extensions::ActiveRecord::HasDynamicData
13
+ include ErpForms::Extensions::ActiveRecord::HasDynamicForms
14
+ end
15
+
16
+ config.to_prepare do
17
+ #dynamic_attributes patch
18
+ require "erp_forms/dynamic_attributes_patch"
19
+ end
20
+
21
+ end
22
+ end