braid-ui 1.0.41 → 1.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/css/braid-ui.css +17 -0
- package/dist/css/braid-ui.min.css +1 -1
- package/dist/index.cjs +1838 -266
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -7
- package/dist/index.d.ts +17 -7
- package/dist/index.js +1837 -269
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -556,8 +556,8 @@ var reducer = (state, action) => {
|
|
|
556
556
|
if (toastId) {
|
|
557
557
|
addToRemoveQueue(toastId);
|
|
558
558
|
} else {
|
|
559
|
-
state.toasts.forEach((
|
|
560
|
-
addToRemoveQueue(
|
|
559
|
+
state.toasts.forEach((toast6) => {
|
|
560
|
+
addToRemoveQueue(toast6.id);
|
|
561
561
|
});
|
|
562
562
|
}
|
|
563
563
|
return {
|
|
@@ -4015,6 +4015,21 @@ var statusConfig = {
|
|
|
4015
4015
|
variant: "secondary",
|
|
4016
4016
|
label: "Cancelled",
|
|
4017
4017
|
icon: lucideReact.XCircle
|
|
4018
|
+
},
|
|
4019
|
+
DELETED: {
|
|
4020
|
+
variant: "inactive",
|
|
4021
|
+
label: "Deleted",
|
|
4022
|
+
icon: lucideReact.XCircle
|
|
4023
|
+
},
|
|
4024
|
+
NEEDS_OFAC: {
|
|
4025
|
+
variant: "pending",
|
|
4026
|
+
label: "Needs OFAC",
|
|
4027
|
+
icon: lucideReact.AlertTriangle
|
|
4028
|
+
},
|
|
4029
|
+
PENDING_UNBLOCK: {
|
|
4030
|
+
variant: "pending",
|
|
4031
|
+
label: "Pending Unblock",
|
|
4032
|
+
icon: lucideReact.Clock
|
|
4018
4033
|
}
|
|
4019
4034
|
};
|
|
4020
4035
|
var StatusBadge = ({ status, className }) => {
|
|
@@ -4459,7 +4474,7 @@ function DatePicker({
|
|
|
4459
4474
|
) })
|
|
4460
4475
|
] });
|
|
4461
4476
|
if (label) {
|
|
4462
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("space-y-
|
|
4477
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("space-y-4", wrapperClassName), children: [
|
|
4463
4478
|
/* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", children: label }),
|
|
4464
4479
|
picker
|
|
4465
4480
|
] });
|
|
@@ -6221,9 +6236,10 @@ var CounterpartyDetailView = ({
|
|
|
6221
6236
|
value: currentStatus,
|
|
6222
6237
|
options: [
|
|
6223
6238
|
{ value: "ACTIVE", label: "Active" },
|
|
6224
|
-
{ value: "
|
|
6225
|
-
{ value: "
|
|
6226
|
-
{ value: "
|
|
6239
|
+
{ value: "BLOCKED", label: "Blocked" },
|
|
6240
|
+
{ value: "DELETED", label: "Deleted" },
|
|
6241
|
+
{ value: "NEEDS_OFAC", label: "Needs OFAC" },
|
|
6242
|
+
{ value: "PENDING_UNBLOCK", label: "Pending Unblock" }
|
|
6227
6243
|
],
|
|
6228
6244
|
onChange: onStatusChange,
|
|
6229
6245
|
renderValue: (value) => /* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status: value }),
|
|
@@ -6971,20 +6987,18 @@ var Label = React15__namespace.forwardRef(({ className, ...props }, ref) => /* @
|
|
|
6971
6987
|
}
|
|
6972
6988
|
));
|
|
6973
6989
|
Label.displayName = LabelPrimitive__namespace.Root.displayName;
|
|
6974
|
-
var CounterpartyBasicInfo = ({
|
|
6975
|
-
|
|
6976
|
-
|
|
6977
|
-
|
|
6978
|
-
|
|
6979
|
-
|
|
6980
|
-
|
|
6981
|
-
|
|
6982
|
-
|
|
6983
|
-
|
|
6984
|
-
|
|
6985
|
-
|
|
6986
|
-
const updatedData = { ...formData, [field]: value };
|
|
6987
|
-
setFormData(updatedData);
|
|
6990
|
+
var CounterpartyBasicInfo = ({ value = {
|
|
6991
|
+
name: "",
|
|
6992
|
+
type: "business",
|
|
6993
|
+
email: "",
|
|
6994
|
+
phone: "",
|
|
6995
|
+
dateOfBirth: "",
|
|
6996
|
+
idNumber: "",
|
|
6997
|
+
idType: "product_id",
|
|
6998
|
+
idValue: ""
|
|
6999
|
+
}, onDataChange }) => {
|
|
7000
|
+
const handleInputChange = (field, newValue) => {
|
|
7001
|
+
const updatedData = { ...value, [field]: newValue };
|
|
6988
7002
|
onDataChange?.(updatedData);
|
|
6989
7003
|
};
|
|
6990
7004
|
const handleTypeChange = (type) => {
|
|
@@ -6996,7 +7010,7 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
6996
7010
|
EnhancedInput,
|
|
6997
7011
|
{
|
|
6998
7012
|
label: "Counterparty Name",
|
|
6999
|
-
value:
|
|
7013
|
+
value: value.name,
|
|
7000
7014
|
onChange: (e) => handleInputChange("name", e.target.value),
|
|
7001
7015
|
placeholder: "Enter counterparty name",
|
|
7002
7016
|
required: true
|
|
@@ -7012,7 +7026,7 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7012
7026
|
type: "radio",
|
|
7013
7027
|
name: "counterpartyType",
|
|
7014
7028
|
value: "business",
|
|
7015
|
-
checked:
|
|
7029
|
+
checked: value.type === "business",
|
|
7016
7030
|
onChange: () => handleTypeChange("business"),
|
|
7017
7031
|
className: "w-4 h-4 text-primary border-border focus:ring-primary focus:ring-2"
|
|
7018
7032
|
}
|
|
@@ -7026,7 +7040,7 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7026
7040
|
type: "radio",
|
|
7027
7041
|
name: "counterpartyType",
|
|
7028
7042
|
value: "individual",
|
|
7029
|
-
checked:
|
|
7043
|
+
checked: value.type === "individual",
|
|
7030
7044
|
onChange: () => handleTypeChange("individual"),
|
|
7031
7045
|
className: "w-4 h-4 text-primary border-border focus:ring-primary focus:ring-2"
|
|
7032
7046
|
}
|
|
@@ -7039,8 +7053,8 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7039
7053
|
EnhancedSelect,
|
|
7040
7054
|
{
|
|
7041
7055
|
label: "Associated with",
|
|
7042
|
-
value:
|
|
7043
|
-
onValueChange: (
|
|
7056
|
+
value: value.idType,
|
|
7057
|
+
onValueChange: (val) => handleInputChange("idType", val),
|
|
7044
7058
|
options: [
|
|
7045
7059
|
{ value: "product_id", label: "Product ID" },
|
|
7046
7060
|
{ value: "business_id", label: "Business ID" },
|
|
@@ -7052,10 +7066,10 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7052
7066
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7053
7067
|
EnhancedInput,
|
|
7054
7068
|
{
|
|
7055
|
-
label:
|
|
7056
|
-
value:
|
|
7069
|
+
label: value.idType === "product_id" ? "Product ID" : value.idType === "business_id" ? "Business ID" : value.idType === "individual_id" ? "Individual ID" : "Account Number",
|
|
7070
|
+
value: value.idValue,
|
|
7057
7071
|
onChange: (e) => handleInputChange("idValue", e.target.value),
|
|
7058
|
-
placeholder: `Enter ${
|
|
7072
|
+
placeholder: `Enter ${value.idType === "product_id" ? "product ID" : value.idType === "business_id" ? "business ID" : value.idType === "individual_id" ? "individual ID" : "account number"}`,
|
|
7059
7073
|
required: true
|
|
7060
7074
|
}
|
|
7061
7075
|
)
|
|
@@ -7066,7 +7080,7 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7066
7080
|
{
|
|
7067
7081
|
label: "Email",
|
|
7068
7082
|
type: "email",
|
|
7069
|
-
value:
|
|
7083
|
+
value: value.email,
|
|
7070
7084
|
onChange: (e) => handleInputChange("email", e.target.value),
|
|
7071
7085
|
placeholder: "Enter email address"
|
|
7072
7086
|
}
|
|
@@ -7076,7 +7090,7 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7076
7090
|
{
|
|
7077
7091
|
label: "Phone Number",
|
|
7078
7092
|
type: "tel",
|
|
7079
|
-
value:
|
|
7093
|
+
value: value.phone,
|
|
7080
7094
|
onChange: (e) => handleInputChange("phone", e.target.value),
|
|
7081
7095
|
placeholder: "Enter phone number"
|
|
7082
7096
|
}
|
|
@@ -7086,7 +7100,7 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7086
7100
|
{
|
|
7087
7101
|
label: "Date of Birth",
|
|
7088
7102
|
type: "date",
|
|
7089
|
-
value:
|
|
7103
|
+
value: value.dateOfBirth,
|
|
7090
7104
|
onChange: (e) => handleInputChange("dateOfBirth", e.target.value),
|
|
7091
7105
|
placeholder: "Select date of birth"
|
|
7092
7106
|
}
|
|
@@ -7095,7 +7109,7 @@ var CounterpartyBasicInfo = ({ onDataChange }) => {
|
|
|
7095
7109
|
EnhancedInput,
|
|
7096
7110
|
{
|
|
7097
7111
|
label: "ID Number",
|
|
7098
|
-
value:
|
|
7112
|
+
value: value.idNumber,
|
|
7099
7113
|
onChange: (e) => handleInputChange("idNumber", e.target.value),
|
|
7100
7114
|
placeholder: "Enter ID number"
|
|
7101
7115
|
}
|
|
@@ -8403,7 +8417,8 @@ var DetailPageLayout = ({
|
|
|
8403
8417
|
description,
|
|
8404
8418
|
cards,
|
|
8405
8419
|
actions,
|
|
8406
|
-
initialEditingState = {}
|
|
8420
|
+
initialEditingState = {},
|
|
8421
|
+
headerContent
|
|
8407
8422
|
}) => {
|
|
8408
8423
|
const [editingCards, setEditingCards] = React15.useState(
|
|
8409
8424
|
initialEditingState
|
|
@@ -8422,6 +8437,7 @@ var DetailPageLayout = ({
|
|
|
8422
8437
|
{
|
|
8423
8438
|
title,
|
|
8424
8439
|
description,
|
|
8440
|
+
headerContent,
|
|
8425
8441
|
actions: actions?.map((action) => ({
|
|
8426
8442
|
label: action.label,
|
|
8427
8443
|
variant: action.variant || "default",
|
|
@@ -11620,9 +11636,66 @@ var CounterpartyDetail = () => {
|
|
|
11620
11636
|
);
|
|
11621
11637
|
};
|
|
11622
11638
|
var CounterpartyDetail_default = CounterpartyDetail;
|
|
11639
|
+
var CreateCounterpartyView = ({
|
|
11640
|
+
counterpartyData,
|
|
11641
|
+
paymentMethods,
|
|
11642
|
+
onPaymentMethodsChange,
|
|
11643
|
+
onBasicInfoChange,
|
|
11644
|
+
onCancel,
|
|
11645
|
+
onSubmit
|
|
11646
|
+
}) => {
|
|
11647
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11648
|
+
PageLayout,
|
|
11649
|
+
{
|
|
11650
|
+
title: "Create Counterparty",
|
|
11651
|
+
description: "Create a new counterparty with all required information",
|
|
11652
|
+
actions: [
|
|
11653
|
+
{ label: "Cancel", variant: "outline", onClick: onCancel },
|
|
11654
|
+
{ label: "Create Counterparty", variant: "default", onClick: onSubmit }
|
|
11655
|
+
],
|
|
11656
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
11657
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
|
|
11658
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "Basic Information" }) }),
|
|
11659
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsx(CounterpartyBasicInfo, { value: counterpartyData, onDataChange: onBasicInfoChange }) })
|
|
11660
|
+
] }),
|
|
11661
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
|
|
11662
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(CardTitle, { children: [
|
|
11663
|
+
"Address",
|
|
11664
|
+
paymentMethods.some((m) => m.type === "wire") && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-1", children: "*" })
|
|
11665
|
+
] }) }),
|
|
11666
|
+
/* @__PURE__ */ jsxRuntime.jsxs(CardContent, { children: [
|
|
11667
|
+
paymentMethods.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-4", children: "Optional for ACH payments, required for wire transfers" }),
|
|
11668
|
+
paymentMethods.some((m) => m.type === "wire") && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-4", children: "Required because you have wire payment methods" }),
|
|
11669
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11670
|
+
AddressForm,
|
|
11671
|
+
{
|
|
11672
|
+
title: "",
|
|
11673
|
+
description: "",
|
|
11674
|
+
showApartment: true
|
|
11675
|
+
}
|
|
11676
|
+
)
|
|
11677
|
+
] })
|
|
11678
|
+
] }),
|
|
11679
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
|
|
11680
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "Payment Configuration" }) }),
|
|
11681
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsx(PaymentInformationSection, { onPaymentMethodsChange }) })
|
|
11682
|
+
] })
|
|
11683
|
+
] })
|
|
11684
|
+
}
|
|
11685
|
+
);
|
|
11686
|
+
};
|
|
11623
11687
|
var CreateCounterparty = () => {
|
|
11624
11688
|
const navigate = reactRouterDom.useNavigate();
|
|
11625
|
-
const [counterpartyData, setCounterpartyData] = React15.useState(
|
|
11689
|
+
const [counterpartyData, setCounterpartyData] = React15.useState({
|
|
11690
|
+
name: "",
|
|
11691
|
+
type: "business",
|
|
11692
|
+
email: "",
|
|
11693
|
+
phone: "",
|
|
11694
|
+
dateOfBirth: "",
|
|
11695
|
+
idNumber: "",
|
|
11696
|
+
idType: "product_id",
|
|
11697
|
+
idValue: ""
|
|
11698
|
+
});
|
|
11626
11699
|
const [paymentMethods, setPaymentMethods] = React15.useState([]);
|
|
11627
11700
|
const handlePaymentMethodsChange = (methods) => {
|
|
11628
11701
|
setPaymentMethods(methods);
|
|
@@ -11630,11 +11703,11 @@ var CreateCounterparty = () => {
|
|
|
11630
11703
|
const handleBasicInfoChange = (data) => {
|
|
11631
11704
|
setCounterpartyData(data);
|
|
11632
11705
|
};
|
|
11633
|
-
const counterpartyType = counterpartyData?.type || "";
|
|
11634
11706
|
const handleCancel = () => {
|
|
11635
11707
|
navigate("/counterparty");
|
|
11636
11708
|
};
|
|
11637
11709
|
const handleSubmit = () => {
|
|
11710
|
+
const counterpartyType = counterpartyData?.type || "";
|
|
11638
11711
|
if (!counterpartyType) {
|
|
11639
11712
|
toast({
|
|
11640
11713
|
title: "Error",
|
|
@@ -11667,42 +11740,14 @@ var CreateCounterparty = () => {
|
|
|
11667
11740
|
}, 1e3);
|
|
11668
11741
|
};
|
|
11669
11742
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11670
|
-
|
|
11743
|
+
CreateCounterpartyView,
|
|
11671
11744
|
{
|
|
11672
|
-
|
|
11673
|
-
|
|
11674
|
-
|
|
11675
|
-
|
|
11676
|
-
|
|
11677
|
-
|
|
11678
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
11679
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
|
|
11680
|
-
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "Basic Information" }) }),
|
|
11681
|
-
/* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsx(CounterpartyBasicInfo, { onDataChange: handleBasicInfoChange }) })
|
|
11682
|
-
] }),
|
|
11683
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
|
|
11684
|
-
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(CardTitle, { children: [
|
|
11685
|
-
"Address",
|
|
11686
|
-
paymentMethods.some((m) => m.type === "wire") && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-1", children: "*" })
|
|
11687
|
-
] }) }),
|
|
11688
|
-
/* @__PURE__ */ jsxRuntime.jsxs(CardContent, { children: [
|
|
11689
|
-
paymentMethods.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-4", children: "Optional for ACH payments, required for wire transfers" }),
|
|
11690
|
-
paymentMethods.some((m) => m.type === "wire") && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-4", children: "Required because you have wire payment methods" }),
|
|
11691
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11692
|
-
AddressForm,
|
|
11693
|
-
{
|
|
11694
|
-
title: "",
|
|
11695
|
-
description: "",
|
|
11696
|
-
showApartment: true
|
|
11697
|
-
}
|
|
11698
|
-
)
|
|
11699
|
-
] })
|
|
11700
|
-
] }),
|
|
11701
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Card, { children: [
|
|
11702
|
-
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { children: "Payment Configuration" }) }),
|
|
11703
|
-
/* @__PURE__ */ jsxRuntime.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntime.jsx(PaymentInformationSection, { onPaymentMethodsChange: handlePaymentMethodsChange }) })
|
|
11704
|
-
] })
|
|
11705
|
-
] })
|
|
11745
|
+
counterpartyData,
|
|
11746
|
+
paymentMethods,
|
|
11747
|
+
onPaymentMethodsChange: handlePaymentMethodsChange,
|
|
11748
|
+
onBasicInfoChange: handleBasicInfoChange,
|
|
11749
|
+
onCancel: handleCancel,
|
|
11750
|
+
onSubmit: handleSubmit
|
|
11706
11751
|
}
|
|
11707
11752
|
);
|
|
11708
11753
|
};
|
|
@@ -14253,7 +14298,7 @@ var TransactionDetail = () => {
|
|
|
14253
14298
|
/* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: () => navigate("/transactions/history"), children: "Back to Transaction History" })
|
|
14254
14299
|
] }) });
|
|
14255
14300
|
}
|
|
14256
|
-
const
|
|
14301
|
+
const getStatusVariant3 = (status) => {
|
|
14257
14302
|
switch (status) {
|
|
14258
14303
|
case "POSTED":
|
|
14259
14304
|
return "success";
|
|
@@ -14309,7 +14354,7 @@ var TransactionDetail = () => {
|
|
|
14309
14354
|
isInbound: transaction.isInbound
|
|
14310
14355
|
}
|
|
14311
14356
|
),
|
|
14312
|
-
/* @__PURE__ */ jsxRuntime.jsx(Badge, { variant:
|
|
14357
|
+
/* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: getStatusVariant3(transaction.status), children: transaction.status }),
|
|
14313
14358
|
/* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: getProcessingStatusVariant(transaction.processingStatus), children: transaction.processingStatus })
|
|
14314
14359
|
] }),
|
|
14315
14360
|
maxWidth: "full",
|
|
@@ -14408,22 +14453,22 @@ function UIKit() {
|
|
|
14408
14453
|
] })
|
|
14409
14454
|
] }) }) });
|
|
14410
14455
|
}
|
|
14411
|
-
function
|
|
14456
|
+
function VelocityLimitFiltersSheet({
|
|
14412
14457
|
filters,
|
|
14413
14458
|
onFilterChange,
|
|
14414
14459
|
onResetFilters
|
|
14415
14460
|
}) {
|
|
14416
|
-
const hasActiveFilters = filters.status !== "" || filters.
|
|
14461
|
+
const hasActiveFilters = filters.accountNumber !== "" || filters.counterpartyId !== "" || filters.productId !== "" || filters.programId !== "" || filters.limitName !== "" || filters.limitType !== "" || filters.status !== "" || filters.aggregationLevel !== "" || filters.action !== "" || filters.transactionType !== "" || filters.transactionGroup !== "";
|
|
14417
14462
|
return /* @__PURE__ */ jsxRuntime.jsxs(Sheet, { children: [
|
|
14418
14463
|
/* @__PURE__ */ jsxRuntime.jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "outline", children: [
|
|
14419
14464
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Filter, { className: "mr-2 h-4 w-4" }),
|
|
14420
14465
|
"Filters",
|
|
14421
|
-
hasActiveFilters && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2 flex h-5 w-5 items-center justify-center rounded-full bg-primary text-xs text-primary-foreground", children:
|
|
14466
|
+
hasActiveFilters && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2 flex h-5 w-5 items-center justify-center rounded-full bg-primary text-xs text-primary-foreground", children: Object.values(filters).filter((v) => v !== "").length })
|
|
14422
14467
|
] }) }),
|
|
14423
14468
|
/* @__PURE__ */ jsxRuntime.jsxs(SheetContent, { className: "w-full sm:max-w-md overflow-y-auto", children: [
|
|
14424
14469
|
/* @__PURE__ */ jsxRuntime.jsxs(SheetHeader, { children: [
|
|
14425
14470
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
14426
|
-
/* @__PURE__ */ jsxRuntime.jsx(SheetTitle, { children: "Filter
|
|
14471
|
+
/* @__PURE__ */ jsxRuntime.jsx(SheetTitle, { children: "Filter Velocity Limits" }),
|
|
14427
14472
|
hasActiveFilters && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14428
14473
|
Button,
|
|
14429
14474
|
{
|
|
@@ -14438,20 +14483,78 @@ function OFACFiltersSheet({
|
|
|
14438
14483
|
}
|
|
14439
14484
|
)
|
|
14440
14485
|
] }),
|
|
14441
|
-
/* @__PURE__ */ jsxRuntime.jsx(SheetDescription, { children: "Filter
|
|
14486
|
+
/* @__PURE__ */ jsxRuntime.jsx(SheetDescription, { children: "Filter velocity limits by account, limit details, and transaction settings" })
|
|
14442
14487
|
] }),
|
|
14443
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
14488
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4 mt-6", children: [
|
|
14489
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14490
|
+
EnhancedInput,
|
|
14491
|
+
{
|
|
14492
|
+
label: "Account Number",
|
|
14493
|
+
placeholder: "Enter account number",
|
|
14494
|
+
value: filters.accountNumber,
|
|
14495
|
+
onChange: (e) => onFilterChange("accountNumber", e.target.value)
|
|
14496
|
+
}
|
|
14497
|
+
),
|
|
14498
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14499
|
+
EnhancedInput,
|
|
14500
|
+
{
|
|
14501
|
+
label: "Counterparty ID",
|
|
14502
|
+
placeholder: "Enter counterparty ID",
|
|
14503
|
+
value: filters.counterpartyId,
|
|
14504
|
+
onChange: (e) => onFilterChange("counterpartyId", e.target.value)
|
|
14505
|
+
}
|
|
14506
|
+
),
|
|
14507
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14508
|
+
EnhancedInput,
|
|
14509
|
+
{
|
|
14510
|
+
label: "Product ID",
|
|
14511
|
+
placeholder: "Enter product ID",
|
|
14512
|
+
value: filters.productId,
|
|
14513
|
+
onChange: (e) => onFilterChange("productId", e.target.value)
|
|
14514
|
+
}
|
|
14515
|
+
),
|
|
14516
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14517
|
+
EnhancedInput,
|
|
14518
|
+
{
|
|
14519
|
+
label: "Program ID",
|
|
14520
|
+
placeholder: "Enter program ID",
|
|
14521
|
+
value: filters.programId,
|
|
14522
|
+
onChange: (e) => onFilterChange("programId", e.target.value)
|
|
14523
|
+
}
|
|
14524
|
+
),
|
|
14525
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14526
|
+
EnhancedInput,
|
|
14527
|
+
{
|
|
14528
|
+
label: "Limit Name",
|
|
14529
|
+
placeholder: "Enter limit name",
|
|
14530
|
+
value: filters.limitName,
|
|
14531
|
+
onChange: (e) => onFilterChange("limitName", e.target.value)
|
|
14532
|
+
}
|
|
14533
|
+
),
|
|
14534
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14535
|
+
EnhancedSelect,
|
|
14536
|
+
{
|
|
14537
|
+
label: "Limit Type",
|
|
14538
|
+
placeholder: "Select limit type",
|
|
14539
|
+
options: [
|
|
14540
|
+
{ value: "all", label: "All types" },
|
|
14541
|
+
{ value: "AMOUNT", label: "Amount" },
|
|
14542
|
+
{ value: "COUNT", label: "Count" }
|
|
14543
|
+
],
|
|
14544
|
+
value: filters.limitType || "all",
|
|
14545
|
+
onValueChange: (value) => onFilterChange("limitType", value === "all" ? "" : value)
|
|
14546
|
+
}
|
|
14547
|
+
),
|
|
14444
14548
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14445
14549
|
EnhancedSelect,
|
|
14446
14550
|
{
|
|
14447
14551
|
label: "Status",
|
|
14448
|
-
placeholder: "
|
|
14552
|
+
placeholder: "Select status",
|
|
14449
14553
|
options: [
|
|
14450
14554
|
{ value: "all", label: "All statuses" },
|
|
14451
|
-
{ value: "
|
|
14452
|
-
{ value: "
|
|
14453
|
-
{ value: "
|
|
14454
|
-
{ value: "CONFIRMED", label: "Confirmed" }
|
|
14555
|
+
{ value: "ACTIVE", label: "Active" },
|
|
14556
|
+
{ value: "INACTIVE", label: "Inactive" },
|
|
14557
|
+
{ value: "DELETED", label: "Deleted" }
|
|
14455
14558
|
],
|
|
14456
14559
|
value: filters.status || "all",
|
|
14457
14560
|
onValueChange: (value) => onFilterChange("status", value === "all" ? "" : value)
|
|
@@ -14460,180 +14563,246 @@ function OFACFiltersSheet({
|
|
|
14460
14563
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14461
14564
|
EnhancedSelect,
|
|
14462
14565
|
{
|
|
14463
|
-
label: "
|
|
14464
|
-
placeholder: "
|
|
14566
|
+
label: "Aggregation Level",
|
|
14567
|
+
placeholder: "Select aggregation level",
|
|
14465
14568
|
options: [
|
|
14466
|
-
{ value: "all", label: "All
|
|
14467
|
-
{ value: "
|
|
14468
|
-
{ value: "
|
|
14469
|
-
{ value: "
|
|
14569
|
+
{ value: "all", label: "All levels" },
|
|
14570
|
+
{ value: "ACCOUNT", label: "Account" },
|
|
14571
|
+
{ value: "PROGRAM", label: "Program" },
|
|
14572
|
+
{ value: "PRODUCT", label: "Product" }
|
|
14470
14573
|
],
|
|
14471
|
-
value: filters.
|
|
14472
|
-
onValueChange: (value) => onFilterChange("
|
|
14574
|
+
value: filters.aggregationLevel || "all",
|
|
14575
|
+
onValueChange: (value) => onFilterChange("aggregationLevel", value === "all" ? "" : value)
|
|
14473
14576
|
}
|
|
14474
14577
|
),
|
|
14475
14578
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14476
|
-
|
|
14579
|
+
EnhancedSelect,
|
|
14477
14580
|
{
|
|
14478
|
-
|
|
14479
|
-
|
|
14480
|
-
|
|
14481
|
-
|
|
14581
|
+
label: "Action",
|
|
14582
|
+
placeholder: "Select action",
|
|
14583
|
+
options: [
|
|
14584
|
+
{ value: "all", label: "All actions" },
|
|
14585
|
+
{ value: "DECLINE", label: "Decline" },
|
|
14586
|
+
{ value: "FLAG", label: "Flag" }
|
|
14587
|
+
],
|
|
14588
|
+
value: filters.action || "all",
|
|
14589
|
+
onValueChange: (value) => onFilterChange("action", value === "all" ? "" : value)
|
|
14482
14590
|
}
|
|
14483
14591
|
),
|
|
14484
14592
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14485
|
-
|
|
14593
|
+
EnhancedSelect,
|
|
14486
14594
|
{
|
|
14487
|
-
|
|
14488
|
-
|
|
14489
|
-
|
|
14490
|
-
|
|
14491
|
-
|
|
14595
|
+
label: "Transaction Type",
|
|
14596
|
+
placeholder: "Select transaction type",
|
|
14597
|
+
options: [
|
|
14598
|
+
{ value: "all", label: "All types" },
|
|
14599
|
+
{ value: "WIRE", label: "Wire" },
|
|
14600
|
+
{ value: "ACH", label: "ACH" },
|
|
14601
|
+
{ value: "CARD", label: "Card" }
|
|
14602
|
+
],
|
|
14603
|
+
value: filters.transactionType || "all",
|
|
14604
|
+
onValueChange: (value) => onFilterChange("transactionType", value === "all" ? "" : value)
|
|
14492
14605
|
}
|
|
14493
|
-
)
|
|
14606
|
+
),
|
|
14607
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
14608
|
+
EnhancedSelect,
|
|
14609
|
+
{
|
|
14610
|
+
label: "Transaction Group",
|
|
14611
|
+
placeholder: "Select transaction group",
|
|
14612
|
+
options: [
|
|
14613
|
+
{ value: "all", label: "All groups" },
|
|
14614
|
+
{ value: "INBOUND", label: "Inbound" },
|
|
14615
|
+
{ value: "OUTBOUND", label: "Outbound" }
|
|
14616
|
+
],
|
|
14617
|
+
value: filters.transactionGroup || "all",
|
|
14618
|
+
onValueChange: (value) => onFilterChange("transactionGroup", value === "all" ? "" : value)
|
|
14619
|
+
}
|
|
14620
|
+
) })
|
|
14494
14621
|
] })
|
|
14495
14622
|
] })
|
|
14496
14623
|
] });
|
|
14497
14624
|
}
|
|
14498
14625
|
|
|
14499
|
-
// src/lib/mock-data/
|
|
14500
|
-
var
|
|
14501
|
-
{
|
|
14502
|
-
id: "
|
|
14503
|
-
created: "
|
|
14504
|
-
|
|
14505
|
-
|
|
14506
|
-
|
|
14507
|
-
|
|
14508
|
-
|
|
14509
|
-
|
|
14510
|
-
|
|
14511
|
-
|
|
14512
|
-
|
|
14513
|
-
|
|
14514
|
-
|
|
14515
|
-
|
|
14516
|
-
|
|
14517
|
-
|
|
14518
|
-
|
|
14519
|
-
|
|
14520
|
-
|
|
14521
|
-
|
|
14522
|
-
|
|
14523
|
-
|
|
14524
|
-
|
|
14525
|
-
|
|
14526
|
-
|
|
14527
|
-
|
|
14528
|
-
|
|
14529
|
-
|
|
14530
|
-
|
|
14531
|
-
|
|
14532
|
-
|
|
14533
|
-
|
|
14534
|
-
|
|
14535
|
-
|
|
14536
|
-
|
|
14537
|
-
|
|
14538
|
-
|
|
14539
|
-
|
|
14540
|
-
|
|
14541
|
-
|
|
14542
|
-
|
|
14543
|
-
|
|
14544
|
-
|
|
14545
|
-
|
|
14546
|
-
|
|
14547
|
-
|
|
14548
|
-
|
|
14549
|
-
|
|
14550
|
-
|
|
14551
|
-
|
|
14552
|
-
|
|
14553
|
-
|
|
14554
|
-
|
|
14555
|
-
|
|
14556
|
-
|
|
14557
|
-
|
|
14558
|
-
|
|
14559
|
-
|
|
14560
|
-
|
|
14561
|
-
|
|
14562
|
-
|
|
14563
|
-
|
|
14564
|
-
|
|
14565
|
-
|
|
14566
|
-
|
|
14567
|
-
|
|
14568
|
-
|
|
14569
|
-
entityType: "
|
|
14570
|
-
|
|
14571
|
-
|
|
14572
|
-
|
|
14573
|
-
|
|
14574
|
-
|
|
14575
|
-
|
|
14576
|
-
|
|
14577
|
-
|
|
14578
|
-
|
|
14579
|
-
|
|
14580
|
-
|
|
14581
|
-
|
|
14582
|
-
|
|
14583
|
-
|
|
14584
|
-
|
|
14585
|
-
|
|
14586
|
-
|
|
14587
|
-
|
|
14588
|
-
|
|
14589
|
-
|
|
14626
|
+
// src/lib/mock-data/velocity-limit-data.ts
|
|
14627
|
+
var mockVelocityLimits = [
|
|
14628
|
+
{
|
|
14629
|
+
id: "1",
|
|
14630
|
+
created: "2025-11-13T10:00:00Z",
|
|
14631
|
+
limitName: "QA - Decline inbound wire",
|
|
14632
|
+
limitType: "transaction",
|
|
14633
|
+
action: "DECLINE",
|
|
14634
|
+
status: "ACTIVE",
|
|
14635
|
+
associatedEntity: "Account",
|
|
14636
|
+
associatedEntityId: "9539334834",
|
|
14637
|
+
transactionGroup: ["inbound"],
|
|
14638
|
+
transactionType: ["wire"],
|
|
14639
|
+
aggregationLevel: "account",
|
|
14640
|
+
timePeriod: "daily",
|
|
14641
|
+
maxAmount: "50000",
|
|
14642
|
+
maxCount: "10"
|
|
14643
|
+
},
|
|
14644
|
+
{
|
|
14645
|
+
id: "2",
|
|
14646
|
+
created: "2025-11-13T10:00:00Z",
|
|
14647
|
+
limitName: "QA - Decline inbound wire",
|
|
14648
|
+
limitType: "transaction",
|
|
14649
|
+
action: "DECLINE",
|
|
14650
|
+
status: "ACTIVE",
|
|
14651
|
+
associatedEntity: "Account",
|
|
14652
|
+
associatedEntityId: "8895578481",
|
|
14653
|
+
transactionType: ["wire"],
|
|
14654
|
+
aggregationLevel: "account",
|
|
14655
|
+
timePeriod: "daily",
|
|
14656
|
+
maxAmount: "100000",
|
|
14657
|
+
maxCount: "20"
|
|
14658
|
+
},
|
|
14659
|
+
{
|
|
14660
|
+
id: "3",
|
|
14661
|
+
created: "2025-11-13T10:00:00Z",
|
|
14662
|
+
limitName: "QA - Decline inbound wire",
|
|
14663
|
+
limitType: "transaction",
|
|
14664
|
+
action: "DECLINE",
|
|
14665
|
+
status: "ACTIVE",
|
|
14666
|
+
associatedEntity: "Account",
|
|
14667
|
+
associatedEntityId: "86046257",
|
|
14668
|
+
transactionType: ["wire"],
|
|
14669
|
+
aggregationLevel: "transaction",
|
|
14670
|
+
maxAmount: "25000"
|
|
14671
|
+
},
|
|
14672
|
+
{
|
|
14673
|
+
id: "4",
|
|
14674
|
+
created: "2025-11-13T10:00:00Z",
|
|
14675
|
+
limitName: "QA - Decline inbound wire",
|
|
14676
|
+
limitType: "transaction",
|
|
14677
|
+
action: "DECLINE",
|
|
14678
|
+
status: "ACTIVE",
|
|
14679
|
+
associatedEntity: "Account",
|
|
14680
|
+
associatedEntityId: "86046257",
|
|
14681
|
+
transactionType: ["ACH_RECEIVER_CREDIT", "ACH_ORIGINATOR_CREDIT", "WIRE_INBOUND", "WIRE_OUTBOUND", "CARD_TRANSACTION"],
|
|
14682
|
+
aggregationLevel: "account",
|
|
14683
|
+
timePeriod: "monthly",
|
|
14684
|
+
maxAmount: "500000",
|
|
14685
|
+
maxCount: "50"
|
|
14686
|
+
},
|
|
14687
|
+
{
|
|
14688
|
+
id: "5",
|
|
14689
|
+
created: "2025-10-23T10:00:00Z",
|
|
14690
|
+
limitName: "prohibited country list v2",
|
|
14691
|
+
limitType: "prohibited_entity",
|
|
14692
|
+
action: "DECLINE",
|
|
14693
|
+
status: "DELETED",
|
|
14694
|
+
associatedEntity: "Global",
|
|
14695
|
+
entityListName: "OFAC Sanctioned Countries",
|
|
14696
|
+
entityType: "country",
|
|
14697
|
+
prohibitedEntities: "Iran, North Korea, Syria, Cuba"
|
|
14698
|
+
},
|
|
14699
|
+
{
|
|
14700
|
+
id: "6",
|
|
14701
|
+
created: "2025-10-16T10:00:00Z",
|
|
14702
|
+
limitName: "global wire debit limit",
|
|
14703
|
+
limitType: "transaction",
|
|
14704
|
+
action: "DECLINE",
|
|
14705
|
+
status: "INACTIVE",
|
|
14706
|
+
associatedEntity: "Global",
|
|
14707
|
+
transactionType: ["wire"],
|
|
14708
|
+
aggregationLevel: "program",
|
|
14709
|
+
timePeriod: "daily",
|
|
14710
|
+
maxAmount: "1000000",
|
|
14711
|
+
maxCount: "100"
|
|
14712
|
+
},
|
|
14713
|
+
{
|
|
14714
|
+
id: "7",
|
|
14715
|
+
created: "2025-10-16T10:00:00Z",
|
|
14716
|
+
limitName: "global wire debit limit",
|
|
14717
|
+
limitType: "transaction",
|
|
14718
|
+
action: "DECLINE",
|
|
14719
|
+
status: "ACTIVE",
|
|
14720
|
+
associatedEntity: "Global",
|
|
14721
|
+
transactionType: ["wire"],
|
|
14722
|
+
aggregationLevel: "program",
|
|
14723
|
+
timePeriod: "daily",
|
|
14724
|
+
maxAmount: "1000000",
|
|
14725
|
+
maxCount: "100"
|
|
14726
|
+
},
|
|
14727
|
+
{
|
|
14728
|
+
id: "8",
|
|
14729
|
+
created: "2025-09-04T10:00:00Z",
|
|
14730
|
+
limitName: "wire_ach_rounded_amt",
|
|
14731
|
+
limitType: "round_number",
|
|
14732
|
+
action: "FLAG",
|
|
14733
|
+
status: "ACTIVE",
|
|
14734
|
+
associatedEntity: "Program",
|
|
14735
|
+
associatedEntityId: "167989",
|
|
14736
|
+
amountThreshold: "10000",
|
|
14737
|
+
roundPattern: "1000, 5000, 10000, 50000"
|
|
14738
|
+
},
|
|
14739
|
+
{
|
|
14740
|
+
id: "9",
|
|
14741
|
+
created: "2025-08-20T10:00:00Z",
|
|
14742
|
+
limitName: "receiver name validation",
|
|
14743
|
+
limitType: "receiver_name_mismatch",
|
|
14744
|
+
action: "FLAG",
|
|
14745
|
+
status: "ACTIVE",
|
|
14746
|
+
associatedEntity: "Global",
|
|
14747
|
+
mismatchThreshold: "80",
|
|
14748
|
+
comparisonMethod: "fuzzy"
|
|
14590
14749
|
}
|
|
14591
14750
|
];
|
|
14592
14751
|
var getStatusVariant = (status) => {
|
|
14593
14752
|
switch (status) {
|
|
14594
|
-
case "
|
|
14753
|
+
case "ACTIVE":
|
|
14595
14754
|
return "success";
|
|
14596
|
-
case "
|
|
14755
|
+
case "INACTIVE":
|
|
14597
14756
|
return "warning";
|
|
14598
|
-
case "
|
|
14599
|
-
return "active";
|
|
14600
|
-
case "CONFIRMED":
|
|
14757
|
+
case "DELETED":
|
|
14601
14758
|
return "destructive";
|
|
14602
14759
|
default:
|
|
14603
14760
|
return "secondary";
|
|
14604
14761
|
}
|
|
14605
14762
|
};
|
|
14606
|
-
var
|
|
14607
|
-
switch (
|
|
14608
|
-
case "
|
|
14609
|
-
return
|
|
14610
|
-
case "
|
|
14611
|
-
return
|
|
14612
|
-
case "Counterparty":
|
|
14613
|
-
return `/counterparty/${entityId}`;
|
|
14763
|
+
var getActionVariant = (action) => {
|
|
14764
|
+
switch (action) {
|
|
14765
|
+
case "DECLINE":
|
|
14766
|
+
return "destructive";
|
|
14767
|
+
case "FLAG":
|
|
14768
|
+
return "warning";
|
|
14614
14769
|
default:
|
|
14615
|
-
return "
|
|
14770
|
+
return "secondary";
|
|
14616
14771
|
}
|
|
14617
14772
|
};
|
|
14618
|
-
function
|
|
14773
|
+
function VelocityLimits() {
|
|
14619
14774
|
const navigate = reactRouterDom.useNavigate();
|
|
14620
14775
|
const [sortField, setSortField] = React15.useState("created");
|
|
14621
14776
|
const [sortDirection, setSortDirection] = React15.useState("desc");
|
|
14622
14777
|
const [filters, setFilters] = React15.useState({
|
|
14778
|
+
accountNumber: "",
|
|
14779
|
+
counterpartyId: "",
|
|
14780
|
+
productId: "",
|
|
14781
|
+
programId: "",
|
|
14782
|
+
limitName: "",
|
|
14783
|
+
limitType: "",
|
|
14623
14784
|
status: "",
|
|
14624
|
-
|
|
14625
|
-
|
|
14626
|
-
|
|
14785
|
+
aggregationLevel: "",
|
|
14786
|
+
action: "",
|
|
14787
|
+
transactionType: "",
|
|
14788
|
+
transactionGroup: ""
|
|
14627
14789
|
});
|
|
14628
14790
|
const handleFilterChange = (field, value) => {
|
|
14629
14791
|
setFilters((prev) => ({ ...prev, [field]: value }));
|
|
14630
14792
|
};
|
|
14631
14793
|
const handleResetFilters = () => {
|
|
14632
14794
|
setFilters({
|
|
14795
|
+
accountNumber: "",
|
|
14796
|
+
counterpartyId: "",
|
|
14797
|
+
productId: "",
|
|
14798
|
+
programId: "",
|
|
14799
|
+
limitName: "",
|
|
14800
|
+
limitType: "",
|
|
14633
14801
|
status: "",
|
|
14634
|
-
|
|
14635
|
-
|
|
14636
|
-
|
|
14802
|
+
aggregationLevel: "",
|
|
14803
|
+
action: "",
|
|
14804
|
+
transactionType: "",
|
|
14805
|
+
transactionGroup: ""
|
|
14637
14806
|
});
|
|
14638
14807
|
};
|
|
14639
14808
|
const handleSort = (field) => {
|
|
@@ -14644,27 +14813,24 @@ function OFAC() {
|
|
|
14644
14813
|
setSortDirection("desc");
|
|
14645
14814
|
}
|
|
14646
14815
|
};
|
|
14647
|
-
const
|
|
14648
|
-
return
|
|
14649
|
-
if (filters.
|
|
14816
|
+
const filteredLimits = React15.useMemo(() => {
|
|
14817
|
+
return mockVelocityLimits.filter((limit) => {
|
|
14818
|
+
if (filters.accountNumber && limit.associatedEntityId && !limit.associatedEntityId.includes(filters.accountNumber)) {
|
|
14650
14819
|
return false;
|
|
14651
14820
|
}
|
|
14652
|
-
if (filters.
|
|
14821
|
+
if (filters.limitName && !limit.limitName.toLowerCase().includes(filters.limitName.toLowerCase())) {
|
|
14653
14822
|
return false;
|
|
14654
14823
|
}
|
|
14655
|
-
if (filters.
|
|
14656
|
-
|
|
14657
|
-
|
|
14658
|
-
|
|
14659
|
-
|
|
14660
|
-
if (filters.endDate && dateFns.isAfter(checkDate, dateFns.endOfDay(filters.endDate))) {
|
|
14661
|
-
return false;
|
|
14662
|
-
}
|
|
14824
|
+
if (filters.action && limit.action !== filters.action) {
|
|
14825
|
+
return false;
|
|
14826
|
+
}
|
|
14827
|
+
if (filters.status && limit.status !== filters.status) {
|
|
14828
|
+
return false;
|
|
14663
14829
|
}
|
|
14664
14830
|
return true;
|
|
14665
14831
|
});
|
|
14666
14832
|
}, [filters]);
|
|
14667
|
-
const
|
|
14833
|
+
const sortedLimits = [...filteredLimits].sort((a, b) => {
|
|
14668
14834
|
const aValue = a[sortField];
|
|
14669
14835
|
const bValue = b[sortField];
|
|
14670
14836
|
if (aValue == null) return 1;
|
|
@@ -14680,69 +14846,1471 @@ function OFAC() {
|
|
|
14680
14846
|
key: "created",
|
|
14681
14847
|
title: "Created",
|
|
14682
14848
|
sortable: true,
|
|
14683
|
-
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm
|
|
14684
|
-
},
|
|
14685
|
-
{
|
|
14686
|
-
key: "entityName",
|
|
14687
|
-
title: "Entity",
|
|
14688
|
-
render: (value, row) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
14689
|
-
"button",
|
|
14690
|
-
{
|
|
14691
|
-
onClick: () => navigate(getEntityUrl(row.entityType, row.entityId)),
|
|
14692
|
-
className: "text-sm text-primary hover:underline font-medium",
|
|
14693
|
-
children: value
|
|
14694
|
-
}
|
|
14695
|
-
)
|
|
14849
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: dateFns.format(dateFns.parseISO(value), "yyyy-MM-dd") })
|
|
14696
14850
|
},
|
|
14697
14851
|
{
|
|
14698
|
-
key: "
|
|
14699
|
-
title: "
|
|
14852
|
+
key: "limitName",
|
|
14853
|
+
title: "Limit Name",
|
|
14700
14854
|
sortable: true,
|
|
14701
|
-
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value })
|
|
14855
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: value })
|
|
14702
14856
|
},
|
|
14703
14857
|
{
|
|
14704
|
-
key: "
|
|
14705
|
-
title: "
|
|
14706
|
-
|
|
14707
|
-
|
|
14708
|
-
{
|
|
14709
|
-
onClick: () => navigate(`/alerts/${value}`),
|
|
14710
|
-
className: "text-sm text-primary hover:underline font-medium",
|
|
14711
|
-
children: value
|
|
14712
|
-
}
|
|
14713
|
-
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: "\u2014" })
|
|
14858
|
+
key: "action",
|
|
14859
|
+
title: "Action",
|
|
14860
|
+
sortable: true,
|
|
14861
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: getActionVariant(value), children: value })
|
|
14714
14862
|
},
|
|
14715
14863
|
{
|
|
14716
14864
|
key: "status",
|
|
14717
14865
|
title: "Status",
|
|
14718
14866
|
sortable: true,
|
|
14719
14867
|
render: (value) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: getStatusVariant(value), children: value })
|
|
14868
|
+
},
|
|
14869
|
+
{
|
|
14870
|
+
key: "associatedEntity",
|
|
14871
|
+
title: "Associated Entity",
|
|
14872
|
+
sortable: true,
|
|
14873
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value })
|
|
14874
|
+
},
|
|
14875
|
+
{
|
|
14876
|
+
key: "associatedEntityId",
|
|
14877
|
+
title: "Associated Entity ID",
|
|
14878
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value || "\u2014" })
|
|
14720
14879
|
}
|
|
14721
14880
|
];
|
|
14722
14881
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-screen bg-gradient-subtle", children: [
|
|
14723
14882
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-none border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 py-6 max-w-none", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
14724
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold text-foreground", children: "
|
|
14725
|
-
/* @__PURE__ */ jsxRuntime.
|
|
14726
|
-
|
|
14727
|
-
|
|
14728
|
-
|
|
14729
|
-
|
|
14730
|
-
|
|
14731
|
-
|
|
14732
|
-
|
|
14883
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold text-foreground", children: "Velocity Limits" }) }),
|
|
14884
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
14885
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14886
|
+
VelocityLimitFiltersSheet,
|
|
14887
|
+
{
|
|
14888
|
+
filters,
|
|
14889
|
+
onFilterChange: handleFilterChange,
|
|
14890
|
+
onResetFilters: handleResetFilters
|
|
14891
|
+
}
|
|
14892
|
+
),
|
|
14893
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Button, { onClick: () => navigate("/compliance/velocity/create"), children: [
|
|
14894
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-2 h-4 w-4" }),
|
|
14895
|
+
"Create Limit"
|
|
14896
|
+
] })
|
|
14897
|
+
] })
|
|
14733
14898
|
] }) }) }),
|
|
14734
14899
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 h-full max-w-none flex flex-col", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 mt-4 overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
14735
14900
|
DataTable,
|
|
14736
14901
|
{
|
|
14737
14902
|
columns: columns3,
|
|
14738
|
-
data:
|
|
14903
|
+
data: sortedLimits,
|
|
14739
14904
|
sortBy: sortField,
|
|
14740
14905
|
sortDirection,
|
|
14741
|
-
onSort: handleSort
|
|
14906
|
+
onSort: handleSort,
|
|
14907
|
+
onRowClick: (limit) => navigate(`/compliance/velocity/${limit.id}`),
|
|
14908
|
+
pagination: {
|
|
14909
|
+
pageSize: 10,
|
|
14910
|
+
currentPage: 1,
|
|
14911
|
+
totalItems: sortedLimits.length,
|
|
14912
|
+
onPageChange: () => {
|
|
14913
|
+
}
|
|
14914
|
+
}
|
|
14742
14915
|
}
|
|
14743
14916
|
) }) }) })
|
|
14744
14917
|
] });
|
|
14745
14918
|
}
|
|
14919
|
+
function CreateVelocityLimit() {
|
|
14920
|
+
const navigate = reactRouterDom.useNavigate();
|
|
14921
|
+
const [limitType, setLimitType] = React15.useState("");
|
|
14922
|
+
const [formData, setFormData] = React15.useState({
|
|
14923
|
+
limitName: "",
|
|
14924
|
+
action: "",
|
|
14925
|
+
associatedEntityType: "",
|
|
14926
|
+
associatedEntityId: "",
|
|
14927
|
+
transactionFilterType: "",
|
|
14928
|
+
// "type" or "group"
|
|
14929
|
+
transactionType: "",
|
|
14930
|
+
transactionGroup: "",
|
|
14931
|
+
aggregationLevel: ""
|
|
14932
|
+
// Type-specific fields will be added based on limitType
|
|
14933
|
+
});
|
|
14934
|
+
const handleFieldChange = (field, value) => {
|
|
14935
|
+
setFormData((prev) => ({ ...prev, [field]: value }));
|
|
14936
|
+
};
|
|
14937
|
+
const handleSubmit = (e) => {
|
|
14938
|
+
e.preventDefault();
|
|
14939
|
+
console.log("Creating velocity limit:", { limitType, ...formData });
|
|
14940
|
+
navigate("/compliance/velocity");
|
|
14941
|
+
};
|
|
14942
|
+
const renderTypeSpecificFields = () => {
|
|
14943
|
+
switch (limitType) {
|
|
14944
|
+
case "receiver_name_mismatch":
|
|
14945
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
14946
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14947
|
+
EnhancedInput,
|
|
14948
|
+
{
|
|
14949
|
+
label: "Mismatch Threshold (%)",
|
|
14950
|
+
placeholder: "Enter threshold percentage",
|
|
14951
|
+
onChange: (e) => handleFieldChange("mismatchThreshold", e.target.value)
|
|
14952
|
+
}
|
|
14953
|
+
),
|
|
14954
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14955
|
+
EnhancedSelect,
|
|
14956
|
+
{
|
|
14957
|
+
label: "Comparison Method",
|
|
14958
|
+
placeholder: "Select method",
|
|
14959
|
+
options: [
|
|
14960
|
+
{ value: "exact", label: "Exact Match" },
|
|
14961
|
+
{ value: "fuzzy", label: "Fuzzy Match" },
|
|
14962
|
+
{ value: "partial", label: "Partial Match" }
|
|
14963
|
+
],
|
|
14964
|
+
onValueChange: (value) => handleFieldChange("comparisonMethod", value)
|
|
14965
|
+
}
|
|
14966
|
+
)
|
|
14967
|
+
] }) });
|
|
14968
|
+
case "round_number":
|
|
14969
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
14970
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14971
|
+
EnhancedInput,
|
|
14972
|
+
{
|
|
14973
|
+
label: "Amount Threshold",
|
|
14974
|
+
placeholder: "Enter amount",
|
|
14975
|
+
onChange: (e) => handleFieldChange("amountThreshold", e.target.value)
|
|
14976
|
+
}
|
|
14977
|
+
),
|
|
14978
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14979
|
+
EnhancedInput,
|
|
14980
|
+
{
|
|
14981
|
+
label: "Round Number Pattern",
|
|
14982
|
+
placeholder: "e.g., 1000, 5000, 10000",
|
|
14983
|
+
onChange: (e) => handleFieldChange("roundPattern", e.target.value)
|
|
14984
|
+
}
|
|
14985
|
+
)
|
|
14986
|
+
] }) });
|
|
14987
|
+
case "transaction":
|
|
14988
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
14989
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6", children: [
|
|
14990
|
+
/* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium text-foreground mb-3 block", children: "Filter By" }),
|
|
14991
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-6", children: [
|
|
14992
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-6", children: [
|
|
14993
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
14994
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14995
|
+
"input",
|
|
14996
|
+
{
|
|
14997
|
+
type: "radio",
|
|
14998
|
+
name: "transactionFilterType",
|
|
14999
|
+
value: "type",
|
|
15000
|
+
checked: formData.transactionFilterType === "type",
|
|
15001
|
+
onChange: (e) => {
|
|
15002
|
+
handleFieldChange("transactionFilterType", e.target.value);
|
|
15003
|
+
handleFieldChange("transactionGroup", "");
|
|
15004
|
+
},
|
|
15005
|
+
className: "w-4 h-4 text-primary border-border focus:ring-2 focus:ring-primary"
|
|
15006
|
+
}
|
|
15007
|
+
),
|
|
15008
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: "Transaction Type" })
|
|
15009
|
+
] }),
|
|
15010
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
15011
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15012
|
+
"input",
|
|
15013
|
+
{
|
|
15014
|
+
type: "radio",
|
|
15015
|
+
name: "transactionFilterType",
|
|
15016
|
+
value: "group",
|
|
15017
|
+
checked: formData.transactionFilterType === "group",
|
|
15018
|
+
onChange: (e) => {
|
|
15019
|
+
handleFieldChange("transactionFilterType", e.target.value);
|
|
15020
|
+
handleFieldChange("transactionType", "");
|
|
15021
|
+
},
|
|
15022
|
+
className: "w-4 h-4 text-primary border-border focus:ring-2 focus:ring-primary"
|
|
15023
|
+
}
|
|
15024
|
+
),
|
|
15025
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: "Transaction Group" })
|
|
15026
|
+
] })
|
|
15027
|
+
] }),
|
|
15028
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
|
|
15029
|
+
formData.transactionFilterType === "type" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15030
|
+
EnhancedSelect,
|
|
15031
|
+
{
|
|
15032
|
+
label: "",
|
|
15033
|
+
placeholder: "Select type",
|
|
15034
|
+
options: [
|
|
15035
|
+
{ value: "wire", label: "Wire" },
|
|
15036
|
+
{ value: "ach", label: "ACH" },
|
|
15037
|
+
{ value: "card", label: "Card" }
|
|
15038
|
+
],
|
|
15039
|
+
value: formData.transactionType,
|
|
15040
|
+
onValueChange: (value) => handleFieldChange("transactionType", value)
|
|
15041
|
+
}
|
|
15042
|
+
),
|
|
15043
|
+
formData.transactionFilterType === "group" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15044
|
+
EnhancedSelect,
|
|
15045
|
+
{
|
|
15046
|
+
label: "",
|
|
15047
|
+
placeholder: "Select group",
|
|
15048
|
+
options: [
|
|
15049
|
+
{ value: "inbound", label: "Inbound" },
|
|
15050
|
+
{ value: "outbound", label: "Outbound" }
|
|
15051
|
+
],
|
|
15052
|
+
value: formData.transactionGroup,
|
|
15053
|
+
onValueChange: (value) => handleFieldChange("transactionGroup", value)
|
|
15054
|
+
}
|
|
15055
|
+
)
|
|
15056
|
+
] })
|
|
15057
|
+
] })
|
|
15058
|
+
] }),
|
|
15059
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15060
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15061
|
+
EnhancedSelect,
|
|
15062
|
+
{
|
|
15063
|
+
label: "Aggregation Level",
|
|
15064
|
+
placeholder: "Select level",
|
|
15065
|
+
options: [
|
|
15066
|
+
{ value: "transaction", label: "Transaction" },
|
|
15067
|
+
{ value: "account", label: "Account" },
|
|
15068
|
+
{ value: "program", label: "Program" },
|
|
15069
|
+
{ value: "product", label: "Product" }
|
|
15070
|
+
],
|
|
15071
|
+
onValueChange: (value) => handleFieldChange("aggregationLevel", value)
|
|
15072
|
+
}
|
|
15073
|
+
),
|
|
15074
|
+
formData.aggregationLevel !== "transaction" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15075
|
+
EnhancedSelect,
|
|
15076
|
+
{
|
|
15077
|
+
label: "Time Period",
|
|
15078
|
+
placeholder: "Select period",
|
|
15079
|
+
options: [
|
|
15080
|
+
{ value: "daily", label: "Daily" },
|
|
15081
|
+
{ value: "weekly", label: "Weekly" },
|
|
15082
|
+
{ value: "monthly", label: "Monthly" }
|
|
15083
|
+
],
|
|
15084
|
+
onValueChange: (value) => handleFieldChange("timePeriod", value)
|
|
15085
|
+
}
|
|
15086
|
+
),
|
|
15087
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15088
|
+
EnhancedInput,
|
|
15089
|
+
{
|
|
15090
|
+
label: "Max Transaction Amount",
|
|
15091
|
+
placeholder: "Enter amount",
|
|
15092
|
+
onChange: (e) => handleFieldChange("maxAmount", e.target.value)
|
|
15093
|
+
}
|
|
15094
|
+
),
|
|
15095
|
+
formData.aggregationLevel !== "transaction" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15096
|
+
EnhancedInput,
|
|
15097
|
+
{
|
|
15098
|
+
label: "Max Transaction Count",
|
|
15099
|
+
placeholder: "Enter count",
|
|
15100
|
+
onChange: (e) => handleFieldChange("maxCount", e.target.value)
|
|
15101
|
+
}
|
|
15102
|
+
)
|
|
15103
|
+
] })
|
|
15104
|
+
] });
|
|
15105
|
+
case "prohibited_entity":
|
|
15106
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15107
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15108
|
+
EnhancedInput,
|
|
15109
|
+
{
|
|
15110
|
+
label: "Entity List Name",
|
|
15111
|
+
placeholder: "Enter list name",
|
|
15112
|
+
onChange: (e) => handleFieldChange("entityListName", e.target.value)
|
|
15113
|
+
}
|
|
15114
|
+
),
|
|
15115
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15116
|
+
EnhancedSelect,
|
|
15117
|
+
{
|
|
15118
|
+
label: "Entity Type",
|
|
15119
|
+
placeholder: "Select type",
|
|
15120
|
+
options: [
|
|
15121
|
+
{ value: "country", label: "Country" },
|
|
15122
|
+
{ value: "individual", label: "Individual" },
|
|
15123
|
+
{ value: "business", label: "Business" }
|
|
15124
|
+
],
|
|
15125
|
+
onValueChange: (value) => handleFieldChange("entityType", value)
|
|
15126
|
+
}
|
|
15127
|
+
),
|
|
15128
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15129
|
+
EnhancedInput,
|
|
15130
|
+
{
|
|
15131
|
+
label: "Prohibited Entities (comma-separated)",
|
|
15132
|
+
placeholder: "Enter entities",
|
|
15133
|
+
onChange: (e) => handleFieldChange("prohibitedEntities", e.target.value)
|
|
15134
|
+
}
|
|
15135
|
+
) })
|
|
15136
|
+
] }) });
|
|
15137
|
+
default:
|
|
15138
|
+
return null;
|
|
15139
|
+
}
|
|
15140
|
+
};
|
|
15141
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-screen bg-gradient-subtle", children: [
|
|
15142
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-none border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 py-6 max-w-none", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
|
|
15143
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
15144
|
+
Button,
|
|
15145
|
+
{
|
|
15146
|
+
variant: "ghost",
|
|
15147
|
+
size: "sm",
|
|
15148
|
+
onClick: () => navigate("/compliance/velocity"),
|
|
15149
|
+
children: [
|
|
15150
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeft, { className: "mr-2 h-4 w-4" }),
|
|
15151
|
+
"Back"
|
|
15152
|
+
]
|
|
15153
|
+
}
|
|
15154
|
+
),
|
|
15155
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold text-foreground", children: "Create Velocity Limit" }) })
|
|
15156
|
+
] }) }) }),
|
|
15157
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 py-6 max-w-4xl", children: /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxRuntime.jsx(Card, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
15158
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15159
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-lg font-semibold mb-4", children: "Select Limit Type" }),
|
|
15160
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15161
|
+
EnhancedSelect,
|
|
15162
|
+
{
|
|
15163
|
+
label: "Limit Type",
|
|
15164
|
+
placeholder: "Select a limit type",
|
|
15165
|
+
options: [
|
|
15166
|
+
{ value: "receiver_name_mismatch", label: "Receiver Name Mismatch" },
|
|
15167
|
+
{ value: "round_number", label: "Round Number" },
|
|
15168
|
+
{ value: "transaction", label: "Transaction" },
|
|
15169
|
+
{ value: "prohibited_entity", label: "Prohibited Entity" }
|
|
15170
|
+
],
|
|
15171
|
+
value: limitType,
|
|
15172
|
+
onValueChange: (value) => setLimitType(value)
|
|
15173
|
+
}
|
|
15174
|
+
)
|
|
15175
|
+
] }),
|
|
15176
|
+
limitType && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15177
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t pt-6", children: [
|
|
15178
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-lg font-semibold mb-4", children: "Basic Information" }),
|
|
15179
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15180
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15181
|
+
EnhancedInput,
|
|
15182
|
+
{
|
|
15183
|
+
label: "Limit Name",
|
|
15184
|
+
placeholder: "Enter limit name",
|
|
15185
|
+
value: formData.limitName,
|
|
15186
|
+
onChange: (e) => handleFieldChange("limitName", e.target.value)
|
|
15187
|
+
}
|
|
15188
|
+
),
|
|
15189
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15190
|
+
EnhancedSelect,
|
|
15191
|
+
{
|
|
15192
|
+
label: "Action",
|
|
15193
|
+
placeholder: "Select action",
|
|
15194
|
+
options: [
|
|
15195
|
+
{ value: "decline", label: "Decline" },
|
|
15196
|
+
{ value: "flag", label: "Flag" }
|
|
15197
|
+
],
|
|
15198
|
+
onValueChange: (value) => handleFieldChange("action", value)
|
|
15199
|
+
}
|
|
15200
|
+
),
|
|
15201
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15202
|
+
EnhancedSelect,
|
|
15203
|
+
{
|
|
15204
|
+
label: "Associated Entity Type",
|
|
15205
|
+
placeholder: "Select entity type",
|
|
15206
|
+
options: [
|
|
15207
|
+
{ value: "global", label: "Global" },
|
|
15208
|
+
{ value: "program", label: "Program" },
|
|
15209
|
+
{ value: "product", label: "Product" },
|
|
15210
|
+
{ value: "account", label: "Account" }
|
|
15211
|
+
],
|
|
15212
|
+
value: formData.associatedEntityType,
|
|
15213
|
+
onValueChange: (value) => {
|
|
15214
|
+
handleFieldChange("associatedEntityType", value);
|
|
15215
|
+
handleFieldChange("associatedEntityId", "");
|
|
15216
|
+
}
|
|
15217
|
+
}
|
|
15218
|
+
),
|
|
15219
|
+
formData.associatedEntityType && formData.associatedEntityType !== "global" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15220
|
+
EnhancedInput,
|
|
15221
|
+
{
|
|
15222
|
+
label: `${formData.associatedEntityType.charAt(0).toUpperCase() + formData.associatedEntityType.slice(1)} ID`,
|
|
15223
|
+
placeholder: `Enter ${formData.associatedEntityType} ID`,
|
|
15224
|
+
value: formData.associatedEntityId,
|
|
15225
|
+
onChange: (e) => handleFieldChange("associatedEntityId", e.target.value)
|
|
15226
|
+
}
|
|
15227
|
+
)
|
|
15228
|
+
] })
|
|
15229
|
+
] }),
|
|
15230
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t pt-6", children: [
|
|
15231
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-lg font-semibold mb-4", children: "Limit Configuration" }),
|
|
15232
|
+
renderTypeSpecificFields()
|
|
15233
|
+
] }),
|
|
15234
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-3 border-t pt-6", children: [
|
|
15235
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15236
|
+
Button,
|
|
15237
|
+
{
|
|
15238
|
+
type: "button",
|
|
15239
|
+
variant: "outline",
|
|
15240
|
+
onClick: () => navigate("/compliance/velocity"),
|
|
15241
|
+
children: "Cancel"
|
|
15242
|
+
}
|
|
15243
|
+
),
|
|
15244
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", children: "Create Limit" })
|
|
15245
|
+
] })
|
|
15246
|
+
] })
|
|
15247
|
+
] }) }) }) }) })
|
|
15248
|
+
] });
|
|
15249
|
+
}
|
|
15250
|
+
var getStatusVariant2 = (status) => {
|
|
15251
|
+
switch (status) {
|
|
15252
|
+
case "ACTIVE":
|
|
15253
|
+
return "success";
|
|
15254
|
+
case "INACTIVE":
|
|
15255
|
+
return "warning";
|
|
15256
|
+
case "DELETED":
|
|
15257
|
+
return "destructive";
|
|
15258
|
+
default:
|
|
15259
|
+
return "secondary";
|
|
15260
|
+
}
|
|
15261
|
+
};
|
|
15262
|
+
var getActionVariant2 = (action) => {
|
|
15263
|
+
switch (action) {
|
|
15264
|
+
case "DECLINE":
|
|
15265
|
+
return "destructive";
|
|
15266
|
+
case "FLAG":
|
|
15267
|
+
return "warning";
|
|
15268
|
+
default:
|
|
15269
|
+
return "secondary";
|
|
15270
|
+
}
|
|
15271
|
+
};
|
|
15272
|
+
var VelocityLimitDetailsCard = ({
|
|
15273
|
+
isEditing,
|
|
15274
|
+
onToggleEdit,
|
|
15275
|
+
limit
|
|
15276
|
+
}) => {
|
|
15277
|
+
const renderTransactionFields = () => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15278
|
+
limit.transactionType && limit.transactionType.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15279
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15280
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-muted-foreground mb-1", children: "Transaction Type" }),
|
|
15281
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: limit.transactionType.map((type, index) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-foreground", children: type }, index)) })
|
|
15282
|
+
] }),
|
|
15283
|
+
limit.transactionGroup && limit.transactionGroup.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15284
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-muted-foreground mb-1", children: "Transaction Group" }),
|
|
15285
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: limit.transactionGroup.map((group, index) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-foreground", children: group.toUpperCase() }, index)) })
|
|
15286
|
+
] })
|
|
15287
|
+
] }),
|
|
15288
|
+
!limit.transactionType && limit.transactionGroup && limit.transactionGroup.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
15289
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-muted-foreground mb-1", children: "Transaction Group" }),
|
|
15290
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: limit.transactionGroup.map((group, index) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-foreground", children: group.toUpperCase() }, index)) })
|
|
15291
|
+
] }) }),
|
|
15292
|
+
(limit.aggregationLevel || limit.timePeriod) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15293
|
+
limit.aggregationLevel && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15294
|
+
InfoField,
|
|
15295
|
+
{
|
|
15296
|
+
label: "Aggregation Level",
|
|
15297
|
+
value: limit.aggregationLevel.charAt(0).toUpperCase() + limit.aggregationLevel.slice(1),
|
|
15298
|
+
layout: "horizontal"
|
|
15299
|
+
}
|
|
15300
|
+
),
|
|
15301
|
+
limit.timePeriod && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15302
|
+
InfoField,
|
|
15303
|
+
{
|
|
15304
|
+
label: "Time Period",
|
|
15305
|
+
value: limit.timePeriod.charAt(0).toUpperCase() + limit.timePeriod.slice(1),
|
|
15306
|
+
layout: "horizontal"
|
|
15307
|
+
}
|
|
15308
|
+
)
|
|
15309
|
+
] }),
|
|
15310
|
+
(limit.maxAmount || limit.maxCount) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15311
|
+
limit.maxAmount && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15312
|
+
InfoField,
|
|
15313
|
+
{
|
|
15314
|
+
label: "Max Amount",
|
|
15315
|
+
value: `$${parseFloat(limit.maxAmount).toLocaleString()}`,
|
|
15316
|
+
layout: "horizontal"
|
|
15317
|
+
}
|
|
15318
|
+
),
|
|
15319
|
+
limit.maxCount && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15320
|
+
InfoField,
|
|
15321
|
+
{
|
|
15322
|
+
label: "Max Count",
|
|
15323
|
+
value: limit.maxCount,
|
|
15324
|
+
layout: "horizontal"
|
|
15325
|
+
}
|
|
15326
|
+
)
|
|
15327
|
+
] })
|
|
15328
|
+
] });
|
|
15329
|
+
const renderReceiverNameMismatchFields = () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: limit.mismatchThreshold && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15330
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15331
|
+
InfoField,
|
|
15332
|
+
{
|
|
15333
|
+
label: "Mismatch Threshold",
|
|
15334
|
+
value: `${limit.mismatchThreshold}%`,
|
|
15335
|
+
layout: "horizontal"
|
|
15336
|
+
}
|
|
15337
|
+
),
|
|
15338
|
+
limit.comparisonMethod && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15339
|
+
InfoField,
|
|
15340
|
+
{
|
|
15341
|
+
label: "Comparison Method",
|
|
15342
|
+
value: limit.comparisonMethod.charAt(0).toUpperCase() + limit.comparisonMethod.slice(1),
|
|
15343
|
+
layout: "horizontal"
|
|
15344
|
+
}
|
|
15345
|
+
)
|
|
15346
|
+
] }) });
|
|
15347
|
+
const renderRoundNumberFields = () => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: limit.amountThreshold && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15348
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15349
|
+
InfoField,
|
|
15350
|
+
{
|
|
15351
|
+
label: "Amount Threshold",
|
|
15352
|
+
value: `$${parseFloat(limit.amountThreshold).toLocaleString()}`,
|
|
15353
|
+
layout: "horizontal"
|
|
15354
|
+
}
|
|
15355
|
+
),
|
|
15356
|
+
limit.roundPattern && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15357
|
+
InfoField,
|
|
15358
|
+
{
|
|
15359
|
+
label: "Round Patterns",
|
|
15360
|
+
value: limit.roundPattern,
|
|
15361
|
+
layout: "horizontal"
|
|
15362
|
+
}
|
|
15363
|
+
)
|
|
15364
|
+
] }) });
|
|
15365
|
+
const renderProhibitedEntityFields = () => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15366
|
+
limit.entityListName && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15367
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15368
|
+
InfoField,
|
|
15369
|
+
{
|
|
15370
|
+
label: "Entity List Name",
|
|
15371
|
+
value: limit.entityListName,
|
|
15372
|
+
layout: "horizontal"
|
|
15373
|
+
}
|
|
15374
|
+
),
|
|
15375
|
+
limit.entityType && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15376
|
+
InfoField,
|
|
15377
|
+
{
|
|
15378
|
+
label: "Entity Type",
|
|
15379
|
+
value: limit.entityType.charAt(0).toUpperCase() + limit.entityType.slice(1),
|
|
15380
|
+
layout: "horizontal"
|
|
15381
|
+
}
|
|
15382
|
+
)
|
|
15383
|
+
] }),
|
|
15384
|
+
limit.prohibitedEntities && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15385
|
+
InfoField,
|
|
15386
|
+
{
|
|
15387
|
+
label: "Prohibited Entities",
|
|
15388
|
+
value: limit.prohibitedEntities,
|
|
15389
|
+
layout: "horizontal"
|
|
15390
|
+
}
|
|
15391
|
+
) })
|
|
15392
|
+
] });
|
|
15393
|
+
const viewContent = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
15394
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15395
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15396
|
+
InfoField,
|
|
15397
|
+
{
|
|
15398
|
+
label: "Limit Name",
|
|
15399
|
+
value: limit.limitName,
|
|
15400
|
+
layout: "horizontal"
|
|
15401
|
+
}
|
|
15402
|
+
),
|
|
15403
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15404
|
+
InfoField,
|
|
15405
|
+
{
|
|
15406
|
+
label: "Limit Type",
|
|
15407
|
+
value: limit.limitType.replace(/_/g, " ").replace(/\b\w/g, (l) => l.toUpperCase()),
|
|
15408
|
+
layout: "horizontal"
|
|
15409
|
+
}
|
|
15410
|
+
)
|
|
15411
|
+
] }),
|
|
15412
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15413
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15414
|
+
InfoField,
|
|
15415
|
+
{
|
|
15416
|
+
label: "Action",
|
|
15417
|
+
value: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: getActionVariant2(limit.action), children: limit.action }),
|
|
15418
|
+
layout: "horizontal"
|
|
15419
|
+
}
|
|
15420
|
+
),
|
|
15421
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15422
|
+
InfoField,
|
|
15423
|
+
{
|
|
15424
|
+
label: "Created",
|
|
15425
|
+
value: dateFns.format(dateFns.parseISO(limit.created), "MMM dd, yyyy 'at' h:mm a"),
|
|
15426
|
+
layout: "horizontal"
|
|
15427
|
+
}
|
|
15428
|
+
)
|
|
15429
|
+
] }),
|
|
15430
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
15431
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15432
|
+
InfoField,
|
|
15433
|
+
{
|
|
15434
|
+
label: "Associated Entity",
|
|
15435
|
+
value: limit.associatedEntity,
|
|
15436
|
+
layout: "horizontal"
|
|
15437
|
+
}
|
|
15438
|
+
),
|
|
15439
|
+
limit.associatedEntityId && /* @__PURE__ */ jsxRuntime.jsx(
|
|
15440
|
+
InfoField,
|
|
15441
|
+
{
|
|
15442
|
+
label: "Associated Entity ID",
|
|
15443
|
+
value: limit.associatedEntityId,
|
|
15444
|
+
layout: "horizontal"
|
|
15445
|
+
}
|
|
15446
|
+
)
|
|
15447
|
+
] }),
|
|
15448
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
15449
|
+
limit.limitType === "transaction" && renderTransactionFields(),
|
|
15450
|
+
limit.limitType === "receiver_name_mismatch" && renderReceiverNameMismatchFields(),
|
|
15451
|
+
limit.limitType === "round_number" && renderRoundNumberFields(),
|
|
15452
|
+
limit.limitType === "prohibited_entity" && renderProhibitedEntityFields()
|
|
15453
|
+
] })
|
|
15454
|
+
] });
|
|
15455
|
+
const editContent = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: "Edit mode coming soon..." });
|
|
15456
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
15457
|
+
EditableFormCard,
|
|
15458
|
+
{
|
|
15459
|
+
title: "Velocity Limit Details",
|
|
15460
|
+
viewContent,
|
|
15461
|
+
editContent,
|
|
15462
|
+
isEditing,
|
|
15463
|
+
onToggleEdit,
|
|
15464
|
+
variant: "subtle"
|
|
15465
|
+
}
|
|
15466
|
+
);
|
|
15467
|
+
};
|
|
15468
|
+
function VelocityLimitDetail() {
|
|
15469
|
+
const { id } = reactRouterDom.useParams();
|
|
15470
|
+
const navigate = reactRouterDom.useNavigate();
|
|
15471
|
+
const limit = mockVelocityLimits.find((l) => l.id === id);
|
|
15472
|
+
if (!limit) {
|
|
15473
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 py-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
15474
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold mb-2", children: "Velocity Limit Not Found" }),
|
|
15475
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-4", children: "The velocity limit could not be found." }),
|
|
15476
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Button, { onClick: () => navigate("/compliance/velocity"), children: [
|
|
15477
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeft, { className: "mr-2 h-4 w-4" }),
|
|
15478
|
+
"Back to Velocity Limits"
|
|
15479
|
+
] })
|
|
15480
|
+
] }) });
|
|
15481
|
+
}
|
|
15482
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
15483
|
+
DetailPageLayout,
|
|
15484
|
+
{
|
|
15485
|
+
title: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
15486
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: limit.limitName }),
|
|
15487
|
+
/* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: getStatusVariant2(limit.status), children: limit.status })
|
|
15488
|
+
] }),
|
|
15489
|
+
cards: [
|
|
15490
|
+
{
|
|
15491
|
+
key: "details",
|
|
15492
|
+
component: (props) => /* @__PURE__ */ jsxRuntime.jsx(VelocityLimitDetailsCard, { ...props, limit })
|
|
15493
|
+
}
|
|
15494
|
+
],
|
|
15495
|
+
actions: [
|
|
15496
|
+
{
|
|
15497
|
+
label: "Deactivate",
|
|
15498
|
+
variant: "destructive",
|
|
15499
|
+
onClick: () => console.log("Deactivate limit")
|
|
15500
|
+
}
|
|
15501
|
+
]
|
|
15502
|
+
}
|
|
15503
|
+
);
|
|
15504
|
+
}
|
|
15505
|
+
function UploadReconDialog({ open, onOpenChange }) {
|
|
15506
|
+
const [fileType, setFileType] = React15.useState(null);
|
|
15507
|
+
const [selectedFile, setSelectedFile] = React15.useState(null);
|
|
15508
|
+
const [isUploading, setIsUploading] = React15.useState(false);
|
|
15509
|
+
const fileInputRef = React15.useRef(null);
|
|
15510
|
+
const handleFileChange = (event) => {
|
|
15511
|
+
const file = event.target.files?.[0];
|
|
15512
|
+
if (file) {
|
|
15513
|
+
setSelectedFile(file);
|
|
15514
|
+
}
|
|
15515
|
+
};
|
|
15516
|
+
const handleRemoveFile = () => {
|
|
15517
|
+
setSelectedFile(null);
|
|
15518
|
+
if (fileInputRef.current) {
|
|
15519
|
+
fileInputRef.current.value = "";
|
|
15520
|
+
}
|
|
15521
|
+
};
|
|
15522
|
+
const handleReset = () => {
|
|
15523
|
+
setFileType(null);
|
|
15524
|
+
setSelectedFile(null);
|
|
15525
|
+
if (fileInputRef.current) {
|
|
15526
|
+
fileInputRef.current.value = "";
|
|
15527
|
+
}
|
|
15528
|
+
};
|
|
15529
|
+
const handleUpload = async () => {
|
|
15530
|
+
if (!selectedFile || !fileType) return;
|
|
15531
|
+
setIsUploading(true);
|
|
15532
|
+
setTimeout(() => {
|
|
15533
|
+
setIsUploading(false);
|
|
15534
|
+
sonner.toast.success(`${fileType} file uploaded successfully`);
|
|
15535
|
+
handleReset();
|
|
15536
|
+
onOpenChange(false);
|
|
15537
|
+
}, 2e3);
|
|
15538
|
+
};
|
|
15539
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(DialogContent, { className: "sm:max-w-[500px]", children: [
|
|
15540
|
+
/* @__PURE__ */ jsxRuntime.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { children: "Upload Recon File" }) }),
|
|
15541
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 py-4", children: [
|
|
15542
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
15543
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { children: "File Type" }),
|
|
15544
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
15545
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
15546
|
+
"button",
|
|
15547
|
+
{
|
|
15548
|
+
type: "button",
|
|
15549
|
+
onClick: () => setFileType("ACH"),
|
|
15550
|
+
className: cn(
|
|
15551
|
+
"flex flex-col items-center gap-3 p-4 border-2 rounded-lg transition-all",
|
|
15552
|
+
fileType === "ACH" ? "border-primary bg-primary/5" : "border-border hover:border-primary/50"
|
|
15553
|
+
),
|
|
15554
|
+
children: [
|
|
15555
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightLeft, { className: "h-8 w-8 text-primary" }),
|
|
15556
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
15557
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: "ACH" }),
|
|
15558
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground mt-1", children: "ACH Originated/Received Entries Detail Report in .csv format" })
|
|
15559
|
+
] })
|
|
15560
|
+
]
|
|
15561
|
+
}
|
|
15562
|
+
),
|
|
15563
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
15564
|
+
"button",
|
|
15565
|
+
{
|
|
15566
|
+
type: "button",
|
|
15567
|
+
onClick: () => setFileType("Wire"),
|
|
15568
|
+
className: cn(
|
|
15569
|
+
"flex flex-col items-center gap-3 p-4 border-2 rounded-lg transition-all",
|
|
15570
|
+
fileType === "Wire" ? "border-primary bg-primary/5" : "border-border hover:border-primary/50"
|
|
15571
|
+
),
|
|
15572
|
+
children: [
|
|
15573
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Zap, { className: "h-8 w-8 text-primary" }),
|
|
15574
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
15575
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: "Wire" }),
|
|
15576
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground mt-1", children: "FedTransaction Analyzer report in .csv format" })
|
|
15577
|
+
] })
|
|
15578
|
+
]
|
|
15579
|
+
}
|
|
15580
|
+
)
|
|
15581
|
+
] })
|
|
15582
|
+
] }),
|
|
15583
|
+
fileType && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-2 border-dashed border-border rounded-lg p-6", children: !selectedFile ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center gap-4", children: [
|
|
15584
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Upload, { className: "h-12 w-12 text-muted-foreground" }),
|
|
15585
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
15586
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: "Select a file to upload" }),
|
|
15587
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-1", children: "CSV, TXT files supported" })
|
|
15588
|
+
] }),
|
|
15589
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15590
|
+
"input",
|
|
15591
|
+
{
|
|
15592
|
+
ref: fileInputRef,
|
|
15593
|
+
type: "file",
|
|
15594
|
+
onChange: handleFileChange,
|
|
15595
|
+
className: "hidden",
|
|
15596
|
+
accept: ".csv,.txt",
|
|
15597
|
+
id: "recon-file-upload"
|
|
15598
|
+
}
|
|
15599
|
+
),
|
|
15600
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15601
|
+
Button,
|
|
15602
|
+
{
|
|
15603
|
+
type: "button",
|
|
15604
|
+
variant: "outline",
|
|
15605
|
+
onClick: () => fileInputRef.current?.click(),
|
|
15606
|
+
children: "Select File"
|
|
15607
|
+
}
|
|
15608
|
+
)
|
|
15609
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-4", children: [
|
|
15610
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 flex-1 min-w-0", children: [
|
|
15611
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.File, { className: "h-8 w-8 text-primary flex-shrink-0" }),
|
|
15612
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
15613
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium truncate", children: selectedFile.name }),
|
|
15614
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
15615
|
+
(selectedFile.size / 1024).toFixed(2),
|
|
15616
|
+
" KB"
|
|
15617
|
+
] })
|
|
15618
|
+
] })
|
|
15619
|
+
] }),
|
|
15620
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15621
|
+
Button,
|
|
15622
|
+
{
|
|
15623
|
+
type: "button",
|
|
15624
|
+
variant: "ghost",
|
|
15625
|
+
size: "icon",
|
|
15626
|
+
onClick: handleRemoveFile,
|
|
15627
|
+
className: "flex-shrink-0",
|
|
15628
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" })
|
|
15629
|
+
}
|
|
15630
|
+
)
|
|
15631
|
+
] }) })
|
|
15632
|
+
] }),
|
|
15633
|
+
/* @__PURE__ */ jsxRuntime.jsxs(DialogFooter, { children: [
|
|
15634
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
15635
|
+
handleReset();
|
|
15636
|
+
onOpenChange(false);
|
|
15637
|
+
}, children: "Cancel" }),
|
|
15638
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15639
|
+
Button,
|
|
15640
|
+
{
|
|
15641
|
+
onClick: handleUpload,
|
|
15642
|
+
disabled: !selectedFile || !fileType || isUploading,
|
|
15643
|
+
children: isUploading ? "Uploading..." : "Upload"
|
|
15644
|
+
}
|
|
15645
|
+
)
|
|
15646
|
+
] })
|
|
15647
|
+
] }) });
|
|
15648
|
+
}
|
|
15649
|
+
|
|
15650
|
+
// src/lib/mock-data/recon-data.ts
|
|
15651
|
+
var mockReconUploads = [
|
|
15652
|
+
{
|
|
15653
|
+
id: "1",
|
|
15654
|
+
uploaded: "2025-11-14T10:30:00Z",
|
|
15655
|
+
fileName: "OE_ACH Originated Entries ...",
|
|
15656
|
+
type: "FED_ACH_CONF...",
|
|
15657
|
+
status: "Processed",
|
|
15658
|
+
requester: "bcontrucci@ssbp...",
|
|
15659
|
+
totalRecords: 2872,
|
|
15660
|
+
matchedRecords: 2872,
|
|
15661
|
+
exceptionRecords: 0,
|
|
15662
|
+
skippedRecords: 0,
|
|
15663
|
+
invalidRecords: 0
|
|
15664
|
+
},
|
|
15665
|
+
{
|
|
15666
|
+
id: "2",
|
|
15667
|
+
uploaded: "2025-11-14T09:15:00Z",
|
|
15668
|
+
fileName: "RER_ACH Received Entries ...",
|
|
15669
|
+
type: "FED_ACH_CONF...",
|
|
15670
|
+
status: "Processed",
|
|
15671
|
+
requester: "bcontrucci@ssbp...",
|
|
15672
|
+
totalRecords: 220,
|
|
15673
|
+
matchedRecords: 220,
|
|
15674
|
+
exceptionRecords: 0,
|
|
15675
|
+
skippedRecords: 0,
|
|
15676
|
+
invalidRecords: 0
|
|
15677
|
+
},
|
|
15678
|
+
{
|
|
15679
|
+
id: "3",
|
|
15680
|
+
uploaded: "2025-11-14T08:45:00Z",
|
|
15681
|
+
fileName: "243073959_335935.csv",
|
|
15682
|
+
type: "FED_WIRE_CON...",
|
|
15683
|
+
status: "Processed",
|
|
15684
|
+
requester: "bcontrucci@ssbp...",
|
|
15685
|
+
totalRecords: 304,
|
|
15686
|
+
matchedRecords: 220,
|
|
15687
|
+
exceptionRecords: 2,
|
|
15688
|
+
skippedRecords: 82,
|
|
15689
|
+
invalidRecords: 0
|
|
15690
|
+
},
|
|
15691
|
+
{
|
|
15692
|
+
id: "4",
|
|
15693
|
+
uploaded: "2025-11-13T16:20:00Z",
|
|
15694
|
+
fileName: "OE_ACH Originated Entries ...",
|
|
15695
|
+
type: "FED_ACH_CONF...",
|
|
15696
|
+
status: "Processed",
|
|
15697
|
+
requester: "bcontrucci@ssbp...",
|
|
15698
|
+
totalRecords: 4813,
|
|
15699
|
+
matchedRecords: 4811,
|
|
15700
|
+
exceptionRecords: 2,
|
|
15701
|
+
skippedRecords: 0,
|
|
15702
|
+
invalidRecords: 0
|
|
15703
|
+
},
|
|
15704
|
+
{
|
|
15705
|
+
id: "5",
|
|
15706
|
+
uploaded: "2025-11-13T15:10:00Z",
|
|
15707
|
+
fileName: "243073959_335846.csv",
|
|
15708
|
+
type: "FED_WIRE_CON...",
|
|
15709
|
+
status: "Processed",
|
|
15710
|
+
requester: "bcontrucci@ssbp...",
|
|
15711
|
+
totalRecords: 391,
|
|
15712
|
+
matchedRecords: 258,
|
|
15713
|
+
exceptionRecords: 2,
|
|
15714
|
+
skippedRecords: 131,
|
|
15715
|
+
invalidRecords: 0
|
|
15716
|
+
},
|
|
15717
|
+
{
|
|
15718
|
+
id: "6",
|
|
15719
|
+
uploaded: "2025-11-13T14:30:00Z",
|
|
15720
|
+
fileName: "RER_ACH Received Entries ...",
|
|
15721
|
+
type: "FED_ACH_CONF...",
|
|
15722
|
+
status: "Processed",
|
|
15723
|
+
requester: "bcontrucci@ssbp...",
|
|
15724
|
+
totalRecords: 227,
|
|
15725
|
+
matchedRecords: 221,
|
|
15726
|
+
exceptionRecords: 6,
|
|
15727
|
+
skippedRecords: 0,
|
|
15728
|
+
invalidRecords: 0
|
|
15729
|
+
},
|
|
15730
|
+
{
|
|
15731
|
+
id: "7",
|
|
15732
|
+
uploaded: "2025-11-13T13:45:00Z",
|
|
15733
|
+
fileName: "OE_ACH Originated Entries ...",
|
|
15734
|
+
type: "FED_ACH_CONF...",
|
|
15735
|
+
status: "Processed",
|
|
15736
|
+
requester: "bcontrucci@ssbp...",
|
|
15737
|
+
totalRecords: 6471,
|
|
15738
|
+
matchedRecords: 6471,
|
|
15739
|
+
exceptionRecords: 0,
|
|
15740
|
+
skippedRecords: 0,
|
|
15741
|
+
invalidRecords: 0
|
|
15742
|
+
},
|
|
15743
|
+
{
|
|
15744
|
+
id: "8",
|
|
15745
|
+
uploaded: "2025-11-12T11:20:00Z",
|
|
15746
|
+
fileName: "OE_ACH Originated Entries ...",
|
|
15747
|
+
type: "FED_ACH_CONF...",
|
|
15748
|
+
status: "Failed",
|
|
15749
|
+
requester: "bcontrucci@ssbp...",
|
|
15750
|
+
totalRecords: 0,
|
|
15751
|
+
matchedRecords: 0,
|
|
15752
|
+
exceptionRecords: 0,
|
|
15753
|
+
skippedRecords: 0,
|
|
15754
|
+
invalidRecords: 0
|
|
15755
|
+
},
|
|
15756
|
+
{
|
|
15757
|
+
id: "9",
|
|
15758
|
+
uploaded: "2025-11-12T10:15:00Z",
|
|
15759
|
+
fileName: "RER_ACH Received Entries ...",
|
|
15760
|
+
type: "FED_ACH_CONF...",
|
|
15761
|
+
status: "Processed",
|
|
15762
|
+
requester: "bcontrucci@ssbp...",
|
|
15763
|
+
totalRecords: 189,
|
|
15764
|
+
matchedRecords: 170,
|
|
15765
|
+
exceptionRecords: 19,
|
|
15766
|
+
skippedRecords: 0,
|
|
15767
|
+
invalidRecords: 0
|
|
15768
|
+
}
|
|
15769
|
+
];
|
|
15770
|
+
function ReconUpload() {
|
|
15771
|
+
const [sortField, setSortField] = React15.useState("uploaded");
|
|
15772
|
+
const [sortDirection, setSortDirection] = React15.useState("desc");
|
|
15773
|
+
const [uploadDialogOpen, setUploadDialogOpen] = React15.useState(false);
|
|
15774
|
+
const handleSort = (field) => {
|
|
15775
|
+
if (sortField === field) {
|
|
15776
|
+
setSortDirection(sortDirection === "asc" ? "desc" : "asc");
|
|
15777
|
+
} else {
|
|
15778
|
+
setSortField(field);
|
|
15779
|
+
setSortDirection("desc");
|
|
15780
|
+
}
|
|
15781
|
+
};
|
|
15782
|
+
const sortedUploads = [...mockReconUploads].sort((a, b) => {
|
|
15783
|
+
const aValue = a[sortField];
|
|
15784
|
+
const bValue = b[sortField];
|
|
15785
|
+
if (aValue == null) return 1;
|
|
15786
|
+
if (bValue == null) return -1;
|
|
15787
|
+
if (sortDirection === "asc") {
|
|
15788
|
+
return aValue > bValue ? 1 : -1;
|
|
15789
|
+
} else {
|
|
15790
|
+
return aValue < bValue ? 1 : -1;
|
|
15791
|
+
}
|
|
15792
|
+
});
|
|
15793
|
+
const columns3 = [
|
|
15794
|
+
{
|
|
15795
|
+
key: "uploaded",
|
|
15796
|
+
title: "Uploaded",
|
|
15797
|
+
sortable: true,
|
|
15798
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: dateFns.format(dateFns.parseISO(value), "yyyy-MM-dd") })
|
|
15799
|
+
},
|
|
15800
|
+
{
|
|
15801
|
+
key: "fileName",
|
|
15802
|
+
title: "File Name",
|
|
15803
|
+
render: (value, row) => {
|
|
15804
|
+
const isACH = row.type.includes("ACH");
|
|
15805
|
+
const Icon2 = isACH ? lucideReact.ArrowRightLeft : lucideReact.Zap;
|
|
15806
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
15807
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon2, { className: "h-4 w-4 text-muted-foreground flex-shrink-0" }),
|
|
15808
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: value })
|
|
15809
|
+
] });
|
|
15810
|
+
}
|
|
15811
|
+
},
|
|
15812
|
+
{
|
|
15813
|
+
key: "status",
|
|
15814
|
+
title: "Status",
|
|
15815
|
+
render: (value) => {
|
|
15816
|
+
if (value === "Processed") {
|
|
15817
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle2, { className: "h-5 w-5 text-green-600" });
|
|
15818
|
+
}
|
|
15819
|
+
if (value === "Failed") {
|
|
15820
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XCircle, { className: "h-5 w-5 text-red-600" });
|
|
15821
|
+
}
|
|
15822
|
+
if (value === "Processing") {
|
|
15823
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Circle, { className: "h-5 w-5 text-green-600" });
|
|
15824
|
+
}
|
|
15825
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value });
|
|
15826
|
+
}
|
|
15827
|
+
},
|
|
15828
|
+
{
|
|
15829
|
+
key: "requester",
|
|
15830
|
+
title: "Requester",
|
|
15831
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value })
|
|
15832
|
+
},
|
|
15833
|
+
{
|
|
15834
|
+
key: "totalRecords",
|
|
15835
|
+
title: "Total",
|
|
15836
|
+
sortable: true,
|
|
15837
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value.toLocaleString() })
|
|
15838
|
+
},
|
|
15839
|
+
{
|
|
15840
|
+
key: "matchedRecords",
|
|
15841
|
+
title: "Matched",
|
|
15842
|
+
sortable: true,
|
|
15843
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value.toLocaleString() })
|
|
15844
|
+
},
|
|
15845
|
+
{
|
|
15846
|
+
key: "exceptionRecords",
|
|
15847
|
+
title: "Exception",
|
|
15848
|
+
sortable: true,
|
|
15849
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value.toLocaleString() })
|
|
15850
|
+
},
|
|
15851
|
+
{
|
|
15852
|
+
key: "skippedRecords",
|
|
15853
|
+
title: "Skipped",
|
|
15854
|
+
sortable: true,
|
|
15855
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value.toLocaleString() })
|
|
15856
|
+
},
|
|
15857
|
+
{
|
|
15858
|
+
key: "invalidRecords",
|
|
15859
|
+
title: "Invalid",
|
|
15860
|
+
sortable: true,
|
|
15861
|
+
render: (value) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: value.toLocaleString() })
|
|
15862
|
+
}
|
|
15863
|
+
];
|
|
15864
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-screen bg-gradient-subtle", children: [
|
|
15865
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-none border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 py-6 max-w-none", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
15866
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold text-foreground", children: "Recon File Uploads" }) }),
|
|
15867
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs(Button, { onClick: () => setUploadDialogOpen(true), children: [
|
|
15868
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Upload, { className: "mr-2 h-4 w-4" }),
|
|
15869
|
+
"Upload Recon file"
|
|
15870
|
+
] }) })
|
|
15871
|
+
] }) }) }),
|
|
15872
|
+
/* @__PURE__ */ jsxRuntime.jsx(UploadReconDialog, { open: uploadDialogOpen, onOpenChange: setUploadDialogOpen }),
|
|
15873
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "container mx-auto px-4 h-full max-w-none flex flex-col", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 mt-4 overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15874
|
+
DataTable,
|
|
15875
|
+
{
|
|
15876
|
+
columns: columns3,
|
|
15877
|
+
data: sortedUploads,
|
|
15878
|
+
sortBy: sortField,
|
|
15879
|
+
sortDirection,
|
|
15880
|
+
onSort: handleSort
|
|
15881
|
+
}
|
|
15882
|
+
) }) }) })
|
|
15883
|
+
] });
|
|
15884
|
+
}
|
|
15885
|
+
|
|
15886
|
+
// src/lib/mock-data/recon-exception-data.ts
|
|
15887
|
+
var mockBraidTransactions = [
|
|
15888
|
+
{
|
|
15889
|
+
id: "BT-001",
|
|
15890
|
+
amount: 15e3,
|
|
15891
|
+
postDate: "2025-01-15",
|
|
15892
|
+
senderAccount: "1234567890",
|
|
15893
|
+
receiverAccount: "9876543210",
|
|
15894
|
+
type: "ACH"
|
|
15895
|
+
},
|
|
15896
|
+
{
|
|
15897
|
+
id: "BT-002",
|
|
15898
|
+
amount: 8500.5,
|
|
15899
|
+
postDate: "2025-01-15",
|
|
15900
|
+
senderAccount: "2345678901",
|
|
15901
|
+
receiverAccount: "8765432109",
|
|
15902
|
+
type: "ACH"
|
|
15903
|
+
},
|
|
15904
|
+
{
|
|
15905
|
+
id: "BT-003",
|
|
15906
|
+
amount: 25e3,
|
|
15907
|
+
postDate: "2025-01-16",
|
|
15908
|
+
senderAccount: "3456789012",
|
|
15909
|
+
receiverAccount: "7654321098",
|
|
15910
|
+
type: "ACH"
|
|
15911
|
+
},
|
|
15912
|
+
{
|
|
15913
|
+
id: "BT-004",
|
|
15914
|
+
amount: 5e4,
|
|
15915
|
+
postDate: "2025-01-15",
|
|
15916
|
+
senderAccount: "4567890123",
|
|
15917
|
+
receiverAccount: "6543210987",
|
|
15918
|
+
type: "Wire"
|
|
15919
|
+
},
|
|
15920
|
+
{
|
|
15921
|
+
id: "BT-005",
|
|
15922
|
+
amount: 12500.75,
|
|
15923
|
+
postDate: "2025-01-16",
|
|
15924
|
+
senderAccount: "5678901234",
|
|
15925
|
+
receiverAccount: "5432109876",
|
|
15926
|
+
type: "Wire"
|
|
15927
|
+
},
|
|
15928
|
+
{
|
|
15929
|
+
id: "BT-006",
|
|
15930
|
+
amount: 3200,
|
|
15931
|
+
postDate: "2025-01-17",
|
|
15932
|
+
senderAccount: "6789012345",
|
|
15933
|
+
receiverAccount: "4321098765",
|
|
15934
|
+
type: "ACH"
|
|
15935
|
+
}
|
|
15936
|
+
];
|
|
15937
|
+
var mockFedSettlements = [
|
|
15938
|
+
{
|
|
15939
|
+
id: "FS-001",
|
|
15940
|
+
amount: 15e3,
|
|
15941
|
+
settlementDate: "2025-01-15",
|
|
15942
|
+
receiverAccount: "9876543210",
|
|
15943
|
+
type: "ACH"
|
|
15944
|
+
},
|
|
15945
|
+
{
|
|
15946
|
+
id: "FS-002",
|
|
15947
|
+
amount: 8500.5,
|
|
15948
|
+
settlementDate: "2025-01-15",
|
|
15949
|
+
receiverAccount: "8765432109",
|
|
15950
|
+
type: "ACH"
|
|
15951
|
+
},
|
|
15952
|
+
{
|
|
15953
|
+
id: "FS-003",
|
|
15954
|
+
amount: 24999,
|
|
15955
|
+
settlementDate: "2025-01-16",
|
|
15956
|
+
receiverAccount: "7654321098",
|
|
15957
|
+
type: "ACH"
|
|
15958
|
+
},
|
|
15959
|
+
{
|
|
15960
|
+
id: "FS-004",
|
|
15961
|
+
amount: 5e4,
|
|
15962
|
+
settlementDate: "2025-01-15",
|
|
15963
|
+
receiverAccount: "6543210987",
|
|
15964
|
+
type: "Wire"
|
|
15965
|
+
},
|
|
15966
|
+
{
|
|
15967
|
+
id: "FS-005",
|
|
15968
|
+
amount: 12500.75,
|
|
15969
|
+
settlementDate: "2025-01-16",
|
|
15970
|
+
receiverAccount: "5432109876",
|
|
15971
|
+
type: "Wire"
|
|
15972
|
+
},
|
|
15973
|
+
{
|
|
15974
|
+
id: "FS-006",
|
|
15975
|
+
amount: 7800,
|
|
15976
|
+
settlementDate: "2025-01-17",
|
|
15977
|
+
receiverAccount: "3210987654",
|
|
15978
|
+
type: "ACH"
|
|
15979
|
+
}
|
|
15980
|
+
];
|
|
15981
|
+
function ReconExceptions() {
|
|
15982
|
+
const [fromDate, setFromDate] = React15.useState();
|
|
15983
|
+
const [toDate, setToDate] = React15.useState();
|
|
15984
|
+
const [transactionType, setTransactionType] = React15.useState("ACH");
|
|
15985
|
+
const [braidData, setBraidData] = React15.useState(mockBraidTransactions);
|
|
15986
|
+
const [fedData, setFedData] = React15.useState(mockFedSettlements);
|
|
15987
|
+
const [selectedBraid, setSelectedBraid] = React15.useState(null);
|
|
15988
|
+
const [selectedFed, setSelectedFed] = React15.useState(null);
|
|
15989
|
+
const [dataLoaded, setDataLoaded] = React15.useState(true);
|
|
15990
|
+
const [braidPage, setBraidPage] = React15.useState(1);
|
|
15991
|
+
const [braidRowsPerPage, setBraidRowsPerPage] = React15.useState(10);
|
|
15992
|
+
const [fedPage, setFedPage] = React15.useState(1);
|
|
15993
|
+
const [fedRowsPerPage, setFedRowsPerPage] = React15.useState(10);
|
|
15994
|
+
const handleSearch = () => {
|
|
15995
|
+
if (!fromDate || !toDate) {
|
|
15996
|
+
toast({
|
|
15997
|
+
title: "Missing Date Range",
|
|
15998
|
+
description: "Please select both from and to dates",
|
|
15999
|
+
variant: "destructive"
|
|
16000
|
+
});
|
|
16001
|
+
return;
|
|
16002
|
+
}
|
|
16003
|
+
const filteredBraid = mockBraidTransactions.filter((t) => {
|
|
16004
|
+
const tDate = new Date(t.postDate);
|
|
16005
|
+
return t.type === transactionType && tDate >= fromDate && tDate <= toDate;
|
|
16006
|
+
});
|
|
16007
|
+
const filteredFed = mockFedSettlements.filter((s) => {
|
|
16008
|
+
const sDate = new Date(s.settlementDate);
|
|
16009
|
+
return s.type === transactionType && sDate >= fromDate && sDate <= toDate;
|
|
16010
|
+
});
|
|
16011
|
+
setBraidData(filteredBraid);
|
|
16012
|
+
setFedData(filteredFed);
|
|
16013
|
+
setDataLoaded(true);
|
|
16014
|
+
setSelectedBraid(null);
|
|
16015
|
+
setSelectedFed(null);
|
|
16016
|
+
setBraidPage(1);
|
|
16017
|
+
setFedPage(1);
|
|
16018
|
+
toast({
|
|
16019
|
+
title: "Data Loaded",
|
|
16020
|
+
description: `Found ${filteredBraid.length} Braid transactions and ${filteredFed.length} Fed settlements`
|
|
16021
|
+
});
|
|
16022
|
+
};
|
|
16023
|
+
const handleMatch = () => {
|
|
16024
|
+
if (!selectedBraid || !selectedFed) {
|
|
16025
|
+
toast({
|
|
16026
|
+
title: "Selection Required",
|
|
16027
|
+
description: "Please select one transaction from each table",
|
|
16028
|
+
variant: "destructive"
|
|
16029
|
+
});
|
|
16030
|
+
return;
|
|
16031
|
+
}
|
|
16032
|
+
const braidTxn = braidData.find((t) => t.id === selectedBraid);
|
|
16033
|
+
const fedTxn = fedData.find((s) => s.id === selectedFed);
|
|
16034
|
+
setBraidData((prev) => prev.filter((t) => t.id !== selectedBraid));
|
|
16035
|
+
setFedData((prev) => prev.filter((s) => s.id !== selectedFed));
|
|
16036
|
+
setSelectedBraid(null);
|
|
16037
|
+
setSelectedFed(null);
|
|
16038
|
+
toast({
|
|
16039
|
+
title: "Transactions Matched",
|
|
16040
|
+
description: `Matched ${braidTxn?.id} with ${fedTxn?.id}`
|
|
16041
|
+
});
|
|
16042
|
+
};
|
|
16043
|
+
const canMatch = selectedBraid && selectedFed;
|
|
16044
|
+
const braidTotalPages = Math.ceil(braidData.length / braidRowsPerPage);
|
|
16045
|
+
const braidStartIndex = (braidPage - 1) * braidRowsPerPage;
|
|
16046
|
+
const braidPaginatedData = braidData.slice(braidStartIndex, braidStartIndex + braidRowsPerPage);
|
|
16047
|
+
const fedTotalPages = Math.ceil(fedData.length / fedRowsPerPage);
|
|
16048
|
+
const fedStartIndex = (fedPage - 1) * fedRowsPerPage;
|
|
16049
|
+
const fedPaginatedData = fedData.slice(fedStartIndex, fedStartIndex + fedRowsPerPage);
|
|
16050
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Container, { size: "full", padding: "lg", children: /* @__PURE__ */ jsxRuntime.jsxs(Stack, { spacing: "lg", children: [
|
|
16051
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
16052
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold tracking-tight", children: "Exception Review" }),
|
|
16053
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mt-2", children: "Compare Braid posted transactions with Fed settlement records for reconciliation" })
|
|
16054
|
+
] }),
|
|
16055
|
+
/* @__PURE__ */ jsxRuntime.jsx(Card, { children: /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: "pt-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-end gap-4", children: [
|
|
16056
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-w-[200px]", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16057
|
+
DatePicker,
|
|
16058
|
+
{
|
|
16059
|
+
label: "From Date",
|
|
16060
|
+
date: fromDate,
|
|
16061
|
+
onDateChange: setFromDate,
|
|
16062
|
+
placeholder: "Select from date"
|
|
16063
|
+
}
|
|
16064
|
+
) }),
|
|
16065
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-w-[200px]", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16066
|
+
DatePicker,
|
|
16067
|
+
{
|
|
16068
|
+
label: "To Date",
|
|
16069
|
+
date: toDate,
|
|
16070
|
+
onDateChange: setToDate,
|
|
16071
|
+
placeholder: "Select to date"
|
|
16072
|
+
}
|
|
16073
|
+
) }),
|
|
16074
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-[200px]", children: [
|
|
16075
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { children: "Transaction Type" }),
|
|
16076
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-4 mt-2", children: [
|
|
16077
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
16078
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16079
|
+
"input",
|
|
16080
|
+
{
|
|
16081
|
+
type: "radio",
|
|
16082
|
+
value: "ACH",
|
|
16083
|
+
checked: transactionType === "ACH",
|
|
16084
|
+
onChange: (e) => setTransactionType(e.target.value),
|
|
16085
|
+
className: "w-4 h-4 text-primary"
|
|
16086
|
+
}
|
|
16087
|
+
),
|
|
16088
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "ACH" })
|
|
16089
|
+
] }),
|
|
16090
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
16091
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16092
|
+
"input",
|
|
16093
|
+
{
|
|
16094
|
+
type: "radio",
|
|
16095
|
+
value: "Wire",
|
|
16096
|
+
checked: transactionType === "Wire",
|
|
16097
|
+
onChange: (e) => setTransactionType(e.target.value),
|
|
16098
|
+
className: "w-4 h-4 text-primary"
|
|
16099
|
+
}
|
|
16100
|
+
),
|
|
16101
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Wire" })
|
|
16102
|
+
] })
|
|
16103
|
+
] })
|
|
16104
|
+
] }),
|
|
16105
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Button, { onClick: handleSearch, className: "gap-2", children: [
|
|
16106
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "h-4 w-4" }),
|
|
16107
|
+
"Search"
|
|
16108
|
+
] })
|
|
16109
|
+
] }) }) }),
|
|
16110
|
+
!dataLoaded ? /* @__PURE__ */ jsxRuntime.jsx(Card, { children: /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: "py-12 text-center text-muted-foreground", children: "Select date range and transaction type, then click Search to load data" }) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
16111
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6", children: [
|
|
16112
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "flex flex-col", children: [
|
|
16113
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(CardTitle, { className: "text-lg", children: [
|
|
16114
|
+
"Braid Posted Transactions (",
|
|
16115
|
+
braidData.length,
|
|
16116
|
+
")"
|
|
16117
|
+
] }) }),
|
|
16118
|
+
/* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "flex flex-col flex-1", children: [
|
|
16119
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-md border flex-1 overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
|
|
16120
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
|
|
16121
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "w-12" }),
|
|
16122
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "Amount" }),
|
|
16123
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "Post Date" }),
|
|
16124
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "Sender Account" }),
|
|
16125
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "Receiver Account" })
|
|
16126
|
+
] }) }),
|
|
16127
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: braidData.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: /* @__PURE__ */ jsxRuntime.jsx(TableCell, { colSpan: 5, className: "text-center text-muted-foreground", children: "No transactions found" }) }) : braidPaginatedData.map((txn) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16128
|
+
TableRow,
|
|
16129
|
+
{
|
|
16130
|
+
className: selectedBraid === txn.id ? "bg-muted" : "",
|
|
16131
|
+
children: [
|
|
16132
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16133
|
+
"input",
|
|
16134
|
+
{
|
|
16135
|
+
type: "radio",
|
|
16136
|
+
name: "braid-select",
|
|
16137
|
+
checked: selectedBraid === txn.id,
|
|
16138
|
+
onChange: () => setSelectedBraid(txn.id),
|
|
16139
|
+
className: "w-4 h-4 text-primary cursor-pointer"
|
|
16140
|
+
}
|
|
16141
|
+
) }),
|
|
16142
|
+
/* @__PURE__ */ jsxRuntime.jsxs(TableCell, { className: "font-medium", children: [
|
|
16143
|
+
"$",
|
|
16144
|
+
txn.amount.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })
|
|
16145
|
+
] }),
|
|
16146
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: dateFns.format(new Date(txn.postDate), "MMM dd, yyyy") }),
|
|
16147
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "font-mono text-sm", children: txn.senderAccount }),
|
|
16148
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "font-mono text-sm", children: txn.receiverAccount })
|
|
16149
|
+
]
|
|
16150
|
+
},
|
|
16151
|
+
txn.id
|
|
16152
|
+
)) })
|
|
16153
|
+
] }) }),
|
|
16154
|
+
braidData.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-2 py-4", children: [
|
|
16155
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
16156
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: "Rows per page:" }),
|
|
16157
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
16158
|
+
"select",
|
|
16159
|
+
{
|
|
16160
|
+
value: braidRowsPerPage,
|
|
16161
|
+
onChange: (e) => {
|
|
16162
|
+
setBraidRowsPerPage(Number(e.target.value));
|
|
16163
|
+
setBraidPage(1);
|
|
16164
|
+
},
|
|
16165
|
+
className: "h-8 w-16 rounded-md border border-input bg-background px-2 text-sm",
|
|
16166
|
+
children: [
|
|
16167
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: 10, children: "10" }),
|
|
16168
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: 25, children: "25" }),
|
|
16169
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: 50, children: "50" })
|
|
16170
|
+
]
|
|
16171
|
+
}
|
|
16172
|
+
)
|
|
16173
|
+
] }),
|
|
16174
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
16175
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground", children: [
|
|
16176
|
+
"Page ",
|
|
16177
|
+
braidPage,
|
|
16178
|
+
" of ",
|
|
16179
|
+
braidTotalPages
|
|
16180
|
+
] }),
|
|
16181
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-1", children: [
|
|
16182
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16183
|
+
Button,
|
|
16184
|
+
{
|
|
16185
|
+
variant: "outline",
|
|
16186
|
+
size: "sm",
|
|
16187
|
+
onClick: () => setBraidPage(Math.max(1, braidPage - 1)),
|
|
16188
|
+
disabled: braidPage === 1,
|
|
16189
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" })
|
|
16190
|
+
}
|
|
16191
|
+
),
|
|
16192
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16193
|
+
Button,
|
|
16194
|
+
{
|
|
16195
|
+
variant: "outline",
|
|
16196
|
+
size: "sm",
|
|
16197
|
+
onClick: () => setBraidPage(Math.min(braidTotalPages, braidPage + 1)),
|
|
16198
|
+
disabled: braidPage === braidTotalPages,
|
|
16199
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
|
|
16200
|
+
}
|
|
16201
|
+
)
|
|
16202
|
+
] })
|
|
16203
|
+
] })
|
|
16204
|
+
] })
|
|
16205
|
+
] })
|
|
16206
|
+
] }),
|
|
16207
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Card, { className: "flex flex-col", children: [
|
|
16208
|
+
/* @__PURE__ */ jsxRuntime.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(CardTitle, { className: "text-lg", children: [
|
|
16209
|
+
"Fed Settlement Records (",
|
|
16210
|
+
fedData.length,
|
|
16211
|
+
")"
|
|
16212
|
+
] }) }),
|
|
16213
|
+
/* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "flex flex-col flex-1", children: [
|
|
16214
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-md border flex-1 overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
|
|
16215
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
|
|
16216
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "w-12" }),
|
|
16217
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "Amount" }),
|
|
16218
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "Settlement Date" }),
|
|
16219
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: "Receiver Account" })
|
|
16220
|
+
] }) }),
|
|
16221
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: fedData.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: /* @__PURE__ */ jsxRuntime.jsx(TableCell, { colSpan: 4, className: "text-center text-muted-foreground", children: "No settlements found" }) }) : fedPaginatedData.map((settlement) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16222
|
+
TableRow,
|
|
16223
|
+
{
|
|
16224
|
+
className: selectedFed === settlement.id ? "bg-muted" : "",
|
|
16225
|
+
children: [
|
|
16226
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16227
|
+
"input",
|
|
16228
|
+
{
|
|
16229
|
+
type: "radio",
|
|
16230
|
+
name: "fed-select",
|
|
16231
|
+
checked: selectedFed === settlement.id,
|
|
16232
|
+
onChange: () => setSelectedFed(settlement.id),
|
|
16233
|
+
className: "w-4 h-4 text-primary cursor-pointer"
|
|
16234
|
+
}
|
|
16235
|
+
) }),
|
|
16236
|
+
/* @__PURE__ */ jsxRuntime.jsxs(TableCell, { className: "font-medium", children: [
|
|
16237
|
+
"$",
|
|
16238
|
+
settlement.amount.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })
|
|
16239
|
+
] }),
|
|
16240
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: dateFns.format(new Date(settlement.settlementDate), "MMM dd, yyyy") }),
|
|
16241
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "font-mono text-sm", children: settlement.receiverAccount })
|
|
16242
|
+
]
|
|
16243
|
+
},
|
|
16244
|
+
settlement.id
|
|
16245
|
+
)) })
|
|
16246
|
+
] }) }),
|
|
16247
|
+
fedData.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-2 py-4", children: [
|
|
16248
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
16249
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: "Rows per page:" }),
|
|
16250
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
16251
|
+
"select",
|
|
16252
|
+
{
|
|
16253
|
+
value: fedRowsPerPage,
|
|
16254
|
+
onChange: (e) => {
|
|
16255
|
+
setFedRowsPerPage(Number(e.target.value));
|
|
16256
|
+
setFedPage(1);
|
|
16257
|
+
},
|
|
16258
|
+
className: "h-8 w-16 rounded-md border border-input bg-background px-2 text-sm",
|
|
16259
|
+
children: [
|
|
16260
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: 10, children: "10" }),
|
|
16261
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: 25, children: "25" }),
|
|
16262
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: 50, children: "50" })
|
|
16263
|
+
]
|
|
16264
|
+
}
|
|
16265
|
+
)
|
|
16266
|
+
] }),
|
|
16267
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
16268
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground", children: [
|
|
16269
|
+
"Page ",
|
|
16270
|
+
fedPage,
|
|
16271
|
+
" of ",
|
|
16272
|
+
fedTotalPages
|
|
16273
|
+
] }),
|
|
16274
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-1", children: [
|
|
16275
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16276
|
+
Button,
|
|
16277
|
+
{
|
|
16278
|
+
variant: "outline",
|
|
16279
|
+
size: "sm",
|
|
16280
|
+
onClick: () => setFedPage(Math.max(1, fedPage - 1)),
|
|
16281
|
+
disabled: fedPage === 1,
|
|
16282
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" })
|
|
16283
|
+
}
|
|
16284
|
+
),
|
|
16285
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16286
|
+
Button,
|
|
16287
|
+
{
|
|
16288
|
+
variant: "outline",
|
|
16289
|
+
size: "sm",
|
|
16290
|
+
onClick: () => setFedPage(Math.min(fedTotalPages, fedPage + 1)),
|
|
16291
|
+
disabled: fedPage === fedTotalPages,
|
|
16292
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
|
|
16293
|
+
}
|
|
16294
|
+
)
|
|
16295
|
+
] })
|
|
16296
|
+
] })
|
|
16297
|
+
] })
|
|
16298
|
+
] })
|
|
16299
|
+
] })
|
|
16300
|
+
] }),
|
|
16301
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16302
|
+
Button,
|
|
16303
|
+
{
|
|
16304
|
+
size: "lg",
|
|
16305
|
+
onClick: handleMatch,
|
|
16306
|
+
disabled: !canMatch,
|
|
16307
|
+
className: "min-w-[200px]",
|
|
16308
|
+
children: "Match Selected"
|
|
16309
|
+
}
|
|
16310
|
+
) })
|
|
16311
|
+
] })
|
|
16312
|
+
] }) });
|
|
16313
|
+
}
|
|
14746
16314
|
|
|
14747
16315
|
exports.ACHBankCard = ACHBankCard;
|
|
14748
16316
|
exports.ACHBasicInfoCard = ACHBasicInfoCard;
|
|
@@ -14802,6 +16370,7 @@ exports.CreateBusiness = Create_default;
|
|
|
14802
16370
|
exports.CreateBusinessView = CreateBusinessView;
|
|
14803
16371
|
exports.CreateCounterparty = Create_default2;
|
|
14804
16372
|
exports.CreateIndividual = Create_default3;
|
|
16373
|
+
exports.CreateVelocityLimit = CreateVelocityLimit;
|
|
14805
16374
|
exports.Dashboard = Dashboard_default;
|
|
14806
16375
|
exports.DashboardDemo = DashboardDemo;
|
|
14807
16376
|
exports.DataGrid = DataGrid;
|
|
@@ -14848,7 +16417,6 @@ exports.MainLayout = MainLayout;
|
|
|
14848
16417
|
exports.MetricCard = MetricCard;
|
|
14849
16418
|
exports.NewTransaction = NewTransaction;
|
|
14850
16419
|
exports.NotFound = NotFound_default;
|
|
14851
|
-
exports.OFAC = OFAC;
|
|
14852
16420
|
exports.OFACAlertView = OFACAlertView;
|
|
14853
16421
|
exports.OriginatorCard = OriginatorCard;
|
|
14854
16422
|
exports.OriginatorFI = OriginatorFI;
|
|
@@ -14860,6 +16428,8 @@ exports.Popover = Popover;
|
|
|
14860
16428
|
exports.PopoverContent = PopoverContent;
|
|
14861
16429
|
exports.PopoverTrigger = PopoverTrigger;
|
|
14862
16430
|
exports.ReceiverCard = ReceiverCard;
|
|
16431
|
+
exports.ReconExceptions = ReconExceptions;
|
|
16432
|
+
exports.ReconUpload = ReconUpload;
|
|
14863
16433
|
exports.ResolveAlertDialog = ResolveAlertDialog;
|
|
14864
16434
|
exports.ResponsiveGrid = ResponsiveGrid;
|
|
14865
16435
|
exports.ScrollArea = ScrollArea;
|
|
@@ -14932,6 +16502,8 @@ exports.TransactionHistory = TransactionHistory_default;
|
|
|
14932
16502
|
exports.TransactionTypeBadge = TransactionTypeBadge;
|
|
14933
16503
|
exports.UIKit = UIKit;
|
|
14934
16504
|
exports.UIKitShowcase = UIKitShowcase;
|
|
16505
|
+
exports.VelocityLimitDetail = VelocityLimitDetail;
|
|
16506
|
+
exports.VelocityLimits = VelocityLimits;
|
|
14935
16507
|
exports.WireDetailsSection = WireDetailsSection;
|
|
14936
16508
|
exports.WireTransferSection = WireTransferSection;
|
|
14937
16509
|
exports.badgeVariants = badgeVariants;
|