erp_forms 2.0.2 → 2.0.3
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.
- data/README.rdoc +8 -3
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/comments_controller.rb +16 -0
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/data_controller.rb +45 -8
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/forms_controller.rb +14 -5
- data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/models_controller.rb +2 -2
- data/app/models/dynamic_datum.rb +31 -21
- data/app/models/dynamic_form.rb +42 -35
- data/app/models/ticket.rb +16 -0
- data/config/routes.rb +1 -0
- data/db/data_migrations/20110608185830_create_default_dynamic_models_and_forms.rb +4 -4
- data/db/data_migrations/20120824013449_create_ticket_form.rb +65 -0
- data/db/data_migrations/{20110830170240_update_contact_form.rb → 20120904191738_update_contact_form.rb} +5 -6
- data/db/migrate/20120824012520_create_tickets.rb +18 -0
- data/lib/erp_forms/dynamic_form_field.rb +93 -20
- data/lib/erp_forms/dynamic_grid_column.rb +7 -5
- data/lib/erp_forms/engine.rb +1 -0
- data/lib/erp_forms/extensions/active_record/has_dynamic_forms.rb +5 -5
- data/lib/erp_forms/extensions/railties/action_view.rb +6 -3
- data/lib/erp_forms/version.rb +1 -1
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/dynamic_data_grid.js +165 -13
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/module.js +1 -2
- data/public/javascripts/erp_app/desktop/applications/dynamic_forms/west_region.js +26 -13
- data/public/javascripts/erp_app/shared/dynamic_forms/dynamic_form_fields.js +37 -0
- data/public/stylesheets/erp_app/desktop/applications/dynamic_forms/comments.css +15 -0
- metadata +16 -11
- data/db/data_migrations/20110822170240_update_contact_form_validation.rb +0 -22
data/README.rdoc
CHANGED
@@ -74,13 +74,18 @@ Adding dynamic forms and data to an existing model
|
|
74
74
|
|
75
75
|
Using the Knitkit DynamicForms widget
|
76
76
|
Edit Section Layout, click Dynamic Forms widget icon and the following will be added to the layout:
|
77
|
-
<%= render_widget :dynamic_forms, :params => {:model_name => 'MyDynamicModel', :width => '350'} %>
|
77
|
+
<%=raw render_widget :dynamic_forms, :params => {:model_name => 'MyDynamicModel', :width => '350'} %>
|
78
78
|
|
79
79
|
|
80
80
|
== TODO
|
81
81
|
|
82
|
-
Dynamic
|
83
|
-
|
82
|
+
Dynamic Form Builder
|
83
|
+
Search Dynamic Attributes via SOLR
|
84
|
+
Code Mirror form field
|
85
|
+
file attachments w/ has_file_assets and plupload
|
86
|
+
concatenated field
|
87
|
+
calculated field
|
88
|
+
related field with search ahead for relations with huge datasets
|
84
89
|
|
85
90
|
============================================================
|
86
91
|
Copyright (c) 2011 Adam Hull
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ErpForms::ErpApp::Desktop::DynamicForms
|
2
|
+
class CommentsController < ErpForms::ErpApp::Desktop::DynamicForms::BaseController
|
3
|
+
|
4
|
+
def add
|
5
|
+
@myDynamicObject = DynamicFormModel.get_constant(params[:model_name]).find(params[:id])
|
6
|
+
@comment = @myDynamicObject.add_comment({
|
7
|
+
:commentor_name => current_user.party.description,
|
8
|
+
:email => current_user.email,
|
9
|
+
:comment => params[:comment]
|
10
|
+
})
|
11
|
+
|
12
|
+
render :json => (@comment.valid? ? {:success => true} : {:success => false})
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
module ErpForms::ErpApp::Desktop::DynamicForms
|
2
|
+
class DataController < ErpForms::ErpApp::Desktop::DynamicForms::BaseController
|
3
|
+
@@datetime_format = "%m/%d/%Y %l:%M%P"
|
2
4
|
|
3
5
|
# setup dynamic data grid
|
4
6
|
def setup
|
@@ -7,22 +9,26 @@ class ErpForms::ErpApp::Desktop::DynamicForms::DataController < ErpForms::ErpApp
|
|
7
9
|
|
8
10
|
columns = []
|
9
11
|
definition.each do |field_hash|
|
10
|
-
field_hash[:
|
11
|
-
|
12
|
+
if field_hash[:display_in_grid]
|
13
|
+
field_hash[:width] = (field_hash[:width].to_f * 0.56).round.to_i # for some reason grid column widths are greater than form field widths
|
14
|
+
columns << DynamicGridColumn.build_column(field_hash)
|
15
|
+
end
|
12
16
|
end
|
13
17
|
|
14
18
|
columns << DynamicGridColumn.build_column({ :fieldLabel => "Updated By", :name => 'updated_username', :xtype => 'textfield' })
|
15
19
|
columns << DynamicGridColumn.build_column({ :fieldLabel => "Created By", :name => 'created_username', :xtype => 'textfield' })
|
16
20
|
columns << DynamicGridColumn.build_column({ :fieldLabel => "Created At", :name => 'created_at', :xtype => 'datefield', :width => 75 })
|
17
21
|
columns << DynamicGridColumn.build_column({ :fieldLabel => "Updated At", :name => 'updated_at', :xtype => 'datefield', :width => 75 })
|
18
|
-
columns << DynamicGridColumn.build_edit_column("Ext.getCmp('
|
19
|
-
columns << DynamicGridColumn.build_delete_column("Ext.getCmp('
|
22
|
+
columns << DynamicGridColumn.build_edit_column("Ext.getCmp('#{params[:model_name]}').editRecord(rec,'#{params[:model_name]}');")
|
23
|
+
columns << DynamicGridColumn.build_delete_column("Ext.getCmp('#{params[:model_name]}').deleteRecord(rec,'#{params[:model_name]}');")
|
20
24
|
|
21
25
|
definition << DynamicFormField.textfield({ :fieldLabel => "Updated By", :name => 'updated_username' })
|
22
26
|
definition << DynamicFormField.textfield({ :fieldLabel => "Created By", :name => 'created_username' })
|
23
27
|
definition << DynamicFormField.datefield({ :fieldLabel => "Created At", :name => 'created_at' })
|
24
28
|
definition << DynamicFormField.datefield({ :fieldLabel => "Updated At", :name => 'updated_at' })
|
25
29
|
definition << DynamicFormField.hidden({ :fieldLabel => "ID", :name => 'id' })
|
30
|
+
definition << DynamicFormField.hidden({ :fieldLabel => "Form ID", :name => 'form_id' })
|
31
|
+
definition << DynamicFormField.hidden({ :fieldLabel => "Model Name", :name => 'model_name' })
|
26
32
|
|
27
33
|
render :inline => "{
|
28
34
|
\"success\": true,
|
@@ -39,26 +45,56 @@ class ErpForms::ErpApp::Desktop::DynamicForms::DataController < ErpForms::ErpApp
|
|
39
45
|
myDynamicObject = DynamicFormModel.get_constant(params[:model_name])
|
40
46
|
|
41
47
|
dynamic_records = myDynamicObject.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
|
48
|
+
related_fields = dynamic_records.first.form.related_fields rescue []
|
42
49
|
|
43
50
|
wi = []
|
44
51
|
dynamic_records.each do |i|
|
45
|
-
wihash = i.data.
|
46
|
-
# puts i.data.created_by.inspect
|
52
|
+
wihash = i.data.dynamic_attributes_with_related_data(related_fields, false)
|
47
53
|
wihash[:id] = i.id
|
48
54
|
wihash[:created_username] = i.data.created_by.nil? ? '' : i.data.created_by.username
|
49
55
|
wihash[:updated_username] = i.data.updated_by.nil? ? '' : i.data.updated_by.username
|
50
56
|
wihash[:created_at] = i.data.created_at
|
51
57
|
wihash[:updated_at] = i.data.updated_at
|
58
|
+
wihash[:form_id] = (i.data.updated_with_form_id ? i.data.updated_with_form_id : i.data.created_with_form_id)
|
59
|
+
wihash[:model_name] = params[:model_name]
|
52
60
|
wi << wihash
|
53
61
|
end
|
54
62
|
|
55
63
|
render :inline => "{ total:#{dynamic_records.total_entries}, data:#{wi.to_json} }"
|
56
64
|
end
|
57
65
|
|
66
|
+
def get
|
67
|
+
myDynamicObject = DynamicFormModel.get_constant(params[:model_name])
|
68
|
+
@record = myDynamicObject.find(params[:id])
|
69
|
+
|
70
|
+
related_fields = @record.form.related_fields
|
71
|
+
data = @record.data.dynamic_attributes_with_related_data(related_fields, true)
|
72
|
+
|
73
|
+
metadata = {
|
74
|
+
:created_username => (@record.data.created_by.nil? ? '' : @record.data.created_by.username),
|
75
|
+
:updated_username => (@record.data.updated_by.nil? ? '' : @record.data.updated_by.username),
|
76
|
+
:created_at => @record.data.created_at.getlocal.strftime(@@datetime_format),
|
77
|
+
:updated_at => @record.data.updated_at.getlocal.strftime(@@datetime_format)
|
78
|
+
}
|
79
|
+
|
80
|
+
result_hash = {:success => true, :data => data, :metadata => metadata}
|
81
|
+
|
82
|
+
if @record.respond_to?(:comments)
|
83
|
+
result_hash[:comments] = @record.comments.order('id ASC').all
|
84
|
+
result_hash[:comments].each_with_index do |c, i|
|
85
|
+
result_hash[:comments][i] = c.to_hash
|
86
|
+
result_hash[:comments][i][:created_at] = c.created_at.getlocal.strftime(@@datetime_format)
|
87
|
+
result_hash[:comments][i][:updated_at] = c.updated_at.getlocal.strftime(@@datetime_format)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
render :json => @record ? result_hash : {:success => false}
|
92
|
+
end
|
93
|
+
|
58
94
|
# create a dynamic data record
|
59
95
|
def create
|
60
96
|
@myDynamicObject = DynamicFormModel.get_instance(params[:model_name])
|
61
|
-
|
97
|
+
|
62
98
|
params[:created_by] = current_user unless current_user.nil?
|
63
99
|
params[:created_with_form_id] = params[:dynamic_form_id] if params[:dynamic_form_id]
|
64
100
|
@myDynamicObject = DynamicFormModel.save_all_attributes(@myDynamicObject, params, ErpForms::ErpApp::Desktop::DynamicForms::BaseController::IGNORED_PARAMS)
|
@@ -84,4 +120,5 @@ class ErpForms::ErpApp::Desktop::DynamicForms::DataController < ErpForms::ErpApp
|
|
84
120
|
render :json => {:success => true}
|
85
121
|
end
|
86
122
|
|
123
|
+
end
|
87
124
|
end
|
@@ -53,20 +53,29 @@ class ErpForms::ErpApp::Desktop::DynamicForms::FormsController < ErpForms::ErpAp
|
|
53
53
|
|
54
54
|
# get a single form
|
55
55
|
def get
|
56
|
-
if params[:id]
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
dform = DynamicForm.find_by_id(params[:id]) if params[:id]
|
57
|
+
dform = DynamicForm.get_form(params[:model_name]) if dform.nil? and params[:model_name]
|
58
|
+
|
59
|
+
if dform.nil?
|
60
|
+
render :json => {:success => false, :error => "Don't know how to find form"} and return
|
60
61
|
end
|
61
62
|
|
62
63
|
form = dform.to_extjs_formpanel(
|
63
64
|
{ :url => "/erp_forms/erp_app/desktop/dynamic_forms/data/#{params[:form_action]}",
|
64
|
-
:record_id => params[:
|
65
|
+
:record_id => params[:record_id]
|
65
66
|
})
|
66
67
|
|
67
68
|
render :json => form
|
68
69
|
end
|
69
70
|
|
71
|
+
# get related data for a related field
|
72
|
+
def related_field
|
73
|
+
related_model = params[:model].camelize.constantize
|
74
|
+
data = related_model.all
|
75
|
+
|
76
|
+
render :inline => data.to_json(:only => [:id, params[:displayField].to_sym])
|
77
|
+
end
|
78
|
+
|
70
79
|
# delete dynamic form
|
71
80
|
def delete
|
72
81
|
|
@@ -8,7 +8,7 @@ class ErpForms::ErpApp::Desktop::DynamicForms::ModelsController < ErpForms::ErpA
|
|
8
8
|
dynamic_form_models.each do |m|
|
9
9
|
model_hash = {
|
10
10
|
:id => m.id,
|
11
|
-
:model_name => m.model_name
|
11
|
+
:model_name => m.model_name
|
12
12
|
}
|
13
13
|
|
14
14
|
models << model_hash
|
@@ -22,7 +22,7 @@ class ErpForms::ErpApp::Desktop::DynamicForms::ModelsController < ErpForms::ErpA
|
|
22
22
|
myDynamicObject = DynamicFormModel.get_constant(params[:model_name])
|
23
23
|
myDynamicObject.set_default(params[:id])
|
24
24
|
|
25
|
-
render :json => {success => true}
|
25
|
+
render :json => {:success => true}
|
26
26
|
end
|
27
27
|
|
28
28
|
# delete a dynamic form model
|
data/app/models/dynamic_datum.rb
CHANGED
@@ -18,37 +18,48 @@ class DynamicDatum < ActiveRecord::Base
|
|
18
18
|
attrs
|
19
19
|
end
|
20
20
|
|
21
|
-
=
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
form = self.created_with_form
|
31
|
-
else
|
32
|
-
form = nil
|
21
|
+
def dynamic_attributes_with_related_data(related_fields=[], use_label=false)
|
22
|
+
key = (use_label ? :fieldLabel : :name)
|
23
|
+
data = sorted_dynamic_attributes(false, use_label)
|
24
|
+
related_fields.each do |r|
|
25
|
+
data.each do |k,v|
|
26
|
+
if k == r[key]
|
27
|
+
data[k] = r[:extraParams]['model'].camelize.constantize.find(v).send(r[:displayField]) rescue nil
|
28
|
+
end
|
29
|
+
end
|
33
30
|
end
|
31
|
+
|
32
|
+
data
|
33
|
+
end
|
34
|
+
|
35
|
+
# we cannot assume that dynamic attributes are stored in order in the database as this is often not the case
|
36
|
+
# this method will sort them according to the order of the fields in the form definition
|
37
|
+
# method returns an ordered hash
|
38
|
+
# if with_prefix is false, you may choose to use the fieldLabel as the hash key, this is useful displaying data on a view screen
|
39
|
+
def sorted_dynamic_attributes(with_prefix=false, use_label=false)
|
40
|
+
form = self.updated_with_form if form.nil? and !self.updated_with_form.nil?
|
41
|
+
form = self.created_with_form if form.nil? and !self.created_with_form.nil?
|
42
|
+
form = DynamicForm.get_form(self.reference_type) if form.nil?
|
34
43
|
|
35
44
|
unless form.nil?
|
36
45
|
if with_prefix
|
37
46
|
keys = form.definition_object.collect{|f| DYNAMIC_ATTRIBUTE_PREFIX + f[:name]}
|
38
|
-
else
|
47
|
+
else
|
48
|
+
labels = form.definition_object.collect{|f| f[:fieldLabel]} if use_label
|
39
49
|
keys = form.definition_object.collect{|f| f[:name]}
|
40
50
|
end
|
41
51
|
|
42
|
-
sorted =
|
52
|
+
sorted = {}
|
53
|
+
i=0
|
43
54
|
keys.each do |key|
|
44
|
-
attribute = {}
|
45
55
|
if with_prefix
|
46
|
-
|
56
|
+
sorted[key] = self.dynamic_attributes[key]
|
47
57
|
else
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
58
|
+
index = (use_label ? labels[i] : key)
|
59
|
+
sorted[index] = self.dynamic_attributes_without_prefix[key]
|
60
|
+
end
|
61
|
+
|
62
|
+
i += 1
|
52
63
|
end
|
53
64
|
|
54
65
|
return sorted
|
@@ -60,6 +71,5 @@ class DynamicDatum < ActiveRecord::Base
|
|
60
71
|
end
|
61
72
|
end
|
62
73
|
end
|
63
|
-
=end
|
64
74
|
|
65
75
|
end
|
data/app/models/dynamic_form.rb
CHANGED
@@ -4,24 +4,24 @@ class DynamicForm < ActiveRecord::Base
|
|
4
4
|
validates_uniqueness_of :internal_identifier, :scope => :model_name
|
5
5
|
|
6
6
|
def self.class_exists?(class_name)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
15
|
end
|
16
16
|
|
17
17
|
def self.get_form(klass_name, internal_identifier='')
|
18
18
|
result = nil
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
unless internal_identifier.blank?
|
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
25
|
end
|
26
26
|
|
27
27
|
# parse JSON definition into a ruby object
|
@@ -49,11 +49,21 @@ class DynamicForm < ActiveRecord::Base
|
|
49
49
|
def_object
|
50
50
|
end
|
51
51
|
|
52
|
+
# will return an array of field names that are of xtype 'related_combobox'
|
53
|
+
def related_fields
|
54
|
+
related_fields = []
|
55
|
+
definition_object.each do |f|
|
56
|
+
related_fields << f if f[:xtype] == 'related_combobox'
|
57
|
+
end
|
58
|
+
|
59
|
+
related_fields
|
60
|
+
end
|
61
|
+
|
52
62
|
# check field against form definition to see if field still exists
|
53
63
|
# returns true if field does not exist
|
54
64
|
def deprecated_field?(field_name)
|
55
65
|
result = true
|
56
|
-
|
66
|
+
definition_object.each do |field|
|
57
67
|
result = false if field[:name] == field_name.to_s
|
58
68
|
end
|
59
69
|
|
@@ -67,7 +77,7 @@ class DynamicForm < ActiveRecord::Base
|
|
67
77
|
def to_extjs_formpanel(options={})
|
68
78
|
form_hash = {
|
69
79
|
:xtype => 'form',
|
70
|
-
:id =>
|
80
|
+
:id => "dynamic_form_panel_#{model_name}",
|
71
81
|
:url => options[:url],
|
72
82
|
:title => self.description,
|
73
83
|
:frame => true,
|
@@ -80,20 +90,23 @@ class DynamicForm < ActiveRecord::Base
|
|
80
90
|
form_hash[:baseParams][:dynamic_form_id] = self.id
|
81
91
|
form_hash[:baseParams][:dynamic_form_model_id] = self.dynamic_form_model_id
|
82
92
|
form_hash[:baseParams][:model_name] = self.model_name
|
83
|
-
form_hash[:listeners] = {
|
93
|
+
form_hash[:listeners] = {
|
94
|
+
:afterrender => NonEscapeJsonString.new("function(form) {Ext.getCmp('dynamic_form_panel_#{model_name}').getComponent(0).focus(false);}")
|
95
|
+
}
|
84
96
|
form_hash[:items] = definition_with_validation
|
85
97
|
form_hash[:buttons] = []
|
86
98
|
form_hash[:buttons][0] = {
|
87
99
|
:text => 'Submit',
|
88
100
|
:listeners => NonEscapeJsonString.new("{
|
89
101
|
\"click\":function(button){
|
90
|
-
var formPanel = Ext.getCmp('
|
102
|
+
var formPanel = Ext.getCmp('dynamic_form_panel_#{model_name}');
|
91
103
|
formPanel.getForm().submit({
|
92
104
|
reset:true,
|
93
105
|
success:function(form, action){
|
94
|
-
Ext.getCmp('
|
95
|
-
|
96
|
-
|
106
|
+
Ext.getCmp('dynamic_form_panel_#{model_name}').findParentByType('window').close();
|
107
|
+
|
108
|
+
if (Ext.getCmp('#{model_name}')){
|
109
|
+
Ext.getCmp('#{model_name}').query('shared_dynamiceditablegrid')[0].store.load();
|
97
110
|
}
|
98
111
|
},
|
99
112
|
failure:function(form, action){
|
@@ -107,7 +120,7 @@ class DynamicForm < ActiveRecord::Base
|
|
107
120
|
:text => 'Cancel',
|
108
121
|
:listeners => NonEscapeJsonString.new("{
|
109
122
|
\"click\":function(button){
|
110
|
-
Ext.getCmp('
|
123
|
+
Ext.getCmp('dynamic_form_panel_#{model_name}').findParentByType('window').close();
|
111
124
|
}
|
112
125
|
}")
|
113
126
|
}
|
@@ -126,12 +139,10 @@ class DynamicForm < ActiveRecord::Base
|
|
126
139
|
options[:width] = "'auto'" if options[:width].nil?
|
127
140
|
|
128
141
|
#NOTE: The random nbsp; forces IE to eval this javascript!
|
129
|
-
javascript = "
|
130
|
-
Ext.onReady(function(){
|
131
|
-
Ext.QuickTips.init();
|
142
|
+
javascript = "Ext.QuickTips.init();
|
132
143
|
|
133
|
-
|
134
|
-
id: '
|
144
|
+
Ext.create('Ext.form.Panel',{
|
145
|
+
id: 'dynamic_form_panel_#{model_name}',
|
135
146
|
url:'#{options[:url]}',
|
136
147
|
title: '#{self.description}',"
|
137
148
|
|
@@ -145,18 +156,17 @@ class DynamicForm < ActiveRecord::Base
|
|
145
156
|
dynamic_form_model_id: #{self.dynamic_form_model_id},
|
146
157
|
model_name: '#{self.model_name}'
|
147
158
|
},
|
148
|
-
items: #{definition_with_validation},
|
159
|
+
items: #{definition_with_validation.to_json},
|
149
160
|
listeners: {
|
150
161
|
afterrender: function(form) {
|
151
|
-
Ext.getCmp('
|
162
|
+
Ext.getCmp('dynamic_form_panel_#{model_name}').getComponent(0).focus(false);
|
152
163
|
}
|
153
164
|
},
|
154
165
|
buttons: [{
|
155
166
|
text: 'Submit',
|
156
167
|
listeners:{
|
157
168
|
'click':function(button){
|
158
|
-
|
159
|
-
var formPanel = Ext.getCmp('dynamic_form_panel');
|
169
|
+
var formPanel = Ext.getCmp('dynamic_form_panel_#{model_name}');
|
160
170
|
formPanel.getForm().submit({
|
161
171
|
reset:true,
|
162
172
|
success:function(form, action){
|
@@ -180,10 +190,7 @@ class DynamicForm < ActiveRecord::Base
|
|
180
190
|
},{
|
181
191
|
text: 'Cancel'
|
182
192
|
}]
|
183
|
-
});
|
184
|
-
});
|
185
|
-
|
186
|
-
</script>"
|
193
|
+
});"
|
187
194
|
#logger.info javascript
|
188
195
|
javascript
|
189
196
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Ticket < ActiveRecord::Base
|
2
|
+
belongs_to :user, :foreign_key => 'assigned_to_id'
|
3
|
+
|
4
|
+
has_dynamic_forms
|
5
|
+
has_dynamic_data
|
6
|
+
acts_as_commentable
|
7
|
+
|
8
|
+
def send_email(subject='')
|
9
|
+
begin
|
10
|
+
WebsiteInquiryMailer.inquiry(self, subject).deliver
|
11
|
+
rescue Exception => e
|
12
|
+
system_user = Party.find_by_description('Compass AE')
|
13
|
+
AuditLog.custom_application_log_message(system_user, e)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/config/routes.rb
CHANGED
@@ -3,4 +3,5 @@ ErpForms::Engine.routes.draw do
|
|
3
3
|
match '/erp_app/desktop/dynamic_forms/data/:action(/:model_name)' => 'erp_app/desktop/dynamic_forms/data'
|
4
4
|
match '/erp_app/desktop/dynamic_forms/forms/:action' => 'erp_app/desktop/dynamic_forms/forms'
|
5
5
|
match '/erp_app/desktop/dynamic_forms/models/:action' => 'erp_app/desktop/dynamic_forms/models'
|
6
|
+
match '/erp_app/desktop/dynamic_forms/comments/:action' => 'erp_app/desktop/dynamic_forms/comments'
|
6
7
|
end
|
@@ -6,10 +6,10 @@ class CreateDefaultDynamicModelsAndForms
|
|
6
6
|
|
7
7
|
fields = []
|
8
8
|
|
9
|
-
fields << DynamicFormField.textfield({:fieldLabel => 'First Name', :name => 'first_name', :width => 250, :
|
10
|
-
fields << DynamicFormField.textfield({:fieldLabel => 'Last Name', :name => 'last_name', :width => 250, :
|
11
|
-
fields << DynamicFormField.email({:fieldLabel => 'Email', :name => 'email', :width => 250, :
|
12
|
-
fields << DynamicFormField.textarea({:fieldLabel => 'Message', :name => 'message', :width => 400, :height => 200, :
|
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
13
|
|
14
14
|
d = DynamicForm.new
|
15
15
|
d.description = 'Contact Form'
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class CreateTicketForm
|
2
|
+
|
3
|
+
def self.up
|
4
|
+
#insert data here
|
5
|
+
fields = []
|
6
|
+
|
7
|
+
fields << DynamicFormField.textfield({:fieldLabel => 'Title', :name => 'title', :width => 250, :allowBlank => false })
|
8
|
+
fields << DynamicFormField.combobox([['Open', 'Open'],['Closed', 'Closed']],{:fieldLabel => 'Status', :name => 'status', :width => 175, :allowBlank => false })
|
9
|
+
fields << DynamicFormField.combobox([ ['Defect', 'Defect'],
|
10
|
+
['Feature', 'Feature'],
|
11
|
+
['Issue', 'Issue'],
|
12
|
+
['Task', 'Task'],
|
13
|
+
],{:fieldLabel => 'Type', :name => 'type', :width => 175, :allowBlank => false })
|
14
|
+
fields << DynamicFormField.combobox([['High', 'High'],['Medium', 'Medium'],['Low', 'Low']],{:fieldLabel => 'Priority', :name => 'priority', :width => 175, :allowBlank => false })
|
15
|
+
fields << DynamicFormField.combobox([ ['compass_ae_console', 'compass_ae_console'],
|
16
|
+
['compass_ae_starter_kit', 'compass_ae_starter_kit'],
|
17
|
+
['data_migrator', 'data_migrator'],
|
18
|
+
['erp_agreements', 'erp_agreements'],
|
19
|
+
['erp_app', 'erp_app'],
|
20
|
+
['erp_base_erp_svcs', 'erp_base_erp_svcs'],
|
21
|
+
['erp_commerce', 'erp_commerce'],
|
22
|
+
['erp_communication_events', 'erp_communication_events'],
|
23
|
+
['erp_dev_svcs', 'erp_dev_svcs'],
|
24
|
+
['erp_financial_accounting', 'erp_financial_accounting'],
|
25
|
+
['erp_forms', 'erp_forms'],
|
26
|
+
['erp_inventory', 'erp_inventory'],
|
27
|
+
['erp_invoicing', 'erp_invoicing'],
|
28
|
+
['erp_offers', 'erp_offers'],
|
29
|
+
['erp_orders', 'erp_orders'],
|
30
|
+
['erp_products', 'erp_products'],
|
31
|
+
['erp_rules', 'erp_rules'],
|
32
|
+
['erp_search', 'erp_search'],
|
33
|
+
['erp_tech_svcs', 'erp_tech_svcs'],
|
34
|
+
['erp_txns_and_accts', 'erp_txns_and_accts'],
|
35
|
+
['erp_work_effort', 'erp_work_effort'],
|
36
|
+
['erp_workflow', 'erp_workflow'],
|
37
|
+
['knitkit', 'knitkit'],
|
38
|
+
['master_data_management', 'master_data_management'],
|
39
|
+
['prismpay', 'prismpay'],
|
40
|
+
['rails_db_admin', 'rails_db_admin'],
|
41
|
+
['tenancy', 'tenancy'],
|
42
|
+
['timeshare', 'timeshare']
|
43
|
+
],
|
44
|
+
{:fieldLabel => 'Product', :name => 'product', :width => 270, :allowBlank => true })
|
45
|
+
fields << DynamicFormField.combobox([['None', 'None']],{:fieldLabel => 'Project', :name => 'project', :width => 175, :allowBlank => true })
|
46
|
+
fields << DynamicFormField.related_combobox('User','username',{:fieldLabel => 'Assigned To', :name => 'assigned_to_id', :width => 175, :allowBlank => true })
|
47
|
+
fields << DynamicFormField.textarea({:fieldLabel => 'Body', :name => 'body', :width => 400, :height => 300, :allowBlank => false, :display_in_grid => false })
|
48
|
+
|
49
|
+
d = DynamicForm.new
|
50
|
+
d.description = 'Ticket Form'
|
51
|
+
d.definition = fields.to_json
|
52
|
+
d.model_name = 'Ticket'
|
53
|
+
d.internal_identifier = 'ticket'
|
54
|
+
d.default = true
|
55
|
+
d.dynamic_form_model = DynamicFormModel.create(:model_name => 'Ticket')
|
56
|
+
d.save
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.down
|
60
|
+
#remove data here
|
61
|
+
DynamicForm.find_by_internal_identifier('ticket').destroy
|
62
|
+
DynamicFormModel.find_by_model_name('Ticket').destroy
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -3,21 +3,20 @@ class UpdateContactForm
|
|
3
3
|
def self.up
|
4
4
|
fields = []
|
5
5
|
|
6
|
-
fields << DynamicFormField.textfield({:fieldLabel => 'First Name', :name => 'first_name', :width => 250, :
|
7
|
-
fields << DynamicFormField.textfield({:fieldLabel => 'Last Name', :name => 'last_name', :width => 250, :
|
8
|
-
fields << DynamicFormField.email({:fieldLabel => 'Email', :name => 'email', :width => 250, :
|
9
|
-
fields << DynamicFormField.textarea({:fieldLabel => 'Message', :name => 'message', :width => 400, :height => 200, :
|
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
10
|
|
11
11
|
d = DynamicForm.find_by_internal_identifier('contact_us')
|
12
12
|
unless d.nil?
|
13
|
-
puts "updating form"
|
14
13
|
d.definition = fields.to_json
|
15
14
|
d.save
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
18
|
def self.down
|
20
|
-
#
|
19
|
+
#remove data here
|
21
20
|
end
|
22
21
|
|
23
22
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateTickets < ActiveRecord::Migration
|
2
|
+
|
3
|
+
def up
|
4
|
+
unless table_exists?(:tickets)
|
5
|
+
create_table :tickets do |t|
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
def down
|
13
|
+
if table_exists?(:tickets)
|
14
|
+
drop_table :tickets
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|