Merge pull request #1566 from mabashian/expand-aw-required-when

Expanded awRequiredWhen to support expressions
This commit is contained in:
Michael Abashian 2016-04-19 08:35:42 -04:00
commit 6c7382b7b9
14 changed files with 123 additions and 117 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -45,7 +45,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
sourceField: 'name',
ngClick: 'lookUpOrganization()',
awRequiredWhen: {
variable: "organizationrequired",
reqExpression: "organizationrequired",
init: "true"
},
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',
ngOptions: 'path.label for path in project_local_paths',
awRequiredWhen: {
variable: "pathRequired",
reqExpression: "pathRequired",
init: false
},
ngShow: "scm_type.value == 'manual' && !showMissingPlaybooksAlert",
@ -111,7 +111,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
type: 'text',
ngShow: "scm_type && scm_type.value !== 'manual'",
awRequiredWhen: {
variable: "scmRequired",
reqExpression: "scmRequired",
init: false
},
subForm: 'sourceSubForm',

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -42,7 +42,7 @@ export default function() {
sourceField: 'name',
ngClick: 'lookUpOrganization()',
awRequiredWhen: {
variable: "organizationrequired",
reqExpression: "organizationrequired",
init: "true"
}
},
@ -60,7 +60,7 @@ export default function() {
label: 'Username',
type: 'text',
awRequiredWhen: {
variable: "email_required",
reqExpression: "email_required",
init: "false"
},
ngShow: "notification_type.value == 'email' ",
@ -76,7 +76,7 @@ export default function() {
label: 'Host',
type: 'text',
awRequiredWhen: {
variable: "email_required",
reqExpression: "email_required",
init: "false"
},
ngShow: "notification_type.value == 'email' ",
@ -86,7 +86,7 @@ export default function() {
label: 'Sender Email',
type: 'text',
awRequiredWhen: {
variable: "email_required",
reqExpression: "email_required",
init: "false"
},
ngShow: "notification_type.value == 'email' ",
@ -102,7 +102,7 @@ export default function() {
dataPlacement: 'right',
dataContainer: "body",
awRequiredWhen: {
variable: "email_required",
reqExpression: "email_required",
init: "false"
},
ngShow: "notification_type.value == 'email' ",
@ -113,7 +113,7 @@ export default function() {
type: 'sensitive',
hasShowInputButton: true,
awRequiredWhen: {
variable: "password_required" ,
reqExpression: "password_required" ,
init: "false"
},
ngShow: "notification_type.value == 'email' || notification_type.value == 'irc' ",
@ -133,7 +133,7 @@ export default function() {
'class': "input-small",
min: 0,
awRequiredWhen: {
variable: "port_required",
reqExpression: "port_required",
init: "false"
},
ngShow: "notification_type.value == 'email' || notification_type.value == 'irc'",
@ -149,7 +149,7 @@ export default function() {
dataPlacement: 'right',
dataContainer: "body",
awRequiredWhen: {
variable: "channel_required",
reqExpression: "channel_required",
init: "false"
},
ngShow: "notification_type.value == 'slack' || notification_type.value == 'hipchat'",
@ -160,7 +160,7 @@ export default function() {
type: 'sensitive',
hasShowInputButton: true,
awRequiredWhen: {
variable: "token_required",
reqExpression: "token_required",
init: "false"
},
ngShow: "notification_type.value == 'slack' || notification_type.value == 'pagerduty' || notification_type.value == 'hipchat'",
@ -171,7 +171,7 @@ export default function() {
type: 'sensitive',
hasShowInputButton: true,
awRequiredWhen: {
variable: "twilio_required",
reqExpression: "twilio_required",
init: "false"
},
ngShow: "notification_type.value == 'twilio' ",
@ -181,7 +181,7 @@ export default function() {
label: 'Source Phone Number',
type: 'text',
awRequiredWhen: {
variable: "twilio_required",
reqExpression: "twilio_required",
init: "false"
},
ngShow: "notification_type.value == 'twilio' ",
@ -197,7 +197,7 @@ export default function() {
dataPlacement: 'right',
dataContainer: "body",
awRequiredWhen: {
variable: "twilio_required",
reqExpression: "twilio_required",
init: "false"
},
ngShow: "notification_type.value == 'twilio' ",
@ -207,7 +207,7 @@ export default function() {
label: 'Account SID',
type: 'text',
awRequiredWhen: {
variable: "twilio_required",
reqExpression: "twilio_required",
init: "false"
},
ngShow: "notification_type.value == 'twilio' ",
@ -217,7 +217,7 @@ export default function() {
label: 'Pagerduty subdomain',
type: 'text',
awRequiredWhen: {
variable: "pagerduty_required",
reqExpression: "pagerduty_required",
init: "false"
},
ngShow: "notification_type.value == 'pagerduty' ",
@ -227,7 +227,7 @@ export default function() {
label: 'API Service/Integration Key',
type: 'text',
awRequiredWhen: {
variable: "pagerduty_required",
reqExpression: "pagerduty_required",
init: "false"
},
ngShow: "notification_type.value == 'pagerduty' ",
@ -237,7 +237,7 @@ export default function() {
label: 'Client Identifier',
type: 'text',
awRequiredWhen: {
variable: "pagerduty_required",
reqExpression: "pagerduty_required",
init: "false"
},
ngShow: "notification_type.value == 'pagerduty' ",
@ -247,7 +247,7 @@ export default function() {
label: 'Label to be shown with notification',
type: 'text',
awRequiredWhen: {
variable: "hipchat_required",
reqExpression: "hipchat_required",
init: "false"
},
ngShow: "notification_type.value == 'hipchat' ",
@ -257,7 +257,7 @@ export default function() {
label: 'API URL (e.g: https://mycompany.hiptchat.com)',
type: 'text',
awRequiredWhen: {
variable: "hipchat_required",
reqExpression: "hipchat_required",
init: "false"
},
ngShow: "notification_type.value == 'hipchat' ",
@ -267,7 +267,7 @@ export default function() {
label: 'Notification Color',
type: 'text',
awRequiredWhen: {
variable: "hipchat_required",
reqExpression: "hipchat_required",
init: "false"
},
ngShow: "notification_type.value == 'hipchat' ",
@ -277,7 +277,7 @@ export default function() {
label: 'Notify Channel',
type: 'text',
awRequiredWhen: {
variable: "hipchat_required",
reqExpression: "hipchat_required",
init: "false"
},
ngShow: "notification_type.value == 'hipchat' ",
@ -287,7 +287,7 @@ export default function() {
label: 'Target URL',
type: 'text',
awRequiredWhen: {
variable: "webhook_required",
reqExpression: "webhook_required",
init: "false"
},
ngShow: "notification_type.value == 'webhook' ",
@ -297,7 +297,7 @@ export default function() {
label: 'HTTP Headers',
type: 'text',
awRequiredWhen: {
variable: "webhook_required",
reqExpression: "webhook_required",
init: "false"
},
ngShow: "notification_type.value == 'webhook' ",
@ -307,7 +307,7 @@ export default function() {
label: 'IRC Server Address',
type: 'text',
awRequiredWhen: {
variable: "irc_required",
reqExpression: "irc_required",
init: "false"
},
ngShow: "notification_type.value == 'irc' ",
@ -317,7 +317,7 @@ export default function() {
label: 'IRC Nick',
type: 'text',
awRequiredWhen: {
variable: "irc_required",
reqExpression: "irc_required",
init: "false"
},
ngShow: "notification_type.value == 'irc' ",
@ -327,7 +327,7 @@ export default function() {
label: 'Destination Channels or Users',
type: 'text',
awRequiredWhen: {
variable: "irc_required",
reqExpression: "irc_required",
init: "false"
},
ngShow: "notification_type.value == 'irc' ",

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.
//
.directive('awRequiredWhen', function() {
@ -338,47 +338,35 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper'])
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
function checkIt () {
function updateRequired () {
var isRequired = scope.$eval(attrs.awRequiredWhen);
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');
if ($(elm).hasClass('lookup') || $(elm).hasClass('ui-spinner-input')) {
$(elm).parent().parent().parent().find('label').first().addClass('prepend-asterisk');
}
else {
$(elm).parent().parent().find('label').first().addClass('prepend-asterisk');
}
$(label).addClass('prepend-asterisk');
}
else if (!scope[attrs.awRequiredWhen]) {
else if (!isRequired) {
elm.removeAttr('required');
if ($(elm).hasClass('lookup')) {
label = $(elm).parent().parent().parent().find('label').first();
label.removeClass('prepend-asterisk');
}
else {
$(elm).parent().parent().find('label').first().removeClass('prepend-asterisk');
}
$(label).removeClass('prepend-asterisk');
}
if (scope[attrs.awRequiredWhen] && (viewValue === undefined || viewValue === null || viewValue === '')) {
if (isRequired && (viewValue === undefined || viewValue === null || viewValue === '')) {
validity = false;
}
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) {
// We already set a watcher on the attribute above so no need to call updateRequired() in here
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;
if (Empty($(this).attr('aw-required-when'))) {
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) {
span = label.children('span');
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.ask) ? "ng-disabled=\"" + fld + "_ask\" " : "";
html += (field.autocomplete !== undefined) ? this.attr(field, 'autocomplete') : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" +
field.awRequiredWhen.variable + "\" " : "";
if(field.awRequiredWhen) {
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.associated && this.form.fields[field.associated].ask) ? "ng-disabled=\"" + field.associated + "_ask\" " : "";
html += ">\n";
@ -939,8 +938,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += "ng-disabled='" + _disabled + "'";
}
html += (field.autocomplete !== undefined) ? this.attr(field, 'autocomplete') : "";
html += (field.awRequiredWhen) ? "data-awrequired-init='" + field.awRequiredWhen.init + "' aw-required-when='" +
field.awRequiredWhen.variable + "' " : "";
if(field.awRequiredWhen) {
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.associated && this.form.fields[field.associated].ask) ? "ng-disabled='" + field.associated + "_foo' " : "";
html += ">\n";
@ -1050,8 +1051,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += (field.ngRequired) ? "ng-required=\"" + field.ngRequired +"\"" : "";
html += (field.readonly || field.showonly) ? "readonly " : "";
html += (field.awDropFile) ? "aw-drop-file " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" +
field.awRequiredWhen.variable + "\" " : "";
if(field.awRequiredWhen) {
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";
@ -1089,8 +1092,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
//used for select2 combo boxes
html += (field.multiSelect) ? "multiple " : "";
html += (field.readonly) ? "disabled " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" +
field.awRequiredWhen.variable + "\" " : "";
if(field.awRequiredWhen) {
html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += ">\n";
if(!field.multiSelect){
html += "<option value=\"\">";
@ -1147,8 +1152,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
html += (field.readonly) ? "readonly " : "";
html += (field.integer) ? "integer " : "";
html += (field.disabled) ? "data-disabled=\"true\" " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" +
field.awRequiredWhen.variable + "\" " : "";
if(field.awRequiredWhen) {
html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += " >\n";
// Add error messages
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 += (options.mode === 'edit' && field.editRequired) ? "required " : "";
html += (field.readonly || field.showonly) ? "readonly " : "";
html += (field.awRequiredWhen) ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" aw-required-when=\"" +
field.awRequiredWhen.variable + "\" " : "";
if(field.awRequiredWhen) {
html += field.awRequiredWhen.init ? "data-awrequired-init=\"" + field.awRequiredWhen.init + "\" " : "";
html += field.awRequiredWhen.reqExpression ? "aw-required-when=\"" + field.awRequiredWhen.reqExpression + "\" " : "";
}
html += " awlookup >\n";
html += "</div>\n";
// Add error messages
@ -1383,26 +1392,26 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
tab, sectionShow, offset, width,ngDisabled, itm;
// title and exit button
html += "<div class=\"Form-header\">";
html += "<div class=\"Form-title ";
html += (this.form.titleClass) ? this.form.titleClass : "";
html += "\">";
html += (options.mode === 'edit') ? this.form.editTitle : this.form.addTitle;
if(this.form.name === "user"){
html+= "<span class=\"Form-title--is_superuser\" "+
"ng-if=is_superuser>Admin</span>";
if(!(this.form.showHeader !== undefined && this.form.showHeader === false)) {
html += "<div class=\"Form-header\">";
html += "<div class=\"Form-title\">";
html += (options.mode === 'edit') ? this.form.editTitle : this.form.addTitle;
if(this.form.name === "user"){
html+= "<span class=\"Form-title--is_superuser\" "+
"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)) {
var collection;