Expanded awRequiredWhen to support an expression rather than looking at a truthy scope variable.

This commit is contained in:
Michael Abashian
2016-04-18 11:06:52 -04:00
parent 4f2b245f71
commit 94c4591a3e
13 changed files with 98 additions and 92 deletions

View File

@@ -74,7 +74,7 @@ export default function() {
dataPlacement: 'right', dataPlacement: 'right',
dataContainer: 'body', dataContainer: 'body',
awRequiredWhen: { awRequiredWhen: {
variable: 'credRequired', reqExpression: 'credRequired',
init: 'false' init: 'false'
} }
}, },

View File

@@ -103,7 +103,7 @@ export default
type: 'text', type: 'text',
ngShow: "kind.value == 'aws'", ngShow: "kind.value == 'aws'",
awRequiredWhen: { awRequiredWhen: {
variable: "aws_required", reqExpression: "aws_required",
init: false init: false
}, },
autocomplete: false, autocomplete: false,
@@ -115,7 +115,7 @@ export default
type: 'sensitive', type: 'sensitive',
ngShow: "kind.value == 'aws'", ngShow: "kind.value == 'aws'",
awRequiredWhen: { awRequiredWhen: {
variable: "aws_required", reqExpression: "aws_required",
init: false init: false
}, },
autocomplete: false, autocomplete: false,
@@ -149,7 +149,7 @@ export default
dataContainer: "body", dataContainer: "body",
autocomplete: false, autocomplete: false,
awRequiredWhen: { awRequiredWhen: {
variable: 'host_required', reqExpression: 'host_required',
init: false init: false
}, },
subForm: 'credentialSubForm' subForm: 'credentialSubForm'
@@ -160,7 +160,7 @@ export default
ngShow: "kind.value && kind.value !== 'aws' && " + ngShow: "kind.value && kind.value !== 'aws' && " +
"kind.value !== 'gce' && kind.value!=='azure'", "kind.value !== 'gce' && kind.value!=='azure'",
awRequiredWhen: { awRequiredWhen: {
variable: 'username_required', reqExpression: 'username_required',
init: false init: false
}, },
autocomplete: false, autocomplete: false,
@@ -171,7 +171,7 @@ export default
type: 'email', type: 'email',
ngShow: "kind.value === 'gce'", ngShow: "kind.value === 'gce'",
awRequiredWhen: { awRequiredWhen: {
variable: 'email_required', reqExpression: 'email_required',
init: false init: false
}, },
autocomplete: false, autocomplete: false,
@@ -186,7 +186,7 @@ export default
type: 'text', type: 'text',
ngShow: "kind.value == 'azure'", ngShow: "kind.value == 'azure'",
awRequiredWhen: { awRequiredWhen: {
variable: 'subscription_required', reqExpression: 'subscription_required',
init: false init: false
}, },
addRequired: false, addRequired: false,
@@ -203,7 +203,7 @@ export default
type: 'sensitive', type: 'sensitive',
ngShow: "kind.value == 'rax'", ngShow: "kind.value == 'rax'",
awRequiredWhen: { awRequiredWhen: {
variable: "rackspace_required", reqExpression: "rackspace_required",
init: false init: false
}, },
autocomplete: false, autocomplete: false,
@@ -223,7 +223,7 @@ export default
autocomplete: false, autocomplete: false,
hasShowInputButton: true, hasShowInputButton: true,
awRequiredWhen: { awRequiredWhen: {
variable: "password_required", reqExpression: "password_required",
init: false init: false
}, },
subForm: "credentialSubForm" subForm: "credentialSubForm"
@@ -245,7 +245,7 @@ export default
ngShow: "kind.value == 'ssh' || kind.value == 'scm' || " + ngShow: "kind.value == 'ssh' || kind.value == 'scm' || " +
"kind.value == 'gce' || kind.value == 'azure'", "kind.value == 'gce' || kind.value == 'azure'",
awRequiredWhen: { awRequiredWhen: {
variable: 'key_required', reqExpression: 'key_required',
init: true init: true
}, },
class: 'Form-textAreaLabel', class: 'Form-textAreaLabel',
@@ -319,7 +319,7 @@ export default
addRequired: false, addRequired: false,
editRequired: false, editRequired: false,
awRequiredWhen: { awRequiredWhen: {
variable: 'project_required', reqExpression: 'project_required',
init: false init: false
}, },
subForm: 'credentialSubForm' subForm: 'credentialSubForm'

View File

