erp_forms 2.0.6 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/base_controller.rb +4 -37
  2. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/data_controller.rb +348 -82
  3. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/forms_controller.rb +110 -15
  4. data/app/controllers/erp_forms/erp_app/desktop/dynamic_forms/models_controller.rb +19 -3
  5. data/app/mailers/dynamic_form_mailer.rb +35 -0
  6. data/app/models/dynamic_datum.rb +97 -22
  7. data/app/models/dynamic_form.rb +172 -98
  8. data/app/models/dynamic_form_document.rb +4 -11
  9. data/app/models/dynamic_form_model.rb +46 -22
  10. data/app/models/ticket.rb +4 -0
  11. data/app/views/dynamic_form_mailer/widget_email_with_attachments.html.erb +3 -0
  12. data/app/views/dynamic_form_mailer/widget_email_with_attachments.text.erb +3 -0
  13. data/app/widgets/dynamic_forms/base.rb +101 -19
  14. data/app/widgets/dynamic_forms/javascript/dynamic_forms.js +40 -38
  15. data/app/widgets/dynamic_forms/views/error.html.erb +1 -0
  16. data/db/data_migrations/20110608185830_create_default_dynamic_models_and_forms.rb +2 -0
  17. data/db/data_migrations/20120824013449_create_ticket_form.rb +1 -0
  18. data/db/data_migrations/20121026013449_update_ticket_form.rb +64 -0
  19. data/db/data_migrations/{20120904191738_update_contact_form.rb → 20121026191738_update_contact_form.rb} +4 -0
  20. data/db/migrate/20110530193446_dynamic_forms.rb +12 -0
  21. data/db/migrate/20121007022323_upgrade_dynamic_forms_table.rb +31 -0
  22. data/lib/erp_forms.rb +4 -0
  23. data/lib/erp_forms/dynamic_form_field.rb +31 -28
  24. data/lib/erp_forms/dynamic_grid_column.rb +2 -2
  25. data/lib/erp_forms/engine.rb +5 -0
  26. data/lib/erp_forms/extensions/active_record/acts_as_commentable.rb +33 -0
  27. data/lib/erp_forms/extensions/active_record/acts_as_dynamic_form_model.rb +80 -0
  28. data/lib/erp_forms/extensions/active_record/has_dynamic_forms.rb +4 -4
  29. data/lib/erp_forms/extensions/extensions.rb +2 -0
  30. data/lib/erp_forms/extensions/railties/action_view.rb +2 -2
  31. data/lib/erp_forms/version.rb +2 -2
  32. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/center_region.js +2 -1
  33. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/dynamic_data_grid.js +264 -82
  34. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/form_builder.js +1476 -58
  35. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/module.js +24 -1
  36. data/public/javascripts/erp_app/desktop/applications/dynamic_forms/west_region.js +493 -210
  37. data/public/javascripts/erp_app/shared/dynamic_forms/dynamic_form_fields.js +82 -20
  38. data/public/javascripts/erp_app/shared/dynamic_forms/dynamic_forms_validation.js +23 -3
  39. data/spec/dummy/config/application.rb +6 -2
  40. data/spec/dummy/config/environments/spec.rb +3 -0
  41. data/spec/dummy/db/data_migrations/20110109173616_create_capability_scope_types.erp_tech_svcs.rb +15 -0
  42. data/spec/dummy/db/data_migrations/20110525001935_add_usd_currency.erp_base_erp_svcs.rb +12 -0
  43. data/spec/dummy/db/data_migrations/20110608185830_create_default_dynamic_models_and_forms.erp_forms.rb +33 -0
  44. data/spec/dummy/db/data_migrations/20110609150135_add_iso_codes.erp_base_erp_svcs.rb +19 -0
  45. data/spec/dummy/db/data_migrations/20110728201729_erp_app_setup.erp_app.rb +252 -0
  46. data/spec/dummy/db/data_migrations/20110728201733_update_preferences.erp_app.rb +53 -0
  47. data/spec/dummy/db/data_migrations/20110802200222_schedule_delete_expired_sessions_job.erp_tech_svcs.rb +16 -0
  48. data/spec/dummy/db/data_migrations/20110816161238_create_desktop_app_audit_log_viewer.erp_app.rb +21 -0
  49. data/spec/dummy/db/data_migrations/20110817160743_add_file_manager_application.erp_app.rb +32 -0
  50. data/spec/dummy/db/data_migrations/20110828190913_create_desktop_app_dynamic_forms.erp_forms.rb +19 -0
  51. data/spec/dummy/db/data_migrations/20110913145838_setup_compass_ae_instance.erp_base_erp_svcs.rb +12 -0
  52. data/spec/dummy/db/data_migrations/20111108183739_add_default_capabilities.erp_app.rb +23 -0
  53. data/spec/dummy/db/data_migrations/20111108183740_add_new_contact_widgets.erp_app.rb +42 -0
  54. data/spec/dummy/db/data_migrations/20111111144706_setup_audit_log_types.erp_tech_svcs.rb +22 -0
  55. data/spec/dummy/db/data_migrations/20120109173616_create_download_capability_type.erp_tech_svcs.rb +14 -0
  56. data/spec/dummy/db/data_migrations/20120229160222_add_userinfo_widget.erp_app.rb +29 -0
  57. data/spec/dummy/db/data_migrations/20120405193721_create_party_and_role_type_for_communication_events.erp_app.rb +11 -0
  58. data/spec/dummy/db/data_migrations/20120411180756_create_user_management_mobile_application.erp_app.rb +19 -0
  59. data/spec/dummy/db/data_migrations/20120418164215_create_configuration_management_desktop_application.erp_app.rb +23 -0
  60. data/spec/dummy/db/data_migrations/20120824013449_create_ticket_form.erp_forms.rb +67 -0
  61. data/spec/dummy/db/data_migrations/20121026013449_update_ticket_form.erp_forms.rb +65 -0
  62. data/spec/dummy/db/data_migrations/20121026191738_update_contact_form.erp_forms.rb +27 -0
  63. data/spec/dummy/db/data_migrations/20121116155018_create_group_relationship_and_role_types.erp_tech_svcs.rb +20 -0
  64. data/spec/dummy/db/data_migrations/20121130201859_upgrade_remove_system_mgmt_app.erp_app.rb +16 -0
  65. data/spec/dummy/db/data_migrations/20121130212146_note_capabilities.erp_tech_svcs.rb +24 -0
  66. data/spec/dummy/db/data_migrations/20121218175028_create_security_management_desktop_application.erp_app.rb +23 -0
  67. data/spec/dummy/db/migrate/20121213234847_base_erp_services.erp_base_erp_svcs.rb +461 -0
  68. data/spec/dummy/db/migrate/20121213234848_base_tech_services.erp_tech_svcs.rb +255 -0
  69. data/spec/dummy/db/migrate/20121213234849_create_has_attribute_tables.erp_tech_svcs.rb +39 -0
  70. data/spec/dummy/db/migrate/20121213234850_base_app_framework.erp_app.rb +276 -0
  71. data/spec/dummy/db/migrate/20121213234851_dynamic_forms.erp_forms.rb +95 -0
  72. data/spec/dummy/db/migrate/20121213234852_create_tickets.erp_forms.rb +19 -0
  73. data/spec/dummy/db/migrate/20121213234853_upgrade_dynamic_forms_table.erp_forms.rb +32 -0
  74. data/spec/dummy/db/migrate/20130107181041_create_groups.erp_tech_svcs.rb +19 -0
  75. data/spec/dummy/db/migrate/20130107181042_upgrade_security.erp_tech_svcs.rb +54 -0
  76. data/spec/dummy/db/migrate/20130107181043_upgrade_security2.erp_tech_svcs.rb +270 -0
  77. data/spec/dummy/db/schema.rb +879 -0
  78. data/spec/dummy/db/spec.sqlite3 +0 -0
  79. data/spec/dummy/log/spec.log +13580 -0
  80. data/spec/models/dynamic_form_model_spec.rb +1 -1
  81. data/spec/spec_helper.rb +11 -3
  82. metadata +136 -14
