diff --git a/package-lock.json b/package-lock.json index 72b8ba4..46383bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,10 +7,11 @@ "": { "name": "gridmerge-app", "version": "0.1.0", + "license": "MPL-2.0", "dependencies": { "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", - "@gridsuite/commons-ui": "0.41.0", + "@gridsuite/commons-ui": "^0.42.0", "@mui/icons-material": "^5.5.1", "@mui/lab": "^5.0.0-alpha.75", "@mui/material": "^5.5.3", @@ -27,6 +28,7 @@ "prop-types": "^15.7.2", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-hook-form": "^7.48.2", "react-intl": "^6.0.0", "react-redux": "^8.0.0", "react-router-dom": "^6.0.0", @@ -38,15 +40,14 @@ "reconnecting-websocket": "^4.4.0", "redux": "^4.0.5", "typeface-roboto": "^1.0.0", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "yup": "^1.3.2" }, "devDependencies": { "eslint-config-prettier": "^8.0.0", "eslint-plugin-prettier": "^4.0.0", "http-proxy-middleware": "^2.0.0", - "prettier": "^2.0.5", - "react-hook-form": "^7.48.2", - "yup": "^1.3.2" + "prettier": "^2.0.5" } }, "node_modules/@ampproject/remapping": { @@ -2578,9 +2579,9 @@ } }, "node_modules/@gridsuite/commons-ui": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@gridsuite/commons-ui/-/commons-ui-0.41.0.tgz", - "integrity": "sha512-GxRZBWhvXxVKgXAg6HIWX+t2UpCTdgkKlnwjceLY5FxaZcBCaNAISzz7HNGYtAvj3gePNlKGSeGNNQcoOe9pRA==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@gridsuite/commons-ui/-/commons-ui-0.42.0.tgz", + "integrity": "sha512-v8b52OEMGmyDNvosXpnC/Q8HXPY6v93g2qFKr6NB46ubKmADB1Q0fcKoopHg8/fbcFrkdvcGUFpWpHdqZ5fPog==", "dependencies": { "autosuggest-highlight": "^3.2.0", "clsx": "^1.0.4", @@ -14852,8 +14853,7 @@ "node_modules/property-expr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", - "dev": true + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -15160,7 +15160,6 @@ "version": "7.48.2", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.48.2.tgz", "integrity": "sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==", - "dev": true, "engines": { "node": ">=12.22.0" }, @@ -17041,8 +17040,7 @@ "node_modules/tiny-case": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", - "dev": true + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" }, "node_modules/tiny-warning": { "version": "1.0.3", @@ -17102,8 +17100,7 @@ "node_modules/toposort": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", - "dev": true + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" }, "node_modules/tough-cookie": { "version": "4.1.2", @@ -18415,7 +18412,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/yup/-/yup-1.3.2.tgz", "integrity": "sha512-6KCM971iQtJ+/KUaHdrhVr2LDkfhBtFPRnsG1P8F4q3uUVQ2RfEM9xekpha9aA4GXWJevjM10eDcPQ1FfWlmaQ==", - "dev": true, "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", @@ -18427,7 +18423,6 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, "engines": { "node": ">=12.20" }, diff --git a/package.json b/package.json index 194edaf..339729e 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { "name": "gridmerge-app", "version": "0.1.0", + "license": "MPL-2.0", "homepage": ".", "private": true, "dependencies": { "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", - "@gridsuite/commons-ui": "0.41.0", + "@gridsuite/commons-ui": "^0.42.0", "@mui/icons-material": "^5.5.1", "@mui/lab": "^5.0.0-alpha.75", "@mui/material": "^5.5.3", diff --git a/src/components/app-top-bar.js b/src/components/app-top-bar.js index dcf30eb..e450131 100644 --- a/src/components/app-top-bar.js +++ b/src/components/app-top-bar.js @@ -9,7 +9,12 @@ import { LIGHT_THEME, logout, TopBar } from '@gridsuite/commons-ui'; import Parameters, { useParameterState } from './parameters'; import { PARAM_LANGUAGE, PARAM_THEME } from '../utils/config-params'; import { useDispatch, useSelector } from 'react-redux'; -import { fetchAppsAndUrls, fetchMergeConfigs } from '../utils/rest-api'; +import { + fetchAppsAndUrls, + fetchMergeConfigs, + fetchVersion, + getServersInfos, +} from '../utils/rest-api'; import PropTypes from 'prop-types'; import { useNavigate, useMatch } from 'react-router-dom'; import { ReactComponent as GridMergeLogoLight } from '../images/GridMerge_logo_light.svg'; @@ -19,6 +24,7 @@ import { FormattedMessage } from 'react-intl'; import ProcessesConfigurationDialog from './processes-configuration-dialog'; import { makeStyles } from '@mui/styles'; import { initProcesses } from '../redux/actions'; +import AppPackage from '../../package.json'; export const PREFIX_URL_PROCESSES = '/processes'; @@ -81,26 +87,6 @@ const AppTopBar = ({ user, userManager }) => { return index !== -1 ? matchProcess.params.processName : false; }, [configs, matchProcess]); - function toggleTab(newTabValue) { - navigate(PREFIX_URL_PROCESSES + '/' + newTabValue); - } - - function showParametersClicked() { - setShowParameters(true); - } - - function hideParameters() { - setShowParameters(false); - } - - function onLogoClicked() { - navigate('/', { replace: true }); - } - - const showPopupConfigurationProcesses = () => { - setShowConfigurationProcesses(true); - }; - return ( <> { ) } - onParametersClick={() => showParametersClicked()} + appVersion={AppPackage.version} + appLicense={AppPackage.license} + onParametersClick={() => setShowParameters(true)} onLogoutClick={() => logout(dispatch, userManager.instance)} - onLogoClick={() => onLogoClicked()} + onLogoClick={() => navigate('/', { replace: true })} user={user} appsAndUrls={appsAndUrls} onThemeClick={handleChangeTheme} theme={themeLocal} - onAboutClick={() => console.debug('about')} onLanguageClick={handleChangeLanguage} language={languageLocal} + getGlobalVersion={(setGlobalVersion) => + fetchVersion() + .then((res) => setGlobalVersion(res.deployVersion)) + .catch((reason) => { + console.error( + 'Error while fetching the version : ' + reason + ); + setGlobalVersion(null); + }) + } + getAdditionalModules={(setServers) => + getServersInfos() + .then((res) => + setServers( + Object.entries(res).map(([name, infos]) => ({ + name: + infos?.build?.name || + infos?.build?.artifact || + name, + type: 'server', + version: infos?.build?.version, + gitTag: + infos?.git?.tags || + infos?.git?.commit?.id[ + 'describe-short' + ], + })) + ) + ) + .catch((reason) => { + console.error( + 'Error while fetching the servers infos : ' + + reason + ); + setServers(null); + }) + } > toggleTab(newValue)} + onChange={(event, newValue) => + navigate(PREFIX_URL_PROCESSES + '/' + newValue) + } aria-label="parameters" className={classes.process} > @@ -145,7 +171,7 @@ const AppTopBar = ({ user, userManager }) => { <> @@ -161,7 +187,7 @@ const AppTopBar = ({ user, userManager }) => { setShowParameters(false)} /> ); diff --git a/src/utils/rest-api.js b/src/utils/rest-api.js index bc7403a..61c8492 100644 --- a/src/utils/rest-api.js +++ b/src/utils/rest-api.js @@ -21,6 +21,7 @@ const PREFIX_CONFIG_NOTIFICATION_WS = process.env.REACT_APP_WS_GATEWAY + '/config-notification'; const PREFIX_CONFIG_QUERIES = process.env.REACT_APP_API_GATEWAY + '/config'; const PREFIX_BOUNDARY_QUERIES = process.env.REACT_APP_API_GATEWAY + '/boundary'; +const PREFIX_STUDY_QUERIES = process.env.REACT_APP_API_GATEWAY + '/study'; function getToken() { const state = store.getState(); @@ -234,44 +235,48 @@ export function getExportMergeUrl(processUuid, date, format) { return getUrlWithToken(url); } +function fetchEnv() { + return fetch('env.json').then((res) => res.json()); +} + export function fetchAuthorizationCodeFlowFeatureFlag() { console.info(`Fetching authorization code flow feature flag...`); - return fetch('env.json') + return fetchEnv() + .then((res) => + fetch(res.appsMetadataServerUrl + '/authentication.json') + ) .then((res) => res.json()) .then((res) => { - return fetch(res.appsMetadataServerUrl + '/authentication.json') - .then((res) => res.json()) - .then((res) => { - console.log( - `Authorization code flow is ${ - res.authorizationCodeFlowFeatureFlag - ? 'enabled' - : 'disabled' - }` - ); - return res.authorizationCodeFlowFeatureFlag; - }) - .catch((error) => { - console.error(error); - console.warn( - `Something wrong happened when retrieving authentication.json: authorization code flow will be disabled` - ); - return false; - }); + console.log( + `Authorization code flow is ${ + res.authorizationCodeFlowFeatureFlag + ? 'enabled' + : 'disabled' + }` + ); + return res.authorizationCodeFlowFeatureFlag; + }) + .catch((error) => { + console.error(error); + console.warn( + `Something wrong happened when retrieving authentication.json: authorization code flow will be disabled` + ); + return false; }); } export function fetchAppsAndUrls() { console.info(`Fetching apps and urls...`); - return fetch('env.json') - .then((res) => res.json()) - .then((res) => { - return fetch( - res.appsMetadataServerUrl + '/apps-metadata.json' - ).then((response) => { - return response.json(); - }); - }); + return fetchEnv() + .then((env) => fetch(env.appsMetadataServerUrl + '/apps-metadata.json')) + .then((response) => response.json()); +} + +export function fetchVersion() { + console.info(`Fetching global metadata...`); + return fetchEnv() + .then((env) => fetch(env.appsMetadataServerUrl + '/version.json')) + .then((response) => response.json()); } /** @@ -464,3 +469,8 @@ export const MergeType = PropTypes.shape({ }) ), }); + +export function getServersInfos() { + console.info('get backend servers informations'); + return backendFetchJson(PREFIX_STUDY_QUERIES + '/v1/servers/infos'); +}