Kaynağa Gözat

Deep in the mire

Richard Knight 6 yıl önce
ebeveyn
işleme
ca31d30b27

+ 146 - 152
package-lock.json

@@ -5,26 +5,26 @@
   "requires": true,
   "dependencies": {
     "@angular-devkit/architect": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.11.1.tgz",
-      "integrity": "sha512-MdcZ5KclwL2SBXCQSn8uI2hakBX58EyuAwFWsM/pKrNt9j8RqIk93l4amd2OkaMtZRFP5zWodyf/3qOwacjuQg==",
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.11.2.tgz",
+      "integrity": "sha512-RTwpxc4glRsO6EW50WryZ2UZ+75hABnaRabRp7QsgADJylA10ANX2H3OjhRQQ6nQ3opE3w9GydM+5sHBKy6hPw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.1.1",
+        "@angular-devkit/core": "7.1.2",
         "rxjs": "6.3.3"
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.11.1.tgz",
-      "integrity": "sha512-hA/3GVMmRwOPXWhImrBG9gZTdERr937NMuedKhTXuNj6TNMNjk9XQ+q2erd0LZVbgfhL/nC0wHnpy0dUWXu8jA==",
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.11.2.tgz",
+      "integrity": "sha512-pWOyV36GtvRxQmqBES0QtambXDmDH1NGG3jpGgj8CHPPSqi/TkxCQwFzoyYbPIHqylKpYGVGRrxuJ0I82D1jqQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.11.1",
-        "@angular-devkit/build-optimizer": "0.11.1",
-        "@angular-devkit/build-webpack": "0.11.1",
-        "@angular-devkit/core": "7.1.1",
-        "@ngtools/webpack": "7.1.1",
+        "@angular-devkit/architect": "0.11.2",
+        "@angular-devkit/build-optimizer": "0.11.2",
+        "@angular-devkit/build-webpack": "0.11.2",
+        "@angular-devkit/core": "7.1.2",
+        "@ngtools/webpack": "7.1.2",
         "ajv": "6.5.3",
         "autoprefixer": "9.3.1",
         "circular-dependency-plugin": "5.0.2",
@@ -92,9 +92,9 @@
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.11.1.tgz",
-      "integrity": "sha512-pyFP6ykZf8Iq8nRkgP2XKq8knpIG6ye0qYklnBC9815AC5RAO126Y4fmtd6tnH+5p1mQxnt5HegG0j5xOCgDRw==",
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.11.2.tgz",
+      "integrity": "sha512-NPNcAe4yxMEWABdI1oqoW7XA8m5O3Z+Zs9xsyBgwCCpFr3ZXiIL0r8+v7qS5UD4Yjsxjx35BJhvuiI+RBmGSfw==",
       "dev": true,
       "requires": {
         "loader-utils": "1.1.0",
@@ -109,12 +109,6 @@
           "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
           "dev": true
         },
-        "typescript": {
-          "version": "3.1.6",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz",
-          "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
-          "dev": true
-        },
         "webpack-sources": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz",
@@ -136,20 +130,20 @@
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.11.1.tgz",
-      "integrity": "sha512-p7fPHOi2Wfq2VPtnRVowg3n99MujghpOp6zW0gBJQD1TQhGVzPK6AX42S0NA4d05ahNBCDU2n7Y+5TjNJRIGJw==",
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.11.2.tgz",
+      "integrity": "sha512-biKjwoFXazNmgPiFJbXDbIMaZGjAV2VAauV3CWs8xHdIdC1Q2yVxF3I+babvgQnHEQWozykK/DuLoZn4kCzQUQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.11.1",
-        "@angular-devkit/core": "7.1.1",
+        "@angular-devkit/architect": "0.11.2",
+        "@angular-devkit/core": "7.1.2",
         "rxjs": "6.3.3"
       }
     },
     "@angular-devkit/core": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.1.tgz",
-      "integrity": "sha512-rODqECpOiV6vX+L1qd63GLiF3SG+V1O+d8WYtnKPOxnsMM9yWpWmqmroHtXfisjucu/zwoqj8HoO/noJZCfynw==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.2.tgz",
+      "integrity": "sha512-LyjHGuLnLWrgX7SYDkKmc3eW4H5uuaoC+CXYjRfgx3qundrLfvTCRgNGC6FPjhQNnVXH9qar+j9P1aMmKFb4Lw==",
       "dev": true,
       "requires": {
         "ajv": "6.5.3",
@@ -168,34 +162,34 @@
       }
     },
     "@angular-devkit/schematics": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.1.tgz",
-      "integrity": "sha512-yjzTw8ZWMPg0Fc9VQCHNpUCAH7aiNxrUDs0IbhdC0CyKTBoqH+cx2xP4Z6ECf4uNwceLKJlE0l3ot42Ypnlziw==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.2.tgz",
+      "integrity": "sha512-NFhHLYWf9gpGQm0s19lq+nAw3CZ0udBpoBLzCm8Crlmu6+7aAXgw7Fv5P4ukWJ/e1m7NDGVids+B6kBGXaY6Ig==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.1.1",
+        "@angular-devkit/core": "7.1.2",
         "rxjs": "6.3.3"
       }
     },
     "@angular/animations": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.1.1.tgz",
