Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
775 changes: 539 additions & 236 deletions openApi/generated-onboarding/onboarding-swagger20.json

Large diffs are not rendered by default.

7,438 changes: 3,898 additions & 3,540 deletions openApi/onboarding-api-docs.json

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion src/api/OnboardingApiClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ const onRedirectToLogin = () =>
);

export const OnboardingApi = {

checkManagerApi: async (user: OnboardingUserDto): Promise<any> => {
const result = await apiClient.checkManager({ body: user });
return extractResponse(result, 200, onRedirectToLogin);
Expand All @@ -62,4 +61,11 @@ export const OnboardingApi = {
});
return extractResponse(result, 201, onRedirectToLogin);
},

onboardingAggregatorPOST: async (user: OnboardingUserDto): Promise<any> => {
const result = await apiClient.onboardingAggregatorUsingPOST({
body: user,
});
return extractResponse(result, 201, onRedirectToLogin);
},
};
6 changes: 6 additions & 0 deletions src/locale/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,12 @@ export default {
confirmButton: 'Assegna',
closeButton: 'Annulla',
},
addUserInBulkModal: {
title: 'Aggiungi utente in bulk',
message: '<1>{{user}}</1> verrà aggiunto come utente su tutti gli enti aggregati con il ruolo di <3>{{role}}</3>. In questo modo potrà gestire e operare su questo e su tutti gli enti che gestisci.',
confirmButton: 'Aggiungi',
closeButton: 'Annulla',
}
},
editRegistryForm: {
title: 'Modifica il profilo utente',
Expand Down
9 changes: 8 additions & 1 deletion src/microcomponents/mock_dashboard/data/party.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,14 @@ export const mockedParties: Array<Party> = [
recipientCode: 'CH435V',
publicServices: true,
},
userProductActions: [Actions.ListProductUsers, Actions.ManageProductUsers],
userProductActions: [
Actions.ListProductUsers,
Actions.ManageProductUsers,
Actions.AccessProductBackoffice,
Actions.ViewDelegations,
Actions.ListActiveProducts,
Actions.AccessProductBackoffice,
],
},
{
productId: 'prod-io-premium',
Expand Down
21 changes: 14 additions & 7 deletions src/pages/dashboardUserEdit/AddLegalRepresentativeForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,11 @@ import { useFormik } from 'formik';
import { Dispatch, SetStateAction, useState } from 'react';
import { Trans, useTranslation } from 'react-i18next';
import { InstitutionTypeEnum } from '../../api/generated/onboarding/OnboardingUserDto';
import { RoleEnum } from '../../api/generated/onboarding/User';
import { UserDto } from '../../api/generated/onboarding/UserDto';
import { RoleEnum, UserDto } from '../../api/generated/onboarding/UserDto';
import { Party } from '../../model/Party';
import { AsyncOnboardingUserData, TextTransform } from '../../model/PartyUser';
import { RequestOutcomeMessage, RequestOutcomeOptions } from '../../model/UserRegistry';
import { onboardingPostUser } from '../../services/usersService';
import { onboardingAggregatorService, onboardingPostUser } from '../../services/onboardingService';
import { LOADING_TASK_CHECK_MANAGER } from '../../utils/constants';
import { ENV } from '../../utils/env';
import { ConfimChangeLRModal } from './components/ConfimChangeLRModal';
Expand All @@ -35,6 +34,7 @@ type LegalRepresentativeProps = {
backPreviousStep: () => void;
asyncUserData: Array<AsyncOnboardingUserData>;
setOutcome: Dispatch<SetStateAction<RequestOutcomeMessage | null | undefined>>;
isAddInBulkEAFlow: boolean;
};

export default function AddLegalRepresentativeForm({
Expand All @@ -44,6 +44,7 @@ export default function AddLegalRepresentativeForm({
backPreviousStep,
asyncUserData,
setOutcome,
isAddInBulkEAFlow,
}: Readonly<LegalRepresentativeProps>) {
const [isChangedManager, setIsChangedManager] = useState(false);
const setLoading = useLoading(LOADING_TASK_CHECK_MANAGER);
Expand Down Expand Up @@ -266,15 +267,21 @@ export default function AddLegalRepresentativeForm({
};

const sendOnboardingData = (asyncUserData: Array<AsyncOnboardingUserData>) => {
onboardingPostUser({
const submitRequestData = {
productId,
institutionType: party?.institutionType as InstitutionTypeEnum,
origin: party?.origin,
originId: party?.originId,
subunitCode: party?.subunitCode,
taxCode: party?.fiscalCode,
users: asyncUserData as Array<UserDto>,
})
};

const submitApiToCall = isAddInBulkEAFlow
? onboardingAggregatorService(submitRequestData)
: onboardingPostUser(submitRequestData);

submitApiToCall
.then(() => {
setOutcome(outcomeContent.success);
})
Expand Down Expand Up @@ -307,7 +314,7 @@ export default function AddLegalRepresentativeForm({
variantTitle={'h4'}
variantDescription={'body1'}
buttonLabel={t('userEdit.addForm.addLegalRepresentative.backHome')}
onButtonClick={() => goToUsersPage}
onButtonClick={goToUsersPage}
/>
</>,
],
Expand All @@ -331,7 +338,7 @@ export default function AddLegalRepresentativeForm({
</Trans>
}
buttonLabel={t('userEdit.addForm.addLegalRepresentative.backHome')}
onButtonClick={() => goToUsersPage}
onButtonClick={goToUsersPage}
/>
</>,
],
Expand Down
4 changes: 4 additions & 0 deletions src/pages/dashboardUserEdit/AddProductToUserPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ function AddProductToUserPage({ party, activeProducts, productsRolesMap, partyUs
const [currentStep, setCurrentStep] = useState(1);
const [currentSelectedProduct, setCurrentSelectedProduct] = useState<Product | undefined>();
const [asyncUserData, setAsyncUserData] = useState<Array<AsyncOnboardingUserData>>([]);
const [isAddInBulkEAFlow, setIsAddInBulkEAFlow] = useState<boolean>(false);
const [outcome, setOutcome] = useState<RequestOutcomeMessage | null>();

const forwardNextStep = () => {
Expand Down Expand Up @@ -233,6 +234,8 @@ function AddProductToUserPage({ party, activeProducts, productsRolesMap, partyUs
forwardNextStep={forwardNextStep}
setCurrentSelectedProduct={setCurrentSelectedProduct}
setAsyncUserData={setAsyncUserData}
isAddInBulkEAFlow={isAddInBulkEAFlow}
setIsAddInBulkEAFlow={setIsAddInBulkEAFlow}
/>
</>
)}
Expand All @@ -244,6 +247,7 @@ function AddProductToUserPage({ party, activeProducts, productsRolesMap, partyUs
party={party}
asyncUserData={asyncUserData}
setOutcome={setOutcome}
isAddInBulkEAFlow={isAddInBulkEAFlow}
/>
)}
</Grid>
Expand Down
4 changes: 4 additions & 0 deletions src/pages/dashboardUserEdit/AddUsersPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export default function AddUsersPage({ party, activeProducts, productsRolesMap }
const [currentStep, setCurrentStep] = useState(1);
const [currentSelectedProduct, setCurrentSelectedProduct] = useState<Product | undefined>();
const [asyncUserData, setAsyncUserData] = useState<Array<AsyncOnboardingUserData>>([]);
const [isAddInBulkEAFlow, setIsAddInBulkEAFlow] = useState<boolean>(false);
const [outcome, setOutcome] = useState<RequestOutcomeMessage | null>();

const forwardNextStep = () => {
Expand Down Expand Up @@ -108,6 +109,8 @@ export default function AddUsersPage({ party, activeProducts, productsRolesMap }
forwardNextStep={forwardNextStep}
setCurrentSelectedProduct={setCurrentSelectedProduct}
setAsyncUserData={setAsyncUserData}
isAddInBulkEAFlow={isAddInBulkEAFlow}
setIsAddInBulkEAFlow={setIsAddInBulkEAFlow}
/>
)}

Expand All @@ -119,6 +122,7 @@ export default function AddUsersPage({ party, activeProducts, productsRolesMap }
party={party}
asyncUserData={asyncUserData}
setOutcome={setOutcome}
isAddInBulkEAFlow={isAddInBulkEAFlow}
/>
)}
</Grid>
Expand Down
48 changes: 39 additions & 9 deletions src/pages/dashboardUserEdit/components/AddUserForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ type Props = {
handlePreviousStep?: () => void;
setCurrentSelectedProduct: Dispatch<SetStateAction<Product | undefined>>;
setAsyncUserData: Dispatch<SetStateAction<Array<AsyncOnboardingUserData>>>;
isAddInBulkEAFlow: boolean;
setIsAddInBulkEAFlow: Dispatch<SetStateAction<boolean>>;
};

// eslint-disable-next-line sonarjs/cognitive-complexity
Expand All @@ -95,6 +97,8 @@ export default function AddUserForm({
forwardNextStep,
setCurrentSelectedProduct,
setAsyncUserData,
isAddInBulkEAFlow,
setIsAddInBulkEAFlow,
}: Readonly<Props>) {
const { t } = useTranslation();
const setLoadingSaveUser = useLoading(LOADING_TASK_SAVE_PARTY_USER);
Expand All @@ -111,8 +115,6 @@ export default function AddUserForm({
const [productRoles, setProductRoles] = useState<ProductRolesLists>();
const [productInPage, setProductInPage] = useState<boolean>();
const [isAsyncFlow, setIsAsyncFlow] = useState<boolean>(false);
const [isAddInBulkEAFlow, setIsAddInBulkEAFlow] = useState<boolean>(false);
const [openAggregatorModal, setOpenAggregatorModal] = useState<boolean>(false);

const { registerUnloadEvent, unregisterUnloadEvent } = useUnloadEventInterceptor();
const { hasPermission } = usePermissions();
Expand Down Expand Up @@ -294,9 +296,11 @@ export default function AddUserForm({
email: values.email.toLowerCase(),
};

const partyRole = productRoles?.groupByProductRole[formik.values.productRoles[0]].partyRole;

(userId
? addUserProductRoles(party, userProduct as Product, userId, values2submit)
: savePartyUser(party, userProduct as Product, values2submit)
? addUserProductRoles(party, userProduct as Product, userId, values2submit, partyRole)
: savePartyUser(party, userProduct as Product, values2submit, partyRole)
)
.then((userId) => {
unregisterUnloadEvent();
Expand Down Expand Up @@ -414,7 +418,35 @@ export default function AddUserForm({
validate,
onSubmit: (values) => {
if (isAddInBulkEAFlow) {
setOpenAggregatorModal(true);
setAsyncUserData([
{
name: values.name,
surname: values.surname,
taxCode: values.taxCode.toUpperCase(),
email: values.email.toLowerCase(),
role: RoleEnum.DELEGATE,
},
]);
addNotify({
component: 'SessionModal',
id: 'ADD_IN_BULK_EA_USER',
title: t('userEdit.addForm.addUserInBulkModal.title'),
message: (
<Trans
i18nKey="userEdit.addForm.addUserInBulkModal.message"
values={{
user: `${values.name} ${values.surname} `,
role: `${values.productRoles.map((r) => productRoles?.groupByProductRole[r].title)}`,
}}
components={{ 1: <strong />, 3: <strong />, 8: <strong /> }}
>
{`<1>{{user}}</1> verrà aggiunto come utente su tutti gli enti aggregati con il ruolo di <3>{{role}}</3>. In questo modo potrà gestire e operare su questo e su tutti gli enti che gestisci.`}
</Trans>
),
confirmLabel: t('userEdit.addForm.addUserInBulkModal.confirmButton'),
closeLabel: t('userEdit.addForm.addUserInBulkModal.closeButton'),
onConfirm: forwardNextStep,
});
return;
}

Expand Down Expand Up @@ -452,8 +484,6 @@ export default function AddUserForm({
if (userProduct) {
setProductRoles(productsRolesMap[userProduct.id]);
void formik.setFieldValue('productRoles', [], true);
// TODO openAggregatorModal is not used
console.log('openAggregatorModal', openAggregatorModal);
}
}, [userProduct]);

Expand Down Expand Up @@ -710,18 +740,18 @@ export default function AddUserForm({
validTaxcode
? () => {
addRole(p);
setIsAsyncFlow(p?.phasesAdditionAllowed.includes('dashboard-async'));
setIsAddInBulkEAFlow(
p?.phasesAdditionAllowed.includes('dashboard-aggregator') &&
party.products.some(
(p) => p.productId === userProduct?.id && p.isAggregator
)
);
setIsAsyncFlow(p?.phasesAdditionAllowed.includes('dashboard-async'));
}
: undefined
}
/>
{isAddRoleFromDashboardAsync(p?.phasesAdditionAllowed) && (
{isAddRoleFromDashboardAsync(p?.phasesAdditionAllowed) || isAddInBulkEAFlow && (
<Tooltip
title={t('userEdit.addForm.role.adminTooltip')}
placement="top"
Expand Down
3 changes: 3 additions & 0 deletions src/services/__mocks__/usersService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1333,3 +1333,6 @@ export const validateLegalRepresentativeMocked = (_user: UserDataValidationDto):

export const onboardingPostUserMocked = (_user: OnboardingUserDto): Promise<void> =>
new Promise((resolve) => resolve());

export const onboardingAggregatorServiceMocked = (_user: OnboardingUserDto): Promise<void> =>
new Promise((resolve) => resolve());
44 changes: 44 additions & 0 deletions src/services/onboardingService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { OnboardingUserDto } from '../api/generated/onboarding/OnboardingUserDto';
import { UserDataValidationDto } from '../api/generated/onboarding/UserDataValidationDto';
import { OnboardingApi } from '../api/OnboardingApiClient';
import {
checkManagerMocked,
onboardingPostUserMocked,
validateLegalRepresentativeMocked,
} from './__mocks__/usersService';

export const checkManagerService = (user: OnboardingUserDto): Promise<any> => {
/* istanbul ignore if */
if (process.env.REACT_APP_API_MOCK_PARTY_USERS === 'true') {
return checkManagerMocked(user);
} else {
return OnboardingApi.checkManagerApi(user);
}
};

export const validateLegalRepresentative = (user: UserDataValidationDto): Promise<any> => {
/* istanbul ignore if */
if (process.env.REACT_APP_API_MOCK_PARTY_USERS === 'true') {
return validateLegalRepresentativeMocked(user);
} else {
return OnboardingApi.validateLegalRepresentative(user);
}
};

export const onboardingPostUser = (user: OnboardingUserDto): Promise<any> => {
/* istanbul ignore if */
if (process.env.REACT_APP_API_MOCK_ONBOARDING === 'true') {
return onboardingPostUserMocked(user);
} else {
return OnboardingApi.onboardingPostUser(user);
}
};

export const onboardingAggregatorService = (user: OnboardingUserDto) => {
/* istanbul ignore if */
if (process.env.REACT_APP_API_MOCK_ONBOARDING === 'true') {
return onboardingPostUserMocked(user);
} else {
return OnboardingApi.onboardingAggregatorPOST(user);
}
};
Loading