forms-angular 0.12.0-beta.260 → 0.12.0-beta.262
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
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
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
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
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
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
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
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
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
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
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
|
-
|
|
1209
|
-
|
|
1210
|
-
var
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
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
|
-
|
|
1276
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3202
|
-
|
|
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(/"/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
|
-
|
|
3330
|
-
|
|
3331
|
-
|
|
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:
|
|
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:
|
|
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> ")+' <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,""")+'"');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,"""),'"'):l+="".concat(JSON.stringify(i[h][g]).replace(/"/g,"""),'"'));break;default:i[h]&&("string"==typeof i[h]?l+=" fng-fld-"+h+'="'+i[h].replace(/"/g,""")+'"':l+=" fng-fld-"+h+'="'+JSON.stringify(i[h]).replace(/"/g,""")+'"')}for(h in n)n.hasOwnProperty(h)&&"$"!==h[0]&&void 0!==n[h]&&(l+=" fng-opt-"+h+'="'+n[h].toString().replace(/"/g,""")+'"');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(/"/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…</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…</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…</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…</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…</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> ")+' <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,""")+'"');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,"""),'"'):l+="".concat(JSON.stringify(i[h][g]).replace(/"/g,"""),'"'));break;default:i[h]&&("string"==typeof i[h]?l+=" fng-fld-"+h+'="'+i[h].replace(/"/g,""")+'"':l+=" fng-fld-"+h+'="'+JSON.stringify(i[h]).replace(/"/g,""")+'"')}for(h in n)n.hasOwnProperty(h)&&"$"!==h[0]&&void 0!==n[h]&&(l+=" fng-opt-"+h+'="'+n[h].toString().replace(/"/g,""")+'"');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(/"/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…</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…</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…</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…</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…</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')}]);
|
package/dist/client/index.d.ts
CHANGED
|
@@ -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:
|
|
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)
|
|
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.
|
|
6
|
+
"version": "0.12.0-beta.262",
|
|
7
7
|
"engines": {
|
|
8
8
|
"node": ">=8.x",
|
|
9
9
|
"npm": ">=5.x"
|