diff --git a/src/CONST/index.ts b/src/CONST/index.ts index c1125ae29715..96f05bae5af9 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -8366,6 +8366,9 @@ const CONST = { SECONDARY_ACTIONS: { SETTINGS: 'settings', }, + BULK_ACTION_TYPES: { + CLOSE_ACCOUNT: 'closeAccount', + }, }, }, diff --git a/src/components/ButtonWithDropdownMenu/types.ts b/src/components/ButtonWithDropdownMenu/types.ts index ae479d2beff0..9120a183d6c7 100644 --- a/src/components/ButtonWithDropdownMenu/types.ts +++ b/src/components/ButtonWithDropdownMenu/types.ts @@ -14,6 +14,8 @@ type WorkspaceMemberBulkActionType = DeepValueOf; +type DomainMemberBulkActionType = DeepValueOf; + type WorkspaceDistanceRatesBulkActionType = DeepValueOf; type WorkspaceTaxRatesBulkActionType = DeepValueOf; @@ -167,6 +169,7 @@ type ButtonWithDropdownMenuRef = { export type { PaymentType, WorkspaceMemberBulkActionType, + DomainMemberBulkActionType, RoomMemberBulkActionType, WorkspaceDistanceRatesBulkActionType, DropdownOption, diff --git a/src/languages/de.ts b/src/languages/de.ts index 500a0394329b..19a59cebfdf6 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -8465,12 +8465,20 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`, findMember: 'Mitglied finden', addMember: 'Mitglied hinzufügen', email: 'E-Mail-Adresse', - closeAccount: 'Konto schließen', + closeAccount: () => ({ + one: 'Konto schließen', + other: 'Konten schließen', + }), closeAccountPrompt: 'Bist du sicher? Diese Aktion ist dauerhaft.', - forceCloseAccount: 'Konto zwangsweise schließen', - safeCloseAccount: 'Konto sicher schließen', - closeAccountInfo: - 'Wir empfehlen, das Konto sicher zu schließen, um das Schließen zu überspringen, falls Folgendes vorliegt:
  • Ausstehende Genehmigungen
  • Aktive Erstattungen
  • Keine alternativen Anmeldemethoden
Andernfalls können Sie die oben genannten Sicherheitsvorkehrungen ignorieren und das ausgewählte Konto zwangsweise schließen.', + forceCloseAccount: () => ({one: 'Konto zwangsweise schließen', other: 'Konten zwangsweise schließen'}), + safeCloseAccount: () => ({ + one: 'Konto sicher schließen', + other: 'Konten sicher schließen', + }), + closeAccountInfo: () => ({ + one: 'Wir empfehlen, das Konto sicher zu schließen, um das Schließen zu überspringen, falls Folgendes vorliegt:
  • Ausstehende Genehmigungen
  • Aktive Erstattungen
  • Keine alternativen Anmeldemethoden
Andernfalls können Sie die oben genannten Sicherheitsvorkehrungen ignorieren und das ausgewählte Konto zwangsweise schließen.', + other: 'Wir empfehlen, die Konten sicher zu schließen, um das Schließen zu überspringen, falls Folgendes vorliegt:
  • Ausstehende Genehmigungen
  • Aktive Erstattungen
  • Keine alternativen Anmeldemethoden
Andernfalls können Sie die oben genannten Sicherheitsvorkehrungen ignorieren und die ausgewählten Konten zwangsweise schließen.', + }), error: { removeMember: 'Dieser Benutzer kann nicht entfernt werden. Bitte versuche es erneut.', addMember: 'Dieses Mitglied kann nicht hinzugefügt werden. Bitte versuche es erneut.', diff --git a/src/languages/en.ts b/src/languages/en.ts index 15016310b6da..d778d70323c3 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -8405,12 +8405,20 @@ const translations = { findMember: 'Find member', addMember: 'Add member', email: 'Email address', - closeAccount: 'Close account', closeAccountPrompt: 'Are you sure? This action is permanent.', - forceCloseAccount: 'Force close account', - safeCloseAccount: 'Close account safely', - closeAccountInfo: - 'We recommend closing the account safely to skip closing it in case there are:
  • Pending approvals
  • Active reimbursements
  • No alternative login methods
Otherwise, you can ignore the safety precautions above and force close the selected account.', + forceCloseAccount: () => ({one: 'Force close account', other: 'Force close accounts'}), + safeCloseAccount: () => ({ + one: 'Close account safely', + other: 'Close accounts safely', + }), + closeAccountInfo: () => ({ + one: 'We recommend closing the account safely to skip closing it in case there are:
  • Pending approvals
  • Active reimbursements
  • No alternative login methods
Otherwise, you can ignore the safety precautions above and force close the selected account.', + other: 'We recommend closing the accounts safely to skip closing it in case there are:
  • Pending approvals
  • Active reimbursements
  • No alternative login methods
Otherwise, you can ignore the safety precautions above and force close the selected accounts.', + }), + closeAccount: () => ({ + one: 'Close account', + other: 'Close accounts', + }), error: { addMember: 'Unable to add this member. Please try again.', removeMember: 'Unable to remove this user. Please try again.', diff --git a/src/languages/es.ts b/src/languages/es.ts index a4472f910f0c..e01bb0c98669 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -8588,12 +8588,20 @@ ${amount} para ${merchant} - ${date}`, findMember: 'Buscar miembro', addMember: 'Añadir miembro', email: 'Dirección de correo electrónico', - closeAccount: 'Cerrar cuenta', + closeAccount: () => ({ + one: 'Cerrar cuenta', + other: 'Cerrar cuentas', + }), closeAccountPrompt: '¿Estás seguro? Esta acción es permanente.', - forceCloseAccount: 'Forzar cierre de cuenta', - safeCloseAccount: 'Cierre seguro de cuenta', - closeAccountInfo: - 'Recomendamos cerrar la cuenta de forma segura para omitir el cierre si hay:
  • Aprobaciones pendientes
  • Reembolsos en curso
  • No hay otro método de inicio de sesión
De lo contrario, puedes ignorar las precauciones de seguridad anteriores y forzar el cierre de las cuentas seleccionadas.', + forceCloseAccount: () => ({one: 'Forzar cierre de cuenta', other: 'Forzar cierre de cuentas'}), + safeCloseAccount: () => ({ + one: 'Cierre seguro de cuenta', + other: 'Cierre seguro de cuentas', + }), + closeAccountInfo: () => ({ + one: 'Recomendamos cerrar la cuenta de forma segura para omitir el cierre si hay:
  • Aprobaciones pendientes
  • Reembolsos en curso
  • No hay otro método de inicio de sesión
De lo contrario, puedes ignorar las precauciones de seguridad anteriores y forzar el cierre de la cuenta seleccionada.', + other: 'Recomendamos cerrar las cuentas de forma segura para omitir el cierre si hay:
  • Aprobaciones pendientes
  • Reembolsos en curso
  • No hay otro método de inicio de sesión
De lo contrario, puedes ignorar las precauciones de seguridad anteriores y forzar el cierre de las cuentas seleccionadas.', + }), error: { removeMember: 'No se pudo eliminar a este usuario. Por favor, inténtalo de nuevo.', addMember: 'No se pudo añadir este miembro. Por favor, inténtalo de nuevo.', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 2d1e45587e50..0d6aed3573de 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -8485,12 +8485,20 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`, findMember: 'Trouver un membre', addMember: 'Ajouter un membre', email: 'Adresse e-mail', - closeAccount: 'Fermer le compte', + closeAccount: () => ({ + one: 'Fermer le compte', + other: 'Fermer les comptes', + }), closeAccountPrompt: 'Êtes-vous sûr(e) ? Cette action est définitive.', - forceCloseAccount: 'Forcer la fermeture du compte', - safeCloseAccount: 'Fermer le compte en toute sécurité', - closeAccountInfo: - 'Nous recommandons de fermer le compte en toute sécurité afin d’éviter de le fermer dans le cas où il y aurait :
  • Des validations en attente
  • Des remboursements actifs
  • Aucune autre méthode de connexion
Sinon, vous pouvez ignorer les précautions de sécurité ci-dessus et forcer la fermeture du compte sélectionné.', + forceCloseAccount: () => ({one: 'Forcer la fermeture du compte', other: 'Forcer la fermeture des comptes'}), + safeCloseAccount: () => ({ + one: 'Fermer le compte en toute sécurité', + other: 'Fermer les comptes en toute sécurité', + }), + closeAccountInfo: () => ({ + one: 'Nous recommandons de fermer le compte en toute sécurité afin d’éviter de le fermer dans le cas où il y aurait :
  • Des validations en attente
  • Des remboursements actifs
  • Aucune autre méthode de connexion
Sinon, vous pouvez ignorer les précautions de sécurité ci-dessus et forcer la fermeture du compte sélectionné.', + other: 'Nous recommandons de fermer les comptes en toute sécurité afin d’éviter de les fermer dans le cas où il y aurait :
  • Des validations en attente
  • Des remboursements actifs
  • Aucune autre méthode de connexion
Sinon, vous pouvez ignorer les précautions de sécurité ci-dessus et forcer la fermeture des comptes sélectionnés.', + }), error: { removeMember: 'Impossible de supprimer cet utilisateur. Veuillez réessayer.', addMember: 'Impossible d’ajouter ce membre. Veuillez réessayer.', diff --git a/src/languages/it.ts b/src/languages/it.ts index 5e3cc506eb4d..bbde8da65208 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -8450,12 +8450,20 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`, findMember: 'Trova membro', addMember: 'Aggiungi membro', email: 'Indirizzo email', - closeAccount: 'Chiudi account', + closeAccount: () => ({ + one: 'Chiudi account', + other: 'Chiudi account', + }), closeAccountPrompt: 'Sei sicuro? Questa azione è permanente.', - forceCloseAccount: 'Forza chiusura account', - safeCloseAccount: 'Chiudi il conto in sicurezza', - closeAccountInfo: - 'Consigliamo di chiudere l’account in modo sicuro per evitare problemi in caso di:
  • Approvazioni in sospeso
  • Rimborsi attivi
  • Nessun metodo di accesso alternativo
In caso contrario, puoi ignorare le precauzioni di sicurezza sopra indicate e forzare la chiusura dell’account selezionato.', + forceCloseAccount: () => ({one: 'Forza chiusura account', other: 'Forza chiusura account'}), + safeCloseAccount: () => ({ + one: 'Chiudi il conto in sicurezza', + other: 'Chiudi i conti in sicurezza', + }), + closeAccountInfo: () => ({ + one: 'Consigliamo di chiudere l’account in modo sicuro per evitare problemi in caso di:
  • Approvazioni in sospeso
  • Rimborsi attivi
  • Nessun metodo di accesso alternativo
In caso contrario, puoi ignorare le precauzioni di sicurezza sopra indicate e forzare la chiusura dell’account selezionato.', + other: 'Consigliamo di chiudere gli account in modo sicuro per evitare problemi in caso di:
  • Approvazioni in sospeso
  • Rimborsi attivi
  • Nessun metodo di accesso alternativo
In caso contrario, puoi ignorare le precauzioni di sicurezza sopra indicate e forzare la chiusura degli account selezionati.', + }), error: { removeMember: 'Impossibile rimuovere questo utente. Riprova.', addMember: 'Impossibile aggiungere questo membro. Riprova.', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index c4625dc3063d..604e6f18702a 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -8372,12 +8372,20 @@ ${reportName} findMember: 'メンバーを検索', addMember: 'メンバーを追加', email: 'メールアドレス', - closeAccount: 'アカウントを閉じる', + closeAccount: () => ({ + one: 'アカウントを閉じる', + other: 'アカウントを閉じる', + }), closeAccountPrompt: '本当によろしいですか?この操作は元に戻せません。', - forceCloseAccount: 'アカウントを強制的に閉鎖', - safeCloseAccount: 'アカウントを安全に閉じる', - closeAccountInfo: - '保留中の承認、処理中の精算、代替ログイン方法がない場合などでもアカウントを閉鎖できるように、安全にアカウントを閉鎖することを推奨します:
  • 保留中の承認
  • 進行中の払い戻し
  • 代替ログイン方法なし
それ以外の場合は、上記の安全上の注意を無視して、選択したアカウントを強制的に閉鎖できます。', + forceCloseAccount: () => ({one: 'アカウントを強制的に閉鎖', other: 'アカウントを強制的に閉鎖'}), + safeCloseAccount: () => ({ + one: 'アカウントを安全に閉じる', + other: 'アカウントを安全に閉じる', + }), + closeAccountInfo: () => ({ + one: '保留中の承認、処理中の精算、代替ログイン方法がない場合などでもアカウントを閉鎖できるように、安全にアカウントを閉鎖することを推奨します:
  • 保留中の承認
  • 進行中の払い戻し
  • 代替ログイン方法なし
それ以外の場合は、上記の安全上の注意を無視して、選択したアカウントを強制的に閉鎖できます。', + other: '保留中の承認、処理中の精算、代替ログイン方法がない場合などでもアカウントを閉鎖できるように、安全にアカウントを閉鎖することを推奨します:
  • 保留中の承認
  • 進行中の払い戻し
  • 代替ログイン方法なし
それ以外の場合は、上記の安全上の注意を無視して、選択したアカウントを強制的に閉鎖できます。', + }), error: { removeMember: 'このユーザーを削除できません。もう一度お試しください。', addMember: 'このメンバーを追加できませんでした。もう一度お試しください。', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index a82c5872b312..02ba348da653 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -8435,12 +8435,20 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`, findMember: 'Lid zoeken', addMember: 'Lid toevoegen', email: 'E-mailadres', - closeAccount: 'Account sluiten', + closeAccount: () => ({ + one: 'Account sluiten', + other: 'Accounts sluiten', + }), closeAccountPrompt: 'Weet je het zeker? Deze actie is permanent.', - forceCloseAccount: 'Account geforceerd sluiten', - safeCloseAccount: 'Account veilig sluiten', - closeAccountInfo: - 'We raden aan om de account veilig te sluiten om te vermijden dat je deze moet sluiten als er zijn:
  • Openstaande goedkeuringen
  • Actieve terugbetalingen
  • Geen alternatieve inlogmethoden
Anders kun je de bovenstaande veiligheidsmaatregelen negeren en de geselecteerde account geforceerd sluiten.', + forceCloseAccount: () => ({one: 'Account geforceerd sluiten', other: 'Accounts geforceerd sluiten'}), + safeCloseAccount: () => ({ + one: 'Account veilig sluiten', + other: 'Accounts veilig sluiten', + }), + closeAccountInfo: () => ({ + one: 'We raden aan om de account veilig te sluiten om te vermijden dat je deze moet sluiten als er zijn:
  • Openstaande goedkeuringen
  • Actieve terugbetalingen
  • Geen alternatieve inlogmethoden
Anders kun je de bovenstaande veiligheidsmaatregelen negeren en de geselecteerde account geforceerd sluiten.', + other: 'We raden aan om de accounts veilig te sluiten om te vermijden dat je deze moet sluiten als er zijn:
  • Openstaande goedkeuringen
  • Actieve terugbetalingen
  • Geen alternatieve inlogmethoden
Anders kun je de bovenstaande veiligheidsmaatregelen negeren en de geselecteerde accounts geforceerd sluiten.', + }), error: { removeMember: 'Kan deze gebruiker niet verwijderen. Probeer het opnieuw.', addMember: 'Kan dit lid niet toevoegen. Probeer het opnieuw.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 58d4ddf62493..bbaaa3c0cba8 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -8414,12 +8414,20 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`, findMember: 'Znajdź członka', addMember: 'Dodaj członka', email: 'Adres e-mail', - closeAccount: 'Zamknij konto', + closeAccount: () => ({ + one: 'Zamknij konto', + other: 'Zamknij konta', + }), closeAccountPrompt: 'Czy na pewno? Ta czynność jest nieodwracalna.', - forceCloseAccount: 'Wymuś zamknięcie konta', - safeCloseAccount: 'Zamknij konto bezpiecznie', - closeAccountInfo: - 'Zalecamy bezpieczne zamknięcie konta, aby pominąć jego zamykanie w przypadku, gdy występują:
  • Oczekujące zatwierdzenia
  • Aktywne zwroty kosztów
  • Brak alternatywnych metod logowania
W przeciwnym razie możesz zignorować powyższe środki ostrożności i wymusić zamknięcie wybranego konta.', + forceCloseAccount: () => ({one: 'Wymuś zamknięcie konta', other: 'Wymuś zamknięcie kont'}), + safeCloseAccount: () => ({ + one: 'Zamknij konto bezpiecznie', + other: 'Zamknij konta bezpiecznie', + }), + closeAccountInfo: () => ({ + one: 'Zalecamy bezpieczne zamknięcie konta, aby pominąć jego zamykanie w przypadku, gdy występują:
  • Oczekujące zatwierdzenia
  • Aktywne zwroty kosztów
  • Brak alternatywnych metod logowania
W przeciwnym razie możesz zignorować powyższe środki ostrożności i wymusić zamknięcie wybranego konta.', + other: 'Zalecamy bezpieczne zamknięcie kont, aby pominąć ich zamykanie w przypadku, gdy występują:
  • Oczekujące zatwierdzenia
  • Aktywne zwroty kosztów
  • Brak alternatywnych metod logowania
W przeciwnym razie możesz zignorować powyższe środki ostrożności i wymusić zamknięcie wybranych kont.', + }), error: { removeMember: 'Nie można usunąć tego użytkownika. Spróbuj ponownie.', addMember: 'Nie można dodać tego członka. Spróbuj ponownie.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b7ba20b54ebc..d3779cc0bf25 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -8419,12 +8419,20 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`, findMember: 'Encontrar membro', addMember: 'Adicionar membro', email: 'Endereço de e-mail', - closeAccount: 'Encerrar conta', + closeAccount: () => ({ + one: 'Encerrar conta', + other: 'Encerrar contas', + }), closeAccountPrompt: 'Tem certeza? Esta ação é permanente.', - forceCloseAccount: 'Forçar encerramento da conta', - safeCloseAccount: 'Fechar conta com segurança', - closeAccountInfo: - 'Recomendamos fechar a conta com segurança para evitar o fechamento caso haja:
  • aprovações pendentes
  • reembolsos ativos
  • nenhum método de login alternativo
Caso contrário, você pode ignorar as precauções de segurança acima e forçar o fechamento da conta selecionada.', + forceCloseAccount: () => ({one: 'Forçar encerramento da conta', other: 'Forçar encerramento das contas'}), + safeCloseAccount: () => ({ + one: 'Fechar conta com segurança', + other: 'Fechar contas com segurança', + }), + closeAccountInfo: () => ({ + one: 'Recomendamos fechar a conta com segurança para evitar o fechamento caso haja:
  • aprovações pendentes
  • reembolsos ativos
  • nenhum método de login alternativo
Caso contrário, você pode ignorar as precauções de segurança acima e forçar o fechamento da conta selecionada.', + other: 'Recomendamos fechar as contas com segurança para evitar o fechamento caso haja:
  • aprovações pendentes
  • reembolsos ativos
  • nenhum método de login alternativo
Caso contrário, você pode ignorar as precauções de segurança acima e forçar o fechamento das contas selecionadas.', + }), error: { removeMember: 'Não foi possível remover este usuário. Tente novamente.', addMember: 'Não foi possível adicionar este membro. Tente novamente.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 6f378402ef71..ea4e28933dbe 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -8246,12 +8246,20 @@ ${reportName} findMember: '查找成员', addMember: '添加成员', email: '电子邮箱地址', - closeAccount: '关闭账户', + closeAccount: () => ({ + one: '关闭账户', + other: '关闭账户', + }), closeAccountPrompt: '您确定吗?此操作是永久性的。', - forceCloseAccount: '强制关闭账户', - safeCloseAccount: '安全关闭账户', - closeAccountInfo: - '我们建议安全地关闭该账户,以便在存在以下情况时跳过关闭操作:
  • 待处理的审批
  • 正在进行的报销
  • 没有其他登录方式
否则,您可以忽略上述安全预防措施并强制关闭所选账户。', + forceCloseAccount: () => ({one: '强制关闭账户', other: '强制关闭账户'}), + safeCloseAccount: () => ({ + one: '安全关闭账户', + other: '安全关闭账户', + }), + closeAccountInfo: () => ({ + one: '我们建议安全地关闭该账户,以便在存在以下情况时跳过关闭操作:
  • 待处理的审批
  • 正在进行的报销
  • 没有其他登录方式
否则,您可以忽略上述安全预防措施并强制关闭所选账户。', + other: '我们建议安全地关闭该账户,以便在存在以下情况时跳过关闭操作:
  • 待处理的审批
  • 正在进行的报销
  • 没有其他登录方式
否则,您可以忽略上述安全预防措施并强制关闭所选账户。', + }), error: { removeMember: '无法移除此用户。请重试。', addMember: '无法添加此成员。请重试。', diff --git a/src/pages/domain/BaseDomainMembersPage.tsx b/src/pages/domain/BaseDomainMembersPage.tsx index 90407b352bcc..3019a7376b1b 100644 --- a/src/pages/domain/BaseDomainMembersPage.tsx +++ b/src/pages/domain/BaseDomainMembersPage.tsx @@ -3,10 +3,9 @@ import {View} from 'react-native'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import SearchBar from '@components/SearchBar'; -// eslint-disable-next-line no-restricted-imports -import SelectionList from '@components/SelectionList'; import TableListItem from '@components/SelectionList/ListItem/TableListItem'; import type {ListItem} from '@components/SelectionList/types'; +import SelectionListWithModal from '@components/SelectionListWithModal'; import CustomListHeader from '@components/SelectionListWithModal/CustomListHeader'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; @@ -62,6 +61,24 @@ type BaseDomainMembersPageProps = { /** Callback fired when the user dismisses an error message for a specific row */ onDismissError?: (item: MemberOption) => void; + + /** Allow multiple members to be selected at the same time. Defaults to false. */ + canSelectMultiple?: boolean; + + /** Stores list of selected members. Only works with canSelectMultiple === true. */ + selectedMembers?: string[]; + + /** Setter for a list of selected members. Only works with canSelectMultiple === true. */ + setSelectedMembers?: React.Dispatch>; + + /** Whether the selection mode header should be shown (changes title and hides icon) */ + useSelectionModeHeader?: boolean; + + /** Custom back button press handler */ + onBackButtonPress?: () => void; + + /** Weather long press should enable selection mode on mobile */ + turnOnSelectionModeOnLongPress?: boolean; }; function BaseDomainMembersPage({ @@ -75,8 +92,14 @@ function BaseDomainMembersPage({ getCustomRightElement, getCustomRowProps, onDismissError, + selectedMembers, + setSelectedMembers, + canSelectMultiple = false, + useSelectionModeHeader, + turnOnSelectionModeOnLongPress = false, + onBackButtonPress, }: BaseDomainMembersPageProps) { - const {formatPhoneNumber, localeCompare} = useLocalize(); + const {formatPhoneNumber, localeCompare, translate} = useLocalize(); const styles = useThemeStyles(); const {shouldUseNarrowLayout} = useResponsiveLayout(); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: true}); @@ -119,13 +142,42 @@ function BaseDomainMembersPage({ const [inputValue, setInputValue, filteredData] = useSearchResults(data, filterMember, sortMembers); + const isUserToggleEnabled = setSelectedMembers && filteredData.length > 0; + + const toggleAllUsers = isUserToggleEnabled + ? () => { + const enabledAccounts = filteredData.filter((member) => !member.isDisabled && !member.isDisabledCheckbox); + const enabledAccountIDs = enabledAccounts.map((member) => member.keyForList); + const everySelected = enabledAccountIDs.every((accountID) => selectedMembers?.includes(accountID)); + + if (everySelected) { + setSelectedMembers((prevSelected) => prevSelected.filter((accountID) => !enabledAccountIDs.includes(accountID))); + } else { + setSelectedMembers((prevSelected) => { + const newSelected = new Set([...prevSelected, ...enabledAccountIDs]); + return Array.from(newSelected); + }); + } + } + : undefined; + + const toggleUser = isUserToggleEnabled + ? (member: MemberOption) => { + if (selectedMembers?.includes(member.keyForList)) { + setSelectedMembers((prevSelected) => prevSelected.filter((accountID) => accountID !== member.keyForList)); + } else { + setSelectedMembers((prevSelected) => [...prevSelected, member.keyForList]); + } + } + : undefined; + const getCustomListHeader = () => { if (filteredData.length === 0) { return null; } return ( ); @@ -150,20 +202,20 @@ function BaseDomainMembersPage({ testID={BaseDomainMembersPage.displayName} > {!shouldUseNarrowLayout && !!headerContent && {headerContent}} {shouldUseNarrowLayout && !!headerContent && {headerContent}} - item && toggleUser?.(item)} /> diff --git a/src/pages/domain/Members/DomainMemberDetailsPage.tsx b/src/pages/domain/Members/DomainMemberDetailsPage.tsx index 549f422ee463..736a2e1fc7df 100644 --- a/src/pages/domain/Members/DomainMemberDetailsPage.tsx +++ b/src/pages/domain/Members/DomainMemberDetailsPage.tsx @@ -42,7 +42,7 @@ function DomainMemberDetailsPage({route}: DomainMemberDetailsPageProps) { selector: personalDetailsSelector(accountID), }); - const [domainName] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, {canBeMissing: false, selector: domainNameSelector}); + const [domainName] = useOnyx(`${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, {canBeMissing: true, selector: domainNameSelector}); const memberLogin = personalDetails?.login ?? ''; @@ -52,13 +52,14 @@ function DomainMemberDetailsPage({route}: DomainMemberDetailsPageProps) { } const result = await showConfirmModal({ - title: translate('domain.members.closeAccount'), + title: translate('domain.members.closeAccount', {count: 1}), prompt: translate('domain.members.closeAccountPrompt'), - confirmText: translate('domain.members.closeAccount'), + confirmText: translate('domain.members.closeAccount', {count: 1}), cancelText: translate('common.cancel'), danger: true, shouldShowCancelButton: true, }); + if (result.action !== ModalActions.CONFIRM) { setIsModalVisible(true); setShouldForceCloseAccount(undefined); @@ -81,7 +82,7 @@ function DomainMemberDetailsPage({route}: DomainMemberDetailsPageProps) { const avatarButton = (