@@ -42,7 +42,7 @@ export default
sourceField: 'name', sourceField: 'name',
ngClick: 'lookUpOrganization()', ngClick: 'lookUpOrganization()',
awRequiredWhen: { awRequiredWhen: {
variable: "organizationrequired", reqExpression: "organizationrequired",
init: "true" init: "true"
} }
}, },

View File

@@ -58,7 +58,10 @@ export default
sourceModel: 'inventory', sourceModel: 'inventory',
sourceField: 'name', sourceField: 'name',
ngClick: 'lookUpInventory()', ngClick: 'lookUpInventory()',
awRequiredWhen: {variable: "inventoryrequired", init: "true" }, awRequiredWhen: {
reqExpression: "inventoryrequired",
init: "true"
},
column: 1, column: 1,
awPopOver: "<p>Select the inventory containing the hosts you want this job to manage.</p>", awPopOver: "<p>Select the inventory containing the hosts you want this job to manage.</p>",
dataTitle: 'Inventory', dataTitle: 'Inventory',
@@ -71,7 +74,10 @@ export default
sourceModel: 'project', sourceModel: 'project',
sourceField: 'name', sourceField: 'name',
ngClick: 'lookUpProject()', ngClick: 'lookUpProject()',
awRequiredWhen: {variable: "projectrequired", init: "true" }, awRequiredWhen: {
reqExpression: "projectrequired",
init: "true"
},
column: 1, column: 1,
awPopOver: "<p>Select the project containing the playbook you want this job to execute.</p>", awPopOver: "<p>Select the project containing the playbook you want this job to execute.</p>",
dataTitle: 'Project', dataTitle: 'Project',
@@ -83,7 +89,10 @@ export default
type:'select', type:'select',
ngOptions: 'book for book in playbook_options track by book', ngOptions: 'book for book in playbook_options track by book',
id: 'playbook-select', id: 'playbook-select',
awRequiredWhen: {variable: "playbookrequired", init: "true" }, awRequiredWhen: {
reqExpression: "playbookrequired",
init: "true"
},
column: 1, column: 1,
awPopOver: "<p>Select the playbook to be executed by this job.</p>", awPopOver: "<p>Select the playbook to be executed by this job.</p>",
dataTitle: 'Playbook', dataTitle: 'Playbook',

View File

@@ -45,7 +45,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
sourceField: 'name', sourceField: 'name',
ngClick: 'lookUpOrganization()', ngClick: 'lookUpOrganization()',
awRequiredWhen: { awRequiredWhen: {
variable: "organizationrequired", reqExpression: "organizationrequired",
init: "true" init: "true"
}, },
awPopOver: '<p>A project must have at least one organization. Pick one organization now to create the project, and then after ' + awPopOver: '<p>A project must have at least one organization. Pick one organization now to create the project, and then after ' +
@@ -95,7 +95,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
id: 'local-path-select', id: 'local-path-select',
ngOptions: 'path.label for path in project_local_paths', ngOptions: 'path.label for path in project_local_paths',
awRequiredWhen: { awRequiredWhen: {
variable: "pathRequired", reqExpression: "pathRequired",
init: false init: false
}, },
ngShow: "scm_type.value == 'manual' && !showMissingPlaybooksAlert", ngShow: "scm_type.value == 'manual' && !showMissingPlaybooksAlert",
@@ -111,7 +111,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
type: 'text', type: 'text',
ngShow: "scm_type && scm_type.value !== 'manual'", ngShow: "scm_type && scm_type.value !== 'manual'",
awRequiredWhen: { awRequiredWhen: {
variable: "scmRequired", reqExpression: "scmRequired",
init: false init: false
}, },
subForm: 'sourceSubForm', subForm: 'sourceSubForm',

View File

@@ -35,7 +35,7 @@ export default
ngShow: "source && source.value == 'file'", ngShow: "source && source.value == 'file'",
type: 'text', type: 'text',
awRequiredWhen: { awRequiredWhen: {
variable: "sourcePathRequired", reqExpression: "sourcePathRequired",
init: "false" init: "false"
} }
}, },
@@ -47,7 +47,7 @@ export default
sourceField: 'name', sourceField: 'name',
ngClick: 'lookUpCredential()', ngClick: 'lookUpCredential()',
awRequiredWhen: { awRequiredWhen: {
variable: "cloudCredentialRequired", reqExpression: "cloudCredentialRequired",
init: "false" init: "false"
} }
}, },

View File

@@ -42,7 +42,7 @@ export default
editRequire: false, editRequire: false,
ngClick: 'lookUpOrganization()', ngClick: 'lookUpOrganization()',
awRequiredWhen: { awRequiredWhen: {
variable: "orgrequired", reqExpression: "orgrequired",
init: true init: true
} }
} }