-      "integrity": "sha512-iTNxhPPraCZsE4rgM23lguT1kDV4mfYAr+Bsi5J0+v9ZJA+VaKvi6eRW8ZGrx4/rDz6hzTnBn1jgPppHFbsOcw==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.1.2.tgz",
+      "integrity": "sha512-zCLzPpifD4V9C35+DG75yHiAxZrWmk7n7dudxchKXf/YpgzV1M43lTSxna6YZgMLIXRjilfjfh6jqOOP+PctoQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/cli": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.1.1.tgz",
-      "integrity": "sha512-lPVKsk035T5Ls0Mf83OngrNoLZu/ucZSjRLN/GWZK1O/YYVmb/dTgVl/a7HC+G480tWQ34nlqnCRbrP7sE9v7g==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.1.2.tgz",
+      "integrity": "sha512-e290s0ONx47QgBw03l0Kq7fIPB77WqEQPM45QEWWbewF2lAFXx54ooQsdgLn+ESk6J0cW7DazRb23CUygZZbBw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.11.1",
-        "@angular-devkit/core": "7.1.1",
-        "@angular-devkit/schematics": "7.1.1",
-        "@schematics/angular": "7.1.1",
-        "@schematics/update": "0.11.1",
+        "@angular-devkit/architect": "0.11.2",
+        "@angular-devkit/core": "7.1.2",
+        "@angular-devkit/schematics": "7.1.2",
+        "@schematics/angular": "7.1.2",
+        "@schematics/update": "0.11.2",
         "inquirer": "6.2.0",
         "opn": "5.3.0",
         "semver": "5.5.1",
@@ -211,25 +205,25 @@
       }
     },
     "@angular/common": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.1.1.tgz",
-      "integrity": "sha512-SngekFx9v39sjgi9pON0Wehxpu+NdUk7OEebw4Fa8dKqTgydTkuhmnNH+9WQe264asoeCt51oufPRjIqMLNohA==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.1.2.tgz",
+      "integrity": "sha512-Ss9OilnbKpfkkwa1spUUAzgtGgd76j+Cgp1ecBBaueBoHyDZcSwD3Ioe5/91mjGF8i/MmpoBtEmk569fwmb7iQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/compiler": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.1.1.tgz",
-      "integrity": "sha512-oJvBe8XZ+DXF/W/DxWBTbBcixJTuPeZWdkcZIGWhJoQP7K5GnGnj8ffP9Lp6Dh4TKv85awtC6OfIKhbHxa650Q==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.1.2.tgz",
+      "integrity": "sha512-ua6Wh+c5XzxAeJT6guwAFYnwa1XzJpncppUrceRXIS9VAn9X7ApxRr45DvbVeYwXBb1iNdHWtZFm1koFVQpydA==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/compiler-cli": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.1.1.tgz",
-      "integrity": "sha512-4NXlkDhOEQgaP3Agigqw93CvXJvsfnXa0xiglq9e/wjL+6XbtM9WcDb5lfRQz41N9RSkO3pEHGvKMweKZGgogA==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.1.2.tgz",
+      "integrity": "sha512-u686o7eOPxSokE3l+lpSMs+sGRTLiGBXGsTuNR891XPN8+E5ep7NHgimeLizVXlbwIYZiNtcQ9zRbhEsMI2ErQ==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
@@ -546,55 +540,55 @@
       }
     },
     "@angular/core": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.1.1.tgz",
-      "integrity": "sha512-Osig5SRgDRQ+Hec/liN7nq/BCJieB+4/pqRh9rFbOXezb2ptgRZqdXOXN8P17i4AwPVf308Mh55V0niJ5Eu3Rw==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.1.2.tgz",
+      "integrity": "sha512-k3hKz6oj5KAaU/R034flxa73MWoR1SBBZPbpqK5zncIYbZMxvUQDgD3O7SNdQfI9G534SzdJk3AqJNEDTFUyYA==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/forms": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.1.1.tgz",
-      "integrity": "sha512-yCWuPjpu23Wc3XUw7v/ACNn/e249oT0bYlM8aaMQ1F5OwrmmC4NJC12Rpl9Ihza61RIHIKzNcHVEgzc7WhcSag==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.1.2.tgz",
+      "integrity": "sha512-L7LtvjcZUf4DjeDKQnxm+AzC9VkmR3I+hnezyvkLT7oUHcHEpYgNtiLmNM4Ir7ZI3zuaSMmHlEBlnDn0YJlcvA==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/http": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.1.1.tgz",
-      "integrity": "sha512-pRk+c/kz9aJ8te5xzCxlPLpFnwB0d/E9YkOo3/ydaXF9vZw13RTzk00YyzJ41PDzJf8oPDdXtueTQ+vtJ7Srtw==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.1.2.tgz",
+      "integrity": "sha512-8wscCWG+Cd+/IKniYrBViMFWFZFNh8eEkmUAucPInwmcSFyY//ZLWd2WJLEqbclAGT7kOkTOdUjJ6eMnnWAFuw==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/language-service": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.1.1.tgz",
-      "integrity": "sha512-X+5g20PMtNRGZIa3svMv4PLJdJehn4wqrS8nwOtzH5XkSn5vA3IxjsJVdSzAy2AN0/sKKJK5jmQorPtKO4saJg==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.1.2.tgz",
+      "integrity": "sha512-0r2smj44/omWIJXLpze6mJAhZ9w+vGF3ZfVKUuXEUym/W7BtoMBrt6UeC3pa9MW+lqxjRklExSh0RiQRoo8d4w==",
       "dev": true
     },
     "@angular/platform-browser": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.1.1.tgz",
