From 1ebc7b63f80c7b4aca12e49c8dbf9cb8b01baf71 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 27 Jun 2025 14:02:22 +0100 Subject: [PATCH 01/20] wip --- src/CONST/index.ts | 5 + src/languages/en.ts | 7 ++ ...anyCardStatementCloseDateSelectionList.tsx | 110 ++++++++++++++++++ .../companyCards/addNew/AddNewCardPage.tsx | 3 + .../addNew/StatementCloseDateStep.tsx | 15 +++ 5 files changed, 140 insertions(+) create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx create mode 100644 src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 0fd5c8b7a34..56b4e0c332c 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -3445,6 +3445,11 @@ const CONST = { RESTRICT: 'corporate', ALLOW: 'personal', }, + STATEMENT_CLOSE_DATE: { + LAST_DAY_OF_MONTH: 'lastDayOfMonth', + LAST_BUSINESS_DAY_OF_MONTH: 'lastBusinessDayOfMonth', + CUSTOM_DAY_OF_MONTH: 'customDayOfMonth', + }, CARD_LIST_THRESHOLD: 8, DEFAULT_EXPORT_TYPE: 'default', EXPORT_CARD_TYPES: { diff --git a/src/languages/en.ts b/src/languages/en.ts index 715e9645ad2..1358c97cbd8 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -4034,6 +4034,11 @@ const translations = { pleaseSelectFeedType: 'Please select a feed type before continuing', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Last day of the month', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Last business day of the month', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Custom day of month', + }, assignCard: 'Assign card', findCard: 'Find card', cardNumber: 'Card number', @@ -4295,6 +4300,8 @@ const translations = { expensifyCardBannerTitle: 'Get the Expensify Card', expensifyCardBannerSubtitle: 'Enjoy cash back on every US purchase, up to 50% off your Expensify bill, unlimited virtual cards, and so much more.', expensifyCardBannerLearnMoreButton: 'Learn more', + statementCloseDateTitle: 'Statement close date', + statementCloseDateDescription: 'Let us know when your card statement closes, and we’ll create a matching statement in Expensify.', }, workflows: { title: 'Workflows', diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx new file mode 100644 index 00000000000..36534a238a4 --- /dev/null +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx @@ -0,0 +1,110 @@ +import React, {useState} from 'react'; +import {View} from 'react-native'; +import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; +import FormHelpMessage from '@components/FormHelpMessage'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import MenuItem from '@components/MenuItem'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import ScreenWrapper from '@components/ScreenWrapper'; +import SelectionList from '@components/SelectionList'; +import RadioListItem from '@components/SelectionList/RadioListItem'; +import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import usePermissions from '@hooks/usePermissions'; +import useThemeIllustrations from '@hooks/useThemeIllustrations'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {translate} from '@libs/Localize'; +import styles from '@styles/index'; +import CONST from '@src/CONST'; + +function WorkspaceCompanyCardStatementCloseDateSelectionList() { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + + const [selectedOption, setSelectedOption] = useState(undefined); + const [customCloseDate, setCustomCloseDate] = useState(undefined); + + const isCustomCloseDate = selectedOption === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH; + const closeDate = isCustomCloseDate ? customCloseDate : selectedOption; + + // s77rt handle error and brick road indicator (on both options selection and custom day selection) + // s77rt fix size (and add compact option) + + return ( + + {}} // s77rt + /> + + + {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')} + + + {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => ( + setSelectedOption(option)} + /> + ))} + {isCustomCloseDate && ( + + )} + + + + {}} // s77rt + enabledWhenOffline + /> + + {/* + {}} // s77rt + sections={[{data}]} + shouldSingleExecuteRowSelect + initiallyFocusedOptionKey={addNewCard?.data.selectedBank} + shouldUpdateFocusedIndex + showConfirmButton + confirmButtonText={translate('common.next')} + onConfirm={() => {}} // s77rt + confirmButtonStyles={!hasError && styles.mt5} + addBottomSafeAreaPadding + > + {hasError && ( + + + + )} + + */} + + ); +} + +WorkspaceCompanyCardStatementCloseDateSelectionList.displayName = 'WorkspaceCompanyCardStatementCloseDateSelectionList'; + +export default WorkspaceCompanyCardStatementCloseDateSelectionList; diff --git a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx index 1d40658064b..40704af8a40 100644 --- a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx +++ b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx @@ -21,6 +21,7 @@ import PlaidConnectionStep from './PlaidConnectionStep'; import SelectBankStep from './SelectBankStep'; import SelectCountryStep from './SelectCountryStep'; import SelectFeedType from './SelectFeedType'; +import StatementCloseDateStep from './StatementCloseDateStep'; function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) { const policyID = policy?.id; @@ -84,6 +85,8 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) { case CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION: return ; default: + // s77rt test + return ; return isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) ? : ; } } diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx new file mode 100644 index 00000000000..379b7ba0e67 --- /dev/null +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import WorkspaceCompanyCardStatementCloseDateSelectionList from '../WorkspaceCompanyCardStatementCloseDateSelectionList'; + +type StatementCloseDateStepProps = { + /** ID of the current policy */ + policyID: string | undefined; +}; + +function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { + return ; +} + +StatementCloseDateStep.displayName = 'StatementCloseDateStep'; + +export default StatementCloseDateStep; From 831ba3e39a01964c738425bbaa07a22301d35a10 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 27 Jun 2025 23:42:31 +0100 Subject: [PATCH 02/20] update WorkspaceCompanyCardStatementCloseDateSelectionList --- src/languages/en.ts | 2 + ...anyCardStatementCloseDateSelectionList.tsx | 110 -------------- .../CustomCloseDateSelectionList.tsx | 97 +++++++++++++ .../index.tsx | 136 ++++++++++++++++++ src/types/onyx/CardFeeds.ts | 4 + 5 files changed, 239 insertions(+), 110 deletions(-) delete mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx create mode 100644 src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx diff --git a/src/languages/en.ts b/src/languages/en.ts index 1358c97cbd8..08119d323e4 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -4055,6 +4055,7 @@ const translations = { startDateDescription: "We'll import all transaction from this date onwards. If no date is specified, we’ll go as far back as your bank allows.", fromTheBeginning: 'From the beginning', customStartDate: 'Custom start date', + customCloseDate: 'Custom close date', letsDoubleCheck: 'Let’s double check that everything looks right.', confirmationDescription: 'We’ll begin importing transactions immediately.', cardholder: 'Cardholder', @@ -4276,6 +4277,7 @@ const translations = { removeCardFeedDescription: 'Are you sure you want to remove this card feed? This will unassign all cards.', error: { feedNameRequired: 'Card feed name is required', + statementCloseDateRequired: 'Please select a statement close date.', }, corporate: 'Restrict deleting transactions', personal: 'Allow deleting transactions', diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx deleted file mode 100644 index 36534a238a4..00000000000 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import React, {useState} from 'react'; -import {View} from 'react-native'; -import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; -import FormHelpMessage from '@components/FormHelpMessage'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import MenuItem from '@components/MenuItem'; -import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; -import ScreenWrapper from '@components/ScreenWrapper'; -import SelectionList from '@components/SelectionList'; -import RadioListItem from '@components/SelectionList/RadioListItem'; -import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; -import Text from '@components/Text'; -import useLocalize from '@hooks/useLocalize'; -import usePermissions from '@hooks/usePermissions'; -import useThemeIllustrations from '@hooks/useThemeIllustrations'; -import useThemeStyles from '@hooks/useThemeStyles'; -import {translate} from '@libs/Localize'; -import styles from '@styles/index'; -import CONST from '@src/CONST'; - -function WorkspaceCompanyCardStatementCloseDateSelectionList() { - const {translate} = useLocalize(); - const styles = useThemeStyles(); - - const [selectedOption, setSelectedOption] = useState(undefined); - const [customCloseDate, setCustomCloseDate] = useState(undefined); - - const isCustomCloseDate = selectedOption === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH; - const closeDate = isCustomCloseDate ? customCloseDate : selectedOption; - - // s77rt handle error and brick road indicator (on both options selection and custom day selection) - // s77rt fix size (and add compact option) - - return ( - - {}} // s77rt - /> - - - {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')} - - - {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => ( - setSelectedOption(option)} - /> - ))} - {isCustomCloseDate && ( - - )} - - - - {}} // s77rt - enabledWhenOffline - /> - - {/* - {}} // s77rt - sections={[{data}]} - shouldSingleExecuteRowSelect - initiallyFocusedOptionKey={addNewCard?.data.selectedBank} - shouldUpdateFocusedIndex - showConfirmButton - confirmButtonText={translate('common.next')} - onConfirm={() => {}} // s77rt - confirmButtonStyles={!hasError && styles.mt5} - addBottomSafeAreaPadding - > - {hasError && ( - - - - )} - - */} - - ); -} - -WorkspaceCompanyCardStatementCloseDateSelectionList.displayName = 'WorkspaceCompanyCardStatementCloseDateSelectionList'; - -export default WorkspaceCompanyCardStatementCloseDateSelectionList; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx new file mode 100644 index 00000000000..f62d16d3f7f --- /dev/null +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx @@ -0,0 +1,97 @@ +import React, {useCallback, useMemo, useState} from 'react'; +import FormHelpMessage from '@components/FormHelpMessage'; +import SelectionList from '@components/SelectionList'; +import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; +import {ListItem} from '@components/SelectionList/types'; +import useDebouncedState from '@hooks/useDebouncedState'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; + +type CustomCloseDateListItem = ListItem & { + value: number; +}; + +type CustomCloseDateSelectionListProps = { + initiallySelectedDay: number | undefined; + onConfirmSelectedDay: (day: number) => void; +}; + +function CustomCloseDateSelectionList({initiallySelectedDay, onConfirmSelectedDay}: CustomCloseDateSelectionListProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + + const [selectedDay, setSelectedDay] = useState(initiallySelectedDay); + const [searchValue, debouncedSearchValue, setSearchValue] = useDebouncedState(''); + const [error, setError] = useState(undefined); + + const sections = useMemo(() => { + const data = [...Array(28).keys()].reduce((days, key) => { + const dayValue = key + 1; + const day = { + value: dayValue, + text: dayValue.toString(), + keyForList: dayValue.toString(), + isSelected: dayValue === selectedDay, + }; + + if (debouncedSearchValue) { + if (day.text.includes(debouncedSearchValue)) { + days.push(day); + } + } else { + days.push(day); + } + + return days; + }, []); + + return [{data, indexOffset: 0}]; + }, [selectedDay, debouncedSearchValue]); + + const selectDayAndClearError = useCallback((item: CustomCloseDateListItem) => { + setSelectedDay(item.value); + setError(undefined); + }, []); + + const confirmSelectedDay = useCallback(() => { + if (!selectedDay) { + setError(translate('workspace.moreFeatures.companyCards.error.statementCloseDateRequired')); + return; + } + + onConfirmSelectedDay(selectedDay); + }, [selectedDay, onConfirmSelectedDay]); + + return ( + + {!!error && ( + + )} + + ); +} + +CustomCloseDateSelectionList.displayName = 'CustomCloseDateSelectionList'; + +export default CustomCloseDateSelectionList; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx new file mode 100644 index 00000000000..a11e08afbf7 --- /dev/null +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -0,0 +1,136 @@ +import React, {useCallback, useMemo, useState} from 'react'; +import {View} from 'react-native'; +import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; +import FormHelpMessage from '@components/FormHelpMessage'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import ScreenWrapper from '@components/ScreenWrapper'; +import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; +import {ListItem} from '@components/SelectionList/types'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; +import CONST from '@src/CONST'; +import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; +import CustomCloseDateSelectionList from './CustomCloseDateSelectionList'; + +type StatementCloseDateListItem = ListItem & { + value: CompanyCardStatementCloseDate; +}; + +function WorkspaceCompanyCardStatementCloseDateSelectionList() { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + + const [selectedDate, setSelectedDate] = useState(undefined); + const [selectedCustomDate, setSelectedCustomDate] = useState(undefined); + const [error, setError] = useState(undefined); + + const [isChoosingCustomDate, setIsChoosingCustomDate] = useState(false); + + const title = useMemo( + () => (isChoosingCustomDate ? translate('workspace.companyCards.customCloseDate') : translate('workspace.moreFeatures.companyCards.statementCloseDateTitle')), + [translate, isChoosingCustomDate], + ); + + const goBack = useCallback(() => { + if (isChoosingCustomDate) { + setIsChoosingCustomDate(false); + return; + } + + Navigation.goBack(); + }, [isChoosingCustomDate]); + + const selectDateAndClearError = useCallback((item: StatementCloseDateListItem) => { + setSelectedDate(item.value); + setError(undefined); + }, []); + + const selectCustomDateAndClearError = useCallback( + (day: number) => { + setSelectedCustomDate(day); + setError(undefined); + goBack(); + }, + [goBack], + ); + + const submit = useCallback(() => { + if (!selectedDate || (selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH && !selectedCustomDate)) { + setError(translate('workspace.moreFeatures.companyCards.error.statementCloseDateRequired')); + return; + } + + // s77rt do something with selectedDate / selectedCustomDate + }, [selectedDate, selectedCustomDate]); + + // s77rt fix size (and add compact option) + + return ( + + + {isChoosingCustomDate ? ( + + ) : ( + <> + + {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')} + + {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => ( + + ))} + {selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH && ( + setIsChoosingCustomDate(true)} + /> + )} + + + + {!!error && ( + + )} + + + + )} + + ); +} + +WorkspaceCompanyCardStatementCloseDateSelectionList.displayName = 'WorkspaceCompanyCardStatementCloseDateSelectionList'; + +export default WorkspaceCompanyCardStatementCloseDateSelectionList; diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 7941e8fd1cc..f2650bbab51 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -4,6 +4,9 @@ import type {ValueOf} from 'type-fest'; import type CONST from '@src/CONST'; import type * as OnyxCommon from './OnyxCommon'; +/** Card statement close date */ +type CompanyCardStatementCloseDate = ValueOf; + /** Card feed */ type CompanyCardFeed = ValueOf; @@ -165,4 +168,5 @@ export type { CompanyCardNicknames, CompanyCardFeedWithNumber, FundID, + CompanyCardStatementCloseDate, }; From 0bf1e6480a42025c316af9b6e026e1dd5d1682d3 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Fri, 27 Jun 2025 23:53:29 +0100 Subject: [PATCH 03/20] use compact mode in custom close date menu item --- .../index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index a11e08afbf7..5d94a2c3257 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -108,6 +108,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList() { title={selectedCustomDate?.toString()} description={translate('workspace.companyCards.customCloseDate')} onPress={() => setIsChoosingCustomDate(true)} + viewMode={CONST.OPTION_MODE.COMPACT} /> )} From 28ce0e4234fc9a016e445ce101db11b263b08d38 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 00:56:31 +0100 Subject: [PATCH 04/20] WorkspaceCompanyCardStatementCloseDateSelectionList: added onSubmit callback --- .../index.tsx | 15 +++++--- .../addNew/StatementCloseDateStep.tsx | 38 ++++++++++++++++++- src/types/onyx/CardFeeds.ts | 3 ++ 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 5d94a2c3257..17e74fc917f 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -19,7 +19,12 @@ type StatementCloseDateListItem = ListItem & { value: CompanyCardStatementCloseDate; }; -function WorkspaceCompanyCardStatementCloseDateSelectionList() { +type WorkspaceCompanyCardStatementCloseDateSelectionListProps = { + confirmText: string; + onSubmit: (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => void; +}; + +function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); @@ -63,10 +68,8 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList() { return; } - // s77rt do something with selectedDate / selectedCustomDate - }, [selectedDate, selectedCustomDate]); - - // s77rt fix size (and add compact option) + onSubmit(selectedDate, selectedDate === CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH ? selectedCustomDate : undefined); + }, [selectedDate, selectedCustomDate, onSubmit]); return ( )} diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx index 379b7ba0e67..908708243c8 100644 --- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -1,4 +1,12 @@ -import React from 'react'; +import React, {useCallback} from 'react'; +import useOnyx from 'react-native-onyx/dist/useOnyx'; +import useCardFeeds from '@hooks/useCardFeeds'; +import useLocalize from '@hooks/useLocalize'; +import {addNewCompanyCardsFeed} from '@libs/actions/CompanyCards'; +import Navigation from '@libs/Navigation/Navigation'; +import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; +import {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; import WorkspaceCompanyCardStatementCloseDateSelectionList from '../WorkspaceCompanyCardStatementCloseDateSelectionList'; type StatementCloseDateStepProps = { @@ -7,7 +15,33 @@ type StatementCloseDateStepProps = { }; function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { - return ; + const {translate} = useLocalize(); + + const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD, {canBeMissing: false}); + const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); + + const [cardFeeds] = useCardFeeds(policyID); + + const submit = useCallback( + // s77rt make use of statementCloseDate / statementCustomCloseDate and remove disable lint rule + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => { + if (!addNewCard?.data) { + return; + } + + addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, addNewCard.data.feedDetails, cardFeeds, lastSelectedFeed); + Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); + }, + [policyID, addNewCard, cardFeeds, lastSelectedFeed], + ); + + return ( + + ); } StatementCloseDateStep.displayName = 'StatementCloseDateStep'; diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index f2650bbab51..ea55d5044e5 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -106,6 +106,9 @@ type AddNewCardFeedData = { /** Card feed provider */ feedType: CardFeedProvider; + /** Stringified card feed details */ + feedDetails: string; + /** Name of the card */ cardTitle: string; From 9e50cc1aa4941c00130adf18a1ec1b52251422a9 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:13:57 +0100 Subject: [PATCH 05/20] add statement close date step --- src/CONST/index.ts | 1 + .../index.tsx | 8 ++++---- .../workspace/companyCards/addNew/AddNewCardPage.tsx | 4 ++-- .../workspace/companyCards/addNew/DetailsStep.tsx | 12 +++++++++++- .../companyCards/addNew/StatementCloseDateStep.tsx | 8 +++++++- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 56b4e0c332c..0b59dcdd15e 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -3404,6 +3404,7 @@ const CONST = { AMEX_CUSTOM_FEED: 'AmexCustomFeed', SELECT_COUNTRY: 'SelectCountry', PLAID_CONNECTION: 'PlaidConnection', + SELECT_STATEMENT_CLOSE_DATE: 'SelectStatementCloseDate', }, CARD_TYPE: { AMEX: 'amex', diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 17e74fc917f..79f4ac1e8f9 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -10,7 +10,6 @@ import {ListItem} from '@components/SelectionList/types'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@libs/Navigation/Navigation'; import CONST from '@src/CONST'; import type {CompanyCardStatementCloseDate} from '@src/types/onyx/CardFeeds'; import CustomCloseDateSelectionList from './CustomCloseDateSelectionList'; @@ -22,9 +21,10 @@ type StatementCloseDateListItem = ListItem & { type WorkspaceCompanyCardStatementCloseDateSelectionListProps = { confirmText: string; onSubmit: (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => void; + onBackButtonPress: () => void; }; -function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) { +function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit, onBackButtonPress}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); @@ -45,8 +45,8 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub return; } - Navigation.goBack(); - }, [isChoosingCustomDate]); + onBackButtonPress(); + }, [isChoosingCustomDate, onBackButtonPress]); const selectDateAndClearError = useCallback((item: StatementCloseDateListItem) => { setSelectedDate(item.value); diff --git a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx index 40704af8a40..eb460cdc82e 100644 --- a/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx +++ b/src/pages/workspace/companyCards/addNew/AddNewCardPage.tsx @@ -84,9 +84,9 @@ function AddNewCardPage({policy}: WithPolicyAndFullscreenLoadingProps) { return ; case CONST.COMPANY_CARDS.STEP.PLAID_CONNECTION: return ; - default: - // s77rt test + case CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE: return ; + default: return isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) ? : ; } } diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index a9e036894ea..257d1919a22 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -13,6 +13,7 @@ import TextInput from '@components/TextInput'; import TextLink from '@components/TextLink'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; import useCardFeeds from '@hooks/useCardFeeds'; +import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -35,6 +36,7 @@ function DetailsStep({policyID}: DetailsStepProps) { const theme = useTheme(); const styles = useThemeStyles(); const {inputCallbackRef} = useAutoFocusInput(); + const {isDevelopment} = useEnvironment(); const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD, {canBeMissing: false}); const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); @@ -46,6 +48,9 @@ function DetailsStep({policyID}: DetailsStepProps) { const bank = addNewCard?.data?.selectedBank; const isOtherBankSelected = bank === CONST.COMPANY_CARDS.BANKS.OTHER; + // s77rt remove DEV lock + const shouldSelectStatementCloseDate = isDevelopment; + const submit = (values: FormOnyxValues) => { if (!addNewCard?.data) { return; @@ -58,6 +63,11 @@ function DetailsStep({policyID}: DetailsStepProps) { .map(([key, value]) => `${key}: ${value}`) .join(', '); + if (shouldSelectStatementCloseDate) { + setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); + return; + } + addNewCompanyCardsFeed(policyID, addNewCard.data.feedType, feedDetails, cardFeeds, lastSelectedFeed); Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); }; @@ -198,7 +208,7 @@ function DetailsStep({policyID}: DetailsStepProps) { /> { + setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.CARD_DETAILS}); + }, []); + return ( ); } From 3c9ea3c3dce0ae6f1a09fde07b2ac3763e38378a Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:40:23 +0100 Subject: [PATCH 06/20] store feeddetails in onyx as an object --- src/libs/actions/CompanyCards.ts | 8 +++-- .../companyCards/addNew/DetailsStep.tsx | 6 ++-- src/types/onyx/CardFeeds.ts | 29 +++++++++++++++++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 785d921583f..7409a4ee8e7 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -21,7 +21,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Card, CardFeeds} from '@src/types/onyx'; import type {AssignCard, AssignCardData} from '@src/types/onyx/AssignCard'; -import type {AddNewCardFeedData, AddNewCardFeedStep, CompanyCardFeed} from '@src/types/onyx/CardFeeds'; +import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedDetails, CompanyCardFeed} from '@src/types/onyx/CardFeeds'; import type {OnyxData} from '@src/types/onyx/Request'; type AddNewCompanyCardFlowData = { @@ -58,7 +58,7 @@ function clearAddNewCardFlow() { }); } -function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyCardFeed, feedDetails: string, cardFeeds: OnyxEntry, lastSelectedFeed?: CompanyCardFeed) { +function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyCardFeed, feedDetails: CardFeedDetails, cardFeeds: OnyxEntry, lastSelectedFeed?: CompanyCardFeed) { const authToken = NetworkStore.getAuthToken(); const workspaceAccountID = PolicyUtils.getWorkspaceAccountID(policyID); @@ -131,7 +131,9 @@ function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyC policyID, authToken, feedType, - feedDetails, + feedDetails: Object.entries(feedDetails) + .map(([key, value]) => `${key}: ${value}`) + .join(', '), }; API.write(WRITE_COMMANDS.REQUEST_FEED_SETUP, parameters, {optimisticData, failureData, successData, finallyData}); diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 257d1919a22..c90537a586c 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -56,12 +56,10 @@ function DetailsStep({policyID}: DetailsStepProps) { return; } - const feedDetails = Object.entries({ + const feedDetails = { ...values, bankName: addNewCard.data.bankName ?? 'Amex', - }) - .map(([key, value]) => `${key}: ${value}`) - .join(', '); + }; if (shouldSelectStatementCloseDate) { setAddNewCompanyCardStepAndData({step: CONST.COMPANY_CARDS.STEP.SELECT_STATEMENT_CLOSE_DATE, data: {feedDetails}}); diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index ea55d5044e5..59163e5af1b 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -20,6 +20,30 @@ type CardFeedProvider = | typeof CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX | typeof CONST.COMPANY_CARD.FEED_BANK_NAME.STRIPE; +/** Card feed details */ +type CardFeedDetails = { + /** Card title */ + cardTitle?: string; + + /** Processor ID */ + processorID?: string; + + /** Financial institution (bank) ID */ + bankID?: string; + + /** Financial institution (bank) name */ + bankName?: string; + + /** Company ID */ + companyID?: string; + + /** Distribution ID */ + distributionID?: string; + + /** Delivery file name */ + deliveryFileName: string; +}; + /** Custom card feed data */ type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ /** Whether any actions are pending */ @@ -106,8 +130,8 @@ type AddNewCardFeedData = { /** Card feed provider */ feedType: CardFeedProvider; - /** Stringified card feed details */ - feedDetails: string; + /** Card feed details */ + feedDetails: CardFeedDetails; /** Name of the card */ cardTitle: string; @@ -164,6 +188,7 @@ export type { AddNewCompanyCardFeed, AddNewCardFeedData, CompanyCardFeed, + CardFeedDetails, DirectCardFeedData, CardFeedProvider, CardFeedData, From 9085f8be6ffb22bc8dbe98f05323ad645e67f322 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:49:15 +0100 Subject: [PATCH 07/20] added default values to details step --- src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index c90537a586c..624936908e2 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -149,6 +149,7 @@ function DetailsStep({policyID}: DetailsStepProps) { role={CONST.ROLE.PRESENTATION} containerStyles={[styles.mb6]} ref={inputCallbackRef} + defaultValue={addNewCard?.data.feedDetails.processorID} /> ); @@ -175,6 +178,7 @@ function DetailsStep({policyID}: DetailsStepProps) { role={CONST.ROLE.PRESENTATION} containerStyles={[styles.mb6]} ref={inputCallbackRef} + defaultValue={addNewCard?.data.feedDetails.distributionID} /> ); case CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX: @@ -186,6 +190,7 @@ function DetailsStep({policyID}: DetailsStepProps) { role={CONST.ROLE.PRESENTATION} containerStyles={[styles.mb6]} ref={inputCallbackRef} + defaultValue={addNewCard?.data.feedDetails.deliveryFileName} /> ); default: From 298246f0659cb73d33db61efce9e094f09e9d3a0 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:58:08 +0100 Subject: [PATCH 08/20] update CardFeedDetails type --- .../workspace/companyCards/addNew/DetailsStep.tsx | 10 +++++----- src/types/onyx/CardFeeds.ts | 5 +---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index 624936908e2..e1879c6ef9e 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -149,7 +149,7 @@ function DetailsStep({policyID}: DetailsStepProps) { role={CONST.ROLE.PRESENTATION} containerStyles={[styles.mb6]} ref={inputCallbackRef} - defaultValue={addNewCard?.data.feedDetails.processorID} + defaultValue={addNewCard?.data.feedDetails?.processorID} /> ); @@ -178,7 +178,7 @@ function DetailsStep({policyID}: DetailsStepProps) { role={CONST.ROLE.PRESENTATION} containerStyles={[styles.mb6]} ref={inputCallbackRef} - defaultValue={addNewCard?.data.feedDetails.distributionID} + defaultValue={addNewCard?.data.feedDetails?.distributionID} /> ); case CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX: @@ -190,7 +190,7 @@ function DetailsStep({policyID}: DetailsStepProps) { role={CONST.ROLE.PRESENTATION} containerStyles={[styles.mb6]} ref={inputCallbackRef} - defaultValue={addNewCard?.data.feedDetails.deliveryFileName} + defaultValue={addNewCard?.data.feedDetails?.deliveryFileName} /> ); default: diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 59163e5af1b..6aca9f322b1 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -22,9 +22,6 @@ type CardFeedProvider = /** Card feed details */ type CardFeedDetails = { - /** Card title */ - cardTitle?: string; - /** Processor ID */ processorID?: string; @@ -131,7 +128,7 @@ type AddNewCardFeedData = { feedType: CardFeedProvider; /** Card feed details */ - feedDetails: CardFeedDetails; + feedDetails?: CardFeedDetails; /** Name of the card */ cardTitle: string; From 66a37c7534f5c1e006d12d44883c09df8411ffe7 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 02:06:54 +0100 Subject: [PATCH 09/20] lint --- .../CustomCloseDateSelectionList.tsx | 4 ++-- .../index.tsx | 4 ++-- .../companyCards/addNew/StatementCloseDateStep.tsx | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx index f62d16d3f7f..96f0f315767 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx @@ -2,7 +2,7 @@ import React, {useCallback, useMemo, useState} from 'react'; import FormHelpMessage from '@components/FormHelpMessage'; import SelectionList from '@components/SelectionList'; import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; -import {ListItem} from '@components/SelectionList/types'; +import type {ListItem} from '@components/SelectionList/types'; import useDebouncedState from '@hooks/useDebouncedState'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -60,7 +60,7 @@ function CustomCloseDateSelectionList({initiallySelectedDay, onConfirmSelectedDa } onConfirmSelectedDay(selectedDay); - }, [selectedDay, onConfirmSelectedDay]); + }, [selectedDay, onConfirmSelectedDay, translate]); return ( { - if (!addNewCard?.data) { + if (!addNewCard?.data.feedDetails) { return; } From 0fb57f3a85ed24f2fa95b0b73a8ee5cd628e8a62 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 02:26:02 +0100 Subject: [PATCH 10/20] disable details and statement close date steps when offline --- .../index.tsx | 5 +++-- src/pages/workspace/companyCards/addNew/DetailsStep.tsx | 1 - .../workspace/companyCards/addNew/StatementCloseDateStep.tsx | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 52dcaf0a7f7..f4ff3bafdaf 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -22,9 +22,10 @@ type WorkspaceCompanyCardStatementCloseDateSelectionListProps = { confirmText: string; onSubmit: (statementCloseDate: CompanyCardStatementCloseDate, statementCustomCloseDate: number | undefined) => void; onBackButtonPress: () => void; + enabledWhenOffline: boolean; }; -function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit, onBackButtonPress}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) { +function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSubmit, onBackButtonPress, enabledWhenOffline}: WorkspaceCompanyCardStatementCloseDateSelectionListProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); @@ -126,7 +127,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub diff --git a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx index e1879c6ef9e..ec2bb409665 100644 --- a/src/pages/workspace/companyCards/addNew/DetailsStep.tsx +++ b/src/pages/workspace/companyCards/addNew/DetailsStep.tsx @@ -215,7 +215,6 @@ function DetailsStep({policyID}: DetailsStepProps) { onSubmit={submit} validate={validate} style={[styles.mh5, styles.flexGrow1]} - enabledWhenOffline shouldHideFixErrorsAlert={feedProvider !== CONST.COMPANY_CARD.FEED_BANK_NAME.VISA} addBottomSafeAreaPadding > diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx index eb93ecbdf86..5894815168b 100644 --- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -46,6 +46,7 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { confirmText={translate('common.submit')} onSubmit={submit} onBackButtonPress={goBack} + enabledWhenOffline={false} /> ); } From 978709b331bde259d85da4c66a8f14c2f322d838 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 14:24:32 +0100 Subject: [PATCH 11/20] translate --- src/languages/de.ts | 9 +++++++++ src/languages/es.ts | 9 +++++++++ src/languages/fr.ts | 9 +++++++++ src/languages/it.ts | 9 +++++++++ src/languages/ja.ts | 9 +++++++++ src/languages/nl.ts | 9 +++++++++ src/languages/pl.ts | 9 +++++++++ src/languages/pt-BR.ts | 9 +++++++++ src/languages/zh-hans.ts | 9 +++++++++ 9 files changed, 81 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index 69071e9d644..7f69b6a6c04 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -4085,6 +4085,11 @@ const translations = { pleaseSelectFeedType: 'Bitte wählen Sie einen Feed-Typ aus, bevor Sie fortfahren.', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Letzter Tag des Monats', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Letzter Geschäftstag des Monats', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Individueller Tag des Monats', + }, assignCard: 'Karte zuweisen', findCard: 'Karte finden', cardNumber: 'Kartennummer', @@ -4101,6 +4106,7 @@ const translations = { startDateDescription: 'Wir werden alle Transaktionen ab diesem Datum importieren. Wenn kein Datum angegeben ist, gehen wir so weit zurück, wie es Ihre Bank erlaubt.', fromTheBeginning: 'Von Anfang an', customStartDate: 'Benutzerdefiniertes Startdatum', + customCloseDate: 'Benutzerdefiniertes Abschlussdatum', letsDoubleCheck: 'Lassen Sie uns noch einmal überprüfen, ob alles richtig aussieht.', confirmationDescription: 'Wir werden sofort mit dem Import von Transaktionen beginnen.', cardholder: 'Karteninhaber', @@ -4325,6 +4331,7 @@ const translations = { removeCardFeedDescription: 'Möchten Sie diesen Karten-Feed wirklich entfernen? Dadurch werden alle Karten zugewiesen.', error: { feedNameRequired: 'Der Name des Karten-Feeds ist erforderlich', + statementCloseDateRequired: 'Bitte wählen Sie ein Abschlussdatum für den Kontoauszug aus.', }, corporate: 'Löschen von Transaktionen einschränken', personal: 'Löschen von Transaktionen erlauben', @@ -4351,6 +4358,8 @@ const translations = { expensifyCardBannerSubtitle: 'Genießen Sie Cashback bei jedem Einkauf in den USA, bis zu 50 % Rabatt auf Ihre Expensify-Rechnung, unbegrenzte virtuelle Karten und vieles mehr.', expensifyCardBannerLearnMoreButton: 'Erfahren Sie mehr', + statementCloseDateTitle: 'Datum des Rechnungsabschlusses', + statementCloseDateDescription: 'Teilen Sie uns mit, wann Ihre Kartenabrechnung geschlossen wird, und wir erstellen eine passende Abrechnung in Expensify.', }, workflows: { title: 'Workflows', diff --git a/src/languages/es.ts b/src/languages/es.ts index 8f9e8e77ca1..d3968d7f736 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4073,6 +4073,11 @@ const translations = { pleaseSelectFeedType: 'Seleccione un tipo de pienso antes de continuar', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último día del mes', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último día hábil del mes', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Día personalizado del mes', + }, assignCard: 'Asignar tarjeta', findCard: 'Encontrar tarjeta', cardNumber: 'Número de la tarjeta', @@ -4089,6 +4094,7 @@ const translations = { startDateDescription: 'Importaremos todas las transacciones desde esta fecha en adelante. Si no se especifica una fecha, iremos tan atrás como lo permita tu banco.', fromTheBeginning: 'Desde el principio', customStartDate: 'Fecha de inicio personalizada', + customCloseDate: 'Fecha de cierre personalizada', letsDoubleCheck: 'Verifiquemos que todo esté bien.', confirmationDescription: 'Comenzaremos a importar transacciones inmediatamente.', cardholder: 'Titular de la tarjeta', @@ -4314,6 +4320,7 @@ const translations = { removeCardFeedDescription: '¿Estás seguro de que deseas eliminar esta fuente de tarjetas? Esto anulará la asignación de todas las tarjetas.', error: { feedNameRequired: 'Se requiere el nombre de la fuente de la tarjeta', + statementCloseDateRequired: 'Por favor, selecciona una fecha de cierre del estado de cuenta.', }, corporate: 'Restringir eliminación de transacciones', personal: 'Permitir eliminación de transacciones', @@ -4340,6 +4347,8 @@ const translations = { expensifyCardBannerSubtitle: 'Disfruta de una devolución en cada compra en Estados Unidos, hasta un 50% de descuento en tu factura de Expensify, tarjetas virtuales ilimitadas y mucho más.', expensifyCardBannerLearnMoreButton: 'Más información', + statementCloseDateTitle: 'Fecha de cierre del estado de cuenta', + statementCloseDateDescription: 'Indícanos cuándo cierra el estado de cuenta de tu tarjeta y crearemos uno correspondiente en Expensify.', }, workflows: { title: 'Flujos de trabajo', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 14ae499d4fe..8f3662cfab5 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -4094,6 +4094,11 @@ const translations = { pleaseSelectFeedType: 'Veuillez sélectionner un type de flux avant de continuer', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Dernier jour du mois', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Dernier jour ouvrable du mois', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Jour personnalisé du mois', + }, assignCard: 'Attribuer la carte', findCard: 'Trouver la carte', cardNumber: 'Numéro de carte', @@ -4110,6 +4115,7 @@ const translations = { startDateDescription: "Nous importerons toutes les transactions à partir de cette date. Si aucune date n'est spécifiée, nous remonterons aussi loin que votre banque le permet.", fromTheBeginning: 'Depuis le début', customStartDate: 'Date de début personnalisé', + customCloseDate: 'Date de clôture personnalisée', letsDoubleCheck: 'Vérifions que tout est correct.', confirmationDescription: 'Nous commencerons à importer les transactions immédiatement.', cardholder: 'Titulaire de carte', @@ -4337,6 +4343,7 @@ const translations = { removeCardFeedDescription: 'Êtes-vous sûr de vouloir supprimer ce flux de cartes ? Cela désassignera toutes les cartes.', error: { feedNameRequired: 'Le nom du flux de carte est requis', + statementCloseDateRequired: 'Veuillez sélectionner une date de clôture du relevé', }, corporate: 'Restreindre la suppression des transactions', personal: 'Autoriser la suppression des transactions', @@ -4364,6 +4371,8 @@ const translations = { expensifyCardBannerSubtitle: "Profitez de remises en argent sur chaque achat aux États-Unis, jusqu'à 50 % de réduction sur votre facture Expensify, des cartes virtuelles illimitées, et bien plus encore.", expensifyCardBannerLearnMoreButton: 'En savoir plus', + statementCloseDateTitle: 'Date de clôture du relevé', + statementCloseDateDescription: 'Indiquez-nous la date de clôture de votre relevé de carte et nous créerons un relevé correspondant dans Expensify', }, workflows: { title: 'Workflows', diff --git a/src/languages/it.ts b/src/languages/it.ts index acfe0ae636f..be686d412fa 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -4071,6 +4071,11 @@ const translations = { pleaseSelectFeedType: 'Si prega di selezionare un tipo di feed prima di continuare', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Ultimo giorno del mese', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Ultimo giorno lavorativo del mese', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Giorno del mese personalizzato', + }, assignCard: 'Assegna carta', findCard: 'Trova carta', cardNumber: 'Numero di carta', @@ -4088,6 +4093,7 @@ const translations = { 'Importeremo tutte le transazioni da questa data in poi. Se non viene specificata alcuna data, risaliremo indietro fino a quanto consentito dalla tua banca.', fromTheBeginning: "Dall'inizio", customStartDate: 'Data di inizio personalizzata', + customCloseDate: 'Data di chiusura personalizzata', letsDoubleCheck: 'Verifichiamo che tutto sia corretto.', confirmationDescription: 'Inizieremo immediatamente a importare le transazioni.', cardholder: 'Titolare della carta', @@ -4311,6 +4317,7 @@ const translations = { removeCardFeedDescription: 'Sei sicuro di voler rimuovere questo feed di carte? Questo disassegnerà tutte le carte.', error: { feedNameRequired: 'Il nome del feed della carta è obbligatorio', + statementCloseDateRequired: "Selezionare una data di chiusura dell'estratto conto", }, corporate: "Limita l'eliminazione delle transazioni", personal: "Consenti l'eliminazione delle transazioni", @@ -4337,6 +4344,8 @@ const translations = { expensifyCardBannerSubtitle: 'Goditi il cashback su ogni acquisto negli Stati Uniti, fino al 50% di sconto sulla tua fattura Expensify, carte virtuali illimitate e molto altro ancora.', expensifyCardBannerLearnMoreButton: 'Scopri di più', + statementCloseDateTitle: "Data di chiusura dell'estratto conto", + statementCloseDateDescription: "Comunicateci la data di chiusura dell'estratto conto della vostra carta e creeremo un estratto conto corrispondente in Expensify", }, workflows: { title: 'Flussi di lavoro', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 99c18f17a39..ca8d1dec0b1 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -4040,6 +4040,11 @@ const translations = { pleaseSelectFeedType: '続行する前にフィードタイプを選択してください', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: '月の最終日', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: '月の最終営業日', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'カスタム月日', + }, assignCard: 'カードを割り当てる', findCard: 'カードを探す', cardNumber: 'カード番号', @@ -4056,6 +4061,7 @@ const translations = { startDateDescription: 'この日付以降のすべての取引をインポートします。日付が指定されていない場合は、銀行が許可する限り遡ります。', fromTheBeginning: '最初から', customStartDate: 'カスタム開始日', + customCloseDate: 'カスタムクローズ日', letsDoubleCheck: 'すべてが正しいかどうかをもう一度確認しましょう。', confirmationDescription: 'すぐに取引のインポートを開始します。', cardholder: 'カードホルダー', @@ -4278,6 +4284,7 @@ const translations = { removeCardFeedDescription: 'このカードフィードを削除してもよろしいですか?これにより、すべてのカードの割り当てが解除されます。', error: { feedNameRequired: 'カードフィード名は必須です', + statementCloseDateRequired: '明細書の締め日を選択してください。', }, corporate: '取引の削除を制限する', personal: '取引の削除を許可', @@ -4302,6 +4309,8 @@ const translations = { expensifyCardBannerTitle: 'Expensifyカードを取得する', expensifyCardBannerSubtitle: 'すべての米国での購入でキャッシュバックを楽しみ、Expensifyの請求書が最大50%オフ、無制限のバーチャルカードなど、さらに多くの特典があります。', expensifyCardBannerLearnMoreButton: '詳細を確認', + statementCloseDateTitle: '利用明細書の締め日', + statementCloseDateDescription: 'カード利用明細書の締め日をお知らせいただければ、Expensifyで一致する明細書を作成します。', }, workflows: { title: 'ワークフロー', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 4d8a7d7e8af..fddeb41ac9d 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -4070,6 +4070,11 @@ const translations = { pleaseSelectFeedType: 'Selecteer een feedtype voordat u doorgaat.', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Laatste dag van de maand', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Laatste werkdag van de maand', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Aangepaste dag van de maand', + }, assignCard: 'Kaart toewijzen', findCard: 'Kaart vinden', cardNumber: 'Kaartnummer', @@ -4086,6 +4091,7 @@ const translations = { startDateDescription: 'We importeren alle transacties vanaf deze datum. Als er geen datum is opgegeven, gaan we zo ver terug als uw bank toestaat.', fromTheBeginning: 'Vanaf het begin', customStartDate: 'Aangepaste startdatum', + customCloseDate: 'Aangepaste sluitingsdatum', letsDoubleCheck: 'Laten we dubbel controleren of alles er goed uitziet.', confirmationDescription: 'We beginnen onmiddellijk met het importeren van transacties.', cardholder: 'Kaart houder', @@ -4310,6 +4316,7 @@ const translations = { removeCardFeedDescription: 'Weet je zeker dat je deze kaartfeed wilt verwijderen? Dit zal alle kaarten deactiveren.', error: { feedNameRequired: 'Naam van de kaartfeed is vereist', + statementCloseDateRequired: 'Selecteer een datum waarop het afschrift moet worden gesloten.', }, corporate: 'Beperk het verwijderen van transacties', personal: 'Verwijderen van transacties toestaan', @@ -4334,6 +4341,8 @@ const translations = { expensifyCardBannerTitle: 'Verkrijg de Expensify Card', expensifyCardBannerSubtitle: 'Geniet van cashback op elke aankoop in de VS, tot 50% korting op je Expensify-rekening, onbeperkte virtuele kaarten en nog veel meer.', expensifyCardBannerLearnMoreButton: 'Meer informatie', + statementCloseDateTitle: 'Datum waarop rekeningafschrift wordt gesloten', + statementCloseDateDescription: 'Laat ons weten wanneer je rekeningafschrift wordt gesloten, dan maken we een bijpassend rekeningafschrift in Expensify.', }, workflows: { title: 'Workflows', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index ad173df056a..cdb55cc0ada 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -4057,6 +4057,11 @@ const translations = { pleaseSelectFeedType: 'Proszę wybrać typ kanału przed kontynuowaniem.', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último dia do mês', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último dia útil do mês', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Dia personalizado do mês', + }, assignCard: 'Przypisz kartę', findCard: 'Znajdź kartę', cardNumber: 'Numer karty', @@ -4073,6 +4078,7 @@ const translations = { startDateDescription: 'Zaimportujemy wszystkie transakcje od tej daty. Jeśli nie określono daty, sięgniemy tak daleko wstecz, jak pozwala na to Twój bank.', fromTheBeginning: 'Od początku', customStartDate: 'Niestandardowa data rozpoczęcia', + customCloseDate: 'Data de fecho personalizada', letsDoubleCheck: 'Sprawdźmy jeszcze raz, czy wszystko wygląda dobrze.', confirmationDescription: 'Natychmiast rozpoczniemy importowanie transakcji.', cardholder: 'Posiadacz karty', @@ -4296,6 +4302,7 @@ const translations = { removeCardFeedDescription: 'Czy na pewno chcesz usunąć ten kanał kart? Spowoduje to odłączenie wszystkich kart.', error: { feedNameRequired: 'Nazwa kanału karty jest wymagana', + statementCloseDateRequired: 'Por favor, selecione uma data de fecho do extrato', }, corporate: 'Ogranicz usuwanie transakcji', personal: 'Zezwól na usuwanie transakcji', @@ -4322,6 +4329,8 @@ const translations = { expensifyCardBannerSubtitle: 'Ciesz się zwrotem gotówki przy każdym zakupie w USA, do 50% zniżki na rachunek Expensify, nielimitowanymi kartami wirtualnymi i wieloma innymi korzyściami.', expensifyCardBannerLearnMoreButton: 'Dowiedz się więcej', + statementCloseDateTitle: 'Data de fecho do extrato', + statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão fecha e criaremos um extrato correspondente na Expensify', }, workflows: { title: 'Przepływy pracy', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b01ff678c71..6bc8eadbd8b 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -4063,6 +4063,11 @@ const translations = { pleaseSelectFeedType: 'Por favor, selecione um tipo de feed antes de continuar.', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último dia do mês', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último dia útil do mês', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Dia personalizado do mês', + }, assignCard: 'Atribuir cartão', findCard: 'Encontrar cartão', cardNumber: 'Número do cartão', @@ -4079,6 +4084,7 @@ const translations = { startDateDescription: 'Importaremos todas as transações a partir desta data. Se nenhuma data for especificada, iremos o mais longe possível conforme permitido pelo seu banco.', fromTheBeginning: 'Desde o início', customStartDate: 'Data de início personalizada', + customCloseDate: 'Data de fechamento personalizada', letsDoubleCheck: 'Vamos verificar se tudo está correto.', confirmationDescription: 'Começaremos a importar transações imediatamente.', cardholder: 'Titular do cartão', @@ -4302,6 +4308,7 @@ const translations = { removeCardFeedDescription: 'Tem certeza de que deseja remover este feed de cartão? Isso desatribuirá todos os cartões.', error: { feedNameRequired: 'O nome do feed do cartão é obrigatório', + statementCloseDateRequired: 'Favor selecionar uma data de fechamento do extrato', }, corporate: 'Restringir a exclusão de transações', personal: 'Permitir excluir transações', @@ -4327,6 +4334,8 @@ const translations = { expensifyCardBannerTitle: 'Obtenha o Cartão Expensify', expensifyCardBannerSubtitle: 'Aproveite o cashback em todas as compras nos EUA, até 50% de desconto na sua fatura do Expensify, cartões virtuais ilimitados e muito mais.', expensifyCardBannerLearnMoreButton: 'Saiba mais', + statementCloseDateTitle: 'Statement close date', + statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão for encerrado e criaremos um extrato correspondente na Expensify', }, workflows: { title: 'Fluxos de Trabalho', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 29579790c59..02fadfa5ae7 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -3998,6 +3998,11 @@ const translations = { pleaseSelectFeedType: '请在继续之前选择一个订阅类型', }, }, + statementCloseDate: { + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: '本月最后一天', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: '本月最后一个工作日', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: '本月自定义日期', + }, assignCard: '分配卡片', findCard: '查找卡片', cardNumber: '卡号', @@ -4014,6 +4019,7 @@ const translations = { startDateDescription: '我们将从此日期开始导入所有交易。如果未指定日期,我们将根据您的银行允许的最早日期进行导入。', fromTheBeginning: '从头开始', customStartDate: '自定义开始日期', + customCloseDate: '自定义关闭日期', letsDoubleCheck: '让我们仔细检查一下,确保一切正常。', confirmationDescription: '我们将立即开始导入交易。', cardholder: '持卡人', @@ -4231,6 +4237,7 @@ const translations = { removeCardFeedDescription: '您确定要移除此卡片源吗?这将取消分配所有卡片。', error: { feedNameRequired: '卡片摘要名称是必需的', + statementCloseDateRequired: '请选择报表关闭日期', }, corporate: '限制删除交易', personal: '允许删除交易', @@ -4255,6 +4262,8 @@ const translations = { expensifyCardBannerTitle: '获取Expensify卡', expensifyCardBannerSubtitle: '享受每笔美国消费的现金返还,Expensify账单最高可享50%折扣,无限虚拟卡等更多优惠。', expensifyCardBannerLearnMoreButton: '了解更多', + statementCloseDateTitle: '对账单关闭日期', + statementCloseDateDescription: '让我们知道您的银行卡对账单何时关闭,我们将在 Expensify 中创建匹配的对账单', }, workflows: { title: '工作流程', From acf1b34240ab38c4708eb5727abff5eaefc366a8 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sat, 28 Jun 2025 20:49:58 +0100 Subject: [PATCH 12/20] fix options display on native --- .../index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index f4ff3bafdaf..e4d3e49cca6 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -95,6 +95,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => ( Date: Sun, 29 Jun 2025 01:36:47 +0100 Subject: [PATCH 13/20] fixed submit button position --- .../index.tsx | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index e4d3e49cca6..d2f2ab214c0 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -1,5 +1,6 @@ import React, {useCallback, useMemo, useState} from 'react'; import {View} from 'react-native'; +import FixedFooter from '@components/FixedFooter'; import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; import FormHelpMessage from '@components/FormHelpMessage'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; @@ -118,19 +119,21 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub )} - - {!!error && ( - + + {!!error && ( + + )} + - )} - - + + )} From 708fd955ff819d3eea5a72c1d7468ed15a578b42 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sun, 29 Jun 2025 01:39:17 +0100 Subject: [PATCH 14/20] use ScrollView --- .../index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index d2f2ab214c0..9e3e1cf0294 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -6,6 +6,7 @@ import FormHelpMessage from '@components/FormHelpMessage'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import ScreenWrapper from '@components/ScreenWrapper'; +import ScrollView from '@components/ScrollView'; import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; import type {ListItem} from '@components/SelectionList/types'; import Text from '@components/Text'; @@ -91,7 +92,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub /> ) : ( <> - + {translate('workspace.moreFeatures.companyCards.statementCloseDateDescription')} {Object.values(CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE)?.map((option) => ( @@ -118,7 +119,7 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub /> )} - + {!!error && ( From 4bf28d7855ad4761aae5b8cf0ec59e5632a61193 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sun, 29 Jun 2025 01:41:32 +0100 Subject: [PATCH 15/20] remove unnecessary View --- .../index.tsx | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx index 9e3e1cf0294..b0391051ea6 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/index.tsx @@ -120,20 +120,21 @@ function WorkspaceCompanyCardStatementCloseDateSelectionList({confirmText, onSub )} - - - {!!error && ( - - )} - + {!!error && ( + - + )} + )} From aa3d8f39b8e3da48ff0d468f4d690b36e5cb2fed Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sun, 29 Jun 2025 02:00:43 +0100 Subject: [PATCH 16/20] make deliveryFileName optional --- src/types/onyx/CardFeeds.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/onyx/CardFeeds.ts b/src/types/onyx/CardFeeds.ts index 6aca9f322b1..48191bfabd7 100644 --- a/src/types/onyx/CardFeeds.ts +++ b/src/types/onyx/CardFeeds.ts @@ -38,7 +38,7 @@ type CardFeedDetails = { distributionID?: string; /** Delivery file name */ - deliveryFileName: string; + deliveryFileName?: string; }; /** Custom card feed data */ From e2da6cb36b4706da06ddb308188e754e767760c3 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sun, 29 Jun 2025 02:30:30 +0100 Subject: [PATCH 17/20] move month days array to CONST --- src/CONST/index.ts | 3 +++ .../CustomCloseDateSelectionList.tsx | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 0b59dcdd15e..3df4c0f743c 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -20,6 +20,8 @@ import {LOCALES} from './LOCALES'; const EMPTY_ARRAY = Object.freeze([]); const EMPTY_OBJECT = Object.freeze({}); +const MONTH_DAYS = Object.freeze([...Array(28).keys()].map((i) => i + 1)); + const DEFAULT_NUMBER_ID = 0; const CLOUDFRONT_DOMAIN = 'cloudfront.net'; const CLOUDFRONT_URL = `https://d2k5nsl2zxldvw.${CLOUDFRONT_DOMAIN}`; @@ -651,6 +653,7 @@ const CONST = { ORDINAL_DAY_OF_MONTH: 'do', MONTH_DAY_YEAR_ORDINAL_FORMAT: 'MMMM do, yyyy', SECONDS_PER_DAY: 24 * 60 * 60, + MONTH_DAYS, }, SMS: { DOMAIN: '@expensify.sms', diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx index 96f0f315767..f8380d423d5 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDateSelectionList/CustomCloseDateSelectionList.tsx @@ -6,6 +6,7 @@ import type {ListItem} from '@components/SelectionList/types'; import useDebouncedState from '@hooks/useDebouncedState'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; +import CONST from '@src/CONST'; type CustomCloseDateListItem = ListItem & { value: number; @@ -25,8 +26,7 @@ function CustomCloseDateSelectionList({initiallySelectedDay, onConfirmSelectedDa const [error, setError] = useState(undefined); const sections = useMemo(() => { - const data = [...Array(28).keys()].reduce((days, key) => { - const dayValue = key + 1; + const data = CONST.DATE.MONTH_DAYS.reduce((days, dayValue) => { const day = { value: dayValue, text: dayValue.toString(), From a949dc8f36f451d3f47d6dcaba98674a4cbf7f7e Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sun, 29 Jun 2025 14:56:26 +0100 Subject: [PATCH 18/20] fix Polish translation --- src/languages/pl.ts | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/languages/pl.ts b/src/languages/pl.ts index cdb55cc0ada..564967ca1c6 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -4058,9 +4058,9 @@ const translations = { }, }, statementCloseDate: { - [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último dia do mês', - [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último dia útil do mês', - [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Dia personalizado do mês', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Ostatni dzień miesiąca', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Ostatni dzień roboczy miesiąca', + [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Niestandardowy dzień miesiąca', }, assignCard: 'Przypisz kartę', findCard: 'Znajdź kartę', @@ -4078,7 +4078,7 @@ const translations = { startDateDescription: 'Zaimportujemy wszystkie transakcje od tej daty. Jeśli nie określono daty, sięgniemy tak daleko wstecz, jak pozwala na to Twój bank.', fromTheBeginning: 'Od początku', customStartDate: 'Niestandardowa data rozpoczęcia', - customCloseDate: 'Data de fecho personalizada', + customCloseDate: 'Niestandardowa data zamknięcia', letsDoubleCheck: 'Sprawdźmy jeszcze raz, czy wszystko wygląda dobrze.', confirmationDescription: 'Natychmiast rozpoczniemy importowanie transakcji.', cardholder: 'Posiadacz karty', @@ -4302,7 +4302,7 @@ const translations = { removeCardFeedDescription: 'Czy na pewno chcesz usunąć ten kanał kart? Spowoduje to odłączenie wszystkich kart.', error: { feedNameRequired: 'Nazwa kanału karty jest wymagana', - statementCloseDateRequired: 'Por favor, selecione uma data de fecho do extrato', + statementCloseDateRequired: 'Wybierz datę zamknięcia wyciągu.', }, corporate: 'Ogranicz usuwanie transakcji', personal: 'Zezwól na usuwanie transakcji', @@ -4329,8 +4329,8 @@ const translations = { expensifyCardBannerSubtitle: 'Ciesz się zwrotem gotówki przy każdym zakupie w USA, do 50% zniżki na rachunek Expensify, nielimitowanymi kartami wirtualnymi i wieloma innymi korzyściami.', expensifyCardBannerLearnMoreButton: 'Dowiedz się więcej', - statementCloseDateTitle: 'Data de fecho do extrato', - statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão fecha e criaremos um extrato correspondente na Expensify', + statementCloseDateTitle: 'Data zamknięcia oświadczenia', + statementCloseDateDescription: 'Poinformuj nas o zamknięciu wyciągu z karty, a my utworzymy pasujący wyciąg w Expensify.', }, workflows: { title: 'Przepływy pracy', @@ -5675,9 +5675,9 @@ const translations = { subtitle: 'Zero wydatków. Maksymalny relaks. Dobra robota!', }, }, - unapproved: 'Não aprovado', - unapprovedCash: 'Dinheiro não aprovado', - unapprovedCompanyCards: 'Cartões de empresa não aprovados', + unapproved: 'Niezatwierdzony', + unapprovedCash: 'Niezatwierdzone środki pieniężne', + unapprovedCompanyCards: 'Niezatwierdzone karty firmowe', saveSearch: 'Zapisz wyszukiwanie', deleteSavedSearch: 'Usuń zapisaną wyszukiwarkę', deleteSavedSearchConfirm: 'Czy na pewno chcesz usunąć to wyszukiwanie?', @@ -5699,8 +5699,8 @@ const translations = { after: ({date}: OptionalParam = {}) => `After ${date ?? ''}`, on: ({date}: OptionalParam = {}) => `On ${date ?? ''}`, presets: { - [CONST.SEARCH.DATE_PRESETS.NEVER]: 'Nunca', - [CONST.SEARCH.DATE_PRESETS.LAST_MONTH]: 'No mês passado', + [CONST.SEARCH.DATE_PRESETS.NEVER]: 'Nigdy', + [CONST.SEARCH.DATE_PRESETS.LAST_MONTH]: 'Ostatni miesiąc', }, }, status: 'Status', @@ -5735,12 +5735,12 @@ const translations = { billable: 'Podlegające fakturowaniu', reimbursable: 'Podlegające zwrotowi', groupBy: { - reports: 'Relatório', - members: 'Membro', + reports: 'Raport', + members: 'Członek', cards: 'Karta', }, }, - groupBy: 'Agrupar por', + groupBy: 'Grupa według', moneyRequestReport: { emptyStateTitle: 'Ten raport nie zawiera wydatków.', emptyStateSubtitle: 'Możesz dodać wydatki do tego raportu, używając przycisku powyżej.', From a16733eadccfc702b9cc84c706adff4775c56d85 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Sun, 29 Jun 2025 15:00:58 +0100 Subject: [PATCH 19/20] add missing period at end of sentences --- src/languages/fr.ts | 4 ++-- src/languages/it.ts | 4 ++-- src/languages/pt-BR.ts | 4 ++-- src/languages/zh-hans.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 8f3662cfab5..f077431745c 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -4343,7 +4343,7 @@ const translations = { removeCardFeedDescription: 'Êtes-vous sûr de vouloir supprimer ce flux de cartes ? Cela désassignera toutes les cartes.', error: { feedNameRequired: 'Le nom du flux de carte est requis', - statementCloseDateRequired: 'Veuillez sélectionner une date de clôture du relevé', + statementCloseDateRequired: 'Veuillez sélectionner une date de clôture du relevé.', }, corporate: 'Restreindre la suppression des transactions', personal: 'Autoriser la suppression des transactions', @@ -4372,7 +4372,7 @@ const translations = { "Profitez de remises en argent sur chaque achat aux États-Unis, jusqu'à 50 % de réduction sur votre facture Expensify, des cartes virtuelles illimitées, et bien plus encore.", expensifyCardBannerLearnMoreButton: 'En savoir plus', statementCloseDateTitle: 'Date de clôture du relevé', - statementCloseDateDescription: 'Indiquez-nous la date de clôture de votre relevé de carte et nous créerons un relevé correspondant dans Expensify', + statementCloseDateDescription: 'Indiquez-nous la date de clôture de votre relevé de carte et nous créerons un relevé correspondant dans Expensify.', }, workflows: { title: 'Workflows', diff --git a/src/languages/it.ts b/src/languages/it.ts index be686d412fa..21b6b498c72 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -4317,7 +4317,7 @@ const translations = { removeCardFeedDescription: 'Sei sicuro di voler rimuovere questo feed di carte? Questo disassegnerà tutte le carte.', error: { feedNameRequired: 'Il nome del feed della carta è obbligatorio', - statementCloseDateRequired: "Selezionare una data di chiusura dell'estratto conto", + statementCloseDateRequired: "Selezionare una data di chiusura dell'estratto conto.", }, corporate: "Limita l'eliminazione delle transazioni", personal: "Consenti l'eliminazione delle transazioni", @@ -4345,7 +4345,7 @@ const translations = { 'Goditi il cashback su ogni acquisto negli Stati Uniti, fino al 50% di sconto sulla tua fattura Expensify, carte virtuali illimitate e molto altro ancora.', expensifyCardBannerLearnMoreButton: 'Scopri di più', statementCloseDateTitle: "Data di chiusura dell'estratto conto", - statementCloseDateDescription: "Comunicateci la data di chiusura dell'estratto conto della vostra carta e creeremo un estratto conto corrispondente in Expensify", + statementCloseDateDescription: "Comunicateci la data di chiusura dell'estratto conto della vostra carta e creeremo un estratto conto corrispondente in Expensify.", }, workflows: { title: 'Flussi di lavoro', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 6bc8eadbd8b..5436316e5f8 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -4308,7 +4308,7 @@ const translations = { removeCardFeedDescription: 'Tem certeza de que deseja remover este feed de cartão? Isso desatribuirá todos os cartões.', error: { feedNameRequired: 'O nome do feed do cartão é obrigatório', - statementCloseDateRequired: 'Favor selecionar uma data de fechamento do extrato', + statementCloseDateRequired: 'Favor selecionar uma data de fechamento do extrato.', }, corporate: 'Restringir a exclusão de transações', personal: 'Permitir excluir transações', @@ -4335,7 +4335,7 @@ const translations = { expensifyCardBannerSubtitle: 'Aproveite o cashback em todas as compras nos EUA, até 50% de desconto na sua fatura do Expensify, cartões virtuais ilimitados e muito mais.', expensifyCardBannerLearnMoreButton: 'Saiba mais', statementCloseDateTitle: 'Statement close date', - statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão for encerrado e criaremos um extrato correspondente na Expensify', + statementCloseDateDescription: 'Informe-nos quando o extrato do seu cartão for encerrado e criaremos um extrato correspondente na Expensify.', }, workflows: { title: 'Fluxos de Trabalho', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 02fadfa5ae7..4a14d8cd9a1 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -4237,7 +4237,7 @@ const translations = { removeCardFeedDescription: '您确定要移除此卡片源吗?这将取消分配所有卡片。', error: { feedNameRequired: '卡片摘要名称是必需的', - statementCloseDateRequired: '请选择报表关闭日期', + statementCloseDateRequired: '请选择报表关闭日期。', }, corporate: '限制删除交易', personal: '允许删除交易', @@ -4263,7 +4263,7 @@ const translations = { expensifyCardBannerSubtitle: '享受每笔美国消费的现金返还,Expensify账单最高可享50%折扣,无限虚拟卡等更多优惠。', expensifyCardBannerLearnMoreButton: '了解更多', statementCloseDateTitle: '对账单关闭日期', - statementCloseDateDescription: '让我们知道您的银行卡对账单何时关闭,我们将在 Expensify 中创建匹配的对账单', + statementCloseDateDescription: '让我们知道您的银行卡对账单何时关闭,我们将在 Expensify 中创建匹配的对账单。', }, workflows: { title: '工作流程', From e89b522685af388ae13bccf004cb6af6dc7c49d5 Mon Sep 17 00:00:00 2001 From: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:08:26 +0100 Subject: [PATCH 20/20] add comment --- src/CONST/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 3df4c0f743c..5f2b8e321ec 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -20,6 +20,7 @@ import {LOCALES} from './LOCALES'; const EMPTY_ARRAY = Object.freeze([]); const EMPTY_OBJECT = Object.freeze({}); +// Using 28 days to align with OldDot and because all months are guaranteed to be at least 28 days. const MONTH_DAYS = Object.freeze([...Array(28).keys()].map((i) => i + 1)); const DEFAULT_NUMBER_ID = 0;