braid-ui 1.0.66 → 1.0.67

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
@@ -385,10 +385,6 @@ var AlertTimeline = ({ events }) => {
385
385
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("absolute left-0 top-0 flex-none", getStatusColor2(event.status, event.action)), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-4", children: getIcon(event.action) }) }),
386
386
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-0.5", children: [
387
387
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-foreground", children: event.action }),
388
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", children: [
389
- "by ",
390
- event.user
391
- ] }),
392
388
  event.details && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: event.details }),
393
389
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground/70 pt-0.5", children: event.timestamp })
394
390
  ] })
@@ -1363,7 +1359,7 @@ var DialogDescription = React15__namespace.forwardRef(({ className, ...props },
1363
1359
  }
1364
1360
  ));
1365
1361
  DialogDescription.displayName = DialogPrimitive__namespace.Description.displayName;
1366
- var JsonViewer = ({ data, className, compact = false, maxHeight = "60vh" }) => {
1362
+ var JsonViewer = ({ data, className, compact = false, maxHeight = "60vh", expandFully = false }) => {
1367
1363
  const [copied, setCopied] = React15.useState(false);
1368
1364
  const handleCopy = () => {
1369
1365
  navigator.clipboard.writeText(JSON.stringify(data, null, 2));
@@ -1391,18 +1387,18 @@ var JsonViewer = ({ data, className, compact = false, maxHeight = "60vh" }) => {
1391
1387
  "div",
1392
1388
  {
1393
1389
  className: cn(
1394
- "overflow-auto bg-muted/30 rounded-lg border font-mono",
1395
- compact ? "max-h-[300px] p-2 text-xs" : `max-h-[${maxHeight}] p-4 text-xs`
1390
+ "bg-muted/30 rounded-lg border font-mono",
1391
+ expandFully ? "p-4 text-xs" : compact ? "max-h-[300px] overflow-auto p-2 text-xs" : "overflow-auto p-4 text-xs"
1396
1392
  ),
1397
- style: { maxHeight: compact ? "300px" : maxHeight },
1393
+ style: expandFully ? void 0 : { maxHeight: compact ? "300px" : maxHeight },
1398
1394
  children: /* @__PURE__ */ jsxRuntime.jsx(JsonNode, { data, name: "root", depth: 0, compact })
1399
1395
  }
1400
1396
  )
1401
1397
  ] });
1402
1398
  };
1403
1399
  var JsonNode = ({ data, name, depth, compact = false }) => {
1404
- const [isExpanded, setIsExpanded] = React15.useState(compact ? depth < 1 : depth < 2);
1405
- const indent = compact ? depth * 12 : depth * 16;
1400
+ const [isExpanded, setIsExpanded] = React15.useState(true);
1401
+ const indent = depth * 8;
1406
1402
  if (data === null) {
1407
1403
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { paddingLeft: indent }, className: "text-muted-foreground", children: [
1408
1404
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary", children: name }),
@@ -8281,31 +8277,10 @@ var ACHDetailsSection = ({ data }) => {
8281
8277
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-x-8 gap-y-4", children: [
8282
8278
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Type", value: data.type, layout: "horizontal" }),
8283
8279
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator Name", value: data.originatorName, layout: "horizontal" }),
8284
- /* @__PURE__ */ jsxRuntime.jsx(
8285
- InfoField,
8286
- {
8287
- label: "Originator Account Number",
8288
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.originatorAccountNumber }),
8289
- layout: "horizontal"
8290
- }
8291
- ),
8280
+ /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator Account Number", value: data.originatorAccountNumber, layout: "horizontal" }),
8292
8281
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Receiver Name", value: data.receiverName, layout: "horizontal" }),
8293
- /* @__PURE__ */ jsxRuntime.jsx(
8294
- InfoField,
8295
- {
8296
- label: "Receiver Account Number",
8297
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.receiverAccountNumber }),
8298
- layout: "horizontal"
8299
- }
8300
- ),
8301
- /* @__PURE__ */ jsxRuntime.jsx(
8302
- InfoField,
8303
- {
8304
- label: "Receiver Routing Number",
8305
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.receiverRoutingNumber }),
8306
- layout: "horizontal"
8307
- }
8308
- ),
8282
+ /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Receiver Account Number", value: data.receiverAccountNumber, layout: "horizontal" }),
8283
+ /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Receiver Routing Number", value: data.receiverRoutingNumber, layout: "horizontal" }),
8309
8284
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Amount", value: formatCurrency5(data.amount), layout: "horizontal" }),
8310
8285
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "SEC Code", value: data.secCode, layout: "horizontal" }),
8311
8286
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Company Entry Description", value: data.companyEntryDescription, layout: "horizontal" }),
@@ -8314,13 +8289,25 @@ var ACHDetailsSection = ({ data }) => {
8314
8289
  data.individualName && /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Individual Name", value: data.individualName, layout: "horizontal" }),
8315
8290
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Trace Number", value: data.traceNumber, layout: "horizontal" })
8316
8291
  ] }),