View File

@@ -46,7 +46,7 @@ export default
label: 'Username', label: 'Username',
type: 'text', type: 'text',
awRequiredWhen: { awRequiredWhen: {
variable: "not_ldap_user", reqExpression: "not_ldap_user",
init: true init: true
}, },
autocomplete: false autocomplete: false
@@ -61,7 +61,7 @@ export default
excludeMode: 'edit', excludeMode: 'edit',
ngClick: 'lookUpOrganization()', ngClick: 'lookUpOrganization()',
awRequiredWhen: { awRequiredWhen: {
variable: "orgrequired", reqExpression: "orgrequired",
init: true init: true
} }
}, },

View File

@@ -3,7 +3,7 @@
* *
* All Rights Reserved * All Rights Reserved
*************************************************/ *************************************************/
/** /**
* @ngdoc function * @ngdoc function
* @name helpers.function:Users * @name helpers.function:Users
@@ -30,12 +30,12 @@ export default
UserForm.fields.email.readonly = false; UserForm.fields.email.readonly = false;
UserForm.fields.email.editRequired = true; UserForm.fields.email.editRequired = true;
UserForm.fields.organization.awRequiredWhen = { UserForm.fields.organization.awRequiredWhen = {
variable: "orgrequired", reqExpression: "orgrequired",
init: true init: true
}; };
UserForm.fields.organization.readonly = false; UserForm.fields.organization.readonly = false;
UserForm.fields.username.awRequiredWhen = { UserForm.fields.username.awRequiredWhen = {
variable: "not_ldap_user", reqExpression: "not_ldap_user",
init: true init: true
}; };
UserForm.fields.username.readonly = false; UserForm.fields.username.readonly = false;

View File

@@ -36,7 +36,7 @@ export default function() {
label: 'Organization', label: 'Organization',
type: 'lookup', type: 'lookup',
awRequiredWhen: { awRequiredWhen: {
variable: "orgrequired", reqExpression: "orgrequired",
init: true init: true
}, },
sourceModel: 'organization', sourceModel: 'organization',

View File

@@ -78,8 +78,8 @@ export default ['Rest', 'ProcessErrors', 'generateList',
} }
if (parent_scope.mode === "add") { if (parent_scope.mode === "add") {
if (parent_scope[sourceModel + "_field"].awRequiredWhen && if (parent_scope[sourceModel + "_field"].awRequiredWhen &&
parent_scope[sourceModel + "_field"].awRequiredWhen.variable && parent_scope[sourceModel + "_field"].awRequiredWhen.reqExpression &&
parent_scope[parent_scope[sourceModel + "_field"].awRequiredWhen.variable]) { parent_scope.$eval(parent_scope[sourceModel + "_field"].awRequiredWhen.reqExpression)) {
return true; return true;
} else if (parent_scope[sourceModel + "_field"].addRequired === true) { } else if (parent_scope[sourceModel + "_field"].addRequired === true) {
return true; return true;

View File

@@ -328,9 +328,9 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper'])
}) })
// //
// awRequiredWhen: { variable: "<variable to watch for true|false>", init:"true|false" } // awRequiredWhen: { reqExpression: "<expression to watch for true|false>", init: "true|false" }
// //
// Make a field required conditionally using a scope variable. If the scope variable is true, the // Make a field required conditionally using an expression. If the expression evaluates to true, the
// field will be required. Otherwise, the required attribute will be removed. // field will be required. Otherwise, the required attribute will be removed.
// //
.directive('awRequiredWhen', function() { .directive('awRequiredWhen', function() {
@@ -338,47 +338,35 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper'])
require: 'ngModel', require: 'ngModel',
link: function(scope, elm, attrs, ctrl) { link: function(scope, elm, attrs, ctrl) {
function checkIt () { function updateRequired () {
var isRequired = scope.$eval(attrs.awRequiredWhen);
var viewValue = elm.val(), label, validity = true; var viewValue = elm.val(), label, validity = true;
if ( scope[attrs.awRequiredWhen] && (elm.attr('required') === null || elm.attr('required') === undefined) ) { label = $(elm).closest('.form-group').find('label').first();
if ( isRequired && (elm.attr('required') === null || elm.attr('required') === undefined) ) {
$(elm).attr('required','required'); $(elm).attr('required','required');
if ($(elm).hasClass('lookup') || $(elm).hasClass('ui-spinner-input')) { $(label).addClass('prepend-asterisk');
$(elm).parent().parent().parent().find('label').first().addClass('prepend-asterisk');
}
else {
$(elm).parent().parent().find('label').first().addClass('prepend-asterisk');
}
} }
else if (!scope[attrs.awRequiredWhen]) { else if (!isRequired) {
elm.removeAttr('required'); elm.removeAttr('required');
if ($(elm).hasClass('lookup')) { $(label).removeClass('prepend-asterisk');
label = $(elm).parent().parent().parent().find('label').first();
label.removeClass('prepend-asterisk');
}
else {
$(elm).parent().parent().find('label').first().removeClass('prepend-asterisk');
}
} }
if (scope[attrs.awRequiredWhen] && (viewValue === undefined || viewValue === null || viewValue === '')) { if (isRequired && (viewValue === undefined || viewValue === null || viewValue === '')) {
validity = false; validity = false;
} }
ctrl.$setValidity('required', validity); ctrl.$setValidity('required', validity);
} }
scope.$watchGroup([attrs.awRequiredWhen, $(elm).attr('name')], function() {
// watch for the aw-required-when expression to change value
updateRequired();
});
if (attrs.awrequiredInit !== undefined && attrs.awrequiredInit !== null) { if (attrs.awrequiredInit !== undefined && attrs.awrequiredInit !== null) {
// We already set a watcher on the attribute above so no need to call updateRequired() in here
scope[attrs.awRequiredWhen] = attrs.awrequiredInit; scope[attrs.awRequiredWhen] = attrs.awrequiredInit;
checkIt();
} }
scope.$watch(attrs.awRequiredWhen, function() {
// watch for the aw-required-when expression to change value
checkIt();
});
scope.$watch($(elm).attr('name'), function() {
// watch for the field to change value
checkIt();
});
} }
}; };
}) })

View File

@@ -263,9 +263,6 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
var label, span; var label, span;
if (Empty($(this).attr('aw-required-when'))) { if (Empty($(this).attr('aw-required-when'))) {
label = $(this).closest('.form-group').find('label').first(); label = $(this).closest('.form-group').find('label').first();
if ($(this).attr('type') === 'radio') {
label = $(this).parent().parent().parent().find('label').first();
}
if (label.length > 0) { if (label.length > 0) {
span = label.children('span'); span = label.children('span');
if (span.length > 0 && !span.first().hasClass('prepend-asterisk')) { if (span.length > 0 && !span.first().hasClass('prepend-asterisk')) {
@@ -791,8 +788,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += (field.awSurveyQuestion) ? "aw-survey-question" : "" ; html += (field.awSurveyQuestion) ? "aw-survey-question" : "" ;
html += (field.ask) ? "ng-disabled=\"" + fld + "_ask\" " : ""; html += (field.ask) ? "ng-disabled=\"" + fld + "_ask\" " : "";
html += (field.autocomplete !== undefined) ? this.attr(field, 'autocomplete') : ""; html += (field.autocomplete !== undefined) ? this.attr(field, 'autocomplete') : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" + if(field.awRequiredWhen) {
field.awRequiredWhen.variable + "\" " : ""; html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += (field.awValidUrl) ? "aw-valid-url " : ""; html += (field.awValidUrl) ? "aw-valid-url " : "";
html += (field.associated && this.form.fields[field.associated].ask) ? "ng-disabled=\"" + field.associated + "_ask\" " : ""; html += (field.associated && this.form.fields[field.associated].ask) ? "ng-disabled=\"" + field.associated + "_ask\" " : "";
html += ">\n"; html += ">\n";
@@ -939,8 +938,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += "ng-disabled='" + _disabled + "'"; html += "ng-disabled='" + _disabled + "'";
} }
html += (field.autocomplete !== undefined) ? this.attr(field, 'autocomplete') : ""; html += (field.autocomplete !== undefined) ? this.attr(field, 'autocomplete') : "";
html += (field.awRequiredWhen) ? "data-awrequired-init='" + field.awRequiredWhen.init + "' aw-required-when='" + if(field.awRequiredWhen) {
field.awRequiredWhen.variable + "' " : ""; html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += (field.awValidUrl) ? "aw-valid-url " : ""; html += (field.awValidUrl) ? "aw-valid-url " : "";
html += (field.associated && this.form.fields[field.associated].ask) ? "ng-disabled='" + field.associated + "_foo' " : ""; html += (field.associated && this.form.fields[field.associated].ask) ? "ng-disabled='" + field.associated + "_foo' " : "";
html += ">\n"; html += ">\n";
@@ -1050,8 +1051,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += (field.ngRequired) ? "ng-required=\"" + field.ngRequired +"\"" : ""; html += (field.ngRequired) ? "ng-required=\"" + field.ngRequired +"\"" : "";
html += (field.readonly || field.showonly) ? "readonly " : ""; html += (field.readonly || field.showonly) ? "readonly " : "";
html += (field.awDropFile) ? "aw-drop-file " : ""; html += (field.awDropFile) ? "aw-drop-file " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" + if(field.awRequiredWhen) {
field.awRequiredWhen.variable + "\" " : ""; html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += "aw-watch ></textarea>\n"; html += "aw-watch ></textarea>\n";
@@ -1089,8 +1092,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
//used for select2 combo boxes //used for select2 combo boxes
html += (field.multiSelect) ? "multiple " : ""; html += (field.multiSelect) ? "multiple " : "";
html += (field.readonly) ? "disabled " : ""; html += (field.readonly) ? "disabled " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" + if(field.awRequiredWhen) {
field.awRequiredWhen.variable + "\" " : ""; html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += ">\n"; html += ">\n";
if(!field.multiSelect){ if(!field.multiSelect){
html += "<option value=\"\">"; html += "<option value=\"\">";
@@ -1147,8 +1152,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += (field.readonly) ? "readonly " : ""; html += (field.readonly) ? "readonly " : "";
html += (field.integer) ? "integer " : ""; html += (field.integer) ? "integer " : "";
html += (field.disabled) ? "data-disabled=\"true\" " : ""; html += (field.disabled) ? "data-disabled=\"true\" " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" + if(field.awRequiredWhen) {
field.awRequiredWhen.variable + "\" " : ""; html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += " >\n"; html += " >\n";
// Add error messages // Add error messages
if ((options.mode === 'add' && field.addRequired) || (options.mode === 'edit' && field.editRequired)) { if ((options.mode === 'add' && field.addRequired) || (options.mode === 'edit' && field.editRequired)) {
@@ -1332,8 +1339,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += (field.placeholder) ? this.attr(field, 'placeholder') : ""; html += (field.placeholder) ? this.attr(field, 'placeholder') : "";
html += (options.mode === 'edit' && field.editRequired) ? "required " : ""; html += (options.mode === 'edit' && field.editRequired) ? "required " : "";
html += (field.readonly || field.showonly) ? "readonly " : ""; html += (field.readonly || field.showonly) ? "readonly " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" + if(field.awRequiredWhen) {
field.awRequiredWhen.variable + "\" " : ""; html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += " awlookup >\n"; html += " awlookup >\n";
html += "</div>\n"; html += "</div>\n";
// Add error messages // Add error messages
@@ -1383,26 +1392,26 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
tab, sectionShow, offset, width,ngDisabled, itm; tab, sectionShow, offset, width,ngDisabled, itm;
// title and exit button // title and exit button
html += "<div class=\"Form-header\">"; if(!(this.form.showHeader !== undefined && this.form.showHeader === false)) {
html += "<div class=\"Form-title "; html += "<div class=\"Form-header\">";
html += (this.form.titleClass) ? this.form.titleClass : ""; html += "<div class=\"Form-title\">";
html += "\">"; html += (options.mode === 'edit') ? this.form.editTitle : this.form.addTitle;
html += (options.mode === 'edit') ? this.form.editTitle : this.form.addTitle; if(this.form.name === "user"){
if(this.form.name === "user"){ html+= "<span class=\"Form-title--is_superuser\" "+
html+= "<span class=\"Form-title--is_superuser\" "+ "ng-if=is_superuser>Admin</span>";
"ng-if=is_superuser>Admin</span>"; }
html += "</div>\n";
if(this.form.cancelButton !== undefined && this.form.cancelButton === false) {
html += "<div class=\"Form-exitHolder\">";
html += "</div>";
} else {
html += "<div class=\"Form-exitHolder\">";
html += "<button class=\"Form-exit\" ng-click=\"formCancel()\">";
html += "<i class=\"fa fa-times-circle\"></i>";
html += "</button></div>\n";
}
html += "</div>\n"; //end of Form-header
} }
html += "</div>\n";
if(this.form.cancelButton !== undefined && this.form.cancelButton === false) {
html += "<div class=\"Form-exitHolder\">";
html += "</div>";
} else {
html += "<div class=\"Form-exitHolder\">";
html += "<button class=\"Form-exit\" ng-click=\"formCancel()\">";
html += "<i class=\"fa fa-times-circle\"></i>";
html += "</button></div>\n";
}
html += "</div>\n"; //end of Form-header
if (!_.isEmpty(this.form.related)) { if (!_.isEmpty(this.form.related)) {
var collection; var collection;