forms-angular 0.12.0-beta.192a → 0.12.0-beta.192b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3581,8 +3581,12 @@ var fng;
3581
3581
  }
3582
3582
  else {
3583
3583
  $scope.showError(data);
3584
+ $scope.phase = "ready";
3584
3585
  }
3585
- }, $scope.handleHttpError);
3586
+ }, function (err) {
3587
+ $scope.handleHttpError(err);
3588
+ $scope.phase = "ready";
3589
+ });
3586
3590
  },
3587
3591
  createNew: function createNew(dataToSave, options, $scope, ctrlState) {
3588
3592
  SubmissionsService.createRecord($scope.modelName, dataToSave)
@@ -1 +1 @@
1
- !function(e){(e.directives||(e.directives={})).modelControllerDropdown=function(){return{restrict:"AE",replace:!0,template:'<li ng-show="items.length > 0" class="mcdd" uib-dropdown> <a href="#" uib-dropdown-toggle> {{contextMenu}} <b class="caret"></b> </a> <ul class="uib-dropdown-menu dropdown-menu"> <li ng-repeat="choice in items" ng-hide="isHidden($index)" ng-class="dropdownClass($index)"> <a ng-show="choice.text || choice.textFunc" class="dropdown-option" ng-href="{{choice.url || choice.urlFunc()}}" ng-click="doClick($index, $event)"> {{ choice.text || choice.textFunc() }} </a> </li> </ul></li>'}}}(fng=fng||{}),function(e){var t;function n(e){return{restrict:"E",templateUrl:"error-display-"+e.framework()+".html"}}t=e.directives||(e.directives={}),n.$inject=["cssFrameworkService"],t.errorDisplay=n}(fng=fng||{}),function(e){var t;function n(a){a.checkNotModal=function(){for(var e,t=a.element[0],n=!1,r={preventDefault:angular.noop,stopPropagation:angular.noop,target:1,currentTarget:1};(e=t.parentNode)?"function"==typeof e.getAttribute&&e.getAttribute("uib-modal-window")?(angular.element(t).scope().close(r),n=!0):t=e:n=!0,!n;);}}t=e.controllers||(e.controllers={}),n.$inject=["$scope"],t.LinkCtrl=n}(fng=fng||{}),function(e){var t;function n(p,m){return{restrict:"E",scope:{dataSrc:"&model"},link:function(n,e,r){var a=r.ref,t=r.text&&unescape(r.text)!==r.text,o=r.form,i=r.linktab;if(n.readonly=r.readonly,n.element=e,o=o?o+"/":"",i=i?"/"+i:"",t){for(var s=n,l="";"function"!=typeof s.baseSchema&&s.$parent;){if(void 0!==s.$index)throw new Error("No support for $index at this level - "+l);s=s.$parent,l+="$parent."}var c,d=r.fld,u=d.split(".");c=n.$parent.subDoc&&(n.$parent.subDoc[d]||n.$parent.subDoc[u[u.length-1]])?n.$parent.subDoc[d]?l+"subDoc."+d:l+"subDoc."+u[u.length-1]:l+"record"+(d=void 0!==s.$index?(d=u.pop(),u.join(".")+"["+s.$index+"]."+d):"."+d),n.$watch(c,function(e){if(e){if(/^[a-f0-9]{24}/.test(e.toString()))e=e.slice(0,24);else if(e.id&&/^[a-f0-9]{24}/.test(e.id))e=e.id.slice(0,24);else if(n.$parent["f_"+r.fld+"Options"]){var t=n.$parent["f_"+r.fld+"Options"].indexOf(e);e=-1<t?n.$parent["f_"+r.fld+"_ids"][t]:void 0}else e=void 0;n.link=e?p.buildUrl(a+"/"+o+(e.id||e)+"/edit"+i):void 0}else n.link=void 0},!0)}else{r.text&&0<r.text.length&&(n.text=r.text);var f=n.$parent.$index;n.$watch("dataSrc()",function(e){e&&(void 0!==f&&angular.isArray(e)&&(e=e[f]),n.link=p.buildUrl(a+"/"+o+e+"/edit"+i),n.text||m.getListAttributes(a,e).then(function(e){var t=e.data;!1===t.success?n.text=t.err:n.text=t.list},function(e){n.text="Error "+e.status+": "+e.data}))},!0)}},controller:"LinkCtrl",template:function(e,t){function n(e){return'<a ng-click="checkNotModal()" ng-href="{{ link || \'#\' }}" class="fng-link">'.concat(e,"</a>")}return t.readonly?'<span class="fng-link">{{text}}</span>':t.text&&unescape(t.text)!==t.text?n(unescape(t.text)):n("{{text}}")}}}t=e.directives||(e.directives={}),n.$inject=["routingService","SubmissionsService"],t.fngLink=n}(fng=fng||{}),function(e){var t;function n(e){return{restrict:"A",templateUrl:"form-button-"+e.framework()+".html"}}t=e.directives||(e.directives={}),n.$inject=["cssFrameworkService"],t.formButtons=n}(fng=fng||{}),function(e){var t,O,n;function r(d,u,E,A,L,f,I){return{restrict:"EA",link:function(k,x,l){function b(t,e,n,r,a){function o(){var e;if(angular.isArray(k[t.options]))e={repeat:t.options,value:"option"};else{if(!k[t.options]||!angular.isArray(k[t.options].values))throw new Error("Invalid enumeration setup in field "+t.name);e=angular.isArray(k[t.options].labels)?{repeat:t.options+".values",value:t.options+".values[$index]",label:t.options+".labels[$index]"}:{repeat:t.options+".values",value:t.options+".values[$index]"}}return e}var i;if(!e){var s=(a.model||"record")+".";if(e=s,a.subschema&&-1!==t.name.indexOf(".")){var l=t.name,c=a.subschemaroot,d=l.slice(c.length+1);a.index?r="f_"+(e+=c+"["+a.index+"]."+d).slice(s.length).replace(/(\.|\[|]\.)/g,"-"):(e+=c,a.subkey?(r=e.slice(s.length).replace(/\./g,"-")+"-subkey"+a.subkeyno+"-"+d,e+="[$_arrayOffset_"+c.replace(/\./g,"_")+"_"+a.subkeyno+"]."+d):(e+="[$index]."+d,r=null,i=l.replace(/\./g,"-")))}else e+=t.name}var u,f,p=I.allInputsVars(k,t,a,e,r,i),m=p.common,h=(n=n||t.required)?" required ":"";function v(e){var t="";return e&&(t="boolean"==typeof e?" disabled ":' ng-disabled="'.concat(e,'" ')),t}switch(t.type){case"select":t.select2?u='<input placeholder="fng-select2 has been removed" readonly>':(m+=v(t.readonly),m+=t.add?" "+t.add+" ":"",m+=' aria-label="'.concat(t.label&&""!==t.label?t.label:t.name,'" '),u="<select "+m+'class="'+p.formControl.trim()+p.compactClass+p.sizeClassBS2+'" '+h+">",n||(u+="<option></option>"),angular.isArray(t.options)?angular.forEach(t.options,function(e){_.isObject(e)?u+='<option value="'+(e.val||e.id)+'">'+(e.label||e.text)+"</option>":u+="<option>"+e+"</option>"}):(f=o(),u+='<option ng-repeat="option in '+f.repeat+'"',f.label?u+=' value="{{'+f.value+'}}"> {{ '+f.label+" }} </option> ":u+=">{{"+f.value+"}}</option> "),u+="</select>");break;case"link":u='<fng-link model="'+e+'" ref="'+t.ref+'"',t.form&&(u+=' form="'+t.form+'"'),t.linktab&&(u+=' linktab="'+t.linktab+'"'),t.linktext&&(u+=' text="'+t.linktext+'"'),t.readonly&&("boolean"==typeof t.readonly?u+=' readonly="true"':u+=' ng-readonly="'.concat(t.readonly,'"')),u+="></fng-link>";break;case"radio":u="",m+=h,m+=v(t.readonly),m+=t.add?" "+t.add+" ":"";var g="vertical"===a.formstyle||"inline"!==a.formstyle&&!t.inlineRadio;if(angular.isArray(t.options)){var b;a.subschema&&(m=(m=m.replace('name="','name="{{$index}}-')).replace('id="','id="{{$index}}-')),angular.forEach(t.options,function(e,t){b=m.replace('id="','id="'+t+"-"),u+="<input ".concat(b,' type="radio" aria-label="').concat(e,'" value="').concat(e,'">').concat(e),g&&(u+="<br />")})}else{var y=g?"div":"span";a.subschema&&(m=m.replace("$index","$parent.$index").replace('name="','name="{{$parent.$index}}-').replace('id="','id="{{$parent.$index}}-')),f=o(),u+="<"+y+' ng-repeat="option in '+f.repeat+'">',u+="<input ".concat(m.replace('id="','id="{{$index}}-'),' type="radio" aria-label="').concat(f.value,'" value="{{ ').concat(f.value,' }}"> {{ ').concat(f.label||f.value," }} </").concat(y,"> ")}break;case"checkbox":m+=h,m+=v(t.readonly),m+=t.add?" "+t.add+" ":"",u=I.generateSimpleInput(m,t,a),"bs3"===L.framework()&&(u='<div class="checkbox">'+u+"</div>");break;default:m+=I.addTextInputMarkup(p,t,h),u="textarea"===t.type?(t.rows&&("auto"===t.rows?m+='msd-elastic="\n" class="ng-animate" ':m+='rows = "'+t.rows+'" '),"ckEditor"===t.editor&&(console.log('Deprecation Warning: "editor" property deprecated - use "add"'),m+='ckeditor = "" ',"bs3"===L.framework()&&(p.sizeClassBS3="col-xs-12")),"<textarea "+m+"></textarea>"):I.generateSimpleInput(m,t,a)}return I.inputChrome(u,t,a,p)}function w(e){var t;switch(e){case"horizontal":t="form-horizontal";break;case"vertical":t="";break;case"inline":t="form-inline";break;case"stacked":t="form-stacked";break;case"horizontalCompact":default:t="form-horizontal compact"}return t}function $(e){var t={before:"",after:""};if("function"==typeof e.containerType)t=e.containerType(e);else switch(e.containerType){case"tab":for(var n=-1,r=0;r<k.tabs.length;r++)if(k.tabs[r].title===e.title){n=r;break}0<=n?(t.before='<uib-tab deselect="tabDeselect($event, $selectedIndex)" select="updateQueryForTab(\''+e.title+'\')" heading="'+e.title+'"',0<n&&(t.before+='active="tabs['+n+'].active"'),t.before+=">",t.after="</uib-tab>"):(t.before="<p>Error! Tab "+e.title+" not found in tab list</p>",t.after="");break;case"tabset":t.before="<uib-tabset>",t.after="</uib-tabset>";break;case"well":t.before='<div class="well">',e.title&&(t.before+="<h4>"+e.title+"</h4>"),t.after="</div>";break;case"well-large":t.before='<div class="well well-lg well-large">',t.after="</div>";break;case"well-small":t.before='<div class="well well-sm well-small">',t.after="</div>";break;case"fieldset":t.before="<fieldset>",e.title&&(t.before+="<legend>"+e.title+"</legend>"),t.after="</fieldset>";break;case void 0:case null:case"":break;default:if(t.before='<div class="'+e.containerType+'">',e.title){var a=e.titleTagOrClass||"h4";a.match(/h[1-6]/)?t.before+="<"+a+">"+e.title+"</"+a+">":t.before+='<p class="'+a+'">'+e.title+"</p>"}t.after="</div>"}return t}function C(e,t){var n=I.fieldChrome(k,e,t),r=n.template;if(e.schema){var a=e.name.replace(/\./g,"_"),o="$_schema_"+a;if(k[o]=e.schema,e.schema)if(e.subkey){e.subkey.path=e.name,k[o+"_subkey"]=e.subkey;for(var i=angular.isArray(e.subkey)?e.subkey:[e.subkey],s=0;s<i.length;s++){var l=$(i[s]);r+=l.before,r+=N(e.schema,null,{subschema:"true",formstyle:t.formstyle,subkey:o+"_subkey",subkeyno:s,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),r+=l.after}S.push(e)}else if(t.subschema)t.suppressNestingWarning||console.log("Attempts at supporting deep nesting have been removed - will hopefully be re-introduced at a later date");else{var c=(t.model||"record")+"."+e.name;if("string"==typeof e.customHeader)r+=e.customHeader;else{var d="";e.unshift&&(d='<button id="unshift_'+e.id+'_btn" class="add-btn btn btn-default btn-xs btn-mini form-btn" ng-click="unshift(\''+e.name+'\',$event)"><i class="'+I.glyphClass()+'-plus"></i> Add</button>'),"bs3"===L.framework()?r+='<div class="row schema-head"><div class="col-sm-offset-3">'+e.label+d+"</div></div>":r+='<div class="schema-head">'+e.label+d+"</div>"}"inline"===e.formStyle&&e.inlineHeaders&&(r+=function(e,t,n,r){for(var a=r?"":'ng-hide="!'.concat(n," || ").concat(n,'.length === 0"'),o='<div class="inline-col-headers" style="display:flex" '.concat(a,">"),i=0,s=e;i<s.length;i++){var l=s[i];F(l,t),o+="<div ",l.showWhen=l.showWhen||l.showwhen,l.showWhen&&("string"==typeof l.showWhen?o+='ng-show="'+l.showWhen+'"':o+='ng-show="'+I.generateNgShow(l.showWhen,n)+'"'),l.id&&"function"==typeof l.id.replace&&(o+=' id="col_label_'+l.id.replace(/\./g,"-")+'"'),o+=' class="inline-col-header"><label for="'.concat(l.id,'" class="control-label">').concat(l.label,"</label></div>")}return o+="</div>"}(e.schema,t,c,"always"===e.inlineHeaders)),r+='<ol class="sub-doc"'+(e.sortable?' ui-sortable="sortableOptions" ng-model="'.concat(c,'"'):"")+">",r+='<li ng-form class="'+("bs2"===L.framework()?"row-fluid ":"")+(e.inlineHeaders?"width-controlled ":"")+w(e.formStyle)+" "+(e.ngClass?"ng-class:"+e.ngClass:"")+'" name="form_'+a+'{{$index}}" class="sub-doc well" id="'+e.id+'List_{{$index}}" ng-repeat="subDoc in '+c+' track by $index"'+(e.filterable?' data-ng-hide="subDoc._hidden"':"")+">","bs2"===L.framework()&&(r+='<div class="row-fluid sub-doc">'),!0===e.noRemove&&!e.customSubDoc||(r+=' <div class="sub-doc-btns">',"string"==typeof e.customSubDoc&&(r+=e.customSubDoc),!0!==e.noRemove&&(r+="<button ".concat(e.noRemove?'ng-hide="'+e.noRemove+'"':"",' name="remove_').concat(e.id,'_btn" ng-click="remove(\'').concat(e.name,"', $index, $event)\""),e.remove?r+=' class="remove-btn btn btn-mini btn-default btn-xs form-btn"><i class="'+I.glyphClass()+'-minus"></i> Remove':(r+=' style="position: relative; z-index: 20;" type="button" class="close pull-right">',"bs3"===L.framework()?r+='<span aria-hidden="true">×</span><span class="sr-only">Close</span>':r+="<span>×</span>"),r+="</button>"),r+="</div> ");var u=void 0;if(e.subDocContainerType){var f=k[e.subDocContainerType]||e.subDocContainerType,p=Object.assign({containerType:f},e.subDocContainerProps);u=$(p)}if(null!=u&&u.before&&(r+=u.before),r+=N(e.schema,!1,{subschema:"true",formstyle:e.formStyle,model:t.model,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),null!=u&&u.after&&(r+=u.after),"bs2"===L.framework()&&(r+=" </div>"),r+="</li>",r+="</ol>",!0!==e.noAdd||"string"==typeof e.customFooter||e.noneIndicator){var m="";"string"==typeof e.customFooter&&(m=e.customFooter);var h="",v="".concat(c,".length == 0");!0===e.noAdd?v='ng-show="'.concat(v,'"'):(h=e.noAdd?'ng-hide="'.concat(e.noAdd,'"'):"",v=e.noAdd?'ng-show="'.concat(e.noAdd," && ").concat(v,'"'):"",m+="<button ".concat(h,' id="add_').concat(e.id,'_btn" class="add-btn btn btn-default btn-xs btn-mini" ng-click="add(\'').concat(e.name,"',$event)\">\n <i class=\"' + formMarkupHelper.glyphClass() + '-plus\"></i> \n Add\n </button>")),e.noneIndicator&&(m+="<span ".concat(v,' class="none_indicator" id="no_').concat(e.id,'_indicator">None</span>'),h="".concat(c,".length > 0"),h=!0===e.noAdd?'ng-hide="'.concat(h,'"'):e.noAdd?'ng-hide="'.concat(e.noAdd," && ").concat(h,'"'):""),""!==m&&("bs3"===L.framework()?r+="<div ".concat(h,' class="row schema-foot"><div class="col-sm-offset-3">').concat(m,"</div></div>"):r+="<div ".concat(h,' class = "schema-foot ">').concat(m,"</div>"))}}}else{var g=I.controlDivClasses(t);if(e.array){if(g.push("fng-array"),"inline"===t.formstyle||"stacked"===t.formstyle)throw new Error("Cannot use arrays in an inline or stacked form");r+=I.label(k,e,"link"!==e.type,t),r+=I.handleArrayInputAndControlDiv(b(e,"link"===e.type?null:"arrayItem.x",!0,e.id+"_{{$index}}",t),g,e,t)}else r+=I.label(k,e,null,t),r+=I.handleInputAndControlDiv(b(e,null,t.required,e.id,t),g)}return r+=n.closeTag}var S=[],D=O.N,F=function(e,t){e.type=e.type||"text",e.id?"number"!=typeof e.id&&!e.id.match(/^[0-9]/)||(e.id="_"+e.id):t&&t.noid?e.id=null:e.id="f_"+e.name.replace(/\./g,"_"),e.label=void 0!==e.label?null===e.label?"":e.label:E("titleCase")(e.name.split(".").slice(-1)[0])},N=function(e,t,n){var r="";if(e)for(var a=0;a<e.length;a++){var o=e[a];n.viewform&&((o=angular.copy(o)).readonly=!0),0===a&&t&&!n.schema.match(/\$_schema_/)&&"object"!=typeof o.add&&(o.add=o.add?" "+o.add+" ":"",-1!==o.add.indexOf("ui-date")||n.noautofocus||o.containerType||(o.add=o.add+"autofocus "));var i=!0;if(o.directive){var s=o.directive,l=o.customHeader||"";l+="<"+s+' model="'+(n.model||"record")+'"';var c=x[0];F(o,n);for(var d=0;d<c.attributes.length;d++){var u=c.attributes[d];switch(u.nodeName){case"class":var f=u.value.replace("ng-scope","");0<f.length&&(l+=' class="'+f+'"');break;case"schema":var p=("bespoke_"+o.name).replace(/\./g,"_");k[p]=angular.copy(o),delete k[p].directive,l+=' schema="'+p+'"';break;default:l+=" "+u.nodeName+'="'+u.value+'"'}}l+=" ";var m=E("camelCase")(o.directive);for(var h in o)if(o.hasOwnProperty(h))switch(h){case"directive":case"schema":break;case"add":switch(typeof o.add){case"string":l+=" "+o.add;break;case"object":for(var v in o.add)o.add.hasOwnProperty(v)&&(l+=" "+v+'="'+o.add[v].toString().replace(/"/g,"&quot;")+'"');break;default:throw new Error("Invalid add property of type "+typeof o.add+" in directive "+o.name)}break;case m:for(var g in o[h])o[h].hasOwnProperty(g)&&(l+=" ".concat(o.directive,"-").concat(g,'="'),"string"==typeof o[h][g]?l+="".concat(o[h][g].replace(/"/g,"&quot;"),'"'):l+="".concat(JSON.stringify(o[h][g]).replace(/"/g,"&quot;"),'"'));break;default:o[h]&&("string"==typeof o[h]?l+=" fng-fld-"+h+'="'+o[h].replace(/"/g,"&quot;")+'"':l+=" fng-fld-"+h+'="'+JSON.stringify(o[h]).replace(/"/g,"&quot;")+'"')}for(h in n)n.hasOwnProperty(h)&&"$"!==h[0]&&void 0!==n[h]&&(l+=" fng-opt-"+h+'="'+n[h].toString().replace(/"/g,"&quot;")+'"');l+='ng-model="'+o.name+'"></'+s+">",r+=l+=o.customFooter||"",i=!1}else if(o.containerType){var b=$(o);switch(o.containerType){case"tab":if(D===O.N){D=O.Forced,r+='<uib-tabset active="activeTabNo">';var y=_.findIndex(k.tabs,function(e){return e.active});k.activeTabNo=0<=y?y:0}r+=b.before,r+=N(o.content,null,n),r+=b.after;break;case"tabset":D=O.Y,r+=b.before,r+=N(o.content,null,n),r+=b.after;break;default:r+=b.before,r+=N(o.content,null,n),r+=b.after}i=!1}else if(n.subkey){var w=angular.isArray(k[n.subkey])?k[n.subkey][0].keyList:k[n.subkey].keyList;_.find(w,function(e,t){return k[n.subkey].path+"."+t===o.name})&&(i=!1)}i&&(F(o,n),r+=C(o,n))}else console.log("Empty array passed to processInstructions"),r="";return r},c=k.$watch(l.schema,function(e){if(e){var t=angular.isArray(e)?e:[e];if(0<t.length&&"function"==typeof c){c(),c=null;var n="",r=l.model||"record",g=k[r];if(g=g||{},!l.subschema&&!l.model||l.forceform){k.topLevelFormName=l.name||"myForm";var a="";for(var o in l)l.hasOwnProperty(o)&&"$"!==o[0]&&-1===["name","formstyle","schema","subschema","model","viewform"].indexOf(o)&&(a+=" "+l.$attr[o]+'="'+l[o]+'"');var i=l.forceform?"ng-form":"form";n="<".concat(i,' name="').concat(k.topLevelFormName,'" class="').concat(w(l.formstyle),'" novalidate ').concat(a,">")}else n="";if(g===k.topLevelFormName)throw new Error("Model and Name must be distinct - they are both "+g);n+=N(t,!0,l),D===O.Forced&&(n+="</uib-tabset>"),n+=l.subschema?"":"</form>",x.replaceWith(d(n)(k));var s=k[l.shared||"sharedData"],b=s?s.modelControllers:[];if((0<S.length||0<b.length)&&!k.phaseWatcher)var y=k.$watch("phase",function(e){if(k.phaseWatcher=!0,"ready"===e&&"function"==typeof y){y(),y=null;for(var t=0;t<b.length;t++)b[t].onAllReady&&b[t].onAllReady(k);for(var n=0;n<S.length;n++){for(var r,a,o=S[n],i=angular.isArray(o.subkey)?o.subkey:[o.subkey],s=o.name.split("."),l=g;1<s.length;)l=l[s.shift()]||{};l=l[s[0]]=l[s[0]]||[];for(var c=0;c<i.length;c++){if(i[c].selectFunc){if(!k[i[c].selectFunc]||"function"!=typeof k[i[c].selectFunc])throw new Error("Subkey function "+i[c].selectFunc+" is not properly set up");r=k[i[c].selectFunc](g,o)}else{if(!i[c].keyList)throw new Error("Invalid subkey setup for "+o.name);var d=i[c].keyList;for(r=0;r<l.length;r++){for(var u in a=!0,d)if(d.hasOwnProperty(u)&&l[r][u]!==d[u]&&(void 0===l[r][u]||!l[r][u].text||l[r][u].text!==d[u])){a=!1;break}if(a)break}if(!a)switch(i[c].onNotFound){case"error":var f="Cannot find matching "+(i[c].title||i[c].path);A(function(){k.showError(f,"Unable to set up form correctly")}),r=-1;break;case"create":default:var p=o.name.split("."),m=p.pop(),h=p.join("."),v=g;h&&(v=v[h]),r=v[m].push(d)-1}}k["$_arrayOffset_"+o.name.replace(/\./g,"_")+"_"+c]=r}}}});u.$broadcast("formInputDone",l.name),f.updateDataDependentDisplay&&g&&0<Object.keys(g).length&&f.updateDataDependentDisplay(g,null,!0,k)}}},!0)}}}t=e.directives||(e.directives={}),r.$inject=["$compile","$rootScope","$filter","$timeout","cssFrameworkService","formGenerator","formMarkupHelper"],(n=O=O||{})[n.Y=0]="Y",n[n.N=1]="N",n[n.Forced=2]="Forced",t.formInput=r}(fng=fng||{}),function(e){(e.directives||(e.directives={})).fngNakedDate=function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,r){r.$parsers.push(function(e){if(e)return e.toString()}),r.$formatters.push(function(e){if(e)return new Date(e)})}}}}(fng=fng||{}),function(e){var t;function n(n,t,r,a){var o,e,i,s;s=!1,i=navigator.userAgent||navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(i)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(i.substr(0,4)))&&(s=!0),e=!s,n.searchPlaceholder=e?"Ctrl + / to Search":"Search",n.handleKey=function(e){if(27===e.keyCode&&n.searchTarget&&0<n.searchTarget.length)n.searchTarget="";else if(0<n.results.length)switch(e.keyCode){case 38:0<n.focus&&n.setFocus(n.focus-1),"function"==typeof e.preventDefault&&e.preventDefault();break;case 40:n.results.length>n.focus+1&&n.setFocus(n.focus+1),"function"==typeof e.preventDefault&&e.preventDefault();break;case 13:null!=n.focus&&r.url(c(n.results[n.focus]))}},n.setFocus=function(e){null!==n.focus&&delete n.results[n.focus].focussed,n.results[e].focussed=!0,n.focus=e},n.resultClass=function(e){var t="search-result";return n.results&&n.results[e].focussed&&(t+=" focus"),t};function l(){n.moreCount=0,n.errorClass="",n.results=[],n.focus=null}function c(e){return e.url?a.html5hash()+e.url.replace("|id|",e.id):a.buildOperationUrl("edit",e.resource,void 0,e.id,e.resourceTab)}n.$watch("searchTarget",function(e){e&&0<e.length?(o=n.testTime||(new Date).valueOf(),t.get("/api/search?q="+e+"&sentAt="+o).then(function(e){var t=e.data;t.timestamps&&t.timestamps.sentAt&&Number.parseInt(t.timestamps.sentAt)!==o||(0<n.searchTarget.length?(n.results=t.results,n.results.forEach(function(e){e.href=a.html5hash()+c(e)}),n.moreCount=t.moreCount,0<t.results.length&&(n.errorClass="",n.setFocus(0)),n.errorClass=0===n.results.length?"error has-error":""):l())},function(e){console.log("Error in searchbox.js : "+e.data+" (status="+e.status+")")})):l()},!0),n.$on("$routeChangeStart",function(){n.searchTarget=""})}t=e.controllers||(e.controllers={}),n.$inject=["$scope","$http","$location","routingService"],t.SearchCtrl=n}(fng=fng||{}),function(t){var e;function n(e){return{restrict:"AE",templateUrl:"search-"+e.framework()+".html",controller:t.controllers.SearchCtrl}}e=t.directives||(t.directives={}),n.$inject=["cssFrameworkService"],e.globalSearch=n}(fng=fng||{}),function(e){(e.filters||(e.filters={})).camelCase=function(){return function(e){return e.replace(/([\:\-\_]+(.))/g,function(e,t,n,r){return r?n.toUpperCase():n})}}}(fng=fng||{}),function(e){(e.filters||(e.filters={})).extractTimestampFromMongoID=function(){return function(e){var t=e.substring(0,8);return new Date(1e3*parseInt(t,16))}}}(fng=fng||{}),function(e){(e.filters||(e.filters={})).titleCase=function(){return function(e,t){return e&&(e=e.replace(/(_|\.)/g," ").replace(/[A-Z]/g," $&").trim().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}),e=t?e.replace(/\s/g,""):e.replace(/\s{2,}/g," ")),e}}}(fng=fng||{}),function(e){(e.services||(e.services={})).addAllService=function(){function r(e,t,r,n){var a,o,i=[],s=[];if(r="addAll"+r,"string"==typeof n)for(a=n.split(" "),o=0;o<a.length;o++)s.push(a[o]);if(!function e(t){for(var n in t)n===r&&i.push(t[n]),"$parent"===n&&e(t[n])}(e),void 0!==t[r]&&"string"==typeof t[r])for(a=t[r].split(" "),o=0;o<a.length;o++)0===a[o].indexOf("class=")?s.push(a[o].substring(6,a[o].length)):i.push(a[o]);return(n=0<s.length?' class="'+s.join(" ")+'" ':" ")+(0<i.length?i.join(" ")+" ":"")}this.getAddAllGroupOptions=function(e,t,n){return r(e,t,"Group",n)},this.getAddAllFieldOptions=function(e,t,n){return r(e,t,"Field",n)},this.getAddAllLabelOptions=function(e,t,n){return r(e,t,"Label",n)},this.addAll=function(e,t,n,r){return this["getAddAll"+t+"Options"](e,r,n)||[]}}}(fng=fng||{}),function(e){(e.services||(e.services={})).cssFrameworkService=function(){var n={framework:"bs3"};return{setOptions:function(e){angular.extend(n,e)},$get:function(){return{framework:function(){return n.framework},setFrameworkForDemoWebsite:function(e){n.framework=e},span:function(e){var t;switch(n.framework){case"bs2":t="span"+Math.floor(e);break;case"bs3":t="col-xs-"+Math.floor(e)}return t},offset:function(e){var t;switch(n.framework){case"bs2":t="offset"+Math.floor(e);break;case"bs3":t="col-lg-offset-"+Math.floor(e)}return t},rowFluid:function(){var e;switch(n.framework){case"bs2":e="row-fluid";break;case"bs3":e="row"}return e}}}}}}(fng=fng||{}),function(e){function t(c){return{loadControllerAndMenu:function(e,t,n,r,a){var o,i={};t+="Ctrl",i.$scope=e.modelControllers[n]=a;var s=a.$parent;s.items=s.items||[];function l(e){angular.forEach(e,function(e){e.divider?r=!0:e[o]&&(r&&(r=!1,s.items.push({divider:!0})),s.items.push(e))})}try{c(t,i),o=s.newRecord?"creating":s.id?"editing":"listing",angular.isObject(i.$scope.contextMenu)&&(l(i.$scope.contextMenu),i.$scope.contextMenuPromise&&i.$scope.contextMenuPromise.then(function(e){return l(e)})),e.modelNameDisplayPromise&&e.modelNameDisplayPromise.then(function(e){s.modelNameDisplay=e})}catch(e){/is not a function, got undefined/.test(e.message)||/\[\$controller:ctrlreg\] The controller with the name/.test(e.message)||console.log("Unable to instantiate "+t+" - "+e.message)}}}}((e.services||(e.services={})).fngModelCtrlService=t).$inject=["$controller"]}(fng=fng||{}),function(e){var t;function n(n,t){var a,r,s={hashPrefix:"",html5Mode:!1,routing:"ngroute",prefix:""},l=["edit","view"],o=[{route:"/analyse/:model/:reportSchemaName",state:"analyse::model::report",templateUrl:"base-analysis.html"},{route:"/analyse/:model",state:"analyse::model",templateUrl:"base-analysis.html"},{route:"/:model/:id/edit",state:"model::edit",templateUrl:"base-edit.html"},{route:"/:model/:id/edit/:tab",state:"model::edit::tab",templateUrl:"base-edit.html"},{route:"/:model/:id/view",state:"model::edit",templateUrl:"base-view.html"},{route:"/:model/:id/view/:tab",state:"model::view::tab",templateUrl:"base-view.html"},{route:"/:model/new",state:"model::new",templateUrl:"base-edit.html"},{route:"/:model",state:"model::list",templateUrl:"base-list.html"},{route:"/:model/viewonly",state:"model::view",templateUrl:"base-list-view.html"},{route:"/:model/:form/:id/edit",state:"model::form::edit",templateUrl:"base-edit.html"},{route:"/:model/:form/:id/edit/:tab",state:"model::form::edit::tab",templateUrl:"base-edit.html"},{route:"/:model/:form/:id/view",state:"model::form::view",templateUrl:"base-view.html"},{route:"/:model/:form/:id/view/:tab",state:"model::form::view::tab",templateUrl:"base-view.html"},{route:"/:model/:form/new",state:"model::form::new",templateUrl:"base-edit.html"},{route:"/:model/:form",state:"model::form::list",templateUrl:"base-list.html"},{route:"/:model/:form/viewonly",state:"model::form::list::view",templateUrl:"base-list-view.html"}],c=null,d={};function i(e){var t=e;return s.templateFolder&&(t="/"!==s.templateFolder[s.templateFolder.length-1]?s.templateFolder+"/"+t:s.templateFolder+t),t}function u(e,n,r){void 0===n&&(n=""),n=n||"",angular.forEach(e,function(e){a.when(n+e.route,angular.extend(e.options||{templateUrl:i(e.templateUrl)},r))}),s.variantsForDemoWebsite&&angular.forEach(s.variantsForDemoWebsite,function(t){angular.forEach(e,function(e){a.when(n+t+e.route,angular.extend(e.options||{templateUrl:i(e.templateUrl)},r))})})}function f(e,t,n){void 0===t&&(t=""),t=t||"",angular.forEach(e,function(e){r.state(e.state,angular.extend(e.options||{url:t+e.route,templateUrl:e.templateUrl},n))})}function p(e,t,n,r,a,o){var i,s=r?"/"+r:"",l=e+"/"+n,c=o?"/"+o:"";switch(t){case"list":i=l+s;break;case"edit":i=l+s+"/"+a+"/edit"+c;break;case"view":i=l+s+"/"+a+"/view"+c;break;case"read":i=l+s+"/"+a+"/read"+c;break;case"new":i=l+s+"/new"+c}return i}function m(e,t){switch(s.routing){case"ngroute":a=n.get("$routeProvider"),e&&u(e),u(t,s.prefix,s.add2fngRoutes);break;case"uirouter":r=n.get("$stateProvider"),e&&f(s.fixedRoutes),f(t,s.prefix,s.add2fngRoutes)}}return{start:function(e){angular.extend(s,e),s.prefix[0]&&"/"!==s.prefix[0]&&(s.prefix="/"+s.prefix),t.html5Mode(s.html5Mode),""!==s.hashPrefix?t.hashPrefix(s.hashPrefix):s.html5Mode||t.hashPrefix(""),m(s.fixedRoutes,o)},addRoutes:function(e,t){m(e,t)},registerAction:function(e){l.push(e)},$get:function(){return{router:function(){return s.routing},prefix:function(){return s.prefix},parsePathFunc:function(){return function(e){if(e!==c){c=e,d={newRecord:!1},0<s.prefix.length&&0===e.indexOf(s.prefix)&&(e=e.slice(s.prefix.length));var t=e.split("/");s.variants&&-1!==s.variants.indexOf(t[1])&&(d.variant=t[1],t.shift());var n=t.length;if("analyse"===t[1])d.analyse=!0,d.modelName=t[2],d.reportSchemaName=4<=n?t[3]:null;else{d.modelName=t[1];var r=[t[n-1],t[n-2]],a=r.indexOf("new"),o=r.indexOf("viewonly"),i=void 0;-1===a&&-1===o?-1!==(i=l.reduce(function(e,t){var n=r.indexOf(t);return-1<n?n:e},-1))&&(n-=2+i,d.id=t[n]):-1!==a?(d.newRecord=!0,n-=1+a):n-=1+o,1!==i&&1!==a||(d.tab=r[0]),2<n&&(d.formName=t[2])}}return d}},html5hash:function(){return s.html5Mode?"":"#"},buildUrl:function(e){var t=s.html5Mode?"":"#";return t+=s.hashPrefix,(t+=s.prefix)[0]&&(t+="/"),t+="/"===e[0]?e.slice(1):e},buildOperationUrl:function(e,t,n,r,a){return p(s.prefix,e,t,n,r,a)},redirectTo:function(){return function(e,t,n,r,a){var o;n.search({}),o="onDelete"===e?s.onDelete?"new"===s.onDelete?p(s.prefix,"new",t.modelName,t.formName,r,a):s.onDelete:p(s.prefix,"list",t.modelName,t.formName,r,a):p(s.prefix,e,t.modelName,t.formName,r,a),n.path(o)}}}}}}t=e.services||(e.services={}),n.$inject=["$injector","$locationProvider"],t.routingService=n}(fng=fng||{}),function(e){function t(e,t,o,n,i){function g(e,t,n,r,a,o,i,s){function l(e,t){var n=angular.copy(e),r=_.find(i.tabs,function(e){return e.title===n});if(!r){if(0===i.tabs.length&&0<i.formSchema.length){i.tabs.push({title:"Main",content:[],active:"Main"===i.tab||!i.tab}),r=i.tabs[0];for(var a=0;a<i.formSchema.length;a++)r.content.push(i.formSchema[a])}r=i.tabs[i.tabs.push({title:n,containerType:"tab",content:[],active:n===i.tab})-1]}r.content.push(t)}for(var c in"function"==typeof i.onSchemaFetch&&i.onSchemaFetch(e,t),t)if(t.hasOwnProperty(c))if("_id"===c)r&&t._id.options&&t._id.options.list&&w(r,t._id.options.list,c);else if(t.hasOwnProperty(c)){var d=t[c],u=d.options||{},f=u.form||{};if(d.schema&&!f.hidden){if(o&&n){var p=[];g("Nested "+c,d.schema,p,null,c+".",!0,i,s);var m=y(c,f,a);m.schema=p,f.tab&&l(f.tab,m),void 0!==f.order?n.splice(f.order,0,m):n.push(m)}}else{if(n&&!f.hidden){var h=y(c,f,a);if(x(h.showIf,h.name,i)&&"options"!==c){var v=b(h,d,u,i,s);v.tab&&l(v.tab,v),void 0!==f.order?n.splice(f.order,0,v):n.push(v)}}r&&u.list&&w(r,u.list,c)}}"function"==typeof i.onSchemaProcessed&&i.onSchemaProcessed(e,"Main "===e.slice(0,5)?i.baseSchema():n),r&&0===r.length&&k(e,r,n,t)}function b(t,e,n,r,a){if(e.caster&&(t.array=!0,e=e.caster,angular.extend(n,e.options),e.options&&e.options.form&&angular.extend(t,e.options.form)),"String"===e.instance)n.enum?(t.type=t.type||"select",t.select2?console.log("support for fng-select2 has been removed in 0.8.3 - please convert to fng-ui-select"):(t.options=i.suffixCleanId(t,"Options"),r[t.options]=n.enum)):(t.type||(t.type=-1!==t.name.toLowerCase().indexOf("password")?"password":"text"),n.match&&(t.add='pattern="'+n.match+'" '+(t.add||"")));else if("ObjectID"===e.instance)t.ref=n.ref,t.link&&(t.link.linkOnly?(t.type="link",t.linktext=t.link.text):t.link.label?t.linklabel=!0:console.log("Unsupported link setup"),t.form=t.link.form,t.linktab=t.link.linktab,delete t.link),"link"!==t.type&&(t.type="select",t.select2||n.form&&n.form.select2?console.log("support for fng-select2 has been removed in 0.8.3 - please convert to fng-ui-select"):t.directive&&(t.noLookup||t[o("camelCase")(t.directive)]&&t[o("camelCase")(t.directive)].fngAjax)||function(){if(t.options=i.suffixCleanId(t,"Options"),t.ids=i.suffixCleanId(t,"_ids"),!t.hidden)if(n.ref)i.setUpLookupOptions(n.ref,t,r,a,g);else if(n.lookupListRef)i.setUpLookupListOptions(n.lookupListRef,t,r,a),t.lookupListRef=n.lookupListRef;else if(n.internalRef)i.handleInternalLookup(r,t,n.internalRef),t.internalRef=n.internalRef;else if(!n.customLookupOptions)throw new Error("No supported select lookup type found in ".concat(t.name))}());else if("Date"===e.instance){if(!t.type)if(t.intType="date",t.readonly)t.type="text";else if(t.directive)t.type="text";else try{t.add=t.add||"",angular.module("ui.date").requires,t.type="text",t.add+=" ui-date ui-date-format "}catch(e){t.type="date",t.add+=' fng-naked-date="x" '}}else if("boolean"===e.instance.toLowerCase())t.type=t.type||"checkbox";else{if("Number"!==e.instance)throw new Error("Field "+t.name+" is of unsupported type "+e.instance);t.type=t.type||"number",void 0!==n.min&&(t.add='min="'+n.min+'" '+(t.add||"")),void 0!==n.max&&(t.add='max="'+n.max+'" '+(t.add||"")),t.step&&(t.add='step="'+t.step+'" '+(t.add||""))}return n.required&&(t.required=!0),n.readonly&&(t.readonly=!0),void 0!==e.defaultValue?t.defaultValue=e.defaultValue:e.options&&void 0!==e.options.default&&console.log("No support for default with no value, yet"),t}function c(e,t,n){for(var r=e.split("."),a=n||t.record,o=0,i=r.length;o<i;o++)a[r[o]]||(a[r[o]]=o===i-1?[]:{}),a=a[r[o]];return a}function v(e,r){function t(e){var t=e;if("string"==typeof e&&"$"===e.slice(0,1)){var n=e.split(".");switch(n.length){case 1:t=i.getListData(r,e.slice(1));break;case 2:t=i.getListData(r,n[1]);break;default:throw new Error("Unsupported showIf format")}}return t}var n,a=t(e.lhs),o=t(e.rhs);switch(e.comp){case"eq":n=a===o;break;case"ne":n=a!==o;break;default:throw new Error("Unsupported comparator "+e.comp)}return n}var y=function(e,t,n){return t.name=n+e,t},w=function(e,t,n){"object"==typeof t?(t.name=n,e.push(t)):e.push({name:n})},k=function(e,t,n,r){if(n){for(var a=0,o=n.length;a<o;a++)if("text"===n[a].type){t.push({name:n[a].name});break}0===t.length&&0!==n.length&&t.push({name:n[0].name})}if(0===t.length){for(var i in r)if("_id"!==i&&r.hasOwnProperty(i)){t.push({name:i});break}if(0===t.length)throw new Error("Unable to generate a title for "+e)}},x=function(e,r,a){var o=0;function t(e){if("string"==typeof e&&"$"===e.slice(0,1)){var t=e.slice(1),n=a.dataDependencies[t]||[];n.push(r),a.dataDependencies[t]=n,o+=1}}var n=!0;return e&&(t(e.lhs),t(e.rhs),0!==o||v(e,void 0)||(n=!1)),n};return{generateEditUrl:function(e,t){return n.buildUrl(t.modelName+"/"+(t.formName?t.formName+"/":"")+e._id+"/edit")},generateViewUrl:function(e,t){return n.buildUrl(t.modelName+"/"+(t.formName?t.formName+"/":"")+e._id+"/view")},generateNewUrl:function(e){return n.buildUrl(e.modelName+"/"+(e.formName?e.formName+"/":"")+"new")},handleFieldType:b,handleSchema:g,updateDataDependentDisplay:function(e,t,n,r){var a,o,i,s,l,c;for(var d in r.dataDependencies)if(r.dataDependencies.hasOwnProperty(d)){var u=d.split(".");if(1===u.length){if(n||!t||e[d]!==t[d])for(a=r.dataDependencies[d],o=0;o<a.length;o+=1){var f=a[o];for(i=0;i<r.formSchema.length;i+=1)r.formSchema[i].name===f&&(l=angular.element(document.querySelector("#cg_"+r.formSchema[i].id)),v(r.formSchema[i].showIf,e)?l.removeClass("ng-hide"):l.addClass("ng-hide"))}}else{if(2!==u.length)throw new Error("You can only go down one level of subdocument with showIf");if(void 0===c&&(c=!0),e[u[0]])for(s=0;s<e[u[0]].length;s++)if(n||!t||!t[u[0]]||!t[u[0]][s]||e[u[0]][s][u[1]]!==t[u[0]][s][u[1]])for(a=r.dataDependencies[d],o=0;o<a.length;o+=1){var p=a[o].split(".");if(2!==p.length)throw new Error("Conditional display must control dependent fields at same level ");for(i=0;i<r.formSchema.length;i+=1)if(r.formSchema[i].name===p[0])for(var m=r.formSchema[i].schema,h=0;h<m.length;h++)m[h].name===a[o]&&(0===(l=angular.element(document.querySelector("#f_"+p[0]+"List_"+s+" #cg_f_"+a[o].replace(".","_")))).length?l=angular.element(document.querySelector("#f_elements-"+s+"-"+p[1])):c=!1,0<l.length&&(v(r.formSchema[i].schema[h].showIf,e[u[0]][s])?l.show():l.hide()))}}}return c},add:function(t,e,n,r){var a;if(e.target.offsetParent){var o=c(t,n,r),i=n.formSchema.find(function(e){return e.name===t}),s=i?i.schema:null,l=s?n.setDefaults(s,t+"."):{};"function"==typeof(null===(a=n.dataEventFunctions)||void 0===a?void 0:a.onInitialiseNewSubDoc)&&n.dataEventFunctions.onInitialiseNewSubDoc(t,s,l),o.push(l),n.setFormDirty(e)}},unshift:function(e,t,n,r){c(e,n,r).unshift({}),n.setFormDirty(t)},remove:function(t,e,n,r,a){var o,i=c(t,r,a);if("function"==typeof r.dataEventFunctions.onDeleteSubDoc){var s=r.formSchema.find(function(e){return e.name===t}),l=s?s.schema:null;o=r.dataEventFunctions.onDeleteSubDoc(t,l,i,e)}o?r.showError(o):(i.splice(e,1),r.setFormDirty(n))},hasError:function(e,t,n,r){var a=!1;if(r){var o=r[r.topLevelFormName];if("null"!==e&&(o=o[e.replace("$index",n)]),o){var i=o[t];i&&i.$invalid&&!i.$$attr.readonly&&(i.$dirty?a=!0:angular.forEach(i.$validators,function(e,t){"required"!==t&&i.$error[t]&&(a=!0)}))}}else console.log("hasError called with no scope! ",e,t,n);return a},decorateScope:function(a,o,n,e){a.record=e.record,a.phase="init",a.disableFunctions=e.disableFunctions,a.dataEventFunctions=e.dataEventFunctions,a.topLevelFormName=void 0,a.formSchema=[],a.tabs=[],a.listSchema=[],a.recordList=[],a.dataDependencies={},a.internalLookups=[],a.listLookups=[],a.conversions={},a.pageSize=60,a.pagesLoaded=0,(e.baseScope=a).generateEditUrl=function(e){return o.generateEditUrl(e,a)},a.generateViewUrl=function(e){return o.generateViewUrl(e,a)},a.generateNewUrl=function(){return o.generateNewUrl(a)},a.scrollTheList=function(){return n.scrollTheList(a)},a.getListData=function(e,t){return n.getListData(e,t,a.listSchema,a)},a.setPristine=function(e){e&&a.dismissError(),a[a.topLevelFormName]&&a[a.topLevelFormName].$setPristine()},a.skipCols=function(e){return 0<e?"col-md-offset-3":""},a.setFormDirty=function(e){e?angular.element(e.target).inheritedData("$formController").$setDirty():console.log("setFormDirty called without an event (fine in a unit test)")},a.add=function(e,t,n){return o.add(e,t,a,n)},a.hasError=function(e,t,n){return o.hasError(e,t,n,a)},a.unshift=function(e,t,n){return o.unshift(e,t,a,n)},a.remove=function(e,t,n,r){return o.remove(e,t,n,a,r)},a.baseSchema=function(){return a.tabs.length?a.tabs:a.formSchema}}}}((e.services||(e.services={})).formGenerator=t).$inject=["$location","$timeout","$filter","routingService","recordHandler"]}(fng=fng||{}),function(e){var t;function n(f,p,m,a){function d(e,t){var n=["vertical","inline"];return t||n.push("stacked"),!e||"undefined"===e||!n.includes(e)}function s(){return"bs2"===f.framework()?"icon":"glyphicon glyphicon"}return{isHorizontalStyle:d,fieldChrome:function(e,t,n){var r=t.classes||"",a="",o="",i="";if(t.showWhen=t.showWhen||t.showwhen,t.showWhen&&("string"==typeof t.showWhen?i+='ng-show="'+t.showWhen+'"':i+='ng-show="'+function(e,a){function t(e){var t=e;if("string"==typeof e)if("$"===e.slice(0,1)){t=(a||"record")+".";var n=e.slice(1).split(".");if(1<n.length){var r=n.pop();t+=n.join(".")+"[$index]."+r}else t+=e.slice(1)}else t="'"+e+"'";return t}var n=["eq","ne","gt","gte","lt","lte"].indexOf(e.comp);if(-1===n)throw new Error("Invalid comparison in showWhen");return t(e.lhs)+["===","!==",">",">=","<","<="][n]+t(e.rhs)}(t.showWhen,n.model)+'"'),t.id&&"function"==typeof t.id.replace&&(i+=' id="cg_'+t.id.replace(/\./g,"-")+'"'),"bs3"===f.framework()){var s;r+=" form-group","vertical"===n.formstyle&&"block-level"!==t.size&&(a+='<div class="row">',r+=" col-sm-"+p.sizeAsNumber(t.size),o+="</div>");var l=null,c=t.name.split(".");s=n&&void 0!==n.subkeyno?n.subschemaroot.replace(/\./g,"-")+"-subkey"+n.subkeyno+"-"+c[c.length-1]:n.subschema?(l="form_"+c.slice(0,-1).join("_")+"$index",t.name.replace(/\./g,"-")):"f_"+t.name.replace(/\./g,"_"),a+="<div"+m.addAll(e,"Group",r,n)+" ng-class=\"{'has-error': hasError('"+l+"','"+s+"', $index)}\"",o+="</div>"}else o=d(n.formstyle,!0)?(a+="<div"+m.addAll(e,"Group","control-group",n),"</div>"):(a+="<span ","</span>");return{template:a+=(i||"")+">",closeTag:o}},label:function(e,t,n,r){var a="";if("bs3"===f.framework()||!["inline","stacked"].includes(r.formstyle)&&""!==t.label||n){a="<label";var o="control-label";if(d(r.formstyle,!1)?(t.linklabel||(a+=' for="'+t.id+'"'),void 0!==t.labelDefaultClass?o+=" "+t.labelDefaultClass:"bs3"===f.framework()&&(o+=" col-sm-3")):["inline","stacked"].includes(r.formstyle)&&(a+=' for="'+t.id+'"',o+=" sr-only"),a+=m.addAll(e,"Label",null,r)+' class="'+o+'">'+t.label,n&&(a+=' <i id="add_'+t.id+'" ng-click="add(\''+t.name+'\',$event)" class="'+s()+'-plus-sign"></i>'),a+="</label>",t.linklabel){var i='<fng-link fld="'+t.name+'" ref="'+t.ref+'" text="'+escape(a)+'"';t.form&&(i+=' form="'+t.form+'"'),t.linktab&&(i+=' linktab="'+t.linktab+'"'),a=i+="></fng-link>"}}return a},glyphClass:s,allInputsVars:function(e,t,n,r,a,o){var i,s=t.placeHolder,l="",c="",d="",u="";return"bs3"===f.framework()?(l=-1===["horizontal","vertical","inline"].indexOf(n.formstyle)?" input-sm":"",c="col-sm-"+p.sizeAsNumber(t.size),u=" form-control"):d=t.size?" input-"+t.size:"",["inline","stacked"].includes(n.formstyle)&&(s=s||t.label),i='data-ng-model="'+r+'"'+(a?' id="'+a+'" name="'+a+'" ':' name="'+o+'" '),i+=s?'placeholder="'+s+'" ':"",t.popup&&(i+='title="'+t.popup+'" '),t.ariaLabel&&(i+='aria-label="'+t.ariaLabel+'" '),{common:i+=m.addAll(e,"Field",null,n),sizeClassBS3:c,sizeClassBS2:d,compactClass:l,formControl:u}},inputChrome:function(e,t,n,r){"bs3"===f.framework()&&d(n.formstyle,!0)&&"checkbox"!==t.type&&(e='<div class="bs3-input '+r.sizeClassBS3+'">'+e+"</div>");var a=(t.helpInline||"")+(t.helpinline||"");if(0<a.length){var o="bs2"===f.framework()?{el:"span",cl:"help-inline"}:{el:"div",cl:"help-block"};e+="<".concat(o.el,' class="').concat(o.cl,'">').concat(a,"</").concat(o.el,">")}return n.noid||(e+='<div ng-if="'.concat(n.name||"myForm","['").concat(t.id,'\'].$dirty" class="help-block">')+' <div ng-messages="'.concat(n.name||"myForm","['").concat(t.id,"'].$error\">")+' <div ng-messages-include="error-messages.html"> </div> </div></div>'),t.help&&(e+='<div class="help-block">'+t.help+"</div>"),e},generateSimpleInput:function(e,t,n){var r="<input "+e+'type="'+t.type+'" ';return t.label||t.ariaLabel?n.subschema&&(r+='aria-label="'.concat(t.label?a("titleCase")(n.subschemaroot)+" "+t.label:t.popup||t.name.replace(/\./g," "),'" ')):r+='aria-label="'.concat(t.name.replace(/\./g," "),'" '),"inline"!==n.formstyle||"bs2"!==f.framework()||t.size||(r+='class="input-small"'),r+=" />"},controlDivClasses:function(e){var t=[];return d(e.formstyle,!1)&&t.push("bs2"===f.framework()?"controls":"col-sm-9"),t},handleInputAndControlDiv:function(e,t){return 0<t.length&&(e='<div class="'+t.join(" ")+'">'+e+"</div>"),e},handleArrayInputAndControlDiv:function(e,t,n,r){var a="<div ";return"bs3"===f.framework()&&(a+='ng-class="skipCols($index)" '),a+='class="'+t.join(" ")+'" id="'+n.id+'List" ',a+='ng-repeat="arrayItem in '+(r.model||"record")+"."+n.name+' track by $index">',a+=e,"link"!==n.type&&(a+="<i ng-click=\"remove('"+n.name+'\',$index,$event)" id="remove_'+n.id+'_{{$index}}" class="'+s()+'-minus-sign"></i>'),a+="</div>"},addTextInputMarkup:function(e,t,n){var r="",a=e.formControl.trim()+e.compactClass+e.sizeClassBS2+(t.class?" "+t.class:"");return 0!==a.length&&(r+='class="'+a+'"'),t.add&&(r+=" "+t.add+" "),r+=n,t.readonly?r+=" ".concat("boolean"==typeof t.readOnly?"readonly":'ng-readonly="'+t.readonly+'"'," "):r+=" ",r}}}t=e.services||(e.services={}),n.$inject=["cssFrameworkService","inputSizeHelper","addAllService","$filter"],t.formMarkupHelper=n}(fng=fng||{}),function(e){(e.services||(e.services={})).inputSizeHelper=function(){var t=[1,2,4,6,8,10,12],n=["mini","small","medium","large","xlarge","xxlarge","block-level"];return{sizeMapping:t,sizeDescriptions:n,defaultSizeOffset:2,sizeAsNumber:function(e){return t[e?n.indexOf(e):2]}}}}(fng=fng||{}),function(e){var t;function n(b){return{extractFromAttr:function(e,t){function n(e){var t=e.replace(/&quot;/g,'"');return"true"===t?t=!0:"false"===t?t=!1:!isNaN(parseFloat(t))&&isFinite(t)&&(t=parseFloat(t)),t}var r={},a={formStyle:e.formstyle},o={},i=t?t.length:0,s=null==t?void 0:t.toLowerCase();for(var l in e)if(e.hasOwnProperty(l)){var c=l.toLowerCase();"fngfld"===c.slice(0,6)?r[c.slice(6)]=n(e[l]):"fngopt"===c.slice(0,6)?a[c.slice(6)]=n(e[l]):t&&c.slice(0,i)===s&&(o[_.kebabCase(l.slice(i))]=n(e[l]))}return{info:r,options:a,directiveOptions:o}},buildInputMarkup:function(e,t,n,r,a,o,i){var s,l,c,d=b.fieldChrome(e,n,r,' id="cg_'+n.id+'"'),u=b.controlDivClasses(r),f=d.template+b.label(e,n,a,r);if(c=a?(s="arrayItem"+(o?".x":""),l=n.id+"_{{$index}}",n.name+"_{{$index}}"):(s=t+"."+n.name,l=n.id,n.name),r.subschema&&-1!==n.name.indexOf(".")){var p=t+".",m=n.name,h=r.subschemaroot,v=m.slice(h.length+1);s=p,r.index?l="f_"+(s+=h+"["+r.index+"]."+v).slice(p.length).replace(/(\.|\[|\]\.)/g,"-"):(s+=h,r.subkey?(l=s.slice(p.length).replace(/\./g,"-")+"-subkey"+r.subkeyno+"-"+v,s+="[$_arrayOffset_"+h.replace(/\./g,"_")+"_"+r.subkeyno+"]."+v):(s+="[$index]."+v,l=null,c=m.replace(/\./g,"-")))}var g=b.allInputsVars(e,n,r,s,l,c);return g.modelString=s,f+=b["handle"+(a?"Array":"")+"InputAndControlDiv"](b.inputChrome(i(g),n,r,g),u,n,r),f+=d.closeTag},findIdInSchemaAndFlagNeedX:function e(t,n){for(var r=!1,a=0;a<t.length;a++){var o=t[a];if(o.id===n){r=o.needsX=!0;break}if(o.schema&&e(o.schema,n)){r=!0;break}}return r}}}t=e.services||(e.services={}),n.$inject=["formMarkupHelper"],t.pluginHelper=n}(fng=fng||{}),function(I){var e;function t(c,d,a,u,o,i,m,e){var s=function(e){return void 0===e&&(e=function(e){return Math.floor(e).toString(16)}),e(Date.now()/1e3)+" ".repeat(16).replace(/./g,function(){return e(16*Math.random())})};function f(e){if(-1===["cancel","backdrop click","escape key press"].indexOf(e))throw e}function b(e,t){return(e.id||"f_"+e.name).replace(/\./g,"_")+t}function l(e,t,n,r){void 0===r&&(r=!1);for(var a=t.split("."),o=a.length-1,i=e,s=0;s<o;s++){if(!i)throw new Error("walkTree failed: Object = ".concat(e,", fieldname = ").concat(t,", i = ").concat(s));if(i=angular.isArray(i)?_.map(i,function(e){return e[a[s]]}):(r&&!i[a[s]]&&(i[a[s]]={}),i[a[s]]),angular.isArray(i)&&void 0!==n)if(n.scope&&"function"==typeof n.scope)i=i[n.scope().$index];else{if("number"!=typeof n)throw new Error("Unsupported element type in walkTree "+t);i=i[n]}if(!i)break}return{lastObject:i,key:i?a[o]:void 0}}function y(e,t,n,r){var a=l(e,t,n,!!r);if(a.lastObject&&a.key)if(r)if(angular.isArray(a.lastObject))for(var o=0;o<a.lastObject.length;o++)a.lastObject[o][a.key]=r[o];else a.lastObject[a.key]=r;else delete a.lastObject[a.key]}function h(t,n,e,r){if(void 0===r&&(r=!1),!n.topLevelFormName||n[n.topLevelFormName]&&(r||n[n.topLevelFormName].$pristine)){x(t.name,e.master,function(e){return"object"==typeof e&&e.id?e:S(t,e,n[b(t,"Options")],n[b(t,"_ids")])});var a=w(e.master,t.name);a&&y(n.record,t.name,void 0,a)}}var w=function(e,t,n){var r,a=l(e,t,n);return a.lastObject&&a.key&&(r=angular.isArray(a.lastObject)?_.map(a.lastObject,function(e){return e[a.key]}):a.lastObject[a.key]),r};function k(e,t,n,r){void 0===n&&(n=null);var a=w(e,t)||"";if(a&&n){var o=_.find(n,function(e){return e.name===t});if(o)switch(o.params){case void 0:break;case"timestamp":var i=a.toString().substring(0,8),s=new Date(1e3*parseInt(i,16));a=s.toLocaleDateString()+" "+s.toLocaleTimeString();break;default:a=r.dataEventFunctions[o.params](e)}}return a}function x(e,t,n){var r,a,o=(r=e.split("."),a=[r[0]],1<r.length&&a.push(r.slice(1).join(".")),a);if(1<o.length)!function(e,t,n){if(void 0!==t)if(angular.isArray(t))for(var r=0;r<t.length;r++)x(e,t[r],n);else x(e,t,n)}(o[1],t[o[0]],n);else if(t[o[0]]){var i=t[o[0]];if(angular.isArray(i))for(var s=i.length-1;0<=s;s--){var l=typeof i[s];("undefined"==l||"object"==l&&0===Object.keys(i[s]).length)&&i.splice(s,1)}t[o[0]]=n(i)}}function v(e,t,n,r,a){var o="string"==typeof t?e[t]:t,i="string"==typeof n?e[n]:n;o.length=0,i.length=0,r&&0<r.length&&r.forEach(function(e){var t=e[a];t&&0<t.length&&(o.push(t),e._id||(e._id=s()),i.push(e._id))})}var $=function(e){var t=!1;return e.needsX?t=!0:e.directive||("text"===e.type?t=!0:"select"!==e.type||e.ids||(t=!0)),t};function C(e,t,n){var r=e.conversions;return n&&(r=w(r,n)||{}),r[t]}var g=function(e,t,n,r,a,o,i){o=o||t;for(var s=0;s<e.length;s++){var l=e[s],c=l.name.slice(n);c.length||(c=l.name.split(".").pop());var d=w(t,c);if("date"===l.intType&&"string"==typeof d&&y(t,c,null,new Date(d)),l.schema){if(d)for(var u=0;u<d.length;u++)d[u]=g(l.schema,d[u],1+c.length,r,c,o,u)}else{l.internalRef&&v(r,l.options,l.ids,o[l.internalRef.property],l.internalRef.value);var f=k(t,c,null,r);if(l.array&&$(l)&&f&&!(0<f.length&&f[0].x))for(var p=0;p<f.length;p++)f[p]={x:f[p]};var m=r[b(l,"_ids")],h=void 0;if(d&&m&&0<m.length){if(-1!==c.indexOf("."))throw new Error("Trying to directly assign to a nested field 332");!d.toString().match(/^[a-f0-9]{24}$/)||l.internalRef&&l.internalRef.noConvert||(t[c]=S(l,d,r[b(l,"Options")],m))}else l.select2?(console.log("fng-select2 is deprecated - use fng-ui-select instead"),l.select2):d&&(h=C(r,c,a))&&h.fngajax&&!h.noconvert&&h.fngajax(d,l,function(e,t){y(o,e.name,i,t),N(angular.element("#"+e.id),function(){y(r.record,e.name,i,t)})})}}return t};function S(e,t,n,r){if(e.array||angular.isArray(t)){for(var a=[],o=e.array&&(!e.directive||$(e)),i=0;i<t.length;i++){var s=t[i];s&&s.x&&(s=s.x);var l=p(s,r,n,e.name);o&&(l={x:l}),a.push(l)}return a}return e.select2?{id:t,text:p(t,r,n,e.name)}:p(t,r,n,e.name)}function D(e,t,n,r){var a=_.isObject(e)?e.x||e.text:e;if(a&&a.match(/^[0-9a-f]{24}$/))return a;var o=t.indexOf(a);if(-1===o)throw new Error("convertListValueToId: Invalid data - value "+a+" not found in "+t+" processing "+r);return n[o]}function F(e,t,n){n.master=g(t.formSchema,e,0,t),t.phase="ready",t.cancel()}var N=function(e,t){var n=e.inheritedData("$ngModelController"),r=n&&n.$pristine;r&&(n.$pristine=!1),t(),r&&(n.$pristine=!0)},p=function(e,t,n,r){"object"==typeof e&&(e=e.id);var a=t.indexOf(e);if(-1===a&&-1===(a=n.indexOf(e)))throw new Error("convertIdToListValue: Invalid data - id "+e+" not found in "+t+" processing "+r);return n[a]};function E(t,n,r,e,a){if(a&&0<a.length&&a.length===e.length&&n[r]){var o=a.findIndex(function(e){return e[t.value]===n[r]});if(-1<o){var i=e[o][t.value];i&&(n[r]=i)}}}function A(e,f,a,t,p){var n=!f.id&&!f.newRecord;function o(o,u){f.internalLookups.forEach(function(n){var r=o[n.ref.property],a=u[n.ref.property];v(f,n.lookupOptions,n.lookupIds,r,n.ref.value),(r&&0<r.length||a&&0<a.length)&&n.handlers.forEach(function(t){if(t.possibleArray){var e=w(f.record,t.possibleArray,null);e&&0<e.length&&e.forEach(function(e){return E(n.ref,e,t.lastPart,r,a)})}else angular.isArray(f.record[t.lastPart])?f.record[t.lastPart].forEach(function(e){E(n.ref,e,"x",r,a)}):E(n.ref,f.record,t.lastPart,r,a)})}),f.listLookups.forEach(function(c){function e(e,t){var n=e[t];return n&&n.id&&(n=n.id),n}function d(e){y(f.record,e.name)}var t=c.ref.id.slice(1);if(t.includes("."))throw new Error("No support for nested list lookups yet - ".concat(JSON.stringify(c.ref)));var n=e(o,t),r=e(u,t);n!==r&&(n?(r&&c.handlers.forEach(function(t){t.oldValue=w(f.record,t.formInstructions.name),angular.isArray(t.oldValue)?t.oldId=t.oldValue.map(function(e){return f[t.formInstructions.ids][f[t.formInstructions.options].indexOf(e)]}):t.oldId=f[t.formInstructions.ids][f[t.formInstructions.options].indexOf(t.oldValue)]}),m.readRecord(c.ref.collection,n).then(function(l){c.handlers.forEach(function(r){var a=f[r.formInstructions.options];a.length=0;var o=f[r.formInstructions.ids];o.length=0;for(var e=l.data[c.ref.property]||[],t=0;t<e.length;t++){var n=e[t][c.ref.value],i=_.sortedIndex(a,n);a[i]===n&&(n=n+" ("+e[t]._id+")",i=_.sortedIndex(a,n)),a.splice(i,0,n),o.splice(i,0,e[t]._id)}if(0===Object.keys(u).length)h(r.formInstructions,f,p,!0);else if(r.oldId)if(angular.isArray(r.oldId))r.oldId.forEach(function(e,t){var n=o.indexOf(e);y(f.record,r.formInstructions.name,t,-1===n?void 0:a[n])});else{var s=o.indexOf(r.oldId);-1!==s?y(f.record,r.formInstructions.name,void 0,a[s]):d(r.formInstructions)}else d(r.formInstructions)})})):c.handlers.forEach(function(e){f[e.formInstructions.options].length=0,f[e.formInstructions.ids].length=0,d(e.formInstructions)}))})}function r(){f.phase="ready",f.cancel(),o(f.record,{})}if(a.handleSchema("Main "+f.modelName,e,n?null:f.formSchema,f.listSchema,"",!0,f,p),n)p.allowLocationChange=!0;else{var i=!0;if(f.newRecord||(f.dropConversionWatcher=f.$watchCollection("conversions",function(e,t){e!==t&&f.originalData&&F(f.originalData,f,p)})),f.$watch("record",function(e,t){if(e!==t&&(0<Object.keys(t).length&&f.dropConversionWatcher&&(f.dropConversionWatcher(),f.dropConversionWatcher=null),i=a.updateDataDependentDisplay(e,t,i,f),o(e,t),I.formsAngular.title)){var n=I.formsAngular.title.prefix||"";if(f.editFormHeader)n+=f.editFormHeader();else for(var r in f.listSchema)f.listSchema.hasOwnProperty(r)&&(n+=f.getListData(f.record,f.listSchema[r].name)+" ");n=n.trimEnd()+(I.formsAngular.title.suffix||""),d.document.title=n}},!0),f.id)"function"==typeof f.dataEventFunctions.onBeforeRead?f.dataEventFunctions.onBeforeRead(f.id,function(e){e?f.showError(e):t.readRecord(f,p)}):t.readRecord(f,p);else{p.allowLocationChange=!1,p.master=f.setDefaults(f.formSchema);var s=f.initialiseNewRecord||c.$$search.r;if(s)try{Object.assign(p.master,JSON.parse(s)),f.newRecordsStartPristine||f.$on("fngCancel",function(){u(function(){f[f.topLevelFormName]&&f[f.topLevelFormName].$setDirty()},1e3)})}catch(e){console.log("Error parsing specified record : "+e.message)}"function"==typeof f.dataEventFunctions.onInitialiseNewRecord&&(console.log("onInitialiseNewRecord is deprecated - use the async version - onNewRecordInit(data,cb)"),f.dataEventFunctions.onInitialiseNewRecord(p.master)),"function"==typeof f.dataEventFunctions.onNewRecordInit?f.dataEventFunctions.onNewRecordInit(p.master,function(e){e?f.showError(e):r()}):r()}}}function t(r){return function(e){if(-1!==[200,400].indexOf(e.status)){var t="";if(e.data&&e.data.errors)for(var n in e.data.errors)if(e.data.errors.hasOwnProperty(n)){switch(t+="<li><b>"+a("titleCase")(n)+": </b> ",e.data.errors[n].type){case"enum":t+="You need to select from the list of values";break;default:t+=e.data.errors[n].message}t+="</li>"}t=0<t.length?(e.data.message||e.data._message)+"<br /><ul>"+t+"</ul>":e.data.message||e.data._message||e.data.err||"Error! Sorry - No further details available.",r.showError(t)}else r.showError(e.status+" "+JSON.stringify(e.data))}}function L(e,t,n){n.allowLocationChange=!1,t.phase="reading","function"==typeof t.dataEventFunctions.onAfterRead&&t.dataEventFunctions.onAfterRead(e),t.originalData=e,F(e,t,n)}function r(e,t,n,r){var a=t.name.split("."),o=r.find(function(e){return e.ref.property===n.property&&e.ref.value===n.value}),i={formInstructions:t,lastPart:a.pop(),possibleArray:a.join(".")};o||(o={ref:n,lookupOptions:[],lookupIds:[],handlers:[]},r.push(o)),o.handlers.push(i),e[t.options]=o.lookupOptions,e[t.ids]=o.lookupIds}return{readRecord:function(t,n){t.readingRecord=m.readRecord(t.modelName,t.id),t.readingRecord.then(function(e){L(angular.copy(e.data),t,n)},function(e){404===e.status?c.path("/404"):t.handleHttpError(e)})},scrollTheList:function(n){var r=n.pagesLoaded;m.getPagedAndFilteredList(n.modelName,{aggregate:c.$$search.a,find:c.$$search.f,limit:n.pageSize,skip:r*n.pageSize,order:c.$$search.o}).then(function(e){var t=e.data;angular.isArray(t)?r===n.pagesLoaded?(n.pagesLoaded++,n.recordList=n.recordList.concat(t)):console.log("DEBUG: infinite scroll component asked for a page twice - the model was "+n.modelName):n.showError(t,"Invalid query")},n.handleHttpError)},deleteRecord:function(e,t,n){t.phase="deleting",m.deleteRecord(t.modelName,e).then(function(){"function"==typeof t.dataEventFunctions.onAfterDelete&&t.dataEventFunctions.onAfterDelete(n.master),o.redirectTo()("onDelete",t,c)},function(e){404===e.status?o.redirectTo()("onDelete",t,c):t.showError("".concat(e.statusText," (").concat(e.status,") while deleting record<br />").concat(e.data),"Error deleting record")})},updateDocument:function(e,n,r,a){r.phase="updating",m.updateRecord(r.modelName,r.id,e).then(function(e){var t=e.data;!1!==t.success?("function"==typeof r.dataEventFunctions.onAfterUpdate&&r.dataEventFunctions.onAfterUpdate(t,a.master),n.redirect?(n.allowChange&&(a.allowLocationChange=!0),d.location=n.redirect):(L(t,r,a),r.setPristine(!1))):r.showError(t)},r.handleHttpError)},createNew:function(e,n,r,a){m.createRecord(r.modelName,e).then(function(e){var t=e.data;!1!==t.success?(a.allowLocationChange=!0,"function"==typeof r.dataEventFunctions.onAfterCreate&&r.dataEventFunctions.onAfterCreate(t),n.redirect?d.location=n.redirect:o.redirectTo()("edit",r,c,t._id)):r.showError(t)},r.handleHttpError)},getListData:k,suffixCleanId:b,setData:y,setUpLookupOptions:function(n,l,c,d,r){var u=c[l.options]=[],f=c[l.ids]=[];e.getSchema(n).then(function(e){var t=e.data,s=[];r("Lookup "+n,t,null,s,"",!1,c,d),(void 0!==l.filter&&l.filter?m.getPagedAndFilteredList(n,l.filter):m.getAll(n)).then(function(e){var t=angular.copy(e.data);if(t){for(var n=0;n<t.length;n++){for(var r="",a=0;a<s.length;a++){var o=t[n][s[a].name];r+=o?o+" ":""}r=r.trim();var i=_.sortedIndex(u,r);u[i]===r&&(r=r+" ("+t[n]._id+")",i=_.sortedIndex(u,r)),u.splice(i,0,r),f.splice(i,0,t[n]._id)}c.readingRecord&&c.readingRecord.then(function(){h(l,c,d)})}})})},setUpLookupListOptions:function(o,i,s,l){var c=s[i.options]=[],d=s[i.ids]=[];"$"===o.id[0]?r(s,i,o,s.listLookups):m.readRecord(o.collection,s.$eval(o.id)).then(function(e){for(var t=e.data[o.property],n=0;n<t.length;n++){var r=t[n][o.value],a=_.sortedIndex(c,r);c[a]===r&&(r=r+" ("+t[n]._id+")",a=_.sortedIndex(c,r)),c.splice(a,0,r),d.splice(a,0,t[n]._id)}h(i,s,l)})},handleInternalLookup:function(e,t,n){r(e,t,n,e.internalLookups)},preservePristine:N,convertToMongoModel:function d(u,f,p,m,h){function v(e,t){var n;return t&&t.fngajax?e&&(n=e.id||e):e&&(n=e.text||(e.x?e.x.text:e)),n}function e(){var t=u[g],e=t.name.slice(p),n=k(f,e,null,m);if(t.schema){if(n)for(var r=0;r<n.length;r++)n[r]=d(t.schema,n[r],1+e.length,m,e)}else{if(t.array&&$(t)&&n)for(var a=0;a<n.length;a++)n[a]=n[a].x;var o=m[b(t,"_ids")];if(o&&0<o.length)x(e,f,function(e){return function(e,t,n,r){if(e.array){for(var a=[],o=0;o<t.length;o++)a.push(D(t[o],n,r,e.name));return a}return D(t,n,r,e.name)}(t,e,m[b(t,"Options")],o)});else{var i=C(m,e,h);if(i){var s=w(f,e,null),l=void 0;if(t.array){if(l=[],s)for(var c=0;c<s.length;c++)l[c]=v(s[c],i)}else l=v(s,i);y(f,e,null,l)}}}}for(var g=0;g<u.length;g++)e();return f},convertIdToListValue:p,handleError:t,decorateScope:function(l,n,r,a){l.handleHttpError=t(l),l.cancel=function(){angular.copy(a.master,l.record),l.$broadcast("fngCancel",l),u(l.setPristine)},l.$on("showErrorMessage",function(e,t){e.defaultPrevented||(e.defaultPrevented=!0,l.showError(t.body,t.title))}),l.showError=function(t,e){if(l.alertTitle=e||"Error!","string"==typeof t)l.errorMessage=t;else if(t)if(t.message&&"string"==typeof t.message)l.errorMessage=t.message;else if(t.data&&t.data.message)l.errorMessage=t.data.message;else try{l.errorMessage=JSON.stringify(t)}catch(e){l.errorMessage=t}else l.errorMessage="An error occurred - that's all we got. Sorry.";l.errorHideTimer=window.setTimeout(function(){l.dismissError(),l.$digest()},3500+1e3*(l.alertTitle+l.errorMessage).length/50),l.errorVisible=!0,window.setTimeout(function(){l.$digest()})},l.clearTimeout=function(){l.errorHideTimer&&(clearTimeout(l.errorHideTimer),delete l.errorHideTimer)},l.dismissError=function(){l.clearTimeout,l.errorVisible=!1,delete l.errorMessage,delete l.alertTitle},l.stickError=function(){clearTimeout(l.errorHideTimer)},l.prepareForSave=function(t){var n=r.convertToMongoModel(l.formSchema,angular.copy(l.record),0,l);l.id?"function"==typeof l.dataEventFunctions.onBeforeUpdate?l.dataEventFunctions.onBeforeUpdate(n,a.master,function(e){e?t(e):t(null,n)}):t(null,n):"function"==typeof l.dataEventFunctions.onBeforeCreate?l.dataEventFunctions.onBeforeCreate(n,function(e){e?t(e):t(null,n)}):t(null,n)},l.save=function(n){n=n||{},l.prepareForSave(function(e,t){e?"_update_handled_"!==e&&u(function(){l.showError(e)}):l.id?r.updateDocument(t,n,l,a):r.createNew(t,n,l,a)})},l.newClick=function(){o.redirectTo()("new",l,c)},l.$on("$locationChangeStart",function(e,t){a.allowLocationChange||l.isCancelDisabled()||(e.preventDefault(),n.open({template:'<div class="modal-header">\n <h3>Record modified</h3>\n</div>\n<div class="modal-body">\n <p>Would you like to save your changes?</p>\n</div>\n<div class="modal-footer">\n <button class="btn btn-primary dlg-yes" ng-click="yes()">Yes</button>\n <button class="btn btn-warning dlg-no" ng-click="no()">No</button>\n <button class="btn dlg-cancel" ng-click="cancel()">Cancel</button>\n</div>',controller:"SaveChangesModalCtrl",backdrop:"static"}).result.then(function(e){e?l.save({redirect:t,allowChange:!0}):(a.allowLocationChange=!0,d.location=t)}).catch(f))}),l.deleteClick=function(){if(l.record._id){var e=void 0;if(l.unconfirmedDelete)e=Promise.resolve(!0);else e=n.open({template:'<div class="modal-header">\n <h3>Delete Item</h3>\n</div>\n<div class="modal-body">\n <p>Are you sure you want to delete this record?</p>\n</div>\n<div class="modal-footer">\n <button class="btn btn-primary dlg-no" ng-click="cancel()">No</button>\n <button class="btn btn-warning dlg-yes" ng-click="yes()">Yes</button>\n</div>',controller:"SaveChangesModalCtrl",backdrop:"static"}).result;e.then(function(e){function t(){r.deleteRecord(l.id,l,a)}e&&("function"==typeof l.dataEventFunctions.onBeforeDelete?l.dataEventFunctions.onBeforeDelete(a.master,function(e){e?"_delete_handled_"!==e&&l.showError(e):t()}):t())}).catch(f)}},l.isCancelDisabled=function(){return!!(l[l.topLevelFormName]&&l[l.topLevelFormName].$pristine||"ready"!==l.phase)||"function"==typeof l.disableFunctions.isCancelDisabled&&l.disableFunctions.isCancelDisabled(l.record,a.master,l[l.topLevelFormName])},l.isSaveDisabled=function(){l.whyDisabled=void 0;var e=!1;if(l[l.topLevelFormName]?l[l.topLevelFormName].$invalid?(l.whyDisabled="The form data is invalid:",function n(e,r){e.$$controls.forEach(function(e){if(e.$invalid)if(e.$$controls)n(e,e.$name);else if(l.whyDisabled+="<br /><strong>",r&&(l.whyDisabled+=r+" "),"bs2"===i.framework()&&e.$$element&&e.$$element.parent()&&e.$$element.parent().parent()&&e.$$element.parent().parent().find("label")&&e.$$element.parent().parent().find("label").text()?l.whyDisabled+=e.$$element.parent().parent().find("label").text():"bs3"===i.framework()&&e.$$element&&e.$$element.parent()&&e.$$element.parent().parent()&&e.$$element.parent().parent().parent()&&e.$$element.parent().parent().parent().find("label")&&e.$$element.parent().parent().parent().find("label").text()?l.whyDisabled+=e.$$element.parent().parent().parent().find("label").text():l.whyDisabled+=e.$name,l.whyDisabled+="</strong>: ",e.$error)for(var t in e.$error)if(e.$error.hasOwnProperty(t))switch(t){case"required":l.whyDisabled+="Field missing required value. ";break;case"pattern":l.whyDisabled+="Field does not match required pattern. ";break;default:l.whyDisabled+=t+". "}})}(l[l.topLevelFormName])):l[l.topLevelFormName].$pristine&&(e=!0):l.whyDisabled="Top level form name invalid",e||l.whyDisabled||"ready"!==l.phase)return!0;if("function"!=typeof l.disableFunctions.isSaveDisabled)return!1;var t=l.disableFunctions.isSaveDisabled(l.record,a.master,l[l.topLevelFormName]);return l.whyDisabled="string"==typeof t?t:"An application level user-specified function is inhibiting saving the record",!!t},l.isDeleteDisabled=function(){return!l.id||"ready"!==l.phase||"function"==typeof l.disableFunctions.isDeleteDisabled&&l.disableFunctions.isDeleteDisabled(l.record,a.master,l[l.topLevelFormName])},l.isNewDisabled=function(){return"function"==typeof l.disableFunctions.isNewDisabled&&l.disableFunctions.isNewDisabled(l.record,a.master,l[l.topLevelFormName])},l.setDefaults=function(e,a){void 0===a&&(a="");var o={};return e.forEach(function(e){if(void 0!==e.defaultValue){for(var t=e.name.replace(a,"").split("."),n=o,r=0;r<t.length-1;r++)n[t[r]]||(n[t[r]]={}),n=n[t[r]];n[t[t.length-1]]=e.defaultValue}}),o},l.getVal=function(e,t){if(-1===e.indexOf("$index")||void 0!==t)return e=e.replace(/\$index/g,t),l.$eval("record."+e)},l.sortableOptions={update:function(){l.topLevelFormName&&l[l.topLevelFormName].$setDirty()}},l.setUpCustomLookupOptions=function(e,t,n,r){for(var a=0,o=[l,r];a<o.length;a++){var i=o[a];i&&(i[e.ids]=t,i[e.options]=n)}var s=w(l.record,e.name);s&&(s=S(e,s,n,t),y(l.record,e.name,void 0,s))}},fillFormFromBackendCustomSchema:A,fillFormWithBackendSchema:function(t,n,r,a){e.getSchema(t.modelName,t.formName).then(function(e){A(e.data,t,n,r,a)},t.handleHttpError)}}}e=I.services||(I.services={}),t.$inject=["$location","$window","$filter","$timeout","routingService","cssFrameworkService","SubmissionsService","SchemasService"],e.recordHandler=t}(fng=fng||{}),function(e){var t;function n(n){return{getSchema:function(e,t){return n.get("/api/schema/"+e+(t?"/"+t:""),{cache:!0})}}}t=e.services||(e.services={}),n.$inject=["$http"],t.SchemasService=n}(fng=fng||{});var fng,ExpirationCache=function(){function e(e){void 0===e&&(e=6e4),this.store=new Map,this.timeout=e}return e.prototype.get=function(e){return this.store.get(e)},e.prototype.put=function(e,t){var n=this;this.store.set(e,t),setTimeout(function(){n.remove(e)},this.timeout)},e.prototype.remove=function(e){this.store.delete(e)},e.prototype.removeAll=function(){this.store=new Map},e.prototype.delete=function(){},e}();!function(e){var t;function n(r){function n(e){function t(e,t){void 0!==t&&""!==t&&("object"==typeof t&&(t=JSON.stringify(t)),""===n?n="?":n+="&",n+=e+"="+t)}var n="";return t("l",e.limit),t("f",e.find),t("a",e.aggregate),t("o",e.order),t("s",e.skip),n}var a=!0,o=new ExpirationCache;return{getListAttributes:function(e,t){var n="string"==typeof t?t:t.id||t._id||t.x||t;if("string"!=typeof n)throw new Error("getListAttributes requires a string id but was provided with ".concat(JSON.stringify(t)));return r.get("/api/"+e+"/"+n+"/list",{cache:o})},readRecord:function(e,t){return r.get("/api/"+e+"/"+t)},getAll:function(e,t){var n=angular.extend({cache:!!a&&o},t);return r.get("/api/"+e,n)},getPagedAndFilteredList:function(e,t){return r.get("/api/"+e+n(t))},deleteRecord:function(e,t){return r.delete("/api/"+e+"/"+t)},updateRecord:function(e,t,n){return o.remove("/api/"+e),r.post("/api/"+e+"/"+t,n)},createRecord:function(e,t){return o.remove("/api/"+e),r.post("/api/"+e,t)},useCache:function(e){a=e},getCache:function(){return!!o},clearCache:function(){o.removeAll()}}}t=e.services||(e.services={}),n.$inject=["$http"],t.SubmissionsService=n}(fng=fng||{}),function(f){var e;function t(t,n,e,r,a,o,i,s,l){t.sharedData={record:{},disableFunctions:{},dataEventFunctions:{},modelControllers:[]};var c={master:{},fngInvalidRequired:"fng-invalid-required",allowLocationChange:!0};t.errorVisible=!1,angular.extend(t,i.parsePathFunc()(e.$$path));var d=r("titleCase")(t.modelName,!0);function u(){l.fillFormWithBackendSchema(t,s,l,c);for(var e=0;e<t.sharedData.modelControllers.length;e++)t.sharedData.modelControllers[e].onBaseCtrlReady&&t.sharedData.modelControllers[e].onBaseCtrlReady(t);t.$on("$destroy",function(){t.sharedData.modelControllers.forEach(function(e){return e.$destroy()}),n.$broadcast("fngControllersUnloaded")})}o.loadControllerAndMenu(t.sharedData,d,0,!1,t.$new()),t.formName&&o.loadControllerAndMenu(t.sharedData,d+r("titleCase")(t.formName,!0),1,!1,t.$new()),n.$broadcast("fngControllersLoaded",t.sharedData,t.modelName),t.modelNameDisplay=t.sharedData.modelNameDisplay||r("titleCase")(t.modelName),n.$broadcast("fngFormLoadStart",t),s.decorateScope(t,s,l,t.sharedData),l.decorateScope(t,a,l,c),"function"==typeof f.formsAngular.beforeProcess?f.formsAngular.beforeProcess(t,function(e){e?t.showError(e.message,"Error preparing to process form"):u()}):u()}e=f.controllers||(f.controllers={}),t.$inject=["$scope","$rootScope","$location","$filter","$uibModal","fngModelCtrlService","routingService","formGenerator","recordHandler"],e.BaseCtrl=t}(fng=fng||{}),function(e){var t;function n(e,t){e.yes=function(){t.close(!0)},e.no=function(){t.close(!1)},e.cancel=function(){t.dismiss("cancel")}}t=e.controllers||(e.controllers={}),n.$inject=["$scope","$uibModalInstance"],t.SaveChangesModalCtrl=n}(fng=fng||{}),function(e){var t;function n(t,e,n,r){t.models=[],e.get("/api/models").then(function(e){t.models=e.data},function(){n.path("/404")}),t.newUrl=function(e){return r.buildUrl(e+"/new")},t.listUrl=function(e){return r.buildUrl(e)}}t=e.controllers||(e.controllers={}),n.$inject=["$scope","$http","$location","routingService"],t.ModelCtrl=n}(fng=fng||{}),function(e){var t;function n(e,t,i,n,r,a,o){function s(){i.items=[],i.contextMenu=void 0}e.navScope=i,s(),i.toggleCollapsed=function(){i.collapsed=!i.collapsed},i.isCollapsed=!0,i.showShortcuts=!1,i.shortcuts=[{key:"?",act:"Show shortcuts"},{key:"/",act:"Jump to search"},{key:"Ctrl+Shift+S",act:"Save the current record"},{key:"Ctrl+Shift+Esc",act:"Cancel changes on the current record"},{key:"Ctrl+Shift+Ins",act:"Create a new record"},{key:"Ctrl+Shift+X",act:"Delete the current record"}],i.markupShortcut=function(e){return'<span class="key">'+e.split("+").join('</span> + <span class="key">')+"</span>"},i.globalShortcuts=function(n){function e(e){var t=document.getElementById(e);t&&(t.disabled||setTimeout(function(){t.click()}),n.preventDefault())}if(191===n.keyCode&&(!("INPUT"==(a=(r=n).target.tagName)||"SELECT"==a||"TEXTAREA"==a||"DIV"==a&&r.target.classList.contains("ck-editor__editable"))||n.ctrlKey&&!n.altKey&&!n.metaKey))if(n.ctrlKey||!n.shiftKey){var t=document.getElementById("searchinput");t&&(t.focus(),n.preventDefault())}else i.showShortcuts=!0;else 83===n.keyCode&&n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey?e("saveButton"):27===n.keyCode&&(n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey||i.showShortcuts)?n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey?e("cancelButton"):i.showShortcuts=!1:45===n.keyCode&&n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey?e("newButton"):88===n.keyCode&&n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey&&e("deleteButton");var r,a},i.css=function(e,t){return"function"==typeof o[e]?o[e](t):"error text-error"},i.$on("fngControllersLoaded",function(e,t,n){i.contextMenu=t.dropDownDisplay||t.modelNameDisplay||r("titleCase")(n,!1),t.dropDownDisplayPromise&&t.dropDownDisplayPromise.then(function(e){i.contextMenu=e})}),i.$on("fngControllersUnloaded",function(e){s()}),i.doClick=function(e,t){var n=angular.element(t.target),r=i.items[e];if(r.divider||n.parent().hasClass("disabled"))t.preventDefault();else if(r.broadcast)i.$broadcast(r.broadcast);else{var a=r.args||[],o=r.fn;if("function"==typeof o)switch(a.length){case 0:o();break;case 1:o(a[0]);break;case 2:o(a[0],a[1]);break;case 3:o(a[0],a[1],a[2]);break;case 4:o(a[0],a[1],a[2],a[3])}else if(o)throw new Error("Incorrect menu setup")}},i.isHidden=function(e){function t(e){return!!e.isHidden&&e.isHidden()}var n=!1;if(i.items[e].divider)if(0===e)n=!0;else for(var r=!1,a=e-1;0<=a&&!n&&!r;)i.items[a].divider?n=!0:t(i.items[a])?--a:r=!0;return n||t(i.items[e])},i.isDisabled=function(e){return!!i.items[e].isDisabled&&i.items[e].isDisabled()},i.buildUrl=function(e){return a.buildUrl(e)},i.dropdownClass=function(e){var t="";return i.items[e].divider?t="divider":i.isDisabled(e)&&(t="disabled"),t};var l=t.document.title;i.$on("$routeChangeSuccess",function(){t.document.title=l})}t=e.controllers||(e.controllers={}),n.$inject=["$rootScope","$window","$scope","$location","$filter","routingService","cssFrameworkService"],t.NavCtrl=n}(fng=fng||{}),function(e){e.formsAngular=angular.module("formsAngular",["ngSanitize","ngMessages","ui.bootstrap","infinite-scroll","monospaced.elastic"]).controller("BaseCtrl",e.controllers.BaseCtrl).controller("SaveChangesModalCtrl",e.controllers.SaveChangesModalCtrl).controller("LinkCtrl",e.controllers.LinkCtrl).controller("ModelCtrl",e.controllers.ModelCtrl).controller("NavCtrl",e.controllers.NavCtrl).directive("modelControllerDropdown",e.directives.modelControllerDropdown).directive("errorDisplay",e.directives.errorDisplay).directive("fngLink",e.directives.fngLink).directive("formInput",e.directives.formInput).directive("formButtons",e.directives.formButtons).directive("globalSearch",e.directives.globalSearch).directive("fngNakedDate",e.directives.fngNakedDate).filter("camelCase",e.filters.camelCase).filter("titleCase",e.filters.titleCase).filter("extractTimestampFromMongoID",e.filters.extractTimestampFromMongoID).service("addAllService",e.services.addAllService).provider("cssFrameworkService",e.services.cssFrameworkService).provider("routingService",e.services.routingService).factory("fngModelCtrlService",e.services.fngModelCtrlService).factory("formGenerator",e.services.formGenerator).factory("formMarkupHelper",e.services.formMarkupHelper).factory("inputSizeHelper",e.services.inputSizeHelper).factory("pluginHelper",e.services.pluginHelper).factory("recordHandler",e.services.recordHandler).factory("SchemasService",e.services.SchemasService).factory("SubmissionsService",e.services.SubmissionsService)}(fng=fng||{});var formsAngular=fng.formsAngular;angular.module("formsAngular").run(["$templateCache",function(e){e.put("base-analysis.html",'<div ng-controller="AnalysisCtrl">\n <error-display></error-display>\n <div class="container-fluid page-header report-header">\n <div ng-class="css(\'rowFluid\')">\n <div class="header-lhs col-xs-7 span7">\n <h1>{{ titleWithSubstitutions }}</h1>\n </div>\n <div class="header-rhs col-xs-5 span5">\n <form-input schema="paramSchema" name="paramForm" ng-show="paramSchema" formstyle="horizontalCompact"></form-input>\n </div>\n </div>\n </div>\n <div class="container-fluid page-body report-body">\n <div class="row-fluid report-grow">\n <div class="gridStyle" style="height:100%;" ui-grid="gridOptions" ui-grid-selection ui-grid-resize-columns></div>\n </div>\n </div>\n</div>\n'),e.put("base-edit.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n\x3c!-- <div ng-hide="phase == \'ready\'" class="loading">Loading&#8230;</div>--\x3e\n <div ng-class="css(\'rowFluid\')" class="page-header edit-header">\n <div class="header-lhs col-sm-8 span8">\n <h1 id="header-text">{{modelNameDisplay}} :\n <span id="header-data-desc">\n <span ng-show="!!editFormHeader" >{{ editFormHeader() }}</span>\n <span ng-hide="!!editFormHeader" ng-repeat="field in listSchema" ng-bind-html="getListData(record, field.name) + \' \'"></span>\n </span>\n </h1>\n </div>\n <div class="header-rhs col-sm-2 span2">\n <div form-buttons></div>\n </div>\n </div>\n <div class="container-fluid page-body edit-body">\n <form-input name="baseForm" schema="baseSchema()" formstyle="compact"></form-input>\n </div>\n\x3c!-- <pre>--\x3e\n \x3c!--Record--\x3e\n \x3c!--{{ record | json }}--\x3e\n \x3c!--formSchema--\x3e\n \x3c!--{{ formSchema | json }}--\x3e\n\x3c!-- </pre>--\x3e\n</div>\n'),e.put("base-list-view.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n <div ng-class="css(\'rowFluid\')" class="page-header list-header">\n <div class="header-lhs col-sm-8 span8">\n <h1>{{modelNameDisplay}}</h1>\n </div>\n </div>\n <div class="page-body list-body">\n <div ng-class="css(\'rowFluid\')" infinite-scroll="scrollTheList()">\n <a ng-repeat="record in recordList" ng-href="{{generateViewUrl(record)}}">\n <div class="list-item">\n <div ng-class="css(\'span\',12/listSchema.length)" ng-repeat="field in listSchema">{{getListData(record, field.name)}} </div>\n </div>\n </a>\n </div>\n </div>\n</div>\n'),e.put("base-list.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n <div ng-class="css(\'rowFluid\')" class="page-header list-header">\n <div class="header-lhs col-sm-8 span8">\n <h1>{{modelNameDisplay}}</h1>\n </div>\n <div class="header-rhs col-sm-2 span2">\n <a ng-href="{{generateNewUrl()}}"><button id="newBtn" class="btn btn-default"><i class="icon-plus"></i> New</button></a>\n </div>\n </div>\n <div class="page-body list-body">\n <div ng-class="css(\'rowFluid\')" infinite-scroll="scrollTheList()">\n <a ng-repeat="record in recordList" ng-href="{{generateEditUrl(record)}}">\n <div class="list-item">\n <div ng-class="css(\'span\',12/listSchema.length)" ng-repeat="field in listSchema">{{getListData(record, field.name)}} </div>\n </div>\n </a>\n </div>\n </div>\n</div>\n'),e.put("base-view.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n <div ng-class="css(\'rowFluid\')" class="page-header edit-header">\n <div class="header-lhs col-sm-8 span8">\n <h1 id="header-text">{{modelNameDisplay}} :\n <span ng-repeat="field in listSchema" ng-bind-html="getListData(record, field.name) + \' \'"></span>\n </h1>\n </div>\n </div>\n <div class="container-fluid page-body edit-body">\n <form-input name="baseForm" schema="baseSchema()" formstyle="compact" viewform="true"></form-input>\n </div>\n</div>\n'),e.put("error-display-bs2.html",'<div id="display-error" ng-show="errorVisible" class="row-fluid ng-hide">\n <div class="alert alert-error offset1 span10">\n <button type="button" id="err-hide" class="close" ng-click="dismissError()"><i class="icon-remove"></i></button>\n <button type="button" id="err-pin" class="close" ng-click="stickError()"><i class="icon-eye-open"></i></button>\n <h4 id="err-title">{{alertTitle}}</h4>\n <div id="err-msg" ng-bind-html="errorMessage"></div>\n </div>\n</div>\n'),e.put("error-display-bs3.html",'<div id="display-error" ng-show="errorVisible" class="row ng-hide">\n <div class="alert alert-error col-md-offset-1 col-md-10 alert-danger">\n <button type="button" id="err-hide" class="close" ng-click="dismissError()"><i class="glyphicon glyphicon-remove"></i></button>\n <button type="button" id="err-pin" class="close" ng-click="stickError()"><i class="glyphicon glyphicon-pushpin"></i></button>\n <h4 id="err-title">{{alertTitle}}</h4>\n <div id="err-msg" ng-bind-html="errorMessage"></div>\n </div>\n</div>\n'),e.put("error-messages.html",'<div ng-message="required">A value is required for this field</div>\n<div ng-message="minlength">Too few characters entered</div>\n<div ng-message="maxlength">Too many characters entered</div>\n<div ng-message="min">That value is too small</div>\n<div ng-message="max">That value is too large</div>\n<div ng-message="email">You need to enter a valid email address</div>\n<div ng-message="pattern">This field does not match the expected pattern</div>\n'),e.put("form-button-bs2.html",'<div class="form-btn-grp">\n <div class="btn-group pull-right">\n <button id="saveButton" class="btn btn-mini btn-primary form-btn" ng-click="save()" ng-disabled="isSaveDisabled()"><i class="icon-ok"></i> Save</button>\n <div id="why-disabled" ng-class="{showwhy:!!whyDisabled}" ng-bind-html="whyDisabled"></div>\n <button id="cancelButton" class="btn btn-mini btn-warning form-btn" ng-click="cancel()" ng-disabled="isCancelDisabled()"><i class="icon-remove"></i> Cancel</button>\n </div>\n <div class="btn-group pull-right">\n <button id="newButton" class="btn btn-mini btn-success form-btn" ng-click="newClick()" ng-disabled="isNewDisabled()"><i class="icon-plus"></i> New</button>\n <button id="deleteButton" class="btn btn-mini btn-danger form-btn" ng-click="deleteClick()" ng-disabled="isDeleteDisabled()"><i class="icon-minus"></i> Delete</button>\n </div>\n</div>\n'),e.put("form-button-bs3.html",'<div class="form-btn-grp">\n <div class="btn-group pull-right">\n <button id="saveButton" class="btn btn-primary form-btn btn-xs" ng-click="save()" ng-disabled="isSaveDisabled()"><i class="glyphicon glyphicon-ok"></i> Save</button>\n <div id="why-disabled" ng-class="{showwhy:!!whyDisabled}" ng-bind-html="whyDisabled"></div>\n <button id="cancelButton" class="btn btn-warning form-btn btn-xs" ng-click="cancel()" ng-disabled="isCancelDisabled()"><i class="glyphicon glyphicon-remove"></i> Cancel</button>\n </div>\n <div class="btn-group pull-right">\n <button id="newButton" class="btn btn-success form-btn btn-xs" ng-click="newClick()" ng-disabled="isNewDisabled()"><i class="glyphicon glyphicon-plus"></i> New</button>\n <button id="deleteButton" class="btn btn-danger form-btn btn-xs" ng-click="deleteClick()" ng-disabled="isDeleteDisabled()"><i class="glyphicon glyphicon-minus"></i> Delete</button>\n </div>\n</div>\n'),e.put("search-bs2.html",'<form class="navbar-search pull-right">\n <div id="search-cg" class="control-group" ng-class="errorClass">\n <input type="text" spellcheck="false" autocomplete="off" id="searchinput" ng-model="searchTarget" ng-model-options="{debounce:250}" class="search-query" placeholder="{{searchPlaceholder}}" ng-keyup="handleKey($event)">\n </div>\n</form>\n<div class="results-container" ng-show="results.length >= 1">\n <div class="search-results">\n <div ng-repeat="result in results">\n <a href="{{result.href}}" ng-class="resultClass($index)" title="{{result.additional}}">{{result.resourceText}} {{result.text}}</a>\n </div>\n <div ng-show="moreCount > 0">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n'),e.put("search-bs3.html",'<form class="pull-right navbar-form">\n <div id="search-cg" class="form-group" ng-class="errorClass">\n <input type="text" spellcheck="false" autocomplete="off" id="searchinput" ng-model="searchTarget" ng-model-options="{debounce:250}" class="search-query form-control" placeholder="{{searchPlaceholder}}" ng-keyup="handleKey($event)">\n </div>\n</form>\n<div class="results-container" ng-show="results.length >= 1">\n <div class="search-results">\n <div ng-repeat="result in results">\n <a href="{{result.href}}" ng-class="resultClass($index)" title="{{result.additional}}">{{result.resourceText}} {{result.text}}</a>\n </div>\n <div ng-show="moreCount > 0">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n')}]);
1
+ !function(e){(e.directives||(e.directives={})).modelControllerDropdown=function(){return{restrict:"AE",replace:!0,template:'<li ng-show="items.length > 0" class="mcdd" uib-dropdown> <a href="#" uib-dropdown-toggle> {{contextMenu}} <b class="caret"></b> </a> <ul class="uib-dropdown-menu dropdown-menu"> <li ng-repeat="choice in items" ng-hide="isHidden($index)" ng-class="dropdownClass($index)"> <a ng-show="choice.text || choice.textFunc" class="dropdown-option" ng-href="{{choice.url || choice.urlFunc()}}" ng-click="doClick($index, $event)"> {{ choice.text || choice.textFunc() }} </a> </li> </ul></li>'}}}(fng=fng||{}),function(e){var t;function n(e){return{restrict:"E",templateUrl:"error-display-"+e.framework()+".html"}}t=e.directives||(e.directives={}),n.$inject=["cssFrameworkService"],t.errorDisplay=n}(fng=fng||{}),function(e){var t;function n(a){a.checkNotModal=function(){for(var e,t=a.element[0],n=!1,r={preventDefault:angular.noop,stopPropagation:angular.noop,target:1,currentTarget:1};(e=t.parentNode)?"function"==typeof e.getAttribute&&e.getAttribute("uib-modal-window")?(angular.element(t).scope().close(r),n=!0):t=e:n=!0,!n;);}}t=e.controllers||(e.controllers={}),n.$inject=["$scope"],t.LinkCtrl=n}(fng=fng||{}),function(e){var t;function n(p,m){return{restrict:"E",scope:{dataSrc:"&model"},link:function(n,e,r){var a=r.ref,t=r.text&&unescape(r.text)!==r.text,o=r.form,i=r.linktab;if(n.readonly=r.readonly,n.element=e,o=o?o+"/":"",i=i?"/"+i:"",t){for(var s=n,l="";"function"!=typeof s.baseSchema&&s.$parent;){if(void 0!==s.$index)throw new Error("No support for $index at this level - "+l);s=s.$parent,l+="$parent."}var c,d=r.fld,u=d.split(".");c=n.$parent.subDoc&&(n.$parent.subDoc[d]||n.$parent.subDoc[u[u.length-1]])?n.$parent.subDoc[d]?l+"subDoc."+d:l+"subDoc."+u[u.length-1]:l+"record"+(d=void 0!==s.$index?(d=u.pop(),u.join(".")+"["+s.$index+"]."+d):"."+d),n.$watch(c,function(e){if(e){if(/^[a-f0-9]{24}/.test(e.toString()))e=e.slice(0,24);else if(e.id&&/^[a-f0-9]{24}/.test(e.id))e=e.id.slice(0,24);else if(n.$parent["f_"+r.fld+"Options"]){var t=n.$parent["f_"+r.fld+"Options"].indexOf(e);e=-1<t?n.$parent["f_"+r.fld+"_ids"][t]:void 0}else e=void 0;n.link=e?p.buildUrl(a+"/"+o+(e.id||e)+"/edit"+i):void 0}else n.link=void 0},!0)}else{r.text&&0<r.text.length&&(n.text=r.text);var f=n.$parent.$index;n.$watch("dataSrc()",function(e){e&&(void 0!==f&&angular.isArray(e)&&(e=e[f]),n.link=p.buildUrl(a+"/"+o+e+"/edit"+i),n.text||m.getListAttributes(a,e).then(function(e){var t=e.data;!1===t.success?n.text=t.err:n.text=t.list},function(e){n.text="Error "+e.status+": "+e.data}))},!0)}},controller:"LinkCtrl",template:function(e,t){function n(e){return'<a ng-click="checkNotModal()" ng-href="{{ link || \'#\' }}" class="fng-link">'.concat(e,"</a>")}return t.readonly?'<span class="fng-link">{{text}}</span>':t.text&&unescape(t.text)!==t.text?n(unescape(t.text)):n("{{text}}")}}}t=e.directives||(e.directives={}),n.$inject=["routingService","SubmissionsService"],t.fngLink=n}(fng=fng||{}),function(e){var t;function n(e){return{restrict:"A",templateUrl:"form-button-"+e.framework()+".html"}}t=e.directives||(e.directives={}),n.$inject=["cssFrameworkService"],t.formButtons=n}(fng=fng||{}),function(e){var t,O,n;function r(d,u,E,A,L,f,I){return{restrict:"EA",link:function(k,x,l){function b(t,e,n,r,a){function o(){var e;if(angular.isArray(k[t.options]))e={repeat:t.options,value:"option"};else{if(!k[t.options]||!angular.isArray(k[t.options].values))throw new Error("Invalid enumeration setup in field "+t.name);e=angular.isArray(k[t.options].labels)?{repeat:t.options+".values",value:t.options+".values[$index]",label:t.options+".labels[$index]"}:{repeat:t.options+".values",value:t.options+".values[$index]"}}return e}var i;if(!e){var s=(a.model||"record")+".";if(e=s,a.subschema&&-1!==t.name.indexOf(".")){var l=t.name,c=a.subschemaroot,d=l.slice(c.length+1);a.index?r="f_"+(e+=c+"["+a.index+"]."+d).slice(s.length).replace(/(\.|\[|]\.)/g,"-"):(e+=c,a.subkey?(r=e.slice(s.length).replace(/\./g,"-")+"-subkey"+a.subkeyno+"-"+d,e+="[$_arrayOffset_"+c.replace(/\./g,"_")+"_"+a.subkeyno+"]."+d):(e+="[$index]."+d,r=null,i=l.replace(/\./g,"-")))}else e+=t.name}var u,f,p=I.allInputsVars(k,t,a,e,r,i),m=p.common,h=(n=n||t.required)?" required ":"";function v(e){var t="";return e&&(t="boolean"==typeof e?" disabled ":' ng-disabled="'.concat(e,'" ')),t}switch(t.type){case"select":t.select2?u='<input placeholder="fng-select2 has been removed" readonly>':(m+=v(t.readonly),m+=t.add?" "+t.add+" ":"",m+=' aria-label="'.concat(t.label&&""!==t.label?t.label:t.name,'" '),u="<select "+m+'class="'+p.formControl.trim()+p.compactClass+p.sizeClassBS2+'" '+h+">",n||(u+="<option></option>"),angular.isArray(t.options)?angular.forEach(t.options,function(e){_.isObject(e)?u+='<option value="'+(e.val||e.id)+'">'+(e.label||e.text)+"</option>":u+="<option>"+e+"</option>"}):(f=o(),u+='<option ng-repeat="option in '+f.repeat+'"',f.label?u+=' value="{{'+f.value+'}}"> {{ '+f.label+" }} </option> ":u+=">{{"+f.value+"}}</option> "),u+="</select>");break;case"link":u='<fng-link model="'+e+'" ref="'+t.ref+'"',t.form&&(u+=' form="'+t.form+'"'),t.linktab&&(u+=' linktab="'+t.linktab+'"'),t.linktext&&(u+=' text="'+t.linktext+'"'),t.readonly&&("boolean"==typeof t.readonly?u+=' readonly="true"':u+=' ng-readonly="'.concat(t.readonly,'"')),u+="></fng-link>";break;case"radio":u="",m+=h,m+=v(t.readonly),m+=t.add?" "+t.add+" ":"";var g="vertical"===a.formstyle||"inline"!==a.formstyle&&!t.inlineRadio;if(angular.isArray(t.options)){var b;a.subschema&&(m=(m=m.replace('name="','name="{{$index}}-')).replace('id="','id="{{$index}}-')),angular.forEach(t.options,function(e,t){b=m.replace('id="','id="'+t+"-"),u+="<input ".concat(b,' type="radio" aria-label="').concat(e,'" value="').concat(e,'">').concat(e),g&&(u+="<br />")})}else{var y=g?"div":"span";a.subschema&&(m=m.replace("$index","$parent.$index").replace('name="','name="{{$parent.$index}}-').replace('id="','id="{{$parent.$index}}-')),f=o(),u+="<"+y+' ng-repeat="option in '+f.repeat+'">',u+="<input ".concat(m.replace('id="','id="{{$index}}-'),' type="radio" aria-label="').concat(f.value,'" value="{{ ').concat(f.value,' }}"> {{ ').concat(f.label||f.value," }} </").concat(y,"> ")}break;case"checkbox":m+=h,m+=v(t.readonly),m+=t.add?" "+t.add+" ":"",u=I.generateSimpleInput(m,t,a),"bs3"===L.framework()&&(u='<div class="checkbox">'+u+"</div>");break;default:m+=I.addTextInputMarkup(p,t,h),u="textarea"===t.type?(t.rows&&("auto"===t.rows?m+='msd-elastic="\n" class="ng-animate" ':m+='rows = "'+t.rows+'" '),"ckEditor"===t.editor&&(console.log('Deprecation Warning: "editor" property deprecated - use "add"'),m+='ckeditor = "" ',"bs3"===L.framework()&&(p.sizeClassBS3="col-xs-12")),"<textarea "+m+"></textarea>"):I.generateSimpleInput(m,t,a)}return I.inputChrome(u,t,a,p)}function w(e){var t;switch(e){case"horizontal":t="form-horizontal";break;case"vertical":t="";break;case"inline":t="form-inline";break;case"stacked":t="form-stacked";break;case"horizontalCompact":default:t="form-horizontal compact"}return t}function $(e){var t={before:"",after:""};if("function"==typeof e.containerType)t=e.containerType(e);else switch(e.containerType){case"tab":for(var n=-1,r=0;r<k.tabs.length;r++)if(k.tabs[r].title===e.title){n=r;break}0<=n?(t.before='<uib-tab deselect="tabDeselect($event, $selectedIndex)" select="updateQueryForTab(\''+e.title+'\')" heading="'+e.title+'"',0<n&&(t.before+='active="tabs['+n+'].active"'),t.before+=">",t.after="</uib-tab>"):(t.before="<p>Error! Tab "+e.title+" not found in tab list</p>",t.after="");break;case"tabset":t.before="<uib-tabset>",t.after="</uib-tabset>";break;case"well":t.before='<div class="well">',e.title&&(t.before+="<h4>"+e.title+"</h4>"),t.after="</div>";break;case"well-large":t.before='<div class="well well-lg well-large">',t.after="</div>";break;case"well-small":t.before='<div class="well well-sm well-small">',t.after="</div>";break;case"fieldset":t.before="<fieldset>",e.title&&(t.before+="<legend>"+e.title+"</legend>"),t.after="</fieldset>";break;case void 0:case null:case"":break;default:if(t.before='<div class="'+e.containerType+'">',e.title){var a=e.titleTagOrClass||"h4";a.match(/h[1-6]/)?t.before+="<"+a+">"+e.title+"</"+a+">":t.before+='<p class="'+a+'">'+e.title+"</p>"}t.after="</div>"}return t}function C(e,t){var n=I.fieldChrome(k,e,t),r=n.template;if(e.schema){var a=e.name.replace(/\./g,"_"),o="$_schema_"+a;if(k[o]=e.schema,e.schema)if(e.subkey){e.subkey.path=e.name,k[o+"_subkey"]=e.subkey;for(var i=angular.isArray(e.subkey)?e.subkey:[e.subkey],s=0;s<i.length;s++){var l=$(i[s]);r+=l.before,r+=N(e.schema,null,{subschema:"true",formstyle:t.formstyle,subkey:o+"_subkey",subkeyno:s,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),r+=l.after}S.push(e)}else if(t.subschema)t.suppressNestingWarning||console.log("Attempts at supporting deep nesting have been removed - will hopefully be re-introduced at a later date");else{var c=(t.model||"record")+"."+e.name;if("string"==typeof e.customHeader)r+=e.customHeader;else{var d="";e.unshift&&(d='<button id="unshift_'+e.id+'_btn" class="add-btn btn btn-default btn-xs btn-mini form-btn" ng-click="unshift(\''+e.name+'\',$event)"><i class="'+I.glyphClass()+'-plus"></i> Add</button>'),"bs3"===L.framework()?r+='<div class="row schema-head"><div class="col-sm-offset-3">'+e.label+d+"</div></div>":r+='<div class="schema-head">'+e.label+d+"</div>"}"inline"===e.formStyle&&e.inlineHeaders&&(r+=function(e,t,n,r){for(var a=r?"":'ng-hide="!'.concat(n," || ").concat(n,'.length === 0"'),o='<div class="inline-col-headers" style="display:flex" '.concat(a,">"),i=0,s=e;i<s.length;i++){var l=s[i];F(l,t),o+="<div ",l.showWhen=l.showWhen||l.showwhen,l.showWhen&&("string"==typeof l.showWhen?o+='ng-show="'+l.showWhen+'"':o+='ng-show="'+I.generateNgShow(l.showWhen,n)+'"'),l.id&&"function"==typeof l.id.replace&&(o+=' id="col_label_'+l.id.replace(/\./g,"-")+'"'),o+=' class="inline-col-header"><label for="'.concat(l.id,'" class="control-label">').concat(l.label,"</label></div>")}return o+="</div>"}(e.schema,t,c,"always"===e.inlineHeaders)),r+='<ol class="sub-doc"'+(e.sortable?' ui-sortable="sortableOptions" ng-model="'.concat(c,'"'):"")+">",r+='<li ng-form class="'+("bs2"===L.framework()?"row-fluid ":"")+(e.inlineHeaders?"width-controlled ":"")+w(e.formStyle)+" "+(e.ngClass?"ng-class:"+e.ngClass:"")+'" name="form_'+a+'{{$index}}" class="sub-doc well" id="'+e.id+'List_{{$index}}" ng-repeat="subDoc in '+c+' track by $index"'+(e.filterable?' data-ng-hide="subDoc._hidden"':"")+">","bs2"===L.framework()&&(r+='<div class="row-fluid sub-doc">'),!0===e.noRemove&&!e.customSubDoc||(r+=' <div class="sub-doc-btns">',"string"==typeof e.customSubDoc&&(r+=e.customSubDoc),!0!==e.noRemove&&(r+="<button ".concat(e.noRemove?'ng-hide="'+e.noRemove+'"':"",' name="remove_').concat(e.id,'_btn" ng-click="remove(\'').concat(e.name,"', $index, $event)\""),e.remove?r+=' class="remove-btn btn btn-mini btn-default btn-xs form-btn"><i class="'+I.glyphClass()+'-minus"></i> Remove':(r+=' style="position: relative; z-index: 20;" type="button" class="close pull-right">',"bs3"===L.framework()?r+='<span aria-hidden="true">×</span><span class="sr-only">Close</span>':r+="<span>×</span>"),r+="</button>"),r+="</div> ");var u=void 0;if(e.subDocContainerType){var f=k[e.subDocContainerType]||e.subDocContainerType,p=Object.assign({containerType:f},e.subDocContainerProps);u=$(p)}if(null!=u&&u.before&&(r+=u.before),r+=N(e.schema,!1,{subschema:"true",formstyle:e.formStyle,model:t.model,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),null!=u&&u.after&&(r+=u.after),"bs2"===L.framework()&&(r+=" </div>"),r+="</li>",r+="</ol>",!0!==e.noAdd||"string"==typeof e.customFooter||e.noneIndicator){var m="";"string"==typeof e.customFooter&&(m=e.customFooter);var h="",v="".concat(c,".length == 0");!0===e.noAdd?v='ng-show="'.concat(v,'"'):(h=e.noAdd?'ng-hide="'.concat(e.noAdd,'"'):"",v=e.noAdd?'ng-show="'.concat(e.noAdd," && ").concat(v,'"'):"",m+="<button ".concat(h,' id="add_').concat(e.id,'_btn" class="add-btn btn btn-default btn-xs btn-mini" ng-click="add(\'').concat(e.name,"',$event)\">\n <i class=\"' + formMarkupHelper.glyphClass() + '-plus\"></i> \n Add\n </button>")),e.noneIndicator&&(m+="<span ".concat(v,' class="none_indicator" id="no_').concat(e.id,'_indicator">None</span>'),h="".concat(c,".length > 0"),h=!0===e.noAdd?'ng-hide="'.concat(h,'"'):e.noAdd?'ng-hide="'.concat(e.noAdd," && ").concat(h,'"'):""),""!==m&&("bs3"===L.framework()?r+="<div ".concat(h,' class="row schema-foot"><div class="col-sm-offset-3">').concat(m,"</div></div>"):r+="<div ".concat(h,' class = "schema-foot ">').concat(m,"</div>"))}}}else{var g=I.controlDivClasses(t);if(e.array){if(g.push("fng-array"),"inline"===t.formstyle||"stacked"===t.formstyle)throw new Error("Cannot use arrays in an inline or stacked form");r+=I.label(k,e,"link"!==e.type,t),r+=I.handleArrayInputAndControlDiv(b(e,"link"===e.type?null:"arrayItem.x",!0,e.id+"_{{$index}}",t),g,e,t)}else r+=I.label(k,e,null,t),r+=I.handleInputAndControlDiv(b(e,null,t.required,e.id,t),g)}return r+=n.closeTag}var S=[],D=O.N,F=function(e,t){e.type=e.type||"text",e.id?"number"!=typeof e.id&&!e.id.match(/^[0-9]/)||(e.id="_"+e.id):t&&t.noid?e.id=null:e.id="f_"+e.name.replace(/\./g,"_"),e.label=void 0!==e.label?null===e.label?"":e.label:E("titleCase")(e.name.split(".").slice(-1)[0])},N=function(e,t,n){var r="";if(e)for(var a=0;a<e.length;a++){var o=e[a];n.viewform&&((o=angular.copy(o)).readonly=!0),0===a&&t&&!n.schema.match(/\$_schema_/)&&"object"!=typeof o.add&&(o.add=o.add?" "+o.add+" ":"",-1!==o.add.indexOf("ui-date")||n.noautofocus||o.containerType||(o.add=o.add+"autofocus "));var i=!0;if(o.directive){var s=o.directive,l=o.customHeader||"";l+="<"+s+' model="'+(n.model||"record")+'"';var c=x[0];F(o,n);for(var d=0;d<c.attributes.length;d++){var u=c.attributes[d];switch(u.nodeName){case"class":var f=u.value.replace("ng-scope","");0<f.length&&(l+=' class="'+f+'"');break;case"schema":var p=("bespoke_"+o.name).replace(/\./g,"_");k[p]=angular.copy(o),delete k[p].directive,l+=' schema="'+p+'"';break;default:l+=" "+u.nodeName+'="'+u.value+'"'}}l+=" ";var m=E("camelCase")(o.directive);for(var h in o)if(o.hasOwnProperty(h))switch(h){case"directive":case"schema":break;case"add":switch(typeof o.add){case"string":l+=" "+o.add;break;case"object":for(var v in o.add)o.add.hasOwnProperty(v)&&(l+=" "+v+'="'+o.add[v].toString().replace(/"/g,"&quot;")+'"');break;default:throw new Error("Invalid add property of type "+typeof o.add+" in directive "+o.name)}break;case m:for(var g in o[h])o[h].hasOwnProperty(g)&&(l+=" ".concat(o.directive,"-").concat(g,'="'),"string"==typeof o[h][g]?l+="".concat(o[h][g].replace(/"/g,"&quot;"),'"'):l+="".concat(JSON.stringify(o[h][g]).replace(/"/g,"&quot;"),'"'));break;default:o[h]&&("string"==typeof o[h]?l+=" fng-fld-"+h+'="'+o[h].replace(/"/g,"&quot;")+'"':l+=" fng-fld-"+h+'="'+JSON.stringify(o[h]).replace(/"/g,"&quot;")+'"')}for(h in n)n.hasOwnProperty(h)&&"$"!==h[0]&&void 0!==n[h]&&(l+=" fng-opt-"+h+'="'+n[h].toString().replace(/"/g,"&quot;")+'"');l+='ng-model="'+o.name+'"></'+s+">",r+=l+=o.customFooter||"",i=!1}else if(o.containerType){var b=$(o);switch(o.containerType){case"tab":if(D===O.N){D=O.Forced,r+='<uib-tabset active="activeTabNo">';var y=_.findIndex(k.tabs,function(e){return e.active});k.activeTabNo=0<=y?y:0}r+=b.before,r+=N(o.content,null,n),r+=b.after;break;case"tabset":D=O.Y,r+=b.before,r+=N(o.content,null,n),r+=b.after;break;default:r+=b.before,r+=N(o.content,null,n),r+=b.after}i=!1}else if(n.subkey){var w=angular.isArray(k[n.subkey])?k[n.subkey][0].keyList:k[n.subkey].keyList;_.find(w,function(e,t){return k[n.subkey].path+"."+t===o.name})&&(i=!1)}i&&(F(o,n),r+=C(o,n))}else console.log("Empty array passed to processInstructions"),r="";return r},c=k.$watch(l.schema,function(e){if(e){var t=angular.isArray(e)?e:[e];if(0<t.length&&"function"==typeof c){c(),c=null;var n="",r=l.model||"record",g=k[r];if(g=g||{},!l.subschema&&!l.model||l.forceform){k.topLevelFormName=l.name||"myForm";var a="";for(var o in l)l.hasOwnProperty(o)&&"$"!==o[0]&&-1===["name","formstyle","schema","subschema","model","viewform"].indexOf(o)&&(a+=" "+l.$attr[o]+'="'+l[o]+'"');var i=l.forceform?"ng-form":"form";n="<".concat(i,' name="').concat(k.topLevelFormName,'" class="').concat(w(l.formstyle),'" novalidate ').concat(a,">")}else n="";if(g===k.topLevelFormName)throw new Error("Model and Name must be distinct - they are both "+g);n+=N(t,!0,l),D===O.Forced&&(n+="</uib-tabset>"),n+=l.subschema?"":"</form>",x.replaceWith(d(n)(k));var s=k[l.shared||"sharedData"],b=s?s.modelControllers:[];if((0<S.length||0<b.length)&&!k.phaseWatcher)var y=k.$watch("phase",function(e){if(k.phaseWatcher=!0,"ready"===e&&"function"==typeof y){y(),y=null;for(var t=0;t<b.length;t++)b[t].onAllReady&&b[t].onAllReady(k);for(var n=0;n<S.length;n++){for(var r,a,o=S[n],i=angular.isArray(o.subkey)?o.subkey:[o.subkey],s=o.name.split("."),l=g;1<s.length;)l=l[s.shift()]||{};l=l[s[0]]=l[s[0]]||[];for(var c=0;c<i.length;c++){if(i[c].selectFunc){if(!k[i[c].selectFunc]||"function"!=typeof k[i[c].selectFunc])throw new Error("Subkey function "+i[c].selectFunc+" is not properly set up");r=k[i[c].selectFunc](g,o)}else{if(!i[c].keyList)throw new Error("Invalid subkey setup for "+o.name);var d=i[c].keyList;for(r=0;r<l.length;r++){for(var u in a=!0,d)if(d.hasOwnProperty(u)&&l[r][u]!==d[u]&&(void 0===l[r][u]||!l[r][u].text||l[r][u].text!==d[u])){a=!1;break}if(a)break}if(!a)switch(i[c].onNotFound){case"error":var f="Cannot find matching "+(i[c].title||i[c].path);A(function(){k.showError(f,"Unable to set up form correctly")}),r=-1;break;case"create":default:var p=o.name.split("."),m=p.pop(),h=p.join("."),v=g;h&&(v=v[h]),r=v[m].push(d)-1}}k["$_arrayOffset_"+o.name.replace(/\./g,"_")+"_"+c]=r}}}});u.$broadcast("formInputDone",l.name),f.updateDataDependentDisplay&&g&&0<Object.keys(g).length&&f.updateDataDependentDisplay(g,null,!0,k)}}},!0)}}}t=e.directives||(e.directives={}),r.$inject=["$compile","$rootScope","$filter","$timeout","cssFrameworkService","formGenerator","formMarkupHelper"],(n=O=O||{})[n.Y=0]="Y",n[n.N=1]="N",n[n.Forced=2]="Forced",t.formInput=r}(fng=fng||{}),function(e){(e.directives||(e.directives={})).fngNakedDate=function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,r){r.$parsers.push(function(e){if(e)return e.toString()}),r.$formatters.push(function(e){if(e)return new Date(e)})}}}}(fng=fng||{}),function(e){var t;function n(n,t,r,a){var o,e,i,s;s=!1,i=navigator.userAgent||navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(i)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(i.substr(0,4)))&&(s=!0),e=!s,n.searchPlaceholder=e?"Ctrl + / to Search":"Search",n.handleKey=function(e){if(27===e.keyCode&&n.searchTarget&&0<n.searchTarget.length)n.searchTarget="";else if(0<n.results.length)switch(e.keyCode){case 38:0<n.focus&&n.setFocus(n.focus-1),"function"==typeof e.preventDefault&&e.preventDefault();break;case 40:n.results.length>n.focus+1&&n.setFocus(n.focus+1),"function"==typeof e.preventDefault&&e.preventDefault();break;case 13:null!=n.focus&&r.url(c(n.results[n.focus]))}},n.setFocus=function(e){null!==n.focus&&delete n.results[n.focus].focussed,n.results[e].focussed=!0,n.focus=e},n.resultClass=function(e){var t="search-result";return n.results&&n.results[e].focussed&&(t+=" focus"),t};function l(){n.moreCount=0,n.errorClass="",n.results=[],n.focus=null}function c(e){return e.url?a.html5hash()+e.url.replace("|id|",e.id):a.buildOperationUrl("edit",e.resource,void 0,e.id,e.resourceTab)}n.$watch("searchTarget",function(e){e&&0<e.length?(o=n.testTime||(new Date).valueOf(),t.get("/api/search?q="+e+"&sentAt="+o).then(function(e){var t=e.data;t.timestamps&&t.timestamps.sentAt&&Number.parseInt(t.timestamps.sentAt)!==o||(0<n.searchTarget.length?(n.results=t.results,n.results.forEach(function(e){e.href=a.html5hash()+c(e)}),n.moreCount=t.moreCount,0<t.results.length&&(n.errorClass="",n.setFocus(0)),n.errorClass=0===n.results.length?"error has-error":""):l())},function(e){console.log("Error in searchbox.js : "+e.data+" (status="+e.status+")")})):l()},!0),n.$on("$routeChangeStart",function(){n.searchTarget=""})}t=e.controllers||(e.controllers={}),n.$inject=["$scope","$http","$location","routingService"],t.SearchCtrl=n}(fng=fng||{}),function(t){var e;function n(e){return{restrict:"AE",templateUrl:"search-"+e.framework()+".html",controller:t.controllers.SearchCtrl}}e=t.directives||(t.directives={}),n.$inject=["cssFrameworkService"],e.globalSearch=n}(fng=fng||{}),function(e){(e.filters||(e.filters={})).camelCase=function(){return function(e){return e.replace(/([\:\-\_]+(.))/g,function(e,t,n,r){return r?n.toUpperCase():n})}}}(fng=fng||{}),function(e){(e.filters||(e.filters={})).extractTimestampFromMongoID=function(){return function(e){var t=e.substring(0,8);return new Date(1e3*parseInt(t,16))}}}(fng=fng||{}),function(e){(e.filters||(e.filters={})).titleCase=function(){return function(e,t){return e&&(e=e.replace(/(_|\.)/g," ").replace(/[A-Z]/g," $&").trim().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}),e=t?e.replace(/\s/g,""):e.replace(/\s{2,}/g," ")),e}}}(fng=fng||{}),function(e){(e.services||(e.services={})).addAllService=function(){function r(e,t,r,n){var a,o,i=[],s=[];if(r="addAll"+r,"string"==typeof n)for(a=n.split(" "),o=0;o<a.length;o++)s.push(a[o]);if(!function e(t){for(var n in t)n===r&&i.push(t[n]),"$parent"===n&&e(t[n])}(e),void 0!==t[r]&&"string"==typeof t[r])for(a=t[r].split(" "),o=0;o<a.length;o++)0===a[o].indexOf("class=")?s.push(a[o].substring(6,a[o].length)):i.push(a[o]);return(n=0<s.length?' class="'+s.join(" ")+'" ':" ")+(0<i.length?i.join(" ")+" ":"")}this.getAddAllGroupOptions=function(e,t,n){return r(e,t,"Group",n)},this.getAddAllFieldOptions=function(e,t,n){return r(e,t,"Field",n)},this.getAddAllLabelOptions=function(e,t,n){return r(e,t,"Label",n)},this.addAll=function(e,t,n,r){return this["getAddAll"+t+"Options"](e,r,n)||[]}}}(fng=fng||{}),function(e){(e.services||(e.services={})).cssFrameworkService=function(){var n={framework:"bs3"};return{setOptions:function(e){angular.extend(n,e)},$get:function(){return{framework:function(){return n.framework},setFrameworkForDemoWebsite:function(e){n.framework=e},span:function(e){var t;switch(n.framework){case"bs2":t="span"+Math.floor(e);break;case"bs3":t="col-xs-"+Math.floor(e)}return t},offset:function(e){var t;switch(n.framework){case"bs2":t="offset"+Math.floor(e);break;case"bs3":t="col-lg-offset-"+Math.floor(e)}return t},rowFluid:function(){var e;switch(n.framework){case"bs2":e="row-fluid";break;case"bs3":e="row"}return e}}}}}}(fng=fng||{}),function(e){function t(c){return{loadControllerAndMenu:function(e,t,n,r,a){var o,i={};t+="Ctrl",i.$scope=e.modelControllers[n]=a;var s=a.$parent;s.items=s.items||[];function l(e){angular.forEach(e,function(e){e.divider?r=!0:e[o]&&(r&&(r=!1,s.items.push({divider:!0})),s.items.push(e))})}try{c(t,i),o=s.newRecord?"creating":s.id?"editing":"listing",angular.isObject(i.$scope.contextMenu)&&(l(i.$scope.contextMenu),i.$scope.contextMenuPromise&&i.$scope.contextMenuPromise.then(function(e){return l(e)})),e.modelNameDisplayPromise&&e.modelNameDisplayPromise.then(function(e){s.modelNameDisplay=e})}catch(e){/is not a function, got undefined/.test(e.message)||/\[\$controller:ctrlreg\] The controller with the name/.test(e.message)||console.log("Unable to instantiate "+t+" - "+e.message)}}}}((e.services||(e.services={})).fngModelCtrlService=t).$inject=["$controller"]}(fng=fng||{}),function(e){var t;function n(n,t){var a,r,s={hashPrefix:"",html5Mode:!1,routing:"ngroute",prefix:""},l=["edit","view"],o=[{route:"/analyse/:model/:reportSchemaName",state:"analyse::model::report",templateUrl:"base-analysis.html"},{route:"/analyse/:model",state:"analyse::model",templateUrl:"base-analysis.html"},{route:"/:model/:id/edit",state:"model::edit",templateUrl:"base-edit.html"},{route:"/:model/:id/edit/:tab",state:"model::edit::tab",templateUrl:"base-edit.html"},{route:"/:model/:id/view",state:"model::edit",templateUrl:"base-view.html"},{route:"/:model/:id/view/:tab",state:"model::view::tab",templateUrl:"base-view.html"},{route:"/:model/new",state:"model::new",templateUrl:"base-edit.html"},{route:"/:model",state:"model::list",templateUrl:"base-list.html"},{route:"/:model/viewonly",state:"model::view",templateUrl:"base-list-view.html"},{route:"/:model/:form/:id/edit",state:"model::form::edit",templateUrl:"base-edit.html"},{route:"/:model/:form/:id/edit/:tab",state:"model::form::edit::tab",templateUrl:"base-edit.html"},{route:"/:model/:form/:id/view",state:"model::form::view",templateUrl:"base-view.html"},{route:"/:model/:form/:id/view/:tab",state:"model::form::view::tab",templateUrl:"base-view.html"},{route:"/:model/:form/new",state:"model::form::new",templateUrl:"base-edit.html"},{route:"/:model/:form",state:"model::form::list",templateUrl:"base-list.html"},{route:"/:model/:form/viewonly",state:"model::form::list::view",templateUrl:"base-list-view.html"}],c=null,d={};function i(e){var t=e;return s.templateFolder&&(t="/"!==s.templateFolder[s.templateFolder.length-1]?s.templateFolder+"/"+t:s.templateFolder+t),t}function u(e,n,r){void 0===n&&(n=""),n=n||"",angular.forEach(e,function(e){a.when(n+e.route,angular.extend(e.options||{templateUrl:i(e.templateUrl)},r))}),s.variantsForDemoWebsite&&angular.forEach(s.variantsForDemoWebsite,function(t){angular.forEach(e,function(e){a.when(n+t+e.route,angular.extend(e.options||{templateUrl:i(e.templateUrl)},r))})})}function f(e,t,n){void 0===t&&(t=""),t=t||"",angular.forEach(e,function(e){r.state(e.state,angular.extend(e.options||{url:t+e.route,templateUrl:e.templateUrl},n))})}function p(e,t,n,r,a,o){var i,s=r?"/"+r:"",l=e+"/"+n,c=o?"/"+o:"";switch(t){case"list":i=l+s;break;case"edit":i=l+s+"/"+a+"/edit"+c;break;case"view":i=l+s+"/"+a+"/view"+c;break;case"read":i=l+s+"/"+a+"/read"+c;break;case"new":i=l+s+"/new"+c}return i}function m(e,t){switch(s.routing){case"ngroute":a=n.get("$routeProvider"),e&&u(e),u(t,s.prefix,s.add2fngRoutes);break;case"uirouter":r=n.get("$stateProvider"),e&&f(s.fixedRoutes),f(t,s.prefix,s.add2fngRoutes)}}return{start:function(e){angular.extend(s,e),s.prefix[0]&&"/"!==s.prefix[0]&&(s.prefix="/"+s.prefix),t.html5Mode(s.html5Mode),""!==s.hashPrefix?t.hashPrefix(s.hashPrefix):s.html5Mode||t.hashPrefix(""),m(s.fixedRoutes,o)},addRoutes:function(e,t){m(e,t)},registerAction:function(e){l.push(e)},$get:function(){return{router:function(){return s.routing},prefix:function(){return s.prefix},parsePathFunc:function(){return function(e){if(e!==c){c=e,d={newRecord:!1},0<s.prefix.length&&0===e.indexOf(s.prefix)&&(e=e.slice(s.prefix.length));var t=e.split("/");s.variants&&-1!==s.variants.indexOf(t[1])&&(d.variant=t[1],t.shift());var n=t.length;if("analyse"===t[1])d.analyse=!0,d.modelName=t[2],d.reportSchemaName=4<=n?t[3]:null;else{d.modelName=t[1];var r=[t[n-1],t[n-2]],a=r.indexOf("new"),o=r.indexOf("viewonly"),i=void 0;-1===a&&-1===o?-1!==(i=l.reduce(function(e,t){var n=r.indexOf(t);return-1<n?n:e},-1))&&(n-=2+i,d.id=t[n]):-1!==a?(d.newRecord=!0,n-=1+a):n-=1+o,1!==i&&1!==a||(d.tab=r[0]),2<n&&(d.formName=t[2])}}return d}},html5hash:function(){return s.html5Mode?"":"#"},buildUrl:function(e){var t=s.html5Mode?"":"#";return t+=s.hashPrefix,(t+=s.prefix)[0]&&(t+="/"),t+="/"===e[0]?e.slice(1):e},buildOperationUrl:function(e,t,n,r,a){return p(s.prefix,e,t,n,r,a)},redirectTo:function(){return function(e,t,n,r,a){var o;n.search({}),o="onDelete"===e?s.onDelete?"new"===s.onDelete?p(s.prefix,"new",t.modelName,t.formName,r,a):s.onDelete:p(s.prefix,"list",t.modelName,t.formName,r,a):p(s.prefix,e,t.modelName,t.formName,r,a),n.path(o)}}}}}}t=e.services||(e.services={}),n.$inject=["$injector","$locationProvider"],t.routingService=n}(fng=fng||{}),function(e){function t(e,t,o,n,i){function g(e,t,n,r,a,o,i,s){function l(e,t){var n=angular.copy(e),r=_.find(i.tabs,function(e){return e.title===n});if(!r){if(0===i.tabs.length&&0<i.formSchema.length){i.tabs.push({title:"Main",content:[],active:"Main"===i.tab||!i.tab}),r=i.tabs[0];for(var a=0;a<i.formSchema.length;a++)r.content.push(i.formSchema[a])}r=i.tabs[i.tabs.push({title:n,containerType:"tab",content:[],active:n===i.tab})-1]}r.content.push(t)}for(var c in"function"==typeof i.onSchemaFetch&&i.onSchemaFetch(e,t),t)if(t.hasOwnProperty(c))if("_id"===c)r&&t._id.options&&t._id.options.list&&w(r,t._id.options.list,c);else if(t.hasOwnProperty(c)){var d=t[c],u=d.options||{},f=u.form||{};if(d.schema&&!f.hidden){if(o&&n){var p=[];g("Nested "+c,d.schema,p,null,c+".",!0,i,s);var m=y(c,f,a);m.schema=p,f.tab&&l(f.tab,m),void 0!==f.order?n.splice(f.order,0,m):n.push(m)}}else{if(n&&!f.hidden){var h=y(c,f,a);if(x(h.showIf,h.name,i)&&"options"!==c){var v=b(h,d,u,i,s);v.tab&&l(v.tab,v),void 0!==f.order?n.splice(f.order,0,v):n.push(v)}}r&&u.list&&w(r,u.list,c)}}"function"==typeof i.onSchemaProcessed&&i.onSchemaProcessed(e,"Main "===e.slice(0,5)?i.baseSchema():n),r&&0===r.length&&k(e,r,n,t)}function b(t,e,n,r,a){if(e.caster&&(t.array=!0,e=e.caster,angular.extend(n,e.options),e.options&&e.options.form&&angular.extend(t,e.options.form)),"String"===e.instance)n.enum?(t.type=t.type||"select",t.select2?console.log("support for fng-select2 has been removed in 0.8.3 - please convert to fng-ui-select"):(t.options=i.suffixCleanId(t,"Options"),r[t.options]=n.enum)):(t.type||(t.type=-1!==t.name.toLowerCase().indexOf("password")?"password":"text"),n.match&&(t.add='pattern="'+n.match+'" '+(t.add||"")));else if("ObjectID"===e.instance)t.ref=n.ref,t.link&&(t.link.linkOnly?(t.type="link",t.linktext=t.link.text):t.link.label?t.linklabel=!0:console.log("Unsupported link setup"),t.form=t.link.form,t.linktab=t.link.linktab,delete t.link),"link"!==t.type&&(t.type="select",t.select2||n.form&&n.form.select2?console.log("support for fng-select2 has been removed in 0.8.3 - please convert to fng-ui-select"):t.directive&&(t.noLookup||t[o("camelCase")(t.directive)]&&t[o("camelCase")(t.directive)].fngAjax)||function(){if(t.options=i.suffixCleanId(t,"Options"),t.ids=i.suffixCleanId(t,"_ids"),!t.hidden)if(n.ref)i.setUpLookupOptions(n.ref,t,r,a,g);else if(n.lookupListRef)i.setUpLookupListOptions(n.lookupListRef,t,r,a),t.lookupListRef=n.lookupListRef;else if(n.internalRef)i.handleInternalLookup(r,t,n.internalRef),t.internalRef=n.internalRef;else if(!n.customLookupOptions)throw new Error("No supported select lookup type found in ".concat(t.name))}());else if("Date"===e.instance){if(!t.type)if(t.intType="date",t.readonly)t.type="text";else if(t.directive)t.type="text";else try{t.add=t.add||"",angular.module("ui.date").requires,t.type="text",t.add+=" ui-date ui-date-format "}catch(e){t.type="date",t.add+=' fng-naked-date="x" '}}else if("boolean"===e.instance.toLowerCase())t.type=t.type||"checkbox";else{if("Number"!==e.instance)throw new Error("Field "+t.name+" is of unsupported type "+e.instance);t.type=t.type||"number",void 0!==n.min&&(t.add='min="'+n.min+'" '+(t.add||"")),void 0!==n.max&&(t.add='max="'+n.max+'" '+(t.add||"")),t.step&&(t.add='step="'+t.step+'" '+(t.add||""))}return n.required&&(t.required=!0),n.readonly&&(t.readonly=!0),void 0!==e.defaultValue?t.defaultValue=e.defaultValue:e.options&&void 0!==e.options.default&&console.log("No support for default with no value, yet"),t}function c(e,t,n){for(var r=e.split("."),a=n||t.record,o=0,i=r.length;o<i;o++)a[r[o]]||(a[r[o]]=o===i-1?[]:{}),a=a[r[o]];return a}function v(e,r){function t(e){var t=e;if("string"==typeof e&&"$"===e.slice(0,1)){var n=e.split(".");switch(n.length){case 1:t=i.getListData(r,e.slice(1));break;case 2:t=i.getListData(r,n[1]);break;default:throw new Error("Unsupported showIf format")}}return t}var n,a=t(e.lhs),o=t(e.rhs);switch(e.comp){case"eq":n=a===o;break;case"ne":n=a!==o;break;default:throw new Error("Unsupported comparator "+e.comp)}return n}var y=function(e,t,n){return t.name=n+e,t},w=function(e,t,n){"object"==typeof t?(t.name=n,e.push(t)):e.push({name:n})},k=function(e,t,n,r){if(n){for(var a=0,o=n.length;a<o;a++)if("text"===n[a].type){t.push({name:n[a].name});break}0===t.length&&0!==n.length&&t.push({name:n[0].name})}if(0===t.length){for(var i in r)if("_id"!==i&&r.hasOwnProperty(i)){t.push({name:i});break}if(0===t.length)throw new Error("Unable to generate a title for "+e)}},x=function(e,r,a){var o=0;function t(e){if("string"==typeof e&&"$"===e.slice(0,1)){var t=e.slice(1),n=a.dataDependencies[t]||[];n.push(r),a.dataDependencies[t]=n,o+=1}}var n=!0;return e&&(t(e.lhs),t(e.rhs),0!==o||v(e,void 0)||(n=!1)),n};return{generateEditUrl:function(e,t){return n.buildUrl(t.modelName+"/"+(t.formName?t.formName+"/":"")+e._id+"/edit")},generateViewUrl:function(e,t){return n.buildUrl(t.modelName+"/"+(t.formName?t.formName+"/":"")+e._id+"/view")},generateNewUrl:function(e){return n.buildUrl(e.modelName+"/"+(e.formName?e.formName+"/":"")+"new")},handleFieldType:b,handleSchema:g,updateDataDependentDisplay:function(e,t,n,r){var a,o,i,s,l,c;for(var d in r.dataDependencies)if(r.dataDependencies.hasOwnProperty(d)){var u=d.split(".");if(1===u.length){if(n||!t||e[d]!==t[d])for(a=r.dataDependencies[d],o=0;o<a.length;o+=1){var f=a[o];for(i=0;i<r.formSchema.length;i+=1)r.formSchema[i].name===f&&(l=angular.element(document.querySelector("#cg_"+r.formSchema[i].id)),v(r.formSchema[i].showIf,e)?l.removeClass("ng-hide"):l.addClass("ng-hide"))}}else{if(2!==u.length)throw new Error("You can only go down one level of subdocument with showIf");if(void 0===c&&(c=!0),e[u[0]])for(s=0;s<e[u[0]].length;s++)if(n||!t||!t[u[0]]||!t[u[0]][s]||e[u[0]][s][u[1]]!==t[u[0]][s][u[1]])for(a=r.dataDependencies[d],o=0;o<a.length;o+=1){var p=a[o].split(".");if(2!==p.length)throw new Error("Conditional display must control dependent fields at same level ");for(i=0;i<r.formSchema.length;i+=1)if(r.formSchema[i].name===p[0])for(var m=r.formSchema[i].schema,h=0;h<m.length;h++)m[h].name===a[o]&&(0===(l=angular.element(document.querySelector("#f_"+p[0]+"List_"+s+" #cg_f_"+a[o].replace(".","_")))).length?l=angular.element(document.querySelector("#f_elements-"+s+"-"+p[1])):c=!1,0<l.length&&(v(r.formSchema[i].schema[h].showIf,e[u[0]][s])?l.show():l.hide()))}}}return c},add:function(t,e,n,r){var a;if(e.target.offsetParent){var o=c(t,n,r),i=n.formSchema.find(function(e){return e.name===t}),s=i?i.schema:null,l=s?n.setDefaults(s,t+"."):{};"function"==typeof(null===(a=n.dataEventFunctions)||void 0===a?void 0:a.onInitialiseNewSubDoc)&&n.dataEventFunctions.onInitialiseNewSubDoc(t,s,l),o.push(l),n.setFormDirty(e)}},unshift:function(e,t,n,r){c(e,n,r).unshift({}),n.setFormDirty(t)},remove:function(t,e,n,r,a){var o,i=c(t,r,a);if("function"==typeof r.dataEventFunctions.onDeleteSubDoc){var s=r.formSchema.find(function(e){return e.name===t}),l=s?s.schema:null;o=r.dataEventFunctions.onDeleteSubDoc(t,l,i,e)}o?r.showError(o):(i.splice(e,1),r.setFormDirty(n))},hasError:function(e,t,n,r){var a=!1;if(r){var o=r[r.topLevelFormName];if("null"!==e&&(o=o[e.replace("$index",n)]),o){var i=o[t];i&&i.$invalid&&!i.$$attr.readonly&&(i.$dirty?a=!0:angular.forEach(i.$validators,function(e,t){"required"!==t&&i.$error[t]&&(a=!0)}))}}else console.log("hasError called with no scope! ",e,t,n);return a},decorateScope:function(a,o,n,e){a.record=e.record,a.phase="init",a.disableFunctions=e.disableFunctions,a.dataEventFunctions=e.dataEventFunctions,a.topLevelFormName=void 0,a.formSchema=[],a.tabs=[],a.listSchema=[],a.recordList=[],a.dataDependencies={},a.internalLookups=[],a.listLookups=[],a.conversions={},a.pageSize=60,a.pagesLoaded=0,(e.baseScope=a).generateEditUrl=function(e){return o.generateEditUrl(e,a)},a.generateViewUrl=function(e){return o.generateViewUrl(e,a)},a.generateNewUrl=function(){return o.generateNewUrl(a)},a.scrollTheList=function(){return n.scrollTheList(a)},a.getListData=function(e,t){return n.getListData(e,t,a.listSchema,a)},a.setPristine=function(e){e&&a.dismissError(),a[a.topLevelFormName]&&a[a.topLevelFormName].$setPristine()},a.skipCols=function(e){return 0<e?"col-md-offset-3":""},a.setFormDirty=function(e){e?angular.element(e.target).inheritedData("$formController").$setDirty():console.log("setFormDirty called without an event (fine in a unit test)")},a.add=function(e,t,n){return o.add(e,t,a,n)},a.hasError=function(e,t,n){return o.hasError(e,t,n,a)},a.unshift=function(e,t,n){return o.unshift(e,t,a,n)},a.remove=function(e,t,n,r){return o.remove(e,t,n,a,r)},a.baseSchema=function(){return a.tabs.length?a.tabs:a.formSchema}}}}((e.services||(e.services={})).formGenerator=t).$inject=["$location","$timeout","$filter","routingService","recordHandler"]}(fng=fng||{}),function(e){var t;function n(f,p,m,a){function d(e,t){var n=["vertical","inline"];return t||n.push("stacked"),!e||"undefined"===e||!n.includes(e)}function s(){return"bs2"===f.framework()?"icon":"glyphicon glyphicon"}return{isHorizontalStyle:d,fieldChrome:function(e,t,n){var r=t.classes||"",a="",o="",i="";if(t.showWhen=t.showWhen||t.showwhen,t.showWhen&&("string"==typeof t.showWhen?i+='ng-show="'+t.showWhen+'"':i+='ng-show="'+function(e,a){function t(e){var t=e;if("string"==typeof e)if("$"===e.slice(0,1)){t=(a||"record")+".";var n=e.slice(1).split(".");if(1<n.length){var r=n.pop();t+=n.join(".")+"[$index]."+r}else t+=e.slice(1)}else t="'"+e+"'";return t}var n=["eq","ne","gt","gte","lt","lte"].indexOf(e.comp);if(-1===n)throw new Error("Invalid comparison in showWhen");return t(e.lhs)+["===","!==",">",">=","<","<="][n]+t(e.rhs)}(t.showWhen,n.model)+'"'),t.id&&"function"==typeof t.id.replace&&(i+=' id="cg_'+t.id.replace(/\./g,"-")+'"'),"bs3"===f.framework()){var s;r+=" form-group","vertical"===n.formstyle&&"block-level"!==t.size&&(a+='<div class="row">',r+=" col-sm-"+p.sizeAsNumber(t.size),o+="</div>");var l=null,c=t.name.split(".");s=n&&void 0!==n.subkeyno?n.subschemaroot.replace(/\./g,"-")+"-subkey"+n.subkeyno+"-"+c[c.length-1]:n.subschema?(l="form_"+c.slice(0,-1).join("_")+"$index",t.name.replace(/\./g,"-")):"f_"+t.name.replace(/\./g,"_"),a+="<div"+m.addAll(e,"Group",r,n)+" ng-class=\"{'has-error': hasError('"+l+"','"+s+"', $index)}\"",o+="</div>"}else o=d(n.formstyle,!0)?(a+="<div"+m.addAll(e,"Group","control-group",n),"</div>"):(a+="<span ","</span>");return{template:a+=(i||"")+">",closeTag:o}},label:function(e,t,n,r){var a="";if("bs3"===f.framework()||!["inline","stacked"].includes(r.formstyle)&&""!==t.label||n){a="<label";var o="control-label";if(d(r.formstyle,!1)?(t.linklabel||(a+=' for="'+t.id+'"'),void 0!==t.labelDefaultClass?o+=" "+t.labelDefaultClass:"bs3"===f.framework()&&(o+=" col-sm-3")):["inline","stacked"].includes(r.formstyle)&&(a+=' for="'+t.id+'"',o+=" sr-only"),a+=m.addAll(e,"Label",null,r)+' class="'+o+'">'+t.label,n&&(a+=' <i id="add_'+t.id+'" ng-click="add(\''+t.name+'\',$event)" class="'+s()+'-plus-sign"></i>'),a+="</label>",t.linklabel){var i='<fng-link fld="'+t.name+'" ref="'+t.ref+'" text="'+escape(a)+'"';t.form&&(i+=' form="'+t.form+'"'),t.linktab&&(i+=' linktab="'+t.linktab+'"'),a=i+="></fng-link>"}}return a},glyphClass:s,allInputsVars:function(e,t,n,r,a,o){var i,s=t.placeHolder,l="",c="",d="",u="";return"bs3"===f.framework()?(l=-1===["horizontal","vertical","inline"].indexOf(n.formstyle)?" input-sm":"",c="col-sm-"+p.sizeAsNumber(t.size),u=" form-control"):d=t.size?" input-"+t.size:"",["inline","stacked"].includes(n.formstyle)&&(s=s||t.label),i='data-ng-model="'+r+'"'+(a?' id="'+a+'" name="'+a+'" ':' name="'+o+'" '),i+=s?'placeholder="'+s+'" ':"",t.popup&&(i+='title="'+t.popup+'" '),t.ariaLabel&&(i+='aria-label="'+t.ariaLabel+'" '),{common:i+=m.addAll(e,"Field",null,n),sizeClassBS3:c,sizeClassBS2:d,compactClass:l,formControl:u}},inputChrome:function(e,t,n,r){"bs3"===f.framework()&&d(n.formstyle,!0)&&"checkbox"!==t.type&&(e='<div class="bs3-input '+r.sizeClassBS3+'">'+e+"</div>");var a=(t.helpInline||"")+(t.helpinline||"");if(0<a.length){var o="bs2"===f.framework()?{el:"span",cl:"help-inline"}:{el:"div",cl:"help-block"};e+="<".concat(o.el,' class="').concat(o.cl,'">').concat(a,"</").concat(o.el,">")}return n.noid||(e+='<div ng-if="'.concat(n.name||"myForm","['").concat(t.id,'\'].$dirty" class="help-block">')+' <div ng-messages="'.concat(n.name||"myForm","['").concat(t.id,"'].$error\">")+' <div ng-messages-include="error-messages.html"> </div> </div></div>'),t.help&&(e+='<div class="help-block">'+t.help+"</div>"),e},generateSimpleInput:function(e,t,n){var r="<input "+e+'type="'+t.type+'" ';return t.label||t.ariaLabel?n.subschema&&(r+='aria-label="'.concat(t.label?a("titleCase")(n.subschemaroot)+" "+t.label:t.popup||t.name.replace(/\./g," "),'" ')):r+='aria-label="'.concat(t.name.replace(/\./g," "),'" '),"inline"!==n.formstyle||"bs2"!==f.framework()||t.size||(r+='class="input-small"'),r+=" />"},controlDivClasses:function(e){var t=[];return d(e.formstyle,!1)&&t.push("bs2"===f.framework()?"controls":"col-sm-9"),t},handleInputAndControlDiv:function(e,t){return 0<t.length&&(e='<div class="'+t.join(" ")+'">'+e+"</div>"),e},handleArrayInputAndControlDiv:function(e,t,n,r){var a="<div ";return"bs3"===f.framework()&&(a+='ng-class="skipCols($index)" '),a+='class="'+t.join(" ")+'" id="'+n.id+'List" ',a+='ng-repeat="arrayItem in '+(r.model||"record")+"."+n.name+' track by $index">',a+=e,"link"!==n.type&&(a+="<i ng-click=\"remove('"+n.name+'\',$index,$event)" id="remove_'+n.id+'_{{$index}}" class="'+s()+'-minus-sign"></i>'),a+="</div>"},addTextInputMarkup:function(e,t,n){var r="",a=e.formControl.trim()+e.compactClass+e.sizeClassBS2+(t.class?" "+t.class:"");return 0!==a.length&&(r+='class="'+a+'"'),t.add&&(r+=" "+t.add+" "),r+=n,t.readonly?r+=" ".concat("boolean"==typeof t.readOnly?"readonly":'ng-readonly="'+t.readonly+'"'," "):r+=" ",r}}}t=e.services||(e.services={}),n.$inject=["cssFrameworkService","inputSizeHelper","addAllService","$filter"],t.formMarkupHelper=n}(fng=fng||{}),function(e){(e.services||(e.services={})).inputSizeHelper=function(){var t=[1,2,4,6,8,10,12],n=["mini","small","medium","large","xlarge","xxlarge","block-level"];return{sizeMapping:t,sizeDescriptions:n,defaultSizeOffset:2,sizeAsNumber:function(e){return t[e?n.indexOf(e):2]}}}}(fng=fng||{}),function(e){var t;function n(b){return{extractFromAttr:function(e,t){function n(e){var t=e.replace(/&quot;/g,'"');return"true"===t?t=!0:"false"===t?t=!1:!isNaN(parseFloat(t))&&isFinite(t)&&(t=parseFloat(t)),t}var r={},a={formStyle:e.formstyle},o={},i=t?t.length:0,s=null==t?void 0:t.toLowerCase();for(var l in e)if(e.hasOwnProperty(l)){var c=l.toLowerCase();"fngfld"===c.slice(0,6)?r[c.slice(6)]=n(e[l]):"fngopt"===c.slice(0,6)?a[c.slice(6)]=n(e[l]):t&&c.slice(0,i)===s&&(o[_.kebabCase(l.slice(i))]=n(e[l]))}return{info:r,options:a,directiveOptions:o}},buildInputMarkup:function(e,t,n,r,a,o,i){var s,l,c,d=b.fieldChrome(e,n,r,' id="cg_'+n.id+'"'),u=b.controlDivClasses(r),f=d.template+b.label(e,n,a,r);if(c=a?(s="arrayItem"+(o?".x":""),l=n.id+"_{{$index}}",n.name+"_{{$index}}"):(s=t+"."+n.name,l=n.id,n.name),r.subschema&&-1!==n.name.indexOf(".")){var p=t+".",m=n.name,h=r.subschemaroot,v=m.slice(h.length+1);s=p,r.index?l="f_"+(s+=h+"["+r.index+"]."+v).slice(p.length).replace(/(\.|\[|\]\.)/g,"-"):(s+=h,r.subkey?(l=s.slice(p.length).replace(/\./g,"-")+"-subkey"+r.subkeyno+"-"+v,s+="[$_arrayOffset_"+h.replace(/\./g,"_")+"_"+r.subkeyno+"]."+v):(s+="[$index]."+v,l=null,c=m.replace(/\./g,"-")))}var g=b.allInputsVars(e,n,r,s,l,c);return g.modelString=s,f+=b["handle"+(a?"Array":"")+"InputAndControlDiv"](b.inputChrome(i(g),n,r,g),u,n,r),f+=d.closeTag},findIdInSchemaAndFlagNeedX:function e(t,n){for(var r=!1,a=0;a<t.length;a++){var o=t[a];if(o.id===n){r=o.needsX=!0;break}if(o.schema&&e(o.schema,n)){r=!0;break}}return r}}}t=e.services||(e.services={}),n.$inject=["formMarkupHelper"],t.pluginHelper=n}(fng=fng||{}),function(I){var e;function t(c,d,a,u,o,i,m,e){var s=function(e){return void 0===e&&(e=function(e){return Math.floor(e).toString(16)}),e(Date.now()/1e3)+" ".repeat(16).replace(/./g,function(){return e(16*Math.random())})};function f(e){if(-1===["cancel","backdrop click","escape key press"].indexOf(e))throw e}function b(e,t){return(e.id||"f_"+e.name).replace(/\./g,"_")+t}function l(e,t,n,r){void 0===r&&(r=!1);for(var a=t.split("."),o=a.length-1,i=e,s=0;s<o;s++){if(!i)throw new Error("walkTree failed: Object = ".concat(e,", fieldname = ").concat(t,", i = ").concat(s));if(i=angular.isArray(i)?_.map(i,function(e){return e[a[s]]}):(r&&!i[a[s]]&&(i[a[s]]={}),i[a[s]]),angular.isArray(i)&&void 0!==n)if(n.scope&&"function"==typeof n.scope)i=i[n.scope().$index];else{if("number"!=typeof n)throw new Error("Unsupported element type in walkTree "+t);i=i[n]}if(!i)break}return{lastObject:i,key:i?a[o]:void 0}}function y(e,t,n,r){var a=l(e,t,n,!!r);if(a.lastObject&&a.key)if(r)if(angular.isArray(a.lastObject))for(var o=0;o<a.lastObject.length;o++)a.lastObject[o][a.key]=r[o];else a.lastObject[a.key]=r;else delete a.lastObject[a.key]}function h(t,n,e,r){if(void 0===r&&(r=!1),!n.topLevelFormName||n[n.topLevelFormName]&&(r||n[n.topLevelFormName].$pristine)){x(t.name,e.master,function(e){return"object"==typeof e&&e.id?e:S(t,e,n[b(t,"Options")],n[b(t,"_ids")])});var a=w(e.master,t.name);a&&y(n.record,t.name,void 0,a)}}var w=function(e,t,n){var r,a=l(e,t,n);return a.lastObject&&a.key&&(r=angular.isArray(a.lastObject)?_.map(a.lastObject,function(e){return e[a.key]}):a.lastObject[a.key]),r};function k(e,t,n,r){void 0===n&&(n=null);var a=w(e,t)||"";if(a&&n){var o=_.find(n,function(e){return e.name===t});if(o)switch(o.params){case void 0:break;case"timestamp":var i=a.toString().substring(0,8),s=new Date(1e3*parseInt(i,16));a=s.toLocaleDateString()+" "+s.toLocaleTimeString();break;default:a=r.dataEventFunctions[o.params](e)}}return a}function x(e,t,n){var r,a,o=(r=e.split("."),a=[r[0]],1<r.length&&a.push(r.slice(1).join(".")),a);if(1<o.length)!function(e,t,n){if(void 0!==t)if(angular.isArray(t))for(var r=0;r<t.length;r++)x(e,t[r],n);else x(e,t,n)}(o[1],t[o[0]],n);else if(t[o[0]]){var i=t[o[0]];if(angular.isArray(i))for(var s=i.length-1;0<=s;s--){var l=typeof i[s];("undefined"==l||"object"==l&&0===Object.keys(i[s]).length)&&i.splice(s,1)}t[o[0]]=n(i)}}function v(e,t,n,r,a){var o="string"==typeof t?e[t]:t,i="string"==typeof n?e[n]:n;o.length=0,i.length=0,r&&0<r.length&&r.forEach(function(e){var t=e[a];t&&0<t.length&&(o.push(t),e._id||(e._id=s()),i.push(e._id))})}var $=function(e){var t=!1;return e.needsX?t=!0:e.directive||("text"===e.type?t=!0:"select"!==e.type||e.ids||(t=!0)),t};function C(e,t,n){var r=e.conversions;return n&&(r=w(r,n)||{}),r[t]}var g=function(e,t,n,r,a,o,i){o=o||t;for(var s=0;s<e.length;s++){var l=e[s],c=l.name.slice(n);c.length||(c=l.name.split(".").pop());var d=w(t,c);if("date"===l.intType&&"string"==typeof d&&y(t,c,null,new Date(d)),l.schema){if(d)for(var u=0;u<d.length;u++)d[u]=g(l.schema,d[u],1+c.length,r,c,o,u)}else{l.internalRef&&v(r,l.options,l.ids,o[l.internalRef.property],l.internalRef.value);var f=k(t,c,null,r);if(l.array&&$(l)&&f&&!(0<f.length&&f[0].x))for(var p=0;p<f.length;p++)f[p]={x:f[p]};var m=r[b(l,"_ids")],h=void 0;if(d&&m&&0<m.length){if(-1!==c.indexOf("."))throw new Error("Trying to directly assign to a nested field 332");!d.toString().match(/^[a-f0-9]{24}$/)||l.internalRef&&l.internalRef.noConvert||(t[c]=S(l,d,r[b(l,"Options")],m))}else l.select2?(console.log("fng-select2 is deprecated - use fng-ui-select instead"),l.select2):d&&(h=C(r,c,a))&&h.fngajax&&!h.noconvert&&h.fngajax(d,l,function(e,t){y(o,e.name,i,t),N(angular.element("#"+e.id),function(){y(r.record,e.name,i,t)})})}}return t};function S(e,t,n,r){if(e.array||angular.isArray(t)){for(var a=[],o=e.array&&(!e.directive||$(e)),i=0;i<t.length;i++){var s=t[i];s&&s.x&&(s=s.x);var l=p(s,r,n,e.name);o&&(l={x:l}),a.push(l)}return a}return e.select2?{id:t,text:p(t,r,n,e.name)}:p(t,r,n,e.name)}function D(e,t,n,r){var a=_.isObject(e)?e.x||e.text:e;if(a&&a.match(/^[0-9a-f]{24}$/))return a;var o=t.indexOf(a);if(-1===o)throw new Error("convertListValueToId: Invalid data - value "+a+" not found in "+t+" processing "+r);return n[o]}function F(e,t,n){n.master=g(t.formSchema,e,0,t),t.phase="ready",t.cancel()}var N=function(e,t){var n=e.inheritedData("$ngModelController"),r=n&&n.$pristine;r&&(n.$pristine=!1),t(),r&&(n.$pristine=!0)},p=function(e,t,n,r){"object"==typeof e&&(e=e.id);var a=t.indexOf(e);if(-1===a&&-1===(a=n.indexOf(e)))throw new Error("convertIdToListValue: Invalid data - id "+e+" not found in "+t+" processing "+r);return n[a]};function E(t,n,r,e,a){if(a&&0<a.length&&a.length===e.length&&n[r]){var o=a.findIndex(function(e){return e[t.value]===n[r]});if(-1<o){var i=e[o][t.value];i&&(n[r]=i)}}}function A(e,f,a,t,p){var n=!f.id&&!f.newRecord;function o(o,u){f.internalLookups.forEach(function(n){var r=o[n.ref.property],a=u[n.ref.property];v(f,n.lookupOptions,n.lookupIds,r,n.ref.value),(r&&0<r.length||a&&0<a.length)&&n.handlers.forEach(function(t){if(t.possibleArray){var e=w(f.record,t.possibleArray,null);e&&0<e.length&&e.forEach(function(e){return E(n.ref,e,t.lastPart,r,a)})}else angular.isArray(f.record[t.lastPart])?f.record[t.lastPart].forEach(function(e){E(n.ref,e,"x",r,a)}):E(n.ref,f.record,t.lastPart,r,a)})}),f.listLookups.forEach(function(c){function e(e,t){var n=e[t];return n&&n.id&&(n=n.id),n}function d(e){y(f.record,e.name)}var t=c.ref.id.slice(1);if(t.includes("."))throw new Error("No support for nested list lookups yet - ".concat(JSON.stringify(c.ref)));var n=e(o,t),r=e(u,t);n!==r&&(n?(r&&c.handlers.forEach(function(t){t.oldValue=w(f.record,t.formInstructions.name),angular.isArray(t.oldValue)?t.oldId=t.oldValue.map(function(e){return f[t.formInstructions.ids][f[t.formInstructions.options].indexOf(e)]}):t.oldId=f[t.formInstructions.ids][f[t.formInstructions.options].indexOf(t.oldValue)]}),m.readRecord(c.ref.collection,n).then(function(l){c.handlers.forEach(function(r){var a=f[r.formInstructions.options];a.length=0;var o=f[r.formInstructions.ids];o.length=0;for(var e=l.data[c.ref.property]||[],t=0;t<e.length;t++){var n=e[t][c.ref.value],i=_.sortedIndex(a,n);a[i]===n&&(n=n+" ("+e[t]._id+")",i=_.sortedIndex(a,n)),a.splice(i,0,n),o.splice(i,0,e[t]._id)}if(0===Object.keys(u).length)h(r.formInstructions,f,p,!0);else if(r.oldId)if(angular.isArray(r.oldId))r.oldId.forEach(function(e,t){var n=o.indexOf(e);y(f.record,r.formInstructions.name,t,-1===n?void 0:a[n])});else{var s=o.indexOf(r.oldId);-1!==s?y(f.record,r.formInstructions.name,void 0,a[s]):d(r.formInstructions)}else d(r.formInstructions)})})):c.handlers.forEach(function(e){f[e.formInstructions.options].length=0,f[e.formInstructions.ids].length=0,d(e.formInstructions)}))})}function r(){f.phase="ready",f.cancel(),o(f.record,{})}if(a.handleSchema("Main "+f.modelName,e,n?null:f.formSchema,f.listSchema,"",!0,f,p),n)p.allowLocationChange=!0;else{var i=!0;if(f.newRecord||(f.dropConversionWatcher=f.$watchCollection("conversions",function(e,t){e!==t&&f.originalData&&F(f.originalData,f,p)})),f.$watch("record",function(e,t){if(e!==t&&(0<Object.keys(t).length&&f.dropConversionWatcher&&(f.dropConversionWatcher(),f.dropConversionWatcher=null),i=a.updateDataDependentDisplay(e,t,i,f),o(e,t),I.formsAngular.title)){var n=I.formsAngular.title.prefix||"";if(f.editFormHeader)n+=f.editFormHeader();else for(var r in f.listSchema)f.listSchema.hasOwnProperty(r)&&(n+=f.getListData(f.record,f.listSchema[r].name)+" ");n=n.trimEnd()+(I.formsAngular.title.suffix||""),d.document.title=n}},!0),f.id)"function"==typeof f.dataEventFunctions.onBeforeRead?f.dataEventFunctions.onBeforeRead(f.id,function(e){e?f.showError(e):t.readRecord(f,p)}):t.readRecord(f,p);else{p.allowLocationChange=!1,p.master=f.setDefaults(f.formSchema);var s=f.initialiseNewRecord||c.$$search.r;if(s)try{Object.assign(p.master,JSON.parse(s)),f.newRecordsStartPristine||f.$on("fngCancel",function(){u(function(){f[f.topLevelFormName]&&f[f.topLevelFormName].$setDirty()},1e3)})}catch(e){console.log("Error parsing specified record : "+e.message)}"function"==typeof f.dataEventFunctions.onInitialiseNewRecord&&(console.log("onInitialiseNewRecord is deprecated - use the async version - onNewRecordInit(data,cb)"),f.dataEventFunctions.onInitialiseNewRecord(p.master)),"function"==typeof f.dataEventFunctions.onNewRecordInit?f.dataEventFunctions.onNewRecordInit(p.master,function(e){e?f.showError(e):r()}):r()}}}function t(r){return function(e){if(-1!==[200,400].indexOf(e.status)){var t="";if(e.data&&e.data.errors)for(var n in e.data.errors)if(e.data.errors.hasOwnProperty(n)){switch(t+="<li><b>"+a("titleCase")(n)+": </b> ",e.data.errors[n].type){case"enum":t+="You need to select from the list of values";break;default:t+=e.data.errors[n].message}t+="</li>"}t=0<t.length?(e.data.message||e.data._message)+"<br /><ul>"+t+"</ul>":e.data.message||e.data._message||e.data.err||"Error! Sorry - No further details available.",r.showError(t)}else r.showError(e.status+" "+JSON.stringify(e.data))}}function L(e,t,n){n.allowLocationChange=!1,t.phase="reading","function"==typeof t.dataEventFunctions.onAfterRead&&t.dataEventFunctions.onAfterRead(e),t.originalData=e,F(e,t,n)}function r(e,t,n,r){var a=t.name.split("."),o=r.find(function(e){return e.ref.property===n.property&&e.ref.value===n.value}),i={formInstructions:t,lastPart:a.pop(),possibleArray:a.join(".")};o||(o={ref:n,lookupOptions:[],lookupIds:[],handlers:[]},r.push(o)),o.handlers.push(i),e[t.options]=o.lookupOptions,e[t.ids]=o.lookupIds}return{readRecord:function(t,n){t.readingRecord=m.readRecord(t.modelName,t.id),t.readingRecord.then(function(e){L(angular.copy(e.data),t,n)},function(e){404===e.status?c.path("/404"):t.handleHttpError(e)})},scrollTheList:function(n){var r=n.pagesLoaded;m.getPagedAndFilteredList(n.modelName,{aggregate:c.$$search.a,find:c.$$search.f,limit:n.pageSize,skip:r*n.pageSize,order:c.$$search.o}).then(function(e){var t=e.data;angular.isArray(t)?r===n.pagesLoaded?(n.pagesLoaded++,n.recordList=n.recordList.concat(t)):console.log("DEBUG: infinite scroll component asked for a page twice - the model was "+n.modelName):n.showError(t,"Invalid query")},n.handleHttpError)},deleteRecord:function(e,t,n){t.phase="deleting",m.deleteRecord(t.modelName,e).then(function(){"function"==typeof t.dataEventFunctions.onAfterDelete&&t.dataEventFunctions.onAfterDelete(n.master),o.redirectTo()("onDelete",t,c)},function(e){404===e.status?o.redirectTo()("onDelete",t,c):t.showError("".concat(e.statusText," (").concat(e.status,") while deleting record<br />").concat(e.data),"Error deleting record")})},updateDocument:function(e,n,r,a){r.phase="updating",m.updateRecord(r.modelName,r.id,e).then(function(e){var t=e.data;!1!==t.success?("function"==typeof r.dataEventFunctions.onAfterUpdate&&r.dataEventFunctions.onAfterUpdate(t,a.master),n.redirect?(n.allowChange&&(a.allowLocationChange=!0),d.location=n.redirect):(L(t,r,a),r.setPristine(!1))):(r.showError(t),r.phase="ready")},function(e){r.handleHttpError(e),r.phase="ready"})},createNew:function(e,n,r,a){m.createRecord(r.modelName,e).then(function(e){var t=e.data;!1!==t.success?(a.allowLocationChange=!0,"function"==typeof r.dataEventFunctions.onAfterCreate&&r.dataEventFunctions.onAfterCreate(t),n.redirect?d.location=n.redirect:o.redirectTo()("edit",r,c,t._id)):r.showError(t)},r.handleHttpError)},getListData:k,suffixCleanId:b,setData:y,setUpLookupOptions:function(n,l,c,d,r){var u=c[l.options]=[],f=c[l.ids]=[];e.getSchema(n).then(function(e){var t=e.data,s=[];r("Lookup "+n,t,null,s,"",!1,c,d),(void 0!==l.filter&&l.filter?m.getPagedAndFilteredList(n,l.filter):m.getAll(n)).then(function(e){var t=angular.copy(e.data);if(t){for(var n=0;n<t.length;n++){for(var r="",a=0;a<s.length;a++){var o=t[n][s[a].name];r+=o?o+" ":""}r=r.trim();var i=_.sortedIndex(u,r);u[i]===r&&(r=r+" ("+t[n]._id+")",i=_.sortedIndex(u,r)),u.splice(i,0,r),f.splice(i,0,t[n]._id)}c.readingRecord&&c.readingRecord.then(function(){h(l,c,d)})}})})},setUpLookupListOptions:function(o,i,s,l){var c=s[i.options]=[],d=s[i.ids]=[];"$"===o.id[0]?r(s,i,o,s.listLookups):m.readRecord(o.collection,s.$eval(o.id)).then(function(e){for(var t=e.data[o.property],n=0;n<t.length;n++){var r=t[n][o.value],a=_.sortedIndex(c,r);c[a]===r&&(r=r+" ("+t[n]._id+")",a=_.sortedIndex(c,r)),c.splice(a,0,r),d.splice(a,0,t[n]._id)}h(i,s,l)})},handleInternalLookup:function(e,t,n){r(e,t,n,e.internalLookups)},preservePristine:N,convertToMongoModel:function d(u,f,p,m,h){function v(e,t){var n;return t&&t.fngajax?e&&(n=e.id||e):e&&(n=e.text||(e.x?e.x.text:e)),n}function e(){var t=u[g],e=t.name.slice(p),n=k(f,e,null,m);if(t.schema){if(n)for(var r=0;r<n.length;r++)n[r]=d(t.schema,n[r],1+e.length,m,e)}else{if(t.array&&$(t)&&n)for(var a=0;a<n.length;a++)n[a]=n[a].x;var o=m[b(t,"_ids")];if(o&&0<o.length)x(e,f,function(e){return function(e,t,n,r){if(e.array){for(var a=[],o=0;o<t.length;o++)a.push(D(t[o],n,r,e.name));return a}return D(t,n,r,e.name)}(t,e,m[b(t,"Options")],o)});else{var i=C(m,e,h);if(i){var s=w(f,e,null),l=void 0;if(t.array){if(l=[],s)for(var c=0;c<s.length;c++)l[c]=v(s[c],i)}else l=v(s,i);y(f,e,null,l)}}}}for(var g=0;g<u.length;g++)e();return f},convertIdToListValue:p,handleError:t,decorateScope:function(l,n,r,a){l.handleHttpError=t(l),l.cancel=function(){angular.copy(a.master,l.record),l.$broadcast("fngCancel",l),u(l.setPristine)},l.$on("showErrorMessage",function(e,t){e.defaultPrevented||(e.defaultPrevented=!0,l.showError(t.body,t.title))}),l.showError=function(t,e){if(l.alertTitle=e||"Error!","string"==typeof t)l.errorMessage=t;else if(t)if(t.message&&"string"==typeof t.message)l.errorMessage=t.message;else if(t.data&&t.data.message)l.errorMessage=t.data.message;else try{l.errorMessage=JSON.stringify(t)}catch(e){l.errorMessage=t}else l.errorMessage="An error occurred - that's all we got. Sorry.";l.errorHideTimer=window.setTimeout(function(){l.dismissError(),l.$digest()},3500+1e3*(l.alertTitle+l.errorMessage).length/50),l.errorVisible=!0,window.setTimeout(function(){l.$digest()})},l.clearTimeout=function(){l.errorHideTimer&&(clearTimeout(l.errorHideTimer),delete l.errorHideTimer)},l.dismissError=function(){l.clearTimeout,l.errorVisible=!1,delete l.errorMessage,delete l.alertTitle},l.stickError=function(){clearTimeout(l.errorHideTimer)},l.prepareForSave=function(t){var n=r.convertToMongoModel(l.formSchema,angular.copy(l.record),0,l);l.id?"function"==typeof l.dataEventFunctions.onBeforeUpdate?l.dataEventFunctions.onBeforeUpdate(n,a.master,function(e){e?t(e):t(null,n)}):t(null,n):"function"==typeof l.dataEventFunctions.onBeforeCreate?l.dataEventFunctions.onBeforeCreate(n,function(e){e?t(e):t(null,n)}):t(null,n)},l.save=function(n){n=n||{},l.prepareForSave(function(e,t){e?"_update_handled_"!==e&&u(function(){l.showError(e)}):l.id?r.updateDocument(t,n,l,a):r.createNew(t,n,l,a)})},l.newClick=function(){o.redirectTo()("new",l,c)},l.$on("$locationChangeStart",function(e,t){a.allowLocationChange||l.isCancelDisabled()||(e.preventDefault(),n.open({template:'<div class="modal-header">\n <h3>Record modified</h3>\n</div>\n<div class="modal-body">\n <p>Would you like to save your changes?</p>\n</div>\n<div class="modal-footer">\n <button class="btn btn-primary dlg-yes" ng-click="yes()">Yes</button>\n <button class="btn btn-warning dlg-no" ng-click="no()">No</button>\n <button class="btn dlg-cancel" ng-click="cancel()">Cancel</button>\n</div>',controller:"SaveChangesModalCtrl",backdrop:"static"}).result.then(function(e){e?l.save({redirect:t,allowChange:!0}):(a.allowLocationChange=!0,d.location=t)}).catch(f))}),l.deleteClick=function(){if(l.record._id){var e=void 0;if(l.unconfirmedDelete)e=Promise.resolve(!0);else e=n.open({template:'<div class="modal-header">\n <h3>Delete Item</h3>\n</div>\n<div class="modal-body">\n <p>Are you sure you want to delete this record?</p>\n</div>\n<div class="modal-footer">\n <button class="btn btn-primary dlg-no" ng-click="cancel()">No</button>\n <button class="btn btn-warning dlg-yes" ng-click="yes()">Yes</button>\n</div>',controller:"SaveChangesModalCtrl",backdrop:"static"}).result;e.then(function(e){function t(){r.deleteRecord(l.id,l,a)}e&&("function"==typeof l.dataEventFunctions.onBeforeDelete?l.dataEventFunctions.onBeforeDelete(a.master,function(e){e?"_delete_handled_"!==e&&l.showError(e):t()}):t())}).catch(f)}},l.isCancelDisabled=function(){return!!(l[l.topLevelFormName]&&l[l.topLevelFormName].$pristine||"ready"!==l.phase)||"function"==typeof l.disableFunctions.isCancelDisabled&&l.disableFunctions.isCancelDisabled(l.record,a.master,l[l.topLevelFormName])},l.isSaveDisabled=function(){l.whyDisabled=void 0;var e=!1;if(l[l.topLevelFormName]?l[l.topLevelFormName].$invalid?(l.whyDisabled="The form data is invalid:",function n(e,r){e.$$controls.forEach(function(e){if(e.$invalid)if(e.$$controls)n(e,e.$name);else if(l.whyDisabled+="<br /><strong>",r&&(l.whyDisabled+=r+" "),"bs2"===i.framework()&&e.$$element&&e.$$element.parent()&&e.$$element.parent().parent()&&e.$$element.parent().parent().find("label")&&e.$$element.parent().parent().find("label").text()?l.whyDisabled+=e.$$element.parent().parent().find("label").text():"bs3"===i.framework()&&e.$$element&&e.$$element.parent()&&e.$$element.parent().parent()&&e.$$element.parent().parent().parent()&&e.$$element.parent().parent().parent().find("label")&&e.$$element.parent().parent().parent().find("label").text()?l.whyDisabled+=e.$$element.parent().parent().parent().find("label").text():l.whyDisabled+=e.$name,l.whyDisabled+="</strong>: ",e.$error)for(var t in e.$error)if(e.$error.hasOwnProperty(t))switch(t){case"required":l.whyDisabled+="Field missing required value. ";break;case"pattern":l.whyDisabled+="Field does not match required pattern. ";break;default:l.whyDisabled+=t+". "}})}(l[l.topLevelFormName])):l[l.topLevelFormName].$pristine&&(e=!0):l.whyDisabled="Top level form name invalid",e||l.whyDisabled||"ready"!==l.phase)return!0;if("function"!=typeof l.disableFunctions.isSaveDisabled)return!1;var t=l.disableFunctions.isSaveDisabled(l.record,a.master,l[l.topLevelFormName]);return l.whyDisabled="string"==typeof t?t:"An application level user-specified function is inhibiting saving the record",!!t},l.isDeleteDisabled=function(){return!l.id||"ready"!==l.phase||"function"==typeof l.disableFunctions.isDeleteDisabled&&l.disableFunctions.isDeleteDisabled(l.record,a.master,l[l.topLevelFormName])},l.isNewDisabled=function(){return"function"==typeof l.disableFunctions.isNewDisabled&&l.disableFunctions.isNewDisabled(l.record,a.master,l[l.topLevelFormName])},l.setDefaults=function(e,a){void 0===a&&(a="");var o={};return e.forEach(function(e){if(void 0!==e.defaultValue){for(var t=e.name.replace(a,"").split("."),n=o,r=0;r<t.length-1;r++)n[t[r]]||(n[t[r]]={}),n=n[t[r]];n[t[t.length-1]]=e.defaultValue}}),o},l.getVal=function(e,t){if(-1===e.indexOf("$index")||void 0!==t)return e=e.replace(/\$index/g,t),l.$eval("record."+e)},l.sortableOptions={update:function(){l.topLevelFormName&&l[l.topLevelFormName].$setDirty()}},l.setUpCustomLookupOptions=function(e,t,n,r){for(var a=0,o=[l,r];a<o.length;a++){var i=o[a];i&&(i[e.ids]=t,i[e.options]=n)}var s=w(l.record,e.name);s&&(s=S(e,s,n,t),y(l.record,e.name,void 0,s))}},fillFormFromBackendCustomSchema:A,fillFormWithBackendSchema:function(t,n,r,a){e.getSchema(t.modelName,t.formName).then(function(e){A(e.data,t,n,r,a)},t.handleHttpError)}}}e=I.services||(I.services={}),t.$inject=["$location","$window","$filter","$timeout","routingService","cssFrameworkService","SubmissionsService","SchemasService"],e.recordHandler=t}(fng=fng||{}),function(e){var t;function n(n){return{getSchema:function(e,t){return n.get("/api/schema/"+e+(t?"/"+t:""),{cache:!0})}}}t=e.services||(e.services={}),n.$inject=["$http"],t.SchemasService=n}(fng=fng||{});var fng,ExpirationCache=function(){function e(e){void 0===e&&(e=6e4),this.store=new Map,this.timeout=e}return e.prototype.get=function(e){return this.store.get(e)},e.prototype.put=function(e,t){var n=this;this.store.set(e,t),setTimeout(function(){n.remove(e)},this.timeout)},e.prototype.remove=function(e){this.store.delete(e)},e.prototype.removeAll=function(){this.store=new Map},e.prototype.delete=function(){},e}();!function(e){var t;function n(r){function n(e){function t(e,t){void 0!==t&&""!==t&&("object"==typeof t&&(t=JSON.stringify(t)),""===n?n="?":n+="&",n+=e+"="+t)}var n="";return t("l",e.limit),t("f",e.find),t("a",e.aggregate),t("o",e.order),t("s",e.skip),n}var a=!0,o=new ExpirationCache;return{getListAttributes:function(e,t){var n="string"==typeof t?t:t.id||t._id||t.x||t;if("string"!=typeof n)throw new Error("getListAttributes requires a string id but was provided with ".concat(JSON.stringify(t)));return r.get("/api/"+e+"/"+n+"/list",{cache:o})},readRecord:function(e,t){return r.get("/api/"+e+"/"+t)},getAll:function(e,t){var n=angular.extend({cache:!!a&&o},t);return r.get("/api/"+e,n)},getPagedAndFilteredList:function(e,t){return r.get("/api/"+e+n(t))},deleteRecord:function(e,t){return r.delete("/api/"+e+"/"+t)},updateRecord:function(e,t,n){return o.remove("/api/"+e),r.post("/api/"+e+"/"+t,n)},createRecord:function(e,t){return o.remove("/api/"+e),r.post("/api/"+e,t)},useCache:function(e){a=e},getCache:function(){return!!o},clearCache:function(){o.removeAll()}}}t=e.services||(e.services={}),n.$inject=["$http"],t.SubmissionsService=n}(fng=fng||{}),function(f){var e;function t(t,n,e,r,a,o,i,s,l){t.sharedData={record:{},disableFunctions:{},dataEventFunctions:{},modelControllers:[]};var c={master:{},fngInvalidRequired:"fng-invalid-required",allowLocationChange:!0};t.errorVisible=!1,angular.extend(t,i.parsePathFunc()(e.$$path));var d=r("titleCase")(t.modelName,!0);function u(){l.fillFormWithBackendSchema(t,s,l,c);for(var e=0;e<t.sharedData.modelControllers.length;e++)t.sharedData.modelControllers[e].onBaseCtrlReady&&t.sharedData.modelControllers[e].onBaseCtrlReady(t);t.$on("$destroy",function(){t.sharedData.modelControllers.forEach(function(e){return e.$destroy()}),n.$broadcast("fngControllersUnloaded")})}o.loadControllerAndMenu(t.sharedData,d,0,!1,t.$new()),t.formName&&o.loadControllerAndMenu(t.sharedData,d+r("titleCase")(t.formName,!0),1,!1,t.$new()),n.$broadcast("fngControllersLoaded",t.sharedData,t.modelName),t.modelNameDisplay=t.sharedData.modelNameDisplay||r("titleCase")(t.modelName),n.$broadcast("fngFormLoadStart",t),s.decorateScope(t,s,l,t.sharedData),l.decorateScope(t,a,l,c),"function"==typeof f.formsAngular.beforeProcess?f.formsAngular.beforeProcess(t,function(e){e?t.showError(e.message,"Error preparing to process form"):u()}):u()}e=f.controllers||(f.controllers={}),t.$inject=["$scope","$rootScope","$location","$filter","$uibModal","fngModelCtrlService","routingService","formGenerator","recordHandler"],e.BaseCtrl=t}(fng=fng||{}),function(e){var t;function n(e,t){e.yes=function(){t.close(!0)},e.no=function(){t.close(!1)},e.cancel=function(){t.dismiss("cancel")}}t=e.controllers||(e.controllers={}),n.$inject=["$scope","$uibModalInstance"],t.SaveChangesModalCtrl=n}(fng=fng||{}),function(e){var t;function n(t,e,n,r){t.models=[],e.get("/api/models").then(function(e){t.models=e.data},function(){n.path("/404")}),t.newUrl=function(e){return r.buildUrl(e+"/new")},t.listUrl=function(e){return r.buildUrl(e)}}t=e.controllers||(e.controllers={}),n.$inject=["$scope","$http","$location","routingService"],t.ModelCtrl=n}(fng=fng||{}),function(e){var t;function n(e,t,i,n,r,a,o){function s(){i.items=[],i.contextMenu=void 0}e.navScope=i,s(),i.toggleCollapsed=function(){i.collapsed=!i.collapsed},i.isCollapsed=!0,i.showShortcuts=!1,i.shortcuts=[{key:"?",act:"Show shortcuts"},{key:"/",act:"Jump to search"},{key:"Ctrl+Shift+S",act:"Save the current record"},{key:"Ctrl+Shift+Esc",act:"Cancel changes on the current record"},{key:"Ctrl+Shift+Ins",act:"Create a new record"},{key:"Ctrl+Shift+X",act:"Delete the current record"}],i.markupShortcut=function(e){return'<span class="key">'+e.split("+").join('</span> + <span class="key">')+"</span>"},i.globalShortcuts=function(n){function e(e){var t=document.getElementById(e);t&&(t.disabled||setTimeout(function(){t.click()}),n.preventDefault())}if(191===n.keyCode&&(!("INPUT"==(a=(r=n).target.tagName)||"SELECT"==a||"TEXTAREA"==a||"DIV"==a&&r.target.classList.contains("ck-editor__editable"))||n.ctrlKey&&!n.altKey&&!n.metaKey))if(n.ctrlKey||!n.shiftKey){var t=document.getElementById("searchinput");t&&(t.focus(),n.preventDefault())}else i.showShortcuts=!0;else 83===n.keyCode&&n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey?e("saveButton"):27===n.keyCode&&(n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey||i.showShortcuts)?n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey?e("cancelButton"):i.showShortcuts=!1:45===n.keyCode&&n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey?e("newButton"):88===n.keyCode&&n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey&&e("deleteButton");var r,a},i.css=function(e,t){return"function"==typeof o[e]?o[e](t):"error text-error"},i.$on("fngControllersLoaded",function(e,t,n){i.contextMenu=t.dropDownDisplay||t.modelNameDisplay||r("titleCase")(n,!1),t.dropDownDisplayPromise&&t.dropDownDisplayPromise.then(function(e){i.contextMenu=e})}),i.$on("fngControllersUnloaded",function(e){s()}),i.doClick=function(e,t){var n=angular.element(t.target),r=i.items[e];if(r.divider||n.parent().hasClass("disabled"))t.preventDefault();else if(r.broadcast)i.$broadcast(r.broadcast);else{var a=r.args||[],o=r.fn;if("function"==typeof o)switch(a.length){case 0:o();break;case 1:o(a[0]);break;case 2:o(a[0],a[1]);break;case 3:o(a[0],a[1],a[2]);break;case 4:o(a[0],a[1],a[2],a[3])}else if(o)throw new Error("Incorrect menu setup")}},i.isHidden=function(e){function t(e){return!!e.isHidden&&e.isHidden()}var n=!1;if(i.items[e].divider)if(0===e)n=!0;else for(var r=!1,a=e-1;0<=a&&!n&&!r;)i.items[a].divider?n=!0:t(i.items[a])?--a:r=!0;return n||t(i.items[e])},i.isDisabled=function(e){return!!i.items[e].isDisabled&&i.items[e].isDisabled()},i.buildUrl=function(e){return a.buildUrl(e)},i.dropdownClass=function(e){var t="";return i.items[e].divider?t="divider":i.isDisabled(e)&&(t="disabled"),t};var l=t.document.title;i.$on("$routeChangeSuccess",function(){t.document.title=l})}t=e.controllers||(e.controllers={}),n.$inject=["$rootScope","$window","$scope","$location","$filter","routingService","cssFrameworkService"],t.NavCtrl=n}(fng=fng||{}),function(e){e.formsAngular=angular.module("formsAngular",["ngSanitize","ngMessages","ui.bootstrap","infinite-scroll","monospaced.elastic"]).controller("BaseCtrl",e.controllers.BaseCtrl).controller("SaveChangesModalCtrl",e.controllers.SaveChangesModalCtrl).controller("LinkCtrl",e.controllers.LinkCtrl).controller("ModelCtrl",e.controllers.ModelCtrl).controller("NavCtrl",e.controllers.NavCtrl).directive("modelControllerDropdown",e.directives.modelControllerDropdown).directive("errorDisplay",e.directives.errorDisplay).directive("fngLink",e.directives.fngLink).directive("formInput",e.directives.formInput).directive("formButtons",e.directives.formButtons).directive("globalSearch",e.directives.globalSearch).directive("fngNakedDate",e.directives.fngNakedDate).filter("camelCase",e.filters.camelCase).filter("titleCase",e.filters.titleCase).filter("extractTimestampFromMongoID",e.filters.extractTimestampFromMongoID).service("addAllService",e.services.addAllService).provider("cssFrameworkService",e.services.cssFrameworkService).provider("routingService",e.services.routingService).factory("fngModelCtrlService",e.services.fngModelCtrlService).factory("formGenerator",e.services.formGenerator).factory("formMarkupHelper",e.services.formMarkupHelper).factory("inputSizeHelper",e.services.inputSizeHelper).factory("pluginHelper",e.services.pluginHelper).factory("recordHandler",e.services.recordHandler).factory("SchemasService",e.services.SchemasService).factory("SubmissionsService",e.services.SubmissionsService)}(fng=fng||{});var formsAngular=fng.formsAngular;angular.module("formsAngular").run(["$templateCache",function(e){e.put("base-analysis.html",'<div ng-controller="AnalysisCtrl">\n <error-display></error-display>\n <div class="container-fluid page-header report-header">\n <div ng-class="css(\'rowFluid\')">\n <div class="header-lhs col-xs-7 span7">\n <h1>{{ titleWithSubstitutions }}</h1>\n </div>\n <div class="header-rhs col-xs-5 span5">\n <form-input schema="paramSchema" name="paramForm" ng-show="paramSchema" formstyle="horizontalCompact"></form-input>\n </div>\n </div>\n </div>\n <div class="container-fluid page-body report-body">\n <div class="row-fluid report-grow">\n <div class="gridStyle" style="height:100%;" ui-grid="gridOptions" ui-grid-selection ui-grid-resize-columns></div>\n </div>\n </div>\n</div>\n'),e.put("base-edit.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n\x3c!-- <div ng-hide="phase == \'ready\'" class="loading">Loading&#8230;</div>--\x3e\n <div ng-class="css(\'rowFluid\')" class="page-header edit-header">\n <div class="header-lhs col-sm-8 span8">\n <h1 id="header-text">{{modelNameDisplay}} :\n <span id="header-data-desc">\n <span ng-show="!!editFormHeader" >{{ editFormHeader() }}</span>\n <span ng-hide="!!editFormHeader" ng-repeat="field in listSchema" ng-bind-html="getListData(record, field.name) + \' \'"></span>\n </span>\n </h1>\n </div>\n <div class="header-rhs col-sm-2 span2">\n <div form-buttons></div>\n </div>\n </div>\n <div class="container-fluid page-body edit-body">\n <form-input name="baseForm" schema="baseSchema()" formstyle="compact"></form-input>\n </div>\n\x3c!-- <pre>--\x3e\n \x3c!--Record--\x3e\n \x3c!--{{ record | json }}--\x3e\n \x3c!--formSchema--\x3e\n \x3c!--{{ formSchema | json }}--\x3e\n\x3c!-- </pre>--\x3e\n</div>\n'),e.put("base-list-view.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n <div ng-class="css(\'rowFluid\')" class="page-header list-header">\n <div class="header-lhs col-sm-8 span8">\n <h1>{{modelNameDisplay}}</h1>\n </div>\n </div>\n <div class="page-body list-body">\n <div ng-class="css(\'rowFluid\')" infinite-scroll="scrollTheList()">\n <a ng-repeat="record in recordList" ng-href="{{generateViewUrl(record)}}">\n <div class="list-item">\n <div ng-class="css(\'span\',12/listSchema.length)" ng-repeat="field in listSchema">{{getListData(record, field.name)}} </div>\n </div>\n </a>\n </div>\n </div>\n</div>\n'),e.put("base-list.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n <div ng-class="css(\'rowFluid\')" class="page-header list-header">\n <div class="header-lhs col-sm-8 span8">\n <h1>{{modelNameDisplay}}</h1>\n </div>\n <div class="header-rhs col-sm-2 span2">\n <a ng-href="{{generateNewUrl()}}"><button id="newBtn" class="btn btn-default"><i class="icon-plus"></i> New</button></a>\n </div>\n </div>\n <div class="page-body list-body">\n <div ng-class="css(\'rowFluid\')" infinite-scroll="scrollTheList()">\n <a ng-repeat="record in recordList" ng-href="{{generateEditUrl(record)}}">\n <div class="list-item">\n <div ng-class="css(\'span\',12/listSchema.length)" ng-repeat="field in listSchema">{{getListData(record, field.name)}} </div>\n </div>\n </a>\n </div>\n </div>\n</div>\n'),e.put("base-view.html",'<div ng-controller="BaseCtrl">\n <error-display></error-display>\n <div ng-class="css(\'rowFluid\')" class="page-header edit-header">\n <div class="header-lhs col-sm-8 span8">\n <h1 id="header-text">{{modelNameDisplay}} :\n <span ng-repeat="field in listSchema" ng-bind-html="getListData(record, field.name) + \' \'"></span>\n </h1>\n </div>\n </div>\n <div class="container-fluid page-body edit-body">\n <form-input name="baseForm" schema="baseSchema()" formstyle="compact" viewform="true"></form-input>\n </div>\n</div>\n'),e.put("error-display-bs2.html",'<div id="display-error" ng-show="errorVisible" class="row-fluid ng-hide">\n <div class="alert alert-error offset1 span10">\n <button type="button" id="err-hide" class="close" ng-click="dismissError()"><i class="icon-remove"></i></button>\n <button type="button" id="err-pin" class="close" ng-click="stickError()"><i class="icon-eye-open"></i></button>\n <h4 id="err-title">{{alertTitle}}</h4>\n <div id="err-msg" ng-bind-html="errorMessage"></div>\n </div>\n</div>\n'),e.put("error-display-bs3.html",'<div id="display-error" ng-show="errorVisible" class="row ng-hide">\n <div class="alert alert-error col-md-offset-1 col-md-10 alert-danger">\n <button type="button" id="err-hide" class="close" ng-click="dismissError()"><i class="glyphicon glyphicon-remove"></i></button>\n <button type="button" id="err-pin" class="close" ng-click="stickError()"><i class="glyphicon glyphicon-pushpin"></i></button>\n <h4 id="err-title">{{alertTitle}}</h4>\n <div id="err-msg" ng-bind-html="errorMessage"></div>\n </div>\n</div>\n'),e.put("error-messages.html",'<div ng-message="required">A value is required for this field</div>\n<div ng-message="minlength">Too few characters entered</div>\n<div ng-message="maxlength">Too many characters entered</div>\n<div ng-message="min">That value is too small</div>\n<div ng-message="max">That value is too large</div>\n<div ng-message="email">You need to enter a valid email address</div>\n<div ng-message="pattern">This field does not match the expected pattern</div>\n'),e.put("form-button-bs2.html",'<div class="form-btn-grp">\n <div class="btn-group pull-right">\n <button id="saveButton" class="btn btn-mini btn-primary form-btn" ng-click="save()" ng-disabled="isSaveDisabled()"><i class="icon-ok"></i> Save</button>\n <div id="why-disabled" ng-class="{showwhy:!!whyDisabled}" ng-bind-html="whyDisabled"></div>\n <button id="cancelButton" class="btn btn-mini btn-warning form-btn" ng-click="cancel()" ng-disabled="isCancelDisabled()"><i class="icon-remove"></i> Cancel</button>\n </div>\n <div class="btn-group pull-right">\n <button id="newButton" class="btn btn-mini btn-success form-btn" ng-click="newClick()" ng-disabled="isNewDisabled()"><i class="icon-plus"></i> New</button>\n <button id="deleteButton" class="btn btn-mini btn-danger form-btn" ng-click="deleteClick()" ng-disabled="isDeleteDisabled()"><i class="icon-minus"></i> Delete</button>\n </div>\n</div>\n'),e.put("form-button-bs3.html",'<div class="form-btn-grp">\n <div class="btn-group pull-right">\n <button id="saveButton" class="btn btn-primary form-btn btn-xs" ng-click="save()" ng-disabled="isSaveDisabled()"><i class="glyphicon glyphicon-ok"></i> Save</button>\n <div id="why-disabled" ng-class="{showwhy:!!whyDisabled}" ng-bind-html="whyDisabled"></div>\n <button id="cancelButton" class="btn btn-warning form-btn btn-xs" ng-click="cancel()" ng-disabled="isCancelDisabled()"><i class="glyphicon glyphicon-remove"></i> Cancel</button>\n </div>\n <div class="btn-group pull-right">\n <button id="newButton" class="btn btn-success form-btn btn-xs" ng-click="newClick()" ng-disabled="isNewDisabled()"><i class="glyphicon glyphicon-plus"></i> New</button>\n <button id="deleteButton" class="btn btn-danger form-btn btn-xs" ng-click="deleteClick()" ng-disabled="isDeleteDisabled()"><i class="glyphicon glyphicon-minus"></i> Delete</button>\n </div>\n</div>\n'),e.put("search-bs2.html",'<form class="navbar-search pull-right">\n <div id="search-cg" class="control-group" ng-class="errorClass">\n <input type="text" spellcheck="false" autocomplete="off" id="searchinput" ng-model="searchTarget" ng-model-options="{debounce:250}" class="search-query" placeholder="{{searchPlaceholder}}" ng-keyup="handleKey($event)">\n </div>\n</form>\n<div class="results-container" ng-show="results.length >= 1">\n <div class="search-results">\n <div ng-repeat="result in results">\n <a href="{{result.href}}" ng-class="resultClass($index)" title="{{result.additional}}">{{result.resourceText}} {{result.text}}</a>\n </div>\n <div ng-show="moreCount > 0">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n'),e.put("search-bs3.html",'<form class="pull-right navbar-form">\n <div id="search-cg" class="form-group" ng-class="errorClass">\n <input type="text" spellcheck="false" autocomplete="off" id="searchinput" ng-model="searchTarget" ng-model-options="{debounce:250}" class="search-query form-control" placeholder="{{searchPlaceholder}}" ng-keyup="handleKey($event)">\n </div>\n</form>\n<div class="results-container" ng-show="results.length >= 1">\n <div class="search-results">\n <div ng-repeat="result in results">\n <a href="{{result.href}}" ng-class="resultClass($index)" title="{{result.additional}}">{{result.resourceText}} {{result.text}}</a>\n </div>\n <div ng-show="moreCount > 0">(plus more - continue typing to narrow down search...)\n </div>\n </div>\n</div>\n')}]);
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "author": "Mark Chapman <support@forms-angular.org>",
4
4
  "description": "A form builder that sits on top of Angular.js, Twitter Bootstrap, jQuery UI, Angular-UI, Express and Mongoose. Opinionated or what?",
5
5
  "homepage": "http://forms-angular.org",
6
- "version": "0.12.0-beta.192a",
6
+ "version": "0.12.0-beta.192b",
7
7
  "engines": {
8
8
  "node": ">=8.x",
9
9
  "npm": ">=5.x"