ErpForms
ERP Forms adds dynamic forms to Compass using ExtJS.
Models
DynamicFormModel - Used for keeping track of what models have forms. Every model that uses the has_dynamic_forms “mixin”, extends DynamicFormDocument or simply wants to use DynamicForm, needs to be given a record in the dynamic_form_models table.
DynamicDatum - This is where dynamic attributes are stored. Any model that uses has_dynamic_data will store its data in the dynamic_data table.
DynamicForm - Handles dynamic forms. Each model can have many forms which are looked up by model_name. Every model must have a default form but any form can be retrieved using an internal_identifier. Form definition is a JSON string which is equivalent to an ExtJS form definition which is an array of hashes.
DynamicFormDocument - This model enables the creation of dynamic records using has_dynamic_forms and has_dynamic_data. DynamicFormDocument can explicitly be subclassed or a subclass can be declared on the fly using the “declare” class method.
Mixins
has_dynamic_forms - Adds dynamic forms to any model.
has_dynamic_data - Adds dynamic data to any model
Libraries
DynamicGridColumn - Builds ExtJS dynamic grid columns.
DynamicFormField - Builds ExtJS dynamic form fields. This is done in text in order to support validation. Outputs JSON strings which can be parsed into JSON Ruby objects. See the instance method “definition_object” on DynamicForm.
Examples
Creating a DynamicFormModel
DynamicFormModel.create({ :model_name => "MyDynamicModel" })
Creating a DynamicForm
fields = []
fields << DynamicFormField.textfield({:fieldLabel => 'First Name', :name => 'first_name', :width => '200' })
fields << DynamicFormField.textfield({:fieldLabel => 'Last Name', :name => 'last_name', :width => '200' })
fields << DynamicFormField.email({:fieldLabel => 'Email', :name => 'email', :width => '200' })
fields << DynamicFormField.textarea({:fieldLabel => 'Message', :name => 'message', :width => '200' })
d = DynamicForm.new
d.description = 'My Dynamic Form'
d.definition = DynamicForm.concat_fields_to_build_definition(fields)
d.model_name = 'MyDynamicModel'
d.internal_identifier = 'my_dyn_model'
d.default = true
d.dynamic_form_model_id = DynamicFormModel.find_by_model_name('MyDynamicModel').id
d.save
Declaring a DynamicFormDocument on the fly
DynamicFormDocument.declare("MyDynamicModel")
@dyn_model = "MyDynamicModel".constantize.new
@dyn_model.data.created_with_form = @dyn_model.default_form
# create as many dynamic attributes as you need by prefixing them with "dyn_"
@dyn_model.data.dyn_my_dynamic_field = "hello world"
@dyn_model.data.created_by = current_user.id
@dyn_model.save
Subclassing DynamicFormDocument
class MyDynamicModel < DynamicFormDocument
# no need to declare mixins since they will be inherited from DynamicFormDocument
# so only reason to subclass is if you need custom methods
end
Adding dynamic forms and data to an existing model
class Party
has_dynamic_forms
has_dynamic_data
end
Using the Knitkit DynamicForms widget
Edit Section Layout, click Dynamic Forms widget icon and the following will be added to the layout:
<%=raw render_widget :dynamic_forms, :params => {:model_name => 'MyDynamicModel', :width => '350'} %>
TODO
Dynamic Form Builder Search Dynamic Attributes via SOLR Code Mirror form field file attachments w/ has_file_assets and plupload concatenated field calculated field related field with search ahead for relations with huge datasets
Copyright © 2011 Adam Hull