Skip to content

Commit

Permalink
Merge pull request Expensify#52209 from shubham1206agra/per-diem-2
Browse files Browse the repository at this point in the history
Feature: Import/Export Per Diem Rates
  • Loading branch information
Gonals authored Nov 28, 2024
2 parents 9f0c30b + e95e4cd commit 64eaf2f
Show file tree
Hide file tree
Showing 24 changed files with 384 additions and 26 deletions.
1 change: 1 addition & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6290,6 +6290,7 @@ const CONST = {
RATE_ID: 'rateID',
ENABLED: 'enabled',
IGNORE: 'ignore',
DESTINATION: 'destination',
},

IMPORT_SPREADSHEET: {
Expand Down
8 changes: 8 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1308,6 +1308,14 @@ const ROUTES = {
route: 'settings/workspaces/:policyID/per-diem',
getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem` as const,
},
WORKSPACE_PER_DIEM_IMPORT: {
route: 'settings/workspaces/:policyID/per-diem/import',
getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem/import` as const,
},
WORKSPACE_PER_DIEM_IMPORTED: {
route: 'settings/workspaces/:policyID/per-diem/imported',
getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem/imported` as const,
},
WORKSPACE_PER_DIEM_SETTINGS: {
route: 'settings/workspaces/:policyID/per-diem/settings',
getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem/settings` as const,
Expand Down
2 changes: 2 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,8 @@ const SCREENS = {
RULES_MAX_EXPENSE_AGE: 'Rules_Max_Expense_Age',
RULES_BILLABLE_DEFAULT: 'Rules_Billable_Default',
PER_DIEM: 'Per_Diem',
PER_DIEM_IMPORT: 'Per_Diem_Import',
PER_DIEM_IMPORTED: 'Per_Diem_Imported',
PER_DIEM_SETTINGS: 'Per_Diem_Settings',
},

Expand Down
2 changes: 1 addition & 1 deletion src/components/ImportColumn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ function findColumnName(header: string): string {
break;

case 'destination':
attribute = CONST.CSV_IMPORT_COLUMNS.NAME;
attribute = CONST.CSV_IMPORT_COLUMNS.DESTINATION;
break;

case 'subrate':
Expand Down
8 changes: 4 additions & 4 deletions src/components/ImportSpreadsheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ type ImportSpreedsheetProps = {
goTo: Routes;
};

function ImportSpreedsheet({backTo, goTo}: ImportSpreedsheetProps) {
function ImportSpreadsheet({backTo, goTo}: ImportSpreedsheetProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const [isReadingFile, setIsReadingFIle] = useState(false);
Expand Down Expand Up @@ -160,7 +160,7 @@ function ImportSpreedsheet({backTo, goTo}: ImportSpreedsheetProps) {
<ScreenWrapper
includeSafeAreaPaddingBottom={false}
shouldEnableKeyboardAvoidingView={false}
testID={ImportSpreedsheet.displayName}
testID={ImportSpreadsheet.displayName}
shouldEnableMaxHeight={DeviceCapabilities.canUseTouchScreen()}
headerGapStyles={isDraggingOver ? [styles.isDraggingOver] : []}
>
Expand Down Expand Up @@ -214,6 +214,6 @@ function ImportSpreedsheet({backTo, goTo}: ImportSpreedsheetProps) {
);
}

ImportSpreedsheet.displayName = 'ImportSpreedsheet';
ImportSpreadsheet.displayName = 'ImportSpreadsheet';

export default ImportSpreedsheet;
export default ImportSpreadsheet;
4 changes: 4 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ import type {
ImportedTypesParams,
ImportFieldParams,
ImportMembersSuccessfullDescriptionParams,
ImportPerDiemRatesSuccessfullDescriptionParams,
ImportTagsSuccessfullDescriptionParams,
IncorrectZipFormatParams,
InstantSummaryParams,
Expand Down Expand Up @@ -777,6 +778,8 @@ const translations = {
importCategoriesSuccessfullDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `${categories} categories have been added.` : '1 category has been added.'),
importMembersSuccessfullDescription: ({members}: ImportMembersSuccessfullDescriptionParams) => (members > 1 ? `${members} members have been added.` : '1 member has been added.'),
importTagsSuccessfullDescription: ({tags}: ImportTagsSuccessfullDescriptionParams) => (tags > 1 ? `${tags} tags have been added.` : '1 tag has been added.'),
importPerDiemRatesSuccessfullDescription: ({rates}: ImportPerDiemRatesSuccessfullDescriptionParams) =>
rates > 1 ? `${rates} per diem rates have been added.` : '1 per diem rate has been added.',
importFailedTitle: 'Import failed',
importFailedDescription: 'Please ensure all fields are filled out correctly and try again. If the problem persists, please reach out to Concierge.',
importDescription: 'Choose which fields to map from your spreadsheet by clicking the dropdown next to each imported column below.',
Expand Down Expand Up @@ -2558,6 +2561,7 @@ const translations = {
title: 'Per diem',
subtitle: 'Set per diem rates to control daily employee spend. Import rates from a spreadsheet to get started.',
},
importPerDiemRates: 'Import per diem rates',
},
qbd: {
exportOutOfPocketExpensesDescription: 'Set how out-of-pocket expenses export to QuickBooks Desktop.',
Expand Down
4 changes: 4 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ import type {
ImportedTypesParams,
ImportFieldParams,
ImportMembersSuccessfullDescriptionParams,
ImportPerDiemRatesSuccessfullDescriptionParams,
ImportTagsSuccessfullDescriptionParams,
IncorrectZipFormatParams,
InstantSummaryParams,
Expand Down Expand Up @@ -773,6 +774,8 @@ const translations = {
importCategoriesSuccessfullDescription: ({categories}: SpreadCategoriesParams) => (categories > 1 ? `Se han agregado ${categories} categorías.` : 'Se ha agregado 1 categoría.'),
importMembersSuccessfullDescription: ({members}: ImportMembersSuccessfullDescriptionParams) => (members > 1 ? `Se han agregado ${members} miembros.` : 'Se ha agregado 1 miembro.'),
importTagsSuccessfullDescription: ({tags}: ImportTagsSuccessfullDescriptionParams) => (tags > 1 ? `Se han agregado ${tags} etiquetas.` : 'Se ha agregado 1 etiqueta.'),
importPerDiemRatesSuccessfullDescription: ({rates}: ImportPerDiemRatesSuccessfullDescriptionParams) =>
rates > 1 ? `Se han añadido ${rates} tasas de per diem.` : 'Se ha añadido 1 tasa de per diem.',
importSuccessfullTitle: 'Importar categorías',
importDescription: 'Elige qué campos mapear desde tu hoja de cálculo haciendo clic en el menú desplegable junto a cada columna importada a continuación.',
sizeNotMet: 'El archivo adjunto debe ser más grande que 0 bytes.',
Expand Down Expand Up @@ -2582,6 +2585,7 @@ const translations = {
title: 'Per diem',
subtitle: 'Establece dietas per diem para controlar el gasto diario de los empleados. Importa las tarifas desde una hoja de cálculo para comenzar.',
},
importPerDiemRates: 'Importar tasas de per diem',
},
qbd: {
exportOutOfPocketExpensesDescription: 'Establezca cómo se exportan los gastos de bolsillo a QuickBooks Desktop.',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/params.ts
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,10 @@ type ImportMembersSuccessfullDescriptionParams = {
members: number;
};

type ImportPerDiemRatesSuccessfullDescriptionParams = {
rates: number;
};

type AuthenticationErrorParams = {
connectionName: string;
};
Expand Down Expand Up @@ -767,6 +771,7 @@ export type {
OptionalParam,
AssignCardParams,
ImportedTypesParams,
ImportPerDiemRatesSuccessfullDescriptionParams,
CurrencyCodeParams,
WorkspaceLockedPlanTypeParams,
CompanyNameParams,
Expand Down
6 changes: 6 additions & 0 deletions src/libs/API/parameters/ExportPerDiemCSVParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type ExportPerDiemCSVParams = {
/** ID of the policy */
policyID: string;
};

export default ExportPerDiemCSVParams;
26 changes: 26 additions & 0 deletions src/libs/API/parameters/ImportPerDiemRatesParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
type ImportPerDiemRatesParams = {
/** ID of the policy */
policyID: string;

/** Custom Unit ID of the per diem unit */
customUnitID: string;

/**
* Stringified JSON object with type of following structure:
* Array<{
* customUnitRateID: <Same as name>;
* name: “Spain”;
* currency: “EUR”;
* enabled: true (since we are importing);
* rate: 0 (since we have subrates);
* Attributes: [];
* subRates: An array with each element in the following shape:
* id: “66d5ae9a0379d”;
* name: “Full Day”;
* rate: 3000 (in cents);
* }>
*/
customUnitRates: string;
};

export default ImportPerDiemRatesParams;
2 changes: 2 additions & 0 deletions src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -350,3 +350,5 @@ export type {default as UpdateQuickbooksDesktopCompanyCardExpenseAccountTypePara
export type {default as TogglePolicyPerDiemParams} from './TogglePolicyPerDiemParams';
export type {default as OpenPolicyPerDiemRatesPageParams} from './OpenPolicyPerDiemRatesPageParams';
export type {default as TogglePlatformMuteParams} from './TogglePlatformMuteParams';
export type {default as ImportPerDiemRatesParams} from './ImportPerDiemRatesParams';
export type {default as ExportPerDiemCSVParams} from './ExportPerDiemCSVParams';
4 changes: 4 additions & 0 deletions src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,11 @@ const WRITE_COMMANDS = {
IMPORT_CATEGORIES_SPREADSHEET: 'ImportCategoriesSpreadsheet',
IMPORT_MEMBERS_SPREADSHEET: 'ImportMembersSpreadsheet',
IMPORT_TAGS_SPREADSHEET: 'ImportTagsSpreadsheet',
IMPORT_PER_DIEM_RATES: 'ImportPerDiemRates',
EXPORT_CATEGORIES_CSV: 'ExportCategoriesCSV',
EXPORT_MEMBERS_CSV: 'ExportMembersCSV',
EXPORT_TAGS_CSV: 'ExportTagsCSV',
EXPORT_PER_DIEM_CSV: 'ExportPerDiemCSV',
EXPORT_REPORT_TO_CSV: 'ExportReportToCSV',
RENAME_WORKSPACE_CATEGORY: 'RenameWorkspaceCategory',
CREATE_POLICY_TAG: 'CreatePolicyTag',
Expand Down Expand Up @@ -571,11 +573,13 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.SET_WORKSPACE_CATEGORIES_ENABLED]: Parameters.SetWorkspaceCategoriesEnabledParams;
[WRITE_COMMANDS.CREATE_WORKSPACE_CATEGORIES]: Parameters.CreateWorkspaceCategoriesParams;
[WRITE_COMMANDS.IMPORT_CATEGORIES_SPREADSHEET]: Parameters.ImportCategoriesSpreadsheetParams;
[WRITE_COMMANDS.IMPORT_PER_DIEM_RATES]: Parameters.ImportPerDiemRatesParams;
[WRITE_COMMANDS.IMPORT_MEMBERS_SPREADSHEET]: Parameters.ImportMembersSpreadsheetParams;
[WRITE_COMMANDS.IMPORT_TAGS_SPREADSHEET]: Parameters.ImportTagsSpreadsheetParams;
[WRITE_COMMANDS.EXPORT_CATEGORIES_CSV]: Parameters.ExportCategoriesSpreadsheetParams;
[WRITE_COMMANDS.EXPORT_MEMBERS_CSV]: Parameters.ExportMembersSpreadsheetParams;
[WRITE_COMMANDS.EXPORT_TAGS_CSV]: Parameters.ExportTagsSpreadsheetParams;
[WRITE_COMMANDS.EXPORT_PER_DIEM_CSV]: Parameters.ExportPerDiemCSVParams;
[WRITE_COMMANDS.RENAME_WORKSPACE_CATEGORY]: Parameters.RenameWorkspaceCategoriesParams;
[WRITE_COMMANDS.SET_WORKSPACE_REQUIRES_CATEGORY]: Parameters.SetWorkspaceRequiresCategoryParams;
[WRITE_COMMANDS.DELETE_WORKSPACE_CATEGORIES]: Parameters.DeleteWorkspaceCategoriesParams;
Expand Down
5 changes: 5 additions & 0 deletions src/libs/CurrencyUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,10 @@ function isValidCurrencyCode(currencyCode: string): boolean {
return !!currency;
}

function sanitizeCurrencyCode(currencyCode: string): string {
return isValidCurrencyCode(currencyCode) ? currencyCode : CONST.CURRENCY.USD;
}

export {
getCurrencyDecimals,
getCurrencyUnit,
Expand All @@ -212,4 +216,5 @@ export {
convertToDisplayStringWithoutCurrency,
isValidCurrencyCode,
convertToShortDisplayString,
sanitizeCurrencyCode,
};
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,8 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
[SCREENS.WORKSPACE.RULES_MAX_EXPENSE_AMOUNT]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/RulesMaxExpenseAmountPage').default,
[SCREENS.WORKSPACE.RULES_MAX_EXPENSE_AGE]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/RulesMaxExpenseAgePage').default,
[SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/RulesBillableDefaultPage').default,
[SCREENS.WORKSPACE.PER_DIEM_IMPORT]: () => require<ReactComponentModule>('../../../../pages/workspace/perDiem/ImportPerDiemPage').default,
[SCREENS.WORKSPACE.PER_DIEM_IMPORTED]: () => require<ReactComponentModule>('../../../../pages/workspace/perDiem/ImportedPerDiemPage').default,
[SCREENS.WORKSPACE.PER_DIEM_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/perDiem/WorkspacePerDiemSettingsPage').default,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial<Record<FullScreenName, string[]>> = {
SCREENS.WORKSPACE.RULES_MAX_EXPENSE_AGE,
SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT,
],
[SCREENS.WORKSPACE.PER_DIEM]: [SCREENS.WORKSPACE.PER_DIEM_SETTINGS],
[SCREENS.WORKSPACE.PER_DIEM]: [SCREENS.WORKSPACE.PER_DIEM_IMPORT, SCREENS.WORKSPACE.PER_DIEM_IMPORTED, SCREENS.WORKSPACE.PER_DIEM_SETTINGS],
};

export default FULL_SCREEN_TO_RHP_MAPPING;
6 changes: 6 additions & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,12 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
[SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT]: {
path: ROUTES.RULES_BILLABLE_DEFAULT.route,
},
[SCREENS.WORKSPACE.PER_DIEM_IMPORT]: {
path: ROUTES.WORKSPACE_PER_DIEM_IMPORT.route,
},
[SCREENS.WORKSPACE.PER_DIEM_IMPORTED]: {
path: ROUTES.WORKSPACE_PER_DIEM_IMPORTED.route,
},
[SCREENS.WORKSPACE.PER_DIEM_SETTINGS]: {
path: ROUTES.WORKSPACE_PER_DIEM_SETTINGS.route,
},
Expand Down
6 changes: 6 additions & 0 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -899,6 +899,12 @@ type SettingsNavigatorParamList = {
[SCREENS.WORKSPACE.RULES_BILLABLE_DEFAULT]: {
policyID: string;
};
[SCREENS.WORKSPACE.PER_DIEM_IMPORT]: {
policyID: string;
};
[SCREENS.WORKSPACE.PER_DIEM_IMPORTED]: {
policyID: string;
};
[SCREENS.WORKSPACE.PER_DIEM_SETTINGS]: {
policyID: string;
};
Expand Down
65 changes: 64 additions & 1 deletion src/libs/actions/Policy/PerDiem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@ import type {NullishDeep, OnyxCollection} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import * as API from '@libs/API';
import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
import * as ApiUtils from '@libs/ApiUtils';
import fileDownload from '@libs/fileDownload';
import getIsNarrowLayout from '@libs/getIsNarrowLayout';
import {translateLocal} from '@libs/Localize';
import enhanceParameters from '@libs/Network/enhanceParameters';
import * as NumberUtils from '@libs/NumberUtils';
import {navigateWhenEnableFeature} from '@libs/PolicyUtils';
import * as ReportUtils from '@libs/ReportUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Policy, Report} from '@src/types/onyx';
import type {ErrorFields} from '@src/types/onyx/OnyxCommon';
import type {Rate} from '@src/types/onyx/Policy';
import type {OnyxData} from '@src/types/onyx/Request';

const allPolicies: OnyxCollection<Policy> = {};
Expand Down Expand Up @@ -120,6 +125,64 @@ function openPolicyPerDiemPage(policyID?: string) {
API.read(READ_COMMANDS.OPEN_POLICY_PER_DIEM_RATES_PAGE, params);
}

function updateImportSpreadsheetData(ratesLength: number) {
const onyxData: OnyxData = {
successData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: ONYXKEYS.IMPORTED_SPREADSHEET,
value: {
shouldFinalModalBeOpened: true,
importFinalModal: {
title: translateLocal('spreadsheet.importSuccessfullTitle'),
prompt: translateLocal('spreadsheet.importPerDiemRatesSuccessfullDescription', {rates: ratesLength}),
},
},
},
],

failureData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: ONYXKEYS.IMPORTED_SPREADSHEET,
value: {
shouldFinalModalBeOpened: true,
importFinalModal: {title: translateLocal('spreadsheet.importFailedTitle'), prompt: translateLocal('spreadsheet.importFailedDescription')},
},
},
],
};

return onyxData;
}

function importPerDiemRates(policyID: string, customUnitID: string, rates: Rate[], rowsLength: number) {
const onyxData = updateImportSpreadsheetData(rowsLength);

const parameters = {
policyID,
customUnitID,
customUnitRates: JSON.stringify(rates),
};

API.write(WRITE_COMMANDS.IMPORT_PER_DIEM_RATES, parameters, onyxData);
}

function downloadPerDiemCSV(policyID: string, onDownloadFailed: () => void) {
const finalParameters = enhanceParameters(WRITE_COMMANDS.EXPORT_PER_DIEM_CSV, {
policyID,
});

const fileName = 'PerDiem.csv';

const formData = new FormData();
Object.entries(finalParameters).forEach(([key, value]) => {
formData.append(key, String(value));
});

fileDownload(ApiUtils.getCommandURL({command: WRITE_COMMANDS.EXPORT_PER_DIEM_CSV}), fileName, '', false, formData, CONST.NETWORK.METHOD.POST, onDownloadFailed);
}

function clearPolicyPerDiemRatesErrorFields(policyID: string, customUnitID: string, updatedErrorFields: ErrorFields) {
Onyx.merge(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
customUnits: {
Expand All @@ -130,4 +193,4 @@ function clearPolicyPerDiemRatesErrorFields(policyID: string, customUnitID: stri
});
}

export {enablePerDiem, openPolicyPerDiemPage, clearPolicyPerDiemRatesErrorFields};
export {generateCustomUnitID, enablePerDiem, openPolicyPerDiemPage, importPerDiemRates, downloadPerDiemCSV, clearPolicyPerDiemRatesErrorFields};
4 changes: 2 additions & 2 deletions src/pages/workspace/categories/ImportCategoriesPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type {StackScreenProps} from '@react-navigation/stack';
import React from 'react';
import ImportSpreedsheet from '@components/ImportSpreadsheet';
import ImportSpreadsheet from '@components/ImportSpreadsheet';
import usePolicy from '@hooks/usePolicy';
import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
import * as PolicyUtils from '@libs/PolicyUtils';
Expand Down Expand Up @@ -30,7 +30,7 @@ function ImportCategoriesPage({route}: ImportCategoriesPageProps) {
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: PolicyUtils.goBackFromInvalidPolicy}}
>
<ImportSpreedsheet
<ImportSpreadsheet
backTo={isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORIES_ROOT.getRoute(policyID, backTo) : ROUTES.WORKSPACE_CATEGORIES.getRoute(policyID)}
goTo={isQuickSettingsFlow ? ROUTES.SETTINGS_CATEGORIES_IMPORTED.getRoute(policyID, backTo) : ROUTES.WORKSPACE_CATEGORIES_IMPORTED.getRoute(policyID)}
/>
Expand Down
4 changes: 2 additions & 2 deletions src/pages/workspace/members/ImportMembersPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type {StackScreenProps} from '@react-navigation/stack';
import React from 'react';
import ImportSpreedsheet from '@components/ImportSpreadsheet';
import ImportSpreadsheet from '@components/ImportSpreadsheet';
import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
import * as PolicyUtils from '@libs/PolicyUtils';
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
Expand All @@ -22,7 +22,7 @@ function ImportMembersPage({policy}: ImportMembersPageProps) {
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN]}
fullPageNotFoundViewProps={{subtitleKey: isEmptyObject(policy) ? undefined : 'workspace.common.notAuthorized', onLinkPress: PolicyUtils.goBackFromInvalidPolicy}}
>
<ImportSpreedsheet
<ImportSpreadsheet
backTo={ROUTES.WORKSPACE_MEMBERS.getRoute(policyID)}
goTo={ROUTES.WORKSPACE_MEMBERS_IMPORTED.getRoute(policyID)}
/>
Expand Down
Loading

0 comments on commit 64eaf2f

Please sign in to comment.