From b04fbdf7bbe6171ea839bad8d53a6e52f2c94337 Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 13 Mar 2026 13:45:41 +0100 Subject: [PATCH 01/14] feat: Add Strictly enforce workspace rules toggle --- ios/NewExpensify.xcodeproj/project.pbxproj | 38 ++++++------ ios/Podfile.lock | 26 ++------ src/languages/en.ts | 3 + src/languages/es.ts | 8 +++ src/libs/actions/Domain.ts | 2 +- .../domain/Groups/DomainGroupDetailsPage.tsx | 11 ++++ .../StrictlyEnforceWorkspaceRulesToggle.tsx | 59 +++++++++++++++++++ src/types/onyx/DomainErrors.ts | 5 ++ src/types/onyx/DomainPendingActions.ts | 5 ++ 9 files changed, 117 insertions(+), 40 deletions(-) create mode 100644 src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 8908e3ad69f5..f29b9aa98eef 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -673,25 +673,6 @@ shellPath = /bin/sh; shellScript = "if [ \"$CONFIGURATION\" != \"DebugDevelopment\" ]; then\n \"${PODS_ROOT}/FullStory/tools/FullStoryCommandLine\" \"${CONFIGURATION_BUILD_DIR}/${WRAPPER_NAME}\"\nelse\n echo \"Skipping FullStory Asset Uploader phase for DebugDevelopment scheme.\"\nfi\n"; }; - 87174A5CC3CF40CC94B76870 /* Strip Debug Symbols */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Strip Debug Symbols"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "bash \"${PROJECT_DIR}/../scripts/strip-ios-debug-symbols.sh\"\n"; - }; 5124824122A346BD617AD428 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -756,6 +737,25 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-NewExpensify/expo-configure-project.sh\"\n"; }; + 87174A5CC3CF40CC94B76870 /* Strip Debug Symbols */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Strip Debug Symbols"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "bash \"${PROJECT_DIR}/../scripts/strip-ios-debug-symbols.sh\"\n"; + }; 87667FE2684C0D1946DE7329 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index c24cf67eb515..2c0b55c4ef42 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -481,7 +481,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -507,7 +506,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -532,7 +530,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -559,7 +556,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -585,7 +581,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -611,7 +606,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -637,7 +631,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -663,7 +656,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -689,7 +681,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -715,7 +706,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -741,7 +731,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -767,7 +756,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -793,7 +781,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -819,7 +806,6 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger - - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -4511,20 +4497,20 @@ SPEC CHECKSUMS: AirshipServiceExtension: 50d11b2f62c4a490d4e81a1c36f70e2ecb70a27e AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 AppLogs: 3bc4e9b141dbf265b9464409caaa40416a9ee0e0 - boost: 659a89341ea4ab3df8259733813b52f26d8be9a5 + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb EXConstants: fd688cef4e401dcf798a021cfb5d87c890c30ba3 EXImageLoader: 4d3d3284141f1a45006cc4d0844061c182daf7ee expensify-react-native-background-task: 03c640e1f5649692d058cba48c0a138f024a6dd3 ExpensifyNitroUtils: 86109fe1ab88351ed63ffe11b760d537c70019d7 - Expo: b2748512b0df06c1e569f93372b53c488f02ffe7 + Expo: f298203cf86d7e0a4e9d8f88f29872558aef0b01 ExpoAsset: 84810d6fed8179f04d4a7a4a6b37028bbd726e26 ExpoAudio: e4cfe3a2f3317b8487460685385a9867a07fb4fb ExpoFont: 86ceec09ffed1c99cfee36ceb79ba149074901b5 ExpoImage: e88f500585913969b930e13a4be47277eb7c6de8 ExpoImageManipulator: 7cb78b082bcc767b97867d833ce614ace424cd97 ExpoLocation: 93d7faa0c2adbd5a04686af0c1a61bc6ed3ee2f7 - ExpoModulesCore: e1b5401a7af4c7dbf4fe26b535918a72c6ed8a7b + ExpoModulesCore: a8488fff5569ccab069549dec8680b23b13e42a8 ExpoSecureStore: 3f1b632d6d40bcc62b4983ef9199cd079592a50a ExpoStoreReview: 32bb43b6fae9c8db3e33cad69996dff3785eef5f ExpoVideo: 6907c4872886dce2720d3af20782eb6ee7734110 @@ -4575,7 +4561,7 @@ SPEC CHECKSUMS: React: 2073376f47c71b7e9a0af7535986a77522ce1049 React-callinvoker: 751b6f2c83347a0486391c3f266f291f0f53b27e React-Codegen: 4b8b4817cea7a54b83851d4c1f91f79aa73de30a - React-Core: aeebd9b37ac383279f610f1e53f66b9931686a41 + React-Core: dff5d29973349b11dd6631c9498456d75f846d5e React-CoreModules: c0ae04452e4c5d30e06f8e94692a49107657f537 React-cxxreact: 376fd672c95dfb64ad5cc246e6a1e9edb78dec4c React-debug: d4955c86870792887ed695df6ebf0e94e39dc7e1 @@ -4625,7 +4611,7 @@ SPEC CHECKSUMS: react-native-webview: cdce419e8022d0ef6f07db21890631258e7a9e6e React-NativeModulesApple: 8c7eb6057b00c191a11ad5ced41826ec5a0e4d78 React-oscompat: 93b5535ea7f7dff46aaee4f78309a70979bdde9d - React-perflogger: e7dcbfcb796d346be7936b75740c3e27a4bb3977 + React-perflogger: 5536d2df3d18fe0920263466f7b46a56351c0510 React-performancetimeline: c6c9393c1a0453a51e1852e3531defe60790b36c React-RCTActionSheet: 42195ae666e6d79b4af2346770f765b7c29435b9 React-RCTAnimation: fa103ccc3503b1ed8dedca7e62e7823937748843 @@ -4640,7 +4626,7 @@ SPEC CHECKSUMS: React-RCTSettings: 71f5c7fd7b5f4e725a4e2114a4b4373d0e46048f React-RCTText: b94d4699b49285bee22b8ebf768924d607eccee3 React-RCTVibration: 6e3993c4f6c36a3899059f9a9ead560ddaf5a7d7 - React-rendererconsistency: bef28690433e2b4bb00c2f884b22b86e61a430f2 + React-rendererconsistency: 612d0f6603d9837bb1236d7fd5194203b35c8799 React-renderercss: e5c2c3b84976f7a587cde8423c671db07a6a77da React-rendererdebug: cc7a6131733605b8897754f72c0c35c79f77da9e React-RuntimeApple: 3f96102fc1ebf738d36719cdce5422a5769293fb diff --git a/src/languages/en.ts b/src/languages/en.ts index 83abd5e42308..e992b874db1d 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -8650,6 +8650,9 @@ const translations = { error: { settings: 'Couldn’t save this change. Please try again or contact Concierge for more support.', }, + permissions: 'Group permissions', + StrictlyEnforceWorkspaceRules: 'Strictly enforce workspace rules', + StrictlyEnforceWorkspaceRulesDescription: 'All workspace rules must be met before submitting a report. No manual exceptions allowed.', }, }, }; diff --git a/src/languages/es.ts b/src/languages/es.ts index bbd194f4cccd..7e136259cceb 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -8902,6 +8902,14 @@ ${amount} para ${merchant} - ${date}`, `¿Estás seguro de que quieres establecer ${newName} como el grupo predeterminado? Los nuevos miembros serán invitados a este grupo en lugar del grupo predeterminado anterior (${currentName}). `, makeDefault: 'Establecer como predeterminado', nevermind: 'No importa', + // not verified yet + error: { + settings: 'No se pudo guardar este cambio. Inténtalo de nuevo o contacta con Concierge para obtener más ayuda.', + }, + permissions: 'Permisos de grupo', + StrictlyEnforceWorkspaceRules: 'Hacer cumplir estrictamente las reglas del espacio de trabajo', + StrictlyEnforceWorkspaceRulesDescription: 'Todas las reglas del espacio de trabajo deben cumplirse antes de enviar un informe. No se permiten excepciones manuales.', + }, }, gps: { diff --git a/src/libs/actions/Domain.ts b/src/libs/actions/Domain.ts index b0db84f012ba..5f3556b47613 100644 --- a/src/libs/actions/Domain.ts +++ b/src/libs/actions/Domain.ts @@ -1707,7 +1707,7 @@ function updateDomainSecurityGroup( groupID: string, currentSecurityGroup: DomainSecurityGroup, newSettingValue: Partial, - settingsName: keyof Pick, + settingsName: keyof Pick, ) { const SECURITY_GROUP_KEY = `${CONST.DOMAIN.DOMAIN_SECURITY_GROUP_PREFIX}${groupID}`; const newSecurityGroup = {...currentSecurityGroup, ...newSettingValue}; diff --git a/src/pages/domain/Groups/DomainGroupDetailsPage.tsx b/src/pages/domain/Groups/DomainGroupDetailsPage.tsx index 56e1ace664f6..6381d1cf693a 100644 --- a/src/pages/domain/Groups/DomainGroupDetailsPage.tsx +++ b/src/pages/domain/Groups/DomainGroupDetailsPage.tsx @@ -1,12 +1,15 @@ import {domainSecurityGroupSettingErrorsSelector, domainSecurityGroupSettingPendingActionSelector, selectGroupByID} from '@selectors/Domain'; import React from 'react'; +import {View} from 'react-native'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; +import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; +import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@navigation/Navigation'; import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@navigation/types'; @@ -17,10 +20,12 @@ import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import DefaultGroupToggle from './DefaultGroupToggle'; import HTMLMessagesRow from './HTMLMessagesRow'; +import StrictlyEnforceWorkspaceRulesToggle from './StrictlyEnforceWorkspaceRulesToggle'; type DomainGroupDetailsPageProps = PlatformStackScreenProps; function DomainGroupDetailsPage({route}: DomainGroupDetailsPageProps) { + const styles = useThemeStyles(); const {domainAccountID, groupID} = route.params; const {translate} = useLocalize(); @@ -61,6 +66,12 @@ function DomainGroupDetailsPage({route}: DomainGroupDetailsPageProps) { groupID={groupID} groupName={group?.name} /> + + {translate('domain.groups.permissions')} + diff --git a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx new file mode 100644 index 000000000000..297216454e49 --- /dev/null +++ b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx @@ -0,0 +1,59 @@ +import {domainSecurityGroupSettingErrorsSelector, domainSecurityGroupSettingPendingActionSelector, selectGroupByID} from '@selectors/Domain'; +import React from 'react'; +import {View} from 'react-native'; +import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; +import useThemeStyles from '@hooks/useThemeStyles'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; +import {clearDomainSecurityGroupSettingError, updateDomainSecurityGroup} from '@userActions/Domain'; +import ONYXKEYS from '@src/ONYXKEYS'; +import HTMLMessagesRow from './HTMLMessagesRow'; + +type StrictlyEnforceWorkspaceRulesToggleProps = { + domainAccountID: number; + groupID: string; +}; + +function StrictlyEnforceWorkspaceRulesToggle({domainAccountID, groupID}: StrictlyEnforceWorkspaceRulesToggleProps) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + + const [group] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, { + selector: selectGroupByID(groupID), + }); + + const [enableStrictPolicyRulesPendingAction] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN_PENDING_ACTIONS}${domainAccountID}`, { + selector: domainSecurityGroupSettingPendingActionSelector('enableStrictPolicyRules', groupID), + }); + const [enableStrictPolicyRulesErrors] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`, { + selector: domainSecurityGroupSettingErrorsSelector('enableStrictPolicyRulesErrors', groupID), + }); + + const isEnabled = !!group?.enableStrictPolicyRules; + + return ( + + { + if (!group?.name) { + return; + } + updateDomainSecurityGroup(domainAccountID, groupID, group, {enableStrictPolicyRules: enabled}, 'enableStrictPolicyRules'); + }} + wrapperStyle={[styles.ph5]} + pendingAction={enableStrictPolicyRulesPendingAction} + /> + clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'enableStrictPolicyRulesErrors')} + /> + + ); +} + +export default StrictlyEnforceWorkspaceRulesToggle; diff --git a/src/types/onyx/DomainErrors.ts b/src/types/onyx/DomainErrors.ts index eae764694ac9..0e4a37910684 100644 --- a/src/types/onyx/DomainErrors.ts +++ b/src/types/onyx/DomainErrors.ts @@ -45,6 +45,11 @@ type DomainSecurityGroupErrors = { * Errors related to the default security group ID setting */ defaultSecurityGroupIDErrors?: OnyxCommon.Errors; + + /** + * Errors related to the strictly enforce workspace rules setting + */ + enableStrictPolicyRulesErrors?: OnyxCommon.Errors; }; /** diff --git a/src/types/onyx/DomainPendingActions.ts b/src/types/onyx/DomainPendingActions.ts index 206eecbe380a..7f2fd19df01e 100644 --- a/src/types/onyx/DomainPendingActions.ts +++ b/src/types/onyx/DomainPendingActions.ts @@ -44,6 +44,11 @@ type DomainSecurityGroupPendingActions = { * Pending action for the default security group ID */ defaultSecurityGroupID?: OnyxCommon.PendingAction; + + /** + * Pending action for the strictly enforce workspace rules setting + */ + enableStrictPolicyRules?: OnyxCommon.PendingAction; }; /** From 0b5b677d3e84d5a18672b7b5c8dca20a983614e0 Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 13 Mar 2026 14:04:25 +0100 Subject: [PATCH 02/14] fix: add margin between toggle description and error in group settings --- src/pages/domain/Groups/DefaultGroupToggle.tsx | 10 ++++++---- .../Groups/StrictlyEnforceWorkspaceRulesToggle.tsx | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/pages/domain/Groups/DefaultGroupToggle.tsx b/src/pages/domain/Groups/DefaultGroupToggle.tsx index 9a56e5adbcad..dd6a824685ae 100644 --- a/src/pages/domain/Groups/DefaultGroupToggle.tsx +++ b/src/pages/domain/Groups/DefaultGroupToggle.tsx @@ -80,10 +80,12 @@ function DefaultGroupToggle({domainAccountID, groupID, groupName}: DefaultGroupT pendingAction={defaultSecurityGroupIDPendingAction} wrapperStyle={styles.ph5} /> - clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'defaultSecurityGroupIDErrors')} - /> + + clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'defaultSecurityGroupIDErrors')} + /> + ); } diff --git a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx index 297216454e49..22e23cd4d026 100644 --- a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx +++ b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx @@ -48,10 +48,12 @@ function StrictlyEnforceWorkspaceRulesToggle({domainAccountID, groupID}: Strictl wrapperStyle={[styles.ph5]} pendingAction={enableStrictPolicyRulesPendingAction} /> - clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'enableStrictPolicyRulesErrors')} - /> + + clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'enableStrictPolicyRulesErrors')} + /> + ); } From 585789f2f9a8b9960ba6a7e879c6a243794aea3c Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 13 Mar 2026 19:32:46 +0100 Subject: [PATCH 03/14] Revert "fix: add margin between toggle description and error in group settings" This reverts commit 0b5b677d3e84d5a18672b7b5c8dca20a983614e0. --- src/pages/domain/Groups/DefaultGroupToggle.tsx | 10 ++++------ .../Groups/StrictlyEnforceWorkspaceRulesToggle.tsx | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/pages/domain/Groups/DefaultGroupToggle.tsx b/src/pages/domain/Groups/DefaultGroupToggle.tsx index dd6a824685ae..9a56e5adbcad 100644 --- a/src/pages/domain/Groups/DefaultGroupToggle.tsx +++ b/src/pages/domain/Groups/DefaultGroupToggle.tsx @@ -80,12 +80,10 @@ function DefaultGroupToggle({domainAccountID, groupID, groupName}: DefaultGroupT pendingAction={defaultSecurityGroupIDPendingAction} wrapperStyle={styles.ph5} /> - - clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'defaultSecurityGroupIDErrors')} - /> - + clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'defaultSecurityGroupIDErrors')} + /> ); } diff --git a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx index 22e23cd4d026..297216454e49 100644 --- a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx +++ b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx @@ -48,12 +48,10 @@ function StrictlyEnforceWorkspaceRulesToggle({domainAccountID, groupID}: Strictl wrapperStyle={[styles.ph5]} pendingAction={enableStrictPolicyRulesPendingAction} /> - - clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'enableStrictPolicyRulesErrors')} - /> - + clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'enableStrictPolicyRulesErrors')} + /> ); } From 22a49c19b8b3b764241e2016c8df60de9c71ed83 Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 13 Mar 2026 19:41:27 +0100 Subject: [PATCH 04/14] fix: change styling to match design doc (section dividier, html error message) --- src/pages/domain/Groups/DomainGroupDetailsPage.tsx | 2 +- src/pages/domain/Groups/HTMLMessagesRow.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/domain/Groups/DomainGroupDetailsPage.tsx b/src/pages/domain/Groups/DomainGroupDetailsPage.tsx index 6381d1cf693a..41f52d945ab6 100644 --- a/src/pages/domain/Groups/DomainGroupDetailsPage.tsx +++ b/src/pages/domain/Groups/DomainGroupDetailsPage.tsx @@ -66,7 +66,7 @@ function DomainGroupDetailsPage({route}: DomainGroupDetailsPageProps) { groupID={groupID} groupName={group?.name} /> - + {translate('domain.groups.permissions')} ) ); From 0c3a786b8f468f897ba01ac40c1b9c477b5f7aae Mon Sep 17 00:00:00 2001 From: jakubstec Date: Mon, 16 Mar 2026 08:27:45 +0100 Subject: [PATCH 05/14] chore: revert accidental ios folder changes --- ios/NewExpensify.xcodeproj/project.pbxproj | 38 +++++++++++----------- ios/Podfile.lock | 26 +++++++++++---- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index f29b9aa98eef..8908e3ad69f5 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -673,6 +673,25 @@ shellPath = /bin/sh; shellScript = "if [ \"$CONFIGURATION\" != \"DebugDevelopment\" ]; then\n \"${PODS_ROOT}/FullStory/tools/FullStoryCommandLine\" \"${CONFIGURATION_BUILD_DIR}/${WRAPPER_NAME}\"\nelse\n echo \"Skipping FullStory Asset Uploader phase for DebugDevelopment scheme.\"\nfi\n"; }; + 87174A5CC3CF40CC94B76870 /* Strip Debug Symbols */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Strip Debug Symbols"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "bash \"${PROJECT_DIR}/../scripts/strip-ios-debug-symbols.sh\"\n"; + }; 5124824122A346BD617AD428 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -737,25 +756,6 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-NewExpensify/expo-configure-project.sh\"\n"; }; - 87174A5CC3CF40CC94B76870 /* Strip Debug Symbols */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Strip Debug Symbols"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "bash \"${PROJECT_DIR}/../scripts/strip-ios-debug-symbols.sh\"\n"; - }; 87667FE2684C0D1946DE7329 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2c0b55c4ef42..c24cf67eb515 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -481,6 +481,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -506,6 +507,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -530,6 +532,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -556,6 +559,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -581,6 +585,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -606,6 +611,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -631,6 +637,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -656,6 +663,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -681,6 +689,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -706,6 +715,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -731,6 +741,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -756,6 +767,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -781,6 +793,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -806,6 +819,7 @@ PODS: - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-rendererconsistency - React-runtimeexecutor - React-runtimescheduler - React-utils @@ -4497,20 +4511,20 @@ SPEC CHECKSUMS: AirshipServiceExtension: 50d11b2f62c4a490d4e81a1c36f70e2ecb70a27e AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 AppLogs: 3bc4e9b141dbf265b9464409caaa40416a9ee0e0 - boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + boost: 659a89341ea4ab3df8259733813b52f26d8be9a5 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb EXConstants: fd688cef4e401dcf798a021cfb5d87c890c30ba3 EXImageLoader: 4d3d3284141f1a45006cc4d0844061c182daf7ee expensify-react-native-background-task: 03c640e1f5649692d058cba48c0a138f024a6dd3 ExpensifyNitroUtils: 86109fe1ab88351ed63ffe11b760d537c70019d7 - Expo: f298203cf86d7e0a4e9d8f88f29872558aef0b01 + Expo: b2748512b0df06c1e569f93372b53c488f02ffe7 ExpoAsset: 84810d6fed8179f04d4a7a4a6b37028bbd726e26 ExpoAudio: e4cfe3a2f3317b8487460685385a9867a07fb4fb ExpoFont: 86ceec09ffed1c99cfee36ceb79ba149074901b5 ExpoImage: e88f500585913969b930e13a4be47277eb7c6de8 ExpoImageManipulator: 7cb78b082bcc767b97867d833ce614ace424cd97 ExpoLocation: 93d7faa0c2adbd5a04686af0c1a61bc6ed3ee2f7 - ExpoModulesCore: a8488fff5569ccab069549dec8680b23b13e42a8 + ExpoModulesCore: e1b5401a7af4c7dbf4fe26b535918a72c6ed8a7b ExpoSecureStore: 3f1b632d6d40bcc62b4983ef9199cd079592a50a ExpoStoreReview: 32bb43b6fae9c8db3e33cad69996dff3785eef5f ExpoVideo: 6907c4872886dce2720d3af20782eb6ee7734110 @@ -4561,7 +4575,7 @@ SPEC CHECKSUMS: React: 2073376f47c71b7e9a0af7535986a77522ce1049 React-callinvoker: 751b6f2c83347a0486391c3f266f291f0f53b27e React-Codegen: 4b8b4817cea7a54b83851d4c1f91f79aa73de30a - React-Core: dff5d29973349b11dd6631c9498456d75f846d5e + React-Core: aeebd9b37ac383279f610f1e53f66b9931686a41 React-CoreModules: c0ae04452e4c5d30e06f8e94692a49107657f537 React-cxxreact: 376fd672c95dfb64ad5cc246e6a1e9edb78dec4c React-debug: d4955c86870792887ed695df6ebf0e94e39dc7e1 @@ -4611,7 +4625,7 @@ SPEC CHECKSUMS: react-native-webview: cdce419e8022d0ef6f07db21890631258e7a9e6e React-NativeModulesApple: 8c7eb6057b00c191a11ad5ced41826ec5a0e4d78 React-oscompat: 93b5535ea7f7dff46aaee4f78309a70979bdde9d - React-perflogger: 5536d2df3d18fe0920263466f7b46a56351c0510 + React-perflogger: e7dcbfcb796d346be7936b75740c3e27a4bb3977 React-performancetimeline: c6c9393c1a0453a51e1852e3531defe60790b36c React-RCTActionSheet: 42195ae666e6d79b4af2346770f765b7c29435b9 React-RCTAnimation: fa103ccc3503b1ed8dedca7e62e7823937748843 @@ -4626,7 +4640,7 @@ SPEC CHECKSUMS: React-RCTSettings: 71f5c7fd7b5f4e725a4e2114a4b4373d0e46048f React-RCTText: b94d4699b49285bee22b8ebf768924d607eccee3 React-RCTVibration: 6e3993c4f6c36a3899059f9a9ead560ddaf5a7d7 - React-rendererconsistency: 612d0f6603d9837bb1236d7fd5194203b35c8799 + React-rendererconsistency: bef28690433e2b4bb00c2f884b22b86e61a430f2 React-renderercss: e5c2c3b84976f7a587cde8423c671db07a6a77da React-rendererdebug: cc7a6131733605b8897754f72c0c35c79f77da9e React-RuntimeApple: 3f96102fc1ebf738d36719cdce5422a5769293fb From 0ca7f4287961b57021d4a10cae19fd8f9bad2e0a Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 24 Apr 2026 11:39:22 +0200 Subject: [PATCH 06/14] minor fix after merge commit --- src/pages/domain/Groups/DomainGroupDetailsPage.tsx | 1 - .../domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/pages/domain/Groups/DomainGroupDetailsPage.tsx b/src/pages/domain/Groups/DomainGroupDetailsPage.tsx index a559f3920d5c..7a1e3a31d266 100644 --- a/src/pages/domain/Groups/DomainGroupDetailsPage.tsx +++ b/src/pages/domain/Groups/DomainGroupDetailsPage.tsx @@ -27,7 +27,6 @@ function DomainGroupDetailsPage({route}: DomainGroupDetailsPageProps) { const {domainAccountID, groupID} = route.params; const {translate} = useLocalize(); - const styles = useThemeStyles(); const [group] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, { selector: selectGroupByID(groupID), diff --git a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx index 297216454e49..e6078123ebc7 100644 --- a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx +++ b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx @@ -7,7 +7,6 @@ import useThemeStyles from '@hooks/useThemeStyles'; import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; import {clearDomainSecurityGroupSettingError, updateDomainSecurityGroup} from '@userActions/Domain'; import ONYXKEYS from '@src/ONYXKEYS'; -import HTMLMessagesRow from './HTMLMessagesRow'; type StrictlyEnforceWorkspaceRulesToggleProps = { domainAccountID: number; @@ -47,10 +46,8 @@ function StrictlyEnforceWorkspaceRulesToggle({domainAccountID, groupID}: Strictl }} wrapperStyle={[styles.ph5]} pendingAction={enableStrictPolicyRulesPendingAction} - /> - clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'enableStrictPolicyRulesErrors')} + onCloseError={() => clearDomainSecurityGroupSettingError(domainAccountID, groupID, 'enableStrictPolicyRulesErrors')} /> ); From bea28b21c61d26a142d093e8d89fd069ebc8b3e4 Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 24 Apr 2026 12:26:10 +0200 Subject: [PATCH 07/14] fix: prettier --- src/languages/es.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index e11b0059e7fe..f042f31c82d4 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -9375,7 +9375,6 @@ ${amount} para ${merchant} - ${date}`, permissions: 'Permisos de grupo', StrictlyEnforceWorkspaceRules: 'Hacer cumplir estrictamente las reglas del espacio de trabajo', StrictlyEnforceWorkspaceRulesDescription: 'Todas las reglas del espacio de trabajo deben cumplirse antes de enviar un informe. No se permiten excepciones manuales.', - }, }, gps: { From 824ac9ed4027d97fabe584074e44aed01bdbaf43 Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 24 Apr 2026 13:07:50 +0200 Subject: [PATCH 08/14] fix: typecheck --- src/libs/actions/Domain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Domain.ts b/src/libs/actions/Domain.ts index d8f919e97ca1..c3a1bf6c06ce 100644 --- a/src/libs/actions/Domain.ts +++ b/src/libs/actions/Domain.ts @@ -1880,7 +1880,7 @@ function updateDomainSecurityGroup( [SECURITY_GROUP_KEY]: { [settingsName]: currentSecurityGroup[settingsName], }, - } as PrefixedRecord, + } as PrefixedRecord>, }, { onyxMethod: Onyx.METHOD.MERGE, From 6e7c6f6258f671aa4ec491ee7eceaa0d6a4c41de Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 24 Apr 2026 13:09:43 +0200 Subject: [PATCH 09/14] fix: add offline feedback to security group row --- src/pages/domain/Groups/DomainGroupsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/domain/Groups/DomainGroupsPage.tsx b/src/pages/domain/Groups/DomainGroupsPage.tsx index 5cb5c5535b70..f4cfa279eb4a 100644 --- a/src/pages/domain/Groups/DomainGroupsPage.tsx +++ b/src/pages/domain/Groups/DomainGroupsPage.tsx @@ -55,7 +55,7 @@ function DomainGroupsPage({route}: DomainGroupsPageProps) { {translate('domain.groups.memberCount', {count: Object.keys(group.details.shared).length})} ), - pendingAction: pendingActions?.[`${CONST.DOMAIN.DOMAIN_SECURITY_GROUP_PREFIX}${group.id}`]?.name ?? undefined, + pendingAction: Object.values(pendingActions?.[`${CONST.DOMAIN.DOMAIN_SECURITY_GROUP_PREFIX}${group.id}`] ?? {}).find(Boolean), }; }); From 81c5fb27a1afe4db9eea242679ce59b442cde04e Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 24 Apr 2026 13:17:09 +0200 Subject: [PATCH 10/14] fix: add missing translations --- .claude/settings.json | 121 ++++++++++++++++++++------------------- src/languages/de.ts | 3 + src/languages/fr.ts | 4 ++ src/languages/it.ts | 3 + src/languages/ja.ts | 3 + src/languages/nl.ts | 4 ++ src/languages/pl.ts | 3 + src/languages/pt-BR.ts | 3 + src/languages/zh-hans.ts | 3 + 9 files changed, 88 insertions(+), 59 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index 3cd2d1b82934..08dd6516a2c2 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,63 +1,66 @@ { - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write", - "hooks": [ - { - "type": "command", - "command": "FILE=$(jq -r '.tool_input.file_path') && [ -f \"$FILE\" ] && ./node_modules/.bin/prettier --experimental-cli --no-cache --write --ignore-unknown \"$FILE\"" - } - ] - } + "permissions": { + "allow": [ + "mcp__playwright__browser_navigate", + "mcp__playwright__browser_navigate_back", + "mcp__playwright__browser_snapshot", + "mcp__playwright__browser_take_screenshot", + "mcp__playwright__browser_console_messages", + "mcp__playwright__browser_network_requests", + "mcp__playwright__browser_tabs", + "mcp__playwright__browser_click", + "mcp__playwright__browser_type", + "mcp__playwright__browser_fill_form", + "mcp__playwright__browser_select_option", + "mcp__playwright__browser_hover", + "mcp__playwright__browser_press_key", + "mcp__playwright__browser_wait_for", + "mcp__playwright__browser_close", + "mcp__playwright__browser_evaluate", + "mcp__playwright__browser_handle_dialog", + "mcp__sentry__find_organizations", + "mcp__sentry__find_projects", + "mcp__sentry__find_releases", + "mcp__sentry__find_teams", + "mcp__sentry__get_doc", + "mcp__sentry__get_event_attachment", + "mcp__sentry__get_issue_details", + "mcp__sentry__get_issue_tag_values", + "mcp__sentry__get_trace_details", + "mcp__sentry__search_docs", + "mcp__sentry__search_events", + "mcp__sentry__search_issue_events", + "mcp__sentry__search_issues", + "mcp__sentry__whoami", + "Bash(agent-device *)", + "Bash(echo \"$(npm root -g)/agent-device/skills/agent-device\")", + "Bash(npx prettier *)", + "Bash(grep -v \"^.*:\\\\s*$\")", + "Bash(npm run *)" + ] + }, + "hooks": { + "PostToolUse": [ + { + "matcher": "Edit|Write", + "hooks": [ + { + "type": "command", + "command": "FILE=$(jq -r '.tool_input.file_path') && [ -f \"$FILE\" ] && ./node_modules/.bin/prettier --experimental-cli --no-cache --write --ignore-unknown \"$FILE\"" + } ] - }, - "extraKnownMarketplaces": { - "callstack-agent-skills": { - "source": { - "source": "github", - "repo": "callstackincubator/agent-skills" - } - } - }, - "permissions": { - "allow": [ - "mcp__playwright__browser_navigate", - "mcp__playwright__browser_navigate_back", - "mcp__playwright__browser_snapshot", - "mcp__playwright__browser_take_screenshot", - "mcp__playwright__browser_console_messages", - "mcp__playwright__browser_network_requests", - "mcp__playwright__browser_tabs", - "mcp__playwright__browser_click", - "mcp__playwright__browser_type", - "mcp__playwright__browser_fill_form", - "mcp__playwright__browser_select_option", - "mcp__playwright__browser_hover", - "mcp__playwright__browser_press_key", - "mcp__playwright__browser_wait_for", - "mcp__playwright__browser_close", - "mcp__playwright__browser_evaluate", - "mcp__playwright__browser_handle_dialog", - "mcp__sentry__find_organizations", - "mcp__sentry__find_projects", - "mcp__sentry__find_releases", - "mcp__sentry__find_teams", - "mcp__sentry__get_doc", - "mcp__sentry__get_event_attachment", - "mcp__sentry__get_issue_details", - "mcp__sentry__get_issue_tag_values", - "mcp__sentry__get_trace_details", - "mcp__sentry__search_docs", - "mcp__sentry__search_events", - "mcp__sentry__search_issue_events", - "mcp__sentry__search_issues", - "mcp__sentry__whoami", - "Bash(agent-device *)", - "Bash(echo \"$(npm root -g)/agent-device/skills/agent-device\")" - ] - }, - "enabledPlugins": { - "react-native-best-practices@callstack-agent-skills": true + } + ] + }, + "enabledPlugins": { + "react-native-best-practices@callstack-agent-skills": true + }, + "extraKnownMarketplaces": { + "callstack-agent-skills": { + "source": { + "source": "github", + "repo": "callstackincubator/agent-skills" + } } + } } diff --git a/src/languages/de.ts b/src/languages/de.ts index 02be2176c859..bec7493afe33 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -9150,6 +9150,9 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`, groups: { title: 'Gruppen', memberCount: () => ({one: '1 Mitglied', other: (count: number) => `${count} Mitglieder`}), + permissions: 'Gruppenberechtigungen', + StrictlyEnforceWorkspaceRules: 'Workspace-Regeln strikt durchsetzen', + StrictlyEnforceWorkspaceRulesDescription: 'Alle Workspace-Regeln müssen erfüllt sein, bevor ein Bericht eingereicht wird. Manuelle Ausnahmen sind nicht zulässig.', }, }, proactiveAppReview: { diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 0f17d9c917fb..4209c5c54407 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -9173,6 +9173,10 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`, groups: { title: 'Groupes', memberCount: () => ({one: '1 membre', other: (count: number) => `${count} membres`}), + permissions: 'Autorisations du groupe', + StrictlyEnforceWorkspaceRules: 'Appliquer strictement les règles de l’espace de travail', + StrictlyEnforceWorkspaceRulesDescription: + 'Toutes les règles de l’espace de travail doivent être respectées avant de soumettre un rapport. Aucune exception manuelle n’est autorisée.', }, }, proactiveAppReview: { diff --git a/src/languages/it.ts b/src/languages/it.ts index 2e5e210f509b..ce6e0408c30a 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -9140,6 +9140,9 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`, groups: { title: 'Gruppi', memberCount: () => ({one: '1 membro', other: (count: number) => `${count} membri`}), + permissions: 'Autorizzazioni del gruppo', + StrictlyEnforceWorkspaceRules: 'Applica rigorosamente le regole dello spazio di lavoro', + StrictlyEnforceWorkspaceRulesDescription: 'Tutte le regole dello spazio di lavoro devono essere soddisfatte prima di inviare un rapporto. Non sono consentite eccezioni manuali.', }, }, proactiveAppReview: { diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 266d0c950f49..52d80d3873a4 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -9026,6 +9026,9 @@ ${reportName} groups: { title: 'グループ', memberCount: () => ({one: 'メンバー 1 人', other: (count: number) => `${count}名のメンバー`}), + permissions: 'グループの権限', + StrictlyEnforceWorkspaceRules: 'ワークスペースのルールを厳密に適用する', + StrictlyEnforceWorkspaceRulesDescription: 'レポートを送信する前にすべてのワークスペースのルールを満たす必要があります。手動による例外は許可されていません。', }, }, proactiveAppReview: { diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 3ffdb30e6426..78f0ac8b63c0 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -9113,6 +9113,10 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`, groups: { title: 'Groepen', memberCount: () => ({one: '1 lid', other: (count: number) => `${count} leden`}), + permissions: 'Groepsmachtigingen', + StrictlyEnforceWorkspaceRules: 'Werkruimteregels strikt afdwingen', + StrictlyEnforceWorkspaceRulesDescription: + 'Aan alle werkruimteregels moet worden voldaan voordat een rapport kan worden ingediend. Handmatige uitzonderingen zijn niet toegestaan.', }, }, proactiveAppReview: { diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 06cf4d88873c..aaf6ff306c3c 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -9094,6 +9094,9 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`, groups: { title: 'Grupy', memberCount: () => ({one: '1 członek', other: (count: number) => `${count} członków`}), + permissions: 'Uprawnienia grupy', + StrictlyEnforceWorkspaceRules: 'Ściśle egzekwuj reguły przestrzeni roboczej', + StrictlyEnforceWorkspaceRulesDescription: 'Przed przesłaniem raportu muszą zostać spełnione wszystkie reguły przestrzeni roboczej. Ręczne wyjątki są niedozwolone.', }, }, proactiveAppReview: { diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 0acae2f2d9f7..d662c780925b 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -9102,6 +9102,9 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`, groups: { title: 'Grupos', memberCount: () => ({one: '1 membro', other: (count: number) => `${count} membros`}), + permissions: 'Permissões do grupo', + StrictlyEnforceWorkspaceRules: 'Aplicar rigorosamente as regras do espaço de trabalho', + StrictlyEnforceWorkspaceRulesDescription: 'Todas as regras do espaço de trabalho devem ser atendidas antes de enviar um relatório. Não são permitidas exceções manuais.', }, }, proactiveAppReview: { diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 308749e97e83..29d7fb7dcb1e 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -8868,6 +8868,9 @@ ${reportName} groups: { title: '群组', memberCount: () => ({one: '1 名成员', other: (count: number) => `${count} 名成员`}), + permissions: '群组权限', + StrictlyEnforceWorkspaceRules: '严格执行工作空间规则', + StrictlyEnforceWorkspaceRulesDescription: '提交报告前必须满足所有工作空间规则。不允许手动例外。', }, }, proactiveAppReview: {title: '喜欢全新的 Expensify 吗?', description: '请告诉我们,这样我们就能帮助您让报销体验变得更好。', positiveButton: '太棒了!', negativeButton: '不太是'}, From 0c44cd8b0ba292fd33ce877c33a0c7b4d2ad940c Mon Sep 17 00:00:00 2001 From: jakubstec Date: Fri, 24 Apr 2026 13:42:10 +0200 Subject: [PATCH 11/14] fix: remove claude file --- .claude/settings.json | 121 ++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 62 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index 08dd6516a2c2..3cd2d1b82934 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,66 +1,63 @@ { - "permissions": { - "allow": [ - "mcp__playwright__browser_navigate", - "mcp__playwright__browser_navigate_back", - "mcp__playwright__browser_snapshot", - "mcp__playwright__browser_take_screenshot", - "mcp__playwright__browser_console_messages", - "mcp__playwright__browser_network_requests", - "mcp__playwright__browser_tabs", - "mcp__playwright__browser_click", - "mcp__playwright__browser_type", - "mcp__playwright__browser_fill_form", - "mcp__playwright__browser_select_option", - "mcp__playwright__browser_hover", - "mcp__playwright__browser_press_key", - "mcp__playwright__browser_wait_for", - "mcp__playwright__browser_close", - "mcp__playwright__browser_evaluate", - "mcp__playwright__browser_handle_dialog", - "mcp__sentry__find_organizations", - "mcp__sentry__find_projects", - "mcp__sentry__find_releases", - "mcp__sentry__find_teams", - "mcp__sentry__get_doc", - "mcp__sentry__get_event_attachment", - "mcp__sentry__get_issue_details", - "mcp__sentry__get_issue_tag_values", - "mcp__sentry__get_trace_details", - "mcp__sentry__search_docs", - "mcp__sentry__search_events", - "mcp__sentry__search_issue_events", - "mcp__sentry__search_issues", - "mcp__sentry__whoami", - "Bash(agent-device *)", - "Bash(echo \"$(npm root -g)/agent-device/skills/agent-device\")", - "Bash(npx prettier *)", - "Bash(grep -v \"^.*:\\\\s*$\")", - "Bash(npm run *)" - ] - }, - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write", - "hooks": [ - { - "type": "command", - "command": "FILE=$(jq -r '.tool_input.file_path') && [ -f \"$FILE\" ] && ./node_modules/.bin/prettier --experimental-cli --no-cache --write --ignore-unknown \"$FILE\"" - } + "hooks": { + "PostToolUse": [ + { + "matcher": "Edit|Write", + "hooks": [ + { + "type": "command", + "command": "FILE=$(jq -r '.tool_input.file_path') && [ -f \"$FILE\" ] && ./node_modules/.bin/prettier --experimental-cli --no-cache --write --ignore-unknown \"$FILE\"" + } + ] + } ] - } - ] - }, - "enabledPlugins": { - "react-native-best-practices@callstack-agent-skills": true - }, - "extraKnownMarketplaces": { - "callstack-agent-skills": { - "source": { - "source": "github", - "repo": "callstackincubator/agent-skills" - } + }, + "extraKnownMarketplaces": { + "callstack-agent-skills": { + "source": { + "source": "github", + "repo": "callstackincubator/agent-skills" + } + } + }, + "permissions": { + "allow": [ + "mcp__playwright__browser_navigate", + "mcp__playwright__browser_navigate_back", + "mcp__playwright__browser_snapshot", + "mcp__playwright__browser_take_screenshot", + "mcp__playwright__browser_console_messages", + "mcp__playwright__browser_network_requests", + "mcp__playwright__browser_tabs", + "mcp__playwright__browser_click", + "mcp__playwright__browser_type", + "mcp__playwright__browser_fill_form", + "mcp__playwright__browser_select_option", + "mcp__playwright__browser_hover", + "mcp__playwright__browser_press_key", + "mcp__playwright__browser_wait_for", + "mcp__playwright__browser_close", + "mcp__playwright__browser_evaluate", + "mcp__playwright__browser_handle_dialog", + "mcp__sentry__find_organizations", + "mcp__sentry__find_projects", + "mcp__sentry__find_releases", + "mcp__sentry__find_teams", + "mcp__sentry__get_doc", + "mcp__sentry__get_event_attachment", + "mcp__sentry__get_issue_details", + "mcp__sentry__get_issue_tag_values", + "mcp__sentry__get_trace_details", + "mcp__sentry__search_docs", + "mcp__sentry__search_events", + "mcp__sentry__search_issue_events", + "mcp__sentry__search_issues", + "mcp__sentry__whoami", + "Bash(agent-device *)", + "Bash(echo \"$(npm root -g)/agent-device/skills/agent-device\")" + ] + }, + "enabledPlugins": { + "react-native-best-practices@callstack-agent-skills": true } - } } From 89897beda08bbf64932982cce830eb0d26575fea Mon Sep 17 00:00:00 2001 From: jakubstec Date: Tue, 28 Apr 2026 12:36:55 +0200 Subject: [PATCH 12/14] fix: add null fallback to failureData rollback --- src/libs/actions/Domain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Domain.ts b/src/libs/actions/Domain.ts index c3a1bf6c06ce..4feac44becfb 100644 --- a/src/libs/actions/Domain.ts +++ b/src/libs/actions/Domain.ts @@ -1878,7 +1878,7 @@ function updateDomainSecurityGroup( key: `${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, value: { [SECURITY_GROUP_KEY]: { - [settingsName]: currentSecurityGroup[settingsName], + [settingsName]: currentSecurityGroup[settingsName] ?? null, }, } as PrefixedRecord>, }, From b4c470469c2f9fac8229f0c3d8a39b4cb262879d Mon Sep 17 00:00:00 2001 From: jakubstec Date: Tue, 28 Apr 2026 13:02:48 +0200 Subject: [PATCH 13/14] fix: change onToggle fallback --- src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx index e6078123ebc7..02eeee68e264 100644 --- a/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx +++ b/src/pages/domain/Groups/StrictlyEnforceWorkspaceRulesToggle.tsx @@ -39,7 +39,7 @@ function StrictlyEnforceWorkspaceRulesToggle({domainAccountID, groupID}: Strictl shouldPlaceSubtitleBelowSwitch isActive={isEnabled} onToggle={(enabled) => { - if (!group?.name) { + if (!group) { return; } updateDomainSecurityGroup(domainAccountID, groupID, group, {enableStrictPolicyRules: enabled}, 'enableStrictPolicyRules'); From 171e02b56e4fd2773103d39dd18583fa3c51fc19 Mon Sep 17 00:00:00 2001 From: jakubstec Date: Thu, 30 Apr 2026 10:46:04 +0200 Subject: [PATCH 14/14] fix: prettier --- src/types/onyx/DomainPendingActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/onyx/DomainPendingActions.ts b/src/types/onyx/DomainPendingActions.ts index 3ef01f91dc17..d2598277f869 100644 --- a/src/types/onyx/DomainPendingActions.ts +++ b/src/types/onyx/DomainPendingActions.ts @@ -49,7 +49,7 @@ type DomainSecurityGroupPendingActions = { * Pending action for the strictly enforce workspace rules setting */ enableStrictPolicyRules?: OnyxCommon.PendingAction; - + /** * Pending action for the default security group ID */