knitkit 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/knitkit/erp_app/desktop/file_assets_controller.rb +1 -1
- data/app/controllers/knitkit/erp_app/desktop/theme_controller.rb +0 -2
- data/app/models/website.rb +76 -79
- data/app/widgets/dynamic_forms/base.rb +139 -0
- data/app/widgets/dynamic_forms/javascript/dynamic_forms.js +111 -0
- data/app/widgets/dynamic_forms/views/error.html.erb +5 -0
- data/app/widgets/dynamic_forms/views/index.html.erb +8 -0
- data/app/widgets/dynamic_forms/views/success.html.erb +4 -0
- data/app/widgets/dynamic_grid/base.rb +130 -0
- data/app/widgets/dynamic_grid/helpers/controller/dynamic_grid_controller_helper.rb +3 -0
- data/app/widgets/dynamic_grid/helpers/view/dynamic_grid_view_helper.rb +3 -0
- data/app/widgets/dynamic_grid/javascript/dynamic_grid.js +178 -0
- data/app/widgets/dynamic_grid/views/index.html.erb +14 -0
- data/app/widgets/scaffold/base.rb +83 -0
- data/app/widgets/scaffold/helpers/controller/scaffold_controller_helper.rb +3 -0
- data/app/widgets/scaffold/helpers/view/scaffold_view_helper.rb +3 -0
- data/app/widgets/scaffold/javascript/scaffold.js +339 -0
- data/app/widgets/scaffold/views/index.html.erb +15 -0
- data/lib/knitkit/extensions/action_controller/theme_support/acts_as_themed_controller.rb +1 -1
- data/lib/knitkit/extensions/railties/action_view/helpers/menu_helper.rb +2 -3
- data/lib/knitkit/version.rb +1 -1
- data/public/javascripts/erp_app/desktop/applications/knitkit/center_region.js +25 -1
- metadata +19 -10
@@ -0,0 +1,111 @@
|
|
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
|
+
plain: true,
|
8
|
+
buttonAlign:'center',
|
9
|
+
items: Ext.create("Ext.form.Panel",{
|
10
|
+
labelWidth: 100,
|
11
|
+
frame:false,
|
12
|
+
bodyStyle:'padding:5px 5px 0',
|
13
|
+
defaults: {
|
14
|
+
width: 325
|
15
|
+
},
|
16
|
+
items: [
|
17
|
+
{
|
18
|
+
xtype:'combo',
|
19
|
+
value:'',
|
20
|
+
loadingText:'Retrieving Dynamic Form Models ...',
|
21
|
+
store:Ext.create('Ext.data.Store',{
|
22
|
+
proxy:{
|
23
|
+
type:'ajax',
|
24
|
+
reader:{
|
25
|
+
type:'json',
|
26
|
+
root: 'dynamic_form_model'
|
27
|
+
},
|
28
|
+
url:'/erp_forms/erp_app/desktop/dynamic_forms/models/index'
|
29
|
+
},
|
30
|
+
fields:[
|
31
|
+
{
|
32
|
+
name:'id'
|
33
|
+
},
|
34
|
+
{
|
35
|
+
name:'model_name'
|
36
|
+
}
|
37
|
+
]
|
38
|
+
}),
|
39
|
+
forceSelection:true,
|
40
|
+
editable:true,
|
41
|
+
fieldLabel:'Model Name',
|
42
|
+
autoSelect:true,
|
43
|
+
mode: 'remote',
|
44
|
+
name: 'model_name',
|
45
|
+
displayField:'model_name',
|
46
|
+
valueField:'model_name',
|
47
|
+
triggerAction: 'all',
|
48
|
+
allowBlank:false,
|
49
|
+
plugins: [new helpQtip("Dynamic Form Model Name (Class)")]
|
50
|
+
},
|
51
|
+
{
|
52
|
+
xtype:'textfield',
|
53
|
+
fieldLabel:'Form Width',
|
54
|
+
name: 'form_width',
|
55
|
+
allowBlank:true,
|
56
|
+
plugins: [new helpQtip("Form Width in Pixels. Leave blank for auto width.")]
|
57
|
+
}
|
58
|
+
]
|
59
|
+
}),
|
60
|
+
buttons: [{
|
61
|
+
text:'Submit',
|
62
|
+
listeners:{
|
63
|
+
'click':function(button){
|
64
|
+
var tpl = null;
|
65
|
+
var content = null;
|
66
|
+
var formPanel = button.findParentByType('window').query('form').first();
|
67
|
+
var basicForm = formPanel.getForm();
|
68
|
+
var WidgetDynamicFormModelName = basicForm.findField('model_name');
|
69
|
+
var WidgetDynamicFormWidth = basicForm.findField('form_width');
|
70
|
+
if (basicForm.isValid()){
|
71
|
+
var data = {
|
72
|
+
WidgetDynamicFormModelName: WidgetDynamicFormModelName.getValue(),
|
73
|
+
WidgetDynamicFormWidth: WidgetDynamicFormWidth.getValue()
|
74
|
+
};
|
75
|
+
|
76
|
+
tpl = new Ext.XTemplate(
|
77
|
+
"<% # Optional Parameters:\n",
|
78
|
+
" # internal_identifier: Models can have multiple forms\n",
|
79
|
+
" # Leave blank if you want to use the default form\n",
|
80
|
+
" # Specify internal_identifier to choose a specific form %>\n",
|
81
|
+
"<%= render_widget :dynamic_forms,\n",
|
82
|
+
" :params => {:model_name => '{WidgetDynamicFormModelName}',\n",
|
83
|
+
" :internal_identifier => ''",
|
84
|
+
'<tpl if="WidgetDynamicFormWidth">',
|
85
|
+
",\n :width => {WidgetDynamicFormWidth} ",
|
86
|
+
'</tpl>',
|
87
|
+
"} %>");
|
88
|
+
content = tpl.apply(data);
|
89
|
+
|
90
|
+
//add rendered template to center region editor
|
91
|
+
Ext.getCmp('knitkitCenterRegion').addContentToActiveCodeMirror(content);
|
92
|
+
addDynamicFormWidgetWindow.close();
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
},{
|
97
|
+
text: 'Close',
|
98
|
+
handler: function(){
|
99
|
+
addDynamicFormWidgetWindow.close();
|
100
|
+
}
|
101
|
+
}]
|
102
|
+
});
|
103
|
+
addDynamicFormWidgetWindow.show();
|
104
|
+
}
|
105
|
+
};
|
106
|
+
|
107
|
+
Compass.ErpApp.Widgets.AvailableWidgets.push({
|
108
|
+
name:'Dynamic Forms',
|
109
|
+
iconUrl:'/images/icons/document_text/document_text_48x48.png',
|
110
|
+
onClick:Compass.ErpApp.Widgets.DynamicForms.addDynamicForm
|
111
|
+
});
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module Widgets
|
2
|
+
module DynamicGrid
|
3
|
+
class Base < ErpApp::Widgets::Base
|
4
|
+
|
5
|
+
def index
|
6
|
+
@model_name = params[:model_name]
|
7
|
+
@title = params[:title] || params[:model_name]
|
8
|
+
@width = params[:width] || '100%'
|
9
|
+
@height = params[:height] || 500
|
10
|
+
@page = params[:page] || true
|
11
|
+
@page_size = params[:page_size] || 10
|
12
|
+
@display_msg = params[:display_msg] || 'Displaying {0} - {1} of {2}'
|
13
|
+
@empty_msg = params[:empty_msg] || 'Empty'
|
14
|
+
|
15
|
+
render :view => :index
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup
|
19
|
+
begin
|
20
|
+
form = DynamicForm.get_form(params[:model_name])
|
21
|
+
raise "No Default Form found for this model." if form.nil?
|
22
|
+
definition = form.definition_object
|
23
|
+
|
24
|
+
columns = []
|
25
|
+
definition.each do |field_hash|
|
26
|
+
if field_hash[:display_in_grid]
|
27
|
+
# for some reason grid column widths are greater than form field widths
|
28
|
+
field_hash[:width] = (field_hash[:width].to_f * 0.56).round.to_i unless field_hash[:width].nil?
|
29
|
+
columns << DynamicGridColumn.build_column(field_hash)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Created By", :name => 'created_username', :xtype => 'textfield', :width => 100 })
|
34
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Created At", :name => 'created_at', :xtype => 'datefield', :width => 115 })
|
35
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Updated By", :name => 'updated_username', :xtype => 'textfield', :width => 100 })
|
36
|
+
columns << DynamicGridColumn.build_column({ :fieldLabel => "Updated At", :name => 'updated_at', :xtype => 'datefield', :width => 115 })
|
37
|
+
|
38
|
+
definition << DynamicFormField.textfield({ :fieldLabel => "Created By", :name => 'created_username' })
|
39
|
+
definition << DynamicFormField.datefield({ :fieldLabel => "Created At", :name => 'created_at' })
|
40
|
+
definition << DynamicFormField.textfield({ :fieldLabel => "Updated By", :name => 'updated_username' })
|
41
|
+
definition << DynamicFormField.datefield({ :fieldLabel => "Updated At", :name => 'updated_at' })
|
42
|
+
definition << DynamicFormField.hiddenfield({ :fieldLabel => "ID", :name => 'id' })
|
43
|
+
definition << DynamicFormField.hiddenfield({ :fieldLabel => "Form ID", :name => 'form_id' })
|
44
|
+
definition << DynamicFormField.hiddenfield({ :fieldLabel => "Model Name", :name => 'model_name' })
|
45
|
+
|
46
|
+
render :inline => "{
|
47
|
+
\"success\": true,
|
48
|
+
\"use_ext_forms\":false,
|
49
|
+
\"inline_edit\":false,
|
50
|
+
\"columns\": [#{columns.join(',')}],
|
51
|
+
\"fields\": #{definition.to_json}
|
52
|
+
}"
|
53
|
+
|
54
|
+
rescue Exception => e
|
55
|
+
Rails.logger.error e.message
|
56
|
+
Rails.logger.error e.backtrace.join("\n")
|
57
|
+
render :inline => {
|
58
|
+
:success => false,
|
59
|
+
:message => e.message
|
60
|
+
}.to_json
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def data
|
65
|
+
begin
|
66
|
+
sort = (params[:sort] || 'created_at').downcase
|
67
|
+
dir = (params[:dir] || 'desc').downcase
|
68
|
+
page = params[:page]
|
69
|
+
per_page = params[:per_page]
|
70
|
+
|
71
|
+
query_filter = params[:query_filter].strip rescue nil
|
72
|
+
|
73
|
+
myDynamicObject = DynamicFormModel.get_constant(params[:model_name])
|
74
|
+
|
75
|
+
if $USE_SOLR_FOR_DYNAMIC_FORM_MODELS and myDynamicObject.is_searchable?
|
76
|
+
solr_search_results = myDynamicObject.search do
|
77
|
+
keywords query_filter unless params[:query_filter].blank?
|
78
|
+
paginate(:page => page, :per_page => per_page)
|
79
|
+
order_by(sort.to_sym, dir.to_sym)
|
80
|
+
end
|
81
|
+
dynamic_records = solr_search_results.results
|
82
|
+
else
|
83
|
+
dynamic_records = myDynamicObject.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
|
84
|
+
dynamic_records = dynamic_records.joins(:dynamic_data).where("UPPER(dynamic_data.dynamic_attributes) LIKE UPPER('%#{query_filter}%')") unless params[:query_filter].blank?
|
85
|
+
end
|
86
|
+
|
87
|
+
related_fields = dynamic_records.first.form.related_fields rescue []
|
88
|
+
|
89
|
+
wi = []
|
90
|
+
dynamic_records.each do |i|
|
91
|
+
wihash = i.data.dynamic_attributes_with_related_data(related_fields, false)
|
92
|
+
wihash[:id] = i.id
|
93
|
+
wihash[:created_username] = i.data.created_by.nil? ? '' : i.data.created_by.username
|
94
|
+
wihash[:updated_username] = i.data.updated_by.nil? ? '' : i.data.updated_by.username
|
95
|
+
wihash[:created_at] = i.data.created_at.getlocal.strftime("%m/%d/%Y")
|
96
|
+
wihash[:updated_at] = i.data.updated_at.getlocal.strftime("%m/%d/%Y")
|
97
|
+
wihash[:form_id] = (i.data.updated_with_form_id ? i.data.updated_with_form_id : i.data.created_with_form_id)
|
98
|
+
wihash[:model_name] = params[:model_name]
|
99
|
+
wi << wihash
|
100
|
+
end
|
101
|
+
|
102
|
+
render :inline => "{ total:#{dynamic_records.total_entries}, data:#{wi.to_json} }"
|
103
|
+
rescue Exception => e
|
104
|
+
Rails.logger.error e.message
|
105
|
+
Rails.logger.error e.backtrace.join("\n")
|
106
|
+
render :inline => {
|
107
|
+
:success => false,
|
108
|
+
:message => e.message
|
109
|
+
}.to_json
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
#should not be modified
|
114
|
+
#modify at your own risk
|
115
|
+
def locate
|
116
|
+
File.dirname(__FILE__)
|
117
|
+
end
|
118
|
+
|
119
|
+
class << self
|
120
|
+
def title
|
121
|
+
"Dynamic Grid"
|
122
|
+
end
|
123
|
+
|
124
|
+
def widget_name
|
125
|
+
File.basename(File.dirname(__FILE__))
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end#Base
|
129
|
+
end#DynamicGrid
|
130
|
+
end#Widgets
|
@@ -0,0 +1,178 @@
|
|
1
|
+
Compass.ErpApp.Widgets.DynamicGrid = {
|
2
|
+
addWidget:function () {
|
3
|
+
Ext.create("Ext.window.Window", {
|
4
|
+
title:'Add Dynamic Grid',
|
5
|
+
plain:true,
|
6
|
+
buttonAlign:'center',
|
7
|
+
items:Ext.create("Ext.form.Panel", {
|
8
|
+
labelWidth:100,
|
9
|
+
frame:false,
|
10
|
+
bodyStyle:'padding:5px 5px 0',
|
11
|
+
defaults:{
|
12
|
+
width:325
|
13
|
+
},
|
14
|
+
items:[
|
15
|
+
{
|
16
|
+
xtype:'combo',
|
17
|
+
value:'',
|
18
|
+
loadingText:'Retrieving Dynamic Form Models ...',
|
19
|
+
store:Ext.create('Ext.data.Store', {
|
20
|
+
proxy:{
|
21
|
+
type:'ajax',
|
22
|
+
reader:{
|
23
|
+
type:'json',
|
24
|
+
root:'dynamic_form_model'
|
25
|
+
},
|
26
|
+
url:'/erp_forms/erp_app/desktop/dynamic_forms/models/index'
|
27
|
+
},
|
28
|
+
fields:[
|
29
|
+
{
|
30
|
+
name:'id'
|
31
|
+
},
|
32
|
+
{
|
33
|
+
name:'model_name'
|
34
|
+
}
|
35
|
+
]
|
36
|
+
}),
|
37
|
+
forceSelection:true,
|
38
|
+
editable:true,
|
39
|
+
fieldLabel:'Model Name',
|
40
|
+
autoSelect:true,
|
41
|
+
mode:'remote',
|
42
|
+
name:'model_name',
|
43
|
+
displayField:'model_name',
|
44
|
+
valueField:'model_name',
|
45
|
+
triggerAction:'all',
|
46
|
+
allowBlank:false,
|
47
|
+
plugins:[new helpQtip("Dynamic Form Model Name (Class)")],
|
48
|
+
listeners:{
|
49
|
+
select:function(){
|
50
|
+
this.up('form').down('fieldset').enable();
|
51
|
+
}
|
52
|
+
}
|
53
|
+
},
|
54
|
+
{
|
55
|
+
xtype:'fieldset',
|
56
|
+
title:'Grid Options',
|
57
|
+
disabled:true,
|
58
|
+
items:[
|
59
|
+
{
|
60
|
+
xtype:'textfield',
|
61
|
+
name:'title',
|
62
|
+
fieldLabel:'Title'
|
63
|
+
},
|
64
|
+
{
|
65
|
+
xtype:'textfield',
|
66
|
+
name:'width',
|
67
|
+
value:500,
|
68
|
+
fieldLabel:'Width'
|
69
|
+
},
|
70
|
+
{
|
71
|
+
xtype:'textfield',
|
72
|
+
name:'height',
|
73
|
+
value:500,
|
74
|
+
fieldLabel:'Height'
|
75
|
+
},
|
76
|
+
{
|
77
|
+
xtype:'fieldcontainer',
|
78
|
+
defaultType:'radiofield',
|
79
|
+
width:200,
|
80
|
+
defaults:{
|
81
|
+
flex:1
|
82
|
+
},
|
83
|
+
layout:'hbox',
|
84
|
+
fieldLabel:'Page Results',
|
85
|
+
toolTip:'Page results.',
|
86
|
+
items:[
|
87
|
+
{
|
88
|
+
boxLabel:'Yes',
|
89
|
+
name:'page_results',
|
90
|
+
checked:true,
|
91
|
+
inputValue:'y'
|
92
|
+
},
|
93
|
+
{
|
94
|
+
boxLabel:'No',
|
95
|
+
name:'page_results',
|
96
|
+
inputValue:'n'
|
97
|
+
}
|
98
|
+
]
|
99
|
+
},
|
100
|
+
{
|
101
|
+
xtype:'textfield',
|
102
|
+
name:'pageSize',
|
103
|
+
value:20,
|
104
|
+
fieldLabel:'Rows per Page'
|
105
|
+
},
|
106
|
+
{
|
107
|
+
xtype:'textfield',
|
108
|
+
name:'displayMsg',
|
109
|
+
value:'Displaying {0} - {1} of {2}',
|
110
|
+
fieldLabel:'Paging Display Message'
|
111
|
+
},
|
112
|
+
{
|
113
|
+
xtype:'textfield',
|
114
|
+
name:'emptyMsg',
|
115
|
+
value:'Empty',
|
116
|
+
fieldLabel:'Empty Message'
|
117
|
+
}
|
118
|
+
]
|
119
|
+
}
|
120
|
+
]
|
121
|
+
}),
|
122
|
+
buttons:[
|
123
|
+
{
|
124
|
+
text:'Submit',
|
125
|
+
listeners:{
|
126
|
+
'click':function (button) {
|
127
|
+
var tpl = new Ext.XTemplate("<%= render_widget :dynamic_grid, :params => {:model_name => '{model_name}',\n",
|
128
|
+
" :grid => {\n",
|
129
|
+
" :title => '{title}',\n",
|
130
|
+
" :width => {width},\n",
|
131
|
+
" :height => {height},\n",
|
132
|
+
" :page => {page_results:this.toBoolean},\n",
|
133
|
+
" :page_size => {pageSize},\n",
|
134
|
+
" :display_msg => '{displayMsg}',\n",
|
135
|
+
" :empty_msg => '{emptyMsg}'\n",
|
136
|
+
" }\n",
|
137
|
+
"} %>",
|
138
|
+
{
|
139
|
+
toBoolean:function (value) {
|
140
|
+
var result = 'false';
|
141
|
+
if (value == 'y') {
|
142
|
+
result = 'true';
|
143
|
+
}
|
144
|
+
return result;
|
145
|
+
}
|
146
|
+
}),
|
147
|
+
content = null,
|
148
|
+
window = button.findParentByType('window'),
|
149
|
+
formPanel = window.query('form')[0],
|
150
|
+
grid = formPanel.down('grid'),
|
151
|
+
basicForm = formPanel.getForm(),
|
152
|
+
values = basicForm.getValues();
|
153
|
+
|
154
|
+
content = tpl.apply(values);
|
155
|
+
|
156
|
+
//add rendered template to center region editor
|
157
|
+
Ext.getCmp('knitkitCenterRegion').addContentToActiveCodeMirror(content);
|
158
|
+
button.up('window').close();
|
159
|
+
}
|
160
|
+
}
|
161
|
+
},
|
162
|
+
{
|
163
|
+
text:'Close',
|
164
|
+
handler:function (btn) {
|
165
|
+
btn.up('window').close();
|
166
|
+
}
|
167
|
+
}
|
168
|
+
]
|
169
|
+
}).show();
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
Compass.ErpApp.Widgets.AvailableWidgets.push({
|
174
|
+
name:'Dynamic Grid',
|
175
|
+
iconUrl:'/images/icons/grid/grid_48x48.png',
|
176
|
+
onClick:Compass.ErpApp.Widgets.DynamicGrid.addWidget,
|
177
|
+
about:'Add grid for dynamic model'
|
178
|
+
});
|