diff --git a/web/html/src/manager/admin/setup/products/products.tsx b/web/html/src/manager/admin/setup/products/products.tsx
index acfecc88f055..8d56c755d2ae 100644
--- a/web/html/src/manager/admin/setup/products/products.tsx
+++ b/web/html/src/manager/admin/setup/products/products.tsx
@@ -16,11 +16,11 @@ import { SectionToolbar } from "components/section-toolbar/section-toolbar";
import { CustomDataHandler } from "components/table/CustomDataHandler";
import { SearchField } from "components/table/SearchField";
import { Toggler } from "components/toggler";
-import { HelpLink } from "components/utils/HelpLink";
import { DEPRECATED_unsafeEquals } from "utils/legacy";
import Network from "utils/network";
+import { SetupHeader } from "../setup-header";
import { searchCriteriaInExtension } from "./products.utils";
import { SCCDialog } from "./products-scc-dialog";
@@ -41,33 +41,6 @@ const messageMap = {
const _DATA_ROOT_ID = "baseProducts";
-const _SETUP_WIZARD_STEPS = [
- {
- id: "wizard-step-proxy",
- label: "HTTP Proxy",
- url: "/rhn/admin/setup/ProxySettings.do",
- active: false,
- },
- {
- id: "wizard-step-credentials",
- label: "Organization Credentials",
- url: "/rhn/admin/setup/MirrorCredentials.do",
- active: false,
- },
- {
- id: "wizard-step-suse-products",
- label: "Products",
- url: window.location.href.split(/\?|#/)[0],
- active: true,
- },
- {
- id: "wizard-step-suse-payg",
- label: "PAYG Connections",
- url: "/rhn/manager/admin/setup/payg",
- active: false,
- },
-];
-
const _PRODUCT_STATUS = {
installed: "INSTALLED",
available: "AVAILABLE",
@@ -304,32 +277,6 @@ class ProductsPageWrapper extends React.Component {
};
render() {
- const title = (
-
-
-
-
- {t("Setup Wizard")}
-
-
-
-
- );
-
- const tabs = (
-
- );
-
let pageContent;
if (this.state.refreshRunning) {
pageContent = (
@@ -448,8 +395,7 @@ class ProductsPageWrapper extends React.Component {
return (
- {title}
- {tabs}
+
{pageContent}
);
diff --git a/web/html/src/branding/img/http-proxy.png b/web/html/src/manager/admin/setup/proxy/http-proxy.png
similarity index 100%
rename from web/html/src/branding/img/http-proxy.png
rename to web/html/src/manager/admin/setup/proxy/http-proxy.png
diff --git a/web/html/src/manager/admin/setup/proxy/proxy-settings.ts b/web/html/src/manager/admin/setup/proxy/proxy-settings.ts
new file mode 100644
index 000000000000..5aca9fa57e7f
--- /dev/null
+++ b/web/html/src/manager/admin/setup/proxy/proxy-settings.ts
@@ -0,0 +1,5 @@
+export type ProxySettings = {
+ hostname: string | null;
+ username: string | null;
+ password: string | null;
+};
diff --git a/web/html/src/manager/admin/setup/proxy/proxy.renderer.tsx b/web/html/src/manager/admin/setup/proxy/proxy.renderer.tsx
new file mode 100644
index 000000000000..fed07372836f
--- /dev/null
+++ b/web/html/src/manager/admin/setup/proxy/proxy.renderer.tsx
@@ -0,0 +1,23 @@
+import * as React from "react";
+
+import { RolesProvider } from "core/auth/roles-context";
+import SpaRenderer from "core/spa/spa-renderer";
+
+import { MessagesContainer } from "components/toastr";
+
+import Proxy from "./proxy";
+import { ProxySettings } from "./proxy-settings";
+
+type Props = {
+ proxySettings: ProxySettings;
+};
+
+export const renderer = (id: string, props: Props) => {
+ SpaRenderer.renderNavigationReact(
+
+
+
+ ,
+ document.getElementById(id)
+ );
+};
diff --git a/web/html/src/manager/admin/setup/proxy/proxy.tsx b/web/html/src/manager/admin/setup/proxy/proxy.tsx
new file mode 100644
index 000000000000..fcfb06fcb7c4
--- /dev/null
+++ b/web/html/src/manager/admin/setup/proxy/proxy.tsx
@@ -0,0 +1,143 @@
+import { useState } from "react";
+
+import { Form, Password, Text } from "components/input";
+import { Panel } from "components/panels/Panel";
+
+import Network from "utils/network";
+
+import { SetupHeader } from "../setup-header";
+import img from "./http-proxy.png";
+import { ProxySettings } from "./proxy-settings";
+import { ProxyVerification } from "./verification";
+
+type Props = {
+ proxySettings: Readonly
;
+};
+
+export default (props: Props) => {
+ const propsHasValues = Boolean(
+ props.proxySettings.hostname || props.proxySettings.username || props.proxySettings.password
+ );
+ const [isEditing, setIsEditing] = useState(!propsHasValues);
+
+ // The current form value that the user is editing
+ const [settings, setSettings] = useState({
+ ...props.proxySettings,
+ });
+ // The last value that we know was successfully saved, used if the user hits cancel
+ const [savedSettings, setSavedSettings] = useState(
+ propsHasValues ? { ...props.proxySettings } : undefined
+ );
+
+ const saveSettings = async (newSettings: typeof settings) => {
+ try {
+ const response = await Network.post("/rhn/ajax/save-proxy-settings", newSettings);
+ setSettings({ ...response });
+ setSavedSettings({ ...response });
+ setIsEditing(false);
+ } catch (error) {
+ // TODO: Show the error as a toast
+ Loggerhead.error(error);
+ }
+ };
+
+ const footer = (
+
+
+ {isEditing ? (
+
+ ) : (
+
+ )}
+
+
+ {isEditing ? (
+
+ ) : null}
+
+
+ );
+
+ const passwordPlaceholder = propsHasValues && !isEditing ? "●".repeat(8) : t("Password");
+
+ return (
+
+
+
+
+
+

+
{t("HTTP Proxy")}
+
+ {t(
+ "If this server uses an HTTP proxy to access the outside network, you can use this form to configure it. If that is not the case, move on to Organization Credentials.",
+ {
+ link: (text: string) => (
+
+ {text}
+
+ ),
+ }
+ )}
+
+
+
+
+ );
+};
diff --git a/web/html/src/manager/admin/setup/proxy/verification.tsx b/web/html/src/manager/admin/setup/proxy/verification.tsx
new file mode 100644
index 000000000000..f249f8f728bd
--- /dev/null
+++ b/web/html/src/manager/admin/setup/proxy/verification.tsx
@@ -0,0 +1,68 @@
+import { useState } from "react";
+
+import { useAsyncEffect } from "@etheryte/react-hooks";
+
+import Network from "utils/network";
+
+import { ProxySettings } from "./proxy-settings";
+
+enum Verification {
+ Unknown,
+ Verifying,
+ Valid,
+ Invalid,
+}
+
+type Props = {
+ savedSettings?: ProxySettings;
+};
+
+export const ProxyVerification = (props: Props) => {
+ const [verification, setVerification] = useState(Verification.Unknown);
+ const [isUpdate, setIsUpdate] = useState(false);
+
+ useAsyncEffect(
+ async (isStale) => {
+ // On first render, whatever we have is the value the server gave us, so we don't need to bust cache
+ const forceRefresh = isUpdate;
+ setIsUpdate(true);
+
+ if (!props.savedSettings) {
+ setVerification(Verification.Unknown);
+ return;
+ }
+
+ try {
+ setVerification(Verification.Verifying);
+ const result = await Network.post("/rhn/ajax/verify-proxy-settings", {
+ forceRefresh,
+ });
+ if (isStale()) {
+ return;
+ }
+
+ const valid = JSON.parse(result);
+ if (valid) {
+ setVerification(Verification.Valid);
+ } else {
+ setVerification(Verification.Invalid);
+ }
+ } catch (error) {
+ setVerification(Verification.Invalid);
+ Loggerhead.error(error);
+ }
+ },
+ [props.savedSettings]
+ );
+
+ if (verification === Verification.Verifying) {
+ return {t("Verifying proxy settings")}
;
+ }
+ if (verification === Verification.Valid) {
+ return {t("Successfully verified proxy settings")}
;
+ }
+ if (verification === Verification.Invalid) {
+ return {t("Proxy settings are not valid")}
;
+ }
+ return null;
+};
diff --git a/web/html/src/manager/admin/setup/setup-header.tsx b/web/html/src/manager/admin/setup/setup-header.tsx
new file mode 100644
index 000000000000..aca57c4a5b57
--- /dev/null
+++ b/web/html/src/manager/admin/setup/setup-header.tsx
@@ -0,0 +1,47 @@
+import { HelpLink } from "components/utils";
+
+export const SetupHeader = () => {
+ const SETUP_STEPS = [
+ {
+ id: "wizard-step-proxy",
+ label: t("HTTP Proxy"),
+ url: "/rhn/manager/admin/setup/proxy",
+ },
+ {
+ id: "wizard-step-credentials",
+ label: t("Organization Credentials"),
+ url: "/rhn/admin/setup/MirrorCredentials.do",
+ },
+ {
+ id: "wizard-step-suse-products",
+ label: t("Products"),
+ url: "/rhn/manager/admin/setup/products",
+ },
+ {
+ id: "wizard-step-suse-payg",
+ label: t("PAYG Connections"),
+ url: "/rhn/manager/admin/setup/payg",
+ },
+ ];
+
+ return (
+ <>
+
+
+ {t("Setup Wizard")}
+
+
+
+ >
+ );
+};
diff --git a/web/html/src/manager/index.ts b/web/html/src/manager/index.ts
index b912e0abf358..c1bb5f609e43 100644
--- a/web/html/src/manager/index.ts
+++ b/web/html/src/manager/index.ts
@@ -66,7 +66,9 @@ window.spaImportReactPage = function spaImportReactPage(pageName) {
SpaRenderer.addReactApp(pageName);
if (!pages[pageName]) {
- throw new RangeError(`Found no page with name "${pageName}", did you bind the renderer in \`pages\`?`);
+ throw new RangeError(
+ `Found no page with name "${pageName}", did you add the renderer to \`pages\` in \`web/html/src/manager/index.ts\`?`
+ );
}
return pages[pageName]();
diff --git a/web/html/src/package.json b/web/html/src/package.json
index e390c7cfbc3c..5f12bdda07c4 100644
--- a/web/html/src/package.json
+++ b/web/html/src/package.json
@@ -59,6 +59,7 @@
"@babel/preset-env": "7.16.7",
"@babel/preset-react": "7.16.7",
"@babel/preset-typescript": "7.16.7",
+ "@etheryte/react-hooks": "2.0.4",
"@formatjs/intl": "^2.9.0",
"@fullcalendar/core": "5.5.0",
"@fullcalendar/daygrid": "5.5.0",
diff --git a/web/html/src/vendors/npm.licenses.structured.js b/web/html/src/vendors/npm.licenses.structured.js
index 1b13c48a8bb7..0600313f832c 100644
--- a/web/html/src/vendors/npm.licenses.structured.js
+++ b/web/html/src/vendors/npm.licenses.structured.js
@@ -1 +1 @@
-const npmLicensesArray=["MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","ISC","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","(MPL-2.0 OR Apache-2.0)","BSD-3-Clause","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","0BSD","MIT","MIT","MIT"],npmDependencies=[{name:"@babel/polyfill",license:"MIT",version:"7.7.0"},{name:"@babel/runtime",license:"MIT",version:"7.16.3"},{name:"@emotion/cache",license:"MIT",version:"11.11.0"},{name:"@emotion/hash",license:"MIT",version:"0.9.1"},{name:"@emotion/memoize",license:"MIT",version:"0.8.1"},{name:"@emotion/react",license:"MIT",version:"11.11.1"},{name:"@emotion/serialize",license:"MIT",version:"1.1.2"},{name:"@emotion/sheet",license:"MIT",version:"1.2.2"},{name:"@emotion/unitless",license:"MIT",version:"0.8.1"},{name:"@emotion/use-insertion-effect-with-fallbacks",license:"MIT",version:"1.0.1"},{name:"@emotion/utils",license:"MIT",version:"1.2.1"},{name:"@emotion/weak-memoize",license:"MIT",version:"0.3.1"},{name:"@formatjs/ecma402-abstract",license:"MIT",version:"1.17.0"},{name:"@formatjs/fast-memoize",license:"MIT",version:"2.2.0"},{name:"@formatjs/icu-messageformat-parser",license:"MIT",version:"2.6.0"},{name:"@formatjs/icu-skeleton-parser",license:"MIT",version:"1.6.0"},{name:"@formatjs/intl",license:"MIT",version:"2.9.0"},{name:"@formatjs/intl-localematcher",license:"MIT",version:"0.4.0"},{name:"@fullcalendar/common",license:"MIT",version:"5.5.1"},{name:"@fullcalendar/core",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/daygrid",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/interaction",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/react",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/timegrid",license:"MIT",version:"5.5.0"},{name:"@hot-loader/react-dom",license:"MIT",version:"17.0.1+4.13.0"},{name:"@popperjs/core",license:"MIT",version:"2.11.6"},{name:"@seznam/compose-react-refs",license:"ISC",version:"1.0.6"},{name:"@virtuoso.dev/react-urx",license:"MIT",version:"0.2.12"},{name:"@virtuoso.dev/urx",license:"MIT",version:"0.2.12"},{name:"babel-loader",license:"MIT",version:"8.2.2"},{name:"classnames",license:"MIT",version:"2.3.1"},{name:"core-js",license:"MIT",version:"3.8.1"},{name:"css-loader",license:"MIT",version:"6.10.0"},{name:"date-fns",license:"MIT",version:"2.29.3"},{name:"dom-helpers",license:"MIT",version:"5.1.4"},{name:"dompurify",license:"(MPL-2.0 OR Apache-2.0)",version:"3.1.7"},{name:"exenv",license:"BSD-3-Clause",version:"1.2.2"},{name:"hoist-non-react-statics",license:"BSD-3-Clause",version:"3.3.2"},{name:"html-dom-parser",license:"MIT",version:"0.2.3"},{name:"html-react-parser",license:"MIT",version:"0.10.0"},{name:"immer",license:"MIT",version:"9.0.6"},{name:"inline-style-parser",license:"MIT",version:"0.1.1"},{name:"intl-messageformat",license:"BSD-3-Clause",version:"10.5.0"},{name:"jexl",license:"MIT",version:"2.2.2"},{name:"lodash",license:"MIT",version:"4.17.21"},{name:"lodash.get",license:"MIT",version:"4.4.2"},{name:"memoize-one",license:"MIT",version:"5.2.1"},{name:"metal",license:"BSD-3-Clause",version:"2.16.8"},{name:"metal-ajax",license:"BSD",version:"2.1.1"},{name:"metal-debounce",license:"BSD",version:"2.0.2"},{name:"metal-dom",license:"BSD",version:"2.16.8"},{name:"metal-events",license:"BSD",version:"2.16.8"},{name:"metal-path-parser",license:"BSD",version:"1.0.4"},{name:"metal-promise",license:"BSD",version:"2.0.1"},{name:"metal-structs",license:"BSD",version:"1.0.2"},{name:"metal-uri",license:"BSD",version:"2.4.0"},{name:"metal-useragent",license:"BSD",version:"3.0.1"},{name:"mini-css-extract-plugin",license:"MIT",version:"2.6.0"},{name:"moment",license:"MIT",version:"2.29.4"},{name:"moment-timezone",license:"MIT",version:"0.5.35"},{name:"node-gettext",license:"MIT",version:"3.0.0"},{name:"object-assign",license:"MIT",version:"4.1.1"},{name:"postcss-loader",license:"MIT",version:"8.1.0"},{name:"prop-types",license:"MIT",version:"15.7.2"},{name:"react",license:"MIT",version:"16.14.0"},{name:"react-datepicker",license:"MIT",version:"4.5.0"},{name:"react-fast-compare",license:"MIT",version:"3.2.0"},{name:"react-hot-loader",license:"MIT",version:"4.13.0"},{name:"react-input-autosize",license:"MIT",version:"3.0.0"},{name:"react-is",license:"MIT",version:"16.12.0"},{name:"react-is-mounted-hook",license:"MIT",version:"1.1.2"},{name:"react-lifecycles-compat",license:"MIT",version:"3.0.4"},{name:"react-modal",license:"MIT",version:"3.13.1"},{name:"react-onclickoutside",license:"MIT",version:"6.12.2"},{name:"react-popper",license:"MIT",version:"2.3.0"},{name:"react-property",license:"MIT",version:"1.0.1"},{name:"react-select",license:"MIT",version:"4.3.1"},{name:"react-select-async-paginate",license:"MIT",version:"0.6.0"},{name:"react-toastify",license:"MIT",version:"6.0.5"},{name:"react-transition-group",license:"BSD-3-Clause",version:"4.4.2"},{name:"react-virtuoso",license:"MIT",version:"2.5.1"},{name:"regenerator-runtime",license:"MIT",version:"0.13.5"},{name:"sass-loader",license:"MIT",version:"14.1.0"},{name:"scheduler",license:"MIT",version:"0.20.1"},{name:"senna",license:"BSD-3-Clause",version:"2.7.9"},{name:"sleep-promise",license:"MIT",version:"9.1.0"},{name:"style-loader",license:"MIT",version:"3.3.4"},{name:"style-to-object",license:"MIT",version:"0.3.0"},{name:"stylis",license:"MIT",version:"4.2.0"},{name:"tslib",license:"0BSD",version:"2.1.0"},{name:"use-immer",license:"MIT",version:"0.3.5"},{name:"validator",license:"MIT",version:"13.7.0"},{name:"warning",license:"MIT",version:"4.0.3"}];module.exports={npmLicensesArray,npmDependencies};
\ No newline at end of file
+const npmLicensesArray=["MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","ISC","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","(MPL-2.0 OR Apache-2.0)","BSD-3-Clause","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","BSD","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","BSD-3-Clause","MIT","MIT","MIT","MIT","0BSD","MIT","MIT","MIT"],npmDependencies=[{name:"@babel/polyfill",license:"MIT",version:"7.7.0"},{name:"@babel/runtime",license:"MIT",version:"7.16.3"},{name:"@emotion/cache",license:"MIT",version:"11.11.0"},{name:"@emotion/hash",license:"MIT",version:"0.9.1"},{name:"@emotion/memoize",license:"MIT",version:"0.8.1"},{name:"@emotion/react",license:"MIT",version:"11.11.1"},{name:"@emotion/serialize",license:"MIT",version:"1.1.2"},{name:"@emotion/sheet",license:"MIT",version:"1.2.2"},{name:"@emotion/unitless",license:"MIT",version:"0.8.1"},{name:"@emotion/use-insertion-effect-with-fallbacks",license:"MIT",version:"1.0.1"},{name:"@emotion/utils",license:"MIT",version:"1.2.1"},{name:"@emotion/weak-memoize",license:"MIT",version:"0.3.1"},{name:"@etheryte/react-hooks",license:"",version:"2.0.4"},{name:"@formatjs/ecma402-abstract",license:"MIT",version:"1.17.0"},{name:"@formatjs/fast-memoize",license:"MIT",version:"2.2.0"},{name:"@formatjs/icu-messageformat-parser",license:"MIT",version:"2.6.0"},{name:"@formatjs/icu-skeleton-parser",license:"MIT",version:"1.6.0"},{name:"@formatjs/intl",license:"MIT",version:"2.9.0"},{name:"@formatjs/intl-localematcher",license:"MIT",version:"0.4.0"},{name:"@fullcalendar/common",license:"MIT",version:"5.5.1"},{name:"@fullcalendar/core",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/daygrid",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/interaction",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/react",license:"MIT",version:"5.5.0"},{name:"@fullcalendar/timegrid",license:"MIT",version:"5.5.0"},{name:"@hot-loader/react-dom",license:"MIT",version:"17.0.1+4.13.0"},{name:"@popperjs/core",license:"MIT",version:"2.11.6"},{name:"@seznam/compose-react-refs",license:"ISC",version:"1.0.6"},{name:"@virtuoso.dev/react-urx",license:"MIT",version:"0.2.12"},{name:"@virtuoso.dev/urx",license:"MIT",version:"0.2.12"},{name:"babel-loader",license:"MIT",version:"8.2.2"},{name:"classnames",license:"MIT",version:"2.3.1"},{name:"core-js",license:"MIT",version:"3.8.1"},{name:"css-loader",license:"MIT",version:"6.10.0"},{name:"date-fns",license:"MIT",version:"2.29.3"},{name:"dom-helpers",license:"MIT",version:"5.1.4"},{name:"dompurify",license:"(MPL-2.0 OR Apache-2.0)",version:"3.1.7"},{name:"exenv",license:"BSD-3-Clause",version:"1.2.2"},{name:"hoist-non-react-statics",license:"BSD-3-Clause",version:"3.3.2"},{name:"html-dom-parser",license:"MIT",version:"0.2.3"},{name:"html-react-parser",license:"MIT",version:"0.10.0"},{name:"immer",license:"MIT",version:"9.0.6"},{name:"inline-style-parser",license:"MIT",version:"0.1.1"},{name:"intl-messageformat",license:"BSD-3-Clause",version:"10.5.0"},{name:"jexl",license:"MIT",version:"2.2.2"},{name:"lodash",license:"MIT",version:"4.17.21"},{name:"lodash.get",license:"MIT",version:"4.4.2"},{name:"memoize-one",license:"MIT",version:"5.2.1"},{name:"metal",license:"BSD-3-Clause",version:"2.16.8"},{name:"metal-ajax",license:"BSD",version:"2.1.1"},{name:"metal-debounce",license:"BSD",version:"2.0.2"},{name:"metal-dom",license:"BSD",version:"2.16.8"},{name:"metal-events",license:"BSD",version:"2.16.8"},{name:"metal-path-parser",license:"BSD",version:"1.0.4"},{name:"metal-promise",license:"BSD",version:"2.0.1"},{name:"metal-structs",license:"BSD",version:"1.0.2"},{name:"metal-uri",license:"BSD",version:"2.4.0"},{name:"metal-useragent",license:"BSD",version:"3.0.1"},{name:"mini-css-extract-plugin",license:"MIT",version:"2.6.0"},{name:"moment",license:"MIT",version:"2.29.4"},{name:"moment-timezone",license:"MIT",version:"0.5.35"},{name:"node-gettext",license:"MIT",version:"3.0.0"},{name:"object-assign",license:"MIT",version:"4.1.1"},{name:"postcss-loader",license:"MIT",version:"8.1.0"},{name:"prop-types",license:"MIT",version:"15.7.2"},{name:"react",license:"MIT",version:"16.14.0"},{name:"react-datepicker",license:"MIT",version:"4.5.0"},{name:"react-fast-compare",license:"MIT",version:"3.2.0"},{name:"react-hot-loader",license:"MIT",version:"4.13.0"},{name:"react-input-autosize",license:"MIT",version:"3.0.0"},{name:"react-is",license:"MIT",version:"16.12.0"},{name:"react-is-mounted-hook",license:"MIT",version:"1.1.2"},{name:"react-lifecycles-compat",license:"MIT",version:"3.0.4"},{name:"react-modal",license:"MIT",version:"3.13.1"},{name:"react-onclickoutside",license:"MIT",version:"6.12.2"},{name:"react-popper",license:"MIT",version:"2.3.0"},{name:"react-property",license:"MIT",version:"1.0.1"},{name:"react-select",license:"MIT",version:"4.3.1"},{name:"react-select-async-paginate",license:"MIT",version:"0.6.0"},{name:"react-toastify",license:"MIT",version:"6.0.5"},{name:"react-transition-group",license:"BSD-3-Clause",version:"4.4.2"},{name:"react-virtuoso",license:"MIT",version:"2.5.1"},{name:"regenerator-runtime",license:"MIT",version:"0.13.5"},{name:"sass-loader",license:"MIT",version:"14.1.0"},{name:"scheduler",license:"MIT",version:"0.20.1"},{name:"senna",license:"BSD-3-Clause",version:"2.7.9"},{name:"sleep-promise",license:"MIT",version:"9.1.0"},{name:"style-loader",license:"MIT",version:"3.3.4"},{name:"style-to-object",license:"MIT",version:"0.3.0"},{name:"stylis",license:"MIT",version:"4.2.0"},{name:"tslib",license:"0BSD",version:"2.1.0"},{name:"use-immer",license:"MIT",version:"0.3.5"},{name:"validator",license:"MIT",version:"13.7.0"},{name:"warning",license:"MIT",version:"4.0.3"}];module.exports={npmLicensesArray,npmDependencies};
\ No newline at end of file
diff --git a/web/html/src/vendors/npm.licenses.txt b/web/html/src/vendors/npm.licenses.txt
index 209f5cf32809..099bc9d50945 100644
--- a/web/html/src/vendors/npm.licenses.txt
+++ b/web/html/src/vendors/npm.licenses.txt
@@ -340,6 +340,13 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+--------------------------------------------------------------------------------
+@etheryte/react-hooks v2.0.4 - Etheryte
+git+https://github.com/Etheryte/react-hooks.git
+--------------------------------------------------------------------------------
+
+
+
--------------------------------------------------------------------------------
@formatjs/ecma402-abstract v1.17.0 - Long Ho