@@ -1,3 +1,26 @@
1
+ Ext.define("Compass.ErpForms.DynamicForms.DynamicFormPanel",{
2
+ extend:"Ext.form.Panel",
3
+ alias:'widget.dynamic_form_panel',
4
+
5
+ // CALLBACK USAGE EXAMPLE:
6
+ // 'afterrender':function(panel){
7
+ // panel.query('dynamic_form_panel').first().addListener('afterupdate', function(){
8
+ // console.log('afterupdate');
9
+ // });
10
+ // }
11
+ initComponent: function() {
12
+ this.callParent(arguments);
13
+ this.addEvents(
14
+ 'aftercreate',
15
+ 'afterupdate'
16
+ );
17
+ },
18
+
19
+ constructor : function(config) {
20
+ this.callParent([config]);
21
+ }
22
+ });
23
+
1
24
  Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms",{
2
25
  extend:"Ext.ux.desktop.Module",
3
26
  id:'dynamic_forms-win',
@@ -7,7 +30,7 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms",{
7
30
  iconCls:'icon-document',
8
31
  handler: this.createWindow,
9
32
  scope: this
10
- }
33
+ };
11
34
  },
12
35
 
13
36
  createWindow : function(){
@@ -24,15 +24,15 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
24
24
  url: '/erp_forms/erp_app/desktop/dynamic_forms/models/delete',
25
25
  method: 'POST',
26
26
  params:{
27
- id:node.data.modelId
27
+ id:node.data.formModelId
28
28
  },
29
29
  success: function(response) {
30
30
  self.clearWindowStatus();
31
31
  var obj = Ext.decode(response.responseText);
32
32
  if(obj.success){
33
33
  //node.remove(true); // remove node causing a reload of entire tree with error, so we are going to simply reload tree for now
34
- self.sitesTree.getStore().load({
35
- node: self.sitesTree.getRootNode()
34
+ self.formsTree.getStore().load({
35
+ node: self.formsTree.getRootNode()
36
36
  });
37
37
  }
38
38
  else{
@@ -68,7 +68,7 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
68
68
  self.clearWindowStatus();
69
69
  var obj = Ext.decode(response.responseText);
70
70
  if(obj.success){
71
- node.remove(true);
71
+ node.remove(false);
72
72
  }
73
73
  else{
74
74
  Ext.Msg.alert('Error', 'Error deleting form');
@@ -91,17 +91,17 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
91
91
  method: 'POST',
92
92
  params:{
93
93
  id:node.data.formId,
94
- model_name:node.data.modelName
94
+ model_name:node.data.formModelName
95
95
  },
96
96
  success: function(response) {
97
97
  self.clearWindowStatus();
98
98
  var obj = Ext.decode(response.responseText);
99
99
  if(obj.success){
100
100
  //reload model tree node
101
- self.sitesTree.getStore().load({
101
+ self.formsTree.getStore().load({
102
102
  // node:node.parentNode
103
103
  });
104
- node.parentNode.expand();
104
+ //node.parentNode.expand();
105
105
  }
106
106
  else{
107
107
  Ext.Msg.alert('Error', 'Error setting default form');
@@ -114,40 +114,215 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
114
114
  });
115
115
  },
116
116
 
117
- getDynamicForm : function(record){
117
+ addDynamicForm : function(record){
118
118
  var self = this;
119
- self.setWindowStatus('Loading dynamic form...');
120
- Ext.Ajax.request({
121
- url: '/erp_forms/erp_app/desktop/dynamic_forms/forms/get',
122
- method: 'POST',
123
- params:{
124
- id:record.get('formId')
125
- },
126
- success: function(response) {
127
- self.initialConfig['centerRegion'].editSectionLayout(
128
- sectionName,
129
- websiteId,
130
- sectionId,
131
- response.responseText,
132
- [{
133
- text: 'Insert Content Area1',
134
- handler: function(btn){
135
- var codeMirror = btn.findParentByType('codemirror');
136
- Ext.MessageBox.prompt('New File', 'Please enter content area name:', function(btn, text){
137
- if(btn == 'ok'){
138
- codeMirror.insertContent('<%=render_content_area(:'+text+')%>');
119
+
120
+ var newFormWindow = Ext.create("Ext.window.Window",{
121
+ layout:'fit',
122
+ width:375,
123
+ title:'New Dynamic Form',
124
+ height:100,
125
+ plain: true,
126
+ buttonAlign:'center',
127
+ items: Ext.create("Ext.form.Panel",{
128
+ labelWidth: 110,
129
+ frame:false,
130
+ bodyStyle:'padding:5px 5px 0',
131
+ defaults: {
132
+ width: 225
133
+ },
134
+ items: [
135
+ {
136
+ xtype:'textfield',
137
+ fieldLabel:'Form Title',
138
+ allowBlank:false,
139
+ name:'form_name',
140
+ listeners:{
141
+ afterrender:function(field){
142
+ field.focus(false, 200);
143
+ },
144
+ 'specialkey': function(field, e){
145
+ if (e.getKey() == e.ENTER) {
146
+ var button = field.findParentByType('window').query('#submitButton').first();
147
+ button.fireEvent('click', button);
148
+ }
149
+ }
150
+ }
139
151
  }
152
+ ]
153
+ }),
154
+ buttons: [{
155
+ itemId: 'submitButton',
156
+ text:'Submit',
157
+ listeners:{
158
+ 'click':function(button){
159
+ var window = button.findParentByType('window');
160
+ var formPanel = window.query('form')[0];
161
+ var form_name = formPanel.getForm().findField('form_name').getValue();
140
162
 
141
- });
163
+ var form_tab = Ext.getCmp('formBuilder_'+form_name);
164
+ if (form_tab){
165
+ this.centerRegion.workArea.setActiveTab(form_tab);
166
+ return;
167
+ }
168
+
169
+ var formBuilder = Ext.create('Compass.ErpApp.Desktop.Applications.DynamicForms.FormBuilder', {
170
+ title: form_name,
171
+ model_name: record.get('text')
172
+ });
173
+ self.centerRegion.workArea.add(formBuilder);
174
+ self.centerRegion.workArea.setActiveTab(self.centerRegion.workArea.items.length - 1);
175
+
176
+ var form_props = formBuilder.query('#form_props').first().getForm();
177
+ form_props.findField('description').setValue(form_name);
178
+ form_props.findField('widget_action').setValue('save');
179
+ form_props.findField('submit_button_label').setValue('Submit');
180
+ form_props.findField('cancel_button_label').setValue('Cancel');
181
+ Ext.getCmp('dynamic_forms_westregion').setActiveTab('field_types');
182
+ var east_tabs = formBuilder.query('#east_tabs').first();
183
+ east_tabs.setActiveTab('form_props');
184
+
185
+ newFormWindow.close();
186
+ }
187
+ }
188
+ },
189
+ {
190
+ text: 'Close',
191
+ handler: function(){
192
+ newFormWindow.close();
193
+ }
194
+ }]
195
+ });
196
+ newFormWindow.show();
197
+ },
198
+
199
+ configureFormModel : function(record){
200
+ var self = this;
201
+
202
+ var configureModelWindow = Ext.create("Ext.window.Window",{
203
+ layout:'fit',
204
+ width:375,
205
+ title:'Configure Dynamic Form Model',
206
+ plain: true,
207
+ buttonAlign:'center',
208
+ items: Ext.create("Ext.form.Panel",{
209
+ itemId:'configureModelForm',
210
+ labelWidth: 110,
211
+ frame:false,
212
+ bodyStyle:'padding:5px 5px 0',
213
+ url:'/erp_forms/erp_app/desktop/dynamic_forms/models/update',
214
+ defaults: {
215
+ width: 225
216
+ },
217
+ items: [
218
+ {
219
+ xtype: 'checkbox',
220
+ fieldLabel: 'Allow Comments',
221
+ name: 'allow_comments',
222
+ inputValue: true,
223
+ uncheckedValue:false,
224
+ plugins: [new helpQtip("Do you want to allow comments on this model's records?")]
225
+ },
226
+ {
227
+ xtype: 'checkbox',
228
+ fieldLabel: 'Allow Files',
229
+ name: 'allow_files',
230
+ inputValue: true,
231
+ uncheckedValue:false,
232
+ plugins: [new helpQtip("Do you want to allow files to be attached to this model's records?")]
233
+ },
234
+ {
235
+ xtype:'combobox',
236
+ fieldLabel:'File Security Default',
237
+ name:'file_security_default',
238
+ allowBlank:false,
239
+ editable: false,
240
+ forceSelection:true,
241
+ store:[
242
+ ['private','Private'],
243
+ ['public','Public']
244
+ ],
245
+ plugins: [new helpQtip("Should attached files be automatically secured? If so, select Private. If not, select Public.")]
246
+ }]
247
+ }),
248
+ buttons: [{
249
+ text:'Submit',
250
+ listeners:{
251
+ 'click':function(button){
252
+ var formPanel = button.findParentByType('window').query('form').first();
253
+ self.setWindowStatus('Updating dynamic form model ...');
254
+ var form = formPanel.getForm();
255
+ if (form.isValid()){
256
+ form.submit({
257
+ params:{
258
+ id: record.get("formModelId")
259
+ },
260
+ success:function(form, action){
261
+ self.clearWindowStatus();
262
+ var obj = Ext.decode(action.response.responseText);
263
+ if(obj.success){
264
+ self.formsTree.getStore().load({
265
+ node: self.formsTree.getRootNode()
266
+ });
267
+ configureModelWindow.close();
268
+ }else{
269
+ Ext.Msg.alert("Error", obj.message);
270
+ }
271
+ },
272
+ failure:function(form, action){
273
+ self.clearWindowStatus();
274
+ var obj = Ext.decode(action.response.responseText);
275
+ if(obj !== null){
276
+ Ext.Msg.alert("Error", obj.message);
277
+ }else{
278
+ Ext.Msg.alert("Error", "Error updating form model");
279
+ }
280
+ }
281
+ });
142
282
  }
143
- }]);
144
- self.clearWindowStatus();
145
- },
146
- failure: function(response) {
147
- self.clearWindowStatus();
148
- Ext.Msg.alert('Error', 'Error loading dynamic form.');
149
- }
283
+ }
284
+ }
285
+ },{
286
+ text: 'Close',
287
+ handler: function(){
288
+ configureModelWindow.close();
289
+ }
290
+ }]
291
+ });
292
+ configureModelWindow.query('#configureModelForm').first().loadRecord(record);
293
+ configureModelWindow.show();
294
+ },
295
+
296
+ openFormTab : function(record){
297
+ var formBuilder = Ext.create('Compass.ErpApp.Desktop.Applications.DynamicForms.FormBuilder', {
298
+ title: record.get('description'),
299
+ model_name: record.get('model_name'),
300
+ form_id: record.get('id'),
301
+ form_definition: Ext.decode(record.get('definition')),
302
+ msg_target: record.get('msg_target')
150
303
  });
304
+ this.centerRegion.workArea.add(formBuilder);
305
+ this.centerRegion.workArea.setActiveTab(this.centerRegion.workArea.items.length - 1);
306
+
307
+ var form_props = formBuilder.query('#form_props').first().getForm();
308
+ form_props.loadRecord(record);
309
+ Ext.getCmp('dynamic_forms_westregion').setActiveTab('field_types');
310
+ var east_tabs = formBuilder.query('#east_tabs').first();
311
+ east_tabs.setActiveTab('form_props');
312
+ },
313
+
314
+ getDynamicForm : function(record){
315
+ var self = this;
316
+ form_tab = Ext.getCmp('formBuilder_'+record.get('text'));
317
+
318
+ if (form_tab){
319
+ this.centerRegion.workArea.setActiveTab(form_tab);
320
+ return;
321
+ }
322
+
323
+ self.setWindowStatus('Loading dynamic form...');
324
+ Ext.getStore('dynamicFormStore').load({ params:{ id:record.get('formId') }});
325
+ self.clearWindowStatus();
151
326
  },
152
327
 
153
328
  getDynamicData : function(record, title){
@@ -192,18 +367,31 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
192
367
  success: function(response) {
193
368
  self.clearWindowStatus();
194
369
  form_definition = Ext.decode(response.responseText);
195
- if (form_definition.success == false){
370
+ if (form_definition.success === false){
196
371
  Ext.Msg.alert('Error', form_definition.error);
197
372
  }else{
198
- var newRecordWindow = Ext.create("Ext.window.Window",{
199
- layout:'fit',
200
- title:'New Record',
201
- y: 100, // this fixes chrome and safari rendering the window at the bottom of the screen
202
- plain: true,
203
- buttonAlign:'center',
204
- items: form_definition
373
+ var newRecordPanel = Ext.create('Ext.panel.Panel',{
374
+ itemId: record.get("text")+'-new',
375
+ layout: 'border',
376
+ title: 'New '+record.get("text"),
377
+ closable: true,
378
+ autoScroll: true,
379
+ items: [form_definition],
380
+ listeners:{
381
+ 'afterrender':function(panel){
382
+ panel.query('dynamic_form_panel').first().addListener('aftercreate', function(args){
383
+ // close and reopen tab
384
+ var tabPanel = panel.findParentByType('tabpanel');
385
+ tabPanel.remove(panel);
386
+ Ext.getCmp(record.data.text).editRecord(args.record);
387
+ // reload grid
388
+ tabPanel.query('#'+record.get("text")).first().query('shared_dynamiceditablegrid').first().getStore().load({});
389
+ });
390
+ }
391
+ }
205
392
  });
206
- newRecordWindow.show();
393
+ self.centerRegion.workArea.add(newRecordPanel);
394
+ self.centerRegion.workArea.setActiveTab(self.centerRegion.workArea.items.length - 1);
207
395
  }
208
396
  },
209
397
  failure: function(response) {
@@ -212,6 +400,65 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
212
400
  }
213
401
  });
214
402
  }
403
+ },
404
+ {
405
+ text: "Edit Selected Record",
406
+ iconCls:'icon-edit',
407
+ handler:function(btn){
408
+ var rec = Ext.getCmp(record.data.text).query('shared_dynamiceditablegrid').first().getSelectionModel().getSelection().first();
409
+ if (rec) {
410
+ Ext.getCmp(record.data.text).editRecord(rec);
411
+ }else{
412
+ Ext.Msg.alert('Error', 'No record selected.');
413
+ }
414
+ }
415
+ },
416
+ {
417
+ text: "Delete Selected Record",
418
+ iconCls:'icon-delete',
419
+ handler:function(btn){
420
+ var rec = Ext.getCmp(record.data.text).query('shared_dynamiceditablegrid').first().getSelectionModel().getSelection().first();
421
+ if (rec){
422
+ var messageBox = Ext.MessageBox.confirm('Confirm', 'Are you sure?', function(btn){
423
+ if (btn == 'yes') Ext.getCmp(record.data.text).deleteRecord(rec, record.data.text);
424
+ });
425
+ }else{
426
+ Ext.Msg.alert('Error', 'No record selected.');
427
+ }
428
+ }
429
+ },
430
+ {xtype: 'tbspacer', width: 10},
431
+ {
432
+ fieldLabel: '<span data-qtitle="Search" data-qwidth="200" data-qtip="">Search</span>',
433
+ labelWidth : 40,
434
+ itemId: 'dynamicDataSearchValue',
435
+ xtype: 'textfield',
436
+ width: 180,
437
+ value: '',
438
+ listeners:{
439
+ specialkey: function(field, e){
440
+ if (e.getKey() == e.ENTER) {
441
+ var grid = field.findParentByType('tabpanel').query('#centerRegionLayout_'+record.data.text).first();
442
+ var button = grid.query('#searchButton').first();
443
+ button.fireEvent('click', button);
444
+ }
445
+ }
446
+ }
447
+ },
448
+ {xtype: 'tbspacer', width: 1},
449
+ {
450
+ xtype: 'button',
451
+ itemId: 'searchButton',
452
+ iconCls: 'x-btn-icon icon-search',
453
+ listeners:{
454
+ click: function(button) {
455
+ var grid = button.findParentByType('tabpanel').query('#centerRegionLayout_'+record.data.text).first();
456
+ var value = grid.query('#dynamicDataSearchValue').first().getValue();
457
+ grid.query('shared_dynamiceditablegrid').first().getStore().load({
458
+ params: {query_filter: value}
459
+ });
460
+ }
461
+ }
215
462
  }
216
463
  ]
217
464
  }
@@ -222,95 +469,186 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
222
469
  },
223
470
 
224
471
  initComponent: function() {
472
+ this.callParent(arguments);
473
+ },
474
+
475
+ constructor : function(config) {
225
476
  var self = this;
226
-
477
+
478
+ Ext.define('FormsTreeNode', {
479
+ extend: 'Ext.data.Model',
480
+ fields: [
481
+ {name: 'id', type: 'string'},
482
+ {name: 'text', type: 'string'},
483
+ {name: 'iconCls', type: 'string'},
484
+ {name: 'isFormModel', type: 'boolean'},
485
+ {name: 'allow_comments', type: 'boolean'},
486
+ {name: 'allow_files', type: 'boolean'},
487
+ {name: 'file_security_default', type: 'string'},
488
+ {name: 'show_in_multitask', type: 'boolean'},
489
+ {name: 'formModelName', type: 'string'},
490
+ {name: 'isDefaultForm', type: 'boolean'},
491
+ {name: 'isForm', type: 'boolean'},
492
+ {name: 'formModelId', type: 'int'},
493
+ {name: 'formId', type: 'int'},
494
+ {name: 'leaf', type: 'boolean'}
495
+ ]
496
+ });
497
+
227
498
  var store = Ext.create('Ext.data.TreeStore', {
499
+ storeId: 'formsTreeStore',
500
+ model: 'FormsTreeNode',
501
+ folderSort: true,
502
+ autoLoad: false,
503
+ sorters: [{
504
+ property:'text',
505
+ direction: 'ASC'
506
+ }],
228
507
  proxy:{
229
508
  type: 'ajax',
230
509
  url: '/erp_forms/erp_app/desktop/dynamic_forms/forms/get_tree'
231
- },
510
+ },
232
511
  root: {
233
512
  text: 'Dynamic Forms',
234
513
  expanded: true
235
- },
236
- fields:[
237
- {
238
- name:'id'
239
- },
240
- {
241
- name:'iconCls'
242
- },
243
- {
244
- name:'text',
245
- sortDir: 'ASC'
246
- },
247
- {
248
- name:'isModel'
249
- },
250
- {
251
- name:'modelName'
252
- },
253
- {
254
- name:'isDefault'
255
- },
256
- {
257
- name:'isForm'
258
- },
259
- {
260
- name:'modelId'
261
- },
262
- {
263
- name:'formId'
264
- },
265
- {
266
- name:'leaf'
267
- },
268
- {
269
- name:'children'
270
- }
271
- ],
272
- listeners:{
273
- // these listeners are a workaround for a extjs 4.0.7 bug
274
- // reference: http://www.sencha.com/forum/showthread.php?151211-Reloading-TreeStore-adds-all-records-to-store-getRemovedRecords&p=661157#post661157
275
- 'beforeload': function()
276
- {
277
- this.clearOnLoad = false;
278
- this.getRootNode().removeAll();
279
- },
280
- 'afterload': function()
281
- {
282
- this.removed = [];
283
- }
284
514
  }
285
515
  });
286
516
 
287
- this.sitesTree = new Ext.tree.TreePanel({
517
+ this.formsTree = Ext.create("Ext.tree.Panel",{
518
+ title: 'Models & Forms',
288
519
  store:store,
289
- dataUrl: '/erp_forms/erp_app/desktop/dynamic_forms/forms/get_tree',
290
- region: 'center',
291
520
  rootVisible:false,
292
- enableDD :false,
521
+ autoScroll: true,
522
+ tbar:{
523
+ items:[
524
+ {
525
+ text:'New Form Model',
526
+ iconCls:'icon-add',
527
+ handler:function(btn){
528
+ var newModelWindow = Ext.create("Ext.window.Window",{
529
+ layout:'fit',
530
+ width:375,
531
+ title:'New Dynamic Form Model',
532
+ //height:100,
533
+ plain: true,
534
+ buttonAlign:'center',
535
+ items: Ext.create("Ext.form.Panel",{
536
+ labelWidth: 110,
537
+ frame:false,
538
+ bodyStyle:'padding:5px 5px 0',
539
+ url:'/erp_forms/erp_app/desktop/dynamic_forms/models/create',
540
+ defaults: {
541
+ width: 225
542
+ },
543
+ items: [{
544
+ xtype:'textfield',
545
+ fieldLabel:'Model Name',
546
+ allowBlank:false,
547
+ name:'model_name',
548
+ plugins: [new helpQtip('This should be a camel case class name.<br /> Example: WebsiteInquiry')],
549
+ vtype: 'alphanum',
550
+ listeners:{
551
+ afterrender:function(field){
552
+ field.focus(false, 200);
553
+ },
554
+ 'specialkey': function(field, e){
555
+ if (e.getKey() == e.ENTER) {
556
+ var button = field.findParentByType('window').query('#submitButton').first();
557
+ button.fireEvent('click', button);
558
+ }
559
+ }
560
+ }
561
+ },
562
+ {
563
+ xtype: 'checkbox',
564
+ fieldLabel: 'Allow Comments',
565
+ name: 'allow_comments',
566
+ inputValue: true,
567
+ uncheckedValue:false,
568
+ plugins: [new helpQtip("Do you want to allow comments on this model's records?")]
569
+ },
570
+ {
571
+ xtype: 'checkbox',
572
+ fieldLabel: 'Allow Files',
573
+ name: 'allow_files',
574
+ inputValue: true,
575
+ uncheckedValue:false,
576
+ plugins: [new helpQtip("Do you want to allow files to be attached to this model's records?")]
577
+ },
578
+ {
579
+ xtype:'combobox',
580
+ fieldLabel:'File Security Default',
581
+ allowBlank:false,
582
+ name:'file_security_default',
583
+ value: 'private',
584
+ store:[
585
+ ['private','Private'],
586
+ ['public','Public']
587
+ ]
588
+ }]
589
+ }),
590
+ buttons: [{
591
+ text:'Submit',
592
+ listeners:{
593
+ 'click':function(button){
594
+ var formPanel = button.findParentByType('window').query('form').first();
595
+ self.setWindowStatus('Adding new dynamic form model ...');
596
+ if (formPanel.getForm().isValid()){
597
+ formPanel.getForm().submit({
598
+ success:function(form, action){
599
+ self.clearWindowStatus();
600
+ var obj = Ext.decode(action.response.responseText);
601
+ if(obj.success){
602
+ self.formsTree.getStore().load({
603
+ node: self.formsTree.getRootNode()
604
+ });
605
+ newModelWindow.close();
606
+ }else{
607
+ Ext.Msg.alert("Error", obj.message);
608
+ }
609
+ },
610
+ failure:function(form, action){
611
+ self.clearWindowStatus();
612
+ var obj = Ext.decode(action.response.responseText);
613
+ if(obj !== null){
614
+ Ext.Msg.alert("Error", obj.message);
615
+ }else{
616
+ Ext.Msg.alert("Error", "Error adding form model");
617
+ }
618
+ }
619
+ });
620
+ }
621
+ }
622
+ }
623
+ },{
624
+ text: 'Close',
625
+ handler: function(){
626
+ newModelWindow.close();
627
+ }
628
+ }]
629
+ });
630
+ newModelWindow.show();
631
+ }
632
+ }
633
+ ]
634
+ },
293
635
  listeners:{
294
- 'load':function(){
295
- self.sitesTree.getStore().sort('text', 'ASC');
296
- },
297
636
  'itemclick':function(view, record, item, index, e){
298
637
  e.stopEvent();
299
- if(record.data['isModel']){
638
+ if(record.data['isFormModel']){
300
639
  if (record.data['children'].length > 0){
301
640
  self.getDynamicData(record);
302
641
  }
303
642
  }
304
643
  else if(record.data['isForm']){
305
- //self.getDynamicForm(record);
306
- Ext.Msg.alert('Info', 'Form Builder not yet implemented');
644
+ self.getDynamicForm(record);
307
645
  }
308
646
  },
309
647
  'itemcontextmenu':function(view, record, htmlItem, index, e){
310
648
  e.stopEvent();
311
649
  var items = [];
312
650
 
313
- if(record.data['isModel']){
651
+ if(record.data['isFormModel']){
314
652
 
315
653
  // can only display data if there is a form to provide a definition
316
654
  if (record.data['children'].length > 0){
@@ -326,19 +664,28 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
326
664
  }
327
665
 
328
666
  items.push({
329
- text:'Add Dynamic Form',
667
+ text:'New Dynamic Form',
668
+ iconCls:'icon-add',
669
+ listeners:{
670
+ 'click':function(){
671
+ self.addDynamicForm(record);
672
+ }
673
+ }
674
+ });
675
+
676
+ items.push({
677
+ text:'Configure',
330
678
  iconCls:'icon-add',
331
679
  listeners:{
332
680
  'click':function(){
333
- //self.addDynamicForm(record);
334
- Ext.Msg.alert('Info', 'Form Builder not yet implemented');
681
+ self.configureFormModel(record);
335
682
  }
336
683
  }
337
684
  });
338
685
 
339
686
  if(record.data['text'] != 'DynamicFormDocument'){
340
687
  items.push({
341
- text:'Delete Model',
688
+ text:'Delete Form Model',
342
689
  iconCls:'icon-delete',
343
690
  listeners:{
344
691
  'click':function(){
@@ -355,31 +702,28 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
355
702
  iconCls:'icon-edit',
356
703
  listeners:{
357
704
  'click':function(){
358
- //self.getDynamicForm(record);
359
- Ext.Msg.alert('Info', 'Form Builder not yet implemented');
705
+ self.getDynamicForm(record);
360
706
  }
361
707
  }
362
708
  });
363
- if(!record.data['isDefault']){
709
+ if(!record.data['isDefaultForm']){
364
710
  items.push({
365
- text:'Set As Default',
711
+ text:'Set As Default Form',
366
712
  iconCls:'icon-edit',
367
713
  listeners:{
368
714
  'click':function(){
369
- //self.setDefaultForm(record);
370
- Ext.Msg.alert('Info', 'Form Builder not yet implemented');
715
+ self.setDefaultForm(record);
371
716
  }
372
717
  }
373
718
  });
374
719
  }
375
720
 
376
721
  items.push({
377
- text:'Delete',
722
+ text:'Delete Dynamic Form',
378
723
  iconCls:'icon-delete',
379
724
  listeners:{
380
725
  'click':function(){
381
- //self.deleteForm(record);
382
- Ext.Msg.alert('Info', 'Form Builder not yet implemented');
726
+ self.deleteForm(record);
383
727
  }
384
728
  }
385
729
  });
@@ -393,102 +737,41 @@ Ext.define("Compass.ErpApp.Desktop.Applications.DynamicForms.WestRegion",{
393
737
  }
394
738
  });
395
739
 
396
- var layout = new Ext.Panel({
397
- layout: 'border',
398
- autoDestroy:true,
399
- title:'Dynamic Models & Forms',
400
- items: [this.sitesTree],
401
- tbar:{
402
- items:[
403
- {
404
- text:'New Dynamic Form Model',
405
- iconCls:'icon-add',
406
- handler:function(btn){
407
- var newModelWindow = Ext.create("Ext.window.Window",{
408
- layout:'fit',
409
- width:375,
410
- title:'New Dynamic Form Model',
411
- height:100,
412
- plain: true,
413
- buttonAlign:'center',
414
- items: new Ext.FormPanel({
415
- labelWidth: 110,
416
- frame:false,
417
- fileUpload: true,
418
- bodyStyle:'padding:5px 5px 0',
419
- url:'/erp_forms/erp_app/desktop/dynamic_forms/models/create',
420
- defaults: {
421
- width: 225
422
- },
423
- items: [
424
- {
425
- xtype:'textfield',
426
- fieldLabel:'Model Name',
427
- allowBlank:false,
428
- name:'model_name'
429
- }
430
- ]
431
- }),
432
- buttons: [{
433
- text:'Submit',
434
- listeners:{
435
- 'click':function(button){
436
- var window = button.findParentByType('window');
437
- var formPanel = window.query('form')[0];
438
- self.setWindowStatus('Adding new dynamic form model ...');
439
- formPanel.getForm().submit({
440
- success:function(form, action){
441
- self.clearWindowStatus();
442
- var obj = Ext.decode(action.response.responseText);
443
- if(obj.success){
444
- self.sitesTree.getStore().load({
445
- node: self.sitesTree.getRootNode()
446
- });
447
- newModelWindow.close();
448
- }
449
- else{
450
- Ext.Msg.alert("Error", obj.message);
451
- }
452
- },
453
- failure:function(form, action){
454
- self.clearWindowStatus();
455
- var obj = Ext.decode(action.response.responseText);
456
- if(obj != null){
457
- Ext.Msg.alert("Error", obj.message);
458
- }
459
- else{
460
- Ext.Msg.alert("Error", "Error importing website");
461
- }
462
- }
463
- });
464
- }
465
- }
466
- },{
467
- text: 'Close',
468
- handler: function(){
469
- newModelWindow.close();
470
- }
471
- }]
472
- });
473
- newModelWindow.show();
740
+ this.fieldTypes = {
741
+ xtype: 'treepanel',
742
+ viewConfig: {
743
+ plugins: {
744
+ ptype: 'treeviewdragdrop',
745
+ ddGroup: 'fieldsDDGroup',
746
+ enableDrop: false
747
+ }
748
+ },
749
+ itemId: 'field_types',
750
+ title: 'Field Types',
751
+ root: fieldTreeRootNode,
752
+ rootVisible: true,
753
+ autoScroll: true,
754
+ listeners:{
755
+ beforerender:function(){
756
+ // we have to set this qtip this way so that we have access to ErpTechSvcs.Config
757
+ var filefield = fieldTreeRootNode.findChild('field_xtype','filefield');
758
+ var valid_types = ErpTechSvcs.Config.file_upload_types.replace(/,/g,', ');
759
+ filefield.data.qtip = 'Model must be enabled with has_file_assets. Use limited to one upload field per form. Compass AE is currently configured with a max file upload size of '+ErpTechSvcs.Config.max_file_size_in_mb+'MB and limited to file types '+valid_types+". Be sure to configure your web and/or mail servers accordingly.";
474
760
  }
475
761
  }
476
- ]
477
- }
478
- });
762
+ };
479
763
 
480
- this.items = [layout];
481
- this.callParent(arguments);
482
- this.setActiveTab(0);
483
- },
484
-
485
- constructor : function(config) {
486
764
  config = Ext.apply({
487
- id: 'westregionPanel',
765
+ id: 'dynamic_forms_westregion',
488
766
  region:'west',
489
767
  split:true,
490
- width:175,
491
- collapsible:false
768
+ width:235,
769
+ header: false,
770
+ hideCollapseTool: true,
771
+ collapsible: true,
772
+ collapseMode: 'mini',
773
+ items: [this.formsTree, this.fieldTypes],
774
+ activeTab: 0
492
775
  }, config);
493
776
 
494
777
  this.callParent([config]);