diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 5392f262691c..77dc799e8b35 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -284,6 +284,12 @@ const CONST = { START: 'start', STOP: 'stop', }, + OOO_DURATION_UNITS: { + HOUR: 'hours', + DAY: 'days', + WEEK: 'weeks', + MONTH: 'months', + }, }, RECEIPT_CAMERA: { diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 0fa0a003371b..f46b97c39a03 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -890,6 +890,8 @@ const ONYXKEYS = { ONBOARDING_WORKSPACE_DETAILS_FORM_DRAFT: 'onboardingWorkspaceDetailsFormDraft', ROOM_NAME_FORM: 'roomNameForm', ROOM_NAME_FORM_DRAFT: 'roomNameFormDraft', + CHRONOS_SCHEDULE_OOO_FORM: 'chronosScheduleOOOForm', + CHRONOS_SCHEDULE_OOO_FORM_DRAFT: 'chronosScheduleOOOFormDraft', REPORT_DESCRIPTION_FORM: 'reportDescriptionForm', REPORT_DESCRIPTION_FORM_DRAFT: 'reportDescriptionFormDraft', LEGAL_NAME_FORM: 'legalNameForm', @@ -1119,6 +1121,7 @@ type OnyxFormValuesMapping = { [ONYXKEYS.FORMS.DISPLAY_NAME_FORM]: FormTypes.DisplayNameForm; [ONYXKEYS.FORMS.ONBOARDING_PERSONAL_DETAILS_FORM]: FormTypes.DisplayNameForm; [ONYXKEYS.FORMS.ROOM_NAME_FORM]: FormTypes.RoomNameForm; + [ONYXKEYS.FORMS.CHRONOS_SCHEDULE_OOO_FORM]: FormTypes.ChronosScheduleOOOForm; [ONYXKEYS.FORMS.REPORT_DESCRIPTION_FORM]: FormTypes.ReportDescriptionForm; [ONYXKEYS.FORMS.LEGAL_NAME_FORM]: FormTypes.LegalNameForm; [ONYXKEYS.FORMS.WORKSPACE_INVITE_MESSAGE_FORM]: FormTypes.WorkspaceInviteMessageForm; diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 9989fc5e7540..3271056e55cc 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -996,6 +996,10 @@ const ROUTES = { route: 'r/:reportID/settings/columns', getRoute: (reportID: string) => `r/${reportID}/settings/columns` as const, }, + CHRONOS_SCHEDULE_OOO: { + route: 'r/:reportID/chronos/schedule-ooo', + getRoute: (reportID: string) => `r/${reportID}/chronos/schedule-ooo` as const, + }, SPLIT_BILL_DETAILS: { route: 'r/:reportID/split/:reportActionID', getRoute: (reportID: string | undefined, reportActionID: string, backTo?: string) => { diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 9d1bbe5d379d..2dd10474e29f 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -339,6 +339,7 @@ const SCREENS = { DOMAIN: 'Domain', EXPENSE_REPORT: 'ExpenseReport', MULTIFACTOR_AUTHENTICATION: 'MultifactorAuthentication', + CHRONOS_SCHEDULE_OOO: 'Chronos_Schedule_OOO', }, REPORT_CARD_ACTIVATE: 'Report_Card_Activate_Root', SAML_SIGN_IN: 'SAMLSignIn', @@ -923,6 +924,7 @@ const SCREENS = { AUTO_SUBMIT_ROOT: 'AutoSubmit_Modal_Root', CHANGE_POLICY_EDUCATIONAL_ROOT: 'ChangePolicyEducational_Root', REPORT_DESCRIPTION_ROOT: 'Report_Description_Root', + CHRONOS_SCHEDULE_OOO_ROOT: 'Chronos_Schedule_OOO_Root', REPORT_PARTICIPANTS: { ROOT: 'ReportParticipants_Root', INVITE: 'ReportParticipants_Invite', diff --git a/src/components/AmountForm.tsx b/src/components/AmountForm.tsx index d8acc426172f..357d29eba9ae 100644 --- a/src/components/AmountForm.tsx +++ b/src/components/AmountForm.tsx @@ -46,6 +46,15 @@ type AmountFormProps = { /** Whether to hide the currency symbol */ hideCurrencySymbol?: boolean; + /** When true, shows the trailing dropdown (same as currency picker in IOU amount flows) */ + shouldShowCurrencyButton?: boolean; + + /** Text on the trailing dropdown button. Use with `shouldShowCurrencyButton` when the suffix is not a currency code (e.g. duration unit). */ + currencyButtonLabel?: string; + + /** Accessibility label for the trailing dropdown */ + currencyButtonAccessibilityLabel?: string; + /** Whether the input should be disabled */ disabled?: boolean; @@ -77,6 +86,9 @@ function AmountForm({ label, decimals: decimalsProp, hideCurrencySymbol = false, + shouldShowCurrencyButton = false, + currencyButtonLabel, + currencyButtonAccessibilityLabel, disabled = false, autoFocus, autoGrowExtraSpace, @@ -94,7 +106,7 @@ function AmountForm({ return ( > = [ + { + value: 'timer' as const, + text: translate(isTimerRunning ? 'chronos.stopTimer' : 'chronos.startTimer'), + }, + { + value: 'scheduleOOO' as const, + text: translate('chronos.scheduleOOO'), + onSelected: () => Navigation.navigate(ROUTES.CHRONOS_SCHEDULE_OOO.getRoute(report.reportID)), + shouldUpdateSelectedIndex: false, + }, + ]; + if (!canWriteInReport(report)) { return null; } return ( -