';
+ break;
case 'select':
var ngOptions = 'key as (value | translate) for (key, value) in display.options';
if (scope.property.display.options instanceof Array) {
diff --git a/client/common/directives/ModelFieldStatusMultiSelect/ModelFieldStatusMultiSelect.js b/client/common/directives/ModelFieldStatusMultiSelect/ModelFieldStatusMultiSelect.js
new file mode 100644
index 00000000..46a941cb
--- /dev/null
+++ b/client/common/directives/ModelFieldStatusMultiSelect/ModelFieldStatusMultiSelect.js
@@ -0,0 +1,186 @@
+angular.module('dashboard.directives.ModelFieldStatusMultiSelect', [])
+
+.directive('modelFieldStatusMultiSelect', function($compile, $timeout, GeneralModelService) {
+ "ngInject";
+
+ function getTemplate() {
+ var template =
+ '
'+
+ '' +
+ '' +
+ '
' +
+ '
' +
+ '' +
+ '' +
+ '
';
+ return template;
+ }
+
+ return {
+ restrict: 'E',
+ require: "ngModel",
+ scope: {
+ key: '=key',
+ property: '=property',
+ options: '=options',
+ data: '=ngModel',
+ modelData: '=modelData',
+ disabled: '=ngDisabled',
+ ngBlur: '&',
+ },
+ link: function(scope, element, attrs, ngModel) {
+
+ var property = scope.property;
+ var hasDataChanged;
+
+ String.prototype.replaceAt=function(index, replacement) {
+ return this.substr(0, index) + replacement+ this.substr(index + replacement.length);
+ }
+
+ function init() {
+ scope.multiSelectOptions = [];
+ scope.selected = [];
+ if (!property) property = {};
+ if (!property.display) property.display = {};
+ initData();
+
+ //Handle translating multi-select checks to scope.data output format
+ scope.clickMultiSelectCheckbox = clickMultiSelectCheckbox;
+ scope.selectAllChange = selectAllChange;
+
+ const apiPath = scope.options && scope.options.api ? scope.options.api : '';
+ var params = {};
+ GeneralModelService.list(apiPath, params, {preventCancel: true}).then(function(response){
+ if (!response) return;
+ for(var i=0; i 0) scope.data = output;
+ })
+ }
+ scope.$on('removeModelFieldMultiSelect', function($event, key) {
+ if (key !== scope.key) return;
+ $timeout(function() {
+ initData();
+ }, 1)
+ })
+ })
+ }
+
+ /**
+ * convert unum formatted string to a readable format
+ * @param {String} string
+ */
+ function makeReadable(string) {
+ for (var i=0; i 0 && string[i-1] === '_') {
+ string = string.replaceAt(i, string[i].toUpperCase());
+ string = string.replaceAt(i-1, ' ');
+ }
+ }
+ if (string.indexOf('Mrf') > -1) {
+ string = string.replace('Mrf', 'MRF');
+ }
+ return string;
+ }
+
+ /**
+ * Initial data load by checking desired output as comma, array, or object
+ */
+ function initData() {
+ if (typeof property.display.output === 'undefined') {
+ var options = scope.options || property.display.options;
+ property.display.output = options instanceof Array ? "comma" : "object";
+ }
+ }
+
+ function clickMultiSelectCheckbox(index, selectedOption) {
+ hasDataChanged = true;
+ var output = property.display.output === 'array' ? [] : property.display.output === 'object' ? {} : '';
+
+ if (scope.selected.indexOf(false) > -1) {
+ scope.selectAll = false;
+ }
+ else if (Object.values(scope.selected).length === scope.multiSelectOptions.length) {
+ scope.selectAll = true;
+ }
+
+ for (var i in scope.selected) {
+ if (scope.selected[i]) {
+ var option = scope.multiSelectOptions[i];
+ switch (property.display.output) {
+ case 'object':
+ output[option.key] = option.value;
+ break;
+ case 'comma':
+ output += '"' + option.key + '",'; //quote qualified
+ break;
+ case 'array':
+ output.push(selectedOption.item || selectedOption.key); // return array
+ break;
+ }
+
+ }
+ }
+
+ if (property.display.output === 'comma' && output.length > 0) output = output.substring(0, output.length-1); //remove last comma
+
+ scope.data = output;
+
+ // asynchronous behavior because moving data up chain
+ setTimeout(function() {
+ if (scope.ngBlur && hasDataChanged) {
+ scope.ngBlur({key: scope.key})
+ }
+ hasDataChanged = false
+ // this may cause a non optimal user experience, but reducing ability to bypass the check
+ }, 1);
+
+ if (scope.selected.indexOf(true) < 0) {
+ delete scope.data;
+ }
+
+ // Note: breaking changes on onModelFieldMultiSelectCheckboxClick emit below after Angular 1.6.4 upgrade
+ // due to ModelFieldMultiSelect rewrite
+ //scope.$emit('onModelFieldMultiSelectCheckboxClick', scope.key, selectedOption, selected);
+ }
+
+ function selectAllChange(selectAll) {
+ var output = {};
+ if (selectAll) {
+ for (var i=0; i"}).state("public.accessDenied",{url:"/access-denied",template:'
Access Denied
You are not authorized to access this page.
',data:{pageTitle:"Access Denied"}}),c.deferIntercept()}]).run(["$ocLazyLoad","$rootScope","$urlRouter","$injector","$translate","Config",function(a,b,c,d,e,f){"ngInject";f.serverParams.defaultLanguage&&e.use(f.serverParams.defaultLanguage),f.serverParams.translateUrl&&e.refresh();var g=!1;f.serverParams.customModules?a.load(f.serverParams.customModules).then(function(){g=!0,b.$broadcast("modulesLoaded"),Array.isArray(f.serverParams.injectOnStart)&&f.serverParams.injectOnStart.forEach(d.get)},function(a){console.log(a)}):g=!0,b.$on("$locationChangeSuccess",function(a){if(g)c.sync();else var d=b.$on("modulesLoaded",function(){c.sync(),d()})})}]).constant("constants",{TIMEOUT_INTERVAL:5e3,PUBLIC_STATE:"public",LOGIN_STATE:"public.login"}).controller("AppCtrl",["$scope","$location","$state","$rootScope","$timeout","$document","$cookies","SessionService","CacheService","Config","constants",function(a,b,c,d,e,f,g,h,i,j,k){"ngInject";d.$state=c,j.serverParams.gaTrackingId&&ga("create",j.serverParams.gaTrackingId,"auto"),d.$on("$stateChangeStart",function(a,b,d,e,f){var g=b.name;if(g=g.substr(g,g.indexOf(".")),!h.getAuthToken()&&g!=k.PUBLIC_STATE){var l={state:b,params:d};return i.set("desiredState",l),j.serverParams.loginState?c.go(j.serverParams.loginState):g!=k.PUBLIC_STATE&&c.go(k.LOGIN_STATE),void a.preventDefault()}h.isAuthorized(b,d)||(c.go("public.accessDenied"),a.preventDefault())}),a.$on("$stateChangeSuccess",function(b,c,d,e,f){angular.isDefined(c.data.pageTitle)&&(a.pageTitle=c.data.pageTitle)}),d.logOut=function(){h.getAuthToken()&&(i.reset(),h.logOut().then(function(a){j.serverParams.loginState?c.go(j.serverParams.loginState):c.go(k.LOGIN_STATE)}).catch(function(a){c.go(k.LOGIN_STATE)}))};var l=new Date;d.persistSession=function(){e.cancel(d.persistId),c.current.name.indexOf(k.PUBLIC_STATE)>-1||(l=new Date,new Date-l>k.TIMEOUT_INTERVAL?d.checkTimeout()&&g.put("lastActive",new Date):d.persistId=e(function(){d.checkTimeout()&&g.put("lastActive",new Date)},k.TIMEOUT_INTERVAL))},d.checkTimeout=function(){if(e.cancel(d.timeoutId),!g.get("lastActive"))return console.error("Session Timedout on another window/tab"),c.go(k.LOGIN_STATE),!1;var a=new Date(g.get("lastActive"));return new Date-a>j.serverParams.sessionTimeout?(d.logOut(),!1):(d.timeoutId=e(d.checkTimeout,k.TIMEOUT_INTERVAL),!0)},j.serverParams.sessionTimeout&&"localhost"!=b.host()&&(f.on("mousemove",function(){d.persistSession()}),f.on("touchmove",function(){d.persistSession()}),f.on("keydown",function(){d.persistSession()}))}]),angular.module("dashboard.Alert",["ui.bootstrap","ui.bootstrap.modal"]).controller("AlertCtrl",["$scope","$uibModalInstance",function(a,b){"ngInject";a.closeAlert=function(){b.close()},a.okAlert=function(){"function"==typeof a.okHandler&&a.okHandler(),b.close()},a.cancelAlert=function(){"function"==typeof a.cancelHandler&&a.cancelHandler(),b.close()},function(){a.isConfirm="confirm"==a.alertType}()}]),angular.module("dashboard.Dashboard",["dashboard.Config","dashboard.Profile","dashboard.Dashboard.Model","dashboard.services.Dashboard","ui.router"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard",{url:"/dashboard",controller:"DashboardCtrl",templateUrl:"app/dashboard/Dashboard.html",data:{pageTitle:"Dashboard"}}).state("portal",{url:"/portal",controller:"DashboardCtrl",templateUrl:"app/dashboard/Dashboard.html",data:{pageTitle:"Dashboard"}})}]).controller("DashboardCtrl",["$scope","$rootScope","$state","$stateParams","$location","$cookies","$uibModal","Config","DashboardService",function(a,b,c,d,e,f,g,h,i){"ngInject";var j=this;this.init=function(){a.toggleSideMenu=j.toggleSideMenu,a.hideSideMenu=j.hideSideMenu,a.editProfile=j.editProfile,a.logout=j.logout,a.locationPath=e.path(),a.username=f.get("username"),a.email=f.get("email"),a.userId=f.get("userId");try{a.userInfo=JSON.parse(f.get("session")),a.userInfo.user.roles=JSON.parse(f.get("roles"))}catch(a){console.error("Unable to parse $cookies.get(session)",a)}if(a.title=h.serverParams.title||"Content Management System",a.nav=i.getNavigation(),"dashboard"==c.current.name&&h.serverParams.defaultNav){var b=i.getDefaultNav(a.nav,angular.copy(h.serverParams.defaultNav));b.state?c.go(b.state,b.params):c.go("dashboard.model.action."+b.route,b.params)}a.$watch(function(){return e.path()},function(){a.locationPath=e.path()}),a.$on("modelEditSaved",function(){a.modalInstance&&a.modalInstance.close()})},this.toggleSideMenu=function(){var a=$(".dashboard");a.hasClass("show-side-menu")?a.removeClass("show-side-menu"):a.addClass("show-side-menu")},this.hideSideMenu=function(){$(".dashboard").removeClass("show-side-menu")},this.editProfile=function(b){b&&b.preventDefault(),a.action={options:{model:h.serverParams.profileModel,key:h.serverParams.profileKey,id:f.get("userId"),hideDelete:!0}},a.modalInstance=g.open({templateUrl:"app/dashboard/profile/Profile.html",controller:"ProfileCtrl",size:"lg",scope:a})},this.logout=function(a){b.logOut(),a&&a.preventDefault()},j.init()}]),angular.module("dashboard.Dashboard.Model",["dashboard.Dashboard.Model.Action","ui.router"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard.model",{url:"/:model",controller:"DashboardModelCtrl",templateUrl:"app/dashboard/model/DashboardModel.html",data:{pageTitle:"Dashboard"}})}]).controller("DashboardModelCtrl",["$rootScope","$scope","$stateParams","Config",function(a,b,c,d){"ngInject";!function(){b.section=angular.copy(_.find(b.nav,{path:c.model}))}()}]),angular.module("dashboard.Dashboard.Model.Action",["dashboard.Dashboard.Model.Edit","dashboard.Dashboard.Model.List","dashboard.Dashboard.Model.Sort","dashboard.Dashboard.Model.View","dashboard.Dashboard.Model.Nav","dashboard.Dashboard.Model.Definition","ui.router"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard.model.action",{url:"/:action",controller:"DashboardModelActionCtrl",templateUrl:"app/dashboard/model/DashboardModelAction.html",data:{pageTitle:"Dashboard"}})}]).controller("DashboardModelActionCtrl",["$scope","$stateParams",function(a,b){"ngInject";!function(){a.section&&a.section.subnav&&(a.action=angular.copy(_.find(a.section.subnav,{label:b.action})))}()}]),angular.module("dashboard.Dashboard.Model.Definition",["dashboard.Config","dashboard.services.Settings","ui.router","ui.bootstrap.modal"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard.model.action.definition",{url:"/definition",templateUrl:"app/dashboard/model/definition/ModelDefinition.html",data:{pageTitle:"Settings - Model Definitions"}})}]).controller("ModelDefinitionCtrl",["$scope","$timeout","$state","$location","$uibModal","Config","SettingsService",function(a,b,c,d,e,f,g){"ngInject";a.clickSave=function(){}}]),angular.module("dashboard.Dashboard.Model.Edit",["dashboard.Dashboard.Model.Edit.SaveDialog","dashboard.Config","dashboard.directives.ModelField","dashboard.services.Cache","dashboard.services.GeneralModel","dashboard.services.FileUpload","dashboard.filters.locale","ui.router","ui.bootstrap","ui.bootstrap.datepicker","ui.bootstrap.modal","ngCookies"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard.model.action.edit",{url:"/edit/:id",templateUrl:"app/dashboard/model/edit/ModelEdit.html",data:{pageTitle:"Edit"}})}]).constant("modelEditConstants",{keys:{save:"button.save",delete:"button.delete",confirmMessage:"button.delete.confirm"},defaults:{save:"Save",delete:"Delete",confirmMessage:"Are you sure you want to delete this record?"}}).controller("ModelEditCtrl",["$rootScope","$scope","$cookies","$location","$stateParams","$state","$window","$uibModal","$filter","Config","GeneralModelService","FileUploadService","CacheService","modelEditConstants","$translate",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){"ngInject";function p(){if(b.modelDisplay=b.model.display,b.action.options.display&&(b.modelDisplay=b.model[b.action.options.display]),!b.modelDisplay||0==b.modelDisplay.length){b.modelDisplay=[];var a=Object.keys(b.model.properties);for(var c in a){var d=a[c];b.modelDisplay.push(d),b.data[d]||(b.data[d]=null)}}b.$emit("onModelLoad",{data:b.data})}function q(c){var d=b.data[b.action.options.key];k.saveWithFiles(b.model.name,d,b.data).then(function(b){t&&t.close(),a.$broadcast("modelEditSaved"),c&&c(b)},r,s)}function r(b){if(a.$broadcast("modelEditSaveFailed",{error:b}),_.isPlainObject(b))if("string"==typeof b.translate&&b.translate.length>0){var c=o.instant(b.translate);c===b.translate&&(c=b.message),alert(c)}else b.code||b.message?("ER_DUP_ENTRY"===b.code&&(b.message="There was a duplicate entry found. Please make sure the entry is unique."),alert(b.message)):b.error?r(b.error):alert(angular.toJson(b));else alert(b);t&&t.close()}function s(a){if(_.isPlainObject(a)){if(a.translate){var c=o.instant(a.translate,a.params);b.status=c===a.translate?a.message:c}else a.message&&(b.status=a.message);a.progress&&(b.progress=a.progress)}}var t=null;b.clickSaveModel=function(a){s({message:"Saving",translate:"cms.status.saving",progress:0}),t=h.open({templateUrl:"app/dashboard/model/edit/ModelEditSaveDialog.html",controller:"ModelEditSaveDialogCtrl",scope:b}),q(function(a){m.clear(b.action.options.model),b.action.options&&b.action.options.returnAfterEdit?g.history.back():b.section?f.go(b.section.state?b.section.state:"dashboard.model.action.edit",{model:b.section.path,action:b.action.label,id:a[b.action.options.key]}):t&&t.close()})},b.clickDeleteModel=function(c,d){if(b.deleteDialogText=d&&d.deleteDialogText?d.deleteDialogText:b.deleteDialogText,confirm(b.deleteDialogText)){var e=c[b.action.options.key];b.model.options&&b.model.options.softDeleteProperty?(b.data[b.model.options.softDeleteProperty]=!0,q(function(){m.clear(b.action.options.model),g.history.back()})):k.remove(b.model.plural,e).then(function(c){a.$broadcast("modelDeleted"),m.clear(b.action.options.model),g.history.back()},function(a){"object"==typeof a&&a.message?alert(a.message):"object"==typeof a&&a.error&&a.error.message?alert(a.error.message):"object"==typeof a?alert(JSON.stringify(a)):alert(a)})}},b.hasPermission=function(a){var d=null;if("object"==typeof a)d=a;else{var e=b.model.properties[a];d=e.display}if(!d)return!0;if(d.askIf){var f=Object.keys(d.askIf);for(var g in f){var e=f[g];if(b.data[e]!=d.askIf[e])return!1}}if(!d.roles)return!0;if(!c.get("roles"))return!1;var h=JSON.parse(c.get("roles"));for(var g in h){var i=h[g];if(d.roles.indexOf(i.name)>-1)return!0}return!1},function(){if(b.hideSideMenu(),g.ga&&g.ga("send","pageview",{page:d.path()}),b.action||(b.action={}),b.action.options||(b.action.options={model:e.model,key:e.key}),b.model=angular.copy(j.serverParams.models[b.action.options.model]),b.action.options.key){var a=b.action.options.key;b.model.properties[a].display||(b.model.properties[a].display={}),b.model.properties[a].display.readonly=!0}var c=o.use();if(b.locale=i("iso-639-1")(c),_.forEach(b.model.properties,function(a){if(a.display||(a.display={}),a.display.options||(a.display.options={}),b.action.options.readonly&&(a.display.readonly=!0),"string"==typeof a.type)switch(a.type.toLowerCase()){case"date":case"datetime":a.display.options.locale=b.locale}}),b.isLoading=!0,b.data={},b.action.options.data){var f=Object.keys(b.action.options.data);for(var h in f){var a=f[h];b.data[a]=b.action.options.data[a]}}k.checkDefaultValues(b.model,b.data);var l=null;e.id&&e.id>0&&(l=e.id),b.action.options.id&&b.action.options.id>0&&(l=b.action.options.id),l?(b.isEdit=!0,b.modelDisplay=null,k.get(b.model.plural,l).then(function(a){a&&(b.data=a,p(),b.isLoading=!1)})):(p(),b.isEdit=!1,b.isLoading=!1),o([n.keys.save,n.keys.delete,n.keys.confirmMessage]).then(function(a){b.saveButtonText=a[n.keys.save]==n.keys.save?n.defaults.save:a[n.keys.save],b.deleteButtonText=a[n.keys.delete]==n.keys.delete?n.defaults.delete:a[n.keys.delete],b.deleteDialogText=a[n.keys.confirmMessage]==n.keys.confirmMessage?n.defaults.confirmMessage:a[n.keys.confirmMessage]},function(a){b.saveButtonText=n.defaults.save,b.deleteButtonText=n.defaults.delete,b.deleteDialogText=n.defaults.confirmMessage}),b.$on("saveModel",function(){b.clickSaveModel(b.data)}),b.$on("deleteModel",function(a,c){b.clickDeleteModel(b.data,c)}),b.$on("onModelSave",function(){b.clickSaveModel(b.data)}),b.$on("onModelDelete",function(a,c){b.clickDeleteModel(b.data,c)}),b.$watchCollection("data",function(a,c){b.isLoading||b.$emit("onModelChange",a,c)}),b.$on("onModelFieldReferenceChange",function(a,c,d,e){b.data.hasOwnProperty(c)&&_.isEqual(d,e)||(b.data[c]=d)})}()}]),angular.module("dashboard.Dashboard.Model.Edit.SaveDialog",["ui.bootstrap","ui.bootstrap.progressbar","ui.bootstrap.modal"]).controller("ModelEditSaveDialogCtrl",["$scope","$translate",function(a,b){"ngInject";!function(){a.statusLabel="Status",b("cms.status").then(function(b){"string"==typeof b&&b.length>0&&"cms.status"!==b&&(a.statusLabel=b)},function(a){console.log("Failed to translate cms.status",a)})}()}]),angular.module("dashboard.Dashboard.Model.List",["dashboard.Dashboard.Model.Edit.SaveDialog","dashboard.Config","dashboard.services.Cache","dashboard.services.GeneralModel","dashboard.directives.ModelFieldReference","ui.router","ngCookies","ngGrid","googlechart"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard.model.action.list",{url:"/list",templateUrl:"app/dashboard/model/list/ModelList.html",data:{pageTitle:"List"}})}]).controller("ModelListCtrl",["$scope","$cookies","$timeout","$state","$location","$window","$uibModal","Config","GeneralModelService","CacheService",function ModelListCtrl($scope,$cookies,$timeout,$state,$location,$window,$uibModal,Config,GeneralModelService,CacheService){"ngInject";function init(){if($scope.isLoading=!0,$scope.moment=moment,$scope.columnCount=0,$scope.list=[],$scope.selected=[],$scope.columns=[],$scope.listTemplateUrl="",$scope.totalServerItems=0,$scope.isEditing=!1,$scope.searchFields=$scope.action.options.searchFields,$scope.action.options.sort?$scope.sortInfo=$scope.action.options.sort:$scope.sortInfo={fields:[$scope.action.options.key],directions:["ASC"]},$scope.filterOptions={filterText:"",useExternalFilter:"boolean"==typeof $scope.action.options.useExternalFilter&&$scope.action.options.useExternalFilter},$scope.pagingOptions={pageSizes:["25","50","100","250","500"],pageSize:$scope.action.options.pageSize?$scope.action.options.pageSize:"25",currentPage:1},$scope.action.options.pageSize){var a=$scope.action.options.pageSize.toString(),b=$scope.pagingOptions.pageSizes.indexOf(a);$scope.pagingOptions.pageSizes=$scope.pagingOptions.pageSizes.slice(0,b+1)}$scope.sortInfo||($scope.sortInfo={}),$scope.sortInfo.columns||($scope.sortInfo.columns=[]),$scope.gridOptions={data:"list",enableColumnResize:!0,enableRowSelection:"boolean"!=typeof $scope.action.options.enableRowSelection||$scope.action.options.enableRowSelection,multiSelect:!1,enablePaging:!0,useExternalSorting:!0,showSelectionCheckbox:!1,sortInfo:$scope.sortInfo,showFooter:!0,showFilter:$scope.action.options.showFilter,headerRowHeight:44,footerRowHeight:44,totalServerItems:"totalServerItems",pagingOptions:$scope.pagingOptions,filterOptions:$scope.filterOptions,selectedItems:$scope.selected,rowHeight:$scope.action.options.rowHeight?$scope.action.options.rowHeight:44},$scope.hideSideMenu(),$window.ga&&$window.ga("send","pageview",{page:$location.path()}),$scope.$on("updateColumnVisibility",function(a,b,c){updateColumnVisibility(b,c)}),$scope.gridContainerTopMargin=0,$scope.action.options.chart&&($scope.gridContainerTopMarginMax=$scope.action.options.chart.height+60,$scope.gridContainerTopMargin=$scope.gridContainerTopMarginMax,processChart()),window.ngGrid.i18n.en.ngTotalItemsLabel="Total Records: ",window.ngGrid.i18n.en.ngPageSizeLabel="Show: ",$scope.columns=getColumnDefinition(),$scope.gridOptions.columnDefs="columns",$scope.action.options.editable&&($scope.gridOptions.enableCellEdit=!0,$scope.gridOptions.enableCellEditOnFocus=!1,$scope.gridOptions.enableCellSelection=!0,$scope.gridOptions.enableRowSelection=!1),$scope.action.options.params||($scope.action.options.params={}),$scope.action.options.model&&($scope.model=Config.serverParams.models[$scope.action.options.model]),$scope.action.options.api?$scope.apiPath=$scope.action.options.api:$scope.action.options.model&&($scope.apiPath=$scope.model.plural),$scope.origApiPath=$scope.apiPath,addQueryStringParams(),$scope.getTotalServerItems(),$timeout(function(){$(".ngFooterPanel select").addClass("form-control"),$(".ngFooterPanel button").addClass("btn btn-default")}),$scope.$grid=$(".grid"),angular.element($window).bind("resize",function(){processWindowSize()}),$scope.$on("ngGridEventStartCellEdit",function(){startEdit()}),$scope.$on("ModelListLoadItems",function(a,b){b&&b.resetPaging&&($scope.pagingOptions.currentPage=1),$scope.getTotalServerItems()}),(/(iPad|iPhone|iPod|Android)/g.test(navigator.userAgent)||$scope.action.options.flexibleHeight)&&($scope.gridOptions.plugins=[new ngGridFlexibleHeightPlugin]),$scope.action.options.allowCSVExport&&($scope.gridOptions.plugins||($scope.gridOptions.plugins=[]),$scope.gridOptions.plugins.push(new ngGridCsvExportPlugin)),Config.serverParams.strings&&($scope.cancelButtonText=Config.serverParams.strings.cancelButton,$scope.saveButtonText=Config.serverParams.strings.saveButton),$scope.$on("RemoveSelectedItems",function(){removeSelectedItems()})}function updateColumnVisibility(a,b){var c=_.findIndex($scope.columns,{field:a});c>=0&&($scope.columns[c].visible=b)}function removeSelectedItems(){for(var a in selectedItems)selectedItems[a].isChecked=!1;selectedItems=[],$scope.action.selectAll=!1,$scope.$emit("SelectedModelList",{list:selectedItems})}function getColumnDefinition(){var a=$scope.action.options.columnRef,b=$scope.action.options.columns;if(a&&"object"==typeof a&&a.label)if(a.path){var c=_.find(Config.serverParams.nav,{path:a.path}),d=_.find(c.subnav,{label:a.label});b=d.options.columns}else{var d=_.find($scope.section.subnav,{label:a.label});b=d.options.columns}if((b=angular.copy(b))&&$cookies.get("roles")){var e=JSON.parse($cookies.get("roles"));if(e)for(var f=0;f-1){h=!0;break}}h||(b.splice(f,1),f--)}}}return b}function processWindowSize(){var a=$scope.$grid,b=$window.innerWidth,c=b/$scope.columnCount;c<90&&!a.hasClass("hide-optional")?(a.addClass("hide-optional"),$scope.columns=$scope.columns.filter(function(a){return!a.optional})):c>=90&&a.hasClass("hide-optional")&&(a.removeClass("hide-optional"),$scope.columns=$scope.columns=getColumnDefinition())}function addQueryStringParams(){var queryStringParams=$location.search();$scope.queryStringParams=queryStringParams,$scope.apiPath=$scope.origApiPath;var keys=Object.keys(queryStringParams);for(var i in keys){var key=keys[i];$scope.action.options.params[key]=queryStringParams[key],$scope.apiPath&&($scope.apiPath=$scope.apiPath.replace("{"+key+"}",queryStringParams[key]))}try{for(var session=JSON.parse($cookies.get("session")),searchString="{session.",startPos=$scope.apiPath.indexOf(searchString);startPos>-1;){var endPos=$scope.apiPath.indexOf("}",startPos);if(-1==endPos){console.error("ModelList session parsing malformed for $scope.apiPath");break}var sessionKey=$scope.apiPath.substring(startPos+1,endPos);$scope.apiPath=$scope.apiPath.slice(0,startPos)+eval(sessionKey)+$scope.apiPath.slice(endPos+1),startPos=$scope.apiPath.indexOf(searchString)}}catch(a){console.error(a)}var filterDescription=queryStringParams.filterDescription;if($scope.filterDescription=filterDescription||$scope.action.label,queryStringParams.pageSize?$scope.pagingOptions.pageSize=queryStringParams.pageSize:$scope.action.options.pageSize&&($scope.pagingOptions.pageSize=$scope.action.options.pageSize.toString()),queryStringParams.currentPage&&($scope.pagingOptions.currentPage=parseInt(queryStringParams.currentPage)),queryStringParams.sortInfo)try{var sortInfo=JSON.parse(queryStringParams.sortInfo);_.extend($scope.sortInfo,sortInfo)}catch(a){console.warn("There are errors with the querystring param 'pagingOptions'")}queryStringParams.search&&($scope.filterOptions.filterText=queryStringParams.search)}function setupPagination(){var a=angular.copy($scope.action.options.params);if(a&&a.filter&&a.filter.length>0)try{var b=JSON.parse(a.filter);if(b.limit=parseInt($scope.pagingOptions.pageSize),b.skip=($scope.pagingOptions.currentPage-1)*parseInt($scope.pagingOptions.pageSize),$scope.sortInfo.fields.length>0){b.order="";for(var c in $scope.sortInfo.fields){var d=$scope.sortInfo.fields[c],e=$scope.sortInfo.directions[c];e||(e="ASC"),parseInt(c)>0&&(b.order+=", "),b.order+=d+" "+e}}a.filter=JSON.stringify(b)}catch(a){console.error(a),alert("Error with list filter. Please contact administrator for assistance.")}else{if(a=_.extend(a,{"filter[limit]":parseInt($scope.pagingOptions.pageSize),"filter[skip]":($scope.pagingOptions.currentPage-1)*parseInt($scope.pagingOptions.pageSize)}),$scope.sortInfo.fields.length>0){var f="";for(var c in $scope.sortInfo.fields){var d=$scope.sortInfo.fields[c],e=$scope.sortInfo.directions[c];e||(e="ASC"),parseInt(c)>0&&(f+=", "),f+=d+" "+e}a=_.extend(a,{"filter[order]":f})}if($scope.searchFields&&$scope.gridOptions.filterOptions.filterText){a=GeneralModelService.queryStringParamsToJSON(a);var g=$scope.gridOptions.filterOptions.filterText;if("object"==typeof a.filter.where){var h=angular.copy(a.filter.where);a.filter.where={and:[]},_.forEach(h,function(b,c){var d={};d[c]=b,a.filter.where.and.push(d)});var i={or:[]};angular.forEach($scope.searchFields,function(a,b){var c="["+a+"][like]",d=_.set({},c,"%"+g+"%");i.or.push(d)}),a.filter.where.and.push(i)}else angular.forEach($scope.searchFields,function(b,c){var d="filter[where][or]["+c+"]["+b+"][like]";a=_.set(a,d,"%"+g+"%")})}}$location.search("pageSize",$scope.pagingOptions.pageSize),$location.search("currentPage",$scope.pagingOptions.currentPage);var j=angular.copy($scope.sortInfo);return delete j.columns,$location.search("sortInfo",JSON.stringify(j)),$location.replace(),addQueryStringParams(),a}function processChart(){$scope.action.options.chart.api&&GeneralModelService.list($scope.action.options.chart.api,{}).then(function(a){$scope.chart=$scope.action.options.chart,$scope.chart.data=a,$scope.chart.options||($scope.chart.options={}),$scope.chart.options.vAxis||($scope.chart.options.vAxis={}),$scope.chart.options.hAxis||($scope.chart.options.hAxis={}),$scope.chart.options.hAxis.textStyle||($scope.chart.options.hAxis.textStyle={}),$scope.chart.options.vAxis.textStyle||($scope.chart.options.vAxis.textStyle={}),$scope.chart.options.vAxis.gridlines||($scope.chart.options.vAxis.gridlines={}),$scope.chart.options.hAxis.textStyle.fontSize||($scope.chart.options.hAxis.textStyle.fontSize=11),$scope.chart.options.vAxis.textStyle.fontSize||($scope.chart.options.vAxis.textStyle.fontSize=11),$scope.chart.options.hAxis.textStyle.color||($scope.chart.options.hAxis.textStyle.color="#999"),$scope.chart.options.vAxis.textStyle.color||($scope.chart.options.vAxis.textStyle.color="#999"),$scope.chart.options.vAxis.baselineColor||($scope.chart.options.vAxis.baselineColor="#999"),$scope.chart.options.hAxis.baselineColor||($scope.chart.options.hAxis.baselineColor="#999"),$scope.chart.options.vAxis.gridlines.color||($scope.chart.options.vAxis.gridlines.color="#eee"),$scope.chart.options.hAxis.gridlines.color||($scope.chart.options.hAxis.gridlines.color="#eee")})}function startEdit(){$scope.isEditing||($scope.oldList=angular.copy($scope.list),$scope.isEditing=!0)}function endEdit(){$scope.isEditing&&($scope.isEditing=!1,$scope.oldList=void 0,$scope.loadItems())}var isFirstLoad=!0,modalInstance=null,selectedItems=[];$scope.clickSelectAll=function(){for(var a in $scope.list)if($scope.list[a].isChecked&&!$scope.action.selectAll){$scope.list[a].isChecked=!1;var b=selectedItems.indexOf($scope.list[a]);selectedItems.splice(b,1)}else $scope.action.selectAll&&selectedItems.indexOf($scope.list[a])<0&&($scope.list[a].isChecked=!0,selectedItems.push($scope.list[a]));$scope.$emit("SelectedModelList",{list:selectedItems})},$scope.clickItemCheckbox=function(a){var b=selectedItems.indexOf(a)>-1;if(a.isChecked&&!b)selectedItems.push(a);else if(b){var c=selectedItems.indexOf(a);selectedItems.splice(c,1),0==selectedItems.length&&($scope.action.selectAll=!1)}$scope.$emit("SelectedModelList",{list:selectedItems})},$scope.getTotalServerItems=function(){$scope.isLoading=!0,$scope.list=[],$scope.totalServerItems=0;var a=setupPagination();GeneralModelService.count($scope.apiPath,a).then(function(b){if(b){if("string"==typeof b)$scope.totalServerItems=b;else{b instanceof Array&&b.length>0&&(b=b[0]);var c=Object.keys(b);!b.count&&c.length>0&&(b.count=b[c[0]]),$scope.totalServerItems=b.count}parseInt($scope.totalServerItems)>0?$scope.loadItems(a):($scope.isLoading=!1,$scope.loadAttempted=!0)}},function(a){$scope.isLoading=!1,$scope.errorMessage="There was an error while loading...",console.error(a)})},$scope.loadItems=function(a){$scope.isLoading=!0,$scope.list=[],$scope.$emit("ModelListLoadItemsLoading"),a||(a=setupPagination());var b=CacheService.getKeyForAction($scope.action,a);if(!$scope.filterOptions.useExternalFilter&&CacheService.get(b))try{$scope.list=CacheService.get(b),$scope.columnCount=$scope.list.length>0?Object.keys($scope.list[0]).length:0,processWindowSize()}catch(a){console.warn("ModelList Cache is corupt for key = "+b)}GeneralModelService.list($scope.apiPath,a).then(function(a){a&&(void 0!==$scope.action.options.resultField&&void 0!==a[$scope.action.options.resultField]?$scope.list=a[$scope.action.options.resultField]:$scope.list=a,$scope.columnCount=$scope.list.length>0?Object.keys($scope.list[0]).length:0,$scope.filterOptions.useExternalFilter||CacheService.set(b,$scope.list),$scope.$emit("ModelListLoadItemsLoaded"),isFirstLoad=!1,$scope.isLoading=!1,$scope.loadAttempted=!0,processWindowSize())},function(a){$scope.isLoading=!1,$scope.errorMessage="There was an error while loading...",console.error(a)})},$scope.hasButtonPermission=function(a){if(!a.roles)return!0;if(!$cookies.get("roles"))return!1;var b=JSON.parse($cookies.get("roles"));for(var c in b){var d=b[c];if(a.roles.indexOf(d.name)>-1)return!0}return!1},$scope.clickListButton=function(button){if(button.click)eval("$scope."+button.click);else if(button.route){if(button.options&&(button.options.model&&($scope.action.options.model=button.options.model),button.options.key&&($scope.action.options.key=button.options.key),button.options.display&&($scope.action.options.display=button.options.display),button.returnAfterEdit&&($scope.action.options.returnAfterEdit=button.returnAfterEdit),button.options.data)){var keys=Object.keys(button.options.data);for(var i in keys){var key=keys[i],value=button.options.data[key];value.lastIndexOf("{")>-1&&(value=value.substring(value.lastIndexOf("{")+1,value.lastIndexOf("}")),value=$scope.queryStringParams[value]),$scope.action.options.data||($scope.action.options.data={}),$scope.action.options.data[key]=value}}$state.go("dashboard.model.action."+button.route)}else if(button.path&&button.label){var section=_.find(Config.serverParams.nav,{path:button.path}),action=_.find(section.subnav,{label:button.label});$state.go("dashboard.model.action."+action.route,{model:section.path,action:action.label})}},$scope.clickAdd=function(){$scope.list&&$scope.list.length,$scope.list.push({}),startEdit()},$scope.clickSaveEdit=function(){if($scope.oldList){var deltaList=[];for(var i in $scope.list){var newRow=$scope.list[i],oldRow=$scope.oldList[i];if(newRow&&("object"!=typeof newRow||0!=Object.keys(newRow).length)&&0!=newRow.length&&(!oldRow||JSON.stringify(newRow)!=JSON.stringify(oldRow))){var rowKeys=Object.keys(newRow);for(var i in rowKeys){var key=rowKeys[i];newRow[key]&&"object"==typeof newRow[key]&&delete newRow[key]}if($scope.action.options.defaults){var keys=Object.keys($scope.action.options.defaults);for(var i in keys){var key=keys[i],property=$scope.action.options.defaults[key];!property||!property.foreceDefaultOnSave&&newRow[key]||(property.default?newRow[key]=property.default:property.evalDefault&&(newRow[key]=eval(property.evalDefault)))}}if($scope.action.options.columns)for(var i in $scope.action.options.columns){var column=$scope.action.options.columns[i];if(column.required&&!newRow[column.field])return void alert("Please fill in all required fields: "+column.displayName)}deltaList.push(newRow)}}var recordIndex=0;$scope.status="Saving...",$scope.progress=0,modalInstance=$uibModal.open({templateUrl:"app/dashboard/model/edit/ModelEditSaveDialog.html",controller:"ModelEditSaveDialogCtrl",scope:$scope});var saveRecord=function(a,b){var c=a[$scope.action.options.key];GeneralModelService.save($scope.action.options.model,c,a).then(function(a){b()},function(a){if("object"==typeof a&&a.message)alert(a.message);else if("object"==typeof a&&a.error&&a.error.message)alert(a.error.message);else if("object"==typeof a&&a.code)switch(a.code){case"ER_DUP_ENTRY":alert("There was a duplicate entry found. Please make sure the entry is unique.")}else"object"==typeof a?alert(JSON.stringify(a)):alert(a);b()})},saveNextRecord=function(){if(recordIndex>=deltaList.length)return $scope.status="Saved Successful",modalInstance&&modalInstance.close(),$scope.loadItems(),void endEdit();$scope.status="Saving "+(recordIndex+1)+" of "+deltaList.length,$scope.progress=(recordIndex+1)/deltaList.length;var a=deltaList[recordIndex];saveRecord(a,function(){recordIndex++,saveNextRecord()})};saveNextRecord()}},$scope.clickCancelEdit=function(){confirm("Are you sure you want can cancel all changes?")&&endEdit()},$scope.deleteRowWithMessage=function(a,b){if(b)return void(confirm(b)&&$scope.deleteRow(a,!0));$scope.deleteRow(a)},$scope.deleteRow=function(a,b){if(!$scope.model||!$scope.model.plural)return void console.error("$scope.model or $scope.model.plural not found!");if(b||confirm("Are you sure you want to delete this item?")){var c=a.entity[$scope.action.options.key];c?$scope.model.options&&$scope.model.options.softDeleteProperty?(startEdit(),a.entity[$scope.model.options.softDeleteProperty]=!0,$scope.clickSaveEdit()):GeneralModelService.remove($scope.model.plural,c).then(function(b){$scope.list.splice(a.rowIndex,1)},function(a){"object"==typeof a&&a.message?alert(a.message):"object"==typeof a&&a.error&&a.error.message?alert(a.error.message):"object"==typeof a?alert(JSON.stringify(a)):alert(a)}):$scope.list.splice(a.rowIndex,1)}},$scope.$watch("selected",function(a,b){a!==b&&a.length>0&&!$scope.action.options.editable&&($scope.action.options.selectedState?$state.go($scope.action.options.selectedState.stateName||"dashboard.model.action.edit",{model:$scope.action.options.selectedState.stateModel||$scope.section.path,key:$scope.action.options.key,
-action:$scope.action.options.selectedState.stateAction||$scope.action.label,id:a[0][$scope.action.options.selectedState.stateId||$scope.action.options.key]}):$state.go("dashboard.model.action.edit",{model:$scope.section.path,key:$scope.action.options.key,action:$scope.action.label,id:a[0][$scope.action.options.key]}))},!0),$scope.$watch("pagingOptions",function(a,b){a.currentPage==b.currentPage&&a.pageSize==b.pageSize||($scope.pagingOptions.pageSize=$scope.pagingOptions.pageSize.toString(),$scope.loadItems())},!0),$scope.$watch("gridOptions.$gridScope.filterText",_.debounce(function(a,b){a!=b&&$scope.$apply(function(){$scope.pagingOptions.currentPage=1,$scope.filterOptions.filterText=a,$scope.getTotalServerItems()})},250),!0),$scope.$watch("sortInfo",function(a,b){isFirstLoad||a===b||$scope.loadItems()},!0);var ngGridUnWatch=$scope.$watch("gridOptions.ngGrid",function(){if($scope.gridOptions.ngGrid){var a=$scope.gridOptions.ngGrid.$viewport;ngGridUnWatch(),$footerPanel=$(".ngFooterPanel"),$listContainer=$(".grid-container.list");var b=null,c=function(){$scope.gridOptions.$gridServices.DomUtilityService.RebuildGrid($scope.gridOptions.$gridScope,$scope.gridOptions.ngGrid)},d=function(d){var e=d.originalEvent.detail?-d.originalEvent.detail:d.originalEvent.wheelDelta/4,f=a.scrollTop();if(e<0){var f=a.scrollTop();0==f&&(f=-e),$scope.gridContainerTopMargin-f>0?($scope.gridContainerTopMargin-=f,a.height(a.height()+f),a.scrollTop(0)):(a.height(a.height()+$scope.gridContainerTopMargin),$scope.gridContainerTopMargin=0),$scope.gridOptions.$gridServices&&(clearTimeout(b),b=setTimeout(c,30))}else e>0&&(0==f&&$scope.gridContainerTopMargin<$scope.gridContainerTopMarginMax?(f=e,$scope.gridContainerTopMargin+=f,a.height(a.height()-f)):0==f&&($scope.gridContainerTopMargin=$scope.gridContainerTopMarginMax,a.height($footerPanel.offset().top-a.offset().top)));$scope.$digest()};(/(iPad|iPhone|iPod|Android)/g.test(navigator.userAgent)||$scope.action.options.flexibleHeight)&&($(".model-list .grid-container").addClass("flexible"),$(".model-list .grid").css({bottom:"auto"}),$(".model-list .ngFooterPanel").css({position:"static",bottom:"auto"})),$scope.action.options.chart&&(angular.element($window).bind("mousewheel",d),angular.element($window).bind("DOMMouseScroll",d)),$(".search .ngColMenu input").on("keyup",function(){$location.search("search",$(this).val()),$location.replace()})}});init()}]).filter("encodeURIComponent",function(){return window.encodeURIComponent}),angular.module("dashboard.Dashboard.Model.Nav",["dashboard.Config","dashboard.services.Settings","ui.router","ui.bootstrap.modal"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard.model.action.nav",{url:"/config",templateUrl:"app/dashboard/model/nav/ModelNav.html",data:{pageTitle:"Settings - Navigation"}})}]).controller("ModelNavCtrl",["$scope","$timeout","$state","$location","$uibModal","Config","SettingsService",function(a,b,c,d,e,f,g){"ngInject";function h(a){for(var b=angular.copy(j),c=0;cc[a.action.options.sortField]?-1:0}))})},a.moveUp=function(b){var c=a.list.indexOf(b);if(0!=c){var d=c-1;a.list.splice(d,0,a.list.splice(c,1)[0])}},a.moveDown=function(b){var c=a.list.indexOf(b);if(c!=a.list.length-1){var d=c+1;a.list.splice(d,0,a.list.splice(c,1)[0])}},a.edit=function(b){a.action.options.onEdit?a.action.options.onEdit(b[a.action.options.key]):c.go("dashboard.model.action.edit",{model:a.section.path,action:a.action.label,id:b[a.action.options.key]})},a.saveSort=function(){a.alertTitle="Saving...",a.alertMessage="Saving new sort order",a.allowAlertClose=!1,i=d.open({templateUrl:"app/dashboard/alert/Alert.html",controller:"AlertCtrl",size:"sm",scope:a});var b=[];for(var c in a.list){var e=a.list[c],f=e[a.action.options.key];b.unshift(f)}g.sort(a.action.options.model,a.action.options.key,a.action.options.sortField,b).then(function(b){a.alertMessage="Saved Successful!",a.allowAlertClose=!0},function(a){"object"==typeof a&&a.message?alert(a.message):"object"==typeof a&&a.error&&a.error.message?alert(a.error.message):"object"==typeof a?alert(JSON.stringify(a)):alert(a)})},function(){a.hideSideMenu(),e.ga&&e.ga("send","pageview",{page:h.path()}),a.action.options.params||(a.action.options.params={}),a.model=f.serverParams.models[a.action.options.model],a.title=a.action.options.title?a.action.options.title:a.action.options.key,a.loadItems()}()}]),angular.module("dashboard.Dashboard.Model.View",["dashboard.Config","dashboard.directives.ModelField","dashboard.services.GeneralModel","ui.router"]).config(["$stateProvider",function(a){"ngInject";a.state("dashboard.model.action.view",{url:"/view/:id",controller:"ModelViewCtrl",templateUrl:"app/dashboard/model/view/ModelView.html",data:{pageTitle:"View"}})}]).controller("ModelViewCtrl",["$scope","$stateParams","Config","GeneralModelService",function(a,b,c,d){"ngInject";!function(){d.get(a.model.model,b.id).then(function(b){a.data=b})}()}]),angular.module("dashboard.Profile",["ui.bootstrap","ui.bootstrap.modal","dashboard.Dashboard.Model.Edit"]).controller("ProfileCtrl",["$scope","$translate",function(a,b){!function(){b("user_profile.title").then(function(b){a.modalTitle=b},function(){a.modalTitle="User Profile"})}()}]),angular.module("dashboard.Login",["dashboard.Config","dashboard.services.Cache","dashboard.services.Session","ui.router"]).config(["$stateProvider",function(a){"ngInject";a.state("public.login",{url:"/login",controller:"LoginCtrl",templateUrl:"app/login/Login.html",data:{pageTitle:"Login"}})}]).controller("LoginCtrl",["$scope","$state","$window","Config","SessionService","CacheService",function(a,b,c,d,e,f){"ngInject";var g=this;this.init=function(){a.login={},a.clickLogin=g.clickLogin},this.clickLogin=function(){e.logIn(a.login.email,a.login.password).then(function(a){var c=f.get("desiredState");f.reset(),c?b.go(c.state.name,c.params):b.go("dashboard")}).catch(function(a){a&&a[0]&&a[0].error&&a[0].error.message?alert(a[0].error.message):alert("Invalid login.")})},g.init()}]),angular.module("dashboard.Register",["dashboard.Config","dashboard.services.Session","dashboard.services.User","ui.router"]).config(["$stateProvider",function(a){"ngInject";a.state("public.register",{url:"/register",controller:"RegisterCtrl",templateUrl:"app/Register/Register.html",data:{pageTitle:"Register"}})}]).controller("RegisterCtrl",["$scope","Config","SessionService","UserService",function(a,b,c,d){"ngInject";a.login={},a.register=function(){d.register(a.login.email,a.login.password).then(function(b){c.logIn(a.login.email,a.login.password).then(function(a){$state.go("dashboard")}).catch(function(a){alert("Error registering")})}).catch(function(a){alert("Error registering")})}}]),angular.module("dashboard.Config",[]).constant("Config",{apiBaseUrl:window.config.apiBaseUrl||"/api/",serverParams:window.config}),angular.module("dashboard.directive.DateTimePicker",[]).directive("dateTimePicker",["$rootScope",function(a){"ngInject";return{require:"?ngModel",restrict:"AE",scope:{control:"=",format:"@",ngFormat:"=ngFormat",ngTimeZone:"=ngTimeZone",defaultDate:"@",viewMode:"@",ngViewMode:"=ngViewMode",horizontal:"@",locale:"@",maxDate:"@",minDate:"@",onChange:"=",dataKey:"@"},link:function(a,b,c,d){a.format||(a.format=a.ngFormat),a.viewMode||(a.viewMode=a.ngViewMode),a.format&&a.format.indexOf("DD-MMM-YYYY")>-1&&"es"===a.locale&&(a.format=a.format.replace("DD-MMM-","DD MMM ")),d.$formatters.push(function(b){if(a.format||(a.format=a.ngFormat),b){var c=moment(b);return a.ngTimeZone&&c.tz&&(c=c.tz(a.ngTimeZone)),c.format(a.format)}}),a.defaultDate=a.defaultDate&&"string"==typeof a.defaultDate?a.defaultDate.replace(/"/g,""):a.defaultDate;var e={format:a.format,useCurrent:!1,locale:a.locale,defaultDate:a.defaultDate?moment(a.defaultDate).toDate():void 0,viewMode:a.viewMode,widgetPositioning:{horizontal:a.horizontal?a.horizontal:"auto"}};a.minDate&&(e.minDate=a.minDate),a.maxDate&&(e.maxDate=a.maxDate),b.datetimepicker(e),a.control||(a.control={}),a.control.show=function(){b.focus()},b.on("blur",function(){a.format||(a.format=a.ngFormat),a.locale&&moment.locale(a.locale);var c=moment(b.val(),a.format);c.isValid()?d.$setViewValue(c):d.$setViewValue(null),a.onChange&&a.onChange({key:a.dataKey})})}}}]),angular.module("dashboard.directives",[]),angular.module("dashboard.directives.ModelField",["dashboard.directives.ModelFieldImage","dashboard.directives.ModelFieldVideo","dashboard.directives.ModelFieldFile","dashboard.directives.ModelFieldReference","dashboard.directives.ModelFieldReferenceSort","dashboard.directives.ModelFieldList","dashboard.directives.ModelFieldWYSIWYG","dashboard.directives.ModelFieldCanvas","dashboard.directives.ModelFieldLocation","dashboard.directives.ModelFieldPointsOfInterest","dashboard.directives.ModelFieldMultiSelect","dashboard.directives.ModelFieldNumber","dashboard.directive.DateTimePicker","ngCookies","ngSlider","ngSignaturePad","cwill747.phonenumber","monospaced.elastic"]).directive("modelFieldView",["$compile",function(a){"ngInject";function b(a){return"{{ field.label }}: {{ data[field.name] }}"}return{restrict:"E",scope:{key:"=key",model:"=model",data:"=ngModel"},link:function(c,d,e){d.html(b(c.field.type)).show(),a(d.contents())(c)}}}]).directive("modelFieldEdit",["$compile",function(a){"ngInject";function b(a,b){var c="";switch(a){case"reference":c='
';break;case"select":var d="key as (value | translate) for (key, value) in display.options";b.property.display.options instanceof Array&&(d="object"!=typeof b.property.display.options[0]||Array.isArray(b.property.display.options[0])?"value as value for value in display.options":"item.key as item.value disable when item.disabled for item in display.options"),c='
';break;case"radio":var e="(value, text) in display.options";b.property.display.options instanceof Array&&(e="object"!=typeof b.property.display.options[0]||Array.isArray(b.property.display.options[0])?"text in display.options":"item in display.options"),c='
'}return c}function c(a,b){var c=$(a).find("input");if(b&&c)for(var d in b)c.attr(d,b[d])}return{restrict:"E",scope:{key:"=key",model:"=model",data:"=ngModel",ngError:"&",ngEditReason:"&"},link:function(d,e,f){function g(){d.key&&!d.data[d.key]&&(d.display.error="",d.ngError&&d.ngError({error:null}))}function h(a){a&&a.message?j.display.error=a.message:delete j.display.error,d.ngError&&d.ngError({error:a})}function i(){if("text"===j.display.type||"textarea"===j.display.type){var a=!1,b=d.data[d.key]?d.data[d.key].length:0;d.charsLeft=j.display.maxLength-b,d.lengthCheck=function(b){return a=!0,d.charsLeft=j.display.maxLength-b.target.value.length,j.display.maxLength&&b.target.value.length>j.display.maxLength?(d.display.error="Text is longer than the maximum allowed length of "+d.display.maxLength+" characters.",void(d.ngError&&d.ngError({error:new Error(d.display.error)}))):j.display.maxLength&&b.target.value.length<=j.display.maxLength&&b.target.value.length>0?(delete d.display.error,delete d.display.errorCode,void(d.ngError&&d.ngError({error:null}))):void(0===b.target.value.length&&j.display.isRequired&&(d.display.error="This is a required field.",d.ngError&&d.ngError({error:new Error(d.display.error)})))},d.getEditReason=function(b){d.ngEditReason&&a&&d.ngEditReason(b),a=!1}}if("radio"!==j.display.type&&"select"!==j.display.type&&"datetime"!==j.display.type&&"boolean"!==j.display.type||(d.onChange=function(a){var b=!0;d.ngEditReason&&b&&d.ngEditReason(a),b=!1}),"file"==j.display.type&&d.data[d.key]){var c=d.data[d.key];if("object"==typeof c&&c.filename?c=c.filename:"object"==typeof c&&c.file&&(c=c.file.name),c&&"text"==typeof c){var e=c.toLowerCase().substring(c.length-4);".png"!=e&&".jpg"!=e&&"jpeg"!=e&&".bmp"!=e||(j=angular.copy(j),j.display.type="image")}}"datetime"==j.display.type&&(j.display.options||(j.display.options={}),j.display.options.format||(j.display.options.format="YYYY-MM-DD h:mm A")),!d.data[d.key]&&j.display.defaultValueUsingModelKey&&(d.data[d.key]=d.data[j.display.defaultValueUsingModelKey]),d.data[d.key]&&!1===j.display.convertToLocalTime&&(d.data[d.key]=d.data[d.key].substring(0,d.data[d.key].length-1)),"boolean"==j.display.type&&(d.check=function(a,b){var c=a[b];return void 0==c||null==c?j.display.default:(a[b]="1"==c||1==c,j.display.isRequired&&!d.data[d.key]?(d.display.error="This is a required field.",d.ngError&&d.ngError({error:new Error(d.display.error)})):(delete d.display.error,d.ngError&&d.ngError({error:null})),a[b])},"string"==typeof d.data[d.key]&&(d.data[d.key]=parseInt(d.data[d.key]))),"slider"==j.display.type&&(void 0!==d.data[d.key]&&null!=d.data[d.key]||(d.data[d.key]=j.display.options.from+";"+j.display.options.to))}var j;!function(){if(d.onFieldError=h,null!==d.key&&"object"==typeof d.key&&(d.model.properties[d.key.property]||(d.model.properties[d.key.property]={}),d.model.properties[d.key.property].display=d.key,d.key=d.key.property),j={display:{type:"text"}},d.model.properties&&d.model.properties[d.key]&&(j=d.model.properties[d.key]),!j)return void console.log("ModelField link error: no property for model '"+d.model.name+"'; property key = '"+d.key+"' found!");if(!j.display||!j.display.type)switch(j.display||(j.display={}),j.type){case"date":case"Date":j.display.type="datetime";break;default:j.display.type="text"}i(),d.data[d.key]||!j.default&&"number"!=typeof j.default||(d.data[d.key]=j.default),d.property=j,d.display=j.display,j.display.editTemplate?e.html(j.display.editTemplate).show():e.html(b(j.display.type,d)).show(),c(e,d.property.display.inputAttr),d.display.pattern&&"/"==d.display.pattern[0]&&"/"==d.display.pattern[d.display.pattern.length-1]&&(d.display.pattern=d.display.pattern.slice(1,d.display.pattern.length-2)),g(),a(e.contents())(d)}()}}}]),angular.module("dashboard.directives.ModelFieldCanvas",["dashboard.Dashboard.Model.Edit.SaveDialog","dashboard.Config","ui.bootstrap","dashboard.services.GeneralModel","ui.select"]).directive("modelFieldCanvasView",["$compile",function(a){"ngInject";return{restrict:"E",template:"{{ options.model }}: {{ data[options.key] }}",scope:{options:"=options",data:"=ngModel",required:"ngRequired",disabled:"disabled"},link:function(a,b,c){}}}]).directive("modelFieldCanvasEdit",["$compile","$cookies","$timeout","Config","FileUploadService",function(a,b,c,d,e){"ngInject";function f(){return' '}return{restrict:"E",require:"ngModel",scope:{key:"=key",property:"=property",options:"=options",data:"=ngModel",modelData:"=modelData",disabled:"=ngDisabled",ngChange:"&"},link:function(b,d,e,g){function h(){if(b.signature.fromDataURL&&b.isLoading){b.isLoading=!1;var a=new Image;a.setAttribute("crossOrigin","anonymous"),a.onload=function(){b.signature._canvas.getContext("2d").drawImage(a,0,0)},b.data&&"object"==typeof b.data&&b.data.fileUrl?a.src=b.data.fileUrl:a.src=b.data}else if(b.signature.toDataURL){var c=b.signature.toDataURL();b.data=c}}b.isLoading=!0,b.signature={},b.$on("revertDataSignature",function(a,d){d===b.key&&c(function(){b.isLoading=!0;var a=b.signature._canvas;b.signature._canvas.getContext("2d").clearRect(0,0,a.width,a.height),h()},1)}),b.clearCanvas=function(){var a=b.signature._canvas;b.signature._canvas.getContext("2d").clearRect(0,0,a.width,a.height),b.data=null,b.ngChange&&setTimeout(function(){b.ngChange({key:b.key})},1)},b.$watch("signature._mouseButtonDown",function(){h()}),b.changed=function(){b.ngChange&&setTimeout(function(){b.ngChange({key:b.key})},1)},d.html(f()).show(),a(d.contents())(b)}}}]),angular.module("dashboard.directives.ModelFieldFile",["dashboard.services.GeneralModel"]).directive("modelFieldFileView",["$compile",function(a){"ngInject";return{restrict:"E",template:"{{ field.label }}: {{ data[field.name] }}",scope:{field:"=options",data:"=ngModel"},link:function(a,b,c){}}}]).directive("modelFieldFileEdit",["$compile","$document","$window","GeneralModelService","SessionService","$translate",function(a,b,c,d,e,f){"ngInject";return{restrict:"E",template:' {{ filename }} (download | preview)
Drop File Here
',scope:{key:"=key",options:"=options",disabled:"=ngDisabled",data:"=ngModel",modelData:"=modelData",ngChange:"&"},link:function(a,c,d){a.selectFileButtonText="Select File",a.clearButtonText="Clear";var e=["button.select_file"];f(e).then(function(b){-1===e.indexOf(b["button.select_file"])&&(a.selectFileButtonText=b["button.select_file"])});a.$watchCollection("data",function(b){if(b)if(a.data&&a.data&&a.data.filename)a.filename=a.data.filename,a.fileUrl=a.data.fileUrl,a.previewUrl=a.data.previewUrl;else if("string"==typeof a.data){a.fileUrl=a.data.replace(/%2F/g,"/");var c=a.fileUrl.indexOf("documents/");c<0?c=a.fileUrl.indexOf("documents%2F")+11:c+=9;var d=a.fileUrl.indexOf("?Expires");d<0&&(d=a.fileUrl.length),a.filename=a.fileUrl.substring(c+1,d)}else if("object"==typeof a.data.file){var e=a.options.path;a.data={path:e,file:a.data.file},a.filename=a.data.file.name,a.fileUrl=null,a.previewUrl=null}});a.getFileIcon=function(a){switch(a.substring(a.lastIndexOf(".")).toLowerCase()){case".txt":return"fa-file-text-o";case".doc":case".docx":return"fa-file-word-o";case".wav":case".mp3":case".aif":return"fa-file-audio-o";case".m4v":case".mov":case".mp4":case".avi":return"fa-file-video-o";case".jpg":case".jpeg":case".png":case".gif":case".bmp":case".tif":return"fa-file-image-o";case".xls":case".xlsx":return"fa-file-excel-o";case".ppt":case".pptx":return"fa-file-excel-o";case".pdf":return"fa-file-pdf-o";default:return"fa-file-o"}},a.onFileSelect=function(b){if(void 0!==a.data&&a.clear({},!0),!(b.length<1)){var c=b[0],d=a.options.path;a.data={path:d,file:c},a.filename=c.name,a.fileUrl=null}},a.clear=function(b,c,d){b&&b.preventDefault&&b.preventDefault(),(!a.options.confirm||c||confirm("Are you sure you would like to remove the file?"))&&(a.data=null,a.filename=null,a.fileUrl=null,a.ngChange&&!d&&setTimeout(function(){a.ngChange({key:a.key})},1))},b.on("drop",function(a){"INPUT"!=a.target.nodeName&&a.preventDefault()}),b.on("dragover",function(a){a.preventDefault(),c.find(".file-drop").addClass("show")}),$(window).on("mouseleave",function(){c.find(".file-drop").removeClass("show")}),a.$on("$destroy",function(){b.off("drop"),b.off("dragover"),$(window).off("mouseleave")}),a.$on("removeModelFieldFile",function(b,c,d,e){c===a.key&&a.clear(null,d,e)})}}}]),angular.module("dashboard.directives.ModelFieldImage",["dashboard.services.GeneralModel","dashboard.services.Image"]).directive("modelFieldImageView",["$compile",function(a){"ngInject";return{restrict:"E",template:"{{ field.label }}: {{ data[field.name] }}",scope:{field:"=options",data:"=ngModel"},link:function(a,b,c){}}}]).directive("modelFieldImageEdit",["$compile","$document","GeneralModelService","ImageService","SessionService","$timeout","$translate",function(a,b,c,d,e,f,g){"ngInject";return{restrict:"E",require:"^form",template:'
{{ uploadStatus }}
HTML5 Drop File is not supported!
',scope:{key:"=key",options:"=options",disabled:"=ngDisabled",data:"=ngModel",modelData:"=modelData",ngChange:"&"},link:function(a,e,h,i){var j=null;a.selectFileButtonText="Select File",a.clearButtonText="Clear";var k=["button.select_file","button.clear"];g(k).then(function(b){-1===k.indexOf(b["button.select_file"])&&(a.selectFileButtonText=b["button.select_file"]),-1===k.indexOf(b["button.clear"])&&(a.clearButtonText=b["button.clear"])}),a.uploadStatus="Upload File",a.options.isDisplayOnly&&(a.isDisplayOnly=!0,a.thumbnailUrl=a.options.imageUrl);var l=(a.$watch("data",function(b){if(b)if(a.options&&a.options.model)c.get(a.options.model,b).then(function(b){b&&(a.imageUrl=b[a.options.urlKey],a.imageUrl||(a.imageUrl=b.mediumUrl),a.thumbnailUrl=a.imageUrl)});else if("string"==typeof b)if(a.imageUrl=b,a.thumbnailUrl=a.options.thumbnailUrl,a.thumbnailUrl){var d=new Image;d.onerror=function(){f(function(){a.thumbnailUrl=a.imageUrl})},d.src=a.thumbnailUrl}else a.thumbnailUrl=a.imageUrl;else"object"==typeof b&&(b.fileUrl&&(a.imageUrl=b.fileUrl),b.imageUrl&&(a.imageUrl=b.imageUrl),!a.imageUrl&&b.file&&(j=b.file,l.readAsDataURL(b.file)))}),new FileReader);l.onload=function(b){var c=a.options.path,e={path:c,file:j};a.modelData.__ModelFieldImageData||(a.modelData.__ModelFieldImageData={}),a.options&&a.options.urlKey?(a.modelData.__ModelFieldImageData[a.key]||(a.modelData.__ModelFieldImageData[a.key]={}),a.modelData.__ModelFieldImageData[a.key][a.options.urlKey]=e):a.modelData.__ModelFieldImageData[a.key]=e,i.$setDirty(),d.fixOrientationWithDataURI(b.target.result,function(b,c){a.imageUrl=c,a.thumbnailUrl=c,e.file=a.dataURItoBlob(c),e.file.name=j.name,a.options&&a.options.export?(a.uploadStatus="Creating Image Sizes",a.exportImages(function(){a.uploadStatus="Upload File",a.$apply()})):a.options&&a.options.resize&&a.resizeImage(c,a.options.resize,function(a){e.file=a}),a.$apply()})},l.onerror=function(a){console.log(a)},a.clear=function(b,c){(!a.options.confirm||b||confirm("Are you sure you would like to remove this photo?"))&&(a.data=null,a.modelData.__ModelFieldImageData&&a.modelData.__ModelFieldImageData[a.key]&&delete a.modelData.__ModelFieldImageData[a.key],delete a.imageUrl,delete a.thumbnailUrl,i.$setDirty(),a.ngChange&&!c&&setTimeout(function(){a.ngChange({key:a.key})},1))},a.onFileSelect=function(b){if(void 0!==a.data&&a.clear(!0),!(b.length<1)){j=b[0];var c=!1;a.options.extensions?a.options.extensions.forEach(function(a){j.type.match("image/"+a)&&(c=!0)}):c=!0,c?l.readAsDataURL(j):alert("File must be of the following file types ("+a.options.extensions.join(", ")+").")}},a.exportImages=function(b){var c=arguments[1];c||(c=0);var d=Object.keys(a.options.export);if(c>=d.length)return void b();var e=d[c],f=a.options.export[e];a.resizeImage(a.imageUrl,f,function(d){a.modelData.__ModelFieldImageData[a.key][e]=d,c++,a.exportImages(b,c)})},a.resizeImage=function(b,c,e){d.resize(b,c,function(b,c){var d=a.dataURItoBlob(c);e(d)})},a.dataURItoBlob=function(a){var b;b=a.split(",")[0].indexOf("base64")>=0?atob(a.split(",")[1]):unescape(a.split(",")[1]);for(var c=a.split(",")[0].split(":")[1].split(";")[0],d=new Uint8Array(b.length),e=0;e'),d=$('');if(c.append(d),$("body").append(c),a.options.isLightbox){var e=Math.min(d.width()/b.width,d.height()/b.height),f=b.width*e,g=b.height*e;d.css({background:"no-repeat center center url("+a.imageUrl+")",backgroundSize:f+"px "+g+"px"})}else{var h=$(''),i=$('');d.append(h),d.append(i);var e=Math.min(h.width()/b.width,h.height()/b.height),j=b.width*e,k=b.height*e;h.css({background:"no-repeat center center url("+a.imageUrl+")",backgroundSize:j+"px "+k+"px"});e=1;var l=b.width*e,m=b.height*e;i.css({background:"no-repeat center center url("+a.imageUrl+"), #111",backgroundSize:l+"px "+m+"px",border:"solid 1px #000"});var n="center",o="center",p=function(a){n=a.offsetX,o=a.offsetY,n||(n=a.pageX),o||(o=a.pageY),n-=h.width()/2-j/2,o-=h.height()/2-k/2,n*=-l/j,o*=-m/k,n+=i.width()/2,o+=i.height()/2,i.css({backgroundPosition:n+"px "+o+"px",backgroundSize:l+"px "+m+"px"})};h.on("mousemove",p),h.bind("mousewheel",function(a){a.originalEvent.wheelDelta/120>0&&e+.01<=1.1?e+=.01:e-.01>=.1&&(e-=.01),l=b.width*e,m=b.height*e,p(a)})}c.animate({backgroundColor:"rgba(0,0,0,0.65)"},600,function(){d.animate({opacity:1},300)}),d.click(function(){c.animate({opacity:0},300,function(){c.remove()})})},b.src=a.imageUrl}else{var c=e.find(".image-container");c.width()<=160?c.animate({width:"400px",height:"400px"},300):c.animate({width:"160px",height:"160px"},300)}},b.on("drop",function(a){"INPUT"!=a.target.nodeName&&a.preventDefault()}),b.on("dragover",function(a){a.preventDefault(),e.find(".image-drop").addClass("show-upload"),e.find(".input[type=file]").addClass("show-upload"),e.find(".button-menu").addClass("hide-menu")}),$(window).on("mouseleave",function(){e.find(".image-drop").removeClass("show-upload"),e.find(".input[type=file]").removeClass("show-upload"),e.find(".button-menu").removeClass("hide-menu")}),a.$on("$destroy",function(){b.off("drop"),b.off("dragover"),$(window).off("mouseleave")}),a.$on("removeModelFieldImage",function(b,c){c===a.key&&a.clear(null,!0)})}}}]),angular.module("dashboard.directives.ModelFieldList",["dashboard.Config","dashboard.services.GeneralModel","ui.select"]).directive("modelFieldListView",["$compile",function(a){"ngInject";return{restrict:"E",template:"{{ options.model }}: {{ data[options.key] }}",scope:{options:"=options",data:"=ngModel",required:"ngRequired",disabled:"ngDisabled"},link:function(a,b,c){}}}]).directive("modelFieldListEdit",["$compile","$cookies","$timeout","Config","GeneralModelService",function(a,b,c,d,e){"ngInject";function f(a){return'
'}return{restrict:"E",require:"ngModel",scope:{key:"=key",property:"=property",options:"=options",data:"=ngModel",modelData:"=modelData",disabled:"=ngDisabled"},link:function(b,f,g){function h(){b.isMapLoading=!1,b.isLoaded=!0,k=new google.maps.Map(angular.element("#map_canvas")[0],{center:b.location,zoom:12}),i()}function i(){j()}function j(){if(b.data)if(m){var a=new google.maps.LatLng(b.data.lat,b.data.lng);m.setPosition(a),m.setMap(k),k.setCenter(a)}else{m=new google.maps.Marker({position:b.location,map:k,icon:new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|2F76EE",new google.maps.Size(21,34),new google.maps.Point(0,0),new google.maps.Point(10,34)),draggable:!0,tooltip:"Current location"}),google.maps.event.addListener(m,"dragend",function(){var a={lat:m.position.lat(),lng:m.position.lng()};b.data=a,b.$digest()})}}var k,l,m,n;b.isMapLoading=!0,b.isLoaded=!1,b.geocodeSearch={value:""},b.geocodeError=null,b.showGeocode=!1,d().then(function(){l=new google.maps.Geocoder,b.showGeocode=!1,b.property.display.options&&b.property.display.options.allowGeocode&&(b.showGeocode=!0);b.property.display.options&&b.property.display.options.query&&b.property.display.options.query,f.html(e()).show(),a(f.contents())(b),b.data?(n=b.data,b.location=angular.copy(b.data),h()):c.currentLocation().then(function(a){var c={lat:a.latitude,lng:a.longitude};n=c,b.data=c,h()}),b.$watch("data",function(a,c){a!=c&&(b.valueChanged=JSON.stringify(b.data)!=JSON.stringify(n),j())}),b.$watch("data.lat",function(a,c){a!=c&&(b.valueChanged=JSON.stringify(b.data)!=JSON.stringify(n),j())}),b.$watch("data.lng",function(a,c){a!=c&&(b.valueChanged=JSON.stringify(b.data)!=JSON.stringify(n),j())})},function(){console.error("Error loading Google Maps")}),b.doGeocode=function(){b.geocodeError=null,b.geocodeSearch.value?l.geocode({address:b.geocodeSearch.value},function(a,c){c==google.maps.GeocoderStatus.OK?b.$apply(function(){var c={lat:a[0].geometry.location.lat(),lng:a[0].geometry.location.lng()};b.data=c,h()}):c===google.maps.GeocoderStatus.OVER_QUERY_LIMIT?console.log("Geocode was not successful for the following reason: "+c):c===google.maps.GeocoderStatus.ZERO_RESULTS?(b.geocodeError="Couldn't match the specified query with a geopoint",b.$digest(),console.log("Geocode was not successful for the following reason: "+c)):console.log("Geocode was not successful for the following reason:"+c)}):alert("Please enter the address of a location to geocode.")},b.clearSearch=function(){b.hasSearched=!1},b.revertValue=function(){n&&(b.data=n)}}}}]),angular.module("dashboard.directives.ModelFieldMultiSelect",[]).directive("modelFieldMultiSelect",["$compile","$timeout",function(a,b){"ngInject";function c(){return''}return{restrict:"E",require:"ngModel",scope:{key:"=key",property:"=property",options:"=options",data:"=ngModel",modelData:"=modelData",disabled:"=ngDisabled",ngBlur:"&"},link:function(d,e,f,g){function h(){var a=d.options||l.display.options;"string"==typeof a&&(a=a.indexOf("\n")>-1?a.split("\n"):a.split(","));var b=l.display.key||"key",c=l.display.value||"value";if(Array.isArray(a))for(var e in a){var f=a[e];if("string"==typeof f){var g={key:f,value:f};d.multiSelectOptions.push(g)}else if(f&&"object"==typeof f){var h=f[b]||e,g={key:h,value:f[c],item:f};d.multiSelectOptions.push(g)}}else if(a&&"object"==typeof a){var i=Object.keys(a);for(var j in i){var h=i[j],g={key:h,value:a[h]};d.multiSelectOptions.push(g)}}}function i(){for(var a in d.selected)d.selected[a]=!1;if(void 0===l.display.output){var b=d.options||l.display.options;l.display.output=b instanceof Array?"comma":"object"}if("string"==typeof d.data){d.data||(d.data="");var c=d.data.split('","');for(var e in c){var f=c[e];'"'==f[0]&&(f=f.substring(1,f.length)),'"'==f[f.length-1]&&(f=f.substring(0,f.length-1));var g=_.findIndex(d.multiSelectOptions,{key:f});g>-1&&(d.selected[g]=!0)}}else if(Array.isArray(d.data)){d.data||(d.data=[]);for(var e in d.data){var h=d.data[e],g=_.findIndex(d.multiSelectOptions,{key:h});g>-1&&(d.selected[g]=!0)}}else if(d.data&&"object"==typeof d.data){d.data||(d.data={});var i=Object.keys(d.data);for(var a in i){var j=i[a],g=_.findIndex(d.multiSelectOptions,{key:j});g>-1&&(d.selected[g]=!0)}}}function j(a,b){k=!0;var c="array"===l.display.output?[]:"object"===l.display.output?{}:"";for(var e in d.selected)if(d.selected[e]){var f=d.multiSelectOptions[e];switch(l.display.output){case"object":c[f.key]=f.value;break;case"comma":c+='"'+f.key+'",';break;case"array":c.push(b.item||b.key)}}"comma"===l.display.output&&c.length>0&&(c=c.substring(0,c.length-1)),d.data=c,setTimeout(function(){d.ngBlur&&k&&d.ngBlur({key:d.key}),k=!1},1)}var k,l=d.property;!function(){d.multiSelectOptions=[],d.selected=[],l||(l={}),l.display||(l.display={}),h(),i(),d.clickMultiSelectCheckbox=j,e.html(c()).show(),a(e.contents())(d),d.$on("removeModelFieldMultiSelect",function(a,c){c===d.key&&b(function(){i()},1)})}()}}}]),angular.module("dashboard.directives.ModelFieldNumber",[]).directive("modelFieldNumber",["$compile","$filter",function(a,b){"ngInject";function c(){return''}return{restrict:"E",require:"ngModel",scope:{key:"=key",property:"=property",options:"=options",data:"=ngModel",modelData:"=modelData",disabled:"=ngDisabled",required:"=ngRequired",ngError:"&",ngEditReason:"&"},link:function(d,e,f,g){function h(a){k=!0;var b=0;if(document.selection){var c=document.selection.createRange();c.moveStart("character",-a.target.value.length),b=c.text.length}else(a.target.selectionStart||0===a.target.selectionStart)&&(b=a.target.selectionStart);var d=a.target.value;if("string"==typeof d){var e=d.indexOf(".");if(!(-1===e||e>=b)){var f=d.split(".");if(!(f.length<1))return f[1].length>=l.display.scaleValue?void a.preventDefault():void 0}}}function i(a){if((""===a.target.value||null===a.target.value)&&!a.target.validity.badInput)return d.ngError&&l.display.isRequired?d.ngError({error:new Error("This is a required field.")}):d.ngError&&d.ngError({error:null}),void(d.ngEditReason&&k&&d.ngEditReason({key:d.key}));if(!0===l.display.allowDecimal&&l.display.scaleValue>0){var c=b("decimalWithScale")(a.target.value,l.display.scaleValue);if(isNaN(c)&&d.ngError)return void d.ngError({error:new Error("Please enter a valid number")});if(d.data=c,void 0!==l.display.minValue&&j(l.display.minValue,a.target.value))return void(d.ngError&&d.ngError({error:new Error("Value is less than the minimum allowed value ("+l.display.minValue+").")}));if(void 0!==l.display.maxValue&&j(a.target.value,l.display.maxValue))return void(d.ngError&&d.ngError({error:new Error("Value is greater than the maximum allowed value ("+l.display.maxValue+").")}));d.ngError&&d.ngError({error:null})}else if(!1===l.display.allowDecimal){if(isNaN(_.round(a.target.value))||isNaN(parseInt(a.target.value)))return void(d.ngError&&d.ngError({error:new Error("Please enter a valid number")}));var e=_.round(a.target.value,0);if(d.data=e,void 0!==l.display.minValue&&l.display.minValue>parseFloat(a.target.value))return void(d.ngError&&d.ngError({error:new Error("Value is less than the minimum allowed value ("+l.display.minValue+").")}));if(void 0!==l.display.maxValue&&l.display.maxValueparseInt(e[0]))return!0;if(parseInt(d[0])=0&&parseInt(e[0])>=0,g=0;gparseInt(e[1].charAt(g)))return f;if(parseInt(d[1].charAt(g))0&&(d.data=b("decimalWithScale")(d.data,l.display.scaleValue)),e.html(c()).show(),a(e.contents())(d)}()}}}]),
-angular.module("dashboard.directives.ModelFieldPointsOfInterest",["dashboard.Dashboard.Model.Edit.SaveDialog","dashboard.Config","dashboard.services.Location","ui.bootstrap","dashboard.services.GeneralModel","ui.select"]).directive("modelFieldPointsOfInterestView",["$compile",function(a){"ngInject";return{restrict:"E",template:"{{ options.model }}: {{ data[options.key] }}",scope:{options:"=options",data:"=ngModel",required:"ngRequired",disabled:"disabled"},link:function(a,b,c){}}}]).directive("modelFieldPointsOfInterestEdit",["$compile","$cookies","$timeout","$http","$q","$window","Config","GeneralModelService","LocationService",function(a,b,c,d,e,f,g,h,i){"ngInject";function j(a){var b=e.defer();if(angular.element("#google_maps").length)return b.resolve(),b.promise;var c=document.createElement("script");return c.onload=function(){b.resolve()},c.id="google_maps",c.type="text/javascript",c.src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,places",a&&(c.src+="&key="+a),document.getElementsByTagName("head")[0].appendChild(c),b.promise}function k(a){return a.replace(/ /g,"_").toLowerCase()}function l(){return' \t\t\t
';break;case"select":var d="key as (value | translate) for (key, value) in display.options";b.property.display.options instanceof Array&&(d="object"!=typeof b.property.display.options[0]||Array.isArray(b.property.display.options[0])?"value as value for value in display.options":"item.key as item.value disable when item.disabled for item in display.options"),c='
';break;case"radio":var e="(value, text) in display.options";b.property.display.options instanceof Array&&(e="object"!=typeof b.property.display.options[0]||Array.isArray(b.property.display.options[0])?"text in display.options":"item in display.options"),c='
'),d=$('');if(c.append(d),$("body").append(c),a.options.isLightbox){var e=Math.min(d.width()/b.width,d.height()/b.height),f=b.width*e,g=b.height*e;d.css({background:"no-repeat center center url("+a.imageUrl+")",backgroundSize:f+"px "+g+"px"})}else{var h=$(''),i=$('');d.append(h),d.append(i);var e=Math.min(h.width()/b.width,h.height()/b.height),j=b.width*e,k=b.height*e;h.css({background:"no-repeat center center url("+a.imageUrl+")",backgroundSize:j+"px "+k+"px"});e=1;var l=b.width*e,m=b.height*e;i.css({background:"no-repeat center center url("+a.imageUrl+"), #111",backgroundSize:l+"px "+m+"px",border:"solid 1px #000"});var n="center",o="center",p=function(a){n=a.offsetX,o=a.offsetY,n||(n=a.pageX),o||(o=a.pageY),n-=h.width()/2-j/2,o-=h.height()/2-k/2,n*=-l/j,o*=-m/k,n+=i.width()/2,o+=i.height()/2,i.css({backgroundPosition:n+"px "+o+"px",backgroundSize:l+"px "+m+"px"})};h.on("mousemove",p),h.bind("mousewheel",function(a){a.originalEvent.wheelDelta/120>0&&e+.01<=1.1?e+=.01:e-.01>=.1&&(e-=.01),l=b.width*e,m=b.height*e,p(a)})}c.animate({backgroundColor:"rgba(0,0,0,0.65)"},600,function(){d.animate({opacity:1},300)}),d.click(function(){c.animate({opacity:0},300,function(){c.remove()})})},b.src=a.imageUrl}else{var c=e.find(".image-container");c.width()<=160?c.animate({width:"400px",height:"400px"},300):c.animate({width:"160px",height:"160px"},300)}},b.on("drop",function(a){"INPUT"!=a.target.nodeName&&a.preventDefault()}),b.on("dragover",function(a){a.preventDefault(),e.find(".image-drop").addClass("show-upload"),e.find(".input[type=file]").addClass("show-upload"),e.find(".button-menu").addClass("hide-menu")}),$(window).on("mouseleave",function(){e.find(".image-drop").removeClass("show-upload"),e.find(".input[type=file]").removeClass("show-upload"),e.find(".button-menu").removeClass("hide-menu")}),a.$on("$destroy",function(){b.off("drop"),b.off("dragover"),$(window).off("mouseleave")}),a.$on("removeModelFieldImage",function(b,c){c===a.key&&a.clear(null,!0)})}}}]),angular.module("dashboard.directives.ModelFieldList",["dashboard.Config","dashboard.services.GeneralModel","ui.select"]).directive("modelFieldListView",["$compile",function(a){"ngInject";return{restrict:"E",template:"{{ options.model }}: {{ data[options.key] }}",scope:{options:"=options",data:"=ngModel",required:"ngRequired",disabled:"ngDisabled"},link:function(a,b,c){}}}]).directive("modelFieldListEdit",["$compile","$cookies","$timeout","Config","GeneralModelService",function(a,b,c,d,e){"ngInject";function f(a){return'
'}return{restrict:"E",require:"ngModel",scope:{key:"=key",property:"=property",options:"=options",data:"=ngModel",modelData:"=modelData",disabled:"=ngDisabled"},link:function(b,f,g){function h(){b.isMapLoading=!1,b.isLoaded=!0,k=new google.maps.Map(angular.element("#map_canvas")[0],{center:b.location,zoom:12}),i()}function i(){j()}function j(){if(b.data)if(m){var a=new google.maps.LatLng(b.data.lat,b.data.lng);m.setPosition(a),m.setMap(k),k.setCenter(a)}else{m=new google.maps.Marker({position:b.location,map:k,icon:new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|2F76EE",new google.maps.Size(21,34),new google.maps.Point(0,0),new google.maps.Point(10,34)),draggable:!0,tooltip:"Current location"}),google.maps.event.addListener(m,"dragend",function(){var a={lat:m.position.lat(),lng:m.position.lng()};b.data=a,b.$digest()})}}var k,l,m,n;b.isMapLoading=!0,b.isLoaded=!1,b.geocodeSearch={value:""},b.geocodeError=null,b.showGeocode=!1,d().then(function(){l=new google.maps.Geocoder,b.showGeocode=!1,b.property.display.options&&b.property.display.options.allowGeocode&&(b.showGeocode=!0);b.property.display.options&&b.property.display.options.query&&b.property.display.options.query,f.html(e()).show(),a(f.contents())(b),b.data?(n=b.data,b.location=angular.copy(b.data),h()):c.currentLocation().then(function(a){var c={lat:a.latitude,lng:a.longitude};n=c,b.data=c,h()}),b.$watch("data",function(a,c){a!=c&&(b.valueChanged=JSON.stringify(b.data)!=JSON.stringify(n),j())}),b.$watch("data.lat",function(a,c){a!=c&&(b.valueChanged=JSON.stringify(b.data)!=JSON.stringify(n),j())}),b.$watch("data.lng",function(a,c){a!=c&&(b.valueChanged=JSON.stringify(b.data)!=JSON.stringify(n),j())})},function(){console.error("Error loading Google Maps")}),b.doGeocode=function(){b.geocodeError=null,b.geocodeSearch.value?l.geocode({address:b.geocodeSearch.value},function(a,c){c==google.maps.GeocoderStatus.OK?b.$apply(function(){var c={lat:a[0].geometry.location.lat(),lng:a[0].geometry.location.lng()};b.data=c,h()}):c===google.maps.GeocoderStatus.OVER_QUERY_LIMIT?console.log("Geocode was not successful for the following reason: "+c):c===google.maps.GeocoderStatus.ZERO_RESULTS?(b.geocodeError="Couldn't match the specified query with a geopoint",b.$digest(),console.log("Geocode was not successful for the following reason: "+c)):console.log("Geocode was not successful for the following reason:"+c)}):alert("Please enter the address of a location to geocode.")},b.clearSearch=function(){b.hasSearched=!1},b.revertValue=function(){n&&(b.data=n)}}}}]),angular.module("dashboard.directives.ModelFieldMultiSelect",[]).directive("modelFieldMultiSelect",["$compile","$timeout",function(a,b){"ngInject";function c(){return''}return{restrict:"E",require:"ngModel",scope:{key:"=key",property:"=property",
+options:"=options",data:"=ngModel",modelData:"=modelData",disabled:"=ngDisabled",ngBlur:"&"},link:function(d,e,f,g){function h(){var a=d.options||l.display.options;"string"==typeof a&&(a=a.indexOf("\n")>-1?a.split("\n"):a.split(","));var b=l.display.key||"key",c=l.display.value||"value";if(Array.isArray(a))for(var e in a){var f=a[e];if("string"==typeof f){var g={key:f,value:f};d.multiSelectOptions.push(g)}else if(f&&"object"==typeof f){var h=f[b]||e,g={key:h,value:f[c],item:f};d.multiSelectOptions.push(g)}}else if(a&&"object"==typeof a){var i=Object.keys(a);for(var j in i){var h=i[j],g={key:h,value:a[h]};d.multiSelectOptions.push(g)}}}function i(){for(var a in d.selected)d.selected[a]=!1;if(void 0===l.display.output){var b=d.options||l.display.options;l.display.output=b instanceof Array?"comma":"object"}if("string"==typeof d.data){d.data||(d.data="");var c=d.data.split('","');for(var e in c){var f=c[e];'"'==f[0]&&(f=f.substring(1,f.length)),'"'==f[f.length-1]&&(f=f.substring(0,f.length-1));var g=_.findIndex(d.multiSelectOptions,{key:f});g>-1&&(d.selected[g]=!0)}}else if(Array.isArray(d.data)){d.data||(d.data=[]);for(var e in d.data){var h=d.data[e],g=_.findIndex(d.multiSelectOptions,{key:h});g>-1&&(d.selected[g]=!0)}}else if(d.data&&"object"==typeof d.data){d.data||(d.data={});var i=Object.keys(d.data);for(var a in i){var j=i[a],g=_.findIndex(d.multiSelectOptions,{key:j});g>-1&&(d.selected[g]=!0)}}}function j(a,b){k=!0;var c="array"===l.display.output?[]:"object"===l.display.output?{}:"";for(var e in d.selected)if(d.selected[e]){var f=d.multiSelectOptions[e];switch(l.display.output){case"object":c[f.key]=f.value;break;case"comma":c+='"'+f.key+'",';break;case"array":c.push(b.item||b.key)}}"comma"===l.display.output&&c.length>0&&(c=c.substring(0,c.length-1)),d.data=c,setTimeout(function(){d.ngBlur&&k&&d.ngBlur({key:d.key}),k=!1},1)}var k,l=d.property;!function(){d.multiSelectOptions=[],d.selected=[],l||(l={}),l.display||(l.display={}),h(),i(),d.clickMultiSelectCheckbox=j,e.html(c()).show(),a(e.contents())(d),d.$on("removeModelFieldMultiSelect",function(a,c){c===d.key&&b(function(){i()},1)})}()}}}]),angular.module("dashboard.directives.ModelFieldNumber",[]).directive("modelFieldNumber",["$compile","$filter",function(a,b){"ngInject";function c(){return''}return{restrict:"E",require:"ngModel",scope:{key:"=key",property:"=property",options:"=options",data:"=ngModel",modelData:"=modelData",disabled:"=ngDisabled",required:"=ngRequired",ngError:"&",ngEditReason:"&"},link:function(d,e,f,g){function h(a){k=!0;var b=0;if(document.selection){var c=document.selection.createRange();c.moveStart("character",-a.target.value.length),b=c.text.length}else(a.target.selectionStart||0===a.target.selectionStart)&&(b=a.target.selectionStart);var d=a.target.value;if("string"==typeof d){var e=d.indexOf(".");if(!(-1===e||e>=b)){var f=d.split(".");if(!(f.length<1))return f[1].length>=l.display.scaleValue?void a.preventDefault():void 0}}}function i(a){if((""===a.target.value||null===a.target.value)&&!a.target.validity.badInput)return d.ngError&&l.display.isRequired?d.ngError({error:new Error("This is a required field.")}):d.ngError&&d.ngError({error:null}),void(d.ngEditReason&&k&&d.ngEditReason({key:d.key}));if(!0===l.display.allowDecimal&&l.display.scaleValue>0){var c=b("decimalWithScale")(a.target.value,l.display.scaleValue);if(isNaN(c)&&d.ngError)return void d.ngError({error:new Error("Please enter a valid number")});if(d.data=c,void 0!==l.display.minValue&&j(l.display.minValue,a.target.value))return void(d.ngError&&d.ngError({error:new Error("Value is less than the minimum allowed value ("+l.display.minValue+").")}));if(void 0!==l.display.maxValue&&j(a.target.value,l.display.maxValue))return void(d.ngError&&d.ngError({error:new Error("Value is greater than the maximum allowed value ("+l.display.maxValue+").")}));d.ngError&&d.ngError({error:null})}else if(!1===l.display.allowDecimal){if(isNaN(_.round(a.target.value))||isNaN(parseInt(a.target.value)))return void(d.ngError&&d.ngError({error:new Error("Please enter a valid number")}));var e=_.round(a.target.value,0);if(d.data=e,void 0!==l.display.minValue&&l.display.minValue>parseFloat(a.target.value))return void(d.ngError&&d.ngError({error:new Error("Value is less than the minimum allowed value ("+l.display.minValue+").")}));if(void 0!==l.display.maxValue&&l.display.maxValueparseInt(e[0]))return!0;if(parseInt(d[0])=0&&parseInt(e[0])>=0,g=0;gparseInt(e[1].charAt(g)))return f;if(parseInt(d[1].charAt(g))0&&(d.data=b("decimalWithScale")(d.data,l.display.scaleValue)),e.html(c()).show(),a(e.contents())(d)}()}}}]),angular.module("dashboard.directives.ModelFieldPointsOfInterest",["dashboard.Dashboard.Model.Edit.SaveDialog","dashboard.Config","dashboard.services.Location","ui.bootstrap","dashboard.services.GeneralModel","ui.select"]).directive("modelFieldPointsOfInterestView",["$compile",function(a){"ngInject";return{restrict:"E",template:"{{ options.model }}: {{ data[options.key] }}",scope:{options:"=options",data:"=ngModel",required:"ngRequired",disabled:"disabled"},link:function(a,b,c){}}}]).directive("modelFieldPointsOfInterestEdit",["$compile","$cookies","$timeout","$http","$q","$window","Config","GeneralModelService","LocationService",function(a,b,c,d,e,f,g,h,i){"ngInject";function j(a){var b=e.defer();if(angular.element("#google_maps").length)return b.resolve(),b.promise;var c=document.createElement("script");return c.onload=function(){b.resolve()},c.id="google_maps",c.type="text/javascript",c.src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,places",a&&(c.src+="&key="+a),document.getElementsByTagName("head")[0].appendChild(c),b.promise}function k(a){return a.replace(/ /g,"_").toLowerCase()}function l(){return' \t\t\t