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/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((toast5) => {
560
- addToRemoveQueue(toast5.id);
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-2", wrapperClassName), children: [
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: "INACTIVE", label: "Inactive" },
6225
- { value: "PENDING", label: "Pending" },
6226
- { value: "SUSPENDED", label: "Suspended" }
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 = ({ onDataChange }) => {
6975
- const [formData, setFormData] = React15.useState({
6976
- name: "",
6977
- type: "business",
6978
- email: "",
6979
- phone: "",
6980
- dateOfBirth: "",
6981
- idNumber: "",
6982
- idType: "product_id",
6983
- idValue: ""
6984
- });
6985
- const handleInputChange = (field, value) => {
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: formData.name,
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: formData.type === "business",
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: formData.type === "individual",
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: formData.idType,
7043
- onValueChange: (value) => handleInputChange("idType", value),
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: formData.idType === "product_id" ? "Product ID" : formData.idType === "business_id" ? "Business ID" : formData.idType === "individual_id" ? "Individual ID" : "Account Number",
7056
- value: formData.idValue,
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 ${formData.idType === "product_id" ? "product ID" : formData.idType === "business_id" ? "business ID" : formData.idType === "individual_id" ? "individual ID" : "account number"}`,
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: formData.email,
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: formData.phone,
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: formData.dateOfBirth,
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: formData.idNumber,
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(null);
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
- PageLayout,
11743
+ CreateCounterpartyView,
11671
11744
  {
11672
- title: "Create Counterparty",
11673
- description: "Create a new counterparty with all required information",
11674
- actions: [
11675
- { label: "Cancel", variant: "outline", onClick: handleCancel },
11676
- { label: "Create Counterparty", variant: "default", onClick: handleSubmit }
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 getStatusVariant2 = (status) => {
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: getStatusVariant2(transaction.status), children: transaction.status }),
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 OFACFiltersSheet({
14456
+ function VelocityLimitFiltersSheet({
14412
14457
  filters,
14413
14458
  onFilterChange,
14414
14459
  onResetFilters
14415
14460
  }) {
14416
- const hasActiveFilters = filters.status !== "" || filters.entityType !== "" || filters.startDate !== void 0 || filters.endDate !== void 0;
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: [filters.status, filters.entityType, filters.startDate, filters.endDate].filter(Boolean).length })
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 OFAC Checks" }),
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 OFAC screening results by status, entity type, and date range" })
14486
+ /* @__PURE__ */ jsxRuntime.jsx(SheetDescription, { children: "Filter velocity limits by account, limit details, and transaction settings" })
14442
14487
  ] }),
14443
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6 mt-6", children: [
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: "All statuses",
14552
+ placeholder: "Select status",
14449
14553
  options: [
14450
14554
  { value: "all", label: "All statuses" },
14451
- { value: "NO MATCH", label: "No Match" },
14452
- { value: "REVIEW", label: "Review" },
14453
- { value: "CLEARED", label: "Cleared" },
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: "Entity Type",
14464
- placeholder: "All entity types",
14566
+ label: "Aggregation Level",
14567
+ placeholder: "Select aggregation level",
14465
14568
  options: [
14466
- { value: "all", label: "All entity types" },
14467
- { value: "Business", label: "Business" },
14468
- { value: "Individual", label: "Individual" },
14469
- { value: "Counterparty", label: "Counterparty" }
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.entityType || "all",
14472
- onValueChange: (value) => onFilterChange("entityType", value === "all" ? "" : value)
14574
+ value: filters.aggregationLevel || "all",
14575
+ onValueChange: (value) => onFilterChange("aggregationLevel", value === "all" ? "" : value)
14473
14576
  }
14474
14577
  ),
14475
14578
  /* @__PURE__ */ jsxRuntime.jsx(
14476
- DatePicker,
14579
+ EnhancedSelect,
14477
14580
  {
14478
- date: filters.startDate,
14479
- onDateChange: (date) => onFilterChange("startDate", date),
14480
- label: "Start Date",
14481
- placeholder: "MM/DD/YYYY"
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
- DatePicker,
14593
+ EnhancedSelect,
14486
14594
  {
14487
- date: filters.endDate,
14488
- onDateChange: (date) => onFilterChange("endDate", date),
14489
- label: "End Date",
14490
- placeholder: "MM/DD/YYYY",
14491
- disabledDates: (date) => filters.startDate ? date < filters.startDate : false
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/ofac-data.ts
14500
- var mockOFACChecks = [
14501
- {
14502
- id: "ofac-001",
14503
- created: "2024-01-15T10:30:00Z",
14504
- entityId: "8112488",
14505
- entityName: "Acme Corporation",
14506
- entityType: "Business",
14507
- alertId: "ALT-001",
14508
- status: "CLEARED"
14509
- },
14510
- {
14511
- id: "ofac-002",
14512
- created: "2024-01-14T14:22:00Z",
14513
- entityId: "8111609",
14514
- entityName: "Global Tech Industries",
14515
- entityType: "Business",
14516
- alertId: "ALT-002",
14517
- status: "REVIEW"
14518
- },
14519
- {
14520
- id: "ofac-003",
14521
- created: "2024-01-14T09:15:00Z",
14522
- entityId: "IND-001",
14523
- entityName: "John Smith",
14524
- entityType: "Individual",
14525
- alertId: null,
14526
- status: "NO MATCH"
14527
- },
14528
- {
14529
- id: "ofac-004",
14530
- created: "2024-01-13T16:45:00Z",
14531
- entityId: "8111026",
14532
- entityName: "Innovation Partners LLC",
14533
- entityType: "Business",
14534
- alertId: "ALT-003",
14535
- status: "CONFIRMED"
14536
- },
14537
- {
14538
- id: "ofac-005",
14539
- created: "2024-01-13T11:20:00Z",
14540
- entityId: "IND-002",
14541
- entityName: "Jane Doe",
14542
- entityType: "Individual",
14543
- alertId: null,
14544
- status: "NO MATCH"
14545
- },
14546
- {
14547
- id: "ofac-006",
14548
- created: "2024-01-12T13:30:00Z",
14549
- entityId: "CP-001",
14550
- entityName: "International Suppliers Inc",
14551
- entityType: "Counterparty",
14552
- alertId: "ALT-004",
14553
- status: "REVIEW"
14554
- },
14555
- {
14556
- id: "ofac-007",
14557
- created: "2024-01-12T08:00:00Z",
14558
- entityId: "8110892",
14559
- entityName: "NextGen Solutions",
14560
- entityType: "Business",
14561
- alertId: null,
14562
- status: "NO MATCH"
14563
- },
14564
- {
14565
- id: "ofac-008",
14566
- created: "2024-01-11T15:10:00Z",
14567
- entityId: "IND-003",
14568
- entityName: "Robert Johnson",
14569
- entityType: "Individual",
14570
- alertId: "ALT-005",
14571
- status: "CLEARED"
14572
- },
14573
- {
14574
- id: "ofac-009",
14575
- created: "2024-01-11T10:45:00Z",
14576
- entityId: "CP-002",
14577
- entityName: "Overseas Trading Company",
14578
- entityType: "Counterparty",
14579
- alertId: "ALT-006",
14580
- status: "REVIEW"
14581
- },
14582
- {
14583
- id: "ofac-010",
14584
- created: "2024-01-10T14:25:00Z",
14585
- entityId: "8110654",
14586
- entityName: "Digital Ventures Group",
14587
- entityType: "Business",
14588
- alertId: null,
14589
- status: "NO MATCH"
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 "NO MATCH":
14753
+ case "ACTIVE":
14595
14754
  return "success";
14596
- case "REVIEW":
14755
+ case "INACTIVE":
14597
14756
  return "warning";
14598
- case "CLEARED":
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 getEntityUrl = (entityType, entityId) => {
14607
- switch (entityType) {
14608
- case "Business":
14609
- return `/business/${entityId}`;
14610
- case "Individual":
14611
- return `/individual/${entityId}`;
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 OFAC() {
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
- entityType: "",
14625
- startDate: void 0,
14626
- endDate: void 0
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
- entityType: "",
14635
- startDate: void 0,
14636
- endDate: void 0
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 filteredChecks = React15.useMemo(() => {
14648
- return mockOFACChecks.filter((check) => {
14649
- if (filters.status && check.status !== filters.status) {
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.entityType && check.entityType !== filters.entityType) {
14821
+ if (filters.limitName && !limit.limitName.toLowerCase().includes(filters.limitName.toLowerCase())) {
14653
14822
  return false;
14654
14823
  }
14655
- if (filters.startDate || filters.endDate) {
14656
- const checkDate = dateFns.parseISO(check.created);
14657
- if (filters.startDate && dateFns.isBefore(checkDate, dateFns.startOfDay(filters.startDate))) {
14658
- return false;
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 sortedChecks = [...filteredChecks].sort((a, b) => {
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 text-muted-foreground", children: dateFns.format(dateFns.parseISO(value), "MMM d, yyyy h:mm a") })
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: "entityType",
14699
- title: "Entity Type",
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: "alertId",
14705
- title: "Alert ID",
14706
- render: (value) => value ? /* @__PURE__ */ jsxRuntime.jsx(
14707
- "button",
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: "OFAC Checks" }) }),
14725
- /* @__PURE__ */ jsxRuntime.jsx(
14726
- OFACFiltersSheet,
14727
- {
14728
- filters,
14729
- onFilterChange: handleFilterChange,
14730
- onResetFilters: handleResetFilters
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: sortedChecks,
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;