Skip to content

Commit

Permalink
Merge pull request #47928 from software-mansion-labs/approval-workflo…
Browse files Browse the repository at this point in the history
…ws/sort-and-display-more-lines

[Advanced approvals] Sort members and display more lines
  • Loading branch information
MariaHCD committed Aug 26, 2024
2 parents a201d26 + f7a701a commit 3a28521
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 15 deletions.
16 changes: 14 additions & 2 deletions src/components/ApprovalWorkflowSection.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import React, {useCallback} from 'react';
import React, {useCallback, useMemo} from 'react';
import {View} from 'react-native';
import useLocalize from '@hooks/useLocalize';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import * as OptionsListUtils from '@libs/OptionsListUtils';
import type ApprovalWorkflow from '@src/types/onyx/ApprovalWorkflow';
import Icon from './Icon';
import * as Expensicons from './Icon/Expensicons';
Expand Down Expand Up @@ -31,6 +32,16 @@ function ApprovalWorkflowSection({approvalWorkflow, onPress}: ApprovalWorkflowSe
[approvalWorkflow.approvers.length, toLocaleOrdinal, translate],
);

const members = useMemo(() => {
if (approvalWorkflow.isDefault) {
return translate('workspace.common.everyone');
}

return OptionsListUtils.sortAlphabetically(approvalWorkflow.members, 'displayName')
.map((m) => m.displayName)
.join(', ');
}, [approvalWorkflow.isDefault, approvalWorkflow.members, translate]);

return (
<PressableWithoutFeedback
accessibilityRole="button"
Expand Down Expand Up @@ -60,7 +71,8 @@ function ApprovalWorkflowSection({approvalWorkflow, onPress}: ApprovalWorkflowSe
style={styles.p0}
titleStyle={styles.textLabelSupportingNormal}
descriptionTextStyle={styles.textNormalThemeText}
description={approvalWorkflow.isDefault ? translate('workspace.common.everyone') : approvalWorkflow.members.map((m) => m.displayName).join(', ')}
description={members}
numberOfLinesDescription={4}
icon={Expensicons.Users}
iconHeight={20}
iconWidth={20}
Expand Down
10 changes: 3 additions & 7 deletions src/libs/OptionsListUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,6 @@ type FilterOptionsConfig = Pick<GetOptionsConfig, 'sortByReportTypeInSearch' | '
preferPolicyExpenseChat?: boolean;
};

type HasText = {
text?: string;
};

/**
* OptionsListUtils is used to build a list options passed to the OptionsList component. Several different UI views can
* be configured to display different results based on the options passed to the private getOptions() method. Public
Expand Down Expand Up @@ -2479,8 +2475,8 @@ function filterOptions(options: Options, searchInputValue: string, config?: Filt
};
}

function sortItemsAlphabetically<T extends HasText>(membersList: T[]): T[] {
return membersList.sort((a, b) => (a.text ?? '').toLowerCase().localeCompare((b.text ?? '').toLowerCase()));
function sortAlphabetically<T extends Partial<Record<TKey, string | undefined>>, TKey extends keyof T>(items: T[], key: TKey): T[] {
return items.sort((a, b) => (a[key] ?? '').toLowerCase().localeCompare((b[key] ?? '').toLowerCase()));
}

function getEmptyOptions(): Options {
Expand Down Expand Up @@ -2524,7 +2520,7 @@ export {
getEnabledCategoriesCount,
hasEnabledOptions,
sortCategories,
sortItemsAlphabetically,
sortAlphabetically,
sortTags,
getCategoryOptionTree,
hasEnabledTags,
Expand Down
2 changes: 1 addition & 1 deletion src/pages/workspace/WorkspaceMembersPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ function WorkspaceMembersPage({personalDetails, route, policy, currentUserPerson
invitedSecondaryLogin: details?.login ? invitedPrimaryToSecondaryLogins[details.login] ?? '' : '',
});
});
result = OptionsListUtils.sortItemsAlphabetically(result);
result = OptionsListUtils.sortAlphabetically(result, 'text');
return result;
}, [
isOffline,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ function AssigneeStep({policy}: AssigneeStepProps) {
});
});

membersList = OptionsListUtils.sortItemsAlphabetically(membersList);
membersList = OptionsListUtils.sortAlphabetically(membersList, 'text');

return membersList;
}, [isOffline, policy?.employeeList]);
Expand Down
15 changes: 13 additions & 2 deletions src/pages/workspace/workflows/approvals/ApprovalWorkflowEditor.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {ForwardedRef} from 'react';
import React, {forwardRef, useCallback} from 'react';
import React, {forwardRef, useCallback, useMemo} from 'react';
import {View} from 'react-native';
// eslint-disable-next-line no-restricted-imports
import type {ScrollView as ScrollViewRN} from 'react-native';
Expand All @@ -13,6 +13,7 @@ import useLocalize from '@hooks/useLocalize';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@libs/Navigation/Navigation';
import * as OptionsListUtils from '@libs/OptionsListUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
Expand Down Expand Up @@ -43,7 +44,16 @@ function ApprovalWorkflowEditor({approvalWorkflow, removeApprovalWorkflow, polic
approvalWorkflow.approvers.length > 1 ? `${toLocaleOrdinal(index + 1, true)} ${translate('workflowsPage.approver').toLowerCase()}` : `${translate('workflowsPage.approver')}`,
[approvalWorkflow.approvers.length, toLocaleOrdinal, translate],
);
const members = approvalWorkflow.isDefault ? translate('workspace.common.everyone') : approvalWorkflow.members.map((m) => m.displayName).join(', ');

const members = useMemo(() => {
if (approvalWorkflow.isDefault) {
return translate('workspace.common.everyone');
}

return OptionsListUtils.sortAlphabetically(approvalWorkflow.members, 'displayName')
.map((m) => m.displayName)
.join(', ');
}, [approvalWorkflow.isDefault, approvalWorkflow.members, translate]);

const approverErrorMessage = useCallback(
(approver: Approver | undefined, approverIndex: number) => {
Expand Down Expand Up @@ -120,6 +130,7 @@ function ApprovalWorkflowEditor({approvalWorkflow, removeApprovalWorkflow, polic
<MenuItemWithTopDescription
title={members}
titleStyle={styles.textNormalThemeText}
numberOfLinesTitle={4}
description={translate('workflowsExpensesFromPage.title')}
descriptionTextStyle={!!members && styles.textLabelSupportingNormal}
onPress={editMembers}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ function WorkspaceWorkflowsApprovalsApproverPageBeta({policy, personalDetails, i
return [
{
title: undefined,
data: filteredApprovers,
data: OptionsListUtils.sortAlphabetically(filteredApprovers, 'text'),
shouldShow: true,
},
];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ function WorkspaceWorkflowsApprovalsExpensesFromPage({policy, isLoadingReportDat
return [
{
title: undefined,
data: filteredMembers,
data: OptionsListUtils.sortAlphabetically(filteredMembers, 'text'),
shouldShow: true,
},
];
Expand Down

0 comments on commit 3a28521

Please sign in to comment.