forked from Meteor-Community-Packages/meteor-autoform
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquickForm.js
143 lines (118 loc) · 4.29 KB
/
quickForm.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* global AutoForm */
Template.quickForm.helpers({
getTemplateName: function () {
return AutoForm.getTemplateName('quickForm', this.template);
},
innerContext: function quickFormContext() {
var atts = this;
var adjustedData = AutoForm.parseData(_.clone(this));
var simpleSchema = adjustedData._resolvedSchema;
var sortedSchema = {};
var fieldGroups = [];
var grouplessFieldContext;
// --------------- A. Schema --------------- //
var fieldList = atts.fields;
if (fieldList) {
fieldList = AutoForm.Utility.stringToArray(fieldList, 'AutoForm: fields attribute must be an array or a string containing a comma-delimited list of fields');
} else {
const fullSchema = simpleSchema.mergedSchema();
fieldList = _.keys(fullSchema);
}
// get the schema object, but sorted into the same order as the field list
fieldList.forEach(fieldName => {
sortedSchema[fieldName] = AutoForm.Utility.getFieldDefinition(simpleSchema, fieldName);
});
// --------------- B. Field With No Groups --------------- //
var grouplessFields = getFieldsWithNoGroup(sortedSchema);
if (grouplessFields.length > 0) {
grouplessFieldContext = {
atts: _.extend({}, atts, {fields: grouplessFields}),
fields: grouplessFields
};
}
// --------------- C. Field With Groups --------------- //
// get sorted list of field groups
var fieldGroupNames = getSortedFieldGroupNames(sortedSchema);
// Loop through the list and make a field group context for each
_.each(fieldGroupNames, function (fieldGroupName) {
var fieldsForGroup = getFieldsForGroup(fieldGroupName, sortedSchema);
if (fieldsForGroup.length > 0) {
fieldGroups.push({
name: fieldGroupName,
atts: _.extend({}, atts, {fields: fieldsForGroup}),
fields: fieldsForGroup
});
}
});
// --------------- D. Context --------------- //
// Pass along quickForm context to autoForm context, minus a few
// properties that are specific to quickForms.
var qfAutoFormContext = _.omit(atts,
'buttonContent',
'buttonClasses',
'fields',
'omitFields',
'id-prefix');
// Determine whether we want to render a submit button
var qfShouldRenderButton = (atts.buttonContent !== false && atts.type !== 'readonly' && atts.type !== 'disabled');
var context = {
qfAutoFormContext: qfAutoFormContext,
atts: atts,
qfShouldRenderButton: qfShouldRenderButton,
fieldGroups: fieldGroups,
grouplessFields: grouplessFieldContext
};
return context;
}
});
/* Private Functions */
/**
* Takes a schema object and returns a sorted array of field group names for it
*
* @param {Object} schemaObj Like from mySimpleSchema.schema()
* @returns {String[]} Array of field group names
*/
function getSortedFieldGroupNames(schemaObj) {
var names = _.map(schemaObj, function (field) {
return field.autoform && field.autoform.group;
});
// Remove undefined
names = _.compact(names);
// Remove duplicate names
names = _.unique(names);
return names.sort();
}
/**
* Returns the schema field names that belong in the group.
*
* @param {String} groupName The group name
* @param {Object} schemaObj Like from mySimpleSchema.schema()
* @returns {String[]} Array of field names (schema keys)
*/
function getFieldsForGroup(groupName, schemaObj) {
var fields = _.map(schemaObj, function (field, fieldName) {
return (fieldName.slice(-2) !== '.$') &&
field.autoform &&
field.autoform.group === groupName &&
fieldName;
});
// Remove undefined
fields = _.compact(fields);
return fields;
}
/**
* Returns the schema field names that don't belong to a group
*
* @param {Object} schemaObj Like from mySimpleSchema.schema()
* @returns {String[]} Array of field names (schema keys)
*/
function getFieldsWithNoGroup(schemaObj) {
var fields = _.map(schemaObj, function (field, fieldName) {
return (fieldName.slice(-2) !== '.$') &&
(!field.autoform || !field.autoform.group) &&
fieldName;
});
// Remove undefined
fields = _.compact(fields);
return fields;
}