8317
- data.raw && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 pt-6 border-t border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
8318
- InfoField,
8292
+ data.raw && /* @__PURE__ */ jsxRuntime.jsx(CollapsibleRawSection, { data: data.raw })
8293
+ ] });
8294
+ };
8295
+ var CollapsibleRawSection = ({ data }) => {
8296
+ const [isExpanded, setIsExpanded] = React15.useState(false);
8297
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 pt-6 border-t border-border", children: [
8298
+ /* @__PURE__ */ jsxRuntime.jsxs(
8299
+ "button",
8319
8300
  {
8320
- label: "Raw",
8321
- value: /* @__PURE__ */ jsxRuntime.jsx(JsonViewer, { data: data.raw, className: "mt-2", compact: true })
8301
+ type: "button",
8302
+ onClick: () => setIsExpanded(!isExpanded),
8303
+ className: "flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors",
8304
+ children: [
8305
+ isExpanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" }),
8306
+ "Raw message"
8307
+ ]
8322
8308
  }
8323
- ) })
8309
+ ),
8310
+ isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsxRuntime.jsx(JsonViewer, { data, expandFully: true }) })
8324
8311
  ] });
8325
8312
  };
8326
8313
  var WireDetailsSection = ({ data, onIMADChange }) => {
@@ -8412,67 +8399,39 @@ var WireDetailsSection = ({ data, onIMADChange }) => {
8412
8399
  }
8413
8400
  ),
8414
8401
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator Name", value: data.originatorName, layout: "horizontal" }),
8415
- /* @__PURE__ */ jsxRuntime.jsx(
8416
- InfoField,
8417
- {
8418
- label: "Originator Account Number",
8419
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.originatorAccountNumber }),
8420
- layout: "horizontal"
8421
- }
8422
- ),
8423
- /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator Address", value: data.originatorAddress, layout: "horizontal" }),
8402
+ /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator Account Number", value: data.originatorAccountNumber, layout: "horizontal" }),
8424
8403
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Beneficiary Name", value: data.beneficiaryName, layout: "horizontal" }),
8425
- /* @__PURE__ */ jsxRuntime.jsx(
8426
- InfoField,
8427
- {
8428
- label: "Beneficiary Account Number",
8429
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.beneficiaryAccountNumber }),
8430
- layout: "horizontal"
8431
- }
8432
- ),
8433
- /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Beneficiary Address", value: data.beneficiaryAddress, layout: "horizontal" }),
8404
+ /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Beneficiary Account Number", value: data.beneficiaryAccountNumber, layout: "horizontal" }),
8434
8405
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Beneficiary FI Name", value: data.beneficiaryFIName, layout: "horizontal" }),
8435
- /* @__PURE__ */ jsxRuntime.jsx(
8436
- InfoField,
8437
- {
8438
- label: "Beneficiary FI Routing Number",
8439
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.beneficiaryFIRoutingNumber }),
8440
- layout: "horizontal"
8441
- }
8442
- ),
8443
- /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Beneficiary FI Address", value: data.beneficiaryFIAddress, layout: "horizontal" }),
8406
+ /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Beneficiary FI Routing Number", value: data.beneficiaryFIRoutingNumber, layout: "horizontal" }),
8444
8407
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator FI Name", value: data.originatorFIName, layout: "horizontal" }),
8445
- /* @__PURE__ */ jsxRuntime.jsx(
8446
- InfoField,
8447
- {
8448
- label: "Originator FI Routing Number",
8449
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.originatorFIRoutingNumber }),
8450
- layout: "horizontal"
8451
- }
8452
- ),
8453
- /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator FI Address", value: data.originatorFIAddress || "-", layout: "horizontal" }),
8408
+ /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator FI Routing Number", value: data.originatorFIRoutingNumber, layout: "horizontal" }),
8454
8409
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Originator to Beneficiary Info", value: data.originatorToBeneficiaryInfo || "-", layout: "horizontal" }),
8455
8410
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "File Handle", value: data.fileHandle || "-", layout: "horizontal" }),
8456
8411
  data.intermediaryFIName && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