-      "integrity": "sha512-I6OPjecynGJSbPtzu0gvEgSmIR6X6/xEAhg4L9PycW1ryjzptTC9klWRTWIqsIBqMxhVnY44uKLeRNrDwMOwyA==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.1.2.tgz",
+      "integrity": "sha512-cxFCqOXfLznHNI3dfnKcSCokbuSrxSLlXdE4uqoZliTRQIC9/ccrxVdx4UbJjtSgWFaNG1ocxH0rckgcUEG/kg==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.1.tgz",
-      "integrity": "sha512-ZIu48Vn4S6gjD7CMbGlKGaPQ8v9rYkWzlNYi4vTYzgiqKKNC3hqLsVESU3mSvr5oeQBxSIBidTdHSyafHFrA2w==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.2.tgz",
+      "integrity": "sha512-DoQ+840d3YSC34NnCVD+NlQOyes56+Re9V62ZViXKSwsWtpqgsYBiUW5yYHCO8bruS+Kn+BGTCK/w7/KEM60tg==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/router": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.1.1.tgz",
-      "integrity": "sha512-jbnqEq/1iDBkeH8Vn13hauGPTzhwllWM+MLfmdNGTiMzGRx4pmkWa57seDOeBF/GNYBL9JjkWTCrkKFAc2FJKw==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.1.2.tgz",
+      "integrity": "sha512-Lht4hcbx2hAtUEcJ1YG4Q63bukKrDHxqSnELMYi1/G5y5vH8LWPQX7aoEcOJeaQWQTKroQBAIeprol/h9vkvoQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
@@ -745,12 +739,12 @@
       }
     },
     "@ngtools/webpack": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.1.1.tgz",
-      "integrity": "sha512-XW/YDjiDZlwOYK4YvGAIKIVEkqtdwPLwTWAmDbnfpEHQc8UALsBrzGdjze0jSfXQdQxkbmXo0aolZgNc7uL/wQ==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.1.2.tgz",
+      "integrity": "sha512-Oc4N5QXh2u2q8OSfLBGcYkZrcvRmzxYRKUq99fO1u4JE4eZ3Pq7jp7X3/caro+9Y8eB2OpveSSC9UvEc0dz+AQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.1.1",
+        "@angular-devkit/core": "7.1.2",
         "enhanced-resolve": "4.1.0",
         "rxjs": "6.3.3",
         "tree-kill": "1.2.0",
@@ -832,45 +826,37 @@
       "integrity": "sha512-F9ZXPhDoHGQ5MIUTGn7NkEgX5RV6eBfLVtv0yOCKxZpTF6VkYWAnKFYhQFCFgHJsDGPMZtcT2hB1MHntIYIipA=="
     },
     "@progress/kendo-theme-bootstrap": {
-      "version": "2.17.0",
-      "resolved": "https://registry.npmjs.org/@progress/kendo-theme-bootstrap/-/kendo-theme-bootstrap-2.17.0.tgz",
-      "integrity": "sha512-TtCYlJ4wFruvdfuEVzfw4ch6CcWULijnZRMsccsusOHycPLPjTYHEwPw9SEWGlZew0bVJcqwD/lSnAhiP+RsiQ==",
+      "version": "2.17.1",
+      "resolved": "https://registry.npmjs.org/@progress/kendo-theme-bootstrap/-/kendo-theme-bootstrap-2.17.1.tgz",
+      "integrity": "sha512-noua2Oph1NW/Mm/m6BNzM+awIVWDKmGlhUMI8pCORsbTnXgWOwTxS2Sx9ShAm9CjzExpgZ5rdQuk68OnV8gNwA==",
       "requires": {
-        "@progress/kendo-theme-default": "^2.61.0"
+        "@progress/kendo-theme-default": "^2.62.0"
       }
     },
     "@progress/kendo-theme-default": {
-      "version": "2.61.0",
-      "resolved": "https://registry.npmjs.org/@progress/kendo-theme-default/-/kendo-theme-default-2.61.0.tgz",
-      "integrity": "sha512-GNyPtff/BuATb1Rsqu6065e4UcOR2oXgbhaj2jNQqGrvTPvTRaVIr/DVibJLTxqHFGjZJVHtxbzRZGZejoM5BA=="
+      "version": "2.62.0",
+      "resolved": "https://registry.npmjs.org/@progress/kendo-theme-default/-/kendo-theme-default-2.62.0.tgz",
+      "integrity": "sha512-FZF6WhrsS1LzO+um0ABsaxTjLYVXebI8BmHtMvL7SLJPG/p9EQ1xN4Z73urzAWTVBRGplaCA8qv2pEEnzNeMYw=="
     },
     "@schematics/angular": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.1.1.tgz",
-      "integrity": "sha512-jMaj8y3rNTQQXuH38uoWfAOmwYjtzqo1RelNfACnT54mfO/Dat+k7WasBLHWuvzvnN4/Ga3kXL7sJpkeMciiIg==",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.1.2.tgz",
+      "integrity": "sha512-coypNxjRjCExCbkJ8Vser4iZbdksl3cNqgdokDlEtpXnnph3ZYvNDhDD9TBWYQ+cwDhCHAOzT3U3IjN4R2MCgQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.1.1",
-        "@angular-devkit/schematics": "7.1.1",
+        "@angular-devkit/core": "7.1.2",
+        "@angular-devkit/schematics": "7.1.2",
         "typescript": "3.1.6"
