2 if (!CRM
.Designer
) CRM
.Designer
= {};
4 // TODO Optimize this class
5 CRM
.Designer
.PaletteFieldModel
= CRM
.Backbone
.Model
.extend({
8 * @var {string} required; a form-specific binding to an entity instance (eg 'student', 'mother')
17 initialize: function() {
19 getFieldSchema: function() {
20 return this.getRel('ufGroupModel').getFieldSchema(this.get('entityName'), this.get('fieldName'));
22 getLabel: function() {
23 // Note: if fieldSchema were a bit tighter, then we need to get a label from PaletteFieldModel at all
24 return this.getFieldSchema().title
|| this.get('fieldName');
26 getSectionName: function() {
27 // Note: if fieldSchema were a bit tighter, then we need to get a section from PaletteFieldModel at all
28 return this.getFieldSchema().section
|| 'default';
30 getSection: function() {
31 return this.getRel('ufGroupModel').getModelClass(this.get('entityName')).prototype.sections
[this.getSectionName()];
34 * Add a new UFField model to a UFFieldCollection (if doing so is legal).
35 * If it fails, display an alert.
37 * @param {int} ufGroupId
38 * @param {CRM.UF.UFFieldCollection} ufFieldCollection
39 * @param {Object} addOptions
40 * @return {CRM.UF.UFFieldModel} or null (if the field is not addable)
42 addToUFCollection: function(ufFieldCollection
, addOptions
) {
43 var name
, paletteFieldModel
= this;
44 var ufFieldModel
= paletteFieldModel
.createUFFieldModel(ufFieldCollection
.getRel('ufGroupModel'));
45 ufFieldModel
.set('uf_group_id', ufFieldCollection
.uf_group_id
);
46 if (!ufFieldCollection
.isAddable(ufFieldModel
)) {
48 ts('The field "%1" is already included.', {
49 1: paletteFieldModel
.getLabel()
56 ufFieldCollection
.add(ufFieldModel
, addOptions
);
57 // Load metadata and set defaults
58 // TODO: currently only works for custom fields
59 name
= this.get('fieldName').split('_');
60 if (name
[0] === 'custom') {
61 CRM
.api('custom_field', 'getsingle', {id
: name
[1]}, {success: function(field
) {
62 ufFieldModel
.set(_
.pick(field
, 'help_pre', 'help_post', 'is_required'));
67 createUFFieldModel: function(ufGroupModel
) {
68 var model
= new CRM
.UF
.UFFieldModel({
70 label
: this.getLabel(),
71 entity_name
: this.get('entityName'),
72 field_type
: this.getFieldSchema().civiFieldType
,
73 // For some reason the 'formatting' field gets a random number appended in core so we mimic that here.
75 field_name
: this.get('fieldName') == 'formatting' ? 'formatting_' + (Math
.floor(Math
.random() * 8999) + 1000) : this.get('fieldName')
84 * - ufGroupModel: UFGroupModel
86 CRM
.Designer
.PaletteFieldCollection
= CRM
.Backbone
.Collection
.extend({
87 model
: CRM
.Designer
.PaletteFieldModel
,
88 initialize: function(models
, options
) {
89 this.initializeCopyToChildrenRelation('ufGroupModel', options
.ufGroupModel
, models
);
93 * Look up a palette-field
97 * @return {CRM.Designer.PaletteFieldModel}
99 getFieldByName: function(entityName
, fieldName
) {
100 if (fieldName
.indexOf('formatting') === 0) {
101 fieldName
= 'formatting';
103 return this.find(function(paletteFieldModel
) {
104 return ((!entityName
|| paletteFieldModel
.get('entityName') == entityName
) && paletteFieldModel
.get('fieldName') == fieldName
);
109 * Get a list of all fields, grouped into sections by "entityName+sectionName".
111 * @return {Object} keys are sections ("entityName+sectionName"); values are CRM.Designer.PaletteFieldModel
113 getFieldsByEntitySection: function() {
115 var fieldsByEntitySection
= this.groupBy(function(paletteFieldModel
) {
116 return paletteFieldModel
.get('entityName') + '-' + paletteFieldModel
.getSectionName();
118 return fieldsByEntitySection
;