8457
8412
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Intermediary FI Name", value: data.intermediaryFIName, layout: "horizontal" }),
8458
- data.intermediaryFIRoutingNumber && /* @__PURE__ */ jsxRuntime.jsx(
8459
- InfoField,
8460
- {
8461
- label: "Intermediary FI Routing Number",
8462
- value: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "link", className: "h-auto p-0 text-sm", children: data.intermediaryFIRoutingNumber }),
8463
- layout: "horizontal"
8464
- }
8465
- ),
8466
- data.intermediaryFIAddress && /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Intermediary FI Address", value: data.intermediaryFIAddress, layout: "horizontal" })
8413
+ data.intermediaryFIRoutingNumber && /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Intermediary FI Routing Number", value: data.intermediaryFIRoutingNumber, layout: "horizontal" })
8467
8414
  ] })
8468
8415
  ] }),
8469
- data.raw && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 pt-6 border-t border-border", children: /* @__PURE__ */ jsxRuntime.jsx(
8470
- InfoField,
8416
+ data.raw && /* @__PURE__ */ jsxRuntime.jsx(CollapsibleRawSection2, { data: data.raw })
8417
+ ] });
8418
+ };
8419
+ var CollapsibleRawSection2 = ({ data }) => {
8420
+ const [isExpanded, setIsExpanded] = React15.useState(false);
8421
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 pt-6 border-t border-border", children: [
8422
+ /* @__PURE__ */ jsxRuntime.jsxs(
8423
+ "button",
8471
8424
  {
8472
- label: "Raw",
8473
- value: /* @__PURE__ */ jsxRuntime.jsx(JsonViewer, { data: data.raw, className: "mt-2", compact: true })
8425
+ type: "button",
8426
+ onClick: () => setIsExpanded(!isExpanded),
8427
+ className: "flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors",
8428
+ children: [
8429
+ isExpanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" }),
8430
+ "Raw message"
8431
+ ]
8474
8432
  }
8475
- ) })
8433
+ ),
8434
+ isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsxRuntime.jsx(JsonViewer, { data, expandFully: true }) })
8476
8435
  ] });
8477
8436
  };
