diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 26e5196599a9..fbf6ee212564 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1711,6 +1711,7 @@ const CONST = { PRINT: 'print', CHANGE_WORKSPACE: 'changeWorkspace', CHANGE_APPROVER: 'changeApprover', + CUSTOMIZE_FIELDS: 'customizeFields', VIEW_DETAILS: 'viewDetails', DELETE: 'delete', RETRACT: 'retract', @@ -1771,6 +1772,7 @@ const CONST = { HOLD: 'hold', REMOVE_HOLD: 'removeHold', SPLIT: 'split', + CUSTOMIZE_FIELDS: 'customizeFields', VIEW_DETAILS: 'viewDetails', DELETE: 'delete', REJECT: 'reject', diff --git a/src/ROUTES.ts b/src/ROUTES.ts index a76d8c3ba05d..d8db43f4e8f5 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -2875,6 +2875,10 @@ const ROUTES = { route: 'r/:reportID/change-approver/reassign', getRoute: (reportID: string) => `r/${reportID}/change-approver/reassign` as const, }, + REPORT_SETTINGS_FIELDS: { + route: 'r/:reportID/settings/fields', + getRoute: (reportID: string) => `r/${reportID}/settings/fields` as const, + }, REPORT_SETTINGS_COLUMNS: { route: 'r/:reportID/settings/columns', getRoute: (reportID: string) => `r/${reportID}/settings/columns` as const, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 5663dac47604..450e5bedecbf 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -476,6 +476,7 @@ const SCREENS = { VISIBILITY: 'Report_Settings_Visibility', DYNAMIC_SETTINGS_VISIBILITY: 'Dynamic_Report_Settings_Visibility', COLUMNS: 'Report_Settings_Columns', + FIELDS: 'Report_Settings_Fields', }, NEW_TASK: { diff --git a/src/components/ColumnsSettingsList.tsx b/src/components/ColumnsSettingsList.tsx index a065dd38942d..1edb6b298232 100644 --- a/src/components/ColumnsSettingsList.tsx +++ b/src/components/ColumnsSettingsList.tsx @@ -7,6 +7,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import {getSearchColumnTranslationKey} from '@libs/SearchUIUtils'; import CONST from '@src/CONST'; +import type {TranslationPaths} from '@src/languages/types'; import type {SearchDataTypes} from '@src/types/onyx/SearchResults'; import type {ComponentRef} from 'react'; @@ -14,40 +15,25 @@ import type {ComponentRef} from 'react'; import React, {useRef, useState} from 'react'; import {View} from 'react-native'; +import type {ColumnItem} from './ColumnsSettingsListItem'; +import type {DraggableListRenderItemParams} from './DraggableList/types'; import type {SearchCustomColumnIds} from './Search/types'; import type {ListItem} from './SelectionList/types'; import Button from './Button'; +import ColumnsSettingsListItem from './ColumnsSettingsListItem'; import DraggableList from './DraggableList'; import HeaderWithBackButton from './HeaderWithBackButton'; import Icon from './Icon'; import ScreenWrapper from './ScreenWrapper'; import ScrollView from './ScrollView'; -import MultiSelectListItem from './SelectionList/ListItem/MultiSelectListItem'; import Text from './Text'; import TextLink from './TextLink'; -type ColumnItem = { - /** Display label for the column */ - text: string; - - value: SearchCustomColumnIds; - keyForList: SearchCustomColumnIds; - - /** Whether the column is currently enabled/visible */ - isSelected: boolean; - - /** Whether the column toggle is disabled (e.g. for required columns) */ - isDisabled: boolean; - - /** Whether the column cannot be reordered via drag */ - isDragDisabled: boolean; - - /** Element rendered on the left side of the list item (e.g. drag handle) */ - leftElement: React.JSX.Element; -}; - type ColumnsSettingsListProps = { + /** Heading for the surface sharing the column preferences */ + titleKey?: TranslationPaths; + allColumns: SearchCustomColumnIds[]; /** The default set of selected columns when no customization has been applied */ @@ -76,6 +62,7 @@ type ColumnsSettingsListProps = { }; function ColumnsSettingsList({ + titleKey = 'search.columns', allColumns, defaultSelectedColumns, currentColumns, @@ -231,17 +218,15 @@ function ColumnsSettingsList({ onSave(selectedColumnIds); }; - const renderItem = ({item, isFocused}: {item: ListItem; isFocused?: boolean}) => { - return ( - - ); - }; + const renderItem = ({item, isFocused, drag, isActive}: DraggableListRenderItemParams) => ( + + ); return ( - - {!isDefaultState && {translate('search.resetColumns')}} - + {!isDefaultState && {translate('search.resetColumns')}} - - {isGrouped ? ( + {isGrouped ? ( + {translate('search.groupColumns')} @@ -294,19 +277,19 @@ function ColumnsSettingsList({ focusedIndex={typeFocusedIndex} /> - ) : ( - item.value} - onDragEnd={onTypeDragEnd} - onSelectRow={onSelectItem} - isItemDragDisabled={(item) => item.isDragDisabled} - isItemDisabled={(item) => item.isDisabled} - renderItem={renderItem} - /> - )} - + + ) : ( + item.value} + onDragEnd={onTypeDragEnd} + onSelectRow={onSelectItem} + shouldRestrictDragToEnabledItems + isItemDragDisabled={(item) => item.isDragDisabled} + isItemDisabled={(item) => item.isDisabled} + renderItem={renderItem} + /> + )}