diff --git a/.gitignore b/.gitignore index 671a4b83e..349500c11 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,5 @@ yarn-error.log* # Cohort360 specific .env* !.env.example -.mp4 \ No newline at end of file +.mp4 +public/config.dev.json \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 13adbdf32..5a83bec70 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -5,88 +5,8 @@ set -e sed -i "s@{FHIR_URL}@$FHIR_URL@g" /etc/nginx/conf.d/nginx.conf sed -i "s@{BACK_URL}@$BACK_URL@g" /etc/nginx/conf.d/nginx.conf -# Replace all {MY_ENV_VAR} with the real MY_ENV_VAR defined in CI/CD. -sed -i "s@{VITE_BACK_API_URL}@$VITE_BACK_API_URL@g" /app/build/assets/*.js -sed -i "s@{VITE_REQUEST_API_URL}@$VITE_REQUEST_API_URL@g" /app/build/assets/*.js -sed -i "s@{VITE_FHIR_API_URL}@$VITE_FHIR_API_URL@g" /app/build/assets/*.js -sed -i "s@{VITE_SOCKET_API_URL}@$VITE_SOCKET_API_URL@g" /app/build/assets/*.js -sed -i "s@{VITE_OIDC_PROVIDER_URL}@$VITE_OIDC_PROVIDER_URL@g" /app/build/assets/*.js -sed -i "s@{VITE_OIDC_REDIRECT_URI}@$VITE_OIDC_REDIRECT_URI@g" /app/build/assets/*.js -sed -i "s@{VITE_OIDC_RESPONSE_TYPE}@$VITE_OIDC_RESPONSE_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_OIDC_CLIENT_ID}@$VITE_OIDC_CLIENT_ID@g" /app/build/assets/*.js -sed -i "s@{VITE_OIDC_SCOPE}@$VITE_OIDC_SCOPE@g" /app/build/assets/*.js -sed -i "s@{VITE_OIDC_STATE}@$VITE_OIDC_STATE@g" /app/build/assets/*.js -sed -i "s@{VITE_AUTH_API_URL}@$VITE_AUTH_API_URL@g" /app/build/assets/*.js -sed -i "s@{VITE_PERIMETER_SOURCE_TYPE_HIERARCHY}@$VITE_PERIMETER_SOURCE_TYPE_HIERARCHY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_CLAIM_HIERARCHY}@$VITE_VALUE_SET_URL_CLAIM_HIERARCHY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_CONDITION_HIERARCHY}@$VITE_VALUE_SET_URL_CONDITION_HIERARCHY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_CONDITION_STATUS}@$VITE_VALUE_SET_URL_CONDITION_STATUS@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_PROCEDURE_HIERARCHY}@$VITE_VALUE_SET_URL_PROCEDURE_HIERARCHY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_DEMOGRAPHIC_GENDER}@$VITE_VALUE_SET_URL_DEMOGRAPHIC_GENDER@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_ADMISSION_MODE}@$VITE_VALUE_SET_URL_ENCOUNTER_ADMISSION_MODE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_ENTRY_MODE}@$VITE_VALUE_SET_URL_ENCOUNTER_ENTRY_MODE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_EXIT_MODE}@$VITE_VALUE_SET_URL_ENCOUNTER_EXIT_MODE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_VISIT_TYPE}@$VITE_VALUE_SET_URL_ENCOUNTER_VISIT_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_SEJOUR_TYPE}@$VITE_VALUE_SET_URL_ENCOUNTER_SEJOUR_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_FILE_STATUS}@$VITE_VALUE_SET_URL_ENCOUNTER_FILE_STATUS@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_EXIT_TYPE}@$VITE_VALUE_SET_URL_ENCOUNTER_EXIT_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_DESTINATION}@$VITE_VALUE_SET_URL_ENCOUNTER_DESTINATION@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_PROVENANCE}@$VITE_VALUE_SET_URL_ENCOUNTER_PROVENANCE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_ADMISSION}@$VITE_VALUE_SET_URL_ENCOUNTER_ADMISSION@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ENCOUNTER_STATUS}@$VITE_VALUE_SET_URL_ENCOUNTER_STATUS@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_MEDICATION_ATC}@$VITE_VALUE_SET_URL_MEDICATION_ATC@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_MEDICATION_UCD}@$VITE_VALUE_SET_URL_MEDICATION_UCD@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_MEDICATION_PRESCRIPTION_TYPES}@$VITE_VALUE_SET_URL_MEDICATION_PRESCRIPTION_TYPES@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_MEDICATION_ADMINISTRATIONS}@$VITE_VALUE_SET_URL_MEDICATION_ADMINISTRATIONS@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_IMAGING_MODALITIES}@$VITE_VALUE_SET_URL_IMAGING_MODALITIES@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_IMAGING_STUDY_UID}@$VITE_VALUE_SET_URL_IMAGING_STUDY_UID@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_BIOLOGY_ANABIO}@$VITE_VALUE_SET_URL_BIOLOGY_ANABIO@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_BIOLOGY_LOINC}@$VITE_VALUE_SET_URL_BIOLOGY_LOINC@g" /app/build/assets/*.js -sed -i "s@{VITE_MEDICATION_ATC_ORBIS}@$VITE_MEDICATION_ATC_ORBIS@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_PREGNANCY_MODE}@$VITE_VALUE_SET_URL_PREGNANCY_MODE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_MATERNAL_RISKS}@$VITE_VALUE_SET_URL_MATERNAL_RISKS@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_RISKSRELATEDTOOBSTETRICHISTORY}@$VITE_VALUE_SET_URL_RISKSRELATEDTOOBSTETRICHISTORY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_RISKSORCOMPLICATIONSOFPREGNANCY}@$VITE_VALUE_SET_URL_RISKSORCOMPLICATIONSOFPREGNANCY@g" /app/build/assets/*.js - -sed -i "s@{VITE_VALUE_SET_URL_CHIRURGICAL_GESTURE}@$VITE_VALUE_SET_URL_CHIRURGICAL_GESTURE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_CHILD_BIRTH_MODE}@$VITE_VALUE_SET_URL_CHILD_BIRTH_MODE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_MATURATION_REASON}@$VITE_VALUE_SET_URL_MATURATION_REASON@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_MATURATION_MODALITY}@$VITE_VALUE_SET_URL_MATURATION_MODALITY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_IMG_INDICATION}@$VITE_VALUE_SET_URL_IMG_INDICATION@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_LABOR_OR_CESAREAN_ENTRY}@$VITE_VALUE_SET_URL_LABOR_OR_CESAREAN_ENTRY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_PATHOLOGY_DURING_LABOR}@$VITE_VALUE_SET_URL_PATHOLOGY_DURING_LABOR@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_OBSTETRICAL_GESTURE_DURING_LABOR}@$VITE_VALUE_SET_URL_OBSTETRICAL_GESTURE_DURING_LABOR@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_ANALGESIE_TYPE}@$VITE_VALUE_SET_URL_ANALGESIE_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_BIRTH_DELIVERY_WAY}@$VITE_VALUE_SET_URL_BIRTH_DELIVERY_WAY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_INSTRUMENT_TYPE}@$VITE_VALUE_SET_URL_INSTRUMENT_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_C_SECTION_MODALITY}@$VITE_VALUE_SET_URL_C_SECTION_MODALITY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_PRESENTATION_AT_DELIVERY}@$VITE_VALUE_SET_URL_PRESENTATION_AT_DELIVERY@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_CONDITION_PERINEUM}@$VITE_VALUE_SET_URL_CONDITION_PERINEUM@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_EXIT_PLACE_TYPE}@$VITE_VALUE_SET_URL_EXIT_PLACE_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_FEEDING_TYPE}@$VITE_VALUE_SET_URL_FEEDING_TYPE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_EXIT_FEEDING_MODE}@$VITE_VALUE_SET_URL_EXIT_FEEDING_MODE@g" /app/build/assets/*.js -sed -i "s@{VITE_VALUE_SET_URL_EXIT_DIAGNOSTIC}@$VITE_VALUE_SET_URL_EXIT_DIAGNOSTIC@g" /app/build/assets/*.js - -sed -i "s@{VITE_MAIL_SUPPORT}@$VITE_MAIL_SUPPORT@g" /app/build/assets/*.js -sed -i "s@{VITE_EXPORT_TABLE_LIMIT}@$VITE_EXPORT_TABLE_LIMIT@g" /app/build/assets/*.js -sed -i "s@{VITE_CODE_DISPLAY_JWT}@$VITE_CODE_DISPLAY_JWT@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_BIOLOGY}@$VITE_ODD_BIOLOGY@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_COMPOSITION}@$VITE_ODD_COMPOSITION@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_PROCEDURE}@$VITE_ODD_PROCEDURE@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_CLAIM}@$VITE_ODD_CLAIM@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_CONDITION}@$VITE_ODD_CONDITION@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_OBSERVATION}@$VITE_ODD_OBSERVATION@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_MEDICATION}@$VITE_ODD_MEDICATION@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_CONTACT}@$VITE_ODD_CONTACT@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_EXPORT}@$VITE_ODD_EXPORT@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_IMAGING}@$VITE_ODD_IMAGING@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_FEASABILITY_REPORT}@$VITE_ODD_FEASABILITY_REPORT@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_QUESTIONNAIRE}@$VITE_ODD_QUESTIONNAIRE@g" /app/build/assets/*.js -sed -i "s@{VITE_JTOOL_USERS}@$VITE_JTOOL_USERS@g" /app/build/assets/*.js -sed -i "s@{VITE_ODD_MAP}@$VITE_ODD_MAP@g" /app/build/assets/*.js sed -i "s@{VITE_CLARITY_APP_ID}@$VITE_CLARITY_APP_ID@g" /app/build/index.html -sed -i "s@{VITE_USER_TRACKING_BLACKLIST}@$VITE_USER_TRACKING_BLACKLIST@g" /app/build/assets/*.js # Restart nginx to apply changes service nginx restart diff --git a/package-lock.json b/package-lock.json index bf64a83ad..44d0a887c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,7 @@ "moment": "^2.29.3", "prop-types": "^15.8.1", "querystring-es3": "^0.2.1", + "ramda": "^0.30.1", "react": "^18.2.0", "react-ace": "^10.1.0", "react-app-rewired": "^2.2.1", @@ -68,6 +69,7 @@ "@types/leaflet": "^1.9.12", "@types/lodash": "^4.14.191", "@types/node": "^18.15.7", + "@types/ramda": "^0.30.2", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", "@types/react-html-parser": "^2.0.2", @@ -7608,6 +7610,15 @@ "license": "MIT", "peer": true }, + "node_modules/@types/ramda": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.30.2.tgz", + "integrity": "sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==", + "dev": true, + "dependencies": { + "types-ramda": "^0.30.1" + } + }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", @@ -23372,6 +23383,15 @@ "performance-now": "^2.1.0" } }, + "node_modules/ramda": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", + "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -26591,6 +26611,12 @@ "node": ">=8" } }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "dev": true + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -26808,6 +26834,15 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/types-ramda": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", + "integrity": "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==", + "dev": true, + "dependencies": { + "ts-toolbelt": "^9.6.0" + } + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", diff --git a/package.json b/package.json index 850c9cb35..182dbf65e 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,6 @@ "private": true, "type": "module", "dependencies": { - "@apollo/client": "^3.7.10", - "@apollo/react-hooks": "^4.0.0", "@date-io/moment": "^2.16.1", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", @@ -17,7 +15,6 @@ "@types/redux-state-sync": "^3.1.5", "ace-builds": "^1.16.0", "antlr4": "^4.13.1-patch-1", - "apollo-boost": "^0.4.9", "axios": "^1.6.0", "buffer": "^6.0.3", "client-oauth2": "^4.2.4", @@ -31,6 +28,7 @@ "moment": "^2.29.3", "prop-types": "^15.8.1", "querystring-es3": "^0.2.1", + "ramda": "^0.30.1", "react": "^18.2.0", "react-ace": "^10.1.0", "react-app-rewired": "^2.2.1", @@ -90,6 +88,7 @@ "@types/leaflet": "^1.9.12", "@types/lodash": "^4.14.191", "@types/node": "^18.15.7", + "@types/ramda": "^0.30.2", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", "@types/react-html-parser": "^2.0.2", diff --git a/src/App.tsx b/src/App.tsx index 36ee49fa8..fe1850f04 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,5 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import { ApolloProvider } from '@apollo/react-hooks' -import { ApolloClient, InMemoryCache } from '@apollo/client' import { Provider } from 'react-redux' import { PersistGate } from 'redux-persist/es/integration/react' import MomentUtils from '@date-io/moment' @@ -13,26 +11,17 @@ import AppNavigation from './components/Routes/AppNavigation/AppNavigation' import { store, persistor } from './state/store' -import { AUTH_API_URL } from './constants' - import 'moment/dist/locale/fr' -const authClient = new ApolloClient({ - cache: new InMemoryCache(), - uri: AUTH_API_URL -}) - moment.locale('fr') const App = () => ( - - + - - + diff --git a/src/components/CohortsTable/index.tsx b/src/components/CohortsTable/index.tsx index 807610c16..4630f0d81 100644 --- a/src/components/CohortsTable/index.tsx +++ b/src/components/CohortsTable/index.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useContext, useState } from 'react' import { useNavigate } from 'react-router-dom' import { @@ -46,10 +46,9 @@ import { Cohort, CohortJobStatus } from 'types' import displayDigit from 'utils/displayDigit' -import { ODD_EXPORT } from '../../constants' - import useStyles from './styles' import { Direction, Order, OrderBy } from 'types/searchCriterias' +import { AppConfig } from 'config' type FavStarProps = { favorite?: boolean @@ -89,6 +88,7 @@ const ResearchTable: React.FC = ({ const dispatch = useAppDispatch() const navigate = useNavigate() + const appConfig = useContext(AppConfig) const [dialogOpen, setOpenDialog] = useState(false) const [selectedCohort, setSelectedCohort] = useState() const [selectedExportableCohort, setSelectedExportableCohort] = useState() @@ -257,7 +257,7 @@ const ResearchTable: React.FC = ({ {data?.map((row: Cohort) => { - const canExportThisCohort = !!ODD_EXPORT ? row?.rights?.export_csv_nomi : false + const canExportThisCohort = !!appConfig.features.export.enabled ? row?.rights?.export_csv_nomi : false return ( = ({ - {!!ODD_EXPORT && ( + {!!appConfig.features.export.enabled && ( void @@ -69,6 +69,7 @@ const ControlPanel: React.FC<{ }> = ({ onExecute, onUndo, onRedo }) => { const { classes, cx } = useStyle() const dispatch = useAppDispatch() + const appConfig = useContext(AppConfig) const [openModal, onSetOpenModal] = useState<'executeCohortConfirmation' | null>(null) const [oldCount, setOldCount] = useState(null) const [openShareRequestModal, setOpenShareRequestModal] = useState(false) @@ -101,7 +102,6 @@ const ControlPanel: React.FC<{ snapshotsHistory } = useAppSelector((state) => state.cohortCreation.request || {}) const { uuid, includePatient, status, jobFailMsg } = count - const [requestShare, setRequestShare] = useState({ currentSnapshot, requestId, @@ -112,7 +112,7 @@ const ControlPanel: React.FC<{ const maintenanceIsActive = useAppSelector((state) => state.me?.maintenance?.active ?? false) - const cohortLimit = shortCohortLimit ?? SHORT_COHORT_LIMIT + const cohortLimit = shortCohortLimit ?? appConfig.features.cohort.shortCohortLimit const accessIsPseudonymize: boolean | null = selectedPopulation === null @@ -264,7 +264,7 @@ const ControlPanel: React.FC<{ <>Créer la cohorte )} - {ODD_FEASABILITY_REPORT && ( + {appConfig.features.feasabilityReport.enabled && (