Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 92 additions & 66 deletions src/libs/actions/Policy/ReportField.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import cloneDeep from 'lodash/cloneDeep';
import type {NullishDeep, OnyxCollection, OnyxUpdate} from 'react-native-onyx';
import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import * as API from '@libs/API';
import type {
Expand All @@ -20,43 +20,10 @@ import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {WorkspaceReportFieldForm} from '@src/types/form/WorkspaceReportFieldForm';
import INPUT_IDS from '@src/types/form/WorkspaceReportFieldForm';
import type {Policy, PolicyReportField, Report} from '@src/types/onyx';
import type {Policy, PolicyReportField} from '@src/types/onyx';
import type {OnyxValueWithOfflineFeedback} from '@src/types/onyx/OnyxCommon';
import type {OnyxData} from '@src/types/onyx/Request';

const allPolicies: OnyxCollection<Policy> = {};
Onyx.connect({
key: ONYXKEYS.COLLECTION.POLICY,
callback: (value, key) => {
if (!key) {
return;
}
if (value === null || value === undefined) {
// If we are deleting a policy, we have to check every report linked to that policy
// and unset the draft indicator (pencil icon) alongside removing any draft comments. Clearing these values will keep the newly archived chats from being displayed in the LHN.
// More info: https://github.com/Expensify/App/issues/14260
const policyID = key.replace(ONYXKEYS.COLLECTION.POLICY, '');
const policyReports = ReportUtils.getAllPolicyReports(policyID);
const cleanUpMergeQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT}${string}`, NullishDeep<Report>> = {};
const cleanUpSetQueries: Record<`${typeof ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${string}` | `${typeof ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${string}`, null> = {};
policyReports.forEach((policyReport) => {
if (!policyReport) {
return;
}
const {reportID} = policyReport;
cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_DRAFT_COMMENT}${reportID}`] = null;
cleanUpSetQueries[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS_DRAFTS}${reportID}`] = null;
});
Onyx.mergeCollection(ONYXKEYS.COLLECTION.REPORT, cleanUpMergeQueries);
Onyx.multiSet(cleanUpSetQueries);
delete allPolicies[key];
return;
}

allPolicies[key] = value;
},
});

type CreateReportFieldsListValueParams = {
valueName: string;
listValues: string[];
Expand Down Expand Up @@ -84,8 +51,38 @@ type DeleteReportFieldsListValueParams = {
type CreateReportFieldParams = Pick<WorkspaceReportFieldForm, 'name' | 'type' | 'initialValue'> & {
listValues: string[];
disabledListValues: boolean[];
policyID: string;
policyExpenseReportIDs: Array<string | undefined> | undefined;
policy: OnyxEntry<Policy>;
};

type DeleteReportFieldsParams = {
reportFieldsToUpdate: string[];
policy: OnyxEntry<Policy>;
};

type RemoveReportFieldListValueParams = {
valueIndexes: number[];
reportFieldID: string;
policy: OnyxEntry<Policy>;
};

type AddReportFieldListValueParams = {
valueName: string;
reportFieldID: string;
policy: OnyxEntry<Policy>;
};

type UpdateReportFieldListValueEnabledParams = {
valueIndexes: number[];
enabled: boolean;
reportFieldID: string;
policy: OnyxEntry<Policy>;
};

type UpdateReportFieldInitialValueParams = {
newInitialValue: string;
reportFieldID: string;
policy: OnyxEntry<Policy>;
};

function openPolicyReportFieldsPage(policyID: string) {
Expand Down Expand Up @@ -170,8 +167,13 @@ function deleteReportFieldsListValue({valueIndexes, listValues, disabledListValu
/**
* Creates a new report field.
*/
function createReportField({name, type, initialValue, listValues, disabledListValues, policyID, policyExpenseReportIDs}: CreateReportFieldParams) {
const previousFieldList = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.fieldList ?? {};
function createReportField({name, type, initialValue, listValues, disabledListValues, policyExpenseReportIDs, policy}: CreateReportFieldParams) {
if (!policy) {
Log.warn('Policy data is not present');
return;
}

const previousFieldList = policy?.fieldList ?? {};
const fieldID = WorkspaceReportFieldUtils.generateFieldID(name);
const fieldKey = ReportUtils.getReportFieldKey(fieldID);
const optimisticReportFieldDataForPolicy: Omit<OnyxValueWithOfflineFeedback<PolicyReportField>, 'value'> = {
Expand All @@ -191,7 +193,7 @@ function createReportField({name, type, initialValue, listValues, disabledListVa

const optimisticData = [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -213,7 +215,7 @@ function createReportField({name, type, initialValue, listValues, disabledListVa

const failureData = [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -239,7 +241,7 @@ function createReportField({name, type, initialValue, listValues, disabledListVa
optimisticData,
successData: [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -253,15 +255,19 @@ function createReportField({name, type, initialValue, listValues, disabledListVa
};

const parameters: CreateWorkspaceReportFieldParams = {
policyID,
policyID: policy?.id,
reportFields: JSON.stringify([optimisticReportFieldDataForPolicy]),
};

API.write(WRITE_COMMANDS.CREATE_WORKSPACE_REPORT_FIELD, parameters, onyxData);
}

function deleteReportFields(policyID: string, reportFieldsToUpdate: string[]) {
const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`];
function deleteReportFields({policy, reportFieldsToUpdate}: DeleteReportFieldsParams) {
if (!policy) {
Log.warn('Policy data is not present');
return;
}

const allReportFields = policy?.fieldList ?? {};

const updatedReportFields = Object.fromEntries(Object.entries(allReportFields).filter(([key]) => !reportFieldsToUpdate.includes(key)));
Expand All @@ -284,7 +290,7 @@ function deleteReportFields(policyID: string, reportFieldsToUpdate: string[]) {
optimisticData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
value: {
fieldList: optimisticReportFields,
},
Expand All @@ -293,7 +299,7 @@ function deleteReportFields(policyID: string, reportFieldsToUpdate: string[]) {
successData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
value: {
fieldList: successReportFields,
errorFields: null,
Expand All @@ -303,7 +309,7 @@ function deleteReportFields(policyID: string, reportFieldsToUpdate: string[]) {
failureData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
value: {
fieldList: failureReportFields,
errorFields: {
Expand All @@ -315,7 +321,7 @@ function deleteReportFields(policyID: string, reportFieldsToUpdate: string[]) {
};

const parameters: DeletePolicyReportField = {
policyID,
policyID: policy?.id,
reportFields: JSON.stringify(Object.values(updatedReportFields)),
};

Expand All @@ -325,8 +331,13 @@ function deleteReportFields(policyID: string, reportFieldsToUpdate: string[]) {
/**
* Updates the initial value of a report field.
*/
function updateReportFieldInitialValue(policyID: string, reportFieldID: string, newInitialValue: string) {
const previousFieldList = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.fieldList ?? {};
function updateReportFieldInitialValue({policy, reportFieldID, newInitialValue}: UpdateReportFieldInitialValueParams) {
if (!policy) {
Log.warn('Policy data is not present');
return;
}

const previousFieldList = policy?.fieldList ?? {};
const fieldKey = ReportUtils.getReportFieldKey(reportFieldID);
const updatedReportField: PolicyReportField = {
...previousFieldList[fieldKey],
Expand All @@ -335,7 +346,7 @@ function updateReportFieldInitialValue(policyID: string, reportFieldID: string,
const onyxData: OnyxData = {
optimisticData: [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -347,7 +358,7 @@ function updateReportFieldInitialValue(policyID: string, reportFieldID: string,
],
successData: [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -359,7 +370,7 @@ function updateReportFieldInitialValue(policyID: string, reportFieldID: string,
],
failureData: [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -373,15 +384,20 @@ function updateReportFieldInitialValue(policyID: string, reportFieldID: string,
],
};
const parameters: UpdateWorkspaceReportFieldInitialValueParams = {
policyID,
policyID: policy?.id,
reportFields: JSON.stringify([updatedReportField]),
};

API.write(WRITE_COMMANDS.UPDATE_WORKSPACE_REPORT_FIELD_INITIAL_VALUE, parameters, onyxData);
}

function updateReportFieldListValueEnabled(policyID: string, reportFieldID: string, valueIndexes: number[], enabled: boolean) {
const previousFieldList = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.fieldList ?? {};
function updateReportFieldListValueEnabled({policy, reportFieldID, valueIndexes, enabled}: UpdateReportFieldListValueEnabledParams) {
if (!policy) {
Log.warn('Policy data is not present');
return;
}

const previousFieldList = policy?.fieldList ?? {};
const fieldKey = ReportUtils.getReportFieldKey(reportFieldID);
const reportField = previousFieldList[fieldKey];

Expand All @@ -400,7 +416,7 @@ function updateReportFieldListValueEnabled(policyID: string, reportFieldID: stri
const onyxData: OnyxData = {
optimisticData: [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -412,7 +428,7 @@ function updateReportFieldListValueEnabled(policyID: string, reportFieldID: stri
};

const parameters: EnableWorkspaceReportFieldListValueParams = {
policyID,
policyID: policy?.id,
reportFields: JSON.stringify([updatedReportField]),
};

Expand All @@ -422,8 +438,13 @@ function updateReportFieldListValueEnabled(policyID: string, reportFieldID: stri
/**
* Adds a new option to the list type report field on a workspace.
*/
function addReportFieldListValue(policyID: string, reportFieldID: string, valueName: string) {
const previousFieldList = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.fieldList ?? {};
function addReportFieldListValue({policy, reportFieldID, valueName}: AddReportFieldListValueParams) {
if (!policy) {
Log.warn('Policy data is not present');
return;
}

const previousFieldList = policy?.fieldList ?? {};
const reportFieldKey = ReportUtils.getReportFieldKey(reportFieldID);
const reportField = previousFieldList[reportFieldKey];
const updatedReportField = cloneDeep(reportField);
Expand All @@ -435,7 +456,7 @@ function addReportFieldListValue(policyID: string, reportFieldID: string, valueN
const onyxData: OnyxData = {
optimisticData: [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -447,7 +468,7 @@ function addReportFieldListValue(policyID: string, reportFieldID: string, valueN
};

const parameters: CreateWorkspaceReportFieldListValueParams = {
policyID,
policyID: policy?.id,
reportFields: JSON.stringify([updatedReportField]),
};

Expand All @@ -457,8 +478,13 @@ function addReportFieldListValue(policyID: string, reportFieldID: string, valueN
/**
* Removes a list value from the workspace report fields.
*/
function removeReportFieldListValue(policyID: string, reportFieldID: string, valueIndexes: number[]) {
const previousFieldList = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]?.fieldList ?? {};
function removeReportFieldListValue({policy, reportFieldID, valueIndexes}: RemoveReportFieldListValueParams) {
if (!policy) {
Log.warn('Policy data is not present');
return;
}

const previousFieldList = policy?.fieldList ?? {};
const reportFieldKey = ReportUtils.getReportFieldKey(reportFieldID);
const reportField = previousFieldList[reportFieldKey];
const updatedReportField = cloneDeep(reportField);
Expand All @@ -480,7 +506,7 @@ function removeReportFieldListValue(policyID: string, reportFieldID: string, val
const onyxData: OnyxData = {
optimisticData: [
{
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
key: `${ONYXKEYS.COLLECTION.POLICY}${policy?.id}`,
onyxMethod: Onyx.METHOD.MERGE,
value: {
fieldList: {
Expand All @@ -492,7 +518,7 @@ function removeReportFieldListValue(policyID: string, reportFieldID: string, val
};

const parameters: RemoveWorkspaceReportFieldListValueParams = {
policyID,
policyID: policy?.id,
reportFields: JSON.stringify([updatedReportField]),
};

Expand Down
4 changes: 2 additions & 2 deletions src/pages/workspace/reports/CreateReportFieldsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ function WorkspaceCreateReportFieldsPage({
const submitForm = useCallback(
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_REPORT_FIELDS_FORM>) => {
createReportField({
policyID,
policy,
name: values[INPUT_IDS.NAME],
type: values[INPUT_IDS.TYPE],
initialValue: !(values[INPUT_IDS.TYPE] === CONST.REPORT_FIELD_TYPES.LIST && availableListValuesLength === 0) ? values[INPUT_IDS.INITIAL_VALUE] : '',
Expand All @@ -74,7 +74,7 @@ function WorkspaceCreateReportFieldsPage({
});
Navigation.goBack();
},
[availableListValuesLength, formDraft, policyExpenseReportIDs, policyID],
[availableListValuesLength, formDraft, policy, policyExpenseReportIDs],
);

const validateForm = useCallback(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ function ReportFieldsAddListValuePage({
const createValue = useCallback(
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.WORKSPACE_REPORT_FIELDS_FORM>) => {
if (reportFieldID) {
addReportFieldListValue(policyID, reportFieldID, values[INPUT_IDS.VALUE_NAME]);
addReportFieldListValue({policy, reportFieldID, valueName: values[INPUT_IDS.VALUE_NAME]});
} else {
createReportFieldsListValue({
valueName: values[INPUT_IDS.VALUE_NAME],
Expand All @@ -69,7 +69,7 @@ function ReportFieldsAddListValuePage({
Keyboard.dismiss();
Navigation.goBack();
},
[formDraft, policyID, reportFieldID],
[formDraft, policy, reportFieldID],
);

return (
Expand Down
Loading
Loading