8478
8437
  var formatCurrency2 = (value) => {
@@ -9044,6 +9003,7 @@ var EnhancedMultiSelect = ({
9044
9003
  disabled = false
9045
9004
  }) => {
9046
9005
  const [open, setOpen] = React15__namespace.useState(false);
9006
+ const [searchQuery, setSearchQuery] = React15__namespace.useState("");
9047
9007
  const [popoverContainer, setPopoverContainer] = React15__namespace.useState(null);
9048
9008
  const triggerRef = React15__namespace.useRef(null);
9049
9009
  React15__namespace.useEffect(() => {
@@ -9065,9 +9025,19 @@ var EnhancedMultiSelect = ({
9065
9025
  onValueChange(value.filter((v) => v !== optionValue));
9066
9026
  };
9067
9027
  const selectedLabels = value.map((v) => options.find((opt) => opt.value === v)?.label).filter(Boolean);
9028
+ const filteredOptions = React15__namespace.useMemo(() => {
9029
+ if (!searchQuery.trim()) return options;
9030
+ const query = searchQuery.toLowerCase();
9031
+ return options.filter(
9032
+ (option) => option.label.toLowerCase().includes(query)
9033
+ );
9034
+ }, [options, searchQuery]);
9068
9035
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("space-y-2", className), children: [
9069
9036
  label && /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", children: label }),
9070
- /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, modal: false, children: [
9037
+ /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: (isOpen) => {
9038
+ setOpen(isOpen);
9039
+ if (!isOpen) setSearchQuery("");
9040
+ }, modal: false, children: [
9071
9041
  /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
9072
9042
  Button,
9073
9043
  {
@@ -9106,7 +9076,7 @@ var EnhancedMultiSelect = ({
9106
9076
  ]
9107
9077
  }
9108
9078
  ) }),
9109
- /* @__PURE__ */ jsxRuntime.jsx(
9079
+ /* @__PURE__ */ jsxRuntime.jsxs(
9110
9080
  PopoverContent,
9111
9081
  {
9112
9082
  container: popoverContainer,
@@ -9119,44 +9089,63 @@ var EnhancedMultiSelect = ({
9119
9089
  e.preventDefault();
9120
9090
  }
9121
9091
  },
9122
- children: /* @__PURE__ */ jsxRuntime.jsx(
9123
- "div",
9124
- {
9125
- className: "max-h-[240px] overflow-y-auto overscroll-contain p-1",
9126
- onWheel: (e) => e.stopPropagation(),
9127
- onTouchMove: (e) => e.stopPropagation(),
9128
- children: options.map((option) => {
9129
- const isSelected = value.includes(option.value);
9130
- return /* @__PURE__ */ jsxRuntime.jsxs(
9131
- "div",
9132
- {
9133
- role: "option",
9134
- "aria-selected": isSelected,
9135
- className: cn(
9136
- "flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground select-none",
9137
- isSelected && "bg-accent"
9138
- ),
9139
- onMouseDown: (e) => e.preventDefault(),
9140
- onClick: () => handleSelect(option.value),
9141
- children: [
9142
- /* @__PURE__ */ jsxRuntime.jsx(
9143
- "div",
9144
- {
9145
- className: cn(
9146
- "flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
9147
- isSelected ? "bg-primary text-primary-foreground" : "opacity-50"
9092
+ children: [
9093
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-2 border-b", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
9094
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
9095
+ /* @__PURE__ */ jsxRuntime.jsx(
9096
+ "input",
9097
+ {
9098
+ type: "text",
9099
+ placeholder: "Search...",
9100
+ value: searchQuery,
9101
+ onChange: (e) => setSearchQuery(e.target.value),
9102
+ className: "w-full pl-8 pr-2 py-1.5 text-sm border rounded-md bg-background focus:outline-none focus:ring-1 focus:ring-ring",
9103
+ onKeyDown: (e) => e.stopPropagation()
9104
+ }
9105
+ )
9106
+ ] }) }),
9107
+ /* @__PURE__ */ jsxRuntime.jsxs(
9108
+ "div",
9109
+ {
9110
+ className: "max-h-[240px] overflow-y-auto overscroll-contain p-1",
9111
+ onWheel: (e) => e.stopPropagation(),
9112
+ onTouchMove: (e) => e.stopPropagation(),
9113
+ children: [
9114
+ filteredOptions.map((option) => {
9115
+ const isSelected = value.includes(option.value);
9116
+ return /* @__PURE__ */ jsxRuntime.jsxs(
9117
+ "div",
9118
+ {
9119
+ role: "option",
9120
+ "aria-selected": isSelected,
9121
+ className: cn(
9122
+ "flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground select-none",
9123
+ isSelected && "bg-accent"
9124
+ ),
9125
+ onMouseDown: (e) => e.preventDefault(),
9126
+ onClick: () => handleSelect(option.value),
9127
+ children: [
9128
+ /* @__PURE__ */ jsxRuntime.jsx(
9129
+ "div",
9130
+ {
9131
+ className: cn(
9132
+ "flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
9133
+ isSelected ? "bg-primary text-primary-foreground" : "opacity-50"
9134
+ ),
9135
+ children: isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3 w-3" })
9136
+ }
9148
9137
  ),
9149
- children: isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3 w-3" })
9150
- }
9151
- ),
9152
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: option.label })
9153
- ]
9154
- },
9155
- option.value
9156
- );
9157
- })
9158
- }
9159
- )
9138
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: option.label })
9139
+ ]
9140
+ },
9141
+ option.value
9142
+ );
9143
+ }),
9144
+ filteredOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-4 text-sm text-center text-muted-foreground", children: "No options found" })
9145
+ ]
9146
+ }
9147
+ )
9148
+ ]
9160
9149
  }
