From 0ff89bf821c9721f024afec8ca13db34c672636d Mon Sep 17 00:00:00 2001 From: dev3124 Date: Thu, 9 Nov 2023 12:01:38 -0800 Subject: [PATCH 1/3] fixed empty validation console error --- dist/all.js | 8 ++------ dist/all.min.js | 2 +- dist/all.min.js.map | 2 +- src/cn-forms.directive.js | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/dist/all.js b/dist/all.js index 1b9c24e..838f39f 100644 --- a/dist/all.js +++ b/dist/all.js @@ -192,7 +192,7 @@ function validatePage(page, noBadge) { var curForm = vm.config.formCtrl[page.key]; - if (curForm) { + if (curForm && Object.keys(curForm.$error).length > 0) { console.error('curForm.$error:', curForm.$error); var errors = _.chain(curForm.$error).reduce(function (left, right) { @@ -316,8 +316,4 @@ } } })(); -"use strict"; - -angular.module("cn.forms").run(["$templateCache", function ($templateCache) { - $templateCache.put("cn-forms/templates/cn-forms.html", "
\n
\n \n
\n \n \n \n\n
\n \n \n \n
\n\n \n \n\n \n
\n Sandbox\n\n
\n \n \n \n
\n
\n \n
\n
\n \n \n\n
2\" class=\"cn-form-meta {{vm.styles.col3}}\">\n \n
\n
\n
\n
\n
\n \n\n
\n \n
\n\n"); -}]); \ No newline at end of file +"use strict"; \ No newline at end of file diff --git a/dist/all.min.js b/dist/all.min.js index 6f16e5f..bb52472 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,2 +1,2 @@ -"use strict";!function(){angular.module("cn.forms",["ui.router","cn.ui","cn.flex-form"])}(),function(){function e(){return{restrict:"E",templateUrl:"cn-forms/templates/cn-forms.html",transclude:!0,scope:{config:"=ffConfig",model:"=ffModel"},controller:n,controllerAs:"vm",bindToController:!0,link:function(e,n,o){n.on("keydown",function(e){13===e.keyCode&&e.preventDefault()}),e.$on("$destroy",function(){n.off("keydown")})}}}function n(e,n,o,a,s,r,c,t){function i(){}function f(o){if(y.activateOffscreen=!1,y.config.getScope=y.config.getScope||function(){return n},y.config.formCtrl=y.cnForm,y.config.buttonContainerClass="page-action-btns",y.config.isDisabled=l,m(y.config),y.config.schema)try{y.compiled=!1,e.compile(y.config.schema,a.page),y.pageIndex=e.getPageIndex(),y.page=e.getPage(),y.compiled=!0,y.page.errors&&(y.page.errors=0,s(function(){n.$broadcast("schemaFormValidate")})),y.renderedPages=_.reduce(y.config.schema.forms,function(e,n,o){return _.set(e,o,_.eq(y.pageIndex,o))},{})}catch(t){r.error("There was an error with your form data:",t.message)}finally{y.activateOffscreen=!0}c.search().sandbox&&(y.schemaStr=angular.toJson(y.config.schema),y.sandbox=!0)}function m(e){y.styles=e.styles||{},y.styles.head=y.styles.head||e.isModal?"modal-header clearfix":"cn-form-head cn-heading row vertical-parent",y.styles.offset=!y.styles.offset&&!e.isModal&&0,y.styles.body=y.styles.body||y.styles.offset===!1?"":"cn-form-fixed",y.styles.col1=y.styles.col1||e.isModal?"":"col-sm-2",y.styles.col2=y.styles.col2||e.isModal?"":"col-sm-6",y.styles.col3=y.styles.col3||e.isModal?"":y.config.schema.forms?"col-sm-4":"col-sm-6",y.styles.nav=y.styles.nav||e.isModal?"":"nav-stacked",y.styles.cols=y.styles.cols||e.isModal?2:3}function l(e){return e.isDisabled?e.isDisabled(d):d(e)}function d(e){return y.saving||y.cnForm.$invalid||(!(e&&e.allowPristine)||!y.activateOffscreen)&&y.cnForm.$pristine}function g(){y.activateOffscreen=!0}function v(e,o){y.loadOffscreen(),n.$broadcast("schemaFormValidate"),n.$emit("schemaFormValidate"),!e.$valid&&!y.config.allowInvalid||y.saving?_.each(y.config.schema.forms,function(e){y.validatePage(e,e===y.page)}):(y.saving=!0,o(y.model).then(function(e){y.config.formCtrl.$setPristine(),y.saving=!1},function(e){y.saving=!1}))}function u(e,r){n.$broadcast("schemaFormValidate"),y.page!==y.config.schema.forms[y.pageIndex]&&(y.page=y.config.schema.forms[y.pageIndex]),y.validatePage(y.page),a.page=e.key,o.go(o.current.name,a);var c=y.page;y.page=e,y.pageIndex=r,y.renderedPages[r]=!0,n.$emit("flexForm.updatePage",e.key),n.$broadcast("flexForm.updatePage",e.key),s(function(){n.$broadcast("schemaFormValidate"),y.validatePage(y.page),y.validatePage(c)})}function p(e,n){var o=y.config.formCtrl[e.key];if(o){console.error("curForm.$error:",o.$error);var a=_.chain(o.$error).reduce(function(e,n){return e.concat(n)}).uniq("$name").reject({$name:""}).value();a&&a.length?e.errors=!n&&a.length:e.errors=0}}function h(){y.schemaStr&&(y.config.schema=angular.fromJson(y.schemaStr))}n.__tag=new i;var y=this;y.activate=f,y.loadOffscreen=g,y.submit=v,y.updatePage=u,y.validatePage=p,y.cleanupEvent="cn.forms.cleanup",y.formKey=a.page,y.schemaStr="",y.onSandboxSchema=h,n.$watch(function(){return!!y.config.schema},y.activate),n.$on("$destroy",function(){n.$broadcast(y.cleanupEvent),n.$emit(y.cleanupEvent),e.destroy()})}angular.module("cn.forms").directive("cnForm",e),n.$inject=["cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile"]}(),function(){function e(e,n){function o(){}function a(o){var a=o.excludedPage?"{page:(?!"+o.excludedPage+")[^/]*}":":page",s=["debug","sandbox"].concat(o.queryParams||[]).join("&");e.state(o.name,{"abstract":!0,url:o.baseUrl+"?"+s,controller:o.controller,controllerAs:o.controllerAs||"vm",resolve:o.resolve,permissions:o.permissions,params:o.params,templateUrl:o.templateUrl,reloadOnSearch:!1}).state(o.name+".page",{url:"/"+a,permissions:o.permissions,template:""}),n.addStates(o)}var s={addStates:a,$get:o};return s}angular.module("cn.forms").provider("cnFormsRoutes",e),e.$inject=["$stateProvider","cnFlexFormRoutesProvider"]}(),function(){function e(){function e(e,o){r.schema=e,n(o)}function n(e){if(r.schema.forms)for(var n=0,o=r.schema.forms.length;n\n
\n \n
\n \n \n \n\n
\n \n \n \n
\n\n \n \n\n \n
\n Sandbox\n\n
\n \n \n \n
\n
\n \n
\n
\n \n \n\n
\n \n
\n
\n
\n
\n
\n \n\n
\n \n
\n\n')}]); +"use strict";!function(){angular.module("cn.forms",["ui.router","cn.ui","cn.flex-form"])}(),function(){function e(){return{restrict:"E",templateUrl:"cn-forms/templates/cn-forms.html",transclude:!0,scope:{config:"=ffConfig",model:"=ffModel"},controller:n,controllerAs:"vm",bindToController:!0,link:function(e,n,o){n.on("keydown",function(e){13===e.keyCode&&e.preventDefault()}),e.$on("$destroy",function(){n.off("keydown")})}}}function n(e,n,o,a,r,t,s,c){function i(){}function l(o){if(y.activateOffscreen=!1,y.config.getScope=y.config.getScope||function(){return n},y.config.formCtrl=y.cnForm,y.config.buttonContainerClass="page-action-btns",y.config.isDisabled=m,f(y.config),y.config.schema)try{y.compiled=!1,e.compile(y.config.schema,a.page),y.pageIndex=e.getPageIndex(),y.page=e.getPage(),y.compiled=!0,y.page.errors&&(y.page.errors=0,r(function(){n.$broadcast("schemaFormValidate")})),y.renderedPages=_.reduce(y.config.schema.forms,function(e,n,o){return _.set(e,o,_.eq(y.pageIndex,o))},{})}catch(c){t.error("There was an error with your form data:",c.message)}finally{y.activateOffscreen=!0}s.search().sandbox&&(y.schemaStr=angular.toJson(y.config.schema),y.sandbox=!0)}function f(e){y.styles=e.styles||{},y.styles.head=y.styles.head||e.isModal?"modal-header clearfix":"cn-form-head cn-heading row vertical-parent",y.styles.offset=!y.styles.offset&&!e.isModal&&0,y.styles.body=y.styles.body||y.styles.offset===!1?"":"cn-form-fixed",y.styles.col1=y.styles.col1||e.isModal?"":"col-sm-2",y.styles.col2=y.styles.col2||e.isModal?"":"col-sm-6",y.styles.col3=y.styles.col3||e.isModal?"":y.config.schema.forms?"col-sm-4":"col-sm-6",y.styles.nav=y.styles.nav||e.isModal?"":"nav-stacked",y.styles.cols=y.styles.cols||e.isModal?2:3}function m(e){return e.isDisabled?e.isDisabled(d):d(e)}function d(e){return y.saving||y.cnForm.$invalid||(!(e&&e.allowPristine)||!y.activateOffscreen)&&y.cnForm.$pristine}function u(){y.activateOffscreen=!0}function g(e,o){y.loadOffscreen(),n.$broadcast("schemaFormValidate"),n.$emit("schemaFormValidate"),!e.$valid&&!y.config.allowInvalid||y.saving?_.each(y.config.schema.forms,function(e){y.validatePage(e,e===y.page)}):(y.saving=!0,o(y.model).then(function(e){y.config.formCtrl.$setPristine(),y.saving=!1},function(e){y.saving=!1}))}function p(e,t){n.$broadcast("schemaFormValidate"),y.page!==y.config.schema.forms[y.pageIndex]&&(y.page=y.config.schema.forms[y.pageIndex]),y.validatePage(y.page),a.page=e.key,o.go(o.current.name,a);var s=y.page;y.page=e,y.pageIndex=t,y.renderedPages[t]=!0,n.$emit("flexForm.updatePage",e.key),n.$broadcast("flexForm.updatePage",e.key),r(function(){n.$broadcast("schemaFormValidate"),y.validatePage(y.page),y.validatePage(s)})}function v(e,n){var o=y.config.formCtrl[e.key];if(o&&Object.keys(o.$error).length>0){console.error("curForm.$error:",o.$error);var a=_.chain(o.$error).reduce(function(e,n){return e.concat(n)}).uniq("$name").reject({$name:""}).value();a&&a.length?e.errors=!n&&a.length:e.errors=0}}function h(){y.schemaStr&&(y.config.schema=angular.fromJson(y.schemaStr))}n.__tag=new i;var y=this;y.activate=l,y.loadOffscreen=u,y.submit=g,y.updatePage=p,y.validatePage=v,y.cleanupEvent="cn.forms.cleanup",y.formKey=a.page,y.schemaStr="",y.onSandboxSchema=h,n.$watch(function(){return!!y.config.schema},y.activate),n.$on("$destroy",function(){n.$broadcast(y.cleanupEvent),n.$emit(y.cleanupEvent),e.destroy()})}angular.module("cn.forms").directive("cnForm",e),n.$inject=["cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile"]}(),function(){function e(e,n){function o(){}function a(o){var a=o.excludedPage?"{page:(?!"+o.excludedPage+")[^/]*}":":page",r=["debug","sandbox"].concat(o.queryParams||[]).join("&");e.state(o.name,{"abstract":!0,url:o.baseUrl+"?"+r,controller:o.controller,controllerAs:o.controllerAs||"vm",resolve:o.resolve,permissions:o.permissions,params:o.params,templateUrl:o.templateUrl,reloadOnSearch:!1}).state(o.name+".page",{url:"/"+a,permissions:o.permissions,template:""}),n.addStates(o)}var r={addStates:a,$get:o};return r}angular.module("cn.forms").provider("cnFormsRoutes",e),e.$inject=["$stateProvider","cnFlexFormRoutesProvider"]}(),function(){function e(){function e(e,o){t.schema=e,n(o)}function n(e){if(t.schema.forms)for(var n=0,o=t.schema.forms.length;n'\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for (var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if (page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n } else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n\"use strict\";\n\nangular.module(\"cn.forms\").run([\"$templateCache\", function ($templateCache) {\n $templateCache.put(\"cn-forms/templates/cn-forms.html\", \"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");\n}]);","(function() {\n 'use strict';\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();","(function() {\n 'use strict';\n\n angular\n .module('cn.forms')\n .directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n \n // Clean up the event listener\n scope.$on('$destroy', function() {\n element.off('keydown');\n });\n },\n };\n }\n\n Form.$inject = [\n 'cnFormsService', '$scope', '$state',\n '$stateParams', '$timeout', '$log', '$location', '$compile'\n ];\n function Form(cnFormsService, $scope, $state,\n $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(() => !!vm.config.schema, vm.activate);\n\n $scope.$on('$destroy', function() {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || (() => $scope);\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if(vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if(vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function() {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(\n vm.config.schema.forms,\n (acc, value, index) => _.set(acc, index, _.eq(vm.pageIndex, index)),\n {}\n );\n }\n catch(e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ?\n 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ?\n false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ?\n '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ?\n '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ?\n '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ?\n '' : (vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6');\n vm.styles.nav = vm.styles.nav || config.isModal ?\n '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ?\n 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || ((!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine);\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model)\n .then(function(response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function(rejection) {\n vm.saving = false;\n });\n }\n else {\n _.each(vm.config.schema.forms, function(page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n const oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n \n $timeout(() => {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if(curForm) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error)\n .reduce(function(left, right) {\n return left.concat(right);\n })\n .uniq('$name')\n .reject({$name: ''})\n .value();\n\n if(errors && errors.length) {\n page.errors = !noBadge && errors.length;\n }\n else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if(vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n let pageParam = options.excludedPage ?\n `{page:(?!${options.excludedPage})[^/]*}` :\n ':page';\n let queryParams = ['debug', 'sandbox']\n .concat(options.queryParams || [])\n .join('&');\n $stateProvider\n .state(options.name, {\n abstract: true,\n url: `${options.baseUrl}?${queryParams}`,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n })\n .state(options.name + '.page', {\n url: `/${pageParam}`,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for(var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if(page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n }\n else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n","angular.module(\"cn.forms\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"cn-forms/templates/cn-forms.html\",\"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");}]);"]} \ No newline at end of file +{"version":3,"sources":["all.min.js","_cn-forms.module.js","cn-forms.directive.js","cn-forms.routes.js","cn-forms.service.js"],"names":["angular","module","cnForm","restrict","templateUrl","transclude","scope","config","model","controller","Form","controllerAs","bindToController","link","element","attrs","on","event","keyCode","preventDefault","$on","off","cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile","cnFormTag","activate","watch","vm","activateOffscreen","getScope","formCtrl","buttonContainerClass","isDisabled","setupStyles","schema","compiled","compile","page","pageIndex","getPageIndex","getPage","errors","$broadcast","renderedPages","_","reduce","forms","acc","value","index","set","eq","e","error","message","search","sandbox","schemaStr","toJson","styles","head","isModal","offset","body","col1","col2","col3","nav","cols","btnConfig","isFormInvalid","saving","$invalid","allowPristine","$pristine","loadOffscreen","submit","form","handler","$emit","$valid","allowInvalid","each","validatePage","then","response","$setPristine","rejection","updatePage","key","go","current","name","oldPage","noBadge","curForm","Object","keys","$error","length","console","chain","left","right","concat","uniq","reject","$name","onSandboxSchema","fromJson","__tag","this","cleanupEvent","formKey","$watch","destroy","directive","$inject","cnFormsRoutesProvider","$stateProvider","cnFlexFormRoutesProvider","$get","addStates","options","pageParam","excludedPage","queryParams","join","state","abstract","url","baseUrl","resolve","permissions","params","reloadOnSearch","template","provider","service","update","i","l","formIndex","factory"],"mappings":"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","file":"all.min.js","sourcesContent":["'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function link(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function (event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n\n // Clean up the event listener\n scope.$on('$destroy', function () {\n element.off('keydown');\n });\n }\n };\n }\n\n Form.$inject = ['cnFormsService', '$scope', '$state', '$stateParams', '$timeout', '$log', '$location', '$compile'];\n function Form(cnFormsService, $scope, $state, $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(function () {\n return !!vm.config.schema;\n }, vm.activate);\n\n $scope.$on('$destroy', function () {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || function () {\n return $scope;\n };\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if (vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if (vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(vm.config.schema.forms, function (acc, value, index) {\n return _.set(acc, index, _.eq(vm.pageIndex, index));\n }, {});\n } catch (e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if ($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ? 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ? false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ? '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ? '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ? '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ? '' : vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6';\n vm.styles.nav = vm.styles.nav || config.isModal ? '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ? 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || (!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine;\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if ((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model).then(function (response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function (rejection) {\n vm.saving = false;\n });\n } else {\n _.each(vm.config.schema.forms, function (page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n var oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if (curForm && Object.keys(curForm.$error).length > 0) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error).reduce(function (left, right) {\n return left.concat(right);\n }).uniq('$name').reject({ $name: '' }).value();\n\n if (errors && errors.length) {\n page.errors = !noBadge && errors.length;\n } else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if (vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n var pageParam = options.excludedPage ? '{page:(?!' + options.excludedPage + ')[^/]*}' : ':page';\n var queryParams = ['debug', 'sandbox'].concat(options.queryParams || []).join('&');\n $stateProvider.state(options.name, {\n abstract: true,\n url: options.baseUrl + '?' + queryParams,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n }).state(options.name + '.page', {\n url: '/' + pageParam,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for (var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if (page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n } else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n\"use strict\";","(function() {\n 'use strict';\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();","(function() {\n 'use strict';\n\n angular\n .module('cn.forms')\n .directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n \n // Clean up the event listener\n scope.$on('$destroy', function() {\n element.off('keydown');\n });\n },\n };\n }\n\n Form.$inject = [\n 'cnFormsService', '$scope', '$state',\n '$stateParams', '$timeout', '$log', '$location', '$compile'\n ];\n function Form(cnFormsService, $scope, $state,\n $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(() => !!vm.config.schema, vm.activate);\n\n $scope.$on('$destroy', function() {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || (() => $scope);\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if(vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if(vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function() {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(\n vm.config.schema.forms,\n (acc, value, index) => _.set(acc, index, _.eq(vm.pageIndex, index)),\n {}\n );\n }\n catch(e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ?\n 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ?\n false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ?\n '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ?\n '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ?\n '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ?\n '' : (vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6');\n vm.styles.nav = vm.styles.nav || config.isModal ?\n '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ?\n 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || ((!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine);\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model)\n .then(function(response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function(rejection) {\n vm.saving = false;\n });\n }\n else {\n _.each(vm.config.schema.forms, function(page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n const oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n \n $timeout(() => {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if(curForm && Object.keys(curForm.$error).length > 0 ) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error)\n .reduce(function(left, right) {\n return left.concat(right);\n })\n .uniq('$name')\n .reject({$name: ''})\n .value();\n\n if(errors && errors.length) {\n page.errors = !noBadge && errors.length;\n }\n else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if(vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n let pageParam = options.excludedPage ?\n `{page:(?!${options.excludedPage})[^/]*}` :\n ':page';\n let queryParams = ['debug', 'sandbox']\n .concat(options.queryParams || [])\n .join('&');\n $stateProvider\n .state(options.name, {\n abstract: true,\n url: `${options.baseUrl}?${queryParams}`,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n })\n .state(options.name + '.page', {\n url: `/${pageParam}`,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for(var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if(page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n }\n else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n"]} \ No newline at end of file diff --git a/src/cn-forms.directive.js b/src/cn-forms.directive.js index c0b0edb..733003b 100644 --- a/src/cn-forms.directive.js +++ b/src/cn-forms.directive.js @@ -198,7 +198,7 @@ function validatePage(page, noBadge) { var curForm = vm.config.formCtrl[page.key]; - if(curForm) { + if(curForm && Object.keys(curForm.$error).length > 0 ) { console.error('curForm.$error:', curForm.$error); var errors = _.chain(curForm.$error) From d209a3a34b331742b17ea4eac8749206db79398c Mon Sep 17 00:00:00 2001 From: dev3124 Date: Mon, 20 Nov 2023 09:18:57 -0800 Subject: [PATCH 2/3] fix build issue --- dist/all.js | 6 +++++- dist/all.min.js | 2 +- dist/all.min.js.map | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/dist/all.js b/dist/all.js index 838f39f..c834611 100644 --- a/dist/all.js +++ b/dist/all.js @@ -316,4 +316,8 @@ } } })(); -"use strict"; \ No newline at end of file +"use strict"; + +angular.module("cn.forms").run(["$templateCache", function ($templateCache) { + $templateCache.put("cn-forms/templates/cn-forms.html", "
\n
\n \n
\n \n \n \n\n
\n \n \n \n
\n\n \n \n\n \n
\n Sandbox\n\n
\n \n \n \n
\n
\n \n
\n
\n \n \n\n
2\" class=\"cn-form-meta {{vm.styles.col3}}\">\n \n
\n
\n
\n
\n
\n \n\n
\n \n
\n\n"); +}]); \ No newline at end of file diff --git a/dist/all.min.js b/dist/all.min.js index bb52472..5605b68 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,2 +1,2 @@ -"use strict";!function(){angular.module("cn.forms",["ui.router","cn.ui","cn.flex-form"])}(),function(){function e(){return{restrict:"E",templateUrl:"cn-forms/templates/cn-forms.html",transclude:!0,scope:{config:"=ffConfig",model:"=ffModel"},controller:n,controllerAs:"vm",bindToController:!0,link:function(e,n,o){n.on("keydown",function(e){13===e.keyCode&&e.preventDefault()}),e.$on("$destroy",function(){n.off("keydown")})}}}function n(e,n,o,a,r,t,s,c){function i(){}function l(o){if(y.activateOffscreen=!1,y.config.getScope=y.config.getScope||function(){return n},y.config.formCtrl=y.cnForm,y.config.buttonContainerClass="page-action-btns",y.config.isDisabled=m,f(y.config),y.config.schema)try{y.compiled=!1,e.compile(y.config.schema,a.page),y.pageIndex=e.getPageIndex(),y.page=e.getPage(),y.compiled=!0,y.page.errors&&(y.page.errors=0,r(function(){n.$broadcast("schemaFormValidate")})),y.renderedPages=_.reduce(y.config.schema.forms,function(e,n,o){return _.set(e,o,_.eq(y.pageIndex,o))},{})}catch(c){t.error("There was an error with your form data:",c.message)}finally{y.activateOffscreen=!0}s.search().sandbox&&(y.schemaStr=angular.toJson(y.config.schema),y.sandbox=!0)}function f(e){y.styles=e.styles||{},y.styles.head=y.styles.head||e.isModal?"modal-header clearfix":"cn-form-head cn-heading row vertical-parent",y.styles.offset=!y.styles.offset&&!e.isModal&&0,y.styles.body=y.styles.body||y.styles.offset===!1?"":"cn-form-fixed",y.styles.col1=y.styles.col1||e.isModal?"":"col-sm-2",y.styles.col2=y.styles.col2||e.isModal?"":"col-sm-6",y.styles.col3=y.styles.col3||e.isModal?"":y.config.schema.forms?"col-sm-4":"col-sm-6",y.styles.nav=y.styles.nav||e.isModal?"":"nav-stacked",y.styles.cols=y.styles.cols||e.isModal?2:3}function m(e){return e.isDisabled?e.isDisabled(d):d(e)}function d(e){return y.saving||y.cnForm.$invalid||(!(e&&e.allowPristine)||!y.activateOffscreen)&&y.cnForm.$pristine}function u(){y.activateOffscreen=!0}function g(e,o){y.loadOffscreen(),n.$broadcast("schemaFormValidate"),n.$emit("schemaFormValidate"),!e.$valid&&!y.config.allowInvalid||y.saving?_.each(y.config.schema.forms,function(e){y.validatePage(e,e===y.page)}):(y.saving=!0,o(y.model).then(function(e){y.config.formCtrl.$setPristine(),y.saving=!1},function(e){y.saving=!1}))}function p(e,t){n.$broadcast("schemaFormValidate"),y.page!==y.config.schema.forms[y.pageIndex]&&(y.page=y.config.schema.forms[y.pageIndex]),y.validatePage(y.page),a.page=e.key,o.go(o.current.name,a);var s=y.page;y.page=e,y.pageIndex=t,y.renderedPages[t]=!0,n.$emit("flexForm.updatePage",e.key),n.$broadcast("flexForm.updatePage",e.key),r(function(){n.$broadcast("schemaFormValidate"),y.validatePage(y.page),y.validatePage(s)})}function v(e,n){var o=y.config.formCtrl[e.key];if(o&&Object.keys(o.$error).length>0){console.error("curForm.$error:",o.$error);var a=_.chain(o.$error).reduce(function(e,n){return e.concat(n)}).uniq("$name").reject({$name:""}).value();a&&a.length?e.errors=!n&&a.length:e.errors=0}}function h(){y.schemaStr&&(y.config.schema=angular.fromJson(y.schemaStr))}n.__tag=new i;var y=this;y.activate=l,y.loadOffscreen=u,y.submit=g,y.updatePage=p,y.validatePage=v,y.cleanupEvent="cn.forms.cleanup",y.formKey=a.page,y.schemaStr="",y.onSandboxSchema=h,n.$watch(function(){return!!y.config.schema},y.activate),n.$on("$destroy",function(){n.$broadcast(y.cleanupEvent),n.$emit(y.cleanupEvent),e.destroy()})}angular.module("cn.forms").directive("cnForm",e),n.$inject=["cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile"]}(),function(){function e(e,n){function o(){}function a(o){var a=o.excludedPage?"{page:(?!"+o.excludedPage+")[^/]*}":":page",r=["debug","sandbox"].concat(o.queryParams||[]).join("&");e.state(o.name,{"abstract":!0,url:o.baseUrl+"?"+r,controller:o.controller,controllerAs:o.controllerAs||"vm",resolve:o.resolve,permissions:o.permissions,params:o.params,templateUrl:o.templateUrl,reloadOnSearch:!1}).state(o.name+".page",{url:"/"+a,permissions:o.permissions,template:""}),n.addStates(o)}var r={addStates:a,$get:o};return r}angular.module("cn.forms").provider("cnFormsRoutes",e),e.$inject=["$stateProvider","cnFlexFormRoutesProvider"]}(),function(){function e(){function e(e,o){t.schema=e,n(o)}function n(e){if(t.schema.forms)for(var n=0,o=t.schema.forms.length;n0){console.error("curForm.$error:",o.$error);var a=_.chain(o.$error).reduce(function(e,n){return e.concat(n)}).uniq("$name").reject({$name:""}).value();a&&a.length?e.errors=!n&&a.length:e.errors=0}}function h(){y.schemaStr&&(y.config.schema=angular.fromJson(y.schemaStr))}n.__tag=new i;var y=this;y.activate=f,y.loadOffscreen=g,y.submit=v,y.updatePage=u,y.validatePage=p,y.cleanupEvent="cn.forms.cleanup",y.formKey=a.page,y.schemaStr="",y.onSandboxSchema=h,n.$watch(function(){return!!y.config.schema},y.activate),n.$on("$destroy",function(){n.$broadcast(y.cleanupEvent),n.$emit(y.cleanupEvent),e.destroy()})}angular.module("cn.forms").directive("cnForm",e),n.$inject=["cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile"]}(),function(){function e(e,n){function o(){}function a(o){var a=o.excludedPage?"{page:(?!"+o.excludedPage+")[^/]*}":":page",s=["debug","sandbox"].concat(o.queryParams||[]).join("&");e.state(o.name,{"abstract":!0,url:o.baseUrl+"?"+s,controller:o.controller,controllerAs:o.controllerAs||"vm",resolve:o.resolve,permissions:o.permissions,params:o.params,templateUrl:o.templateUrl,reloadOnSearch:!1}).state(o.name+".page",{url:"/"+a,permissions:o.permissions,template:""}),n.addStates(o)}var s={addStates:a,$get:o};return s}angular.module("cn.forms").provider("cnFormsRoutes",e),e.$inject=["$stateProvider","cnFlexFormRoutesProvider"]}(),function(){function e(){function e(e,o){r.schema=e,n(o)}function n(e){if(r.schema.forms)for(var n=0,o=r.schema.forms.length;n\n
\n \n
\n \n \n \n\n
\n \n \n \n
\n\n \n \n\n \n
\n Sandbox\n\n
\n \n \n \n
\n
\n \n
\n
\n \n \n\n
\n \n
\n
\n
\n
\n
\n \n\n
\n \n
\n\n')}]); //# sourceMappingURL=all.min.js.map diff --git a/dist/all.min.js.map b/dist/all.min.js.map index 3fd5428..08f932e 100644 --- a/dist/all.min.js.map +++ b/dist/all.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["all.min.js","_cn-forms.module.js","cn-forms.directive.js","cn-forms.routes.js","cn-forms.service.js"],"names":["angular","module","cnForm","restrict","templateUrl","transclude","scope","config","model","controller","Form","controllerAs","bindToController","link","element","attrs","on","event","keyCode","preventDefault","$on","off","cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile","cnFormTag","activate","watch","vm","activateOffscreen","getScope","formCtrl","buttonContainerClass","isDisabled","setupStyles","schema","compiled","compile","page","pageIndex","getPageIndex","getPage","errors","$broadcast","renderedPages","_","reduce","forms","acc","value","index","set","eq","e","error","message","search","sandbox","schemaStr","toJson","styles","head","isModal","offset","body","col1","col2","col3","nav","cols","btnConfig","isFormInvalid","saving","$invalid","allowPristine","$pristine","loadOffscreen","submit","form","handler","$emit","$valid","allowInvalid","each","validatePage","then","response","$setPristine","rejection","updatePage","key","go","current","name","oldPage","noBadge","curForm","Object","keys","$error","length","console","chain","left","right","concat","uniq","reject","$name","onSandboxSchema","fromJson","__tag","this","cleanupEvent","formKey","$watch","destroy","directive","$inject","cnFormsRoutesProvider","$stateProvider","cnFlexFormRoutesProvider","$get","addStates","options","pageParam","excludedPage","queryParams","join","state","abstract","url","baseUrl","resolve","permissions","params","reloadOnSearch","template","provider","service","update","i","l","formIndex","factory"],"mappings":"AAAA,cCAA,WAEEA,QAAQC,OAAO,YAAa,YAAa,QAAS,oBCFpD,WAOE,QAASC,KACP,OACEC,SAAU,IACVC,YAAa,mCACbC,YAAY,EACZC,OACEC,OAAQ,YACRC,MAAO,YAETC,WAAYC,EACZC,aAAc,KACdC,kBAAkB,EAClBC,KAAM,SAASP,EAAOQ,EAASC,GAE7BD,EAAQE,GAAG,UAAW,SAASC,GACP,KAAlBA,EAAMC,SACRD,EAAME,mBAKVb,EAAMc,IAAI,WAAY,WACpBN,EAAQO,IAAI,eAUpB,QAASX,GAAKY,EAAgBC,EAAQC,EACxBC,EAAcC,EAAUC,EAAMC,EAAWC,GAErD,QAASC,MA2BT,QAASC,GAASC,GAUhB,GATAC,EAAGC,mBAAoB,EACvBD,EAAG1B,OAAO4B,SAAWF,EAAG1B,OAAO4B,UAAa,WAAA,MAAMZ,IAClDU,EAAG1B,OAAO6B,SAAWH,EAAG/B,OACxB+B,EAAG1B,OAAO8B,qBAAuB,mBACjCJ,EAAG1B,OAAO+B,WAAaA,EAEvBC,EAAYN,EAAG1B,QAGZ0B,EAAG1B,OAAOiC,OACX,IACEP,EAAGQ,UAAW,EACdnB,EAAeoB,QAAQT,EAAG1B,OAAOiC,OAAQf,EAAakB,MACtDV,EAAGW,UAAYtB,EAAeuB,eAC9BZ,EAAGU,KAAOrB,EAAewB,UAEzBb,EAAGQ,UAAW,EAEXR,EAAGU,KAAKI,SACTd,EAAGU,KAAKI,OAAS,EACjBrB,EAAS,WACPH,EAAOyB,WAAW,yBAItBf,EAAGgB,cAAgBC,EAAEC,OACnBlB,EAAG1B,OAAOiC,OAAOY,MACjB,SAACC,EAAKC,EAAOC,GAAb,MAAuBL,GAAEM,IAAIH,EAAKE,EAAOL,EAAEO,GAAGxB,EAAGW,UAAWW,SAIhE,MAAMG,GACJ/B,EAAKgC,MAAM,0CAA2CD,EAAEE,SAtB1D,QA0BE3B,EAAGC,mBAAoB,EAKxBN,EAAUiC,SAASC,UACpB7B,EAAG8B,UAAY/D,QAAQgE,OAAO/B,EAAG1B,OAAOiC,QACxCP,EAAG6B,SAAU,GAIjB,QAASvB,GAAYhC,GACnB0B,EAAGgC,OAAS1D,EAAO0D,WACnBhC,EAAGgC,OAAOC,KAAOjC,EAAGgC,OAAOC,MAAQ3D,EAAO4D,QACxC,wBAA0B,8CAC5BlC,EAAGgC,OAAOG,QAASnC,EAAGgC,OAAOG,SAAU7D,EAAO4D,SACpC,EACVlC,EAAGgC,OAAOI,KAAOpC,EAAGgC,OAAOI,MAAQpC,EAAGgC,OAAOG,UAAW,EACtD,GAAK,gBACPnC,EAAGgC,OAAOK,KAAOrC,EAAGgC,OAAOK,MAAQ/D,EAAO4D,QACxC,GAAK,WACPlC,EAAGgC,OAAOM,KAAOtC,EAAGgC,OAAOM,MAAQhE,EAAO4D,QACxC,GAAK,WACPlC,EAAGgC,OAAOO,KAAOvC,EAAGgC,OAAOO,MAAQjE,EAAO4D,QACxC,GAAMlC,EAAG1B,OAAOiC,OAAOY,MAAQ,WAAa,WAC9CnB,EAAGgC,OAAOQ,IAAMxC,EAAGgC,OAAOQ,KAAOlE,EAAO4D,QACtC,GAAK,cACPlC,EAAGgC,OAAOS,KAAOzC,EAAGgC,OAAOS,MAAQnE,EAAO4D,QACxC,EAAI,EAGP,QAAS7B,GAAWqC,GACnB,MAAOA,GAAUrC,WAAaqC,EAAUrC,WAAWsC,GAAiBA,EAAcD,GAGpF,QAASC,GAAcD,GACrB,MAAO1C,GAAG4C,QAAU5C,EAAG/B,OAAO4E,aAAgBH,GAAaA,EAAUI,iBAAmB9C,EAAGC,oBAAsBD,EAAG/B,OAAO8E,UAG7H,QAASC,KACPhD,EAAGC,mBAAoB,EAGzB,QAASgD,GAAOC,EAAMC,GACpBnD,EAAGgD,gBAEH1D,EAAOyB,WAAW,sBAClBzB,EAAO8D,MAAM,uBAETF,EAAKG,SAAUrD,EAAG1B,OAAOgF,cAAkBtD,EAAG4C,OAWhD3B,EAAEsC,KAAKvD,EAAG1B,OAAOiC,OAAOY,MAAO,SAAST,GACtCV,EAAGwD,aAAa9C,EAAMA,IAASV,EAAGU,SAXpCV,EAAG4C,QAAS,EACZO,EAAQnD,EAAGzB,OACNkF,KAAK,SAASC,GACb1D,EAAG1B,OAAO6B,SAASwD,eACnB3D,EAAG4C,QAAS,GACX,SAASgB,GACV5D,EAAG4C,QAAS,KAUtB,QAASiB,GAAWnD,EAAMC,GACxBrB,EAAOyB,WAAW,sBAEdf,EAAGU,OAASV,EAAG1B,OAAOiC,OAAOY,MAAMnB,EAAGW,aACxCX,EAAGU,KAAOV,EAAG1B,OAAOiC,OAAOY,MAAMnB,EAAGW,YAGtCX,EAAGwD,aAAaxD,EAAGU,MAEnBlB,EAAakB,KAAOA,EAAKoD,IACzBvE,EAAOwE,GAAGxE,EAAOyE,QAAQC,KAAMzE,EAC/B,IAAM0E,GAAUlE,EAAGU,IACnBV,GAAGU,KAAOA,EACVV,EAAGW,UAAYA,EACfX,EAAGgB,cAAcL,IAAa,EAE9BrB,EAAO8D,MAAM,sBAAuB1C,EAAKoD,KACzCxE,EAAOyB,WAAW,sBAAuBL,EAAKoD,KAE9CrE,EAAS,WACPH,EAAOyB,WAAW,sBAClBf,EAAGwD,aAAaxD,EAAGU,MACnBV,EAAGwD,aAAaU,KAIpB,QAASV,GAAa9C,EAAMyD,GAC1B,GAAIC,GAAUpE,EAAG1B,OAAO6B,SAASO,EAAKoD,IACtC,IAAGM,GAAWC,OAAOC,KAAKF,EAAQG,QAAQC,OAAS,EAAI,CACrDC,QAAQ/C,MAAM,kBAAmB0C,EAAQG,OAEzC,IAAIzD,GAASG,EAAEyD,MAAMN,EAAQG,QACxBrD,OAAO,SAASyD,EAAMC,GACrB,MAAOD,GAAKE,OAAOD,KAEpBE,KAAK,SACLC,QAAQC,MAAO,KACf3D,OAEFP,IAAUA,EAAO0D,OAClB9D,EAAKI,QAAUqD,GAAWrD,EAAO0D,OAGjC9D,EAAKI,OAAS,GAOpB,QAASmE,KACJjF,EAAG8B,YACJ9B,EAAG1B,OAAOiC,OAASxC,QAAQmH,SAASlF,EAAG8B,YArL3CxC,EAAO6F,MAAQ,GAAItF,EAEnB,IAAIG,GAAKoF,IAETpF,GAAGF,SAAWA,EACdE,EAAGgD,cAAgBA,EACnBhD,EAAGiD,OAASA,EACZjD,EAAG6D,WAAaA,EAChB7D,EAAGwD,aAAeA,EAClBxD,EAAGqF,aAAe,mBAClBrF,EAAGsF,QAAU9F,EAAakB,KAG1BV,EAAG8B,UAAY,GACf9B,EAAGiF,gBAAkBA,EAErB3F,EAAOiG,OAAO,WAAA,QAAQvF,EAAG1B,OAAOiC,QAAQP,EAAGF,UAE3CR,EAAOH,IAAI,WAAY,WACrBG,EAAOyB,WAAWf,EAAGqF,cACrB/F,EAAO8D,MAAMpD,EAAGqF,cAChBhG,EAAemG,YA7DnBzH,QACGC,OAAO,YACPyH,UAAU,SAAUxH,GA8BvBQ,EAAKiH,SACH,iBAAkB,SAAU,SAC5B,eAAgB,WAAY,OAAQ,YAAa,eCrCrD,WAOE,QAASC,GAAsBC,EAAgBC,GAU7C,QAASC,MAIT,QAASC,GAAUC,GACjB,GAAIC,GAAYD,EAAQE,aAAR,YACAF,EAAQE,aADR,UAEZ,QACAC,GAAe,QAAS,WACvBtB,OAAOmB,EAAQG,iBACfC,KAAK,IACVR,GACKS,MAAML,EAAQ/B,MACbqC,YAAU,EACVC,IAAQP,EAAQQ,QAAhB,IAA2BL,EAC3B3H,WAAYwH,EAAQxH,WACpBE,aAAcsH,EAAQtH,cAAgB,KACtC+H,QAAST,EAAQS,QACjBC,YAAaV,EAAQU,YACrBC,OAAQX,EAAQW,OAChBxI,YAAa6H,EAAQ7H,YACrByI,gBAAgB,IAEjBP,MAAML,EAAQ/B,KAAO,SACpBsC,IAAAA,IAASN,EACTS,YAAaV,EAAQU,YACrBG,SAAU,eAGhBhB,EAAyBE,UAAUC,GAtCrC,GAAIc,IACFf,UAAWA,EACXD,KAAMA,EAGR,OAAOgB,GAXT/I,QACKC,OAAO,YACP8I,SAAS,gBAAiBnB,GAE/BA,EAAsBD,SAAW,iBAAkB,+BCNrD,WAME,QAASrG,KAaP,QAASoB,GAAQF,EAAQG,GACvBqG,EAAQxG,OAASA,EACjByG,EAAOtG,GAGT,QAASsG,GAAOtG,GACd,GAAIqG,EAAQxG,OAAOY,MACjB,IAAI,GAAI8F,GAAI,EAAGC,EAAIH,EAAQxG,OAAOY,MAAMqD,OAAQyC,EAAIC,EAAGD,IAAK,CAC1D,GAAI/D,GAAO6D,EAAQxG,OAAOY,MAAM8F,EAChC,IAAGvG,IAASwC,EAAKY,IAAK,CACpBiD,EAAQ7D,KAAOA,EACf6D,EAAQI,UAAYF,CACpB,YAKJF,GAAQ7D,KAAO6D,EAAQxG,OAAO2C,KAIlC,QAASrC,KACP,MAAOkG,GAAQ7D,KAGjB,QAAStC,KACP,MAAOmG,GAAQI,UAGjB,QAAS3B,KACPuB,EAAQ7D,KAAO,KACf6D,EAAQxG,OAAS,KACjBwG,EAAQI,UAAY,KA5CtB,GAAIJ,IACFtG,QAASA,EACTI,QAASA,EACTD,aAAcA,EACdoG,OAAQA,EACRxB,QAASA,EAGX,OAAOuB,GAbThJ,QACKC,OAAO,YACPoJ,QAAQ,iBAAkB/H","file":"all.min.js","sourcesContent":["'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function link(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function (event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n\n // Clean up the event listener\n scope.$on('$destroy', function () {\n element.off('keydown');\n });\n }\n };\n }\n\n Form.$inject = ['cnFormsService', '$scope', '$state', '$stateParams', '$timeout', '$log', '$location', '$compile'];\n function Form(cnFormsService, $scope, $state, $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(function () {\n return !!vm.config.schema;\n }, vm.activate);\n\n $scope.$on('$destroy', function () {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || function () {\n return $scope;\n };\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if (vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if (vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(vm.config.schema.forms, function (acc, value, index) {\n return _.set(acc, index, _.eq(vm.pageIndex, index));\n }, {});\n } catch (e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if ($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ? 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ? false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ? '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ? '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ? '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ? '' : vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6';\n vm.styles.nav = vm.styles.nav || config.isModal ? '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ? 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || (!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine;\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if ((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model).then(function (response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function (rejection) {\n vm.saving = false;\n });\n } else {\n _.each(vm.config.schema.forms, function (page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n var oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if (curForm && Object.keys(curForm.$error).length > 0) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error).reduce(function (left, right) {\n return left.concat(right);\n }).uniq('$name').reject({ $name: '' }).value();\n\n if (errors && errors.length) {\n page.errors = !noBadge && errors.length;\n } else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if (vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n var pageParam = options.excludedPage ? '{page:(?!' + options.excludedPage + ')[^/]*}' : ':page';\n var queryParams = ['debug', 'sandbox'].concat(options.queryParams || []).join('&');\n $stateProvider.state(options.name, {\n abstract: true,\n url: options.baseUrl + '?' + queryParams,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n }).state(options.name + '.page', {\n url: '/' + pageParam,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for (var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if (page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n } else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n\"use strict\";","(function() {\n 'use strict';\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();","(function() {\n 'use strict';\n\n angular\n .module('cn.forms')\n .directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n \n // Clean up the event listener\n scope.$on('$destroy', function() {\n element.off('keydown');\n });\n },\n };\n }\n\n Form.$inject = [\n 'cnFormsService', '$scope', '$state',\n '$stateParams', '$timeout', '$log', '$location', '$compile'\n ];\n function Form(cnFormsService, $scope, $state,\n $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(() => !!vm.config.schema, vm.activate);\n\n $scope.$on('$destroy', function() {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || (() => $scope);\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if(vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if(vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function() {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(\n vm.config.schema.forms,\n (acc, value, index) => _.set(acc, index, _.eq(vm.pageIndex, index)),\n {}\n );\n }\n catch(e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ?\n 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ?\n false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ?\n '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ?\n '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ?\n '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ?\n '' : (vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6');\n vm.styles.nav = vm.styles.nav || config.isModal ?\n '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ?\n 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || ((!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine);\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model)\n .then(function(response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function(rejection) {\n vm.saving = false;\n });\n }\n else {\n _.each(vm.config.schema.forms, function(page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n const oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n \n $timeout(() => {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if(curForm && Object.keys(curForm.$error).length > 0 ) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error)\n .reduce(function(left, right) {\n return left.concat(right);\n })\n .uniq('$name')\n .reject({$name: ''})\n .value();\n\n if(errors && errors.length) {\n page.errors = !noBadge && errors.length;\n }\n else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if(vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n let pageParam = options.excludedPage ?\n `{page:(?!${options.excludedPage})[^/]*}` :\n ':page';\n let queryParams = ['debug', 'sandbox']\n .concat(options.queryParams || [])\n .join('&');\n $stateProvider\n .state(options.name, {\n abstract: true,\n url: `${options.baseUrl}?${queryParams}`,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n })\n .state(options.name + '.page', {\n url: `/${pageParam}`,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for(var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if(page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n }\n else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n"]} \ No newline at end of file +{"version":3,"sources":["all.min.js","_cn-forms.module.js","cn-forms.directive.js","cn-forms.routes.js","cn-forms.service.js","templates.js"],"names":["angular","module","cnForm","restrict","templateUrl","transclude","scope","config","model","controller","Form","controllerAs","bindToController","link","element","attrs","on","event","keyCode","preventDefault","$on","off","cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile","cnFormTag","activate","watch","vm","activateOffscreen","getScope","formCtrl","buttonContainerClass","isDisabled","setupStyles","schema","compiled","compile","page","pageIndex","getPageIndex","getPage","errors","$broadcast","renderedPages","_","reduce","forms","acc","value","index","set","eq","e","error","message","search","sandbox","schemaStr","toJson","styles","head","isModal","offset","body","col1","col2","col3","nav","cols","btnConfig","isFormInvalid","saving","$invalid","allowPristine","$pristine","loadOffscreen","submit","form","handler","$emit","$valid","allowInvalid","each","validatePage","then","response","$setPristine","rejection","updatePage","key","go","current","name","oldPage","noBadge","curForm","Object","keys","$error","length","console","chain","left","right","concat","uniq","reject","$name","onSandboxSchema","fromJson","__tag","this","cleanupEvent","formKey","$watch","destroy","directive","$inject","cnFormsRoutesProvider","$stateProvider","cnFlexFormRoutesProvider","$get","addStates","options","pageParam","excludedPage","queryParams","join","state","abstract","url","baseUrl","resolve","permissions","params","reloadOnSearch","template","provider","service","update","i","l","formIndex","factory","run","$templateCache","put"],"mappings":"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","file":"all.min.js","sourcesContent":["'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function link(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function (event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n\n // Clean up the event listener\n scope.$on('$destroy', function () {\n element.off('keydown');\n });\n }\n };\n }\n\n Form.$inject = ['cnFormsService', '$scope', '$state', '$stateParams', '$timeout', '$log', '$location', '$compile'];\n function Form(cnFormsService, $scope, $state, $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(function () {\n return !!vm.config.schema;\n }, vm.activate);\n\n $scope.$on('$destroy', function () {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || function () {\n return $scope;\n };\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if (vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if (vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(vm.config.schema.forms, function (acc, value, index) {\n return _.set(acc, index, _.eq(vm.pageIndex, index));\n }, {});\n } catch (e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if ($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ? 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ? false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ? '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ? '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ? '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ? '' : vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6';\n vm.styles.nav = vm.styles.nav || config.isModal ? '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ? 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || (!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine;\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if ((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model).then(function (response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function (rejection) {\n vm.saving = false;\n });\n } else {\n _.each(vm.config.schema.forms, function (page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n var oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if (curForm && Object.keys(curForm.$error).length > 0) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error).reduce(function (left, right) {\n return left.concat(right);\n }).uniq('$name').reject({ $name: '' }).value();\n\n if (errors && errors.length) {\n page.errors = !noBadge && errors.length;\n } else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if (vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n var pageParam = options.excludedPage ? '{page:(?!' + options.excludedPage + ')[^/]*}' : ':page';\n var queryParams = ['debug', 'sandbox'].concat(options.queryParams || []).join('&');\n $stateProvider.state(options.name, {\n abstract: true,\n url: options.baseUrl + '?' + queryParams,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n }).state(options.name + '.page', {\n url: '/' + pageParam,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for (var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if (page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n } else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n\"use strict\";\n\nangular.module(\"cn.forms\").run([\"$templateCache\", function ($templateCache) {\n $templateCache.put(\"cn-forms/templates/cn-forms.html\", \"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");\n}]);","(function() {\n 'use strict';\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();","(function() {\n 'use strict';\n\n angular\n .module('cn.forms')\n .directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n \n // Clean up the event listener\n scope.$on('$destroy', function() {\n element.off('keydown');\n });\n },\n };\n }\n\n Form.$inject = [\n 'cnFormsService', '$scope', '$state',\n '$stateParams', '$timeout', '$log', '$location', '$compile'\n ];\n function Form(cnFormsService, $scope, $state,\n $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(() => !!vm.config.schema, vm.activate);\n\n $scope.$on('$destroy', function() {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || (() => $scope);\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if(vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if(vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function() {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(\n vm.config.schema.forms,\n (acc, value, index) => _.set(acc, index, _.eq(vm.pageIndex, index)),\n {}\n );\n }\n catch(e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ?\n 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ?\n false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ?\n '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ?\n '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ?\n '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ?\n '' : (vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6');\n vm.styles.nav = vm.styles.nav || config.isModal ?\n '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ?\n 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || ((!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine);\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model)\n .then(function(response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function(rejection) {\n vm.saving = false;\n });\n }\n else {\n _.each(vm.config.schema.forms, function(page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n const oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n \n $timeout(() => {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if(curForm && Object.keys(curForm.$error).length > 0 ) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error)\n .reduce(function(left, right) {\n return left.concat(right);\n })\n .uniq('$name')\n .reject({$name: ''})\n .value();\n\n if(errors && errors.length) {\n page.errors = !noBadge && errors.length;\n }\n else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if(vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n let pageParam = options.excludedPage ?\n `{page:(?!${options.excludedPage})[^/]*}` :\n ':page';\n let queryParams = ['debug', 'sandbox']\n .concat(options.queryParams || [])\n .join('&');\n $stateProvider\n .state(options.name, {\n abstract: true,\n url: `${options.baseUrl}?${queryParams}`,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n })\n .state(options.name + '.page', {\n url: `/${pageParam}`,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for(var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if(page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n }\n else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n","angular.module(\"cn.forms\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"cn-forms/templates/cn-forms.html\",\"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");}]);"]} \ No newline at end of file From 28b889e40ad214847cd4f3992b715b1a47f3e57a Mon Sep 17 00:00:00 2001 From: dev3124 Date: Mon, 20 Nov 2023 09:37:44 -0800 Subject: [PATCH 3/3] fixed validation error --- dist/all.js | 4 ++-- dist/all.min.js | 2 +- dist/all.min.js.map | 2 +- src/cn-forms.directive.js | 7 +++---- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dist/all.js b/dist/all.js index c834611..79615e3 100644 --- a/dist/all.js +++ b/dist/all.js @@ -192,14 +192,14 @@ function validatePage(page, noBadge) { var curForm = vm.config.formCtrl[page.key]; - if (curForm && Object.keys(curForm.$error).length > 0) { + if (curForm) { console.error('curForm.$error:', curForm.$error); var errors = _.chain(curForm.$error).reduce(function (left, right) { return left.concat(right); }).uniq('$name').reject({ $name: '' }).value(); - if (errors && errors.length) { + if (errors && errors.length > 0) { page.errors = !noBadge && errors.length; } else { page.errors = 0; diff --git a/dist/all.min.js b/dist/all.min.js index 5605b68..bfed63b 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,2 +1,2 @@ -"use strict";!function(){angular.module("cn.forms",["ui.router","cn.ui","cn.flex-form"])}(),function(){function e(){return{restrict:"E",templateUrl:"cn-forms/templates/cn-forms.html",transclude:!0,scope:{config:"=ffConfig",model:"=ffModel"},controller:n,controllerAs:"vm",bindToController:!0,link:function(e,n,o){n.on("keydown",function(e){13===e.keyCode&&e.preventDefault()}),e.$on("$destroy",function(){n.off("keydown")})}}}function n(e,n,o,a,s,r,c,t){function i(){}function f(o){if(y.activateOffscreen=!1,y.config.getScope=y.config.getScope||function(){return n},y.config.formCtrl=y.cnForm,y.config.buttonContainerClass="page-action-btns",y.config.isDisabled=l,m(y.config),y.config.schema)try{y.compiled=!1,e.compile(y.config.schema,a.page),y.pageIndex=e.getPageIndex(),y.page=e.getPage(),y.compiled=!0,y.page.errors&&(y.page.errors=0,s(function(){n.$broadcast("schemaFormValidate")})),y.renderedPages=_.reduce(y.config.schema.forms,function(e,n,o){return _.set(e,o,_.eq(y.pageIndex,o))},{})}catch(t){r.error("There was an error with your form data:",t.message)}finally{y.activateOffscreen=!0}c.search().sandbox&&(y.schemaStr=angular.toJson(y.config.schema),y.sandbox=!0)}function m(e){y.styles=e.styles||{},y.styles.head=y.styles.head||e.isModal?"modal-header clearfix":"cn-form-head cn-heading row vertical-parent",y.styles.offset=!y.styles.offset&&!e.isModal&&0,y.styles.body=y.styles.body||y.styles.offset===!1?"":"cn-form-fixed",y.styles.col1=y.styles.col1||e.isModal?"":"col-sm-2",y.styles.col2=y.styles.col2||e.isModal?"":"col-sm-6",y.styles.col3=y.styles.col3||e.isModal?"":y.config.schema.forms?"col-sm-4":"col-sm-6",y.styles.nav=y.styles.nav||e.isModal?"":"nav-stacked",y.styles.cols=y.styles.cols||e.isModal?2:3}function l(e){return e.isDisabled?e.isDisabled(d):d(e)}function d(e){return y.saving||y.cnForm.$invalid||(!(e&&e.allowPristine)||!y.activateOffscreen)&&y.cnForm.$pristine}function g(){y.activateOffscreen=!0}function v(e,o){y.loadOffscreen(),n.$broadcast("schemaFormValidate"),n.$emit("schemaFormValidate"),!e.$valid&&!y.config.allowInvalid||y.saving?_.each(y.config.schema.forms,function(e){y.validatePage(e,e===y.page)}):(y.saving=!0,o(y.model).then(function(e){y.config.formCtrl.$setPristine(),y.saving=!1},function(e){y.saving=!1}))}function u(e,r){n.$broadcast("schemaFormValidate"),y.page!==y.config.schema.forms[y.pageIndex]&&(y.page=y.config.schema.forms[y.pageIndex]),y.validatePage(y.page),a.page=e.key,o.go(o.current.name,a);var c=y.page;y.page=e,y.pageIndex=r,y.renderedPages[r]=!0,n.$emit("flexForm.updatePage",e.key),n.$broadcast("flexForm.updatePage",e.key),s(function(){n.$broadcast("schemaFormValidate"),y.validatePage(y.page),y.validatePage(c)})}function p(e,n){var o=y.config.formCtrl[e.key];if(o&&Object.keys(o.$error).length>0){console.error("curForm.$error:",o.$error);var a=_.chain(o.$error).reduce(function(e,n){return e.concat(n)}).uniq("$name").reject({$name:""}).value();a&&a.length?e.errors=!n&&a.length:e.errors=0}}function h(){y.schemaStr&&(y.config.schema=angular.fromJson(y.schemaStr))}n.__tag=new i;var y=this;y.activate=f,y.loadOffscreen=g,y.submit=v,y.updatePage=u,y.validatePage=p,y.cleanupEvent="cn.forms.cleanup",y.formKey=a.page,y.schemaStr="",y.onSandboxSchema=h,n.$watch(function(){return!!y.config.schema},y.activate),n.$on("$destroy",function(){n.$broadcast(y.cleanupEvent),n.$emit(y.cleanupEvent),e.destroy()})}angular.module("cn.forms").directive("cnForm",e),n.$inject=["cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile"]}(),function(){function e(e,n){function o(){}function a(o){var a=o.excludedPage?"{page:(?!"+o.excludedPage+")[^/]*}":":page",s=["debug","sandbox"].concat(o.queryParams||[]).join("&");e.state(o.name,{"abstract":!0,url:o.baseUrl+"?"+s,controller:o.controller,controllerAs:o.controllerAs||"vm",resolve:o.resolve,permissions:o.permissions,params:o.params,templateUrl:o.templateUrl,reloadOnSearch:!1}).state(o.name+".page",{url:"/"+a,permissions:o.permissions,template:""}),n.addStates(o)}var s={addStates:a,$get:o};return s}angular.module("cn.forms").provider("cnFormsRoutes",e),e.$inject=["$stateProvider","cnFlexFormRoutesProvider"]}(),function(){function e(){function e(e,o){r.schema=e,n(o)}function n(e){if(r.schema.forms)for(var n=0,o=r.schema.forms.length;n\n
\n \n
\n \n \n \n\n
\n \n \n \n
\n\n \n \n\n \n
\n Sandbox\n\n
\n \n \n \n
\n
\n \n
\n
\n \n \n\n
\n \n
\n
\n
\n
\n
\n \n\n
\n \n
\n\n')}]); +"use strict";!function(){angular.module("cn.forms",["ui.router","cn.ui","cn.flex-form"])}(),function(){function e(){return{restrict:"E",templateUrl:"cn-forms/templates/cn-forms.html",transclude:!0,scope:{config:"=ffConfig",model:"=ffModel"},controller:n,controllerAs:"vm",bindToController:!0,link:function(e,n,o){n.on("keydown",function(e){13===e.keyCode&&e.preventDefault()}),e.$on("$destroy",function(){n.off("keydown")})}}}function n(e,n,o,a,s,r,c,t){function i(){}function f(o){if(y.activateOffscreen=!1,y.config.getScope=y.config.getScope||function(){return n},y.config.formCtrl=y.cnForm,y.config.buttonContainerClass="page-action-btns",y.config.isDisabled=l,m(y.config),y.config.schema)try{y.compiled=!1,e.compile(y.config.schema,a.page),y.pageIndex=e.getPageIndex(),y.page=e.getPage(),y.compiled=!0,y.page.errors&&(y.page.errors=0,s(function(){n.$broadcast("schemaFormValidate")})),y.renderedPages=_.reduce(y.config.schema.forms,function(e,n,o){return _.set(e,o,_.eq(y.pageIndex,o))},{})}catch(t){r.error("There was an error with your form data:",t.message)}finally{y.activateOffscreen=!0}c.search().sandbox&&(y.schemaStr=angular.toJson(y.config.schema),y.sandbox=!0)}function m(e){y.styles=e.styles||{},y.styles.head=y.styles.head||e.isModal?"modal-header clearfix":"cn-form-head cn-heading row vertical-parent",y.styles.offset=!y.styles.offset&&!e.isModal&&0,y.styles.body=y.styles.body||y.styles.offset===!1?"":"cn-form-fixed",y.styles.col1=y.styles.col1||e.isModal?"":"col-sm-2",y.styles.col2=y.styles.col2||e.isModal?"":"col-sm-6",y.styles.col3=y.styles.col3||e.isModal?"":y.config.schema.forms?"col-sm-4":"col-sm-6",y.styles.nav=y.styles.nav||e.isModal?"":"nav-stacked",y.styles.cols=y.styles.cols||e.isModal?2:3}function l(e){return e.isDisabled?e.isDisabled(d):d(e)}function d(e){return y.saving||y.cnForm.$invalid||(!(e&&e.allowPristine)||!y.activateOffscreen)&&y.cnForm.$pristine}function g(){y.activateOffscreen=!0}function v(e,o){y.loadOffscreen(),n.$broadcast("schemaFormValidate"),n.$emit("schemaFormValidate"),!e.$valid&&!y.config.allowInvalid||y.saving?_.each(y.config.schema.forms,function(e){y.validatePage(e,e===y.page)}):(y.saving=!0,o(y.model).then(function(e){y.config.formCtrl.$setPristine(),y.saving=!1},function(e){y.saving=!1}))}function u(e,r){n.$broadcast("schemaFormValidate"),y.page!==y.config.schema.forms[y.pageIndex]&&(y.page=y.config.schema.forms[y.pageIndex]),y.validatePage(y.page),a.page=e.key,o.go(o.current.name,a);var c=y.page;y.page=e,y.pageIndex=r,y.renderedPages[r]=!0,n.$emit("flexForm.updatePage",e.key),n.$broadcast("flexForm.updatePage",e.key),s(function(){n.$broadcast("schemaFormValidate"),y.validatePage(y.page),y.validatePage(c)})}function p(e,n){var o=y.config.formCtrl[e.key];if(o){console.error("curForm.$error:",o.$error);var a=_.chain(o.$error).reduce(function(e,n){return e.concat(n)}).uniq("$name").reject({$name:""}).value();a&&a.length>0?e.errors=!n&&a.length:e.errors=0}}function h(){y.schemaStr&&(y.config.schema=angular.fromJson(y.schemaStr))}n.__tag=new i;var y=this;y.activate=f,y.loadOffscreen=g,y.submit=v,y.updatePage=u,y.validatePage=p,y.cleanupEvent="cn.forms.cleanup",y.formKey=a.page,y.schemaStr="",y.onSandboxSchema=h,n.$watch(function(){return!!y.config.schema},y.activate),n.$on("$destroy",function(){n.$broadcast(y.cleanupEvent),n.$emit(y.cleanupEvent),e.destroy()})}angular.module("cn.forms").directive("cnForm",e),n.$inject=["cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile"]}(),function(){function e(e,n){function o(){}function a(o){var a=o.excludedPage?"{page:(?!"+o.excludedPage+")[^/]*}":":page",s=["debug","sandbox"].concat(o.queryParams||[]).join("&");e.state(o.name,{"abstract":!0,url:o.baseUrl+"?"+s,controller:o.controller,controllerAs:o.controllerAs||"vm",resolve:o.resolve,permissions:o.permissions,params:o.params,templateUrl:o.templateUrl,reloadOnSearch:!1}).state(o.name+".page",{url:"/"+a,permissions:o.permissions,template:""}),n.addStates(o)}var s={addStates:a,$get:o};return s}angular.module("cn.forms").provider("cnFormsRoutes",e),e.$inject=["$stateProvider","cnFlexFormRoutesProvider"]}(),function(){function e(){function e(e,o){r.schema=e,n(o)}function n(e){if(r.schema.forms)for(var n=0,o=r.schema.forms.length;n\n
\n \n
\n \n \n \n\n
\n \n \n \n
\n\n \n \n\n \n
\n Sandbox\n\n
\n \n \n \n
\n
\n \n
\n
\n \n \n\n
\n \n
\n
\n
\n
\n
\n \n\n
\n \n
\n\n')}]); //# sourceMappingURL=all.min.js.map diff --git a/dist/all.min.js.map b/dist/all.min.js.map index 08f932e..8200c27 100644 --- a/dist/all.min.js.map +++ b/dist/all.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["all.min.js","_cn-forms.module.js","cn-forms.directive.js","cn-forms.routes.js","cn-forms.service.js","templates.js"],"names":["angular","module","cnForm","restrict","templateUrl","transclude","scope","config","model","controller","Form","controllerAs","bindToController","link","element","attrs","on","event","keyCode","preventDefault","$on","off","cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile","cnFormTag","activate","watch","vm","activateOffscreen","getScope","formCtrl","buttonContainerClass","isDisabled","setupStyles","schema","compiled","compile","page","pageIndex","getPageIndex","getPage","errors","$broadcast","renderedPages","_","reduce","forms","acc","value","index","set","eq","e","error","message","search","sandbox","schemaStr","toJson","styles","head","isModal","offset","body","col1","col2","col3","nav","cols","btnConfig","isFormInvalid","saving","$invalid","allowPristine","$pristine","loadOffscreen","submit","form","handler","$emit","$valid","allowInvalid","each","validatePage","then","response","$setPristine","rejection","updatePage","key","go","current","name","oldPage","noBadge","curForm","Object","keys","$error","length","console","chain","left","right","concat","uniq","reject","$name","onSandboxSchema","fromJson","__tag","this","cleanupEvent","formKey","$watch","destroy","directive","$inject","cnFormsRoutesProvider","$stateProvider","cnFlexFormRoutesProvider","$get","addStates","options","pageParam","excludedPage","queryParams","join","state","abstract","url","baseUrl","resolve","permissions","params","reloadOnSearch","template","provider","service","update","i","l","formIndex","factory","run","$templateCache","put"],"mappings":"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","file":"all.min.js","sourcesContent":["'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function link(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function (event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n\n // Clean up the event listener\n scope.$on('$destroy', function () {\n element.off('keydown');\n });\n }\n };\n }\n\n Form.$inject = ['cnFormsService', '$scope', '$state', '$stateParams', '$timeout', '$log', '$location', '$compile'];\n function Form(cnFormsService, $scope, $state, $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(function () {\n return !!vm.config.schema;\n }, vm.activate);\n\n $scope.$on('$destroy', function () {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || function () {\n return $scope;\n };\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if (vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if (vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(vm.config.schema.forms, function (acc, value, index) {\n return _.set(acc, index, _.eq(vm.pageIndex, index));\n }, {});\n } catch (e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if ($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ? 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ? false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ? '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ? '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ? '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ? '' : vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6';\n vm.styles.nav = vm.styles.nav || config.isModal ? '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ? 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || (!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine;\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if ((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model).then(function (response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function (rejection) {\n vm.saving = false;\n });\n } else {\n _.each(vm.config.schema.forms, function (page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n var oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if (curForm && Object.keys(curForm.$error).length > 0) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error).reduce(function (left, right) {\n return left.concat(right);\n }).uniq('$name').reject({ $name: '' }).value();\n\n if (errors && errors.length) {\n page.errors = !noBadge && errors.length;\n } else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if (vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n var pageParam = options.excludedPage ? '{page:(?!' + options.excludedPage + ')[^/]*}' : ':page';\n var queryParams = ['debug', 'sandbox'].concat(options.queryParams || []).join('&');\n $stateProvider.state(options.name, {\n abstract: true,\n url: options.baseUrl + '?' + queryParams,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n }).state(options.name + '.page', {\n url: '/' + pageParam,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for (var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if (page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n } else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n\"use strict\";\n\nangular.module(\"cn.forms\").run([\"$templateCache\", function ($templateCache) {\n $templateCache.put(\"cn-forms/templates/cn-forms.html\", \"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");\n}]);","(function() {\n 'use strict';\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();","(function() {\n 'use strict';\n\n angular\n .module('cn.forms')\n .directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n \n // Clean up the event listener\n scope.$on('$destroy', function() {\n element.off('keydown');\n });\n },\n };\n }\n\n Form.$inject = [\n 'cnFormsService', '$scope', '$state',\n '$stateParams', '$timeout', '$log', '$location', '$compile'\n ];\n function Form(cnFormsService, $scope, $state,\n $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(() => !!vm.config.schema, vm.activate);\n\n $scope.$on('$destroy', function() {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || (() => $scope);\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if(vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if(vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function() {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(\n vm.config.schema.forms,\n (acc, value, index) => _.set(acc, index, _.eq(vm.pageIndex, index)),\n {}\n );\n }\n catch(e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ?\n 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ?\n false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ?\n '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ?\n '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ?\n '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ?\n '' : (vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6');\n vm.styles.nav = vm.styles.nav || config.isModal ?\n '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ?\n 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || ((!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine);\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model)\n .then(function(response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function(rejection) {\n vm.saving = false;\n });\n }\n else {\n _.each(vm.config.schema.forms, function(page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n const oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n \n $timeout(() => {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if(curForm && Object.keys(curForm.$error).length > 0 ) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error)\n .reduce(function(left, right) {\n return left.concat(right);\n })\n .uniq('$name')\n .reject({$name: ''})\n .value();\n\n if(errors && errors.length) {\n page.errors = !noBadge && errors.length;\n }\n else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if(vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n let pageParam = options.excludedPage ?\n `{page:(?!${options.excludedPage})[^/]*}` :\n ':page';\n let queryParams = ['debug', 'sandbox']\n .concat(options.queryParams || [])\n .join('&');\n $stateProvider\n .state(options.name, {\n abstract: true,\n url: `${options.baseUrl}?${queryParams}`,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n })\n .state(options.name + '.page', {\n url: `/${pageParam}`,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for(var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if(page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n }\n else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n","angular.module(\"cn.forms\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"cn-forms/templates/cn-forms.html\",\"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");}]);"]} \ No newline at end of file +{"version":3,"sources":["all.min.js","_cn-forms.module.js","cn-forms.directive.js","cn-forms.routes.js","cn-forms.service.js","templates.js"],"names":["angular","module","cnForm","restrict","templateUrl","transclude","scope","config","model","controller","Form","controllerAs","bindToController","link","element","attrs","on","event","keyCode","preventDefault","$on","off","cnFormsService","$scope","$state","$stateParams","$timeout","$log","$location","$compile","cnFormTag","activate","watch","vm","activateOffscreen","getScope","formCtrl","buttonContainerClass","isDisabled","setupStyles","schema","compiled","compile","page","pageIndex","getPageIndex","getPage","errors","$broadcast","renderedPages","_","reduce","forms","acc","value","index","set","eq","e","error","message","search","sandbox","schemaStr","toJson","styles","head","isModal","offset","body","col1","col2","col3","nav","cols","btnConfig","isFormInvalid","saving","$invalid","allowPristine","$pristine","loadOffscreen","submit","form","handler","$emit","$valid","allowInvalid","each","validatePage","then","response","$setPristine","rejection","updatePage","key","go","current","name","oldPage","noBadge","curForm","console","$error","chain","left","right","concat","uniq","reject","$name","length","onSandboxSchema","fromJson","__tag","this","cleanupEvent","formKey","$watch","destroy","directive","$inject","cnFormsRoutesProvider","$stateProvider","cnFlexFormRoutesProvider","$get","addStates","options","pageParam","excludedPage","queryParams","join","state","abstract","url","baseUrl","resolve","permissions","params","reloadOnSearch","template","provider","service","update","i","l","formIndex","factory","run","$templateCache","put"],"mappings":"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","file":"all.min.js","sourcesContent":["'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function link(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function (event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n\n // Clean up the event listener\n scope.$on('$destroy', function () {\n element.off('keydown');\n });\n }\n };\n }\n\n Form.$inject = ['cnFormsService', '$scope', '$state', '$stateParams', '$timeout', '$log', '$location', '$compile'];\n function Form(cnFormsService, $scope, $state, $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(function () {\n return !!vm.config.schema;\n }, vm.activate);\n\n $scope.$on('$destroy', function () {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || function () {\n return $scope;\n };\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if (vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if (vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(vm.config.schema.forms, function (acc, value, index) {\n return _.set(acc, index, _.eq(vm.pageIndex, index));\n }, {});\n } catch (e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if ($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ? 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ? false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ? '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ? '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ? '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ? '' : vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6';\n vm.styles.nav = vm.styles.nav || config.isModal ? '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ? 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || (!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine;\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if ((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model).then(function (response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function (rejection) {\n vm.saving = false;\n });\n } else {\n _.each(vm.config.schema.forms, function (page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n var oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n\n $timeout(function () {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if (curForm) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error).reduce(function (left, right) {\n return left.concat(right);\n }).uniq('$name').reject({ $name: '' }).value();\n\n if (errors && errors.length > 0) {\n page.errors = !noBadge && errors.length;\n } else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if (vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n var pageParam = options.excludedPage ? '{page:(?!' + options.excludedPage + ')[^/]*}' : ':page';\n var queryParams = ['debug', 'sandbox'].concat(options.queryParams || []).join('&');\n $stateProvider.state(options.name, {\n abstract: true,\n url: options.baseUrl + '?' + queryParams,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n }).state(options.name + '.page', {\n url: '/' + pageParam,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('cn.forms').factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for (var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if (page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n } else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n\"use strict\";\n\nangular.module(\"cn.forms\").run([\"$templateCache\", function ($templateCache) {\n $templateCache.put(\"cn-forms/templates/cn-forms.html\", \"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");\n}]);","(function() {\n 'use strict';\n angular.module('cn.forms', ['ui.router', 'cn.ui', 'cn.flex-form']);\n})();","(function() {\n 'use strict';\n\n angular\n .module('cn.forms')\n .directive('cnForm', cnForm);\n\n function cnForm() {\n return {\n restrict: 'E',\n templateUrl: 'cn-forms/templates/cn-forms.html',\n transclude: true,\n scope: {\n config: '=ffConfig',\n model: '=ffModel'\n },\n controller: Form,\n controllerAs: 'vm',\n bindToController: true,\n link: function(scope, element, attrs) {\n // Add event listener to prevent Enter key in cn-form\n element.on('keydown', function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n }\n });\n \n // Clean up the event listener\n scope.$on('$destroy', function() {\n element.off('keydown');\n });\n },\n };\n }\n\n Form.$inject = [\n 'cnFormsService', '$scope', '$state',\n '$stateParams', '$timeout', '$log', '$location', '$compile'\n ];\n function Form(cnFormsService, $scope, $state,\n $stateParams, $timeout, $log, $location, $compile) {\n\n function cnFormTag() {}\n $scope.__tag = new cnFormTag();\n\n var vm = this;\n\n vm.activate = activate;\n vm.loadOffscreen = loadOffscreen;\n vm.submit = submit;\n vm.updatePage = updatePage;\n vm.validatePage = validatePage;\n vm.cleanupEvent = \"cn.forms.cleanup\";\n vm.formKey = $stateParams.page;\n\n // debug\n vm.schemaStr = '';\n vm.onSandboxSchema = onSandboxSchema;\n\n $scope.$watch(() => !!vm.config.schema, vm.activate);\n\n $scope.$on('$destroy', function() {\n $scope.$broadcast(vm.cleanupEvent);\n $scope.$emit(vm.cleanupEvent);\n cnFormsService.destroy();\n });\n\n //////////\n\n function activate(watch) {\n vm.activateOffscreen = false;\n vm.config.getScope = vm.config.getScope || (() => $scope);\n vm.config.formCtrl = vm.cnForm;\n vm.config.buttonContainerClass = \"page-action-btns\";\n vm.config.isDisabled = isDisabled;\n\n setupStyles(vm.config);\n //if(vm.config.isModal) setupModal(vm.config);\n\n if(vm.config.schema) {\n try {\n vm.compiled = false;\n cnFormsService.compile(vm.config.schema, $stateParams.page);\n vm.pageIndex = cnFormsService.getPageIndex();\n vm.page = cnFormsService.getPage();\n\n vm.compiled = true;\n\n if(vm.page.errors) {\n vm.page.errors = 0;\n $timeout(function() {\n $scope.$broadcast('schemaFormValidate');\n });\n }\n\n vm.renderedPages = _.reduce(\n vm.config.schema.forms,\n (acc, value, index) => _.set(acc, index, _.eq(vm.pageIndex, index)),\n {}\n );\n }\n catch(e) {\n $log.error('There was an error with your form data:', e.message);\n } finally {\n // After the compilation is finished, \n // vm.activateOffscreen should be set to true so that isFormInvalid() can return the correct result.\n vm.activateOffscreen = true;\n }\n }\n\n // sandbox\n if($location.search().sandbox) {\n vm.schemaStr = angular.toJson(vm.config.schema);\n vm.sandbox = true;\n }\n }\n\n function setupStyles(config) {\n vm.styles = config.styles || {};\n vm.styles.head = vm.styles.head || config.isModal ?\n 'modal-header clearfix' : 'cn-form-head cn-heading row vertical-parent';\n vm.styles.offset = vm.styles.offset || config.isModal ?\n false : 0;\n vm.styles.body = vm.styles.body || vm.styles.offset === false ?\n '' : 'cn-form-fixed';\n vm.styles.col1 = vm.styles.col1 || config.isModal ?\n '' : 'col-sm-2';\n vm.styles.col2 = vm.styles.col2 || config.isModal ?\n '' : 'col-sm-6';\n vm.styles.col3 = vm.styles.col3 || config.isModal ?\n '' : (vm.config.schema.forms ? 'col-sm-4' : 'col-sm-6');\n vm.styles.nav = vm.styles.nav || config.isModal ?\n '' : 'nav-stacked';\n vm.styles.cols = vm.styles.cols || config.isModal ?\n 2 : 3;\n }\n\n function isDisabled(btnConfig) {\n return btnConfig.isDisabled ? btnConfig.isDisabled(isFormInvalid) : isFormInvalid(btnConfig);\n }\n\n function isFormInvalid(btnConfig) {\n return vm.saving || vm.cnForm.$invalid || ((!(btnConfig && btnConfig.allowPristine) || !vm.activateOffscreen) && vm.cnForm.$pristine);\n }\n\n function loadOffscreen() {\n vm.activateOffscreen = true;\n }\n\n function submit(form, handler) {\n vm.loadOffscreen();\n\n $scope.$broadcast('schemaFormValidate');\n $scope.$emit('schemaFormValidate');\n\n if((form.$valid || vm.config.allowInvalid) && !vm.saving) {\n vm.saving = true;\n handler(vm.model)\n .then(function(response) {\n vm.config.formCtrl.$setPristine();\n vm.saving = false;\n }, function(rejection) {\n vm.saving = false;\n });\n }\n else {\n _.each(vm.config.schema.forms, function(page) {\n vm.validatePage(page, page === vm.page);\n });\n }\n }\n\n function updatePage(page, pageIndex) {\n $scope.$broadcast('schemaFormValidate');\n // if the forms re-render these will no longer be the same reference\n if (vm.page !== vm.config.schema.forms[vm.pageIndex]) {\n vm.page = vm.config.schema.forms[vm.pageIndex];\n }\n\n vm.validatePage(vm.page);\n\n $stateParams.page = page.key;\n $state.go($state.current.name, $stateParams);\n const oldPage = vm.page;\n vm.page = page;\n vm.pageIndex = pageIndex;\n vm.renderedPages[pageIndex] = true;\n\n $scope.$emit('flexForm.updatePage', page.key);\n $scope.$broadcast('flexForm.updatePage', page.key);\n \n $timeout(() => {\n $scope.$broadcast('schemaFormValidate');\n vm.validatePage(vm.page);\n vm.validatePage(oldPage);\n });\n }\n\n function validatePage(page, noBadge) {\n var curForm = vm.config.formCtrl[page.key];\n if(curForm) {\n console.error('curForm.$error:', curForm.$error);\n\n var errors = _.chain(curForm.$error)\n .reduce(function(left, right) {\n return left.concat(right);\n })\n .uniq('$name')\n .reject({$name: ''})\n .value();\n\n if(errors && errors.length > 0) {\n page.errors = !noBadge && errors.length;\n } else {\n page.errors = 0;\n }\n }\n }\n\n // debug\n\n function onSandboxSchema() {\n if(vm.schemaStr) {\n vm.config.schema = angular.fromJson(vm.schemaStr);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .provider('cnFormsRoutes', cnFormsRoutesProvider);\n\n cnFormsRoutesProvider.$inject = ['$stateProvider', 'cnFlexFormRoutesProvider'];\n function cnFormsRoutesProvider($stateProvider, cnFlexFormRoutesProvider) {\n var provider = {\n addStates: addStates,\n $get: $get\n };\n\n return provider;\n\n ////////////\n\n function $get() {\n // nothing to do here, but required\n }\n\n function addStates(options) {\n let pageParam = options.excludedPage ?\n `{page:(?!${options.excludedPage})[^/]*}` :\n ':page';\n let queryParams = ['debug', 'sandbox']\n .concat(options.queryParams || [])\n .join('&');\n $stateProvider\n .state(options.name, {\n abstract: true,\n url: `${options.baseUrl}?${queryParams}`,\n controller: options.controller,\n controllerAs: options.controllerAs || 'vm',\n resolve: options.resolve,\n permissions: options.permissions,\n params: options.params,\n templateUrl: options.templateUrl,\n reloadOnSearch: false\n })\n .state(options.name + '.page', {\n url: `/${pageParam}`,\n permissions: options.permissions,\n template: ''\n });\n\n cnFlexFormRoutesProvider.addStates(options);\n }\n }\n\n})();\n","(function() {\n 'use strict';\n angular\n .module('cn.forms')\n .factory('cnFormsService', cnFormsService);\n\n function cnFormsService() {\n var service = {\n compile: compile,\n getPage: getPage,\n getPageIndex: getPageIndex,\n update: update,\n destroy: destroy\n };\n\n return service;\n\n //////////////\n\n function compile(schema, page) {\n service.schema = schema;\n update(page);\n }\n\n function update(page) {\n if (service.schema.forms) {\n for(var i = 0, l = service.schema.forms.length; i < l; i++) {\n var form = service.schema.forms[i];\n if(page === form.key) {\n service.form = form;\n service.formIndex = i;\n break;\n }\n }\n }\n else {\n service.form = service.schema.form;\n }\n }\n\n function getPage() {\n return service.form;\n }\n\n function getPageIndex() {\n return service.formIndex;\n }\n\n function destroy() {\n service.form = null;\n service.schema = null;\n service.formIndex = null;\n }\n }\n})();\n","angular.module(\"cn.forms\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"cn-forms/templates/cn-forms.html\",\"
\\n
\\n \\n
\\n \\n \\n \\n\\n
\\n \\n \\n \\n
\\n\\n \\n \\n\\n \\n
\\n Sandbox\\n\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n\\n
2\\\" class=\\\"cn-form-meta {{vm.styles.col3}}\\\">\\n \\n
\\n
\\n
\\n
\\n
\\n \\n\\n
\\n \\n
\\n\\n\");}]);"]} \ No newline at end of file diff --git a/src/cn-forms.directive.js b/src/cn-forms.directive.js index 733003b..7b1fbc6 100644 --- a/src/cn-forms.directive.js +++ b/src/cn-forms.directive.js @@ -198,7 +198,7 @@ function validatePage(page, noBadge) { var curForm = vm.config.formCtrl[page.key]; - if(curForm && Object.keys(curForm.$error).length > 0 ) { + if(curForm) { console.error('curForm.$error:', curForm.$error); var errors = _.chain(curForm.$error) @@ -209,10 +209,9 @@ .reject({$name: ''}) .value(); - if(errors && errors.length) { + if(errors && errors.length > 0) { page.errors = !noBadge && errors.length; - } - else { + } else { page.errors = 0; } }