From 5e05b015b375ca152e98289c6bdb3fb071dc82e3 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Mon, 1 Jul 2019 13:48:19 -0700 Subject: [PATCH 01/11] SHIBUI-1347 --- ui/package-lock.json | 569 ++++++++---------- ui/package.json | 1 + ui/src/app/app.component.scss | 4 +- .../component/metadata-header.component.html | 9 +- .../configuration/configuration.module.ts | 4 +- .../configuration/configuration.values.ts | 5 + .../container/configuration.component.html | 27 +- .../container/configuration.component.ts | 19 +- .../container/metadata-options.component.html | 4 +- .../effect/configuration.effect.ts | 6 + .../service/configuration.service.ts | 15 +- ui/src/styles.scss | 1 + ui/src/theme/bootstrap.scss | 2 +- ui/src/theme/breadcrumb.scss | 24 + 14 files changed, 351 insertions(+), 339 deletions(-) create mode 100644 ui/src/theme/breadcrumb.scss diff --git a/ui/package-lock.json b/ui/package-lock.json index 5b8942a76..25fad932c 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -3511,6 +3511,7 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -3582,9 +3583,9 @@ "dev": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { "delegates": "^1.0.0", @@ -3717,9 +3718,9 @@ } }, "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { @@ -3796,16 +3797,17 @@ } }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true + "dev": true, + "optional": true }, "axobject-query": { "version": "2.0.2", @@ -4164,15 +4166,6 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "bootstrap": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", @@ -4759,6 +4752,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "dev": true, + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -5025,15 +5019,6 @@ "which": "^1.2.9" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -6364,14 +6349,25 @@ "dev": true }, "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + } } }, "forwarded": { @@ -6472,7 +6468,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -6493,12 +6490,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6513,17 +6512,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -6640,7 +6642,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -6652,6 +6655,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6666,6 +6670,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6673,12 +6678,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6697,6 +6704,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -6777,7 +6785,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -6789,6 +6798,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -6874,7 +6884,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -6910,6 +6921,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6929,6 +6941,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6972,19 +6985,21 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -7016,29 +7031,14 @@ } }, "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { "globule": "^1.0.0" } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", @@ -7150,14 +7150,22 @@ } }, "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "dev": true, "requires": { "glob": "~7.1.1", - "lodash": "~4.17.4", + "lodash": "~4.17.10", "minimatch": "~3.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } } }, "graceful-fs": { @@ -7273,29 +7281,58 @@ } }, "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" }, "dependencies": { "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" } } } @@ -7431,18 +7468,6 @@ "minimalistic-assert": "^1.0.0" } }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -7460,12 +7485,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", @@ -7963,12 +7982,12 @@ } }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "^0.2.0", + "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } @@ -8332,25 +8351,6 @@ "is-extglob": "^2.1.1" } }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -8416,12 +8416,6 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -8928,9 +8922,9 @@ } }, "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, "js-tokens": { @@ -8980,15 +8974,6 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -9016,24 +9001,12 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -9329,7 +9302,8 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true + "dev": true, + "optional": true }, "http-signature": { "version": "1.2.0", @@ -9484,12 +9458,6 @@ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -9512,12 +9480,6 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true - }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", @@ -9583,7 +9545,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "loose-envify": { "version": "1.3.1", @@ -10282,20 +10245,19 @@ "dev": true }, "node-gyp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", - "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "dev": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", "mkdirp": "^0.5.0", "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", "osenv": "0", - "request": "2", + "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", "tar": "^2.0.0", @@ -10342,9 +10304,9 @@ } }, "node-sass": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", - "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -10354,15 +10316,13 @@ "get-stdin": "^4.0.1", "glob": "^7.0.3", "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "lodash.mergewith": "^4.6.0", + "lodash": "^4.17.11", "meow": "^3.7.0", "mkdirp": "^0.5.1", - "nan": "^2.10.0", - "node-gyp": "^3.3.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", "npmlog": "^4.0.0", - "request": "~2.79.0", + "request": "^2.88.0", "sass-graph": "^2.2.4", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" @@ -10374,12 +10334,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -10393,69 +10347,23 @@ "supports-color": "^2.0.0" } }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1", - "uuid": "^3.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true } } }, @@ -10626,7 +10534,8 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -11286,9 +11195,9 @@ } }, "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "pify": { @@ -11560,6 +11469,12 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", + "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==", + "dev": true + }, "public-encrypt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", @@ -11607,9 +11522,9 @@ "dev": true }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "querystring": { @@ -11892,33 +11807,97 @@ } }, "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" + "uuid": "^3.3.2" + }, + "dependencies": { + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } } }, "require-directory": { @@ -12487,15 +12466,6 @@ "kind-of": "^3.2.0" } }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "socket.io": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", @@ -12846,9 +12816,9 @@ "dev": true }, "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { "readable-stream": "^2.0.1" @@ -12953,7 +12923,8 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true + "dev": true, + "optional": true }, "strip-ansi": { "version": "3.0.1", @@ -13082,13 +13053,13 @@ "dev": true }, "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "dev": true, "requires": { "block-stream": "*", - "fstream": "^1.0.2", + "fstream": "^1.0.12", "inherits": "2" } }, @@ -13203,6 +13174,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "dev": true, + "optional": true, "requires": { "punycode": "^1.4.1" } @@ -13226,27 +13198,12 @@ "dev": true }, "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { - "glob": "^6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.1.2" } }, "tryer": { @@ -15429,12 +15386,12 @@ "dev": true }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "window-size": { diff --git a/ui/package.json b/ui/package.json index 9881e1fb7..b293be085 100644 --- a/ui/package.json +++ b/ui/package.json @@ -73,6 +73,7 @@ "karma-jasmine-html-reporter": "^1.4.2", "karma-spec-reporter": "0.0.32", "ncp": "^2.0.0", + "node-sass": "^4.12.0", "path": "^0.12.7", "ts-node": "~3.2.0", "tslint": "~5.3.2", diff --git a/ui/src/app/app.component.scss b/ui/src/app/app.component.scss index fcee7de97..6d1c6d0a1 100644 --- a/ui/src/app/app.component.scss +++ b/ui/src/app/app.component.scss @@ -16,12 +16,12 @@ nav.navbar { @media only screen and (min-width: 1024px) { .pad-content { - padding: 1rem 3rem; + padding: 0 3rem; } } @media only screen and (min-width: 1200px) { .pad-content { - padding: 2rem 5rem; + padding: 0 5rem; } } diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.html b/ui/src/app/metadata/configuration/component/metadata-header.component.html index 19f183ba8..4da057c91 100644 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.html +++ b/ui/src/app/metadata/configuration/component/metadata-header.component.html @@ -1,18 +1,15 @@
-