9161
9150
  )
9162
9151
  ] })
@@ -9621,6 +9610,7 @@ var TransactionDetailView = ({
9621
9610
  onCounterpartyClick,
9622
9611
  onOFACClick,
9623
9612
  onProductClick,
9613
+ onAlertClick,
9624
9614
  onIMADChange,
9625
9615
  isLoading,
9626
9616
  error,
@@ -9647,6 +9637,12 @@ var TransactionDetailView = ({
9647
9637
  ] })
9648
9638
  ] }) });
9649
9639
  }
9640
+ const [copiedField, setCopiedField] = React15.useState(null);
9641
+ const handleCopy = (value, fieldName) => {
9642
+ navigator.clipboard.writeText(value);
9643
+ setCopiedField(fieldName);
9644
+ setTimeout(() => setCopiedField(null), 2e3);
9645
+ };
9650
9646
  if (!transaction) {
9651
9647
  return null;
9652
9648
  }
@@ -9688,15 +9684,26 @@ var TransactionDetailView = ({
9688
9684
  InfoField,
9689
9685
  {
9690
9686
  label: "Account Number",
9691
- value: /* @__PURE__ */ jsxRuntime.jsx(
9692
- Button,
9693
- {
9694
- variant: "link",
9695
- className: "h-auto p-0 text-sm",
9696
- onClick: () => onAccountClick(transaction.accountNumber),
9697
- children: transaction.accountNumber
9698
- }
9699
- ),
9687
+ value: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
9688
+ /* @__PURE__ */ jsxRuntime.jsx(
9689
+ Button,
9690
+ {
9691
+ variant: "link",
9692
+ className: "h-auto p-0 text-sm",
9693
+ onClick: () => onAccountClick(transaction.accountNumber),
9694
+ children: transaction.accountNumber
9695
+ }
9696
+ ),
9697
+ /* @__PURE__ */ jsxRuntime.jsx(
9698
+ "button",
9699
+ {
9700
+ type: "button",
9701
+ onClick: () => handleCopy(transaction.accountNumber, "accountNumber"),
9702
+ className: "text-muted-foreground hover:text-foreground transition-colors",
9703
+ children: copiedField === "accountNumber" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3.5 w-3.5 text-success" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { className: "h-3.5 w-3.5" })
9704
+ }
9705
+ )
9706
+ ] }),
9700
9707
  layout: "horizontal"
9701
9708
  }
9702
9709
  ),
