diff --git a/.eslintignore b/.eslintignore index ee3f2bfb5..f72026dc5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -108,8 +108,6 @@ src/Explorer/Notebook/NotebookUtil.ts src/Explorer/OpenActions.test.ts src/Explorer/OpenActions.ts src/Explorer/OpenActionsStubs.ts -src/Explorer/Panes/AddCollectionPane.test.ts -src/Explorer/Panes/AddCollectionPane.ts src/Explorer/Panes/AddDatabasePane.ts src/Explorer/Panes/AddDatabasePane.test.ts src/Explorer/Panes/BrowseQueriesPane.ts diff --git a/package-lock.json b/package-lock.json index 41e933711..6606f536c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2109,52 +2109,56 @@ } } }, - "@fluentui/date-time-utilities": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-7.9.1.tgz", - "integrity": "sha512-o8iU1VIY+QsqVRWARKiky29fh4KR1xaKSgMClXIi65qkt8EDDhjmlzL0KVDEoDA2GWukwb/1PpaVCWDg4v3cUQ==", - "requires": { - "@uifabric/set-version": "^7.0.24", - "tslib": "^1.10.0" - } - }, "@fluentui/dom-utilities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-1.1.2.tgz", - "integrity": "sha512-XqPS7l3YoMwxdNlaYF6S2Mp0K3FmVIOIy2K3YkMc+eRxu9wFK6emr2Q/3rBhtG5u/On37NExRT7/5CTLnoi9gw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.1.0.tgz", + "integrity": "sha512-DMr0uH4EtyXgdpVLyvWq60YtWN38jx22rtdsEIbbBNYcFgcl3rRa7M8p/rnaw/k/KWX35H40AYga1SM6Zgpyww==", "requires": { - "@uifabric/set-version": "^7.0.24", - "tslib": "^1.10.0" + "@fluentui/set-version": "^8.1.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } } }, "@fluentui/font-icons-mdl2": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.0.5.tgz", - "integrity": "sha512-/2Qx/LCZH+rupbhzZ+WKCrw2XK3J2wj3pjMPLTLj/6rnmouA7yywFDiHIAseQXPhY34nzRVX4x3zEjz3RMWvmA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.1.0.tgz", + "integrity": "sha512-U0nAsv/vULZ4ezHDw0umk4mijSot9BNDXl0dZ4ZatxLBr8JZkNgTDowBZ9aEyWuFukZ6Lf0V/eEPIeJULrUDfw==", "requires": { - "@fluentui/set-version": "^8.0.3", - "@fluentui/style-utilities": "^8.0.5", - "tslib": "^1.10.0" + "@fluentui/set-version": "^8.1.0", + "@fluentui/style-utilities": "^8.1.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } } }, "@fluentui/foundation-legacy": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.0.5.tgz", - "integrity": "sha512-bHODfopWfT4HfBvXFCyfKxi7/BrIVgKUvQ4X3L2GXUZv6jjQMvLPWZ1u8n2tdp91ch1KSWnBXklGaK/nyK1M5w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.1.0.tgz", + "integrity": "sha512-GC6MkfcBbfqltgKe0hi4Wq0DTj8UxSFUdoOG9QQDLjIjI1r+L935ba0x91phqB9nptJCp+5TjkTtz7Q1lJ97Tw==", "requires": { - "@fluentui/merge-styles": "^8.0.4", - "@fluentui/set-version": "^8.0.3", - "@fluentui/style-utilities": "^8.0.5", - "@fluentui/utilities": "^8.0.5", - "tslib": "^1.10.0" - } - }, - "@fluentui/keyboard-key": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.2.17.tgz", - "integrity": "sha512-iT1bU56rKrKEOfODoW6fScY11qj3iaYrZ+z11T6fo5+TDm84UGkkXjLXJTE57ZJzg0/gbccHQWYv+chY7bJN8Q==", - "requires": { - "tslib": "^1.10.0" + "@fluentui/merge-styles": "^8.1.0", + "@fluentui/set-version": "^8.1.0", + "@fluentui/style-utilities": "^8.1.0", + "@fluentui/utilities": "^8.1.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } } }, "@fluentui/merge-styles": { @@ -2174,23 +2178,23 @@ } }, "@fluentui/react": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.10.1.tgz", - "integrity": "sha512-J6wCfkkCzJ2Z9K6KVCrshpDDnhh5smKEGChsxMkLRoXYeAlVUMiS9lLg93PW+AbY4NfG+tNO2Ug8itNKpUmlYw==", + "version": "8.14.3", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.14.3.tgz", + "integrity": "sha512-Gp4VBtZk5h5kXpu1vU+KvTvcRaMleD5Yl7c5XLmRVyEfofgw1Sd+M7h+1aQkwHPxvl9h7ebaJce3PbJ+xuE7Ag==", "requires": { - "@fluentui/date-time-utilities": "^8.0.2", - "@fluentui/font-icons-mdl2": "^8.0.4", - "@fluentui/foundation-legacy": "^8.0.4", - "@fluentui/merge-styles": "^8.0.3", - "@fluentui/react-focus": "^8.0.7", - "@fluentui/react-hooks": "^8.1.2", - "@fluentui/react-window-provider": "^2.0.2", - "@fluentui/set-version": "^8.0.2", - "@fluentui/style-utilities": "^8.0.4", - "@fluentui/theme": "^2.0.4", - "@fluentui/utilities": "^8.0.4", + "@fluentui/date-time-utilities": "^8.1.0", + "@fluentui/font-icons-mdl2": "^8.1.0", + "@fluentui/foundation-legacy": "^8.1.0", + "@fluentui/merge-styles": "^8.1.0", + "@fluentui/react-focus": "^8.1.0", + "@fluentui/react-hooks": "^8.2.0", + "@fluentui/react-window-provider": "^2.1.0", + "@fluentui/set-version": "^8.1.0", + "@fluentui/style-utilities": "^8.1.0", + "@fluentui/theme": "^2.1.0", + "@fluentui/utilities": "^8.1.0", "@microsoft/load-themed-styles": "^1.10.26", - "tslib": "^1.10.0" + "tslib": "^2.1.0" }, "dependencies": { "@fluentui/date-time-utilities": { @@ -2200,13 +2204,6 @@ "requires": { "@fluentui/set-version": "^8.1.0", "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } } }, "@fluentui/react-window-provider": { @@ -2216,14 +2213,12 @@ "requires": { "@fluentui/set-version": "^8.1.0", "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" } } }, @@ -2240,15 +2235,6 @@ "tslib": "^2.1.0" }, "dependencies": { - "@fluentui/dom-utilities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.1.0.tgz", - "integrity": "sha512-DMr0uH4EtyXgdpVLyvWq60YtWN38jx22rtdsEIbbBNYcFgcl3rRa7M8p/rnaw/k/KWX35H40AYga1SM6Zgpyww==", - "requires": { - "@fluentui/set-version": "^8.1.0", - "tslib": "^2.1.0" - } - }, "@fluentui/keyboard-key": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.3.0.tgz", @@ -2257,17 +2243,6 @@ "tslib": "^2.1.0" } }, - "@fluentui/utilities": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.1.0.tgz", - "integrity": "sha512-/yHnDkrIlyn/Jy3XWccNRyuujQDgUxz44OQDEiMSko50S/L7cVeWdIzG/CiIsCnKAgU4/QyzRo40Wdy3rdM8ag==", - "requires": { - "@fluentui/dom-utilities": "^2.1.0", - "@fluentui/merge-styles": "^8.1.0", - "@fluentui/set-version": "^8.1.0", - "tslib": "^2.1.0" - } - }, "tslib": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", @@ -2276,24 +2251,29 @@ } }, "@fluentui/react-hooks": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.1.3.tgz", - "integrity": "sha512-6iWYjfqXvEhHZoY4nmN6APoIdxwNxzVxXOJgq1Oo1nbR10E7Va7mz41gvlFAgg8OmH7mGpdSztlVj6TVl/TY2g==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.2.0.tgz", + "integrity": "sha512-FnmtkDurjnLXN/VssBnQQ19RGY3mUh+rLiYa4VRBWRIh1JTs7o6DGCu+IijvvFNzTHvsMgL/O3v/2UjXShO6uQ==", "requires": { - "@fluentui/react-window-provider": "^2.0.3", - "@fluentui/set-version": "^8.0.3", - "@fluentui/utilities": "^8.0.5", - "tslib": "^1.10.0" + "@fluentui/react-window-provider": "^2.1.0", + "@fluentui/set-version": "^8.1.0", + "@fluentui/utilities": "^8.1.0", + "tslib": "^2.1.0" }, "dependencies": { "@fluentui/react-window-provider": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.0.3.tgz", - "integrity": "sha512-eefkmzLJbYjVHtEtGbOwReyeYG+2bDefxdmvPRSVFlcRFCnasTvshuZj3xkaKSu5fsGzGw+f+ab3hDgLSETvbg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.1.0.tgz", + "integrity": "sha512-LcNni1utHiXiCu8EbXL42o118yNRAWKX15qKd0iyMqcUg5RplOdWuaniohXv2gsmdNB0l3F5Tnujgayy0xPlvQ==", "requires": { - "@fluentui/set-version": "^8.0.3", - "tslib": "^1.10.0" + "@fluentui/set-version": "^8.1.0", + "tslib": "^2.1.0" } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" } } }, @@ -2334,26 +2314,6 @@ "tslib": "^2.1.0" }, "dependencies": { - "@fluentui/dom-utilities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.1.0.tgz", - "integrity": "sha512-DMr0uH4EtyXgdpVLyvWq60YtWN38jx22rtdsEIbbBNYcFgcl3rRa7M8p/rnaw/k/KWX35H40AYga1SM6Zgpyww==", - "requires": { - "@fluentui/set-version": "^8.1.0", - "tslib": "^2.1.0" - } - }, - "@fluentui/utilities": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.1.0.tgz", - "integrity": "sha512-/yHnDkrIlyn/Jy3XWccNRyuujQDgUxz44OQDEiMSko50S/L7cVeWdIzG/CiIsCnKAgU4/QyzRo40Wdy3rdM8ag==", - "requires": { - "@fluentui/dom-utilities": "^2.1.0", - "@fluentui/merge-styles": "^8.1.0", - "@fluentui/set-version": "^8.1.0", - "tslib": "^2.1.0" - } - }, "tslib": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", @@ -2372,26 +2332,6 @@ "tslib": "^2.1.0" }, "dependencies": { - "@fluentui/dom-utilities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.1.0.tgz", - "integrity": "sha512-DMr0uH4EtyXgdpVLyvWq60YtWN38jx22rtdsEIbbBNYcFgcl3rRa7M8p/rnaw/k/KWX35H40AYga1SM6Zgpyww==", - "requires": { - "@fluentui/set-version": "^8.1.0", - "tslib": "^2.1.0" - } - }, - "@fluentui/utilities": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.1.0.tgz", - "integrity": "sha512-/yHnDkrIlyn/Jy3XWccNRyuujQDgUxz44OQDEiMSko50S/L7cVeWdIzG/CiIsCnKAgU4/QyzRo40Wdy3rdM8ag==", - "requires": { - "@fluentui/dom-utilities": "^2.1.0", - "@fluentui/merge-styles": "^8.1.0", - "@fluentui/set-version": "^8.1.0", - "tslib": "^2.1.0" - } - }, "tslib": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", @@ -2400,24 +2340,20 @@ } }, "@fluentui/utilities": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.0.5.tgz", - "integrity": "sha512-epqvqV4YjKcbgShLhDk/y2Xa+6sUTBXry/BrMPNVwNOqdj2HCf4eCY+a1emFnytMpIVysfYZ6glIx9MNQ8JgNg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.1.0.tgz", + "integrity": "sha512-/yHnDkrIlyn/Jy3XWccNRyuujQDgUxz44OQDEiMSko50S/L7cVeWdIzG/CiIsCnKAgU4/QyzRo40Wdy3rdM8ag==", "requires": { - "@fluentui/dom-utilities": "^2.0.3", - "@fluentui/merge-styles": "^8.0.4", - "@fluentui/set-version": "^8.0.3", - "tslib": "^1.10.0" + "@fluentui/dom-utilities": "^2.1.0", + "@fluentui/merge-styles": "^8.1.0", + "@fluentui/set-version": "^8.1.0", + "tslib": "^2.1.0" }, "dependencies": { - "@fluentui/dom-utilities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.0.3.tgz", - "integrity": "sha512-RaUoEYd12TeEjvKLBtfXDZmjreaV6qIfBB7G+QCuBpv5FF7TjhrGK3WDZ7oaG0dkdegAx+ecyUFyOfoBRPJLkg==", - "requires": { - "@fluentui/set-version": "^8.0.3", - "tslib": "^1.10.0" - } + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" } } }, @@ -3555,9 +3491,9 @@ } }, "@microsoft/load-themed-styles": { - "version": "1.10.146", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.146.tgz", - "integrity": "sha512-qQZ4J58J2VMe/XRpr2YRDusQB9uRBJ1SjJB76x7uH94t9hqxjVVxn2qL99Bl+ERbfrACZ9peGn2uamt4ponqZQ==" + "version": "1.10.168", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.168.tgz", + "integrity": "sha512-AnIjt1R+6P73ZQ0r/Djzij+dsizfvz0yj7spuCH6exEnpGgbsdPe0cdNrXPHVnaeJriHfefvhVRWGO7D8sMF9A==" }, "@nodelib/fs.scandir": { "version": "2.1.4", @@ -6087,426 +6023,6 @@ } } }, - "@uifabric/azure-themes": { - "version": "7.7.32", - "resolved": "https://registry.npmjs.org/@uifabric/azure-themes/-/azure-themes-7.7.32.tgz", - "integrity": "sha512-S7mym3EQ/WjRu0+VHLv6HP06BvaszaEl1jXvI8IiP19aWn+AYWEtdB0BjTA8/SUc1PXrRWG/wZgucOgLvKncDA==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "office-ui-fabric-react": "^7.168.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "@fluentui/react-focus": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.17.6.tgz", - "integrity": "sha512-JkLWNDe567lhvbnIhbYv9nUWYDIVN06utc3krs0UZBI+A0YZtQmftBtY0ghXo4PSjgozZocdu9sYkkgZOgyRLg==", - "requires": { - "@fluentui/keyboard-key": "^0.2.12", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@fluentui/react-window-provider": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.2.tgz", - "integrity": "sha512-fGSgL3Vp/+6t1Ysfz21FWZmqsU+iFVxOigvHnm5uKVyyRPwtaabv/F6kQ2y5isLMI2YmJaUd2i0cDJKu8ggrvw==", - "requires": { - "@uifabric/set-version": "^7.0.24", - "tslib": "^1.10.0" - } - }, - "@fluentui/theme": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.4.tgz", - "integrity": "sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/foundation": { - "version": "7.9.26", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.9.26.tgz", - "integrity": "sha512-1FLTb+jlH/Tuel2L9wT/zLl5ZW6W4Lbjrs5VUVjv81vWxzznvPnTf8+Ew0qkzaH7xDuMNMl7okswhV0IfJyheg==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/react-hooks": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.14.0.tgz", - "integrity": "sha512-Ndu/DEKHF4gFXEZa2AGgSkdWaj+njVrsSyXbkWRh2UZReFWnH1LMko9p/ZCwk1i9kAd5CUmyIfURUzIEya9YCg==", - "requires": { - "@fluentui/react-window-provider": "^1.0.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/styling": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.19.0.tgz", - "integrity": "sha512-fXComDtGV7dHF4rP4cLHwI6fC+1f/nvPavpMBz4IQdySwixta9TVMKbzt0OA6i0mJztqZCVAd27F/sl9R/JmcQ==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/utilities": { - "version": "7.33.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", - "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", - "requires": { - "@fluentui/dom-utilities": "^1.1.2", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - }, - "office-ui-fabric-react": { - "version": "7.168.2", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.168.2.tgz", - "integrity": "sha512-ssN6/6K4Z/PdT2ExE1q61B34w6LqfQrqTvrlq/NfSvDk7USxXvP3+rd7HQAUrynSsWx2MnNeYt23d34sSHLCKw==", - "requires": { - "@fluentui/date-time-utilities": "^7.9.1", - "@fluentui/react-focus": "^7.17.6", - "@fluentui/react-window-provider": "^1.0.2", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.9.26", - "@uifabric/icons": "^7.5.23", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/react-hooks": "^7.14.0", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - } - } - }, - "@uifabric/foundation": { - "version": "7.9.26", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.9.26.tgz", - "integrity": "sha512-1FLTb+jlH/Tuel2L9wT/zLl5ZW6W4Lbjrs5VUVjv81vWxzznvPnTf8+Ew0qkzaH7xDuMNMl7okswhV0IfJyheg==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/icons": { - "version": "7.5.23", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.5.23.tgz", - "integrity": "sha512-eIvUbH0EWgFgdfgFfINgqS2ZVZTyJ/9n5nR4bmcyAe75wsKxm4ser4WIT9IvaBF6+HFVfjUF/v6+VMD7y2LBng==", - "requires": { - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "@fluentui/theme": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.4.tgz", - "integrity": "sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/styling": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.19.0.tgz", - "integrity": "sha512-fXComDtGV7dHF4rP4cLHwI6fC+1f/nvPavpMBz4IQdySwixta9TVMKbzt0OA6i0mJztqZCVAd27F/sl9R/JmcQ==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/utilities": { - "version": "7.33.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", - "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", - "requires": { - "@fluentui/dom-utilities": "^1.1.2", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - } - } - }, - "@uifabric/merge-styles": { - "version": "7.19.2", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.19.2.tgz", - "integrity": "sha512-kTlhwglDqwVgIaJq+0yXgzi65plGhmFcPrfme/rXUGMJZoU+qlGT5jXj5d3kuI59p6VB8jWEg9DAxHozhYeu0g==", - "requires": { - "@uifabric/set-version": "^7.0.24", - "tslib": "^1.10.0" - } - }, - "@uifabric/react-cards": { - "version": "0.109.110", - "resolved": "https://registry.npmjs.org/@uifabric/react-cards/-/react-cards-0.109.110.tgz", - "integrity": "sha512-x/X0+u7uWr/fv98HxLzI9K0eC0LXnzGV4PjspnMqj48r7Bkbzm6qNorXxWQDeq9LPuhHCuf0DyHrIn+umvGG4Q==", - "requires": { - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/azure-themes": "^7.1.37", - "@uifabric/file-type-icons": "^7.3.13", - "@uifabric/foundation": "^7.7.33", - "@uifabric/set-version": "^7.0.15", - "@uifabric/styling": "^7.13.7", - "@uifabric/theme-samples": "^7.0.102", - "@uifabric/utilities": "^7.23.0", - "office-ui-fabric-react": "^7.121.10", - "tslib": "^1.10.0" - }, - "dependencies": { - "@fluentui/theme": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.4.tgz", - "integrity": "sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/file-type-icons": { - "version": "7.6.30", - "resolved": "https://registry.npmjs.org/@uifabric/file-type-icons/-/file-type-icons-7.6.30.tgz", - "integrity": "sha512-NpZ5kKFxmT60EvHzKSD9XpKYDLBCJDZw3ae3WhW4k2z67RKo5yOZ76hzN9y3UWW3E0qMw9r2+zFF7JukjQYHtw==", - "requires": { - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "tslib": "^1.10.0" - } - }, - "@uifabric/foundation": { - "version": "7.9.26", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.9.26.tgz", - "integrity": "sha512-1FLTb+jlH/Tuel2L9wT/zLl5ZW6W4Lbjrs5VUVjv81vWxzznvPnTf8+Ew0qkzaH7xDuMNMl7okswhV0IfJyheg==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/styling": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.19.0.tgz", - "integrity": "sha512-fXComDtGV7dHF4rP4cLHwI6fC+1f/nvPavpMBz4IQdySwixta9TVMKbzt0OA6i0mJztqZCVAd27F/sl9R/JmcQ==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/utilities": { - "version": "7.33.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", - "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", - "requires": { - "@fluentui/dom-utilities": "^1.1.2", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - } - } - }, - "@uifabric/react-hooks": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.14.0.tgz", - "integrity": "sha512-Ndu/DEKHF4gFXEZa2AGgSkdWaj+njVrsSyXbkWRh2UZReFWnH1LMko9p/ZCwk1i9kAd5CUmyIfURUzIEya9YCg==", - "requires": { - "@fluentui/react-window-provider": "^1.0.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/set-version": { - "version": "7.0.24", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.24.tgz", - "integrity": "sha512-t0Pt21dRqdC707/ConVJC0WvcQ/KF7tKLU8AZY7YdjgJpMHi1c0C427DB4jfUY19I92f60LOQyhJ4efH+KpFEg==", - "requires": { - "tslib": "^1.10.0" - } - }, - "@uifabric/styling": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.19.0.tgz", - "integrity": "sha512-fXComDtGV7dHF4rP4cLHwI6fC+1f/nvPavpMBz4IQdySwixta9TVMKbzt0OA6i0mJztqZCVAd27F/sl9R/JmcQ==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "@fluentui/theme": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.4.tgz", - "integrity": "sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - } - } - }, - "@uifabric/theme-samples": { - "version": "7.2.34", - "resolved": "https://registry.npmjs.org/@uifabric/theme-samples/-/theme-samples-7.2.34.tgz", - "integrity": "sha512-olraurYMgXOA3ytPcm8oBcXj/eWZ04pAtpENkHQVujR6Ok4qqka1neVchTW7IBUgw+X+Rl/ampT7sqq77h2JYw==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@uifabric/set-version": "^7.0.24", - "@uifabric/variants": "^7.2.35", - "office-ui-fabric-react": "^7.168.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "@fluentui/react-focus": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.17.6.tgz", - "integrity": "sha512-JkLWNDe567lhvbnIhbYv9nUWYDIVN06utc3krs0UZBI+A0YZtQmftBtY0ghXo4PSjgozZocdu9sYkkgZOgyRLg==", - "requires": { - "@fluentui/keyboard-key": "^0.2.12", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@fluentui/react-window-provider": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.2.tgz", - "integrity": "sha512-fGSgL3Vp/+6t1Ysfz21FWZmqsU+iFVxOigvHnm5uKVyyRPwtaabv/F6kQ2y5isLMI2YmJaUd2i0cDJKu8ggrvw==", - "requires": { - "@uifabric/set-version": "^7.0.24", - "tslib": "^1.10.0" - } - }, - "@fluentui/theme": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.4.tgz", - "integrity": "sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/utilities": { - "version": "7.33.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", - "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", - "requires": { - "@fluentui/dom-utilities": "^1.1.2", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - }, - "office-ui-fabric-react": { - "version": "7.170.0", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.170.0.tgz", - "integrity": "sha512-N348H5dS56oMrnKeZP1p7h2o+lO9wUY9YEHiVZ0FYpB8gmRwgJVq8/d2hSfZEgQH14IMbhdLYNE8RFziYyHFsw==", - "requires": { - "@fluentui/date-time-utilities": "^7.9.1", - "@fluentui/react-focus": "^7.17.6", - "@fluentui/react-window-provider": "^1.0.2", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.9.26", - "@uifabric/icons": "^7.5.23", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/react-hooks": "^7.14.0", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - } - } - }, - "@uifabric/utilities": { - "version": "7.33.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", - "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", - "requires": { - "@fluentui/dom-utilities": "^1.1.2", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - }, - "@uifabric/variants": { - "version": "7.2.35", - "resolved": "https://registry.npmjs.org/@uifabric/variants/-/variants-7.2.35.tgz", - "integrity": "sha512-pK9n0QM3wYuE/f7scOhkW0jsSx1BPU6RePeuMJcoriCgK6zeN66p5ySwh+UhjuEtoGaSfVxeFve02hWNTfO8vg==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@uifabric/set-version": "^7.0.24", - "tslib": "^1.10.0" - }, - "dependencies": { - "@fluentui/theme": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.4.tgz", - "integrity": "sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - } - } - }, "@ungap/url-search-params": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.2.2.tgz", @@ -20411,109 +19927,6 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "office-ui-fabric-react": { - "version": "7.164.2", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.164.2.tgz", - "integrity": "sha512-qx8WbSXDJbcfq7MdJujUSAkiaYTQIQBkz4pb03r9LncwlrcnVx+thgKn8yztb2g0FlP0z5ONHv1wufrOHYxnHQ==", - "requires": { - "@fluentui/date-time-utilities": "^7.9.1", - "@fluentui/react-focus": "^7.17.6", - "@fluentui/react-window-provider": "^1.0.2", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.9.26", - "@uifabric/icons": "^7.5.23", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/react-hooks": "^7.13.12", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "@fluentui/react-focus": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.17.6.tgz", - "integrity": "sha512-JkLWNDe567lhvbnIhbYv9nUWYDIVN06utc3krs0UZBI+A0YZtQmftBtY0ghXo4PSjgozZocdu9sYkkgZOgyRLg==", - "requires": { - "@fluentui/keyboard-key": "^0.2.12", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@fluentui/react-window-provider": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.2.tgz", - "integrity": "sha512-fGSgL3Vp/+6t1Ysfz21FWZmqsU+iFVxOigvHnm5uKVyyRPwtaabv/F6kQ2y5isLMI2YmJaUd2i0cDJKu8ggrvw==", - "requires": { - "@uifabric/set-version": "^7.0.24", - "tslib": "^1.10.0" - } - }, - "@fluentui/theme": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.4.tgz", - "integrity": "sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/foundation": { - "version": "7.9.26", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.9.26.tgz", - "integrity": "sha512-1FLTb+jlH/Tuel2L9wT/zLl5ZW6W4Lbjrs5VUVjv81vWxzznvPnTf8+Ew0qkzaH7xDuMNMl7okswhV0IfJyheg==", - "requires": { - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/styling": "^7.19.0", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/react-hooks": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.14.0.tgz", - "integrity": "sha512-Ndu/DEKHF4gFXEZa2AGgSkdWaj+njVrsSyXbkWRh2UZReFWnH1LMko9p/ZCwk1i9kAd5CUmyIfURUzIEya9YCg==", - "requires": { - "@fluentui/react-window-provider": "^1.0.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/styling": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.19.0.tgz", - "integrity": "sha512-fXComDtGV7dHF4rP4cLHwI6fC+1f/nvPavpMBz4IQdySwixta9TVMKbzt0OA6i0mJztqZCVAd27F/sl9R/JmcQ==", - "requires": { - "@fluentui/theme": "^1.7.4", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "@uifabric/utilities": "^7.33.5", - "tslib": "^1.10.0" - } - }, - "@uifabric/utilities": { - "version": "7.33.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", - "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", - "requires": { - "@fluentui/dom-utilities": "^1.1.2", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - } - } - } - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", diff --git a/package.json b/package.json index 07e35aea9..dcd1756e8 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "@azure/ms-rest-nodeauth": "3.0.7", "@babel/plugin-proposal-class-properties": "7.12.1", "@babel/plugin-proposal-decorators": "7.12.12", - "@fluentui/react": "8.10.1", + "@fluentui/react": "8.14.3", "@jupyterlab/services": "6.0.2", "@jupyterlab/terminal": "3.0.3", "@microsoft/applicationinsights-web": "2.6.1", @@ -43,7 +43,6 @@ "@testing-library/jest-dom": "5.11.9", "@types/mkdirp": "1.0.1", "@types/node-fetch": "2.5.7", - "@uifabric/react-cards": "0.109.110", "applicationinsights": "1.8.0", "bootstrap": "3.4.1", "canvas": "file:./canvas", diff --git a/src/Explorer/ComponentRegisterer.test.ts b/src/Explorer/ComponentRegisterer.test.ts index 2a9e5c2d3..1f97cd6f5 100644 --- a/src/Explorer/ComponentRegisterer.test.ts +++ b/src/Explorer/ComponentRegisterer.test.ts @@ -20,10 +20,6 @@ describe("Component Registerer", () => { expect(ko.components.isRegistered("json-editor")).toBe(true); }); - it("should registeradd-collection-pane component", () => { - expect(ko.components.isRegistered("add-collection-pane")).toBe(true); - }); - it("should register graph-styling-pane component", () => { expect(ko.components.isRegistered("graph-styling-pane")).toBe(true); }); diff --git a/src/Explorer/ComponentRegisterer.ts b/src/Explorer/ComponentRegisterer.ts index 05c2be37c..ddf9bb991 100644 --- a/src/Explorer/ComponentRegisterer.ts +++ b/src/Explorer/ComponentRegisterer.ts @@ -21,6 +21,5 @@ ko.components.register("throughput-input-autopilot-v3", ThroughputInputComponent // Panes ko.components.register("add-database-pane", new PaneComponents.AddDatabasePaneComponent()); -ko.components.register("add-collection-pane", new PaneComponents.AddCollectionPaneComponent()); ko.components.register("graph-styling-pane", new PaneComponents.GraphStylingPaneComponent()); ko.components.register("cassandra-add-collection-pane", new PaneComponents.CassandraAddCollectionPaneComponent()); diff --git a/src/Explorer/Controls/NotebookGallery/Cards/GalleryCardComponent.tsx b/src/Explorer/Controls/NotebookGallery/Cards/GalleryCardComponent.tsx index d212a344b..e520dabad 100644 --- a/src/Explorer/Controls/NotebookGallery/Cards/GalleryCardComponent.tsx +++ b/src/Explorer/Controls/NotebookGallery/Cards/GalleryCardComponent.tsx @@ -1,20 +1,23 @@ import { BaseButton, Button, - FontWeights, + DocumentCard, + DocumentCardActivity, + DocumentCardDetails, + DocumentCardPreview, + DocumentCardTitle, Icon, IconButton, - Image, + IDocumentCardPreviewProps, + IDocumentCardStyles, ImageFit, Link, - Persona, Separator, Spinner, SpinnerSize, Text, TooltipHost, } from "@fluentui/react"; -import { Card } from "@uifabric/react-cards"; import React, { FunctionComponent, useState } from "react"; import CosmosDBLogo from "../../../../../images/CosmosDB-logo.svg"; import { IGalleryItem } from "../../../../Juno/JunoClient"; @@ -48,7 +51,6 @@ export const GalleryCardComponent: FunctionComponent const CARD_WIDTH = 256; const cardImageHeight = 144; const cardDescriptionMaxChars = 80; - const cardItemGapBig = 10; const cardItemGapSmall = 8; const cardDeleteSpinnerHeight = 360; const smallTextLineHeight = 18; @@ -64,9 +66,9 @@ export const GalleryCardComponent: FunctionComponent const dateString = new Date(data.created).toLocaleString("default", options); const cardTitle = FileSystemUtil.stripExtension(data.name, "ipynb"); - const renderTruncatedDescription = (): string => { - let truncatedDescription = data.description.substr(0, cardDescriptionMaxChars); - if (data.description.length > cardDescriptionMaxChars) { + const renderTruncated = (text: string, totalLength: number): string => { + let truncatedDescription = text.substr(0, totalLength); + if (text.length > totalLength) { truncatedDescription = `${truncatedDescription} ...`; } return truncatedDescription; @@ -120,42 +122,35 @@ export const GalleryCardComponent: FunctionComponent event.preventDefault(); activate(); }; - + const DocumentCardActivityPeople = [{ name: data.author, profileImageSrc: data.isSample && CosmosDBLogo }]; + const previewProps: IDocumentCardPreviewProps = { + previewImages: [ + { + previewImageSrc: data.thumbnailUrl, + imageFit: ImageFit.cover, + width: CARD_WIDTH, + height: cardImageHeight, + }, + ], + }; + const cardStyles: IDocumentCardStyles = { + root: { display: "inline-block", marginRight: 20, width: CARD_WIDTH }, + }; return ( - handlerOnClick(event, onClick)} - > + {isDeletingPublishedNotebook && ( - - - + )} {!isDeletingPublishedNotebook && ( <> - - - - - - {`${cardTitle} - - - - + + + + {data.tags ? ( data.tags.map((tag, index, array) => ( @@ -167,43 +162,22 @@ export const GalleryCardComponent: FunctionComponent
)}
- - - {cardTitle} - - - - {renderTruncatedDescription()} - - - + + + {data.views !== undefined && generateIconText("RedEye", data.views.toString())} {data.downloads !== undefined && generateIconText("Download", data.downloads.toString())} {data.favorites !== undefined && generateIconText("Heart", data.favorites.toString())} -
- + {cardButtonsVisible && ( - + - + {isFavorite !== undefined && generateIconButtonWithTooltip( isFavorite ? "HeartFill" : "Heart", @@ -222,10 +196,10 @@ export const GalleryCardComponent: FunctionComponent ) )} - + )} )} -
+ ); }; diff --git a/src/Explorer/Controls/NotebookGallery/Cards/__snapshots__/GalleryCardComponent.test.tsx.snap b/src/Explorer/Controls/NotebookGallery/Cards/__snapshots__/GalleryCardComponent.test.tsx.snap index 17f8fd5cf..a4cdc6ef5 100644 --- a/src/Explorer/Controls/NotebookGallery/Cards/__snapshots__/GalleryCardComponent.test.tsx.snap +++ b/src/Explorer/Controls/NotebookGallery/Cards/__snapshots__/GalleryCardComponent.test.tsx.snap @@ -1,59 +1,49 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`GalleryCardComponent renders 1`] = ` - - - - - - name cover image - - + /> + + - + + - name - - - description - - - - + + - + - - + + `; diff --git a/src/Explorer/Controls/NotebookGallery/GalleryViewerComponent.tsx b/src/Explorer/Controls/NotebookGallery/GalleryViewerComponent.tsx index 37e96aaa7..f1733a141 100644 --- a/src/Explorer/Controls/NotebookGallery/GalleryViewerComponent.tsx +++ b/src/Explorer/Controls/NotebookGallery/GalleryViewerComponent.tsx @@ -34,7 +34,6 @@ import { CodeOfConductComponent } from "./CodeOfConductComponent"; import "./GalleryViewerComponent.less"; import { InfoComponent } from "./InfoComponent/InfoComponent"; -const CARD_WIDTH = 256; export interface GalleryViewerComponentProps { container?: Explorer; junoClient: JunoClient; @@ -87,7 +86,7 @@ export class GalleryViewerComponent extends React.Component { if (itemIndex === 0) { - this.columnCount = Math.floor(visibleRect.width / CARD_WIDTH) || this.columnCount; + this.columnCount = Math.floor(visibleRect.width / GalleryViewerComponent.CARD_WIDTH) || this.columnCount; this.rowCount = GalleryViewerComponent.rowsPerPage; } @@ -672,7 +671,7 @@ export class GalleryViewerComponent extends React.Component +
); diff --git a/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap b/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap index 671725d4f..9eb6d8b7e 100644 --- a/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap +++ b/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap @@ -75,89 +75,6 @@ exports[`SettingsComponent renders 1`] = ` "upsellMessageAriaLabel": [Function], "visible": [Function], }, - AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, GraphStylingPane { "container": [Circular], "firstFieldHasFocus": [Function], @@ -226,89 +143,6 @@ exports[`SettingsComponent renders 1`] = ` ], "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionPane": AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, "addCollectionText": [Function], "addDatabasePane": AddDatabasePane { "autoPilotUsageCost": [Function], @@ -1353,89 +1187,6 @@ exports[`SettingsComponent renders 1`] = ` "upsellMessageAriaLabel": [Function], "visible": [Function], }, - AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, GraphStylingPane { "container": [Circular], "firstFieldHasFocus": [Function], @@ -1504,89 +1255,6 @@ exports[`SettingsComponent renders 1`] = ` ], "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionPane": AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, "addCollectionText": [Function], "addDatabasePane": AddDatabasePane { "autoPilotUsageCost": [Function], @@ -2644,89 +2312,6 @@ exports[`SettingsComponent renders 1`] = ` "upsellMessageAriaLabel": [Function], "visible": [Function], }, - AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, GraphStylingPane { "container": [Circular], "firstFieldHasFocus": [Function], @@ -2795,89 +2380,6 @@ exports[`SettingsComponent renders 1`] = ` ], "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionPane": AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, "addCollectionText": [Function], "addDatabasePane": AddDatabasePane { "autoPilotUsageCost": [Function], @@ -3922,89 +3424,6 @@ exports[`SettingsComponent renders 1`] = ` "upsellMessageAriaLabel": [Function], "visible": [Function], }, - AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, GraphStylingPane { "container": [Circular], "firstFieldHasFocus": [Function], @@ -4073,89 +3492,6 @@ exports[`SettingsComponent renders 1`] = ` ], "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionPane": AddCollectionPane { - "_isSynapseLinkEnabled": [Function], - "autoPilotThroughput": [Function], - "autoPilotUsageCost": [Function], - "canConfigureThroughput": [Function], - "canExceedMaximumValue": [Function], - "canRequestSupport": [Function], - "collectionId": [Function], - "collectionIdTitle": [Function], - "collectionWithThroughputInShared": [Function], - "collectionWithThroughputInSharedTitle": [Function], - "container": [Circular], - "costsVisible": [Function], - "databaseCreateNew": [Function], - "databaseCreateNewShared": [Function], - "databaseHasSharedOffer": [Function], - "databaseId": [Function], - "databaseIds": [Function], - "dedicatedRequestUnitsUsageCost": [Function], - "displayCollectionThroughput": [Function], - "firstFieldHasFocus": [Function], - "formErrors": [Function], - "formErrorsDetails": [Function], - "formWarnings": [Function], - "freeTierExceedThroughputTooltip": [Function], - "id": "addcollectionpane", - "isAnalyticalStorageOn": [Function], - "isAutoPilotSelected": [Function], - "isEnableMongoCapabilityEnabled": [Function], - "isExecuting": [Function], - "isFixedStorageSelected": [Function], - "isFreeTierAccount": [Function], - "isNonTableApi": [Function], - "isPreferredApiTable": [Function], - "isSharedAutoPilotSelected": [Function], - "isSynapseLinkSupported": [Function], - "isSynapseLinkUpdating": [Function], - "isTemplateReady": [Function], - "isTryCosmosDBSubscription": [Function], - "isUnlimitedStorageSelected": [Function], - "largePartitionKey": [Function], - "lowerCasePartitionKeyName": [Function], - "maxCollectionsReached": [Function], - "maxCollectionsReachedMessage": [Function], - "maxThroughputRU": [Function], - "minThroughputRU": [Function], - "onMoreDetailsKeyPress": [Function], - "partitionKey": [Function], - "partitionKeyName": [Function], - "partitionKeyPattern": [Function], - "partitionKeyPlaceholder": [Function], - "partitionKeyTitle": [Function], - "partitionKeyVisible": [Function], - "requestUnitsUsageCost": [Function], - "ruToolTipText": [Function], - "sharedAutoPilotThroughput": [Function], - "sharedThroughputRangeText": [Function], - "shouldCreateMongoWildcardIndex": [Function], - "shouldUseDatabaseThroughput": [Function], - "showAnalyticalStore": [Function], - "showEnableSynapseLink": [Function], - "showIndexingOptionsForSharedThroughput": [Function], - "showUpsellMessage": [Function], - "storage": [Function], - "throughputDatabase": [Function], - "throughputMultiPartition": [Function], - "throughputRangeText": [Function], - "throughputSinglePartition": [Function], - "throughputSpendAck": [Function], - "throughputSpendAckText": [Function], - "throughputSpendAckVisible": [Function], - "title": [Function], - "ttl90DaysEnabled": [Function], - "uniqueKeys": [Function], - "uniqueKeysPlaceholder": [Function], - "uniqueKeysVisible": [Function], - "upsellAnchorText": [Function], - "upsellAnchorUrl": [Function], - "upsellMessage": [Function], - "upsellMessageAriaLabel": [Function], - "useIndexingForSharedThroughput": [Function], - "visible": [Function], - }, "addCollectionText": [Function], "addDatabasePane": AddDatabasePane { "autoPilotUsageCost": [Function], diff --git a/src/Explorer/Explorer.tsx b/src/Explorer/Explorer.tsx index dee398749..fe73a7a49 100644 --- a/src/Explorer/Explorer.tsx +++ b/src/Explorer/Explorer.tsx @@ -49,7 +49,6 @@ import { NotebookContentItem, NotebookContentItemType } from "./Notebook/Noteboo import type NotebookManager from "./Notebook/NotebookManager"; import type { NotebookPaneContent } from "./Notebook/NotebookManager"; import { NotebookUtil } from "./Notebook/NotebookUtil"; -import AddCollectionPane from "./Panes/AddCollectionPane"; import { AddCollectionPanel } from "./Panes/AddCollectionPanel"; import AddDatabasePane from "./Panes/AddDatabasePane"; import { AddDatabasePanel } from "./Panes/AddDatabasePanel/AddDatabasePanel"; @@ -151,7 +150,6 @@ export default class Explorer { // Contextual panes public addDatabasePane: AddDatabasePane; - public addCollectionPane: AddCollectionPane; public graphStylingPane: GraphStylingPane; public cassandraAddCollectionPane: CassandraAddCollectionPane; private gitHubClient: GitHubClient; @@ -413,14 +411,6 @@ export default class Explorer { container: this, }); - this.addCollectionPane = new AddCollectionPane({ - isPreferredApiTable: ko.computed(() => userContext.apiType === "Tables"), - id: "addcollectionpane", - visible: ko.observable(false), - - container: this, - }); - this.graphStylingPane = new GraphStylingPane({ id: "graphstylingpane", visible: ko.observable(false), @@ -443,12 +433,7 @@ export default class Explorer { } }); - this._panes = [ - this.addDatabasePane, - this.addCollectionPane, - this.graphStylingPane, - this.cassandraAddCollectionPane, - ]; + this._panes = [this.addDatabasePane, this.graphStylingPane, this.cassandraAddCollectionPane]; this.addDatabaseText.subscribe((addDatabaseText: string) => this.addDatabasePane.title(addDatabaseText)); this.isTabsContentExpanded = ko.observable(false); @@ -472,11 +457,6 @@ export default class Explorer { this.collectionTreeNodeAltText("Container"); this.deleteCollectionText("Delete Container"); this.deleteDatabaseText("Delete Database"); - this.addCollectionPane.title("Add Container"); - this.addCollectionPane.collectionIdTitle("Container id"); - this.addCollectionPane.collectionWithThroughputInSharedTitle( - "Provision dedicated throughput for this container" - ); this.refreshTreeTitle("Refresh containers"); break; case "Mongo": @@ -486,11 +466,6 @@ export default class Explorer { this.collectionTreeNodeAltText("Collection"); this.deleteCollectionText("Delete Collection"); this.deleteDatabaseText("Delete Database"); - this.addCollectionPane.title("Add Collection"); - this.addCollectionPane.collectionIdTitle("Collection id"); - this.addCollectionPane.collectionWithThroughputInSharedTitle( - "Provision dedicated throughput for this collection" - ); this.refreshTreeTitle("Refresh collections"); break; case "Gremlin": @@ -500,9 +475,6 @@ export default class Explorer { this.deleteDatabaseText("Delete Database"); this.collectionTitle("Gremlin API"); this.collectionTreeNodeAltText("Graph"); - this.addCollectionPane.title("Add Graph"); - this.addCollectionPane.collectionIdTitle("Graph id"); - this.addCollectionPane.collectionWithThroughputInSharedTitle("Provision dedicated throughput for this graph"); this.refreshTreeTitle("Refresh graphs"); break; case "Tables": @@ -512,9 +484,6 @@ export default class Explorer { this.deleteDatabaseText("Delete Database"); this.collectionTitle("Azure Table API"); this.collectionTreeNodeAltText("Table"); - this.addCollectionPane.title("Add Table"); - this.addCollectionPane.collectionIdTitle("Table id"); - this.addCollectionPane.collectionWithThroughputInSharedTitle("Provision dedicated throughput for this table"); this.refreshTreeTitle("Refresh tables"); this.tableDataClient = new TablesAPIDataClient(); break; @@ -525,9 +494,6 @@ export default class Explorer { this.deleteDatabaseText("Delete Keyspace"); this.collectionTitle("Cassandra API"); this.collectionTreeNodeAltText("Table"); - this.addCollectionPane.title("Add Table"); - this.addCollectionPane.collectionIdTitle("Table id"); - this.addCollectionPane.collectionWithThroughputInSharedTitle("Provision dedicated throughput for this table"); this.refreshTreeTitle("Refresh tables"); this.tableDataClient = new CassandraAPIDataClient(); break; @@ -1846,9 +1812,6 @@ export default class Explorer { public onNewCollectionClicked(databaseId?: string): void { if (userContext.apiType === "Cassandra") { this.cassandraAddCollectionPane.open(); - } else if (userContext.features.enableKOPanel) { - this.addCollectionPane.open(this.selectedDatabaseId()); - document.getElementById("linkAddCollection").focus(); } else { this.openAddCollectionPanel(databaseId); } diff --git a/src/Explorer/Panes/AddCollectionPane.html b/src/Explorer/Panes/AddCollectionPane.html deleted file mode 100644 index 2d0cfe8ba..000000000 --- a/src/Explorer/Panes/AddCollectionPane.html +++ /dev/null @@ -1,602 +0,0 @@ -
-
-
- -
-
- -
-
- - -
- -
- -
-
- - diff --git a/src/Explorer/Panes/AddCollectionPane.test.ts b/src/Explorer/Panes/AddCollectionPane.test.ts deleted file mode 100644 index 3e36abe1f..000000000 --- a/src/Explorer/Panes/AddCollectionPane.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import * as Constants from "../../Common/Constants"; -import { DatabaseAccount } from "../../Contracts/DataModels"; -import { updateUserContext } from "../../UserContext"; -import Explorer from "../Explorer"; -import AddCollectionPane from "./AddCollectionPane"; - -const mockDatabaseAccount: DatabaseAccount = { - id: "mock", - kind: "DocumentDB", - location: "", - name: "mock", - properties: { - documentEndpoint: "", - cassandraEndpoint: "", - gremlinEndpoint: "", - tableEndpoint: "", - enableFreeTier: false, - }, - type: undefined, -}; - -const mockFreeTierDatabaseAccount: DatabaseAccount = { - id: "mock", - kind: "DocumentDB", - location: "", - name: "mock", - properties: { - documentEndpoint: "", - cassandraEndpoint: "", - gremlinEndpoint: "", - tableEndpoint: "", - enableFreeTier: true, - }, - type: undefined, -}; - -describe("Add Collection Pane", () => { - describe("isValid()", () => { - it("should be true if graph API and partition key is not /id nor /label", () => { - updateUserContext({ - databaseAccount: { - properties: { - capabilities: [{ name: "EnableGremlin" }], - }, - } as DatabaseAccount, - }); - const explorer = new Explorer(); - const addCollectionPane = explorer.addCollectionPane as AddCollectionPane; - addCollectionPane.partitionKey("/blah"); - expect(addCollectionPane.isValid()).toBe(true); - }); - - it("should be false if graph API and partition key is /id or /label", () => { - updateUserContext({ - databaseAccount: { - properties: { - capabilities: [{ name: "EnableGremlin" }], - }, - } as DatabaseAccount, - }); - const explorer = new Explorer(); - const addCollectionPane = explorer.addCollectionPane as AddCollectionPane; - addCollectionPane.partitionKey("/id"); - expect(addCollectionPane.isValid()).toBe(false); - - addCollectionPane.partitionKey("/label"); - expect(addCollectionPane.isValid()).toBe(false); - }); - - it("should be true for any non-graph API with /id or /label partition key", () => { - updateUserContext({ - databaseAccount: { - properties: { - capabilities: [{ name: "EnableCassandra" }], - }, - } as DatabaseAccount, - }); - const explorer = new Explorer(); - const addCollectionPane = explorer.addCollectionPane as AddCollectionPane; - - addCollectionPane.partitionKey("/id"); - expect(addCollectionPane.isValid()).toBe(true); - - addCollectionPane.partitionKey("/label"); - expect(addCollectionPane.isValid()).toBe(true); - }); - - it("should display free tier text in upsell messaging", () => { - updateUserContext({ databaseAccount: mockFreeTierDatabaseAccount }); - const explorer = new Explorer(); - const addCollectionPane = explorer.addCollectionPane as AddCollectionPane; - expect(addCollectionPane.isFreeTierAccount()).toBe(true); - expect(addCollectionPane.upsellMessage()).toContain("With free tier"); - expect(addCollectionPane.upsellAnchorUrl()).toBe(Constants.Urls.freeTierInformation); - expect(addCollectionPane.upsellAnchorText()).toBe("Learn more"); - }); - - it("should display standard texr in upsell messaging", () => { - updateUserContext({ databaseAccount: mockDatabaseAccount }); - const explorer = new Explorer(); - const addCollectionPane = explorer.addCollectionPane as AddCollectionPane; - expect(addCollectionPane.isFreeTierAccount()).toBe(false); - expect(addCollectionPane.upsellMessage()).toContain("Start at"); - expect(addCollectionPane.upsellAnchorUrl()).toBe(Constants.Urls.cosmosPricing); - expect(addCollectionPane.upsellAnchorText()).toBe("More details"); - }); - }); -}); diff --git a/src/Explorer/Panes/AddCollectionPane.ts b/src/Explorer/Panes/AddCollectionPane.ts deleted file mode 100644 index 17aef98fa..000000000 --- a/src/Explorer/Panes/AddCollectionPane.ts +++ /dev/null @@ -1,1201 +0,0 @@ -import * as ko from "knockout"; -import * as _ from "underscore"; -import * as Constants from "../../Common/Constants"; -import { createCollection } from "../../Common/dataAccess/createCollection"; -import editable from "../../Common/EditableUtility"; -import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils"; -import { configContext, Platform } from "../../ConfigContext"; -import * as DataModels from "../../Contracts/DataModels"; -import { SubscriptionType } from "../../Contracts/SubscriptionType"; -import * as ViewModels from "../../Contracts/ViewModels"; -import * as AddCollectionUtility from "../../Shared/AddCollectionUtility"; -import * as SharedConstants from "../../Shared/Constants"; -import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants"; -import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; -import { userContext } from "../../UserContext"; -import * as AutoPilotUtils from "../../Utils/AutoPilotUtils"; -import { isCapabilityEnabled } from "../../Utils/CapabilityUtils"; -import * as PricingUtils from "../../Utils/PricingUtils"; -import { DynamicListItem } from "../Controls/DynamicList/DynamicListComponent"; -import { ContextualPaneBase } from "./ContextualPaneBase"; - -export interface AddCollectionPaneOptions extends ViewModels.PaneOptions { - isPreferredApiTable: ko.Computed; - databaseId?: string; - databaseSelfLink?: string; -} - -export default class AddCollectionPane extends ContextualPaneBase { - public defaultExperience: ko.Computed; - public databaseIds: ko.ObservableArray; - public collectionId: ko.Observable; - public collectionIdTitle: ko.Observable; - public databaseId: ko.Observable; - public databaseCreateNew: ko.Observable; - public collectionWithThroughputInSharedTitle: ko.Observable; - public collectionWithThroughputInShared: ko.Observable; - public databaseCreateNewShared: ko.Observable; - public databaseHasSharedOffer: ko.Observable; - public formErrorsDetails: ko.Observable; - public formWarnings: ko.Observable; - public partitionKey: ko.Observable; - public partitionKeyName: ko.Computed; - public lowerCasePartitionKeyName: ko.Computed; - public partitionKeyVisible: ko.Computed; - public partitionKeyPattern: ko.Computed; - public partitionKeyTitle: ko.Computed; - public storage: ko.Observable; - public throughputSinglePartition: ViewModels.Editable; - public throughputMultiPartition: ViewModels.Editable; - public throughputDatabase: ViewModels.Editable; - public isPreferredApiTable: ko.Computed; - public partitionKeyPlaceholder: ko.Computed; - public isTryCosmosDBSubscription: ko.Observable; - public maxThroughputRU: ko.Observable; - public minThroughputRU: ko.Observable; - public throughputRangeText: ko.Computed; - public sharedThroughputRangeText: ko.Computed; - public throughputSpendAckText: ko.Observable; - public throughputSpendAck: ko.Observable; - public throughputSpendAckVisible: ko.Computed; - public maxCollectionsReached: ko.Computed; - public maxCollectionsReachedMessage: ko.Observable; - public requestUnitsUsageCost: ko.Computed; - public dedicatedRequestUnitsUsageCost: ko.Computed; - public canRequestSupport: ko.PureComputed; - public largePartitionKey: ko.Observable = ko.observable(false); - public useIndexingForSharedThroughput: ko.Observable = ko.observable(true); - public costsVisible: ko.PureComputed; - public uniqueKeysVisible: ko.Computed; - public uniqueKeys: ko.ObservableArray; - public uniqueKeysPlaceholder: ko.Computed; - public upsellMessage: ko.PureComputed; - public upsellMessageAriaLabel: ko.PureComputed; - public upsellAnchorUrl: ko.PureComputed; - public upsellAnchorText: ko.PureComputed; - public debugstring: ko.Computed; - public displayCollectionThroughput: ko.Computed; - public isAutoPilotSelected: ko.Observable; - public isSharedAutoPilotSelected: ko.Observable; - public autoPilotThroughput: ko.Observable; - public sharedAutoPilotThroughput: ko.Observable; - public autoPilotUsageCost: ko.Computed; - public shouldUseDatabaseThroughput: ko.Computed; - public isFreeTierAccount: ko.Computed; - public showIndexingOptionsForSharedThroughput: ko.Computed; - public showAnalyticalStore: ko.Computed; - public showEnableSynapseLink: ko.Computed; - public isSynapseLinkSupported: ko.Computed; - public isAnalyticalStorageOn: ko.Observable; - public isSynapseLinkUpdating: ko.Computed; - public canExceedMaximumValue: ko.PureComputed; - public ruToolTipText: ko.Computed; - public freeTierExceedThroughputTooltip: ko.Computed; - public canConfigureThroughput: ko.PureComputed; - public showUpsellMessage: ko.PureComputed; - public shouldCreateMongoWildcardIndex: ko.Observable; - - private _isSynapseLinkEnabled: ko.Computed; - private isEnableMongoCapabilityEnabled: ko.Observable; - - constructor(options: AddCollectionPaneOptions) { - super(options); - this.ruToolTipText = ko.pureComputed(() => PricingUtils.getRuToolTipText()); - this.canConfigureThroughput = ko.pureComputed(() => !this.container.isServerlessEnabled()); - this.formWarnings = ko.observable(); - this.collectionId = ko.observable(); - this.databaseId = ko.observable(); - this.databaseCreateNew = ko.observable(true); - this.databaseCreateNewShared = ko.observable(this.getSharedThroughputDefault()); - this.collectionWithThroughputInShared = ko.observable(false); - this.databaseIds = ko.observableArray(); - this.uniqueKeys = ko.observableArray(); - this.isSharedAutoPilotSelected = ko.observable(); - this.isAutoPilotSelected = ko.observable(); - - if (this.container) { - this.container.databases.subscribe((newDatabases: ViewModels.Database[]) => { - this._onDatabasesChange(newDatabases); - }); - this._onDatabasesChange(this.container.databases()); - } - - this.isPreferredApiTable = options.isPreferredApiTable; - this.partitionKey = ko.observable(); - this.partitionKey.subscribe((newPartitionKey: string) => { - if (userContext.apiType === "Mongo" || !newPartitionKey || newPartitionKey[0] === "/") { - return; - } - - this.partitionKey(`/${newPartitionKey}`); - }); - this.partitionKey.extend({ rateLimit: 100 }); - this.partitionKeyPattern = ko.pureComputed(() => { - if (userContext.apiType === "Gremlin") { - return "^/[^/]*"; - } - return ".*"; - }); - this.partitionKeyTitle = ko.pureComputed(() => { - if (userContext.apiType === "Gremlin") { - return "May not use composite partition key"; - } - return ""; - }); - - this.canExceedMaximumValue = ko.pureComputed(() => this.container.canExceedMaximumValue()); - - this.storage = ko.observable(); - this.throughputSinglePartition = editable.observable(); - this.throughputMultiPartition = editable.observable(); - this.throughputDatabase = editable.observable(); - this.collectionIdTitle = ko.observable(); - this.collectionWithThroughputInSharedTitle = ko.observable(); - this.maxThroughputRU = ko.observable(); - this.minThroughputRU = ko.observable(); - this.throughputSpendAckText = ko.observable(); - this.throughputSpendAck = ko.observable(false); - this.maxCollectionsReachedMessage = ko.observable(); - this.databaseHasSharedOffer = ko.observable(true); - this.throughputRangeText = ko.pureComputed(() => { - if (this.isAutoPilotSelected()) { - return AutoPilotUtils.getAutoPilotHeaderText(); - } - return `Throughput (${this.minThroughputRU().toLocaleString()} - ${this.maxThroughputRU().toLocaleString()} RU/s)`; - }); - this.sharedThroughputRangeText = ko.pureComputed(() => { - if (this.isSharedAutoPilotSelected()) { - return AutoPilotUtils.getAutoPilotHeaderText(); - } - return `Throughput (${this.minThroughputRU().toLocaleString()} - ${this.maxThroughputRU().toLocaleString()} RU/s)`; - }); - - this.databaseId(options.databaseId); - - this.requestUnitsUsageCost = ko.computed(() => { - const offerThroughput: number = this._getThroughput(); - if ( - offerThroughput < this.minThroughputRU() || - (offerThroughput > this.maxThroughputRU() && !this.canExceedMaximumValue()) - ) { - return ""; - } - - const { databaseAccount: account } = userContext; - if (!account) { - return ""; - } - - const regions = - (account && - account.properties && - account.properties.readLocations && - account.properties.readLocations.length) || - 1; - const multimaster = (account && account.properties && account.properties.enableMultipleWriteLocations) || false; - - let throughputSpendAckText: string; - let estimatedSpend: string; - if (!this.isSharedAutoPilotSelected()) { - throughputSpendAckText = PricingUtils.getEstimatedSpendAcknowledgeString( - offerThroughput, - userContext.portalEnv, - regions, - multimaster, - this.isSharedAutoPilotSelected() - ); - estimatedSpend = PricingUtils.getEstimatedSpendHtml( - offerThroughput, - userContext.portalEnv, - regions, - multimaster - ); - } else { - throughputSpendAckText = PricingUtils.getEstimatedSpendAcknowledgeString( - this.sharedAutoPilotThroughput(), - userContext.portalEnv, - regions, - multimaster, - this.isSharedAutoPilotSelected() - ); - estimatedSpend = PricingUtils.getEstimatedAutoscaleSpendHtml( - this.sharedAutoPilotThroughput(), - userContext.portalEnv, - regions, - multimaster - ); - } - // TODO: change throughputSpendAckText to be a computed value, instead of having this side effect - this.throughputSpendAckText(throughputSpendAckText); - return estimatedSpend; - }); - - this.dedicatedRequestUnitsUsageCost = ko.computed(() => { - const offerThroughput: number = this._getThroughput(); - if ( - offerThroughput < this.minThroughputRU() || - (offerThroughput > this.maxThroughputRU() && !this.canExceedMaximumValue()) - ) { - return ""; - } - - const { databaseAccount: account } = userContext; - if (!account) { - return ""; - } - - const regions = - (account && - account.properties && - account.properties.readLocations && - account.properties.readLocations.length) || - 1; - const multimaster = (account && account.properties && account.properties.enableMultipleWriteLocations) || false; - - let throughputSpendAckText: string; - let estimatedSpend: string; - if (!this.isAutoPilotSelected()) { - throughputSpendAckText = PricingUtils.getEstimatedSpendAcknowledgeString( - this.throughputMultiPartition(), - userContext.portalEnv, - regions, - multimaster, - this.isAutoPilotSelected() - ); - estimatedSpend = PricingUtils.getEstimatedSpendHtml( - this.throughputMultiPartition(), - userContext.portalEnv, - regions, - multimaster - ); - } else { - throughputSpendAckText = PricingUtils.getEstimatedSpendAcknowledgeString( - this.autoPilotThroughput(), - userContext.portalEnv, - regions, - multimaster, - this.isAutoPilotSelected() - ); - estimatedSpend = PricingUtils.getEstimatedAutoscaleSpendHtml( - this.autoPilotThroughput(), - userContext.portalEnv, - regions, - multimaster - ); - } - // TODO: change throughputSpendAckText to be a computed value, instead of having this side effect - this.throughputSpendAckText(throughputSpendAckText); - return estimatedSpend; - }); - - this.isTryCosmosDBSubscription = ko.observable(userContext.isTryCosmosDBSubscription || false); - - this.isTryCosmosDBSubscription.subscribe((isTryCosmosDB: boolean) => { - if (!!isTryCosmosDB) { - this.resetData(); - } - }); - - this.canRequestSupport = ko.pureComputed(() => { - if ( - configContext.platform !== Platform.Emulator && - !userContext.isTryCosmosDBSubscription && - configContext.platform !== Platform.Portal - ) { - const offerThroughput: number = this._getThroughput(); - return offerThroughput <= 100000; - } - - return false; - }); - - this.costsVisible = ko.pureComputed(() => { - return configContext.platform !== Platform.Emulator; - }); - - this.maxCollectionsReached = ko.computed(() => { - if (!this.isTryCosmosDBSubscription()) { - return false; - } - - const currentCollections = this.container - .databases() - .map((db: ViewModels.Database) => { - if (db.collections() && "length" in db.collections()) { - return db.collections().length; - } - - return 0; - }) - .reduce((totalCollections: number, collections: number) => { - return totalCollections + collections; - }, 0); - - const maxCollections = Constants.TryCosmosExperience.collectionsPerAccount; - - if (currentCollections >= maxCollections) { - let typeOfContainer = "collection"; - if (userContext.apiType === "Gremlin" || userContext.apiType === "Tables") { - typeOfContainer = "container"; - } - - this.maxCollectionsReachedMessage( - `You cannot create more than ${maxCollections} ${typeOfContainer}(s) during the Try Cosmos DB trial period.` - ); - return true; - } - - return false; - }); - - this.storage.subscribe(() => { - if (this.isFixedStorageSelected()) { - this.isAutoPilotSelected(false); - this.partitionKey(""); - } - this._updateThroughputLimitByStorage(); - }); - - // TODO: Create derived classes for Tables and Mongo to replace the If statements below - this.partitionKeyName = ko.computed(() => { - if (userContext.apiType === "Mongo") { - return "Shard key"; - } - - return "Partition key"; - }); - - this.lowerCasePartitionKeyName = ko.computed(() => this.partitionKeyName().toLowerCase()); - - this.partitionKeyPlaceholder = ko.computed(() => { - if (userContext.apiType === "Mongo") { - return "e.g., address.zipCode"; - } - - if (userContext.apiType === "Gremlin") { - return "e.g., /address"; - } - - return "e.g., /address/zipCode"; - }); - - this.uniqueKeysPlaceholder = ko.pureComputed(() => { - if (userContext.apiType === "Mongo") { - return "Comma separated paths e.g. firstName,address.zipCode"; - } - - return "Comma separated paths e.g. /firstName,/address/zipCode"; - }); - - this.uniqueKeysVisible = ko.pureComputed(() => { - if (userContext.apiType === "SQL") { - return true; - } - - return false; - }); - - this.partitionKeyVisible = ko.computed(() => { - if (this.container == null || userContext.apiType === "Tables") { - return false; - } - - if (userContext.apiType === "Mongo" && !this.isUnlimitedStorageSelected() && this.databaseHasSharedOffer()) { - return false; - } - - if (!this.isUnlimitedStorageSelected() && !this.databaseHasSharedOffer()) { - return false; - } - - return true; - }); - - this.throughputSpendAckVisible = ko.pureComputed(() => { - const autoscaleThroughput = this.autoPilotThroughput() * 1; - if (this.isAutoPilotSelected()) { - return autoscaleThroughput > SharedConstants.CollectionCreation.DefaultCollectionRUs100K; - } - const selectedThroughput: number = this._getThroughput(); - const maxRU: number = this.maxThroughputRU && this.maxThroughputRU(); - - const isMaxRUGreaterThanDefault: boolean = maxRU > SharedConstants.CollectionCreation.DefaultCollectionRUs100K; - const isThroughputSetGreaterThanDefault: boolean = - selectedThroughput > SharedConstants.CollectionCreation.DefaultCollectionRUs100K; - - if (this.canExceedMaximumValue()) { - return isThroughputSetGreaterThanDefault; - } - - return isThroughputSetGreaterThanDefault && isMaxRUGreaterThanDefault; - }); - - this.databaseCreateNew.subscribe((createNew: boolean) => { - if (!createNew) { - this.databaseCreateNewShared(this.getSharedThroughputDefault()); - } - }); - - this.databaseId.subscribe((selectedDatabaseId: string) => { - if (!selectedDatabaseId) { - return; - } - - if (!this.databaseCreateNew()) { - const selectedDatabase: ViewModels.Database = this.container - .databases() - .find((database: ViewModels.Database) => database.id() === selectedDatabaseId); - this.databaseHasSharedOffer(!!selectedDatabase?.offer()); - } - }); - - this.databaseCreateNewShared.subscribe((useShared: boolean) => { - this._updateThroughputLimitByStorage(); - this.databaseHasSharedOffer(useShared); - }); - - this.isAutoPilotSelected = ko.observable(false); - this.isSharedAutoPilotSelected = ko.observable(false); - this.autoPilotThroughput = ko.observable(AutoPilotUtils.minAutoPilotThroughput); - this.sharedAutoPilotThroughput = ko.observable(AutoPilotUtils.minAutoPilotThroughput); - this.autoPilotUsageCost = ko.pureComputed(() => { - const autoPilot = this._getAutoPilot(); - if (!autoPilot) { - return ""; - } - const isDatabaseThroughput: boolean = this.databaseCreateNewShared(); - return PricingUtils.getAutoPilotV3SpendHtml(autoPilot.maxThroughput, isDatabaseThroughput); - }); - - this.resetData(); - - this.freeTierExceedThroughputTooltip = ko.pureComputed(() => - this.isFreeTierAccount() && !this.container.isFirstResourceCreated() - ? "The first 400 RU/s in this account are free. Billing will apply to any throughput beyond 400 RU/s." - : "" - ); - - this.upsellMessage = ko.pureComputed(() => { - return PricingUtils.getUpsellMessage( - userContext.portalEnv, - this.isFreeTierAccount(), - this.container.isFirstResourceCreated(), - true - ); - }); - - this.upsellMessageAriaLabel = ko.pureComputed(() => { - return `${this.upsellMessage()}. Click ${this.isFreeTierAccount() ? "to learn more" : "for more details"}`; - }); - - this.upsellAnchorUrl = ko.pureComputed(() => { - return this.isFreeTierAccount() ? Constants.Urls.freeTierInformation : Constants.Urls.cosmosPricing; - }); - - this.upsellAnchorText = ko.pureComputed(() => { - return this.isFreeTierAccount() ? "Learn more" : "More details"; - }); - - this.displayCollectionThroughput = ko.computed(() => { - const createNewDatabase = this.databaseCreateNew(); - const useExisitingDatabaseWithThroughput = !this.databaseCreateNew() && this.databaseHasSharedOffer(); - const useExisitingDatabaseWithoutThroughput = !this.databaseCreateNew() && !this.databaseHasSharedOffer(); - const provisionDatabaseThroughputIsChecked = this.databaseCreateNewShared(); - const provisionDedicatedThroughputForContainerIsChecked = this.collectionWithThroughputInShared(); - - if (createNewDatabase && provisionDatabaseThroughputIsChecked) { - return false; - } - - if (createNewDatabase && !provisionDatabaseThroughputIsChecked) { - return true; - } - - if (useExisitingDatabaseWithThroughput && !provisionDedicatedThroughputForContainerIsChecked) { - return false; - } - - if (useExisitingDatabaseWithThroughput && provisionDedicatedThroughputForContainerIsChecked) { - return true; - } - - if (useExisitingDatabaseWithoutThroughput) { - return true; - } - - return false; - }); - - this.isFreeTierAccount = ko.computed(() => { - return userContext?.databaseAccount?.properties?.enableFreeTier; - }); - - this.showUpsellMessage = ko.pureComputed(() => { - if (this.container.isServerlessEnabled()) { - return false; - } - - if ( - this.isFreeTierAccount() && - !this.databaseCreateNew() && - this.databaseHasSharedOffer() && - !this.collectionWithThroughputInShared() - ) { - return false; - } - - return true; - }); - - this.showIndexingOptionsForSharedThroughput = ko.computed(() => { - const newDatabaseWithSharedOffer = this.databaseCreateNew() && this.databaseCreateNewShared(); - const existingDatabaseWithSharedOffer = !this.databaseCreateNew() && this.databaseHasSharedOffer(); - - if ((newDatabaseWithSharedOffer || existingDatabaseWithSharedOffer) && this.isFreeTierAccount()) { - return true; - } - - return false; - }); - - this.shouldUseDatabaseThroughput = ko.computed(() => { - // new database with shared offer - if (this.databaseCreateNew() && this.databaseCreateNewShared()) { - return true; - } - - // existing database with shared offer and not provisioning collection level throughput - if (!this.databaseCreateNew() && this.databaseHasSharedOffer() && !this.collectionWithThroughputInShared()) { - return true; - } - - return false; - }); - - this.isSynapseLinkSupported = ko.computed(() => { - if (configContext.platform === Platform.Emulator) { - return false; - } - - if (this.container.isServerlessEnabled()) { - return false; - } - - if (userContext.apiType === "SQL") { - return true; - } - - if (userContext.apiType === "Mongo") { - return true; - } - - if (userContext.apiType === "Cassandra" && this.container.hasStorageAnalyticsAfecFeature()) { - return true; - } - - return false; - }); - - this._isSynapseLinkEnabled = ko.computed(() => { - const databaseAccount = userContext?.databaseAccount || ({} as DataModels.DatabaseAccount); - const properties = databaseAccount.properties || ({} as DataModels.DatabaseAccountExtendedProperties); - - // TODO: remove check for capability once all accounts have been migrated - const capabilities = properties.capabilities || ([] as DataModels.Capability[]); - if (capabilities.some((capability) => capability.name === Constants.CapabilityNames.EnableStorageAnalytics)) { - return true; - } - - const enableAnalyticalStorage: boolean = properties.enableAnalyticalStorage; - if (enableAnalyticalStorage) { - return true; - } - - return false; - }); - - this.showEnableSynapseLink = ko.computed(() => { - return this.isSynapseLinkSupported() && !this._isSynapseLinkEnabled(); - }); - - this.showAnalyticalStore = ko.computed(() => { - return this.isSynapseLinkSupported() && this._isSynapseLinkEnabled(); - }); - - this.isAnalyticalStorageOn = ko.observable(this._isSynapseLinkEnabled()); - - this._isSynapseLinkEnabled.subscribe((isSynapseLinkEnabled: boolean) => { - this.isAnalyticalStorageOn(isSynapseLinkEnabled); - }); - - this.isSynapseLinkUpdating = ko.computed(() => this.container.isSynapseLinkUpdating()); - - this.useIndexingForSharedThroughput.subscribe((value) => { - TelemetryProcessor.traceMark(Action.ModifyOptionForThroughputWithSharedDatabase, { - changedSelectedValueTo: value ? ActionModifiers.IndexAll : ActionModifiers.NoIndex, - }); - }); - - this.isEnableMongoCapabilityEnabled = ko.observable(isCapabilityEnabled("EnableMongo")); - - this.shouldCreateMongoWildcardIndex = ko.observable(this.container.isMongoIndexingEnabled()); - } - - public getSharedThroughputDefault(): boolean { - const { subscriptionType } = userContext; - if (subscriptionType === SubscriptionType.EA || this.container.isServerlessEnabled()) { - return false; - } - - return true; - } - - public onMoreDetailsKeyPress = (source: any, event: KeyboardEvent): boolean => { - if (event.keyCode === Constants.KeyCodes.Space || event.keyCode === Constants.KeyCodes.Enter) { - this.showErrorDetails(); - return false; - } - return true; - }; - - public async open(databaseId?: string) { - super.open(); - // TODO: Figure out if a database level partition split is about to happen once shared throughput read is available - this.formWarnings(""); - this.databaseCreateNewShared(this.getSharedThroughputDefault()); - this.shouldCreateMongoWildcardIndex(this.container.isMongoIndexingEnabled()); - if (!this.container.isServerlessEnabled()) { - this.isAutoPilotSelected(this.container.isAutoscaleDefaultEnabled()); - this.isSharedAutoPilotSelected(this.container.isAutoscaleDefaultEnabled()); - } - if (this.isPreferredApiTable() && !databaseId) { - databaseId = SharedConstants.CollectionCreation.TablesAPIDefaultDatabase; - } - - this.databaseCreateNew(!databaseId); - this.collectionWithThroughputInShared(false); - this.databaseId(databaseId); - - const addCollectionPaneOpenMessage = { - collection: ko.toJS({ - id: this.collectionId(), - storage: this.storage(), - offerThroughput: this._getThroughput(), - partitionKey: this.partitionKey(), - databaseId: this.databaseId(), - }), - subscriptionType: userContext.subscriptionType, - subscriptionQuotaId: userContext.quotaId, - defaultsCheck: { - storage: this.storage() === Constants.BackendDefaults.singlePartitionStorageInGb ? "f" : "u", - throughput: this._getThroughput(), - flight: userContext.addCollectionFlight, - }, - dataExplorerArea: Constants.Areas.ContextualPane, - }; - - await this.container.loadDatabaseOffers(); - this._onDatabasesChange(this.container.databases()); - this._setFocus(); - - TelemetryProcessor.trace(Action.CreateCollection, ActionModifiers.Open, addCollectionPaneOpenMessage); - } - - private transferFocus(elementIdToKeepVisible: string, elementIdToFocus: string): void { - document.getElementById(elementIdToKeepVisible).style.visibility = "visible"; - document.getElementById(elementIdToFocus).focus(); - } - - private onFocusOut(_: any, event: any): void { - event.target.parentElement.style.visibility = ""; - } - - private onMouseOut(_: any, event: any): void { - event.target.style.visibility = ""; - } - - private onKeyDown(previousActiveElementId: string, _: any, event: KeyboardEvent): boolean { - if (event.shiftKey && event.keyCode == Constants.KeyCodes.Tab) { - document.getElementById(previousActiveElementId).focus(); - return false; - } else { - // Execute default action - return true; - } - } - - private isMongo(): boolean { - return userContext.apiType === "Mongo"; - } - - private _onDatabasesChange(newDatabaseIds: ViewModels.Database[]) { - this.databaseIds(newDatabaseIds?.map((database: ViewModels.Database) => database.id())); - } - - private _computeOfferThroughput(): number { - if (!this.canConfigureThroughput()) { - return undefined; - } - - // return undefined if autopilot is selected for the new database/collection - if (this.databaseCreateNew()) { - // database is shared and autopilot is sleected for the database - if (this.databaseCreateNewShared() && this.isSharedAutoPilotSelected()) { - return undefined; - } - // database is not shared and autopilot is selected for the collection - if (!this.databaseCreateNewShared() && this.isAutoPilotSelected()) { - return undefined; - } - } - - return this._getThroughput(); - } - - public submit() { - if (!this.isValid()) { - return; - } - - if (userContext.apiType === "Tables") { - // Table require fixed Database: TablesDB, and fixed Partition Key: /'$pk' - this.databaseId(SharedConstants.CollectionCreation.TablesAPIDefaultDatabase); - this.partitionKey("/'$pk'"); - } - - let partitionKeyPath: string = this.partitionKey(); - const uniqueKeyPolicy: DataModels.UniqueKeyPolicy = this._getUniqueKeyPolicy(); - const offerThroughput: number = this._computeOfferThroughput(); - - let partitionKeyVersion: number = this.largePartitionKey() ? 2 : undefined; - let partitionKey: DataModels.PartitionKey = partitionKeyPath.trim() - ? { - paths: [partitionKeyPath], - kind: Constants.BackendDefaults.partitionKeyKind, - version: partitionKeyVersion, - } - : null; - const autoPilot: DataModels.AutoPilotCreationSettings = this._getAutoPilot(); - - const addCollectionPaneStartMessage = { - database: ko.toJS({ - id: this.databaseId(), - new: this.databaseCreateNew(), - shared: this.databaseHasSharedOffer(), - }), - offerThroughput: offerThroughput, - offerAutopilot: autoPilot, - collection: ko.toJS({ - id: this.collectionId(), - storage: this.storage(), - partitionKey, - uniqueKeyPolicy, - collectionWithThroughputInShared: this.collectionWithThroughputInShared(), - }), - subscriptionType: userContext.subscriptionType, - subscriptionQuotaId: userContext.quotaId, - defaultsCheck: { - storage: this.storage() === Constants.BackendDefaults.singlePartitionStorageInGb ? "f" : "u", - throughput: offerThroughput, - flight: userContext.addCollectionFlight, - }, - dataExplorerArea: Constants.Areas.ContextualPane, - useIndexingForSharedThroughput: this.useIndexingForSharedThroughput(), - }; - const startKey: number = TelemetryProcessor.traceStart(Action.CreateCollection, addCollectionPaneStartMessage); - - let databaseId: string = this.databaseCreateNew() ? this.databaseId().trim() : this.databaseId(); - let collectionId: string = this.collectionId().trim(); - - let indexingPolicy: DataModels.IndexingPolicy; - let createMongoWildcardIndex: boolean; - // todo - remove mongo indexing policy ticket # 616274 - if (userContext.apiType === "Mongo") { - createMongoWildcardIndex = this.shouldCreateMongoWildcardIndex(); - } else if (this.showIndexingOptionsForSharedThroughput()) { - if (this.useIndexingForSharedThroughput()) { - indexingPolicy = SharedConstants.IndexingPolicies.AllPropertiesIndexed; - } else { - indexingPolicy = SharedConstants.IndexingPolicies.SharedDatabaseDefault; - } - } else { - indexingPolicy = SharedConstants.IndexingPolicies.AllPropertiesIndexed; - } - - this.formErrors(""); - this.isExecuting(true); - - const databaseLevelThroughput: boolean = this.databaseCreateNew() - ? this.databaseCreateNewShared() - : this.databaseHasSharedOffer() && !this.collectionWithThroughputInShared(); - const autoPilotMaxThroughput: number = databaseLevelThroughput - ? this.isSharedAutoPilotSelected() && this.sharedAutoPilotThroughput() - : this.isAutoPilotSelected() && this.autoPilotThroughput(); - const createCollectionParams: DataModels.CreateCollectionParams = { - createNewDatabase: this.databaseCreateNew(), - collectionId, - databaseId, - databaseLevelThroughput, - offerThroughput, - analyticalStorageTtl: this._getAnalyticalStorageTtl(), - autoPilotMaxThroughput, - indexingPolicy, - partitionKey, - uniqueKeyPolicy, - createMongoWildcardIndex, - }; - - createCollection(createCollectionParams).then( - () => { - this.isExecuting(false); - this.close(); - this.container.refreshAllDatabases(); - const addCollectionPaneSuccessMessage = { - database: ko.toJS({ - id: this.databaseId(), - new: this.databaseCreateNew(), - shared: this.databaseHasSharedOffer(), - }), - offerThroughput, - collection: ko.toJS({ - id: this.collectionId(), - storage: this.storage(), - partitionKey, - uniqueKeyPolicy, - collectionWithThroughputInShared: this.collectionWithThroughputInShared(), - }), - subscriptionType: userContext.subscriptionType, - subscriptionQuotaId: userContext.quotaId, - defaultsCheck: { - storage: this.storage() === Constants.BackendDefaults.singlePartitionStorageInGb ? "f" : "u", - throughput: offerThroughput, - flight: userContext.addCollectionFlight, - }, - dataExplorerArea: Constants.Areas.ContextualPane, - }; - TelemetryProcessor.traceSuccess(Action.CreateCollection, addCollectionPaneSuccessMessage, startKey); - this.resetData(); - this.container.refreshAllDatabases(); - }, - (error: any) => { - this.isExecuting(false); - const errorMessage: string = getErrorMessage(error); - this.formErrors(errorMessage); - this.formErrorsDetails(errorMessage); - const addCollectionPaneFailedMessage = { - database: ko.toJS({ - id: this.databaseId(), - new: this.databaseCreateNew(), - shared: this.databaseHasSharedOffer(), - }), - offerThroughput: offerThroughput, - collection: { - id: this.collectionId(), - storage: this.storage(), - partitionKey, - uniqueKeyPolicy, - collectionWithThroughputInShared: this.collectionWithThroughputInShared(), - }, - subscriptionType: userContext.subscriptionType, - subscriptionQuotaId: userContext.quotaId, - defaultsCheck: { - storage: this.storage() === Constants.BackendDefaults.singlePartitionStorageInGb ? "f" : "u", - throughput: offerThroughput, - flight: userContext.addCollectionFlight, - }, - dataExplorerArea: Constants.Areas.ContextualPane, - error: errorMessage, - errorStack: getErrorStack(error), - }; - TelemetryProcessor.traceFailure(Action.CreateCollection, addCollectionPaneFailedMessage, startKey); - } - ); - } - - public resetData() { - this.collectionId(""); - this.databaseId(""); - this.partitionKey(""); - this.throughputSpendAck(false); - if (!this.container.isServerlessEnabled()) { - this.isAutoPilotSelected(this.container.isAutoscaleDefaultEnabled()); - this.isSharedAutoPilotSelected(this.container.isAutoscaleDefaultEnabled()); - } - this.autoPilotThroughput(AutoPilotUtils.minAutoPilotThroughput); - this.sharedAutoPilotThroughput(AutoPilotUtils.minAutoPilotThroughput); - - this.shouldCreateMongoWildcardIndex = ko.observable(this.container.isMongoIndexingEnabled()); - - this.uniqueKeys([]); - this.useIndexingForSharedThroughput(true); - - const defaultStorage = this.container.collectionCreationDefaults.storage; - this.storage(defaultStorage); - - const defaultThroughput = this.container.collectionCreationDefaults.throughput; - this.throughputSinglePartition(defaultThroughput.fixed); - this.throughputMultiPartition( - AddCollectionUtility.getMaxThroughput(this.container.collectionCreationDefaults, this.container) - ); - - this.throughputDatabase(defaultThroughput.shared); - this.databaseCreateNew(true); - this.databaseHasSharedOffer(this.getSharedThroughputDefault()); - this.collectionWithThroughputInShared(false); - this.databaseCreateNewShared(this.getSharedThroughputDefault()); - if (this.isTryCosmosDBSubscription()) { - this._resetDataForTryCosmosDB(); - } - - this.largePartitionKey(false); - - this._updateThroughputLimitByStorage(); - super.resetData(); - } - - public isNonTableApi = (): boolean => { - return userContext.apiType !== "Tables"; - }; - - public isUnlimitedStorageSelected = (): boolean => { - return this.storage() === Constants.BackendDefaults.multiPartitionStorageInGb; - }; - - public isFixedStorageSelected = (): boolean => { - return this.storage() === Constants.BackendDefaults.singlePartitionStorageInGb; - }; - - public onStorageOptionsKeyDown(source: any, event: KeyboardEvent): boolean { - if (event.keyCode === Constants.KeyCodes.RightArrow) { - this.storage(Constants.BackendDefaults.multiPartitionStorageInGb); - return false; - } - - if (event.keyCode === Constants.KeyCodes.LeftArrow) { - this.storage(Constants.BackendDefaults.singlePartitionStorageInGb); - return false; - } - - return true; - } - - public onEnableSynapseLinkButtonClicked() { - this.container.openEnableSynapseLinkDialog(); - } - - public ttl90DaysEnabled: () => boolean = () => userContext.features.ttl90Days; - - public isValid(): boolean { - // TODO add feature flag that disables validation for customers with custom accounts - if ((this.databaseCreateNewShared() && this.isSharedAutoPilotSelected()) || this.isAutoPilotSelected()) { - const autoPilot = this._getAutoPilot(); - if ( - !autoPilot || - !autoPilot.maxThroughput || - !AutoPilotUtils.isValidAutoPilotThroughput(autoPilot.maxThroughput) - ) { - this.formErrors( - `Please enter a value greater than ${AutoPilotUtils.minAutoPilotThroughput} for autopilot throughput` - ); - return false; - } - } - - const throughput = this._getThroughput(); - if (throughput > SharedConstants.CollectionCreation.DefaultCollectionRUs100K && !this.throughputSpendAck()) { - this.formErrors(`Please acknowledge the estimated daily spend.`); - return false; - } - - if (userContext.apiType === "Gremlin" && (this.partitionKey() === "/id" || this.partitionKey() === "/label")) { - this.formErrors("/id and /label as partition keys are not allowed for graph."); - return false; - } - - const autoscaleThroughput = this.autoPilotThroughput() * 1; - - if ( - this.isAutoPilotSelected() && - autoscaleThroughput > SharedConstants.CollectionCreation.DefaultCollectionRUs100K && - !this.throughputSpendAck() - ) { - this.formErrors(`Please acknowledge the estimated monthly spend.`); - return false; - } - - return true; - } - - private _setFocus() { - // Autofocus is enabled on AddCollectionPane based on the preferred API - if (userContext.apiType === "Tables") { - const focusTableId = document.getElementById("containerId"); - focusTableId && focusTableId.focus(); - return; - } - - if (this.databaseCreateNew()) { - const focusDatabaseId = document.getElementById("databaseId"); - focusDatabaseId && focusDatabaseId.focus(); - return; - } - - const focusExistingDatabaseId = document.getElementById("containerId"); - focusExistingDatabaseId && focusExistingDatabaseId.focus(); - } - - private _getThroughput(): number { - let throughput: number = - this.storage() === Constants.BackendDefaults.singlePartitionStorageInGb - ? this.throughputSinglePartition() - : this.throughputMultiPartition(); - if (this.databaseHasSharedOffer()) { - if (this.collectionWithThroughputInShared()) { - throughput = this.throughputMultiPartition(); - } else { - throughput = this.throughputDatabase(); - } - } - - return isNaN(throughput) ? 0 : Number(throughput); - } - - private _getAutoPilot(): DataModels.AutoPilotCreationSettings { - if (this.databaseCreateNewShared() && this.isSharedAutoPilotSelected() && this.sharedAutoPilotThroughput()) { - return { - maxThroughput: this.sharedAutoPilotThroughput() * 1, - }; - } - if (this.isAutoPilotSelected() && this.autoPilotThroughput()) { - return { - maxThroughput: this.autoPilotThroughput() * 1, - }; - } - - return undefined; - } - - private _calculateNumberOfPartitions(): number { - // Note: this will not validate properly on accounts that have been set up for custom partitioning, - // but there is no way to know the number of partitions for that case. - return this.storage() === Constants.BackendDefaults.singlePartitionStorageInGb - ? SharedConstants.CollectionCreation.NumberOfPartitionsInFixedCollection - : SharedConstants.CollectionCreation.NumberOfPartitionsInUnlimitedCollection; - } - - private _convertShardKeyToPartitionKey(shardKey: string): string { - if (!shardKey) { - return shardKey; - } - - const shardKeyParts = shardKey.split("."); - let partitionKey = shardKeyParts.join("/"); - - if (partitionKey[0] !== "/") { - partitionKey = "/" + partitionKey; - } - return partitionKey; - } - - private _resetDataForTryCosmosDB() { - this.storage(Constants.BackendDefaults.multiPartitionStorageInGb); - this.throughputSinglePartition(Constants.TryCosmosExperience.defaultRU); - this.throughputDatabase(SharedConstants.CollectionCreation.DefaultCollectionRUs400); - } - - private _updateThroughputLimitByStorage() { - if (this.databaseCreateNewShared()) { - this._updateThroughputLimitByDatabase(); - } else { - this._updateThroughputLimitByCollectionStorage(); - } - } - - private _updateThroughputLimitByCollectionStorage() { - const storage = this.storage(); - const minThroughputRU = - storage === SharedConstants.CollectionCreation.storage10Gb - ? SharedConstants.CollectionCreation.DefaultCollectionRUs400 - : this.container.collectionCreationDefaults.throughput.unlimitedmin; - - let maxThroughputRU; - if (this.isTryCosmosDBSubscription()) { - maxThroughputRU = Constants.TryCosmosExperience.maxRU; - } else { - maxThroughputRU = - storage === SharedConstants.CollectionCreation.storage10Gb - ? SharedConstants.CollectionCreation.DefaultCollectionRUs10K - : this.container.collectionCreationDefaults.throughput.unlimitedmax; - } - - this.minThroughputRU(minThroughputRU); - this.maxThroughputRU(maxThroughputRU); - } - - private _updateThroughputLimitByDatabase() { - const defaultThruoghput = this.container.collectionCreationDefaults.throughput; - this.maxThroughputRU(defaultThruoghput.unlimitedmax); - this.minThroughputRU(defaultThruoghput.unlimitedmin); - } - - /** - * Obtains the UniqueKeyPolicy and applies transformations for Mongo APIs - */ - private _getUniqueKeyPolicy(): DataModels.UniqueKeyPolicy { - let transform = (value: string) => { - return value; - }; - if (userContext.apiType === "Mongo") { - transform = (value: string) => { - return this._convertShardKeyToPartitionKey(value); - }; - } - - return this._parseUniqueIndexes(transform); - } - - /** - * Obtains the current added unique keys and applies cleaning, removing spaces and empty entries - * @param transform Transformation process for each detected key - */ - private _parseUniqueIndexes(transform: (value: string) => string): DataModels.UniqueKeyPolicy { - if (this.uniqueKeys().length === 0) { - return null; - } - - const uniqueKeyPolicy: DataModels.UniqueKeyPolicy = { uniqueKeys: [] }; - this.uniqueKeys().forEach((uniqueIndexPaths: DynamicListItem) => { - const uniqueIndexPathValue: string = uniqueIndexPaths.value(); - if (!!uniqueIndexPathValue && uniqueIndexPathValue.length > 0) { - const validPaths: string[] = _.filter( - uniqueIndexPathValue.split(","), - (path: string) => !!path && path.length > 0 - ); - const cleanedUpPaths: string[] = validPaths.map((path: string) => { - return transform(path.trim()); - }); - if (cleanedUpPaths.length > 0) { - const uniqueKey: DataModels.UniqueKey = { paths: cleanedUpPaths }; - uniqueKeyPolicy.uniqueKeys.push(uniqueKey); - } - } - }); - - return uniqueKeyPolicy; - } - - private _getAnalyticalStorageTtl(): number { - if (!this.showAnalyticalStore()) { - return undefined; - } - - if (this.isAnalyticalStorageOn()) { - // TODO: always default to 90 days once the backend hotfix is deployed - return userContext.features.ttl90Days - ? Constants.AnalyticalStorageTtl.Days90 - : Constants.AnalyticalStorageTtl.Infinite; - } - - return Constants.AnalyticalStorageTtl.Disabled; - } -} diff --git a/src/Explorer/Panes/DeleteCollectionConfirmationPane/__snapshots__/DeleteCollectionConfirmationPane.test.tsx.snap b/src/Explorer/Panes/DeleteCollectionConfirmationPane/__snapshots__/DeleteCollectionConfirmationPane.test.tsx.snap index d0082d724..2cf3a5962 100644 --- a/src/Explorer/Panes/DeleteCollectionConfirmationPane/__snapshots__/DeleteCollectionConfirmationPane.test.tsx.snap +++ b/src/Explorer/Panes/DeleteCollectionConfirmationPane/__snapshots__/DeleteCollectionConfirmationPane.test.tsx.snap @@ -1099,7 +1099,7 @@ exports[`Delete Collection Confirmation Pane submit() should call delete collect > - + @@ -1190,7 +1190,7 @@ exports[`Delete Collection Confirmation Pane submit() should call delete collect variant="small" > Confirm by typing the container @@ -1494,18 +1494,18 @@ exports[`Delete Collection Confirmation Pane submit() should call delete collect value="" >
Help us improve Azure Cosmos DB! @@ -1538,7 +1538,7 @@ exports[`Delete Collection Confirmation Pane submit() should call delete collect variant="small" > What is the reason why you are deleting this container @@ -1844,17 +1844,17 @@ exports[`Delete Collection Confirmation Pane submit() should call delete collect value="" >