- Version {{ versionNumber }} -

-

+

Saved  {{ version.date | date }}, by  {{ version.creator }} -

+

Enabled -   Disabled +   Current

diff --git a/ui/src/app/metadata/configuration/configuration.module.ts b/ui/src/app/metadata/configuration/configuration.module.ts index 9aa2cf880..dc291952c 100644 --- a/ui/src/app/metadata/configuration/configuration.module.ts +++ b/ui/src/app/metadata/configuration/configuration.module.ts @@ -23,6 +23,7 @@ import { MetadataHistoryEffects } from './effect/history.effect'; import { MetadataHistoryService } from './service/history.service'; import { MetadataHistoryComponent } from './container/metadata-history.component'; import { HistoryListComponent } from './component/history-list.component'; +import { DomainModule } from '../domain/domain.module'; @NgModule({ declarations: [ @@ -43,7 +44,8 @@ import { HistoryListComponent } from './component/history-list.component'; CommonModule, I18nModule, NgbPopoverModule, - RouterModule + RouterModule, + DomainModule ], exports: [], providers: [] diff --git a/ui/src/app/metadata/configuration/configuration.values.ts b/ui/src/app/metadata/configuration/configuration.values.ts index c7f696eae..383486cfd 100644 --- a/ui/src/app/metadata/configuration/configuration.values.ts +++ b/ui/src/app/metadata/configuration/configuration.values.ts @@ -5,6 +5,11 @@ export enum PATHS { provider = 'MetadataResolvers' } +export enum TYPES { + resolver = 'resolver', + provider = 'provider' +} + export const DEFINITIONS = { resolver: MetadataSourceEditor }; diff --git a/ui/src/app/metadata/configuration/container/configuration.component.html b/ui/src/app/metadata/configuration/container/configuration.component.html index 36626f240..e4709611b 100644 --- a/ui/src/app/metadata/configuration/container/configuration.component.html +++ b/ui/src/app/metadata/configuration/container/configuration.component.html @@ -1,16 +1,19 @@
-
-
-
-
- - - Metadata resolver history - -
-
-
-
+
+
+ +

Source Configuration

diff --git a/ui/src/app/metadata/configuration/container/configuration.component.ts b/ui/src/app/metadata/configuration/container/configuration.component.ts index 2c49c0961..357d745fd 100644 --- a/ui/src/app/metadata/configuration/container/configuration.component.ts +++ b/ui/src/app/metadata/configuration/container/configuration.component.ts @@ -1,12 +1,12 @@ -import { Store } from '@ngrx/store'; import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { takeUntil, map, withLatestFrom, filter } from 'rxjs/operators'; +import { Store } from '@ngrx/store'; import { Observable, Subject } from 'rxjs'; -import { ActivatedRoute, Params } from '@angular/router'; import * as fromConfiguration from '../reducer'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { takeUntil, map, withLatestFrom, filter } from 'rxjs/operators'; -import { LoadMetadataRequest, ClearConfiguration, LoadXmlRequest } from '../action/configuration.action'; + +import { LoadMetadataRequest, ClearConfiguration } from '../action/configuration.action'; import { LoadHistoryRequest, ClearHistory, SelectVersion } from '../action/history.action'; import * as fromReducer from '../reducer'; @@ -19,6 +19,8 @@ import * as fromReducer from '../reducer'; export class ConfigurationComponent implements OnDestroy { private ngUnsubscribe: Subject = new Subject(); + name$: Observable; + constructor( private store: Store, private routerState: ActivatedRoute @@ -49,6 +51,13 @@ export class ConfigurationComponent implements OnDestroy { this.store.dispatch(new SelectVersion(version)); } }); + + this.name$ = this.store + .select(fromReducer.getConfigurationModel) + .pipe( + filter(model => !!model), + map(model => model ? ('serviceProviderName' in model) ? model.serviceProviderName : model.name : false) + ); } ngOnDestroy() { diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.html b/ui/src/app/metadata/configuration/container/metadata-options.component.html index 9c4dbb489..0825b10d4 100644 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.html +++ b/ui/src/app/metadata/configuration/container/metadata-options.component.html @@ -4,11 +4,13 @@ [version]="version$ | async" [versionNumber]="versionNumber$ | async" [isCurrent]="isCurrent$ | async"> -
+
+
Options XML diff --git a/ui/src/app/metadata/configuration/effect/configuration.effect.ts b/ui/src/app/metadata/configuration/effect/configuration.effect.ts index ff76c8125..b9a9c7181 100644 --- a/ui/src/app/metadata/configuration/effect/configuration.effect.ts +++ b/ui/src/app/metadata/configuration/effect/configuration.effect.ts @@ -44,6 +44,12 @@ export class MetadataConfigurationEffects { ) ); + @Effect({dispatch: false}) + loadMetadataError$ = this.actions$.pipe( + ofType(ConfigurationActionTypes.LOAD_METADATA_ERROR), + tap(action => console.log(action)) + ); + @Effect() loadMetadataXml$ = this.actions$.pipe( ofType(ConfigurationActionTypes.LOAD_METADATA_REQUEST), diff --git a/ui/src/app/metadata/configuration/service/configuration.service.ts b/ui/src/app/metadata/configuration/service/configuration.service.ts index ee0093b36..c361037e0 100644 --- a/ui/src/app/metadata/configuration/service/configuration.service.ts +++ b/ui/src/app/metadata/configuration/service/configuration.service.ts @@ -1,24 +1,29 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { Observable, of, throwError } from 'rxjs'; import { Metadata } from '../../domain/domain.type'; import { Wizard } from '../../../wizard/model'; import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor'; import { MetadataProviderEditorTypes } from '../../provider/model'; import { Schema } from '../model/schema'; -import { PATHS } from '../configuration.values'; +import { TYPES } from '../configuration.values'; +import { ResolverService } from '../../domain/service/resolver.service'; @Injectable() export class MetadataConfigurationService { - readonly base = '/api'; - constructor( + private resolverService: ResolverService, private http: HttpClient ) {} find(id: string, type: string): Observable { - return this.http.get(`${this.base}/${PATHS[type]}/${id}`); + switch (type) { + case TYPES.resolver: + return this.resolverService.find(id); + default: + return throwError(new Error('Type not supported')); + } } getDefinition(type: string): Wizard { diff --git a/ui/src/styles.scss b/ui/src/styles.scss index a3f814d8a..e63d38251 100644 --- a/ui/src/styles.scss +++ b/ui/src/styles.scss @@ -1,4 +1,5 @@ @import './theme/bootstrap'; +@import './theme/breadcrumb'; @import './theme/buttons'; @import './theme/forms'; @import './theme/modal'; diff --git a/ui/src/theme/bootstrap.scss b/ui/src/theme/bootstrap.scss index b1067e04e..7683e1dad 100644 --- a/ui/src/theme/bootstrap.scss +++ b/ui/src/theme/bootstrap.scss @@ -23,7 +23,7 @@ @import "~bootstrap/scss/nav"; @import "~bootstrap/scss/navbar"; @import "~bootstrap/scss/card"; -// @import "~bootstrap/scss/breadcrumb"; +@import "~bootstrap/scss/breadcrumb"; @import "~bootstrap/scss/pagination"; @import "~bootstrap/scss/badge"; // @import "~bootstrap/scss/jumbotron"; diff --git a/ui/src/theme/breadcrumb.scss b/ui/src/theme/breadcrumb.scss new file mode 100644 index 000000000..f1e5a6c93 --- /dev/null +++ b/ui/src/theme/breadcrumb.scss @@ -0,0 +1,24 @@ +.breadcrumb-bar { + $default-color: $gray-400; + + padding: 0; + margin: 1rem 0; + background: none; + border-radius: 0; + padding: 0.375rem 0; + border-bottom: 1px solid $gray-600; + /* + &, & > .breadcrumb-item.active { + color: $default-color; + } + > .breadcrumb-item > a { + color: $white; + } + + & > .breadcrumb-item + .breadcrumb-item { + &::before { + color: $default-color; + } + } + */ +} \ No newline at end of file From 0c4fc42a5dba23536f0672f951d6c946a0e11ade Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Tue, 2 Jul 2019 13:21:03 -0700 Subject: [PATCH 02/11] SHIBUI-1347 Fixed issue with incomplete resolvers --- ui/src/app/app.component.html | 33 ++++------ ui/src/app/app.component.spec.ts | 5 +- ui/src/app/app.component.ts | 27 ++++++-- ui/src/app/app.module.ts | 2 + ui/src/app/core/model/action.ts | 7 +++ ui/src/app/core/service/navigation.service.ts | 31 ++++++++++ .../service/configuration.service.spec.ts | 24 +++++--- .../dashboard-resolvers-list.component.html | 24 ++++++-- ...dashboard-resolvers-list.component.spec.ts | 10 ++- .../dashboard-resolvers-list.component.ts | 17 +++--- .../container/manager.component.spec.ts | 10 ++- .../manager/container/manager.component.ts | 13 +++- ui/src/app/metadata/manager/reducer/index.ts | 2 - .../app/metadata/metadata.component.spec.ts | 1 - ui/src/app/metadata/metadata.component.ts | 10 +-- ui/src/app/metadata/metadata.module.ts | 41 ++++++++++++- .../container/provider.component.html | 3 - .../container/provider.component.spec.ts | 46 -------------- .../provider/container/provider.component.ts | 12 ---- .../metadata/provider/provider.component.ts | 20 ++++++ .../app/metadata/provider/provider.module.ts | 6 +- .../app/metadata/provider/provider.routing.ts | 4 +- .../container/new-resolver.component.ts | 4 +- .../resolver-wizard.component.spec.ts | 61 +++++++++++++++---- .../container/resolver-wizard.component.ts | 3 +- .../metadata/resolver/effect/wizard.effect.ts | 13 ---- .../metadata/resolver/resolver.component.ts | 22 +++++++ .../app/metadata/resolver/resolver.module.ts | 8 +-- .../app/metadata/resolver/resolver.routing.ts | 7 +-- .../resolver/service/create-draft.resolver.ts | 35 ----------- ui/src/testing/activated-route.stub.ts | 2 +- ui/src/testing/navigation-service.stub.ts | 10 +++ ui/src/testing/provider.stub.ts | 6 +- 33 files changed, 308 insertions(+), 211 deletions(-) create mode 100644 ui/src/app/core/model/action.ts create mode 100644 ui/src/app/core/service/navigation.service.ts delete mode 100644 ui/src/app/metadata/provider/container/provider.component.html delete mode 100644 ui/src/app/metadata/provider/container/provider.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/container/provider.component.ts create mode 100644 ui/src/app/metadata/provider/provider.component.ts create mode 100644 ui/src/app/metadata/resolver/resolver.component.ts delete mode 100644 ui/src/app/metadata/resolver/service/create-draft.resolver.ts create mode 100644 ui/src/testing/navigation-service.stub.ts diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html index 6af7be5ab..52b5a0f87 100644 --- a/ui/src/app/app.component.html +++ b/ui/src/app/app.component.html @@ -21,26 +21,19 @@ Add New
+ + +
+ + + + + + + + + + + + + + + + + + + +
OrderTitleProvider TypeAuthorCreated DateEnabled
+
+
{{ i }}
+
+   + + +
+
+ {{ provider.name }} + {{ provider['@type'] }}{{ provider.createdBy }}{{ provider.createdDate | customDate : '—' }} + + Enabled + Enabled + +
+
+
diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss new file mode 100644 index 000000000..133f4a03c --- /dev/null +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss @@ -0,0 +1,14 @@ +@import '../../../../theme/palette'; +.provider-index { + font-size: 1.8rem; + line-height: 1.8rem; + font-weight: lighter; + font-family: monospace; + width: 45px; +} + +.table-providers { + tr > td { + vertical-align: middle; + } +} \ No newline at end of file diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts index 1a8c447e3..4b5d1c38a 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts @@ -1,6 +1,6 @@ import { TestBed, ComponentFixture } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { NgbPaginationModule, NgbModal, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; @@ -12,10 +12,10 @@ import { NgbModalStub } from '../../../../testing/modal.stub'; import { DashboardProvidersListComponent } from './dashboard-providers-list.component'; import { MetadataProvider } from '../../domain/model'; import { ProviderItemComponent } from '../component/provider-item.component'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; import { MockI18nModule } from '../../../../testing/i18n.stub'; import { CustomDatePipe } from '../../../shared/pipe/date.pipe'; -import { Observable, of } from 'rxjs'; +import { of } from 'rxjs'; +import { InfiniteScrollModule } from 'ngx-infinite-scroll'; describe('Dashboard Providers List Page', () => { @@ -30,6 +30,8 @@ describe('Dashboard Providers List Page', () => { name: 'bar' }; + let dispatchSpy, selectSpy; + beforeEach(() => { TestBed.configureTestingModule({ providers: [ @@ -44,7 +46,9 @@ describe('Dashboard Providers List Page', () => { ReactiveFormsModule, NgbPaginationModule, NgbModalModule, - MockI18nModule + MockI18nModule, + InfiniteScrollModule, + RouterModule ], declarations: [ DashboardProvidersListComponent, @@ -61,8 +65,8 @@ describe('Dashboard Providers List Page', () => { router = TestBed.get(Router); modal = TestBed.get(NgbModal); - spyOn(store, 'dispatch').and.callThrough(); - spyOn(store, 'select').and.returnValues(of([]), of({'foo': true})); + dispatchSpy = spyOn(store, 'dispatch').and.callThrough(); + selectSpy = spyOn(store, 'select').and.returnValues(of([]), of({'foo': true})); }); it('should compile', () => { @@ -71,10 +75,19 @@ describe('Dashboard Providers List Page', () => { expect(fixture).toBeDefined(); }); - describe('toggleProvider method', () => { - it('should fire a redux action', () => { - instance.toggleEntity(provider); + describe('search method', () => { + it('should default to an empty string', () => { + instance.search(); expect(store.dispatch).toHaveBeenCalled(); + const action = dispatchSpy.calls.mostRecent().args[0]; + expect(action.payload.query).toBe(''); + }); + + it('should search with the provided query string', () => { + instance.search('foo'); + expect(store.dispatch).toHaveBeenCalled(); + const action = dispatchSpy.calls.mostRecent().args[0]; + expect(action.payload.query).toBe('foo'); }); }); @@ -85,4 +98,23 @@ describe('Dashboard Providers List Page', () => { expect(router.navigate).toHaveBeenCalledWith(['metadata', 'provider', provider.resourceId, 'edit']); }); }); + + describe('loadMore method', () => { + it('should call the page observable to emit the next value', (done: DoneFn) => { + instance.loadMore(5); + instance.page$.subscribe(val => { + expect(val).toBe(5); + expect(instance.page).toBe(5); + done(); + }); + }); + }); + + describe('onScroll method', () => { + it('should call the loadMore method', () => { + spyOn(instance, 'loadMore'); + instance.onScroll(new Event('scrolled')); + expect(instance.loadMore).toHaveBeenCalledWith(instance.page + 1); + }); + }); }); diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts index de7c3644f..6d09cf0fa 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts @@ -1,34 +1,80 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { MetadataProvider } from '../../domain/model'; -import { Observable } from '../../../../../node_modules/rxjs'; +import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; import { Store } from '@ngrx/store'; -import { ProviderState, getOrderedProviders } from '../../provider/reducer'; -import { getOpenProviders } from '../reducer'; -import { ToggleEntityDisplay } from '../action/manager.action'; -import { map } from 'rxjs/operators'; +import { ProviderState, getOrderedProvidersInSearch, getOrderedProviders } from '../../provider/reducer'; +import * as fromDashboard from '../reducer'; +import { map, startWith } from 'rxjs/operators'; import { ChangeProviderOrderUp, ChangeProviderOrderDown } from '../../provider/action/collection.action'; import { Metadata } from '../../domain/domain.type'; +import { MetadataProvider } from '../../domain/model'; +import { SearchAction } from '../action/search.action'; +import { withLatestFrom } from 'rxjs/operators'; @Component({ selector: 'dashboard-providers-list', - templateUrl: './dashboard-providers-list.component.html' + templateUrl: './dashboard-providers-list.component.html', + styleUrls: ['./dashboard-providers-list.component.scss'] }) export class DashboardProvidersListComponent implements OnInit { - providers$: Observable; - providersOpen$: Observable<{ [key: string]: boolean }>; + providers$: Observable; + searchQuery$: Observable; + loading$: Observable; + + total$: Observable; + page = 1; + limit = 20; + limited$: Observable; + + isSearching$: Observable; + + private subj: BehaviorSubject = new BehaviorSubject(this.page); + readonly page$: Observable = this.subj.asObservable(); constructor( private store: Store, private router: Router - ) { } + ) { + const providers = this.store.select(fromDashboard.getSearchResults) as Observable; + this.providers$ = providers as Observable; + + this.searchQuery$ = store.select(fromDashboard.getSearchQuery); + this.loading$ = store.select(fromDashboard.getSearchLoading); + + this.total$ = this.providers$.pipe(map(list => list.length)); + + this.isSearching$ = this.searchQuery$.pipe(map(q => q.length > 0)); + + this.limited$ = combineLatest( + this.providers$, + this.page$ + ).pipe( + map(([list, page]) => { + let maxIndex = (page * this.limit) - 1, + minIndex = 0; + return list.filter((provider: Metadata, index: number) => (maxIndex >= index && index >= minIndex)); + }) + ); + } ngOnInit(): void { - this.providers$ = this.store.select(getOrderedProviders); - this.providersOpen$ = this.store.select(getOpenProviders); + this.search(); + } + + loadMore(index: number): void { + this.subj.next(index); + this.page = index; + } + + search(query: string = ''): void { + this.store.dispatch(new SearchAction({query, selector: getOrderedProviders})); + } + + onScroll(event: Event): void { + this.loadMore(this.page + 1); } view(id: string, page: string): void { @@ -43,10 +89,6 @@ export class DashboardProvidersListComponent implements OnInit { this.view(provider.resourceId, 'filters'); } - toggleEntity(provider: MetadataProvider): void { - this.store.dispatch(new ToggleEntityDisplay(provider.resourceId)); - } - updateOrderUp(provider: MetadataProvider): void { this.store.dispatch(new ChangeProviderOrderUp(provider.resourceId)); } diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts index 14a153197..0bbaa7f59 100644 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts +++ b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts @@ -76,13 +76,6 @@ describe('Dashboard Resolvers List Page', () => { expect(fixture).toBeDefined(); }); - describe('toggleResolver method', () => { - it('should fire a redux action', () => { - instance.toggleEntity(draft); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - describe('search method', () => { it('should fire a redux action', () => { instance.search(); @@ -107,6 +100,25 @@ describe('Dashboard Resolvers List Page', () => { }); }); + describe('loadMore method', () => { + it('should call the page observable to emit the next value', (done: DoneFn) => { + instance.loadMore(5); + instance.page$.subscribe(val => { + expect(val).toBe(5); + expect(instance.page).toBe(5); + done(); + }); + }); + }); + + describe('onScroll method', () => { + it('should call the loadMore method', () => { + spyOn(instance, 'loadMore'); + instance.onScroll(new Event('scrolled')); + expect(instance.loadMore).toHaveBeenCalledWith(instance.page + 1); + }); + }); + describe('deleteResolver method', () => { it('should call the modal service', () => { spyOn(modal, 'open').and.callFake(() => { diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts index bde5bc624..3e298d14d 100644 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts +++ b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts @@ -1,16 +1,17 @@ -import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable } from 'rxjs'; +import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { MetadataEntity, MetadataResolver } from '../../domain/model'; import * as searchActions from '../action/search.action'; import * as fromDashboard from '../reducer'; -import { ToggleEntityDisplay } from '../action/manager.action'; import { DeleteDialogComponent } from '../component/delete-dialog.component'; import { RemoveDraftRequest } from '../../resolver/action/draft.action'; +import { getAllResolvers } from '../../resolver/reducer'; +import { FileBackedHttpMetadataResolver } from '../../domain/entity'; @Component({ selector: 'dashboard-resolvers-list', @@ -27,30 +28,26 @@ export class DashboardResolversListComponent implements OnInit { limit = 20; limited$: Observable; - entitiesOpen$: Observable<{ [key: string]: boolean }>; + private subj: BehaviorSubject = new BehaviorSubject(this.page); + readonly page$: Observable = this.subj.asObservable(); constructor( private store: Store, private router: Router, private modalService: NgbModal ) { - this.resolvers$ = store.select(fromDashboard.getSearchResults); + const resolvers: unknown = store.select(fromDashboard.getSearchResults); + this.resolvers$ = (resolvers as Observable) + .pipe( + map(list => list.map(resolver => new FileBackedHttpMetadataResolver(resolver as MetadataResolver))) + ); this.searchQuery$ = store.select(fromDashboard.getSearchQuery); this.loading$ = store.select(fromDashboard.getSearchLoading); - this.entitiesOpen$ = store.select(fromDashboard.getOpenProviders); this.total$ = this.resolvers$.pipe(map(list => list.length)); - this.limited$ = this.getPagedResolvers(this.page, this.resolvers$); - } - - ngOnInit(): void { - this.search(); - } - - getPagedResolvers(page: number, list$: Observable): Observable { - return list$.pipe( - map((providers: MetadataEntity[]) => { + this.limited$ = combineLatest(this.resolvers$, this.page$).pipe( + map(([providers, page]) => { let maxIndex = (page * this.limit) - 1, minIndex = 0; return providers.filter((resolver: MetadataEntity, index: number) => (maxIndex >= index && index >= minIndex)); @@ -58,13 +55,17 @@ export class DashboardResolversListComponent implements OnInit { ); } + ngOnInit(): void { + this.search(); + } + loadMore(index: number): void { + this.subj.next(index); this.page = index; - this.limited$ = this.getPagedResolvers(index, this.resolvers$); } search(query: string = ''): void { - this.store.dispatch(new searchActions.SearchAction(query)); + this.store.dispatch(new searchActions.SearchAction({query, selector: getAllResolvers})); this.page = 1; } @@ -81,10 +82,6 @@ export class DashboardResolversListComponent implements OnInit { }); } - toggleEntity(entity: MetadataEntity): void { - this.store.dispatch(new ToggleEntityDisplay(entity.getId())); - } - viewMetadataHistory(entity: MetadataEntity): void { this.router.navigate(['metadata', 'resolver', entity.getId(), 'versions']); } diff --git a/ui/src/app/metadata/manager/effect/search.effects.ts b/ui/src/app/metadata/manager/effect/search.effects.ts index e1da7c539..81ce788c4 100644 --- a/ui/src/app/metadata/manager/effect/search.effects.ts +++ b/ui/src/app/metadata/manager/effect/search.effects.ts @@ -1,23 +1,27 @@ import { Injectable } from '@angular/core'; import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; +import { Store, MemoizedSelector } from '@ngrx/store'; import { Observable, of } from 'rxjs'; import { switchMap, map, combineLatest } from 'rxjs/operators'; -import * as entitySearch from '../action/search.action'; +import { + DashboardSearchActionTypes, + SearchAction, + DashboardSearchActionsUnion, + SearchCompleteAction +} from '../action/search.action'; import * as fromManager from '../reducer'; -import * as fromResolver from '../../resolver/reducer'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; +import { Metadata } from '../../domain/domain.type'; +import { MetadataResolver } from '../../domain/model'; @Injectable() export class SearchEffects { @Effect() - search$ = this.actions$.pipe( - ofType(entitySearch.ENTITY_SEARCH), + searchResolvers$ = this.actions$.pipe( + ofType(DashboardSearchActionTypes.ENTITY_SEARCH), map(action => action.payload), - switchMap(() => this.performSearch()) + switchMap(({ selector }) => this.performSearch(selector)) ); matcher = (value, query) => value ? value.toLocaleLowerCase().match(query.toLocaleLowerCase()) : false; @@ -27,26 +31,21 @@ export class SearchEffects { private store: Store ) { } - private performSearch(): Observable { + private performSearch(selector: MemoizedSelector): Observable { return of([]).pipe( combineLatest( - this.store.select(fromResolver.getAllResolvers), - (o: any[], p: MetadataProvider[]): Array => { - return o.concat( - p.map(provider => new FileBackedHttpMetadataResolver(provider)) - ); - } + this.store.select(selector), + (o: any[], p: Metadata[]): Array => o.concat(p) ), combineLatest( this.store.select(fromManager.getSearchQuery), - (entities, term) => { - const filtered = entities.filter( - e => this.matcher(e.name, term) || this.matcher(e.entityId, term) - ); - return filtered; - } + (entities, term) => + entities.filter( + e => this.matcher(e.name, term) ? true : + ('entityId' in e) ? this.matcher((e as MetadataResolver).entityId, term) : this.matcher(e['@type'], term) + ) ), - map(entities => new entitySearch.SearchCompleteAction(entities)) + map(entities => new SearchCompleteAction(entities)) ); } } /* istanbul ignore next */ diff --git a/ui/src/app/metadata/manager/reducer/index.ts b/ui/src/app/metadata/manager/reducer/index.ts index 584760916..7c308183c 100644 --- a/ui/src/app/metadata/manager/reducer/index.ts +++ b/ui/src/app/metadata/manager/reducer/index.ts @@ -1,10 +1,8 @@ import { createSelector, createFeatureSelector } from '@ngrx/store'; import * as fromRoot from '../../../core/reducer'; -import * as fromDashboard from './manager.reducer'; import * as fromSearch from './search.reducer'; export interface DashboardState { - manager: fromDashboard.State; search: fromSearch.SearchState; } @@ -13,13 +11,10 @@ export interface State extends fromRoot.State { } export const reducers = { - manager: fromDashboard.reducer, search: fromSearch.reducer }; export const getFeatureState = createFeatureSelector('manager'); -export const getDashboardState = createSelector(getFeatureState, (state: DashboardState) => state.manager); -export const getOpenProviders = createSelector(getDashboardState, (manager: fromDashboard.State) => manager.resolversOpen); export const getSearchState = createSelector(getFeatureState, (state: DashboardState) => state.search diff --git a/ui/src/app/metadata/manager/reducer/manager.reducer.spec.ts b/ui/src/app/metadata/manager/reducer/manager.reducer.spec.ts deleted file mode 100644 index 9a57ad2fc..000000000 --- a/ui/src/app/metadata/manager/reducer/manager.reducer.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { reducer } from './manager.reducer'; -import * as fromDashboard from './manager.reducer'; -import { ToggleEntityDisplay } from '../action/manager.action'; - -describe('Dashboard Reducer', () => { - const initialState: fromDashboard.State = { - resolversOpen: {} - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('Toggle Resolver Display', () => { - it('should toggle the selected providers open state', () => { - const id = 'foo'; - const action = new ToggleEntityDisplay(id); - - const result = reducer(initialState, action); - - expect(result).toEqual( - Object.assign({}, initialState, { resolversOpen: { foo: true } }) - ); - }); - }); -}); diff --git a/ui/src/app/metadata/manager/reducer/manager.reducer.ts b/ui/src/app/metadata/manager/reducer/manager.reducer.ts deleted file mode 100644 index b37bb940f..000000000 --- a/ui/src/app/metadata/manager/reducer/manager.reducer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import * as manager from '../action/manager.action'; - -export interface State { - resolversOpen: {[key: string]: boolean}; -} - -export const initialState: State = { - resolversOpen: {} -}; - -export function reducer(state = initialState, action: manager.Actions): State { - switch (action.type) { - case manager.TOGGLE_ENTITY_DISPLAY: { - return { - ...state, - resolversOpen: { - ...state.resolversOpen, - ...{[action.payload]: !state.resolversOpen[action.payload]} - } - }; - } - default: { - // console.log(state); - return state; - } - } -} - -export const resolversOpen = (state: State) => state.resolversOpen; diff --git a/ui/src/app/metadata/manager/reducer/search.reducer.ts b/ui/src/app/metadata/manager/reducer/search.reducer.ts index 17e700abd..38b6cf327 100644 --- a/ui/src/app/metadata/manager/reducer/search.reducer.ts +++ b/ui/src/app/metadata/manager/reducer/search.reducer.ts @@ -1,8 +1,8 @@ -import * as searchActions from '../action/search.action'; -import { MetadataEntity } from '../../domain/model'; +import { DashboardSearchActionTypes, DashboardSearchActionsUnion } from '../action/search.action'; +import { Metadata } from '../../domain/domain.type'; export interface SearchState { - entities: MetadataEntity[]; + entities: Metadata[]; loading: boolean; query: string; } @@ -13,17 +13,17 @@ const initialState: SearchState = { query: '' }; -export function reducer(state = initialState, action: searchActions.Actions): SearchState { +export function reducer(state = initialState, action: DashboardSearchActionsUnion): SearchState { switch (action.type) { - case searchActions.ENTITY_SEARCH: { + case DashboardSearchActionTypes.ENTITY_SEARCH: { return { ...state, - query: action.payload, + query: action.payload.query, loading: true, }; } - case searchActions.ENTITY_SEARCH_COMPLETE: { + case DashboardSearchActionTypes.ENTITY_SEARCH_COMPLETE: { return { entities: action.payload, loading: false, diff --git a/ui/src/app/metadata/provider/effect/collection.effect.ts b/ui/src/app/metadata/provider/effect/collection.effect.ts index 7091e46d8..8b1003912 100644 --- a/ui/src/app/metadata/provider/effect/collection.effect.ts +++ b/ui/src/app/metadata/provider/effect/collection.effect.ts @@ -235,6 +235,7 @@ export class CollectionEffects { withLatestFrom(this.store.select(fromProvider.getProviderOrder)), map(([id, order]) => { const index = order.indexOf(id); + console.log(id, order); if (index > 0) { const newOrder = array_move(order, index, index - 1); return new SetOrderProviderRequest(newOrder); diff --git a/ui/src/app/metadata/provider/reducer/index.ts b/ui/src/app/metadata/provider/reducer/index.ts index c05a233e3..d40313299 100644 --- a/ui/src/app/metadata/provider/reducer/index.ts +++ b/ui/src/app/metadata/provider/reducer/index.ts @@ -71,3 +71,4 @@ export const getProviderFilters = createSelector(getSelectedProvider, provider = export const getProviderXmlIds = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.xmlId)); export const getOrderedProviders = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn); +export const getOrderedProvidersInSearch = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn); From 751a0de8ec5f8940d3c41962d7fb5ea1579159ab Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 07:34:56 -0700 Subject: [PATCH 05/11] NOJIRA: fixed issue with date --- .../manager/container/dashboard-providers-list.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html index 07d0bf58d..25860cf59 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html @@ -50,7 +50,7 @@ {{ provider['@type'] }} {{ provider.createdBy }} - {{ provider.createdDate | customDate : '—' }} + {{ provider.createdDate | customDate }} Date: Thu, 11 Jul 2019 07:57:08 -0700 Subject: [PATCH 06/11] SHIBUI fixed route for provider edit --- .../dashboard-providers-list.component.html | 22 ++----------------- .../dashboard-providers-list.component.ts | 3 ++- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html index 25860cf59..bceba636f 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html @@ -46,7 +46,8 @@
- {{ provider.name }} + + {{ provider.name }} {{ provider['@type'] }} {{ provider.createdBy }} @@ -63,25 +64,6 @@
- diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts index 6d09cf0fa..6a206d9a1 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts @@ -81,7 +81,8 @@ export class DashboardProvidersListComponent implements OnInit { this.router.navigate(['metadata', 'provider', id, page]); } - edit(provider: MetadataProvider): void { + edit(provider: MetadataProvider, event: Event): void { + event.preventDefault(); this.view(provider.resourceId, 'edit'); } From 762d61c389bfa10941c213b9e5be84d8daa16619 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 08:27:02 -0700 Subject: [PATCH 07/11] Fixed header component --- .../component/metadata-header.component.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.html b/ui/src/app/metadata/configuration/component/metadata-header.component.html index 4da057c91..64a1a2a2c 100644 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.html +++ b/ui/src/app/metadata/configuration/component/metadata-header.component.html @@ -1,11 +1,12 @@
-

- Saved  - {{ version.date | date }}, - by  +

+ Saved:  + {{ version.date | date:'medium' }} +
+ By{{ version.creator }} -
+

Enabled Disabled From 61ea9229638ca0dcaabb59011dc4a619e23ff6cb Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 08:27:56 -0700 Subject: [PATCH 08/11] Fixed header text --- backend/src/main/resources/i18n/messages.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index e04fe3b90..f3054d636 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -84,7 +84,6 @@ value.dynamic-http-metadata-provider=DynamicHttpMetadataProvider value.entity-attributes-filter=EntityAttributes Filter value.spdescriptor=SPSSODescriptor value.attr-auth-descriptor=AttributeAuthorityDescriptor -value.dynamic-http-metadata-provider=DynamicHttpMetadataProvider value.local-dynamic-metadata-provider=LocalDynamicMetadataProvider value.md-query-protocol=MetadataQueryProtocol @@ -409,7 +408,7 @@ label.restore=Restore label.compare-selected=Compare Selected label.saved=Saved -label.by=by +label.by=By message.delete-user-title=Delete User? message.delete-user-body=You are requesting to delete a user. If you complete this process the user will be removed. This cannot be undone. Do you wish to continue? From 5dcf0eaf789d0a241040c89d2d64575a6d094001 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 11 Jul 2019 10:49:31 -0700 Subject: [PATCH 09/11] SHIBUI-1352 fixed provider selection issue --- ...dynamic-http-metadata-provider.schema.json | 30 ++++++++++++ .../file-system-metadata-provider.schema.json | 6 +-- ...ocal-dynamic-metadata-provider.schema.json | 8 +-- .../container/provider-select.component.ts | 8 +-- .../model/dynamic-http.provider.form.ts | 33 ++++++++++++- .../provider/reducer/collection.reducer.ts | 5 +- .../provider/filebacked-http.schema.json | 49 ++----------------- 7 files changed, 77 insertions(+), 62 deletions(-) diff --git a/backend/src/main/resources/dynamic-http-metadata-provider.schema.json b/backend/src/main/resources/dynamic-http-metadata-provider.schema.json index 68fdf6fd7..f7106c6e5 100644 --- a/backend/src/main/resources/dynamic-http-metadata-provider.schema.json +++ b/backend/src/main/resources/dynamic-http-metadata-provider.schema.json @@ -1,11 +1,41 @@ { "type": "object", "required": [ + "name", + "@type", "xmlId", "metadataURL", "metadataRequestURLConstructionScheme" ], "properties": { + "name": { + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", + "type": "string", + "widget": { + "id": "string", + "help": "message.must-be-unique" + } + }, + "@type": { + "title": "label.metadata-provider-type", + "description": "tooltip.metadata-provider-type", + "placeholder": "label.select-metadata-type", + "type": "string", + "readOnly": true, + "widget": { + "id": "select", + "disabled": true + }, + "oneOf": [ + { + "enum": [ + "DynamicHttpMetadataResolver" + ], + "description": "value.dynamic-http-metadata-provider" + } + ] + }, "enabled": { "title": "label.enable-provider-upon-saving", "description": "tooltip.enable-provider-upon-saving", diff --git a/backend/src/main/resources/file-system-metadata-provider.schema.json b/backend/src/main/resources/file-system-metadata-provider.schema.json index cbfec6b8c..af2f8af0a 100644 --- a/backend/src/main/resources/file-system-metadata-provider.schema.json +++ b/backend/src/main/resources/file-system-metadata-provider.schema.json @@ -8,8 +8,8 @@ ], "properties": { "name": { - "title": "label.service-provider-name-dashboard-display-only", - "description": "tooltip.metadata-provider-name", + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", "type": "string", "widget": { "id": "string", @@ -29,7 +29,7 @@ "oneOf": [ { "enum": [ - "FileSystemMetadataResolver" + "FilesystemMetadataResolver" ], "description": "value.file-system-metadata-provider" } diff --git a/backend/src/main/resources/local-dynamic-metadata-provider.schema.json b/backend/src/main/resources/local-dynamic-metadata-provider.schema.json index d683db316..f39904f36 100644 --- a/backend/src/main/resources/local-dynamic-metadata-provider.schema.json +++ b/backend/src/main/resources/local-dynamic-metadata-provider.schema.json @@ -8,8 +8,8 @@ ], "properties": { "name": { - "title": "label.metadata-provider-name-display-only", - "description": "tooltip.metadata-provider-name-display-only", + "title": "label.metadata-provider-name-dashboard-display-only", + "description": "tooltip.metadata-provider-name-dashboard-display-only", "type": "string", "widget": { "id": "string", @@ -29,9 +29,9 @@ "oneOf": [ { "enum": [ - "FileSystemMetadataResolver" + "LocalDynamicMetadataResolver" ], - "description": "value.file-system-metadata-provider" + "description": "value.local-dynamic-metadata-provider" } ] }, diff --git a/ui/src/app/metadata/provider/container/provider-select.component.ts b/ui/src/app/metadata/provider/container/provider-select.component.ts index b0c07f6fd..37519a259 100644 --- a/ui/src/app/metadata/provider/container/provider-select.component.ts +++ b/ui/src/app/metadata/provider/container/provider-select.component.ts @@ -20,6 +20,7 @@ import { ClearEditor } from '../action/editor.action'; export class ProviderSelectComponent implements OnDestroy { actionsSubscription: Subscription; + providerSubscription: Subscription; provider$: Observable; @@ -31,11 +32,9 @@ export class ProviderSelectComponent implements OnDestroy { map(params => new SelectProviderRequest(params.providerId)) ).subscribe(store); - this.provider$ = this.store.select(fromProviders.getSelectedProvider).pipe(filter(p => { - return p; - })); + this.provider$ = this.store.select(fromProviders.getSelectedProvider).pipe(filter(p => !!p)); - this.provider$.subscribe(provider => { + this.providerSubscription = this.provider$.subscribe(provider => { this.setDefinition(provider); }); } @@ -50,6 +49,7 @@ export class ProviderSelectComponent implements OnDestroy { ngOnDestroy() { this.actionsSubscription.unsubscribe(); + this.providerSubscription.unsubscribe(); this.store.dispatch(new ClearProvider()); this.store.dispatch(new ClearWizard()); this.store.dispatch(new ClearEditor()); diff --git a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts index a0ca22143..2583e3c69 100644 --- a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts +++ b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts @@ -6,7 +6,6 @@ export const DynamicHttpMetadataProviderWizard: Wizard { let base = BaseMetadataProviderEditor.formatter(changes); if (base.dynamicMetadataResolverAttributes) { @@ -136,13 +135,43 @@ export const DynamicHttpMetadataProviderEditor: Wizard Date: Thu, 11 Jul 2019 11:56:24 -0700 Subject: [PATCH 10/11] SHIBUI-1352 Fixed unit test --- .../container/dashboard-providers-list.component.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts index 4b5d1c38a..b70132eba 100644 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts +++ b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts @@ -93,8 +93,11 @@ describe('Dashboard Providers List Page', () => { describe('edit method', () => { it('should route to the edit page', () => { + const evt = new Event('a type'); spyOn(router, 'navigate'); - instance.edit(provider); + spyOn(evt, 'preventDefault'); + instance.edit(provider, evt); + expect(evt.preventDefault).toHaveBeenCalled(); expect(router.navigate).toHaveBeenCalledWith(['metadata', 'provider', provider.resourceId, 'edit']); }); }); From d3e14210c1b4904f593580ca5d8743560a470f47 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 15 Jul 2019 13:38:46 -0400 Subject: [PATCH 11/11] Fixing tests OOM --- build.gradle | 6 ++++++ gradle.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ff3c80edc..5b78682dc 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,12 @@ plugins { id 'com.github.breadmoirai.github-release' version '2.2.9' } +subprojects { + tasks.withType(Test) { + maxHeapSize = "3g" + } +} + tasks.findByName('release').dependsOn project.getTasksByName('test', true) githubRelease { diff --git a/gradle.properties b/gradle.properties index 335e4cb7b..4fdf282d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ hibernate.version=5.2.11.Final lucene.version=7.2.1 -org.gradle.jvmargs=-Xmx4g -XX:-UseGCOverheadLimit +org.gradle.jvmargs=-Xmx1g -XX:-UseGCOverheadLimit # set token in personal global i2.github.token=