-      },
-      "dependencies": {
-        "typescript": {
-          "version": "3.1.6",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz",
-          "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
-          "dev": true
-        }
       }
     },
     "@schematics/update": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.11.1.tgz",
-      "integrity": "sha512-IzPXamoMpDb2eY2zSW4fPuuH+7RfJLte9XVzQM2y3ZTBhlJQFLqx7qJtOXdcXUboonC6o61KCayNDERFnDUdPg==",
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.11.2.tgz",
+      "integrity": "sha512-dGA2PYnBLWRjVSTrTMPnVzsl5h5ojVcgFTpMke0FmgaJcR/D15FiwSs2LuJrmbb8f4oTAbQe1ON696M9kjWJIQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.1.1",
-        "@angular-devkit/schematics": "7.1.1",
+        "@angular-devkit/core": "7.1.2",
+        "@angular-devkit/schematics": "7.1.2",
         "@yarnpkg/lockfile": "1.1.0",
         "ini": "1.3.5",
         "pacote": "9.1.1",
@@ -1443,7 +1429,7 @@
         },
         "util": {
           "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
           "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
           "dev": true,
           "requires": {
@@ -1568,7 +1554,7 @@
       "dependencies": {
         "jsesc": {
           "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+          "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
           "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
           "dev": true
         }
@@ -2061,7 +2047,7 @@
     },
     "cacache": {
       "version": "10.0.4",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+      "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
       "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
       "dev": true,
       "requires": {
@@ -2112,7 +2098,7 @@
     },
     "camelcase-keys": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
       "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
       "dev": true,
       "optional": true,
@@ -3275,7 +3261,7 @@
         },
         "source-map": {
           "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+          "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
           "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
           "dev": true,
           "optional": true,
@@ -3352,7 +3338,7 @@
     },
     "events": {
       "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
       "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
       "dev": true
     },
@@ -3498,7 +3484,7 @@
     },
     "expand-range": {
       "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
       "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
       "dev": true,
       "requires": {
@@ -3587,7 +3573,7 @@
       "dependencies": {
         "array-flatten": {
           "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+          "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
           "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
           "dev": true
         }
@@ -4568,7 +4554,7 @@
     },
     "get-stream": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
       "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
       "dev": true
     },
@@ -4706,7 +4692,7 @@
     },
     "handle-thing": {
       "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+      "resolved": "http://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
       "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
       "dev": true
     },
@@ -5374,7 +5360,7 @@
     },
     "is-builtin-module": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
       "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
       "dev": true,
       "requires": {
@@ -5638,7 +5624,7 @@
       "dependencies": {
         "async": {
           "version": "1.5.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
           "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
           "dev": true
         },
@@ -5965,7 +5951,7 @@
     },
     "json5": {
       "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
       "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
       "dev": true
     },
@@ -6564,7 +6550,7 @@
     },
     "meow": {
       "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
       "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
       "dev": true,
       "optional": true,
@@ -6709,9 +6695,9 @@
       }
     },
     "minizlib": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz",
-      "integrity": "sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.0.tgz",
+      "integrity": "sha512-vQhkoouK/oKRVuFJynustmW3wrqZEXOrfbVVirvOVeglH4TNvIkcqiyojlIbbZYYDJZSbEKEXmDudg+tyRkm6g==",
       "dev": true,
       "requires": {
         "minipass": "^2.2.1"
@@ -6917,7 +6903,7 @@
       "dependencies": {
         "semver": {
           "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
           "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
           "dev": true,
           "optional": true
@@ -7340,7 +7326,7 @@
     },
     "opn": {
       "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+      "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
       "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
       "dev": true,
       "requires": {
@@ -7404,7 +7390,7 @@
     },
     "os-homedir": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
       "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
       "dev": true
     },
@@ -7448,7 +7434,7 @@
     },
     "p-is-promise": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
       "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
       "dev": true
     },
