Merge branch '19305-project-update-dialog-properties' into main. Closes #19305
authorStephen Smith <stephen@curii.com>
Tue, 2 Aug 2022 15:46:53 +0000 (11:46 -0400)
committerStephen Smith <stephen@curii.com>
Tue, 2 Aug 2022 15:46:53 +0000 (11:46 -0400)
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

cypress/integration/project.spec.js
src/store/projects/project-update-actions.ts
src/views-components/resource-properties/resource-properties-list.tsx

index c4983e3e16bc5f135a0b6e4a29f24c3dad79bf58..b2f6f33df33fc0772f0a6eedbf2973aff9a87d7e 100644 (file)
@@ -85,6 +85,39 @@ describe('Project tests', function() {
                 // Pink is not in the test vocab
                 {IDTAGCOLORS: ['IDVALCOLORS3', 'Pink', 'IDVALCOLORS1']});
         });
+
+        // Open project edit via breadcrumbs
+        cy.get('[data-cy=breadcrumbs]').contains(projName).rightclick();
+        cy.get('[data-cy=context-menu]').contains('Edit').click();
+        cy.get('[data-cy=form-dialog]').within(() => {
+            cy.get('[data-cy=resource-properties-list]').within(() => {
+                cy.get('div[role=button]').contains('Color: Magenta');
+                cy.get('div[role=button]').contains('Color: Pink');
+                cy.get('div[role=button]').contains('Color: Yellow');
+            });
+        });
+        // Add another property
+        cy.get('[data-cy=resource-properties-form]').within(() => {
+            cy.get('[data-cy=property-field-key]').within(() => {
+                cy.get('input').type('Animal');
+            });
+            cy.get('[data-cy=property-field-value]').within(() => {
+                cy.get('input').type('Dog');
+            });
+            cy.root().submit();
+        });
+        cy.get('[data-cy=form-submit-btn]').click();
+        // Reopen edit via breadcrumbs and verify properties
+        cy.get('[data-cy=breadcrumbs]').contains(projName).rightclick();
+        cy.get('[data-cy=context-menu]').contains('Edit').click();
+        cy.get('[data-cy=form-dialog]').within(() => {
+            cy.get('[data-cy=resource-properties-list]').within(() => {
+                cy.get('div[role=button]').contains('Color: Magenta');
+                cy.get('div[role=button]').contains('Color: Pink');
+                cy.get('div[role=button]').contains('Color: Yellow');
+                cy.get('div[role=button]').contains('Animal: Dog');
+            });
+        });
     });
 
     it('creates new project on home project and then a subproject inside it', function() {
index 52abfd3fd2085ffb97c3361564ee73d1954421a2..a6e6748535596e26d09c9b3f948ebf1cabe186dd 100644 (file)
@@ -22,6 +22,8 @@ import { projectPanelActions } from 'store/project-panel/project-panel-action';
 import { GroupClass } from "models/group";
 import { Participant } from "views-components/sharing-dialog/participant-select";
 import { ProjectProperties } from "./project-create-actions";
+import { getResource } from "store/resources/resources";
+import { ProjectResource } from "models/project";
 
 export interface ProjectUpdateFormDialogData {
     uuid: string;
@@ -37,7 +39,9 @@ export const PROJECT_UPDATE_FORM_SELECTOR = formValueSelector(PROJECT_UPDATE_FOR
 
 export const openProjectUpdateDialog = (resource: ProjectUpdateFormDialogData) =>
     (dispatch: Dispatch, getState: () => RootState) => {
-        dispatch(initialize(PROJECT_UPDATE_FORM_NAME, resource));
+        // Get complete project resource from store to handle consumers passing in partial resources
+        const project = getResource<ProjectResource>(resource.uuid)(getState().resources);
+        dispatch(initialize(PROJECT_UPDATE_FORM_NAME, project));
         dispatch(dialogActions.OPEN_DIALOG({
             id: PROJECT_UPDATE_FORM_NAME,
             data: {
index a7b5825244abc7c2e859e676db49a32321fa2b67..47d7729b4dc1a0d16e935968f47aa22685d0fdc4 100644 (file)
@@ -38,7 +38,7 @@ ResourcePropertiesListActionProps & WithStyles<CssRules>;
 
 const List = withStyles(styles)(
     ({ classes, handleDelete, properties }: ResourcePropertiesListProps) =>
-        <div>
+        <div data-cy="resource-properties-list">
             {properties &&
                 Object.keys(properties).map(k =>
                     Array.isArray(properties[k])
@@ -63,4 +63,4 @@ export const resourcePropertiesList = (formName: string) =>
         (dispatch: Dispatch): ResourcePropertiesListActionProps => ({
                 handleDelete: (key: string, value: string) => dispatch<any>(removePropertyFromResourceForm(key, value, formName))
         })
-    )(List);
\ No newline at end of file
+    )(List);