/* https://github.com/nikos/cmskern/blob/master/playapp/public/javascripts/widgets.js*/ /** * Widget for displaying a complete form as specified by the given schema. */ angular.widget('my:form', function(element) { this.descend(true); // compiler will process children elements this.directives(true); // compiler will process directives return function(element) { function processField(field, fieldKey) { var qualifiedName = this.parentName + '.' + fieldKey, fullyQualifiedName = this.fqName + '.' + fieldKey, fieldElStr; console.log("----> field: " + fullyQualifiedName + ", relative: " + qualifiedName); // has hierarchical subforms? Must be declared in a type struct (single) or map (multi-typed) if (field.type == 'array' && field.items && field.ui_class != 'compact') { var childElem = fieldKey + 'Elem'; var multiTyped = true; // if items is a singular value set it to an array to make the rest work // expect either object with properties or type with map of different sub-types if (field.items.type == 'object') { multiTyped = false; field.items.type = [ field.items ]; } // ~~~~ FIXME start (init array top-level) var contentChilds = scope.$eval(qualifiedName); if (!contentChilds) { var propName = fullyQualifiedName.substr('contentNode'.length + 1); console.log("No content childs yet for " + propName); var propNameArr = propName.split('.'); if (propNameArr.length == 1) { console.log("... init array: " + propName); globalContentNode[propNameArr[0]] = [{"_type":field.items.type[0].id}]; // TODO: really use first type as default? } else { console.log("============= WARN cannot initialize arrays: " + propNameArr); } } // ~~~~ FIXME end (init array top-level) // (A) subform header (with move up/down button) var subform = angular.element('
' + field.description + '
'); } controlGroup.append(controlElem); this.curDOMParent.append(controlGroup); } // skip hidden field } var scope = this, schema = scope.$eval(element.attr('schema')), data = element.attr('data'), fieldset = angular.element(''); // process every field as specified in the JSON schema definition // context object: {parentName, fqName, curDOMParent, childtype} angular.forEach(schema, processField, {parentName: data, fqName: data, curDOMParent: fieldset}); angular.compile(fieldset)(scope); element.append(fieldset); }; });