forms-angular 0.12.0-beta.260 → 0.12.0-beta.261

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.
@@ -914,6 +914,11 @@ var fng;
914
914
  }
915
915
  }
916
916
  else {
917
+ // NB: Any changes to what properties we support @@-wrapped pseudonyms for here should be repeated in
918
+ // PluginHelperService.extractFromAttr
919
+ info.help = FormMarkupHelperService.handlePseudos(scope, info.help);
920
+ info.label = FormMarkupHelperService.handlePseudos(scope, info.label);
921
+ info.popup = FormMarkupHelperService.handlePseudos(scope, info.popup);
917
922
  // Handle arrays here
918
923
  var controlDivClasses = FormMarkupHelperService.controlDivClasses(options);
919
924
  if (info.array) {
@@ -1116,179 +1121,201 @@ var fng;
1116
1121
  }
1117
1122
  return result;
1118
1123
  };
1124
+ scope.$on("regenerateFormMarkup", function (event, formId) {
1125
+ if (!attrs.formid || attrs.formid !== formId) {
1126
+ return;
1127
+ }
1128
+ generateForm(scope[attrs.schema]);
1129
+ });
1119
1130
  var unwatch = scope.$watch(attrs.schema, function (newValue) {
1120
1131
  if (newValue) {
1121
1132
  var newArrayValue = angular.isArray(newValue) ? newValue : [newValue]; // otherwise some old tests stop working for no real reason
1122
1133
  if (newArrayValue.length > 0 && typeof unwatch === "function") {
1123
1134
  unwatch();
1124
1135
  unwatch = null;
1125
- var elementHtml = '';
1126
- var recordAttribute = attrs.model || 'record'; // By default data comes from scope.record
1127
- var theRecord = scope[recordAttribute];
1128
- var hideableTabs = newArrayValue.filter(function (s) { return s && s.containerType === "tab" && s.hideable; });
1129
- var hiddenTabArrayProp = void 0;
1130
- var hiddenTabReintroductionMethod = void 0;
1131
- for (var _i = 0, hideableTabs_1 = hideableTabs; _i < hideableTabs_1.length; _i++) {
1132
- var tab = hideableTabs_1[_i];
1133
- if (tab.hiddenTabArrayProp) {
1134
- if (hiddenTabArrayProp && tab.hiddenTabArrayProp !== hiddenTabArrayProp) {
1135
- throw new Error("Currently, tab sets with more than one value for hiddenTabArrayProp are not supported");
1136
- }
1137
- hiddenTabArrayProp = tab.hiddenTabArrayProp;
1138
- }
1139
- if (tab.hiddenTabReintroductionMethod) {
1140
- if (hiddenTabReintroductionMethod && tab.hiddenTabReintroductionMethod !== hiddenTabReintroductionMethod) {
1141
- throw new Error("Currently, tab sets with more than one value for hiddenTabReintroductionMethod are not supported");
1142
- }
1143
- hiddenTabReintroductionMethod = tab.hiddenTabReintroductionMethod;
1144
- }
1145
- }
1146
- // now we have established that we don't have more than one value for hiddenTabArrayProp, apply a default if no
1147
- // value has been provided at all...
1148
- if (!hiddenTabArrayProp) {
1149
- hiddenTabArrayProp = "record.hiddenTabs";
1150
- }
1151
- // ...and then replace all blanks with this value so the processInstructions() call made below can deal with
1152
- // each tab independently of the others
1153
- for (var _a = 0, hideableTabs_2 = hideableTabs; _a < hideableTabs_2.length; _a++) {
1154
- var tab = hideableTabs_2[_a];
1155
- tab.hiddenTabArrayProp = hiddenTabArrayProp;
1136
+ generateForm(newArrayValue);
1137
+ }
1138
+ }
1139
+ }, true);
1140
+ var formElement;
1141
+ var generateForm = function (schema) {
1142
+ var elementHtml = '';
1143
+ var recordAttribute = attrs.model || 'record'; // By default data comes from scope.record
1144
+ var theRecord = scope[recordAttribute];
1145
+ var hideableTabs = schema.filter(function (s) { return s && s.containerType === "tab" && s.hideable; });
1146
+ var hiddenTabArrayProp;
1147
+ var hiddenTabReintroductionMethod;
1148
+ for (var _i = 0, hideableTabs_1 = hideableTabs; _i < hideableTabs_1.length; _i++) {
1149
+ var tab = hideableTabs_1[_i];
1150
+ if (tab.hiddenTabArrayProp) {
1151
+ if (hiddenTabArrayProp && tab.hiddenTabArrayProp !== hiddenTabArrayProp) {
1152
+ throw new Error("Currently, tab sets with more than one value for hiddenTabArrayProp are not supported");
1156
1153
  }
1157
- if (hiddenTabReintroductionMethod === "tab") {
1158
- newArrayValue.push({
1159
- containerType: "+tab",
1160
- hiddenTabArrayProp: hiddenTabArrayProp,
1161
- content: []
1162
- });
1154
+ hiddenTabArrayProp = tab.hiddenTabArrayProp;
1155
+ }
1156
+ if (tab.hiddenTabReintroductionMethod) {
1157
+ if (hiddenTabReintroductionMethod && tab.hiddenTabReintroductionMethod !== hiddenTabReintroductionMethod) {
1158
+ throw new Error("Currently, tab sets with more than one value for hiddenTabReintroductionMethod are not supported");
1163
1159
  }
1164
- theRecord = theRecord || {};
1165
- if ((attrs.subschema || attrs.model) && !attrs.forceform) {
1166
- elementHtml = '';
1160
+ hiddenTabReintroductionMethod = tab.hiddenTabReintroductionMethod;
1161
+ }
1162
+ }
1163
+ // now we have established that we don't have more than one value for hiddenTabArrayProp, apply a default if no
1164
+ // value has been provided at all...
1165
+ if (!hiddenTabArrayProp) {
1166
+ hiddenTabArrayProp = "record.hiddenTabs";
1167
+ }
1168
+ // ...and then replace all blanks with this value so the processInstructions() call made below can deal with
1169
+ // each tab independently of the others
1170
+ for (var _a = 0, hideableTabs_2 = hideableTabs; _a < hideableTabs_2.length; _a++) {
1171
+ var tab = hideableTabs_2[_a];
1172
+ tab.hiddenTabArrayProp = hiddenTabArrayProp;
1173
+ }
1174
+ if (hiddenTabReintroductionMethod === "tab") {
1175
+ schema.push({
1176
+ containerType: "+tab",
1177
+ hiddenTabArrayProp: hiddenTabArrayProp,
1178
+ content: []
1179
+ });
1180
+ }
1181
+ theRecord = theRecord || {};
1182
+ if ((attrs.subschema || attrs.model) && !attrs.forceform) {
1183
+ elementHtml = '';
1184
+ }
1185
+ else {
1186
+ scope.topLevelFormName = attrs.name || 'myForm'; // Form name defaults to myForm
1187
+ // Copy attrs we don't process into form
1188
+ var customAttrs = '';
1189
+ for (var thisAttr in attrs) {
1190
+ if (attrs.hasOwnProperty(thisAttr)) {
1191
+ if (thisAttr[0] !== '$' && ['name', 'formstyle', 'schema', 'subschema', 'model', 'viewform'].indexOf(thisAttr) === -1) {
1192
+ customAttrs += ' ' + attrs.$attr[thisAttr] + '="' + attrs[thisAttr] + '"';
1193
+ }
1167
1194
  }
1168
- else {
1169
- scope.topLevelFormName = attrs.name || 'myForm'; // Form name defaults to myForm
1170
- // Copy attrs we don't process into form
1171
- var customAttrs = '';
1172
- for (var thisAttr in attrs) {
1173
- if (attrs.hasOwnProperty(thisAttr)) {
1174
- if (thisAttr[0] !== '$' && ['name', 'formstyle', 'schema', 'subschema', 'model', 'viewform'].indexOf(thisAttr) === -1) {
1175
- customAttrs += ' ' + attrs.$attr[thisAttr] + '="' + attrs[thisAttr] + '"';
1176
- }
1195
+ }
1196
+ var tag = attrs.forceform ? 'ng-form' : 'form';
1197
+ elementHtml = "<".concat(tag, " name=\"").concat(scope.topLevelFormName, "\" class=\"").concat(convertFormStyleToClass(attrs.formstyle), "\" novalidate ").concat(customAttrs, ">");
1198
+ }
1199
+ if (theRecord === scope.topLevelFormName) {
1200
+ throw new Error('Model and Name must be distinct - they are both ' + theRecord);
1201
+ }
1202
+ elementHtml += processInstructions(schema, true, attrs);
1203
+ if (tabsSetup === tabsSetupState.Forced) {
1204
+ elementHtml += '</uib-tabset>';
1205
+ }
1206
+ elementHtml += attrs.subschema ? '' : '</form>';
1207
+ var compiledFormElement = $compile(elementHtml)(scope);
1208
+ if (formElement) {
1209
+ var topLevelForm = scope[scope.topLevelFormName];
1210
+ formElement.replaceWith(compiledFormElement);
1211
+ // the replaceWith will cause the scope[scope.topLevelFormName] to be cleared, so we need to...:
1212
+ scope[scope.topLevelFormName] = topLevelForm;
1213
+ }
1214
+ else {
1215
+ element.replaceWith(compiledFormElement);
1216
+ }
1217
+ // remember the element that we're now represented by (which is no longer the value
1218
+ // of element passed to our link function). This will enable us to replace the
1219
+ // correct element upon receipt of a regenerateFormMarkup request.
1220
+ formElement = compiledFormElement;
1221
+ // If there are subkeys we need to fix up ng-model references when record is read
1222
+ // If we have modelControllers we need to let them know when we have form + data
1223
+ var sharedData = scope[attrs.shared || 'sharedData'];
1224
+ var modelControllers = sharedData ? sharedData.modelControllers : [];
1225
+ if ((subkeys.length > 0 || modelControllers.length > 0) && !scope.phaseWatcher) {
1226
+ var unwatch2 = scope.$watch('phase', function (newValue) {
1227
+ scope.phaseWatcher = true;
1228
+ if (newValue === 'ready' && typeof unwatch2 === "function") {
1229
+ unwatch2();
1230
+ unwatch2 = null;
1231
+ // Tell the 'model controllers' that the form and data are there
1232
+ for (var i = 0; i < modelControllers.length; i++) {
1233
+ if (modelControllers[i].onAllReady) {
1234
+ modelControllers[i].onAllReady(scope);
1177
1235
  }
1178
1236
  }
1179
- var tag = attrs.forceform ? 'ng-form' : 'form';
1180
- elementHtml = "<".concat(tag, " name=\"").concat(scope.topLevelFormName, "\" class=\"").concat(convertFormStyleToClass(attrs.formstyle), "\" novalidate ").concat(customAttrs, ">");
1181
- }
1182
- if (theRecord === scope.topLevelFormName) {
1183
- throw new Error('Model and Name must be distinct - they are both ' + theRecord);
1184
- }
1185
- elementHtml += processInstructions(newArrayValue, true, attrs);
1186
- if (tabsSetup === tabsSetupState.Forced) {
1187
- elementHtml += '</uib-tabset>';
1188
- }
1189
- elementHtml += attrs.subschema ? '' : '</form>';
1190
- //console.log(elementHtml);
1191
- element.replaceWith($compile(elementHtml)(scope));
1192
- // If there are subkeys we need to fix up ng-model references when record is read
1193
- // If we have modelControllers we need to let them know when we have form + data
1194
- var sharedData = scope[attrs.shared || 'sharedData'];
1195
- var modelControllers_1 = sharedData ? sharedData.modelControllers : [];
1196
- if ((subkeys.length > 0 || modelControllers_1.length > 0) && !scope.phaseWatcher) {
1197
- var unwatch2 = scope.$watch('phase', function (newValue) {
1198
- scope.phaseWatcher = true;
1199
- if (newValue === 'ready' && typeof unwatch2 === "function") {
1200
- unwatch2();
1201
- unwatch2 = null;
1202
- // Tell the 'model controllers' that the form and data are there
1203
- for (var i = 0; i < modelControllers_1.length; i++) {
1204
- if (modelControllers_1[i].onAllReady) {
1205
- modelControllers_1[i].onAllReady(scope);
1237
+ // For each one of the subkeys sets in the form we need to fix up ng-model references
1238
+ for (var subkeyCtr = 0; subkeyCtr < subkeys.length; subkeyCtr++) {
1239
+ var info = subkeys[subkeyCtr];
1240
+ var arrayOffset;
1241
+ var matching;
1242
+ var arrayToProcess = angular.isArray(info.subkey) ? info.subkey : [info.subkey];
1243
+ var parts = info.name.split('.');
1244
+ var dataVal = theRecord;
1245
+ while (parts.length > 1) {
1246
+ dataVal = dataVal[parts.shift()] || {};
1247
+ }
1248
+ dataVal = dataVal[parts[0]] = dataVal[parts[0]] || [];
1249
+ // For each of the required subkeys of this type
1250
+ for (var thisOffset = 0; thisOffset < arrayToProcess.length; thisOffset++) {
1251
+ if (arrayToProcess[thisOffset].selectFunc) {
1252
+ // Get the array offset from a function
1253
+ if (!scope[arrayToProcess[thisOffset].selectFunc] || typeof scope[arrayToProcess[thisOffset].selectFunc] !== 'function') {
1254
+ throw new Error('Subkey function ' + arrayToProcess[thisOffset].selectFunc + ' is not properly set up');
1206
1255
  }
1256
+ arrayOffset = scope[arrayToProcess[thisOffset].selectFunc](theRecord, info);
1207
1257
  }
1208
- // For each one of the subkeys sets in the form we need to fix up ng-model references
1209
- for (var subkeyCtr = 0; subkeyCtr < subkeys.length; subkeyCtr++) {
1210
- var info = subkeys[subkeyCtr];
1211
- var arrayOffset;
1212
- var matching;
1213
- var arrayToProcess = angular.isArray(info.subkey) ? info.subkey : [info.subkey];
1214
- var parts = info.name.split('.');
1215
- var dataVal = theRecord;
1216
- while (parts.length > 1) {
1217
- dataVal = dataVal[parts.shift()] || {};
1218
- }
1219
- dataVal = dataVal[parts[0]] = dataVal[parts[0]] || [];
1220
- // For each of the required subkeys of this type
1221
- for (var thisOffset = 0; thisOffset < arrayToProcess.length; thisOffset++) {
1222
- if (arrayToProcess[thisOffset].selectFunc) {
1223
- // Get the array offset from a function
1224
- if (!scope[arrayToProcess[thisOffset].selectFunc] || typeof scope[arrayToProcess[thisOffset].selectFunc] !== 'function') {
1225
- throw new Error('Subkey function ' + arrayToProcess[thisOffset].selectFunc + ' is not properly set up');
1226
- }
1227
- arrayOffset = scope[arrayToProcess[thisOffset].selectFunc](theRecord, info);
1228
- }
1229
- else if (arrayToProcess[thisOffset].keyList) {
1230
- // We are choosing the array element by matching one or more keys
1231
- var thisSubkeyList = arrayToProcess[thisOffset].keyList;
1232
- for (arrayOffset = 0; arrayOffset < dataVal.length; arrayOffset++) {
1233
- matching = true;
1234
- for (var keyField in thisSubkeyList) {
1235
- if (thisSubkeyList.hasOwnProperty(keyField)) {
1236
- // Not (currently) concerned with objects here - just simple types and lookups
1237
- if (dataVal[arrayOffset][keyField] !== thisSubkeyList[keyField] &&
1238
- (typeof dataVal[arrayOffset][keyField] === 'undefined' || !dataVal[arrayOffset][keyField].text || dataVal[arrayOffset][keyField].text !== thisSubkeyList[keyField])) {
1239
- matching = false;
1240
- break;
1241
- }
1242
- }
1243
- }
1244
- if (matching) {
1258
+ else if (arrayToProcess[thisOffset].keyList) {
1259
+ // We are choosing the array element by matching one or more keys
1260
+ var thisSubkeyList = arrayToProcess[thisOffset].keyList;
1261
+ for (arrayOffset = 0; arrayOffset < dataVal.length; arrayOffset++) {
1262
+ matching = true;
1263
+ for (var keyField in thisSubkeyList) {
1264
+ if (thisSubkeyList.hasOwnProperty(keyField)) {
1265
+ // Not (currently) concerned with objects here - just simple types and lookups
1266
+ if (dataVal[arrayOffset][keyField] !== thisSubkeyList[keyField] &&
1267
+ (typeof dataVal[arrayOffset][keyField] === 'undefined' || !dataVal[arrayOffset][keyField].text || dataVal[arrayOffset][keyField].text !== thisSubkeyList[keyField])) {
1268
+ matching = false;
1245
1269
  break;
1246
1270
  }
1247
1271
  }
1248
- if (!matching) {
1249
- // There is no matching array element
1250
- switch (arrayToProcess[thisOffset].onNotFound) {
1251
- case 'error':
1252
- var errorMessage = 'Cannot find matching ' + (arrayToProcess[thisOffset].title || arrayToProcess[thisOffset].path);
1253
- //Have to do this async as setPristine clears it
1254
- $timeout(function () {
1255
- scope.showError(errorMessage, 'Unable to set up form correctly');
1256
- });
1257
- arrayOffset = -1;
1258
- //throw new Error(scope.errorMessage);
1259
- break;
1260
- case 'create':
1261
- default:
1262
- var nameElements = info.name.split('.');
1263
- var lastPart = nameElements.pop();
1264
- var possibleArray = nameElements.join('.');
1265
- var obj = theRecord;
1266
- // Should loop here when / if we re-introduce nesting
1267
- if (possibleArray) {
1268
- obj = obj[possibleArray];
1269
- }
1270
- arrayOffset = obj[lastPart].push(thisSubkeyList) - 1;
1271
- break;
1272
- }
1273
- }
1274
1272
  }
1275
- else {
1276
- throw new Error('Invalid subkey setup for ' + info.name);
1273
+ if (matching) {
1274
+ break;
1277
1275
  }
1278
- scope['$_arrayOffset_' + info.name.replace(/\./g, '_') + '_' + thisOffset] = arrayOffset;
1279
1276
  }
1277
+ if (!matching) {
1278
+ // There is no matching array element
1279
+ switch (arrayToProcess[thisOffset].onNotFound) {
1280
+ case 'error':
1281
+ var errorMessage = 'Cannot find matching ' + (arrayToProcess[thisOffset].title || arrayToProcess[thisOffset].path);
1282
+ //Have to do this async as setPristine clears it
1283
+ $timeout(function () {
1284
+ scope.showError(errorMessage, 'Unable to set up form correctly');
1285
+ });
1286
+ arrayOffset = -1;
1287
+ //throw new Error(scope.errorMessage);
1288
+ break;
1289
+ case 'create':
1290
+ default:
1291
+ var nameElements = info.name.split('.');
1292
+ var lastPart = nameElements.pop();
1293
+ var possibleArray = nameElements.join('.');
1294
+ var obj = theRecord;
1295
+ // Should loop here when / if we re-introduce nesting
1296
+ if (possibleArray) {
1297
+ obj = obj[possibleArray];
1298
+ }
1299
+ arrayOffset = obj[lastPart].push(thisSubkeyList) - 1;
1300
+ break;
1301
+ }
1302
+ }
1303
+ }
1304
+ else {
1305
+ throw new Error('Invalid subkey setup for ' + info.name);
1280
1306
  }
1307
+ scope['$_arrayOffset_' + info.name.replace(/\./g, '_') + '_' + thisOffset] = arrayOffset;
1281
1308
  }
1282
- });
1283
- }
1284
- $rootScope.$broadcast('formInputDone', attrs.name);
1285
- if (FormGeneratorService.updateDataDependentDisplay && theRecord && Object.keys(theRecord).length > 0) {
1286
- // If this is not a test force the data dependent updates to the DOM
1287
- FormGeneratorService.updateDataDependentDisplay(theRecord, null, true, scope);
1309
+ }
1288
1310
  }
1289
- }
1311
+ });
1290
1312
  }
1291
- }, true);
1313
+ $rootScope.$broadcast('formInputDone', attrs.name);
1314
+ if (FormGeneratorService.updateDataDependentDisplay && theRecord && Object.keys(theRecord).length > 0) {
1315
+ // If this is not a test force the data dependent updates to the DOM
1316
+ FormGeneratorService.updateDataDependentDisplay(theRecord, null, true, scope);
1317
+ }
1318
+ };
1292
1319
  }
1293
1320
  };
1294
1321
  }
@@ -2851,9 +2878,78 @@ var fng;
2851
2878
  function isArrayElement(scope, info, options) {
2852
2879
  return scope["$index"] !== undefined || !!options.subschema;
2853
2880
  }
2881
+ function performPseudoReplacements(scope, str, substitutionSrc) {
2882
+ while (str.includes("@@")) {
2883
+ var firstCharPos = str.indexOf("@@") + 2;
2884
+ var lastCharPos = str.indexOf("@@", firstCharPos) - 1;
2885
+ var token = str.substring(firstCharPos, lastCharPos + 1);
2886
+ var plural = token.endsWith("s");
2887
+ if (plural) {
2888
+ token = token.slice(0, -1);
2889
+ }
2890
+ var upperStr = token[0].toUpperCase() === token[0] ? "true" : "false";
2891
+ token = token.toLocaleLowerCase();
2892
+ var replacement = void 0;
2893
+ if (substitutionSrc === "global") {
2894
+ replacement = fng.formsAngular.pseudo(token, upperStr === "true");
2895
+ }
2896
+ else if (substitutionSrc === "scopeStatic") {
2897
+ replacement = scope.sharedData.pseudo(token, upperStr === "true");
2898
+ }
2899
+ else if (substitutionSrc === "scopeDynamic") {
2900
+ replacement = "{{ sharedData.pseudo('".concat(token, "', ").concat(upperStr, ") }}");
2901
+ }
2902
+ else {
2903
+ replacement = "";
2904
+ }
2905
+ str =
2906
+ str.substring(0, firstCharPos - 2) +
2907
+ replacement +
2908
+ (plural ? "s" : "") +
2909
+ str.substring(lastCharPos + 3);
2910
+ }
2911
+ return str;
2912
+ }
2913
+ // Text surrounded by @@ @@ is assumed to be something that can have a pseudonym:
2914
+ // - If the sharedData object has been assigned a pseudo() function:
2915
+ // - then if dynamicFuncName has a value, we will set up a function on scope that will call that function to perform
2916
+ // the necessary substitutions. This would be useful for directives that use a template where labels, hints etc. already use {{ }}
2917
+ // notation (which would prevent any additional {{ }} that we nested in our result from working as intended).
2918
+ // - otherwise, we will set up the necessary dynamic calls to that sharedData.pseudo function using {{ }} notation
2919
+ // - Otherwise, if a pseudo callback has been provided in the IFng options, we will use that to perform a one-off (static) replacement.
2920
+ // - Otherwise (though not expected to happen), we will just remove the @@ tags, leaving the token(s) unchanged.
2921
+ // If the first character of the pseudonym token is upper case, then its replacement will use
2922
+ // titlecase, otherwise its replacement will be in lowercase.
2923
+ // If the last character of the pseudonym token is "s", then its replacement will be pluralised.
2924
+ function handlePseudos(scope, str, dynamicFuncName) {
2925
+ var _a;
2926
+ if (!(str === null || str === void 0 ? void 0 : str.includes("@@"))) {
2927
+ return str;
2928
+ }
2929
+ var substitutionSrc;
2930
+ if (typeof ((_a = scope === null || scope === void 0 ? void 0 : scope.sharedData) === null || _a === void 0 ? void 0 : _a.pseudo) === "function") {
2931
+ if (dynamicFuncName) {
2932
+ scope[dynamicFuncName] = function () {
2933
+ return performPseudoReplacements(scope, str, "scopeStatic");
2934
+ };
2935
+ substitutionSrc = "none"; // now the dynamic function has been set up, remove the @@ @@ tags (probably not essential, but might avoid confusion)
2936
+ }
2937
+ else {
2938
+ substitutionSrc = "scopeDynamic";
2939
+ }
2940
+ }
2941
+ else if (typeof fng.formsAngular.pseudo === "function") {
2942
+ substitutionSrc = "global";
2943
+ }
2944
+ else {
2945
+ substitutionSrc = "none";
2946
+ }
2947
+ return performPseudoReplacements(scope, str, substitutionSrc);
2948
+ }
2854
2949
  return {
2855
2950
  isHorizontalStyle: isHorizontalStyle,
2856
2951
  isArrayElement: isArrayElement,
2952
+ handlePseudos: handlePseudos,
2857
2953
  fieldChrome: function fieldChrome(scope, info, options) {
2858
2954
  var insert = '';
2859
2955
  if (info.id && typeof info.id.replace === "function") {
@@ -3198,33 +3294,8 @@ var fng;
3198
3294
  function internalGenDisabledStr(scope, id, processedAttrs, idSuffix, params) {
3199
3295
  return internalGenDisabledAttrs(scope, id, processedAttrs, idSuffix, params).join(" ");
3200
3296
  }
3201
- // Text surrounded by @@ @@ is assumed to be something that can have a pseudonym. We'll rely
3202
- // upon the relevant controller assigning a pseudo() function to baseScope.
3203
- // If the first character of the pseudonym token is upper case, then its replacement will use
3204
- // titlecase, otherwise its replacement will be in lowercase.
3205
- // If the last character of the pseudonym token is "s", then its replacement will be pluralised.
3206
- function handlePseudos(str) {
3207
- if (!str) {
3208
- return str;
3209
- }
3210
- var result = str;
3211
- while (result.includes("@@")) {
3212
- var firstCharPos = result.indexOf("@@") + 2;
3213
- var lastCharPos = result.indexOf("@@", firstCharPos) - 1;
3214
- var token = result.substring(firstCharPos, lastCharPos + 1);
3215
- var plural = token.endsWith("s");
3216
- if (plural) {
3217
- token = token.slice(0, -1);
3218
- }
3219
- var upperStr = token[0].toUpperCase() === token[0] ? "true" : "false";
3220
- token = token.toLocaleLowerCase();
3221
- result =
3222
- result.substring(0, firstCharPos - 2) +
3223
- "{{ baseScope.pseudo('".concat(token, "', ").concat(upperStr, ") }}") +
3224
- (plural ? "s" : "") +
3225
- result.substring(lastCharPos + 3);
3226
- }
3227
- return result;
3297
+ function handlePseudos(scope, str, dynamicFuncName) {
3298
+ return FormMarkupHelperService.handlePseudos(scope, str, dynamicFuncName);
3228
3299
  }
3229
3300
  function makeIdStringUniqueForArrayElements(scope, processedAttrs, idString) {
3230
3301
  if (FormMarkupHelperService.isArrayElement(scope, processedAttrs.info, processedAttrs.options)) {
@@ -3287,7 +3358,7 @@ var fng;
3287
3358
  // of whether or not the datetime picker is actually disabled) to indicate that it potentially could be
3288
3359
  return disabledStr + " " + rawDisabledAttrs[1];
3289
3360
  }
3290
- function extractFromAttr(attr, directiveName) {
3361
+ function extractFromAttr(attr, directiveName, scope, opts) {
3291
3362
  function deserialize(str) {
3292
3363
  var retVal = str.replace(/&quot;/g, '"');
3293
3364
  if (retVal === "true") {
@@ -3326,12 +3397,9 @@ var fng;
3326
3397
  }
3327
3398
  }
3328
3399
  var result = { info: info, options: options, directiveOptions: directiveOptions };
3329
- // any part of the help text or label that is surrounded by @@ @@ is assumed to be something that can have
3330
- // a pseudonym. We'll be relying upon the parent controller assigning a pseudo() function to baseScope to
3331
- // actually perform the translation.
3332
- // TODO - do this better when fng is re-written!
3333
- result.info.help = handlePseudos(result.info.help);
3334
- result.info.label = handlePseudos(result.info.label);
3400
+ result.info.help = handlePseudos(scope, result.info.help, (opts === null || opts === void 0 ? void 0 : opts.setUpDynamicHelpFunc) ? "help" : undefined);
3401
+ result.info.label = handlePseudos(scope, result.info.label, (opts === null || opts === void 0 ? void 0 : opts.setUpDynamicLabelFunc) ? "label" : undefined);
3402
+ result.info.popup = handlePseudos(scope, result.info.popup);
3335
3403
  return result;
3336
3404
  }
3337
3405
  function genIdAndDisabledStr(scope, processedAttrs, idSuffix, params) {
@@ -3342,7 +3410,7 @@ var fng;
3342
3410
  return {
3343
3411
  extractFromAttr: extractFromAttr,
3344
3412
  buildInputMarkup: function buildInputMarkup(scope, attrs, params, generateInputControl) {
3345
- var processedAttrs = params.processedAttrs || extractFromAttr(attrs, "");
3413
+ var processedAttrs = params.processedAttrs || extractFromAttr(attrs, "", scope);
3346
3414
  var info = {};
3347
3415
  if (!params.ignoreFieldInfoFromAttrs) {
3348
3416
  Object.assign(info, processedAttrs.info);
@@ -5637,5 +5705,5 @@ $templateCache.put('error-display-bs3.html','<div id="display-error" ng-show="er
5637
5705
  $templateCache.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');
5638
5706
  $templateCache.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');
5639
5707
  $templateCache.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');
5640
- $templateCache.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');
5641
- $templateCache.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');}]);
5708
+ $templateCache.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:500}" 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');
5709
+ $templateCache.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:500}" 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 +1 @@
1
- var __spreadArray=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,a=0,i=t.length;a<i;a++)!r&&a in t||((r=r||Array.prototype.slice.call(t,0,a))[a]=t[a]);return e.concat(r||Array.prototype.slice.call(t))};!function(s){var e;function t(e){var t,n,r="isHidden($index)",a='ng-class="dropdownClass($index)"',i="normal"!==s.formsAngular.elemSecurityFuncBinding,o=i?"::":"";return e.canDoSecurity("hidden")?(t='ng-if="contextMenuId && !contextMenuHidden" '.concat(e.getHideableAttrs("{{ ::contextMenuId }}")),i?r='ng-if="::(choice.divider || !isSecurelyHidden(choice.id))" ng-hide="'.concat(r,'"'):"normal"===s.formsAngular.elemSecurityFuncBinding&&(r='ng-hide="'.concat(r,' || (!choice.divider && isSecurelyHidden(choice.id))"')),r+=" ".concat(e.getHideableAttrs("{{ ::choice.id }}"))):(t="",r='ng-hide="'.concat(r,'"')),e.canDoSecurity("disabled")?(n='disableable-link ng-disabled="contextMenuDisabled" '.concat(e.getDisableableAttrs("{{ ::contextMenuId }}")),a+=' class="{{ '.concat(o,"(!choice.divider && isSecurelyDisabled(choice.id)) ? 'disabled' : 'normal' }}\" ").concat(e.getDisableableAttrs("{{ ::choice.id }}"))):n="",{restrict:"AE",replace:!0,template:'<li id="{{ contextMenuId }}" ng-show="items.length > 0" class="mcdd" uib-dropdown '.concat(t," ").concat(n,">")+' <a href="#" id="context-menu-sel" uib-dropdown-toggle> {{contextMenu}} <b class="caret"></b> </a> <ul class="uib-dropdown-menu dropdown-menu">'+' <li ng-repeat="choice in items" ng-attr-id="{{choice.id}}" '.concat(r," ").concat(a,">")+' <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>'}}e=s.directives||(s.directives={}),t.$inject=["SecurityService"],e.modelControllerDropdown=t}(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,i=r.form,o=r.linktab;if(n.readonly=r.readonly,n.element=e,i=i?i+"/":"",o=o?"/"+o:"",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+"/"+i+(e.id||e)+"/edit"+o):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+"/"+i+e+"/edit"+o),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,U,n;function r(I,L,T,O,R,j,M,f){return{restrict:"EA",link:function(x,k,v){function D(t,e,n,r){function a(){var e;if(Array.isArray(x[t.options]))e={repeat:t.options,value:"option"};else{if(!x[t.options]||!Array.isArray(x[t.options].values))throw new Error("Invalid enumeration setup in field "+t.name);e=Array.isArray(x[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,o=t.id;if((t.array||r.subschema)&&(o=M.generateArrayElementIdString(o,t,r)),!e){var s=(r.model||"record")+".";if(e=s,r.subschema&&-1!==t.name.indexOf(".")){var l=t.name,c=r.subschemaroot,d=l.slice(c.length+1);r.index?o="f_"+(e+=c+"["+r.index+"]."+d).slice(s.length).replace(/(\.|\[|]\.)/g,"-"):(e+=c,r.subkey?(o=e.slice(s.length).replace(/\./g,"-")+"-subkey"+r.subkeyno+"-"+d,e+="[$_arrayOffset_"+c.replace(/\./g,"_")+"_"+r.subkeyno+"]."+d):(e+="[$index]."+d,i=l.replace(/\./g,"-")))}else e+=t.name}var u,f,p=M.allInputsVars(x,t,r,e,o,i),m=p.common,h=(n=n||t.required)?" required ":"";switch(t.type){case"select":t.select2?u='<input placeholder="fng-select2 has been removed" readonly>':(m+=M.handleReadOnlyDisabled(t,x).join(" "),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=a(),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+=M.handleReadOnlyDisabled(t,x).join(" "),m+=t.add?" "+t.add+" ":"";var v="vertical"===r.formstyle||"inline"!==r.formstyle&&!t.inlineRadio;if(angular.isArray(t.options)){var g;r.subschema&&(m=(m=m.replace('name="','name="{{$index}}-')).replace('id="','id="{{$index}}-')),angular.forEach(t.options,function(e,t){g=m.replace('id="','id="'+t+"-"),u+="<input ".concat(g,' type="radio" aria-label="').concat(e,'" value="').concat(e,'">').concat(e),v&&(u+="<br />")})}else{var b=v?"div":"span";r.subschema&&(m=m.replace("$index","$parent.$index").replace('name="','name="{{$parent.$index}}-').replace('id="','id="{{$parent.$index}}-')),f=a(),u+="<"+b+' 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(b,"> ")}break;case"checkbox":m+=h,m+=M.handleReadOnlyDisabled(t,x).join(" "),m+=t.add?" "+t.add+" ":"",u=M.generateSimpleInput(m,t,r),"bs3"===R.framework()&&(u='<div class="checkbox">'+u+"</div>");break;default:m+=M.addTextInputMarkup(p,t,h),m+=M.handleReadOnlyDisabled(t,x).join(" "),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"===R.framework()&&(p.sizeClassBS3="col-xs-12")),"<textarea "+m+"></textarea>"):M.generateSimpleInput(m,t,r)}return M.inputChrome(u,t,r,p)}function $(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 C(e){var t;if("function"==typeof e.containerType)t=e.containerType(e);else switch(t={},e.containerType){case"tab":for(var n=-1,r=0;r<x.tabs.length;r++)if(x.tabs[r].title===e.title){n=r;break}if(0<=n){var a="".concat(_.camelCase(e.title),"Tab"),i=f.considerVisibility(a,x);if(i.omit)t.omit=!0;else{var o='id="'.concat(a,'"');if(i.visibilityAttr&&(o+=" ".concat(i.visibilityAttr)),o+=f.generateDisabledAttr(a,x,{attr:"disable",attrRequiresValue:!0}),t.before="",e.hideable){var s="customTemplate_".concat(a,".html");t.before+='<script type="text/ng-template" id="'.concat(s,'">')+' <li ng-class="[{active: active, disabled: disabled}, classes]" class="uib-tab nav-item"> <div class="hideable-tab">'+' <span class="class="nav-link" data-ng-click="select($event)">'.concat(e.title,"</span>&nbsp;")+' <button name="hide_'.concat(a,'_btn" data-ng-click="$parent.hideTab($event, \'').concat(e.title,"', '").concat(e.hiddenTabArrayProp,"')\"")+' style="position: relative; z-index: 20;" type="button" class="close pull-right"> <span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> </div> </li><\/script>',o+=' template-url="'.concat(s,'"'),o+=' data-ng-show="!'.concat(e.hiddenTabArrayProp," || !").concat(e.hiddenTabArrayProp,".includes('").concat(e.title,"')\"")}else o+=' heading="'.concat(e.title,'"');0<n&&(o+=' active="tabs['.concat(n,'].active"')),t.before+="<uib-tab ".concat(o,' deselect="tabDeselect($event, $selectedIndex)" select="updateQueryForTab(\'').concat(e.title,"')\""),t.before+=">",t.after="</uib-tab>"}}else t.before="<p>Error! Tab ".concat(e.title," not found in tab list</p>"),t.after="";break;case"+tab":var l="addTabsTab",c="customTemplate_".concat(l,"_popover.html");t.before='<script type="text/ng-template" id="'.concat(c,'">')+' <div id="addableTabsList">'+' <div class="item" data-ng-repeat="tab in $parent.'.concat(e.hiddenTabArrayProp,'">')+' <button type="button" class="addTabButton btn" data-ng-click="$parent.addTab($event, tab, \''.concat(e.hiddenTabArrayProp,"')\">{{ tab }}")+" </div> </div><\/script>";var d="customTemplate_".concat(l,".html");t.before+='<script type="text/ng-template" id="'.concat(d,'">')+' <li class="uib-tab nav-item" data-ng-if="$parent.'.concat(e.hiddenTabArrayProp," && $parent.").concat(e.hiddenTabArrayProp,'.length > 0">')+' <div id="'.concat(l,'">')+' <button name="addTabsBtn" popover-trigger="\'outsideClick\'" popover-placement="bottom" popover-append-to-body="true" title="Reintroduce Optional Sections..." uib-popover-template="\''.concat(c,"'\"")+' style="position: relative; z-index: 20;" type="button" class="close pull-right"> <span aria-hidden="true">+</span><span class="sr-only">Add</span> </button> </div> </li><\/script>',t.before+='<uib-tab template-url="'.concat(d,'">'),t.after="</uib-tab>";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 u=e.titleTagOrClass||"h4";u.match(/h[1-6]/)?t.before+="<"+u+">"+e.title+"</"+u+">":t.before+='<p class="'+u+'">'+e.title+"</p>"}t.after="</div>"}return t}function S(e,t){var n=M.fieldChrome(x,e,t);if(n.omit)return"";var r=n.template;if(e.schema){var a=e.name.replace(/\./g,"_"),i="$_schema_"+a;if(x[i]=e.schema,e.schema)if(e.subkey){e.subkey.path=e.name,x[i+"_subkey"]=e.subkey;for(var o=angular.isArray(e.subkey)?e.subkey:[e.subkey],s=0;s<o.length;s++){var l=C(o[s]);r+=l.before,r+=E(e.schema,null,{subschema:"true",formstyle:t.formstyle,subkey:i+"_subkey",subkeyno:s,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),r+=l.after}A.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="'+M.glyphClass()+'-plus"></i> Add</button>'),"bs3"===R.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"'),i='<div class="inline-col-headers" style="display:flex" '.concat(a,">"),o=0,s=e;o<s.length;o++){var l=s[o];N(l,t),i+="<div ",l.showWhen=l.showWhen||l.showwhen,l.showWhen&&("string"==typeof l.showWhen?i+='ng-show="'+l.showWhen+'"':i+='ng-show="'+M.generateNgShow(l.showWhen,n)+'"'),l.id&&"function"==typeof l.id.replace&&(i+=' id="col_label_'+l.id.replace(/\./g,"-")+'"'),i+=' class="inline-col-header"><label for="'.concat(l.id,'" class="control-label">').concat(l.label,"</label></div>")}return i+="</div>"}(e.schema,t,c,"always"===e.inlineHeaders));var u=M.handleReadOnlyDisabled(e,x)[0],f=e.sortable&&"disabled"!==u.trim().toLowerCase()?"".concat(u,' ui-sortable="sortableOptions" ng-model="').concat(c,'"'):"";r+='<ol class="sub-doc" '.concat(f,">");var p=M.genDisableableAncestorStr(e.id);r+='<li ng-form id="'.concat(e.id,'List_{{$index}}" name="form_').concat(a,'{{$index}}" ').concat(p)+' class="'.concat($(e.formStyle))+" ".concat("bs2"===R.framework()?"row-fluid":"")+" ".concat(e.inlineHeaders?"width-controlled":"")+" ".concat(e.ngClass?"ng-class:"+e.ngClass:"",'"')+' ng-repeat="subDoc in '.concat(c,' track by $index"')+" ".concat(e.filterable?'data-ng-hide="subDoc._hidden"':"")+">","bs2"===R.framework()&&(r+='<div class="row-fluid sub-doc">'),!0===e.noRemove&&!e.customSubDoc||(r+=' <div class="sub-doc-btns" '.concat(!0!==e.noRemove?p:"",">"),"string"==typeof e.customSubDoc&&(r+=e.customSubDoc),!0!==e.noRemove&&(r+="<button ".concat(u," ").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="'+M.glyphClass()+'-minus"></i> Remove':(r+=' style="position: relative; z-index: 20;" type="button" class="close pull-right">',"bs3"===R.framework()?r+='<span aria-hidden="true">×</span><span class="sr-only">Close</span>':r+="<span>×</span>"),r+="</button>"),r+="</div> ");var m=void 0;if(e.subDocContainerType){var h=x[e.subDocContainerType]||e.subDocContainerType,v=Object.assign({containerType:h},e.subDocContainerProps);m=C(v)}if(null!=m&&m.before&&(r+=m.before),r+=E(e.schema,!1,{subschema:"true",formstyle:e.formStyle,model:t.model,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),null!=m&&m.after&&(r+=m.after),"bs2"===R.framework()&&(r+=" </div>"),r+="</li>",r+="</ol>",!0!==e.noAdd||"string"==typeof e.customFooter||e.noneIndicator){var g="";"string"==typeof e.customFooter&&(g=e.customFooter);var b="",y="".concat(c,".length == 0");!0===e.noAdd?y='ng-show="'.concat(y,'"'):(b=e.noAdd?'ng-hide="'.concat(e.noAdd,'"'):"",y=e.noAdd?'ng-show="'.concat(e.noAdd," && ").concat(y,'"'):"",g+="<button ".concat(b," ").concat(u," ").concat(p,' id="add_').concat(e.id,'_btn" class="add-btn btn btn-default btn-xs btn-mini" ng-click="add(\'').concat(e.name,"',$event)\">")+' <i class="'.concat(M.glyphClass(),'-plus"></i> Add ')+"</button>"),e.noneIndicator&&(g+="<span ".concat(y,' class="none_indicator" id="no_').concat(e.id,'_indicator">None</span>'),b="".concat(c,".length > 0"),b=!0===e.noAdd?'ng-hide="'.concat(b,'"'):e.noAdd?'ng-hide="'.concat(e.noAdd," && ").concat(b,'"'):""),""!==g&&("bs3"===R.framework()?r+="<div ".concat(b,' class="row schema-foot"><div class="col-sm-offset-3">').concat(g,"</div></div>"):r+="<div ".concat(b,' class = "schema-foot ">').concat(g,"</div>"))}}}else{var w=M.controlDivClasses(t);if(e.array){if(w.push("fng-array"),"inline"===t.formstyle||"stacked"===t.formstyle)throw new Error("Cannot use arrays in an inline or stacked form");r+=M.label(x,e,"link"!==e.type,t);var k=e.help;delete e.help;var S=D(e,"link"===e.type?null:"arrayItem.x",!0,t);e.help=k,r+=M.handleArrayInputAndControlDiv(S,w,x,e,t)}else r+=M.label(x,e,null,t),r+=M.handleInputAndControlDiv(D(e,null,t.required,t),w)}return r+=n.closeTag}var A=[],F=U.N,N=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:T("titleCase")(e.name.split(".").slice(-1)[0])},E=function(e,t,n){var r="";if(e)for(var a=0;a<e.length;a++){var i=e[a];n.viewform&&((i=angular.copy(i)).readonly=!0),0===a&&t&&!n.schema.match(/\$_schema_/)&&"object"!=typeof i.add&&(i.add=i.add?" "+i.add+" ":"",-1!==i.add.indexOf("ui-date")||n.noautofocus||i.containerType||(i.add=i.add+"autofocus "));var o=!0;if(i.directive){var s=i.directive,l=i.customHeader||"";l+="<"+s+' model="'+(n.model||"record")+'"';var c=k[0];N(i,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_"+i.name).replace(/\./g,"_");x[p]=angular.copy(i),delete x[p].directive,l+=' schema="'+p+'"';break;default:l+=" "+u.nodeName+'="'+u.value+'"'}}l+=" ";var m=T("camelCase")(i.directive);for(var h in i)if(i.hasOwnProperty(h))switch(h){case"directive":case"schema":break;case"add":switch(typeof i.add){case"string":l+=" "+i.add;break;case"object":for(var v in i.add)i.add.hasOwnProperty(v)&&(l+=" "+v+'="'+i.add[v].toString().replace(/"/g,"&quot;")+'"');break;default:throw new Error("Invalid add property of type "+typeof i.add+" in directive "+i.name)}break;case m:for(var g in i[h])i[h].hasOwnProperty(g)&&(l+=" ".concat(i.directive,"-").concat(g,'="'),"string"==typeof i[h][g]?l+="".concat(i[h][g].replace(/"/g,"&quot;"),'"'):l+="".concat(JSON.stringify(i[h][g]).replace(/"/g,"&quot;"),'"'));break;default:i[h]&&("string"==typeof i[h]?l+=" fng-fld-"+h+'="'+i[h].replace(/"/g,"&quot;")+'"':l+=" fng-fld-"+h+'="'+JSON.stringify(i[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="'+i.name+'"></'+s+">",r+=l+=i.customFooter||"",o=!1}else if(i.containerType){var b=C(i);switch(i.containerType){case"tab":if(F===U.N){F=U.Forced,r+='<uib-tabset active="activeTabNo">';var y=_.findIndex(x.tabs,function(e){return e.active});x.activeTabNo=0<=y?y:0}b.omit||(r+=b.before,r+=E(i.content,null,n),r+=b.after);break;case"tabset":F=U.Y,r+=b.before,r+=E(i.content,null,n),r+=b.after;break;default:r+=b.before,r+=E(i.content,null,n),r+=b.after}o=!1}else if(n.subkey){var w=angular.isArray(x[n.subkey])?x[n.subkey][0].keyList:x[n.subkey].keyList;_.find(w,function(e,t){return x[n.subkey].path+"."+t===i.name})&&(o=!1)}o&&(N(i,n),r+=S(i,n))}else console.log("Empty array passed to processInstructions"),r="";return r},w=x.$watch(v.schema,function(e){if(e){var t=angular.isArray(e)?e:[e];if(0<t.length&&"function"==typeof w){w(),w=null;for(var n="",r=v.model||"record",g=x[r],a=t.filter(function(e){return e&&"tab"===e.containerType&&e.hideable}),i=void 0,o=void 0,s=0,l=a;s<l.length;s++){if((u=l[s]).hiddenTabArrayProp){if(i&&u.hiddenTabArrayProp!==i)throw new Error("Currently, tab sets with more than one value for hiddenTabArrayProp are not supported");i=u.hiddenTabArrayProp}if(u.hiddenTabReintroductionMethod){if(o&&u.hiddenTabReintroductionMethod!==o)throw new Error("Currently, tab sets with more than one value for hiddenTabReintroductionMethod are not supported");o=u.hiddenTabReintroductionMethod}}i=i||"record.hiddenTabs";for(var c=0,d=a;c<d.length;c++){var u;(u=d[c]).hiddenTabArrayProp=i}if("tab"===o&&t.push({containerType:"+tab",hiddenTabArrayProp:i,content:[]}),g=g||{},!v.subschema&&!v.model||v.forceform){x.topLevelFormName=v.name||"myForm";var f="";for(var p in v)v.hasOwnProperty(p)&&"$"!==p[0]&&-1===["name","formstyle","schema","subschema","model","viewform"].indexOf(p)&&(f+=" "+v.$attr[p]+'="'+v[p]+'"');var m=v.forceform?"ng-form":"form";n="<".concat(m,' name="').concat(x.topLevelFormName,'" class="').concat($(v.formstyle),'" novalidate ').concat(f,">")}else n="";if(g===x.topLevelFormName)throw new Error("Model and Name must be distinct - they are both "+g);n+=E(t,!0,v),F===U.Forced&&(n+="</uib-tabset>"),n+=v.subschema?"":"</form>",k.replaceWith(I(n)(x));var h=x[v.shared||"sharedData"],b=h?h.modelControllers:[];if((0<A.length||0<b.length)&&!x.phaseWatcher)var y=x.$watch("phase",function(e){if(x.phaseWatcher=!0,"ready"===e&&"function"==typeof y){y(),y=null;for(var t=0;t<b.length;t++)b[t].onAllReady&&b[t].onAllReady(x);for(var n=0;n<A.length;n++){for(var r,a,i=A[n],o=angular.isArray(i.subkey)?i.subkey:[i.subkey],s=i.name.split("."),l=g;1<s.length;)l=l[s.shift()]||{};l=l[s[0]]=l[s[0]]||[];for(var c=0;c<o.length;c++){if(o[c].selectFunc){if(!x[o[c].selectFunc]||"function"!=typeof x[o[c].selectFunc])throw new Error("Subkey function "+o[c].selectFunc+" is not properly set up");r=x[o[c].selectFunc](g,i)}else{if(!o[c].keyList)throw new Error("Invalid subkey setup for "+i.name);var d=o[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(o[c].onNotFound){case"error":var f="Cannot find matching "+(o[c].title||o[c].path);O(function(){x.showError(f,"Unable to set up form correctly")}),r=-1;break;case"create":default:var p=i.name.split("."),m=p.pop(),h=p.join("."),v=g;h&&(v=v[h]),r=v[m].push(d)-1}}x["$_arrayOffset_"+i.name.replace(/\./g,"_")+"_"+c]=r}}}});L.$broadcast("formInputDone",v.name),j.updateDataDependentDisplay&&g&&0<Object.keys(g).length&&j.updateDataDependentDisplay(g,null,!0,x)}}},!0)}}}t=e.directives||(e.directives={}),r.$inject=["$compile","$rootScope","$filter","$timeout","CssFrameworkService","FormGeneratorService","FormMarkupHelperService","SecurityService"],(n=U=U||{})[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 i,e,o,s;s=!1,o=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(o)||/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(o.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?(i=n.testTime||(new Date).valueOf(),t.get("/api/search?q="+e+"&sentAt="+i).then(function(e){var t=e.data;t.timestamps&&t.timestamps.sentAt&&Number.parseInt(t.timestamps.sentAt)!==i||(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,i,o=[],s=[];if(r="addAll"+r,"string"==typeof n)for(a=n.split(" "),i=0;i<a.length;i++)s.push(a[i]);if(!function e(t){for(var n in t)n===r&&o.push(t[n]),"$parent"===n&&e(t[n])}(e),void 0!==t[r]&&"string"==typeof t[r])for(a=t[r].split(" "),i=0;i<a.length;i++)0===a[i].indexOf("class=")?s.push(a[i].substring(6,a[i].length)):o.push(a[i]);return(n=0<s.length?' class="'+s.join(" ")+'" ':" ")+(0<o.length?o.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 i,o={};t+="Ctrl",o.$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[i]&&(r&&(r=!1,s.items.push({divider:!0})),e.id||(e.id=_.camelCase(e.text||e.textFunc()||"")),s.items.push(e))})}try{c(t,o),i=s.newRecord?"creating":s.id?"editing":"listing",angular.isObject(o.$scope.contextMenu)&&(l(o.$scope.contextMenu),o.$scope.contextMenuPromise&&o.$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"],i=[{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 o(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:o(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:o(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,i){var o,s=r?"/"+r:"",l=e+"/"+n,c=i?"/"+i:"";switch(t){case"list":o=l+s;break;case"edit":o=l+s+"/"+a+"/edit"+c;break;case"view":o=l+s+"/"+a+"/view"+c;break;case"read":o=l+s+"/"+a+"/read"+c;break;case"new":o=l+s+"/new"+c}return o}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,i)},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"),i=r.indexOf("viewonly"),o=void 0;-1===a&&-1===i?-1!==(o=l.reduce(function(e,t){var n=r.indexOf(t);return-1<n?n:e},-1))&&(n-=2+o,d.id=t[n]):-1!==a?(d.newRecord=!0,n-=1+a):n-=1+i,1!==o&&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 i;n.search({}),i="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(i)}}}}}}t=e.services||(e.services={}),n.$inject=["$injector","$locationProvider"],t.RoutingService=n}(fng=fng||{}),function(e){function t(l,n,c,r){function g(e,t,n,r,a,i,o,s){function l(e,t){var n=angular.copy(e),r=_.find(o.tabs,function(e){return e.title===n});if(!r){if(0===o.tabs.length&&0<o.formSchema.length){o.tabs.push({title:"Main",content:[],active:"Main"===o.tab||!o.tab}),r=o.tabs[0];for(var a=0;a<o.formSchema.length;a++)r.content.push(o.formSchema[a])}r=o.tabs[o.tabs.push({title:n,containerType:"tab",content:[],active:n===o.tab})-1]}r.content.push(t)}for(var c in"function"==typeof o.onSchemaFetch&&o.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(i&&n){var p=[];g("Nested "+c,d.schema,p,null,c+".",!0,o,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(S(h.showIf,h.name,o)&&"options"!==c){var v=b(h,d,u,o,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 o.onSchemaProcessed&&o.onSchemaProcessed(e,"Main "===e.slice(0,5)?o.baseSchema():n),r&&0===r.length&&k(e,r,n,t)}function b(t,e,n,r,a){var i;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||"ObjectId"===e.instance&&t.asText)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=c.suffixCleanId(t,"Options"),null!==(i=n.form)&&void 0!==i&&i.enumLabels?(t.ids=c.suffixCleanId(t,"_ids"),r[t.ids]=n.enum,r[t.options]=n.form.enumLabels):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[l("camelCase")(t.directive)]&&t[l("camelCase")(t.directive)].fngAjax)||function(){if(t.options=c.suffixCleanId(t,"Options"),t.ids=c.suffixCleanId(t,"_ids"),!t.hidden)if(n.ref)c.setUpLookupOptions(n.ref,t,r,a,g);else if(n.lookupListRef)c.setUpLookupListOptions(n.lookupListRef,t,r,a),t.lookupListRef=n.lookupListRef;else if(n.internalRef)c.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){var o="Field "+t.name+' has unsupported type "'+e.instance+'"';console.log(o);var s=" (typeof = "+typeof e.instance+")";throw console.log(s),new Error(o+s)}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 d(e,t,n){for(var r=e.split("."),a=n||t.record,i=0,o=r.length;i<o;i++)a[r[i]]||(a[r[i]]=i===o-1?[]:{}),a=a[r[i]];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=c.getListData(r,e.slice(1));break;case 2:t=c.getListData(r,n[1]);break;default:throw new Error("Unsupported showIf format")}}return t}var n,a=t(e.lhs),i=t(e.rhs);switch(e.comp){case"eq":n=a===i;break;case"ne":n=a!==i;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,i=n.length;a<i;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 o in r)if("_id"!==o&&r.hasOwnProperty(o)){t.push({name:o});break}if(0===t.length)throw new Error("Unable to generate a title for "+e)}},S=function(e,r,a){var i=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,i+=1}}var n=!0;return e&&(t(e.lhs),t(e.rhs),0!==i||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,i,o,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],i=0;i<a.length;i+=1){var f=a[i];for(o=0;o<r.formSchema.length;o+=1)r.formSchema[o].name===f&&(l=angular.element(document.querySelector("#cg_"+r.formSchema[o].id)),v(r.formSchema[o].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],i=0;i<a.length;i+=1){var p=a[i].split(".");if(2!==p.length)throw new Error("Conditional display must control dependent fields at same level ");for(o=0;o<r.formSchema.length;o+=1)if(r.formSchema[o].name===p[0])for(var m=r.formSchema[o].schema,h=0;h<m.length;h++)m[h].name===a[i]&&(0===(l=angular.element(document.querySelector("#f_"+p[0]+"List_"+s+" #cg_f_"+a[i].replace(".","_")))).length?l=angular.element(document.querySelector("#f_elements-"+s+"-"+p[1])):c=!1,0<l.length&&(v(r.formSchema[o].schema[h].showIf,e[u[0]][s])?l.show():l.hide()))}}}return c},add:function(t,e,n,r){var a,i;if(null!==(a=null==e?void 0:e.target)&&void 0!==a&&a.hasAttribute&&e.target.hasAttribute("disabled"))return e.preventDefault();if(e.target.offsetParent){var o=d(t,n,r),s=n.formSchema.find(function(e){return e.name===t}),l=s?s.schema:null,c=l?n.setDefaults(l,t+"."):{};"function"==typeof(null===(i=n.dataEventFunctions)||void 0===i?void 0:i.onInitialiseNewSubDoc)&&n.dataEventFunctions.onInitialiseNewSubDoc(t,l,c),o.push(c),n.setFormDirty(e)}},unshift:function(e,t,n,r){d(e,n,r).unshift({}),n.setFormDirty(t)},remove:function(t,e,n,r,a){var i;if(null!==(i=null==n?void 0:n.target)&&void 0!==i&&i.hasAttribute&&n.target.hasAttribute("disabled"))return n.preventDefault();var o,s=d(t,r,a);if("function"==typeof r.dataEventFunctions.onDeleteSubDoc){var l=r.formSchema.find(function(e){return e.name===t}),c=l?l.schema:null;o=r.dataEventFunctions.onDeleteSubDoc(t,c,s,e)}o?r.showError(o):(s.splice(e,1),r.setFormDirty(n))},hasError:function(e,t,n,r){var a=!1;if(r){var i=r[r.topLevelFormName];if("null"!==e&&(i=i[e.replace("$index",n)]),i){var o=i[t];o&&o.$invalid&&!o.$$attr.readonly&&(o.$dirty?a=!0:angular.forEach(o.$validators,function(e,t){"required"!==t&&o.$error[t]&&(a=!0)}))}}else console.log("hasError called with no scope! ",e,t,n);return a},decorateScope:function(s,a,l,e,t){function c(){for(var e=s.$$childHead;e;){if(e.tabset)return e.tabset;e=e.$$nextSibling}}s.record=e.record,s.phase="init",s.disableFunctions=e.disableFunctions,s.dataEventFunctions=e.dataEventFunctions,s.topLevelFormName=void 0,s.formSchema=[],s.tabs=[],s.listSchema=[],s.recordList=[],s.dataDependencies={},s.internalLookups=[],s.listLookups=[],s.conversions={},s.pageSize=60,s.pagesLoaded=0,e.baseScope=s,r.decorateSecurableScope(s,{pseudoUrl:t}),s.generateEditUrl=function(e){return a.generateEditUrl(e,s)},s.generateViewUrl=function(e){return a.generateViewUrl(e,s)},s.generateNewUrl=function(){return a.generateNewUrl(s)},s.scrollTheList=function(){var e;if(0<(null===(e=s.listSchema)||void 0===e?void 0:e.length))return l.scrollTheList(s);var t=s.$watchCollection("listSchema",function(e){if(0<(null==e?void 0:e.length))return t(),l.scrollTheList(s)})},s.getListData=function(e,t){return l.getListData(e,t,s.listSchema,s)},s.setPristine=function(e){e&&s.dismissError(),s[s.topLevelFormName]&&s[s.topLevelFormName].$setPristine()},s.skipCols=function(e){return 0<e?"col-md-offset-3":""},s.setFormDirty=function(e){e?angular.element(e.target).inheritedData("$formController").$setDirty():console.log("setFormDirty called without an event (fine in a unit test)")},s.add=function(e,t,n){return a.add(e,t,s,n)},s.hideTab=function(e,t,n){var r=l.getData(s,n);if(r&&Array.isArray(r)&&!r.includes(t)){var a=s.tabs[s.activeTabNo].title===t;r.push(t),r.sort();var i=s.baseForm;if(i&&i.$setDirty(),a){var o=c();o&&o.select(s.tabs.findIndex(function(e){return!r.includes(e.title)}))}}},s.addTab=function(e,t,n){var r=l.getData(s,n);if(r&&Array.isArray(r)){var a=r.findIndex(function(e){return e===t});if(-1===a)return;r.splice(a,1);var i=s.baseForm;i&&i.$setDirty();var o=c();o&&o.select(s.tabs.findIndex(function(e){return e.title===t}))}},s.hasError=function(e,t,n){return a.hasError(e,t,n,s)},s.unshift=function(e,t,n){return a.unshift(e,t,s,n)},s.remove=function(e,t,n,r){return a.remove(e,t,n,s,r)},s.baseSchema=function(){return s.tabs.length?s.tabs:s.formSchema}}}}((e.services||(e.services={})).FormGeneratorService=t).$inject=["$filter","RoutingService","RecordHandlerService","SecurityService"]}(fng=fng||{}),function(f){var e;function t(h,v,g,b,a){function y(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)}function w(e,t){var n=["vertical","inline"];return t||n.push("stacked"),!e||"undefined"===e||!n.includes(e)}function d(){return"bs2"===h.framework()?"icon":"glyphicon glyphicon"}function u(c,d){var u=c.nonUniqueId||c.id;return[function(){if(c.readonly&&"boolean"==typeof c.readonly)return" disabled ";function e(){return c.readonly?' ng-disabled="'.concat(c.readonly,'" '):""}if(!u||!b.canDoSecurityNow(d,"disabled"))return e();var t=[];if(d.requiresDisabledChildren){var n=void 0;if(c.nonUniqueId)n=(s=c.nonUniqueId.startsWith("f_")?c.nonUniqueId.substring(2):c.nonUniqueId).split("_");else n=c.name.split(".");for(n.pop();0<n.length;)t.push("f_".concat(n.join("_"))),n.pop()}if("instant"===f.formsAngular.elemSecurityFuncBinding){if(d.isSecurelyDisabled(u))return" disabled ";for(var r=0,a=t;r<a.length;r++){var i=a[r];if(d.requiresDisabledChildren(i))return" disabled "}return e()}var o="isSecurelyDisabled('".concat(u,"')");if(0<t.length){var s=t.map(function(e){return"requiresDisabledChildren('".concat(e,"')")});o="(".concat(o," || ").concat(s.join(" || "),")")}var l="one-time"===f.formsAngular.elemSecurityFuncBinding;return c.readonly?l?e()+'ng-readonly="::'.concat(o,'" '):' ng-disabled="'.concat(o," || ").concat(c.readonly,'" '):' ng-disabled="'.concat(l?"::":"").concat(o,'" ')}(),b.getDisableableAttrs(u)]}function k(e,t,n){if(n.subschema&&n.model){for(var r=n.model,a=0,i="$parent.";r.startsWith(i);)a++,r=r.substring(i.length);return"".concat(e,"_{{").concat(i.repeat(a),"$index}}")}return"".concat(e,"_{{$index}}")}function S(e,t,n){return void 0!==e.$index||!!n.subschema}return{isHorizontalStyle:w,isArrayElement:S,fieldChrome:function(e,t,n){var r="";if(t.id&&"function"==typeof t.id.replace){var a=t.nonUniqueId||t.nonuniqueid||t.id,i=void 0;if(t.id.includes(".")&&t.id.includes("{{"))for(var o=!(i="cg_"),s=0;s<t.id.length;s++)"{"===t.id[s]&&"{"===t.id[s-1]?o=!0:"}"===t.id[s]&&"}"===t.id[s-1]&&(o=!1),o||"."!==t.id[s]?i+=t.id[s]:i+="-";else i="cg_".concat(t.id.replace(/\./g,"-"));a="cg_".concat(a.replace(/\./g,"-"));var l=b.considerVisibility(a,e);if(l.omit)return{omit:!0};r+='id="'.concat(S(e,0,n)?k(i,0,n):i,'"'),l.visibilityAttr&&(r+=" ".concat(l.visibilityAttr))}var c=t.classes||"",d="",u="";if(t.showWhen=t.showWhen||t.showwhen,t.showWhen&&("string"==typeof t.showWhen?r+=' ng-show="'+t.showWhen+'"':r+=' ng-show="'+y(t.showWhen,n.model)+'"'),"bs3"===h.framework()){var f;c+=" form-group","vertical"===n.formstyle&&"block-level"!==t.size&&(d+='<div class="row">',c+=" col-sm-"+v.sizeAsNumber(t.size),u+="</div>");var p=null,m=t.name.split(".");f=n&&void 0!==n.subkeyno?n.subschemaroot.replace(/\./g,"-")+"-subkey"+n.subkeyno+"-"+m[m.length-1]:n.subschema?(p="form_"+m.slice(0,-1).join("_")+"$index",t.name.replace(/\./g,"-")):"f_"+t.name.replace(/\./g,"_"),d+="<div"+g.addAll(e,"Group",c,n)+" ng-class=\"{'has-error': hasError('"+p+"','"+f+"', $index)}\"",u+="</div>"}else u=w(n.formstyle,!0)?(d+="<div"+g.addAll(e,"Group","control-group",n),"</div>"):(d+="<span ","</span>");return{template:d+=(r||"")+">",closeTag:u}},label:function(e,t,n,r){var a="";if("bs3"===h.framework()||!["inline","stacked"].includes(r.formstyle)&&""!==t.label||n){a="<label";var i="control-label";if(w(r.formstyle,!1)?(t.linklabel||(a+=' for="'+t.id+'"'),void 0!==t.labelDefaultClass?i+=" "+t.labelDefaultClass:"bs3"===h.framework()&&(i+=" col-sm-3")):["inline","stacked"].includes(r.formstyle)&&(a+=' for="'+t.id+'"',i+=" sr-only"),a+=g.addAll(e,"Label",null,r)+' class="'+i+'">'+t.label,n){var o=u(t,e);a+=" <i ".concat(o.join(" "),' id="add_').concat(t.id,'" ng-click="add(\'').concat(t.name,'\', $event)" class="').concat(d(),'-plus-sign"></i>')}if(a+="</label>",t.linklabel){var s='<fng-link fld="'+t.name+'" ref="'+t.ref+'" text="'+escape(a)+'"';t.form&&(s+=' form="'+t.form+'"'),t.linktab&&(s+=' linktab="'+t.linktab+'"'),a=s+="></fng-link>"}}return a},glyphClass:d,allInputsVars:function(e,t,n,r,a,i){var o,s=t.placeHolder,l="",c="",d="",u="";return"bs3"===h.framework()?(l=-1===["horizontal","vertical","inline"].indexOf(n.formstyle)?" input-sm":"",c="col-sm-"+v.sizeAsNumber(t.size),u=" form-control"):d=t.size?" input-"+t.size:"",["inline","stacked"].includes(n.formstyle)&&(s=s||t.label),o='data-ng-model="'+r+'"',a&&(o+=' id="'.concat(a,'"')),i?o+=' name="'.concat(i,'"'):a&&(o+=' name="'.concat(a,'"')),s&&(o+=' placeholder="'.concat(s,'"')),t.popup&&(o+=' title="'.concat(t.popup,'"')),t.ariaLabel&&(o+=' aria-label="'.concat(t.ariaLabel,'"')),{common:o+=g.addAll(e,"Field",null,n),sizeClassBS3:c,sizeClassBS2:d,compactClass:l,formControl:u}},inputChrome:function(e,t,n,r){"bs3"===h.framework()&&w(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 i="bs2"===h.framework()?{el:"span",cl:"help-inline"}:{el:"div",cl:"help-block"};e+="<".concat(i.el,' class="').concat(i.cl,'">').concat(a,"</").concat(i.el,">")}return e+="<dms/>",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"!==h.framework()||t.size||(r+='class="input-small"'),r+=" />"},controlDivClasses:function(e){var t=[];return w(e.formstyle,!1)&&t.push("bs2"===h.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,a){var i="bs3"===h.framework()?'ng-class="skipCols($index)" ':"",o=(a.model||"record")+"."+r.name,s="";s+='<div id="'+r.id+'List" class="'+t.join(" ")+'" '+i+' ng-repeat="arrayItem in '+o+' track by $index">';var l=u(r,n),c="link"!==r.type?"<i ".concat(l.join(" ")," ng-click=\"remove('").concat(r.name,'\', $index, $event)" id="remove_').concat(r.id,'_{{$index}}" class="').concat(d(),'-minus-sign"></i>'):"";return s+=e.replace("<dms/>",c),s+="</div>",i="bs3"===h.framework()?'ng-class="skipCols('+o+'.length)" ':"",r.help&&(s+='<div class="array-help-block '+t.join(" ")+'" '+i+' id="empty'+r.id+'ListHelpBlock">'+r.help+"</div>"),s},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},handleReadOnlyDisabled:u,generateArrayElementIdString:k,genDisableableAncestorStr:function(e){return b.getDisableableAncestorAttrs(e)},generateNgShow:y}}e=f.services||(f.services={}),t.$inject=["CssFrameworkService","InputSizeHelperService","AddAllService","SecurityService","$filter"],e.FormMarkupHelperService=t}(fng=fng||{}),function(e){(e.services||(e.services={})).InputSizeHelperService=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(y){function s(e,t,n,r,a){var i=n.info.name;r&&(null!=a&&a.nonUniqueIdSuffix?(t=t.replace(r,a.nonUniqueIdSuffix),i+=".".concat(a.nonUniqueIdSuffix)):i+=".".concat(r));var o=y.handleReadOnlyDisabled({id:t,name:i,nonUniqueId:n.info.nonuniqueid,readonly:n.info.readonly},e);if(null!=a&&a.forceNg)for(var s=0;s<o.length;s++)"disabled"===o[s].toLowerCase().trim()&&(o[s]='ng-disabled="true"');return o}function o(e,t,n,r,a){return s(e,t,n,r,a).join(" ")}function u(e){if(!e)return e;for(var t=e;t.includes("@@");){var n=t.indexOf("@@")+2,r=t.indexOf("@@",n)-1,a=t.substring(n,1+r),i=a.endsWith("s");i&&(a=a.slice(0,-1));var o=a[0].toUpperCase()===a[0]?"true":"false";a=a.toLocaleLowerCase(),t=t.substring(0,n-2)+"{{ baseScope.pseudo('".concat(a,"', ").concat(o,") }}")+(i?"s":"")+t.substring(3+r)}return t}function l(e,t,n){return y.isArrayElement(e,t.info,t.options)?y.generateArrayElementIdString(n,t.info,t.options):n}function c(e,t,n,r){var a=t.info.id;return n&&(n.startsWith("_")||(a+="_"),a+=n),r&&(a=l(e,t,a)),a}function i(e,t,n,r){var a=s(e,r,t,n,{forceNg:!0}),i=a[0],o="";if(i){i=(i=(i=(i=i.replace("data-ng-disabled","ng-disabled")).replace("data-ng-readonly","ng-readonly")).replace("ng-disabled=",'"ng-disabled":')).replace("ng-readonly=",'"ng-readonly":');try{i="{ ".concat(i," }"),(i=JSON.parse(i)["ng-disabled"])&&(o='disabledDate="'.concat(i,'" readonlyTime="').concat(i,'"'))}catch(e){}}return o+" "+a[1]}function w(e,t){function n(e){var t=e.replace(/&quot;/g,'"');if("true"===t)return!0;if("false"===t)return!1;var n=parseFloat(t);return!isNaN(n)&&isFinite(n)?n:t}var r={},a={formStyle:e.formstyle},i={},o=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,o)===s&&(i[_.kebabCase(l.slice(o))]=n(e[l]))}var d={info:r,options:a,directiveOptions:i};return d.info.help=u(d.info.help),d.info.label=u(d.info.label),d}function r(e,t,n,r){var a=c(e,t,n,!1),i=l(e,t,a);return'id="'.concat(i,'" ').concat(o(e,a,t,n,r))}return{extractFromAttr:w,buildInputMarkup:function(e,t,n,r){var a=n.processedAttrs||w(t,""),i={};n.ignoreFieldInfoFromAttrs||Object.assign(i,a.info),n.fieldInfoOverrides&&Object.assign(i,n.fieldInfoOverrides);var o=Object.assign({},a.options,n.optionOverrides),s=y.fieldChrome(e,i,o);if(s.omit)return"";var l=y.controlDivClasses(o),c=s.template+y.label(e,i,n.addButtons,o),d=i.id;(i.array||o.subschema)&&(d=y.generateArrayElementIdString(d,i,o));var u=n.addButtons?"arrayItem"+(n.needsX?".x":""):t.model+"."+i.name,f=i.name;if(o.subschema&&-1!==i.name.indexOf(".")){var p=t.model+".",m=o.subschemaroot,h=i.name.slice(m.length+1);u=p+m,o.subkey?(d=u.slice(p.length).replace(/\./g,"-")+"-subkey"+o.subkeyno+"-"+h,u+="[$_arrayOffset_"+m.replace(/\./g,"_")+"_"+o.subkeyno+"]."+h):(u+="[$index]."+h,f=i.name.replace(/\./g,"-"))}var v=y.allInputsVars(e,i,o,u,d,f);v.modelString=u,v.disableableAncestorStr=y.genDisableableAncestorStr(i.id);var g=r(v),b=y.inputChrome(g,i,o,v);return n.addButtons?c+=y.handleArrayInputAndControlDiv(b,l,e,i,o):c+=y.handleInputAndControlDiv(b,l),c+=s.closeTag},genIdString:function(e,t,n){return c(e,t,n,!0)},genDisabledStr:function(e,t,n,r){return o(e,c(e,t,n,!1),t,n,r)},genIdAndDisabledStr:r,genDateTimePickerDisabledStr:function(e,t,n){return i(e,t,n,c(e,t,n,!1))},genDateTimePickerIdAndDisabledStr:function(e,t,n){var r=c(e,t,n,!1),a=l(e,t,r);return'id="'.concat(a,'" ').concat(i(e,t,n,r))},genUiSelectIdAndDisabledStr:function(e,t,n){return r(e,t,n,{forceNg:!0})},handlePseudos:u,genDisableableAncestorStr:function(e){return y.genDisableableAncestorStr(e.info.id)}}}t=e.services||(e.services={}),n.$inject=["FormMarkupHelperService"],t.PluginHelperService=n}(fng=fng||{}),function(O){var e;function t(c,d,i,u,o,s,f,m,e){var l=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 p(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 h(e,t,n,r){void 0===r&&(r=!1);for(var a=t.split("."),i=a.length-1,o=e,s=0;s<i;s++){if(!o)throw new Error("walkTree failed: Object = ".concat(e,", fieldname = ").concat(t,", i = ").concat(s));if(o=angular.isArray(o)?_.map(o,function(e){return e[a[s]]}):(r&&!o[a[s]]&&(o[a[s]]={}),o[a[s]]),angular.isArray(o)&&void 0!==n)if(n.scope&&"function"==typeof n.scope)o=o[n.scope().$index];else{if("number"!=typeof n)throw new Error("Unsupported element type in walkTree "+t);o=o[n]}if(!o)break}return{lastObject:o,key:o?a[i]:void 0}}function y(e,t,n,r){var a=h(e,t,n,!!r);if(a.lastObject&&a.key)if(r)if(angular.isArray(a.lastObject))for(var i=0;i<a.lastObject.length;i++)a.lastObject[i][a.key]=r[i];else a.lastObject[a.key]=r;else delete a.lastObject[a.key]}function v(t,n,e,r){if(void 0===r&&(r=!1),!n.topLevelFormName||n[n.topLevelFormName]&&(r||n[n.topLevelFormName].$pristine)){S(t.name,e.master,function(e){return"object"==typeof e&&e.id?e:C(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=h(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 i=_.find(n,function(e){return e.name===t});if(i)switch(i.params){case void 0:break;case"timestamp":var o=a.toString().substring(0,8),s=new Date(1e3*parseInt(o,16));a=s.toLocaleDateString()+" "+s.toLocaleTimeString();break;default:a=r.dataEventFunctions[i.params](e)}}return a}function S(e,t,n){var r,a,i=(r=e.split("."),a=[r[0]],1<r.length&&a.push(r.slice(1).join(".")),a);if(1<i.length)!function(e,t,n){if(void 0!==t)if(angular.isArray(t))for(var r=0;r<t.length;r++)S(e,t[r],n);else S(e,t,n)}(i[1],t[i[0]],n);else if(t[i[0]]){var o=t[i[0]];if(angular.isArray(o))for(var s=o.length-1;0<=s;s--){var l=typeof o[s];("undefined"==l||"object"==l&&0===Object.keys(o[s]).length)&&o.splice(s,1)}t[i[0]]=n(o)}}function g(e,t,n,r,a){var i="string"==typeof t?e[t]:t,o="string"==typeof n?e[n]:n;i.length=0,o.length=0,r&&0<r.length&&r.forEach(function(e){var t=e[a];t&&0<t.length&&(i.push(t),e._id||(e._id=l()),o.push(e._id))})}var x=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 D(e,t,n){var r=e.conversions;return n&&(r=w(r,n)||{}),r[t]}var $=function(e,t,n,r,a,i,o){i=i||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]=$(l.schema,d[u],1+c.length,r,c,i,u)}else{l.internalRef&&g(r,l.options,l.ids,i[l.internalRef.property],l.internalRef.value);var f=k(t,c,null,r);if(l.array&&x(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;d&&m&&0<m.length?c.includes(".")||!d.toString().match(/^[a-f0-9]{24}$/)||l.internalRef&&l.internalRef.noConvert||(t[c]=C(l,d,r[b(l,"Options")],m)):l.select2?(console.log("fng-select2 is deprecated - use fng-ui-select instead"),l.select2):d&&(h=D(r,c,a))&&h.fngajax&&"function"==typeof h.fngajax&&!h.noconvert&&h.fngajax(d,l,function(e,t){y(i,e.name,o,t),N(angular.element("#"+e.id),function(){y(r.record,e.name,o,t)})})}}return t};function C(e,t,n,r){if(e.array||angular.isArray(t)){for(var a=[],i=e.array&&(!e.directive||x(e)),o=0;o<t.length;o++){var s=t[o];s&&s.x&&(s=s.x);var l=E(s,r,n,e.name);i&&(l={x:l}),a.push(l)}return a}return e.select2?{id:t,text:E(t,r,n,e.name)}:E(t,r,n,e.name)}function A(e,t,n,r){var a=_.isObject(e)?e.x||e.text:e;if(a&&a.match(/^[0-9a-f]{24}$/))return a;var i=t.indexOf(a);if(-1===i)throw new Error("convertListValueToId: Invalid data - value "+a+" not found in "+t+" processing "+r);return n[i]}function F(e,t,n){n.master=$(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)},E=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 I(t,n,r,e,a){if(a&&0<a.length&&a.length===e.length&&n[r]){var i=a.findIndex(function(e){return e[t.value]===n[r]});if(-1<i){var o=e[i][t.value];o&&(n[r]=o)}}}function L(e,f,a,t,p){var n=!f.id&&!f.newRecord;function i(i,u){f.internalLookups.forEach(function(n){var r=i[n.ref.property],a=u[n.ref.property];g(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 I(n.ref,e,t.lastPart,r,a)})}else angular.isArray(f.record[t.lastPart])?f.record[t.lastPart].forEach(function(e){I(n.ref,e,"x",r,a)}):I(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(i,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 i=f[r.formInstructions.ids];i.length=0;for(var e=l.data[c.ref.property]||[],t=0;t<e.length;t++){var n=e[t][c.ref.value],o=_.sortedIndex(a,n);a[o]===n&&(n=n+" ("+e[t]._id+")",o=_.sortedIndex(a,n)),a.splice(o,0,n),i.splice(o,0,e[t]._id)}if(0===Object.keys(u).length)v(r.formInstructions,f,p,!0);else if(r.oldId)if(angular.isArray(r.oldId))r.oldId.forEach(function(e,t){var n=i.indexOf(e);y(f.record,r.formInstructions.name,t,-1===n?void 0:a[n])});else{var s=i.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(),i(f.record,{})}if(f.id&&"function"!=typeof f.dataEventFunctions.onBeforeRead&&t.beginReadingRecord(f),a.handleSchema("Main "+f.modelName,e,n?null:f.formSchema,f.listSchema,"",!0,f,p),n)p.allowLocationChange=!0;else{var o=!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),o=a.updateDataDependentDisplay(e,t,o,f),i(e,t),O.formsAngular.title)){var n=O.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()+(O.formsAngular.title.suffix||""),d.document.title=n.replace(/<\/?[^>]+(>|$)/g,"")}},!0),f.id)"function"==typeof f.dataEventFunctions.onBeforeRead?f.dataEventFunctions.onBeforeRead(f.id,function(e){e?f.showError(e):(t.beginReadingRecord(f),t.finishReadingThenProcessRecord(f,p))}):t.finishReadingThenProcessRecord(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(a){return function(e){if(-1!==[200,400,403].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>"+i("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.",a.phase="error",a.showError(t)}else if(404===e.status)c.search({}).path("/404");else{var r=e.data;"string"!=typeof r&&(r=JSON.stringify(r)),500!==e.status&&(r=e.status+" "+r),a.showError(r)}}}function T(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("."),i=r.find(function(e){return e.ref.property===n.property&&e.ref.value===n.value}),o={formInstructions:t,lastPart:a.pop(),possibleArray:a.join(".")};i||(i={ref:n,lookupOptions:[],lookupIds:[],handlers:[]},r.push(i)),i.handlers.push(o),e[t.options]=i.lookupOptions,e[t.ids]=i.lookupIds}return{beginReadingRecord:function(e){e.readingRecord=m.readRecord(e.modelName,e.id,e.formName)},finishReadingThenProcessRecord:function(t,n){var r="function"==typeof O.formsAngular.beforeHandleIncomingDataPromises;(r?Promise.all(__spreadArray([t.readingRecord],O.formsAngular.beforeHandleIncomingDataPromises(),!0)):t.readingRecord).then(function(e){T(r?angular.copy(e[0].data):e.data,t,n)}).catch(function(e){t.dataEventFunctions.onReadError?t.dataEventFunctions.onReadError(t.id,e):404===e.status?c.search({}).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,concatenate:!1}).then(function(e){var t=e.data;angular.isArray(t)?(!n.listSchema.find(function(e){return"disambiguation"===e.name})&&t.some(function(e){return e.disambiguation})&&n.listSchema.push({name:"disambiguation"}),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,n,t){n.phase="deleting",m.deleteRecord(n.modelName,e,n.formName).then(function(){"function"==typeof n.dataEventFunctions.onAfterDelete&&n.dataEventFunctions.onAfterDelete(t.master),s.redirectTo()("onDelete",n,c)},function(e){var t;404===e.status?s.redirectTo()("onDelete",n,c):403===e.status?n.showError((null===(t=e.data)||void 0===t?void 0:t.message)||e.message||e.data||e,"Permission denied"):n.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,r.formName).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):(T(t,r,a),r.setPristine(!1))):r.showError(t)},function(e){r.handleHttpError(e)})},createNew:function(e,n,r,a){m.createRecord(r.modelName,e,r.formName).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:s.redirectTo()("edit",r,c,t._id)):r.showError(t)},r.handleHttpError)},getListData:k,suffixCleanId:b,getData:w,setData:y,setUpLookupOptions:function(e,i,o,s){var l=o[i.options]=[],c=o[i.ids]=[];(i.filter?m.getPagedAndFilteredList(e,Object.assign({concatenate:!0},i.filter)):m.getAllListAttributes(e)).then(function(e){var t=e.data;if(t){t.sort(function(e,t){return e.text.localeCompare(t.text)}),l.push.apply(l,t.map(function(e){return e.text})),c.push.apply(c,t.map(function(e){return e.id}));for(var n=new Set,r=0;r<l.length-1;r++)for(var a=r+1;a<l.length;a++)_.isEqual(l[r],l[a])&&n.add(l[r]);n.forEach(function(e){for(var t=0;t<l.length;t++)l[t]===e&&(l[t]+="("+c[t]+")")}),o.readingRecord&&o.readingRecord.then(function(){v(i,o,s)})}}).catch(function(e){o.handleHttpError(e)})},setUpLookupListOptions:function(i,o,s,l){var c=s[o.options]=[],d=s[o.ids]=[];"$"===i.id[0]?r(s,o,i,s.listLookups):m.readRecord(i.collection,s.$eval(i.id)).then(function(e){for(var t=e.data[i.property],n=0;n<t.length;n++){var r=t[n][i.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)}v(o,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&&x(t)&&n)for(var a=0;a<n.length;a++)n[a]=n[a].x;var i=m[b(t,"_ids")];if(i&&0<i.length)S(e,f,function(e){return function(e,t,n,r){if(e.array){for(var a=[],i=0;i<t.length;i++)a.push(A(t[i],n,r,e.name));return a}return A(t,n,r,e.name)}(t,e,m[b(t,"Options")],i)});else{var o=D(m,e,h);if(o){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],o)}else l=v(s,o);y(f,e,null,l)}}}}for(var g=0;g<u.length;g++)e();return f},convertIdToListValue:E,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){l.errorHideTimer&&l.clearTimeout(),l.errorMessage?l.errorMessage+="<br /><br />":l.errorMessage="",l.errorMessage+=function(){if(u(function(){l.phase="ready"},25),"string"==typeof t)return o.trustAsHtml(t);if(!t)return"An error occurred - that's all we got. Sorry.";if(t.message&&"string"==typeof t.message)return t.message;if(t.data&&t.data.message)return t.data.message;try{return JSON.stringify(t)}catch(e){return t}}(),l.alertTitle=e||"Error!",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.redirectOptions=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(){s.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(p))}),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(p)}},l.isCancelDisabled=function(){var e;return!!(l[l.topLevelFormName]&&l[l.topLevelFormName].$pristine||"ready"!==l.phase)||"function"==typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isCancelDisabled)&&l.disableFunctions.isCancelDisabled(l.record,a.master,l[l.topLevelFormName])},l.isSaveDisabled=function(){var e;l.whyDisabled=void 0;var t=!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"===f.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"===f.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&&(t=!0):l.whyDisabled="Top level form name invalid",t||l.whyDisabled||"ready"!==l.phase)return!0;if("function"!=typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isSaveDisabled))return!1;var n=l.disableFunctions.isSaveDisabled(l.record,a.master,l[l.topLevelFormName]);return l.whyDisabled="string"==typeof n?n:"An application level user-specified function is inhibiting saving the record",!!n},l.isDeleteDisabled=function(){var e;return!l.id||"ready"!==l.phase||"function"==typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isDeleteDisabled)&&l.disableFunctions.isDeleteDisabled(l.record,a.master,l[l.topLevelFormName])},l.isNewDisabled=function(){var e;return"function"==typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isNewDisabled)&&l.disableFunctions.isNewDisabled(l.record,a.master,l[l.topLevelFormName])},l.setDefaults=function(e,a){void 0===a&&(a="");var i={};return e.forEach(function(e){if(void 0!==e.defaultValue){for(var t=e.name.replace(a,"").split("."),n=i,r=0;r<t.length-1;r++)n[t[r]]||(n[t[r]]={}),n=n[t[r]];n[t[t.length-1]]=e.defaultValue}}),i},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(e,t){e.target.hasAttribute("disabled")?t.item.sortable.cancel():l.topLevelFormName&&l[l.topLevelFormName].$setDirty()}},l.setUpCustomLookupOptions=function(e,t,n,r){for(var a=0,i=[l,r];a<i.length;a++){var o=i[a];o&&(o[e.ids]=t,o[e.options]=n)}var s=w(l.record,e.name);s&&(Array.isArray(s)&&(s=s.filter(function(e){return null!=e})),s=C(e,s,n,t),y(l.record,e.name,void 0,s))}},fillFormFromBackendCustomSchema:L,fillFormWithBackendSchema:function(t,n,r,a){e.getSchema(t.modelName,t.formName).then(function(e){L(e.data,t,n,r,a)},t.handleHttpError)}}}e=O.services||(O.services={}),t.$inject=["$location","$window","$filter","$timeout","$sce","RoutingService","CssFrameworkService","SubmissionsService","SchemasService"],e.RecordHandlerService=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||{}),function(d){var e;function t(r){function a(e){return!!d.formsAngular.elemSecurityFuncBinding&&("hidden"===e&&!!d.formsAngular.hiddenSecurityFuncName||"disabled"===e&&!!d.formsAngular.disabledSecurityFuncName)}function i(e,t){return a(t)&&("hidden"===t&&r[d.formsAngular.hiddenSecurityFuncName]&&(!e||!!e.isSecurelyHidden)||"disabled"===t&&r[d.formsAngular.disabledSecurityFuncName]&&(!e||!!e.isSecurelyDisabled))}function n(e,t){return r[d.formsAngular.hiddenSecurityFuncName](e,t)}function o(e,t){return r[d.formsAngular.disabledSecurityFuncName](e,t)}function s(e,t){return!!o(e,t)}function l(){return"one-time"===d.formsAngular.elemSecurityFuncBinding?"::":""}function t(e,t){return e&&t&&(n=e,null===(r=d.formsAngular.ignoreIdsForHideableOrDisableableAttrs)||void 0===r||!r.some(function(e){return n.includes(e)}))?" ".concat(t,' title="').concat(e,'"'):"";var n,r}function e(e){return t(e,d.formsAngular.disableableAttr)}function c(e){return t(e,d.formsAngular.hideableAttr)}return{canDoSecurity:a,canDoSecurityNow:i,isSecurelyHidden:n,isSecurelyDisabled:s,getHideableAttrs:c,getDisableableAttrs:e,getDisableableAncestorAttrs:function(e){return t(e,d.formsAngular.disableableAncestorAttr)},decorateSecurableScope:function(e,t){a("hidden")&&(!d.formsAngular.skipHiddenSecurityFuncName||null!=t&&t.overrideSkipping||"function"!=typeof r[d.formsAngular.skipHiddenSecurityFuncName]||!r[d.formsAngular.skipHiddenSecurityFuncName](null==t?void 0:t.pseudoUrl))&&(e.isSecurelyHidden=function(e){return n(e,null==t?void 0:t.pseudoUrl)}),a("disabled")&&(!d.formsAngular.skipDisabledSecurityFuncName||null!=t&&t.overrideSkipping||"function"!=typeof r[d.formsAngular.skipDisabledSecurityFuncName]||!r[d.formsAngular.skipDisabledSecurityFuncName](null==t?void 0:t.pseudoUrl))&&(e.isSecurelyDisabled=function(e){return s(e,null==t?void 0:t.pseudoUrl)},(!d.formsAngular.skipDisabledAncestorSecurityFuncName||null!=t&&t.overrideSkipping||(r[d.formsAngular.skipDisabledAncestorSecurityFuncName],1)||!r[d.formsAngular.skipDisabledAncestorSecurityFuncName](null==t?void 0:t.pseudoUrl))&&(e.requiresDisabledChildren=function(e){return"+"===o(e,null==t?void 0:t.pseudoUrl)}))},doSecurityWhenReady:function(t){if(i(void 0,"hidden"))t();else if(a("hidden"))var n=r.$watch(d.formsAngular.hiddenSecurityFuncName,function(e){e&&(n(),t())})},considerVisibility:function(e,t){var n=c(e);if(i(t,"hidden")){if("instant"!==d.formsAngular.elemSecurityFuncBinding)return{visibilityAttr:'data-ng-if="'.concat(l(),"!isSecurelyHidden('").concat(e,"')\"").concat(n)};if(t.isSecurelyHidden(e))return{omit:!0}}return{visibilityAttr:n}},considerContainerVisibility:function(e,t){if(i(t,"hidden")){if("instant"===d.formsAngular.elemSecurityFuncBinding)return e.some(function(e){return!t.isSecurelyHidden(e)})?{}:{omit:!0};var n=e.map(function(e){return"!isSecurelyHidden('".concat(e,"')")});return{visibilityAttr:'data-ng-if="'.concat(l(),"(").concat(n.join(" || "),')"')}}return{}},generateDisabledAttr:function(n,r,a){return function(){var e="";if(i(r,"disabled")){if((a=a||{}).attrRequiresValue&&a.forceNg)throw new Error("Invalid combination of parameters provided to generateDisabledAttr() [attrRequiresValue and forceNg]");var t=a.attr||"disabled";if("instant"===d.formsAngular.elemSecurityFuncBinding){if(r.isSecurelyDisabled(n)){if(a.attrRequiresValue)return" ".concat(t,'="true"');if(!a.forceNg)return" ".concat(t);e="true"}}else e="".concat(l(),"isSecurelyDisabled('").concat(n,"')");if(e)return"disabled"===t?' data-ng-disabled="'.concat(e,'"'):" data-ng-attr-".concat(t,'="').concat(e,'"')}return e}()+e(n)}}}e=d.services||(d.services={}),t.$inject=["$rootScope"],e.SecurityService=t}(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(i){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("p",e.projection),t("a",e.aggregate),t("o",e.order),t("s",e.skip),t("c",e.concatenate),n}var r=!0,o=new ExpirationCache;function s(e,t,n){var r="/api/".concat(e);return t&&(r+="/".concat(t)),n&&(r+="/".concat(n)),r}return{getListAttributes:function(e,t,n){var r="string"==typeof t?t:t.id||t._id||t.x||t;if("object"==typeof r)throw new Error("getListAttributes doesn't expect an object but was provided with ".concat(JSON.stringify(t)));var a=n?"?returnRaw=1":"";return i.get("/api/".concat(e,"/").concat(r,"/list").concat(a),{cache:o})},getAllListAttributes:function(e){return i.get("/api/".concat(e,"/listAll"),{cache:o})},getPagedAndFilteredList:function(e,t){if(t.projection)throw new Error("Cannot use projection option for getPagedAndFilteredList, because it only returns list fields");return void 0===t.concatenate&&(t.concatenate=!1),i.get("/api/".concat(e,"/listAll").concat(n(t)))},getPagedAndFilteredListFull:function(e,t){return i.get("/api/".concat(e).concat(n(t)))},readRecord:function(e,t,n){var r="string"==typeof t?t:t.id||t._id||t.x||t;if("object"==typeof r)throw new Error("readRecord doesn't expect an object but was provided with ".concat(JSON.stringify(t)));var a=s(e,n,r);return i.get(a)},getAll:function(e,t){var n=angular.extend({cache:!!r&&o},t);return i.get("/api/".concat(e),n)},deleteRecord:function(e,t,n){var r=s(e,n,t);return i.delete(r)},updateRecord:function(e,t,n,r){o.remove("/api/".concat(e));var a=s(e,r,t);return i.post(a,n)},createRecord:function(e,t,n){o.remove("/api/".concat(e));var r=s(e,n)+"/new";return i.post(r,t)},useCache:function(e){r=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,i,o,s,l){t.sharedData={record:{},disableFunctions:{},dataEventFunctions:{},modelControllers:[]};var c={master:{},fngInvalidRequired:"fng-invalid-required",allowLocationChange:!0};t.errorVisible=!1,angular.extend(t,o.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")})}i.loadControllerAndMenu(t.sharedData,d,0,!1,t.$new()),t.formName&&i.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","FormGeneratorService","RecordHandlerService"],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.search({}).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(u){var e;function t(a,e,o,r,t,n,i){var s;function l(){o.items=[],o.contextMenu=void 0,o.contextMenuId=void 0,o.contextMenuHidden=void 0,o.contextMenuDisabled=void 0}function c(e){o.contextMenu=e;var t="".concat(_.camelCase(e),"ContextMenu");o.contextMenuId=void 0,i.doSecurityWhenReady(function(){o.contextMenuId=t,o.contextMenuHidden=i.isSecurelyHidden(o.contextMenuId),o.contextMenuDisabled=i.isSecurelyDisabled(o.contextMenuId)})}a.navScope=o,l(),o.toggleCollapsed=function(){o.collapsed=!o.collapsed},o.isCollapsed=!0,o.showShortcuts=!1,o.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"}],null!==(s=u.formsAngular.keyboardShortCuts)&&void 0!==s&&s.forEach(function(e){o.shortcuts.push({key:"Ctrl+Shift+"+e.letter,act:e.desc})}),o.markupShortcut=function(e){return'<span class="key">'+e.split("+").join('</span> + <span class="key">')+"</span>"},o.globalShortcuts=function(n){function t(e){var t=document.getElementById(e);t&&(t.disabled||setTimeout(function(){t.click()}),n.preventDefault())}var e,r,a=n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey;if(191===n.keyCode&&(!("INPUT"==(r=(e=n).target.tagName)||"SELECT"==r||"TEXTAREA"==r||"DIV"==r&&e.target.classList.contains("ck-editor__editable"))||n.ctrlKey&&!n.altKey&&!n.metaKey))if(n.ctrlKey||!n.shiftKey){var i=document.getElementById("searchinput");i&&(i.focus(),n.preventDefault())}else o.showShortcuts=!0;else 27===n.keyCode&&(a||o.showShortcuts)?a?t("cancelButton"):o.showShortcuts=!1:a&&(83===n.keyCode?t("saveButton"):45===n.keyCode?t("newButton"):88===n.keyCode?t("deleteButton"):u.formsAngular.keyboardShortCuts&&u.formsAngular.keyboardShortCuts.forEach(function(e){n.keyCode===e.keycode&&t(e.id)}))},o.css=function(e,t){return"function"==typeof n[e]?n[e](t):"error text-error"},o.$on("fngControllersLoaded",function(e,t,n){c(t.dropDownDisplay||t.modelNameDisplay||r("titleCase")(n,!1)),t.dropDownDisplayPromise&&t.dropDownDisplayPromise.then(function(e){c(e)})}),o.$on("fngControllersUnloaded",function(e){l()}),o.doClick=function(e,t){var n=angular.element(t.target),r=o.items[e];if(r.divider||n.parent().hasClass("disabled"))t.preventDefault();else if(r.broadcast)a.$broadcast.apply(a,__spreadArray([r.broadcast],r.args||[],!1));else if("function"==typeof r.fn)r.fn.apply(r,r.args||[]);else if(r.fn)throw new Error("Incorrect menu setup")},o.isHidden=function(e){function t(e){return!!e.isHidden&&e.isHidden()}var n=!1,r=o.items[e];if(r.divider)if(0===e)n=!0;else for(var a=!1,i=e-1;0<=i&&!n&&!a;)o.items[i].divider?n=!0:t(o.items[i])?--i:a=!0;return n||t(r)},o.isDisabled=function(e){return!!o.items[e].isDisabled&&o.items[e].isDisabled()},o.buildUrl=function(e){return t.buildUrl(e)},o.dropdownClass=function(e){var t="";return o.items[e].divider?t="divider":o.isDisabled(e)&&(t="disabled"),t};var d=e.document.title;o.$on("$routeChangeSuccess",function(){e.document.title=d})}e=u.controllers||(u.controllers={}),t.$inject=["$rootScope","$window","$scope","$filter","RoutingService","CssFrameworkService","SecurityService"],e.NavCtrl=t}(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("FormGeneratorService",e.services.FormGeneratorService).factory("FormMarkupHelperService",e.services.FormMarkupHelperService).factory("InputSizeHelperService",e.services.InputSizeHelperService).factory("PluginHelperService",e.services.PluginHelperService).factory("RecordHandlerService",e.services.RecordHandlerService).factory("SchemasService",e.services.SchemasService).factory("SubmissionsService",e.services.SubmissionsService).factory("SecurityService",e.services.SecurityService)}(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 ng-hide="!showLoading" class="loading">Loading&#8230;</div>\n <div class="container-fluid page-header report-header">\n <div class="header-lhs">\n <h1>{{ titleWithSubstitutions }}</h1>\n </div>\n <div class="header-rhs">\n <form-input schema="paramSchema" name="paramForm" ng-show="paramSchema" formstyle="horizontalCompact"></form-input>\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 <div ng-hide="phase == \'ready\' && !showLoading" class="loading">Loading&#8230;</div>\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-hide="!showLoading" class="loading">Loading&#8230;</div>\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-hide="!showLoading" class="loading">Loading&#8230;</div>\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-hide="phase == \'ready\' && !spinning" class="loading">Loading&#8230;</div>\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
+ var __spreadArray=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,a=0,i=t.length;a<i;a++)!r&&a in t||((r=r||Array.prototype.slice.call(t,0,a))[a]=t[a]);return e.concat(r||Array.prototype.slice.call(t))};!function(s){var e;function t(e){var t,n,r="isHidden($index)",a='ng-class="dropdownClass($index)"',i="normal"!==s.formsAngular.elemSecurityFuncBinding,o=i?"::":"";return e.canDoSecurity("hidden")?(t='ng-if="contextMenuId && !contextMenuHidden" '.concat(e.getHideableAttrs("{{ ::contextMenuId }}")),i?r='ng-if="::(choice.divider || !isSecurelyHidden(choice.id))" ng-hide="'.concat(r,'"'):"normal"===s.formsAngular.elemSecurityFuncBinding&&(r='ng-hide="'.concat(r,' || (!choice.divider && isSecurelyHidden(choice.id))"')),r+=" ".concat(e.getHideableAttrs("{{ ::choice.id }}"))):(t="",r='ng-hide="'.concat(r,'"')),e.canDoSecurity("disabled")?(n='disableable-link ng-disabled="contextMenuDisabled" '.concat(e.getDisableableAttrs("{{ ::contextMenuId }}")),a+=' class="{{ '.concat(o,"(!choice.divider && isSecurelyDisabled(choice.id)) ? 'disabled' : 'normal' }}\" ").concat(e.getDisableableAttrs("{{ ::choice.id }}"))):n="",{restrict:"AE",replace:!0,template:'<li id="{{ contextMenuId }}" ng-show="items.length > 0" class="mcdd" uib-dropdown '.concat(t," ").concat(n,">")+' <a href="#" id="context-menu-sel" uib-dropdown-toggle> {{contextMenu}} <b class="caret"></b> </a> <ul class="uib-dropdown-menu dropdown-menu">'+' <li ng-repeat="choice in items" ng-attr-id="{{choice.id}}" '.concat(r," ").concat(a,">")+' <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>'}}e=s.directives||(s.directives={}),t.$inject=["SecurityService"],e.modelControllerDropdown=t}(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,i=r.form,o=r.linktab;if(n.readonly=r.readonly,n.element=e,i=i?i+"/":"",o=o?"/"+o:"",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+"/"+i+(e.id||e)+"/edit"+o):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+"/"+i+e+"/edit"+o),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,P,n;function r(L,T,O,R,j,M,U,f){return{restrict:"EA",link:function(x,k,w){function D(t,e,n,r){function a(){var e;if(Array.isArray(x[t.options]))e={repeat:t.options,value:"option"};else{if(!x[t.options]||!Array.isArray(x[t.options].values))throw new Error("Invalid enumeration setup in field "+t.name);e=Array.isArray(x[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,o=t.id;if((t.array||r.subschema)&&(o=U.generateArrayElementIdString(o,t,r)),!e){var s=(r.model||"record")+".";if(e=s,r.subschema&&-1!==t.name.indexOf(".")){var l=t.name,c=r.subschemaroot,d=l.slice(c.length+1);r.index?o="f_"+(e+=c+"["+r.index+"]."+d).slice(s.length).replace(/(\.|\[|]\.)/g,"-"):(e+=c,r.subkey?(o=e.slice(s.length).replace(/\./g,"-")+"-subkey"+r.subkeyno+"-"+d,e+="[$_arrayOffset_"+c.replace(/\./g,"_")+"_"+r.subkeyno+"]."+d):(e+="[$index]."+d,i=l.replace(/\./g,"-")))}else e+=t.name}var u,f,p=U.allInputsVars(x,t,r,e,o,i),m=p.common,h=(n=n||t.required)?" required ":"";switch(t.type){case"select":t.select2?u='<input placeholder="fng-select2 has been removed" readonly>':(m+=U.handleReadOnlyDisabled(t,x).join(" "),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=a(),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+=U.handleReadOnlyDisabled(t,x).join(" "),m+=t.add?" "+t.add+" ":"";var v="vertical"===r.formstyle||"inline"!==r.formstyle&&!t.inlineRadio;if(angular.isArray(t.options)){var g;r.subschema&&(m=(m=m.replace('name="','name="{{$index}}-')).replace('id="','id="{{$index}}-')),angular.forEach(t.options,function(e,t){g=m.replace('id="','id="'+t+"-"),u+="<input ".concat(g,' type="radio" aria-label="').concat(e,'" value="').concat(e,'">').concat(e),v&&(u+="<br />")})}else{var b=v?"div":"span";r.subschema&&(m=m.replace("$index","$parent.$index").replace('name="','name="{{$parent.$index}}-').replace('id="','id="{{$parent.$index}}-')),f=a(),u+="<"+b+' 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(b,"> ")}break;case"checkbox":m+=h,m+=U.handleReadOnlyDisabled(t,x).join(" "),m+=t.add?" "+t.add+" ":"",u=U.generateSimpleInput(m,t,r),"bs3"===j.framework()&&(u='<div class="checkbox">'+u+"</div>");break;default:m+=U.addTextInputMarkup(p,t,h),m+=U.handleReadOnlyDisabled(t,x).join(" "),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"===j.framework()&&(p.sizeClassBS3="col-xs-12")),"<textarea "+m+"></textarea>"):U.generateSimpleInput(m,t,r)}return U.inputChrome(u,t,r,p)}function $(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 C(e){var t;if("function"==typeof e.containerType)t=e.containerType(e);else switch(t={},e.containerType){case"tab":for(var n=-1,r=0;r<x.tabs.length;r++)if(x.tabs[r].title===e.title){n=r;break}if(0<=n){var a="".concat(_.camelCase(e.title),"Tab"),i=f.considerVisibility(a,x);if(i.omit)t.omit=!0;else{var o='id="'.concat(a,'"');if(i.visibilityAttr&&(o+=" ".concat(i.visibilityAttr)),o+=f.generateDisabledAttr(a,x,{attr:"disable",attrRequiresValue:!0}),t.before="",e.hideable){var s="customTemplate_".concat(a,".html");t.before+='<script type="text/ng-template" id="'.concat(s,'">')+' <li ng-class="[{active: active, disabled: disabled}, classes]" class="uib-tab nav-item"> <div class="hideable-tab">'+' <span class="class="nav-link" data-ng-click="select($event)">'.concat(e.title,"</span>&nbsp;")+' <button name="hide_'.concat(a,'_btn" data-ng-click="$parent.hideTab($event, \'').concat(e.title,"', '").concat(e.hiddenTabArrayProp,"')\"")+' style="position: relative; z-index: 20;" type="button" class="close pull-right"> <span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> </div> </li><\/script>',o+=' template-url="'.concat(s,'"'),o+=' data-ng-show="!'.concat(e.hiddenTabArrayProp," || !").concat(e.hiddenTabArrayProp,".includes('").concat(e.title,"')\"")}else o+=' heading="'.concat(e.title,'"');0<n&&(o+=' active="tabs['.concat(n,'].active"')),t.before+="<uib-tab ".concat(o,' deselect="tabDeselect($event, $selectedIndex)" select="updateQueryForTab(\'').concat(e.title,"')\""),t.before+=">",t.after="</uib-tab>"}}else t.before="<p>Error! Tab ".concat(e.title," not found in tab list</p>"),t.after="";break;case"+tab":var l="addTabsTab",c="customTemplate_".concat(l,"_popover.html");t.before='<script type="text/ng-template" id="'.concat(c,'">')+' <div id="addableTabsList">'+' <div class="item" data-ng-repeat="tab in $parent.'.concat(e.hiddenTabArrayProp,'">')+' <button type="button" class="addTabButton btn" data-ng-click="$parent.addTab($event, tab, \''.concat(e.hiddenTabArrayProp,"')\">{{ tab }}")+" </div> </div><\/script>";var d="customTemplate_".concat(l,".html");t.before+='<script type="text/ng-template" id="'.concat(d,'">')+' <li class="uib-tab nav-item" data-ng-if="$parent.'.concat(e.hiddenTabArrayProp," && $parent.").concat(e.hiddenTabArrayProp,'.length > 0">')+' <div id="'.concat(l,'">')+' <button name="addTabsBtn" popover-trigger="\'outsideClick\'" popover-placement="bottom" popover-append-to-body="true" title="Reintroduce Optional Sections..." uib-popover-template="\''.concat(c,"'\"")+' style="position: relative; z-index: 20;" type="button" class="close pull-right"> <span aria-hidden="true">+</span><span class="sr-only">Add</span> </button> </div> </li><\/script>',t.before+='<uib-tab template-url="'.concat(d,'">'),t.after="</uib-tab>";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 u=e.titleTagOrClass||"h4";u.match(/h[1-6]/)?t.before+="<"+u+">"+e.title+"</"+u+">":t.before+='<p class="'+u+'">'+e.title+"</p>"}t.after="</div>"}return t}function S(e,t){var n=U.fieldChrome(x,e,t);if(n.omit)return"";var r=n.template;if(e.schema){var a=e.name.replace(/\./g,"_"),i="$_schema_"+a;if(x[i]=e.schema,e.schema)if(e.subkey){e.subkey.path=e.name,x[i+"_subkey"]=e.subkey;for(var o=angular.isArray(e.subkey)?e.subkey:[e.subkey],s=0;s<o.length;s++){var l=C(o[s]);r+=l.before,r+=E(e.schema,null,{subschema:"true",formstyle:t.formstyle,subkey:i+"_subkey",subkeyno:s,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),r+=l.after}A.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="'+U.glyphClass()+'-plus"></i> Add</button>'),"bs3"===j.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"'),i='<div class="inline-col-headers" style="display:flex" '.concat(a,">"),o=0,s=e;o<s.length;o++){var l=s[o];N(l,t),i+="<div ",l.showWhen=l.showWhen||l.showwhen,l.showWhen&&("string"==typeof l.showWhen?i+='ng-show="'+l.showWhen+'"':i+='ng-show="'+U.generateNgShow(l.showWhen,n)+'"'),l.id&&"function"==typeof l.id.replace&&(i+=' id="col_label_'+l.id.replace(/\./g,"-")+'"'),i+=' class="inline-col-header"><label for="'.concat(l.id,'" class="control-label">').concat(l.label,"</label></div>")}return i+="</div>"}(e.schema,t,c,"always"===e.inlineHeaders));var u=U.handleReadOnlyDisabled(e,x)[0],f=e.sortable&&"disabled"!==u.trim().toLowerCase()?"".concat(u,' ui-sortable="sortableOptions" ng-model="').concat(c,'"'):"";r+='<ol class="sub-doc" '.concat(f,">");var p=U.genDisableableAncestorStr(e.id);r+='<li ng-form id="'.concat(e.id,'List_{{$index}}" name="form_').concat(a,'{{$index}}" ').concat(p)+' class="'.concat($(e.formStyle))+" ".concat("bs2"===j.framework()?"row-fluid":"")+" ".concat(e.inlineHeaders?"width-controlled":"")+" ".concat(e.ngClass?"ng-class:"+e.ngClass:"",'"')+' ng-repeat="subDoc in '.concat(c,' track by $index"')+" ".concat(e.filterable?'data-ng-hide="subDoc._hidden"':"")+">","bs2"===j.framework()&&(r+='<div class="row-fluid sub-doc">'),!0===e.noRemove&&!e.customSubDoc||(r+=' <div class="sub-doc-btns" '.concat(!0!==e.noRemove?p:"",">"),"string"==typeof e.customSubDoc&&(r+=e.customSubDoc),!0!==e.noRemove&&(r+="<button ".concat(u," ").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="'+U.glyphClass()+'-minus"></i> Remove':(r+=' style="position: relative; z-index: 20;" type="button" class="close pull-right">',"bs3"===j.framework()?r+='<span aria-hidden="true">×</span><span class="sr-only">Close</span>':r+="<span>×</span>"),r+="</button>"),r+="</div> ");var m=void 0;if(e.subDocContainerType){var h=x[e.subDocContainerType]||e.subDocContainerType,v=Object.assign({containerType:h},e.subDocContainerProps);m=C(v)}if(null!=m&&m.before&&(r+=m.before),r+=E(e.schema,!1,{subschema:"true",formstyle:e.formStyle,model:t.model,subschemaroot:e.name,suppressNestingWarning:e.suppressNestingWarning}),null!=m&&m.after&&(r+=m.after),"bs2"===j.framework()&&(r+=" </div>"),r+="</li>",r+="</ol>",!0!==e.noAdd||"string"==typeof e.customFooter||e.noneIndicator){var g="";"string"==typeof e.customFooter&&(g=e.customFooter);var b="",y="".concat(c,".length == 0");!0===e.noAdd?y='ng-show="'.concat(y,'"'):(b=e.noAdd?'ng-hide="'.concat(e.noAdd,'"'):"",y=e.noAdd?'ng-show="'.concat(e.noAdd," && ").concat(y,'"'):"",g+="<button ".concat(b," ").concat(u," ").concat(p,' id="add_').concat(e.id,'_btn" class="add-btn btn btn-default btn-xs btn-mini" ng-click="add(\'').concat(e.name,"',$event)\">")+' <i class="'.concat(U.glyphClass(),'-plus"></i> Add ')+"</button>"),e.noneIndicator&&(g+="<span ".concat(y,' class="none_indicator" id="no_').concat(e.id,'_indicator">None</span>'),b="".concat(c,".length > 0"),b=!0===e.noAdd?'ng-hide="'.concat(b,'"'):e.noAdd?'ng-hide="'.concat(e.noAdd," && ").concat(b,'"'):""),""!==g&&("bs3"===j.framework()?r+="<div ".concat(b,' class="row schema-foot"><div class="col-sm-offset-3">').concat(g,"</div></div>"):r+="<div ".concat(b,' class = "schema-foot ">').concat(g,"</div>"))}}}else{e.help=U.handlePseudos(x,e.help),e.label=U.handlePseudos(x,e.label),e.popup=U.handlePseudos(x,e.popup);var w=U.controlDivClasses(t);if(e.array){if(w.push("fng-array"),"inline"===t.formstyle||"stacked"===t.formstyle)throw new Error("Cannot use arrays in an inline or stacked form");r+=U.label(x,e,"link"!==e.type,t);var k=e.help;delete e.help;var S=D(e,"link"===e.type?null:"arrayItem.x",!0,t);e.help=k,r+=U.handleArrayInputAndControlDiv(S,w,x,e,t)}else r+=U.label(x,e,null,t),r+=U.handleInputAndControlDiv(D(e,null,t.required,t),w)}return r+=n.closeTag}var A=[],F=P.N,N=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:O("titleCase")(e.name.split(".").slice(-1)[0])},E=function(e,t,n){var r="";if(e)for(var a=0;a<e.length;a++){var i=e[a];n.viewform&&((i=angular.copy(i)).readonly=!0),0===a&&t&&!n.schema.match(/\$_schema_/)&&"object"!=typeof i.add&&(i.add=i.add?" "+i.add+" ":"",-1!==i.add.indexOf("ui-date")||n.noautofocus||i.containerType||(i.add=i.add+"autofocus "));var o=!0;if(i.directive){var s=i.directive,l=i.customHeader||"";l+="<"+s+' model="'+(n.model||"record")+'"';var c=k[0];N(i,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_"+i.name).replace(/\./g,"_");x[p]=angular.copy(i),delete x[p].directive,l+=' schema="'+p+'"';break;default:l+=" "+u.nodeName+'="'+u.value+'"'}}l+=" ";var m=O("camelCase")(i.directive);for(var h in i)if(i.hasOwnProperty(h))switch(h){case"directive":case"schema":break;case"add":switch(typeof i.add){case"string":l+=" "+i.add;break;case"object":for(var v in i.add)i.add.hasOwnProperty(v)&&(l+=" "+v+'="'+i.add[v].toString().replace(/"/g,"&quot;")+'"');break;default:throw new Error("Invalid add property of type "+typeof i.add+" in directive "+i.name)}break;case m:for(var g in i[h])i[h].hasOwnProperty(g)&&(l+=" ".concat(i.directive,"-").concat(g,'="'),"string"==typeof i[h][g]?l+="".concat(i[h][g].replace(/"/g,"&quot;"),'"'):l+="".concat(JSON.stringify(i[h][g]).replace(/"/g,"&quot;"),'"'));break;default:i[h]&&("string"==typeof i[h]?l+=" fng-fld-"+h+'="'+i[h].replace(/"/g,"&quot;")+'"':l+=" fng-fld-"+h+'="'+JSON.stringify(i[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="'+i.name+'"></'+s+">",r+=l+=i.customFooter||"",o=!1}else if(i.containerType){var b=C(i);switch(i.containerType){case"tab":if(F===P.N){F=P.Forced,r+='<uib-tabset active="activeTabNo">';var y=_.findIndex(x.tabs,function(e){return e.active});x.activeTabNo=0<=y?y:0}b.omit||(r+=b.before,r+=E(i.content,null,n),r+=b.after);break;case"tabset":F=P.Y,r+=b.before,r+=E(i.content,null,n),r+=b.after;break;default:r+=b.before,r+=E(i.content,null,n),r+=b.after}o=!1}else if(n.subkey){var w=angular.isArray(x[n.subkey])?x[n.subkey][0].keyList:x[n.subkey].keyList;_.find(w,function(e,t){return x[n.subkey].path+"."+t===i.name})&&(o=!1)}o&&(N(i,n),r+=S(i,n))}else console.log("Empty array passed to processInstructions"),r="";return r};x.$on("regenerateFormMarkup",function(e,t){w.formid&&w.formid===t&&r(x[w.schema])});var I,n=x.$watch(w.schema,function(e){if(e){var t=angular.isArray(e)?e:[e];0<t.length&&"function"==typeof n&&(n(),n=null,r(t))}},!0),r=function(e){for(var t,n,r="",a=w.model||"record",g=x[a],i=e.filter(function(e){return e&&"tab"===e.containerType&&e.hideable}),o=0,s=i;o<s.length;o++){if((d=s[o]).hiddenTabArrayProp){if(t&&d.hiddenTabArrayProp!==t)throw new Error("Currently, tab sets with more than one value for hiddenTabArrayProp are not supported");t=d.hiddenTabArrayProp}if(d.hiddenTabReintroductionMethod){if(n&&d.hiddenTabReintroductionMethod!==n)throw new Error("Currently, tab sets with more than one value for hiddenTabReintroductionMethod are not supported");n=d.hiddenTabReintroductionMethod}}t=t||"record.hiddenTabs";for(var l=0,c=i;l<c.length;l++){var d;(d=c[l]).hiddenTabArrayProp=t}if("tab"===n&&e.push({containerType:"+tab",hiddenTabArrayProp:t,content:[]}),g=g||{},!w.subschema&&!w.model||w.forceform){x.topLevelFormName=w.name||"myForm";var u="";for(var f in w)w.hasOwnProperty(f)&&"$"!==f[0]&&-1===["name","formstyle","schema","subschema","model","viewform"].indexOf(f)&&(u+=" "+w.$attr[f]+'="'+w[f]+'"');var p=w.forceform?"ng-form":"form";r="<".concat(p,' name="').concat(x.topLevelFormName,'" class="').concat($(w.formstyle),'" novalidate ').concat(u,">")}else r="";if(g===x.topLevelFormName)throw new Error("Model and Name must be distinct - they are both "+g);r+=E(e,!0,w),F===P.Forced&&(r+="</uib-tabset>"),r+=w.subschema?"":"</form>";var m=L(r)(x);if(I){var h=x[x.topLevelFormName];I.replaceWith(m),x[x.topLevelFormName]=h}else k.replaceWith(m);I=m;var v=x[w.shared||"sharedData"],b=v?v.modelControllers:[];if((0<A.length||0<b.length)&&!x.phaseWatcher)var y=x.$watch("phase",function(e){if(x.phaseWatcher=!0,"ready"===e&&"function"==typeof y){y(),y=null;for(var t=0;t<b.length;t++)b[t].onAllReady&&b[t].onAllReady(x);for(var n=0;n<A.length;n++){for(var r,a,i=A[n],o=angular.isArray(i.subkey)?i.subkey:[i.subkey],s=i.name.split("."),l=g;1<s.length;)l=l[s.shift()]||{};l=l[s[0]]=l[s[0]]||[];for(var c=0;c<o.length;c++){if(o[c].selectFunc){if(!x[o[c].selectFunc]||"function"!=typeof x[o[c].selectFunc])throw new Error("Subkey function "+o[c].selectFunc+" is not properly set up");r=x[o[c].selectFunc](g,i)}else{if(!o[c].keyList)throw new Error("Invalid subkey setup for "+i.name);var d=o[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(o[c].onNotFound){case"error":var f="Cannot find matching "+(o[c].title||o[c].path);R(function(){x.showError(f,"Unable to set up form correctly")}),r=-1;break;case"create":default:var p=i.name.split("."),m=p.pop(),h=p.join("."),v=g;h&&(v=v[h]),r=v[m].push(d)-1}}x["$_arrayOffset_"+i.name.replace(/\./g,"_")+"_"+c]=r}}}});T.$broadcast("formInputDone",w.name),M.updateDataDependentDisplay&&g&&0<Object.keys(g).length&&M.updateDataDependentDisplay(g,null,!0,x)}}}}t=e.directives||(e.directives={}),r.$inject=["$compile","$rootScope","$filter","$timeout","CssFrameworkService","FormGeneratorService","FormMarkupHelperService","SecurityService"],(n=P=P||{})[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 i,e,o,s;s=!1,o=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(o)||/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(o.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?(i=n.testTime||(new Date).valueOf(),t.get("/api/search?q="+e+"&sentAt="+i).then(function(e){var t=e.data;t.timestamps&&t.timestamps.sentAt&&Number.parseInt(t.timestamps.sentAt)!==i||(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,i,o=[],s=[];if(r="addAll"+r,"string"==typeof n)for(a=n.split(" "),i=0;i<a.length;i++)s.push(a[i]);if(!function e(t){for(var n in t)n===r&&o.push(t[n]),"$parent"===n&&e(t[n])}(e),void 0!==t[r]&&"string"==typeof t[r])for(a=t[r].split(" "),i=0;i<a.length;i++)0===a[i].indexOf("class=")?s.push(a[i].substring(6,a[i].length)):o.push(a[i]);return(n=0<s.length?' class="'+s.join(" ")+'" ':" ")+(0<o.length?o.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 i,o={};t+="Ctrl",o.$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[i]&&(r&&(r=!1,s.items.push({divider:!0})),e.id||(e.id=_.camelCase(e.text||e.textFunc()||"")),s.items.push(e))})}try{c(t,o),i=s.newRecord?"creating":s.id?"editing":"listing",angular.isObject(o.$scope.contextMenu)&&(l(o.$scope.contextMenu),o.$scope.contextMenuPromise&&o.$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"],i=[{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 o(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:o(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:o(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,i){var o,s=r?"/"+r:"",l=e+"/"+n,c=i?"/"+i:"";switch(t){case"list":o=l+s;break;case"edit":o=l+s+"/"+a+"/edit"+c;break;case"view":o=l+s+"/"+a+"/view"+c;break;case"read":o=l+s+"/"+a+"/read"+c;break;case"new":o=l+s+"/new"+c}return o}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,i)},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"),i=r.indexOf("viewonly"),o=void 0;-1===a&&-1===i?-1!==(o=l.reduce(function(e,t){var n=r.indexOf(t);return-1<n?n:e},-1))&&(n-=2+o,d.id=t[n]):-1!==a?(d.newRecord=!0,n-=1+a):n-=1+i,1!==o&&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 i;n.search({}),i="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(i)}}}}}}t=e.services||(e.services={}),n.$inject=["$injector","$locationProvider"],t.RoutingService=n}(fng=fng||{}),function(e){function t(l,n,c,r){function g(e,t,n,r,a,i,o,s){function l(e,t){var n=angular.copy(e),r=_.find(o.tabs,function(e){return e.title===n});if(!r){if(0===o.tabs.length&&0<o.formSchema.length){o.tabs.push({title:"Main",content:[],active:"Main"===o.tab||!o.tab}),r=o.tabs[0];for(var a=0;a<o.formSchema.length;a++)r.content.push(o.formSchema[a])}r=o.tabs[o.tabs.push({title:n,containerType:"tab",content:[],active:n===o.tab})-1]}r.content.push(t)}for(var c in"function"==typeof o.onSchemaFetch&&o.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(i&&n){var p=[];g("Nested "+c,d.schema,p,null,c+".",!0,o,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(S(h.showIf,h.name,o)&&"options"!==c){var v=b(h,d,u,o,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 o.onSchemaProcessed&&o.onSchemaProcessed(e,"Main "===e.slice(0,5)?o.baseSchema():n),r&&0===r.length&&k(e,r,n,t)}function b(t,e,n,r,a){var i;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||"ObjectId"===e.instance&&t.asText)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=c.suffixCleanId(t,"Options"),null!==(i=n.form)&&void 0!==i&&i.enumLabels?(t.ids=c.suffixCleanId(t,"_ids"),r[t.ids]=n.enum,r[t.options]=n.form.enumLabels):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[l("camelCase")(t.directive)]&&t[l("camelCase")(t.directive)].fngAjax)||function(){if(t.options=c.suffixCleanId(t,"Options"),t.ids=c.suffixCleanId(t,"_ids"),!t.hidden)if(n.ref)c.setUpLookupOptions(n.ref,t,r,a,g);else if(n.lookupListRef)c.setUpLookupListOptions(n.lookupListRef,t,r,a),t.lookupListRef=n.lookupListRef;else if(n.internalRef)c.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){var o="Field "+t.name+' has unsupported type "'+e.instance+'"';console.log(o);var s=" (typeof = "+typeof e.instance+")";throw console.log(s),new Error(o+s)}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 d(e,t,n){for(var r=e.split("."),a=n||t.record,i=0,o=r.length;i<o;i++)a[r[i]]||(a[r[i]]=i===o-1?[]:{}),a=a[r[i]];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=c.getListData(r,e.slice(1));break;case 2:t=c.getListData(r,n[1]);break;default:throw new Error("Unsupported showIf format")}}return t}var n,a=t(e.lhs),i=t(e.rhs);switch(e.comp){case"eq":n=a===i;break;case"ne":n=a!==i;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,i=n.length;a<i;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 o in r)if("_id"!==o&&r.hasOwnProperty(o)){t.push({name:o});break}if(0===t.length)throw new Error("Unable to generate a title for "+e)}},S=function(e,r,a){var i=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,i+=1}}var n=!0;return e&&(t(e.lhs),t(e.rhs),0!==i||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,i,o,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],i=0;i<a.length;i+=1){var f=a[i];for(o=0;o<r.formSchema.length;o+=1)r.formSchema[o].name===f&&(l=angular.element(document.querySelector("#cg_"+r.formSchema[o].id)),v(r.formSchema[o].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],i=0;i<a.length;i+=1){var p=a[i].split(".");if(2!==p.length)throw new Error("Conditional display must control dependent fields at same level ");for(o=0;o<r.formSchema.length;o+=1)if(r.formSchema[o].name===p[0])for(var m=r.formSchema[o].schema,h=0;h<m.length;h++)m[h].name===a[i]&&(0===(l=angular.element(document.querySelector("#f_"+p[0]+"List_"+s+" #cg_f_"+a[i].replace(".","_")))).length?l=angular.element(document.querySelector("#f_elements-"+s+"-"+p[1])):c=!1,0<l.length&&(v(r.formSchema[o].schema[h].showIf,e[u[0]][s])?l.show():l.hide()))}}}return c},add:function(t,e,n,r){var a,i;if(null!==(a=null==e?void 0:e.target)&&void 0!==a&&a.hasAttribute&&e.target.hasAttribute("disabled"))return e.preventDefault();if(e.target.offsetParent){var o=d(t,n,r),s=n.formSchema.find(function(e){return e.name===t}),l=s?s.schema:null,c=l?n.setDefaults(l,t+"."):{};"function"==typeof(null===(i=n.dataEventFunctions)||void 0===i?void 0:i.onInitialiseNewSubDoc)&&n.dataEventFunctions.onInitialiseNewSubDoc(t,l,c),o.push(c),n.setFormDirty(e)}},unshift:function(e,t,n,r){d(e,n,r).unshift({}),n.setFormDirty(t)},remove:function(t,e,n,r,a){var i;if(null!==(i=null==n?void 0:n.target)&&void 0!==i&&i.hasAttribute&&n.target.hasAttribute("disabled"))return n.preventDefault();var o,s=d(t,r,a);if("function"==typeof r.dataEventFunctions.onDeleteSubDoc){var l=r.formSchema.find(function(e){return e.name===t}),c=l?l.schema:null;o=r.dataEventFunctions.onDeleteSubDoc(t,c,s,e)}o?r.showError(o):(s.splice(e,1),r.setFormDirty(n))},hasError:function(e,t,n,r){var a=!1;if(r){var i=r[r.topLevelFormName];if("null"!==e&&(i=i[e.replace("$index",n)]),i){var o=i[t];o&&o.$invalid&&!o.$$attr.readonly&&(o.$dirty?a=!0:angular.forEach(o.$validators,function(e,t){"required"!==t&&o.$error[t]&&(a=!0)}))}}else console.log("hasError called with no scope! ",e,t,n);return a},decorateScope:function(s,a,l,e,t){function c(){for(var e=s.$$childHead;e;){if(e.tabset)return e.tabset;e=e.$$nextSibling}}s.record=e.record,s.phase="init",s.disableFunctions=e.disableFunctions,s.dataEventFunctions=e.dataEventFunctions,s.topLevelFormName=void 0,s.formSchema=[],s.tabs=[],s.listSchema=[],s.recordList=[],s.dataDependencies={},s.internalLookups=[],s.listLookups=[],s.conversions={},s.pageSize=60,s.pagesLoaded=0,e.baseScope=s,r.decorateSecurableScope(s,{pseudoUrl:t}),s.generateEditUrl=function(e){return a.generateEditUrl(e,s)},s.generateViewUrl=function(e){return a.generateViewUrl(e,s)},s.generateNewUrl=function(){return a.generateNewUrl(s)},s.scrollTheList=function(){var e;if(0<(null===(e=s.listSchema)||void 0===e?void 0:e.length))return l.scrollTheList(s);var t=s.$watchCollection("listSchema",function(e){if(0<(null==e?void 0:e.length))return t(),l.scrollTheList(s)})},s.getListData=function(e,t){return l.getListData(e,t,s.listSchema,s)},s.setPristine=function(e){e&&s.dismissError(),s[s.topLevelFormName]&&s[s.topLevelFormName].$setPristine()},s.skipCols=function(e){return 0<e?"col-md-offset-3":""},s.setFormDirty=function(e){e?angular.element(e.target).inheritedData("$formController").$setDirty():console.log("setFormDirty called without an event (fine in a unit test)")},s.add=function(e,t,n){return a.add(e,t,s,n)},s.hideTab=function(e,t,n){var r=l.getData(s,n);if(r&&Array.isArray(r)&&!r.includes(t)){var a=s.tabs[s.activeTabNo].title===t;r.push(t),r.sort();var i=s.baseForm;if(i&&i.$setDirty(),a){var o=c();o&&o.select(s.tabs.findIndex(function(e){return!r.includes(e.title)}))}}},s.addTab=function(e,t,n){var r=l.getData(s,n);if(r&&Array.isArray(r)){var a=r.findIndex(function(e){return e===t});if(-1===a)return;r.splice(a,1);var i=s.baseForm;i&&i.$setDirty();var o=c();o&&o.select(s.tabs.findIndex(function(e){return e.title===t}))}},s.hasError=function(e,t,n){return a.hasError(e,t,n,s)},s.unshift=function(e,t,n){return a.unshift(e,t,s,n)},s.remove=function(e,t,n,r){return a.remove(e,t,n,s,r)},s.baseSchema=function(){return s.tabs.length?s.tabs:s.formSchema}}}}((e.services||(e.services={})).FormGeneratorService=t).$inject=["$filter","RoutingService","RecordHandlerService","SecurityService"]}(fng=fng||{}),function(f){var e;function t(h,v,g,b,a){function y(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)}function w(e,t){var n=["vertical","inline"];return t||n.push("stacked"),!e||"undefined"===e||!n.includes(e)}function d(){return"bs2"===h.framework()?"icon":"glyphicon glyphicon"}function u(c,d){var u=c.nonUniqueId||c.id;return[function(){if(c.readonly&&"boolean"==typeof c.readonly)return" disabled ";function e(){return c.readonly?' ng-disabled="'.concat(c.readonly,'" '):""}if(!u||!b.canDoSecurityNow(d,"disabled"))return e();var t=[];if(d.requiresDisabledChildren){var n=void 0;if(c.nonUniqueId)n=(s=c.nonUniqueId.startsWith("f_")?c.nonUniqueId.substring(2):c.nonUniqueId).split("_");else n=c.name.split(".");for(n.pop();0<n.length;)t.push("f_".concat(n.join("_"))),n.pop()}if("instant"===f.formsAngular.elemSecurityFuncBinding){if(d.isSecurelyDisabled(u))return" disabled ";for(var r=0,a=t;r<a.length;r++){var i=a[r];if(d.requiresDisabledChildren(i))return" disabled "}return e()}var o="isSecurelyDisabled('".concat(u,"')");if(0<t.length){var s=t.map(function(e){return"requiresDisabledChildren('".concat(e,"')")});o="(".concat(o," || ").concat(s.join(" || "),")")}var l="one-time"===f.formsAngular.elemSecurityFuncBinding;return c.readonly?l?e()+'ng-readonly="::'.concat(o,'" '):' ng-disabled="'.concat(o," || ").concat(c.readonly,'" '):' ng-disabled="'.concat(l?"::":"").concat(o,'" ')}(),b.getDisableableAttrs(u)]}function k(e,t,n){if(n.subschema&&n.model){for(var r=n.model,a=0,i="$parent.";r.startsWith(i);)a++,r=r.substring(i.length);return"".concat(e,"_{{").concat(i.repeat(a),"$index}}")}return"".concat(e,"_{{$index}}")}function S(e,t,n){return void 0!==e.$index||!!n.subschema}function i(e,t,n){for(;t.includes("@@");){var r=t.indexOf("@@")+2,a=t.indexOf("@@",r)-1,i=t.substring(r,1+a),o=i.endsWith("s");o&&(i=i.slice(0,-1));var s=i[0].toUpperCase()===i[0]?"true":"false";i=i.toLocaleLowerCase();var l=void 0;l="global"===n?f.formsAngular.pseudo(i,"true"==s):"scopeStatic"===n?e.sharedData.pseudo(i,"true"==s):"scopeDynamic"===n?"{{ sharedData.pseudo('".concat(i,"', ").concat(s,") }}"):"",t=t.substring(0,r-2)+l+(o?"s":"")+t.substring(3+a)}return t}return{isHorizontalStyle:w,isArrayElement:S,handlePseudos:function(e,t,n){var r,a;return null!=t&&t.includes("@@")?(a="function"==typeof(null===(r=null==e?void 0:e.sharedData)||void 0===r?void 0:r.pseudo)?n?(e[n]=function(){return i(e,t,"scopeStatic")},"none"):"scopeDynamic":"function"==typeof f.formsAngular.pseudo?"global":"none",i(e,t,a)):t},fieldChrome:function(e,t,n){var r="";if(t.id&&"function"==typeof t.id.replace){var a=t.nonUniqueId||t.nonuniqueid||t.id,i=void 0;if(t.id.includes(".")&&t.id.includes("{{"))for(var o=!(i="cg_"),s=0;s<t.id.length;s++)"{"===t.id[s]&&"{"===t.id[s-1]?o=!0:"}"===t.id[s]&&"}"===t.id[s-1]&&(o=!1),o||"."!==t.id[s]?i+=t.id[s]:i+="-";else i="cg_".concat(t.id.replace(/\./g,"-"));a="cg_".concat(a.replace(/\./g,"-"));var l=b.considerVisibility(a,e);if(l.omit)return{omit:!0};r+='id="'.concat(S(e,0,n)?k(i,0,n):i,'"'),l.visibilityAttr&&(r+=" ".concat(l.visibilityAttr))}var c=t.classes||"",d="",u="";if(t.showWhen=t.showWhen||t.showwhen,t.showWhen&&("string"==typeof t.showWhen?r+=' ng-show="'+t.showWhen+'"':r+=' ng-show="'+y(t.showWhen,n.model)+'"'),"bs3"===h.framework()){var f;c+=" form-group","vertical"===n.formstyle&&"block-level"!==t.size&&(d+='<div class="row">',c+=" col-sm-"+v.sizeAsNumber(t.size),u+="</div>");var p=null,m=t.name.split(".");f=n&&void 0!==n.subkeyno?n.subschemaroot.replace(/\./g,"-")+"-subkey"+n.subkeyno+"-"+m[m.length-1]:n.subschema?(p="form_"+m.slice(0,-1).join("_")+"$index",t.name.replace(/\./g,"-")):"f_"+t.name.replace(/\./g,"_"),d+="<div"+g.addAll(e,"Group",c,n)+" ng-class=\"{'has-error': hasError('"+p+"','"+f+"', $index)}\"",u+="</div>"}else u=w(n.formstyle,!0)?(d+="<div"+g.addAll(e,"Group","control-group",n),"</div>"):(d+="<span ","</span>");return{template:d+=(r||"")+">",closeTag:u}},label:function(e,t,n,r){var a="";if("bs3"===h.framework()||!["inline","stacked"].includes(r.formstyle)&&""!==t.label||n){a="<label";var i="control-label";if(w(r.formstyle,!1)?(t.linklabel||(a+=' for="'+t.id+'"'),void 0!==t.labelDefaultClass?i+=" "+t.labelDefaultClass:"bs3"===h.framework()&&(i+=" col-sm-3")):["inline","stacked"].includes(r.formstyle)&&(a+=' for="'+t.id+'"',i+=" sr-only"),a+=g.addAll(e,"Label",null,r)+' class="'+i+'">'+t.label,n){var o=u(t,e);a+=" <i ".concat(o.join(" "),' id="add_').concat(t.id,'" ng-click="add(\'').concat(t.name,'\', $event)" class="').concat(d(),'-plus-sign"></i>')}if(a+="</label>",t.linklabel){var s='<fng-link fld="'+t.name+'" ref="'+t.ref+'" text="'+escape(a)+'"';t.form&&(s+=' form="'+t.form+'"'),t.linktab&&(s+=' linktab="'+t.linktab+'"'),a=s+="></fng-link>"}}return a},glyphClass:d,allInputsVars:function(e,t,n,r,a,i){var o,s=t.placeHolder,l="",c="",d="",u="";return"bs3"===h.framework()?(l=-1===["horizontal","vertical","inline"].indexOf(n.formstyle)?" input-sm":"",c="col-sm-"+v.sizeAsNumber(t.size),u=" form-control"):d=t.size?" input-"+t.size:"",["inline","stacked"].includes(n.formstyle)&&(s=s||t.label),o='data-ng-model="'+r+'"',a&&(o+=' id="'.concat(a,'"')),i?o+=' name="'.concat(i,'"'):a&&(o+=' name="'.concat(a,'"')),s&&(o+=' placeholder="'.concat(s,'"')),t.popup&&(o+=' title="'.concat(t.popup,'"')),t.ariaLabel&&(o+=' aria-label="'.concat(t.ariaLabel,'"')),{common:o+=g.addAll(e,"Field",null,n),sizeClassBS3:c,sizeClassBS2:d,compactClass:l,formControl:u}},inputChrome:function(e,t,n,r){"bs3"===h.framework()&&w(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 i="bs2"===h.framework()?{el:"span",cl:"help-inline"}:{el:"div",cl:"help-block"};e+="<".concat(i.el,' class="').concat(i.cl,'">').concat(a,"</").concat(i.el,">")}return e+="<dms/>",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"!==h.framework()||t.size||(r+='class="input-small"'),r+=" />"},controlDivClasses:function(e){var t=[];return w(e.formstyle,!1)&&t.push("bs2"===h.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,a){var i="bs3"===h.framework()?'ng-class="skipCols($index)" ':"",o=(a.model||"record")+"."+r.name,s="";s+='<div id="'+r.id+'List" class="'+t.join(" ")+'" '+i+' ng-repeat="arrayItem in '+o+' track by $index">';var l=u(r,n),c="link"!==r.type?"<i ".concat(l.join(" ")," ng-click=\"remove('").concat(r.name,'\', $index, $event)" id="remove_').concat(r.id,'_{{$index}}" class="').concat(d(),'-minus-sign"></i>'):"";return s+=e.replace("<dms/>",c),s+="</div>",i="bs3"===h.framework()?'ng-class="skipCols('+o+'.length)" ':"",r.help&&(s+='<div class="array-help-block '+t.join(" ")+'" '+i+' id="empty'+r.id+'ListHelpBlock">'+r.help+"</div>"),s},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},handleReadOnlyDisabled:u,generateArrayElementIdString:k,genDisableableAncestorStr:function(e){return b.getDisableableAncestorAttrs(e)},generateNgShow:y}}e=f.services||(f.services={}),t.$inject=["CssFrameworkService","InputSizeHelperService","AddAllService","SecurityService","$filter"],e.FormMarkupHelperService=t}(fng=fng||{}),function(e){(e.services||(e.services={})).InputSizeHelperService=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(y){function s(e,t,n,r,a){var i=n.info.name;r&&(null!=a&&a.nonUniqueIdSuffix?(t=t.replace(r,a.nonUniqueIdSuffix),i+=".".concat(a.nonUniqueIdSuffix)):i+=".".concat(r));var o=y.handleReadOnlyDisabled({id:t,name:i,nonUniqueId:n.info.nonuniqueid,readonly:n.info.readonly},e);if(null!=a&&a.forceNg)for(var s=0;s<o.length;s++)"disabled"===o[s].toLowerCase().trim()&&(o[s]='ng-disabled="true"');return o}function o(e,t,n,r,a){return s(e,t,n,r,a).join(" ")}function p(e,t,n){return y.handlePseudos(e,t,n)}function l(e,t,n){return y.isArrayElement(e,t.info,t.options)?y.generateArrayElementIdString(n,t.info,t.options):n}function c(e,t,n,r){var a=t.info.id;return n&&(n.startsWith("_")||(a+="_"),a+=n),r&&(a=l(e,t,a)),a}function i(e,t,n,r){var a=s(e,r,t,n,{forceNg:!0}),i=a[0],o="";if(i){i=(i=(i=(i=i.replace("data-ng-disabled","ng-disabled")).replace("data-ng-readonly","ng-readonly")).replace("ng-disabled=",'"ng-disabled":')).replace("ng-readonly=",'"ng-readonly":');try{i="{ ".concat(i," }"),(i=JSON.parse(i)["ng-disabled"])&&(o='disabledDate="'.concat(i,'" readonlyTime="').concat(i,'"'))}catch(e){}}return o+" "+a[1]}function w(e,t,n,r){function a(e){var t=e.replace(/&quot;/g,'"');if("true"===t)return!0;if("false"===t)return!1;var n=parseFloat(t);return!isNaN(n)&&isFinite(n)?n:t}var i={},o={formStyle:e.formstyle},s={},l=t?t.length:0,c=null==t?void 0:t.toLowerCase();for(var d in e)if(e.hasOwnProperty(d)){var u=d.toLowerCase();"fngfld"===u.slice(0,6)?i[u.slice(6)]=a(e[d]):"fngopt"===u.slice(0,6)?o[u.slice(6)]=a(e[d]):t&&u.slice(0,l)===c&&(s[_.kebabCase(d.slice(l))]=a(e[d]))}var f={info:i,options:o,directiveOptions:s};return f.info.help=p(n,f.info.help,null!=r&&r.setUpDynamicHelpFunc?"help":void 0),f.info.label=p(n,f.info.label,null!=r&&r.setUpDynamicLabelFunc?"label":void 0),f.info.popup=p(n,f.info.popup),f}function r(e,t,n,r){var a=c(e,t,n,!1),i=l(e,t,a);return'id="'.concat(i,'" ').concat(o(e,a,t,n,r))}return{extractFromAttr:w,buildInputMarkup:function(e,t,n,r){var a=n.processedAttrs||w(t,"",e),i={};n.ignoreFieldInfoFromAttrs||Object.assign(i,a.info),n.fieldInfoOverrides&&Object.assign(i,n.fieldInfoOverrides);var o=Object.assign({},a.options,n.optionOverrides),s=y.fieldChrome(e,i,o);if(s.omit)return"";var l=y.controlDivClasses(o),c=s.template+y.label(e,i,n.addButtons,o),d=i.id;(i.array||o.subschema)&&(d=y.generateArrayElementIdString(d,i,o));var u=n.addButtons?"arrayItem"+(n.needsX?".x":""):t.model+"."+i.name,f=i.name;if(o.subschema&&-1!==i.name.indexOf(".")){var p=t.model+".",m=o.subschemaroot,h=i.name.slice(m.length+1);u=p+m,o.subkey?(d=u.slice(p.length).replace(/\./g,"-")+"-subkey"+o.subkeyno+"-"+h,u+="[$_arrayOffset_"+m.replace(/\./g,"_")+"_"+o.subkeyno+"]."+h):(u+="[$index]."+h,f=i.name.replace(/\./g,"-"))}var v=y.allInputsVars(e,i,o,u,d,f);v.modelString=u,v.disableableAncestorStr=y.genDisableableAncestorStr(i.id);var g=r(v),b=y.inputChrome(g,i,o,v);return n.addButtons?c+=y.handleArrayInputAndControlDiv(b,l,e,i,o):c+=y.handleInputAndControlDiv(b,l),c+=s.closeTag},genIdString:function(e,t,n){return c(e,t,n,!0)},genDisabledStr:function(e,t,n,r){return o(e,c(e,t,n,!1),t,n,r)},genIdAndDisabledStr:r,genDateTimePickerDisabledStr:function(e,t,n){return i(e,t,n,c(e,t,n,!1))},genDateTimePickerIdAndDisabledStr:function(e,t,n){var r=c(e,t,n,!1),a=l(e,t,r);return'id="'.concat(a,'" ').concat(i(e,t,n,r))},genUiSelectIdAndDisabledStr:function(e,t,n){return r(e,t,n,{forceNg:!0})},handlePseudos:p,genDisableableAncestorStr:function(e){return y.genDisableableAncestorStr(e.info.id)}}}t=e.services||(e.services={}),n.$inject=["FormMarkupHelperService"],t.PluginHelperService=n}(fng=fng||{}),function(O){var e;function t(c,d,i,u,o,s,f,m,e){var l=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 p(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 h(e,t,n,r){void 0===r&&(r=!1);for(var a=t.split("."),i=a.length-1,o=e,s=0;s<i;s++){if(!o)throw new Error("walkTree failed: Object = ".concat(e,", fieldname = ").concat(t,", i = ").concat(s));if(o=angular.isArray(o)?_.map(o,function(e){return e[a[s]]}):(r&&!o[a[s]]&&(o[a[s]]={}),o[a[s]]),angular.isArray(o)&&void 0!==n)if(n.scope&&"function"==typeof n.scope)o=o[n.scope().$index];else{if("number"!=typeof n)throw new Error("Unsupported element type in walkTree "+t);o=o[n]}if(!o)break}return{lastObject:o,key:o?a[i]:void 0}}function y(e,t,n,r){var a=h(e,t,n,!!r);if(a.lastObject&&a.key)if(r)if(angular.isArray(a.lastObject))for(var i=0;i<a.lastObject.length;i++)a.lastObject[i][a.key]=r[i];else a.lastObject[a.key]=r;else delete a.lastObject[a.key]}function v(t,n,e,r){if(void 0===r&&(r=!1),!n.topLevelFormName||n[n.topLevelFormName]&&(r||n[n.topLevelFormName].$pristine)){S(t.name,e.master,function(e){return"object"==typeof e&&e.id?e:C(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=h(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 i=_.find(n,function(e){return e.name===t});if(i)switch(i.params){case void 0:break;case"timestamp":var o=a.toString().substring(0,8),s=new Date(1e3*parseInt(o,16));a=s.toLocaleDateString()+" "+s.toLocaleTimeString();break;default:a=r.dataEventFunctions[i.params](e)}}return a}function S(e,t,n){var r,a,i=(r=e.split("."),a=[r[0]],1<r.length&&a.push(r.slice(1).join(".")),a);if(1<i.length)!function(e,t,n){if(void 0!==t)if(angular.isArray(t))for(var r=0;r<t.length;r++)S(e,t[r],n);else S(e,t,n)}(i[1],t[i[0]],n);else if(t[i[0]]){var o=t[i[0]];if(angular.isArray(o))for(var s=o.length-1;0<=s;s--){var l=typeof o[s];("undefined"==l||"object"==l&&0===Object.keys(o[s]).length)&&o.splice(s,1)}t[i[0]]=n(o)}}function g(e,t,n,r,a){var i="string"==typeof t?e[t]:t,o="string"==typeof n?e[n]:n;i.length=0,o.length=0,r&&0<r.length&&r.forEach(function(e){var t=e[a];t&&0<t.length&&(i.push(t),e._id||(e._id=l()),o.push(e._id))})}var x=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 D(e,t,n){var r=e.conversions;return n&&(r=w(r,n)||{}),r[t]}var $=function(e,t,n,r,a,i,o){i=i||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]=$(l.schema,d[u],1+c.length,r,c,i,u)}else{l.internalRef&&g(r,l.options,l.ids,i[l.internalRef.property],l.internalRef.value);var f=k(t,c,null,r);if(l.array&&x(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;d&&m&&0<m.length?c.includes(".")||!d.toString().match(/^[a-f0-9]{24}$/)||l.internalRef&&l.internalRef.noConvert||(t[c]=C(l,d,r[b(l,"Options")],m)):l.select2?(console.log("fng-select2 is deprecated - use fng-ui-select instead"),l.select2):d&&(h=D(r,c,a))&&h.fngajax&&"function"==typeof h.fngajax&&!h.noconvert&&h.fngajax(d,l,function(e,t){y(i,e.name,o,t),N(angular.element("#"+e.id),function(){y(r.record,e.name,o,t)})})}}return t};function C(e,t,n,r){if(e.array||angular.isArray(t)){for(var a=[],i=e.array&&(!e.directive||x(e)),o=0;o<t.length;o++){var s=t[o];s&&s.x&&(s=s.x);var l=E(s,r,n,e.name);i&&(l={x:l}),a.push(l)}return a}return e.select2?{id:t,text:E(t,r,n,e.name)}:E(t,r,n,e.name)}function A(e,t,n,r){var a=_.isObject(e)?e.x||e.text:e;if(a&&a.match(/^[0-9a-f]{24}$/))return a;var i=t.indexOf(a);if(-1===i)throw new Error("convertListValueToId: Invalid data - value "+a+" not found in "+t+" processing "+r);return n[i]}function F(e,t,n){n.master=$(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)},E=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 I(t,n,r,e,a){if(a&&0<a.length&&a.length===e.length&&n[r]){var i=a.findIndex(function(e){return e[t.value]===n[r]});if(-1<i){var o=e[i][t.value];o&&(n[r]=o)}}}function L(e,f,a,t,p){var n=!f.id&&!f.newRecord;function i(i,u){f.internalLookups.forEach(function(n){var r=i[n.ref.property],a=u[n.ref.property];g(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 I(n.ref,e,t.lastPart,r,a)})}else angular.isArray(f.record[t.lastPart])?f.record[t.lastPart].forEach(function(e){I(n.ref,e,"x",r,a)}):I(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(i,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 i=f[r.formInstructions.ids];i.length=0;for(var e=l.data[c.ref.property]||[],t=0;t<e.length;t++){var n=e[t][c.ref.value],o=_.sortedIndex(a,n);a[o]===n&&(n=n+" ("+e[t]._id+")",o=_.sortedIndex(a,n)),a.splice(o,0,n),i.splice(o,0,e[t]._id)}if(0===Object.keys(u).length)v(r.formInstructions,f,p,!0);else if(r.oldId)if(angular.isArray(r.oldId))r.oldId.forEach(function(e,t){var n=i.indexOf(e);y(f.record,r.formInstructions.name,t,-1===n?void 0:a[n])});else{var s=i.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(),i(f.record,{})}if(f.id&&"function"!=typeof f.dataEventFunctions.onBeforeRead&&t.beginReadingRecord(f),a.handleSchema("Main "+f.modelName,e,n?null:f.formSchema,f.listSchema,"",!0,f,p),n)p.allowLocationChange=!0;else{var o=!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),o=a.updateDataDependentDisplay(e,t,o,f),i(e,t),O.formsAngular.title)){var n=O.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()+(O.formsAngular.title.suffix||""),d.document.title=n.replace(/<\/?[^>]+(>|$)/g,"")}},!0),f.id)"function"==typeof f.dataEventFunctions.onBeforeRead?f.dataEventFunctions.onBeforeRead(f.id,function(e){e?f.showError(e):(t.beginReadingRecord(f),t.finishReadingThenProcessRecord(f,p))}):t.finishReadingThenProcessRecord(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(a){return function(e){if(-1!==[200,400,403].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>"+i("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.",a.phase="error",a.showError(t)}else if(404===e.status)c.search({}).path("/404");else{var r=e.data;"string"!=typeof r&&(r=JSON.stringify(r)),500!==e.status&&(r=e.status+" "+r),a.showError(r)}}}function T(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("."),i=r.find(function(e){return e.ref.property===n.property&&e.ref.value===n.value}),o={formInstructions:t,lastPart:a.pop(),possibleArray:a.join(".")};i||(i={ref:n,lookupOptions:[],lookupIds:[],handlers:[]},r.push(i)),i.handlers.push(o),e[t.options]=i.lookupOptions,e[t.ids]=i.lookupIds}return{beginReadingRecord:function(e){e.readingRecord=m.readRecord(e.modelName,e.id,e.formName)},finishReadingThenProcessRecord:function(t,n){var r="function"==typeof O.formsAngular.beforeHandleIncomingDataPromises;(r?Promise.all(__spreadArray([t.readingRecord],O.formsAngular.beforeHandleIncomingDataPromises(),!0)):t.readingRecord).then(function(e){T(r?angular.copy(e[0].data):e.data,t,n)}).catch(function(e){t.dataEventFunctions.onReadError?t.dataEventFunctions.onReadError(t.id,e):404===e.status?c.search({}).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,concatenate:!1}).then(function(e){var t=e.data;angular.isArray(t)?(!n.listSchema.find(function(e){return"disambiguation"===e.name})&&t.some(function(e){return e.disambiguation})&&n.listSchema.push({name:"disambiguation"}),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,n,t){n.phase="deleting",m.deleteRecord(n.modelName,e,n.formName).then(function(){"function"==typeof n.dataEventFunctions.onAfterDelete&&n.dataEventFunctions.onAfterDelete(t.master),s.redirectTo()("onDelete",n,c)},function(e){var t;404===e.status?s.redirectTo()("onDelete",n,c):403===e.status?n.showError((null===(t=e.data)||void 0===t?void 0:t.message)||e.message||e.data||e,"Permission denied"):n.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,r.formName).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):(T(t,r,a),r.setPristine(!1))):r.showError(t)},function(e){r.handleHttpError(e)})},createNew:function(e,n,r,a){m.createRecord(r.modelName,e,r.formName).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:s.redirectTo()("edit",r,c,t._id)):r.showError(t)},r.handleHttpError)},getListData:k,suffixCleanId:b,getData:w,setData:y,setUpLookupOptions:function(e,i,o,s){var l=o[i.options]=[],c=o[i.ids]=[];(i.filter?m.getPagedAndFilteredList(e,Object.assign({concatenate:!0},i.filter)):m.getAllListAttributes(e)).then(function(e){var t=e.data;if(t){t.sort(function(e,t){return e.text.localeCompare(t.text)}),l.push.apply(l,t.map(function(e){return e.text})),c.push.apply(c,t.map(function(e){return e.id}));for(var n=new Set,r=0;r<l.length-1;r++)for(var a=r+1;a<l.length;a++)_.isEqual(l[r],l[a])&&n.add(l[r]);n.forEach(function(e){for(var t=0;t<l.length;t++)l[t]===e&&(l[t]+="("+c[t]+")")}),o.readingRecord&&o.readingRecord.then(function(){v(i,o,s)})}}).catch(function(e){o.handleHttpError(e)})},setUpLookupListOptions:function(i,o,s,l){var c=s[o.options]=[],d=s[o.ids]=[];"$"===i.id[0]?r(s,o,i,s.listLookups):m.readRecord(i.collection,s.$eval(i.id)).then(function(e){for(var t=e.data[i.property],n=0;n<t.length;n++){var r=t[n][i.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)}v(o,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&&x(t)&&n)for(var a=0;a<n.length;a++)n[a]=n[a].x;var i=m[b(t,"_ids")];if(i&&0<i.length)S(e,f,function(e){return function(e,t,n,r){if(e.array){for(var a=[],i=0;i<t.length;i++)a.push(A(t[i],n,r,e.name));return a}return A(t,n,r,e.name)}(t,e,m[b(t,"Options")],i)});else{var o=D(m,e,h);if(o){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],o)}else l=v(s,o);y(f,e,null,l)}}}}for(var g=0;g<u.length;g++)e();return f},convertIdToListValue:E,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){l.errorHideTimer&&l.clearTimeout(),l.errorMessage?l.errorMessage+="<br /><br />":l.errorMessage="",l.errorMessage+=function(){if(u(function(){l.phase="ready"},25),"string"==typeof t)return o.trustAsHtml(t);if(!t)return"An error occurred - that's all we got. Sorry.";if(t.message&&"string"==typeof t.message)return t.message;if(t.data&&t.data.message)return t.data.message;try{return JSON.stringify(t)}catch(e){return t}}(),l.alertTitle=e||"Error!",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.redirectOptions=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(){s.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(p))}),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(p)}},l.isCancelDisabled=function(){var e;return!!(l[l.topLevelFormName]&&l[l.topLevelFormName].$pristine||"ready"!==l.phase)||"function"==typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isCancelDisabled)&&l.disableFunctions.isCancelDisabled(l.record,a.master,l[l.topLevelFormName])},l.isSaveDisabled=function(){var e;l.whyDisabled=void 0;var t=!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"===f.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"===f.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&&(t=!0):l.whyDisabled="Top level form name invalid",t||l.whyDisabled||"ready"!==l.phase)return!0;if("function"!=typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isSaveDisabled))return!1;var n=l.disableFunctions.isSaveDisabled(l.record,a.master,l[l.topLevelFormName]);return l.whyDisabled="string"==typeof n?n:"An application level user-specified function is inhibiting saving the record",!!n},l.isDeleteDisabled=function(){var e;return!l.id||"ready"!==l.phase||"function"==typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isDeleteDisabled)&&l.disableFunctions.isDeleteDisabled(l.record,a.master,l[l.topLevelFormName])},l.isNewDisabled=function(){var e;return"function"==typeof(null===(e=l.disableFunctions)||void 0===e?void 0:e.isNewDisabled)&&l.disableFunctions.isNewDisabled(l.record,a.master,l[l.topLevelFormName])},l.setDefaults=function(e,a){void 0===a&&(a="");var i={};return e.forEach(function(e){if(void 0!==e.defaultValue){for(var t=e.name.replace(a,"").split("."),n=i,r=0;r<t.length-1;r++)n[t[r]]||(n[t[r]]={}),n=n[t[r]];n[t[t.length-1]]=e.defaultValue}}),i},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(e,t){e.target.hasAttribute("disabled")?t.item.sortable.cancel():l.topLevelFormName&&l[l.topLevelFormName].$setDirty()}},l.setUpCustomLookupOptions=function(e,t,n,r){for(var a=0,i=[l,r];a<i.length;a++){var o=i[a];o&&(o[e.ids]=t,o[e.options]=n)}var s=w(l.record,e.name);s&&(Array.isArray(s)&&(s=s.filter(function(e){return null!=e})),s=C(e,s,n,t),y(l.record,e.name,void 0,s))}},fillFormFromBackendCustomSchema:L,fillFormWithBackendSchema:function(t,n,r,a){e.getSchema(t.modelName,t.formName).then(function(e){L(e.data,t,n,r,a)},t.handleHttpError)}}}e=O.services||(O.services={}),t.$inject=["$location","$window","$filter","$timeout","$sce","RoutingService","CssFrameworkService","SubmissionsService","SchemasService"],e.RecordHandlerService=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||{}),function(d){var e;function t(r){function a(e){return!!d.formsAngular.elemSecurityFuncBinding&&("hidden"===e&&!!d.formsAngular.hiddenSecurityFuncName||"disabled"===e&&!!d.formsAngular.disabledSecurityFuncName)}function i(e,t){return a(t)&&("hidden"===t&&r[d.formsAngular.hiddenSecurityFuncName]&&(!e||!!e.isSecurelyHidden)||"disabled"===t&&r[d.formsAngular.disabledSecurityFuncName]&&(!e||!!e.isSecurelyDisabled))}function n(e,t){return r[d.formsAngular.hiddenSecurityFuncName](e,t)}function o(e,t){return r[d.formsAngular.disabledSecurityFuncName](e,t)}function s(e,t){return!!o(e,t)}function l(){return"one-time"===d.formsAngular.elemSecurityFuncBinding?"::":""}function t(e,t){return e&&t&&(n=e,null===(r=d.formsAngular.ignoreIdsForHideableOrDisableableAttrs)||void 0===r||!r.some(function(e){return n.includes(e)}))?" ".concat(t,' title="').concat(e,'"'):"";var n,r}function e(e){return t(e,d.formsAngular.disableableAttr)}function c(e){return t(e,d.formsAngular.hideableAttr)}return{canDoSecurity:a,canDoSecurityNow:i,isSecurelyHidden:n,isSecurelyDisabled:s,getHideableAttrs:c,getDisableableAttrs:e,getDisableableAncestorAttrs:function(e){return t(e,d.formsAngular.disableableAncestorAttr)},decorateSecurableScope:function(e,t){a("hidden")&&(!d.formsAngular.skipHiddenSecurityFuncName||null!=t&&t.overrideSkipping||"function"!=typeof r[d.formsAngular.skipHiddenSecurityFuncName]||!r[d.formsAngular.skipHiddenSecurityFuncName](null==t?void 0:t.pseudoUrl))&&(e.isSecurelyHidden=function(e){return n(e,null==t?void 0:t.pseudoUrl)}),a("disabled")&&(!d.formsAngular.skipDisabledSecurityFuncName||null!=t&&t.overrideSkipping||"function"!=typeof r[d.formsAngular.skipDisabledSecurityFuncName]||!r[d.formsAngular.skipDisabledSecurityFuncName](null==t?void 0:t.pseudoUrl))&&(e.isSecurelyDisabled=function(e){return s(e,null==t?void 0:t.pseudoUrl)},(!d.formsAngular.skipDisabledAncestorSecurityFuncName||null!=t&&t.overrideSkipping||(r[d.formsAngular.skipDisabledAncestorSecurityFuncName],1)||!r[d.formsAngular.skipDisabledAncestorSecurityFuncName](null==t?void 0:t.pseudoUrl))&&(e.requiresDisabledChildren=function(e){return"+"===o(e,null==t?void 0:t.pseudoUrl)}))},doSecurityWhenReady:function(t){if(i(void 0,"hidden"))t();else if(a("hidden"))var n=r.$watch(d.formsAngular.hiddenSecurityFuncName,function(e){e&&(n(),t())})},considerVisibility:function(e,t){var n=c(e);if(i(t,"hidden")){if("instant"!==d.formsAngular.elemSecurityFuncBinding)return{visibilityAttr:'data-ng-if="'.concat(l(),"!isSecurelyHidden('").concat(e,"')\"").concat(n)};if(t.isSecurelyHidden(e))return{omit:!0}}return{visibilityAttr:n}},considerContainerVisibility:function(e,t){if(i(t,"hidden")){if("instant"===d.formsAngular.elemSecurityFuncBinding)return e.some(function(e){return!t.isSecurelyHidden(e)})?{}:{omit:!0};var n=e.map(function(e){return"!isSecurelyHidden('".concat(e,"')")});return{visibilityAttr:'data-ng-if="'.concat(l(),"(").concat(n.join(" || "),')"')}}return{}},generateDisabledAttr:function(n,r,a){return function(){var e="";if(i(r,"disabled")){if((a=a||{}).attrRequiresValue&&a.forceNg)throw new Error("Invalid combination of parameters provided to generateDisabledAttr() [attrRequiresValue and forceNg]");var t=a.attr||"disabled";if("instant"===d.formsAngular.elemSecurityFuncBinding){if(r.isSecurelyDisabled(n)){if(a.attrRequiresValue)return" ".concat(t,'="true"');if(!a.forceNg)return" ".concat(t);e="true"}}else e="".concat(l(),"isSecurelyDisabled('").concat(n,"')");if(e)return"disabled"===t?' data-ng-disabled="'.concat(e,'"'):" data-ng-attr-".concat(t,'="').concat(e,'"')}return e}()+e(n)}}}e=d.services||(d.services={}),t.$inject=["$rootScope"],e.SecurityService=t}(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(i){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("p",e.projection),t("a",e.aggregate),t("o",e.order),t("s",e.skip),t("c",e.concatenate),n}var r=!0,o=new ExpirationCache;function s(e,t,n){var r="/api/".concat(e);return t&&(r+="/".concat(t)),n&&(r+="/".concat(n)),r}return{getListAttributes:function(e,t,n){var r="string"==typeof t?t:t.id||t._id||t.x||t;if("object"==typeof r)throw new Error("getListAttributes doesn't expect an object but was provided with ".concat(JSON.stringify(t)));var a=n?"?returnRaw=1":"";return i.get("/api/".concat(e,"/").concat(r,"/list").concat(a),{cache:o})},getAllListAttributes:function(e){return i.get("/api/".concat(e,"/listAll"),{cache:o})},getPagedAndFilteredList:function(e,t){if(t.projection)throw new Error("Cannot use projection option for getPagedAndFilteredList, because it only returns list fields");return void 0===t.concatenate&&(t.concatenate=!1),i.get("/api/".concat(e,"/listAll").concat(n(t)))},getPagedAndFilteredListFull:function(e,t){return i.get("/api/".concat(e).concat(n(t)))},readRecord:function(e,t,n){var r="string"==typeof t?t:t.id||t._id||t.x||t;if("object"==typeof r)throw new Error("readRecord doesn't expect an object but was provided with ".concat(JSON.stringify(t)));var a=s(e,n,r);return i.get(a)},getAll:function(e,t){var n=angular.extend({cache:!!r&&o},t);return i.get("/api/".concat(e),n)},deleteRecord:function(e,t,n){var r=s(e,n,t);return i.delete(r)},updateRecord:function(e,t,n,r){o.remove("/api/".concat(e));var a=s(e,r,t);return i.post(a,n)},createRecord:function(e,t,n){o.remove("/api/".concat(e));var r=s(e,n)+"/new";return i.post(r,t)},useCache:function(e){r=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,i,o,s,l){t.sharedData={record:{},disableFunctions:{},dataEventFunctions:{},modelControllers:[]};var c={master:{},fngInvalidRequired:"fng-invalid-required",allowLocationChange:!0};t.errorVisible=!1,angular.extend(t,o.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")})}i.loadControllerAndMenu(t.sharedData,d,0,!1,t.$new()),t.formName&&i.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","FormGeneratorService","RecordHandlerService"],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.search({}).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(u){var e;function t(a,e,o,r,t,n,i){var s;function l(){o.items=[],o.contextMenu=void 0,o.contextMenuId=void 0,o.contextMenuHidden=void 0,o.contextMenuDisabled=void 0}function c(e){o.contextMenu=e;var t="".concat(_.camelCase(e),"ContextMenu");o.contextMenuId=void 0,i.doSecurityWhenReady(function(){o.contextMenuId=t,o.contextMenuHidden=i.isSecurelyHidden(o.contextMenuId),o.contextMenuDisabled=i.isSecurelyDisabled(o.contextMenuId)})}a.navScope=o,l(),o.toggleCollapsed=function(){o.collapsed=!o.collapsed},o.isCollapsed=!0,o.showShortcuts=!1,o.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"}],null!==(s=u.formsAngular.keyboardShortCuts)&&void 0!==s&&s.forEach(function(e){o.shortcuts.push({key:"Ctrl+Shift+"+e.letter,act:e.desc})}),o.markupShortcut=function(e){return'<span class="key">'+e.split("+").join('</span> + <span class="key">')+"</span>"},o.globalShortcuts=function(n){function t(e){var t=document.getElementById(e);t&&(t.disabled||setTimeout(function(){t.click()}),n.preventDefault())}var e,r,a=n.ctrlKey&&n.shiftKey&&!n.altKey&&!n.metaKey;if(191===n.keyCode&&(!("INPUT"==(r=(e=n).target.tagName)||"SELECT"==r||"TEXTAREA"==r||"DIV"==r&&e.target.classList.contains("ck-editor__editable"))||n.ctrlKey&&!n.altKey&&!n.metaKey))if(n.ctrlKey||!n.shiftKey){var i=document.getElementById("searchinput");i&&(i.focus(),n.preventDefault())}else o.showShortcuts=!0;else 27===n.keyCode&&(a||o.showShortcuts)?a?t("cancelButton"):o.showShortcuts=!1:a&&(83===n.keyCode?t("saveButton"):45===n.keyCode?t("newButton"):88===n.keyCode?t("deleteButton"):u.formsAngular.keyboardShortCuts&&u.formsAngular.keyboardShortCuts.forEach(function(e){n.keyCode===e.keycode&&t(e.id)}))},o.css=function(e,t){return"function"==typeof n[e]?n[e](t):"error text-error"},o.$on("fngControllersLoaded",function(e,t,n){c(t.dropDownDisplay||t.modelNameDisplay||r("titleCase")(n,!1)),t.dropDownDisplayPromise&&t.dropDownDisplayPromise.then(function(e){c(e)})}),o.$on("fngControllersUnloaded",function(e){l()}),o.doClick=function(e,t){var n=angular.element(t.target),r=o.items[e];if(r.divider||n.parent().hasClass("disabled"))t.preventDefault();else if(r.broadcast)a.$broadcast.apply(a,__spreadArray([r.broadcast],r.args||[],!1));else if("function"==typeof r.fn)r.fn.apply(r,r.args||[]);else if(r.fn)throw new Error("Incorrect menu setup")},o.isHidden=function(e){function t(e){return!!e.isHidden&&e.isHidden()}var n=!1,r=o.items[e];if(r.divider)if(0===e)n=!0;else for(var a=!1,i=e-1;0<=i&&!n&&!a;)o.items[i].divider?n=!0:t(o.items[i])?--i:a=!0;return n||t(r)},o.isDisabled=function(e){return!!o.items[e].isDisabled&&o.items[e].isDisabled()},o.buildUrl=function(e){return t.buildUrl(e)},o.dropdownClass=function(e){var t="";return o.items[e].divider?t="divider":o.isDisabled(e)&&(t="disabled"),t};var d=e.document.title;o.$on("$routeChangeSuccess",function(){e.document.title=d})}e=u.controllers||(u.controllers={}),t.$inject=["$rootScope","$window","$scope","$filter","RoutingService","CssFrameworkService","SecurityService"],e.NavCtrl=t}(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("FormGeneratorService",e.services.FormGeneratorService).factory("FormMarkupHelperService",e.services.FormMarkupHelperService).factory("InputSizeHelperService",e.services.InputSizeHelperService).factory("PluginHelperService",e.services.PluginHelperService).factory("RecordHandlerService",e.services.RecordHandlerService).factory("SchemasService",e.services.SchemasService).factory("SubmissionsService",e.services.SubmissionsService).factory("SecurityService",e.services.SecurityService)}(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 ng-hide="!showLoading" class="loading">Loading&#8230;</div>\n <div class="container-fluid page-header report-header">\n <div class="header-lhs">\n <h1>{{ titleWithSubstitutions }}</h1>\n </div>\n <div class="header-rhs">\n <form-input schema="paramSchema" name="paramForm" ng-show="paramSchema" formstyle="horizontalCompact"></form-input>\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 <div ng-hide="phase == \'ready\' && !showLoading" class="loading">Loading&#8230;</div>\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-hide="!showLoading" class="loading">Loading&#8230;</div>\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-hide="!showLoading" class="loading">Loading&#8230;</div>\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-hide="phase == \'ready\' && !spinning" class="loading">Loading&#8230;</div>\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:500}" 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:500}" 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')}]);
@@ -2,6 +2,7 @@ declare module fng {
2
2
  export interface IFng extends angular.IModule {
3
3
  beforeProcess?: (scope: IFormScope, cb: (err?: Error) => void) => void;
4
4
  beforeHandleIncomingDataPromises?: () => angular.IPromise<any>[];
5
+ pseudo?: (token: string, upperFirst: boolean) => string;
5
6
  title?: { prefix?: string; suffix?: string };
6
7
  // when provided, the named function (assumed to be present on $rootscope) will be used to determine the visibility
7
8
  // of menu items and control groups
@@ -307,7 +308,7 @@ declare module fng {
307
308
  anything else will be used as a paragraph stype
308
309
  */
309
310
  titleTagOrClass?: string;
310
- content: IFormInstruction[];
311
+ content: IFormSchemaElement[];
311
312
  }
312
313
 
313
314
  export type IFormSchemaElement = IFormInstruction | IContainer;
@@ -652,7 +653,8 @@ declare module fng {
652
653
  interface IPluginHelperService {
653
654
  extractFromAttr: (
654
655
  attr: any,
655
- directiveName: string
656
+ directiveName: string,
657
+ scope: fng.IFormScope
656
658
  ) => { info: IFormInstruction; options: IFormOptions; directiveOptions: any };
657
659
  buildInputMarkup: (
658
660
  scope: angular.IScope,
@@ -690,7 +692,7 @@ declare module fng {
690
692
  processedAttrs: IProcessedAttrs,
691
693
  idSuffix: string
692
694
  ) => string;
693
- handlePseudos: (str: string) => string;
695
+ handlePseudos: (scope: fng.IFormScope, str: string) => string;
694
696
  genDisableableAncestorStr: (processedAttrs: IProcessedAttrs) => string;
695
697
  }
696
698
 
@@ -821,7 +823,8 @@ declare module fng {
821
823
  handleReadOnlyDisabled: (partialFieldInfo: { name: string, id?: string, nonUniqueId?: string, readonly?: boolean | string }, scope: fng.IFormScope) => string[];
822
824
  generateArrayElementIdString: (idString: string, info: fng.IFormInstruction, options: fng.IFormOptions) => string;
823
825
  genDisableableAncestorStr: (id: string) => string;
824
- generateNgShow(showWhen: IFngShowWhen, model: string): string;
826
+ generateNgShow: (showWhen: IFngShowWhen, model: string) => string;
827
+ handlePseudos: (scope: fng.IFormScope, str: string, dynamicFuncName?: string) => string;
825
828
  }
826
829
  }
827
830
 
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.260",
6
+ "version": "0.12.0-beta.261",
7
7
  "engines": {
8
8
  "node": ">=8.x",
9
9
  "npm": ">=5.x"