Skip to content

Commit 1717210

Browse files
committed
Merge branch 'main' into fix-search-update-not-called-on-deleting-transaction
2 parents 6c54952 + 12e0941 commit 1717210

File tree

112 files changed

+3047
-790
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+3047
-790
lines changed

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ android {
110110
minSdkVersion rootProject.ext.minSdkVersion
111111
targetSdkVersion rootProject.ext.targetSdkVersion
112112
multiDexEnabled rootProject.ext.multiDexEnabled
113-
versionCode 1009007706
114-
versionName "9.0.77-6"
113+
versionCode 1009007802
114+
versionName "9.0.78-2"
115115
// Supported language variants must be declared here to avoid from being removed during the compilation.
116116
// This also helps us to not include unnecessary language variants in the APK.
117117
resConfigs "en", "es"

docs/articles/expensify-classic/connect-credit-cards/company-cards/Troubleshooting.md

Lines changed: 128 additions & 89 deletions
Large diffs are not rendered by default.

docs/articles/expensify-classic/connections/netsuite/Configure-Netsuite.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ The three options for the date your report will export with are:
3939
## Accounting Method
4040

4141
This dictates when reimbursable expenses will export, according to your preferred accounting method:
42-
- Accrual: Out of pocket expenses will export immediately when the report is final approved
43-
- Cash: Out of pocket expenses will export when paid via Expensify or marked as Reimbursed
42+
- Accrual: Out-of-pocket expenses will export immediately when the report is final approved
43+
- Cash: Out-of-pocket expenses will export when paid via Expensify or marked as Reimbursed
4444

4545
## Export Settings for Reimbursable Expenses
4646

4747
**Expense Reports:** Expensify transactions will export reimbursable expenses as expense reports by default, which will be posted to the payables account designated in NetSuite.
4848

49-
**Vendor Bills:** Expensify transactions export as vendor bills in NetSuite and will be mapped to the subsidiary associated with the corresponding workspace. Each report will be posted as payable to the vendor associated with the employee who submitted the report. You can also set an approval level in NetSuite for vendor bills.
49+
**Vendor Bills:** Expensify transactions export as vendor bills in NetSuite and are mapped to the subsidiary associated with the corresponding workspace. Each report is posted as payable to the vendor associated with the employee who submitted it. You can also set an approval level in NetSuite for vendor bills.
5050

5151
**Journal Entries:** Expensify transactions that are set to export as journal entries in NetSuite will be mapped to the subsidiary associated with this workspace. All the transactions will be posted to the payable account specified in the workspace. You can also set an approval level in NetSuite for the journal entries.
5252

@@ -63,7 +63,7 @@ This dictates when reimbursable expenses will export, according to your preferre
6363
- Journal entry forms do not contain a customer column, so it is not possible to export customers or projects with this export option
6464
- The credit line and header level classifications are pulled from the employee record
6565

66-
**Expense Reports:** To use the expense report option for your corporate card expenses, you will need to set up your default corporate cards in NetSuite.
66+
**Expense Reports:** To use the expense report option for your corporate card expenses, you must set up your default corporate cards in NetSuite.
6767

6868
To use a default corporate card for non-reimbursable expenses, you must select the correct card on the employee records (for individual accounts) or the subsidiary record (If you use a non-one world account, the default is found in your accounting preferences).
6969

@@ -87,6 +87,8 @@ When selecting the option to export non-reimbursable expenses as vendor bills, t
8787

8888
The Coding tab is where NetSuite information is configured in Expensify, which allows employees to code expenses and reports accurately. There are several coding options in NetSuite. Let’s go over each of those below.
8989

90+
![Insert alt text for accessibility here]({{site.url}}/assets/images/NetSuite_Configure_08.png){:width="100%"}
91+
9092
## Expense Categories
9193

9294
Expensify's integration with NetSuite automatically imports NetSuite Expense Categories as Categories in Expensify.
@@ -225,6 +227,8 @@ From there, you should see the values for the Custom Lists under the Tag or Repo
225227

226228
The NetSuite integration’s advanced configuration settings are accessed under **Settings > Workspaces > Group > _[Workspace Name]_ > Connections > NetSuite > Configure > Advanced tab**.
227229

230+
![Insert alt text for accessibility here]({{site.url}}/assets/images/NetSuite_Configure_09.png){:width="100%"}
231+
228232
Let’s review the different advanced settings and how they interact with the integration.
229233

230234
## Auto Sync

docs/articles/expensify-classic/domains/SAML-SSO.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Once the domain is verified, you can access the SSO settings by navigating to Se
1717
**Below are instructions for setting up Expensify for specific SSO providers:**
1818
- [Amazon Web Services (AWS SSO)](https://static.global.sso.amazonaws.com/app-202a715cb67cddd9/instructions/index.htm)
1919
- [Google SAML](https://support.google.com/a/answer/7371682) (for GSuite, not Google SSO)
20-
- [Microsoft Azure Active Directory](https://azure.microsoft.com/en-us/documentation/articles/active-directory-saas-expensify-tutorial/)
20+
- [Microsoft Entra ID (formerly Azure Active Directory)](https://learn.microsoft.com/en-us/entra/identity/saas-apps/expensify-tutorial)
2121
- [Okta](https://saml-doc.okta.com/SAML_Docs/How-to-Configure-SAML-2.0-for-Expensify.html)
2222
- [OneLogin](https://onelogin.service-now.com/support?id=kb_article&sys_id=e44c9e52db187410fe39dde7489619ba)
2323
- [Oracle Identity Cloud Service](https://docs.oracle.com/en/cloud/paas/identity-cloud/idcsc/expensify.html#Expensify)
@@ -39,13 +39,13 @@ The entityID for Expensify is https://expensify.com. Remember not to copy and pa
3939
## Can you have multiple domains with only one entity ID?
4040
Yes. Please send a message to the Concierge or your account manager, and we will enable the use of the same entity ID with multiple domains.
4141

42-
## How can I update the Microsoft Azure SSO Certificate?
42+
## How can I update the Microsoft Entra ID SSO Certificate?
4343
Expensify's SAML configuration doesn't support multiple active certificates. This means that if you create the new certification ahead of time without first removing the old one, the respective IDP will include two unique x509 certificates instead of one, and the connection will break. Should you need to access Expensify, switching back to the old certificate will continue to allow access while that certificate is still valid.
4444

45-
**To transfer from one Microsoft Azure certificate to another, please follow the below steps:**
46-
1. In Azure Directory, create your new certificate.
47-
2. In Azure Director, remove the old, expiring certificate.
48-
3. In Azure Directory, activate the remaining certificate and get a new IDP for Expensify from it.
45+
**To transfer from one Microsoft Entra certificate to another, please follow the below steps:**
46+
1. In Microsoft Entra, create your new certificate.
47+
2. In Microsoft Entra, remove the old, expiring certificate.
48+
3. In Microsoft Entra, activate the remaining certificate and get a new IDP for Expensify from it.
4949
4. In Expensify, replace the previous IDP with the new IDP.
5050
5. Log in via SSO. If login continues to fail, write to Concierge for assistance.
5151

docs/articles/new-expensify/expenses-&-payments/Create-an-expense.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ When an expense is submitted to a workspace, your approver will receive an email
5151

5252
{% include end-selector.html %}
5353

54-
![Click Global Create]({{site.url}}/assets/images/ExpensifyHelp-CreateExpense-1.png){:width="100%"}
55-
![Click Submit expense]({{site.url}}/assets/images/ExpensifyHelp-CreateExpense-2.png){:width="100%"}
56-
![Click Scan]({{site.url}}/assets/images/ExpensifyHelp-CreateExpense-3.png){:width="100%"}
57-
![Enter workspace or individual's name]({{site.url}}/assets/images/ExpensifyHelp-CreateExpense-4.png){:width="100%"}
54+
![Click Global Create]({{site.url}}/assets/images/ExpensifyHelp-CreateExpenseUpdate-1.png){:width="100%"}
55+
![Click Create Expense]({{site.url}}/assets/images/ExpensifyHelp-CreateExpenseUpdate-2.png){:width="100%"}
56+
![Click Scan]({{site.url}}/assets/images/ExpensifyHelp-CreateExpenseUpdate-3.png){:width="100%"}
57+
![Enter workspace or individual's name]({{site.url}}/assets/images/ExpensifyHelp-CreateExpenseUpdate-4.png){:width="100%"}
5858

5959
{% include info.html %}
6060
You can also forward receipts to [email protected] using your primary or secondary email address. SmartScan will automatically extract all the details from the receipt and add them to your expenses.
Loading
Loading
Loading
Loading
Loading
Loading
Loading

ios/NewExpensify/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<key>CFBundlePackageType</key>
2020
<string>APPL</string>
2121
<key>CFBundleShortVersionString</key>
22-
<string>9.0.77</string>
22+
<string>9.0.78</string>
2323
<key>CFBundleSignature</key>
2424
<string>????</string>
2525
<key>CFBundleURLTypes</key>
@@ -40,7 +40,7 @@
4040
</dict>
4141
</array>
4242
<key>CFBundleVersion</key>
43-
<string>9.0.77.6</string>
43+
<string>9.0.78.2</string>
4444
<key>FullStory</key>
4545
<dict>
4646
<key>OrgId</key>

ios/NewExpensifyTests/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
<key>CFBundlePackageType</key>
1616
<string>BNDL</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>9.0.77</string>
18+
<string>9.0.78</string>
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>
22-
<string>9.0.77.6</string>
22+
<string>9.0.78.2</string>
2323
</dict>
2424
</plist>

ios/NotificationServiceExtension/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
<key>CFBundleName</key>
1212
<string>$(PRODUCT_NAME)</string>
1313
<key>CFBundleShortVersionString</key>
14-
<string>9.0.77</string>
14+
<string>9.0.78</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.0.77.6</string>
16+
<string>9.0.78.2</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "new.expensify",
3-
"version": "9.0.77-6",
3+
"version": "9.0.78-2",
44
"author": "Expensify, Inc.",
55
"homepage": "https://new.expensify.com",
66
"description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",

src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import KeyboardProvider from './components/KeyboardProvider';
1818
import {LocaleContextProvider} from './components/LocaleContextProvider';
1919
import OnyxProvider from './components/OnyxProvider';
2020
import PopoverContextProvider from './components/PopoverProvider';
21+
import {ProductTrainingContextProvider} from './components/ProductTrainingContext';
2122
import SafeArea from './components/SafeArea';
2223
import ScrollOffsetContextProvider from './components/ScrollOffsetContextProvider';
2324
import {SearchRouterContextProvider} from './components/Search/SearchRouter/SearchRouterContext';
@@ -95,6 +96,7 @@ function App({url}: AppProps) {
9596
VideoPopoverMenuContextProvider,
9697
KeyboardProvider,
9798
SearchRouterContextProvider,
99+
ProductTrainingContextProvider,
98100
]}
99101
>
100102
<CustomStatusBarAndBackground />

src/CONST.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,7 @@ const CONST = {
11521152
UPDATE_TIME_RATE: 'POLICYCHANGELOG_UPDATE_TIME_RATE',
11531153
LEAVE_POLICY: 'POLICYCHANGELOG_LEAVE_POLICY',
11541154
CORPORATE_UPGRADE: 'POLICYCHANGELOG_CORPORATE_UPGRADE',
1155+
TEAM_DOWNGRADE: 'POLICYCHANGELOG_TEAM_DOWNGRADE',
11551156
},
11561157
ROOM_CHANGE_LOG: {
11571158
INVITE_TO_ROOM: 'INVITETOROOM',
@@ -1335,6 +1336,9 @@ const CONST = {
13351336
SEARCH_OPTION_LIST_DEBOUNCE_TIME: 300,
13361337
RESIZE_DEBOUNCE_TIME: 100,
13371338
UNREAD_UPDATE_DEBOUNCE_TIME: 300,
1339+
SEARCH_CONVERT_SEARCH_VALUES: 'search_convert_search_values',
1340+
SEARCH_MAKE_TREE: 'search_make_tree',
1341+
SEARCH_BUILD_TREE: 'search_build_tree',
13381342
SEARCH_FILTER_OPTIONS: 'search_filter_options',
13391343
USE_DEBOUNCED_STATE_DELAY: 300,
13401344
LIST_SCROLLING_DEBOUNCE_TIME: 200,
@@ -6440,6 +6444,17 @@ const CONST = {
64406444
},
64416445

64426446
MIGRATED_USER_WELCOME_MODAL: 'migratedUserWelcomeModal',
6447+
6448+
PRODUCT_TRAINING_TOOLTIP_NAMES: {
6449+
CONCEIRGE_LHN_GBR: 'conciergeLHNGBR',
6450+
RENAME_SAVED_SEARCH: 'renameSavedSearch',
6451+
QUICK_ACTION_BUTTON: 'quickActionButton',
6452+
WORKSAPCE_CHAT_CREATE: 'workspaceChatCreate',
6453+
SEARCH_FILTER_BUTTON_TOOLTIP: 'filterButtonTooltip',
6454+
BOTTOM_NAV_INBOX_TOOLTIP: 'bottomNavInboxTooltip',
6455+
LHN_WORKSPACE_CHAT_TOOLTIP: 'workspaceChatLHNTooltip',
6456+
GLOBAL_CREATE_TOOLTIP: 'globalCreateTooltip',
6457+
},
64436458
} as const;
64446459

64456460
type Country = keyof typeof CONST.ALL_COUNTRIES;

src/ONYXKEYS.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,6 @@ const ONYXKEYS = {
117117

118118
/** NVP keys */
119119

120-
/** Boolean flag only true when first set */
121-
NVP_IS_FIRST_TIME_NEW_EXPENSIFY_USER: 'nvp_isFirstTimeNewExpensifyUser',
122-
123120
/** This NVP contains list of at most 5 recent attendees */
124121
NVP_RECENT_ATTENDEES: 'nvp_expensify_recentAttendees',
125122

@@ -222,18 +219,9 @@ const ONYXKEYS = {
222219
/** The end date (epoch timestamp) of the workspace owner’s grace period after the free trial ends. */
223220
NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END: 'nvp_private_billingGracePeriodEnd',
224221

225-
/** The NVP containing all information related to educational tooltip in workspace chat */
226-
NVP_WORKSPACE_TOOLTIP: 'workspaceTooltip',
227-
228222
/** The NVP containing the target url to navigate to when deleting a transaction */
229223
NVP_DELETE_TRANSACTION_NAVIGATE_BACK_URL: 'nvp_deleteTransactionNavigateBackURL',
230224

231-
/** Whether to show save search rename tooltip */
232-
SHOULD_SHOW_SAVED_SEARCH_RENAME_TOOLTIP: 'shouldShowSavedSearchRenameTooltip',
233-
234-
/** Whether to hide gbr tooltip */
235-
NVP_SHOULD_HIDE_GBR_TOOLTIP: 'nvp_should_hide_gbr_tooltip',
236-
237225
/** Does this user have push notifications enabled for this device? */
238226
PUSH_NOTIFICATIONS_ENABLED: 'pushNotificationsEnabled',
239227

@@ -888,7 +876,6 @@ type OnyxCollectionValuesMapping = {
888876
type OnyxValuesMapping = {
889877
[ONYXKEYS.ACCOUNT]: OnyxTypes.Account;
890878
[ONYXKEYS.ACCOUNT_MANAGER_REPORT_ID]: string;
891-
[ONYXKEYS.NVP_IS_FIRST_TIME_NEW_EXPENSIFY_USER]: boolean;
892879

893880
[ONYXKEYS.NVP_ONBOARDING]: Onboarding;
894881

@@ -1030,17 +1017,14 @@ type OnyxValuesMapping = {
10301017
[ONYXKEYS.NVP_BILLING_FUND_ID]: number;
10311018
[ONYXKEYS.NVP_PRIVATE_AMOUNT_OWED]: number;
10321019
[ONYXKEYS.NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END]: number;
1033-
[ONYXKEYS.NVP_WORKSPACE_TOOLTIP]: OnyxTypes.WorkspaceTooltip;
10341020
[ONYXKEYS.NVP_DELETE_TRANSACTION_NAVIGATE_BACK_URL]: string | undefined;
1035-
[ONYXKEYS.NVP_SHOULD_HIDE_GBR_TOOLTIP]: boolean;
10361021
[ONYXKEYS.NVP_PRIVATE_CANCELLATION_DETAILS]: OnyxTypes.CancellationDetails[];
10371022
[ONYXKEYS.ROOM_MEMBERS_USER_SEARCH_PHRASE]: string;
10381023
[ONYXKEYS.APPROVAL_WORKFLOW]: OnyxTypes.ApprovalWorkflowOnyx;
10391024
[ONYXKEYS.IMPORTED_SPREADSHEET]: OnyxTypes.ImportedSpreadsheet;
10401025
[ONYXKEYS.LAST_ROUTE]: string;
10411026
[ONYXKEYS.IS_SINGLE_NEW_DOT_ENTRY]: boolean | undefined;
10421027
[ONYXKEYS.IS_USING_IMPORTED_STATE]: boolean;
1043-
[ONYXKEYS.SHOULD_SHOW_SAVED_SEARCH_RENAME_TOOLTIP]: boolean;
10441028
[ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES]: Record<string, string>;
10451029
[ONYXKEYS.CONCIERGE_REPORT_ID]: string;
10461030
[ONYXKEYS.PRESERVED_USER_SESSION]: OnyxTypes.Session;

src/ROUTES.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,11 +702,11 @@ const ROUTES = {
702702
},
703703
WORKSPACE_INVITE: {
704704
route: 'settings/workspaces/:policyID/invite',
705-
getRoute: (policyID: string) => `settings/workspaces/${policyID}/invite` as const,
705+
getRoute: (policyID: string, backTo?: string) => `${getUrlWithBackToParam(`settings/workspaces/${policyID}/invite`, backTo)}` as const,
706706
},
707707
WORKSPACE_INVITE_MESSAGE: {
708708
route: 'settings/workspaces/:policyID/invite-message',
709-
getRoute: (policyID: string) => `settings/workspaces/${policyID}/invite-message` as const,
709+
getRoute: (policyID: string, backTo?: string) => `${getUrlWithBackToParam(`settings/workspaces/${policyID}/invite-message`, backTo)}` as const,
710710
},
711711
WORKSPACE_PROFILE: {
712712
route: 'settings/workspaces/:policyID/profile',

src/components/Composer/implementation/index.native.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import type {MarkdownStyle} from '@expensify/react-native-live-markdown';
22
import mimeDb from 'mime-db';
33
import type {ForwardedRef} from 'react';
4-
import React, {useCallback, useEffect, useMemo, useRef} from 'react';
4+
import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
55
import type {NativeSyntheticEvent, TextInput, TextInputChangeEventData, TextInputPasteEventData} from 'react-native';
66
import {StyleSheet} from 'react-native';
77
import type {FileObject} from '@components/AttachmentModal';
88
import type {ComposerProps} from '@components/Composer/types';
99
import type {AnimatedMarkdownTextInputRef} from '@components/RNMarkdownTextInput';
1010
import RNMarkdownTextInput from '@components/RNMarkdownTextInput';
1111
import useAutoFocusInput from '@hooks/useAutoFocusInput';
12+
import useKeyboardState from '@hooks/useKeyboardState';
1213
import useMarkdownStyle from '@hooks/useMarkdownStyle';
1314
import useResetComposerFocus from '@hooks/useResetComposerFocus';
1415
import useStyleUtils from '@hooks/useStyleUtils';
@@ -37,6 +38,7 @@ function Composer(
3738
selection,
3839
value,
3940
isGroupPolicyReport = false,
41+
showSoftInputOnFocus = true,
4042
...props
4143
}: ComposerProps,
4244
ref: ForwardedRef<TextInput>,
@@ -49,7 +51,11 @@ function Composer(
4951
const styles = useThemeStyles();
5052
const StyleUtils = useStyleUtils();
5153

54+
const [contextMenuHidden, setContextMenuHidden] = useState(true);
55+
5256
const {inputCallbackRef, inputRef: autoFocusInputRef} = useAutoFocusInput();
57+
const keyboardState = useKeyboardState();
58+
const isKeyboardShown = keyboardState?.isKeyboardShown ?? false;
5359

5460
useEffect(() => {
5561
if (autoFocus === !!autoFocusInputRef.current) {
@@ -58,6 +64,13 @@ function Composer(
5864
inputCallbackRef(autoFocus ? textInput.current : null);
5965
}, [autoFocus, inputCallbackRef, autoFocusInputRef]);
6066

67+
useEffect(() => {
68+
if (!showSoftInputOnFocus || !isKeyboardShown) {
69+
return;
70+
}
71+
setContextMenuHidden(false);
72+
}, [showSoftInputOnFocus, isKeyboardShown]);
73+
6174
useEffect(() => {
6275
if (!textInput.current || !textInput.current.setSelection || !selection || isComposerFullSize) {
6376
return;
@@ -158,6 +171,8 @@ function Composer(
158171
props?.onBlur?.(e);
159172
}}
160173
onClear={onClear}
174+
showSoftInputOnFocus={showSoftInputOnFocus}
175+
contextMenuHidden={contextMenuHidden}
161176
/>
162177
);
163178
}

0 commit comments

Comments
 (0)