@@ -9752,7 +9759,25 @@ var TransactionDetailView = ({
9752
9759
  ),
9753
9760
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Original Filename", value: transaction.originalFilename || "-", layout: "horizontal" }),
9754
9761
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Loaded From File", value: transaction.loadedFromFile || "-", layout: "horizontal" }),
9755
- /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Payment ID", value: transaction.id, layout: "horizontal" }),
9762
+ /* @__PURE__ */ jsxRuntime.jsx(
9763
+ InfoField,
9764
+ {
9765
+ label: "Payment ID",
9766
+ value: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
9767
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: transaction.id }),
9768
+ /* @__PURE__ */ jsxRuntime.jsx(
9769
+ "button",
9770
+ {
9771
+ type: "button",
9772
+ onClick: () => handleCopy(transaction.id, "paymentId"),
9773
+ className: "text-muted-foreground hover:text-foreground transition-colors",
9774
+ children: copiedField === "paymentId" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3.5 w-3.5 text-success" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { className: "h-3.5 w-3.5" })
9775
+ }
9776
+ )
9777
+ ] }),
9778
+ layout: "horizontal"
9779
+ }
9780
+ ),
9756
9781
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Linked Payment ID", value: transaction.linkedPaymentId || "-", layout: "horizontal" }),
9757
9782
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Pending until Date", value: transaction.pendingUntilDate || "-", layout: "horizontal" }),
9758
9783
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Further Credit To", value: transaction.furtherCreditTo || "-", layout: "horizontal" }),
@@ -9778,7 +9803,25 @@ var TransactionDetailView = ({
9778
9803
  }
9779
9804
  ),
9780
9805
  /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Returned In File", value: transaction.returnedInFile || "-", layout: "horizontal" }),
9781
- /* @__PURE__ */ jsxRuntime.jsx(InfoField, { label: "Alerts", value: transaction.alerts?.join(", ") || "-", layout: "horizontal" })
9806
+ /* @__PURE__ */ jsxRuntime.jsx(
9807
+ InfoField,
9808
+ {
9809
+ label: "Alerts",
9810
+ value: transaction.alerts && transaction.alerts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: transaction.alerts.map((alertId, index) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center", children: [
9811
+ /* @__PURE__ */ jsxRuntime.jsx(
9812
+ Button,
9813
+ {
9814
+ variant: "link",
9815
+ className: "h-auto p-0 text-sm",
9816
+ onClick: () => onAlertClick?.(alertId),
9817
+ children: alertId
9818
+ }
9819
+ ),
9820
+ index < transaction.alerts.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-1", children: "," })
9821
+ ] }, alertId)) }) : "-",
9822
+ layout: "horizontal"
9823
+ }
9824
+ )
9782
9825
  ] }) }),
9783
9826
  isACHTransfer && transaction.achDetails && /* @__PURE__ */ jsxRuntime.jsx(ACHDetailsSection, { data: transaction.achDetails }),
9784
9827
  isWireTransfer && transaction.wireDetails && /* @__PURE__ */ jsxRuntime.jsx(WireDetailsSection, { data: transaction.wireDetails, onIMADChange })
