From 74e7d456aa3e00e5bbad4fa0345b039a65eb3075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Chrab=C4=85szczewski?= Date: Tue, 5 Mar 2024 12:29:20 +0100 Subject: [PATCH 01/32] feat(bulk actions ui): add menu dropdown button --- src/CONST.ts | 5 ++ src/languages/en.ts | 5 +- src/languages/es.ts | 5 +- src/pages/workspace/WorkspaceMembersPage.tsx | 2 +- .../categories/WorkspaceCategoriesPage.tsx | 85 +++++++++++++++---- 5 files changed, 81 insertions(+), 21 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 9a9294621338..60d1b4ead7fb 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1399,6 +1399,11 @@ const CONST = { MAKE_MEMBER: 'makeMember', MAKE_ADMIN: 'makeAdmin', }, + CATEGORIES_BULK_ACTION_TYPES: { + DELETE: 'delete', + DISABLE: 'disable', + ENABLE: 'enable', + }, }, CUSTOM_UNITS: { diff --git a/src/languages/en.ts b/src/languages/en.ts index 0a52cca62ef5..6a5c67fb0902 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1743,6 +1743,7 @@ export default { testTransactions: 'Test transactions', issueAndManageCards: 'Issue and manage cards', reconcileCards: 'Reconcile cards', + selected: ({selectedNumber}) => `${selectedNumber} selected`, settlementFrequency: 'Settlement frequency', deleteConfirmation: 'Are you sure you want to delete this workspace?', unavailable: 'Unavailable workspace', @@ -1761,6 +1762,9 @@ export default { collect: 'Collect', }, categories: { + deleteCategories: 'Delete categories', + disableCategories: 'Disable categories', + enableCategories: 'Enable categories', categoryName: 'Category name', requiresCategory: 'Members must categorize all spend', enableCategory: 'Enable category', @@ -1808,7 +1812,6 @@ export default { makeMember: 'Make member', makeAdmin: 'Make admin', selectAll: 'Select all', - selected: ({selectedNumber}) => `${selectedNumber} selected`, error: { genericAdd: 'There was a problem adding this workspace member.', cannotRemove: 'You cannot remove yourself or the workspace owner.', diff --git a/src/languages/es.ts b/src/languages/es.ts index 013255c1e11e..7841846f465a 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1767,6 +1767,7 @@ export default { testTransactions: 'Transacciones de prueba', issueAndManageCards: 'Emitir y gestionar tarjetas', reconcileCards: 'Reconciliar tarjetas', + selected: ({selectedNumber}) => `${selectedNumber} seleccionados`, settlementFrequency: 'Frecuencia de liquidación', deleteConfirmation: '¿Estás seguro de que quieres eliminar este espacio de trabajo?', unavailable: 'Espacio de trabajo no disponible', @@ -1785,6 +1786,9 @@ export default { collect: 'Recolectar', }, categories: { + deleteCategories: 'Eliminar categorías', + disableCategories: 'Desactivar categorías', + enableCategories: 'Activar categorías', categoryName: 'Nombre de la categoría', requiresCategory: 'Los miembros deben categorizar todos los gastos', enableCategory: 'Activar categoría', @@ -1832,7 +1836,6 @@ export default { makeMember: 'Hacer miembro', makeAdmin: 'Hacer administrador', selectAll: 'Seleccionar todo', - selected: ({selectedNumber}) => `${selectedNumber} seleccionados`, error: { genericAdd: 'Ha ocurrido un problema al añadir el miembro al espacio de trabajo.', cannotRemove: 'No puedes eliminarte ni a ti mismo ni al dueño del espacio de trabajo.', diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx index b43659a776d9..f532697ff7b1 100644 --- a/src/pages/workspace/WorkspaceMembersPage.tsx +++ b/src/pages/workspace/WorkspaceMembersPage.tsx @@ -434,7 +434,7 @@ function WorkspaceMembersPage({policyMembers, personalDetails, route, policy, se shouldAlwaysShowDropdownMenu pressOnEnter - customText={translate('workspace.people.selected', {selectedNumber: selectedEmployees.length})} + customText={translate('workspace.common.selected', {selectedNumber: selectedEmployees.length})} buttonSize={CONST.DROPDOWN_BUTTON_SIZE.MEDIUM} onPress={() => null} options={getBulkActionsButtonOptions()} diff --git a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx index d15011489bac..3b3f2cc87f1c 100644 --- a/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx +++ b/src/pages/workspace/categories/WorkspaceCategoriesPage.tsx @@ -1,9 +1,11 @@ import type {StackScreenProps} from '@react-navigation/stack'; -import React, {useMemo, useState} from 'react'; +import React, {useCallback, useMemo, useRef, useState} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import Button from '@components/Button'; +import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu'; +import type {DropdownOption} from '@components/ButtonWithDropdownMenu/types'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; @@ -21,10 +23,12 @@ import Navigation from '@libs/Navigation/Navigation'; import type {CentralPaneNavigatorParamList} from '@navigation/types'; import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; import PaidPolicyAccessOrNotFoundWrapper from '@pages/workspace/PaidPolicyAccessOrNotFoundWrapper'; +import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type * as OnyxTypes from '@src/types/onyx'; +import type DeepValueOf from '@src/types/utils/DeepValueOf'; type PolicyForList = { value: string; @@ -47,6 +51,7 @@ function WorkspaceCategoriesPage({policyCategories, route}: WorkspaceCategoriesP const theme = useTheme(); const {translate} = useLocalize(); const [selectedCategories, setSelectedCategories] = useState>({}); + const dropdownButtonRef = useRef(null); const categoryList = useMemo( () => @@ -89,25 +94,69 @@ function WorkspaceCategoriesPage({policyCategories, route}: WorkspaceCategoriesP ); - const navigateToCategoriesSettings = () => { - Navigation.navigate(ROUTES.WORKSPACE_CATEGORIES_SETTINGS.getRoute(route.params.policyID)); - }; - const navigateToCategorySettings = (category: PolicyForList) => { Navigation.navigate(ROUTES.WORKSPACE_CATEGORY_SETTINGS.getRoute(route.params.policyID, category.text)); }; - const settingsButton = ( - -