18692: Changed Snackbar closing
authorDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Wed, 24 Aug 2022 22:38:13 +0000 (00:38 +0200)
committerDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Wed, 24 Aug 2022 22:38:13 +0000 (00:38 +0200)
Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła <daniel.kutyla@contractors.roche.com>

cypress/integration/group-manage.spec.js
src/store/snackbar/snackbar-reducer.ts
src/views-components/snackbar/snackbar.tsx

index 0c28997f5818e4ccb4f3d4c95c4cdffde3057e8b..ffe2c8c4dfd27ac892007213c2209b0afff4686c 100644 (file)
@@ -254,7 +254,7 @@ describe('Group manage tests', function() {
             .should('not.contain', groupName + ' (renamed)');
     });
 
-    it.skip('disables group-related controls for built-in groups', function() {
+    it('disables group-related controls for built-in groups', function() {
         cy.loginAs(adminUser);
 
         ['All users', 'Anonymous users', 'System group'].forEach((builtInGroup) => {
index fa1717c7a4aba0cd51b0e633d486150fde87b64a..e367ac5fe644223d8119e94af30b9d2cf82d9670 100644 (file)
@@ -29,10 +29,21 @@ export const snackbarReducer = (state = initialState, action: SnackbarAction) =>
                 })
             };
         },
-        CLOSE_SNACKBAR: () => ({
-            ...state,
-            open: false
-        }),
+        CLOSE_SNACKBAR: (payload) => {
+            let newMessages: any = [...state.messages];// state.messages.filter(({ message }) => message !== payload);
+
+            if (JSON.stringify(payload) === '{}') {
+                newMessages.pop();
+            } else {
+                newMessages = state.messages.filter(({ message }) => message !== payload);
+            }
+
+            return {
+                ...state,
+                messages: newMessages,
+                open: newMessages.length > 0
+            }
+        },
         SHIFT_MESSAGES: () => {
             const messages = state.messages.filter((m, idx) => idx > 0);
             return {
index 037f564ade53f3eafde08f9c4eb60a0339b175ed..2aa607091a7e2202ecd47b44baa9e58aa5861ffa 100644 (file)
@@ -27,7 +27,7 @@ interface SnackbarDataProps {
 }
 
 interface SnackbarEventProps {
-    onClose?: (event: React.SyntheticEvent<any>, reason: string) => void;
+    onClose?: (event: React.SyntheticEvent<any>, reason: string, message?: string) => void;
     onExited: () => void;
     onClick: (uuid: string) => void;
 }
@@ -43,9 +43,9 @@ const mapStateToProps = (state: RootState): SnackbarDataProps => {
 };
 
 const mapDispatchToProps = (dispatch: Dispatch): SnackbarEventProps => ({
-    onClose: (event: any, reason: string) => {
+    onClose: (event: any, reason: string, message: '') => {
         if (reason !== "clickaway") {
-            dispatch(snackbarActions.CLOSE_SNACKBAR());
+            dispatch(snackbarActions.CLOSE_SNACKBAR(message));
         }
     },
     onExited: () => {
@@ -116,6 +116,7 @@ export const Snackbar = withStyles(styles)(connect(mapStateToProps, mapDispatchT
                             const [Icon, cssClass] = variants[message.kind];
 
                             return <SnackbarContent
+                                key={message.message}
                                 className={classNames(cssClass, classes.snackbarContent)}
                                 aria-describedby="client-snackbar"
                                 message={
@@ -140,7 +141,7 @@ const actions = (props: SnackbarMessage, onClick, onClose, classes) => {
             key="close"
             aria-label="Close"
             color="inherit"
-            onClick={e => onClose && onClose(e, '')}>
+            onClick={e => onClose && onClose(e, '', props.message)}>
             <CloseIcon className={classes.icon} />
         </IconButton>
     ];