Skip to content
4 changes: 4 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,9 @@ const ONYXKEYS = {
/** Stores the information about duplicated workspace */
DUPLICATE_WORKSPACE: 'duplicateWorkspace',

/** Stores the state of the bulk Copy Policy Settings flow */
COPY_POLICY_SETTINGS: 'copyPolicySettings',

/** Stores the information about currently edited advanced approval workflow */
APPROVAL_WORKFLOW: 'approvalWorkflow',

Expand Down Expand Up @@ -1508,6 +1511,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.ASSIGN_CARD]: OnyxTypes.AssignCard;
[ONYXKEYS.RAM_ONLY_MOBILE_SELECTION_MODE]: boolean;
[ONYXKEYS.DUPLICATE_WORKSPACE]: OnyxTypes.DuplicateWorkspace;
[ONYXKEYS.COPY_POLICY_SETTINGS]: OnyxTypes.CopyPolicySettings;
[ONYXKEYS.NVP_FIRST_DAY_FREE_TRIAL]: string;
[ONYXKEYS.NVP_LAST_DAY_FREE_TRIAL]: string;
[ONYXKEYS.NVP_BILLING_FUND_ID]: number;
Expand Down
12 changes: 12 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2974,6 +2974,18 @@ const ROUTES = {
route: 'workspace/:policyID/duplicate/select-features',
getRoute: (policyID: string) => `workspace/${policyID}/duplicate/select-features` as const,
},
POLICY_COPY_SETTINGS: {
route: 'policy/:policyID/copy-settings',
getRoute: (policyID: string) => `policy/${policyID}/copy-settings` as const,
},
POLICY_COPY_SETTINGS_SELECT_FEATURES: {
route: 'policy/:policyID/copy-settings/select-features',
getRoute: (policyID: string) => `policy/${policyID}/copy-settings/select-features` as const,
},
POLICY_COPY_SETTINGS_CONFIRM: {
route: 'policy/:policyID/copy-settings/confirm',
getRoute: (policyID: string) => `policy/${policyID}/copy-settings/confirm` as const,
},
WORKSPACE_RECEIPT_PARTNERS: {
route: 'workspaces/:policyID/receipt-partners',
getRoute: (policyID: string | undefined, backTo?: string) => {
Expand Down
6 changes: 6 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ const SCREENS = {
REPORT_CHANGE_WORKSPACE: 'ReportChangeWorkspace',
WORKSPACE_CONFIRMATION: 'Workspace_Confirmation',
WORKSPACE_DUPLICATE: 'Workspace_Duplicate',
POLICY_COPY_SETTINGS: 'Policy_Copy_Settings',
REPORT_SETTINGS: 'Report_Settings',
REPORT_DESCRIPTION: 'Report_Description',
PARTICIPANTS: 'Participants',
Expand Down Expand Up @@ -526,6 +527,11 @@ const SCREENS = {

WORKSPACE_CONFIRMATION: {ROOT: 'Workspace_Confirmation_Root', OWNER_SELECTOR: 'Workspace_Confirmation_Owner_Selector', SUCCESS: 'Workspace_Confirmation_Success'},
WORKSPACE_DUPLICATE: {ROOT: 'Workspace_Duplicate_Root', SELECT_FEATURES: 'Workspace_Duplicate_Select_Features'},
POLICY_COPY_SETTINGS: {
ROOT: 'Policy_Copy_Settings_Root',
SELECT_FEATURES: 'Policy_Copy_Settings_Select_Features',
CONFIRM: 'Policy_Copy_Settings_Confirm',
},

WORKSPACES_LIST: 'Workspaces_List',

Expand Down
11 changes: 11 additions & 0 deletions src/libs/API/parameters/CopyPolicySettingsParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
type CopyPolicySettingsParams = {
sourcePolicyID: string;
Comment thread
fedirjh marked this conversation as resolved.

/** CSV list of target policy IDs to copy settings into */
policyIDList: string;

/** CSV list of feature keys to copy */
parts: string;
};

export default CopyPolicySettingsParams;
1 change: 1 addition & 0 deletions src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ export type {default as UnlinkLoginParams} from './UnlinkLoginParams';
export type {default as UpdateAutomaticTimezoneParams} from './UpdateAutomaticTimezoneParams';
export type {default as UpdateChatPriorityModeParams} from './UpdateChatPriorityModeParams';
export type {default as DuplicateWorkspaceParams} from './DuplicateWorkspaceParams';
export type {default as CopyPolicySettingsParams} from './CopyPolicySettingsParams';
export type {default as UpdateDateOfBirthParams} from './UpdateDateOfBirthParams';
export type {default as UpdateDisplayNameParams} from './UpdateDisplayNameParams';
export type {default as UpdateChatNameParams} from './UpdateChatNameParams';
Expand Down
4 changes: 4 additions & 0 deletions src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ const WRITE_COMMANDS = {
UPDATE_WORKSPACE_MEMBERS_ROLE: 'UpdateWorkspaceMembersRole',
CREATE_WORKSPACE: 'CreateWorkspace',
DUPLICATE_POLICY: 'DuplicatePolicy',
COPY_POLICY_SETTINGS: 'CopyPolicySettings',
COPY_POLICY_SETTINGS_NOTIFY: 'CopyPolicySettings_Notify',
CREATE_WORKSPACE_FROM_IOU_PAYMENT: 'CreateWorkspaceFromIOUPayment',
UPDATE_POLICY_MEMBERS_CUSTOM_FIELDS: 'UpdatePolicyMembersCustomFields',
SET_WORKSPACE_CATEGORIES_ENABLED: 'SetWorkspaceCategoriesEnabled',
Expand Down Expand Up @@ -970,6 +972,8 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.PAY_INVOICE]: Parameters.PayInvoiceParams;
[WRITE_COMMANDS.MARK_AS_CASH]: Parameters.MarkAsCashParams;
[WRITE_COMMANDS.DUPLICATE_POLICY]: Parameters.DuplicateWorkspaceParams;
[WRITE_COMMANDS.COPY_POLICY_SETTINGS]: Parameters.CopyPolicySettingsParams;
[WRITE_COMMANDS.COPY_POLICY_SETTINGS_NOTIFY]: EmptyObject;
[WRITE_COMMANDS.MERGE_DUPLICATES]: Parameters.MergeDuplicatesParams;
[WRITE_COMMANDS.RESOLVE_DUPLICATES]: Parameters.ResolveDuplicatesParams;
[WRITE_COMMANDS.MERGE_TRANSACTION]: Parameters.MergeTransactionParams;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import type {
NewReportWorkspaceSelectionNavigatorParamList,
NewTaskNavigatorParamList,
ParticipantsNavigatorParamList,
PolicyCopySettingsNavigatorParamList,
PrivateNotesNavigatorParamList,
ProfileNavigatorParamList,
ReferralDetailsNavigatorParamList,
Expand Down Expand Up @@ -307,6 +308,12 @@ const WorkspaceDuplicateModalStackNavigator = createModalStackNavigator<Workspac
[SCREENS.WORKSPACE_DUPLICATE.SELECT_FEATURES]: () => require<ReactComponentModule>('../../../../pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesPage').default,
});

const PolicyCopySettingsModalStackNavigator = createModalStackNavigator<PolicyCopySettingsNavigatorParamList>({
[SCREENS.POLICY_COPY_SETTINGS.ROOT]: () => require<ReactComponentModule>('../../../../pages/workspace/copyPolicySettings/CopyPolicySettingsSelectWorkspacesPage').default,
[SCREENS.POLICY_COPY_SETTINGS.SELECT_FEATURES]: () => require<ReactComponentModule>('../../../../pages/workspace/copyPolicySettings/CopyPolicySettingsSelectFeaturesPage').default,
[SCREENS.POLICY_COPY_SETTINGS.CONFIRM]: () => require<ReactComponentModule>('../../../../pages/workspace/copyPolicySettings/CopyPolicySettingsConfirmPage').default,
});

const TaskModalStackNavigator = createModalStackNavigator<TaskDetailsNavigatorParamList>({
[SCREENS.TASK.TITLE]: () => require<ReactComponentModule>('../../../../pages/tasks/TaskTitlePage').default,
[SCREENS.TASK.ASSIGNEE]: () => require<ReactComponentModule>('../../../../pages/tasks/TaskAssigneeSelectorModal').default,
Expand Down Expand Up @@ -1240,6 +1247,7 @@ export {
WalletStatementStackNavigator,
WorkspaceConfirmationModalStackNavigator,
WorkspaceDuplicateModalStackNavigator,
PolicyCopySettingsModalStackNavigator,
WorkspacesDomainModalStackNavigator,
MultifactorAuthenticationStackNavigator,
};
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,10 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) {
name={SCREENS.RIGHT_MODAL.WORKSPACE_DUPLICATE}
component={ModalStackNavigators.WorkspaceDuplicateModalStackNavigator}
/>
<Stack.Screen
name={SCREENS.RIGHT_MODAL.POLICY_COPY_SETTINGS}
component={ModalStackNavigators.PolicyCopySettingsModalStackNavigator}
/>
<Stack.Screen
name={SCREENS.RIGHT_MODAL.NEW_TASK}
component={ModalStackNavigators.NewTaskModalStackNavigator}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ const WORKSPACES_LIST_TO_RHP: Record<typeof SCREENS.WORKSPACES_LIST, string[]> =
[SCREENS.WORKSPACES_LIST]: [
SCREENS.WORKSPACE_DUPLICATE.SELECT_FEATURES,
SCREENS.WORKSPACE_DUPLICATE.ROOT,
SCREENS.POLICY_COPY_SETTINGS.ROOT,
SCREENS.POLICY_COPY_SETTINGS.SELECT_FEATURES,
SCREENS.POLICY_COPY_SETTINGS.CONFIRM,
SCREENS.WORKSPACES_VERIFY_DOMAIN,
SCREENS.WORKSPACES_DOMAIN_VERIFIED,
SCREENS.WORKSPACES_ADD_DOMAIN,
Expand Down
7 changes: 7 additions & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1615,6 +1615,13 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.WORKSPACE_DUPLICATE.SELECT_FEATURES]: ROUTES.WORKSPACE_DUPLICATE_SELECT_FEATURES.route,
},
},
[SCREENS.RIGHT_MODAL.POLICY_COPY_SETTINGS]: {
screens: {
[SCREENS.POLICY_COPY_SETTINGS.ROOT]: ROUTES.POLICY_COPY_SETTINGS.route,
[SCREENS.POLICY_COPY_SETTINGS.SELECT_FEATURES]: ROUTES.POLICY_COPY_SETTINGS_SELECT_FEATURES.route,
[SCREENS.POLICY_COPY_SETTINGS.CONFIRM]: ROUTES.POLICY_COPY_SETTINGS_CONFIRM.route,
},
},
[SCREENS.RIGHT_MODAL.NEW_TASK]: {
screens: {
[SCREENS.NEW_TASK.ROOT]: ROUTES.NEW_TASK.route,
Expand Down
14 changes: 14 additions & 0 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2233,6 +2233,18 @@ type WorkspaceDuplicateNavigatorParamList = {
};
};

type PolicyCopySettingsNavigatorParamList = {
[SCREENS.POLICY_COPY_SETTINGS.ROOT]: {
policyID: string;
};
[SCREENS.POLICY_COPY_SETTINGS.SELECT_FEATURES]: {
policyID: string;
};
[SCREENS.POLICY_COPY_SETTINGS.CONFIRM]: {
policyID: string;
};
};

type NewTaskNavigatorParamList = {
[SCREENS.NEW_TASK.ROOT]: {
// eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md
Expand Down Expand Up @@ -2517,6 +2529,7 @@ type RightModalNavigatorParamList = {
[SCREENS.RIGHT_MODAL.MONEY_REQUEST]: NavigatorScreenParams<MoneyRequestNavigatorParamList>;
[SCREENS.RIGHT_MODAL.WORKSPACE_CONFIRMATION]: NavigatorScreenParams<WorkspaceConfirmationNavigatorParamList>;
[SCREENS.RIGHT_MODAL.WORKSPACE_DUPLICATE]: NavigatorScreenParams<WorkspaceDuplicateNavigatorParamList>;
[SCREENS.RIGHT_MODAL.POLICY_COPY_SETTINGS]: NavigatorScreenParams<PolicyCopySettingsNavigatorParamList>;
[SCREENS.RIGHT_MODAL.NEW_TASK]: NavigatorScreenParams<NewTaskNavigatorParamList>;
[SCREENS.RIGHT_MODAL.TEACHERS_UNITE]: NavigatorScreenParams<TeachersUniteNavigatorParamList>;
[SCREENS.RIGHT_MODAL.TASK_DETAILS]: NavigatorScreenParams<TaskDetailsNavigatorParamList>;
Expand Down Expand Up @@ -3376,6 +3389,7 @@ export type {
MigratedUserModalNavigatorParamList,
WorkspaceConfirmationNavigatorParamList,
WorkspaceDuplicateNavigatorParamList,
PolicyCopySettingsNavigatorParamList,
TwoFactorAuthNavigatorParamList,
ScheduleCallParamList,
TestDriveModalNavigatorParamList,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
function CopyPolicySettingsConfirmPage() {
return null;
}

CopyPolicySettingsConfirmPage.displayName = 'CopyPolicySettingsConfirmPage';

export default CopyPolicySettingsConfirmPage;
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
function CopyPolicySettingsSelectFeaturesPage() {
return null;
}

CopyPolicySettingsSelectFeaturesPage.displayName = 'CopyPolicySettingsSelectFeaturesPage';

export default CopyPolicySettingsSelectFeaturesPage;
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
function CopyPolicySettingsSelectWorkspacesPage() {
return null;
}

CopyPolicySettingsSelectWorkspacesPage.displayName = 'CopyPolicySettingsSelectWorkspacesPage';

export default CopyPolicySettingsSelectWorkspacesPage;
26 changes: 26 additions & 0 deletions src/types/onyx/CopyPolicySettings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import type {Errors} from './OnyxCommon';

/** Onyx state of the Copy Policy Settings (bulk workspace edits) flow */
type CopyPolicySettings = {
/** The source policy ID we're copying settings FROM */
sourcePolicyID?: string;

/** The list of target policy IDs we're copying settings TO */
targetPolicyIDs?: string[];

/** Which feature parts are selected for copying */
parts?: string[];

/**
* Which step of the copy is happening in the backend
* - `loading`: copy in progress
* - `complete`: backend finished
* - undefined: copy hasn't started yet (e.g. user is still selecting features)
*/
currentStep?: 'loading' | 'complete' | undefined;

/** Error state */
errors?: Errors;
};

export default CopyPolicySettings;
2 changes: 2 additions & 0 deletions src/types/onyx/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import type {
} from './CardFeeds';
import type CardOnWaitlist from './CardOnWaitlist';
import type CodingRuleMatchingTransaction from './CodingRuleMatchingTransaction';
import type CopyPolicySettings from './CopyPolicySettings';
import type {CorpayFields, CorpayFormField} from './CorpayFields';
import type {CorpayOnboardingFields} from './CorpayOnboardingFields';
import type Credentials from './Credentials';
Expand Down Expand Up @@ -219,6 +220,7 @@ export type {
Domain,
Download,
DuplicateWorkspace,
CopyPolicySettings,
WorkspaceCardsList,
ExpenseRule,
ExpensifyCardSettings,
Expand Down
Loading