@@ -14900,72 +14943,156 @@ var mockTransactions = [
14900
14943
  intermediaryFIAddress: "100 Federal Street, Boston, MA 02110",
14901
14944
  imad: "20250930MMQFMP030000123",
14902
14945
  raw: {
14903
- messageType: "MT103",
14904
- sender: "WFBIUS6SXXX",
14905
- receiver: "CHASUS33XXX",
14906
- transactionReference: "INV-2024-089-TXN-001",
14907
- relatedReference: "INV-2024-089",
14908
- bankOperationCode: "CRED",
14909
- instructionCode: "CHQB",
14910
- valueDate: "2025-09-30",
14911
- currency: "USD",
14912
- amount: "15000.00",
14913
- orderingCustomer: {
14914
- account: "445821903456",
14915
- name: "Tech Solutions LLC",
14916
- address: [
14917
- "123 Tech Street",
14918
- "San Francisco, CA 94105",
14919
- "United States"
14920
- ]
14921
- },
14922
- orderingInstitution: {
14923
- bic: "WFBIUS6SXXX",
14924
- name: "Wells Fargo Bank N.A.",
14925
- address: [
14926
- "420 Montgomery Street",
14927
- "San Francisco, CA 94104"
14928
- ]
14929
- },
14930
- intermediaryInstitution: {
14931
- bic: "BOFAUS3NXXX",
14932
- name: "Bank of America N.A.",
14933
- clearingCode: "026009593",
14934
- address: [
14935
- "100 Federal Street",
14936
- "Boston, MA 02110"
14937
- ]
14938
- },
14939
- beneficiaryInstitution: {
14940
- bic: "CHASUS33XXX",
14941
- name: "JPMorgan Chase Bank N.A.",
14942
- clearingCode: "021000021",
14943
- address: [
14944
- "270 Park Avenue",
14945
- "New York, NY 10017"
14946
- ]
14947
- },
14948
- beneficiaryCustomer: {
14949
- account: "998877665544",
14950
- name: "Global Suppliers Inc",
14951
- address: [
14952
- "456 Supply Avenue",
14953
- "New York, NY 10001",
14954
- "United States"
14946
+ fiToFICstmrCdtTrf: {
14947
+ grpHdr: {
14948
+ msgId: "20250703QMGFT004000033",
14949
+ creDtTm: {
14950
+ dateTime: {
14951
+ date: { year: 2025, month: 7, day: 3 },
14952
+ time: { hour: 12, minute: 26, second: 1, nano: 99e7 }
14953
+ },
14954
+ offset: { totalSeconds: -14400 }
14955
+ },
14956
+ nbOfTxs: "1",
14957
+ sttlmInf: {
14958
+ sttlmMtd: "CLRG",
14959
+ clrSys: { cd: "FDW" }
14960
+ }
14961
+ },
14962
+ cdtTrfTxInf: [
14963
+ {
14964
+ pmtId: {
14965
+ endToEndId: "Test wire #1",
14966
+ uetr: "2638c715-d0a2-4fc9-a79b-a4e78dc9cd49"
14967
+ },
14968
+ pmtTpInf: {
14969
+ lclInstrm: { prtry: "CTRC" }
14970
+ },
14971
+ intrBkSttlmAmt: { value: 38, ccy: "USD" },
14972
+ intrBkSttlmDt: { year: 2025, month: 7, day: 3 },
14973
+ instdAmt: { value: 11, ccy: "USD" },
14974
+ chrgBr: "SHAR",
14975
+ instgAgt: {
14976
+ finInstnId: {
14977
+ clrSysMmbId: {
14978
+ clrSysId: { cd: "USABA" },
14979
+ mmbId: "321177573"
14980
+ }
14981
+ }
14982
+ },
14983
+ instdAgt: {
14984
+ finInstnId: {
14985
+ clrSysMmbId: {
14986
+ clrSysId: { cd: "USABA" },
14987
+ mmbId: "121182881"
14988
+ }
14989
+ }
14990
+ },
14991
+ dbtr: {
14992
+ nm: "Sarah Escobar",
14993
+ pstlAdr: {
14994
+ strtNm: "12345 Kaiser lane",
14995
+ bldgNb: "E425",
14996
+ pstCd: "12345",
14997
+ twnNm: "COSTA MESA",
14998
+ ctrySubDvsn: "CA",
14999
+ ctry: "US"
15000
+ }
15001
+ },
15002
+ dbtrAcct: {
15003
+ id: { othr: { id: "12345678910" } }
15004
+ },
15005
+ dbtrAgt: {
15006
+ finInstnId: {
15007
+ clrSysMmbId: {
15008
+ clrSysId: { cd: "USABA" },
15009
+ mmbId: "321177573"
15010
+ },
15011
+ nm: "NORTH BAY CREDIT UNION",
15012
+ pstlAdr: {
15013
+ strtNm: "397 Aviation Blvd",
15014
+ pstCd: "95403",
15015
+ twnNm: "Santa Rosa",
15016
+ ctrySubDvsn: "CA",
15017
+ ctry: "US"
15018
+ }
15019
+ }
15020
+ },
15021
+ cdtrAgt: {
15022
+ finInstnId: {
15023
+ clrSysMmbId: {
15024
+ clrSysId: { cd: "USABA" },
15025
+ mmbId: "121182881"
15026
+ },
15027
+ nm: "NORTH BAY CREDIT UNION",
15028
+ pstlAdr: {
15029
+ strtNm: "397 Aviation Blvd",
15030
+ pstCd: "12345",
15031
+ twnNm: "Santa Rosa",
15032
+ ctrySubDvsn: "CA",
15033
+ ctry: "US"
15034
+ }
15035
+ }
15036
+ },
15037
+ cdtr: {
15038
+ nm: "Jake from Braid LLC",
15039
+ pstlAdr: {
15040
+ strtNm: "12345 Test Lane",
15041
+ pstCd: "12345",
15042
+ twnNm: "Newport Beach",
15043
+ ctrySubDvsn: "TX",
15044
+ ctry: "US"
15045
+ }
15046
+ },
15047
+ cdtrAcct: {
15048
+ id: { othr: { id: "9988957447" } }
15049
+ },
15050
+ purp: { prtry: "Test wire #1" },
15051
+ rmtInf: { ustrd: ["Test wire #1"] }
15052
+ }
14955
15053
  ]
14956
15054
  },
14957
- remittanceInformation: "Invoice Payment for INV-2024-089 - Equipment Purchase",
14958
- regulatoryReporting: {
14959
- code: "BENEFRES",
14960
- country: "US",
14961
- narrative: "Payment for goods"
15055
+ appHdr: {
15056
+ fr: {
15057
+ fiId: {
15058
+ finInstnId: {
15059
+ clrSysMmbId: { mmbId: "021151080" }
15060
+ }
15061
+ }
15062
+ },
15063
+ to: {
15064
+ fiId: {
15065
+ finInstnId: {
15066
+ clrSysMmbId: { mmbId: "321177573" }
15067
+ }
15068
+ }
15069
+ },
15070
+ bizMsgIdr: "20250703QMGFNP6700018807031250FT01",
15071
+ msgDefIdr: "pacs.008.001.08",
15072
+ bizSvc: "TEST",
15073
+ mktPrctc: {
15074
+ regy: "www2.swift.com/mystandards/#/group/Federal_Reserve_Financial_Services/Fedwire_Funds_Service",
15075
+ id: "frb.fedwire.01"
15076
+ },
15077
+ creDt: {
15078
+ dateTime: {
15079
+ date: { year: 2025, month: 7, day: 3 },
15080
+ time: { hour: 12, minute: 50, second: 30, nano: 22e7 }
15081
+ },
15082
+ offset: { totalSeconds: -14400 }
15083
+ },
15084
+ bizPrcgDt: {
15085
+ dateTime: {
15086
+ date: { year: 2025, month: 7, day: 3 },
15087
+ time: { hour: 12, minute: 50, second: 30, nano: 114e6 }
15088
+ },
15089
+ offset: { totalSeconds: -14400 }
15090
+ },
15091
+ namespace: "urn:iso:std:iso:20022:tech:xsd:head.001.001.03"
14962
15092
  },
14963
- senderToReceiverInformation: [
14964
- "Payment for invoice INV-2024-089",
14965
- "Equipment and supplies purchase",
14966
- "Net 30 terms - On time payment"
14967
- ],
14968
- chargeDetails: "OUR"
15093
+ type: "MX",
15094
+ "@xmlns": "urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08",
15095
+ identifier: "pacs.008.001.08"
14969
15096
  }
14970
15097
  }
14971
15098
  },
@@ -16153,6 +16280,9 @@ var TransactionDetail = () => {
16153
16280
  const handleProductClick = React15.useCallback((productId) => {
16154
16281
  console.log("Navigate to product:", productId);
16155
16282
  }, []);
16283
+ const handleAlertClick = React15.useCallback((alertId) => {
16284
+ navigate(`/alerts/${alertId}`);
16285
+ }, [navigate]);
16156
16286
  const handleIMADChange = React15.useCallback((newImad) => {
16157
16287
  console.log("IMAD changed to:", newImad);
16158
16288
  }, []);
@@ -16184,6 +16314,7 @@ var TransactionDetail = () => {
16184
16314
  onCounterpartyClick: handleCounterpartyClick,
16185
16315
  onOFACClick: handleOFACClick,
16186
16316
  onProductClick: handleProductClick,
16317
+ onAlertClick: handleAlertClick,
16187
16318
  onIMADChange: handleIMADChange,
16188
16319
  isLoading,
16189
16320
  error,