From 05683be3aebde4d14b76c2187cac0123166d608d Mon Sep 17 00:00:00 2001 From: Hayata Suenaga Date: Fri, 31 May 2024 14:14:48 -0700 Subject: [PATCH] feat: add switch toggle --- src/CONST.ts | 3 ++ src/languages/es.ts | 2 +- .../API/parameters/SetPolicyTagsRequired.ts | 7 +++ src/libs/API/parameters/index.ts | 1 + src/libs/API/types.ts | 2 + src/libs/actions/Policy/Policy.ts | 53 +++++++++++++++++++ .../workspace/tags/WorkspaceViewTagsPage.tsx | 14 +++++ 7 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/libs/API/parameters/SetPolicyTagsRequired.ts diff --git a/src/CONST.ts b/src/CONST.ts index de4e3305eddc9..2678cae5877a9 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1664,6 +1664,9 @@ const CONST = { // Often referred to as "collect" workspaces TEAM: 'team', + TAG: { + required: 'required', + }, }, ROLE: { ADMIN: 'admin', diff --git a/src/languages/es.ts b/src/languages/es.ts index 8e1827647abb6..efa2efac4cc0f 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2246,7 +2246,7 @@ export default { }, tags: { tagName: 'Nombre de etiqueta', - requiresTag: 'Los miembros deben etiquetar todos los gastos', + requiresTag: 'Los diputados deben etiquetar todos los gastos', customTagName: 'Nombre de etiqueta personalizada', enableTag: 'Habilitar etiqueta', enableTags: 'Habilitar etiquetas', diff --git a/src/libs/API/parameters/SetPolicyTagsRequired.ts b/src/libs/API/parameters/SetPolicyTagsRequired.ts new file mode 100644 index 0000000000000..8defd4a808407 --- /dev/null +++ b/src/libs/API/parameters/SetPolicyTagsRequired.ts @@ -0,0 +1,7 @@ +type SetPolicyTagsRequired = { + policyID: string; + tagListIndex: number; + requireTagList: boolean; +}; + +export default SetPolicyTagsRequired; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 68097a2011202..c2f10a0192f6f 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -180,6 +180,7 @@ export type {default as EnablePolicyConnectionsParams} from './EnablePolicyConne export type {default as EnablePolicyDistanceRatesParams} from './EnablePolicyDistanceRatesParams'; export type {default as EnablePolicyTagsParams} from './EnablePolicyTagsParams'; export type {default as SetPolicyTagsEnabled} from './SetPolicyTagsEnabled'; +export type {default as SetPolicyTagsRequired} from './SetPolicyTagsRequired'; export type {default as EnablePolicyWorkflowsParams} from './EnablePolicyWorkflowsParams'; export type {default as EnablePolicyReportFieldsParams} from './EnablePolicyReportFieldsParams'; export type {default as AcceptJoinRequestParams} from './AcceptJoinRequest'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 897b300f0471b..3bf2f731bc1da 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -127,6 +127,7 @@ const WRITE_COMMANDS = { CREATE_WORKSPACE_FROM_IOU_PAYMENT: 'CreateWorkspaceFromIOUPayment', SET_WORKSPACE_CATEGORIES_ENABLED: 'SetWorkspaceCategoriesEnabled', SET_POLICY_TAGS_ENABLED: 'SetPolicyTagsEnabled', + SET_POLICY_TAGS_REQUIRED: 'SetPolicyTagsRequired', CREATE_WORKSPACE_CATEGORIES: 'CreateWorkspaceCategories', RENAME_WORKSPACE_CATEGORY: 'RenameWorkspaceCategory', CREATE_POLICY_TAG: 'CreatePolicyTag', @@ -344,6 +345,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.RENAME_POLICY_TAG]: Parameters.RenamePolicyTagsParams; [WRITE_COMMANDS.SET_POLICY_TAGS_ENABLED]: Parameters.SetPolicyTagsEnabled; [WRITE_COMMANDS.DELETE_POLICY_TAGS]: Parameters.DeletePolicyTagsParams; + [WRITE_COMMANDS.SET_POLICY_TAGS_REQUIRED]: Parameters.SetPolicyTagsRequired; [WRITE_COMMANDS.CREATE_TASK]: Parameters.CreateTaskParams; [WRITE_COMMANDS.CANCEL_TASK]: Parameters.CancelTaskParams; [WRITE_COMMANDS.EDIT_TASK_ASSIGNEE]: Parameters.EditTaskAssigneeParams; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index fc2a8ad7970e0..570638609488e 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -35,6 +35,7 @@ import type { RequestWorkspaceOwnerChangeParams, SetPolicyDistanceRatesEnabledParams, SetPolicyDistanceRatesUnitParams, + SetPolicyTagsRequired, SetWorkspaceApprovalModeParams, SetWorkspaceAutoReportingFrequencyParams, SetWorkspaceAutoReportingMonthlyOffsetParams, @@ -3378,6 +3379,57 @@ function enablePolicyReportFields(policyID: string, enabled: boolean) { API.write(WRITE_COMMANDS.ENABLE_POLICY_REPORT_FIELDS, parameters, onyxData); } +function setWorkspaceTagListRequired(policyID: string, tagListIndex: number, required: boolean) { + const policyTag = PolicyUtils.getTagLists(allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`] ?? {})?.[tagListIndex] ?? {}; + + const onyxData: OnyxData = { + optimisticData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, + value: { + [policyTag.name]: { + required, + errors: null, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + }, + }, + ], + successData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, + value: { + [policyTag.name]: { + errors: null, + pendingAction: null, + }, + }, + }, + ], + failureData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, + value: { + [policyTag.name]: { + required: policyTag.required, + }, + }, + }, + ], + }; + + const parameters: SetPolicyTagsRequired = { + policyID, + tagListIndex, + requireTagList: required, + }; + + API.write(WRITE_COMMANDS.SET_POLICY_TAGS_REQUIRED, parameters, onyxData); +} + function enablePolicyTaxes(policyID: string, enabled: boolean) { const defaultTaxRates: TaxRatesWithDefault = CONST.DEFAULT_TAX; const taxRatesData: OnyxData = { @@ -4242,6 +4294,7 @@ export { buildPolicyData, navigateWhenEnableFeature, removePendingFieldsFromCustomUnit, + setWorkspaceTagListRequired, }; export type {NewCustomUnit}; diff --git a/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx b/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx index 1b91777a22ada..0fbd0d916bc25 100644 --- a/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx @@ -3,6 +3,7 @@ import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {ActivityIndicator, View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; +import * as Policy from 'src/libs/actions/Policy/Policy'; import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu'; import type {DropdownOption} from '@components/ButtonWithDropdownMenu/types'; import ConfirmModal from '@components/ConfirmModal'; @@ -21,12 +22,14 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; +import * as ErrorUtils from '@libs/ErrorUtils'; import localeCompare from '@libs/LocaleCompare'; import Navigation from '@libs/Navigation/Navigation'; import * as PolicyUtils from '@libs/PolicyUtils'; import type {SettingsNavigatorParamList} from '@navigation/types'; import NotFoundPage from '@pages/ErrorPage/NotFoundPage'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; +import ToggleSettingOptionRow from '@pages/workspace/workflows/ToggleSettingsOptionRow'; import * as Tag from '@userActions/Policy/Tag'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -245,6 +248,17 @@ function WorkspaceViewTagsPage({route}: WorkspaceViewTagsProps) { shouldShowRightIcon /> + + Policy.setWorkspaceTagListRequired(policyID, route.params.orderWeight ?? 0, on)} + pendingAction={currentPolicyTag.pendingFields?.required} + errors={ErrorUtils.getLatestErrorField(policyTags, CONST.POLICY.TAG.required)} + disabled={tagList.length === 0} + /> + {isLoading && (