Skip to content

Commit

Permalink
Psp 10048 - research final file edit behaviour corrections. (#4664)
Browse files Browse the repository at this point in the history
* psp-9813 ensure error messages from backend display properly.

* psp-10048 add logic to hide research file edit when file in final status - only make editable for admins.

---------

Co-authored-by: Alejandro Sanchez <[email protected]>
  • Loading branch information
devinleighsmith and asanchezr authored Feb 24, 2025
1 parent 4b1054f commit 1bca254
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { SideBarContext } from '../../context/sidebarContext';
import { FileTabs, FileTabType, TabFileView } from '../../shared/detail/FileTabs';
import DocumentsTab from '../../shared/tabs/DocumentsTab';
import ResearchSummaryView from './fileDetails/details/ResearchSummaryView';
import ResearchStatusUpdateSolver from './fileDetails/ResearchStatusUpdateSolver';

export interface IResearchTabsContainerProps {
researchFile?: ApiGen_Concepts_ResearchFile;
Expand All @@ -35,6 +36,7 @@ export const ResearchTabsContainer: React.FunctionComponent<
const defaultTab = FileTabType.FILE_DETAILS;
const { tab } = useParams<{ tab?: string }>();
const activeTab = Object.values(FileTabType).find(value => value === tab) ?? defaultTab;
const statusSolver = new ResearchStatusUpdateSolver(researchFile);

const setActiveTab = (tab: FileTabType) => {
if (activeTab !== tab) {
Expand All @@ -47,7 +49,13 @@ export const ResearchTabsContainer: React.FunctionComponent<
};

tabViews.push({
content: <ResearchSummaryView researchFile={researchFile} setEditMode={setIsEditing} />,
content: (
<ResearchSummaryView
researchFile={researchFile}
setEditMode={setIsEditing}
isFileFinalStatus={!statusSolver.canEditDetails()}
/>
),
key: FileTabType.FILE_DETAILS,
name: 'File Details',
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { getMockResearchFile } from '@/mocks/researchFile.mock';
import { act, render, RenderOptions, userEvent } from '@/utils/test-utils';

import ResearchSummaryView, { IResearchSummaryViewProps } from './ResearchSummaryView';
import Roles from '@/constants/roles';

const setEditMode = vi.fn();

Expand All @@ -13,6 +14,7 @@ describe('ResearchSummaryView component', () => {
<ResearchSummaryView
researchFile={renderOptions.researchFile}
setEditMode={renderOptions.setEditMode}
isFileFinalStatus={renderOptions.isFileFinalStatus}
/>,
{
...renderOptions,
Expand All @@ -28,7 +30,11 @@ describe('ResearchSummaryView component', () => {
});

it('renders as expected when research file is provided', () => {
const { asFragment } = setup({ researchFile: getMockResearchFile(), setEditMode });
const { asFragment } = setup({
researchFile: getMockResearchFile(),
setEditMode,
isFileFinalStatus: false,
});
expect(asFragment()).toMatchSnapshot();
});

Expand All @@ -37,6 +43,7 @@ describe('ResearchSummaryView component', () => {
researchFile: getMockResearchFile(),
setEditMode,
claims: [],
isFileFinalStatus: false,
});
const editResearchFile = queryByTitle('Edit research file');
expect(editResearchFile).toBeNull();
Expand All @@ -47,6 +54,7 @@ describe('ResearchSummaryView component', () => {
researchFile: getMockResearchFile(),
setEditMode,
claims: [Claims.RESEARCH_EDIT],
isFileFinalStatus: false,
});
const editResearchFile = getByTitle('Edit research file');
expect(editResearchFile).toBeVisible();
Expand All @@ -57,9 +65,33 @@ describe('ResearchSummaryView component', () => {
researchFile: getMockResearchFile(),
setEditMode,
claims: [Claims.RESEARCH_EDIT],
isFileFinalStatus: false,
});
const editResearchFile = getByTitle('Edit research file');
await act(async () => userEvent.click(editResearchFile));
expect(setEditMode).toHaveBeenCalledWith(true);
});

it('displays a warning tooltip when the user cannot edit', async () => {
const { getByTestId } = setup({
researchFile: getMockResearchFile(),
setEditMode,
claims: [Claims.RESEARCH_EDIT],
isFileFinalStatus: true,
});
const editResearchFile = getByTestId('tooltip-icon-research-cannot-edit-tooltip');
expect(editResearchFile).toBeVisible();
});

it('ignores final file status and is editable when user is an admin', async () => {
const { queryByTestId } = setup({
researchFile: getMockResearchFile(),
setEditMode,
claims: [Claims.RESEARCH_EDIT],
roles: [Roles.SYSTEM_ADMINISTRATOR],
isFileFinalStatus: true,
});
const editResearchFile = queryByTestId('tooltip-icon-research-cannot-edit-tooltip');
expect(editResearchFile).toBeNull();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ import EditButton from '@/components/common/buttons/EditButton';
import { Section } from '@/components/common/Section/Section';
import { SectionField } from '@/components/common/Section/SectionField';
import { StyledEditWrapper, StyledSummarySection } from '@/components/common/Section/SectionStyles';
import TooltipIcon from '@/components/common/TooltipIcon';
import Claims from '@/constants/claims';
import Roles from '@/constants/roles';
import { cannotEditMessage } from '@/features/mapSideBar/acquisition/common/constants';
import useKeycloakWrapper from '@/hooks/useKeycloakWrapper';
import { ApiGen_Concepts_ResearchFile } from '@/models/api/generated/ApiGen_Concepts_ResearchFile';
import { exists, formatApiProjectName, prettyFormatDate } from '@/utils';
Expand Down Expand Up @@ -32,6 +35,7 @@ interface DetailResearchFile {
export interface IResearchSummaryViewProps {
researchFile?: ApiGen_Concepts_ResearchFile;
setEditMode: (editable: boolean) => void;
isFileFinalStatus: boolean;
}

const ResearchSummaryView: React.FunctionComponent<IResearchSummaryViewProps> = props => {
Expand Down Expand Up @@ -80,7 +84,9 @@ const ResearchSummaryView: React.FunctionComponent<IResearchSummaryViewProps> =
return (
<StyledSummarySection>
<StyledEditWrapper className="mr-3 my-1">
{keycloak.hasClaim(Claims.RESEARCH_EDIT) && props.researchFile !== undefined ? (
{keycloak.hasClaim(Claims.RESEARCH_EDIT) &&
(!props.isFileFinalStatus || keycloak.hasRole(Roles.SYSTEM_ADMINISTRATOR)) &&
props.researchFile !== undefined ? (
<EditButton
title="Edit research file"
onClick={() => {
Expand All @@ -89,6 +95,11 @@ const ResearchSummaryView: React.FunctionComponent<IResearchSummaryViewProps> =
style={{ float: 'right' }}
/>
) : null}
{keycloak.hasClaim(Claims.RESEARCH_EDIT) &&
props.isFileFinalStatus &&
!keycloak.hasRole(Roles.SYSTEM_ADMINISTRATOR) && (
<TooltipIcon toolTipId={`research-cannot-edit-tooltip`} toolTip={cannotEditMessage} />
)}
</StyledEditWrapper>
<Section header="Project">
<SectionField label="Ministry project">
Expand Down

0 comments on commit 1bca254

Please sign in to comment.