Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | 117x 32x 32x 32x 33x | import { ChangeItem, ChangelogData } from "@services/api/changelog/changelog";
/**
* Order array for field names per resource type.
* Used to sort fieldChanges when a resource has a preferred display order.
* Add new entries for other resource types as needed.
* Can be extended with other resourceTypeDisplayName (e.g. Primary Account Holder)
*/
const FIELD_ORDER_BY_RESOURCE_TYPE: Record<string, string[]> = {
"Business Profile": [
"Business Legal Name",
"Doing Business As (DBA)",
"Date Business Opened",
"Tax ID",
"Business Type",
"Business Ownership Type",
"Phone Number",
"Business Address",
],
"Merchant File": [
"Merchant Name",
"Merchant Class",
"Processor",
"MCC",
"Billing Descriptor",
"Permalink",
"Website URL",
"Customer Service",
"Estimated Annual Revenue",
"Average Ticket Amount",
"High Ticket Amount",
"Goods and/or Services Description of Merchant",
"Countries Serviced Outside the USA/Canada",
],
"Bank Account": [
"Account Type",
"Account Name",
"Account Number",
"Routing Number",
"Bank Name",
],
"Business Owner": [
"Full Name",
"Date of Birth",
"Email",
"Phone Number",
"Country of Residence",
"Citizenship Country",
"Tax ID",
"Ownership",
"Business Address",
],
"Primary Account Holder": [
"Full Name",
"Email",
"Phone Number",
"Date of Birth",
"Country of Residence",
"Citizenship Country",
],
};
/**
* Sorts an array of ChangeItems by a given field name order.
* Items whose fieldName is in the order array are sorted by that order.
* Items whose fieldName is not in the order array are appended at the end (original order preserved).
*
* @param fieldChanges - The array of change items to sort
* @param fieldNameOrder - The desired order of field names (not all need to appear in fieldChanges)
* @returns New array with the same items, reordered
*/
function sortFieldChangesByOrder(
fieldChanges: ChangeItem[],
fieldNameOrder: string[],
): ChangeItem[] {
if (fieldChanges.length <= 1) return fieldChanges;
const orderIndex = new Map<string, number>();
fieldNameOrder.forEach((name, index) => orderIndex.set(name, index));
const getSortKey = (fieldName: string): number =>
orderIndex.has(fieldName)
? orderIndex.get(fieldName)!
: fieldNameOrder.length;
return [...fieldChanges].sort((a, b) => {
const keyA = getSortKey(a.fieldName);
const keyB = getSortKey(b.fieldName);
if (keyA !== keyB) return keyA - keyB;
return 0;
});
}
/**
* Sorts fieldChanges for a changelog item when:
* - The item has more than one field change, and
* - A field order is configured for the item's resourceTypeDisplayName.
*
* @param resourceTypeDisplayName - The resource type (e.g. "Business Profile")
* @param fieldNameOrder - Optional override order; if not provided, uses FIELD_ORDER_BY_RESOURCE_TYPE
* @returns Function that maps a ChangelogData item to the same item with sorted fieldChanges when applicable
*/
export function createFieldChangesSorter(
resourceTypeDisplayName: string,
fieldNameOrder?: string[],
) {
const order =
fieldNameOrder ?? FIELD_ORDER_BY_RESOURCE_TYPE[resourceTypeDisplayName];
if (!order?.length) return (item: ChangelogData) => item;
return (item: ChangelogData): ChangelogData => {
if (
item.resourceTypeDisplayName !== resourceTypeDisplayName ||
!item.fieldChanges?.length ||
item.fieldChanges.length <= 1
) {
return item;
}
return {
...item,
fieldChanges: sortFieldChangesByOrder(item.fieldChanges, order),
};
};
}
/**
* Applies configured field ordering to a single changelog item.
* Uses FIELD_ORDER_BY_RESOURCE_TYPE to determine if and how to sort.
*/
export function sortChangelogItemFieldChanges(
item: ChangelogData,
): ChangelogData {
const order = FIELD_ORDER_BY_RESOURCE_TYPE[item.resourceTypeDisplayName];
Eif (
!order?.length ||
!item.fieldChanges?.length ||
item.fieldChanges.length <= 1
) {
return item;
}
return {
...item,
fieldChanges: sortFieldChangesByOrder(item.fieldChanges, order),
};
}
/**
* Sorts fieldChanges for each item in a changelog data array based on configured resource types.
*/
export function sortChangelogDataFieldChanges(
data: ChangelogData[],
): ChangelogData[] {
return data.map(sortChangelogItemFieldChanges);
}
|