diff --git a/README.md b/README.md index 8c95882..ad38240 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Drag and drop dynamic bootstrap forms with angular. ## Description -An extendable _angular_ module that allows you and/or your web users to design and render _bootstrap_ forms. +An extendable _angular_ module that allows you and/or your web users to design and render _bootstrap_ forms. Field components can be dragged from a _pallette_ onto a _canvas_ where details like _validation_ can be fine-tuned further. Developers can extend the editor by adding _custom field components_ and _validation patterns_. @@ -19,7 +19,10 @@ A full blown demonstration is available on [angular-form-gen.nullest.com](http:/ ## Dependencies -This module was build using _AngularJS_ ~1.2.21 and _Bootstrap (CSS)_ ~3.2.0. +This module was build using _AngularJS_ ~1.3.8 and _Bootstrap (CSS)_ ~3.2.0. +Requires Angular v.1.3. +With version 1.2 will fail due changes in $interpolate and ng-pattern. +* [Angular Doc - Migrating from 1.2 to 1.3 ](https://docs.angularjs.org/guide/migration) ## Installation @@ -55,10 +58,10 @@ The schema editor can be embedded in any `form` by marking a child element with ```
- +
- +
``` @@ -128,20 +131,20 @@ Any parent `form` or `ng-form` state will be updated accordantly if any of the v ```
- +
- + - + - +
``` diff --git a/bower.json b/bower.json index d239949..b442c69 100644 --- a/bower.json +++ b/bower.json @@ -9,7 +9,7 @@ "homepage": "http://angular-form-gen.nullest.com", "repository": { "type": "git", - "url": "git://github.com/McNull/angular-form-gen.git" + "url": "git://github.com/SSchaaf/angular-form-gen.git" }, "keywords": [ "angularjs", @@ -18,7 +18,7 @@ "schema", "generator" ], - "version": "0.0.2", + "version": "0.0.3", "authors": [ "Null McNull https://github.com/McNull" ], @@ -39,11 +39,11 @@ ], "dependencies": { "bootstrap": "~3.2.0", - "angular": "~1.2.21" + "angular": "~1.3.8" }, "devDependencies": { - "angular-route": "~1.2.21", - "angular-mocks": "~1.2.21", + "angular-route": "~1.3.0", + "angular-mocks": "~1.3.0", "jquery": "1.*", "respond": "~1.4.2", "html5shiv": "~3.7.2", @@ -66,5 +66,8 @@ "showdown": { "main": "compressed/showdown.js" } + }, + "resolutions": { + "angular": "~1.3.8" } } diff --git a/dist/angular-form-gen.css b/dist/angular-form-gen.css index 46f2419..91d53ed 100755 --- a/dist/angular-form-gen.css +++ b/dist/angular-form-gen.css @@ -1,5 +1,5 @@ /*! - angular-form-gen v0.0.2 + angular-form-gen v0.0.3 (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen License: MIT */ diff --git a/dist/angular-form-gen.css.map b/dist/angular-form-gen.css.map index 9739648..48b0cca 100755 --- a/dist/angular-form-gen.css.map +++ b/dist/angular-form-gen.css.map @@ -1 +1 @@ -{"version":3,"sources":["angular-form-gen-header.css","angular-form-gen.css","common/fg-dropdown-input.css","edit/edit.css","form/form.css","validation/summary.css","common/jsonify/jsonify.css","common/tabs/tabs.css","edit/canvas/canvas.css","edit/palette/palette.css","form/form-fields/form-fields.css","edit/canvas/field/field.css","edit/canvas/field/properties/properties.css","edit/canvas/field/properties/options/options.css","edit/canvas/field/properties/validation/validation.css"],"names":[],"mappings":"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","file":"angular-form-gen.css","sourcesContent":["/*!\n angular-form-gen v0.0.2\n (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen\n License: MIT\n*/\n",".fg-field-required .control-label:after {\n content: ' *';\n color: #888;\n}\n\n.fg-legend-extra {\n color: #999;\n font-weight: lighter;\n display: inline-block;\n}\n",".fg-dropdown {\n z-index: 50;\n}\n\n.fg-dropdown.open {\n position: absolute;\n}\n\n.fg-dropdown .dropdown-menu {\n position: static;\n top: 0; left: 0;\n float: none;\n max-height: 250px;\n overflow-y: auto;\n}",".form .fg-edit {\n margin-left: -15px;\n margin-right: -15px;\n}\n\n.fg-edit-canvas .fg-field, .fg-edit-palette .fg-field {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n padding: 10px;\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid #ddd;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n position: relative;\n}\n\n.fg-edit-canvas .fg-field, .fg-edit-palette .fg-field:hover {\n background-color: #f5f5f5;\n}\n\n.fg-edit-canvas-field .form-group, .fg-edit-palette .form-group {\n margin-top: 5px;\n margin-bottom: 0px;\n}\n\n.fg-field {\n min-height: 25px;\n}\n\n.fg-edit-canvas .fg-field.error {\n background-color: #f2dede;\n border-color: #b94a48;\n}\n\n.fg-field-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index:10;\n /*-moz-opacity: 0.0;*/\n /*opacity:.0;*/\n\n /* Needed by IE */\n filter: alpha(opacity=0);\n background: #FFF;\n background-color: rgba(255, 255, 255, 0.0);\n cursor: move;\n}\n\n.fg-field-overlay .btn-toolbar {\n position: absolute;\n margin: 0;\n /* display: none;*/\n top: -10px;\n}\n\n/*.fg-field:hover .btn-toolbar {\n display: block;\n}\n*/\n.fg-field-overlay .btn-toolbar-right {\n right: 5px;\n}\n\n.fg-field-overlay .btn-toolbar-left {\n left: 5px;\n}\n\n.fg-field-overlay .btn-toolbar .btn[disabled] {\n -moz-opacity: 1.0;\n opacity: 1.0;\n filter: alpha(opacity=100);\n color: #ccc;\n cursor: not-allowed;\n pointer-events: auto;\n}\n",".fg-field-inner .controls > div > .radio:first-child,\n.fg-field-inner .controls > div > .checkbox:first-child {\n padding-top: 5px;\n}\n\n.fg-form .radio, .fg-form .checkbox {\n margin-top: 0px;\n margin-bottom: 5px;\n}\n\n.form-horizontal .fg-form .radio, .form-horizontal .fg-form .checkbox {\n margin-bottom: 0px;\n}\n",".fg-validation-summary {\n\tmargin-top: 10px;\n}","/*.jsonify {*/\n /*position: relative;*/\n /*margin: 15px 0;*/\n /*padding: 39px 19px 14px;*/\n /*background-color: #fff;*/\n /*border: 1px solid #ddd;*/\n /*-webkit-border-radius: 4px;*/\n /*-moz-border-radius: 4px;*/\n /*border-radius: 4px;*/\n/*}*/\n\n/*.jsonify-label {*/\n /*position: absolute;*/\n /*top: -1px;*/\n /*left: -1px;*/\n /*padding: 3px 7px;*/\n /*font-size: 12px;*/\n /*font-weight: bold;*/\n /*background-color: #f5f5f5;*/\n /*border: 1px solid #ddd;*/\n /*color: #9da0a4;*/\n /*-webkit-border-radius: 4px 0 4px 0;*/\n /*-moz-border-radius: 4px 0 4px 0;*/\n /*border-radius: 4px 0 4px 0;*/\n/*}*/\n\n/*.jsonify-button {*/\n /*display: none;*/\n /*cursor: pointer;*/\n/*}*/\n\n/*.jsonify:hover .jsonify-button {*/\n /*display: inline-block;*/\n/*}*/\n\n.jsonify {\n margin-top: 10px;\n position: relative;\n}\n\n.jsonify .btn-toolbar-right {\n right: 5px;\n}\n.jsonify .btn-toolbar {\n position: absolute;\n margin: 0px;\n top: -10px;\n}",".fg-tabs > .nav-tabs {\n\tmargin-bottom: 0px;\n}\n\n.fg-tabs .tab-content {\n\tpadding: 10px;\n\tborder: 1px solid #ddd;\n\tborder-top: none;\n\tborder-radius: 0px 0px 4px 4px;\n}","\n.fg-edit-canvas .fg-field-properties .control-group {\n margin-bottom: 10px;\n}\n\n.fg-edit-canvas .fg-field.fg-edit-canvas-field {\n padding-top: 15px;\n padding-bottom: 15px;\n}\n\n/*.fg-edit-canvas .control-label {*/\n/*width: 130px;*/\n/*}*/\n\n/*.fg-edit-canvas .controls {*/\n/*margin-left: 150px;*/\n/*}*/\n\n.fg-edit-canvas-area {\n min-height: 340px;\n /*position: relative;*/\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n border: 1px solid #ddd;\n padding: 20px;\n}\n\n.fg-edit-canvas-area-empty {\n /*position: absolute;*/\n left: 20px;\n right: 20px;\n bottom: 20px;\n top: 20px;\n margin: 0;\n /*padding: 0;*/\n}\n\n.fg-edit-canvas-area-empty-x {\n font-size: 200px;\n line-height: 200px;\n}\n\n\n.fg-drag-placeholder {\n margin-bottom: 0;\n opacity: 0.0;\n filter: aplha(opacity(0));\n transition: height 0ms linear, opacity 0ms;\n height: 0px;\n display: none;\n}\n\n/*.fg-edit-canvas-dragging {*/\n /*background-color: teal;*/\n/*}*/\n\n.fg-edit-canvas-dragging .fg-drag-placeholder {\n display: block;\n transition: height 100ms linear, opacity 500ms, margin-bottom 100ms;\n}\n\n.fg-drag-placeholder-visible {\n\n margin-bottom: 20px;\n border-radius: 4px;\n border: dashed 1px #3a87ad;\n background-color: #d9edf7;\n height: 74px;\n opacity: 1.0;\n filter: aplha(opacity(100));\n}\n\n.fg-field-overlay-drag-top, .fg-field-overlay-drag-bottom {\n height: 50%;\n}\n\n.fg-field-properties .fg-field-not-in-cache {\n margin-left: 20px;\n margin-right: 20px;\n margin-bottom: 0px;\n}\n\n.fg-edit-canvas .fg-field.dragging {\n display: none;\n}\n\n/* Landscape phones and down */\n/*@media (max-width: 480px) {*/\n\n/**/\n/*.fg-edit-canvas .controls {*/\n/*margin-left: 0px;*/\n/*}*/\n/*}*/\n\n@media (max-width: 768px) {\n .fg-edit-canvas-area {\n /*padding-bottom: 0;*/\n min-height: inherit;\n padding: 0px;\n border: none;\n\n }\n\n .fg-edit-canvas-area-empty {\n position: static;\n margin-bottom: 20px;\n }\n}","\n/*.fg-edit-palette .controls {*/\n /*margin-left: 0;*/\n /*width: 100%;*/\n/*}*/\n\n/*.fg-edit-palette .control-label {*/\n /*float: none;*/\n /*width: 100%;*/\n /*padding-top: 0;*/\n /*text-align: left;*/\n/*}*/\n\n/*.fg-edit-palette .fg-field-inner > div {*/\n /*margin-left: 0;*/\n /*width: 100%;*/\n /*float: none;*/\n/*}*/\n\n.fg-edit-palette .form-group {\n margin: 0px;\n}\n.fg-field-drag {\n opacity: 0.8;\n}\n\n.fg-edit-palette legend {\n position: relative;\n cursor: pointer;\n}\n\n.fg-edit-palette legend .caret {\n border-top: 4px solid #999;\n}\n\n.fg-edit-palette legend:hover {\n color: #333;\n}\n\n.fg-edit-palette legend:hover .caret {\n border-top: 4px solid #333;\n}\n\n.fg-edit-palette legend .dropdown-menu {\n font-size: 14px;\n line-height: 20px;\n right: auto;\n left: auto;\n}\n\n\n/*@media (min-width: 768px) and (max-width: 979px) {*/\n /*.fg-edit-palette select,*/\n /*.fg-edit-palette input,*/\n /*.fg-edit-palette textarea {*/\n /*width: 190px;*/\n /*}*/\n\n /*.fg-edit-palette input[type=\"checkbox\"],*/\n /*.fg-edit-palette input[type=\"button\"],*/\n /*.fg-edit-palette input[type=\"radio\"] {*/\n /*width: auto;*/\n /*}*/\n/*}*/\n","\n\n\n.form .control-label, .fg-edit-palette .control-label {\n float: none;\n width: 100%;\n text-align: left;\n padding: 0;\n}\n\n.form .fg-field-inner > div, .form .fg-property-field > div, .fg-edit-palette .fg-field-inner > div {\n margin-left: 0;\n width: 100%;\n float: none;\n padding: 0;\n}\n\n",".fg-field-properties-container {\n max-height: 0;\n overflow: hidden;\n transition: 0.5s;\n}\n\n.fg-field-properties-container.visible {\n max-height: 1000px;\n}\n","/*.fg-field-properties .jsonify {\n\tmargin-left: 20px;\n\tmargin-right: 20px;\n}*/\n\n.fg-field-properties {\n position: relative;\n margin: 15px 0;\n padding-top: 10px;\n padding-left: 10px;\n padding-right: 10px;\n background-color: #fff;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n border: 1px solid #ddd;\n -webkit-touch-callout: initial;\n -webkit-user-select: initial;\n -khtml-user-select: initial;\n -moz-user-select: text;\n -ms-user-select: initial;\n user-select: initial;\n\n z-index: 20; /* above .fg-field-overlay */\n}\n\n/*.fg-field-properties form {*/\n /*margin-bottom: 0;*/\n/*}*/\n\n.table-field-options {\n\n}\n\n.table-field-options td, .table-field-options th {\n vertical-align: middle;\n padding: 5px;\n}\n\n.table-field-options td {\n border: 0;\n line-height: 30px;\n}\n\n.table-field-options th {\n}\n\n.table-field-options input[type=\"checkbox\"],\n.table-field-options input[type=\"radio\"] {\n margin-top: 0;\n}\n\n.table-field-options th.table-field-options-padding {\n width: 100%;\n}\n\n/*.fg-field-properties .control-label {*/\n/*width: 110px;*/\n/*}*/\n\n.fg-field-properties .fg-tabs {\n margin-bottom: 10px;\n}\n\n/*.fg-field-properties .fg-tabs-pane {*/\n /*margin-top: 10px;*/\n/*}*/\n\n/*.fg-field-properties .fg-tabs .tab-content {\n\tpadding-top: 20px;\n\tpadding-bottom: 10px;\n\tpadding-left: 10px;\n\tpadding-right: 10px;\n\tborder: 1px solid #ddd;\n\tborder-top: none;\n\tborder-radius: 0px 0px 4px 4px;\n}*/\n\n/*.fg-field-properties .fg-tabs .nav-tabs a {\n\tcolor: #999;\n\tfont-weight: 300;\n}\n\n.fg-field-properties .fg-tabs .nav-tabs a:hover {\n\tbackground-color: inherit;\n\tcolor: #333;\n}\n\n.fg-field-properties .fg-tabs .nav-tabs .active a {\n\tcolor: #333;\n\tfont-weight: normal;\n\tborder-bottom: 1px solid #fff !important;\n}\n*/\n@media (min-width: 480px) and (max-width: 979px) {\n\n .table-field-options input[type=\"text\"] {\n width: 130px;\n }\n}\n\n/*@media (max-width: 767px) { \n\t.table-field-options input[type=\"text\"] {\n\t\twidth: 90px;\n\t}\t\n}*/\n\n@media (max-width: 480px) {\n\n .table-field-options input[type=\"text\"] {\n width: 90px;\n }\n\n .fg-field-properties {\n padding: 10px;\n }\n\n /*.fg-field-properties form {*/\n /*margin: 0;*/\n /*}*/\n}\n\n\n\n","\n.table-field-options .form-control {\n width: auto;\n}","/*.fg-property-field-validation + .fg-property-field-validation,*/\n/*.fg-property-field-validation + div > .fg-property-field-validation {*/\n\t/*border-top: 1px solid #cccccc;*/\n\t/*padding-top: 10px;*/\n/*}*/\n\n.fg-property-field-validation {\n padding: 5px 0;\n}\n\n.fg-property-field-validation div.checkbox {\n padding-top: 0;\n}"],"sourceRoot":"../src/angular-form-gen"} \ No newline at end of file +{"version":3,"sources":["angular-form-gen-header.css","angular-form-gen.css","common\\fg-dropdown-input.css","edit\\edit.css","form\\form.css","validation\\summary.css","common\\jsonify\\jsonify.css","common\\tabs\\tabs.css","edit\\canvas\\canvas.css","edit\\palette\\palette.css","form\\form-fields\\form-fields.css","edit\\canvas\\field\\field.css","edit\\canvas\\field\\properties\\properties.css","edit\\canvas\\field\\properties\\options\\options.css","edit\\canvas\\field\\properties\\validation\\validation.css"],"names":[],"mappings":"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","file":"angular-form-gen.css","sourcesContent":["/*!\n angular-form-gen v0.0.3\n (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen\n License: MIT\n*/\n",".fg-field-required .control-label:after {\r\n content: ' *';\r\n color: #888;\r\n}\r\n\r\n.fg-legend-extra {\r\n color: #999;\r\n font-weight: lighter;\r\n display: inline-block;\r\n}\r\n",".fg-dropdown {\r\n z-index: 50;\r\n}\r\n\r\n.fg-dropdown.open {\r\n position: absolute;\r\n}\r\n\r\n.fg-dropdown .dropdown-menu {\r\n position: static;\r\n top: 0; left: 0;\r\n float: none;\r\n max-height: 250px;\r\n overflow-y: auto;\r\n}",".form .fg-edit {\r\n margin-left: -15px;\r\n margin-right: -15px;\r\n}\r\n\r\n.fg-edit-canvas .fg-field, .fg-edit-palette .fg-field {\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -khtml-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n\r\n padding: 10px;\r\n margin-bottom: 20px;\r\n background-color: #fff;\r\n border: 1px solid #ddd;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n position: relative;\r\n}\r\n\r\n.fg-edit-canvas .fg-field, .fg-edit-palette .fg-field:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.fg-edit-canvas-field .form-group, .fg-edit-palette .form-group {\r\n margin-top: 5px;\r\n margin-bottom: 0px;\r\n}\r\n\r\n.fg-field {\r\n min-height: 25px;\r\n}\r\n\r\n.fg-edit-canvas .fg-field.error {\r\n background-color: #f2dede;\r\n border-color: #b94a48;\r\n}\r\n\r\n.fg-field-overlay {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index:10;\r\n /*-moz-opacity: 0.0;*/\r\n /*opacity:.0;*/\r\n\r\n /* Needed by IE */\r\n filter: alpha(opacity=0);\r\n background: #FFF;\r\n background-color: rgba(255, 255, 255, 0.0);\r\n cursor: move;\r\n}\r\n\r\n.fg-field-overlay .btn-toolbar {\r\n position: absolute;\r\n margin: 0;\r\n /* display: none;*/\r\n top: -10px;\r\n}\r\n\r\n/*.fg-field:hover .btn-toolbar {\r\n display: block;\r\n}\r\n*/\r\n.fg-field-overlay .btn-toolbar-right {\r\n right: 5px;\r\n}\r\n\r\n.fg-field-overlay .btn-toolbar-left {\r\n left: 5px;\r\n}\r\n\r\n.fg-field-overlay .btn-toolbar .btn[disabled] {\r\n -moz-opacity: 1.0;\r\n opacity: 1.0;\r\n filter: alpha(opacity=100);\r\n color: #ccc;\r\n cursor: not-allowed;\r\n pointer-events: auto;\r\n}\r\n",".fg-field-inner .controls > div > .radio:first-child,\r\n.fg-field-inner .controls > div > .checkbox:first-child {\r\n padding-top: 5px;\r\n}\r\n\r\n.fg-form .radio, .fg-form .checkbox {\r\n margin-top: 0px;\r\n margin-bottom: 5px;\r\n}\r\n\r\n.form-horizontal .fg-form .radio, .form-horizontal .fg-form .checkbox {\r\n margin-bottom: 0px;\r\n}\r\n",".fg-validation-summary {\r\n\tmargin-top: 10px;\r\n}","/*.jsonify {*/\r\n /*position: relative;*/\r\n /*margin: 15px 0;*/\r\n /*padding: 39px 19px 14px;*/\r\n /*background-color: #fff;*/\r\n /*border: 1px solid #ddd;*/\r\n /*-webkit-border-radius: 4px;*/\r\n /*-moz-border-radius: 4px;*/\r\n /*border-radius: 4px;*/\r\n/*}*/\r\n\r\n/*.jsonify-label {*/\r\n /*position: absolute;*/\r\n /*top: -1px;*/\r\n /*left: -1px;*/\r\n /*padding: 3px 7px;*/\r\n /*font-size: 12px;*/\r\n /*font-weight: bold;*/\r\n /*background-color: #f5f5f5;*/\r\n /*border: 1px solid #ddd;*/\r\n /*color: #9da0a4;*/\r\n /*-webkit-border-radius: 4px 0 4px 0;*/\r\n /*-moz-border-radius: 4px 0 4px 0;*/\r\n /*border-radius: 4px 0 4px 0;*/\r\n/*}*/\r\n\r\n/*.jsonify-button {*/\r\n /*display: none;*/\r\n /*cursor: pointer;*/\r\n/*}*/\r\n\r\n/*.jsonify:hover .jsonify-button {*/\r\n /*display: inline-block;*/\r\n/*}*/\r\n\r\n.jsonify {\r\n margin-top: 10px;\r\n position: relative;\r\n}\r\n\r\n.jsonify .btn-toolbar-right {\r\n right: 5px;\r\n}\r\n.jsonify .btn-toolbar {\r\n position: absolute;\r\n margin: 0px;\r\n top: -10px;\r\n}",".fg-tabs > .nav-tabs {\r\n\tmargin-bottom: 0px;\r\n}\r\n\r\n.fg-tabs .tab-content {\r\n\tpadding: 10px;\r\n\tborder: 1px solid #ddd;\r\n\tborder-top: none;\r\n\tborder-radius: 0px 0px 4px 4px;\r\n}","\r\n.fg-edit-canvas .fg-field-properties .control-group {\r\n margin-bottom: 10px;\r\n}\r\n\r\n.fg-edit-canvas .fg-field.fg-edit-canvas-field {\r\n padding-top: 15px;\r\n padding-bottom: 15px;\r\n}\r\n\r\n/*.fg-edit-canvas .control-label {*/\r\n/*width: 130px;*/\r\n/*}*/\r\n\r\n/*.fg-edit-canvas .controls {*/\r\n/*margin-left: 150px;*/\r\n/*}*/\r\n\r\n.fg-edit-canvas-area {\r\n min-height: 340px;\r\n /*position: relative;*/\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n border: 1px solid #ddd;\r\n padding: 20px;\r\n}\r\n\r\n.fg-edit-canvas-area-empty {\r\n /*position: absolute;*/\r\n left: 20px;\r\n right: 20px;\r\n bottom: 20px;\r\n top: 20px;\r\n margin: 0;\r\n /*padding: 0;*/\r\n}\r\n\r\n.fg-edit-canvas-area-empty-x {\r\n font-size: 200px;\r\n line-height: 200px;\r\n}\r\n\r\n\r\n.fg-drag-placeholder {\r\n margin-bottom: 0;\r\n opacity: 0.0;\r\n filter: aplha(opacity(0));\r\n transition: height 0ms linear, opacity 0ms;\r\n height: 0px;\r\n display: none;\r\n}\r\n\r\n/*.fg-edit-canvas-dragging {*/\r\n /*background-color: teal;*/\r\n/*}*/\r\n\r\n.fg-edit-canvas-dragging .fg-drag-placeholder {\r\n display: block;\r\n transition: height 100ms linear, opacity 500ms, margin-bottom 100ms;\r\n}\r\n\r\n.fg-drag-placeholder-visible {\r\n\r\n margin-bottom: 20px;\r\n border-radius: 4px;\r\n border: dashed 1px #3a87ad;\r\n background-color: #d9edf7;\r\n height: 74px;\r\n opacity: 1.0;\r\n filter: aplha(opacity(100));\r\n}\r\n\r\n.fg-field-overlay-drag-top, .fg-field-overlay-drag-bottom {\r\n height: 50%;\r\n}\r\n\r\n.fg-field-properties .fg-field-not-in-cache {\r\n margin-left: 20px;\r\n margin-right: 20px;\r\n margin-bottom: 0px;\r\n}\r\n\r\n.fg-edit-canvas .fg-field.dragging {\r\n display: none;\r\n}\r\n\r\n/* Landscape phones and down */\r\n/*@media (max-width: 480px) {*/\r\n\r\n/**/\r\n/*.fg-edit-canvas .controls {*/\r\n/*margin-left: 0px;*/\r\n/*}*/\r\n/*}*/\r\n\r\n@media (max-width: 768px) {\r\n .fg-edit-canvas-area {\r\n /*padding-bottom: 0;*/\r\n min-height: inherit;\r\n padding: 0px;\r\n border: none;\r\n\r\n }\r\n\r\n .fg-edit-canvas-area-empty {\r\n position: static;\r\n margin-bottom: 20px;\r\n }\r\n}","\r\n/*.fg-edit-palette .controls {*/\r\n /*margin-left: 0;*/\r\n /*width: 100%;*/\r\n/*}*/\r\n\r\n/*.fg-edit-palette .control-label {*/\r\n /*float: none;*/\r\n /*width: 100%;*/\r\n /*padding-top: 0;*/\r\n /*text-align: left;*/\r\n/*}*/\r\n\r\n/*.fg-edit-palette .fg-field-inner > div {*/\r\n /*margin-left: 0;*/\r\n /*width: 100%;*/\r\n /*float: none;*/\r\n/*}*/\r\n\r\n.fg-edit-palette .form-group {\r\n margin: 0px;\r\n}\r\n.fg-field-drag {\r\n opacity: 0.8;\r\n}\r\n\r\n.fg-edit-palette legend {\r\n position: relative;\r\n cursor: pointer;\r\n}\r\n\r\n.fg-edit-palette legend .caret {\r\n border-top: 4px solid #999;\r\n}\r\n\r\n.fg-edit-palette legend:hover {\r\n color: #333;\r\n}\r\n\r\n.fg-edit-palette legend:hover .caret {\r\n border-top: 4px solid #333;\r\n}\r\n\r\n.fg-edit-palette legend .dropdown-menu {\r\n font-size: 14px;\r\n line-height: 20px;\r\n right: auto;\r\n left: auto;\r\n}\r\n\r\n\r\n/*@media (min-width: 768px) and (max-width: 979px) {*/\r\n /*.fg-edit-palette select,*/\r\n /*.fg-edit-palette input,*/\r\n /*.fg-edit-palette textarea {*/\r\n /*width: 190px;*/\r\n /*}*/\r\n\r\n /*.fg-edit-palette input[type=\"checkbox\"],*/\r\n /*.fg-edit-palette input[type=\"button\"],*/\r\n /*.fg-edit-palette input[type=\"radio\"] {*/\r\n /*width: auto;*/\r\n /*}*/\r\n/*}*/\r\n","\r\n\r\n\r\n.form .control-label, .fg-edit-palette .control-label {\r\n float: none;\r\n width: 100%;\r\n text-align: left;\r\n padding: 0;\r\n}\r\n\r\n.form .fg-field-inner > div, .form .fg-property-field > div, .fg-edit-palette .fg-field-inner > div {\r\n margin-left: 0;\r\n width: 100%;\r\n float: none;\r\n padding: 0;\r\n}\r\n\r\n",".fg-field-properties-container {\r\n max-height: 0;\r\n overflow: hidden;\r\n transition: 0.5s;\r\n}\r\n\r\n.fg-field-properties-container.visible {\r\n max-height: 1000px;\r\n}\r\n","/*.fg-field-properties .jsonify {\r\n\tmargin-left: 20px;\r\n\tmargin-right: 20px;\r\n}*/\r\n\r\n.fg-field-properties {\r\n position: relative;\r\n margin: 15px 0;\r\n padding-top: 10px;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n background-color: #fff;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n border: 1px solid #ddd;\r\n -webkit-touch-callout: initial;\r\n -webkit-user-select: initial;\r\n -khtml-user-select: initial;\r\n -moz-user-select: text;\r\n -ms-user-select: initial;\r\n user-select: initial;\r\n\r\n z-index: 20; /* above .fg-field-overlay */\r\n}\r\n\r\n/*.fg-field-properties form {*/\r\n /*margin-bottom: 0;*/\r\n/*}*/\r\n\r\n.table-field-options {\r\n\r\n}\r\n\r\n.table-field-options td, .table-field-options th {\r\n vertical-align: middle;\r\n padding: 5px;\r\n}\r\n\r\n.table-field-options td {\r\n border: 0;\r\n line-height: 30px;\r\n}\r\n\r\n.table-field-options th {\r\n}\r\n\r\n.table-field-options input[type=\"checkbox\"],\r\n.table-field-options input[type=\"radio\"] {\r\n margin-top: 0;\r\n}\r\n\r\n.table-field-options th.table-field-options-padding {\r\n width: 100%;\r\n}\r\n\r\n/*.fg-field-properties .control-label {*/\r\n/*width: 110px;*/\r\n/*}*/\r\n\r\n.fg-field-properties .fg-tabs {\r\n margin-bottom: 10px;\r\n}\r\n\r\n/*.fg-field-properties .fg-tabs-pane {*/\r\n /*margin-top: 10px;*/\r\n/*}*/\r\n\r\n/*.fg-field-properties .fg-tabs .tab-content {\r\n\tpadding-top: 20px;\r\n\tpadding-bottom: 10px;\r\n\tpadding-left: 10px;\r\n\tpadding-right: 10px;\r\n\tborder: 1px solid #ddd;\r\n\tborder-top: none;\r\n\tborder-radius: 0px 0px 4px 4px;\r\n}*/\r\n\r\n/*.fg-field-properties .fg-tabs .nav-tabs a {\r\n\tcolor: #999;\r\n\tfont-weight: 300;\r\n}\r\n\r\n.fg-field-properties .fg-tabs .nav-tabs a:hover {\r\n\tbackground-color: inherit;\r\n\tcolor: #333;\r\n}\r\n\r\n.fg-field-properties .fg-tabs .nav-tabs .active a {\r\n\tcolor: #333;\r\n\tfont-weight: normal;\r\n\tborder-bottom: 1px solid #fff !important;\r\n}\r\n*/\r\n@media (min-width: 480px) and (max-width: 979px) {\r\n\r\n .table-field-options input[type=\"text\"] {\r\n width: 130px;\r\n }\r\n}\r\n\r\n/*@media (max-width: 767px) { \r\n\t.table-field-options input[type=\"text\"] {\r\n\t\twidth: 90px;\r\n\t}\t\r\n}*/\r\n\r\n@media (max-width: 480px) {\r\n\r\n .table-field-options input[type=\"text\"] {\r\n width: 90px;\r\n }\r\n\r\n .fg-field-properties {\r\n padding: 10px;\r\n }\r\n\r\n /*.fg-field-properties form {*/\r\n /*margin: 0;*/\r\n /*}*/\r\n}\r\n\r\n\r\n\r\n","\r\n.table-field-options .form-control {\r\n width: auto;\r\n}","/*.fg-property-field-validation + .fg-property-field-validation,*/\r\n/*.fg-property-field-validation + div > .fg-property-field-validation {*/\r\n\t/*border-top: 1px solid #cccccc;*/\r\n\t/*padding-top: 10px;*/\r\n/*}*/\r\n\r\n.fg-property-field-validation {\r\n padding: 5px 0;\r\n}\r\n\r\n.fg-property-field-validation div.checkbox {\r\n padding-top: 0;\r\n}"],"sourceRoot":"../src/angular-form-gen"} \ No newline at end of file diff --git a/dist/angular-form-gen.js b/dist/angular-form-gen.js index 6009b5b..ec2496b 100755 --- a/dist/angular-form-gen.js +++ b/dist/angular-form-gen.js @@ -1,5 +1,5 @@ /*! - angular-form-gen v0.0.1 + angular-form-gen v0.0.3 (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen License: MIT */ @@ -295,30 +295,30 @@ angular.module('fg').run(['$templateCache', function($templateCache){ $templateCache.put('angular-form-gen/edit/palette/palette.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/default/checkbox.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/default/checkboxlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/default/dropdownlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/default/email.ng.html', ''); + $templateCache.put('angular-form-gen/field-templates/default/dropdownlist.ng.html', '
'); + $templateCache.put('angular-form-gen/field-templates/default/email.ng.html', ''); $templateCache.put('angular-form-gen/field-templates/default/not-in-cache.ng.html', '

No template registered in cache for field type \"{{ field.type }}\".

'); - $templateCache.put('angular-form-gen/field-templates/default/number.ng.html', ''); - $templateCache.put('angular-form-gen/field-templates/default/password.ng.html', ''); + $templateCache.put('angular-form-gen/field-templates/default/number.ng.html', ''); + $templateCache.put('angular-form-gen/field-templates/default/password.ng.html', ''); $templateCache.put('angular-form-gen/field-templates/default/radiobuttonlist.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/default/selectlist.ng.html', ''); - $templateCache.put('angular-form-gen/field-templates/default/text.ng.html', ''); - $templateCache.put('angular-form-gen/field-templates/default/textarea.ng.html', ''); $templateCache.put('angular-form-gen/field-templates/properties/checkbox.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/properties/checkboxlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/dropdownlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/email.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/number.ng.html', '
= 0\">
= 0\">
'); + $templateCache.put('angular-form-gen/field-templates/properties/dropdownlist.ng.html', '
'); + $templateCache.put('angular-form-gen/field-templates/properties/email.ng.html', '
'); + $templateCache.put('angular-form-gen/field-templates/properties/number.ng.html', '
= 0\">
= 0\">
'); $templateCache.put('angular-form-gen/field-templates/properties/password.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/properties/radiobuttonlist.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/properties/selectlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/text.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/textarea.ng.html', '
'); $templateCache.put('angular-form-gen/form/field/field.ng.html', '
'); $templateCache.put('angular-form-gen/form/form-fields/form-fields.ng.html', '
'); - $templateCache.put('angular-form-gen/edit/canvas/field/field.ng.html', '
'); + $templateCache.put('angular-form-gen/edit/canvas/field/field.ng.html', '
'); $templateCache.put('angular-form-gen/edit/palette/categories/categories.ng.html', 'Palette - {{ categoryName || \'All field types\' }} '); $templateCache.put('angular-form-gen/edit/canvas/field/properties/properties.ng.html', '
'); $templateCache.put('angular-form-gen/edit/canvas/field/properties/options/options.ng.html', '

No options defined

Click here to add a new option definition to this field.

0\" class=\"table-field-options\">
ValueText
'); @@ -332,14 +332,14 @@ fg.directive('fgBindExpression', ["$interpolate", function ($interpolate) { function buildWatchExpression(interpolateFn) { var sb = []; - var parts = interpolateFn.parts; - var ii = parts.length; + var expressions = interpolateFn.expressions; + var ii = expressions.length; while (ii--) { - var part = parts[ii]; + var expression = expressions[ii]; - if (part.exp && !part.exp.match(/^\s*$/)) { - sb.push(part.exp); + if (expression.exp && !expression.exp.match(/^\s*$/)) { + sb.push(expression.exp); } } @@ -627,9 +627,9 @@ fg.directive('fgInputNumber', function() { return { require: 'ngModel', link: function(scope, element, attr, ctrl) { - + ctrl.$parsers.push(function(inputValue) { - // this next if is necessary for when using ng-required on your input. + // this next if is necessary for when using ng-required on your input. // In such cases, when a letter is typed first, this parser will be called // again, and the 2nd time, the value will be undefined if (inputValue == undefined) { @@ -662,7 +662,7 @@ fg.directive('fgInputNumber', function() { }); ctrl.$formatters.push(function(value) { - return ctrl.$isEmpty(value) ? undefined : value; + return ctrl.$isEmpty(value) ? undefined : value.toString(); }); if (attr.min) { @@ -1176,9 +1176,9 @@ fg.controller('fgEditController', ["$scope", "fgUtils", "$location", function ($ // Seems that this watch is sometimes fired after the scope has been destroyed(?) if (schema) { -// schema.$_invalid = self.metaForm ? self.metaForm.$invalid : false; +// schema.$$_invalid = self.metaForm ? self.metaForm.$invalid : false; // -// if (!schema.$_invalid) { +// if (!schema.$$_invalid) { var fields = schema.fields; @@ -1186,8 +1186,8 @@ fg.controller('fgEditController', ["$scope", "fgUtils", "$location", function ($ var i = fields.length; - while (--i >= 0 && !schema.$_invalid) { - schema.$_invalid = fields[i].$_invalid; + while (--i >= 0 && !schema.$$_invalid) { + schema.$$_invalid = fields[i].$$_invalid; } } } @@ -1431,32 +1431,6 @@ fg.directive('fgUniqueFieldName', function () { }; }); -fg.filter('j$on',function () { - return function (input, displayHidden) { - - if(displayHidden) - return JSON.stringify(input || {}, null, ' '); - - return angular.toJson(input || {}, true); - }; -}).directive('jsonify', ["$window", "$filter", function ($window, $filter) { - return { - templateUrl: 'angular-form-gen/common/jsonify/jsonify.ng.html', - replace: true, - scope: { - jsonify: "=", - displayHidden: "@jsonifyDisplayHidden" - }, - link: function($scope, $element, $attrs, ctrls) { - $scope.expression = $attrs.jsonify; - - $scope.copy = function() { - $window.prompt ("Copy to clipboard: Ctrl+C, Enter", $filter('j$on')($scope.jsonify, $scope.displayHidden)); - }; - } - }; - }]); - fg.controller('fgTabsController', function () { this.items = []; @@ -1532,6 +1506,43 @@ fg.directive('fgTabsPane', ["fgTabsPaneLinkFn", function(fgTabsPaneLinkFn) { }; }); +function fgToJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$') { + val = undefined; + } + return val; +} + +fg.filter('j$on',function () { + return function (input, displayHidden) { + + if(displayHidden) + return JSON.stringify(input || {}, null, ' '); + + //https://github.com/angular/angular.js/commit/c054288c9722875e3595e6e6162193e0fb67a251#diff-1d54c5f722aebc473dbe96f836ddf974R995 + //return angular.toJson(input || {}, true); + return JSON.stringify(input || {}, fgToJsonReplacer, ' '); + }; +}).directive('jsonify', ["$window", "$filter", function ($window, $filter) { + return { + templateUrl: 'angular-form-gen/common/jsonify/jsonify.ng.html', + replace: true, + scope: { + jsonify: "=", + displayHidden: "@jsonifyDisplayHidden" + }, + link: function($scope, $element, $attrs, ctrls) { + $scope.expression = $attrs.jsonify; + + $scope.copy = function() { + $window.prompt ("Copy to clipboard: Ctrl+C, Enter", $filter('j$on')($scope.jsonify, $scope.displayHidden)); + }; + } + }; + }]); + fg.controller('fgEditCanvasController', ["$scope", "dqUtils", "$timeout", "fgUtils", function ($scope, dqUtils, $timeout, fgUtils) { $scope.dragPlaceholder = { @@ -1846,20 +1857,50 @@ fg.directive('fgField', ["fgFieldLinkFn", function(fgFieldLinkFn) { // }; //}); -fg.directive('fgFieldInput', ["fgFieldInputLinkFn", function(fgFieldInputLinkFn) { +fg.directive('fgFieldInput', ["fgFieldInputLinkFn", function (fgFieldInputLinkFn) { return { require: ['^fgField', 'ngModel'], link: fgFieldInputLinkFn }; -}]).factory('fgFieldInputLinkFn', function() { - return function($scope, $element, $attrs, ctrls) { +}]).factory('fgFieldInputLinkFn', function () { + return function ($scope, $element, $attrs, ctrls) { var fgFieldCtrl = ctrls[0]; var ngModelCtrl = ctrls[1]; fgFieldCtrl.setFieldState(ngModelCtrl); }; +}).factory('fgUpdatePattern', function () { + //SSchaaf http://stackoverflow.com/questions/20847979/ngpattern-binding-not-working + //Angular migration https://docs.angularjs.org/guide/migration + return { + require: "^ngModel", + link: function (scope, element, attrs, ctrl) { + scope.$watch(function () { + // Evaluate the ngPattern attribute against the current scope + alert("attrs.ngPattern", attrs.ngPattern); + return scope.$eval(attrs.ngPattern); + }, + function (newval, oldval) { + //Get the value from `ngModel` + alert("newval", newval); + alert("oldval", oldval); + value = ctrl.$viewValue; + + // And set validity on the model to true if the element + // is empty or passes the regex test + if (ctrl.$isEmpty(value) || newval.test(value)) { + ctrl.$setValidity('pattern', true); + return value; + } else { + ctrl.$setValidity('pattern', false); + return undefined; + } + }); + } + } }); + fg.directive('fgFormFields', function() { return { @@ -2011,7 +2052,7 @@ fg.directive('fgEditCanvasFieldProperties', ["fgUtils", function (fgUtils) { post: function ($scope) { $scope.$watch('fieldPropertiesForm.$invalid', function (newValue) { - $scope.field.$_invalid = newValue; + $scope.field.$$_invalid = newValue; }); $scope.renderInfo = fgUtils.getRenderInfo($scope.field); diff --git a/dist/angular-form-gen.js.map b/dist/angular-form-gen.js.map index a7cc776..a771d3e 100755 --- a/dist/angular-form-gen.js.map +++ b/dist/angular-form-gen.js.map @@ -1 +1 @@ -{"version":3,"sources":["angular-form-gen-header.js","angular-form-gen.js","angular-form-gen-templates.js","common/bind-expression.js","common/fg-dropdown-input-directive.js","common/fg-null-form.js","common/fg-number-input-directive.js","common/fg-placeholder-directive.js","common/fg-utils.js","drag/angular-drag-queen.js","drag/dq-drag-area.js","drag/dq-drag-track.js","drag/dq-draggable.js","edit/edit-controller.js","edit/edit-directive.js","form/form-controller.js","form/form-directive.js","validation/summary-directive.js","validation/unique-field-name.js","common/jsonify/jsonify.js","common/tabs/tabs-controller.js","common/tabs/tabs-directive.js","common/tabs/tabs-pane-directive.js","edit/canvas/canvas-controller.js","edit/canvas/canvas-directive.js","edit/palette/palette-controller.js","edit/palette/palette-directive.js","form/field/field-controller.js","form/field/field-directive.js","form/field/field-focus-directive.js","form/field/field-input-directive.js","form/form-fields/form-fields-directive.js","form/schema/schema-controller.js","form/schema/schema-directive.js","edit/canvas/field/field-directive.js","edit/palette/categories/categories-controller.js","edit/palette/categories/categories-directive.js","edit/canvas/field/properties/properties-directive.js","edit/canvas/field/properties/options/options-controller.js","edit/canvas/field/properties/options/options-directive.js","edit/canvas/field/properties/property-field/common-directive.js","edit/canvas/field/properties/property-field/field-value-directive.js","edit/canvas/field/properties/property-field/property-field-directive.js","edit/canvas/field/properties/validation/parse-pattern-directive.js","edit/canvas/field/properties/validation/validation-directive.js","edit/canvas/field/properties/validation/validation-message-directive.js","angular-form-gen-footer.js"],"names":[],"mappings":"AAAA;GACA;GACA;GACA;AACA;AACA;;ACLA;;AAEA;CACA;CACA;CACA;CACA;AACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;AACA;;AAEA,UAAA,aAAA;;EAEA,mBAAA,QAAA;;IAEA;MACA;MACA;QACA;QACA;MACA;MACA;QACA;QACA;QACA;MACA;IACA;;IAEA;;IAEA;MACA;;MAEA;QACA;UACA;QACA;MACA;;MAEA;IACA;;IAEA;MACA;QACA;MACA;MACA;QACA;;UAEA;YACA;UACA;;UAEA;;UAEA;YACA;UACA;YACA;UACA;;UAEA;UACA;QACA;QACA;UACA;;UAEA;YACA;UACA;;UAEA;UACA;QACA;QACA;UACA;YACA;YACA;UACA;QACA;QACA;UACA;YACA;UACA;;UAEA;YACA;UACA;;UAEA;YACA;cACA;YACA;;YAEA;UACA;QACA;MACA;MACA;QACA;;UAEA;;UAEA;;YAEA;cACA;YACA;;YAEA;UACA;YACA;UACA;QACA;QACA;;UAEA;YACA;UACA;YACA;UACA;QACA;MACA;MACA;QACA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;;AAEA,UAAA,gCAAA;;EAEA;EACA;EACA;;EAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;MACA;QACA;MACA;MACA;MACA;QACA;MACA;MACA;MACA;IACA;IACA;MACA;MACA;QACA;QACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;QACA;QACA;UACA;UACA;QACA;MACA;IACA;IACA;MACA;QACA;QACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;QACA;QACA;MACA;MACA;QACA;QACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;QACA;QACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACA;EACA;;;EAGA;IACA;MACA;IACA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA;;ACnRA;AACA;AACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;AC7CA,cAAA,gBAAA,GAAA,iBAAA;;EAEA;IACA;IACA;IACA;;IAEA;MACA;;MAEA;QACA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;MACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;QACA;;QAEA;;QAEA;;QAEA;;UAEA;;UAEA;;UAEA;YACA;UACA;QACA;UACA;QACA;MACA;IACA;EACA;AACA,CAAA,CAAA;;AC1DA,cAAA,eAAA,GAAA,2DAAA;;EAEA;;IAEA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEA;IACA;;IAEA;;IAEA;;IAEA;MACA;QACA;MACA;IACA;;IAEA;IACA;;IAEA;AACA;MACA;IACA;;AAEA;AACA;AACA;AACA;AACA;;IAEA;MACA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;IACA;;IAEA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEA;;IAEA;;MAEA;;MAEA;;MAEA;;MAEA;;MAEA;QACA;QACA;;QAEA;UACA;QACA;MACA;;;MAGA;;MAEA;MACA;;MAEA;QACA;QACA;;QAEA;UACA;QACA;MACA;;MAEA;QACA;QACA;;QAEA;QACA;;MAEA;QACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;;IAEA;MACA;;QAEA;QACA;;QAEA;UACA;UACA;UACA;QACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;IACA;IACA;IACA;IACA;;MAEA;;QAEA;;QAEA;QACA;;QAEA;QACA;;QAEA;;QAEA;QACA;;QAEA;;QAEA;;QAEA;;QAEA;MACA;IACA;EACA;AACA,CAAA,CAAA;;AC5KA;CACA;CACA;AACA,cAAA,UAAA;;EAEA;IACA;IACA;IACA;IACA;IACA;EACA;;EAEA;IACA;IACA;IACA;;MAEA;;MAEA;;MAEA;;MAEA;;QAEA;;QAEA;MACA;;MAEA;;MAEA;IACA;EACA;AACA;;AAEA,cAAA,oBAAA;;EAEA;IACA;IACA;IACA;;MAEA;;MAEA;;MAEA;;QAEA;UACA;QACA;;QAEA;MACA;IACA;EACA;;AAEA;AC5DA,cAAA,aAAA;EACA;IACA;IACA;;MAEA;QACA;QACA;QACA;QACA;UACA;QACA;;QAEA;;QAEA;QACA;;QAEA;UACA;UACA;QACA;;QAEA;;MAEA;;MAEA;QACA;QACA;UACA;UACA;QACA;UACA;UACA;QACA;MACA;;MAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;YACA;YACA;UACA;YACA;YACA;UACA;QACA;;QAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;YACA;YACA;UACA;YACA;YACA;UACA;QACA;;QAEA;QACA;MACA;;MAEA;;QAEA;UACA;UACA;QACA;UACA;UACA;QACA;MACA;IACA;EACA;AACA;;ACtFA,cAAA,aAAA;EACA;IACA;IACA;GACA;EACA;IACA;MACA;QACA;MACA;IACA;EACA;AACA;ACZA,YAAA,OAAA,GAAA,0CAAA;;IAEA;;IAEA;MACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;;QAEA;QACA;;QAEA;;QAEA;UACA;UACA;QACA;UACA;UACA;UACA;QACA;;QAEA;MACA;MACA;MACA;QACA;QACA;;QAEA;UACA;UACA;UACA;QACA;;QAEA;UACA;QACA;;QAEA;UACA;QACA;;QAEA;MACA;MACA;QACA;MACA;MACA;;QAEA;;QAEA;QACA;QACA;QACA;;QAEA;;QAEA;;UAEA;UACA;;UAEA;YACA;UACA;YACA;UACA;QACA;;QAEA;MACA;MACA;QACA;MACA;MACA;QACA;QACA;QACA;MACA;MACA;QACA;;QAEA;UACA;QACA;;QAEA;UACA;YACA;YACA;cACA;YACA;YACA;cACA;YACA;UACA;QACA;;QAEA;MACA;IACA;EACA,CAAA,CAAA;ACjHA,kCAAA,OAAA,GAAA,0BAAA;;EAEA;;EAEA;EACA;IACA;MACA;IACA;IACA;MACA;MACA;MACA;MACA;;MAEA;MACA;MACA;;MAEA;IACA;IACA;MACA;QACA;MACA;MACA;IACA;IACA;MACA;MACA;MACA;IACA;IACA;MACA;MACA;;MAEA;IACA;EACA;AACA,CAAA,CAAA;ACvCA,gCAAA,UAAA,GAAA,YAAA;;EAEA;IACA;MACA;IACA;EACA;;EAEA;IACA;IACA;;MAEA;;MAEA;QACA;MACA;;MAEA;QACA;MACA;;MAEA;QACA;QACA;MACA;IACA;EACA;AACA,CAAA,CAAA;;AC5BA,gCAAA,WAAA,EAAA,gBAAA;EACA;IACA;EACA;AACA,CAAA,CAAA,aAAA,WAAA,EAAA,gBAAA;IACA;MACA;IACA;EACA,CAAA,CAAA,aAAA,UAAA,EAAA,gBAAA;IACA;MACA;IACA;EACA,CAAA,CAAA,aAAA,MAAA,EAAA,gBAAA;IACA;MACA;IACA;EACA,CAAA,CAAA,WAAA,WAAA,GAAA,yBAAA;;IAEA;;IAEA;;MAEA;;MAEA;;QAEA;QACA;QACA;QACA;QACA;;QAEA;;QAEA;UACA;;UAEA;;UAEA;;UAEA;;YAEA;;YAEA;;cAEA;;cAEA;YACA;UACA;;UAEA;;UAEA;;UAEA;UACA;;UAEA;;UAEA;;UAEA;;UAEA;QACA;;QAEA;UACA;UACA;UACA;YACA;cACA;gBACA;cACA;YACA;cACA;YACA;UACA;QACA;;QAEA;UACA;UACA;QACA;;QAEA;UACA;UACA;QACA;;QAEA;UACA;YACA;YACA;UACA;QACA;;QAEA;UACA;YACA;YACA;YACA;cACA;gBACA;cACA;YACA;UACA;QACA;;QAEA;UACA;;YAEA;YACA;;YAEA;YACA;;YAEA;YACA;UACA;QACA;;QAEA;QACA;;UAEA;;YAEA;;YAEA;YACA;;YAEA;cACA;gBACA;cACA;YACA;;YAEA;;YAEA;;YAEA;;cAEA;cACA;cACA;;cAEA;cACA;YACA;UACA;QACA;;QAEA;QACA;;UAEA;;UAEA;YACA;;YAEA;cACA;YACA;UACA;;UAEA;QACA;;QAEA;;QAEA;MACA;IACA;;EAEA,CAAA,CAAA;;ACpLA,gCAAA,WAAA,GAAA,0BAAA;;EAEA;IACA;MACA;;MAEA;QACA;QACA;MACA;;MAEA;;MAEA;IACA;EACA;;EAEA;IACA;IACA;;MAEA;MACA;;MAEA;QACA;QACA;MACA;;MAEA;;QAEA;;QAEA;UACA;UACA;UACA;QACA;MACA;;UAEA;;UAEA;YACA;UACA;;UAEA;UACA;UACA;;UAEA;YACA;UACA;;QAEA;;UAEA;YACA;UACA;;QAEA;IACA;EACA;;AAEA,CAAA,CAAA;AChEA,eAAA,gBAAA,GAAA,mCAAA;;EAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;EAEA;;IAEA;;IAEA;;IAEA;AACA;AACA;AACA;;MAEA;;MAEA;;QAEA;;QAEA;UACA;QACA;MACA;IACA;;EAEA;;AAEA,CAAA,CAAA;ACvCA,cAAA,MAAA;EACA;IACA;IACA;IACA;IACA;MACA;MACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACA;IACA;IACA,aAAA,4BAAA;IACA;IACA;;MAEA;QACA;MACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;MAEA;MACA;IACA;EACA;AACA;ACtCA,eAAA,gBAAA,GAAA,qBAAA;;EAEA;EACA;;EAEA;IACA;;IAEA;;IAEA;IACA;;IAEA;MACA;QACA;;QAEA;UACA;QACA;MACA;;MAEA;IACA;;IAEA;MACA;IACA;MACA;QACA;MACA;QACA;MACA;IACA;;IAEA;;;IAGA;EACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,CAAA,CAAA;;AC/CA,cAAA,MAAA,GAAA,oBAAA;EACA;IACA;IACA;IACA,aAAA,gBAAA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,YAAA;IACA;;MAEA;MACA;MACA;;MAEA;;MAEA;;IAEA;AACA,YAAA,eAAA,GAAA,iBAAA;EACA;;IAEA;;IAEA;;IAEA;MACA;MACA;IACA;;IAEA;EACA;AACA,CAAA,CAAA;;;AClCA,cAAA,mBAAA,GAAA,8BAAA;;EAEA;IACA;IACA;IACA;MACA;MACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,yBAAA,GAAA,aAAA;;EAEA;;IAEA;IACA;;IAEA;MACA;MACA;MACA;;IAEA;;MAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;QACA;MACA;IACA;;IAEA;IACA;;IAEA;MACA;QACA;UACA;QACA;MACA;IACA;;IAEA;EACA;;AAEA,CAAA,CAAA;ACnDA,cAAA,iBAAA;;EAEA;;EAEA;;IAEA;IACA;IACA;;IAEA;;MAEA;;MAEA;QACA;QACA;UACA;UACA;QACA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;IACA;IACA;;MAEA;MACA;;MAEA;;MAEA;QACA;MACA;;MAEA;;QAEA;QACA;;QAEA;MACA;;MAEA;;QAEA;QACA;;QAEA;MACA;IACA;EACA;AACA;;ACzDA,WAAA,IAAA;EACA;;IAEA;MACA;;IAEA;EACA;AACA,cAAA,OAAA,GAAA,uBAAA;IACA;MACA;MACA;MACA;QACA;QACA;MACA;MACA;QACA;;QAEA;UACA;QACA;MACA;IACA;EACA,CAAA,CAAA;;ACxBA,eAAA,gBAAA;;EAEA;EACA;;EAEA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;EACA;;EAEA;;IAEA;MACA;IACA;;EAEA;;AAEA;;ACzBA,cAAA,MAAA;EACA;IACA;IACA;IACA;IACA,aAAA,gBAAA;IACA;IACA;MACA;IACA;IACA;MACA;IACA;EACA;AACA;;;;;ACdA,cAAA,UAAA,GAAA,qBAAA;EACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,gBAAA;EACA;;IAEA;;IAEA;MACA;MACA;MACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;AACA;;AC3BA,eAAA,sBAAA,GAAA,6CAAA;;EAEA;IACA;IACA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;EACA;;EAEA;IACA;EACA;;EAEA;AACA;IACA;IACA;EACA;;EAEA;IACA;EACA;;EAEA;;IAEA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;MACA;AACA;IACA;;EAEA;;EAEA;;IAEA;;IAEA;;MAEA;MACA;MACA;MACA;;MAEA;QACA;;MAEA;QACA;;QAEA;QACA;MACA;;MAEA;MACA;IACA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;AC/EA,cAAA,YAAA;;EAEA;IACA;IACA;IACA,aAAA,oCAAA;IACA;MACA;MACA;MACA;;MAEA;;MAEA;;QAEA;;QAEA;UACA;QACA;;QAEA;;MAEA;IACA;EACA;AACA;;AC1BA,eAAA,uBAAA,GAAA,uBAAA;;EAEA;;EAEA;;EAEA;IACA;EACA;;AAEA,CAAA,CAAA;ACVA,cAAA,aAAA;EACA;IACA;IACA;IACA,aAAA,uBAAA;IACA;MACA;IACA;EACA;AACA;ACTA,eAAA,iBAAA,GAAA,sBAAA;;EAEA;EACA;;EAEA;;IAEA;IACA;IACA;;IAEA;IACA;;EAEA;;EAEA;IACA;;IAEA;EACA;;EAEA;;IAEA;MACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;;IAEA;;MAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;UACA;QACA;MACA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;IACA;IACA;EACA;;EAEA;IACA;IACA;;IAEA;MACA;MACA;MACA;IACA;;IAEA;;EAEA;;EAEA;IACA;EACA;;EAEA;IACA;EACA;AACA,CAAA,CAAA;AC1FA,cAAA,OAAA,GAAA,kBAAA;;EAEA;IACA;IACA;IACA;IACA;MACA;MACA;MACA;MACA;MACA;IACA;IACA,aAAA,iBAAA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,aAAA,GAAA,YAAA;EACA;;IAEA;IACA;;IAEA;MACA;IACA;;IAEA;;IAEA;EACA;AACA,CAAA,CAAA;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA,cAAA,YAAA,GAAA,uBAAA;EACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,kBAAA;EACA;;IAEA;IACA;;IAEA;EACA;AACA;ACbA,cAAA,YAAA;;EAEA;IACA;IACA;IACA;IACA;IACA;;MAEA;;MAEA;QACA;MACA;QACA;MACA;IACA;EACA;;AAEA;ACnBA,eAAA,kBAAA,GAAA,sBAAA;;EAEA;;EAEA;IACA;MACA;;MAEA;QACA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;IACA;;EAEA;;EAEA;IACA;EACA;;EAEA;IACA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;MACA;MACA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;AC7CA,cAAA,QAAA,GAAA,mBAAA;;EAEA;IACA;IACA,aAAA,kBAAA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,cAAA;EACA;IACA;;IAEA;MACA;IACA;;EAEA;AACA;;;ACjBA,cAAA,iBAAA;;EAEA;IACA;EACA;;AAEA;ACNA,eAAA,iCAAA,GAAA,uBAAA;;EAEA;;EAEA;IACA;IACA;EACA;;EAEA;IACA;IACA;MACA;MACA;MACA;IACA;EACA;AACA,CAAA,CAAA;ACjBA,cAAA,uBAAA;EACA;IACA;IACA;IACA;MACA;IACA;IACA,aAAA,iCAAA;EACA;AACA;ACTA,cAAA,2BAAA,GAAA,YAAA;;EAEA;;EAEA;IACA;;IAEA;MACA;;MAEA;;MAEA;QACA;MACA;IACA;EACA;;EAEA;IACA;IACA;MACA;IACA;IACA;MACA;QACA;MACA;MACA;;QAEA;UACA;QACA;;QAEA;;;QAGA;UACA;YACA;UACA;QACA;;MAEA;IACA;EACA;AACA,CAAA,CAAA;;AC7CA,eAAA,gCAAA,GAAA,WAAA;;EAEA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;MACA;QACA;UACA;YACA;UACA;QACA;MACA;IACA;EACA;;EAEA;;IAEA;IACA;IACA;;IAEA;MACA;QACA;QACA;MACA;QACA;UACA;QACA;MACA;IACA;EACA;;EAEA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;;IAEA;;IAEA;MACA;IACA;;EAEA;;EAEA;IACA;;IAEA;;MAEA;;MAEA;;QAEA;UACA;;MAEA;;QAEA;UACA;QACA;;QAEA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;AClFA,cAAA,sBAAA,GAAA,iCAAA;EACA;IACA;IACA,aAAA,+CAAA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,4BAAA;EACA;;IAEA;;IAEA;MACA;QACA;MACA;IACA;EACA;AACA;AClBA,cAAA,qBAAA,GAAA,gCAAA;EACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,2BAAA;EACA;;IAEA;MACA;MACA;MACA;MACA;MACA;IACA;;IAEA;MACA;IACA;EACA;AACA;ACrBA;MACA;MACA;MACA;;MAEA;;MAEA;QACA;eACA;eACA;eACA;eACA;eACA;MACA;;MAEA;CACA;;AAEA,cAAA,oBAAA,GAAA,+BAAA;;EAEA;IACA;IACA;IACA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,0BAAA,GAAA,WAAA;;EAEA;;IAEA;IACA;IACA;;IAEA;;MAEA;;QAEA;;QAEA;UACA;QACA;;QAEA;QACA;MACA;QACA;QACA;MACA;IACA;;IAEA;MACA;QACA;QACA;QACA;MACA;IACA;EACA;AACA,CAAA,CAAA,aAAA,aAAA;EACA;IACA;IACA;;MAEA;;MAEA;QACA;UACA;UACA;QACA;MACA;IACA;EACA;AACA;;AC7EA,cAAA,eAAA,GAAA,0BAAA;;EAEA;IACA;IACA;IACA;IACA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,qBAAA;EACA;;IAEA;MACA;IACA;;IAEA;MACA;QACA;MACA;IACA;;EAEA;AACA;ACxBA,cAAA,cAAA;;EAEA;IACA;IACA;MACA;;MAEA;;MAEA;QACA;UACA;QACA;UACA;UACA;QACA;;QAEA;QACA;MACA;IACA;EACA;AACA;ACtBA,cAAA,yBAAA,GAAA,oCAAA;EACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,+BAAA,GAAA,aAAA;;EAEA;EACA;;EAEA;IACA;EACA;;EAEA;;IAEA;;IAEA;IACA;;IAEA;MACA;MACA;MACA;MACA;IACA;;IAEA;MACA;IACA;EACA;AACA,CAAA,CAAA;ACjCA,cAAA,uBAAA,GAAA,kCAAA;EACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,6BAAA;;EAEA;;EAEA;IACA;MACA;IACA;;IAEA;MACA;MACA;IACA;EACA;AACA;ACpBA","file":"angular-form-gen.js","sourcesContent":["/*!\n angular-form-gen v0.0.1\n (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen\n License: MIT\n*/\n(function(angular) {\n","var fg = angular.module('fg', ['dq']);\n\n/**\n * Constructor for form-gen Field types.\n * @param {string} type Indicates the type of field\n * @param {object} properties [optional] Initial property values\n */\nfg.constant('FgField', function FgField(type, properties) {\n this.name = this.type = type;\n\n if (properties) {\n angular.extend(this, properties);\n }\n\n this.displayName = this.displayName || this.type.charAt(0).toUpperCase() + this.type.substring(1);\n }\n);\n\nfg.config(function ($provide) {\n\n $provide.provider('fgConfig', function () {\n\n var config = {\n enableDebugInfo: true,\n validation: {\n messages: {},\n patterns: {}\n },\n fields: {\n templates: [],\n categories: {},\n renderInfo: {}\n }\n };\n\n var templates = config.fields.templates;\n\n function indexOfTemplate(type) {\n var idx = templates.length;\n\n while (idx--) {\n if (templates[idx].type === type) {\n break;\n }\n }\n\n return idx;\n }\n\n return {\n debug: function (value) {\n config.enableDebugInfo = value;\n },\n fields: {\n add: function (objectTemplate, categories, templateUrl, propertiesTemplateUrl) {\n\n if (!objectTemplate || !objectTemplate.type || !categories || !categories.length) {\n throw new Error('Need a valid objectTemplate and at least one category');\n }\n\n var idx = indexOfTemplate(objectTemplate.type);\n\n if (idx !== -1) {\n templates[idx] = objectTemplate;\n } else {\n templates.push(objectTemplate);\n }\n\n this.category(objectTemplate.type, categories);\n this.renderInfo(objectTemplate.type, templateUrl, propertiesTemplateUrl);\n },\n remove: function (type) {\n var idx = indexOfTemplate(type);\n\n if (idx !== -1) {\n templates.splice(idx, 1);\n }\n\n this.category(type);\n this.renderInfo(type);\n },\n renderInfo: function (fieldType, templateUrl, propertiesTemplateUrl) {\n config.fields.renderInfo[fieldType] = {\n templateUrl: templateUrl,\n propertiesTemplateUrl: propertiesTemplateUrl\n };\n },\n category: function (fieldType, categories) {\n if (!angular.isArray(categories)) {\n categories = [categories];\n }\n\n angular.forEach(config.fields.categories, function (category) {\n delete category[fieldType];\n });\n\n angular.forEach(categories, function (category) {\n if (config.fields.categories[category] === undefined) {\n config.fields.categories[category] = {};\n }\n\n config.fields.categories[category][fieldType] = true;\n });\n }\n },\n validation: {\n message: function (typeOrObject, message) {\n\n var messages = config.validation.messages;\n\n if (angular.isString(typeOrObject)) {\n\n if (!message) {\n throw new Error('No message specified for ' + typeOrObject);\n }\n\n messages[typeOrObject] = message;\n } else {\n angular.extend(messages, typeOrObject);\n }\n },\n pattern: function (nameOrObject, pattern) {\n\n if (angular.isString(nameOrObject)) {\n config.validation.patterns[name] = pattern;\n } else {\n angular.extend(config.validation.patterns, nameOrObject);\n }\n }\n },\n $get: function () {\n return config;\n }\n };\n });\n\n});\n\nfg.config(function (fgConfigProvider, FgField) {\n\n // - - - - - - - - - - - - - - - - - - - - - -\n // Messages\n // - - - - - - - - - - - - - - - - - - - - - -\n\n fgConfigProvider.validation.message({\n required: 'A value is required for this field.',\n minlength: 'The value does not match the minimum length{{ field.schema && (\" of \" + field.schema.validation.minlength + \" characters\" || \"\")}}.',\n maxlength: 'The value exceeds the maximum length{{ field.schema && (\" of \" + field.schema.validation.maxlength + \" characters\" || \"\")}}.',\n pattern: 'The value \"{{ field.state.$viewValue }}\" does not match the required format.',\n email: 'The value \"{{ field.state.$viewValue }}\" is not a valid email address.',\n unique: 'The value \"{{ field.state.$viewValue }}\" is already in use.',\n number: 'The value \"{{ field.state.$viewValue }}\" is not a number.',\n min: 'The value {{ field.schema && (\"should be at least \" + field.schema.validation.min) || field.state.$viewValue + \" is too low\" }}',\n max: 'The value {{ field.schema && (\"should be less than \" + field.schema.validation.max) || field.state.$viewValue + \" is too high\" }}'\n });\n\n // - - - - - - - - - - - - - - - - - - - - - -\n // Fields\n // - - - - - - - - - - - - - - - - - - - - - -\n\n var categories = {\n 'Text input fields': [\n new FgField('text', {\n displayName: 'Textbox'\n }),\n new FgField('email'),\n new FgField('number', {\n validation: { maxlength: 15 /* to prevent > Number.MAX_VALUE */ }\n }),\n new FgField('password'),\n new FgField('textarea')\n ],\n 'Checkbox fields': [\n new FgField('checkbox', { nolabel: true }),\n new FgField('checkboxlist', {\n displayName: 'Checkbox List',\n options: [\n {\n value: '1',\n text: 'Option 1'\n },\n {\n value: '2',\n text: 'Option 2'\n },\n {\n value: '3',\n text: 'Option 3'\n }\n ],\n value: {\n '1': true,\n '2': true\n }\n })\n ],\n 'Select input fields': [\n new FgField('radiobuttonlist', {\n displayName: 'Radiobutton List',\n options: [\n {\n value: '1',\n text: 'Option 1'\n },\n {\n value: '2',\n text: 'Option 2'\n },\n {\n value: '3',\n text: 'Option 3'\n }\n ],\n value: '1'\n }),\n new FgField('selectlist', {\n displayName: 'Select List',\n options: [\n {\n value: '1',\n text: 'Option 1'\n },\n {\n value: '2',\n text: 'Option 2'\n },\n {\n value: '3',\n text: 'Option 3'\n }\n ],\n value: '1'\n }) // ,\n // new FgField('dropdownlist', {\n // options: [{\n // value: '1',\n // text: 'Option 1'\n // }, {\n // value: '2',\n // text: 'Option 2'\n // }, {\n // value: '3',\n // text: 'Option 3'\n // }],\n // value: '1'\n // })\n ]\n };\n\n\n angular.forEach(categories, function (fields, category) {\n angular.forEach(fields, function (field) {\n fgConfigProvider.fields.add(field, category /*, templateUrl, propertiesTemplateUrl */);\n });\n });\n\n // - - - - - - - - - - - - - - - - - - - - - -\n // Patterns\n // - - - - - - - - - - - - - - - - - - - - - -\n\n fgConfigProvider.validation.pattern({\n 'None': undefined,\n 'Url': '^(https?:\\\\/\\\\/)?([\\\\da-z\\\\.-]+)\\\\.([a-z\\\\.]{2,6})([\\\\/\\\\w \\\\.-]*)*\\\\/?$',\n 'Domain': '^([a-z][a-z0-9\\\\-]+(\\\\.|\\\\-*\\\\.))+[a-z]{2,6}$',\n 'IPv4 Address': '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$',\n 'Email Address': '^([a-z0-9_\\\\.-]+)@([\\\\da-z\\\\.-]+)\\\\.([a-z\\\\.]{2,6})$',\n 'Integer': '^-{0,1}\\\\d+$',\n 'Positive Integers': '^\\\\d+$',\n 'Negative Integers': '^-\\\\d+$',\n 'Number': '^-{0,1}\\\\d*\\\\.{0,1}\\\\d+$',\n 'Positive Number': '^\\\\d*\\\\.{0,1}\\\\d+$',\n 'Negative Number': '^-\\\\d*\\\\.{0,1}\\\\d+$',\n 'Year (1920-2099)': '^(19|20)[\\\\d]{2,2}$',\n 'Password': '(?=.*\\\\d)(?=.*[!@#$%^&*\\\\-=()|?.\\\"\\';:]+)(?![.\\\\n])(?=.*[A-Z])(?=.*[a-z]).*$'\n });\n});\n","// ATTENTION!\n// DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY\n// SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED\nangular.module('fg').run(['$templateCache', function($templateCache){\n $templateCache.put('angular-form-gen/edit/edit.ng.html', '
');\n $templateCache.put('angular-form-gen/validation/summary.ng.html', '');\n $templateCache.put('angular-form-gen/common/jsonify/jsonify.ng.html', '
{{ jsonify | j$on:displayHidden }}
');\n $templateCache.put('angular-form-gen/common/tabs/tabs-pane.ng.html', '
');\n $templateCache.put('angular-form-gen/common/tabs/tabs.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/canvas.ng.html', '
Canvas

X

Drag one of the available templates from the palette onto this canvas.

');\n $templateCache.put('angular-form-gen/edit/palette/palette.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/checkbox.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/checkboxlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/dropdownlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/email.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/not-in-cache.ng.html', '

No template registered in cache for field type \\\"{{ field.type }}\\\".

');\n $templateCache.put('angular-form-gen/field-templates/default/number.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/password.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/radiobuttonlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/selectlist.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/text.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/textarea.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/properties/checkbox.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/checkboxlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/dropdownlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/email.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/number.ng.html', '
= 0\\\">
= 0\\\">
');\n $templateCache.put('angular-form-gen/field-templates/properties/password.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/radiobuttonlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/selectlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/text.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/textarea.ng.html', '
');\n $templateCache.put('angular-form-gen/form/field/field.ng.html', '
');\n $templateCache.put('angular-form-gen/form/form-fields/form-fields.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/field.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/palette/categories/categories.ng.html', 'Palette - {{ categoryName || \\'All field types\\' }} ');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/properties.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/options/options.ng.html', '

No options defined

Click here to add a new option definition to this field.

0\\\" class=\\\"table-field-options\\\">
ValueText
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html', '
= 1\\\">
= 1\\\">
0\\\">
');\n}]);","fg.directive('fgBindExpression', function ($interpolate) {\n\n function buildWatchExpression(interpolateFn) {\n var sb = [];\n var parts = interpolateFn.parts;\n var ii = parts.length;\n\n while (ii--) {\n var part = parts[ii];\n\n if (part.exp && !part.exp.match(/^\\s*$/)) {\n sb.push(part.exp);\n }\n }\n\n return '[' + sb.join() + ']';\n }\n\n return function (scope, element, attr) {\n\n var interpolateFn, watchHandle, oldWatchExpr;\n\n function cleanWatchHandle() {\n if (watchHandle) watchHandle();\n watchHandle = undefined;\n }\n\n function interpolateExpression() {\n element.text(interpolateFn(scope));\n }\n\n scope.$on('$destroy', function () {\n cleanWatchHandle();\n });\n\n scope.$watch(attr.fgBindExpression, function (value) {\n if (value !== undefined) {\n interpolateFn = $interpolate(value);\n\n element.addClass('ng-binding').data('$binding', interpolateFn);\n\n var watchExpr = buildWatchExpression(interpolateFn);\n\n if (oldWatchExpr !== watchExpr) {\n\n oldWatchExpr = watchExpr;\n\n cleanWatchHandle();\n\n watchHandle = scope.$watchCollection(watchExpr, function () {\n interpolateExpression();\n });\n } else {\n interpolateExpression();\n }\n }\n });\n };\n});\n","fg.directive('fgDropdownInput', function ($compile, $document, $timeout, $parse, fgUtils) {\n\n function createInput($scope, $element, $attrs) {\n\n var template = '
' +\n '' +\n '' +\n '' +\n '' +\n '
';\n\n var $template = angular.element(template);\n var $input = $template.find('input');\n\n // Copy the original attributes to the input element\n\n var attributes = $element.prop(\"attributes\");\n\n angular.forEach(attributes, function (a) {\n if (a.name !== 'fg-dropdown-input' && a.name !== 'class') {\n $input.attr(a.name, a.value);\n }\n });\n\n var $button = $template.find('button');\n var closeTimeout;\n\n $scope.dropdownToggle = function () {\n// $button[0].focus(); // force focus for chrome\n $scope.dropdownVisible = !$scope.dropdownVisible;\n };\n\n// $button.on('blur', function () {\n// closeTimeout = $timeout(function () {\n// $scope.dropdownVisible = false;\n// }, 100);\n// });\n\n $scope.$on('$destroy', function () {\n if (closeTimeout) $timeout.cancel(closeTimeout);\n closeTimeout = undefined;\n });\n\n return $template;\n }\n\n function createDropdown($scope, $element, $attrs, ngModelCtrl, $input) {\n\n var modelGetter = $parse($attrs.ngModel);\n var modelSetter = modelGetter.assign;\n\n var template = '
' +\n '' +\n '
';\n\n var $template = angular.element(template);\n\n $scope.setModelValue = function (value) {\n\n $scope.dropdownVisible = false;\n\n // Convert to a string\n\n var viewValue = value || '';\n\n var idx = ngModelCtrl.$formatters.length;\n\n while (idx--) {\n var fn = ngModelCtrl.$formatters[idx];\n var viewValue = fn(viewValue);\n\n if (viewValue === undefined) {\n break;\n }\n }\n\n\n // Parse the viewValue\n\n idx = ngModelCtrl.$parsers.length;\n var pv = viewValue;\n\n while (idx--) {\n var fn = ngModelCtrl.$parsers[idx];\n pv = fn(pv);\n\n if (pv === undefined) {\n break;\n }\n }\n\n if (pv === undefined) {\n // Failed to parse.\n // Set the formatted string in the input, which will retrigger the parsing and display the correct error message.\n\n ngModelCtrl.$setViewValue(viewValue);\n ngModelCtrl.$render();\n\n } else {\n modelSetter($scope, value);\n }\n };\n\n $scope.getModelValue = function () {\n return modelGetter($scope);\n };\n\n var input = $input[0];\n\n $scope.$watch('dropdownVisible', function (value) {\n if (value) {\n\n var rect = input.getBoundingClientRect();\n var scroll = fgUtils.getScrollOffset();\n\n $template.css({\n left: (scroll.x + rect.left) + 'px',\n top: (scroll.y + rect.top + input.clientHeight) + 'px',\n width: input.clientWidth + 'px'\n });\n }\n });\n\n $scope.$watchCollection($attrs.fgDropdownInput, function (value) {\n $scope.items = value;\n });\n\n $scope.$on('$destroy', function () {\n $template.remove();\n });\n\n return $template;\n }\n\n return {\n priority: 1000,\n restrict: 'A',\n terminal: true,\n scope: true,\n compile: function (tElement, tAttrs) {\n\n return function link($scope, $element, $attrs, ctrls) {\n\n var $input = createInput($scope, $element, $attrs);\n\n $element.append($input);\n $compile($input)($scope);\n\n var $inputText = $input.find('input');\n var ngModelCtrl = $inputText.controller('ngModel');\n\n ////////////////////////////////////////\n\n var $dropdown = createDropdown($scope, $element, $attrs, ngModelCtrl, $input);\n var dropdownCompileFn = $compile($dropdown);\n\n var $body = $document.find('body');\n\n $body.append($dropdown);\n\n dropdownCompileFn($scope);\n\n ////////////////////////////////////////\n };\n }\n };\n});\n","/**\n * Created by null on 16/10/14.\n */\nfg.directive('fgNullForm', function () {\n\n var nullFormCtrl = {\n $addControl: angular.noop,\n $removeControl: angular.noop,\n $setValidity: angular.noop,\n $setDirty: angular.noop,\n $setPristine: angular.noop\n };\n\n return {\n restrict: 'A',\n require: ['form'],\n link: function link($scope, $element, $attrs, $ctrls) {\n\n var form = $ctrls[0];\n\n // Locate the parent form\n\n var parentForm = $element.parent().inheritedData('$formController');\n\n if(parentForm) {\n\n // Unregister this form controller\n\n parentForm.$removeControl(form);\n }\n\n // Nullify the form\n\n angular.extend(form, nullFormCtrl);\n }\n };\n});\n\nfg.directive('fgFormRequiredFilter', function() {\n\n return {\n restrict: 'A',\n require: ['form'],\n link: function($scope, $element, $attrs, $ctrls) {\n\n var form = $ctrls[0];\n\n var $setValidity = form.$setValidity;\n\n form.$setValidity = function (validationToken, isValid, control) {\n\n if(validationToken === 'required') {\n isValid = true;\n }\n\n $setValidity.call(form, validationToken, isValid, control);\n };\n }\n };\n\n});","fg.directive('fgInputNumber', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attr, ctrl) {\n \n ctrl.$parsers.push(function(inputValue) {\n // this next if is necessary for when using ng-required on your input. \n // In such cases, when a letter is typed first, this parser will be called\n // again, and the 2nd time, the value will be undefined\n if (inputValue == undefined) {\n return '';\n }\n\n var transformedInput = inputValue.replace(/[^0-9]/g, '');\n\n var value = parseInt(transformedInput);\n value === NaN ? undefined : value;\n\n if (transformedInput != inputValue) {\n ctrl.$setViewValue(transformedInput);\n ctrl.$render();\n }\n\n return value;\n\n });\n\n ctrl.$parsers.push(function(value) {\n var empty = ctrl.$isEmpty(value);\n if (empty || /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/.test(value)) {\n ctrl.$setValidity('number', true);\n return value === '' ? null : (empty ? value : parseFloat(value));\n } else {\n ctrl.$setValidity('number', false);\n return undefined;\n }\n });\n\n ctrl.$formatters.push(function(value) {\n return ctrl.$isEmpty(value) ? undefined : value;\n });\n\n if (attr.min) {\n var minValidator = function(value) {\n var min = parseFloat(attr.min);\n if (!ctrl.$isEmpty(value) && value < min) {\n ctrl.$setValidity('min', false);\n return undefined;\n } else {\n ctrl.$setValidity('min', true);\n return value;\n }\n };\n\n ctrl.$parsers.push(minValidator);\n ctrl.$formatters.push(minValidator);\n }\n\n if (attr.max) {\n var maxValidator = function(value) {\n var max = parseFloat(attr.max);\n if (!ctrl.$isEmpty(value) && value > max) {\n ctrl.$setValidity('max', false);\n return undefined;\n } else {\n ctrl.$setValidity('max', true);\n return value;\n }\n };\n\n ctrl.$parsers.push(maxValidator);\n ctrl.$formatters.push(maxValidator);\n }\n\n ctrl.$formatters.push(function(value) {\n\n if (ctrl.$isEmpty(value) || angular.isNumber(value)) {\n ctrl.$setValidity('number', true);\n return value;\n } else {\n ctrl.$setValidity('number', false);\n return undefined;\n }\n });\n }\n };\n});\n","fg.directive('fgPlaceholder', function() {\n /*\n This attribute is only required on TEXTAREA elements. \n Angular in combination with IE doesn't like placeholder=\"{{ myExpression }}\".\n */\n return { \n link: function($scope, $element, $attrs) {\n $scope.$watch($attrs.fgPlaceholder, function(value) {\n $element.attr('placeholder', value);\n });\n }\n };\n});","fg.factory('fgUtils', function ($templateCache, $window, fgConfig) {\n\n var uniqueCounter = (+new Date) % 10000;\n\n return {\n getScrollOffset: function() {\n\n // the pageYOffset property of the window object is supported in all browsers except \n // in Internet Explorer before version 9, and always returns the scroll amount regardless of the doctype\n \n // the scrollY property of the window object is supported by Firefox, Google Chrome and Safari, and always\n // returns the scroll amount regardless of the doctype\n \n // if a doctype is specified in the document, the scrollTop property of the html element returns the scroll\n // amount in Internet Explorer, Firefox and Opera, but always returns zero in Google Chrome and Safari\n \n // if no doctype is specified in the document, the scrollTop property of the html element always returns zero\n\n // if no doctype is specified in the document, the scrollTop property of the body element returns the \n // scroll amount in Internet Explorer, Firefox, Opera, Google Chrome and Safari.\n\n var offset = {};\n\n if($window.pageYOffset !== undefined) {\n offset.x = $window.pageXOffset;\n offset.y = $window.pageYOffset;\n } else {\n var de = $window.document.documentElement;\n offset.x = de.scrollLeft;\n offset.y = de.scrollTop;\n }\n\n return offset;\n },\n defaultArea: 'default',\n getRenderInfo: function(field) {\n //var renderInfo = fg.Field[field.type];\n var renderInfo = fgConfig.fields.renderInfo[field.type];\n\n if(!renderInfo) {\n renderInfo = {};\n // fg.Field[field.type] = renderInfo;\n fgConfig.fields.renderInfo[field.type] = renderInfo;\n }\n\n if(!renderInfo.templateUrl) {\n renderInfo.templateUrl = this.getTemplateUrl(field);\n }\n\n if(!renderInfo.propertiesTemplateUrl) {\n renderInfo.propertiesTemplateUrl = this.getTemplateUrl(field, 'properties');\n }\n\n return renderInfo;\n },\n formatTemplateUrl: function (type, area) {\n return 'angular-form-gen/field-templates/' + (area || this.defaultArea) + '/' + type + '.ng.html';\n },\n getTemplateUrl: function (field, area) {\n\n area = area || this.defaultArea;\n\n // IE8 fix: Aliases removed\n // var templateType = fgConfig.fields.aliases[field.type] || field.type;\n var templateType = field.type;\n var templateUrl = this.formatTemplateUrl(templateType, area);\n\n var cached = $templateCache.get(templateUrl);\n\n if (!cached) {\n\n // Url is not in cache -- fallback to default area.\n // Properties area will never fallback to default area.\n\n if (area !== 'properties' && area !== this.defaultArea) {\n templateUrl = this.getTemplateUrl(field, this.defaultArea);\n } else {\n return this.formatTemplateUrl('not-in-cache');\n }\n }\n\n return templateUrl;\n },\n getUnique: function() {\n return ++uniqueCounter;\n },\n copyField: function(field) {\n var copy = angular.copy(field);\n copy.name = 'field' + this.getUnique();\n return copy;\n },\n findElementsByClass: function (root, className, recursive, buffer) {\n buffer = buffer || [];\n\n if (root.className === className) {\n buffer.push(root);\n }\n\n if (root.hasChildNodes()) {\n for (var i = 0; i < root.children.length; i++) {\n var child = root.children[i];\n if (child.className === className) {\n buffer.push(child);\n }\n if (recursive) {\n this.findElementsByClass(child, className, recursive, buffer);\n }\n }\n }\n\n return buffer;\n }\n };\n });","angular.module('dq', []).factory('dqUtils', function($window, $rootScope) {\n\n var _dragData = null;\n\n //noinspection FunctionWithInconsistentReturnsJS\n return {\n getEvent: function (e) {\n return e && e.originalEvent ? e.originalEvent : e || $window.event;\n },\n stopEvent: function (e) {\n // e.cancelBubble is supported by IE8 -\n // this will kill the bubbling process.\n e.cancelBubble = true;\n e.bubbles = false;\n \n // e.stopPropagation works in modern browsers\n if (e.stopPropagation) e.stopPropagation();\n if (e.preventDefault) e.preventDefault();\n\n return false;\n },\n dragData: function (data) {\n if (data === undefined) {\n return _dragData;\n }\n _dragData = data;\n },\n getParentArea: function ($scope) {\n var area = {};\n $scope.$emit('dqLocateArea', area);\n return area.name;\n },\n isAreaMatch: function ($scope) {\n var parentArea = this.getParentArea($scope);\n var eventArea = _dragData ? _dragData.area : \"\";\n\n return parentArea === eventArea;\n }\n };\n});","angular.module('dq').directive('dqDragArea', function (dqUtils) {\n\n function evalBroadcastEvent($scope, args, areaName, expression) {\n if (expression && args && args.area === areaName) {\n $scope.$eval(expression);\n }\n }\n\n return {\n restrict: 'AEC',\n link: function ($scope, $element, $attrs) {\n\n var areaName = $attrs.dqDragArea || $attrs.dqDragAreaName || \"\";\n\n $scope.$on('dqDragBegin', function ($event, args) {\n evalBroadcastEvent($scope, args, areaName, $attrs.dqDragProgressBegin);\n });\n\n $scope.$on('dqDragEnd', function ($event, args) {\n evalBroadcastEvent($scope, args, areaName, $attrs.dqDragProgressEnd);\n });\n\n $scope.$on('dqLocateArea', function($event, args) {\n args.name = areaName;\n $event.stopPropagation();\n });\n }\n }\n});\n","angular.module('dq').directive('dqDragEnter',function (dqDragTrack) {\n return {\n link: dqDragTrack\n };\n}).directive('dqDragLeave',function (dqDragTrack) {\n return {\n link: dqDragTrack\n };\n }).directive('dqDragOver',function (dqDragTrack) {\n return {\n link: dqDragTrack\n };\n }).directive('dqDrop',function (dqDragTrack) {\n return {\n link: dqDragTrack\n };\n }).factory('dqDragTrack', function (dqUtils, $document) {\n\n // Combines both nq-drag-enter & nq-drag-leave & nq-drag-over\n\n return function ($scope, $element, $attrs) {\n\n // Tracking already set on the element?\n\n if ($element.data('dqDragTrack') !== true) {\n\n var trackingEnabled = false; // Toggled on drag-begin if the area name does not match the target\n var inbound = false; // Toggle to indicate if the dragging is in or outbound element\n var element = $element[0];\n var dropEffect = 'none'; // Drop effect used in the dragover event\n var doingLeaveDoubleCheck = false; // Toggle that indicates the body has a dragover event to do.\n\n var $body = $document.find('body');\n\n function dragLeaveDoubleCheck($e) {\n var e = dqUtils.getEvent($e);\n\n // Check if the drag over element is a child of the this element\n\n var target = e.target || $e.target;\n\n if (target !== element) {\n\n // TODO: we're not really checking if the target element is visually within the $element.\n\n if (!element.contains(target)) {\n\n // Drag over element is out of bounds\n\n dragLeaveForSure(true);\n }\n }\n\n // We're done with the expensive body call\n\n $body.off('dragover', dragLeaveDoubleCheck);\n\n // Notify the local element event callback there's no event listener on the body and the next event\n // can safely be cancelled.\n\n doingLeaveDoubleCheck = false;\n\n e.dataTransfer.dropEffect = dropEffect;\n\n // Always cancel the dragover -- otherwise the dropEffect is not used.\n\n return dqUtils.stopEvent($e);\n }\n\n function dragLeaveForSure(apply) {\n inbound = false;\n var expression = $attrs.dqDragLeave;\n if (expression) {\n if (apply) {\n $scope.$apply(function () {\n $scope.$eval(expression);\n });\n } else {\n $scope.$eval(expression);\n }\n }\n }\n\n $scope.$on('$destroy', function () {\n // Just to be sure\n $body.off('dragover', dragLeaveDoubleCheck);\n });\n\n $scope.$on('dqDragBegin', function () {\n // Check if we should track drag movements\n trackingEnabled = dqUtils.isAreaMatch($scope);\n });\n\n $scope.$on('dqDragEnd', function () {\n if (trackingEnabled) {\n // Gief cake\n dragLeaveForSure(false);\n }\n });\n\n $element.on('dragenter', function (e) {\n if (trackingEnabled && inbound === false) {\n inbound = true;\n var expression = $attrs.dqDragEnter;\n if (expression) {\n $scope.$apply(function () {\n $scope.$eval(expression);\n });\n }\n }\n });\n\n $element.on('dragleave', function () {\n if (trackingEnabled && inbound === true) {\n\n // dragleave is a lie -- hovering child elements will cause this event to trigger also.\n // We fake the cake by tracking the drag ourself.\n\n // Notify the \"real\" dragover event that he has to play nice with the body and not to\n // cancel the event chain.\n\n doingLeaveDoubleCheck = true;\n $body.on('dragover', dragLeaveDoubleCheck);\n }\n });\n\n //noinspection FunctionWithInconsistentReturnsJS\n $element.on('dragover', function ($e) {\n\n if (trackingEnabled) {\n\n var e = dqUtils.getEvent($e);\n\n var expression = $attrs.dqDragOver;\n var result;\n\n if (expression) {\n $scope.$apply(function () {\n result = $scope.$eval(expression);\n });\n }\n\n // The evaluated expression can indicate to cancel the drop\n\n dropEffect = result === false ? 'none' : 'copy';\n\n if (!doingLeaveDoubleCheck) {\n\n // There's no dragover queued on the body.\n // The event needs to be terminated here else the dropEffect will\n // not be applied (and dropping is not allowed).\n\n e.dataTransfer.dropEffect = dropEffect;\n return dqUtils.stopEvent($e);\n }\n }\n });\n\n //noinspection FunctionWithInconsistentReturnsJS\n $element.on('drop', function($e) {\n\n var e = dqUtils.getEvent($e);\n\n if(trackingEnabled) {\n var expression = $attrs.dqDrop;\n\n if(expression) {\n $scope.$apply(expression);\n }\n }\n\n return dqUtils.stopEvent($e);\n });\n\n // Ensure that we only do all this magic stuff on this element for one time only.\n\n $element.data('dqDragTrack', true);\n }\n };\n\n });\n","angular.module('dq').directive('dqDraggable', function (dqUtils, $rootScope) {\n\n function evalAndBroadcast(eventName, targetArea, $scope, expression, cb) {\n $scope.$apply(function () {\n var data = $scope.$eval(expression);\n\n var bcData = {\n area: targetArea,\n data: data\n };\n\n cb(bcData);\n\n $rootScope.$broadcast(eventName, bcData);\n });\n }\n\n return {\n restrict: 'AEC',\n link: function ($scope, $element, $attrs) {\n\n var targetArea = $attrs.dqDraggable || $attrs.dqDragTargetArea || \"\";\n var disabled = false;\n\n $scope.$watch($attrs.dqDragDisabled, function(value) {\n disabled = value;\n $element.attr('draggable', disabled ? 'false' : 'true');\n });\n\n $element.on('selectstart',function (e) {\n\n // Pure IE evilness\n\n if (!disabled && this.dragDrop) {\n this.dragDrop();\n e = dqUtils.getEvent(e);\n return dqUtils.stopEvent(e);\n }\n }).on('dragstart',function (e) {\n\n e = dqUtils.getEvent(e);\n\n if(disabled) {\n return dqUtils.stopEvent(e);\n }\n\n var dt = e.dataTransfer;\n dt.effectAllowed = 'all';\n dt.setData('Text', 'The cake is a lie!');\n\n evalAndBroadcast('dqDragBegin', targetArea, $scope, $attrs.dqDragBegin, function(dragData) {\n dqUtils.dragData(dragData);\n });\n\n }).on('dragend', function () {\n\n evalAndBroadcast('dqDragEnd', targetArea, $scope, $attrs.dqDragEnd, function() {\n dqUtils.dragData(null);\n });\n\n });\n }\n };\n\n});","fg.controller('fgEditController', function ($scope, fgUtils, $location) {\n\n var self = this;\n\n// $scope.preview = $location.search().preview;\n//\n// this.setMetaForm = function(metaForm) {\n// self.metaForm = metaForm;\n// };\n\n// this.togglePreview = function() {\n// $scope.preview = !$scope.preview;\n// };\n\n $scope.$watch(function () {\n\n var schema = $scope.schemaCtrl.model();\n\n // Seems that this watch is sometimes fired after the scope has been destroyed(?)\n\n if (schema) {\n// schema.$_invalid = self.metaForm ? self.metaForm.$invalid : false;\n//\n// if (!schema.$_invalid) {\n\n var fields = schema.fields;\n\n if (fields) {\n\n var i = fields.length;\n\n while (--i >= 0 && !schema.$_invalid) {\n schema.$_invalid = fields[i].$_invalid;\n }\n }\n }\n\n });\n\n});","fg.directive('fgEdit', function () {\n return {\n priority: 100,\n require: 'fgSchema',\n restrict: 'AE',\n scope: {\n // // The schema model to edit\n schema: '=?fgSchema'\n// // Boolean indicating wether to show the default form action buttons\n// actionsEnabled: '=?fgActionsEnabled',\n// // Callback function when the user presses save -- any argument named 'schema' is set to the schema model.\n// onSave: '&fgOnSave',\n// // Callback function when the user presses cancel -- any argument named 'schema' is set to the schema model.\n// onCancel: '&fgOnCancel',\n// // Boolean indicating wether the edit is in preview mode or not\n// preview: '=?fgPreview'\n },\n replace: true,\n controller: 'fgEditController as editCtrl',\n templateUrl: 'angular-form-gen/edit/edit.ng.html',\n link: function ($scope, $element, $attrs, schemaCtrl) {\n\n if ($scope.schema === undefined) {\n $scope.schema = {};\n }\n\n// if ($scope.actionsEnabled === undefined) {\n// $scope.actionsEnabled = true;\n// }\n//\n// if ($scope.preview === undefined) {\n// $scope.preview = false;\n// }\n\n schemaCtrl.model($scope.schema);\n $scope.schemaCtrl = schemaCtrl;\n }\n }\n});","fg.controller('fgFormController', function($scope, $parse) {\n\n this.model = {};\n var self = this;\n\n this.init = function(dataExpression, schema, state, editMode) {\n // Called by the directive\n \n self.editMode = editMode;\n\n var dataGetter = $parse(dataExpression);\n var dataSetter = dataGetter.assign;\n\n $scope.$watch(dataGetter, function(value) {\n if(value === undefined) {\n value = {};\n\n if(dataSetter) {\n dataSetter($scope, value);\n }\n }\n\n self.model.data = value;\n });\n\n $scope.$watch(function() {\n return schema.model();\n }, function(value) {\n if(value === undefined) {\n schema.model({});\n } else {\n self.model.schema = value;\n }\n });\n\n self.model.state = state;\n\n \n return self.model;\n };\n\n// this.clearFocusOnFields = function() {\n// angular.forEach(self.model.schema.fields, function(field) {\n// field.focus = false;\n// });\n// };\n\n});\n","fg.directive('fgForm', function(fgFormCompileFn) {\n return {\n restrict: 'AE',\n require: ['^?form', 'fgForm', '^fgSchema'],\n controller: 'fgFormController',\n scope: true,\n compile: fgFormCompileFn\n };\n}).factory('fgFormLinkFn', function() {\n return function link($scope, $element, $attrs, ctrls) {\n\n var ngFormCtrl = ctrls[0];\n var formCtrl = ctrls[1];\n var schemaCtrl = ctrls[2];\n\n var editMode = $attrs.fgNoRender === 'true';\n\n formCtrl.init($attrs.fgFormData, schemaCtrl, ngFormCtrl, editMode);\n \n };\n}).factory('fgFormCompileFn', function(fgFormLinkFn) {\n return function($element, $attrs) {\n\n $element.addClass('fg-form');\n\n var noRender = $attrs.fgNoRender;\n \n if (noRender !== 'true') {\n var renderTemplate = '
';\n $element.append(renderTemplate);\n }\n \n return fgFormLinkFn;\n };\n});\n\n","fg.directive('fgValidationSummary', function(fgValidationSummaryLinkFn) {\n\n return {\n require: ['^?fgField', '^?form'],\n templateUrl: 'angular-form-gen/validation/summary.ng.html',\n scope: {\n fieldName: '@?fgValidationSummary',\n validationMessages: '=?fgValidationMessages'\n },\n link: fgValidationSummaryLinkFn\n };\n}).factory('fgValidationSummaryLinkFn', function(fgConfig) {\n\n return function($scope, $element, $attrs, ctrls) {\n\n var fgFieldCtrl = ctrls[0];\n var ngFormController = ctrls[1];\n\n if (fgFieldCtrl) {\n // Grab the whole field state from the field controller\n $scope.field = fgFieldCtrl.field();\n $scope.form = fgFieldCtrl.form();\n\n } else if (ngFormController) {\n \n $scope.form = {\n state: ngFormController\n };\n\n $scope.$watch('fieldName', function(value) {\n $scope.field = {\n name: value,\n state: ngFormController[value]\n };\n });\n }\n\n // Whenever the form designer edits a custom message but decides to delete it later a \"\" is leftover.\n // I don't feel like setting all kinds of watchers so we'll fix that here\n\n if($scope.validationMessages) {\n angular.forEach($scope.validationMessages, function(value, key) {\n if(!value) {\n delete $scope.validationMessages[key];\n }\n });\n }\n\n $scope.messages = angular.extend({}, fgConfig.validation.messages, $scope.validationMessages);\n };\n\n});","fg.directive('fgUniqueFieldName', function () {\n\n var changeTick = 0;\n\n function validate(ngModelCtrl, schemaCtrl, field) {\n \n var schema = schemaCtrl.model();\n var valid = true;\n var schemaField;\n\n if(schema) {\n\n var fields = schema.fields;\n\n for (var i = 0; i < fields.length; i++) {\n schemaField = fields[i];\n if (schemaField !== field && field.name === schemaField.name) {\n valid = false;\n break;\n }\n }\n }\n\n ngModelCtrl.$setValidity('unique', valid);\n }\n\n return {\n priority: 100,\n require: ['ngModel', '^fgSchema'],\n link: function ($scope, $element, $attrs, ctrls) {\n\n var ngModelCtrl = ctrls[0];\n var schemaCtrl = ctrls[1];\n \n var field = $scope.field;\n\n if(!field) {\n throw Error('No field property on scope');\n }\n\n $scope.$watch(function() { return ngModelCtrl.$modelValue; }, function () {\n \n // Every instance of this directive will increment changeTick\n // whenever the name of the associated field is modified.\n\n ++changeTick;\n });\n\n $scope.$watch(function() { return changeTick; }, function() {\n\n // Every instance of this directive will fire off the validation\n // whenever the changeTick has been modifed.\n\n validate(ngModelCtrl, schemaCtrl, field);\n });\n }\n };\n});\n","fg.filter('j$on',function () {\n return function (input, displayHidden) {\n\n if(displayHidden)\n return JSON.stringify(input || {}, null, ' ');\n\n return angular.toJson(input || {}, true);\n };\n}).directive('jsonify', function ($window, $filter) {\n return {\n templateUrl: 'angular-form-gen/common/jsonify/jsonify.ng.html',\n replace: true,\n scope: {\n jsonify: \"=\",\n displayHidden: \"@jsonifyDisplayHidden\"\n },\n link: function($scope, $element, $attrs, ctrls) {\n $scope.expression = $attrs.jsonify;\n\n $scope.copy = function() {\n $window.prompt (\"Copy to clipboard: Ctrl+C, Enter\", $filter('j$on')($scope.jsonify, $scope.displayHidden));\n };\n }\n };\n });\n","fg.controller('fgTabsController', function () {\n\n this.items = [];\n this.active = null;\n\n this.add = function (item) {\n this.items.push(item);\n\n this.items.sort(function(x, y) {\n return x.order - y.order;\n });\n\n if (!this.active && item.autoActive != false) {\n this.activate(item);\n }\n };\n\n this.activate = function (item) {\n\n if(!item.disabled) {\n this.active = item;\n }\n\n };\n\n});\n","fg.directive('fgTabs', function() {\n return {\n require: ['fgTabs'],\n restrict: 'EA',\n transclude: true,\n controller: 'fgTabsController',\n templateUrl: 'angular-form-gen/common/tabs/tabs.ng.html',\n scope: {\n 'tabs': '=?fgTabs'\n },\n link: function($scope, $element, $attrs, $ctrls) {\n $scope.tabs = $ctrls[0];\n }\n };\n});\n\n\n\n","fg.directive('fgTabsPane', function(fgTabsPaneLinkFn) {\n return {\n require: ['^fgTabs'],\n restrict: 'EA',\n transclude: true,\n templateUrl: 'angular-form-gen/common/tabs/tabs-pane.ng.html',\n link: fgTabsPaneLinkFn,\n scope: true\n };\n}).factory('fgTabsPaneLinkFn', function() {\n return function($scope, $element, $attrs, $ctrls) {\n\n $scope.tabs = $ctrls[0];\n\n $scope.pane = {\n title: $attrs.fgTabsPane || $attrs.title,\n order: parseInt($attrs.fgTabsPaneOrder || $attrs.order) || 10,\n autoActive: !($attrs.fgTabsPaneAutoActive === \"false\" || $attrs.autoActive === \"false\"),\n renderAlways: $attrs.fgTabsPaneRenderAlways === \"true\" || $attrs.renderAlways === \"true\"\n };\n\n $scope.$watch($attrs.disabled, function(value) {\n $scope.pane.disabled = value;\n });\n\n $scope.tabs.add($scope.pane);\n };\n});\n","fg.controller('fgEditCanvasController', function ($scope, dqUtils, $timeout, fgUtils) {\n\n $scope.dragPlaceholder = {\n visible: false,\n index: 0\n };\n\n // - - - 8-< - - - - - - - - - - - - - - - - - - - - -\n // Drag & drop\n // - - - 8-< - - - - - - - - - - - - - - - - - - - - -\n\n $scope.$on('dqDragBegin', function() {\n $scope.dragging = true;\n });\n\n $scope.$on('dqDragEnd', function() {\n $scope.dragging = false;\n });\n\n this.dragEnter = function () {\n// $scope.dragging = true;\n $scope.dragPlaceholder.visible = true;\n $scope.dragPlaceholder.index = $scope.schema.fields.length;\n };\n\n this.dragLeave = function () {\n $scope.dragPlaceholder.visible = false;\n };\n\n this.dragBeginCanvasField = function (index, field) {\n\n // Delay is set to prevent browser from copying adjusted html as copy image\n\n $timeout(function () {\n field.$_isDragging = true;\n }, 1);\n\n return { source: 'canvas', field: field, index: index };\n };\n\n this.dragEndCanvasField = function (field) {\n\n // IE Fix: ensure this is fired after the drag begin\n\n $timeout(function () {\n field.$_isDragging = false;\n// $scope.dragging = false;\n }, 10);\n\n };\n\n this.drop = function () {\n\n var dragData = dqUtils.dragData();\n\n if (dragData && dragData.data) {\n\n var field = dragData.data.field;\n var source = dragData.data.source;\n var index = dragData.data.index;\n var fields = $scope.schema.fields;\n\n if (source == 'palette') {\n $scope.schemaCtrl.addField(field, $scope.dragPlaceholder.index);\n\n } else if (source == 'canvas') {\n $scope.schemaCtrl.moveField(index, $scope.dragPlaceholder.index);\n\n // fields.splice(index, 1);\n // fields.splice($scope.dragPlaceholder.index, 0, field);\n }\n\n // IE fix: not calling dragEnd sometimes\n field.$_isDragging = false;\n } else {\n throw Error('Drop without data');\n }\n };\n\n});","fg.directive('fgEditCanvas', function() {\n\n return {\n require: ['^fgEdit', '^fgSchema', '^form'],\n templateUrl: 'angular-form-gen/edit/canvas/canvas.ng.html',\n controller: 'fgEditCanvasController as canvasCtrl',\n link: function($scope, $element, $attrs, ctrls) {\n $scope.editCtrl = ctrls[0];\n $scope.schemaCtrl = ctrls[1];\n $scope.formCtrl = ctrls[2];\n\n var ignoreDirty = true;\n\n $scope.$watchCollection('schema.fields', function() {\n\n // Ignore the first call, $watchCollection fires at once without any changes.\n\n if(!ignoreDirty) {\n $scope.formCtrl.$setDirty(true);\n }\n\n ignoreDirty = false;\n\n });\n }\n };\n});\n","fg.controller('fgEditPaletteController', function ($scope, fgConfig) {\n\n $scope.templates = angular.copy(fgConfig.fields.templates);\n\n var count = 0;\n\n $scope.templateFilter = function (template) {\n return !$scope.selectedCategory || $scope.selectedCategory[template.type];\n };\n\n});","fg.directive('fgEditPalette',function () {\n return {\n require: ['^fgSchema'],\n templateUrl: 'angular-form-gen/edit/palette/palette.ng.html',\n controller: 'fgEditPaletteController',\n link: function($scope, $element, $attrs, ctrls) {\n $scope.schemaCtrl = ctrls[0];\n }\n };\n});","fg.controller('fgFieldController', function($scope, fgUtils) {\n\n var self = this;\n var _form, _field;\n\n this.init = function(fgFormCtrl, fieldSchema, editMode) {\n \n self.initForm(fgFormCtrl);\n self.initField(fieldSchema);\n self.initDefaultData(fieldSchema, editMode);\n\n $scope.form = _form;\n $scope.field = _field;\n \n };\n\n this.initForm = function(fgFormCtrl) {\n _form = fgFormCtrl ? fgFormCtrl.model : {};\n\n return _form;\n };\n\n this.initField = function(fieldSchema) {\n\n _field = {\n $_id: 'id' + fgUtils.getUnique(),\n schema: fieldSchema\n };\n\n $scope.$watch('field.schema.name', function(value, oldValue) {\n self.registerState(value);\n });\n\n return _field;\n };\n\n this.initDefaultData = function(fieldSchema, editMode) {\n\n var fieldName = fieldSchema.name;\n\n _form.data = _form.data || {};\n \n if (editMode) {\n \n $scope.$watch('field.schema.value', function(value) {\n _form.data[fieldSchema.name] = value;\n });\n\n $scope.$watch('field.schema.name', function(value, oldValue) {\n if(value !== oldValue) {\n var data = _form.data[oldValue];\n delete _form.data[oldValue];\n _form.data[value] = data;\n }\n });\n\n } else if (_form.data && _form.data[fieldName] === undefined && fieldSchema.value !== undefined) {\n _form.data[fieldName] = fieldSchema.value;\n }\n\n return _form.data;\n };\n\n this.setFieldState = function(state) {\n // Called by the field-input directive\n _field.state = state;\n self.registerState(_field.schema.name);\n };\n\n this.registerState = function(fieldName) {\n // Re-register the ngModelCtrl with the form controller\n // whenever the name of the field has been modified.\n\n if (_form.state && _field.state) {\n _form.state.$removeControl(_field.state);\n _field.state.$name = fieldName;\n _form.state.$addControl(_field.state);\n }\n\n _field.name = fieldName;\n\n };\n\n this.field = function() {\n return _field;\n };\n\n this.form = function() {\n return _form;\n };\n});","fg.directive('fgField', function(fgFieldLinkFn) {\n\n return {\n require: ['^?fgForm', 'fgField'],\n replace: true,\n templateUrl: 'angular-form-gen/form/field/field.ng.html',\n scope: {\n fieldSchema: '=fgField', // The schema definition of the field\n tabIndex: '=?fgTabIndex', // Optional tab index -- used in overlay mode to disable focus\n editMode: '=?fgEditMode', // Indicates edit mode, which will sync the fieldSchema.value\n // to the form data for WYSIWYG pleasures.\n noValidationSummary: '=fgNoValidationSummary' // If true hides the validation summary\n },\n controller: 'fgFieldController',\n link: fgFieldLinkFn\n };\n\n}).factory('fgFieldLinkFn', function(fgUtils) {\n return function($scope, $element, $attrs, ctrls) {\n\n var fgFormCtrl = ctrls[0];\n var fgFieldCtrl = ctrls[1];\n\n if ($scope.tabIndex === undefined) {\n $scope.tabIndex = 'auto';\n }\n\n $scope.renderInfo = fgUtils.getRenderInfo($scope.fieldSchema);\n\n fgFieldCtrl.init(fgFormCtrl, $scope.fieldSchema, $scope.editMode);\n };\n});","//fg.directive('fgFieldFocus', function($parse) {\n// return {\n// require: ['?^fgForm'],\n// link: function($scope, $element, $attrs, ctrls) {\n//\n// var formCtrl = ctrls[0];\n//\n// // if(formCtrl && formCtrl.editMode) {\n// // return;\n// // }\n//\n// var e = $element[0];\n//\n// var getModel = $parse($attrs.fgFieldFocus);\n// var setModel = getModel.assign;\n//\n// $scope.$watch(getModel, function(value) {\n//\n// if (value) {\n// if(formCtrl) {\n// formCtrl.clearFocusOnFields();\n// setModel($scope, true);\n//\n// if(formCtrl.editMode) {\n// return;\n// }\n// }\n//\n// e.focus();\n//\n// } else if(formCtrl && !formCtrl.editMode) {\n//\n// e.blur();\n//\n// }\n// });\n//\n// // function onBlur() {\n// // // if(getModel($scope) !== undefined) {\n// // // $timeout(function() {\n// // // setModel($scope, false);\n// // // });\n// // // }\n// // }\n//\n// // function onFocus() {\n// // $timeout(function() {\n// // setModel($scope, true);\n// // });\n// // }\n//\n// // $element.on('focus', onFocus);\n// // $element.on('blur', onBlur);\n//\n// // $scope.$on('$destroy', function() {\n// // $element.off('focus', onFocus);\n// // $element.off('blur', onBlur);\n// // });\n// }\n// };\n//});\n","fg.directive('fgFieldInput', function(fgFieldInputLinkFn) {\n return {\n require: ['^fgField', 'ngModel'],\n link: fgFieldInputLinkFn\n };\n}).factory('fgFieldInputLinkFn', function() {\n return function($scope, $element, $attrs, ctrls) {\n\n var fgFieldCtrl = ctrls[0];\n var ngModelCtrl = ctrls[1];\n\n fgFieldCtrl.setFieldState(ngModelCtrl);\n };\n});","fg.directive('fgFormFields', function() {\n\n return {\n require: ['^?fgForm'],\n restrict: 'AE',\n templateUrl: 'angular-form-gen/form/form-fields/form-fields.ng.html',\n scope: {},\n link: function($scope, $element, $attrs, ctrls) {\n\n var fgForm = ctrls[0];\n\n $scope.$watch(function() {\n return fgForm.model;\n }, function(value) {\n $scope.form = value;\n });\n }\n };\n\n});","fg.controller('fgSchemaController', function($scope, fgUtils) {\n\n var _model;\n\n this.model = function(value) {\n if(value !== undefined) {\n _model = value;\n\n if(!angular.isArray(value.fields)) {\n value.fields = [];\n }\n }\n \n return _model;\n };\n\n this.addField = function(field, index) {\n\n var copy = fgUtils.copyField(field);\n\n index = index === undefined ? _model.fields.length : index;\n _model.fields.splice(index, 0, copy);\n\n };\n\n this.removeField = function(index) {\n _model.fields.splice(index, 1);\n };\n\n this.swapFields = function(idx1, idx2) {\n if (idx1 <= -1 || idx2 <= -1 || idx1 >= _model.fields.length || idx2 >= _model.fields.length) {\n return;\n }\n\n _model.fields[idx1] = _model.fields.splice(idx2, 1, _model.fields[idx1])[0];\n };\n\n this.moveField = function(fromIdx, toIdx) {\n if (fromIdx >= 0 && toIdx <= _model.fields.length && fromIdx !== toIdx) {\n var field = _model.fields.splice(fromIdx, 1)[0];\n if (toIdx > fromIdx)--toIdx;\n _model.fields.splice(toIdx, 0, field);\n }\n };\n\n});","fg.directive('fgSchema', function(fgSchemaLinkFn) {\n\n return {\n require: ['fgSchema'],\n controller: 'fgSchemaController',\n link: fgSchemaLinkFn\n };\n\n}).factory('fgSchemaLinkFn' , function() {\n return function($scope, $element, $attrs, ctrls) {\n var schemaCtrl = ctrls[0];\n\n $scope.$watch($attrs.fgSchema, function(value) {\n schemaCtrl.model(value);\n });\n\n };\n});\n\n","fg.directive('fgEditCanvasField', function() {\n\n return {\n templateUrl: 'angular-form-gen/edit/canvas/field/field.ng.html'\n };\n\n});","fg.controller('fgEditPaletteCategoriesController', function($scope, fgConfig) {\n\n $scope.categories = fgConfig.fields.categories;\n\n $scope.setCategory = function(name, category) {\n $scope.categoryName = name;\n $scope.category = category;\n };\n\n if(!$scope.category) {\n //noinspection LoopStatementThatDoesntLoopJS\n for (var name in $scope.categories) {\n //noinspection JSUnfilteredForInLoop\n $scope.setCategory(name, $scope.categories[name]);\n break;\n }\n }\n});","fg.directive('fgEditPaletteCategories', function () {\n return {\n templateUrl: 'angular-form-gen/edit/palette/categories/categories.ng.html',\n require: '^fgEditPalette',\n scope: {\n category: \"=?\"\n },\n controller: 'fgEditPaletteCategoriesController'\n };\n});","fg.directive('fgEditCanvasFieldProperties', function (fgUtils) {\n\n // To keep the form validation working, the contents of the tabs needs to be rendered even if the tab is not active.\n\n function setRenderAlways(tabItems) {\n var i = tabItems.length;\n\n while (i--) {\n var tab = tabItems[i];\n\n // Skip the debug tab\n\n if(tab.title !== 'Debug') {\n tab.renderAlways = true;\n }\n }\n }\n\n return {\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/properties.ng.html',\n scope: {\n field: '=fgEditCanvasFieldProperties'\n },\n link: {\n pre: function ($scope) {\n $scope.property = {};\n },\n post: function ($scope) {\n\n $scope.$watch('fieldPropertiesForm.$invalid', function (newValue) {\n $scope.field.$_invalid = newValue;\n });\n\n $scope.renderInfo = fgUtils.getRenderInfo($scope.field);\n\n\n $scope.$watch('property.tabs.items.length', function(value) {\n if(value) {\n setRenderAlways($scope.property.tabs.items);\n }\n });\n\n }\n }\n };\n});\n","fg.controller('fgPropertyFieldOptionsController', function($scope) {\n\n var self = this;\n var optionCounter = 1;\n\n // Monitor for changes in the options array and ensure a\n // watch for every option value.\n // Watchers are deleted when removing options from the array.\n\n $scope.$watchCollection('field.options', function(options) {\n if (options) {\n angular.forEach(options, function(option) {\n if (!option.$_valueWatchFn) {\n option.$_valueWatchFn = $scope.$watch(function() {\n return option.value;\n }, handleValueChange);\n }\n });\n }\n });\n\n function handleValueChange(newValue, oldValue) {\n\n // Called by the watch collection\n // Ensure that when the selected value is changed, this\n // is synced to the field value.\n\n if (newValue !== oldValue) {\n if ($scope.multiple) {\n $scope.field.value[newValue] = $scope.field.value[oldValue];\n delete $scope.field.value[oldValue];\n } else {\n if (oldValue === $scope.field.value) {\n $scope.field.value = newValue;\n }\n }\n }\n }\n\n this.addOption = function() {\n\n if (!$scope.field.options) {\n $scope.field.options = [];\n }\n\n var option = {\n value: 'Option ' + optionCounter++\n };\n\n $scope.field.options.push(option);\n\n var count = $scope.field.options.length;\n\n if(!$scope.multiple && count === 1) {\n $scope.field.value = option.value;\n }\n\n };\n\n this.removeOption = function(index) {\n var options = $scope.field.options.splice(index, 1);\n\n if (options && options.length) {\n\n var option = options[0];\n\n if ($scope.multiple) {\n\n if($scope.field.value[option.value] !== undefined)\n delete $scope.field.value[option.value];\n\n } else {\n\n if (option.value === $scope.field.value && $scope.field.options.length) {\n $scope.field.value = $scope.field.options[0].value;\n }\n\n option.$_valueWatchFn();\n }\n }\n };\n\n});","fg.directive('fgPropertyFieldOptions', function(fgPropertyFieldOptionsLinkFn) {\n return {\n scope: true,\n controller: 'fgPropertyFieldOptionsController as optionsCtrl',\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/options/options.ng.html',\n link: fgPropertyFieldOptionsLinkFn\n };\n}).factory('fgPropertyFieldOptionsLinkFn', function() {\n return function($scope, $element, $attrs, ctrls) {\n\n $scope.multiple = false;\n\n $attrs.$observe('fgPropertyFieldOptions', function(value) {\n if(value === 'multiple') {\n $scope.multiple = true;\n }\n });\n };\n});","fg.directive('fgPropertyFieldCommon', function(fgPropertyFieldCommonLinkFn) {\n return {\n restrict: 'AE',\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html',\n link: fgPropertyFieldCommonLinkFn\n };\n}).factory('fgPropertyFieldCommonLinkFn', function() {\n return function($scope, $element, $attrs, ctrls) {\n\n $scope.fields = {\n fieldname: false,\n displayname: false,\n placeholder: false,\n tooltip: false,\n focus: false\n };\n\n $scope.$watch($attrs['fgPropertyFieldCommon'], function(value) {\n $scope.fields = angular.extend($scope.fields, value);\n });\n };\n});","/*\n The field-value directive will re-render itself when certain validation values are modified.\n This is needed because angular does not watch or observe the values of certain attributes and allows\n an invalid initial value to be saved in the form schema.\n\n Important: the transcluded form field must be name fieldValue!\n\n
\n \n
\n\n The fg-field-redraw directive will trigger, on model change, the field-value to re-render itself.\n */\n\nfg.directive('fgPropertyFieldValue', function(fgPropertyFieldValueLinkFn) {\n\n return {\n require: ['^form'],\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html',\n transclude: true,\n link: fgPropertyFieldValueLinkFn\n };\n\n}).factory('fgPropertyFieldValueLinkFn', function($parse) {\n\n return function($scope, $element, $attrs, ctrls) {\n\n $scope.draw = true;\n var frmCtrl = ctrls[0];\n var oldViewValue;\n\n $scope.$watch('field.$_redraw', function(value) {\n\n if (value) {\n\n var ngModelCtrl = frmCtrl['fieldValue'];\n\n if(ngModelCtrl) {\n oldViewValue = ngModelCtrl.$viewValue;\n }\n\n $scope.draw = false;\n $scope.field.$_redraw = false;\n } else {\n $scope.draw = true;\n $element = $element;\n }\n });\n\n $scope.$watch(function() { return frmCtrl['fieldValue']; }, function(ngModelCtrl) {\n if(ngModelCtrl && oldViewValue) {\n ngModelCtrl.$setViewValue(oldViewValue);\n ngModelCtrl.$render();\n oldViewValue = undefined;\n }\n });\n };\n}).directive('fgFieldRedraw', function() {\n return {\n require: ['ngModel'],\n link: function($scope, $element, $attrs, ctrls) {\n\n var oldValue = $scope.$eval($attrs.ngModel);\n\n $scope.$watch($attrs.ngModel, function(value) {\n if(value != oldValue) {\n $scope.field.$_redraw = true;\n oldValue = value;\n }\n });\n }\n };\n});\n","fg.directive('fgPropertyField', function(fgPropertyFieldLinkFn) {\n\n return {\n restrict: 'AE',\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html',\n transclude: true,\n scope: true,\n link: fgPropertyFieldLinkFn\n };\n\n}).factory('fgPropertyFieldLinkFn', function() {\n return function($scope, $element, $attrs, ctrls) {\n \n $attrs.$observe('fgPropertyField', function(value) {\n $scope.fieldName = value;\n });\n\n $attrs.$observe('fgPropertyFieldLabel', function(value) {\n if(value) {\n $scope.fieldLabel = value;\n }\n });\n\n };\n});","fg.directive('fgParsePattern', function() {\n\n return {\n require: ['ngModel'],\n link: function($scope, $element, $attrs, ctrls) {\n var ngModelCtrl = ctrls[0];\n\n ngModelCtrl.$parsers.push(validate);\n \n function validate(value) {\n try {\n new RegExp(value);\n } catch(e) {\n ngModelCtrl.$setValidity('pattern', false);\n return undefined;\n }\n\n ngModelCtrl.$setValidity('pattern', true);\n return value;\n }\n }\n };\n});","fg.directive('fgPropertyFieldValidation', function(fgPropertyFieldValidationLinkFn) {\n return {\n restrict: 'A',\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html',\n link: fgPropertyFieldValidationLinkFn\n };\n}).factory('fgPropertyFieldValidationLinkFn', function(fgConfig) {\n\n var patternOptions = [];\n var patternConfig = fgConfig.validation.patterns;\n\n angular.forEach(patternConfig, function(value, text) {\n patternOptions.push({ value: value, text: text });\n });\n\n return function($scope, $element, $attrs, ctrls) {\n\n $scope.patternOptions = patternOptions;\n\n $scope.field.validation = $scope.field.validation || {};\n $scope.field.validation.messages = $scope.field.validation.messages || {};\n\n $scope.fields = {\n required: false,\n minlength: false,\n maxlength: false,\n pattern: false\n };\n\n $scope.$watch($attrs['fgPropertyFieldValidation'], function(value) {\n $scope.fields = angular.extend($scope.fields, value);\n });\n };\n});","fg.directive('fgEditValidationMessage', function(fgEditValidationMessageLinkFn) {\n return {\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html',\n link: fgEditValidationMessageLinkFn,\n scope: true\n };\n}).factory('fgEditValidationMessageLinkFn', function() {\n\n var DEFAULT_TOOLTIP = \"Enter a error message here that will be shown if this validation fails. If this field is empty a default message will be used.\";\n \n return function($scope, $element, $attrs, ctrls) {\n $attrs.$observe('fgEditValidationMessage', function(value) {\n $scope.validationType = value;\n });\n\n $attrs.$observe('fgEditValidationTooltip', function(value) {\n value = value || DEFAULT_TOOLTIP;\n $scope.tooltip = value;\n });\n };\n});","})(angular);"],"sourceRoot":"../src/angular-form-gen"} \ No newline at end of file +{"version":3,"sources":["angular-form-gen-header.js","angular-form-gen.js","angular-form-gen-templates.js","common\\bind-expression.js","common\\fg-dropdown-input-directive.js","common\\fg-null-form.js","common\\fg-number-input-directive.js","common\\fg-placeholder-directive.js","common\\fg-utils.js","drag\\angular-drag-queen.js","drag\\dq-drag-area.js","drag\\dq-drag-track.js","drag\\dq-draggable.js","edit\\edit-controller.js","edit\\edit-directive.js","form\\form-controller.js","form\\form-directive.js","validation\\summary-directive.js","validation\\unique-field-name.js","common\\tabs\\tabs-controller.js","common\\tabs\\tabs-directive.js","common\\tabs\\tabs-pane-directive.js","common\\jsonify\\jsonify.js","edit\\canvas\\canvas-controller.js","edit\\canvas\\canvas-directive.js","edit\\palette\\palette-controller.js","edit\\palette\\palette-directive.js","form\\field\\field-controller.js","form\\field\\field-directive.js","form\\field\\field-focus-directive.js","form\\field\\field-input-directive.js","form\\form-fields\\form-fields-directive.js","form\\schema\\schema-controller.js","form\\schema\\schema-directive.js","edit\\canvas\\field\\field-directive.js","edit\\palette\\categories\\categories-controller.js","edit\\palette\\categories\\categories-directive.js","edit\\canvas\\field\\properties\\properties-directive.js","edit\\canvas\\field\\properties\\options\\options-controller.js","edit\\canvas\\field\\properties\\options\\options-directive.js","edit\\canvas\\field\\properties\\property-field\\common-directive.js","edit\\canvas\\field\\properties\\property-field\\field-value-directive.js","edit\\canvas\\field\\properties\\property-field\\property-field-directive.js","edit\\canvas\\field\\properties\\validation\\parse-pattern-directive.js","edit\\canvas\\field\\properties\\validation\\validation-directive.js","edit\\canvas\\field\\properties\\validation\\validation-message-directive.js","angular-form-gen-footer.js"],"names":[],"mappings":"AAAA;GACA;GACA;GACA;AACA;AACA;;ACLA;;AAEA;CACA;CACA;CACA;CACA;AACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;AACA;;AAEA,UAAA,aAAA;;EAEA,mBAAA,QAAA;;IAEA;MACA;MACA;QACA;QACA;MACA;MACA;QACA;QACA;QACA;MACA;IACA;;IAEA;;IAEA;MACA;;MAEA;QACA;UACA;QACA;MACA;;MAEA;IACA;;IAEA;MACA;QACA;MACA;MACA;QACA;;UAEA;YACA;UACA;;UAEA;;UAEA;YACA;UACA;YACA;UACA;;UAEA;UACA;QACA;QACA;UACA;;UAEA;YACA;UACA;;UAEA;UACA;QACA;QACA;UACA;YACA;YACA;UACA;QACA;QACA;UACA;YACA;UACA;;UAEA;YACA;UACA;;UAEA;YACA;cACA;YACA;;YAEA;UACA;QACA;MACA;MACA;QACA;;UAEA;;UAEA;;YAEA;cACA;YACA;;YAEA;UACA;YACA;UACA;QACA;QACA;;UAEA;YACA;UACA;YACA;UACA;QACA;MACA;MACA;QACA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;;AAEA,UAAA,gCAAA;;EAEA;EACA;EACA;;EAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;MACA;QACA;MACA;MACA;MACA;QACA;MACA;MACA;MACA;IACA;IACA;MACA;MACA;QACA;QACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;QACA;QACA;UACA;UACA;QACA;MACA;IACA;IACA;MACA;QACA;QACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;QACA;QACA;MACA;MACA;QACA;QACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;UACA;YACA;YACA;UACA;QACA;QACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACA;EACA;;;EAGA;IACA;MACA;IACA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA;;ACnRA;AACA;AACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;AC7CA,cAAA,gBAAA,GAAA,iBAAA;;EAEA;IACA;IACA;IACA;;IAEA;MACA;;MAEA;QACA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;MACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;QACA;;QAEA;;QAEA;;QAEA;;UAEA;;UAEA;;UAEA;YACA;UACA;QACA;UACA;QACA;MACA;IACA;EACA;AACA,CAAA,CAAA;;AC1DA,cAAA,eAAA,GAAA,2DAAA;;EAEA;;IAEA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEA;IACA;;IAEA;;IAEA;;IAEA;MACA;QACA;MACA;IACA;;IAEA;IACA;;IAEA;AACA;MACA;IACA;;AAEA;AACA;AACA;AACA;AACA;;IAEA;MACA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;IACA;;IAEA;MACA;MACA;MACA;MACA;MACA;MACA;;IAEA;;IAEA;;MAEA;;MAEA;;MAEA;;MAEA;;MAEA;QACA;QACA;;QAEA;UACA;QACA;MACA;;;MAGA;;MAEA;MACA;;MAEA;QACA;QACA;;QAEA;UACA;QACA;MACA;;MAEA;QACA;QACA;;QAEA;QACA;;MAEA;QACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;;IAEA;MACA;;QAEA;QACA;;QAEA;UACA;UACA;UACA;QACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;IACA;IACA;IACA;IACA;;MAEA;;QAEA;;QAEA;QACA;;QAEA;QACA;;QAEA;;QAEA;QACA;;QAEA;;QAEA;;QAEA;;QAEA;MACA;IACA;EACA;AACA,CAAA,CAAA;;AC5KA;CACA;CACA;AACA,cAAA,UAAA;;EAEA;IACA;IACA;IACA;IACA;IACA;EACA;;EAEA;IACA;IACA;IACA;;MAEA;;MAEA;;MAEA;;MAEA;;QAEA;;QAEA;MACA;;MAEA;;MAEA;IACA;EACA;AACA;;AAEA,cAAA,oBAAA;;EAEA;IACA;IACA;IACA;;MAEA;;MAEA;;MAEA;;QAEA;UACA;QACA;;QAEA;MACA;IACA;EACA;;AAEA;AC5DA,cAAA,aAAA;EACA;IACA;IACA;;MAEA;QACA;QACA;QACA;QACA;UACA;QACA;;QAEA;;QAEA;QACA;;QAEA;UACA;UACA;QACA;;QAEA;;MAEA;;MAEA;QACA;QACA;UACA;UACA;QACA;UACA;UACA;QACA;MACA;;MAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;YACA;YACA;UACA;YACA;YACA;UACA;QACA;;QAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;YACA;YACA;UACA;YACA;YACA;UACA;QACA;;QAEA;QACA;MACA;;MAEA;;QAEA;UACA;UACA;QACA;UACA;UACA;QACA;MACA;IACA;EACA;AACA;;ACtFA,cAAA,aAAA;EACA;IACA;IACA;GACA;EACA;IACA;MACA;QACA;MACA;IACA;EACA;AACA;ACZA,YAAA,OAAA,GAAA,0CAAA;;IAEA;;IAEA;MACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;;QAEA;QACA;;QAEA;;QAEA;UACA;UACA;QACA;UACA;UACA;UACA;QACA;;QAEA;MACA;MACA;MACA;QACA;QACA;;QAEA;UACA;UACA;UACA;QACA;;QAEA;UACA;QACA;;QAEA;UACA;QACA;;QAEA;MACA;MACA;QACA;MACA;MACA;;QAEA;;QAEA;QACA;QACA;QACA;;QAEA;;QAEA;;UAEA;UACA;;UAEA;YACA;UACA;YACA;UACA;QACA;;QAEA;MACA;MACA;QACA;MACA;MACA;QACA;QACA;QACA;MACA;MACA;QACA;;QAEA;UACA;QACA;;QAEA;UACA;YACA;YACA;cACA;YACA;YACA;cACA;YACA;UACA;QACA;;QAEA;MACA;IACA;EACA,CAAA,CAAA;ACjHA,kCAAA,OAAA,GAAA,0BAAA;;EAEA;;EAEA;EACA;IACA;MACA;IACA;IACA;MACA;MACA;MACA;MACA;;MAEA;MACA;MACA;;MAEA;IACA;IACA;MACA;QACA;MACA;MACA;IACA;IACA;MACA;MACA;MACA;IACA;IACA;MACA;MACA;;MAEA;IACA;EACA;AACA,CAAA,CAAA;ACvCA,gCAAA,UAAA,GAAA,YAAA;;EAEA;IACA;MACA;IACA;EACA;;EAEA;IACA;IACA;;MAEA;;MAEA;QACA;MACA;;MAEA;QACA;MACA;;MAEA;QACA;QACA;MACA;IACA;EACA;AACA,CAAA,CAAA;;AC5BA,gCAAA,WAAA,EAAA,gBAAA;EACA;IACA;EACA;AACA,CAAA,CAAA,aAAA,WAAA,EAAA,gBAAA;IACA;MACA;IACA;EACA,CAAA,CAAA,aAAA,UAAA,EAAA,gBAAA;IACA;MACA;IACA;EACA,CAAA,CAAA,aAAA,MAAA,EAAA,gBAAA;IACA;MACA;IACA;EACA,CAAA,CAAA,WAAA,WAAA,GAAA,yBAAA;;IAEA;;IAEA;;MAEA;;MAEA;;QAEA;QACA;QACA;QACA;QACA;;QAEA;;QAEA;UACA;;UAEA;;UAEA;;UAEA;;YAEA;;YAEA;;cAEA;;cAEA;YACA;UACA;;UAEA;;UAEA;;UAEA;UACA;;UAEA;;UAEA;;UAEA;;UAEA;QACA;;QAEA;UACA;UACA;UACA;YACA;cACA;gBACA;cACA;YACA;cACA;YACA;UACA;QACA;;QAEA;UACA;UACA;QACA;;QAEA;UACA;UACA;QACA;;QAEA;UACA;YACA;YACA;UACA;QACA;;QAEA;UACA;YACA;YACA;YACA;cACA;gBACA;cACA;YACA;UACA;QACA;;QAEA;UACA;;YAEA;YACA;;YAEA;YACA;;YAEA;YACA;UACA;QACA;;QAEA;QACA;;UAEA;;YAEA;;YAEA;YACA;;YAEA;cACA;gBACA;cACA;YACA;;YAEA;;YAEA;;YAEA;;cAEA;cACA;cACA;;cAEA;cACA;YACA;UACA;QACA;;QAEA;QACA;;UAEA;;UAEA;YACA;;YAEA;cACA;YACA;UACA;;UAEA;QACA;;QAEA;;QAEA;MACA;IACA;;EAEA,CAAA,CAAA;;ACpLA,gCAAA,WAAA,GAAA,0BAAA;;EAEA;IACA;MACA;;MAEA;QACA;QACA;MACA;;MAEA;;MAEA;IACA;EACA;;EAEA;IACA;IACA;;MAEA;MACA;;MAEA;QACA;QACA;MACA;;MAEA;;QAEA;;QAEA;UACA;UACA;UACA;QACA;MACA;;UAEA;;UAEA;YACA;UACA;;UAEA;UACA;UACA;;UAEA;YACA;UACA;;QAEA;;UAEA;YACA;UACA;;QAEA;IACA;EACA;;AAEA,CAAA,CAAA;AChEA,eAAA,gBAAA,GAAA,mCAAA;;EAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;EAEA;;IAEA;;IAEA;;IAEA;AACA;AACA;AACA;;MAEA;;MAEA;;QAEA;;QAEA;UACA;QACA;MACA;IACA;;EAEA;;AAEA,CAAA,CAAA;ACvCA,cAAA,MAAA;EACA;IACA;IACA;IACA;IACA;MACA;MACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACA;IACA;IACA,aAAA,4BAAA;IACA;IACA;;MAEA;QACA;MACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;MAEA;MACA;IACA;EACA;AACA;ACtCA,eAAA,gBAAA,GAAA,qBAAA;;EAEA;EACA;;EAEA;IACA;;IAEA;;IAEA;IACA;;IAEA;MACA;QACA;;QAEA;UACA;QACA;MACA;;MAEA;IACA;;IAEA;MACA;IACA;MACA;QACA;MACA;QACA;MACA;IACA;;IAEA;;;IAGA;EACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,CAAA,CAAA;;AC/CA,cAAA,MAAA,GAAA,oBAAA;EACA;IACA;IACA;IACA,aAAA,gBAAA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,YAAA;IACA;;MAEA;MACA;MACA;;MAEA;;MAEA;;IAEA;AACA,YAAA,eAAA,GAAA,iBAAA;EACA;;IAEA;;IAEA;;IAEA;MACA;MACA;IACA;;IAEA;EACA;AACA,CAAA,CAAA;;;AClCA,cAAA,mBAAA,GAAA,8BAAA;;EAEA;IACA;IACA;IACA;MACA;MACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,yBAAA,GAAA,aAAA;;EAEA;;IAEA;IACA;;IAEA;MACA;MACA;MACA;;IAEA;;MAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;QACA;MACA;IACA;;IAEA;IACA;;IAEA;MACA;QACA;UACA;QACA;MACA;IACA;;IAEA;EACA;;AAEA,CAAA,CAAA;ACnDA,cAAA,iBAAA;;EAEA;;EAEA;;IAEA;IACA;IACA;;IAEA;;MAEA;;MAEA;QACA;QACA;UACA;UACA;QACA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;IACA;IACA;;MAEA;MACA;;MAEA;;MAEA;QACA;MACA;;MAEA;;QAEA;QACA;;QAEA;MACA;;MAEA;;QAEA;QACA;;QAEA;MACA;IACA;EACA;AACA;;ACzDA,eAAA,gBAAA;;EAEA;EACA;;EAEA;IACA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;EACA;;EAEA;;IAEA;MACA;IACA;;EAEA;;AAEA;;ACzBA,cAAA,MAAA;EACA;IACA;IACA;IACA;IACA,aAAA,gBAAA;IACA;IACA;MACA;IACA;IACA;MACA;IACA;EACA;AACA;;;;;ACdA,cAAA,UAAA,GAAA,qBAAA;EACA;IACA;IACA;IACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,gBAAA;EACA;;IAEA;;IAEA;MACA;MACA;MACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;AACA;;AC3BA;CACA;;CAEA;GACA;CACA;CACA;AACA;;AAEA,WAAA,IAAA;EACA;;IAEA;MACA;;IAEA;IACA;IACA;EACA;AACA,cAAA,OAAA,GAAA,uBAAA;IACA;MACA;MACA;MACA;QACA;QACA;MACA;MACA;QACA;;QAEA;UACA;QACA;MACA;IACA;EACA,CAAA,CAAA;;ACnCA,eAAA,sBAAA,GAAA,6CAAA;;EAEA;IACA;IACA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;EACA;;EAEA;IACA;EACA;;EAEA;AACA;IACA;IACA;EACA;;EAEA;IACA;EACA;;EAEA;;IAEA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;MACA;AACA;IACA;;EAEA;;EAEA;;IAEA;;IAEA;;MAEA;MACA;MACA;MACA;;MAEA;QACA;;MAEA;QACA;;QAEA;QACA;MACA;;MAEA;MACA;IACA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;AC/EA,cAAA,YAAA;;EAEA;IACA;IACA;IACA,aAAA,oCAAA;IACA;MACA;MACA;MACA;;MAEA;;MAEA;;QAEA;;QAEA;UACA;QACA;;QAEA;;MAEA;IACA;EACA;AACA;;AC1BA,eAAA,uBAAA,GAAA,uBAAA;;EAEA;;EAEA;;EAEA;IACA;EACA;;AAEA,CAAA,CAAA;ACVA,cAAA,aAAA;EACA;IACA;IACA;IACA,aAAA,uBAAA;IACA;MACA;IACA;EACA;AACA;ACTA,eAAA,iBAAA,GAAA,sBAAA;;EAEA;EACA;;EAEA;;IAEA;IACA;IACA;;IAEA;IACA;;EAEA;;EAEA;IACA;;IAEA;EACA;;EAEA;;IAEA;MACA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;;IAEA;;MAEA;QACA;MACA;;MAEA;QACA;UACA;UACA;UACA;QACA;MACA;;IAEA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;IACA;IACA;EACA;;EAEA;IACA;IACA;;IAEA;MACA;MACA;MACA;IACA;;IAEA;;EAEA;;EAEA;IACA;EACA;;EAEA;IACA;EACA;AACA,CAAA,CAAA;AC1FA,cAAA,OAAA,GAAA,kBAAA;;EAEA;IACA;IACA;IACA;IACA;MACA;MACA;MACA;MACA;MACA;IACA;IACA,aAAA,iBAAA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,aAAA,GAAA,YAAA;EACA;;IAEA;IACA;;IAEA;MACA;IACA;;IAEA;;IAEA;EACA;AACA,CAAA,CAAA;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA,cAAA,YAAA,GAAA,uBAAA;EACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,kBAAA;EACA;;IAEA;IACA;;IAEA;EACA;AACA,YAAA,eAAA;EACA;EACA;EACA;IACA;IACA;MACA;UACA;UACA;UACA;QACA;QACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;YACA;YACA;UACA;YACA;YACA;UACA;QACA;IACA;EACA;AACA;;AC1CA,cAAA,YAAA;;EAEA;IACA;IACA;IACA;IACA;IACA;;MAEA;;MAEA;QACA;MACA;QACA;MACA;IACA;EACA;;AAEA;ACnBA,eAAA,kBAAA,GAAA,sBAAA;;EAEA;;EAEA;IACA;MACA;;MAEA;QACA;MACA;IACA;;IAEA;EACA;;EAEA;;IAEA;;IAEA;IACA;;EAEA;;EAEA;IACA;EACA;;EAEA;IACA;MACA;IACA;;IAEA;EACA;;EAEA;IACA;MACA;MACA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;AC7CA,cAAA,QAAA,GAAA,mBAAA;;EAEA;IACA;IACA,aAAA,kBAAA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,cAAA;EACA;IACA;;IAEA;MACA;IACA;;EAEA;AACA;;;ACjBA,cAAA,iBAAA;;EAEA;IACA;EACA;;AAEA;ACNA,eAAA,iCAAA,GAAA,uBAAA;;EAEA;;EAEA;IACA;IACA;EACA;;EAEA;IACA;IACA;MACA;MACA;MACA;IACA;EACA;AACA,CAAA,CAAA;ACjBA,cAAA,uBAAA;EACA;IACA;IACA;IACA;MACA;IACA;IACA,aAAA,iCAAA;EACA;AACA;ACTA,cAAA,2BAAA,GAAA,YAAA;;EAEA;;EAEA;IACA;;IAEA;MACA;;MAEA;;MAEA;QACA;MACA;IACA;EACA;;EAEA;IACA;IACA;MACA;IACA;IACA;MACA;QACA;MACA;MACA;;QAEA;UACA;QACA;;QAEA;;;QAGA;UACA;YACA;UACA;QACA;;MAEA;IACA;EACA;AACA,CAAA,CAAA;;AC7CA,eAAA,gCAAA,GAAA,WAAA;;EAEA;EACA;;EAEA;EACA;EACA;;EAEA;IACA;MACA;QACA;UACA;YACA;UACA;QACA;MACA;IACA;EACA;;EAEA;;IAEA;IACA;IACA;;IAEA;MACA;QACA;QACA;MACA;QACA;UACA;QACA;MACA;IACA;EACA;;EAEA;;IAEA;MACA;IACA;;IAEA;MACA;IACA;;IAEA;;IAEA;;IAEA;MACA;IACA;;EAEA;;EAEA;IACA;;IAEA;;MAEA;;MAEA;;QAEA;UACA;;MAEA;;QAEA;UACA;QACA;;QAEA;MACA;IACA;EACA;;AAEA,CAAA,CAAA;AClFA,cAAA,sBAAA,GAAA,iCAAA;EACA;IACA;IACA,aAAA,+CAAA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,4BAAA;EACA;;IAEA;;IAEA;MACA;QACA;MACA;IACA;EACA;AACA;AClBA,cAAA,qBAAA,GAAA,gCAAA;EACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,2BAAA;EACA;;IAEA;MACA;MACA;MACA;MACA;MACA;IACA;;IAEA;MACA;IACA;EACA;AACA;ACrBA;MACA;MACA;MACA;;MAEA;;MAEA;QACA;eACA;eACA;eACA;eACA;eACA;MACA;;MAEA;CACA;;AAEA,cAAA,oBAAA,GAAA,+BAAA;;EAEA;IACA;IACA;IACA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,0BAAA,GAAA,WAAA;;EAEA;;IAEA;IACA;IACA;;IAEA;;MAEA;;QAEA;;QAEA;UACA;QACA;;QAEA;QACA;MACA;QACA;QACA;MACA;IACA;;IAEA;MACA;QACA;QACA;QACA;MACA;IACA;EACA;AACA,CAAA,CAAA,aAAA,aAAA;EACA;IACA;IACA;;MAEA;;MAEA;QACA;UACA;UACA;QACA;MACA;IACA;EACA;AACA;;AC7EA,cAAA,eAAA,GAAA,0BAAA;;EAEA;IACA;IACA;IACA;IACA;IACA;EACA;;AAEA,CAAA,CAAA,WAAA,qBAAA;EACA;;IAEA;MACA;IACA;;IAEA;MACA;QACA;MACA;IACA;;EAEA;AACA;ACxBA,cAAA,cAAA;;EAEA;IACA;IACA;MACA;;MAEA;;MAEA;QACA;UACA;QACA;UACA;UACA;QACA;;QAEA;QACA;MACA;IACA;EACA;AACA;ACtBA,cAAA,yBAAA,GAAA,oCAAA;EACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,+BAAA,GAAA,aAAA;;EAEA;EACA;;EAEA;IACA;EACA;;EAEA;;IAEA;;IAEA;IACA;;IAEA;MACA;MACA;MACA;MACA;IACA;;IAEA;MACA;IACA;EACA;AACA,CAAA,CAAA;ACjCA,cAAA,uBAAA,GAAA,kCAAA;EACA;IACA;IACA;IACA;EACA;AACA,CAAA,CAAA,WAAA,6BAAA;;EAEA;;EAEA;IACA;MACA;IACA;;IAEA;MACA;MACA;IACA;EACA;AACA;ACpBA","file":"angular-form-gen.js","sourcesContent":["/*!\n angular-form-gen v0.0.3\n (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen\n License: MIT\n*/\n(function(angular) {\n","var fg = angular.module('fg', ['dq']);\r\n\r\n/**\r\n * Constructor for form-gen Field types.\r\n * @param {string} type Indicates the type of field\r\n * @param {object} properties [optional] Initial property values\r\n */\r\nfg.constant('FgField', function FgField(type, properties) {\r\n this.name = this.type = type;\r\n\r\n if (properties) {\r\n angular.extend(this, properties);\r\n }\r\n\r\n this.displayName = this.displayName || this.type.charAt(0).toUpperCase() + this.type.substring(1);\r\n }\r\n);\r\n\r\nfg.config(function ($provide) {\r\n\r\n $provide.provider('fgConfig', function () {\r\n\r\n var config = {\r\n enableDebugInfo: true,\r\n validation: {\r\n messages: {},\r\n patterns: {}\r\n },\r\n fields: {\r\n templates: [],\r\n categories: {},\r\n renderInfo: {}\r\n }\r\n };\r\n\r\n var templates = config.fields.templates;\r\n\r\n function indexOfTemplate(type) {\r\n var idx = templates.length;\r\n\r\n while (idx--) {\r\n if (templates[idx].type === type) {\r\n break;\r\n }\r\n }\r\n\r\n return idx;\r\n }\r\n\r\n return {\r\n debug: function (value) {\r\n config.enableDebugInfo = value;\r\n },\r\n fields: {\r\n add: function (objectTemplate, categories, templateUrl, propertiesTemplateUrl) {\r\n\r\n if (!objectTemplate || !objectTemplate.type || !categories || !categories.length) {\r\n throw new Error('Need a valid objectTemplate and at least one category');\r\n }\r\n\r\n var idx = indexOfTemplate(objectTemplate.type);\r\n\r\n if (idx !== -1) {\r\n templates[idx] = objectTemplate;\r\n } else {\r\n templates.push(objectTemplate);\r\n }\r\n\r\n this.category(objectTemplate.type, categories);\r\n this.renderInfo(objectTemplate.type, templateUrl, propertiesTemplateUrl);\r\n },\r\n remove: function (type) {\r\n var idx = indexOfTemplate(type);\r\n\r\n if (idx !== -1) {\r\n templates.splice(idx, 1);\r\n }\r\n\r\n this.category(type);\r\n this.renderInfo(type);\r\n },\r\n renderInfo: function (fieldType, templateUrl, propertiesTemplateUrl) {\r\n config.fields.renderInfo[fieldType] = {\r\n templateUrl: templateUrl,\r\n propertiesTemplateUrl: propertiesTemplateUrl\r\n };\r\n },\r\n category: function (fieldType, categories) {\r\n if (!angular.isArray(categories)) {\r\n categories = [categories];\r\n }\r\n\r\n angular.forEach(config.fields.categories, function (category) {\r\n delete category[fieldType];\r\n });\r\n\r\n angular.forEach(categories, function (category) {\r\n if (config.fields.categories[category] === undefined) {\r\n config.fields.categories[category] = {};\r\n }\r\n\r\n config.fields.categories[category][fieldType] = true;\r\n });\r\n }\r\n },\r\n validation: {\r\n message: function (typeOrObject, message) {\r\n\r\n var messages = config.validation.messages;\r\n\r\n if (angular.isString(typeOrObject)) {\r\n\r\n if (!message) {\r\n throw new Error('No message specified for ' + typeOrObject);\r\n }\r\n\r\n messages[typeOrObject] = message;\r\n } else {\r\n angular.extend(messages, typeOrObject);\r\n }\r\n },\r\n pattern: function (nameOrObject, pattern) {\r\n\r\n if (angular.isString(nameOrObject)) {\r\n config.validation.patterns[name] = pattern;\r\n } else {\r\n angular.extend(config.validation.patterns, nameOrObject);\r\n }\r\n }\r\n },\r\n $get: function () {\r\n return config;\r\n }\r\n };\r\n });\r\n\r\n});\r\n\r\nfg.config(function (fgConfigProvider, FgField) {\r\n\r\n // - - - - - - - - - - - - - - - - - - - - - -\r\n // Messages\r\n // - - - - - - - - - - - - - - - - - - - - - -\r\n\r\n fgConfigProvider.validation.message({\r\n required: 'A value is required for this field.',\r\n minlength: 'The value does not match the minimum length{{ field.schema && (\" of \" + field.schema.validation.minlength + \" characters\" || \"\")}}.',\r\n maxlength: 'The value exceeds the maximum length{{ field.schema && (\" of \" + field.schema.validation.maxlength + \" characters\" || \"\")}}.',\r\n pattern: 'The value \"{{ field.state.$viewValue }}\" does not match the required format.',\r\n email: 'The value \"{{ field.state.$viewValue }}\" is not a valid email address.',\r\n unique: 'The value \"{{ field.state.$viewValue }}\" is already in use.',\r\n number: 'The value \"{{ field.state.$viewValue }}\" is not a number.',\r\n min: 'The value {{ field.schema && (\"should be at least \" + field.schema.validation.min) || field.state.$viewValue + \" is too low\" }}',\r\n max: 'The value {{ field.schema && (\"should be less than \" + field.schema.validation.max) || field.state.$viewValue + \" is too high\" }}'\r\n });\r\n\r\n // - - - - - - - - - - - - - - - - - - - - - -\r\n // Fields\r\n // - - - - - - - - - - - - - - - - - - - - - -\r\n\r\n var categories = {\r\n 'Text input fields': [\r\n new FgField('text', {\r\n displayName: 'Textbox'\r\n }),\r\n new FgField('email'),\r\n new FgField('number', {\r\n validation: { maxlength: 15 /* to prevent > Number.MAX_VALUE */ }\r\n }),\r\n new FgField('password'),\r\n new FgField('textarea')\r\n ],\r\n 'Checkbox fields': [\r\n new FgField('checkbox', { nolabel: true }),\r\n new FgField('checkboxlist', {\r\n displayName: 'Checkbox List',\r\n options: [\r\n {\r\n value: '1',\r\n text: 'Option 1'\r\n },\r\n {\r\n value: '2',\r\n text: 'Option 2'\r\n },\r\n {\r\n value: '3',\r\n text: 'Option 3'\r\n }\r\n ],\r\n value: {\r\n '1': true,\r\n '2': true\r\n }\r\n })\r\n ],\r\n 'Select input fields': [\r\n new FgField('radiobuttonlist', {\r\n displayName: 'Radiobutton List',\r\n options: [\r\n {\r\n value: '1',\r\n text: 'Option 1'\r\n },\r\n {\r\n value: '2',\r\n text: 'Option 2'\r\n },\r\n {\r\n value: '3',\r\n text: 'Option 3'\r\n }\r\n ],\r\n value: '1'\r\n }),\r\n new FgField('selectlist', {\r\n displayName: 'Select List',\r\n options: [\r\n {\r\n value: '1',\r\n text: 'Option 1'\r\n },\r\n {\r\n value: '2',\r\n text: 'Option 2'\r\n },\r\n {\r\n value: '3',\r\n text: 'Option 3'\r\n }\r\n ],\r\n value: '1'\r\n }) // ,\r\n // new FgField('dropdownlist', {\r\n // options: [{\r\n // value: '1',\r\n // text: 'Option 1'\r\n // }, {\r\n // value: '2',\r\n // text: 'Option 2'\r\n // }, {\r\n // value: '3',\r\n // text: 'Option 3'\r\n // }],\r\n // value: '1'\r\n // })\r\n ]\r\n };\r\n\r\n\r\n angular.forEach(categories, function (fields, category) {\r\n angular.forEach(fields, function (field) {\r\n fgConfigProvider.fields.add(field, category /*, templateUrl, propertiesTemplateUrl */);\r\n });\r\n });\r\n\r\n // - - - - - - - - - - - - - - - - - - - - - -\r\n // Patterns\r\n // - - - - - - - - - - - - - - - - - - - - - -\r\n\r\n fgConfigProvider.validation.pattern({\r\n 'None': undefined,\r\n 'Url': '^(https?:\\\\/\\\\/)?([\\\\da-z\\\\.-]+)\\\\.([a-z\\\\.]{2,6})([\\\\/\\\\w \\\\.-]*)*\\\\/?$',\r\n 'Domain': '^([a-z][a-z0-9\\\\-]+(\\\\.|\\\\-*\\\\.))+[a-z]{2,6}$',\r\n 'IPv4 Address': '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$',\r\n 'Email Address': '^([a-z0-9_\\\\.-]+)@([\\\\da-z\\\\.-]+)\\\\.([a-z\\\\.]{2,6})$',\r\n 'Integer': '^-{0,1}\\\\d+$',\r\n 'Positive Integers': '^\\\\d+$',\r\n 'Negative Integers': '^-\\\\d+$',\r\n 'Number': '^-{0,1}\\\\d*\\\\.{0,1}\\\\d+$',\r\n 'Positive Number': '^\\\\d*\\\\.{0,1}\\\\d+$',\r\n 'Negative Number': '^-\\\\d*\\\\.{0,1}\\\\d+$',\r\n 'Year (1920-2099)': '^(19|20)[\\\\d]{2,2}$',\r\n 'Password': '(?=.*\\\\d)(?=.*[!@#$%^&*\\\\-=()|?.\\\"\\';:]+)(?![.\\\\n])(?=.*[A-Z])(?=.*[a-z]).*$'\r\n });\r\n});\r\n","// ATTENTION!\n// DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY\n// SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED\nangular.module('fg').run(['$templateCache', function($templateCache){\n $templateCache.put('angular-form-gen/edit/edit.ng.html', '
');\n $templateCache.put('angular-form-gen/validation/summary.ng.html', '');\n $templateCache.put('angular-form-gen/common/jsonify/jsonify.ng.html', '
{{ jsonify | j$on:displayHidden }}
');\n $templateCache.put('angular-form-gen/common/tabs/tabs-pane.ng.html', '
');\n $templateCache.put('angular-form-gen/common/tabs/tabs.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/canvas.ng.html', '
Canvas

X

Drag one of the available templates from the palette onto this canvas.

');\n $templateCache.put('angular-form-gen/edit/palette/palette.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/checkbox.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/checkboxlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/dropdownlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/email.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/not-in-cache.ng.html', '

No template registered in cache for field type \\\"{{ field.type }}\\\".

');\n $templateCache.put('angular-form-gen/field-templates/default/number.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/password.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/radiobuttonlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/default/selectlist.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/text.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/default/textarea.ng.html', '');\n $templateCache.put('angular-form-gen/field-templates/properties/checkbox.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/checkboxlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/dropdownlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/email.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/number.ng.html', '
= 0\\\">
= 0\\\">
');\n $templateCache.put('angular-form-gen/field-templates/properties/password.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/radiobuttonlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/selectlist.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/text.ng.html', '
');\n $templateCache.put('angular-form-gen/field-templates/properties/textarea.ng.html', '
');\n $templateCache.put('angular-form-gen/form/field/field.ng.html', '
');\n $templateCache.put('angular-form-gen/form/form-fields/form-fields.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/field.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/palette/categories/categories.ng.html', 'Palette - {{ categoryName || \\'All field types\\' }} ');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/properties.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/options/options.ng.html', '

No options defined

Click here to add a new option definition to this field.

0\\\" class=\\\"table-field-options\\\">
ValueText
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html', '
');\n $templateCache.put('angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html', '
= 1\\\">
= 1\\\">
0\\\">
');\n}]);","fg.directive('fgBindExpression', function ($interpolate) {\r\n\r\n function buildWatchExpression(interpolateFn) {\r\n var sb = [];\r\n var expressions = interpolateFn.expressions;\r\n var ii = expressions.length;\r\n\r\n while (ii--) {\r\n var expression = expressions[ii];\r\n\r\n if (expression.exp && !expression.exp.match(/^\\s*$/)) {\r\n sb.push(expression.exp);\r\n }\r\n }\r\n\r\n return '[' + sb.join() + ']';\r\n }\r\n\r\n return function (scope, element, attr) {\r\n\r\n var interpolateFn, watchHandle, oldWatchExpr;\r\n\r\n function cleanWatchHandle() {\r\n if (watchHandle) watchHandle();\r\n watchHandle = undefined;\r\n }\r\n\r\n function interpolateExpression() {\r\n element.text(interpolateFn(scope));\r\n }\r\n\r\n scope.$on('$destroy', function () {\r\n cleanWatchHandle();\r\n });\r\n\r\n scope.$watch(attr.fgBindExpression, function (value) {\r\n if (value !== undefined) {\r\n interpolateFn = $interpolate(value);\r\n\r\n element.addClass('ng-binding').data('$binding', interpolateFn);\r\n\r\n var watchExpr = buildWatchExpression(interpolateFn);\r\n\r\n if (oldWatchExpr !== watchExpr) {\r\n\r\n oldWatchExpr = watchExpr;\r\n\r\n cleanWatchHandle();\r\n\r\n watchHandle = scope.$watchCollection(watchExpr, function () {\r\n interpolateExpression();\r\n });\r\n } else {\r\n interpolateExpression();\r\n }\r\n }\r\n });\r\n };\r\n});\r\n","fg.directive('fgDropdownInput', function ($compile, $document, $timeout, $parse, fgUtils) {\r\n\r\n function createInput($scope, $element, $attrs) {\r\n\r\n var template = '
' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
';\r\n\r\n var $template = angular.element(template);\r\n var $input = $template.find('input');\r\n\r\n // Copy the original attributes to the input element\r\n\r\n var attributes = $element.prop(\"attributes\");\r\n\r\n angular.forEach(attributes, function (a) {\r\n if (a.name !== 'fg-dropdown-input' && a.name !== 'class') {\r\n $input.attr(a.name, a.value);\r\n }\r\n });\r\n\r\n var $button = $template.find('button');\r\n var closeTimeout;\r\n\r\n $scope.dropdownToggle = function () {\r\n// $button[0].focus(); // force focus for chrome\r\n $scope.dropdownVisible = !$scope.dropdownVisible;\r\n };\r\n\r\n// $button.on('blur', function () {\r\n// closeTimeout = $timeout(function () {\r\n// $scope.dropdownVisible = false;\r\n// }, 100);\r\n// });\r\n\r\n $scope.$on('$destroy', function () {\r\n if (closeTimeout) $timeout.cancel(closeTimeout);\r\n closeTimeout = undefined;\r\n });\r\n\r\n return $template;\r\n }\r\n\r\n function createDropdown($scope, $element, $attrs, ngModelCtrl, $input) {\r\n\r\n var modelGetter = $parse($attrs.ngModel);\r\n var modelSetter = modelGetter.assign;\r\n\r\n var template = '
' +\r\n '' +\r\n '
';\r\n\r\n var $template = angular.element(template);\r\n\r\n $scope.setModelValue = function (value) {\r\n\r\n $scope.dropdownVisible = false;\r\n\r\n // Convert to a string\r\n\r\n var viewValue = value || '';\r\n\r\n var idx = ngModelCtrl.$formatters.length;\r\n\r\n while (idx--) {\r\n var fn = ngModelCtrl.$formatters[idx];\r\n var viewValue = fn(viewValue);\r\n\r\n if (viewValue === undefined) {\r\n break;\r\n }\r\n }\r\n\r\n\r\n // Parse the viewValue\r\n\r\n idx = ngModelCtrl.$parsers.length;\r\n var pv = viewValue;\r\n\r\n while (idx--) {\r\n var fn = ngModelCtrl.$parsers[idx];\r\n pv = fn(pv);\r\n\r\n if (pv === undefined) {\r\n break;\r\n }\r\n }\r\n\r\n if (pv === undefined) {\r\n // Failed to parse.\r\n // Set the formatted string in the input, which will retrigger the parsing and display the correct error message.\r\n\r\n ngModelCtrl.$setViewValue(viewValue);\r\n ngModelCtrl.$render();\r\n\r\n } else {\r\n modelSetter($scope, value);\r\n }\r\n };\r\n\r\n $scope.getModelValue = function () {\r\n return modelGetter($scope);\r\n };\r\n\r\n var input = $input[0];\r\n\r\n $scope.$watch('dropdownVisible', function (value) {\r\n if (value) {\r\n\r\n var rect = input.getBoundingClientRect();\r\n var scroll = fgUtils.getScrollOffset();\r\n\r\n $template.css({\r\n left: (scroll.x + rect.left) + 'px',\r\n top: (scroll.y + rect.top + input.clientHeight) + 'px',\r\n width: input.clientWidth + 'px'\r\n });\r\n }\r\n });\r\n\r\n $scope.$watchCollection($attrs.fgDropdownInput, function (value) {\r\n $scope.items = value;\r\n });\r\n\r\n $scope.$on('$destroy', function () {\r\n $template.remove();\r\n });\r\n\r\n return $template;\r\n }\r\n\r\n return {\r\n priority: 1000,\r\n restrict: 'A',\r\n terminal: true,\r\n scope: true,\r\n compile: function (tElement, tAttrs) {\r\n\r\n return function link($scope, $element, $attrs, ctrls) {\r\n\r\n var $input = createInput($scope, $element, $attrs);\r\n\r\n $element.append($input);\r\n $compile($input)($scope);\r\n\r\n var $inputText = $input.find('input');\r\n var ngModelCtrl = $inputText.controller('ngModel');\r\n\r\n ////////////////////////////////////////\r\n\r\n var $dropdown = createDropdown($scope, $element, $attrs, ngModelCtrl, $input);\r\n var dropdownCompileFn = $compile($dropdown);\r\n\r\n var $body = $document.find('body');\r\n\r\n $body.append($dropdown);\r\n\r\n dropdownCompileFn($scope);\r\n\r\n ////////////////////////////////////////\r\n };\r\n }\r\n };\r\n});\r\n","/**\r\n * Created by null on 16/10/14.\r\n */\r\nfg.directive('fgNullForm', function () {\r\n\r\n var nullFormCtrl = {\r\n $addControl: angular.noop,\r\n $removeControl: angular.noop,\r\n $setValidity: angular.noop,\r\n $setDirty: angular.noop,\r\n $setPristine: angular.noop\r\n };\r\n\r\n return {\r\n restrict: 'A',\r\n require: ['form'],\r\n link: function link($scope, $element, $attrs, $ctrls) {\r\n\r\n var form = $ctrls[0];\r\n\r\n // Locate the parent form\r\n\r\n var parentForm = $element.parent().inheritedData('$formController');\r\n\r\n if(parentForm) {\r\n\r\n // Unregister this form controller\r\n\r\n parentForm.$removeControl(form);\r\n }\r\n\r\n // Nullify the form\r\n\r\n angular.extend(form, nullFormCtrl);\r\n }\r\n };\r\n});\r\n\r\nfg.directive('fgFormRequiredFilter', function() {\r\n\r\n return {\r\n restrict: 'A',\r\n require: ['form'],\r\n link: function($scope, $element, $attrs, $ctrls) {\r\n\r\n var form = $ctrls[0];\r\n\r\n var $setValidity = form.$setValidity;\r\n\r\n form.$setValidity = function (validationToken, isValid, control) {\r\n\r\n if(validationToken === 'required') {\r\n isValid = true;\r\n }\r\n\r\n $setValidity.call(form, validationToken, isValid, control);\r\n };\r\n }\r\n };\r\n\r\n});","fg.directive('fgInputNumber', function() {\r\n return {\r\n require: 'ngModel',\r\n link: function(scope, element, attr, ctrl) {\r\n\r\n ctrl.$parsers.push(function(inputValue) {\r\n // this next if is necessary for when using ng-required on your input.\r\n // In such cases, when a letter is typed first, this parser will be called\r\n // again, and the 2nd time, the value will be undefined\r\n if (inputValue == undefined) {\r\n return '';\r\n }\r\n\r\n var transformedInput = inputValue.replace(/[^0-9]/g, '');\r\n\r\n var value = parseInt(transformedInput);\r\n value === NaN ? undefined : value;\r\n\r\n if (transformedInput != inputValue) {\r\n ctrl.$setViewValue(transformedInput);\r\n ctrl.$render();\r\n }\r\n\r\n return value;\r\n\r\n });\r\n\r\n ctrl.$parsers.push(function(value) {\r\n var empty = ctrl.$isEmpty(value);\r\n if (empty || /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/.test(value)) {\r\n ctrl.$setValidity('number', true);\r\n return value === '' ? null : (empty ? value : parseFloat(value));\r\n } else {\r\n ctrl.$setValidity('number', false);\r\n return undefined;\r\n }\r\n });\r\n\r\n ctrl.$formatters.push(function(value) {\r\n return ctrl.$isEmpty(value) ? undefined : value.toString();\r\n });\r\n\r\n if (attr.min) {\r\n var minValidator = function(value) {\r\n var min = parseFloat(attr.min);\r\n if (!ctrl.$isEmpty(value) && value < min) {\r\n ctrl.$setValidity('min', false);\r\n return undefined;\r\n } else {\r\n ctrl.$setValidity('min', true);\r\n return value;\r\n }\r\n };\r\n\r\n ctrl.$parsers.push(minValidator);\r\n ctrl.$formatters.push(minValidator);\r\n }\r\n\r\n if (attr.max) {\r\n var maxValidator = function(value) {\r\n var max = parseFloat(attr.max);\r\n if (!ctrl.$isEmpty(value) && value > max) {\r\n ctrl.$setValidity('max', false);\r\n return undefined;\r\n } else {\r\n ctrl.$setValidity('max', true);\r\n return value;\r\n }\r\n };\r\n\r\n ctrl.$parsers.push(maxValidator);\r\n ctrl.$formatters.push(maxValidator);\r\n }\r\n\r\n ctrl.$formatters.push(function(value) {\r\n\r\n if (ctrl.$isEmpty(value) || angular.isNumber(value)) {\r\n ctrl.$setValidity('number', true);\r\n return value;\r\n } else {\r\n ctrl.$setValidity('number', false);\r\n return undefined;\r\n }\r\n });\r\n }\r\n };\r\n});\r\n","fg.directive('fgPlaceholder', function() {\r\n /*\r\n This attribute is only required on TEXTAREA elements. \r\n Angular in combination with IE doesn't like placeholder=\"{{ myExpression }}\".\r\n */\r\n return { \r\n link: function($scope, $element, $attrs) {\r\n $scope.$watch($attrs.fgPlaceholder, function(value) {\r\n $element.attr('placeholder', value);\r\n });\r\n }\r\n };\r\n});","fg.factory('fgUtils', function ($templateCache, $window, fgConfig) {\r\n\r\n var uniqueCounter = (+new Date) % 10000;\r\n\r\n return {\r\n getScrollOffset: function() {\r\n\r\n // the pageYOffset property of the window object is supported in all browsers except \r\n // in Internet Explorer before version 9, and always returns the scroll amount regardless of the doctype\r\n \r\n // the scrollY property of the window object is supported by Firefox, Google Chrome and Safari, and always\r\n // returns the scroll amount regardless of the doctype\r\n \r\n // if a doctype is specified in the document, the scrollTop property of the html element returns the scroll\r\n // amount in Internet Explorer, Firefox and Opera, but always returns zero in Google Chrome and Safari\r\n \r\n // if no doctype is specified in the document, the scrollTop property of the html element always returns zero\r\n\r\n // if no doctype is specified in the document, the scrollTop property of the body element returns the \r\n // scroll amount in Internet Explorer, Firefox, Opera, Google Chrome and Safari.\r\n\r\n var offset = {};\r\n\r\n if($window.pageYOffset !== undefined) {\r\n offset.x = $window.pageXOffset;\r\n offset.y = $window.pageYOffset;\r\n } else {\r\n var de = $window.document.documentElement;\r\n offset.x = de.scrollLeft;\r\n offset.y = de.scrollTop;\r\n }\r\n\r\n return offset;\r\n },\r\n defaultArea: 'default',\r\n getRenderInfo: function(field) {\r\n //var renderInfo = fg.Field[field.type];\r\n var renderInfo = fgConfig.fields.renderInfo[field.type];\r\n\r\n if(!renderInfo) {\r\n renderInfo = {};\r\n // fg.Field[field.type] = renderInfo;\r\n fgConfig.fields.renderInfo[field.type] = renderInfo;\r\n }\r\n\r\n if(!renderInfo.templateUrl) {\r\n renderInfo.templateUrl = this.getTemplateUrl(field);\r\n }\r\n\r\n if(!renderInfo.propertiesTemplateUrl) {\r\n renderInfo.propertiesTemplateUrl = this.getTemplateUrl(field, 'properties');\r\n }\r\n\r\n return renderInfo;\r\n },\r\n formatTemplateUrl: function (type, area) {\r\n return 'angular-form-gen/field-templates/' + (area || this.defaultArea) + '/' + type + '.ng.html';\r\n },\r\n getTemplateUrl: function (field, area) {\r\n\r\n area = area || this.defaultArea;\r\n\r\n // IE8 fix: Aliases removed\r\n // var templateType = fgConfig.fields.aliases[field.type] || field.type;\r\n var templateType = field.type;\r\n var templateUrl = this.formatTemplateUrl(templateType, area);\r\n\r\n var cached = $templateCache.get(templateUrl);\r\n\r\n if (!cached) {\r\n\r\n // Url is not in cache -- fallback to default area.\r\n // Properties area will never fallback to default area.\r\n\r\n if (area !== 'properties' && area !== this.defaultArea) {\r\n templateUrl = this.getTemplateUrl(field, this.defaultArea);\r\n } else {\r\n return this.formatTemplateUrl('not-in-cache');\r\n }\r\n }\r\n\r\n return templateUrl;\r\n },\r\n getUnique: function() {\r\n return ++uniqueCounter;\r\n },\r\n copyField: function(field) {\r\n var copy = angular.copy(field);\r\n copy.name = 'field' + this.getUnique();\r\n return copy;\r\n },\r\n findElementsByClass: function (root, className, recursive, buffer) {\r\n buffer = buffer || [];\r\n\r\n if (root.className === className) {\r\n buffer.push(root);\r\n }\r\n\r\n if (root.hasChildNodes()) {\r\n for (var i = 0; i < root.children.length; i++) {\r\n var child = root.children[i];\r\n if (child.className === className) {\r\n buffer.push(child);\r\n }\r\n if (recursive) {\r\n this.findElementsByClass(child, className, recursive, buffer);\r\n }\r\n }\r\n }\r\n\r\n return buffer;\r\n }\r\n };\r\n });","angular.module('dq', []).factory('dqUtils', function($window, $rootScope) {\r\n\r\n var _dragData = null;\r\n\r\n //noinspection FunctionWithInconsistentReturnsJS\r\n return {\r\n getEvent: function (e) {\r\n return e && e.originalEvent ? e.originalEvent : e || $window.event;\r\n },\r\n stopEvent: function (e) {\r\n // e.cancelBubble is supported by IE8 -\r\n // this will kill the bubbling process.\r\n e.cancelBubble = true;\r\n e.bubbles = false;\r\n \r\n // e.stopPropagation works in modern browsers\r\n if (e.stopPropagation) e.stopPropagation();\r\n if (e.preventDefault) e.preventDefault();\r\n\r\n return false;\r\n },\r\n dragData: function (data) {\r\n if (data === undefined) {\r\n return _dragData;\r\n }\r\n _dragData = data;\r\n },\r\n getParentArea: function ($scope) {\r\n var area = {};\r\n $scope.$emit('dqLocateArea', area);\r\n return area.name;\r\n },\r\n isAreaMatch: function ($scope) {\r\n var parentArea = this.getParentArea($scope);\r\n var eventArea = _dragData ? _dragData.area : \"\";\r\n\r\n return parentArea === eventArea;\r\n }\r\n };\r\n});","angular.module('dq').directive('dqDragArea', function (dqUtils) {\r\n\r\n function evalBroadcastEvent($scope, args, areaName, expression) {\r\n if (expression && args && args.area === areaName) {\r\n $scope.$eval(expression);\r\n }\r\n }\r\n\r\n return {\r\n restrict: 'AEC',\r\n link: function ($scope, $element, $attrs) {\r\n\r\n var areaName = $attrs.dqDragArea || $attrs.dqDragAreaName || \"\";\r\n\r\n $scope.$on('dqDragBegin', function ($event, args) {\r\n evalBroadcastEvent($scope, args, areaName, $attrs.dqDragProgressBegin);\r\n });\r\n\r\n $scope.$on('dqDragEnd', function ($event, args) {\r\n evalBroadcastEvent($scope, args, areaName, $attrs.dqDragProgressEnd);\r\n });\r\n\r\n $scope.$on('dqLocateArea', function($event, args) {\r\n args.name = areaName;\r\n $event.stopPropagation();\r\n });\r\n }\r\n }\r\n});\r\n","angular.module('dq').directive('dqDragEnter',function (dqDragTrack) {\r\n return {\r\n link: dqDragTrack\r\n };\r\n}).directive('dqDragLeave',function (dqDragTrack) {\r\n return {\r\n link: dqDragTrack\r\n };\r\n }).directive('dqDragOver',function (dqDragTrack) {\r\n return {\r\n link: dqDragTrack\r\n };\r\n }).directive('dqDrop',function (dqDragTrack) {\r\n return {\r\n link: dqDragTrack\r\n };\r\n }).factory('dqDragTrack', function (dqUtils, $document) {\r\n\r\n // Combines both nq-drag-enter & nq-drag-leave & nq-drag-over\r\n\r\n return function ($scope, $element, $attrs) {\r\n\r\n // Tracking already set on the element?\r\n\r\n if ($element.data('dqDragTrack') !== true) {\r\n\r\n var trackingEnabled = false; // Toggled on drag-begin if the area name does not match the target\r\n var inbound = false; // Toggle to indicate if the dragging is in or outbound element\r\n var element = $element[0];\r\n var dropEffect = 'none'; // Drop effect used in the dragover event\r\n var doingLeaveDoubleCheck = false; // Toggle that indicates the body has a dragover event to do.\r\n\r\n var $body = $document.find('body');\r\n\r\n function dragLeaveDoubleCheck($e) {\r\n var e = dqUtils.getEvent($e);\r\n\r\n // Check if the drag over element is a child of the this element\r\n\r\n var target = e.target || $e.target;\r\n\r\n if (target !== element) {\r\n\r\n // TODO: we're not really checking if the target element is visually within the $element.\r\n\r\n if (!element.contains(target)) {\r\n\r\n // Drag over element is out of bounds\r\n\r\n dragLeaveForSure(true);\r\n }\r\n }\r\n\r\n // We're done with the expensive body call\r\n\r\n $body.off('dragover', dragLeaveDoubleCheck);\r\n\r\n // Notify the local element event callback there's no event listener on the body and the next event\r\n // can safely be cancelled.\r\n\r\n doingLeaveDoubleCheck = false;\r\n\r\n e.dataTransfer.dropEffect = dropEffect;\r\n\r\n // Always cancel the dragover -- otherwise the dropEffect is not used.\r\n\r\n return dqUtils.stopEvent($e);\r\n }\r\n\r\n function dragLeaveForSure(apply) {\r\n inbound = false;\r\n var expression = $attrs.dqDragLeave;\r\n if (expression) {\r\n if (apply) {\r\n $scope.$apply(function () {\r\n $scope.$eval(expression);\r\n });\r\n } else {\r\n $scope.$eval(expression);\r\n }\r\n }\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n // Just to be sure\r\n $body.off('dragover', dragLeaveDoubleCheck);\r\n });\r\n\r\n $scope.$on('dqDragBegin', function () {\r\n // Check if we should track drag movements\r\n trackingEnabled = dqUtils.isAreaMatch($scope);\r\n });\r\n\r\n $scope.$on('dqDragEnd', function () {\r\n if (trackingEnabled) {\r\n // Gief cake\r\n dragLeaveForSure(false);\r\n }\r\n });\r\n\r\n $element.on('dragenter', function (e) {\r\n if (trackingEnabled && inbound === false) {\r\n inbound = true;\r\n var expression = $attrs.dqDragEnter;\r\n if (expression) {\r\n $scope.$apply(function () {\r\n $scope.$eval(expression);\r\n });\r\n }\r\n }\r\n });\r\n\r\n $element.on('dragleave', function () {\r\n if (trackingEnabled && inbound === true) {\r\n\r\n // dragleave is a lie -- hovering child elements will cause this event to trigger also.\r\n // We fake the cake by tracking the drag ourself.\r\n\r\n // Notify the \"real\" dragover event that he has to play nice with the body and not to\r\n // cancel the event chain.\r\n\r\n doingLeaveDoubleCheck = true;\r\n $body.on('dragover', dragLeaveDoubleCheck);\r\n }\r\n });\r\n\r\n //noinspection FunctionWithInconsistentReturnsJS\r\n $element.on('dragover', function ($e) {\r\n\r\n if (trackingEnabled) {\r\n\r\n var e = dqUtils.getEvent($e);\r\n\r\n var expression = $attrs.dqDragOver;\r\n var result;\r\n\r\n if (expression) {\r\n $scope.$apply(function () {\r\n result = $scope.$eval(expression);\r\n });\r\n }\r\n\r\n // The evaluated expression can indicate to cancel the drop\r\n\r\n dropEffect = result === false ? 'none' : 'copy';\r\n\r\n if (!doingLeaveDoubleCheck) {\r\n\r\n // There's no dragover queued on the body.\r\n // The event needs to be terminated here else the dropEffect will\r\n // not be applied (and dropping is not allowed).\r\n\r\n e.dataTransfer.dropEffect = dropEffect;\r\n return dqUtils.stopEvent($e);\r\n }\r\n }\r\n });\r\n\r\n //noinspection FunctionWithInconsistentReturnsJS\r\n $element.on('drop', function($e) {\r\n\r\n var e = dqUtils.getEvent($e);\r\n\r\n if(trackingEnabled) {\r\n var expression = $attrs.dqDrop;\r\n\r\n if(expression) {\r\n $scope.$apply(expression);\r\n }\r\n }\r\n\r\n return dqUtils.stopEvent($e);\r\n });\r\n\r\n // Ensure that we only do all this magic stuff on this element for one time only.\r\n\r\n $element.data('dqDragTrack', true);\r\n }\r\n };\r\n\r\n });\r\n","angular.module('dq').directive('dqDraggable', function (dqUtils, $rootScope) {\r\n\r\n function evalAndBroadcast(eventName, targetArea, $scope, expression, cb) {\r\n $scope.$apply(function () {\r\n var data = $scope.$eval(expression);\r\n\r\n var bcData = {\r\n area: targetArea,\r\n data: data\r\n };\r\n\r\n cb(bcData);\r\n\r\n $rootScope.$broadcast(eventName, bcData);\r\n });\r\n }\r\n\r\n return {\r\n restrict: 'AEC',\r\n link: function ($scope, $element, $attrs) {\r\n\r\n var targetArea = $attrs.dqDraggable || $attrs.dqDragTargetArea || \"\";\r\n var disabled = false;\r\n\r\n $scope.$watch($attrs.dqDragDisabled, function(value) {\r\n disabled = value;\r\n $element.attr('draggable', disabled ? 'false' : 'true');\r\n });\r\n\r\n $element.on('selectstart',function (e) {\r\n\r\n // Pure IE evilness\r\n\r\n if (!disabled && this.dragDrop) {\r\n this.dragDrop();\r\n e = dqUtils.getEvent(e);\r\n return dqUtils.stopEvent(e);\r\n }\r\n }).on('dragstart',function (e) {\r\n\r\n e = dqUtils.getEvent(e);\r\n\r\n if(disabled) {\r\n return dqUtils.stopEvent(e);\r\n }\r\n\r\n var dt = e.dataTransfer;\r\n dt.effectAllowed = 'all';\r\n dt.setData('Text', 'The cake is a lie!');\r\n\r\n evalAndBroadcast('dqDragBegin', targetArea, $scope, $attrs.dqDragBegin, function(dragData) {\r\n dqUtils.dragData(dragData);\r\n });\r\n\r\n }).on('dragend', function () {\r\n\r\n evalAndBroadcast('dqDragEnd', targetArea, $scope, $attrs.dqDragEnd, function() {\r\n dqUtils.dragData(null);\r\n });\r\n\r\n });\r\n }\r\n };\r\n\r\n});","fg.controller('fgEditController', function ($scope, fgUtils, $location) {\r\n\r\n var self = this;\r\n\r\n// $scope.preview = $location.search().preview;\r\n//\r\n// this.setMetaForm = function(metaForm) {\r\n// self.metaForm = metaForm;\r\n// };\r\n\r\n// this.togglePreview = function() {\r\n// $scope.preview = !$scope.preview;\r\n// };\r\n\r\n $scope.$watch(function () {\r\n\r\n var schema = $scope.schemaCtrl.model();\r\n\r\n // Seems that this watch is sometimes fired after the scope has been destroyed(?)\r\n\r\n if (schema) {\r\n// schema.$$_invalid = self.metaForm ? self.metaForm.$invalid : false;\r\n//\r\n// if (!schema.$$_invalid) {\r\n\r\n var fields = schema.fields;\r\n\r\n if (fields) {\r\n\r\n var i = fields.length;\r\n\r\n while (--i >= 0 && !schema.$$_invalid) {\r\n schema.$$_invalid = fields[i].$$_invalid;\r\n }\r\n }\r\n }\r\n\r\n });\r\n\r\n});","fg.directive('fgEdit', function () {\r\n return {\r\n priority: 100,\r\n require: 'fgSchema',\r\n restrict: 'AE',\r\n scope: {\r\n // // The schema model to edit\r\n schema: '=?fgSchema'\r\n// // Boolean indicating wether to show the default form action buttons\r\n// actionsEnabled: '=?fgActionsEnabled',\r\n// // Callback function when the user presses save -- any argument named 'schema' is set to the schema model.\r\n// onSave: '&fgOnSave',\r\n// // Callback function when the user presses cancel -- any argument named 'schema' is set to the schema model.\r\n// onCancel: '&fgOnCancel',\r\n// // Boolean indicating wether the edit is in preview mode or not\r\n// preview: '=?fgPreview'\r\n },\r\n replace: true,\r\n controller: 'fgEditController as editCtrl',\r\n templateUrl: 'angular-form-gen/edit/edit.ng.html',\r\n link: function ($scope, $element, $attrs, schemaCtrl) {\r\n\r\n if ($scope.schema === undefined) {\r\n $scope.schema = {};\r\n }\r\n\r\n// if ($scope.actionsEnabled === undefined) {\r\n// $scope.actionsEnabled = true;\r\n// }\r\n//\r\n// if ($scope.preview === undefined) {\r\n// $scope.preview = false;\r\n// }\r\n\r\n schemaCtrl.model($scope.schema);\r\n $scope.schemaCtrl = schemaCtrl;\r\n }\r\n }\r\n});","fg.controller('fgFormController', function($scope, $parse) {\r\n\r\n this.model = {};\r\n var self = this;\r\n\r\n this.init = function(dataExpression, schema, state, editMode) {\r\n // Called by the directive\r\n \r\n self.editMode = editMode;\r\n\r\n var dataGetter = $parse(dataExpression);\r\n var dataSetter = dataGetter.assign;\r\n\r\n $scope.$watch(dataGetter, function(value) {\r\n if(value === undefined) {\r\n value = {};\r\n\r\n if(dataSetter) {\r\n dataSetter($scope, value);\r\n }\r\n }\r\n\r\n self.model.data = value;\r\n });\r\n\r\n $scope.$watch(function() {\r\n return schema.model();\r\n }, function(value) {\r\n if(value === undefined) {\r\n schema.model({});\r\n } else {\r\n self.model.schema = value;\r\n }\r\n });\r\n\r\n self.model.state = state;\r\n\r\n \r\n return self.model;\r\n };\r\n\r\n// this.clearFocusOnFields = function() {\r\n// angular.forEach(self.model.schema.fields, function(field) {\r\n// field.focus = false;\r\n// });\r\n// };\r\n\r\n});\r\n","fg.directive('fgForm', function(fgFormCompileFn) {\r\n return {\r\n restrict: 'AE',\r\n require: ['^?form', 'fgForm', '^fgSchema'],\r\n controller: 'fgFormController',\r\n scope: true,\r\n compile: fgFormCompileFn\r\n };\r\n}).factory('fgFormLinkFn', function() {\r\n return function link($scope, $element, $attrs, ctrls) {\r\n\r\n var ngFormCtrl = ctrls[0];\r\n var formCtrl = ctrls[1];\r\n var schemaCtrl = ctrls[2];\r\n\r\n var editMode = $attrs.fgNoRender === 'true';\r\n\r\n formCtrl.init($attrs.fgFormData, schemaCtrl, ngFormCtrl, editMode);\r\n \r\n };\r\n}).factory('fgFormCompileFn', function(fgFormLinkFn) {\r\n return function($element, $attrs) {\r\n\r\n $element.addClass('fg-form');\r\n\r\n var noRender = $attrs.fgNoRender;\r\n \r\n if (noRender !== 'true') {\r\n var renderTemplate = '
';\r\n $element.append(renderTemplate);\r\n }\r\n \r\n return fgFormLinkFn;\r\n };\r\n});\r\n\r\n","fg.directive('fgValidationSummary', function(fgValidationSummaryLinkFn) {\r\n\r\n return {\r\n require: ['^?fgField', '^?form'],\r\n templateUrl: 'angular-form-gen/validation/summary.ng.html',\r\n scope: {\r\n fieldName: '@?fgValidationSummary',\r\n validationMessages: '=?fgValidationMessages'\r\n },\r\n link: fgValidationSummaryLinkFn\r\n };\r\n}).factory('fgValidationSummaryLinkFn', function(fgConfig) {\r\n\r\n return function($scope, $element, $attrs, ctrls) {\r\n\r\n var fgFieldCtrl = ctrls[0];\r\n var ngFormController = ctrls[1];\r\n\r\n if (fgFieldCtrl) {\r\n // Grab the whole field state from the field controller\r\n $scope.field = fgFieldCtrl.field();\r\n $scope.form = fgFieldCtrl.form();\r\n\r\n } else if (ngFormController) {\r\n \r\n $scope.form = {\r\n state: ngFormController\r\n };\r\n\r\n $scope.$watch('fieldName', function(value) {\r\n $scope.field = {\r\n name: value,\r\n state: ngFormController[value]\r\n };\r\n });\r\n }\r\n\r\n // Whenever the form designer edits a custom message but decides to delete it later a \"\" is leftover.\r\n // I don't feel like setting all kinds of watchers so we'll fix that here\r\n\r\n if($scope.validationMessages) {\r\n angular.forEach($scope.validationMessages, function(value, key) {\r\n if(!value) {\r\n delete $scope.validationMessages[key];\r\n }\r\n });\r\n }\r\n\r\n $scope.messages = angular.extend({}, fgConfig.validation.messages, $scope.validationMessages);\r\n };\r\n\r\n});","fg.directive('fgUniqueFieldName', function () {\r\n\r\n var changeTick = 0;\r\n\r\n function validate(ngModelCtrl, schemaCtrl, field) {\r\n \r\n var schema = schemaCtrl.model();\r\n var valid = true;\r\n var schemaField;\r\n\r\n if(schema) {\r\n\r\n var fields = schema.fields;\r\n\r\n for (var i = 0; i < fields.length; i++) {\r\n schemaField = fields[i];\r\n if (schemaField !== field && field.name === schemaField.name) {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n ngModelCtrl.$setValidity('unique', valid);\r\n }\r\n\r\n return {\r\n priority: 100,\r\n require: ['ngModel', '^fgSchema'],\r\n link: function ($scope, $element, $attrs, ctrls) {\r\n\r\n var ngModelCtrl = ctrls[0];\r\n var schemaCtrl = ctrls[1];\r\n \r\n var field = $scope.field;\r\n\r\n if(!field) {\r\n throw Error('No field property on scope');\r\n }\r\n\r\n $scope.$watch(function() { return ngModelCtrl.$modelValue; }, function () {\r\n \r\n // Every instance of this directive will increment changeTick\r\n // whenever the name of the associated field is modified.\r\n\r\n ++changeTick;\r\n });\r\n\r\n $scope.$watch(function() { return changeTick; }, function() {\r\n\r\n // Every instance of this directive will fire off the validation\r\n // whenever the changeTick has been modifed.\r\n\r\n validate(ngModelCtrl, schemaCtrl, field);\r\n });\r\n }\r\n };\r\n});\r\n","fg.controller('fgTabsController', function () {\r\n\r\n this.items = [];\r\n this.active = null;\r\n\r\n this.add = function (item) {\r\n this.items.push(item);\r\n\r\n this.items.sort(function(x, y) {\r\n return x.order - y.order;\r\n });\r\n\r\n if (!this.active && item.autoActive != false) {\r\n this.activate(item);\r\n }\r\n };\r\n\r\n this.activate = function (item) {\r\n\r\n if(!item.disabled) {\r\n this.active = item;\r\n }\r\n\r\n };\r\n\r\n});\r\n","fg.directive('fgTabs', function() {\r\n return {\r\n require: ['fgTabs'],\r\n restrict: 'EA',\r\n transclude: true,\r\n controller: 'fgTabsController',\r\n templateUrl: 'angular-form-gen/common/tabs/tabs.ng.html',\r\n scope: {\r\n 'tabs': '=?fgTabs'\r\n },\r\n link: function($scope, $element, $attrs, $ctrls) {\r\n $scope.tabs = $ctrls[0];\r\n }\r\n };\r\n});\r\n\r\n\r\n\r\n","fg.directive('fgTabsPane', function(fgTabsPaneLinkFn) {\r\n return {\r\n require: ['^fgTabs'],\r\n restrict: 'EA',\r\n transclude: true,\r\n templateUrl: 'angular-form-gen/common/tabs/tabs-pane.ng.html',\r\n link: fgTabsPaneLinkFn,\r\n scope: true\r\n };\r\n}).factory('fgTabsPaneLinkFn', function() {\r\n return function($scope, $element, $attrs, $ctrls) {\r\n\r\n $scope.tabs = $ctrls[0];\r\n\r\n $scope.pane = {\r\n title: $attrs.fgTabsPane || $attrs.title,\r\n order: parseInt($attrs.fgTabsPaneOrder || $attrs.order) || 10,\r\n autoActive: !($attrs.fgTabsPaneAutoActive === \"false\" || $attrs.autoActive === \"false\"),\r\n renderAlways: $attrs.fgTabsPaneRenderAlways === \"true\" || $attrs.renderAlways === \"true\"\r\n };\r\n\r\n $scope.$watch($attrs.disabled, function(value) {\r\n $scope.pane.disabled = value;\r\n });\r\n\r\n $scope.tabs.add($scope.pane);\r\n };\r\n});\r\n","function fgToJsonReplacer(key, value) {\r\n var val = value;\r\n\r\n if (typeof key === 'string' && key.charAt(0) === '$') {\r\n val = undefined;\r\n }\r\n return val;\r\n}\r\n\r\nfg.filter('j$on',function () {\r\n return function (input, displayHidden) {\r\n\r\n if(displayHidden)\r\n return JSON.stringify(input || {}, null, ' ');\r\n\r\n //https://github.com/angular/angular.js/commit/c054288c9722875e3595e6e6162193e0fb67a251#diff-1d54c5f722aebc473dbe96f836ddf974R995\r\n //return angular.toJson(input || {}, true);\r\n return JSON.stringify(input || {}, fgToJsonReplacer, ' ');\r\n };\r\n}).directive('jsonify', function ($window, $filter) {\r\n return {\r\n templateUrl: 'angular-form-gen/common/jsonify/jsonify.ng.html',\r\n replace: true,\r\n scope: {\r\n jsonify: \"=\",\r\n displayHidden: \"@jsonifyDisplayHidden\"\r\n },\r\n link: function($scope, $element, $attrs, ctrls) {\r\n $scope.expression = $attrs.jsonify;\r\n\r\n $scope.copy = function() {\r\n $window.prompt (\"Copy to clipboard: Ctrl+C, Enter\", $filter('j$on')($scope.jsonify, $scope.displayHidden));\r\n };\r\n }\r\n };\r\n });\r\n","fg.controller('fgEditCanvasController', function ($scope, dqUtils, $timeout, fgUtils) {\r\n\r\n $scope.dragPlaceholder = {\r\n visible: false,\r\n index: 0\r\n };\r\n\r\n // - - - 8-< - - - - - - - - - - - - - - - - - - - - -\r\n // Drag & drop\r\n // - - - 8-< - - - - - - - - - - - - - - - - - - - - -\r\n\r\n $scope.$on('dqDragBegin', function() {\r\n $scope.dragging = true;\r\n });\r\n\r\n $scope.$on('dqDragEnd', function() {\r\n $scope.dragging = false;\r\n });\r\n\r\n this.dragEnter = function () {\r\n// $scope.dragging = true;\r\n $scope.dragPlaceholder.visible = true;\r\n $scope.dragPlaceholder.index = $scope.schema.fields.length;\r\n };\r\n\r\n this.dragLeave = function () {\r\n $scope.dragPlaceholder.visible = false;\r\n };\r\n\r\n this.dragBeginCanvasField = function (index, field) {\r\n\r\n // Delay is set to prevent browser from copying adjusted html as copy image\r\n\r\n $timeout(function () {\r\n field.$_isDragging = true;\r\n }, 1);\r\n\r\n return { source: 'canvas', field: field, index: index };\r\n };\r\n\r\n this.dragEndCanvasField = function (field) {\r\n\r\n // IE Fix: ensure this is fired after the drag begin\r\n\r\n $timeout(function () {\r\n field.$_isDragging = false;\r\n// $scope.dragging = false;\r\n }, 10);\r\n\r\n };\r\n\r\n this.drop = function () {\r\n\r\n var dragData = dqUtils.dragData();\r\n\r\n if (dragData && dragData.data) {\r\n\r\n var field = dragData.data.field;\r\n var source = dragData.data.source;\r\n var index = dragData.data.index;\r\n var fields = $scope.schema.fields;\r\n\r\n if (source == 'palette') {\r\n $scope.schemaCtrl.addField(field, $scope.dragPlaceholder.index);\r\n\r\n } else if (source == 'canvas') {\r\n $scope.schemaCtrl.moveField(index, $scope.dragPlaceholder.index);\r\n\r\n // fields.splice(index, 1);\r\n // fields.splice($scope.dragPlaceholder.index, 0, field);\r\n }\r\n\r\n // IE fix: not calling dragEnd sometimes\r\n field.$_isDragging = false;\r\n } else {\r\n throw Error('Drop without data');\r\n }\r\n };\r\n\r\n});","fg.directive('fgEditCanvas', function() {\r\n\r\n return {\r\n require: ['^fgEdit', '^fgSchema', '^form'],\r\n templateUrl: 'angular-form-gen/edit/canvas/canvas.ng.html',\r\n controller: 'fgEditCanvasController as canvasCtrl',\r\n link: function($scope, $element, $attrs, ctrls) {\r\n $scope.editCtrl = ctrls[0];\r\n $scope.schemaCtrl = ctrls[1];\r\n $scope.formCtrl = ctrls[2];\r\n\r\n var ignoreDirty = true;\r\n\r\n $scope.$watchCollection('schema.fields', function() {\r\n\r\n // Ignore the first call, $watchCollection fires at once without any changes.\r\n\r\n if(!ignoreDirty) {\r\n $scope.formCtrl.$setDirty(true);\r\n }\r\n\r\n ignoreDirty = false;\r\n\r\n });\r\n }\r\n };\r\n});\r\n","fg.controller('fgEditPaletteController', function ($scope, fgConfig) {\r\n\r\n $scope.templates = angular.copy(fgConfig.fields.templates);\r\n\r\n var count = 0;\r\n\r\n $scope.templateFilter = function (template) {\r\n return !$scope.selectedCategory || $scope.selectedCategory[template.type];\r\n };\r\n\r\n});","fg.directive('fgEditPalette',function () {\r\n return {\r\n require: ['^fgSchema'],\r\n templateUrl: 'angular-form-gen/edit/palette/palette.ng.html',\r\n controller: 'fgEditPaletteController',\r\n link: function($scope, $element, $attrs, ctrls) {\r\n $scope.schemaCtrl = ctrls[0];\r\n }\r\n };\r\n});","fg.controller('fgFieldController', function($scope, fgUtils) {\r\n\r\n var self = this;\r\n var _form, _field;\r\n\r\n this.init = function(fgFormCtrl, fieldSchema, editMode) {\r\n \r\n self.initForm(fgFormCtrl);\r\n self.initField(fieldSchema);\r\n self.initDefaultData(fieldSchema, editMode);\r\n\r\n $scope.form = _form;\r\n $scope.field = _field;\r\n \r\n };\r\n\r\n this.initForm = function(fgFormCtrl) {\r\n _form = fgFormCtrl ? fgFormCtrl.model : {};\r\n\r\n return _form;\r\n };\r\n\r\n this.initField = function(fieldSchema) {\r\n\r\n _field = {\r\n $_id: 'id' + fgUtils.getUnique(),\r\n schema: fieldSchema\r\n };\r\n\r\n $scope.$watch('field.schema.name', function(value, oldValue) {\r\n self.registerState(value);\r\n });\r\n\r\n return _field;\r\n };\r\n\r\n this.initDefaultData = function(fieldSchema, editMode) {\r\n\r\n var fieldName = fieldSchema.name;\r\n\r\n _form.data = _form.data || {};\r\n \r\n if (editMode) {\r\n \r\n $scope.$watch('field.schema.value', function(value) {\r\n _form.data[fieldSchema.name] = value;\r\n });\r\n\r\n $scope.$watch('field.schema.name', function(value, oldValue) {\r\n if(value !== oldValue) {\r\n var data = _form.data[oldValue];\r\n delete _form.data[oldValue];\r\n _form.data[value] = data;\r\n }\r\n });\r\n\r\n } else if (_form.data && _form.data[fieldName] === undefined && fieldSchema.value !== undefined) {\r\n _form.data[fieldName] = fieldSchema.value;\r\n }\r\n\r\n return _form.data;\r\n };\r\n\r\n this.setFieldState = function(state) {\r\n // Called by the field-input directive\r\n _field.state = state;\r\n self.registerState(_field.schema.name);\r\n };\r\n\r\n this.registerState = function(fieldName) {\r\n // Re-register the ngModelCtrl with the form controller\r\n // whenever the name of the field has been modified.\r\n\r\n if (_form.state && _field.state) {\r\n _form.state.$removeControl(_field.state);\r\n _field.state.$name = fieldName;\r\n _form.state.$addControl(_field.state);\r\n }\r\n\r\n _field.name = fieldName;\r\n\r\n };\r\n\r\n this.field = function() {\r\n return _field;\r\n };\r\n\r\n this.form = function() {\r\n return _form;\r\n };\r\n});","fg.directive('fgField', function(fgFieldLinkFn) {\r\n\r\n return {\r\n require: ['^?fgForm', 'fgField'],\r\n replace: true,\r\n templateUrl: 'angular-form-gen/form/field/field.ng.html',\r\n scope: {\r\n fieldSchema: '=fgField', // The schema definition of the field\r\n tabIndex: '=?fgTabIndex', // Optional tab index -- used in overlay mode to disable focus\r\n editMode: '=?fgEditMode', // Indicates edit mode, which will sync the fieldSchema.value\r\n // to the form data for WYSIWYG pleasures.\r\n noValidationSummary: '=fgNoValidationSummary' // If true hides the validation summary\r\n },\r\n controller: 'fgFieldController',\r\n link: fgFieldLinkFn\r\n };\r\n\r\n}).factory('fgFieldLinkFn', function(fgUtils) {\r\n return function($scope, $element, $attrs, ctrls) {\r\n\r\n var fgFormCtrl = ctrls[0];\r\n var fgFieldCtrl = ctrls[1];\r\n\r\n if ($scope.tabIndex === undefined) {\r\n $scope.tabIndex = 'auto';\r\n }\r\n\r\n $scope.renderInfo = fgUtils.getRenderInfo($scope.fieldSchema);\r\n\r\n fgFieldCtrl.init(fgFormCtrl, $scope.fieldSchema, $scope.editMode);\r\n };\r\n});","//fg.directive('fgFieldFocus', function($parse) {\r\n// return {\r\n// require: ['?^fgForm'],\r\n// link: function($scope, $element, $attrs, ctrls) {\r\n//\r\n// var formCtrl = ctrls[0];\r\n//\r\n// // if(formCtrl && formCtrl.editMode) {\r\n// // return;\r\n// // }\r\n//\r\n// var e = $element[0];\r\n//\r\n// var getModel = $parse($attrs.fgFieldFocus);\r\n// var setModel = getModel.assign;\r\n//\r\n// $scope.$watch(getModel, function(value) {\r\n//\r\n// if (value) {\r\n// if(formCtrl) {\r\n// formCtrl.clearFocusOnFields();\r\n// setModel($scope, true);\r\n//\r\n// if(formCtrl.editMode) {\r\n// return;\r\n// }\r\n// }\r\n//\r\n// e.focus();\r\n//\r\n// } else if(formCtrl && !formCtrl.editMode) {\r\n//\r\n// e.blur();\r\n//\r\n// }\r\n// });\r\n//\r\n// // function onBlur() {\r\n// // // if(getModel($scope) !== undefined) {\r\n// // // $timeout(function() {\r\n// // // setModel($scope, false);\r\n// // // });\r\n// // // }\r\n// // }\r\n//\r\n// // function onFocus() {\r\n// // $timeout(function() {\r\n// // setModel($scope, true);\r\n// // });\r\n// // }\r\n//\r\n// // $element.on('focus', onFocus);\r\n// // $element.on('blur', onBlur);\r\n//\r\n// // $scope.$on('$destroy', function() {\r\n// // $element.off('focus', onFocus);\r\n// // $element.off('blur', onBlur);\r\n// // });\r\n// }\r\n// };\r\n//});\r\n","fg.directive('fgFieldInput', function (fgFieldInputLinkFn) {\r\n return {\r\n require: ['^fgField', 'ngModel'],\r\n link: fgFieldInputLinkFn\r\n };\r\n}).factory('fgFieldInputLinkFn', function () {\r\n return function ($scope, $element, $attrs, ctrls) {\r\n\r\n var fgFieldCtrl = ctrls[0];\r\n var ngModelCtrl = ctrls[1];\r\n\r\n fgFieldCtrl.setFieldState(ngModelCtrl);\r\n };\r\n}).factory('fgUpdatePattern', function () {\r\n //SSchaaf http://stackoverflow.com/questions/20847979/ngpattern-binding-not-working\r\n //Angular migration https://docs.angularjs.org/guide/migration\r\n return {\r\n require: \"^ngModel\",\r\n link: function (scope, element, attrs, ctrl) {\r\n scope.$watch(function () {\r\n // Evaluate the ngPattern attribute against the current scope\r\n alert(\"attrs.ngPattern\", attrs.ngPattern);\r\n return scope.$eval(attrs.ngPattern);\r\n },\r\n function (newval, oldval) {\r\n //Get the value from `ngModel`\r\n alert(\"newval\", newval);\r\n alert(\"oldval\", oldval);\r\n value = ctrl.$viewValue;\r\n\r\n // And set validity on the model to true if the element\r\n // is empty or passes the regex test\r\n if (ctrl.$isEmpty(value) || newval.test(value)) {\r\n ctrl.$setValidity('pattern', true);\r\n return value;\r\n } else {\r\n ctrl.$setValidity('pattern', false);\r\n return undefined;\r\n }\r\n });\r\n }\r\n }\r\n});\r\n","fg.directive('fgFormFields', function() {\r\n\r\n return {\r\n require: ['^?fgForm'],\r\n restrict: 'AE',\r\n templateUrl: 'angular-form-gen/form/form-fields/form-fields.ng.html',\r\n scope: {},\r\n link: function($scope, $element, $attrs, ctrls) {\r\n\r\n var fgForm = ctrls[0];\r\n\r\n $scope.$watch(function() {\r\n return fgForm.model;\r\n }, function(value) {\r\n $scope.form = value;\r\n });\r\n }\r\n };\r\n\r\n});","fg.controller('fgSchemaController', function($scope, fgUtils) {\r\n\r\n var _model;\r\n\r\n this.model = function(value) {\r\n if(value !== undefined) {\r\n _model = value;\r\n\r\n if(!angular.isArray(value.fields)) {\r\n value.fields = [];\r\n }\r\n }\r\n \r\n return _model;\r\n };\r\n\r\n this.addField = function(field, index) {\r\n\r\n var copy = fgUtils.copyField(field);\r\n\r\n index = index === undefined ? _model.fields.length : index;\r\n _model.fields.splice(index, 0, copy);\r\n\r\n };\r\n\r\n this.removeField = function(index) {\r\n _model.fields.splice(index, 1);\r\n };\r\n\r\n this.swapFields = function(idx1, idx2) {\r\n if (idx1 <= -1 || idx2 <= -1 || idx1 >= _model.fields.length || idx2 >= _model.fields.length) {\r\n return;\r\n }\r\n\r\n _model.fields[idx1] = _model.fields.splice(idx2, 1, _model.fields[idx1])[0];\r\n };\r\n\r\n this.moveField = function(fromIdx, toIdx) {\r\n if (fromIdx >= 0 && toIdx <= _model.fields.length && fromIdx !== toIdx) {\r\n var field = _model.fields.splice(fromIdx, 1)[0];\r\n if (toIdx > fromIdx)--toIdx;\r\n _model.fields.splice(toIdx, 0, field);\r\n }\r\n };\r\n\r\n});","fg.directive('fgSchema', function(fgSchemaLinkFn) {\r\n\r\n return {\r\n require: ['fgSchema'],\r\n controller: 'fgSchemaController',\r\n link: fgSchemaLinkFn\r\n };\r\n\r\n}).factory('fgSchemaLinkFn' , function() {\r\n return function($scope, $element, $attrs, ctrls) {\r\n var schemaCtrl = ctrls[0];\r\n\r\n $scope.$watch($attrs.fgSchema, function(value) {\r\n schemaCtrl.model(value);\r\n });\r\n\r\n };\r\n});\r\n\r\n","fg.directive('fgEditCanvasField', function() {\r\n\r\n return {\r\n templateUrl: 'angular-form-gen/edit/canvas/field/field.ng.html'\r\n };\r\n\r\n});","fg.controller('fgEditPaletteCategoriesController', function($scope, fgConfig) {\r\n\r\n $scope.categories = fgConfig.fields.categories;\r\n\r\n $scope.setCategory = function(name, category) {\r\n $scope.categoryName = name;\r\n $scope.category = category;\r\n };\r\n\r\n if(!$scope.category) {\r\n //noinspection LoopStatementThatDoesntLoopJS\r\n for (var name in $scope.categories) {\r\n //noinspection JSUnfilteredForInLoop\r\n $scope.setCategory(name, $scope.categories[name]);\r\n break;\r\n }\r\n }\r\n});","fg.directive('fgEditPaletteCategories', function () {\r\n return {\r\n templateUrl: 'angular-form-gen/edit/palette/categories/categories.ng.html',\r\n require: '^fgEditPalette',\r\n scope: {\r\n category: \"=?\"\r\n },\r\n controller: 'fgEditPaletteCategoriesController'\r\n };\r\n});","fg.directive('fgEditCanvasFieldProperties', function (fgUtils) {\r\n\r\n // To keep the form validation working, the contents of the tabs needs to be rendered even if the tab is not active.\r\n\r\n function setRenderAlways(tabItems) {\r\n var i = tabItems.length;\r\n\r\n while (i--) {\r\n var tab = tabItems[i];\r\n\r\n // Skip the debug tab\r\n\r\n if(tab.title !== 'Debug') {\r\n tab.renderAlways = true;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/properties.ng.html',\r\n scope: {\r\n field: '=fgEditCanvasFieldProperties'\r\n },\r\n link: {\r\n pre: function ($scope) {\r\n $scope.property = {};\r\n },\r\n post: function ($scope) {\r\n\r\n $scope.$watch('fieldPropertiesForm.$invalid', function (newValue) {\r\n $scope.field.$$_invalid = newValue;\r\n });\r\n\r\n $scope.renderInfo = fgUtils.getRenderInfo($scope.field);\r\n\r\n\r\n $scope.$watch('property.tabs.items.length', function(value) {\r\n if(value) {\r\n setRenderAlways($scope.property.tabs.items);\r\n }\r\n });\r\n\r\n }\r\n }\r\n };\r\n});\r\n","fg.controller('fgPropertyFieldOptionsController', function($scope) {\r\n\r\n var self = this;\r\n var optionCounter = 1;\r\n\r\n // Monitor for changes in the options array and ensure a\r\n // watch for every option value.\r\n // Watchers are deleted when removing options from the array.\r\n\r\n $scope.$watchCollection('field.options', function(options) {\r\n if (options) {\r\n angular.forEach(options, function(option) {\r\n if (!option.$_valueWatchFn) {\r\n option.$_valueWatchFn = $scope.$watch(function() {\r\n return option.value;\r\n }, handleValueChange);\r\n }\r\n });\r\n }\r\n });\r\n\r\n function handleValueChange(newValue, oldValue) {\r\n\r\n // Called by the watch collection\r\n // Ensure that when the selected value is changed, this\r\n // is synced to the field value.\r\n\r\n if (newValue !== oldValue) {\r\n if ($scope.multiple) {\r\n $scope.field.value[newValue] = $scope.field.value[oldValue];\r\n delete $scope.field.value[oldValue];\r\n } else {\r\n if (oldValue === $scope.field.value) {\r\n $scope.field.value = newValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.addOption = function() {\r\n\r\n if (!$scope.field.options) {\r\n $scope.field.options = [];\r\n }\r\n\r\n var option = {\r\n value: 'Option ' + optionCounter++\r\n };\r\n\r\n $scope.field.options.push(option);\r\n\r\n var count = $scope.field.options.length;\r\n\r\n if(!$scope.multiple && count === 1) {\r\n $scope.field.value = option.value;\r\n }\r\n\r\n };\r\n\r\n this.removeOption = function(index) {\r\n var options = $scope.field.options.splice(index, 1);\r\n\r\n if (options && options.length) {\r\n\r\n var option = options[0];\r\n\r\n if ($scope.multiple) {\r\n\r\n if($scope.field.value[option.value] !== undefined)\r\n delete $scope.field.value[option.value];\r\n\r\n } else {\r\n\r\n if (option.value === $scope.field.value && $scope.field.options.length) {\r\n $scope.field.value = $scope.field.options[0].value;\r\n }\r\n\r\n option.$_valueWatchFn();\r\n }\r\n }\r\n };\r\n\r\n});","fg.directive('fgPropertyFieldOptions', function(fgPropertyFieldOptionsLinkFn) {\r\n return {\r\n scope: true,\r\n controller: 'fgPropertyFieldOptionsController as optionsCtrl',\r\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/options/options.ng.html',\r\n link: fgPropertyFieldOptionsLinkFn\r\n };\r\n}).factory('fgPropertyFieldOptionsLinkFn', function() {\r\n return function($scope, $element, $attrs, ctrls) {\r\n\r\n $scope.multiple = false;\r\n\r\n $attrs.$observe('fgPropertyFieldOptions', function(value) {\r\n if(value === 'multiple') {\r\n $scope.multiple = true;\r\n }\r\n });\r\n };\r\n});","fg.directive('fgPropertyFieldCommon', function(fgPropertyFieldCommonLinkFn) {\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html',\r\n link: fgPropertyFieldCommonLinkFn\r\n };\r\n}).factory('fgPropertyFieldCommonLinkFn', function() {\r\n return function($scope, $element, $attrs, ctrls) {\r\n\r\n $scope.fields = {\r\n fieldname: false,\r\n displayname: false,\r\n placeholder: false,\r\n tooltip: false,\r\n focus: false\r\n };\r\n\r\n $scope.$watch($attrs['fgPropertyFieldCommon'], function(value) {\r\n $scope.fields = angular.extend($scope.fields, value);\r\n });\r\n };\r\n});","/*\r\n The field-value directive will re-render itself when certain validation values are modified.\r\n This is needed because angular does not watch or observe the values of certain attributes and allows\r\n an invalid initial value to be saved in the form schema.\r\n\r\n Important: the transcluded form field must be name fieldValue!\r\n\r\n
\r\n \r\n
\r\n\r\n The fg-field-redraw directive will trigger, on model change, the field-value to re-render itself.\r\n */\r\n\r\nfg.directive('fgPropertyFieldValue', function(fgPropertyFieldValueLinkFn) {\r\n\r\n return {\r\n require: ['^form'],\r\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html',\r\n transclude: true,\r\n link: fgPropertyFieldValueLinkFn\r\n };\r\n\r\n}).factory('fgPropertyFieldValueLinkFn', function($parse) {\r\n\r\n return function($scope, $element, $attrs, ctrls) {\r\n\r\n $scope.draw = true;\r\n var frmCtrl = ctrls[0];\r\n var oldViewValue;\r\n\r\n $scope.$watch('field.$_redraw', function(value) {\r\n\r\n if (value) {\r\n\r\n var ngModelCtrl = frmCtrl['fieldValue'];\r\n\r\n if(ngModelCtrl) {\r\n oldViewValue = ngModelCtrl.$viewValue;\r\n }\r\n\r\n $scope.draw = false;\r\n $scope.field.$_redraw = false;\r\n } else {\r\n $scope.draw = true;\r\n $element = $element;\r\n }\r\n });\r\n\r\n $scope.$watch(function() { return frmCtrl['fieldValue']; }, function(ngModelCtrl) {\r\n if(ngModelCtrl && oldViewValue) {\r\n ngModelCtrl.$setViewValue(oldViewValue);\r\n ngModelCtrl.$render();\r\n oldViewValue = undefined;\r\n }\r\n });\r\n };\r\n}).directive('fgFieldRedraw', function() {\r\n return {\r\n require: ['ngModel'],\r\n link: function($scope, $element, $attrs, ctrls) {\r\n\r\n var oldValue = $scope.$eval($attrs.ngModel);\r\n\r\n $scope.$watch($attrs.ngModel, function(value) {\r\n if(value != oldValue) {\r\n $scope.field.$_redraw = true;\r\n oldValue = value;\r\n }\r\n });\r\n }\r\n };\r\n});\r\n","fg.directive('fgPropertyField', function(fgPropertyFieldLinkFn) {\r\n\r\n return {\r\n restrict: 'AE',\r\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html',\r\n transclude: true,\r\n scope: true,\r\n link: fgPropertyFieldLinkFn\r\n };\r\n\r\n}).factory('fgPropertyFieldLinkFn', function() {\r\n return function($scope, $element, $attrs, ctrls) {\r\n \r\n $attrs.$observe('fgPropertyField', function(value) {\r\n $scope.fieldName = value;\r\n });\r\n\r\n $attrs.$observe('fgPropertyFieldLabel', function(value) {\r\n if(value) {\r\n $scope.fieldLabel = value;\r\n }\r\n });\r\n\r\n };\r\n});","fg.directive('fgParsePattern', function() {\r\n\r\n return {\r\n require: ['ngModel'],\r\n link: function($scope, $element, $attrs, ctrls) {\r\n var ngModelCtrl = ctrls[0];\r\n\r\n ngModelCtrl.$parsers.push(validate);\r\n \r\n function validate(value) {\r\n try {\r\n new RegExp(value);\r\n } catch(e) {\r\n ngModelCtrl.$setValidity('pattern', false);\r\n return undefined;\r\n }\r\n\r\n ngModelCtrl.$setValidity('pattern', true);\r\n return value;\r\n }\r\n }\r\n };\r\n});","fg.directive('fgPropertyFieldValidation', function(fgPropertyFieldValidationLinkFn) {\r\n return {\r\n restrict: 'A',\r\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html',\r\n link: fgPropertyFieldValidationLinkFn\r\n };\r\n}).factory('fgPropertyFieldValidationLinkFn', function(fgConfig) {\r\n\r\n var patternOptions = [];\r\n var patternConfig = fgConfig.validation.patterns;\r\n\r\n angular.forEach(patternConfig, function(value, text) {\r\n patternOptions.push({ value: value, text: text });\r\n });\r\n\r\n return function($scope, $element, $attrs, ctrls) {\r\n\r\n $scope.patternOptions = patternOptions;\r\n\r\n $scope.field.validation = $scope.field.validation || {};\r\n $scope.field.validation.messages = $scope.field.validation.messages || {};\r\n\r\n $scope.fields = {\r\n required: false,\r\n minlength: false,\r\n maxlength: false,\r\n pattern: false\r\n };\r\n\r\n $scope.$watch($attrs['fgPropertyFieldValidation'], function(value) {\r\n $scope.fields = angular.extend($scope.fields, value);\r\n });\r\n };\r\n});","fg.directive('fgEditValidationMessage', function(fgEditValidationMessageLinkFn) {\r\n return {\r\n templateUrl: 'angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html',\r\n link: fgEditValidationMessageLinkFn,\r\n scope: true\r\n };\r\n}).factory('fgEditValidationMessageLinkFn', function() {\r\n\r\n var DEFAULT_TOOLTIP = \"Enter a error message here that will be shown if this validation fails. If this field is empty a default message will be used.\";\r\n \r\n return function($scope, $element, $attrs, ctrls) {\r\n $attrs.$observe('fgEditValidationMessage', function(value) {\r\n $scope.validationType = value;\r\n });\r\n\r\n $attrs.$observe('fgEditValidationTooltip', function(value) {\r\n value = value || DEFAULT_TOOLTIP;\r\n $scope.tooltip = value;\r\n });\r\n };\r\n});","})(angular);"],"sourceRoot":"../src/angular-form-gen"} \ No newline at end of file diff --git a/dist/angular-form-gen.min.css b/dist/angular-form-gen.min.css index aae4b34..a11e5b8 100755 --- a/dist/angular-form-gen.min.css +++ b/dist/angular-form-gen.min.css @@ -1,5 +1,5 @@ /*! - angular-form-gen v0.0.2 + angular-form-gen v0.0.3 (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen License: MIT */.fg-field-required .control-label:after{content:' *';color:#888}.fg-legend-extra{color:#999;font-weight:lighter;display:inline-block}.fg-dropdown{z-index:50}.fg-dropdown.open{position:absolute}.fg-dropdown .dropdown-menu{position:static;top:0;left:0;float:none;max-height:250px;overflow-y:auto}.form .fg-edit{margin-left:-15px;margin-right:-15px}.fg-edit-canvas .fg-field,.fg-edit-palette .fg-field{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:10px;margin-bottom:20px;background-color:#fff;border:1px solid #ddd;border-radius:4px;position:relative}.fg-edit-canvas .fg-field,.fg-edit-palette .fg-field:hover{background-color:#f5f5f5}.fg-edit-canvas-field .form-group,.fg-edit-palette .form-group{margin-top:5px;margin-bottom:0}.fg-field{min-height:25px}.fg-edit-canvas .fg-field.error{background-color:#f2dede;border-color:#b94a48}.fg-field-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;filter:alpha(opacity=0);background:#FFF;background:rgba(255,255,255,0);cursor:move}.fg-field-overlay .btn-toolbar{position:absolute;margin:0;top:-10px}.fg-field-overlay .btn-toolbar-right{right:5px}.fg-field-overlay .btn-toolbar-left{left:5px}.fg-field-overlay .btn-toolbar .btn[disabled]{-moz-opacity:1;opacity:1;filter:alpha(opacity=100);color:#ccc;cursor:not-allowed;pointer-events:auto}.fg-field-inner .controls>div>.checkbox:first-child,.fg-field-inner .controls>div>.radio:first-child{padding-top:5px}.fg-form .checkbox,.fg-form .radio{margin-top:0;margin-bottom:5px}.form-horizontal .fg-form .checkbox,.form-horizontal .fg-form .radio{margin-bottom:0}.fg-validation-summary{margin-top:10px}.jsonify{margin-top:10px;position:relative}.jsonify .btn-toolbar-right{right:5px}.jsonify .btn-toolbar{position:absolute;margin:0;top:-10px}.fg-tabs>.nav-tabs{margin-bottom:0}.fg-tabs .tab-content{padding:10px;border:1px solid #ddd;border-top:none;border-radius:0 0 4px 4px}.fg-edit-canvas .fg-field-properties .control-group{margin-bottom:10px}.fg-edit-canvas .fg-field.fg-edit-canvas-field{padding-top:15px;padding-bottom:15px}.fg-edit-canvas-area{min-height:340px;border-radius:4px;border:1px solid #ddd;padding:20px}.fg-edit-canvas-area-empty{left:20px;right:20px;bottom:20px;top:20px;margin:0}.fg-edit-canvas-area-empty-x{font-size:200px;line-height:200px}.fg-drag-placeholder{margin-bottom:0;opacity:0;-webkit-filter:aplha(opacity(0));filter:aplha(opacity(0));-webkit-transition:height 0ms linear,opacity 0ms;transition:height 0ms linear,opacity 0ms;height:0;display:none}.fg-edit-canvas-dragging .fg-drag-placeholder{display:block;-webkit-transition:height 100ms linear,opacity 500ms,margin-bottom 100ms;transition:height 100ms linear,opacity 500ms,margin-bottom 100ms}.fg-drag-placeholder-visible{margin-bottom:20px;border-radius:4px;border:1px dashed #3a87ad;background-color:#d9edf7;height:74px;opacity:1;-webkit-filter:aplha(opacity(100));filter:aplha(opacity(100))}.fg-field-overlay-drag-bottom,.fg-field-overlay-drag-top{height:50%}.fg-field-properties .fg-field-not-in-cache{margin-left:20px;margin-right:20px;margin-bottom:0}.fg-edit-canvas .fg-field.dragging{display:none}@media (max-width:768px){.fg-edit-canvas-area{min-height:inherit;padding:0;border:none}.fg-edit-canvas-area-empty{position:static;margin-bottom:20px}}.fg-edit-palette .form-group{margin:0}.fg-field-drag{opacity:.8}.fg-edit-palette legend{position:relative;cursor:pointer}.fg-edit-palette legend .caret{border-top:4px solid #999}.fg-edit-palette legend:hover{color:#333}.fg-edit-palette legend:hover .caret{border-top:4px solid #333}.fg-edit-palette legend .dropdown-menu{font-size:14px;line-height:20px;right:auto;left:auto}.fg-edit-palette .control-label,.form .control-label{float:none;width:100%;text-align:left;padding:0}.fg-edit-palette .fg-field-inner>div,.form .fg-field-inner>div,.form .fg-property-field>div{margin-left:0;width:100%;float:none;padding:0}.fg-field-properties-container{max-height:0;overflow:hidden;-webkit-transition:.5s;transition:.5s}.fg-field-properties-container.visible{max-height:1000px}.fg-field-properties{position:relative;margin:15px 0;padding-top:10px;padding-left:10px;padding-right:10px;background-color:#fff;border-radius:4px;border:1px solid #ddd;-webkit-touch-callout:initial;-webkit-user-select:initial;-khtml-user-select:initial;-moz-user-select:text;-ms-user-select:initial;user-select:initial;z-index:20}.table-field-options td,.table-field-options th{vertical-align:middle;padding:5px}.table-field-options td{border:0;line-height:30px}.table-field-options input[type=checkbox],.table-field-options input[type=radio]{margin-top:0}.table-field-options th.table-field-options-padding{width:100%}.fg-field-properties .fg-tabs{margin-bottom:10px}@media (min-width:480px) and (max-width:979px){.table-field-options input[type=text]{width:130px}}@media (max-width:480px){.table-field-options input[type=text]{width:90px}.fg-field-properties{padding:10px}}.table-field-options .form-control{width:auto}.fg-property-field-validation{padding:5px 0}.fg-property-field-validation div.checkbox{padding-top:0} \ No newline at end of file diff --git a/dist/angular-form-gen.min.js b/dist/angular-form-gen.min.js index 9eeda1b..d5da5dc 100755 --- a/dist/angular-form-gen.min.js +++ b/dist/angular-form-gen.min.js @@ -1,8 +1,8 @@ /*! - angular-form-gen v0.0.1 + angular-form-gen v0.0.3 (c) 2014 (null) McNull https://github.com/McNull/angular-form-gen License: MIT */ -!function(e){var t=e.module("fg",["dq"]);t.constant("FgField",function(t,i){this.name=this.type=t,i&&e.extend(this,i),this.displayName=this.displayName||this.type.charAt(0).toUpperCase()+this.type.substring(1)}),t.config(["$provide",function(t){t.provider("fgConfig",function(){function t(e){for(var t=n.length;t--&&n[t].type!==e;);return t}var i={enableDebugInfo:!0,validation:{messages:{},patterns:{}},fields:{templates:[],categories:{},renderInfo:{}}},n=i.fields.templates;return{debug:function(e){i.enableDebugInfo=e},fields:{add:function(e,i,a,l){if(!(e&&e.type&&i&&i.length))throw new Error("Need a valid objectTemplate and at least one category");var r=t(e.type);-1!==r?n[r]=e:n.push(e),this.category(e.type,i),this.renderInfo(e.type,a,l)},remove:function(e){var i=t(e);-1!==i&&n.splice(i,1),this.category(e),this.renderInfo(e)},renderInfo:function(e,t,n){i.fields.renderInfo[e]={templateUrl:t,propertiesTemplateUrl:n}},category:function(t,n){e.isArray(n)||(n=[n]),e.forEach(i.fields.categories,function(e){delete e[t]}),e.forEach(n,function(e){void 0===i.fields.categories[e]&&(i.fields.categories[e]={}),i.fields.categories[e][t]=!0})}},validation:{message:function(t,n){var a=i.validation.messages;if(e.isString(t)){if(!n)throw new Error("No message specified for "+t);a[t]=n}else e.extend(a,t)},pattern:function(t,n){e.isString(t)?i.validation.patterns[name]=n:e.extend(i.validation.patterns,t)}},$get:function(){return i}}})}]),t.config(["fgConfigProvider","FgField",function(t,i){t.validation.message({required:"A value is required for this field.",minlength:'The value does not match the minimum length{{ field.schema && (" of " + field.schema.validation.minlength + " characters" || "")}}.',maxlength:'The value exceeds the maximum length{{ field.schema && (" of " + field.schema.validation.maxlength + " characters" || "")}}.',pattern:'The value "{{ field.state.$viewValue }}" does not match the required format.',email:'The value "{{ field.state.$viewValue }}" is not a valid email address.',unique:'The value "{{ field.state.$viewValue }}" is already in use.',number:'The value "{{ field.state.$viewValue }}" is not a number.',min:'The value {{ field.schema && ("should be at least " + field.schema.validation.min) || field.state.$viewValue + " is too low" }}',max:'The value {{ field.schema && ("should be less than " + field.schema.validation.max) || field.state.$viewValue + " is too high" }}'});var n={"Text input fields":[new i("text",{displayName:"Textbox"}),new i("email"),new i("number",{validation:{maxlength:15}}),new i("password"),new i("textarea")],"Checkbox fields":[new i("checkbox",{nolabel:!0}),new i("checkboxlist",{displayName:"Checkbox List",options:[{value:"1",text:"Option 1"},{value:"2",text:"Option 2"},{value:"3",text:"Option 3"}],value:{1:!0,2:!0}})],"Select input fields":[new i("radiobuttonlist",{displayName:"Radiobutton List",options:[{value:"1",text:"Option 1"},{value:"2",text:"Option 2"},{value:"3",text:"Option 3"}],value:"1"}),new i("selectlist",{displayName:"Select List",options:[{value:"1",text:"Option 1"},{value:"2",text:"Option 2"},{value:"3",text:"Option 3"}],value:"1"})]};e.forEach(n,function(i,n){e.forEach(i,function(e){t.fields.add(e,n)})}),t.validation.pattern({None:void 0,Url:"^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$",Domain:"^([a-z][a-z0-9\\-]+(\\.|\\-*\\.))+[a-z]{2,6}$","IPv4 Address":"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$","Email Address":"^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$",Integer:"^-{0,1}\\d+$","Positive Integers":"^\\d+$","Negative Integers":"^-\\d+$",Number:"^-{0,1}\\d*\\.{0,1}\\d+$","Positive Number":"^\\d*\\.{0,1}\\d+$","Negative Number":"^-\\d*\\.{0,1}\\d+$","Year (1920-2099)":"^(19|20)[\\d]{2,2}$",Password:"(?=.*\\d)(?=.*[!@#$%^&*\\-=()|?.\"';:]+)(?![.\\n])(?=.*[A-Z])(?=.*[a-z]).*$"})}]),e.module("fg").run(["$templateCache",function(e){e.put("angular-form-gen/edit/edit.ng.html",'
'),e.put("angular-form-gen/validation/summary.ng.html",''),e.put("angular-form-gen/common/jsonify/jsonify.ng.html",'
{{ jsonify | j$on:displayHidden }}
'),e.put("angular-form-gen/common/tabs/tabs-pane.ng.html",'
'),e.put("angular-form-gen/common/tabs/tabs.ng.html",'
'),e.put("angular-form-gen/edit/canvas/canvas.ng.html",'
Canvas

X

Drag one of the available templates from the palette onto this canvas.

'),e.put("angular-form-gen/edit/palette/palette.ng.html",'
'),e.put("angular-form-gen/field-templates/default/checkbox.ng.html",'
'),e.put("angular-form-gen/field-templates/default/checkboxlist.ng.html",'
'),e.put("angular-form-gen/field-templates/default/dropdownlist.ng.html",'
'),e.put("angular-form-gen/field-templates/default/email.ng.html",''),e.put("angular-form-gen/field-templates/default/not-in-cache.ng.html",'

No template registered in cache for field type "{{ field.type }}".

'),e.put("angular-form-gen/field-templates/default/number.ng.html",''),e.put("angular-form-gen/field-templates/default/password.ng.html",''),e.put("angular-form-gen/field-templates/default/radiobuttonlist.ng.html",'
'),e.put("angular-form-gen/field-templates/default/selectlist.ng.html",''),e.put("angular-form-gen/field-templates/default/text.ng.html",''),e.put("angular-form-gen/field-templates/default/textarea.ng.html",''),e.put("angular-form-gen/field-templates/properties/checkbox.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/checkboxlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/dropdownlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/email.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/number.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/password.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/radiobuttonlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/selectlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/text.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/textarea.ng.html",'
'),e.put("angular-form-gen/form/field/field.ng.html",'
'),e.put("angular-form-gen/form/form-fields/form-fields.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/field.ng.html",'
'),e.put("angular-form-gen/edit/palette/categories/categories.ng.html",'Palette - {{ categoryName || \'All field types\' }} '),e.put("angular-form-gen/edit/canvas/field/properties/properties.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/options/options.ng.html",'

No options defined

Click here to add a new option definition to this field.

ValueText
'),e.put("angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html",'
')}]),t.directive("fgBindExpression",["$interpolate",function(e){function t(e){for(var t=[],i=e.parts,n=i.length;n--;){var a=i[n];a.exp&&!a.exp.match(/^\s*$/)&&t.push(a.exp)}return"["+t.join()+"]"}return function(i,n,a){function l(){o&&o(),o=void 0}function r(){n.text(d(i))}var d,o,f;i.$on("$destroy",function(){l()}),i.$watch(a.fgBindExpression,function(a){if(void 0!==a){d=e(a),n.addClass("ng-binding").data("$binding",d);var s=t(d);f!==s?(f=s,l(),o=i.$watchCollection(s,function(){r()})):r()}})}}]),t.directive("fgDropdownInput",["$compile","$document","$timeout","$parse","fgUtils",function(t,i,n,a,l){function r(t,i){var a='
',l=e.element(a),r=l.find("input"),d=i.prop("attributes");e.forEach(d,function(e){"fg-dropdown-input"!==e.name&&"class"!==e.name&&r.attr(e.name,e.value)});{var o;l.find("button")}return t.dropdownToggle=function(){t.dropdownVisible=!t.dropdownVisible},t.$on("$destroy",function(){o&&n.cancel(o),o=void 0}),l}function d(t,i,n,r,d){var o=a(n.ngModel),f=o.assign,s='
',g=e.element(s);t.setModelValue=function(e){t.dropdownVisible=!1;for(var i=e||"",n=r.$formatters.length;n--;){var a=r.$formatters[n],i=a(i);if(void 0===i)break}n=r.$parsers.length;for(var l=i;n--;){var a=r.$parsers[n];if(l=a(l),void 0===l)break}void 0===l?(r.$setViewValue(i),r.$render()):f(t,e)},t.getModelValue=function(){return o(t)};var p=d[0];return t.$watch("dropdownVisible",function(e){if(e){var t=p.getBoundingClientRect(),i=l.getScrollOffset();g.css({left:i.x+t.left+"px",top:i.y+t.top+p.clientHeight+"px",width:p.clientWidth+"px"})}}),t.$watchCollection(n.fgDropdownInput,function(e){t.items=e}),t.$on("$destroy",function(){g.remove()}),g}return{priority:1e3,restrict:"A",terminal:!0,scope:!0,compile:function(){return function(e,n,a){var l=r(e,n,a);n.append(l),t(l)(e);var o=l.find("input"),f=o.controller("ngModel"),s=d(e,n,a,f,l),g=t(s),p=i.find("body");p.append(s),g(e)}}}}]),t.directive("fgNullForm",function(){var t={$addControl:e.noop,$removeControl:e.noop,$setValidity:e.noop,$setDirty:e.noop,$setPristine:e.noop};return{restrict:"A",require:["form"],link:function(i,n,a,l){var r=l[0],d=n.parent().inheritedData("$formController");d&&d.$removeControl(r),e.extend(r,t)}}}),t.directive("fgFormRequiredFilter",function(){return{restrict:"A",require:["form"],link:function(e,t,i,n){var a=n[0],l=a.$setValidity;a.$setValidity=function(e,t,i){"required"===e&&(t=!0),l.call(a,e,t,i)}}}}),t.directive("fgInputNumber",function(){return{require:"ngModel",link:function(t,i,n,a){if(a.$parsers.push(function(e){if(void 0==e)return"";var t=e.replace(/[^0-9]/g,""),i=parseInt(t);return t!=e&&(a.$setViewValue(t),a.$render()),i}),a.$parsers.push(function(e){var t=a.$isEmpty(e);return t||/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/.test(e)?(a.$setValidity("number",!0),""===e?null:t?e:parseFloat(e)):(a.$setValidity("number",!1),void 0)}),a.$formatters.push(function(e){return a.$isEmpty(e)?void 0:e}),n.min){var l=function(e){var t=parseFloat(n.min);return!a.$isEmpty(e)&&t>e?(a.$setValidity("min",!1),void 0):(a.$setValidity("min",!0),e)};a.$parsers.push(l),a.$formatters.push(l)}if(n.max){var r=function(e){var t=parseFloat(n.max);return!a.$isEmpty(e)&&e>t?(a.$setValidity("max",!1),void 0):(a.$setValidity("max",!0),e)};a.$parsers.push(r),a.$formatters.push(r)}a.$formatters.push(function(t){return a.$isEmpty(t)||e.isNumber(t)?(a.$setValidity("number",!0),t):(a.$setValidity("number",!1),void 0)})}}}),t.directive("fgPlaceholder",function(){return{link:function(e,t,i){e.$watch(i.fgPlaceholder,function(e){t.attr("placeholder",e)})}}}),t.factory("fgUtils",["$templateCache","$window","fgConfig",function(t,i,n){var a=+new Date%1e4;return{getScrollOffset:function(){var e={};if(void 0!==i.pageYOffset)e.x=i.pageXOffset,e.y=i.pageYOffset;else{var t=i.document.documentElement;e.x=t.scrollLeft,e.y=t.scrollTop}return e},defaultArea:"default",getRenderInfo:function(e){var t=n.fields.renderInfo[e.type]; -return t||(t={},n.fields.renderInfo[e.type]=t),t.templateUrl||(t.templateUrl=this.getTemplateUrl(e)),t.propertiesTemplateUrl||(t.propertiesTemplateUrl=this.getTemplateUrl(e,"properties")),t},formatTemplateUrl:function(e,t){return"angular-form-gen/field-templates/"+(t||this.defaultArea)+"/"+e+".ng.html"},getTemplateUrl:function(e,i){i=i||this.defaultArea;var n=e.type,a=this.formatTemplateUrl(n,i),l=t.get(a);if(!l){if("properties"===i||i===this.defaultArea)return this.formatTemplateUrl("not-in-cache");a=this.getTemplateUrl(e,this.defaultArea)}return a},getUnique:function(){return++a},copyField:function(t){var i=e.copy(t);return i.name="field"+this.getUnique(),i},findElementsByClass:function(e,t,i,n){if(n=n||[],e.className===t&&n.push(e),e.hasChildNodes())for(var a=0;a=0&&!t.$_invalid;)t.$_invalid=i[n].$_invalid}})}]),t.directive("fgEdit",function(){return{priority:100,require:"fgSchema",restrict:"AE",scope:{schema:"=?fgSchema"},replace:!0,controller:"fgEditController as editCtrl",templateUrl:"angular-form-gen/edit/edit.ng.html",link:function(e,t,i,n){void 0===e.schema&&(e.schema={}),n.model(e.schema),e.schemaCtrl=n}}}),t.controller("fgFormController",["$scope","$parse",function(e,t){this.model={};var i=this;this.init=function(n,a,l,r){i.editMode=r;var d=t(n),o=d.assign;return e.$watch(d,function(t){void 0===t&&(t={},o&&o(e,t)),i.model.data=t}),e.$watch(function(){return a.model()},function(e){void 0===e?a.model({}):i.model.schema=e}),i.model.state=l,i.model}}]),t.directive("fgForm",["fgFormCompileFn",function(e){return{restrict:"AE",require:["^?form","fgForm","^fgSchema"],controller:"fgFormController",scope:!0,compile:e}}]).factory("fgFormLinkFn",function(){return function(e,t,i,n){var a=n[0],l=n[1],r=n[2],d="true"===i.fgNoRender;l.init(i.fgFormData,r,a,d)}}).factory("fgFormCompileFn",["fgFormLinkFn",function(e){return function(t,i){t.addClass("fg-form");var n=i.fgNoRender;if("true"!==n){var a="
";t.append(a)}return e}}]),t.directive("fgValidationSummary",["fgValidationSummaryLinkFn",function(e){return{require:["^?fgField","^?form"],templateUrl:"angular-form-gen/validation/summary.ng.html",scope:{fieldName:"@?fgValidationSummary",validationMessages:"=?fgValidationMessages"},link:e}}]).factory("fgValidationSummaryLinkFn",["fgConfig",function(t){return function(i,n,a,l){var r=l[0],d=l[1];r?(i.field=r.field(),i.form=r.form()):d&&(i.form={state:d},i.$watch("fieldName",function(e){i.field={name:e,state:d[e]}})),i.validationMessages&&e.forEach(i.validationMessages,function(e,t){e||delete i.validationMessages[t]}),i.messages=e.extend({},t.validation.messages,i.validationMessages)}}]),t.directive("fgUniqueFieldName",function(){function e(e,t,i){var n,a=t.model(),l=!0;if(a)for(var r=a.fields,d=0;d=e||-1>=t||e>=n.fields.length||t>=n.fields.length||(n.fields[e]=n.fields.splice(t,1,n.fields[e])[0])},this.moveField=function(e,t){if(e>=0&&t<=n.fields.length&&e!==t){var i=n.fields.splice(e,1)[0];t>e&&--t,n.fields.splice(t,0,i)}}}]),t.directive("fgSchema",["fgSchemaLinkFn",function(e){return{require:["fgSchema"],controller:"fgSchemaController",link:e}}]).factory("fgSchemaLinkFn",function(){return function(e,t,i,n){var a=n[0];e.$watch(i.fgSchema,function(e){a.model(e)})}}),t.directive("fgEditCanvasField",function(){return{templateUrl:"angular-form-gen/edit/canvas/field/field.ng.html"}}),t.controller("fgEditPaletteCategoriesController",["$scope","fgConfig",function(e,t){if(e.categories=t.fields.categories,e.setCategory=function(t,i){e.categoryName=t,e.category=i},!e.category)for(var i in e.categories){e.setCategory(i,e.categories[i]);break}}]),t.directive("fgEditPaletteCategories",function(){return{templateUrl:"angular-form-gen/edit/palette/categories/categories.ng.html",require:"^fgEditPalette",scope:{category:"=?"},controller:"fgEditPaletteCategoriesController"}}),t.directive("fgEditCanvasFieldProperties",["fgUtils",function(e){function t(e){for(var t=e.length;t--;){var i=e[t];"Debug"!==i.title&&(i.renderAlways=!0)}}return{templateUrl:"angular-form-gen/edit/canvas/field/properties/properties.ng.html",scope:{field:"=fgEditCanvasFieldProperties"},link:{pre:function(e){e.property={}},post:function(i){i.$watch("fieldPropertiesForm.$invalid",function(e){i.field.$_invalid=e}),i.renderInfo=e.getRenderInfo(i.field),i.$watch("property.tabs.items.length",function(e){e&&t(i.property.tabs.items)})}}}}]),t.controller("fgPropertyFieldOptionsController",["$scope",function(t){function i(e,i){e!==i&&(t.multiple?(t.field.value[e]=t.field.value[i],delete t.field.value[i]):i===t.field.value&&(t.field.value=e))}var n=1;t.$watchCollection("field.options",function(n){n&&e.forEach(n,function(e){e.$_valueWatchFn||(e.$_valueWatchFn=t.$watch(function(){return e.value},i))})}),this.addOption=function(){t.field.options||(t.field.options=[]);var e={value:"Option "+n++};t.field.options.push(e);var i=t.field.options.length;t.multiple||1!==i||(t.field.value=e.value)},this.removeOption=function(e){var i=t.field.options.splice(e,1);if(i&&i.length){var n=i[0];t.multiple?void 0!==t.field.value[n.value]&&delete t.field.value[n.value]:(n.value===t.field.value&&t.field.options.length&&(t.field.value=t.field.options[0].value),n.$_valueWatchFn())}}}]),t.directive("fgPropertyFieldOptions",["fgPropertyFieldOptionsLinkFn",function(e){return{scope:!0,controller:"fgPropertyFieldOptionsController as optionsCtrl",templateUrl:"angular-form-gen/edit/canvas/field/properties/options/options.ng.html",link:e}}]).factory("fgPropertyFieldOptionsLinkFn",function(){return function(e,t,i){e.multiple=!1,i.$observe("fgPropertyFieldOptions",function(t){"multiple"===t&&(e.multiple=!0)})}}),t.directive("fgPropertyFieldCommon",["fgPropertyFieldCommonLinkFn",function(e){return{restrict:"AE",templateUrl:"angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html",link:e}}]).factory("fgPropertyFieldCommonLinkFn",function(){return function(t,i,n){t.fields={fieldname:!1,displayname:!1,placeholder:!1,tooltip:!1,focus:!1},t.$watch(n.fgPropertyFieldCommon,function(i){t.fields=e.extend(t.fields,i)})}}),t.directive("fgPropertyFieldValue",["fgPropertyFieldValueLinkFn",function(e){return{require:["^form"],templateUrl:"angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html",transclude:!0,link:e}}]).factory("fgPropertyFieldValueLinkFn",["$parse",function(){return function(e,t,i,n){e.draw=!0;var a,l=n[0];e.$watch("field.$_redraw",function(i){if(i){var n=l.fieldValue;n&&(a=n.$viewValue),e.draw=!1,e.field.$_redraw=!1}else e.draw=!0,t=t}),e.$watch(function(){return l.fieldValue},function(e){e&&a&&(e.$setViewValue(a),e.$render(),a=void 0)})}}]).directive("fgFieldRedraw",function(){return{require:["ngModel"],link:function(e,t,i){var n=e.$eval(i.ngModel);e.$watch(i.ngModel,function(t){t!=n&&(e.field.$_redraw=!0,n=t)})}}}),t.directive("fgPropertyField",["fgPropertyFieldLinkFn",function(e){return{restrict:"AE",templateUrl:"angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html",transclude:!0,scope:!0,link:e}}]).factory("fgPropertyFieldLinkFn",function(){return function(e,t,i){i.$observe("fgPropertyField",function(t){e.fieldName=t}),i.$observe("fgPropertyFieldLabel",function(t){t&&(e.fieldLabel=t)})}}),t.directive("fgParsePattern",function(){return{require:["ngModel"],link:function(e,t,i,n){function a(e){try{new RegExp(e)}catch(t){return l.$setValidity("pattern",!1),void 0}return l.$setValidity("pattern",!0),e}var l=n[0];l.$parsers.push(a)}}}),t.directive("fgPropertyFieldValidation",["fgPropertyFieldValidationLinkFn",function(e){return{restrict:"A",templateUrl:"angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html",link:e}}]).factory("fgPropertyFieldValidationLinkFn",["fgConfig",function(t){var i=[],n=t.validation.patterns;return e.forEach(n,function(e,t){i.push({value:e,text:t})}),function(t,n,a){t.patternOptions=i,t.field.validation=t.field.validation||{},t.field.validation.messages=t.field.validation.messages||{},t.fields={required:!1,minlength:!1,maxlength:!1,pattern:!1},t.$watch(a.fgPropertyFieldValidation,function(i){t.fields=e.extend(t.fields,i)})}}]),t.directive("fgEditValidationMessage",["fgEditValidationMessageLinkFn",function(e){return{templateUrl:"angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html",link:e,scope:!0}}]).factory("fgEditValidationMessageLinkFn",function(){var e="Enter a error message here that will be shown if this validation fails. If this field is empty a default message will be used.";return function(t,i,n){n.$observe("fgEditValidationMessage",function(e){t.validationType=e}),n.$observe("fgEditValidationTooltip",function(i){i=i||e,t.tooltip=i})}})}(angular); +!function(e){function t(e,t){var i=t;return"string"==typeof e&&"$"===e.charAt(0)&&(i=void 0),i}var i=e.module("fg",["dq"]);i.constant("FgField",function(t,i){this.name=this.type=t,i&&e.extend(this,i),this.displayName=this.displayName||this.type.charAt(0).toUpperCase()+this.type.substring(1)}),i.config(["$provide",function(t){t.provider("fgConfig",function(){function t(e){for(var t=n.length;t--&&n[t].type!==e;);return t}var i={enableDebugInfo:!0,validation:{messages:{},patterns:{}},fields:{templates:[],categories:{},renderInfo:{}}},n=i.fields.templates;return{debug:function(e){i.enableDebugInfo=e},fields:{add:function(e,i,a,l){if(!(e&&e.type&&i&&i.length))throw new Error("Need a valid objectTemplate and at least one category");var r=t(e.type);-1!==r?n[r]=e:n.push(e),this.category(e.type,i),this.renderInfo(e.type,a,l)},remove:function(e){var i=t(e);-1!==i&&n.splice(i,1),this.category(e),this.renderInfo(e)},renderInfo:function(e,t,n){i.fields.renderInfo[e]={templateUrl:t,propertiesTemplateUrl:n}},category:function(t,n){e.isArray(n)||(n=[n]),e.forEach(i.fields.categories,function(e){delete e[t]}),e.forEach(n,function(e){void 0===i.fields.categories[e]&&(i.fields.categories[e]={}),i.fields.categories[e][t]=!0})}},validation:{message:function(t,n){var a=i.validation.messages;if(e.isString(t)){if(!n)throw new Error("No message specified for "+t);a[t]=n}else e.extend(a,t)},pattern:function(t,n){e.isString(t)?i.validation.patterns[name]=n:e.extend(i.validation.patterns,t)}},$get:function(){return i}}})}]),i.config(["fgConfigProvider","FgField",function(t,i){t.validation.message({required:"A value is required for this field.",minlength:'The value does not match the minimum length{{ field.schema && (" of " + field.schema.validation.minlength + " characters" || "")}}.',maxlength:'The value exceeds the maximum length{{ field.schema && (" of " + field.schema.validation.maxlength + " characters" || "")}}.',pattern:'The value "{{ field.state.$viewValue }}" does not match the required format.',email:'The value "{{ field.state.$viewValue }}" is not a valid email address.',unique:'The value "{{ field.state.$viewValue }}" is already in use.',number:'The value "{{ field.state.$viewValue }}" is not a number.',min:'The value {{ field.schema && ("should be at least " + field.schema.validation.min) || field.state.$viewValue + " is too low" }}',max:'The value {{ field.schema && ("should be less than " + field.schema.validation.max) || field.state.$viewValue + " is too high" }}'});var n={"Text input fields":[new i("text",{displayName:"Textbox"}),new i("email"),new i("number",{validation:{maxlength:15}}),new i("password"),new i("textarea")],"Checkbox fields":[new i("checkbox",{nolabel:!0}),new i("checkboxlist",{displayName:"Checkbox List",options:[{value:"1",text:"Option 1"},{value:"2",text:"Option 2"},{value:"3",text:"Option 3"}],value:{1:!0,2:!0}})],"Select input fields":[new i("radiobuttonlist",{displayName:"Radiobutton List",options:[{value:"1",text:"Option 1"},{value:"2",text:"Option 2"},{value:"3",text:"Option 3"}],value:"1"}),new i("selectlist",{displayName:"Select List",options:[{value:"1",text:"Option 1"},{value:"2",text:"Option 2"},{value:"3",text:"Option 3"}],value:"1"})]};e.forEach(n,function(i,n){e.forEach(i,function(e){t.fields.add(e,n)})}),t.validation.pattern({None:void 0,Url:"^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$",Domain:"^([a-z][a-z0-9\\-]+(\\.|\\-*\\.))+[a-z]{2,6}$","IPv4 Address":"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$","Email Address":"^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$",Integer:"^-{0,1}\\d+$","Positive Integers":"^\\d+$","Negative Integers":"^-\\d+$",Number:"^-{0,1}\\d*\\.{0,1}\\d+$","Positive Number":"^\\d*\\.{0,1}\\d+$","Negative Number":"^-\\d*\\.{0,1}\\d+$","Year (1920-2099)":"^(19|20)[\\d]{2,2}$",Password:"(?=.*\\d)(?=.*[!@#$%^&*\\-=()|?.\"';:]+)(?![.\\n])(?=.*[A-Z])(?=.*[a-z]).*$"})}]),e.module("fg").run(["$templateCache",function(e){e.put("angular-form-gen/edit/edit.ng.html",'
'),e.put("angular-form-gen/validation/summary.ng.html",'
'),e.put("angular-form-gen/common/jsonify/jsonify.ng.html",'
{{ jsonify | j$on:displayHidden }}
'),e.put("angular-form-gen/common/tabs/tabs-pane.ng.html",'
'),e.put("angular-form-gen/common/tabs/tabs.ng.html",''),e.put("angular-form-gen/edit/canvas/canvas.ng.html",'
Canvas

X

Drag one of the available templates from the palette onto this canvas.

'),e.put("angular-form-gen/edit/palette/palette.ng.html",'
'),e.put("angular-form-gen/field-templates/default/checkbox.ng.html",'
'),e.put("angular-form-gen/field-templates/default/checkboxlist.ng.html",'
'),e.put("angular-form-gen/field-templates/default/dropdownlist.ng.html",'
'),e.put("angular-form-gen/field-templates/default/email.ng.html",''),e.put("angular-form-gen/field-templates/default/not-in-cache.ng.html",'

No template registered in cache for field type "{{ field.type }}".

'),e.put("angular-form-gen/field-templates/default/number.ng.html",''),e.put("angular-form-gen/field-templates/default/password.ng.html",''),e.put("angular-form-gen/field-templates/default/radiobuttonlist.ng.html",'
'),e.put("angular-form-gen/field-templates/default/selectlist.ng.html",''),e.put("angular-form-gen/field-templates/default/text.ng.html",''),e.put("angular-form-gen/field-templates/default/textarea.ng.html",''),e.put("angular-form-gen/field-templates/properties/checkbox.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/checkboxlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/dropdownlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/email.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/number.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/password.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/radiobuttonlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/selectlist.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/text.ng.html",'
'),e.put("angular-form-gen/field-templates/properties/textarea.ng.html",'
'),e.put("angular-form-gen/form/field/field.ng.html",'
'),e.put("angular-form-gen/form/form-fields/form-fields.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/field.ng.html",'
'),e.put("angular-form-gen/edit/palette/categories/categories.ng.html",'Palette - {{ categoryName || \'All field types\' }} '),e.put("angular-form-gen/edit/canvas/field/properties/properties.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/options/options.ng.html",'

No options defined

Click here to add a new option definition to this field.

ValueText
'),e.put("angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html",'
'),e.put("angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html",'
')}]),i.directive("fgBindExpression",["$interpolate",function(e){function t(e){for(var t=[],i=e.expressions,n=i.length;n--;){var a=i[n];a.exp&&!a.exp.match(/^\s*$/)&&t.push(a.exp)}return"["+t.join()+"]"}return function(i,n,a){function l(){o&&o(),o=void 0}function r(){n.text(d(i))}var d,o,f;i.$on("$destroy",function(){l()}),i.$watch(a.fgBindExpression,function(a){if(void 0!==a){d=e(a),n.addClass("ng-binding").data("$binding",d);var s=t(d);f!==s?(f=s,l(),o=i.$watchCollection(s,function(){r()})):r()}})}}]),i.directive("fgDropdownInput",["$compile","$document","$timeout","$parse","fgUtils",function(t,i,n,a,l){function r(t,i){var a='
',l=e.element(a),r=l.find("input"),d=i.prop("attributes");e.forEach(d,function(e){"fg-dropdown-input"!==e.name&&"class"!==e.name&&r.attr(e.name,e.value)});{var o;l.find("button")}return t.dropdownToggle=function(){t.dropdownVisible=!t.dropdownVisible},t.$on("$destroy",function(){o&&n.cancel(o),o=void 0}),l}function d(t,i,n,r,d){var o=a(n.ngModel),f=o.assign,s='',g=e.element(s);t.setModelValue=function(e){t.dropdownVisible=!1;for(var i=e||"",n=r.$formatters.length;n--;){var a=r.$formatters[n],i=a(i);if(void 0===i)break}n=r.$parsers.length;for(var l=i;n--;){var a=r.$parsers[n];if(l=a(l),void 0===l)break}void 0===l?(r.$setViewValue(i),r.$render()):f(t,e)},t.getModelValue=function(){return o(t)};var p=d[0];return t.$watch("dropdownVisible",function(e){if(e){var t=p.getBoundingClientRect(),i=l.getScrollOffset();g.css({left:i.x+t.left+"px",top:i.y+t.top+p.clientHeight+"px",width:p.clientWidth+"px"})}}),t.$watchCollection(n.fgDropdownInput,function(e){t.items=e}),t.$on("$destroy",function(){g.remove()}),g}return{priority:1e3,restrict:"A",terminal:!0,scope:!0,compile:function(){return function(e,n,a){var l=r(e,n,a);n.append(l),t(l)(e);var o=l.find("input"),f=o.controller("ngModel"),s=d(e,n,a,f,l),g=t(s),p=i.find("body");p.append(s),g(e)}}}}]),i.directive("fgNullForm",function(){var t={$addControl:e.noop,$removeControl:e.noop,$setValidity:e.noop,$setDirty:e.noop,$setPristine:e.noop};return{restrict:"A",require:["form"],link:function(i,n,a,l){var r=l[0],d=n.parent().inheritedData("$formController");d&&d.$removeControl(r),e.extend(r,t)}}}),i.directive("fgFormRequiredFilter",function(){return{restrict:"A",require:["form"],link:function(e,t,i,n){var a=n[0],l=a.$setValidity;a.$setValidity=function(e,t,i){"required"===e&&(t=!0),l.call(a,e,t,i)}}}}),i.directive("fgInputNumber",function(){return{require:"ngModel",link:function(t,i,n,a){if(a.$parsers.push(function(e){if(void 0==e)return"";var t=e.replace(/[^0-9]/g,""),i=parseInt(t);return t!=e&&(a.$setViewValue(t),a.$render()),i}),a.$parsers.push(function(e){var t=a.$isEmpty(e);return t||/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/.test(e)?(a.$setValidity("number",!0),""===e?null:t?e:parseFloat(e)):(a.$setValidity("number",!1),void 0)}),a.$formatters.push(function(e){return a.$isEmpty(e)?void 0:e.toString()}),n.min){var l=function(e){var t=parseFloat(n.min);return!a.$isEmpty(e)&&t>e?(a.$setValidity("min",!1),void 0):(a.$setValidity("min",!0),e)};a.$parsers.push(l),a.$formatters.push(l)}if(n.max){var r=function(e){var t=parseFloat(n.max);return!a.$isEmpty(e)&&e>t?(a.$setValidity("max",!1),void 0):(a.$setValidity("max",!0),e)};a.$parsers.push(r),a.$formatters.push(r)}a.$formatters.push(function(t){return a.$isEmpty(t)||e.isNumber(t)?(a.$setValidity("number",!0),t):(a.$setValidity("number",!1),void 0)})}}}),i.directive("fgPlaceholder",function(){return{link:function(e,t,i){e.$watch(i.fgPlaceholder,function(e){t.attr("placeholder",e)})}}}),i.factory("fgUtils",["$templateCache","$window","fgConfig",function(t,i,n){var a=+new Date%1e4;return{getScrollOffset:function(){var e={}; +if(void 0!==i.pageYOffset)e.x=i.pageXOffset,e.y=i.pageYOffset;else{var t=i.document.documentElement;e.x=t.scrollLeft,e.y=t.scrollTop}return e},defaultArea:"default",getRenderInfo:function(e){var t=n.fields.renderInfo[e.type];return t||(t={},n.fields.renderInfo[e.type]=t),t.templateUrl||(t.templateUrl=this.getTemplateUrl(e)),t.propertiesTemplateUrl||(t.propertiesTemplateUrl=this.getTemplateUrl(e,"properties")),t},formatTemplateUrl:function(e,t){return"angular-form-gen/field-templates/"+(t||this.defaultArea)+"/"+e+".ng.html"},getTemplateUrl:function(e,i){i=i||this.defaultArea;var n=e.type,a=this.formatTemplateUrl(n,i),l=t.get(a);if(!l){if("properties"===i||i===this.defaultArea)return this.formatTemplateUrl("not-in-cache");a=this.getTemplateUrl(e,this.defaultArea)}return a},getUnique:function(){return++a},copyField:function(t){var i=e.copy(t);return i.name="field"+this.getUnique(),i},findElementsByClass:function(e,t,i,n){if(n=n||[],e.className===t&&n.push(e),e.hasChildNodes())for(var a=0;a=0&&!t.$$_invalid;)t.$$_invalid=i[n].$$_invalid}})}]),i.directive("fgEdit",function(){return{priority:100,require:"fgSchema",restrict:"AE",scope:{schema:"=?fgSchema"},replace:!0,controller:"fgEditController as editCtrl",templateUrl:"angular-form-gen/edit/edit.ng.html",link:function(e,t,i,n){void 0===e.schema&&(e.schema={}),n.model(e.schema),e.schemaCtrl=n}}}),i.controller("fgFormController",["$scope","$parse",function(e,t){this.model={};var i=this;this.init=function(n,a,l,r){i.editMode=r;var d=t(n),o=d.assign;return e.$watch(d,function(t){void 0===t&&(t={},o&&o(e,t)),i.model.data=t}),e.$watch(function(){return a.model()},function(e){void 0===e?a.model({}):i.model.schema=e}),i.model.state=l,i.model}}]),i.directive("fgForm",["fgFormCompileFn",function(e){return{restrict:"AE",require:["^?form","fgForm","^fgSchema"],controller:"fgFormController",scope:!0,compile:e}}]).factory("fgFormLinkFn",function(){return function(e,t,i,n){var a=n[0],l=n[1],r=n[2],d="true"===i.fgNoRender;l.init(i.fgFormData,r,a,d)}}).factory("fgFormCompileFn",["fgFormLinkFn",function(e){return function(t,i){t.addClass("fg-form");var n=i.fgNoRender;if("true"!==n){var a="
";t.append(a)}return e}}]),i.directive("fgValidationSummary",["fgValidationSummaryLinkFn",function(e){return{require:["^?fgField","^?form"],templateUrl:"angular-form-gen/validation/summary.ng.html",scope:{fieldName:"@?fgValidationSummary",validationMessages:"=?fgValidationMessages"},link:e}}]).factory("fgValidationSummaryLinkFn",["fgConfig",function(t){return function(i,n,a,l){var r=l[0],d=l[1];r?(i.field=r.field(),i.form=r.form()):d&&(i.form={state:d},i.$watch("fieldName",function(e){i.field={name:e,state:d[e]}})),i.validationMessages&&e.forEach(i.validationMessages,function(e,t){e||delete i.validationMessages[t]}),i.messages=e.extend({},t.validation.messages,i.validationMessages)}}]),i.directive("fgUniqueFieldName",function(){function e(e,t,i){var n,a=t.model(),l=!0;if(a)for(var r=a.fields,d=0;d=e||-1>=t||e>=n.fields.length||t>=n.fields.length||(n.fields[e]=n.fields.splice(t,1,n.fields[e])[0])},this.moveField=function(e,t){if(e>=0&&t<=n.fields.length&&e!==t){var i=n.fields.splice(e,1)[0];t>e&&--t,n.fields.splice(t,0,i)}}}]),i.directive("fgSchema",["fgSchemaLinkFn",function(e){return{require:["fgSchema"],controller:"fgSchemaController",link:e}}]).factory("fgSchemaLinkFn",function(){return function(e,t,i,n){var a=n[0];e.$watch(i.fgSchema,function(e){a.model(e)})}}),i.directive("fgEditCanvasField",function(){return{templateUrl:"angular-form-gen/edit/canvas/field/field.ng.html"}}),i.controller("fgEditPaletteCategoriesController",["$scope","fgConfig",function(e,t){if(e.categories=t.fields.categories,e.setCategory=function(t,i){e.categoryName=t,e.category=i},!e.category)for(var i in e.categories){e.setCategory(i,e.categories[i]);break}}]),i.directive("fgEditPaletteCategories",function(){return{templateUrl:"angular-form-gen/edit/palette/categories/categories.ng.html",require:"^fgEditPalette",scope:{category:"=?"},controller:"fgEditPaletteCategoriesController"}}),i.directive("fgEditCanvasFieldProperties",["fgUtils",function(e){function t(e){for(var t=e.length;t--;){var i=e[t];"Debug"!==i.title&&(i.renderAlways=!0)}}return{templateUrl:"angular-form-gen/edit/canvas/field/properties/properties.ng.html",scope:{field:"=fgEditCanvasFieldProperties"},link:{pre:function(e){e.property={}},post:function(i){i.$watch("fieldPropertiesForm.$invalid",function(e){i.field.$$_invalid=e}),i.renderInfo=e.getRenderInfo(i.field),i.$watch("property.tabs.items.length",function(e){e&&t(i.property.tabs.items)})}}}}]),i.controller("fgPropertyFieldOptionsController",["$scope",function(t){function i(e,i){e!==i&&(t.multiple?(t.field.value[e]=t.field.value[i],delete t.field.value[i]):i===t.field.value&&(t.field.value=e))}var n=1;t.$watchCollection("field.options",function(n){n&&e.forEach(n,function(e){e.$_valueWatchFn||(e.$_valueWatchFn=t.$watch(function(){return e.value},i))})}),this.addOption=function(){t.field.options||(t.field.options=[]);var e={value:"Option "+n++};t.field.options.push(e);var i=t.field.options.length;t.multiple||1!==i||(t.field.value=e.value)},this.removeOption=function(e){var i=t.field.options.splice(e,1);if(i&&i.length){var n=i[0];t.multiple?void 0!==t.field.value[n.value]&&delete t.field.value[n.value]:(n.value===t.field.value&&t.field.options.length&&(t.field.value=t.field.options[0].value),n.$_valueWatchFn())}}}]),i.directive("fgPropertyFieldOptions",["fgPropertyFieldOptionsLinkFn",function(e){return{scope:!0,controller:"fgPropertyFieldOptionsController as optionsCtrl",templateUrl:"angular-form-gen/edit/canvas/field/properties/options/options.ng.html",link:e}}]).factory("fgPropertyFieldOptionsLinkFn",function(){return function(e,t,i){e.multiple=!1,i.$observe("fgPropertyFieldOptions",function(t){"multiple"===t&&(e.multiple=!0)})}}),i.directive("fgPropertyFieldCommon",["fgPropertyFieldCommonLinkFn",function(e){return{restrict:"AE",templateUrl:"angular-form-gen/edit/canvas/field/properties/property-field/common.ng.html",link:e}}]).factory("fgPropertyFieldCommonLinkFn",function(){return function(t,i,n){t.fields={fieldname:!1,displayname:!1,placeholder:!1,tooltip:!1,focus:!1},t.$watch(n.fgPropertyFieldCommon,function(i){t.fields=e.extend(t.fields,i)})}}),i.directive("fgPropertyFieldValue",["fgPropertyFieldValueLinkFn",function(e){return{require:["^form"],templateUrl:"angular-form-gen/edit/canvas/field/properties/property-field/field-value.ng.html",transclude:!0,link:e}}]).factory("fgPropertyFieldValueLinkFn",["$parse",function(){return function(e,t,i,n){e.draw=!0;var a,l=n[0];e.$watch("field.$_redraw",function(i){if(i){var n=l.fieldValue;n&&(a=n.$viewValue),e.draw=!1,e.field.$_redraw=!1}else e.draw=!0,t=t}),e.$watch(function(){return l.fieldValue},function(e){e&&a&&(e.$setViewValue(a),e.$render(),a=void 0)})}}]).directive("fgFieldRedraw",function(){return{require:["ngModel"],link:function(e,t,i){var n=e.$eval(i.ngModel);e.$watch(i.ngModel,function(t){t!=n&&(e.field.$_redraw=!0,n=t)})}}}),i.directive("fgPropertyField",["fgPropertyFieldLinkFn",function(e){return{restrict:"AE",templateUrl:"angular-form-gen/edit/canvas/field/properties/property-field/property-field.ng.html",transclude:!0,scope:!0,link:e}}]).factory("fgPropertyFieldLinkFn",function(){return function(e,t,i){i.$observe("fgPropertyField",function(t){e.fieldName=t}),i.$observe("fgPropertyFieldLabel",function(t){t&&(e.fieldLabel=t)})}}),i.directive("fgParsePattern",function(){return{require:["ngModel"],link:function(e,t,i,n){function a(e){try{new RegExp(e)}catch(t){return l.$setValidity("pattern",!1),void 0}return l.$setValidity("pattern",!0),e}var l=n[0];l.$parsers.push(a)}}}),i.directive("fgPropertyFieldValidation",["fgPropertyFieldValidationLinkFn",function(e){return{restrict:"A",templateUrl:"angular-form-gen/edit/canvas/field/properties/validation/validation.ng.html",link:e}}]).factory("fgPropertyFieldValidationLinkFn",["fgConfig",function(t){var i=[],n=t.validation.patterns;return e.forEach(n,function(e,t){i.push({value:e,text:t})}),function(t,n,a){t.patternOptions=i,t.field.validation=t.field.validation||{},t.field.validation.messages=t.field.validation.messages||{},t.fields={required:!1,minlength:!1,maxlength:!1,pattern:!1},t.$watch(a.fgPropertyFieldValidation,function(i){t.fields=e.extend(t.fields,i)})}}]),i.directive("fgEditValidationMessage",["fgEditValidationMessageLinkFn",function(e){return{templateUrl:"angular-form-gen/edit/canvas/field/properties/validation/validation-message.ng.html",link:e,scope:!0}}]).factory("fgEditValidationMessageLinkFn",function(){var e="Enter a error message here that will be shown if this validation fails. If this field is empty a default message will be used.";return function(t,i,n){n.$observe("fgEditValidationMessage",function(e){t.validationType=e}),n.$observe("fgEditValidationTooltip",function(i){i=i||e,t.tooltip=i})}})}(angular); //# sourceMappingURL=angular-form-gen.min.js.map \ No newline at end of file diff --git a/dist/angular-form-gen.min.js.map b/dist/angular-form-gen.min.js.map index 6ab98a6..d11a4ef 100755 --- a/dist/angular-form-gen.min.js.map +++ b/dist/angular-form-gen.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["angular-form-gen.js"],"names":["angular","fg","module","constant","type","properties","this","name","extend","displayName","charAt","toUpperCase","substring","config","$provide","provider","indexOfTemplate","idx","templates","length","enableDebugInfo","validation","messages","patterns","fields","categories","renderInfo","debug","value","add","objectTemplate","templateUrl","propertiesTemplateUrl","Error","push","category","remove","splice","fieldType","isArray","forEach","undefined","message","typeOrObject","isString","pattern","nameOrObject","$get","fgConfigProvider","FgField","required","minlength","maxlength","email","unique","number","min","max","Text input fields","Checkbox fields","nolabel","options","text","1","2","Select input fields","field","None","Url","Domain","IPv4 Address","Email Address","Integer","Positive Integers","Negative Integers","Number","Positive Number","Negative Number","Year (1920-2099)","Password","run","$templateCache","put","directive","$interpolate","buildWatchExpression","interpolateFn","sb","parts","ii","part","exp","match","join","scope","element","attr","cleanWatchHandle","watchHandle","interpolateExpression","oldWatchExpr","$on","$watch","fgBindExpression","addClass","data","watchExpr","$watchCollection","$compile","$document","$timeout","$parse","fgUtils","createInput","$scope","$element","template","$template","$input","find","attributes","prop","a","closeTimeout","dropdownToggle","dropdownVisible","cancel","createDropdown","$attrs","ngModelCtrl","modelGetter","ngModel","modelSetter","assign","setModelValue","viewValue","$formatters","fn","$parsers","pv","$setViewValue","$render","getModelValue","input","rect","getBoundingClientRect","scroll","getScrollOffset","css","left","x","top","y","clientHeight","width","clientWidth","fgDropdownInput","items","priority","restrict","terminal","compile","append","$inputText","controller","$dropdown","dropdownCompileFn","$body","nullFormCtrl","$addControl","noop","$removeControl","$setValidity","$setDirty","$setPristine","require","link","$ctrls","form","parentForm","parent","inheritedData","validationToken","isValid","control","call","ctrl","inputValue","transformedInput","replace","parseInt","empty","$isEmpty","test","parseFloat","minValidator","maxValidator","isNumber","fgPlaceholder","factory","$window","fgConfig","uniqueCounter","Date","offset","pageYOffset","pageXOffset","de","document","documentElement","scrollLeft","scrollTop","defaultArea","getRenderInfo","getTemplateUrl","formatTemplateUrl","area","templateType","cached","get","getUnique","copyField","copy","findElementsByClass","root","className","recursive","buffer","hasChildNodes","i","children","child","_dragData","getEvent","e","originalEvent","event","stopEvent","cancelBubble","bubbles","stopPropagation","preventDefault","dragData","getParentArea","$emit","isAreaMatch","parentArea","eventArea","evalBroadcastEvent","args","areaName","expression","$eval","dqDragArea","dqDragAreaName","$event","dqDragProgressBegin","dqDragProgressEnd","dqDragTrack","dqUtils","dragLeaveDoubleCheck","$e","target","contains","dragLeaveForSure","off","doingLeaveDoubleCheck","dataTransfer","dropEffect","apply","inbound","dqDragLeave","$apply","trackingEnabled","on","dqDragEnter","result","dqDragOver","dqDrop","$rootScope","evalAndBroadcast","eventName","targetArea","cb","bcData","$broadcast","dqDraggable","dqDragTargetArea","disabled","dqDragDisabled","dragDrop","dt","effectAllowed","setData","dqDragBegin","dqDragEnd","schema","schemaCtrl","model","$_invalid","self","init","dataExpression","state","editMode","dataGetter","dataSetter","fgFormCompileFn","ctrls","ngFormCtrl","formCtrl","fgNoRender","fgFormData","fgFormLinkFn","noRender","renderTemplate","fgValidationSummaryLinkFn","fieldName","validationMessages","fgFieldCtrl","ngFormController","key","validate","schemaField","valid","changeTick","$modelValue","filter","displayHidden","JSON","stringify","toJson","$filter","jsonify","prompt","active","item","sort","order","autoActive","activate","transclude","tabs","fgTabsPaneLinkFn","pane","title","fgTabsPane","fgTabsPaneOrder","fgTabsPaneAutoActive","renderAlways","fgTabsPaneRenderAlways","dragPlaceholder","visible","index","dragging","dragEnter","dragLeave","dragBeginCanvasField","$_isDragging","source","dragEndCanvasField","drop","addField","moveField","editCtrl","ignoreDirty","templateFilter","selectedCategory","_form","_field","fgFormCtrl","fieldSchema","initForm","initField","initDefaultData","$_id","registerState","oldValue","setFieldState","$name","fgFieldLinkFn","tabIndex","noValidationSummary","fgFieldInputLinkFn","fgForm","_model","removeField","swapFields","idx1","idx2","fromIdx","toIdx","fgSchemaLinkFn","fgSchema","setCategory","categoryName","setRenderAlways","tabItems","tab","pre","property","post","newValue","handleValueChange","multiple","optionCounter","option","$_valueWatchFn","addOption","count","removeOption","fgPropertyFieldOptionsLinkFn","$observe","fgPropertyFieldCommonLinkFn","fieldname","displayname","placeholder","tooltip","focus","fgPropertyFieldValueLinkFn","draw","oldViewValue","frmCtrl","$viewValue","$_redraw","fgPropertyFieldLinkFn","fieldLabel","RegExp","fgPropertyFieldValidationLinkFn","patternOptions","patternConfig","fgEditValidationMessageLinkFn","DEFAULT_TOOLTIP","validationType"],"mappings":"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","file":"angular-form-gen.min.js","sourceRoot":"./"} \ No newline at end of file +{"version":3,"sources":["angular-form-gen.js"],"names":["angular","fgToJsonReplacer","key","value","val","charAt","undefined","fg","module","constant","type","properties","this","name","extend","displayName","toUpperCase","substring","config","$provide","provider","indexOfTemplate","idx","templates","length","enableDebugInfo","validation","messages","patterns","fields","categories","renderInfo","debug","add","objectTemplate","templateUrl","propertiesTemplateUrl","Error","push","category","remove","splice","fieldType","isArray","forEach","message","typeOrObject","isString","pattern","nameOrObject","$get","fgConfigProvider","FgField","required","minlength","maxlength","email","unique","number","min","max","Text input fields","Checkbox fields","nolabel","options","text","1","2","Select input fields","field","None","Url","Domain","IPv4 Address","Email Address","Integer","Positive Integers","Negative Integers","Number","Positive Number","Negative Number","Year (1920-2099)","Password","run","$templateCache","put","directive","$interpolate","buildWatchExpression","interpolateFn","sb","expressions","ii","expression","exp","match","join","scope","element","attr","cleanWatchHandle","watchHandle","interpolateExpression","oldWatchExpr","$on","$watch","fgBindExpression","addClass","data","watchExpr","$watchCollection","$compile","$document","$timeout","$parse","fgUtils","createInput","$scope","$element","template","$template","$input","find","attributes","prop","a","closeTimeout","dropdownToggle","dropdownVisible","cancel","createDropdown","$attrs","ngModelCtrl","modelGetter","ngModel","modelSetter","assign","setModelValue","viewValue","$formatters","fn","$parsers","pv","$setViewValue","$render","getModelValue","input","rect","getBoundingClientRect","scroll","getScrollOffset","css","left","x","top","y","clientHeight","width","clientWidth","fgDropdownInput","items","priority","restrict","terminal","compile","append","$inputText","controller","$dropdown","dropdownCompileFn","$body","nullFormCtrl","$addControl","noop","$removeControl","$setValidity","$setDirty","$setPristine","require","link","$ctrls","form","parentForm","parent","inheritedData","validationToken","isValid","control","call","ctrl","inputValue","transformedInput","replace","parseInt","empty","$isEmpty","test","parseFloat","toString","minValidator","maxValidator","isNumber","fgPlaceholder","factory","$window","fgConfig","uniqueCounter","Date","offset","pageYOffset","pageXOffset","de","document","documentElement","scrollLeft","scrollTop","defaultArea","getRenderInfo","getTemplateUrl","formatTemplateUrl","area","templateType","cached","get","getUnique","copyField","copy","findElementsByClass","root","className","recursive","buffer","hasChildNodes","i","children","child","_dragData","getEvent","e","originalEvent","event","stopEvent","cancelBubble","bubbles","stopPropagation","preventDefault","dragData","getParentArea","$emit","isAreaMatch","parentArea","eventArea","evalBroadcastEvent","args","areaName","$eval","dqDragArea","dqDragAreaName","$event","dqDragProgressBegin","dqDragProgressEnd","dqDragTrack","dqUtils","dragLeaveDoubleCheck","$e","target","contains","dragLeaveForSure","off","doingLeaveDoubleCheck","dataTransfer","dropEffect","apply","inbound","dqDragLeave","$apply","trackingEnabled","on","dqDragEnter","result","dqDragOver","dqDrop","$rootScope","evalAndBroadcast","eventName","targetArea","cb","bcData","$broadcast","dqDraggable","dqDragTargetArea","disabled","dqDragDisabled","dragDrop","dt","effectAllowed","setData","dqDragBegin","dqDragEnd","schema","schemaCtrl","model","$$_invalid","self","init","dataExpression","state","editMode","dataGetter","dataSetter","fgFormCompileFn","ctrls","ngFormCtrl","formCtrl","fgNoRender","fgFormData","fgFormLinkFn","noRender","renderTemplate","fgValidationSummaryLinkFn","fieldName","validationMessages","fgFieldCtrl","ngFormController","validate","schemaField","valid","changeTick","$modelValue","active","item","sort","order","autoActive","activate","transclude","tabs","fgTabsPaneLinkFn","pane","title","fgTabsPane","fgTabsPaneOrder","fgTabsPaneAutoActive","renderAlways","fgTabsPaneRenderAlways","filter","displayHidden","JSON","stringify","$filter","jsonify","prompt","dragPlaceholder","visible","index","dragging","dragEnter","dragLeave","dragBeginCanvasField","$_isDragging","source","dragEndCanvasField","drop","addField","moveField","editCtrl","ignoreDirty","templateFilter","selectedCategory","_form","_field","fgFormCtrl","fieldSchema","initForm","initField","initDefaultData","$_id","registerState","oldValue","setFieldState","$name","fgFieldLinkFn","tabIndex","noValidationSummary","fgFieldInputLinkFn","attrs","alert","ngPattern","newval","oldval","$viewValue","fgForm","_model","removeField","swapFields","idx1","idx2","fromIdx","toIdx","fgSchemaLinkFn","fgSchema","setCategory","categoryName","setRenderAlways","tabItems","tab","pre","property","post","newValue","handleValueChange","multiple","optionCounter","option","$_valueWatchFn","addOption","count","removeOption","fgPropertyFieldOptionsLinkFn","$observe","fgPropertyFieldCommonLinkFn","fieldname","displayname","placeholder","tooltip","focus","fgPropertyFieldValueLinkFn","draw","oldViewValue","frmCtrl","$_redraw","fgPropertyFieldLinkFn","fieldLabel","RegExp","fgPropertyFieldValidationLinkFn","patternOptions","patternConfig","fgEditValidationMessageLinkFn","DEFAULT_TOOLTIP","validationType"],"mappings":"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","file":"angular-form-gen.min.js","sourceRoot":"./"} \ No newline at end of file diff --git a/package.json b/package.json index 30913d7..2d7b70a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-form-gen", - "version": "0.0.2", + "version": "0.0.3", "description": "Dynamic form schema generator for AngularJS", "homepage": "https://github.com/McNull/angular-form-gen", "main": "gulp", diff --git a/src/angular-form-gen/angular-form-gen-templates.js b/src/angular-form-gen/angular-form-gen-templates.js index c8697d9..7257c49 100755 --- a/src/angular-form-gen/angular-form-gen-templates.js +++ b/src/angular-form-gen/angular-form-gen-templates.js @@ -11,30 +11,30 @@ angular.module('fg').run(['$templateCache', function($templateCache){ $templateCache.put('angular-form-gen/edit/palette/palette.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/default/checkbox.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/default/checkboxlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/default/dropdownlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/default/email.ng.html', ''); + $templateCache.put('angular-form-gen/field-templates/default/dropdownlist.ng.html', '
'); + $templateCache.put('angular-form-gen/field-templates/default/email.ng.html', ''); $templateCache.put('angular-form-gen/field-templates/default/not-in-cache.ng.html', '

No template registered in cache for field type \"{{ field.type }}\".

'); - $templateCache.put('angular-form-gen/field-templates/default/number.ng.html', ''); - $templateCache.put('angular-form-gen/field-templates/default/password.ng.html', ''); + $templateCache.put('angular-form-gen/field-templates/default/number.ng.html', ''); + $templateCache.put('angular-form-gen/field-templates/default/password.ng.html', ''); $templateCache.put('angular-form-gen/field-templates/default/radiobuttonlist.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/default/selectlist.ng.html', ''); - $templateCache.put('angular-form-gen/field-templates/default/text.ng.html', ''); - $templateCache.put('angular-form-gen/field-templates/default/textarea.ng.html', ''); $templateCache.put('angular-form-gen/field-templates/properties/checkbox.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/properties/checkboxlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/dropdownlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/email.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/number.ng.html', '
= 0\">
= 0\">
'); + $templateCache.put('angular-form-gen/field-templates/properties/dropdownlist.ng.html', '
'); + $templateCache.put('angular-form-gen/field-templates/properties/email.ng.html', '
'); + $templateCache.put('angular-form-gen/field-templates/properties/number.ng.html', '
= 0\">
= 0\">
'); $templateCache.put('angular-form-gen/field-templates/properties/password.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/properties/radiobuttonlist.ng.html', '
'); $templateCache.put('angular-form-gen/field-templates/properties/selectlist.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/text.ng.html', '
'); - $templateCache.put('angular-form-gen/field-templates/properties/textarea.ng.html', '
'); $templateCache.put('angular-form-gen/form/field/field.ng.html', '
'); $templateCache.put('angular-form-gen/form/form-fields/form-fields.ng.html', '
'); - $templateCache.put('angular-form-gen/edit/canvas/field/field.ng.html', '
'); + $templateCache.put('angular-form-gen/edit/canvas/field/field.ng.html', '
'); $templateCache.put('angular-form-gen/edit/palette/categories/categories.ng.html', 'Palette - {{ categoryName || \'All field types\' }} '); $templateCache.put('angular-form-gen/edit/canvas/field/properties/properties.ng.html', '
'); $templateCache.put('angular-form-gen/edit/canvas/field/properties/options/options.ng.html', '

No options defined

Click here to add a new option definition to this field.

0\" class=\"table-field-options\">
ValueText
'); diff --git a/src/angular-form-gen/common/bind-expression.js b/src/angular-form-gen/common/bind-expression.js index c1ccbb9..a9bf17c 100644 --- a/src/angular-form-gen/common/bind-expression.js +++ b/src/angular-form-gen/common/bind-expression.js @@ -2,14 +2,14 @@ fg.directive('fgBindExpression', function ($interpolate) { function buildWatchExpression(interpolateFn) { var sb = []; - var parts = interpolateFn.parts; - var ii = parts.length; + var expressions = interpolateFn.expressions; + var ii = expressions.length; while (ii--) { - var part = parts[ii]; + var expression = expressions[ii]; - if (part.exp && !part.exp.match(/^\s*$/)) { - sb.push(part.exp); + if (expression.exp && !expression.exp.match(/^\s*$/)) { + sb.push(expression.exp); } } diff --git a/src/angular-form-gen/common/fg-number-input-directive.js b/src/angular-form-gen/common/fg-number-input-directive.js index e626fbd..6593778 100644 --- a/src/angular-form-gen/common/fg-number-input-directive.js +++ b/src/angular-form-gen/common/fg-number-input-directive.js @@ -2,9 +2,9 @@ fg.directive('fgInputNumber', function() { return { require: 'ngModel', link: function(scope, element, attr, ctrl) { - + ctrl.$parsers.push(function(inputValue) { - // this next if is necessary for when using ng-required on your input. + // this next if is necessary for when using ng-required on your input. // In such cases, when a letter is typed first, this parser will be called // again, and the 2nd time, the value will be undefined if (inputValue == undefined) { @@ -37,7 +37,7 @@ fg.directive('fgInputNumber', function() { }); ctrl.$formatters.push(function(value) { - return ctrl.$isEmpty(value) ? undefined : value; + return ctrl.$isEmpty(value) ? undefined : value.toString(); }); if (attr.min) { diff --git a/src/angular-form-gen/common/jsonify/jsonify.js b/src/angular-form-gen/common/jsonify/jsonify.js index 87d6834..8f229cb 100644 --- a/src/angular-form-gen/common/jsonify/jsonify.js +++ b/src/angular-form-gen/common/jsonify/jsonify.js @@ -1,10 +1,21 @@ +function fgToJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$') { + val = undefined; + } + return val; +} + fg.filter('j$on',function () { return function (input, displayHidden) { if(displayHidden) return JSON.stringify(input || {}, null, ' '); - return angular.toJson(input || {}, true); + //https://github.com/angular/angular.js/commit/c054288c9722875e3595e6e6162193e0fb67a251#diff-1d54c5f722aebc473dbe96f836ddf974R995 + //return angular.toJson(input || {}, true); + return JSON.stringify(input || {}, fgToJsonReplacer, ' '); }; }).directive('jsonify', function ($window, $filter) { return { diff --git a/src/angular-form-gen/common/jsonify/jsonify.ng.html b/src/angular-form-gen/common/jsonify/jsonify.ng.html index 3259de8..ce6aa4c 100644 --- a/src/angular-form-gen/common/jsonify/jsonify.ng.html +++ b/src/angular-form-gen/common/jsonify/jsonify.ng.html @@ -13,4 +13,4 @@
{{ jsonify | j$on:displayHidden }}
- \ No newline at end of file + diff --git a/src/angular-form-gen/edit/canvas/field/field.ng.html b/src/angular-form-gen/edit/canvas/field/field.ng.html index b2f5a69..901d8c5 100644 --- a/src/angular-form-gen/edit/canvas/field/field.ng.html +++ b/src/angular-form-gen/edit/canvas/field/field.ng.html @@ -1,5 +1,5 @@
= 0 && !schema.$_invalid) { - schema.$_invalid = fields[i].$_invalid; + while (--i >= 0 && !schema.$$_invalid) { + schema.$$_invalid = fields[i].$$_invalid; } } } diff --git a/src/angular-form-gen/edit/edit-controller.test.js b/src/angular-form-gen/edit/edit-controller.test.js index 936cfac..5179a8d 100644 --- a/src/angular-form-gen/edit/edit-controller.test.js +++ b/src/angular-form-gen/edit/edit-controller.test.js @@ -37,7 +37,7 @@ // expect(controller).toBeDefined(); // }); // -// describe('schema.$_invalid', function() { +// describe('schema.$$_invalid', function() { // // it('should be invalid when metaForm is not available', function() { // @@ -53,7 +53,7 @@ // // // Assert // -// expect(schema.$_invalid).toBe(false); +// expect(schema.$$_invalid).toBe(false); // // }); // @@ -77,7 +77,7 @@ // // // Assert // -// expect(schema.$_invalid).toBe(true); +// expect(schema.$$_invalid).toBe(true); // // }); // @@ -101,7 +101,7 @@ // // // Assert // -// expect(schema.$_invalid).toBe(false); +// expect(schema.$$_invalid).toBe(false); // // }); // @@ -121,7 +121,7 @@ // // var myField = new fg.Field('myType'); // schema.fields.push(myField); -// myField.$_invalid = true; +// myField.$$_invalid = true; // // // Act // @@ -129,7 +129,7 @@ // // // Assert // -// expect(schema.$_invalid).toBe(true); +// expect(schema.$$_invalid).toBe(true); // // }); // diff --git a/src/angular-form-gen/edit/edit-directive.test.js b/src/angular-form-gen/edit/edit-directive.test.js index 4e7e365..9441bad 100644 --- a/src/angular-form-gen/edit/edit-directive.test.js +++ b/src/angular-form-gen/edit/edit-directive.test.js @@ -69,7 +69,7 @@ describe('fg-edit-directive', function () { // Assert expect($scope.myNoneExistingSchema).toBeDefined(); - + }); it('should set the schema model on the controller', function() { @@ -91,7 +91,7 @@ describe('fg-edit-directive', function () { expect($scope.schemaCtrl.model()).toBe($scope.mySchema); }); - + describe('$scope.actionsEnabled', function () { it('should default to true if no value is provided', function () { @@ -182,4 +182,4 @@ describe('fg-edit-directive', function () { }); -}); \ No newline at end of file +}); diff --git a/src/angular-form-gen/field-templates/default/dropdownlist.ng.html b/src/angular-form-gen/field-templates/default/dropdownlist.ng.html index 21dced8..2f85b71 100644 --- a/src/angular-form-gen/field-templates/default/dropdownlist.ng.html +++ b/src/angular-form-gen/field-templates/default/dropdownlist.ng.html @@ -8,6 +8,6 @@ placeholder="{{ field.schema.placeholder }}" ng-minlength="{{ field.schema.validation.minlength }}" ng-maxlength="{{ field.schema.validation.maxlength }}" - ng-pattern="/{{ field.schema.validation.pattern }}/" + ng-pattern="field.schema.validation.pattern" ng-disabled="isDisabled(field.schema)">
diff --git a/src/angular-form-gen/field-templates/default/email.ng.html b/src/angular-form-gen/field-templates/default/email.ng.html index fc98e0a..1b201a4 100644 --- a/src/angular-form-gen/field-templates/default/email.ng.html +++ b/src/angular-form-gen/field-templates/default/email.ng.html @@ -1,5 +1,6 @@ \ No newline at end of file + ng-pattern="field.schema.validation.pattern" + ng-disabled="isDisabled(field.schema)"> diff --git a/src/angular-form-gen/field-templates/default/number.ng.html b/src/angular-form-gen/field-templates/default/number.ng.html index fa809e0..ca60537 100644 --- a/src/angular-form-gen/field-templates/default/number.ng.html +++ b/src/angular-form-gen/field-templates/default/number.ng.html @@ -12,5 +12,5 @@ ng-required="field.schema.validation.required" ng-minlength="{{ field.schema.validation.minlength }}" ng-maxlength="{{ field.schema.validation.maxlength }}" - ng-pattern="/{{ field.schema.validation.pattern }}/" + ng-pattern="field.schema.validation.pattern" ng-disabled="isDisabled(field.schema)"> \ No newline at end of file diff --git a/src/angular-form-gen/field-templates/default/password.ng.html b/src/angular-form-gen/field-templates/default/password.ng.html index b192298..7035915 100644 --- a/src/angular-form-gen/field-templates/default/password.ng.html +++ b/src/angular-form-gen/field-templates/default/password.ng.html @@ -9,5 +9,5 @@ ng-required="field.schema.validation.required" ng-minlength="{{ field.schema.validation.minlength }}" ng-maxlength="{{ field.schema.validation.maxlength }}" - ng-pattern="/{{ field.schema.validation.pattern }}/" + ng-pattern="field.schema.validation.pattern" ng-disabled="isDisabled(field.schema)"> \ No newline at end of file diff --git a/src/angular-form-gen/field-templates/default/text.ng.html b/src/angular-form-gen/field-templates/default/text.ng.html index 190e6c1..1a567fd 100644 --- a/src/angular-form-gen/field-templates/default/text.ng.html +++ b/src/angular-form-gen/field-templates/default/text.ng.html @@ -1,5 +1,6 @@ \ No newline at end of file + ng-pattern="field.schema.validation.pattern" + ng-disabled="isDisabled(field.schema)"> + diff --git a/src/angular-form-gen/field-templates/default/textarea.ng.html b/src/angular-form-gen/field-templates/default/textarea.ng.html index 0491eca..073c1b8 100644 --- a/src/angular-form-gen/field-templates/default/textarea.ng.html +++ b/src/angular-form-gen/field-templates/default/textarea.ng.html @@ -8,5 +8,5 @@ ng-required="field.schema.validation.required" ng-minlength="{{ field.schema.validation.minlength }}" ng-maxlength="{{ field.schema.validation.maxlength }}" - ng-pattern="/{{ field.schema.validation.pattern }}/"> - \ No newline at end of file + ng-pattern="field.schema.validation.pattern" + diff --git a/src/angular-form-gen/field-templates/properties/dropdownlist.ng.html b/src/angular-form-gen/field-templates/properties/dropdownlist.ng.html index 28ebb70..1cc1c65 100644 --- a/src/angular-form-gen/field-templates/properties/dropdownlist.ng.html +++ b/src/angular-form-gen/field-templates/properties/dropdownlist.ng.html @@ -2,11 +2,12 @@
+ ng-pattern="field.schema.validation.pattern">
diff --git a/src/angular-form-gen/field-templates/properties/email.ng.html b/src/angular-form-gen/field-templates/properties/email.ng.html index 5eada04..1f229b5 100644 --- a/src/angular-form-gen/field-templates/properties/email.ng.html +++ b/src/angular-form-gen/field-templates/properties/email.ng.html @@ -2,13 +2,14 @@
- + ng-pattern="field.validation.pattern"/>
diff --git a/src/angular-form-gen/field-templates/properties/number.ng.html b/src/angular-form-gen/field-templates/properties/number.ng.html index 81625ee..c5ae624 100644 --- a/src/angular-form-gen/field-templates/properties/number.ng.html +++ b/src/angular-form-gen/field-templates/properties/number.ng.html @@ -4,6 +4,7 @@
+ ng-pattern="field.validation.pattern"/>
diff --git a/src/angular-form-gen/field-templates/properties/text.ng.html b/src/angular-form-gen/field-templates/properties/text.ng.html index 99ccad1..3ba3e6b 100644 --- a/src/angular-form-gen/field-templates/properties/text.ng.html +++ b/src/angular-form-gen/field-templates/properties/text.ng.html @@ -11,13 +11,14 @@ -->
- + ng-pattern="field.validation.pattern"/>
diff --git a/src/angular-form-gen/field-templates/properties/textarea.ng.html b/src/angular-form-gen/field-templates/properties/textarea.ng.html index dff45c6..15dd427 100644 --- a/src/angular-form-gen/field-templates/properties/textarea.ng.html +++ b/src/angular-form-gen/field-templates/properties/textarea.ng.html @@ -2,12 +2,13 @@
-
diff --git a/src/angular-form-gen/form/field/field-input-directive.js b/src/angular-form-gen/form/field/field-input-directive.js index 7f15110..75ec1b0 100644 --- a/src/angular-form-gen/form/field/field-input-directive.js +++ b/src/angular-form-gen/form/field/field-input-directive.js @@ -1,14 +1,43 @@ -fg.directive('fgFieldInput', function(fgFieldInputLinkFn) { +fg.directive('fgFieldInput', function (fgFieldInputLinkFn) { return { require: ['^fgField', 'ngModel'], link: fgFieldInputLinkFn }; -}).factory('fgFieldInputLinkFn', function() { - return function($scope, $element, $attrs, ctrls) { +}).factory('fgFieldInputLinkFn', function () { + return function ($scope, $element, $attrs, ctrls) { var fgFieldCtrl = ctrls[0]; var ngModelCtrl = ctrls[1]; fgFieldCtrl.setFieldState(ngModelCtrl); }; -}); \ No newline at end of file +}).factory('fgUpdatePattern', function () { + //SSchaaf http://stackoverflow.com/questions/20847979/ngpattern-binding-not-working + //Angular migration https://docs.angularjs.org/guide/migration + return { + require: "^ngModel", + link: function (scope, element, attrs, ctrl) { + scope.$watch(function () { + // Evaluate the ngPattern attribute against the current scope + alert("attrs.ngPattern", attrs.ngPattern); + return scope.$eval(attrs.ngPattern); + }, + function (newval, oldval) { + //Get the value from `ngModel` + alert("newval", newval); + alert("oldval", oldval); + value = ctrl.$viewValue; + + // And set validity on the model to true if the element + // is empty or passes the regex test + if (ctrl.$isEmpty(value) || newval.test(value)) { + ctrl.$setValidity('pattern', true); + return value; + } else { + ctrl.$setValidity('pattern', false); + return undefined; + } + }); + } + } +}); diff --git a/src/app/demo/edit/form-preview.html b/src/app/demo/edit/form-preview.html index d9c5c83..7d24314 100644 --- a/src/app/demo/edit/form-preview.html +++ b/src/app/demo/edit/form-preview.html @@ -8,7 +8,6 @@
{{ form.name }}

{{ form.description }}

-
diff --git a/src/app/demo/routing.js b/src/app/demo/routing.js index 90a0a21..9afe104 100644 --- a/src/app/demo/routing.js +++ b/src/app/demo/routing.js @@ -15,7 +15,7 @@ app.route.forms = [ { url: '/demo', controller: 'FormListCtrl', - templateUrl: '/app/demo/index.html', + templateUrl: 'app/demo/index.html', resolve: { forms: ['Form', function(Form) { return Form.query(); @@ -25,7 +25,7 @@ app.route.forms = [ }, { url: '/demo/:id/edit', - templateUrl: '/app/demo/edit/edit.html', + templateUrl: 'app/demo/edit/edit.html', controller: 'FormEditCtrl', resolve: { form: getFormById @@ -34,7 +34,7 @@ app.route.forms = [ }, { url: '/demo/:id/data/:dataId/edit', - templateUrl: '/app/demo/data/edit/data-edit.html', + templateUrl: 'app/demo/data/edit/data-edit.html', controller: 'FormDataEditCtrl', resolve: { form: getFormById, @@ -44,7 +44,7 @@ app.route.forms = [ }, { url: '/demo/:id', - templateUrl: '/app/demo/data/data-list.html', + templateUrl: 'app/demo/data/data-list.html', controller: 'FormDataListCtrl', resolve: { form: getFormById,