@@ -7859,7 +7845,7 @@
       "dependencies": {
         "async": {
           "version": "1.5.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
           "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
           "dev": true
         }
@@ -8813,7 +8799,7 @@
       "dependencies": {
         "source-map": {
           "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
           "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
           "dev": true,
           "optional": true,
@@ -9396,9 +9382,9 @@
       "dev": true
     },
     "spdx-correct": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz",
-      "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
       "dev": true,
       "requires": {
         "spdx-expression-parse": "^3.0.0",
@@ -9567,7 +9553,7 @@
     },
     "stream-browserify": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+      "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
       "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
       "dev": true,
       "requires": {
@@ -9667,7 +9653,7 @@
     },
     "strip-eof": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
       "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
       "dev": true
     },
@@ -9727,7 +9713,7 @@
         },
         "source-map": {
           "version": "0.1.43",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
           "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
           "dev": true,
           "requires": {
@@ -9770,7 +9756,7 @@
     },
     "tar": {
       "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+      "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
       "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
       "dev": true,
       "optional": true,
@@ -10200,6 +10186,30 @@
       "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
       "dev": true
     },
+    "uglify-es": {
+      "version": "3.3.9",
+      "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+      "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+      "dev": true,
+      "requires": {
+        "commander": "~2.13.0",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.13.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
     "uglify-js": {
       "version": "3.4.9",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
@@ -10236,12 +10246,6 @@
         "worker-farm": "^1.5.2"
       },
       "dependencies": {
-        "commander": {
-          "version": "2.13.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
-          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
-          "dev": true
-        },
         "schema-utils": {
           "version": "0.4.7",
           "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
@@ -10257,16 +10261,6 @@
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
-        },
-        "uglify-es": {
-          "version": "3.3.9",
-          "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
-          "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
-          "dev": true,
-          "requires": {
-            "commander": "~2.13.0",
-            "source-map": "~0.6.1"
-          }
         }
       }
     },
@@ -10618,7 +10612,7 @@
         },
         "source-map": {
           "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
           "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
           "dev": true,
           "requires": {
@@ -10760,7 +10754,7 @@
         },
         "globby": {
           "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
           "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
           "dev": true,
           "requires": {
@@ -10773,7 +10767,7 @@
           "dependencies": {
             "pify": {
               "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
               "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
               "dev": true
             }

+ 14 - 14
package.json

@@ -12,20 +12,20 @@
 	},
 	"private": true,
 	"dependencies": {
-		"@angular/animations": "^7.1.1",
-		"@angular/common": "^7.1.1",
-		"@angular/compiler": "^7.1.1",
-		"@angular/core": "^7.1.1",
-		"@angular/forms": "^7.1.1",
-		"@angular/http": "^7.1.1",
-		"@angular/platform-browser": "^7.1.1",
-		"@angular/platform-browser-dynamic": "^7.1.1",
-		"@angular/router": "^7.1.1",
+		"@angular/animations": "^7.1.2",
+		"@angular/common": "^7.1.2",
+		"@angular/compiler": "^7.1.2",
+		"@angular/core": "^7.1.2",
+		"@angular/forms": "^7.1.2",
+		"@angular/http": "^7.1.2",
+		"@angular/platform-browser": "^7.1.2",
+		"@angular/platform-browser-dynamic": "^7.1.2",
+		"@angular/router": "^7.1.2",
 		"@ng-bootstrap/ng-bootstrap": "^4.0.0",
 		"@progress/kendo-angular-dateinputs": "^3.5.1",
 		"@progress/kendo-angular-intl": "^1.6.1",
 		"@progress/kendo-angular-l10n": "^1.3.0",
-		"@progress/kendo-theme-bootstrap": "^2.17.0",
+		"@progress/kendo-theme-bootstrap": "^2.17.1",
 		"angular-super-validator": "^2.0.0",
 		"core-js": "^2.6.0",
 		"json-formatter-js": "^2.2.1",
@@ -35,10 +35,10 @@
 		"zone.js": "^0.8.26"
 	},
 	"devDependencies": {
-		"@angular-devkit/build-angular": "~0.11.1",
-		"@angular/cli": "~7.1.1",
-		"@angular/compiler-cli": "^7.1.1",
-		"@angular/language-service": "^7.1.1",
+		"@angular-devkit/build-angular": "~0.11.2",
+		"@angular/cli": "~7.1.2",
+		"@angular/compiler-cli": "^7.1.2",
+		"@angular/language-service": "^7.1.2",
 		"@types/jasmine": "~3.3.1",
 		"@types/jasminewd2": "~2.0.6",
 		"@types/lodash": "^4.14.119",

+ 2 - 2
src/app/app.component.html

@@ -36,7 +36,7 @@
 	<div class="form-group row" *ngIf="meta.type !== 'Container'; else recursiveDynaform" [ngClass]="getRowClass(meta.type)">
 		<label class="col-sm-4" [for]="meta.name" style="color: purple'">{{ meta.label }}</label>
 		<div class="col-sm-8">
-			<ng-container dynafield [control]="control" [meta]="meta" (call)="handle($event)"></ng-container>
+			<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
 		</div>
 	</div>
 	
@@ -44,7 +44,7 @@
 		<div class="row pt-3">
 			<h3 class="col-sm-12" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
 		</div>
-		<app-dynaform [formGroup]="control" [meta]="meta.meta" [template]="template" (call)="handle($event)"></app-dynaform>
+		<app-dynaform [formGroup]="control" [meta]="meta.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
 	</ng-template>
 
 </ng-template>

+ 3 - 4
src/app/app.component.ts

@@ -50,7 +50,6 @@ export class AppComponent implements OnInit, OnChanges {
 		console.log('Model', model);
 		console.log('Meta', meta);
 
-		/*
 		console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 
 		// Test autoMeta
@@ -58,7 +57,7 @@ export class AppComponent implements OnInit, OnChanges {
 		console.log(auto);
 
 		// Test combine
-		const m2 = this.dynaform.combineModelWithMeta(model, meta);
+		const m2 = this.dynaform.combineModelWithMeta(model, meta, true);
 		console.log(m2);
 
 
@@ -66,12 +65,12 @@ export class AppComponent implements OnInit, OnChanges {
 		const fsm = this.dynaform.buildFieldSpecificMeta(m2);
 		console.log(fsm);
 
-		console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 
 		// Test building the FormGroup
 		const fg = this.dynaform.buildFormGroup(fsm);
 		console.log(fg);
-		*/
+
+		console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 
 		// Build the FormGroup and Modeled Metadata from the imported test data
 		const dynaformdata = this.dynaform.build(model, meta, true);

+ 0 - 1
src/app/dynaform/directives/dynafield.directive.ts

@@ -62,7 +62,6 @@ export class DynafieldDirective extends NgControl implements OnInit, OnDestroy {
 	}
 
 	ngOnInit() {
-		console.log(this.meta);
 		const type = componentType(this.meta.type);
 		if (!formFieldComponents[type]) {
 			const validComponentTypes = Object.keys(formFieldComponents).join(', ');

+ 64 - 0
src/app/dynaform/dynaform.component.1.html

@@ -0,0 +1,64 @@
+<ng-container *ngFor="let rowName of dynaFormRows">
+	<ng-container *ngTemplateOutlet="template ? template : default; context: getTemplateContext(rowName)"></ng-container>
+</ng-container>
+
+
+<!-- Default template for form field
+     used when a TemplateRef is NOT supplied to component -->
+<ng-template let-control="control" let-meta="meta" #default>
+	<ng-container *ngIf="meta.type !== 'Hidden'">
+
+		<ng-container *ngIf="!meta.noLabel; else fullWidth">
+
+			<ng-template *ngIf="isContainer(meta)">
+				<div *ngIf="meta.label" class="row">
+					<h3 class="col-sm-12 h-dyna" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
+				</div>
+				<app-dynaform [formGroup]="control" [meta]="meta.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
+			</ng-template>
+
+			<ng-template *ngIf="isRepeatingContainer(meta)">
+				<div *ngFor="let group of meta.meta">
+					<div *ngIf="group.label" class="row">
+						<h3 class="col-sm-12 h-dyna" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
+					</div>
+					<app-dynaform [formGroup]="control" [meta]="group.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
+				</div>
+			</ng-template>
+
+			<ng-template *ngIf="isField(meta)">
+				<div class="form-group row" [ngClass]="getRowClass(control, meta)">
+					<label class="col-sm-4" [ngClass]="meta.class" [for]="meta.name" title="">
+						{{ meta.rowLabel !== null ? meta.rowLabel : meta.label }}
+						<span *ngIf="control && control.touched && control.invalid" class="fas fa-exclamation-triangle"
+							[ngbTooltip]="getValidationFailureMessage(control, meta)"
+						></span>
+					</label>
+					<div class="col-sm-8">
+						<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
+					</div>
+				</div>
+			</ng-template>
+			
+		</ng-container>
+
+		<ng-template #fullWidth>
+			<div class="row" [ngClass]="getRowClass(control, meta.type)">
+				<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
+			</div>
+		</ng-template>
+		
+	</ng-container>
+</ng-template>
+
+
+<!-- Display validation status if debugging and not nested -->
+<div *ngIf="debug && path.length === 0">
+	<pre [ngClass]="{
+			'alert-success' 	: formGroup.valid && formGroup.dirty,
+			'alert-danger' 		: !formGroup.valid && formGroup.dirty,
+			'alert-secondary' 	: !formGroup.dirty
+		}"
+		class="alert mt-4"
+		role="alert">{{ formGroup.pristine ? 'Untouched' : getValidationErrors() | json }}</pre>
+</div>

+ 48 - 48
src/app/dynaform/dynaform.component.OLD.html

@@ -1,54 +1,54 @@
 <ng-container *ngFor="let rowName of dynaFormRows">
-		<ng-container *ngTemplateOutlet="template ? template : default; context: getTemplateContext(rowName)"></ng-container>
-	</ng-container>
-	
-	
-	<!-- Default template for form field
-		 used when a TemplateRef is NOT supplied to component -->
-	<ng-template #default let-control="control" let-meta="meta">
-		<ng-container *ngIf="meta.type !== 'Hidden'">
-	
-			<ng-container *ngIf="!meta.noLabel; else fullWidth">
-	
-				<div class="form-group row" *ngIf="meta.type !== 'Container'; else recursiveDynaform" [ngClass]="getRowClass(control, meta)">
-					<label class="col-sm-4" [ngClass]="meta.class" [for]="meta.name" title="">
-						{{ meta.rowLabel !== mull ? meta.rowLabel : meta.label }}
-						<span *ngIf="control && control.touched && control.invalid" class="fas fa-exclamation-triangle"
-							[ngbTooltip]="getValidationFailureMessage(control, meta)"
-						></span>
-					</label>
-					<div class="col-sm-8">
-						<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
-					</div>
-				</div>
-				
-				<ng-template #recursiveDynaform>
-					<div *ngIf="meta.label" class="row">
-						<h3 class="col-sm-12 h-dyna" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
-					</div>
-					<app-dynaform [formGroup]="control" [meta]="meta.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
-				</ng-template>
-	
-			</ng-container>
-	
-			<ng-template #fullWidth>
-				<div class="row" [ngClass]="getRowClass(control, meta.type)">
+	<ng-container *ngTemplateOutlet="template ? template : default; context: getTemplateContext(rowName)"></ng-container>
+</ng-container>
+
+
+<!-- Default template for form field
+		used when a TemplateRef is NOT supplied to component -->
+<ng-template #default let-control="control" let-meta="meta">
+	<ng-container *ngIf="meta.type !== 'Hidden'">
+
+		<ng-container *ngIf="!meta.noLabel; else fullWidth">
+
+			<div class="form-group row" *ngIf="meta.type !== 'Container'; else recursiveDynaform" [ngClass]="getRowClass(control, meta)">
+				<label class="col-sm-4" [ngClass]="meta.class" [for]="meta.name" title="">
+					{{ meta.rowLabel !== mull ? meta.rowLabel : meta.label }}
+					<span *ngIf="control && control.touched && control.invalid" class="fas fa-exclamation-triangle"
+						[ngbTooltip]="getValidationFailureMessage(control, meta)"
+					></span>
+				</label>
+				<div class="col-sm-8">
 					<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
 				</div>
-			</ng-template>
+			</div>
 			
+			<ng-template #recursiveDynaform>
+				<div *ngIf="meta.label" class="row">
+					<h3 class="col-sm-12 h-dyna" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
+				</div>
+				<app-dynaform [formGroup]="control" [meta]="meta.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
+			</ng-template>
+
 		</ng-container>
-	</ng-template>
-	
-	
-	<!-- Display validation status if debugging and not nested -->
-	<div *ngIf="debug && path.length === 0">
-		<pre [ngClass]="{
-				'alert-success' 	: formGroup.valid && formGroup.dirty,
-				'alert-danger' 		: !formGroup.valid && formGroup.dirty,
-				'alert-secondary' 	: !formGroup.dirty
-			}"
-			class="alert mt-4"
-			role="alert">{{ formGroup.pristine ? 'Untouched' : getValidationErrors() | json }}</pre>
-	</div>
+
+		<ng-template #fullWidth>
+			<div class="row" [ngClass]="getRowClass(control, meta.type)">
+				<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
+			</div>
+		</ng-template>
+		
+	</ng-container>
+</ng-template>
+
+
+<!-- Display validation status if debugging and not nested -->
+<div *ngIf="debug && path.length === 0">
+	<pre [ngClass]="{
+			'alert-success' 	: formGroup.valid && formGroup.dirty,
+			'alert-danger' 		: !formGroup.valid && formGroup.dirty,
+			'alert-secondary' 	: !formGroup.dirty
+		}"
+		class="alert mt-4"
+		role="alert">{{ formGroup.pristine ? 'Untouched' : getValidationErrors() | json }}</pre>
+</div>
 	

+ 19 - 22
src/app/dynaform/dynaform.component.html

@@ -4,42 +4,38 @@
 
 
 <!-- Default template for form field
-     used when a TemplateRef is NOT supplied to component -->
+		used when a TemplateRef is NOT supplied to component -->
 <ng-template let-control="control" let-meta="meta" #default>
 	<ng-container *ngIf="meta.type !== 'Hidden'">
 
 		<ng-container *ngIf="!meta.noLabel; else fullWidth">
 
-			<ng-template *ngIf="isContainer(meta)">
+			<div class="form-group row" *ngIf="isField(meta); else recursiveDynaform" [ngClass]="getRowClass(control, meta)">
+				<label class="col-sm-4" [ngClass]="meta.class" [for]="meta.name" title="">
+					{{ meta.rowLabel ? meta.rowLabel : meta.label }}
+					<span *ngIf="control && control.touched && control.invalid" class="fas fa-exclamation-triangle"
+						[ngbTooltip]="getValidationFailureMessage(control, meta)"
+					></span>
+				</label>
+				<div class="col-sm-8">
+					<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
+				</div>
+			</div>
+			
+			<ng-template *ngIf="!isRepeatingContainer(meta) ; else recursiveDynaformArray" #recursiveDynaform>
 				<div *ngIf="meta.label" class="row">
 					<h3 class="col-sm-12 h-dyna" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
 				</div>
 				<app-dynaform [formGroup]="control" [meta]="meta.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
 			</ng-template>
 
-			<ng-template *ngIf="isRepeatingContainer(meta)">
-				<div *ngFor="let group of meta.meta">
-					<div *ngIf="group.label" class="row">
-						<h3 class="col-sm-12 h-dyna" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
-					</div>
-					<app-dynaform [formGroup]="control" [meta]="group.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
+			<ng-template #recursiveDynaformArray>
+				<div *ngFor="let container of meta.meta" style="border: 1px red solid;">
+					{{ container | json }}
+					<app-dynaform [formGroup]="control" [meta]="container.meta" [template]="template" (call)="handleCallback($event)"></app-dynaform>
 				</div>
 			</ng-template>
 
-			<ng-template *ngIf="isField(meta)">
-				<div class="form-group row" [ngClass]="getRowClass(control, meta)">
-					<label class="col-sm-4" [ngClass]="meta.class" [for]="meta.name" title="">
-						{{ meta.rowLabel !== null ? meta.rowLabel : meta.label }}
-						<span *ngIf="control && control.touched && control.invalid" class="fas fa-exclamation-triangle"
-							[ngbTooltip]="getValidationFailureMessage(control, meta)"
-						></span>
-					</label>
-					<div class="col-sm-8">
-						<ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
-					</div>
-				</div>
-			</ng-template>
-			
 		</ng-container>
 
 		<ng-template #fullWidth>
@@ -62,3 +58,4 @@
 		class="alert mt-4"
 		role="alert">{{ formGroup.pristine ? 'Untouched' : getValidationErrors() | json }}</pre>
 </div>
+	

+ 2 - 0
src/app/dynaform/dynaform.component.ts

@@ -131,10 +131,12 @@ export class DynaformComponent implements OnInit {
 	}
 
 	isField(meta: StringMap): boolean {
+		console.log(meta.name, meta.type);
 		return !meta.type.includes('Container');
 	}
 	
 	isContainer(meta: StringMap): boolean {
+		console.log(meta);
 		return meta.type === 'Container';
 	}
 

+ 16 - 4
src/app/dynaform/models/field.model.ts

@@ -249,7 +249,7 @@ class DatepickerField extends SimpleField {
 }
 
 // ---------------------------------------------------------------------------------------------------------------------
-// Container
+// Containers
 
 class Container {
 	type = 'Container';
@@ -266,18 +266,30 @@ class Container {
 	}
 }
 
-class RepeatingContainer extends Container {
+class RepeatingContainer {
+	type = 'RepeatingContainer';
+	name: string;
+	prefix: string = 'group';
+	label = '';
+	seed: StringMap;
+	template?: TemplateRef<any>;
+	meta: Container[]; // An array of Containers
 	minRepeat: number = 1;
 	maxRepeat: number = 10;
 	initialRepeat: number;
 	showAddControl:  boolean = true;
 	showDeleteControl: boolean = true;
-	meta: StringMap;
+	primaryField: string = '';
+	display: string = ''; // Display strategy to use 
 	constructor(containerMeta: StringMap) {
-		super(containerMeta);
+		Object.assign(this, containerMeta);
+		if (typeof this.label === 'undefined') {
+			this.label = unCamelCase(this.name);
+		}
 		if (!containerMeta.initialRepeat) {
 			this.initialRepeat = containerMeta.meta.length;
 		}
+		this.meta = containerMeta.meta.map((m, i) => new Container({ name: `${this.prefix}${i+1}`, meta: m }));
 	}
 }
 

+ 35 - 7
src/app/dynaform/services/_formdata-utils.ts

@@ -76,9 +76,10 @@ const combineExtraMeta = (metaG, extraMeta, createFromExtra = false, containerSe
 			const isRepeating = isRepeatingContainer(val);
 			const metaFoG = metaG[key] || {};
 			const seed = isCon ? {} : containerSeed; // Container's don't seed themselves, only their children
-			
-			// Have we got a repeating container?
-			if (isCon && isRepeating) {
+
+			if (isRepeating)
+			{
+				// We've got a Repeating Container
 				metaFoG.meta = generateRepeatedGroup(metaFoG, val, createFromExtra);
 				const extra = {
 					...omit(['meta', 'seed'], val),
@@ -95,6 +96,7 @@ const combineExtraMeta = (metaG, extraMeta, createFromExtra = false, containerSe
 			}
 			else
 			{
+				// We've got a Container or a Field
 				const extra = isCon ?
 					{
 						...val,
@@ -144,6 +146,19 @@ const generateRepeatedGroup = (metaFoG, extraMeta, createFromExtra = false): Str
 // Build Form-Field-Type-Specific Metadata (using the field models in dynaform/models)
 // ---------------------------------------------------------------------------------------------------------------------
 
+const resolveType = (metaFoG: StringMap): string => {
+	if (metaFoG.type) {
+		return metaFoG.type;
+	}
+	if (isContainer(metaFoG)) {
+		return 'container';
+	}
+	if (isRepeatingContainer(metaFoG)) {
+		return 'repeatingContainer';
+	}
+	return '';
+}
+
 const buildFieldClassName = (t = 'text') => {
 	const start = t[0].toUpperCase() + t.slice(1);
 	if (start === 'Container' || start === 'RepeatingContainer' || start === 'Heading' || t.slice(-5) === 'Group') {
@@ -153,7 +168,8 @@ const buildFieldClassName = (t = 'text') => {
 };
 
 const buildModeledField = metaFoG => {
-	const type = isContainer(metaFoG) ? (isRepeatingContainer(metaFoG) ? 'repeatingContainer' : 'container') : metaFoG.type;
+	const type = resolveType(metaFoG);
+	console.log('Type is', type);
 	const className = buildFieldClassName(type);
 	if (!fmdModels[className]) {
 		throw new Error(`No metadata model "${className}" for type "${type}"`);
@@ -170,9 +186,17 @@ const buildModeledFieldGroupMember = metaFoG => {
 	return modeledGroupMember;
 };
 
+
+
+
+// Build Form Group
+/*
+const _buildFieldSpecificMeta = metaG => reduce(buildModeledFieldGroupReducerIteree, {}, metaG);
+*/
+
 const buildModeledFieldGroupReducerIteree = (res, metaFoG) => ({ ...res, [metaFoG.name]: buildModeledFieldGroupMember(metaFoG) });
 const _buildFieldSpecificMeta = metaG => Array.isArray(metaG) ?
-	metaG.map(rcMem => _buildFieldSpecificMeta(rcMem)) :
+	metaG.map(rcMem => _buildFieldSpecificMeta(rcMem)) : 
 	reduce(buildModeledFieldGroupReducerIteree, {}, metaG);
 const buildFieldSpecificMeta = metaG => _buildFieldSpecificMeta(addMissingNames(metaG));
 
@@ -472,11 +496,15 @@ const isGroup = (metaFoG): boolean => !!metaFoG.meta;
 
 // Is Container
 // Helper function to distinguish container group (a group of child fields)
-const isContainer = (metaFoG): boolean => isGroup(metaFoG) && (!metaFoG.type || metaFoG.type.toLowerCase() === 'container');
+const isContainer = (metaFoG): boolean => isGroup(metaFoG)
+	&& !Array.isArray(metaFoG.meta)
+	&& (!metaFoG.type || metaFoG.type.toLowerCase() === 'container');
 
 // Is Repeating Container
 // Helper function to distinguish a repeating container group (a group of child fields that can be repeated 1...N times)
-const isRepeatingContainer = (metaFoG): boolean => Array.isArray(metaFoG.meta);
+const isRepeatingContainer = (metaFoG): boolean => isGroup(metaFoG)
+	&& Array.isArray(metaFoG.meta)
+	&& (!metaFoG.type || metaFoG.type.toLowerCase() === 'repeatingContainer');
 
 // Is Repeating Container Member
 // It looks like one if it has neither a value or meta