diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 391330ce0db..034ef0e9e0c 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -20,6 +20,7 @@ - [ADR-098] Use the editing context to compute the metamodels - [ADR-099] Filter tree based representations - [ADR-100] Add support for custom widgets +- [ADR-101] Feedback messages on actions === Breaking changes @@ -76,6 +77,8 @@ See link:how-to/contribute-custom-widget.adoc[the documentation] for more detail - https://github.com/eclipse-sirius/sirius-components/issues/1985[|#1985] [sirius-web] It is now possible to use in-memory View-based representations by registering them in the new `InMemoryViewRegistry`. These representations can be created programmatically or loaded from `.view` EMF models on startup, and do not need to be stored as documents inside a project in the database. +- https://github.com/eclipse-sirius/sirius-components/issues/1912[#1912] [core] Add the possibility to send feedback messages to the frontend after an action. + === Improvements - https://github.com/eclipse-sirius/sirius-components/issues/1869[#1869] [tree] Navigate to the first child with the right arrow if a node is expanded. diff --git a/doc/adrs/101_feedback_messages_on_actions.adoc b/doc/adrs/101_feedback_messages_on_actions.adoc new file mode 100644 index 00000000000..8113819d229 --- /dev/null +++ b/doc/adrs/101_feedback_messages_on_actions.adoc @@ -0,0 +1,62 @@ += ADR-100 - Add the possibility to send feedback messages to the frontend after an action + +== Context + +After an action, only technical error messages can be displayed on the UI. +We want to offer the specifier the ability to send back custom return messages to the end user. + +== Decision + +We will provide a new Java service that specifiers can invoke during the execution of their actions (tools behaviors) to stack messages. +These messages will be displayed on the UI after the action resolution. + +=== Backend + +The interface will provide the following method : + +[source,java] +---- +interface IFeedbackMessageService { + void addFeedbackMessage(String message, FeedbackLevel level); +} +---- +with +[source,java] +---- +enum FeedbackLevel { + DEBUG, + INFO, + WARNING, + ERROR, +} +---- + +The implementation must have a scope to limit the _bean_ life cycle to the action only, in order to just return at the end of the action the messages stacked by the services called by the action. +The spring scope of type _request_ provides this limitation. + +At first, we will join all the _string messages_ stacked in a single string, and append it to the existing `Failure` (`IStatus` implementation) _message_ parameter. +In doing so, we can keep the actual _frontend_ representation for this message. + +To differentiate the level applied to the message, we will prefix it with an emoji representing this level. + +=== Frontend + +To begin, we will not change the actual representation for an action error message. +But in order to facilitate the maintenance and the evolutions, we will mutualize all these representations in a single custom component `Toast`. + +with + +[source,typescript] +---- +export interface ToastProps { + message?: string; + open?: boolean; + onClose?: () => void; +} +---- + +Next, we will change this representation to display, for each stacked message, a unique _notification_ with a style depending on the chosen level. + +== Status + +Accepted. diff --git a/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/FeedbackLevel.java b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/FeedbackLevel.java new file mode 100644 index 00000000000..d1dc960b888 --- /dev/null +++ b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/FeedbackLevel.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.core.api; + +/** + * Enumeration used to indicate the feedback message level. + * + * @author frouene + */ +public enum FeedbackLevel { + DEBUG, INFO, WARNING, ERROR, +} diff --git a/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/FeedbackMessage.java b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/FeedbackMessage.java new file mode 100644 index 00000000000..faea19cc047 --- /dev/null +++ b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/FeedbackMessage.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.core.api; + +import java.util.Objects; + +/** + * Record used to represent a feedback message. + * + * @author frouene + */ +public record FeedbackMessage(String message, FeedbackLevel level) { + + public FeedbackMessage { + Objects.requireNonNull(message); + Objects.requireNonNull(level); + } + +} diff --git a/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IFeedbackMessageService.java b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IFeedbackMessageService.java new file mode 100644 index 00000000000..d6dcd11df5d --- /dev/null +++ b/packages/core/backend/sirius-components-core/src/main/java/org/eclipse/sirius/components/core/api/IFeedbackMessageService.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.core.api; + +import java.util.List; + +/** + * Interface of the service interacting with the list of stacked feedback messages. + * + * @author frouene + */ +public interface IFeedbackMessageService { + + void addFeedbackMessage(String message, FeedbackLevel level); + + List getFeedbackMessages(); + + /** + * Implementation which does nothing, used for mocks in unit tests. + * + * @author frouene + */ + class NoOp implements IFeedbackMessageService { + + @Override + public void addFeedbackMessage(String message, FeedbackLevel level) { + + } + + @Override + public List getFeedbackMessages() { + return List.of(); + } + } +} diff --git a/packages/core/frontend/sirius-components-core/src/index.ts b/packages/core/frontend/sirius-components-core/src/index.ts index 45a9764d7b2..3eca7e347e7 100644 --- a/packages/core/frontend/sirius-components-core/src/index.ts +++ b/packages/core/frontend/sirius-components-core/src/index.ts @@ -17,6 +17,7 @@ export * from './materialui'; export * from './theme'; export * from './workbench/Panels'; export * from './workbench/RepresentationContext'; +export * from './workbench/Toast'; export * from './workbench/Workbench'; export * from './workbench/Workbench.types'; export * from './workbench/WorkbenchViewContribution'; diff --git a/packages/core/frontend/sirius-components-core/src/workbench/Toast.tsx b/packages/core/frontend/sirius-components-core/src/workbench/Toast.tsx new file mode 100644 index 00000000000..683dc9e87a2 --- /dev/null +++ b/packages/core/frontend/sirius-components-core/src/workbench/Toast.tsx @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +import IconButton from '@material-ui/core/IconButton'; +import Snackbar from '@material-ui/core/Snackbar'; +import CloseIcon from '@material-ui/icons/Close'; +import { ToastProps } from './Toast.types'; + +export const Toast = ({ message, open, onClose }: ToastProps) => { + return ( + onClose()}> + + + } + data-testid="toast" + /> + ); +}; diff --git a/packages/core/frontend/sirius-components-core/src/workbench/Toast.types.ts b/packages/core/frontend/sirius-components-core/src/workbench/Toast.types.ts new file mode 100644 index 00000000000..2a56ffb06b5 --- /dev/null +++ b/packages/core/frontend/sirius-components-core/src/workbench/Toast.types.ts @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ + +export interface ToastProps { + message?: string; + open?: boolean; + onClose?: () => void; +} diff --git a/packages/core/frontend/sirius-components-core/src/workbench/Workbench.tsx b/packages/core/frontend/sirius-components-core/src/workbench/Workbench.tsx index c1327a806c4..00bac396189 100644 --- a/packages/core/frontend/sirius-components-core/src/workbench/Workbench.tsx +++ b/packages/core/frontend/sirius-components-core/src/workbench/Workbench.tsx @@ -11,15 +11,13 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useSubscription } from '@apollo/client'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useCallback, useContext, useEffect } from 'react'; import { Panels } from './Panels'; import { RepresentationContext } from './RepresentationContext'; import { RepresentationNavigation } from './RepresentationNavigation'; +import { Toast } from './Toast'; import { GQLEditingContextEventSubscription, Representation, @@ -205,25 +203,10 @@ export const Workbench = ({ rightPanelInitialSize={300} mainArea={main} /> - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/core/frontend/sirius-components/src/modals/delete-project/DeleteProjectModal.tsx b/packages/core/frontend/sirius-components/src/modals/delete-project/DeleteProjectModal.tsx index 90a9ae86039..49efa91022f 100644 --- a/packages/core/frontend/sirius-components/src/modals/delete-project/DeleteProjectModal.tsx +++ b/packages/core/frontend/sirius-components/src/modals/delete-project/DeleteProjectModal.tsx @@ -11,15 +11,13 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogContentText from '@material-ui/core/DialogContentText'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { DeleteProjectModalContext, @@ -123,25 +121,10 @@ export const DeleteProjectModal = ({ projectId, onDelete, onClose }: DeleteProje - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/core/frontend/sirius-components/src/modals/new-object/NewObjectModal.tsx b/packages/core/frontend/sirius-components/src/modals/new-object/NewObjectModal.tsx index 273ae9135bd..3aacf9ea164 100644 --- a/packages/core/frontend/sirius-components/src/modals/new-object/NewObjectModal.tsx +++ b/packages/core/frontend/sirius-components/src/modals/new-object/NewObjectModal.tsx @@ -11,18 +11,16 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation, useQuery } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useEffect } from 'react'; import { @@ -207,25 +205,10 @@ export const NewObjectModal = ({ editingContextId, item, onObjectCreated, onClos - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/core/frontend/sirius-components/src/modals/new-representation/NewRepresentationModal.tsx b/packages/core/frontend/sirius-components/src/modals/new-representation/NewRepresentationModal.tsx index 1b2340419b5..d4dd71cafb1 100644 --- a/packages/core/frontend/sirius-components/src/modals/new-representation/NewRepresentationModal.tsx +++ b/packages/core/frontend/sirius-components/src/modals/new-representation/NewRepresentationModal.tsx @@ -12,19 +12,17 @@ *******************************************************************************/ import { gql, useMutation, useQuery } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; import TextField from '@material-ui/core/TextField'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useEffect } from 'react'; import { @@ -280,25 +278,10 @@ export const NewRepresentationModal = ({ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/core/frontend/sirius-components/src/modals/new-root-object/NewRootObjectModal.tsx b/packages/core/frontend/sirius-components/src/modals/new-root-object/NewRootObjectModal.tsx index a7d0836ddaf..6a1aea1efbd 100644 --- a/packages/core/frontend/sirius-components/src/modals/new-root-object/NewRootObjectModal.tsx +++ b/packages/core/frontend/sirius-components/src/modals/new-root-object/NewRootObjectModal.tsx @@ -11,6 +11,7 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useLazyQuery, useMutation, useQuery } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Checkbox from '@material-ui/core/Checkbox'; import Dialog from '@material-ui/core/Dialog'; @@ -18,13 +19,10 @@ import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; import FormControlLabel from '@material-ui/core/FormControlLabel'; -import IconButton from '@material-ui/core/IconButton'; import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useEffect } from 'react'; import { @@ -301,25 +299,10 @@ export const NewRootObjectModal = ({ editingContextId, item, onObjectCreated, on - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/core/frontend/sirius-components/src/modals/rename-project/RenameProjectModal.tsx b/packages/core/frontend/sirius-components/src/modals/rename-project/RenameProjectModal.tsx index 000616249a3..357c554727a 100644 --- a/packages/core/frontend/sirius-components/src/modals/rename-project/RenameProjectModal.tsx +++ b/packages/core/frontend/sirius-components/src/modals/rename-project/RenameProjectModal.tsx @@ -11,15 +11,13 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import TextField from '@material-ui/core/TextField'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useEffect } from 'react'; import { @@ -145,25 +143,10 @@ export const RenameProjectModal = ({ projectId, initialProjectName, onRename, on - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/droparea/DropArea.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/droparea/DropArea.tsx index 157000eabb1..977f06edc1c 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/droparea/DropArea.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/droparea/DropArea.tsx @@ -11,11 +11,8 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; -import { DRAG_SOURCES_TYPE } from '@eclipse-sirius/sirius-components-core'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { DRAG_SOURCES_TYPE, Toast } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useEffect } from 'react'; import { DropAreaProps } from './DropArea.types'; @@ -181,25 +178,10 @@ export const DropArea = ({ onDrop={(event) => handleDrop(event)} onDragOver={(event) => handleDragOver(event)} onDragLeave={(event) => handleDragLeave(event)}> - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> {children} diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualMenu.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualMenu.tsx index a3474ed413f..5eceec7ec42 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualMenu.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualMenu.tsx @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2022 Obeo and others. + * Copyright (c) 2019, 2023 Obeo and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -11,10 +11,8 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useQuery } from '@apollo/client'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useCallback, useEffect } from 'react'; import { ContextualMenuProps, GQLGetConnectorToolsData, GQLGetConnectorToolsVariables } from './ContextualMenu.types'; @@ -158,25 +156,10 @@ export const ContextualMenu = ({ return ( <> {menuContent} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualPalette.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualPalette.tsx index 9f03a03cfc1..30c502424f6 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualPalette.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/palette/ContextualPalette.tsx @@ -11,10 +11,8 @@ * Obeo - initial API and implementation *******************************************************************************/ import { ApolloError, gql, useMutation, useQuery } from '@apollo/client'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useCallback, useEffect } from 'react'; import { EditLabelAction, isWithEditableLabel, SModelElement } from 'sprotty'; @@ -474,25 +472,10 @@ export const ContextualPalette = ({ return ( <> {paletteContent} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx index 6f235287893..97265b9a806 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx @@ -16,13 +16,11 @@ import { Selection, SelectionEntry, ServerContext, + Toast, } from '@eclipse-sirius/sirius-components-core'; import { SelectionDialog } from '@eclipse-sirius/sirius-components-selection'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import makeStyles from '@material-ui/core/styles/makeStyles'; import Typography from '@material-ui/core/Typography'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useCallback, useContext, useEffect, useRef } from 'react'; import { HoverFeedbackAction, SEdge, SModelElement, SNode, SPort } from 'sprotty'; @@ -1217,25 +1215,10 @@ export const DiagramRepresentation = ({ /> {content} {selectModelElementDialog} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/toolbar/Toolbar.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/toolbar/Toolbar.tsx index 8288d324a48..9153f5c32bf 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/toolbar/Toolbar.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/toolbar/Toolbar.tsx @@ -11,17 +11,16 @@ * Obeo - initial API and implementation *******************************************************************************/ import { ApolloError, gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Avatar from '@material-ui/core/Avatar'; import FormControl from '@material-ui/core/FormControl'; import IconButton from '@material-ui/core/IconButton'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; import Tooltip from '@material-ui/core/Tooltip'; import AccountTreeIcon from '@material-ui/icons/AccountTree'; import AspectRatioIcon from '@material-ui/icons/AspectRatio'; -import CloseIcon from '@material-ui/icons/Close'; import ShareIcon from '@material-ui/icons/Share'; import TonalityIcon from '@material-ui/icons/Tonality'; import VisibilityOffIcon from '@material-ui/icons/VisibilityOff'; @@ -343,25 +342,10 @@ export const Toolbar = ({ {modalElement} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx index 328f625ed78..e7a28d83807 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx @@ -11,12 +11,10 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import { GQLWidget, PropertySectionContext } from '@eclipse-sirius/sirius-components-forms'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; -import { Theme, makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import React, { useContext, useEffect, useRef, useState } from 'react'; import { FlexboxContainerWidgetState, FlexboxContainerWidgetStyleProps } from './FlexboxContainerWidget.types'; import { addWidgetMutation, moveWidgetMutation } from './FormDescriptionEditorEventFragment'; @@ -248,33 +246,14 @@ export const FlexboxContainerWidget = ({ onDrop={handleDrop}> {'Drag and drop a widget here'} - setState((prevState) => { return { ...prevState, message: null }; }) } - message={message} - action={ - - setState((prevState) => { - return { ...prevState, message: null }; - }) - }> - - - } - data-testid="error" /> ); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorRepresentation.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorRepresentation.tsx index 230de961e5b..fdb30607ed3 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorRepresentation.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorRepresentation.tsx @@ -11,18 +11,15 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useSubscription } from '@apollo/client'; -import { RepresentationComponentProps } from '@eclipse-sirius/sirius-components-core'; +import { RepresentationComponentProps, Toast } from '@eclipse-sirius/sirius-components-core'; import { PropertySectionContext } from '@eclipse-sirius/sirius-components-forms'; import Avatar from '@material-ui/core/Avatar'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { makeStyles } from '@material-ui/core/styles'; import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; -import { makeStyles } from '@material-ui/core/styles'; import ArrowDropDownCircleIcon from '@material-ui/icons/ArrowDropDownCircle'; import BarChartIcon from '@material-ui/icons/BarChart'; import CheckBoxIcon from '@material-ui/icons/CheckBox'; -import CloseIcon from '@material-ui/icons/Close'; import FormatListBulletedIcon from '@material-ui/icons/FormatListBulleted'; import ImageIcon from '@material-ui/icons/Image'; import LabelOutlinedIcon from '@material-ui/icons/LabelOutlined'; @@ -45,15 +42,15 @@ import { import { FormDescriptionEditorRepresentationContext, FormDescriptionEditorRepresentationEvent, + formDescriptionEditorRepresentationMachine, HandleSubscriptionResultEvent, HideToastEvent, InitializeRepresentationEvent, SchemaValue, ShowToastEvent, - formDescriptionEditorRepresentationMachine, } from './FormDescriptionEditorRepresentationMachine'; -import { PageList } from './PageList'; import { Button } from './icons/Button'; +import { PageList } from './PageList'; const useFormDescriptionEditorStyles = makeStyles((theme) => ({ formDescriptionEditor: { @@ -465,25 +462,10 @@ export const FormDescriptionEditorRepresentation = ({ {content} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Group.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Group.tsx index 37a57ab281c..a281c813ce1 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Group.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Group.tsx @@ -11,14 +11,11 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; -import { Selection } from '@eclipse-sirius/sirius-components-core'; +import { Selection, Toast } from '@eclipse-sirius/sirius-components-core'; import { GQLWidget, PropertySectionContext } from '@eclipse-sirius/sirius-components-forms'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { makeStyles, Theme, withStyles } from '@material-ui/core/styles'; import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; -import { Theme, makeStyles, withStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import ToggleButton from '@material-ui/lab/ToggleButton'; import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup'; import React, { useContext, useEffect, useRef, useState } from 'react'; @@ -523,33 +520,14 @@ export const Group = ({ - setState((prevState) => { return { ...prevState, message: null }; }) } - message={message} - action={ - - setState((prevState) => { - return { ...prevState, message: null }; - }) - }> - - - } - data-testid="error" /> ); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Page.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Page.tsx index f45471d1703..afd61a95db1 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Page.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/Page.tsx @@ -11,13 +11,11 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; -import CloseIcon from '@material-ui/icons/Close'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import { Group } from './Group'; -import { PageProps, PageState } from './Page.types'; +import React, { useEffect, useRef, useState } from 'react'; +import { addGroupMutation, moveGroupMutation } from './FormDescriptionEditorEventFragment'; import { GQLAddGroupInput, GQLAddGroupMutationData, @@ -29,8 +27,8 @@ import { GQLMoveGroupMutationVariables, GQLMovePagePayload, } from './FormDescriptionEditorEventFragment.types'; -import { addGroupMutation, moveGroupMutation } from './FormDescriptionEditorEventFragment'; -import React, { useEffect, useRef, useState } from 'react'; +import { Group } from './Group'; +import { PageProps, PageState } from './Page.types'; const isErrorPayload = (payload: GQLAddPagePayload | GQLMovePagePayload): payload is GQLErrorPayload => payload.__typename === 'ErrorPayload'; @@ -218,33 +216,14 @@ export const Page = ({ onDrop={handleDrop}> {'Drag and drop a group here'} - setState((prevState) => { return { ...prevState, message: null }; }) } - message={message} - action={ - - setState((prevState) => { - return { ...prevState, message: null }; - }) - }> - - - } - data-testid="error" /> ); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/PageList.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/PageList.tsx index c04b4e52d48..c369b96cf50 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/PageList.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/PageList.tsx @@ -11,17 +11,13 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; -import { Selection } from '@eclipse-sirius/sirius-components-core'; +import { Selection, Toast } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; -import { PageListProps, PageListState } from './PageList.types'; -import { Page } from './Page'; import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; -import Snackbar from '@material-ui/core/Snackbar'; -import CloseIcon from '@material-ui/icons/Close'; -import IconButton from '@material-ui/core/IconButton'; import Typography from '@material-ui/core/Typography'; import React, { useEffect, useState } from 'react'; +import { addPageMutation, deletePageMutation, movePageMutation } from './FormDescriptionEditorEventFragment'; import { GQLAddPageInput, GQLAddPageMutationData, @@ -36,7 +32,8 @@ import { GQLMovePageMutationVariables, GQLMovePagePayload, } from './FormDescriptionEditorEventFragment.types'; -import { addPageMutation, deletePageMutation, movePageMutation } from './FormDescriptionEditorEventFragment'; +import { Page } from './Page'; +import { PageListProps, PageListState } from './PageList.types'; const isErrorPayload = (payload: GQLAddPagePayload | GQLMovePagePayload): payload is GQLErrorPayload => payload.__typename === 'ErrorPayload'; @@ -373,33 +370,14 @@ export const PageList = ({ selection={selection} setSelection={setSelection} /> - setState((prevState) => { return { ...prevState, message: null }; }) } - message={message} - action={ - - setState((prevState) => { - return { ...prevState, message: null }; - }) - }> - - - } - data-testid="error" /> ); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActionWidget.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActionWidget.tsx index 2fb2f8883e9..59fb499d182 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActionWidget.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActionWidget.tsx @@ -11,20 +11,16 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; -import { Selection, ServerContext, ServerContextValue } from '@eclipse-sirius/sirius-components-core'; +import { Selection, ServerContext, ServerContextValue, Toast } from '@eclipse-sirius/sirius-components-core'; import { ButtonStyleProps, + getTextDecorationLineValue, GQLButton, GQLToolbarAction, - GQLWidget, PropertySectionContext, - getTextDecorationLineValue, } from '@eclipse-sirius/sirius-components-forms'; import Button from '@material-ui/core/Button'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import { Theme, makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import React, { useContext, useEffect, useRef, useState } from 'react'; import { deleteToolbarActionMutation, moveToolbarActionMutation } from './FormDescriptionEditorEventFragment'; import { @@ -386,13 +382,9 @@ export const ToolbarActionWidget = ({ {state.buttonLabel} - setState((prevState) => { return { @@ -401,24 +393,6 @@ export const ToolbarActionWidget = ({ }; }) } - message={state.message} - action={ - - setState((prevState) => { - return { - ...prevState, - message: null, - }; - }) - }> - - - } - data-testid="error" /> ); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActions.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActions.tsx index 635cf318114..65048b792a3 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActions.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/ToolbarActions.tsx @@ -12,13 +12,12 @@ *******************************************************************************/ import { useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import { GQLToolbarAction } from '@eclipse-sirius/sirius-components-forms'; import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { makeStyles, Theme } from '@material-ui/core/styles'; import Tooltip from '@material-ui/core/Tooltip'; -import { Theme, makeStyles } from '@material-ui/core/styles'; import AddIcon from '@material-ui/icons/Add'; -import CloseIcon from '@material-ui/icons/Close'; import { useEffect, useState } from 'react'; import { addToolbarActionMutation, moveToolbarActionMutation } from './FormDescriptionEditorEventFragment'; import { @@ -32,8 +31,8 @@ import { GQLMoveToolbarActionMutationVariables, GQLMoveToolbarActionPayload, } from './FormDescriptionEditorEventFragment.types'; -import { ToolbarActionWidget } from './ToolbarActionWidget'; import { ToolbarActionsProps } from './ToolbarActions.types'; +import { ToolbarActionWidget } from './ToolbarActionWidget'; const useToolbarActionsStyles = makeStyles((theme: Theme) => ({ toolbar: { @@ -201,22 +200,7 @@ export const ToolbarActions = ({ - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} /> ); }; diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/WidgetEntry.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/WidgetEntry.tsx index 1685acea5d6..0f8d55a14e8 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/WidgetEntry.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/WidgetEntry.tsx @@ -11,7 +11,7 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; -import { Selection } from '@eclipse-sirius/sirius-components-core'; +import { Selection, Toast } from '@eclipse-sirius/sirius-components-core'; import { GQLButton, GQLChartWidget, @@ -31,11 +31,8 @@ import { GQLWidget, PropertySectionContext, } from '@eclipse-sirius/sirius-components-forms'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { makeStyles, Theme, withStyles } from '@material-ui/core/styles'; import Tooltip from '@material-ui/core/Tooltip'; -import { Theme, makeStyles, withStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import React, { useContext, useEffect, useState } from 'react'; import { BarChartWidget } from './BarChartWidget'; import { ButtonWidget } from './ButtonWidget'; @@ -512,22 +509,7 @@ export const WidgetEntry = ({ {widgetElement} - setState({ message: null })} - message={message} - action={ - setState({ message: null })}> - - - } - data-testid="error" - /> + setState({ message: null })} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/ButtonPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/ButtonPropertySection.tsx index d503b3d7145..a2886801f99 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/ButtonPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/ButtonPropertySection.tsx @@ -11,12 +11,9 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; -import { ServerContext, ServerContextValue } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, ServerContextValue, Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import gql from 'graphql-tag'; import { useContext, useEffect, useState } from 'react'; import { @@ -193,22 +190,7 @@ export const ButtonPropertySection = ({ ) : null} {widget.buttonLabel} - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/CheckboxPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/CheckboxPropertySection.tsx index a8020553617..8f803bb6ee5 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/CheckboxPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/CheckboxPropertySection.tsx @@ -11,14 +11,12 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Checkbox from '@material-ui/core/Checkbox'; import FormControl from '@material-ui/core/FormControl'; import FormGroup from '@material-ui/core/FormGroup'; import FormHelperText from '@material-ui/core/FormHelperText'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useEffect, useState } from 'react'; import { CheckboxPropertySectionProps, @@ -163,22 +161,7 @@ export const CheckboxPropertySection = ({ /> {widget.diagnostics[0]?.message} - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/ListPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/ListPropertySection.tsx index b23379e873f..d77e3f88af2 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/ListPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/ListPropertySection.tsx @@ -11,18 +11,16 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; -import { ServerContext } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, Toast } from '@eclipse-sirius/sirius-components-core'; import FormControl from '@material-ui/core/FormControl'; import FormHelperText from '@material-ui/core/FormHelperText'; import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; import Table from '@material-ui/core/Table'; import TableBody from '@material-ui/core/TableBody'; import TableCell from '@material-ui/core/TableCell'; import TableRow from '@material-ui/core/TableRow'; import Typography from '@material-ui/core/Typography'; -import CloseIcon from '@material-ui/icons/Close'; import DeleteIcon from '@material-ui/icons/Delete'; import { MouseEvent, useContext, useEffect, useRef, useState } from 'react'; import { GQLListItem } from '../form/FormEventFragments.types'; @@ -277,22 +275,7 @@ export const ListPropertySection = ({ {widget.diagnostics[0]?.message} - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/MultiSelectPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/MultiSelectPropertySection.tsx index 549f148a4b9..39c6b84b160 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/MultiSelectPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/MultiSelectPropertySection.tsx @@ -11,16 +11,14 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Checkbox from '@material-ui/core/Checkbox'; import FormControl from '@material-ui/core/FormControl'; import FormHelperText from '@material-ui/core/FormHelperText'; -import IconButton from '@material-ui/core/IconButton'; import ListItemText from '@material-ui/core/ListItemText'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useEffect, useState } from 'react'; import { getTextDecorationLineValue } from './getTextDecorationLineValue'; import { @@ -208,22 +206,7 @@ export const MultiSelectPropertySection = ({ ))} {widget.diagnostics[0]?.message} - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/RadioPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/RadioPropertySection.tsx index 25a70fb7ef8..0b956bffc89 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/RadioPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/RadioPropertySection.tsx @@ -11,16 +11,14 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import FormControl from '@material-ui/core/FormControl'; import FormControlLabel from '@material-ui/core/FormControlLabel'; import FormHelperText from '@material-ui/core/FormHelperText'; -import IconButton from '@material-ui/core/IconButton'; import Radio from '@material-ui/core/Radio'; import RadioGroup from '@material-ui/core/RadioGroup'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; -import CloseIcon from '@material-ui/icons/Close'; import { useEffect, useState } from 'react'; import { getTextDecorationLineValue } from './getTextDecorationLineValue'; import { PropertySectionLabel } from './PropertySectionLabel'; @@ -192,22 +190,7 @@ export const RadioPropertySection = ({ ))} {widget.diagnostics[0]?.message} - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/RichTextPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/RichTextPropertySection.tsx index 888eb198a6a..03acf88269a 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/RichTextPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/RichTextPropertySection.tsx @@ -12,9 +12,7 @@ *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import CloseIcon from '@material-ui/icons/Close'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import { useMachine } from '@xstate/react'; import { useEffect } from 'react'; import { RichTextEditor } from '../richtexteditor/RichTextEditor'; @@ -174,22 +172,7 @@ export const RichTextPropertySection = ({ readOnly={readOnly} /> - dispatch({ type: 'HIDE_TOAST' })} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' })}> - - - } - data-testid="error" - /> + dispatch({ type: 'HIDE_TOAST' })} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/SelectPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/SelectPropertySection.tsx index c35c0e815e7..9a282e4a61a 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/SelectPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/SelectPropertySection.tsx @@ -11,14 +11,12 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import FormControl from '@material-ui/core/FormControl'; import FormHelperText from '@material-ui/core/FormHelperText'; -import IconButton from '@material-ui/core/IconButton'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useEffect, useState } from 'react'; import { getTextDecorationLineValue } from './getTextDecorationLineValue'; import { PropertySectionLabel } from './PropertySectionLabel'; @@ -206,22 +204,7 @@ export const SelectPropertySection = ({ ))} {widget.diagnostics[0]?.message} - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/TextfieldPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/TextfieldPropertySection.tsx index 7a44440ed6c..0402f2bb46b 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/TextfieldPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/TextfieldPropertySection.tsx @@ -11,16 +11,14 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useLazyQuery, useMutation } from '@apollo/client'; -import IconButton from '@material-ui/core/IconButton'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import ListItemText from '@material-ui/core/ListItemText'; import MenuItem from '@material-ui/core/MenuItem'; import MenuList from '@material-ui/core/MenuList'; import Popover from '@material-ui/core/Popover'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; import TextField from '@material-ui/core/TextField'; import Tooltip from '@material-ui/core/Tooltip'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { FocusEvent, useEffect, useRef, useState } from 'react'; import { GQLTextarea, GQLWidget } from '../form/FormEventFragments.types'; @@ -389,22 +387,7 @@ export const TextfieldPropertySection = ({ } /> {proposalsList} - dispatch({ type: 'HIDE_TOAST' })} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' })}> - - - } - data-testid="error" - /> + dispatch({ type: 'HIDE_TOAST' })} /> ); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/ButtonPropertySection.test.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/ButtonPropertySection.test.tsx index 9efbb085ee3..2f655b1ee73 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/ButtonPropertySection.test.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/ButtonPropertySection.test.tsx @@ -262,7 +262,7 @@ test('should display the error received', async () => { await waitFor(() => { expect(updateWidgetFocusCalled).toBeTruthy(); expect(pushButtonCalled).toBeTruthy(); - expect(screen.getByTestId('error')).not.toBeUndefined(); + expect(screen.getByTestId('toast')).not.toBeUndefined(); expect(baseElement).toMatchSnapshot(); }); }); diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/CheckboxPropertySection.test.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/CheckboxPropertySection.test.tsx index 04a8f8768b9..ddc019ecdcf 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/CheckboxPropertySection.test.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/CheckboxPropertySection.test.tsx @@ -241,7 +241,7 @@ test('should display the error received', async () => { await waitFor(() => { expect(updateWidgetFocusCalled).toBeTruthy(); expect(editCheckboxCalled).toBeTruthy(); - expect(screen.getByTestId('error')).not.toBeUndefined(); + expect(screen.getByTestId('toast')).not.toBeUndefined(); expect(baseElement).toMatchSnapshot(); }); }); diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/RadioPropertySection.test.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/RadioPropertySection.test.tsx index 9ed5a0aac57..ebfa6c1330d 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/RadioPropertySection.test.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/RadioPropertySection.test.tsx @@ -294,7 +294,7 @@ test('should display the error received', async () => { await waitFor(() => { expect(updateWidgetFocusCalled).toBeTruthy(); expect(editRadioCalled).toBeTruthy(); - expect(screen.getByTestId('error')).not.toBeUndefined(); + expect(screen.getByTestId('toast')).not.toBeUndefined(); expect(baseElement).toMatchSnapshot(); }); }); diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/TextfieldPropertySection.test.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/TextfieldPropertySection.test.tsx index fd0bbc3cef2..24e730136d3 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/TextfieldPropertySection.test.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/TextfieldPropertySection.test.tsx @@ -252,7 +252,7 @@ test('should display the error received', async () => { await waitFor(() => { expect(updateWidgetFocusCalled).toBeTruthy(); - expect(screen.getByTestId('error')).not.toBeUndefined(); + expect(screen.getByTestId('toast')).not.toBeUndefined(); expect(baseElement).toMatchSnapshot(); }); }); diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/__snapshots__/ButtonPropertySection.test.tsx.snap b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/__snapshots__/ButtonPropertySection.test.tsx.snap index 27e1fed4705..7f0e85cb535 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/__snapshots__/ButtonPropertySection.test.tsx.snap +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/__tests__/__snapshots__/ButtonPropertySection.test.tsx.snap @@ -69,7 +69,7 @@ exports[`should display the error received 2`] = `
) => @@ -180,25 +177,10 @@ export const FormRepresentation = ({ return ( <> {content} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/forms/frontend/sirius-components-forms/src/toolbaraction/ToolbarAction.tsx b/packages/forms/frontend/sirius-components-forms/src/toolbaraction/ToolbarAction.tsx index c3f5dffbcd3..8064ef4b85e 100644 --- a/packages/forms/frontend/sirius-components-forms/src/toolbaraction/ToolbarAction.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/toolbaraction/ToolbarAction.tsx @@ -11,12 +11,9 @@ * Obeo - initial API and implementation *******************************************************************************/ import { useMutation } from '@apollo/client'; -import { ServerContext, ServerContextValue } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, ServerContextValue, Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, Theme } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import gql from 'graphql-tag'; import { useContext, useEffect, useState } from 'react'; import { GQLButton } from '../form/FormEventFragments.types'; @@ -196,22 +193,7 @@ export const ToolbarAction = ({ editingContextId, formId, widget, readOnly }: To ) : null} {widget.buttonLabel} - setMessage(null)} - message={message} - action={ - setMessage(null)}> - - - } - data-testid="error" - /> + setMessage(null)} />
); }; diff --git a/packages/forms/frontend/sirius-components-forms/src/views/FormBasedView.tsx b/packages/forms/frontend/sirius-components-forms/src/views/FormBasedView.tsx index e10dfc590e5..2f30544be38 100644 --- a/packages/forms/frontend/sirius-components-forms/src/views/FormBasedView.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/views/FormBasedView.tsx @@ -11,11 +11,9 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useSubscription } from '@apollo/client'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import Typography from '@material-ui/core/Typography'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; +import Typography from '@material-ui/core/Typography'; import { useMachine } from '@xstate/react'; import { useContext, useEffect } from 'react'; import { Form } from '../form/Form'; @@ -35,13 +33,13 @@ import { FormBasedViewProps } from './FormBasedView.types'; import { FormBasedViewContext, FormBasedViewEvent, + formBasedViewMachine, HandleCompleteEvent, HandleSubscriptionResultEvent, HideToastEvent, SchemaValue, ShowToastEvent, SwitchSelectionEvent, - formBasedViewMachine, } from './FormBasedViewMachine'; export const getFormEventSubscription = (subscriptionName: string, contributions: Array) => { @@ -88,7 +86,7 @@ export const FormBasedView = ({ const { id, currentSelection, form, widgetSubscriptions, message } = context; /** - * Displays an other form if the selection indicates that we should display another properties view. + * Displays another form if the selection indicates that we should display another properties view. */ useEffect(() => { if (selection.entries.length > 0 && selection !== currentSelection) { @@ -167,25 +165,10 @@ export const FormBasedView = ({ return ( <> {content} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/forms/frontend/sirius-components-forms/src/views/RepresentationsView.tsx b/packages/forms/frontend/sirius-components-forms/src/views/RepresentationsView.tsx index b99c99eca9e..91e2ed917d7 100644 --- a/packages/forms/frontend/sirius-components-forms/src/views/RepresentationsView.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/views/RepresentationsView.tsx @@ -12,12 +12,9 @@ *******************************************************************************/ import { gql, useSubscription } from '@apollo/client'; -import { WorkbenchViewComponentProps } from '@eclipse-sirius/sirius-components-core'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import Typography from '@material-ui/core/Typography'; +import { Toast, WorkbenchViewComponentProps } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; +import Typography from '@material-ui/core/Typography'; import { useMachine } from '@xstate/react'; import { useContext, useEffect } from 'react'; import { WidgetContribution } from '../form/Form.types'; @@ -34,10 +31,10 @@ import { HideToastEvent, RepresentationsViewContext, RepresentationsViewEvent, + representationsViewMachine, SchemaValue, ShowToastEvent, SwitchSelectionEvent, - representationsViewMachine, } from './RepresentationsViewMachine'; const representationsEventSubscription = (contributions: Array) => @@ -152,25 +149,10 @@ export const RepresentationsView = ({ return ( <> {content} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/selection/frontend/sirius-components-selection/src/SelectionDialog.tsx b/packages/selection/frontend/sirius-components-selection/src/SelectionDialog.tsx index d211f36556f..549982c06b1 100644 --- a/packages/selection/frontend/sirius-components-selection/src/SelectionDialog.tsx +++ b/packages/selection/frontend/sirius-components-selection/src/SelectionDialog.tsx @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2021, 2022 Obeo. + * Copyright (c) 2021, 2023 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -11,21 +11,18 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useSubscription } from '@apollo/client'; -import { ServerContext } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogContentText from '@material-ui/core/DialogContentText'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; import List from '@material-ui/core/List'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; -import Snackbar from '@material-ui/core/Snackbar'; import { createStyles, makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import CropDinIcon from '@material-ui/icons/CropDin'; import { useMachine } from '@xstate/react'; import { useContext, useEffect } from 'react'; @@ -183,25 +180,10 @@ export const SelectionDialog = ({ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/modals/delete-image/DeleteImageModal.tsx b/packages/sirius-web/frontend/sirius-web/src/modals/delete-image/DeleteImageModal.tsx index f7dd573f214..e06bfb3a64b 100644 --- a/packages/sirius-web/frontend/sirius-web/src/modals/delete-image/DeleteImageModal.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/modals/delete-image/DeleteImageModal.tsx @@ -11,15 +11,13 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogContentText from '@material-ui/core/DialogContentText'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useEffect } from 'react'; import { @@ -32,12 +30,12 @@ import { import { DeleteImageModalContext, DeleteImageModalEvent, + deleteImageModalMachine, HandleResponseEvent, HideToastEvent, RequestImageDeletionEvent, SchemaValue, ShowToastEvent, - deleteImageModalMachine, } from './DeleteImageModalMachine'; const deleteImageMutation = gql` @@ -125,25 +123,10 @@ export const DeleteImageModal = ({ imageId, onImageDeleted, onClose }: DeleteIma - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/modals/project-templates/ProjectTemplatesModal.tsx b/packages/sirius-web/frontend/sirius-web/src/modals/project-templates/ProjectTemplatesModal.tsx index 4b054b1e26b..7f3f01b402f 100644 --- a/packages/sirius-web/frontend/sirius-web/src/modals/project-templates/ProjectTemplatesModal.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/modals/project-templates/ProjectTemplatesModal.tsx @@ -12,14 +12,12 @@ *******************************************************************************/ import { useMutation, useQuery } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Dialog from '@material-ui/core/Dialog'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; -import CloseIcon from '@material-ui/icons/Close'; import Pagination from '@material-ui/lab/Pagination'; import { useMachine } from '@xstate/react'; import gql from 'graphql-tag'; @@ -252,25 +250,10 @@ export const ProjectTemplatesModal = ({ onClose }: ProjectTemplatesModalProps) = Select a project template {content} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/modals/rename-image/RenameImageModal.tsx b/packages/sirius-web/frontend/sirius-web/src/modals/rename-image/RenameImageModal.tsx index b5327d740ad..e223748787a 100644 --- a/packages/sirius-web/frontend/sirius-web/src/modals/rename-image/RenameImageModal.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/modals/rename-image/RenameImageModal.tsx @@ -11,15 +11,13 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import TextField from '@material-ui/core/TextField'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useEffect } from 'react'; import { @@ -147,25 +145,10 @@ export const RenameImageModal = ({ imageId, initialImageName, onImageRenamed, on - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/modals/upload-image/UploadImageModal.tsx b/packages/sirius-web/frontend/sirius-web/src/modals/upload-image/UploadImageModal.tsx index b350e5fa261..472f6f8d50e 100644 --- a/packages/sirius-web/frontend/sirius-web/src/modals/upload-image/UploadImageModal.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/modals/upload-image/UploadImageModal.tsx @@ -12,17 +12,14 @@ *******************************************************************************/ import { gql } from '@apollo/client'; import { FileUpload, Form, sendFile } from '@eclipse-sirius/sirius-components'; -import { ServerContext } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; import FormGroup from '@material-ui/core/FormGroup'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import TextField from '@material-ui/core/TextField'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import React, { useContext, useEffect, useState } from 'react'; import { @@ -158,25 +155,10 @@ export const UploadImageModal = ({ projectId, onImageUploaded, onClose }: Upload - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx index a976468847b..2c4b352e9ed 100644 --- a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewDocumentArea.tsx @@ -11,17 +11,16 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Card from '@material-ui/core/Card'; import CardContent from '@material-ui/core/CardContent'; -import IconButton from '@material-ui/core/IconButton'; import List from '@material-ui/core/List/List'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; -import Snackbar from '@material-ui/core/Snackbar'; -import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; -import { Close as CloseIcon, NoteAdd } from '@material-ui/icons'; +import Typography from '@material-ui/core/Typography'; +import { NoteAdd } from '@material-ui/icons'; import { useEffect, useState } from 'react'; import { GQLInvokeEditingContextActionInput, @@ -121,22 +120,7 @@ export const NewDocumentArea = ({ editingContextId, editingContextActions, readO - setState({ message: null })} - action={ - setState({ message: null })}> - - - } - data-testid="error" - /> + setState({ message: null })} /> ); }; diff --git a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewRepresentationArea.tsx b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewRepresentationArea.tsx index 85fe164e10e..1f5dfc2406d 100644 --- a/packages/sirius-web/frontend/sirius-web/src/onboarding/NewRepresentationArea.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/onboarding/NewRepresentationArea.tsx @@ -11,17 +11,16 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Card from '@material-ui/core/Card'; import CardContent from '@material-ui/core/CardContent'; -import IconButton from '@material-ui/core/IconButton'; import List from '@material-ui/core/List'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; -import Snackbar from '@material-ui/core/Snackbar'; -import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; -import { Close as CloseIcon, Collections } from '@material-ui/icons'; +import Typography from '@material-ui/core/Typography'; +import { Collections } from '@material-ui/icons'; import { useEffect, useState } from 'react'; import { NewDocumentAreaState } from './NewDocumentArea.types'; import { NewRepresentationAreaProps } from './NewRepresentationArea.types'; @@ -142,22 +141,7 @@ export const NewRepresentationArea = ({ - setState({ message: null })} - action={ - setState({ message: null })}> - - - } - data-testid="error" - /> + setState({ message: null })} /> ); }; diff --git a/packages/sirius-web/frontend/sirius-web/src/views/edit-project/EditProjectView.tsx b/packages/sirius-web/frontend/sirius-web/src/views/edit-project/EditProjectView.tsx index d640caca2e4..799ac9a6216 100644 --- a/packages/sirius-web/frontend/sirius-web/src/views/edit-project/EditProjectView.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/views/edit-project/EditProjectView.tsx @@ -11,7 +11,7 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useQuery } from '@apollo/client'; -import { Representation, Workbench, WorkbenchViewContribution } from '@eclipse-sirius/sirius-components-core'; +import { Representation, Toast, Workbench, WorkbenchViewContribution } from '@eclipse-sirius/sirius-components-core'; import { DetailsView, RelatedElementsView, RepresentationsView } from '@eclipse-sirius/sirius-components-forms'; import { ExplorerView, @@ -21,12 +21,9 @@ import { } from '@eclipse-sirius/sirius-components-trees'; import { ValidationView } from '@eclipse-sirius/sirius-components-validation'; import Grid from '@material-ui/core/Grid'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; -import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; import AccountTreeIcon from '@material-ui/icons/AccountTree'; -import CloseIcon from '@material-ui/icons/Close'; import Filter from '@material-ui/icons/Filter'; import LinkIcon from '@material-ui/icons/Link'; import MenuIcon from '@material-ui/icons/Menu'; @@ -43,12 +40,12 @@ import { EditProjectViewParams, GQLGetProjectQueryData, GQLGetProjectQueryVariab import { EditProjectViewContext, EditProjectViewEvent, + editProjectViewMachine, HandleFetchedProjectEvent, HideToastEvent, SchemaValue, SelectRepresentationEvent, ShowToastEvent, - editProjectViewMachine, } from './EditProjectViewMachine'; import { ObjectTreeItemContextMenuContribution } from './ObjectTreeItemContextMenuContribution'; @@ -199,25 +196,10 @@ export const EditProjectView = () => { {navbar} {main}
- dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/views/new-project/NewProjectView.tsx b/packages/sirius-web/frontend/sirius-web/src/views/new-project/NewProjectView.tsx index bac70e834e2..1e0e2b20b8d 100644 --- a/packages/sirius-web/frontend/sirius-web/src/views/new-project/NewProjectView.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/views/new-project/NewProjectView.tsx @@ -12,13 +12,11 @@ *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; import { Form, FormContainer } from '@eclipse-sirius/sirius-components'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Container from '@material-ui/core/Container'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; import TextField from '@material-ui/core/TextField'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useEffect } from 'react'; import { Redirect } from 'react-router-dom'; @@ -162,25 +160,10 @@ export const NewProjectView = () => {
- dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/views/project-settings/ProjectImagesSettings.tsx b/packages/sirius-web/frontend/sirius-web/src/views/project-settings/ProjectImagesSettings.tsx index 2276503f54d..9bc735227c5 100644 --- a/packages/sirius-web/frontend/sirius-web/src/views/project-settings/ProjectImagesSettings.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/views/project-settings/ProjectImagesSettings.tsx @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 Obeo. + * Copyright (c) 2022, 2023 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -11,13 +11,12 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useQuery } from '@apollo/client'; -import { ServerContext } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, Toast } from '@eclipse-sirius/sirius-components-core'; import Box from '@material-ui/core/Box'; import Button from '@material-ui/core/Button'; import Grid from '@material-ui/core/Grid'; import IconButton from '@material-ui/core/IconButton'; import Paper from '@material-ui/core/Paper'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles, withStyles } from '@material-ui/core/styles'; import Table from '@material-ui/core/Table'; import TableBody from '@material-ui/core/TableBody'; @@ -27,7 +26,6 @@ import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; -import CloseIcon from '@material-ui/icons/Close'; import DeleteIcon from '@material-ui/icons/Delete'; import EditOutlinedIcon from '@material-ui/icons/EditOutlined'; import FileCopyOutlinedIcon from '@material-ui/icons/FileCopyOutlined'; @@ -204,25 +202,10 @@ export const ProjectImagesSettings = () => { {main} {modal}
- dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/views/projects/ProjectsView.tsx b/packages/sirius-web/frontend/sirius-web/src/views/projects/ProjectsView.tsx index e63230f1a26..6d8edad8514 100644 --- a/packages/sirius-web/frontend/sirius-web/src/views/projects/ProjectsView.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/views/projects/ProjectsView.tsx @@ -12,7 +12,7 @@ *******************************************************************************/ import { gql, useMutation, useQuery } from '@apollo/client'; import { DeleteProjectModal, RenameProjectModal } from '@eclipse-sirius/sirius-components'; -import { ServerContext } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Card from '@material-ui/core/Card'; import CardActions from '@material-ui/core/CardActions'; @@ -26,7 +26,7 @@ import ListItemText from '@material-ui/core/ListItemText'; import Menu from '@material-ui/core/Menu'; import MenuItem from '@material-ui/core/MenuItem'; import Paper from '@material-ui/core/Paper'; -import Snackbar from '@material-ui/core/Snackbar'; +import { makeStyles } from '@material-ui/core/styles'; import Table from '@material-ui/core/Table'; import TableBody from '@material-ui/core/TableBody'; import TableCell from '@material-ui/core/TableCell'; @@ -35,15 +35,13 @@ import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; -import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import DeleteIcon from '@material-ui/icons/Delete'; import EditIcon from '@material-ui/icons/Edit'; import GetAppIcon from '@material-ui/icons/GetApp'; import MoreHorizIcon from '@material-ui/icons/MoreHoriz'; import { useMachine } from '@xstate/react'; import React, { useContext, useEffect } from 'react'; -import { Redirect, Link as RouterLink } from 'react-router-dom'; +import { Link as RouterLink, Redirect } from 'react-router-dom'; import { Footer } from '../../footer/Footer'; import { ProjectTemplatesModal } from '../../modals/project-templates/ProjectTemplatesModal'; import { NavigationBar } from '../../navigationBar/NavigationBar'; @@ -61,8 +59,8 @@ import { GQLGetProjectsQueryVariables, Project, ProjectContextMenuProps, - ProjectTemplate, ProjectsTableProps, + ProjectTemplate, } from './ProjectsView.types'; import { CloseMenuEvent, @@ -74,9 +72,9 @@ import { OpenModalEvent, ProjectsViewContext, ProjectsViewEvent, + projectsViewMachine, SchemaValue, ShowToastEvent, - projectsViewMachine, } from './ProjectsViewMachine'; const getProjectsQuery = gql` @@ -424,25 +422,10 @@ export const ProjectsView = () => {
- dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/sirius-web/frontend/sirius-web/src/views/upload-project/UploadProjectView.tsx b/packages/sirius-web/frontend/sirius-web/src/views/upload-project/UploadProjectView.tsx index b112a375fc9..eb49ed83483 100644 --- a/packages/sirius-web/frontend/sirius-web/src/views/upload-project/UploadProjectView.tsx +++ b/packages/sirius-web/frontend/sirius-web/src/views/upload-project/UploadProjectView.tsx @@ -12,13 +12,10 @@ *******************************************************************************/ import { gql } from '@apollo/client'; import { FileUpload, Form, FormContainer, sendFile } from '@eclipse-sirius/sirius-components'; -import { ServerContext } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Container from '@material-ui/core/Container'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useContext } from 'react'; import { Redirect } from 'react-router-dom'; @@ -130,22 +127,7 @@ export const UploadProjectView = () => { - dispatch({ type: 'HIDE_TOAST' })} - message={message} - data-testid="snackbar" - action={ - dispatch({ type: 'HIDE_TOAST' })}> - - - } - /> + dispatch({ type: 'HIDE_TOAST' })} />
); }; diff --git a/packages/trees/frontend/sirius-components-trees/src/modals/new-document/NewDocumentModal.tsx b/packages/trees/frontend/sirius-components-trees/src/modals/new-document/NewDocumentModal.tsx index 2011d81a1a6..571cf9c38ec 100644 --- a/packages/trees/frontend/sirius-components-trees/src/modals/new-document/NewDocumentModal.tsx +++ b/packages/trees/frontend/sirius-components-trees/src/modals/new-document/NewDocumentModal.tsx @@ -11,19 +11,17 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation, useQuery } from '@apollo/client'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; -import IconButton from '@material-ui/core/IconButton'; import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; import TextField from '@material-ui/core/TextField'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useEffect } from 'react'; import { @@ -229,25 +227,10 @@ export const NewDocumentModal = ({ editingContextId, onClose }: NewDocumentModal - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/trees/frontend/sirius-components-trees/src/modals/upload-document/UploadDocumentModal.tsx b/packages/trees/frontend/sirius-components-trees/src/modals/upload-document/UploadDocumentModal.tsx index dd4ec3293ad..fd6ef68044e 100644 --- a/packages/trees/frontend/sirius-components-trees/src/modals/upload-document/UploadDocumentModal.tsx +++ b/packages/trees/frontend/sirius-components-trees/src/modals/upload-document/UploadDocumentModal.tsx @@ -11,17 +11,14 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql } from '@apollo/client'; -import { ServerContext } from '@eclipse-sirius/sirius-components-core'; +import { ServerContext, Toast } from '@eclipse-sirius/sirius-components-core'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; import FormGroup from '@material-ui/core/FormGroup'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; import { useMachine } from '@xstate/react'; import { useContext, useEffect } from 'react'; @@ -150,25 +147,10 @@ export const UploadDocumentModal = ({ editingContextId, onDocumentUploaded, onCl - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItemContextMenu.tsx b/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItemContextMenu.tsx index a3d0a7ae344..0cff1a2f9a0 100644 --- a/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItemContextMenu.tsx +++ b/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItemContextMenu.tsx @@ -11,13 +11,11 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useMutation } from '@apollo/client'; -import IconButton from '@material-ui/core/IconButton'; +import { Toast } from '@eclipse-sirius/sirius-components-core'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; import Menu from '@material-ui/core/Menu'; import MenuItem from '@material-ui/core/MenuItem'; -import Snackbar from '@material-ui/core/Snackbar'; -import CloseIcon from '@material-ui/icons/Close'; import DeleteIcon from '@material-ui/icons/Delete'; import EditIcon from '@material-ui/icons/Edit'; import React, { useEffect, useState } from 'react'; @@ -63,7 +61,6 @@ export const TreeItemContextMenu = ({ onClose, }: TreeItemContextMenuProps) => { const [state, setState] = useState({ message: null }); - const closeToast = () => setState({ message: null }); const expandItem = () => { if (!item.expanded && item.hasChildren) { @@ -155,22 +152,7 @@ export const TreeItemContextMenu = ({ ) : null} - - - - } - data-testid="error" - /> + setState({ message: null })} /> ); }; diff --git a/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.tsx b/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.tsx index a535b342ed0..dcf96c9e263 100644 --- a/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.tsx +++ b/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.tsx @@ -11,11 +11,8 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useLazyQuery, useSubscription } from '@apollo/client'; -import { WorkbenchViewComponentProps } from '@eclipse-sirius/sirius-components-core'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; +import { Toast, WorkbenchViewComponentProps } from '@eclipse-sirius/sirius-components-core'; import { makeStyles } from '@material-ui/core/styles'; -import { Close as CloseIcon } from '@material-ui/icons'; import { useMachine } from '@xstate/react'; import { useEffect } from 'react'; @@ -42,6 +39,7 @@ import { SynchronizeWithSelectionEvent, } from './ExplorerViewMachine'; import { getTreeEventSubscription } from './getTreeEventSubscription'; + const getTreePathQuery = gql` query getTreePath($editingContextId: ID!, $treeId: ID!, $selectionEntryIds: [ID!]!) { viewer { @@ -179,25 +177,10 @@ export const ExplorerView = ({ editingContextId, selection, setSelection, readOn /> ) : null}
- dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" />
); diff --git a/packages/validation/frontend/sirius-components-validation/src/ValidationView.tsx b/packages/validation/frontend/sirius-components-validation/src/ValidationView.tsx index 6e1a80a81bb..32356ae6623 100644 --- a/packages/validation/frontend/sirius-components-validation/src/ValidationView.tsx +++ b/packages/validation/frontend/sirius-components-validation/src/ValidationView.tsx @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 Obeo and others. + * Copyright (c) 2022, 2023 Obeo and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -11,16 +11,14 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql, useSubscription } from '@apollo/client'; -import { WorkbenchViewComponentProps } from '@eclipse-sirius/sirius-components-core'; +import { Toast, WorkbenchViewComponentProps } from '@eclipse-sirius/sirius-components-core'; import Accordion from '@material-ui/core/Accordion'; import AccordionDetails from '@material-ui/core/AccordionDetails'; import AccordionSummary from '@material-ui/core/AccordionSummary'; import Divider from '@material-ui/core/Divider'; -import IconButton from '@material-ui/core/IconButton'; -import Snackbar from '@material-ui/core/Snackbar'; import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; -import { Close as CloseIcon, ExpandMore as ExpandMoreIcon } from '@material-ui/icons'; +import { ExpandMore as ExpandMoreIcon } from '@material-ui/icons'; import { useMachine } from '@xstate/react'; import React, { useEffect } from 'react'; import { GQLValidationEventSubscription, GQLValidationEventVariables } from './ValidationView.types'; @@ -153,25 +151,10 @@ export const ValidationView = ({ editingContextId }: WorkbenchViewComponentProps return ( <> {content} - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)} - message={message} - action={ - dispatch({ type: 'HIDE_TOAST' } as HideToastEvent)}> - - - } - data-testid="error" /> ); diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewToolConfiguration.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewToolConfiguration.java new file mode 100644 index 00000000000..a494d88bbb7 --- /dev/null +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewToolConfiguration.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.view.emf.configuration; + +import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IURLParser; +import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionPredicate; +import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionSearchService; +import org.springframework.context.annotation.Configuration; + +/** + * Bundles the common dependencies that view tool services need into a single object for convenience. + * + * @author frouene + */ +@Configuration +public class ViewToolConfiguration { + + private final IURLParser urlParser; + + private final IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate; + + private final IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService; + + private final IObjectService objectService; + + public ViewToolConfiguration(IURLParser urlParser, IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate, IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService, IObjectService objectService) { + this.urlParser = urlParser; + this.viewRepresentationDescriptionPredicate = viewRepresentationDescriptionPredicate; + this.viewRepresentationDescriptionSearchService = viewRepresentationDescriptionSearchService; + this.objectService = objectService; + } + + public IURLParser getUrlParser() { + return this.urlParser; + } + + public IViewRepresentationDescriptionPredicate getViewRepresentationDescriptionPredicate() { + return this.viewRepresentationDescriptionPredicate; + } + + public IViewRepresentationDescriptionSearchService getViewRepresentationDescriptionSearchService() { + return this.viewRepresentationDescriptionSearchService; + } + + public IObjectService getObjectService() { + return this.objectService; + } +} diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/DiagramOperationInterpreter.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/DiagramOperationInterpreter.java index 4d3cf70d8bd..fe0eeae6b11 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/DiagramOperationInterpreter.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/DiagramOperationInterpreter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 Obeo. + * Copyright (c) 2022, 2023 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.sirius.components.view.emf.diagram; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -19,6 +20,7 @@ import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramContext; import org.eclipse.sirius.components.core.api.IEditService; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.diagrams.description.NodeDescription; import org.eclipse.sirius.components.interpreter.AQLInterpreter; @@ -46,21 +48,28 @@ public class DiagramOperationInterpreter implements IOperationInterpreter { private final IDiagramContext diagramContext; + private final IFeedbackMessageService feedbackMessageService; + private final Map convertedNodes; public DiagramOperationInterpreter(AQLInterpreter interpreter, IObjectService objectService, IEditService editService, IDiagramContext diagramContext, - Map convertedNodes) { + Map convertedNodes, IFeedbackMessageService feedbackMessageService) { this.interpreter = Objects.requireNonNull(interpreter); this.objectService = Objects.requireNonNull(objectService); this.editService = Objects.requireNonNull(editService); this.diagramContext = diagramContext; this.convertedNodes = Objects.requireNonNull(convertedNodes); + this.feedbackMessageService = feedbackMessageService; } public IStatus executeTool(Tool tool, VariableManager variableManager) { Optional optionalVariableManager = this.executeOperations(tool.getBody(), variableManager); if (optionalVariableManager.isEmpty()) { - return new Failure(String.format("Something went wrong while executing the tool '%s'", tool.getName())); + var feedbackMessages = new ArrayList<>(List.of(String.format("Something went wrong while executing the tool '%s'", tool.getName()))); + if (Objects.nonNull(this.feedbackMessageService)) { + feedbackMessages.addAll(this.feedbackMessageService.getFeedbackMessages()); + } + return new Failure(String.join(", ", feedbackMessages)); } return new Success(); } diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ToolConverter.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ToolConverter.java index fad1d35db38..077ecc90294 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ToolConverter.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ToolConverter.java @@ -23,6 +23,7 @@ import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramContext; import org.eclipse.sirius.components.core.api.IEditService; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.diagrams.tools.ITool; import org.eclipse.sirius.components.diagrams.tools.SingleClickOnDiagramElementTool; @@ -45,20 +46,24 @@ * @author pcdavid */ public class ToolConverter { + private static final String CONVERTED_NODES_VARIABLE = "convertedNodes"; private final IObjectService objectService; private final IEditService editService; + private final IFeedbackMessageService feedbackMessageService; + private final Function idProvider = (eObject) -> { // DiagramElementDescription should have a proper id. return UUID.nameUUIDFromBytes(EcoreUtil.getURI(eObject).toString().getBytes()); }; - public ToolConverter(IObjectService objectService, IEditService editService, IViewToolImageProvider viewToolImageProvider) { + public ToolConverter(IObjectService objectService, IEditService editService, IViewToolImageProvider viewToolImageProvider, IFeedbackMessageService feedbackMessageService) { this.objectService = Objects.requireNonNull(objectService); this.editService = Objects.requireNonNull(editService); + this.feedbackMessageService = feedbackMessageService; } /** @@ -209,7 +214,8 @@ private List createEdgePaletteTools(EdgeDescription edgeDescription, View private IStatus execute(ViewDiagramDescriptionConverterContext converterContext, Map capturedConvertedNodes, Tool tool, VariableManager variableManager) { IDiagramContext diagramContext = variableManager.get(IDiagramContext.DIAGRAM_CONTEXT, IDiagramContext.class).orElse(null); - var operationInterpreter = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, diagramContext, capturedConvertedNodes); + var operationInterpreter = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, diagramContext, + capturedConvertedNodes, this.feedbackMessageService); return operationInterpreter.executeTool(tool, variableManager); } } diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java index cc1a298bf49..5b35a8421aa 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java @@ -30,6 +30,7 @@ import org.eclipse.sirius.components.compatibility.emf.DomainClassPredicate; import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.diagrams.Edge; import org.eclipse.sirius.components.diagrams.EdgeStyle; @@ -101,12 +102,15 @@ public class ViewDiagramDescriptionConverter implements IRepresentationDescripti private final Function semanticTargetLabelProvider; - public ViewDiagramDescriptionConverter(IObjectService objectService, IEditService editService, List iNodeStyleProviders, IDiagramIdProvider diagramIdProvider, IViewToolImageProvider viewToolImageProvider) { + private final IFeedbackMessageService feedbackMessageService; + + public ViewDiagramDescriptionConverter(IObjectService objectService, IEditService editService, List iNodeStyleProviders, IDiagramIdProvider diagramIdProvider, IViewToolImageProvider viewToolImageProvider, IFeedbackMessageService feedbackMessageService) { this.objectService = Objects.requireNonNull(objectService); this.editService = Objects.requireNonNull(editService); this.diagramIdProvider = Objects.requireNonNull(diagramIdProvider); this.viewToolImageProvider = Objects.requireNonNull(viewToolImageProvider); this.stylesFactory = new StylesFactory(Objects.requireNonNull(iNodeStyleProviders), this.objectService); + this.feedbackMessageService = feedbackMessageService; this.semanticTargetIdProvider = variableManager -> this.self(variableManager).map(this.objectService::getId).orElse(null); this.semanticTargetKindProvider = variableManager -> this.self(variableManager).map(this.objectService::getKind).orElse(null); this.semanticTargetLabelProvider = variableManager -> this.self(variableManager).map(this.objectService::getLabel).orElse(null); @@ -125,7 +129,7 @@ public IRepresentationDescription convert(RepresentationDescription viewRepresen List nodeDescriptions = viewDiagramDescription.getNodeDescriptions().stream().map(node -> this.convert(node, converterContext)).toList(); List edgeDescriptions = viewDiagramDescription.getEdgeDescriptions().stream().map(edge -> this.convert(edge, converterContext)).toList(); // @formatter:off - var toolConverter = new ToolConverter(this.objectService, this.editService, this.viewToolImageProvider); + var toolConverter = new ToolConverter(this.objectService, this.editService, this.viewToolImageProvider, this.feedbackMessageService); return DiagramDescription.newDiagramDescription(this.diagramIdProvider.getId(viewDiagramDescription)) .label(Optional.ofNullable(viewDiagramDescription.getName()).orElse(DEFAULT_DIAGRAM_LABEL)) @@ -159,7 +163,8 @@ private Function createDiagramDropHandler(org.eclipse. if (optionalDropTool.isPresent()) { var augmentedVariableManager = variableManager.createChild(); augmentedVariableManager.put(CONVERTED_NODES_VARIABLE, capturedNodeDescriptions); - return new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), capturedNodeDescriptions) + return new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), + capturedNodeDescriptions, this.feedbackMessageService) .executeTool(optionalDropTool.get(), augmentedVariableManager); } else { return new Failure("No drop handler configured"); @@ -478,7 +483,8 @@ private Function createDeleteHandler(DiagramElementDes var optionalTooltool = new ToolFinder().findDeleteTool(diagramElementDescription); if (optionalTooltool.isPresent()) { - result = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), capturedConvertedNodes) + result = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), + capturedConvertedNodes, this.feedbackMessageService) .executeTool(optionalTooltool.get(), child); } else { result = new Failure("No deletion tool configured"); @@ -527,7 +533,8 @@ private BiFunction createNodeLabelEditHandler( childVariableManager.put(CONVERTED_NODES_VARIABLE, capturedConvertedNodes); var optionalTool = new ToolFinder().findNodeLabelEditTool(nodeDescription); if (optionalTool.isPresent()) { - result = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), capturedConvertedNodes) + result = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), + capturedConvertedNodes, this.feedbackMessageService) .executeTool(optionalTool.get(), childVariableManager); } else { result = new Failure("No label edition tool configured"); @@ -558,7 +565,8 @@ private IEdgeEditLabelHandler createEdgeLabelEditHandler(org.eclipse.sirius.comp Optional optionalTool = new ToolFinder().findLabelEditTool(edgeDescription, edgeLabelKind); if (optionalTool.isPresent()) { - result = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), capturedConvertedNodes) + result = new DiagramOperationInterpreter(converterContext.getInterpreter(), this.objectService, this.editService, this.getDiagramContext(variableManager), + capturedConvertedNodes, this.feedbackMessageService) .executeTool(optionalTool.get(), childVariableManager); } else { result = new Failure("No label edition tool configured"); diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java index 5d5030cd0fe..7f6403a0579 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java @@ -23,6 +23,7 @@ import org.eclipse.sirius.components.collaborative.diagrams.api.ReconnectionToolInterpreterData; import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.core.api.IURLParser; import org.eclipse.sirius.components.diagrams.Edge; @@ -39,6 +40,7 @@ import org.eclipse.sirius.components.view.emf.IJavaServiceProvider; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionPredicate; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionSearchService; +import org.eclipse.sirius.components.view.emf.configuration.ViewToolConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -66,20 +68,22 @@ public class ViewReconnectionToolsExecutor implements IReconnectionToolsExecutor private final IURLParser urlParser; + private final IFeedbackMessageService feedbackMessageService; + private final ApplicationContext applicationContext; private final Logger logger = LoggerFactory.getLogger(ViewReconnectionToolsExecutor.class); - public ViewReconnectionToolsExecutor(IObjectService objectService, IEditService editService, IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService, - List javaServiceProviders, IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate, IURLParser urlParser, - ApplicationContext applicationContext) { - this.objectService = Objects.requireNonNull(objectService); + public ViewReconnectionToolsExecutor(ViewToolConfiguration configuration, IEditService editService, List javaServiceProviders, + ApplicationContext applicationContext, IFeedbackMessageService feedbackMessageService) { + this.objectService = Objects.requireNonNull(configuration.getObjectService()); this.editService = Objects.requireNonNull(editService); - this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(viewRepresentationDescriptionSearchService); + this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(configuration.getViewRepresentationDescriptionSearchService()); this.javaServiceProviders = Objects.requireNonNull(javaServiceProviders); - this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(viewRepresentationDescriptionPredicate); - this.urlParser = Objects.requireNonNull(urlParser); + this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(configuration.getViewRepresentationDescriptionPredicate()); + this.urlParser = Objects.requireNonNull(configuration.getUrlParser()); this.applicationContext = Objects.requireNonNull(applicationContext); + this.feedbackMessageService = feedbackMessageService; } @Override @@ -119,7 +123,8 @@ public IStatus execute(IEditingContext editingContext, ReconnectionToolInterpret VariableManager variableManager = this.createVariableManager(toolInterpreterData, editingContext); AQLInterpreter interpreter = this.createInterpreter((View) viewDiagramDescription.eContainer(), this.getAccessibleEPackages(editingContext)); - var diagramOperationInterpreter = new DiagramOperationInterpreter(interpreter, this.objectService, this.editService, toolInterpreterData.getDiagramContext(), Map.of()); + var diagramOperationInterpreter = new DiagramOperationInterpreter(interpreter, this.objectService, this.editService, toolInterpreterData.getDiagramContext(), + Map.of(), this.feedbackMessageService); diagramOperationInterpreter.executeOperations(edgeReconnectionTool.getBody(), variableManager); } diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewToolSectionsProvider.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewToolSectionsProvider.java index 807763a14e5..24351aa1455 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewToolSectionsProvider.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewToolSectionsProvider.java @@ -45,6 +45,7 @@ import org.eclipse.sirius.components.view.NodeTool; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionPredicate; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionSearchService; +import org.eclipse.sirius.components.view.emf.configuration.ViewToolConfiguration; import org.springframework.stereotype.Service; /** @@ -80,12 +81,12 @@ public class ViewToolSectionsProvider implements IToolSectionsProvider { return UUID.nameUUIDFromBytes(EcoreUtil.getURI(eObject).toString().getBytes()); }; - public ViewToolSectionsProvider(IURLParser urlParser, IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate, IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService, IDiagramDescriptionService diagramDescriptionService, IObjectService objectService) { - this.urlParser = Objects.requireNonNull(urlParser); - this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(viewRepresentationDescriptionPredicate); - this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(viewRepresentationDescriptionSearchService); + public ViewToolSectionsProvider(ViewToolConfiguration configuration, IDiagramDescriptionService diagramDescriptionService) { + this.urlParser = Objects.requireNonNull(configuration.getUrlParser()); + this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(configuration.getViewRepresentationDescriptionPredicate()); + this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(configuration.getViewRepresentationDescriptionSearchService()); this.diagramDescriptionService = Objects.requireNonNull(diagramDescriptionService); - this.objectService = Objects.requireNonNull(objectService); + this.objectService = Objects.requireNonNull(configuration.getObjectService()); } @Override @@ -413,4 +414,4 @@ private boolean hasDeleteTool(Object diagramElementDescription) { } return result; } -} \ No newline at end of file +} diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverter.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverter.java index d578af7baca..65183f0d0f6 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverter.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverter.java @@ -25,6 +25,7 @@ import org.eclipse.emf.ecore.util.Switch; import org.eclipse.sirius.components.compatibility.emf.DomainClassPredicate; import org.eclipse.sirius.components.core.api.IEditService; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.forms.GroupDisplayMode; import org.eclipse.sirius.components.forms.description.AbstractControlDescription; @@ -66,11 +67,14 @@ public class ViewFormDescriptionConverter implements IRepresentationDescriptionC private final List customWidgetConverterProviders; - public ViewFormDescriptionConverter(IObjectService objectService, IEditService editService, IFormIdProvider formIdProvider, List customWidgetConverterProviders) { + private final IFeedbackMessageService feedbackMessageService; + + public ViewFormDescriptionConverter(IObjectService objectService, IEditService editService, IFormIdProvider formIdProvider, List customWidgetConverterProviders, IFeedbackMessageService feedbackMessageService) { this.objectService = Objects.requireNonNull(objectService); this.editService = Objects.requireNonNull(editService); this.formIdProvider = Objects.requireNonNull(formIdProvider); this.customWidgetConverterProviders = Objects.requireNonNull(customWidgetConverterProviders); + this.feedbackMessageService = feedbackMessageService; } @Override @@ -82,7 +86,7 @@ public boolean canConvert(RepresentationDescription representationDescription) { public IRepresentationDescription convert(RepresentationDescription representationDescription, List allRepresentationDescriptions, AQLInterpreter interpreter) { org.eclipse.sirius.components.view.FormDescription viewFormDescription = (org.eclipse.sirius.components.view.FormDescription) representationDescription; List> widgetConverters = this.customWidgetConverterProviders.stream().map(provider -> provider.getWidgetConverter(interpreter, this.editService, this.objectService)).toList(); - Switch dispatcher = new ViewFormDescriptionConverterSwitch(interpreter, this.editService, this.objectService, new ComposedSwitch<>(widgetConverters)); + Switch dispatcher = new ViewFormDescriptionConverterSwitch(interpreter, this.editService, this.objectService, new ComposedSwitch<>(widgetConverters), this.feedbackMessageService); List pageDescriptions = viewFormDescription.getPages() .stream() diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverterSwitch.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverterSwitch.java index 977e9199b4b..30d8f9335fe 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverterSwitch.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/form/ViewFormDescriptionConverterSwitch.java @@ -35,6 +35,7 @@ import org.eclipse.sirius.components.compatibility.utils.StringValueProvider; import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.forms.ButtonStyle; import org.eclipse.sirius.components.forms.CheckboxStyle; @@ -102,11 +103,14 @@ public class ViewFormDescriptionConverterSwitch extends ViewSwitch customWidgetConverters; - public ViewFormDescriptionConverterSwitch(AQLInterpreter interpreter, IEditService editService, IObjectService objectService, Switch customWidgetConverters) { + private final IFeedbackMessageService feedbackMessageService; + + public ViewFormDescriptionConverterSwitch(AQLInterpreter interpreter, IEditService editService, IObjectService objectService, Switch customWidgetConverters, IFeedbackMessageService feedbackMessageService) { this.interpreter = Objects.requireNonNull(interpreter); this.editService = Objects.requireNonNull(editService); this.objectService = Objects.requireNonNull(objectService); this.customWidgetConverters = Objects.requireNonNull(customWidgetConverters); + this.feedbackMessageService = feedbackMessageService; } @Override @@ -618,7 +622,7 @@ private IStatus getListItemClickHandler(VariableManager variableManager, List optionalVariableManager = operationInterpreter.executeOperations(operations, variableManager); if (optionalVariableManager.isEmpty()) { - return new Failure("Something went wrong while handling the item click."); + return this.buildFailureWithFeedbackMessages("Something went wrong while handling the item click."); } else { return new Success(ChangeKind.SEMANTIC_CHANGE, Map.of()); } @@ -674,7 +678,7 @@ private Function getOptionIdProvider() { private BiFunction, IStatus> getMultiSelectNewValuesHandler(List operations) { return (variableManager, newValue) -> { - IStatus status = new Failure("An error occured while handling the new selected values."); + IStatus status = this.buildFailureWithFeedbackMessages("An error occured while handling the new selected values."); Optional optionalEditingDomain = variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class); if (optionalEditingDomain.isPresent()) { IEditingContext editingContext = optionalEditingDomain.get(); @@ -689,7 +693,7 @@ private BiFunction, IStatus> getMultiSelectNewValu OperationInterpreter operationInterpreter = new OperationInterpreter(this.interpreter, this.editService); Optional optionalVariableManager = operationInterpreter.executeOperations(operations, childVariableManager); if (optionalVariableManager.isEmpty()) { - status = new Failure("Something went wrong while handling the MultiSelect widget new values."); + status = this.buildFailureWithFeedbackMessages("Something went wrong while handling the MultiSelect widget new values."); } else { status = new Success(); } @@ -740,7 +744,7 @@ private Function getOperationsHandler(List OperationInterpreter operationInterpreter = new OperationInterpreter(this.interpreter, this.editService); Optional optionalVariableManager = operationInterpreter.executeOperations(operations, variableManager); if (optionalVariableManager.isEmpty()) { - return new Failure("Something went wrong while handling the widget operations execution."); + return this.buildFailureWithFeedbackMessages("Something went wrong while handling the widget operations execution."); } else { return new Success(); } @@ -754,7 +758,7 @@ private BiFunction getNewValueHandler(List optionalVariableManager = operationInterpreter.executeOperations(operations, childVariableManager); if (optionalVariableManager.isEmpty()) { - return new Failure("Something went wrong while handling the widget new value."); + return this.buildFailureWithFeedbackMessages("Something went wrong while handling the widget new value."); } else { return new Success(); } @@ -763,7 +767,7 @@ private BiFunction getNewValueHandler(List getSelectNewValueHandler(List operations) { return (variableManager, newValue) -> { - IStatus status = new Failure("An error occured while handling the new selected value."); + IStatus status; Object newValueObject = null; if (newValue != null && !newValue.isBlank()) { @@ -775,7 +779,7 @@ private BiFunction getSelectNewValueHandler(Li OperationInterpreter operationInterpreter = new OperationInterpreter(this.interpreter, this.editService); Optional optionalVariableManager = operationInterpreter.executeOperations(operations, childVariableManager); if (optionalVariableManager.isEmpty()) { - status = new Failure("Something went wrong while handling the Select widget new value."); + status = this.buildFailureWithFeedbackMessages("Something went wrong while handling the Select widget new value."); } else { status = new Success(); } @@ -791,7 +795,7 @@ private String getDescriptionId(EObject description) { private String getListItemImageURL(VariableManager variablemanager) { // @formatter:off return variablemanager.get(ListComponent.CANDIDATE_VARIABLE, EObject.class) - .map(candidate -> this.objectService.getImagePath(candidate)) + .map(this.objectService::getImagePath) .orElse(""); // @formatter:on } @@ -800,4 +804,12 @@ private boolean matches(String condition, VariableManager variableManager) { return this.interpreter.evaluateExpression(variableManager.getVariables(), condition).asBoolean().orElse(Boolean.FALSE); } + private Failure buildFailureWithFeedbackMessages(String technicalMessage) { + var errorMessages = new ArrayList<>(List.of(technicalMessage)); + if (Objects.nonNull(this.feedbackMessageService)) { + errorMessages.addAll(this.feedbackMessageService.getFeedbackMessages()); + } + return new Failure(String.join(", ", errorMessages)); + } + } diff --git a/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicDiagramsTests.java b/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicDiagramsTests.java index 2a02302c166..51f83bcf52c 100644 --- a/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicDiagramsTests.java +++ b/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicDiagramsTests.java @@ -27,6 +27,7 @@ import org.eclipse.sirius.components.collaborative.diagrams.DiagramCreationService; import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.diagrams.Diagram; @@ -147,7 +148,7 @@ private Diagram render(DiagramDescription diagramDescription, Object target) { new ResourceSetImpl().getResources().add(res); ViewDiagramDescriptionConverter diagramDescriptionConverter = new ViewDiagramDescriptionConverter(new IObjectService.NoOp(), new IEditService.NoOp(), List.of(), - new IDiagramIdProvider.NoOp(), new IViewToolImageProvider.NoOp()); + new IDiagramIdProvider.NoOp(), new IViewToolImageProvider.NoOp(), new IFeedbackMessageService.NoOp()); var viewConverter = new ViewConverter(List.of(), List.of(diagramDescriptionConverter), new StaticApplicationContext()); List conversionResult = viewConverter.convert(List.of(view), List.of(EcorePackage.eINSTANCE)); assertThat(conversionResult).hasSize(1); diff --git a/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicFormsTests.java b/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicFormsTests.java index 33e5f6183d5..2884f5c71c6 100644 --- a/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicFormsTests.java +++ b/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/view/DynamicFormsTests.java @@ -31,6 +31,7 @@ import org.eclipse.sirius.components.charts.piechart.components.PieChartStyle; import org.eclipse.sirius.components.core.api.IEditService; import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.forms.AbstractFontStyle; import org.eclipse.sirius.components.forms.AbstractWidget; @@ -1281,7 +1282,7 @@ public Optional getObject(IEditingContext editingContext, String objectI IEditService.NoOp editService = new IEditService.NoOp() { }; - ViewFormDescriptionConverter formDescriptionConverter = new ViewFormDescriptionConverter(objectService, editService, new IFormIdProvider.NoOp(), List.of()); + ViewFormDescriptionConverter formDescriptionConverter = new ViewFormDescriptionConverter(objectService, editService, new IFormIdProvider.NoOp(), List.of(), new IFeedbackMessageService.NoOp()); var viewConverter = new ViewConverter(List.of(), List.of(formDescriptionConverter), new StaticApplicationContext()); List conversionResult = viewConverter.convert(List.of(view), List.of(EcorePackage.eINSTANCE)); assertThat(conversionResult).hasSize(1); diff --git a/packages/web/backend/sirius-components-web/src/main/java/org/eclipse/sirius/components/web/services/FeedbackMessageService.java b/packages/web/backend/sirius-components-web/src/main/java/org/eclipse/sirius/components/web/services/FeedbackMessageService.java new file mode 100644 index 00000000000..46fdc2e4ba3 --- /dev/null +++ b/packages/web/backend/sirius-components-web/src/main/java/org/eclipse/sirius/components/web/services/FeedbackMessageService.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.web.services; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.eclipse.sirius.components.core.api.FeedbackLevel; +import org.eclipse.sirius.components.core.api.FeedbackMessage; +import org.eclipse.sirius.components.core.api.IFeedbackMessageService; +import org.springframework.stereotype.Service; +import org.springframework.web.context.annotation.RequestScope; + +/** + * Service used to stack the feedback messages during a tool operation. + * The scope of this bean must be {@link RequestScope}, because it only concerns the current operation. + * + * @author frouene + */ +@Service +@RequestScope +public class FeedbackMessageService implements IFeedbackMessageService { + + + private final List feedbackMessages = Collections.synchronizedList(new ArrayList<>()); + + + @Override + public void addFeedbackMessage(String message, FeedbackLevel level) { + this.feedbackMessages.add(new FeedbackMessage(message, level)); + } + + @Override + public List getFeedbackMessages() { + return this.feedbackMessages + .stream() + .map(this::applyLevelEmoji) + .toList(); + } + + private String applyLevelEmoji(FeedbackMessage feedback) { + String prefix = switch (feedback.level()) { + case DEBUG -> new String(Character.toChars(0x1F41B)); + case INFO -> new String(Character.toChars(0x2139)); + case WARNING -> new String(Character.toChars(0x26A0)); + case ERROR -> new String(Character.toChars(0x274C)); + }; + return String.format("%s %s", prefix, feedback.message()); + } + +}