From e15569364fda0bc15757000d0dbce4a69a5b60d2 Mon Sep 17 00:00:00 2001 From: Tristan Huet Date: Tue, 22 Oct 2024 17:54:33 +0200 Subject: [PATCH 1/7] fix: fix possible error in SimplePowerBIReportEmbed When the prop visibleScenarios is not provided, the component could raise an error because it tries to access .length of the visibleScenarios array when building the ScenarioDTO for dynamic filters --- src/charts/SimplePowerBIReportEmbed/SimplePowerBIReportEmbed.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/charts/SimplePowerBIReportEmbed/SimplePowerBIReportEmbed.js b/src/charts/SimplePowerBIReportEmbed/SimplePowerBIReportEmbed.js index ed98d762..760604a3 100644 --- a/src/charts/SimplePowerBIReportEmbed/SimplePowerBIReportEmbed.js +++ b/src/charts/SimplePowerBIReportEmbed/SimplePowerBIReportEmbed.js @@ -402,6 +402,7 @@ SimplePowerBIReportEmbed.defaultProps = { refreshable: true, refreshTimeout: 15000, useAAD: false, + visibleScenarios: [], labels: { noScenario: { title: 'No scenario yet', From 3753906eeb1ad640c36db19e95eee2ee30068d65 Mon Sep 17 00:00:00 2001 From: Elena Sasova Date: Thu, 3 Oct 2024 15:51:51 +0200 Subject: [PATCH 2/7] refactor: [PROD-13948] replace defaultProps by default function params --- .../CreateScenarioButton.js | 55 +++-- .../RolesEditionButton/RolesEditionButton.js | 35 ++-- .../RolesEditionDialog/RolesEditionDialog.js | 51 ++--- .../RolesEditionDialog.spec.js | 3 +- .../components/RolesAddingDialog.js | 24 +-- .../SelfDestructLinkButton.js | 19 +- src/buttons/SignInButton/SignInButton.js | 7 +- src/cards/ResourceCard/ResourceCard.js | 7 +- src/cards/ScenarioNode/ScenarioNode.js | 100 +++++---- .../ConfirmDeleteDialog.js | 23 +- .../components/EditableLink/EditableLink.js | 31 +-- src/charts/CytoViz/CytoViz.js | 198 ++++++++---------- .../components/ElementData/ElementData.js | 20 +- src/charts/Dashboard/Dashboard.js | 64 +++--- .../DashboardPlaceholder.js | 7 +- .../ScenarioManagerTreeList.js | 103 +++++---- .../SimplePowerBIReportEmbed.js | 87 ++++---- .../DontAskAgainDialog/DontAskAgainDialog.js | 31 +-- .../SimpleTwoActionsDialog.js | 53 ++--- .../BasicDateInput/BasicDateInput.js | 12 +- .../BasicDateInput/BasicDateInput.spec.js | 1 - .../BasicEnumInput/BasicEnumInput.js | 6 +- .../BasicEnumInput/BasicEnumInput.spec.js | 1 - .../BasicNumberInput/BasicNumberInput.js | 6 +- .../BasicNumberInput/BasicNumberInput.spec.js | 1 - .../BasicRadioInput/BasicRadioInput.js | 6 +- .../BasicRadioInput/BasicRadioInput.spec.js | 1 - .../BasicSliderInput/BasicSliderInput.js | 24 +-- .../BasicSliderInput/BasicSliderInput.spec.js | 1 - .../BasicTextInput/BasicTextInput.js | 16 +- .../BasicTextInput/BasicTextInput.spec.js | 1 - .../BasicToggleInput/BasicToggleInput.spec.js | 1 - .../DescriptionEditor/DescriptionEditor.js | 16 +- .../HierarchicalComboBox.js | 28 ++- src/inputs/MultiSelect/MultiSelect.js | 17 +- src/inputs/RoleEditor/RoleEditor.js | 15 +- src/inputs/RoleEditor/RoleEditor.spec.js | 1 - .../SelectWithAction/SelectWithAction.js | 15 +- src/inputs/SingleSelect/SingleSelect.js | 17 +- src/inputs/Table/Table.js | 55 ++--- src/inputs/Table/Table.spec.js | 1 - src/inputs/TagsEditor/TagsEditor.js | 29 +-- src/inputs/TagsEditor/TagsEditor.spec.js | 1 - src/inputs/UploadFile/UploadFile.js | 29 ++- src/inputs/UploadFile/UploadFile.spec.js | 1 - src/menus/HelpMenu/HelpMenu.js | 23 +- src/menus/UserInfo/UserInfo.js | 15 +- src/misc/DefaultAvatar/DefaultAvatar.js | 7 +- src/misc/ErrorBanner/ErrorBanner.js | 19 +- src/misc/ErrorsPanel/ErrorsPanel.js | 16 +- src/misc/FadingTooltip/FadingTooltip.js | 7 +- .../FixedRatioContainer.js | 8 +- src/misc/LoadingLine/LoadingLine.js | 15 +- src/misc/PermissionsGate/PermissionsGate.js | 18 +- .../ScenarioValidationStatusChip.js | 14 +- src/misc/TooltipInfo/TooltipInfo.js | 6 +- 56 files changed, 588 insertions(+), 780 deletions(-) diff --git a/src/buttons/CreateScenarioButton/CreateScenarioButton.js b/src/buttons/CreateScenarioButton/CreateScenarioButton.js index 5246e648..3a738915 100644 --- a/src/buttons/CreateScenarioButton/CreateScenarioButton.js +++ b/src/buttons/CreateScenarioButton/CreateScenarioButton.js @@ -5,6 +5,29 @@ import { Button, IconButton } from '@mui/material'; import { FadingTooltip } from '../../misc'; import CreateScenarioDialog from './components'; +const DEFAULT_LABELS = { + button: { + title: 'Create', + tooltip: 'Create new Scenario', + }, + dialog: { + title: 'Create new Scenario', + scenarioName: 'Scenario Name', + scenarioMaster: 'Master', + scenarioParent: 'Scenario Parent', + datasetPlaceholder: 'Dataset', + dataset: 'Dataset', + scenarioTypePlaceholder: 'Scenario run type', + scenarioType: 'Run type', + cancel: 'Cancel', + create: 'Create', + }, + errors: { + emptyScenarioName: 'Scenario Name should not be empty', + existingScenarioName: 'Scenario Name already exists', + forbiddenCharsInScenarioName: 'Forbidden characters in Scenario Name', + }, +}; export const CreateScenarioButton = ({ currentScenario, datasets, @@ -15,10 +38,11 @@ export const CreateScenarioButton = ({ createScenario, workspaceId, solution, - disabled, - labels, + disabled = false, + labels: tmpLabels, isIconButton, }) => { + const labels = { ...DEFAULT_LABELS, ...tmpLabels }; const [open, setOpen] = useState(false); const openDialog = () => setOpen(true); const closeDialog = () => setOpen(false); @@ -155,30 +179,3 @@ CreateScenarioButton.propTypes = { */ isIconButton: PropTypes.bool, }; - -CreateScenarioButton.defaultProps = { - disabled: false, - labels: { - button: { - title: 'Create', - tooltip: 'Create new Scenario', - }, - dialog: { - title: 'Create new Scenario', - scenarioName: 'Scenario Name', - scenarioMaster: 'Master', - scenarioParent: 'Scenario Parent', - datasetPlaceholder: 'Dataset', - dataset: 'Dataset', - scenarioTypePlaceholder: 'Scenario run type', - scenarioType: 'Run type', - cancel: 'Cancel', - create: 'Create', - }, - errors: { - emptyScenarioName: 'Scenario Name should not be empty', - existingScenarioName: 'Scenario Name already exists', - forbiddenCharsInScenarioName: 'Forbidden characters in Scenario Name', - }, - }, -}; diff --git a/src/buttons/RolesEditionButton/RolesEditionButton.js b/src/buttons/RolesEditionButton/RolesEditionButton.js index ba36ac38..65964bab 100644 --- a/src/buttons/RolesEditionButton/RolesEditionButton.js +++ b/src/buttons/RolesEditionButton/RolesEditionButton.js @@ -4,24 +4,32 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; import ShareIcon from '@mui/icons-material/Share'; import { Button, IconButton } from '@mui/material'; -import { FadingTooltip } from '../../misc/FadingTooltip'; +import { FadingTooltip } from '../../misc'; import { RolesEditionDialog } from './components'; +const DEFAULT_LABELS = { + button: { + title: 'Share', + tooltip: 'Modify access', + }, +}; + export const RolesEditionButton = ({ - labels, - isIconButton, + labels: tmpLabels, + isIconButton = false, agents, resourceRolesPermissionsMapping, - preventNoneRoleForAgents, - isReadOnly, - disabled, + preventNoneRoleForAgents = false, + isReadOnly = false, + disabled = false, onConfirmChanges, specificAccessByAgent, - defaultRole, + defaultRole = '', allRoles, allPermissions, defaultAccessScope, }) => { + const labels = { ...DEFAULT_LABELS, ...tmpLabels }; const [open, setOpen] = useState(false); const openDialog = () => setOpen(true); const closeDialog = () => setOpen(false); @@ -173,16 +181,3 @@ RolesEditionButton.propTypes = { dialog: PropTypes.object.isRequired, }), }; -RolesEditionButton.defaultProps = { - isIconButton: false, - isReadOnly: false, - disabled: false, - preventNoneRoleForAgents: false, - defaultRole: '', - labels: { - button: { - title: 'Share', - tooltip: 'Modify access', - }, - }, -}; diff --git a/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.js b/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.js index 61ca23b9..011508c7 100644 --- a/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.js +++ b/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.js @@ -32,18 +32,35 @@ const useStyles = makeStyles((theme) => ({ }, })); +const DEFAULT_LABELS = { + title: 'Share ', + readOnlyTitle: 'Permissions for ', + addPeople: 'Add people', + cancel: 'Cancel', + close: 'Close', + share: 'Share', + noAdminError: 'The scenario must have at least one administrator', + userSelected: 'Selected user', + usersAccess: 'Users access', + generalAccess: 'General access', + removeAccess: 'Remove access', + editor: { + helperText: null, + }, +}; + const ADMIN_ROLE = 'admin'; const sortById = (agentA, agentB) => (agentA.id < agentB.id ? -1 : 1); export const RolesEditionDialog = ({ - labels: labelsBeforeDefaultValuesPatch, - isReadOnly, + labels: tmpLabels, + isReadOnly = false, resourceRolesPermissionsMapping, - preventNoneRoleForAgents, + preventNoneRoleForAgents = false, onConfirmChanges, agents, accessControlList, - defaultRole, + defaultRole = '', open, closeDialog, allRoles, @@ -56,7 +73,7 @@ export const RolesEditionDialog = ({ const [newAccessControlList, setNewAccessControlList] = useState([...accessControlList].sort(sortById)); const [newDefaultRole, setNewDefaultRole] = useState(defaultRole || ''); - const labels = { ...DEFAULT_LABELS, ...labelsBeforeDefaultValuesPatch }; + const labels = { ...DEFAULT_LABELS, ...tmpLabels }; useEffect(() => { if (open) { @@ -289,27 +306,3 @@ RolesEditionDialog.propTypes = { ), defaultAccessScope: PropTypes.string.isRequired, }; - -const DEFAULT_LABELS = { - title: 'Share ', - readOnlyTitle: 'Permissions for ', - addPeople: 'Add people', - cancel: 'Cancel', - close: 'Close', - share: 'Share', - noAdminError: 'The scenario must have at least one administrator', - userSelected: 'Selected user', - usersAccess: 'Users access', - generalAccess: 'General access', - removeAccess: 'Remove access', - editor: { - helperText: null, - }, -}; - -RolesEditionDialog.defaultProps = { - labels: DEFAULT_LABELS, - isReadOnly: false, - preventNoneRoleForAgents: false, - defaultRole: '', -}; diff --git a/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.spec.js b/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.spec.js index f74c0065..50564a74 100644 --- a/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.spec.js +++ b/src/buttons/RolesEditionButton/components/RolesEditionDialog/RolesEditionDialog.spec.js @@ -2,8 +2,7 @@ // Copyright (c) Cosmo Tech. // Licensed under the MIT license. import { screen } from '@testing-library/react'; -import React from 'react'; -import { act } from 'react-dom/test-utils'; +import React, { act } from 'react'; import { RolesEditionDialog } from '.'; import { AutoCompleteTesting, ButtonTesting, TypographyTesting } from '../../../../../tests/MuiComponentsTesting'; import { diff --git a/src/buttons/RolesEditionButton/components/RolesEditionDialog/components/RolesAddingDialog.js b/src/buttons/RolesEditionButton/components/RolesEditionDialog/components/RolesAddingDialog.js index a102e335..67de8b95 100644 --- a/src/buttons/RolesEditionButton/components/RolesEditionDialog/components/RolesAddingDialog.js +++ b/src/buttons/RolesEditionButton/components/RolesEditionDialog/components/RolesAddingDialog.js @@ -35,9 +35,19 @@ const _sortGrantedPermissionsForRole = (rolesPermissionsMapping, allPermissions, return permissions; }; +const DEFAULT_LABELS = { + cancel: 'Cancel', + deniedPermissions: 'Permissions not granted', + done: 'Done', + grantedPermissions: 'Permissions granted', + rolesTitle: 'Roles', + userSelected: 'User selected', + rolesHelperText: 'Select one role', +}; + export const RolesAddingDialog = ({ selectedAgent, - labels, + labels: tmpLabels, allRoles, allPermissions, defaultRole, @@ -46,6 +56,7 @@ export const RolesAddingDialog = ({ onConfirm, }) => { const classes = useStyle(); + const labels = { ...DEFAULT_LABELS, ...tmpLabels }; const [selectedRole, setSelectedRole] = useState(defaultRole); const sortedPermissions = _sortGrantedPermissionsForRole(rolesPermissionsMapping, allPermissions, selectedRole); return ( @@ -188,14 +199,3 @@ RolesAddingDialog.propTypes = { onCancel: PropTypes.func.isRequired, onConfirm: PropTypes.func.isRequired, }; -RolesAddingDialog.defaultProps = { - labels: { - cancel: 'Cancel', - deniedPermissions: 'Permissions not granted', - done: 'Done', - grantedPermissions: 'Permissions granted', - rolesTitle: 'Roles', - userSelected: 'User selected', - rolesHelperText: 'Select one role', - }, -}; diff --git a/src/buttons/SelfDestructLinkButton/SelfDestructLinkButton.js b/src/buttons/SelfDestructLinkButton/SelfDestructLinkButton.js index 6c1c05b0..0806bbb2 100644 --- a/src/buttons/SelfDestructLinkButton/SelfDestructLinkButton.js +++ b/src/buttons/SelfDestructLinkButton/SelfDestructLinkButton.js @@ -10,11 +10,14 @@ const STATUS = { GENERATING: 'GENERATING', READY: 'READY', }; - +const DEFAULT_LABELS = { + generateLink: 'Generate link', + download: 'Download', +}; export const SelfDestructLinkButton = (props) => { const classes = useStyles(); - const { generate, height, width, labels, timeout } = props; - + const { generate, height = '40px', width = '143px', labels: tmpLabels, timeout = 15 } = props; + const labels = { ...DEFAULT_LABELS, ...tmpLabels }; const [status, setStatus] = useState(STATUS.IDLE); const [downloadLink, setDownloadLink] = useState(null); const timeoutRef = useRef(null); @@ -106,13 +109,3 @@ SelfDestructLinkButton.propTypes = { */ timeout: PropTypes.number, // Expressed in seconds }; - -SelfDestructLinkButton.defaultProps = { - height: '40px', - width: '143px', - labels: { - generateLink: 'Generate link', - download: 'Download', - }, - timeout: 15, // Expressed in seconds -}; diff --git a/src/buttons/SignInButton/SignInButton.js b/src/buttons/SignInButton/SignInButton.js index ead0cf3a..cb8349e0 100644 --- a/src/buttons/SignInButton/SignInButton.js +++ b/src/buttons/SignInButton/SignInButton.js @@ -32,7 +32,7 @@ const useStyles = makeStyles((theme) => ({ export const SignInButton = (props) => { const classes = useStyles(); - const { id, label, logo, onClick } = props; + const { id, label = 'Sign in', logo = '../../assets/microsoft_logo.png', onClick } = props; return ( @@ -575,7 +619,7 @@ export const CytoViz = (props) => {
-
{labels_.settings.layout}
+
{labels.settings.layout}