@shortstravelmgmt/component-lib 0.1.15 → 0.2.9

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.d.ts CHANGED
@@ -147,6 +147,7 @@ declare const UserIcon: React__default.FC<IconProps>;
147
147
  declare const UsersIcon: React__default.FC<IconProps>;
148
148
  declare const MailIcon: React__default.FC<IconProps>;
149
149
  declare const PhoneIcon: React__default.FC<IconProps>;
150
+ declare const HeadsetIcon: React__default.FC<IconProps>;
150
151
  declare const PrinterIcon: React__default.FC<IconProps>;
151
152
  declare const RefreshIcon: React__default.FC<IconProps>;
152
153
  declare const WarningIcon: React__default.FC<IconProps>;
@@ -333,7 +334,7 @@ interface SpinnerProps {
333
334
  }
334
335
  declare const Spinner: React__default.FC<SpinnerProps>;
335
336
 
336
- type StatusBadgeVariant = 'ticketed' | 'itinerary' | 'not-ticketed' | 'submitted' | 'pending' | 'cancelled';
337
+ type StatusBadgeVariant = 'ticketed' | 'itinerary' | 'not-ticketed' | 'submitted' | 'pending' | 'cancelled' | 'approved' | 'rejected' | 'in-review';
337
338
  interface StatusBadgeProps {
338
339
  /** The status variant to display */
339
340
  status: StatusBadgeVariant;
@@ -556,6 +557,32 @@ declare const Dropdown: React__default.FC<DropdownProps> & {
556
557
  Item: React__default.FC<DropdownItemProps>;
557
558
  };
558
559
 
560
+ type EmptyStateSize = 'sm' | 'md' | 'lg';
561
+ interface EmptyStateProps {
562
+ /** Headline explaining why the surface is empty. */
563
+ title: string;
564
+ /** Supporting copy shown under the title. */
565
+ description?: string;
566
+ /** Illustration or icon rendered above the title. */
567
+ icon?: ReactNode;
568
+ /** Label for the primary call to action; the button is hidden without it. */
569
+ actionLabel?: string;
570
+ /** Fired when the primary call to action is pressed. */
571
+ onAction?: () => void;
572
+ /** Label for the secondary call to action; the button is hidden without it. */
573
+ secondaryActionLabel?: string;
574
+ /** Fired when the secondary call to action is pressed. */
575
+ onSecondaryAction?: () => void;
576
+ /** Vertical padding scale — use `sm` inside a table body, `lg` for a full page. */
577
+ size?: EmptyStateSize;
578
+ /** Custom content rendered below the actions. */
579
+ children?: ReactNode;
580
+ /** Additional CSS class, appended last. */
581
+ className?: string;
582
+ }
583
+ /** Placeholder shown when a list, table, or panel has nothing to display. */
584
+ declare const EmptyState: ({ title, description, icon, actionLabel, onAction, secondaryActionLabel, onSecondaryAction, size, children, className, }: EmptyStateProps) => React.JSX.Element;
585
+
559
586
  interface FilterOption {
560
587
  value: string;
561
588
  label: string;
@@ -575,6 +602,8 @@ interface FilterChipProps {
575
602
  searchPlaceholder?: string;
576
603
  /** Info message to show at top of dropdown */
577
604
  infoMessage?: string;
605
+ /** Disable the filter when a controlled host has no change handler */
606
+ disabled?: boolean;
578
607
  /** Additional CSS class */
579
608
  className?: string;
580
609
  }
@@ -697,6 +726,42 @@ interface NavItemProps {
697
726
  }
698
727
  declare const NavItem: React__default.FC<NavItemProps>;
699
728
 
729
+ /** A rendered slot in the page list: either a page number or a truncation gap. */
730
+ type PaginationItem = number | 'ellipsis';
731
+ interface PaginationProps {
732
+ /** Current page, 1-based. */
733
+ page: number;
734
+ /** Rows shown per page. */
735
+ pageSize: number;
736
+ /** Total number of rows across every page. */
737
+ totalItems: number;
738
+ /** Number of page buttons rendered either side of the current page. */
739
+ siblingCount?: number;
740
+ /** Page-size choices; the size selector is hidden when this is empty. */
741
+ pageSizeOptions?: number[];
742
+ /** Hides the "Showing x–y of z" summary. */
743
+ hideSummary?: boolean;
744
+ /** Noun used in the summary text, e.g. "quotes". */
745
+ itemLabel?: string;
746
+ /** Accessible label for the surrounding nav landmark. */
747
+ ariaLabel?: string;
748
+ /** Fired with the new 1-based page number. */
749
+ onPageChange?: (page: number) => void;
750
+ /** Fired with the new page size; the size selector is hidden when omitted. */
751
+ onPageSizeChange?: (pageSize: number) => void;
752
+ /** Additional CSS class, appended last. */
753
+ className?: string;
754
+ }
755
+ /**
756
+ * Builds the page-button list for a paginator, collapsing long runs into
757
+ * `'ellipsis'` markers. First and last pages are always present.
758
+ */
759
+ declare const buildPaginationItems: (page: number, pageCount: number, siblingCount?: number) => PaginationItem[];
760
+ /** Page count for a given total/size, never below 1 so the control always renders a page. */
761
+ declare const getPageCount: (totalItems: number, pageSize: number) => number;
762
+ /** Paginator for list and table screens: page buttons, prev/next, and an optional page-size selector. */
763
+ declare const Pagination: ({ page, pageSize, totalItems, siblingCount, pageSizeOptions, hideSummary, itemLabel, ariaLabel, onPageChange, onPageSizeChange, className, }: PaginationProps) => React.JSX.Element;
764
+
700
765
  type ProgressSize = 'xs' | 'sm' | 'md' | 'lg';
701
766
  type ProgressVariant = 'primary' | 'success' | 'warning' | 'error';
702
767
  interface ProgressBarProps {
@@ -1066,6 +1131,229 @@ declare const GroundSegment: React__default.FC<GroundSegmentProps>;
1066
1131
  */
1067
1132
  declare const HotelSegment: React__default.FC<HotelSegmentProps>;
1068
1133
 
1134
+ /** One flown leg the carrier is pricing. */
1135
+ interface AcmiLeg {
1136
+ /** Stable id used as the React key and by the remove handler. */
1137
+ id: string;
1138
+ /** Departure airport, ICAO or IATA. */
1139
+ origin: string;
1140
+ /** Arrival airport, ICAO or IATA. */
1141
+ destination: string;
1142
+ /** Flight time in decimal hours; blank until it is calculated. */
1143
+ flightTime: string;
1144
+ /** Whether this is a passenger-carrying revenue leg or aircraft positioning. */
1145
+ type?: 'live' | 'ferry';
1146
+ }
1147
+ /** Aircraft a carrier can be quoted on, with the seat cap the calculator validates against. */
1148
+ interface AcmiAircraftOption {
1149
+ /** Value stored on the quote. */
1150
+ value: string;
1151
+ /** Label shown in the picker. */
1152
+ label: string;
1153
+ /** Maximum passengers the airframe is certified for. */
1154
+ seats: number;
1155
+ /** Optional carrier value used to keep the aircraft picker contract-valid. */
1156
+ carrier?: string;
1157
+ }
1158
+ /** Everything the calculator needs to price a trip. */
1159
+ interface AcmiQuoteInputs {
1160
+ /** Operating carrier. */
1161
+ carrier: string;
1162
+ /** Aircraft value from `aircraftOptions`. */
1163
+ aircraft: string;
1164
+ /** Travel party size. */
1165
+ passengers: string;
1166
+ /** Fuel price in dollars per gallon. */
1167
+ fuelPrice: string;
1168
+ /** Markup percentage applied to the operating subtotal. */
1169
+ markupPercent: string;
1170
+ /** Nights the crew stays away from base. */
1171
+ crewNights: string;
1172
+ /** Month of travel, 1–12, used for historic winds aloft. */
1173
+ tripMonth: string;
1174
+ /** Itinerary legs, in order. Automatic positioning mode restricts these to live legs. */
1175
+ legs: AcmiLeg[];
1176
+ }
1177
+ /** Controls whether positioning legs come from the user or the host pricing engine. */
1178
+ type AcmiPositioningMode = 'automatic' | 'explicit';
1179
+ /** The priced result the calculator renders once a quote is produced. */
1180
+ interface AcmiQuoteResult {
1181
+ /** Sum of every leg's operating cost before markup. */
1182
+ operatingSubtotal: number;
1183
+ /** Dollar value of the markup percentage. */
1184
+ markupAmount: number;
1185
+ /** Flat trip insurance. */
1186
+ insuranceAmount: number;
1187
+ /** Operating subtotal + markup + insurance. */
1188
+ preTaxTotal: number;
1189
+ /** Federal excise tax. */
1190
+ fet: number;
1191
+ /** Per-segment government fees. */
1192
+ segmentFees: number;
1193
+ /** What the carrier would quote the school. */
1194
+ finalPrice: number;
1195
+ /** Authoritative priced legs returned by the host pricing service. */
1196
+ legs?: Array<{
1197
+ id: string;
1198
+ origin: string;
1199
+ destination: string;
1200
+ type: 'live' | 'ferry';
1201
+ blockHours: number;
1202
+ total: number;
1203
+ }>;
1204
+ /** Backend pricing rules worth making explicit to a reviewer. */
1205
+ pricingDetails?: {
1206
+ /** Total backend-priced ferry block hours. */
1207
+ ferryBlockHours: number;
1208
+ /** Contractual minimum used for each estimated ferry leg, when applicable. */
1209
+ ferryMinimumHours?: number;
1210
+ /** Contractual fuel buffer as a decimal fraction, for example 0.1 for 10%. */
1211
+ fuelBufferPercent: number;
1212
+ /** Dollar value added by the fuel buffer. */
1213
+ fuelBufferAmount: number;
1214
+ /** Trip-level security screening charge. */
1215
+ screeningAmount: number;
1216
+ };
1217
+ }
1218
+ interface AcmiQuoteCalculatorProps {
1219
+ /** Carriers the user may quote for. */
1220
+ carrierOptions?: {
1221
+ value: string;
1222
+ label: string;
1223
+ }[];
1224
+ /** Aircraft available to the selected carrier. */
1225
+ aircraftOptions?: AcmiAircraftOption[];
1226
+ /** Starting values; the calculator owns the state from there. */
1227
+ defaultInputs?: Partial<AcmiQuoteInputs>;
1228
+ /**
1229
+ * `automatic` accepts live legs only because the host adds positioning.
1230
+ * `explicit` lets the user enter every live and ferry leg.
1231
+ */
1232
+ positioningMode?: AcmiPositioningMode;
1233
+ /** Flat per-trip insurance, quoted in the locked field. */
1234
+ insuranceFlat?: number;
1235
+ /** Fired with the complete inputs when Calculate Quote is pressed and the form is valid. */
1236
+ onCalculate?: (inputs: AcmiQuoteInputs) => void;
1237
+ /** Fired whenever an input changes so a host can invalidate a stale async result. */
1238
+ onInputsChange?: (inputs: AcmiQuoteInputs) => void;
1239
+ /** Priced result to display; omit to keep the results panel hidden. */
1240
+ result?: AcmiQuoteResult;
1241
+ /** Fired when Submit for Approval is pressed; the button is hidden without a `result`. */
1242
+ onSubmitForApproval?: (inputs: AcmiQuoteInputs) => void;
1243
+ /** BCP 47 locale used for currency formatting. */
1244
+ locale?: string;
1245
+ /** Shows a pending state while the host pricing service is working. */
1246
+ calculating?: boolean;
1247
+ /** Host pricing failure rendered alongside form validation. */
1248
+ calculationError?: string;
1249
+ /** Show the legacy historic-winds input when a pricing service supports it. */
1250
+ showTripMonth?: boolean;
1251
+ /** Additional CSS class, appended last. */
1252
+ className?: string;
1253
+ }
1254
+ /** Carriers STM currently holds ACMI agreements with. */
1255
+ declare const ACMI_CARRIER_OPTIONS: {
1256
+ value: string;
1257
+ label: string;
1258
+ }[];
1259
+ /** Aircraft the ACMI carriers operate, with certified seat counts. */
1260
+ declare const ACMI_AIRCRAFT_OPTIONS: AcmiAircraftOption[];
1261
+ /** Months of travel, used to pick the historic winds-aloft profile. */
1262
+ declare const TRIP_MONTH_OPTIONS: {
1263
+ value: string;
1264
+ label: string;
1265
+ }[];
1266
+ /** Flat trip insurance STM adds to every ACMI quote. */
1267
+ declare const ACMI_INSURANCE_FLAT = 350;
1268
+ /**
1269
+ * ACMI pricing calculator. ACMI carriers reach this from the bid response form, where
1270
+ * it is their default tab: they price the trip here rather than typing a total blind.
1271
+ */
1272
+ declare const AcmiQuoteCalculator: {
1273
+ ({ carrierOptions, aircraftOptions, defaultInputs, positioningMode, insuranceFlat, onCalculate, onInputsChange, result, onSubmitForApproval, locale, calculating, calculationError, showTripMonth, className, }: AcmiQuoteCalculatorProps): React.JSX.Element;
1274
+ displayName: string;
1275
+ };
1276
+
1277
+ type GroupTravelRequestSource = 'agent' | 'client';
1278
+ type GroupTravelDueField = 'confirmation' | 'deposit' | 'utilization' | 'names' | 'ticketing';
1279
+ interface GroupTravelDueStatus {
1280
+ /** ISO (yyyy-mm-dd) due date for this milestone, if one has been set. */
1281
+ dueDate?: string;
1282
+ /** Marked complete regardless of date. */
1283
+ complete: boolean;
1284
+ }
1285
+ interface GroupTravelPnr {
1286
+ id: string | number;
1287
+ /** Airline record locator, or the placeholder used before one has been issued. */
1288
+ recordLocator: string;
1289
+ complete: boolean;
1290
+ }
1291
+ interface AgentGroupTravelRequest {
1292
+ id: number;
1293
+ /** School/account this request belongs to — rows are grouped by this value. */
1294
+ accountName: string;
1295
+ /** Whether an agent or the client themselves submitted the request. */
1296
+ source: GroupTravelRequestSource;
1297
+ masterTripId?: number;
1298
+ /** Shown as a tooltip and highlights the ID when present. */
1299
+ notes?: string;
1300
+ /** ISO (yyyy-mm-dd) trip start date. */
1301
+ startDate: string;
1302
+ name: string;
1303
+ sport: string;
1304
+ /** Sport code used for the sport filter, e.g. "MBB". */
1305
+ sportCode: string;
1306
+ carrier?: string;
1307
+ air: boolean;
1308
+ charter: boolean;
1309
+ car: boolean;
1310
+ motorcoach: boolean;
1311
+ hotel: boolean;
1312
+ groupHotel: boolean;
1313
+ routing: string;
1314
+ /** ISO (yyyy-mm-dd) date submitted. */
1315
+ submittedDate?: string;
1316
+ /** ISO (yyyy-mm-dd) date the quote was sent. */
1317
+ quoteSentDate?: string;
1318
+ confirmation: GroupTravelDueStatus;
1319
+ deposit: GroupTravelDueStatus;
1320
+ utilization: GroupTravelDueStatus;
1321
+ names: GroupTravelDueStatus;
1322
+ ticketing: GroupTravelDueStatus;
1323
+ /** One entry per PNR in this group; more than one renders as an expandable "Multi" group. */
1324
+ pnrs: GroupTravelPnr[];
1325
+ }
1326
+ interface AgentGroupTravelRequestSportOption {
1327
+ code: string;
1328
+ label: string;
1329
+ }
1330
+ interface AgentGroupTravelRequestViewOption {
1331
+ id: string;
1332
+ label: string;
1333
+ /** Account names included in this saved view. */
1334
+ accountNames: string[];
1335
+ }
1336
+ interface AgentGroupTravelRequestsTableProps {
1337
+ requests: AgentGroupTravelRequest[];
1338
+ sports?: AgentGroupTravelRequestSportOption[];
1339
+ /** Saved account-group "views"; the view filter is hidden when none are supplied. */
1340
+ views?: AgentGroupTravelRequestViewOption[];
1341
+ /** ISO (yyyy-mm-dd) reference date for due-status coloring. Defaults to today; pass a fixed value in stories/tests for determinism. */
1342
+ today?: string;
1343
+ onOpenRequest?: (id: number) => void;
1344
+ onViewMasterTrip?: (masterTripId: number) => void;
1345
+ onDeleteRequest?: (id: number) => void;
1346
+ onCopyPnr?: (recordLocator: string) => void;
1347
+ onToggleDueStatus?: (id: number, field: GroupTravelDueField) => void;
1348
+ onSubmittedDateChange?: (id: number, value: string) => void;
1349
+ onQuoteSentDateChange?: (id: number, value: string) => void;
1350
+ className?: string;
1351
+ }
1352
+ /** Computes the short "A/C/B/H/GH/CA" travel-type codes shown in the Type column. */
1353
+ declare const computeTravelTypeCodes: (request: Pick<AgentGroupTravelRequest, "air" | "charter" | "car" | "motorcoach" | "hotel" | "groupHotel">) => string[];
1354
+ /** Hub's agent-facing list of open Group Travel Requests, grouped by school, one row per PNR group. */
1355
+ declare const AgentGroupTravelRequestsTable: ({ requests, sports, views, today, onOpenRequest, onViewMasterTrip, onDeleteRequest, onCopyPnr, onToggleDueStatus, onSubmittedDateChange, onQuoteSentDateChange, className, }: AgentGroupTravelRequestsTableProps) => React.JSX.Element;
1356
+
1069
1357
  interface SidenavItem {
1070
1358
  /** Unique key for the item */
1071
1359
  key: string;
@@ -1184,6 +1472,73 @@ interface CardFooterProps extends HTMLAttributes<HTMLDivElement> {
1184
1472
  }
1185
1473
  declare const CardFooter: React__default.FC<CardFooterProps>;
1186
1474
 
1475
+ /** The three notifications the Charter Sourcing backend currently sends. */
1476
+ type CharterSourcingEmailVariant = 'admin-review' | 'submitter-approved' | 'submitter-updated';
1477
+ /** One origin/destination pair included in the email's route summary. */
1478
+ interface CharterSourcingEmailLeg {
1479
+ origin: string;
1480
+ destination: string;
1481
+ }
1482
+ /** Contract-backed quote facts shared by all three notifications. */
1483
+ interface CharterSourcingEmailQuote {
1484
+ requestId: string;
1485
+ carrier: string;
1486
+ aircraft: string;
1487
+ passengers: string | number;
1488
+ legs: readonly CharterSourcingEmailLeg[];
1489
+ outboundDate: string;
1490
+ returnDate: string;
1491
+ submittedBy: string;
1492
+ /**
1493
+ * Preformatted amount without an assumed currency symbol. The backend only
1494
+ * supplies this when a legacy `flightQuote.lineItems` snapshot exists.
1495
+ */
1496
+ totalCost?: string;
1497
+ }
1498
+ /** One scalar value changed by an administrator. */
1499
+ interface CharterSourcingEmailChange {
1500
+ label: string;
1501
+ previousValue: string;
1502
+ updatedValue: string;
1503
+ }
1504
+ /** Hub only sends an update notification when at least one field changed. */
1505
+ type CharterSourcingEmailChanges = readonly [
1506
+ CharterSourcingEmailChange,
1507
+ ...CharterSourcingEmailChange[]
1508
+ ];
1509
+ interface CharterSourcingEmailPreviewBaseProps {
1510
+ quote: CharterSourcingEmailQuote;
1511
+ /**
1512
+ * Original production recipient shown when a non-production environment
1513
+ * diverts the message to its configured test inbox.
1514
+ */
1515
+ testServerOriginalRecipient?: string;
1516
+ className?: string;
1517
+ }
1518
+ /** Props mirror the three real sends; an update must contain at least one change. */
1519
+ type CharterSourcingEmailPreviewProps = CharterSourcingEmailPreviewBaseProps & ({
1520
+ variant: 'admin-review' | 'submitter-approved';
1521
+ changes?: never;
1522
+ } | {
1523
+ variant: 'submitter-updated';
1524
+ changes: CharterSourcingEmailChanges;
1525
+ });
1526
+ /** The exact comma-separated route label used by the backend subject and body. */
1527
+ declare const getCharterSourcingEmailRoute: (quote: CharterSourcingEmailQuote) => string;
1528
+ /** Build the production-aligned subject line for a preview. */
1529
+ declare const getCharterSourcingEmailSubject: (variant: CharterSourcingEmailVariant, quote: CharterSourcingEmailQuote) => string;
1530
+ /**
1531
+ * Table-based visual contract for Charter Sourcing's Postmark notifications.
1532
+ *
1533
+ * Layout tables use `role="presentation"`; quote facts and changed values stay
1534
+ * semantic data tables. Django must still render its own HTML and plain-text
1535
+ * templates, but it should preserve this table topology and literal styling.
1536
+ */
1537
+ declare const CharterSourcingEmailPreview: {
1538
+ (props: CharterSourcingEmailPreviewProps): React.JSX.Element;
1539
+ displayName: string;
1540
+ };
1541
+
1187
1542
  interface Contact {
1188
1543
  /** Contact ID */
1189
1544
  id: string | number;
@@ -1321,8 +1676,18 @@ interface HubNavigationItem {
1321
1676
  icon: ReactNode;
1322
1677
  }
1323
1678
  declare const HUB_INDIVIDUAL_TRAVEL_ITEM: HubNavigationItem;
1679
+ /** Canonical navigation identity for the carrier-facing STM Charters portal. */
1680
+ declare const HUB_STM_CHARTERS_ITEM: HubNavigationItem;
1324
1681
  declare const HUB_NAV_ITEMS: HubNavigationItem[];
1325
1682
  declare const HUB_ADMIN_ITEM: HubNavigationItem;
1683
+ declare const HUB_AGENTS_ITEM: HubNavigationItem;
1684
+ /**
1685
+ * Sourcing sits with the admin-gated footer items rather than in `HUB_NAV_ITEMS`: the
1686
+ * review queue is an ACMI-admin surface, so carriers and school users must not see it.
1687
+ */
1688
+ declare const HUB_SOURCING_ITEM: HubNavigationItem;
1689
+ /** Off-fleet quote review is an admin surface too, so it is gated the same way. */
1690
+ declare const HUB_OFF_FLEET_ITEM: HubNavigationItem;
1326
1691
  interface HubAppShellActions {
1327
1692
  isMobileNavOpen: boolean;
1328
1693
  toggleMobileNav: () => void;
@@ -1330,8 +1695,19 @@ interface HubAppShellActions {
1330
1695
  interface HubAppShellProps {
1331
1696
  children: ReactNode;
1332
1697
  navItems?: HubNavigationItem[];
1333
- individualTravelItem?: HubNavigationItem;
1698
+ /** Set to `null` when Individual Travel is not available to the current user or account. */
1699
+ individualTravelItem?: HubNavigationItem | null;
1700
+ agentsItem?: HubNavigationItem;
1701
+ /** ACMI sourcing entry, rendered in the footer and shown only when `isAdmin` is true. */
1702
+ sourcingItem?: HubNavigationItem;
1703
+ /** Off-fleet quote review entry, rendered in the footer and gated on `isAdmin`. */
1704
+ offFleetItem?: HubNavigationItem;
1334
1705
  adminItem?: HubNavigationItem;
1706
+ /**
1707
+ * Authoritative footer navigation. When provided (including an empty array),
1708
+ * it replaces the default admin-gated Sourcing, Off-Fleet, Agents, and Administration items.
1709
+ */
1710
+ footerNavItems?: HubNavigationItem[];
1335
1711
  activeNavKey?: string;
1336
1712
  onNavigate?: (item: HubNavigationItem) => void;
1337
1713
  onLogoClick?: () => void;
@@ -1353,7 +1729,228 @@ interface HubAppShellProps {
1353
1729
  className?: string;
1354
1730
  }
1355
1731
  /** The shared application navigation and content shell used by Hub and its Storybook pages. */
1356
- declare const HubAppShell: ({ children, navItems, individualTravelItem, adminItem, activeNavKey, onNavigate, onLogoClick, onLegacyPortal, accountSelector, renderTopbarActions, renderMobileExtras, mobileFooter, profileMenu, userInitials, isAdmin, navigationDisabled, loading, contentDisabled, showContent, logo, defaultExpanded, betaLabel, className, }: HubAppShellProps) => React.JSX.Element;
1732
+ declare const HubAppShell: ({ children, navItems, individualTravelItem, agentsItem, sourcingItem, offFleetItem, adminItem, footerNavItems, activeNavKey, onNavigate, onLogoClick, onLegacyPortal, accountSelector, renderTopbarActions, renderMobileExtras, mobileFooter, profileMenu, userInitials, isAdmin, navigationDisabled, loading, contentDisabled, showContent, logo, defaultExpanded, betaLabel, className, }: HubAppShellProps) => React.JSX.Element;
1733
+
1734
+ /**
1735
+ * Parses an `YYYY-MM-DD` itinerary date into a *local* calendar date.
1736
+ *
1737
+ * `new Date('2026-11-12')` is parsed as UTC midnight, which renders as the
1738
+ * previous day everywhere west of Greenwich. Travel dates are calendar dates,
1739
+ * never instants, so they are built component-wise instead.
1740
+ */
1741
+ declare const parseItineraryDate: (isoDate: string) => Date | null;
1742
+ /** Formats an itinerary date as `Thu Nov 12` (short) or `Thursday, November 12, 2026` (long). */
1743
+ declare const formatItineraryDate: (isoDate: string, style?: "short" | "long") => string;
1744
+ /** Formats a trip's span the way the itinerary header shows it, collapsing repeated month/year. */
1745
+ declare const formatItineraryDateRange: (startIso: string, endIso: string) => string;
1746
+ /** Formats a segment or trip amount. Falls back to a plain number if the currency code is unknown. */
1747
+ declare const formatItineraryMoney: (amount: number, currency?: string) => string;
1748
+ /**
1749
+ * Booking state of a single segment.
1750
+ *
1751
+ * Mirrors the statuses the Portal itinerary prints today — `Holding Confirmed`
1752
+ * is shown to travelers as `Confirmed` — plus the ticketing states Hub's
1753
+ * individual travel list already uses.
1754
+ */
1755
+ type ItinerarySegmentStatus = 'confirmed' | 'ticketed' | 'not-ticketed' | 'itinerary' | 'pending' | 'cancelled';
1756
+ interface ItinerarySegmentBase {
1757
+ /** Stable identifier for the segment (used as a React key and in callbacks) */
1758
+ id: string;
1759
+ /** Booking state shown in the card header */
1760
+ status: ItinerarySegmentStatus;
1761
+ /** Supplier confirmation / record locator for this segment */
1762
+ confirmation?: string;
1763
+ /** Name the reservation is held under */
1764
+ reservationName?: string;
1765
+ /** Segment cost, used by the itinerary cost summary */
1766
+ cost?: number;
1767
+ /** ISO 4217 currency code for `cost` */
1768
+ currency?: string;
1769
+ }
1770
+ /** A flight. Fields follow Hub's `CommercialFlight` plus what the Portal itinerary prints. */
1771
+ interface ItineraryAirSegment extends ItinerarySegmentBase {
1772
+ type: 'air';
1773
+ /** Marketing carrier name, e.g. `Delta Air Lines` */
1774
+ carrier: string;
1775
+ /** IATA carrier code, e.g. `DL` — drives the carrier-coloured service icon */
1776
+ carrierCode?: string;
1777
+ /** Flight number without the carrier code, e.g. `1274` */
1778
+ flightNumber: string;
1779
+ /** Operating carrier when the flight is a codeshare */
1780
+ operatedBy?: string;
1781
+ /** Departure airport code, e.g. `DSM` */
1782
+ departureAirport: string;
1783
+ /** Departure city, e.g. `Des Moines, IA` */
1784
+ departureCity: string;
1785
+ /** Departure date as `YYYY-MM-DD` */
1786
+ departureDate: string;
1787
+ /** Departure clock time as shown to the traveler, e.g. `6:15 AM` */
1788
+ departureTime: string;
1789
+ /** Arrival airport code, e.g. `LAS` */
1790
+ arrivalAirport: string;
1791
+ /** Arrival city, e.g. `Las Vegas, NV` */
1792
+ arrivalCity: string;
1793
+ /** Arrival date as `YYYY-MM-DD`; when it differs from `departureDate` the card flags the day change */
1794
+ arrivalDate?: string;
1795
+ /** Arrival clock time, e.g. `9:57 AM` */
1796
+ arrivalTime: string;
1797
+ /** Elapsed flight time, e.g. `3h 42m` */
1798
+ elapsed?: string;
1799
+ /** Assigned seats */
1800
+ seats?: string[];
1801
+ /** Cabin / class of service, e.g. `Main Cabin` */
1802
+ cabin?: string;
1803
+ /** Shows the online check-in action (the Portal reveals it the day before departure) */
1804
+ checkInAvailable?: boolean;
1805
+ /** Live flight status note, e.g. `In air — scheduled to arrive on time` */
1806
+ flightStatus?: string;
1807
+ }
1808
+ /** A rental car. Fields follow Hub's `VehicleSegment` / `Vehicle` plus the Portal's car block. */
1809
+ interface ItineraryCarSegment extends ItinerarySegmentBase {
1810
+ type: 'car';
1811
+ /** Rental chain name, e.g. `Enterprise Rent-A-Car` */
1812
+ vendor: string;
1813
+ /** Vendor code, e.g. `ZE` */
1814
+ vendorCode?: string;
1815
+ /** Car type description, e.g. `Intermediate SUV` */
1816
+ carType: string;
1817
+ /** Car type code, e.g. `IFAR` */
1818
+ carTypeCode?: string;
1819
+ /** Number of cars on the reservation */
1820
+ carCount?: number;
1821
+ /** Pick-up date as `YYYY-MM-DD` */
1822
+ pickupDate: string;
1823
+ /** Pick-up clock time, e.g. `10:30 AM` */
1824
+ pickupTime?: string;
1825
+ /** Pick-up location, e.g. `Harry Reid Intl Airport (LAS)` */
1826
+ pickupLocation: string;
1827
+ /** Drop-off date as `YYYY-MM-DD` */
1828
+ dropoffDate: string;
1829
+ /** Drop-off clock time */
1830
+ dropoffTime?: string;
1831
+ /** Drop-off location */
1832
+ dropoffLocation: string;
1833
+ /** Rental counter phone number */
1834
+ phone?: string;
1835
+ /** Quoted rate per day */
1836
+ dailyRate?: number;
1837
+ }
1838
+ /** A hotel stay. Fields follow Hub's `AgencyHotelSegment` plus the Portal's hotel block. */
1839
+ interface ItineraryHotelSegment extends ItinerarySegmentBase {
1840
+ type: 'hotel';
1841
+ /** Property name, e.g. `Renaissance Las Vegas` */
1842
+ hotelName: string;
1843
+ /** Hotel chain, e.g. `Marriott` */
1844
+ chain?: string;
1845
+ /** Chain code, e.g. `MC` */
1846
+ chainCode?: string;
1847
+ /** Check-in date as `YYYY-MM-DD` */
1848
+ checkInDate: string;
1849
+ /** Check-in time, e.g. `4:00 PM` */
1850
+ checkInTime?: string;
1851
+ /** Check-out date as `YYYY-MM-DD` */
1852
+ checkOutDate: string;
1853
+ /** Check-out time, e.g. `11:00 AM` */
1854
+ checkOutTime?: string;
1855
+ /** Number of nights */
1856
+ nights?: number;
1857
+ /** Number of rooms held */
1858
+ rooms?: number;
1859
+ /** Room type, e.g. `2 Queen Beds` */
1860
+ roomType?: string;
1861
+ /** Nightly room rate */
1862
+ nightlyRate?: number;
1863
+ /** Street address lines */
1864
+ address?: string[];
1865
+ /** City, state and postal code line */
1866
+ cityLine?: string;
1867
+ /** Property phone number */
1868
+ phone?: string;
1869
+ }
1870
+ /** Any segment an itinerary can show. */
1871
+ type ItinerarySegment = ItineraryAirSegment | ItineraryCarSegment | ItineraryHotelSegment;
1872
+ /** The date a segment belongs to on the itinerary — departure, pick-up or check-in. */
1873
+ declare const getSegmentDate: (segment: ItinerarySegment) => string;
1874
+ /** Minutes since midnight for a `6:15 AM` clock time, or null when it cannot be read. */
1875
+ declare const parseClockTime: (time?: string) => number | null;
1876
+ /**
1877
+ * When a segment starts on its itinerary day, used to read a day in time order.
1878
+ *
1879
+ * Null when the booking carries no time — a hotel with no stated check-in, say.
1880
+ */
1881
+ declare const getSegmentStartMinutes: (segment: ItinerarySegment) => number | null;
1882
+ /** Traveler-facing name for a segment, used as the card heading and in the day summary. */
1883
+ declare const getSegmentTitle: (segment: ItinerarySegment) => string;
1884
+ interface ItinerarySegmentCardProps {
1885
+ /** The air, car or hotel booking to render */
1886
+ segment: ItinerarySegment;
1887
+ /** Heading level for the card title, so pages keep a sensible outline */
1888
+ headingLevel?: 2 | 3 | 4;
1889
+ /** Called when a traveler starts online check-in for a flight */
1890
+ onCheckIn?: (segment: ItineraryAirSegment) => void;
1891
+ /** Extra content rendered below the detail list (notes, agent remarks) */
1892
+ footer?: ReactNode;
1893
+ /** Additional CSS class */
1894
+ className?: string;
1895
+ }
1896
+ /**
1897
+ * ItinerarySegmentCard — one booked leg of a traveler's itinerary.
1898
+ *
1899
+ * Renders a flight, rental car or hotel stay with the same header, endpoint
1900
+ * pair and labelled detail list, so a traveler reads every segment the same
1901
+ * way. The business fields match what the legacy Portal itinerary prints.
1902
+ */
1903
+ declare const ItinerarySegmentCard: {
1904
+ ({ segment, headingLevel, onCheckIn, footer, className, }: ItinerarySegmentCardProps): React.JSX.Element;
1905
+ displayName: string;
1906
+ };
1907
+
1908
+ /** One travel day: the date and every segment starting on it. */
1909
+ interface ItineraryDay {
1910
+ /** Day the segments start on, as `YYYY-MM-DD` */
1911
+ date: string;
1912
+ /** Segments starting on this day, in the order they should be read */
1913
+ segments: ItinerarySegment[];
1914
+ }
1915
+ /**
1916
+ * Groups segments into travel days, ordered by date, and orders each day by time.
1917
+ *
1918
+ * Air, car and hotel bookings arrive from three separate systems, so a
1919
+ * traveler-facing itinerary has to interleave them rather than list them service
1920
+ * by service — and it cannot assume the caller merged them in any useful order.
1921
+ * Sorting here is what puts the 6:15 AM flight above the 4:00 PM hotel check-in,
1922
+ * and keeps the legs of a connection in the order they are flown.
1923
+ *
1924
+ * Day grouping keys off the plain `YYYY-MM-DD` string, so ordering never depends
1925
+ * on the reader's time zone. Segments with no stated time sort last, keeping the
1926
+ * order they were given.
1927
+ */
1928
+ declare const groupSegmentsByDay: (segments: ItinerarySegment[]) => ItineraryDay[];
1929
+ interface ItineraryTimelineProps {
1930
+ /** Every air, car and hotel booking on the trip, in any order */
1931
+ segments: ItinerarySegment[];
1932
+ /** Shows a loading placeholder instead of the timeline */
1933
+ loading?: boolean;
1934
+ /** Message shown in place of the timeline when the itinerary could not be loaded */
1935
+ error?: ReactNode;
1936
+ /** Message shown when the trip has no booked segments yet */
1937
+ emptyMessage?: ReactNode;
1938
+ /** Called when a traveler starts online check-in for a flight */
1939
+ onCheckIn?: (segment: ItineraryAirSegment) => void;
1940
+ /** Additional CSS class */
1941
+ className?: string;
1942
+ }
1943
+ /**
1944
+ * ItineraryTimeline — a trip's bookings read as a day-by-day itinerary.
1945
+ *
1946
+ * Interleaves air, car and hotel segments under a heading for each travel day,
1947
+ * and covers the loading, error and nothing-booked-yet states a real trip
1948
+ * passes through.
1949
+ */
1950
+ declare const ItineraryTimeline: {
1951
+ ({ segments, loading, error, emptyMessage, onCheckIn, className, }: ItineraryTimelineProps): React.JSX.Element;
1952
+ displayName: string;
1953
+ };
1357
1954
 
1358
1955
  interface MembershipProgram {
1359
1956
  /** Unique identifier */
@@ -1566,6 +2163,130 @@ declare const PreferencesPanel: {
1566
2163
  displayName: string;
1567
2164
  };
1568
2165
 
2166
+ /**
2167
+ * The fourteen ACMI quote line-item categories, matching the categories the ACMI
2168
+ * calculator and the Salesforce QuoteLineItem records use. Keeping the vocabulary
2169
+ * identical means a quote can move between the calculator, the queue, and Salesforce
2170
+ * without anything being re-mapped by hand.
2171
+ */
2172
+ type SourcingCostCategory = 'acmi-block-hours' | 'fuel' | 'ground-handling' | 'landing-fees' | 'security-screening' | 'catering' | 'additional-catering' | 'crew-hotac' | 'other' | 'segment-fee' | 'fet' | 'xy-immig' | 'pfcs' | 'insurance-provision';
2173
+ interface SourcingCostLineItem {
2174
+ id: string;
2175
+ /** Short name for the charge, e.g. "Block hours — outbound". */
2176
+ label: string;
2177
+ /** Optional supporting detail rendered under the label. */
2178
+ description?: string;
2179
+ /** Grouping band; defaults to "other". */
2180
+ category?: SourcingCostCategory;
2181
+ /** How many units the carrier is charging for. */
2182
+ quantity: number;
2183
+ /** Unit the quantity is measured in, e.g. "block hours", "legs", "pax". */
2184
+ unit: string;
2185
+ /** Price per unit in major currency units (dollars, not cents). */
2186
+ unitPrice: number;
2187
+ }
2188
+ interface SourcingCostAdjustment {
2189
+ id: string;
2190
+ /** Label for the adjustment, e.g. "Repeat-charter discount". */
2191
+ label: string;
2192
+ /** Signed amount in major currency units — negative for a discount. */
2193
+ amount: number;
2194
+ /** Optional supporting detail rendered under the label. */
2195
+ note?: string;
2196
+ }
2197
+ interface QuoteCostTotals {
2198
+ /** Sum of every line item. */
2199
+ subtotal: number;
2200
+ /** Signed sum of every adjustment. */
2201
+ adjustmentTotal: number;
2202
+ /** Subtotal plus adjustments — the number the carrier is asking for. */
2203
+ total: number;
2204
+ }
2205
+ interface QuoteCostBreakdownProps {
2206
+ /** Charges that make up the quote. */
2207
+ lineItems: SourcingCostLineItem[];
2208
+ /** Discounts and surcharges applied after the subtotal. */
2209
+ adjustments?: SourcingCostAdjustment[];
2210
+ /** ISO 4217 currency code used for formatting. */
2211
+ currency?: string;
2212
+ /** BCP 47 locale used for formatting; pinned so stories and tests stay deterministic. */
2213
+ locale?: string;
2214
+ /** Heading rendered above the table; pass an empty string to hide it. */
2215
+ title?: string;
2216
+ /** Traveller count — supplying it adds a per-passenger figure under the total. */
2217
+ passengerCount?: number;
2218
+ /** Additional CSS class, appended last. */
2219
+ className?: string;
2220
+ }
2221
+ /** Display label for each ACMI line-item category, in quote order. */
2222
+ declare const SOURCING_COST_CATEGORY_LABELS: Record<SourcingCostCategory, string>;
2223
+ /** Every ACMI line-item category, in the order a quote lists them. */
2224
+ declare const SOURCING_COST_CATEGORIES: SourcingCostCategory[];
2225
+ /** Extended amount for a single line: quantity multiplied by unit price. */
2226
+ declare const computeLineItemTotal: (lineItem: SourcingCostLineItem) => number;
2227
+ /** Subtotal, signed adjustment total, and grand total for a quote. */
2228
+ declare const computeQuoteTotals: (lineItems: SourcingCostLineItem[], adjustments?: SourcingCostAdjustment[]) => QuoteCostTotals;
2229
+ /** Itemised cost table for a carrier's sourcing quote: line items, adjustments, and the total. */
2230
+ declare const QuoteCostBreakdown: ({ lineItems, adjustments, currency, locale, title, passengerCount, className, }: QuoteCostBreakdownProps) => React.JSX.Element;
2231
+
2232
+ /** One field the admin changed while reviewing, kept as a before/after pair. */
2233
+ interface QuoteFieldChange {
2234
+ /** Machine name of the field, used as the React key. */
2235
+ field: string;
2236
+ /** Human label shown in the summary, e.g. "Passengers". */
2237
+ label: string;
2238
+ /** Value as the carrier submitted it, already formatted for display. */
2239
+ from: string;
2240
+ /** Value the admin is submitting instead, already formatted for display. */
2241
+ to: string;
2242
+ }
2243
+ interface QuoteReviewActionsProps {
2244
+ /** Quote the decision applies to; echoed back through both callbacks. */
2245
+ quoteId: string;
2246
+ /** Carrier name, used in the confirmation copy. */
2247
+ carrier: string;
2248
+ /** Quoted total, pre-formatted for display in the confirmation copy. */
2249
+ formattedTotal?: string;
2250
+ /**
2251
+ * Edits the admin has made to the quote. They are listed old → new in the approve
2252
+ * confirmation. Hub sends the submitter a separate update email when an admin edit
2253
+ * is persisted; the later approval email does not repeat the change list.
2254
+ */
2255
+ changes?: QuoteFieldChange[];
2256
+ /** Locks both actions — use once a decision has already been recorded. */
2257
+ disabled?: boolean;
2258
+ /**
2259
+ * Why the actions are unavailable. Rendered under the buttons whenever `disabled`
2260
+ * is true, so an expensive action is never greyed out without saying why.
2261
+ */
2262
+ disabledReason?: string;
2263
+ /** Shows the in-progress state on the approve confirmation. */
2264
+ loading?: boolean;
2265
+ /** Label for the approve button. */
2266
+ approveLabel?: string;
2267
+ /** Label for the reject button. */
2268
+ rejectLabel?: string;
2269
+ /** One-click reasons offered in the reject drawer. */
2270
+ rejectReasons?: string[];
2271
+ /** Fired once the admin confirms, with every edit the host must persist before approval. */
2272
+ onApprove?: (quoteId: string, changes: QuoteFieldChange[]) => void;
2273
+ /** Fired with the note explaining the rejection. */
2274
+ onReject?: (quoteId: string, note: string) => void;
2275
+ /** Additional CSS class, appended last. */
2276
+ className?: string;
2277
+ }
2278
+ /**
2279
+ * Decision surface for a sourcing quote. The admin corrects and records the quote in place,
2280
+ * so there is no request-changes round trip:
2281
+ * approving routes through a confirmation listing every edit old → new, because that
2282
+ * list is persisted before approval. Rejecting opens a drawer for the stored review note;
2283
+ * the current Hub workflow does not send a rejection email.
2284
+ */
2285
+ declare const QuoteReviewActions: {
2286
+ ({ quoteId, carrier, formattedTotal, changes, disabled, disabledReason, loading, approveLabel, rejectLabel, rejectReasons, onApprove, onReject, className, }: QuoteReviewActionsProps): React.JSX.Element;
2287
+ displayName: string;
2288
+ };
2289
+
1569
2290
  interface SummaryItem {
1570
2291
  /** Label for the field */
1571
2292
  label: string;
@@ -1682,6 +2403,215 @@ declare const RequestFormFooter: React__default.FC<RequestFormFooterProps>;
1682
2403
  */
1683
2404
  declare const RequestFormLayout: React__default.FC<RequestFormLayoutProps>;
1684
2405
 
2406
+ /** The six Regular Season bid queues, in the order the legacy portal lists them. */
2407
+ type RegularSeasonBidType = 'Open' | 'Closed' | 'Awarded' | 'Declined' | 'Obsolete' | 'No Bid';
2408
+ /** Where a single trip's bid sits, mirroring the legacy `BidStatus` column. */
2409
+ type CharterTripBidStatus = 'Not Submitted' | 'Submitted' | 'No Bid';
2410
+ interface CharterTripBid {
2411
+ /** Salesforce Trip GUID — the row key and the value posted on submit. */
2412
+ tripGuid: string;
2413
+ /** Trip name shown in the expanded trip row. */
2414
+ tripName: string;
2415
+ /** Bid type for this trip, e.g. "Round Trip". */
2416
+ bidType: string;
2417
+ /** Travel party size requested by the team. */
2418
+ travelPartySize: number;
2419
+ /** Route summary as stored, e.g. "GSO-JAX-GSO". */
2420
+ route: string;
2421
+ /** Departure date, ISO `yyyy-mm-dd`. */
2422
+ departureDate: string;
2423
+ /** Bid expiration date, ISO `yyyy-mm-dd`. */
2424
+ expirationDate: string;
2425
+ /** Whether this carrier has already responded to this trip. */
2426
+ bidStatus: CharterTripBidStatus;
2427
+ /** Carrier union GUID posted alongside the trip on submit. */
2428
+ carrierUnionGuid: string;
2429
+ }
2430
+ interface CharterFlightProgramBid {
2431
+ /** Salesforce Flight Program GUID — the row key and the value posted on submit. */
2432
+ flightProgramGuid: string;
2433
+ /** Flight program name, the legacy `BidName` column. */
2434
+ bidName: string;
2435
+ /** True when the school's TMC implementation phase is "P7: Active". */
2436
+ isTmcClient: boolean;
2437
+ /** Sport for the program, used by the Sport filter. */
2438
+ sport: string;
2439
+ /** Season for the program, used by the Season filter. */
2440
+ season: string;
2441
+ /** Program year. */
2442
+ year: number;
2443
+ /** Bid due date, ISO `yyyy-mm-dd`. */
2444
+ dueDate: string;
2445
+ /** Team name, used by the Team filter. */
2446
+ team: string;
2447
+ /** Carrier union GUID posted alongside the program on submit. */
2448
+ carrierUnionGuid: string;
2449
+ /** Trips inside this flight program, shown when the row is expanded. */
2450
+ trips: CharterTripBid[];
2451
+ }
2452
+ /** Which level of the accordion a bid action came from. */
2453
+ type CharterBidLevel = 'flightProgram' | 'tripProgram';
2454
+ /** Identifies the row an action was fired from, at either level of the accordion. */
2455
+ interface CharterBidTarget {
2456
+ /** Whether the action came from a flight-program row or a trip row. */
2457
+ level: CharterBidLevel;
2458
+ /** Flight program GUID — always present. */
2459
+ flightProgramGuid: string;
2460
+ /** Trip GUID — present only for `tripProgram` actions. */
2461
+ tripGuid?: string;
2462
+ /** Carrier union GUID for the row. */
2463
+ carrierUnionGuid: string;
2464
+ }
2465
+ interface RegularSeasonBidsTableProps {
2466
+ /** Flight programs to list, each with its trips. */
2467
+ bids: CharterFlightProgramBid[];
2468
+ /** Which queue is being shown — drives the header text and the action columns. */
2469
+ bidType?: RegularSeasonBidType;
2470
+ /** ACMI carriers may re-bid, so Submit Bid stays available after submission. */
2471
+ acmiCarrier?: boolean;
2472
+ /** "Today" used to decide which rows are expiring soon; defaults to the current date. */
2473
+ today?: string;
2474
+ /** Flight program GUIDs expanded on first render. */
2475
+ defaultExpandedGuids?: string[];
2476
+ /** Fired when Submit Bid is pressed at either level. */
2477
+ onSubmitBid?: (target: CharterBidTarget) => void;
2478
+ /** Fired when View Bid is pressed at either level. */
2479
+ onViewBid?: (target: CharterBidTarget) => void;
2480
+ /** Fired when a single No Bid button is pressed. */
2481
+ onNoBid?: (target: CharterBidTarget) => void;
2482
+ /** Fired with every checked row when "Submit No Bid for Selected" is pressed. */
2483
+ onBulkNoBid?: (targets: CharterBidTarget[]) => void;
2484
+ /** Hides the Sport / Season / Team / Expiring Soon filter bar. */
2485
+ hideFilters?: boolean;
2486
+ /** Shows the loading row instead of data. */
2487
+ loading?: boolean;
2488
+ /** BCP 47 locale used for date formatting. */
2489
+ locale?: string;
2490
+ /** Additional CSS class, appended last. */
2491
+ className?: string;
2492
+ }
2493
+ /** Header copy for each queue, matching the legacy `cfswitch`. */
2494
+ declare const BID_TYPE_HEADINGS: Record<RegularSeasonBidType, string>;
2495
+ /** Every Regular Season queue, in legacy menu order. */
2496
+ declare const REGULAR_SEASON_BID_TYPES: RegularSeasonBidType[];
2497
+ /** A trip is expiring soon once "today" reaches two days before its expiration date. */
2498
+ declare const isExpiringSoon: (expirationDate: string, today: string) => boolean;
2499
+ /**
2500
+ * The legacy template reads `BidStatus` off whichever row CFML's grouped output
2501
+ * happened to leave current, which is unreliable. We derive it instead: a program
2502
+ * counts as submitted only when every trip under it is, and as No Bid only when
2503
+ * every trip under it is.
2504
+ */
2505
+ declare const deriveProgramBidStatus: (program: CharterFlightProgramBid) => CharterTripBidStatus;
2506
+ /** A program is biddable while at least one trip under it has not been declined. */
2507
+ declare const isProgramBiddable: (program: CharterFlightProgramBid) => boolean;
2508
+ /**
2509
+ * The Regular Season bid queue: a two-level flight-program → trip accordion with the
2510
+ * legacy Sport / Season / Team / Expiring Soon filters and the same Submit Bid,
2511
+ * No Bid, and View Bid gating at both levels.
2512
+ */
2513
+ declare const RegularSeasonBidsTable: {
2514
+ ({ bids, bidType, acmiCarrier, today, defaultExpandedGuids, onSubmitBid, onViewBid, onNoBid, onBulkNoBid, hideFilters, loading, locale, className, }: RegularSeasonBidsTableProps): React.JSX.Element;
2515
+ displayName: string;
2516
+ };
2517
+
2518
+ /**
2519
+ * Where a carrier's quote sits in the ACMI sourcing review workflow. The same four
2520
+ * values are used by the queue table, the status badges, and the detail page, so a
2521
+ * quote never reads as one status in one place and another somewhere else.
2522
+ */
2523
+ type SourcingQuoteStatus = 'pending' | 'in-review' | 'approved' | 'rejected';
2524
+ /** Whether a leg carries the travel party or repositions the aircraft. */
2525
+ type SourcingQuoteLegType = 'live' | 'ferry';
2526
+ interface SourcingQuoteLeg {
2527
+ id: string;
2528
+ /** Human label for the leg, e.g. "Outbound" or "Return". */
2529
+ label: string;
2530
+ /** Revenue leg or positioning leg; defaults to "live". */
2531
+ type?: SourcingQuoteLegType;
2532
+ /** Departure airport code. */
2533
+ origin: string;
2534
+ /** Arrival airport code. */
2535
+ destination: string;
2536
+ /** ISO 8601 local departure timestamp, when scheduling has supplied one. */
2537
+ departsAt?: string;
2538
+ /** ISO 8601 local arrival timestamp, when scheduling has supplied one. */
2539
+ arrivesAt?: string;
2540
+ /** Equipment the carrier is offering for this leg. */
2541
+ aircraft: string;
2542
+ /** Seats available on this leg. */
2543
+ seats: number;
2544
+ /** Scheduled block time in hours. */
2545
+ blockHours: number;
2546
+ }
2547
+ interface SourcingQuote {
2548
+ id: string;
2549
+ /** Carrier that submitted the quote. */
2550
+ carrier: string;
2551
+ /** Trip the quote is for. */
2552
+ tripName: string;
2553
+ /** School / account the trip belongs to. */
2554
+ accountName: string;
2555
+ /** Sport travelling. */
2556
+ sport: string;
2557
+ /** Current review status. */
2558
+ status: SourcingQuoteStatus;
2559
+ /** ISO (yyyy-mm-dd) date the carrier submitted the quote. */
2560
+ submittedDate: string;
2561
+ /** ISO (yyyy-mm-dd) first departure date. */
2562
+ departureDate: string;
2563
+ /** Travel-party size. */
2564
+ passengers: number;
2565
+ /**
2566
+ * Quoted total in major currency units. Always derive this from `lineItems` with
2567
+ * `computeQuoteTotals` rather than authoring it — a hand-written total can drift
2568
+ * away from the breakdown the carrier actually sent.
2569
+ */
2570
+ total: number;
2571
+ /** ISO 4217 currency code for `total`. */
2572
+ currency?: string;
2573
+ /** Flight legs the quote covers. */
2574
+ legs?: SourcingQuoteLeg[];
2575
+ /** Charges that make up the quoted total. */
2576
+ lineItems?: SourcingCostLineItem[];
2577
+ /** Free-text note the carrier attached to the submission. */
2578
+ carrierNote?: string;
2579
+ }
2580
+ interface SourcingReviewQueueTableProps {
2581
+ /** Quotes to list. */
2582
+ quotes: SourcingQuote[];
2583
+ /** Controlled selection of quote ids. Omit to let the table own the selection. */
2584
+ selectedQuoteIds?: string[];
2585
+ /** Fired whenever the selection changes. */
2586
+ onSelectionChange?: (selectedQuoteIds: string[]) => void;
2587
+ /** Fired when a quote row is opened for review. */
2588
+ onOpenQuote?: (quoteId: string) => void;
2589
+ /** Fired with every selected id when the bulk-approve button is pressed. */
2590
+ onBulkApprove?: (quoteIds: string[]) => void;
2591
+ /** Fired when the user clears an active search or status filter. */
2592
+ onFiltersCleared?: () => void;
2593
+ /** Rows shown per page. */
2594
+ pageSize?: number;
2595
+ /** Hides the search box and status filter. */
2596
+ hideFilters?: boolean;
2597
+ /** Shows the table's loading row instead of data. */
2598
+ loading?: boolean;
2599
+ /** BCP 47 locale used for currency and date formatting. */
2600
+ locale?: string;
2601
+ /** Additional CSS class, appended last. */
2602
+ className?: string;
2603
+ }
2604
+ /** Statuses an admin may still act on; approved and rejected quotes are locked out of bulk approve. */
2605
+ declare const isQuoteActionable: (quote: SourcingQuote) => boolean;
2606
+ /** Case-insensitive match across the fields an admin is likely to search by. */
2607
+ declare const matchesQuoteSearch: (quote: SourcingQuote, term: string) => boolean;
2608
+ /**
2609
+ * ACMI sourcing review queue — the list of carrier-submitted flight quotes awaiting
2610
+ * an admin decision, with row selection for bulk approve.
2611
+ */
2612
+ declare const SourcingReviewQueueTable: ({ quotes, selectedQuoteIds, onSelectionChange, onOpenQuote, onBulkApprove, onFiltersCleared, pageSize: initialPageSize, hideFilters, loading, locale, className, }: SourcingReviewQueueTableProps) => React.JSX.Element;
2613
+
2614
+ type TableRowKey = string | number;
1685
2615
  interface TableColumn<T = any> {
1686
2616
  /** Unique key for the column */
1687
2617
  key: string;
@@ -1715,12 +2645,28 @@ interface TableProps<T = any> {
1715
2645
  loading?: boolean;
1716
2646
  /** Empty state message */
1717
2647
  emptyMessage?: string;
2648
+ /** Rich empty state rendered instead of `emptyMessage` when there are no rows */
2649
+ emptyContent?: React__default.ReactNode;
2650
+ /** Adds a leading checkbox column for row selection */
2651
+ selectable?: boolean;
2652
+ /** Controlled selection — the row keys currently selected. Omit to let the table own the state. */
2653
+ selectedRowKeys?: TableRowKey[];
2654
+ /** Starting selection when the table owns the state */
2655
+ defaultSelectedRowKeys?: TableRowKey[];
2656
+ /** Fired with the next selection: the row keys plus the matching rows */
2657
+ onSelectionChange?: (selectedRowKeys: TableRowKey[], selectedRows: T[]) => void;
2658
+ /** Return false to lock a row out of selection */
2659
+ isRowSelectable?: (row: T, index: number) => boolean;
2660
+ /** Accessible label for an individual row checkbox */
2661
+ rowSelectionLabel?: (row: T, index: number) => string;
2662
+ /** Accessible label for the header select-all checkbox */
2663
+ selectAllLabel?: string;
1718
2664
  /** Row click handler */
1719
2665
  onRowClick?: (row: T, index: number) => void;
1720
2666
  /** Additional CSS class */
1721
2667
  className?: string;
1722
2668
  }
1723
- declare const Table: <T extends Record<string, any> = any>({ columns, data, rowKey, bordered, striped, hoverable, compact, loading, emptyMessage, onRowClick, className, }: TableProps<T>) => React__default.JSX.Element;
2669
+ declare const Table: <T extends Record<string, any> = any>({ columns, data, rowKey, bordered, striped, hoverable, compact, loading, emptyMessage, emptyContent, selectable, selectedRowKeys, defaultSelectedRowKeys, onSelectionChange, isRowSelectable, rowSelectionLabel, selectAllLabel, onRowClick, className, }: TableProps<T>) => React__default.JSX.Element;
1724
2670
 
1725
2671
  interface TeamOption {
1726
2672
  /** Team code (e.g., 'MBB', 'WBB') */
@@ -1814,21 +2760,72 @@ interface TeamScheduleActionsProps {
1814
2760
  /** Exact presentational counterpart of Hub's Team Schedule action controls. */
1815
2761
  declare const TeamScheduleActions: ({ isCompactView, tripCount, seasonLabel, seasonValue, seasonOptions, previousSeasonDisabled, exportDisabled, exporting, groupTravelDisabled, mergeDisabled, merging, onViewSchedule, onBack, onPreviousSeason, onNextSeason, onSeasonChange, onExport, onGroupTravelRequest, onMergeEvents, className, }: TeamScheduleActionsProps) => React.JSX.Element;
1816
2762
 
2763
+ /** @deprecated Legacy injected row. Prefer the structured `data` prop. */
1817
2764
  interface TeamScheduleCompactRow {
1818
2765
  id: string | number;
1819
2766
  trip: ReactNode;
1820
2767
  events: ReactNode;
1821
2768
  }
2769
+ interface TeamScheduleCompactEvent {
2770
+ id: string | number;
2771
+ opponent: string;
2772
+ title: string;
2773
+ date: string;
2774
+ time?: string;
2775
+ tbc?: string;
2776
+ location: string;
2777
+ homeAway: string;
2778
+ /** Leading 48px cell (e.g. checkbox or drag handle). */
2779
+ leading?: ReactNode;
2780
+ /** Trailing 116px cell (e.g. Edit action). */
2781
+ action?: ReactNode;
2782
+ }
2783
+ interface TeamScheduleCompactTrip {
2784
+ id: string | number;
2785
+ gtr?: ReactNode;
2786
+ travelStart: string;
2787
+ travelEnd: string;
2788
+ tripName: string;
2789
+ services?: ReactNode;
2790
+ /** Trailing 116px cell (e.g. Edit action). */
2791
+ action?: ReactNode;
2792
+ events: TeamScheduleCompactEvent[];
2793
+ }
1822
2794
  interface TeamScheduleCompactTableProps {
1823
- rows: TeamScheduleCompactRow[];
2795
+ /** Structured trips powering the TanStack-driven table features. */
2796
+ data?: TeamScheduleCompactTrip[];
2797
+ /**
2798
+ * @deprecated Legacy fully-injected rows. Rendered as-is; table features
2799
+ * (sorting, filtering, …) only apply to the structured `data` prop.
2800
+ */
2801
+ rows?: TeamScheduleCompactRow[];
2802
+ /** Header labels for legacy `rows` mode only. */
1824
2803
  tripHeaders?: ReactNode[];
1825
2804
  eventHeaders?: ReactNode[];
1826
2805
  onAddEvent?: () => void;
1827
2806
  addEventDisabled?: boolean;
1828
2807
  className?: string;
1829
- }
1830
- /** Hub's two-panel compact Team Schedule shell. Editable rows remain injectable. */
1831
- declare const TeamScheduleCompactTable: ({ rows, tripHeaders, eventHeaders, onAddEvent, addEventDisabled, className, }: TeamScheduleCompactTableProps) => React.JSX.Element;
2808
+ /** Click trip column headers to sort. */
2809
+ enableSorting?: boolean;
2810
+ /** Search box matching trip and event text. */
2811
+ enableGlobalFilter?: boolean;
2812
+ globalFilterPlaceholder?: string;
2813
+ /** Per-column text filters under the trip headers. */
2814
+ enableColumnFilters?: boolean;
2815
+ /** Page the trips with prev/next controls. */
2816
+ enablePagination?: boolean;
2817
+ pageSize?: number;
2818
+ /** Checkbox per trip plus a select-all header checkbox. */
2819
+ enableRowSelection?: boolean;
2820
+ /** Called with the selected trip ids whenever selection changes. */
2821
+ onRowSelectionChange?: (selectedIds: string[]) => void;
2822
+ /** "Columns" menu to show/hide trip columns. */
2823
+ enableColumnVisibility?: boolean;
2824
+ /** Chevron per trip to collapse its events panel. */
2825
+ enableExpanding?: boolean;
2826
+ }
2827
+ /** Hub's two-panel compact Team Schedule shell, powered by TanStack Table. */
2828
+ declare const TeamScheduleCompactTable: ({ data, rows, tripHeaders, eventHeaders, onAddEvent, addEventDisabled, className, enableSorting, enableGlobalFilter, globalFilterPlaceholder, enableColumnFilters, enablePagination, pageSize, enableRowSelection, onRowSelectionChange, enableColumnVisibility, enableExpanding, }: TeamScheduleCompactTableProps) => React.JSX.Element;
1832
2829
 
1833
2830
  interface TeamScheduleDueDate {
1834
2831
  id?: string | number;
@@ -2144,31 +3141,37 @@ declare const TravelerForm: {
2144
3141
  };
2145
3142
 
2146
3143
  interface TripData {
2147
- /** Unique trip identifier */
3144
+ /** Stable unique trip identifier supplied by the host */
2148
3145
  id: string;
2149
- /** PNR/Confirmation number */
3146
+ /** PNR/confirmation number used to load a booked itinerary */
2150
3147
  pnr?: string;
2151
- /** Request ID (for requested trips) */
3148
+ /** Request ID used to load a submitted request */
2152
3149
  reqId?: string;
2153
3150
  /** Traveler name(s) */
2154
3151
  travelers: string[];
2155
3152
  /** Sport code */
2156
3153
  sport?: string;
2157
- /** Vendor/Airline code */
3154
+ /** Vendor/airline code */
2158
3155
  vendor?: string;
2159
- /** Itinerary string (e.g., "ATL-RDU") */
3156
+ /** Itinerary string (for example, `ATL-RDU`) */
2160
3157
  itinerary?: string;
2161
3158
  /** Travel type codes */
2162
3159
  types: TravelType[];
2163
3160
  /** Multi-segment indicators */
2164
3161
  multiSegments?: TravelType[];
2165
- /** Travel date range */
3162
+ /** Human-readable travel date range */
2166
3163
  dates: string;
2167
- /** Trip status */
2168
- status: StatusBadgeVariant;
2169
- /** Requested by (for request trips) */
3164
+ /** ISO start date, used by the legacy local-filter mode when available */
3165
+ startDate?: string;
3166
+ /** ISO end date, used by the legacy local-filter mode when available */
3167
+ endDate?: string;
3168
+ /** Total trip cost, used by the legacy local-filter mode when available */
3169
+ totalCost?: number;
3170
+ /** Trip status. Backend labels such as `Invoiced` are normalized safely. */
3171
+ status: StatusBadgeVariant | string;
3172
+ /** Requested by (for requested trips) */
2170
3173
  requestedBy?: string;
2171
- /** Submitted date (for request trips) */
3174
+ /** Submitted date (for requested trips) */
2172
3175
  submitted?: string;
2173
3176
  }
2174
3177
  interface TripTableProps {
@@ -2182,7 +3185,12 @@ interface TripTableProps {
2182
3185
  vendorMode?: 'icon' | 'code';
2183
3186
  /** Use unified service column */
2184
3187
  useServiceColumn?: boolean;
2185
- /** Callback when viewing a trip */
3188
+ /** Preferred callback. Receives the stable, complete controlled row. */
3189
+ onSelectTrip?: (trip: TripData) => void;
3190
+ /**
3191
+ * Legacy callback. Receives the PNR/request ID when present, then `id`.
3192
+ * @deprecated Prefer `onSelectTrip` so identifiers are never ambiguous.
3193
+ */
2186
3194
  onViewTrip?: (id: string) => void;
2187
3195
  /** Show empty state */
2188
3196
  emptyMessage?: string;
@@ -2200,6 +3208,8 @@ interface AdministrationCard {
2200
3208
  }
2201
3209
  interface AdministrationPageProps {
2202
3210
  activeTab?: AdministrationTab;
3211
+ /** Authoritative tabs for the current viewer. An empty array renders no tab controls. */
3212
+ enabledTabs?: AdministrationTab[];
2203
3213
  onTabChange?: (tab: AdministrationTab) => void;
2204
3214
  cards?: AdministrationCard[];
2205
3215
  onCardClick?: (card: AdministrationCard) => void;
@@ -2207,7 +3217,354 @@ interface AdministrationPageProps {
2207
3217
  className?: string;
2208
3218
  }
2209
3219
  /** Hub administration shell and system-card index. */
2210
- declare const AdministrationPage: ({ activeTab, onTabChange, cards, onCardClick, children, className, }: AdministrationPageProps) => React.JSX.Element;
3220
+ declare const AdministrationPage: ({ activeTab, enabledTabs, onTabChange, cards, onCardClick, children, className, }: AdministrationPageProps) => React.JSX.Element;
3221
+
3222
+ interface AgentGroupTravelRequestsPageProps {
3223
+ /** Page title, shown above the request list. */
3224
+ title?: string;
3225
+ /** Open group travel requests to list, grouped by school. */
3226
+ requests: AgentGroupTravelRequest[];
3227
+ /** Options for the "Filter by sport" dropdown. */
3228
+ sports?: AgentGroupTravelRequestSportOption[];
3229
+ /** Saved account-group "views"; the view filter is hidden when none are supplied. */
3230
+ views?: AgentGroupTravelRequestViewOption[];
3231
+ /** ISO (yyyy-mm-dd) reference date for due-status coloring. */
3232
+ today?: string;
3233
+ /** Shows the STM-employee-only quick links (agent request form, CDS requests, actionable items, administer views). */
3234
+ isStmEmployee?: boolean;
3235
+ onBackToBookATrip?: () => void;
3236
+ onSubmitNewRequest?: () => void;
3237
+ onSubmitAgentRequest?: () => void;
3238
+ onSearchPastRequests?: () => void;
3239
+ onShowCdsRequests?: () => void;
3240
+ onShowActionableItems?: () => void;
3241
+ onAdministerViews?: () => void;
3242
+ onOpenRequest?: (id: number) => void;
3243
+ onViewMasterTrip?: (masterTripId: number) => void;
3244
+ onDeleteRequest?: (id: number) => void;
3245
+ onCopyPnr?: (recordLocator: string) => void;
3246
+ onToggleDueStatus?: (id: number, field: GroupTravelDueField) => void;
3247
+ onSubmittedDateChange?: (id: number, value: string) => void;
3248
+ onQuoteSentDateChange?: (id: number, value: string) => void;
3249
+ className?: string;
3250
+ }
3251
+ /** Hub's agent-facing Group Travel Request screen — the "Book a Trip" quick links plus the open-requests list. */
3252
+ declare const AgentGroupTravelRequestsPage: ({ title, requests, sports, views, today, isStmEmployee, onBackToBookATrip, onSubmitNewRequest, onSubmitAgentRequest, onSearchPastRequests, onShowCdsRequests, onShowActionableItems, onAdministerViews, onOpenRequest, onViewMasterTrip, onDeleteRequest, onCopyPnr, onToggleDueStatus, onSubmittedDateChange, onQuoteSentDateChange, className, }: AgentGroupTravelRequestsPageProps) => React.JSX.Element;
3253
+
3254
+ /** The three sections of the legacy My Profile menu. */
3255
+ type CarrierProfileTab = 'profile' | 'contacts' | 'aircraft';
3256
+ /** Default bid values used to pre-fill the bid response form. */
3257
+ interface CarrierProfilePreferences {
3258
+ /** Default seats offered. */
3259
+ availableSeats: string;
3260
+ /** Default max payload in pounds. */
3261
+ maxPayload: string;
3262
+ /** Default fuel base in dollars. */
3263
+ fuelBase: string;
3264
+ /** Default catering option. */
3265
+ cateringOptions: string;
3266
+ }
3267
+ /** A carrier contact on file with STM. */
3268
+ interface CarrierContact {
3269
+ /** Legacy `Contact_ID`, used as the row key. */
3270
+ contactId: string;
3271
+ /** Contact type name, e.g. "Sales". */
3272
+ contactType: string;
3273
+ /** Contact's full name. */
3274
+ name: string;
3275
+ /** Work phone. */
3276
+ workPhone: string;
3277
+ /** Email address. */
3278
+ email: string;
3279
+ /** Whether new bid notifications go to this contact. */
3280
+ bidContact: boolean;
3281
+ }
3282
+ /** An airframe the carrier can be quoted on. */
3283
+ interface CarrierAircraft {
3284
+ /** Legacy `Aircraft_ID`, used as the row key. */
3285
+ aircraftId: string;
3286
+ /** Model or name. */
3287
+ name: string;
3288
+ /** Certified seat count. */
3289
+ seatQty: number;
3290
+ /** Max payload in pounds. */
3291
+ maxPayload: number;
3292
+ /** Fuel base in dollars. */
3293
+ fuelBase: number;
3294
+ /** How many seat maps and documents are attached. */
3295
+ documentCount?: number;
3296
+ }
3297
+ interface CarrierProfilePageProps {
3298
+ /** Carrier account name, used in the Contacts heading. */
3299
+ carrierName: string;
3300
+ /** Default bid values. */
3301
+ preferences?: CarrierProfilePreferences;
3302
+ /** Catering options STM offers. */
3303
+ cateringOptions?: string[];
3304
+ /** Contacts on file. */
3305
+ contacts?: CarrierContact[];
3306
+ /** Contact types available in the picker. */
3307
+ contactTypes?: string[];
3308
+ /** Aircraft on file. */
3309
+ aircraft?: CarrierAircraft[];
3310
+ /** Controlled section selection; omit to let the page own it. */
3311
+ tab?: CarrierProfileTab;
3312
+ /** Section selected on first render when `tab` is omitted. */
3313
+ defaultTab?: CarrierProfileTab;
3314
+ /** Fired with the section the carrier switched to. */
3315
+ onTabChange?: (tab: CarrierProfileTab) => void;
3316
+ /** Fired with the saved preferences. */
3317
+ onSavePreferences?: (preferences: CarrierProfilePreferences) => void;
3318
+ /** Fired with the contact to edit. */
3319
+ onEditContact?: (contactId: string) => void;
3320
+ /** Fired with the contact to delete. */
3321
+ onDeleteContact?: (contactId: string) => void;
3322
+ /** Fired with the new contact's values. */
3323
+ onAddContact?: (contact: Omit<CarrierContact, 'contactId'>) => void;
3324
+ /** Fired with the aircraft to edit. */
3325
+ onEditAircraft?: (aircraftId: string) => void;
3326
+ /** Fired with the aircraft to delete. */
3327
+ onDeleteAircraft?: (aircraftId: string) => void;
3328
+ /** Fired when an aircraft's seat maps and documents are opened. */
3329
+ onOpenAircraftDocuments?: (aircraftId: string) => void;
3330
+ /** Renders profile data without mutation controls, even when callbacks are supplied. */
3331
+ readOnly?: boolean;
3332
+ /** Label for the back link above the header. */
3333
+ backLabel?: string;
3334
+ /** Fired when the back link is pressed. */
3335
+ onBack?: () => void;
3336
+ /** BCP 47 locale used for number formatting. */
3337
+ locale?: string;
3338
+ /** Additional CSS class, appended last. */
3339
+ className?: string;
3340
+ }
3341
+ /** Catering choices offered on the legacy preferences form. */
3342
+ declare const CARRIER_CATERING_OPTIONS: string[];
3343
+ /** Contact types the legacy portal offers. */
3344
+ declare const CARRIER_CONTACT_TYPES: string[];
3345
+ /**
3346
+ * My Profile — the legacy `profiles/` area, with its Profile · Contacts · Aircraft
3347
+ * split kept intact. Preferences pre-fill the bid response form; contacts decide who
3348
+ * is emailed about new bids; aircraft are what STM can quote the carrier on.
3349
+ */
3350
+ declare const CarrierProfilePage: {
3351
+ ({ carrierName, preferences: initialPreferences, cateringOptions, contacts, contactTypes, aircraft, tab: controlledTab, defaultTab, onTabChange, onSavePreferences, onEditContact, onDeleteContact, onAddContact, onEditAircraft, onDeleteAircraft, onOpenAircraftDocuments, readOnly, backLabel, onBack, locale, className, }: CarrierProfilePageProps): React.JSX.Element;
3352
+ displayName: string;
3353
+ };
3354
+
3355
+ /** Read-only carrier facts returned for one NCAA championship opportunity. */
3356
+ interface ChampionshipBidDetail {
3357
+ bidId: string;
3358
+ bidName: string;
3359
+ aircraftName?: string;
3360
+ seats?: number;
3361
+ totalCost?: number;
3362
+ cities?: string;
3363
+ restrictions?: string;
3364
+ comments?: string;
3365
+ noBid?: boolean;
3366
+ awarded?: boolean;
3367
+ confirmed?: boolean;
3368
+ contractFileName?: string;
3369
+ }
3370
+ interface ChampionshipBidDetailPageProps {
3371
+ /** Detail returned by Hub; omit while loading or when no record was found. */
3372
+ bid?: ChampionshipBidDetail;
3373
+ /** Shows the loading state instead of detail. */
3374
+ loading?: boolean;
3375
+ /** Label for the optional back navigation. */
3376
+ backLabel?: string;
3377
+ /** Fired only for navigation back to the championship queue. */
3378
+ onBack?: () => void;
3379
+ /** BCP 47 locale used to format seats and total cost. */
3380
+ locale?: string;
3381
+ className?: string;
3382
+ }
3383
+ /**
3384
+ * Read-only NCAA championship bid detail. Hub owns fetching, authorization, and every write;
3385
+ * this page deliberately exposes no bid, award, confirmation, contract, or editing actions.
3386
+ */
3387
+ declare const ChampionshipBidDetailPage: {
3388
+ ({ bid, loading, backLabel, onBack, locale, className, }: ChampionshipBidDetailPageProps): React.JSX.Element;
3389
+ displayName: string;
3390
+ };
3391
+
3392
+ /** The five NCAA Championship queues, in the order the legacy menu lists them. */
3393
+ type ChampionshipBidType = 'Open' | 'Awarded' | 'Closed' | 'Declined' | 'Withdrawn';
3394
+ /** One championship bid opportunity. */
3395
+ interface ChampionshipBid {
3396
+ /** Legacy `Bid_ID`, used as the row key. */
3397
+ bidId: string;
3398
+ /** Opportunity name. */
3399
+ bidName: string;
3400
+ /** Preferred itinerary, e.g. "OMA-DAY". */
3401
+ cityPairs: string;
3402
+ /** Travel party size. */
3403
+ travelParty: number;
3404
+ /** Departure date, ISO `yyyy-mm-dd`. */
3405
+ departDate: string;
3406
+ /** Bid expiration date, ISO `yyyy-mm-dd`. */
3407
+ expirationDate: string;
3408
+ /** Whether the carrier has already responded. */
3409
+ responded?: boolean;
3410
+ /** Whether the carrier declined this opportunity. */
3411
+ noBid?: boolean;
3412
+ /** Whether an awarded bid has been confirmed by the carrier. */
3413
+ confirmed?: boolean;
3414
+ /** File name of the signed contract, when one has been uploaded. */
3415
+ contractFile?: string;
3416
+ }
3417
+ interface ChampionshipBidsPageProps {
3418
+ /** Bids for the selected queue. */
3419
+ bids: ChampionshipBid[];
3420
+ /** Controlled queue selection; omit to let the page own it. */
3421
+ bidType?: ChampionshipBidType;
3422
+ /** Queue selected on first render when `bidType` is omitted. */
3423
+ defaultBidType?: ChampionshipBidType;
3424
+ /** Fired with the queue the carrier switched to. */
3425
+ onBidTypeChange?: (bidType: ChampionshipBidType) => void;
3426
+ /** Fired when a bid name is opened for read-only detail navigation. */
3427
+ onViewBid?: (bidId: string) => void;
3428
+ /**
3429
+ * Fired by the Bid and Bid anyway write-intent actions. Also serves as the
3430
+ * legacy fallback for bid-name navigation when `onViewBid` is omitted.
3431
+ */
3432
+ onOpenBid?: (bidId: string) => void;
3433
+ /** Fired when an awarded bid is confirmed. */
3434
+ onConfirmAward?: (bidId: string) => void;
3435
+ /** Fired when a signed contract is opened or uploaded. */
3436
+ onOpenContract?: (bidId: string) => void;
3437
+ /** Rows shown per page. */
3438
+ pageSize?: number;
3439
+ /** Label for the back link above the header. */
3440
+ backLabel?: string;
3441
+ /** Fired when the back link is pressed. */
3442
+ onBack?: () => void;
3443
+ /** Shows the table's loading row instead of data. */
3444
+ loading?: boolean;
3445
+ /** BCP 47 locale used for date formatting. */
3446
+ locale?: string;
3447
+ /** Additional CSS class, appended last. */
3448
+ className?: string;
3449
+ }
3450
+ /** Every NCAA Championship queue, in legacy menu order. */
3451
+ declare const CHAMPIONSHIP_BID_TYPES: ChampionshipBidType[];
3452
+ /** Header copy for each queue, matching the legacy `cfswitch`. */
3453
+ declare const CHAMPIONSHIP_HEADINGS: Record<ChampionshipBidType, string>;
3454
+ /**
3455
+ * NCAA Championship bid queues — the legacy `bids/index.cfm` list. Five status queues
3456
+ * and a flat table; the checkmark and delete GIFs become status pills, and the
3457
+ * confirm / contract image links become real buttons.
3458
+ */
3459
+ declare const ChampionshipBidsPage: {
3460
+ ({ bids, bidType: controlledBidType, defaultBidType, onBidTypeChange, onViewBid, onOpenBid, onConfirmAward, onOpenContract, pageSize: initialPageSize, backLabel, onBack, loading, locale, className, }: ChampionshipBidsPageProps): React.JSX.Element;
3461
+ displayName: string;
3462
+ };
3463
+
3464
+ /** What the carrier is submitting: a priced quote, or a decline. */
3465
+ interface CharterBidSubmission {
3466
+ /** The calculator inputs behind the quote; null when the carrier is declining. */
3467
+ inputs: AcmiQuoteInputs | null;
3468
+ /** True when the carrier is declining the opportunity. */
3469
+ noBid: boolean;
3470
+ }
3471
+ interface CharterBidResponsePageProps {
3472
+ /** Flight program the bid is against. */
3473
+ program: CharterFlightProgramBid;
3474
+ /** Trips covered by this response — one for a trip bid, all of them for a program bid. */
3475
+ trips: CharterTripBid[];
3476
+ /** School / account the trips belong to. */
3477
+ accountName: string;
3478
+ /** Trip-level bids are titled by trip name; program-level bids by program name. */
3479
+ tripLevel?: boolean;
3480
+ /** ACMI carriers additionally see the carrier STM requested for the trip. */
3481
+ acmiCarrier?: boolean;
3482
+ /** Carrier STM requested for this trip; shown to ACMI carriers only. */
3483
+ requestedCarrier?: string;
3484
+ /** Values the calculator opens with, typically the carrier's saved profile defaults. */
3485
+ defaultInputs?: Partial<AcmiQuoteInputs>;
3486
+ /** Priced result to show inside the calculator. */
3487
+ acmiResult?: AcmiQuoteResult;
3488
+ /** Fired when the calculator prices a quote. */
3489
+ onCalculateAcmi?: (inputs: AcmiQuoteInputs) => void;
3490
+ /** Fired with the quote — or the decline — when the bid is submitted. */
3491
+ onSubmitBid?: (submission: CharterBidSubmission) => void;
3492
+ /** Label for the back link above the header. */
3493
+ backLabel?: string;
3494
+ /** Fired when the back link is pressed. */
3495
+ onBack?: () => void;
3496
+ /** Disables the submit button and shows the in-progress label. */
3497
+ submitting?: boolean;
3498
+ /** BCP 47 locale used for date and currency formatting. */
3499
+ locale?: string;
3500
+ /** Additional CSS class, appended last. */
3501
+ className?: string;
3502
+ }
3503
+ /**
3504
+ * Bid response — the Submit Bid destination. The legacy screen offered four ways to
3505
+ * respond (a manual form, a pasted quote, a document upload, and for ACMI carriers a
3506
+ * calculator); the calculator is now the single submission method for everyone, so a
3507
+ * price is always built from the same inputs rather than typed in blind.
3508
+ */
3509
+ declare const CharterBidResponsePage: {
3510
+ ({ program, trips, accountName, tripLevel, acmiCarrier, requestedCarrier, defaultInputs, acmiResult, onCalculateAcmi, onSubmitBid, backLabel, onBack, submitting, locale, className, }: CharterBidResponsePageProps): React.JSX.Element;
3511
+ displayName: string;
3512
+ };
3513
+
3514
+ /** How the carrier submitted the bid STM is still parsing. */
3515
+ type CharterSubmissionType = 'form' | 'upload' | 'copyPaste';
3516
+ /** One submitted bid line as stored against the opportunity. */
3517
+ interface CharterSubmittedBid {
3518
+ /** Stable id used as the React key. */
3519
+ id: string;
3520
+ /** Seats offered. */
3521
+ seats: number;
3522
+ /** Max payload in pounds. */
3523
+ maxPayloadLbs: number;
3524
+ /** Fuel base price in dollars. */
3525
+ fuelBasePrice: number;
3526
+ /** Total cost in dollars. */
3527
+ totalCost: number;
3528
+ /** Catering included in the price. */
3529
+ cateringAvailable: string;
3530
+ /**
3531
+ * Operator notes. Salesforce stores these pipe-delimited in one field; pass the
3532
+ * already-split lines and each renders on its own row.
3533
+ */
3534
+ notesFromOperator?: string[];
3535
+ }
3536
+ interface CharterBidViewPageProps {
3537
+ /** Flight program the bid belongs to. */
3538
+ program: CharterFlightProgramBid;
3539
+ /** Trip the bid covers; omit for a program-level bid. */
3540
+ trip?: CharterTripBid;
3541
+ /** Bids submitted against this opportunity. Empty means nothing has parsed yet. */
3542
+ bids?: CharterSubmittedBid[];
3543
+ /**
3544
+ * Set when a submission exists but has not parsed into bid lines yet. The legacy page
3545
+ * told the carrier to refresh; this drives a real processing state instead.
3546
+ */
3547
+ processingSubmission?: CharterSubmissionType;
3548
+ /** Fired when the carrier asks to re-check a processing submission. */
3549
+ onRefresh?: () => void;
3550
+ /** Label for the back link above the header. */
3551
+ backLabel?: string;
3552
+ /** Fired when the back link is pressed. */
3553
+ onBack?: () => void;
3554
+ /** BCP 47 locale used for currency formatting. */
3555
+ locale?: string;
3556
+ /** Additional CSS class, appended last. */
3557
+ className?: string;
3558
+ }
3559
+ /**
3560
+ * View submitted bid — the legacy `dsp_viewBidResponse.cfm`. Shows every submitted bid
3561
+ * line, and replaces "please refresh the page" with a real processing state for bids
3562
+ * that arrived by upload or copy/paste and are still being parsed.
3563
+ */
3564
+ declare const CharterBidViewPage: {
3565
+ ({ program, trip, bids, processingSubmission, onRefresh, backLabel, onBack, locale, className, }: CharterBidViewPageProps): React.JSX.Element;
3566
+ displayName: string;
3567
+ };
2211
3568
 
2212
3569
  type ManifestSendState = 'none' | 'initial-sent' | 'final-sent';
2213
3570
  interface CharterManifestSegment {
@@ -2263,6 +3620,136 @@ interface CharterManifestPageProps {
2263
3620
  /** Stateless, service-free rendering of Hub's charter manifest page. */
2264
3621
  declare const CharterManifestPage: ({ tripName, travelStartDate, travelEndDate, seats, payloadLimit, passengerWeight, cargoWeight, carrierName, carrierNote, passengers, equipment, segments, locked, sendState, onBack, onGenerateFile, onChangeCarrier, onSplitSegments, onAddPassengers, onAddEquipment, onRemovePassenger, onRemoveEquipment, onSendInitial, onSendFinal, onUndoInitial, className, }: CharterManifestPageProps) => React.JSX.Element;
2265
3622
 
3623
+ type ChartersAccessRole = 'member' | 'admin';
3624
+ type ChartersAccessId = string | number;
3625
+ /** An account user who is eligible to receive STM Charters access. */
3626
+ interface ChartersAccountUser {
3627
+ accountUserId: ChartersAccessId;
3628
+ name: string;
3629
+ email: string;
3630
+ title?: string;
3631
+ }
3632
+ /** One account user's membership in the STM Charters workspace. */
3633
+ interface ChartersAccessMembership extends ChartersAccountUser {
3634
+ membershipId: ChartersAccessId;
3635
+ role: ChartersAccessRole;
3636
+ /** When present, the role control is disabled and this reason is shown. */
3637
+ roleChangeDisabledReason?: string;
3638
+ /** When present, the remove action is disabled and this reason is shown. */
3639
+ removeDisabledReason?: string;
3640
+ }
3641
+ interface ChartersAccessManagementPageProps {
3642
+ /** Account whose STM Charters membership is being managed. */
3643
+ accountName: string;
3644
+ /** Controlled access list. Successful callbacks must update this value in the host. */
3645
+ memberships: ChartersAccessMembership[];
3646
+ /** Existing account users who may be granted access. Existing members are filtered out. */
3647
+ availableAccountUsers: ChartersAccountUser[];
3648
+ /**
3649
+ * Optional debounced lookup for eligible account users. It is called after a trimmed query
3650
+ * reaches two characters; return the resulting candidates through availableAccountUsers.
3651
+ */
3652
+ onSearchAccountUsers?: (query: string) => void | Promise<void>;
3653
+ /** Whether the host is loading candidates requested through onSearchAccountUsers. */
3654
+ accountUserSearchLoading?: boolean;
3655
+ /** The signed-in account user, used only to display the "You" marker. */
3656
+ currentAccountUserId?: ChartersAccessId;
3657
+ /** Whether the viewer may manage access. False renders a deliberate read-only view. */
3658
+ canManageAccess: boolean;
3659
+ /** Explanation shown in the read-only state. */
3660
+ readOnlyMessage?: string;
3661
+ /** Initial page loading state. */
3662
+ loading?: boolean;
3663
+ /** Initial page error. */
3664
+ error?: string;
3665
+ /** Optional retry for the initial page error. */
3666
+ onRetry?: () => void;
3667
+ /** Return to the STM Charters landing page. */
3668
+ onBack?: () => void;
3669
+ /** Add an existing account user as a charter member or charter admin. */
3670
+ onAddAccess?: (accountUser: ChartersAccountUser, role: ChartersAccessRole) => void | Promise<void>;
3671
+ /** Promote or demote an existing charter member. */
3672
+ onChangeRole?: (membership: ChartersAccessMembership, role: ChartersAccessRole) => void | Promise<void>;
3673
+ /** Remove STM Charters access after the page confirmation. */
3674
+ onRemoveAccess?: (membership: ChartersAccessMembership) => void | Promise<void>;
3675
+ className?: string;
3676
+ }
3677
+ /**
3678
+ * Account-scoped access management for the STM Charters workspace.
3679
+ *
3680
+ * The page deliberately owns only interaction state. Memberships, authorization guards,
3681
+ * persistence, routing, and account/global-admin recovery remain controlled by the host.
3682
+ */
3683
+ declare const ChartersAccessManagementPage: {
3684
+ ({ accountName, memberships, availableAccountUsers, onSearchAccountUsers, accountUserSearchLoading, currentAccountUserId, canManageAccess, readOnlyMessage, loading, error, onRetry, onBack, onAddAccess, onChangeRole, onRemoveAccess, className, }: ChartersAccessManagementPageProps): React.JSX.Element;
3685
+ displayName: string;
3686
+ };
3687
+
3688
+ /** One of the destinations the Charters landing page fans out to. */
3689
+ interface CharterSectionCard {
3690
+ /** Stable key, also passed back through `onOpenSection`. */
3691
+ key: string;
3692
+ /** Card heading. */
3693
+ title: string;
3694
+ /** One-line explanation of what lives behind the card. */
3695
+ description: string;
3696
+ /** Number of items waiting in that section; omit to hide the count. */
3697
+ count?: number;
3698
+ /** Noun for the count, e.g. "open bids". */
3699
+ countLabel?: string;
3700
+ /** Optional icon override. Unknown keys otherwise use the standard plane icon. */
3701
+ icon?: ReactNode;
3702
+ }
3703
+ /** A named STM contact for one of the two bid programs. */
3704
+ interface CharterContact {
3705
+ /** Contact's full name. */
3706
+ name: string;
3707
+ /** Their role, e.g. "Director of Charter Sales". */
3708
+ role?: string;
3709
+ /** Email address; rendered as a mailto link when present. */
3710
+ email?: string;
3711
+ /** Direct phone number. */
3712
+ phone?: string;
3713
+ }
3714
+ /** A contact group, matching the legacy Regular Season / NCAA Championship split. */
3715
+ interface CharterContactGroup {
3716
+ /** Group heading. */
3717
+ title: string;
3718
+ /** People to list under the heading. */
3719
+ contacts: CharterContact[];
3720
+ }
3721
+ interface ChartersHomePageProps {
3722
+ /** Page title. */
3723
+ title?: string;
3724
+ /** Introductory copy under the title. */
3725
+ description?: string;
3726
+ /** Section cards; defaults to the four legacy portal areas. */
3727
+ sections?: CharterSectionCard[];
3728
+ /** Contact groups shown below the cards. */
3729
+ contactGroups?: CharterContactGroup[];
3730
+ /** Label for the tutorial link. */
3731
+ tutorialLabel?: string;
3732
+ /** Fired when the tutorial link is pressed. */
3733
+ onOpenTutorial?: () => void;
3734
+ /** Fired with the card key when a section card is opened. */
3735
+ onOpenSection?: (key: string) => void;
3736
+ /** Additional CSS class, appended last. */
3737
+ className?: string;
3738
+ }
3739
+ /** The four areas the legacy carrier portal exposes, in menu order. */
3740
+ declare const CHARTER_SECTIONS: CharterSectionCard[];
3741
+ /** The STM contacts hardcoded into the legacy welcome screen. */
3742
+ declare const CHARTER_CONTACT_GROUPS: CharterContactGroup[];
3743
+ /**
3744
+ * Charters landing page — the entry point for carriers. The legacy screen was a bare
3745
+ * welcome paragraph and a PDF link; this keeps the same information architecture but
3746
+ * puts a real card into each section with the queue count already visible.
3747
+ */
3748
+ declare const ChartersHomePage: {
3749
+ ({ title, description, sections, contactGroups, tutorialLabel, onOpenTutorial, onOpenSection, className, }: ChartersHomePageProps): React.JSX.Element;
3750
+ displayName: string;
3751
+ };
3752
+
2266
3753
  interface ContactInfo {
2267
3754
  name?: string;
2268
3755
  email?: string;
@@ -2367,6 +3854,110 @@ interface DashboardPageProps {
2367
3854
  /** Exact, service-free rendering of Hub's personalized home page. */
2368
3855
  declare const DashboardPage: ({ greeting, firstName, accountName, widgets, systemBanners, alertBanners, syncStatus, onRefresh, onRemove, onResize, onReorder, onReset, onAddWidget, onTravelerRangeChange, onNavigate, className }: DashboardPageProps) => React.JSX.Element;
2369
3856
 
3857
+ type FeatureFlagIdentifier = string | number;
3858
+ type FeatureFlagTargetType = 'global' | 'account' | 'user' | 'userType' | 'role' | 'organizationalUnit' | 'organizationalUnitValue';
3859
+ type FeatureFlagRuleEffect = 'enable' | 'disable';
3860
+ /** Immutable feature metadata supplied by the host. */
3861
+ interface FeatureFlagDefinition {
3862
+ featureKey: string;
3863
+ name: string;
3864
+ description: string;
3865
+ parentFeatureKey?: string;
3866
+ defaultEnabled: boolean;
3867
+ /** Runtime definition kill switch. False means no targeting rule may enable the feature. */
3868
+ isActive?: boolean;
3869
+ }
3870
+ /** A host-owned selectable audience. IDs are opaque to the component. */
3871
+ interface FeatureFlagTargetOption {
3872
+ value: FeatureFlagIdentifier;
3873
+ label: string;
3874
+ accountId?: FeatureFlagIdentifier;
3875
+ /** Optional parent organizational-unit ID for a value option. */
3876
+ parentValue?: FeatureFlagIdentifier;
3877
+ disabled?: boolean;
3878
+ }
3879
+ interface FeatureFlagTargetOptions {
3880
+ accounts: FeatureFlagTargetOption[];
3881
+ users: FeatureFlagTargetOption[];
3882
+ userTypes: FeatureFlagTargetOption[];
3883
+ roles: FeatureFlagTargetOption[];
3884
+ organizationalUnits: FeatureFlagTargetOption[];
3885
+ organizationalUnitValues: FeatureFlagTargetOption[];
3886
+ }
3887
+ /** One persisted rule. `rowVersion` must be treated as an opaque concurrency token. */
3888
+ interface FeatureFlagRule {
3889
+ ruleId: FeatureFlagIdentifier;
3890
+ rowVersion: string;
3891
+ featureKey: string;
3892
+ targetType: FeatureFlagTargetType;
3893
+ accountId?: FeatureFlagIdentifier;
3894
+ accountLabel?: string;
3895
+ targetId?: FeatureFlagIdentifier;
3896
+ targetLabel: string;
3897
+ effect: FeatureFlagRuleEffect;
3898
+ priority: number;
3899
+ startsAt?: string | null;
3900
+ endsAt?: string | null;
3901
+ reason?: string | null;
3902
+ isActive: boolean;
3903
+ }
3904
+ interface FeatureFlagRuleFormValue {
3905
+ featureKey: string;
3906
+ targetType: FeatureFlagTargetType;
3907
+ accountId?: FeatureFlagIdentifier;
3908
+ targetId?: FeatureFlagIdentifier;
3909
+ effect: FeatureFlagRuleEffect;
3910
+ priority: number;
3911
+ startsAt?: string;
3912
+ endsAt?: string;
3913
+ reason: string;
3914
+ }
3915
+ interface FeatureFlagRuleEditRequest {
3916
+ ruleId: FeatureFlagIdentifier;
3917
+ rowVersion: string;
3918
+ value: FeatureFlagRuleFormValue;
3919
+ }
3920
+ interface FeatureFlagRuleDeactivateRequest {
3921
+ ruleId: FeatureFlagIdentifier;
3922
+ rowVersion: string;
3923
+ reason: string;
3924
+ }
3925
+ interface FeatureFlagManagementPageProps {
3926
+ /** Immutable feature catalog, including parent-child relationships. */
3927
+ definitions: FeatureFlagDefinition[];
3928
+ /** Controlled rule list. Successful mutations must be reflected by the host. */
3929
+ rules: FeatureFlagRule[];
3930
+ /** Controlled account and audience options. */
3931
+ targetOptions: FeatureFlagTargetOptions;
3932
+ loading?: boolean;
3933
+ error?: string;
3934
+ onRetry?: () => void;
3935
+ /** Host mutation state. It disables all mutation controls. */
3936
+ submitting?: boolean;
3937
+ /** Controlled user-search results are returned through `targetOptions.users`. */
3938
+ onSearchUsers?: (query: string, accountId?: FeatureFlagIdentifier) => void | Promise<void>;
3939
+ userSearchLoading?: boolean;
3940
+ userSearchError?: string;
3941
+ /** Called when an account selection needs account-scoped audience options from the host. */
3942
+ onAccountChange?: (accountId?: FeatureFlagIdentifier) => void | Promise<void>;
3943
+ audienceLoading?: boolean;
3944
+ audienceError?: string;
3945
+ onCreateRule?: (value: FeatureFlagRuleFormValue) => void | Promise<void>;
3946
+ onEditRule?: (request: FeatureFlagRuleEditRequest) => void | Promise<void>;
3947
+ onDeactivateRule?: (request: FeatureFlagRuleDeactivateRequest) => void | Promise<void>;
3948
+ className?: string;
3949
+ }
3950
+ /**
3951
+ * Presentation-only feature catalog and targeting-rule manager.
3952
+ *
3953
+ * The host owns authentication, authorization, persistence, effective-flag evaluation,
3954
+ * generated API types, and conversion to wire-level audience/effect values.
3955
+ */
3956
+ declare const FeatureFlagManagementPage: {
3957
+ ({ definitions, rules, targetOptions, loading, error, onRetry, submitting, onSearchUsers, userSearchLoading, userSearchError, onAccountChange, audienceLoading, audienceError, onCreateRule, onEditRule, onDeactivateRule, className, }: FeatureFlagManagementPageProps): React.JSX.Element;
3958
+ displayName: string;
3959
+ };
3960
+
2370
3961
  type GroupTravelRequestFieldValue = string | number | boolean | undefined;
2371
3962
  type GroupTravelRequestValues = Record<string, GroupTravelRequestFieldValue>;
2372
3963
  interface GroupTravelRequestContact {
@@ -2396,38 +3987,339 @@ declare const GroupTravelRequestPage: {
2396
3987
  };
2397
3988
 
2398
3989
  type TabKey = 'requested' | 'current' | 'past';
3990
+ interface IndividualTravelFilters {
3991
+ search: string;
3992
+ sport: string;
3993
+ traveler: string;
3994
+ travelDateFrom: string;
3995
+ travelDateTo: string;
3996
+ destination: string;
3997
+ vendor: string;
3998
+ confirmation: string;
3999
+ amountMin: string;
4000
+ amountMax: string;
4001
+ }
4002
+ interface IndividualTravelPagination {
4003
+ page: number;
4004
+ pageSize: number;
4005
+ totalCount: number;
4006
+ totalPages: number;
4007
+ }
4008
+ type IndividualTravelTabCounts = Partial<Record<TabKey, number>>;
4009
+ type IndividualTravelExportScope = 'all' | TabKey;
4010
+ interface IndividualTravelExportRequest {
4011
+ scope: IndividualTravelExportScope;
4012
+ activeTab: TabKey;
4013
+ filters: IndividualTravelFilters;
4014
+ }
2399
4015
  interface IndividualTravelPageProps {
2400
- /** Current trips data */
2401
- currentTrips: TripData[];
2402
- /** Past trips data */
2403
- pastTrips: TripData[];
2404
- /** Requested trips data */
2405
- requestedTrips: TripData[];
2406
- /** Sport options for filter */
4016
+ /**
4017
+ * Active server-provided page of rows. When supplied, filtering and paging are
4018
+ * delegated to the host through the controlled callbacks below.
4019
+ */
4020
+ trips?: TripData[];
4021
+ /** Counts for each enabled tab, independent from the current server page. */
4022
+ tabCounts?: IndividualTravelTabCounts;
4023
+ /** Enabled tabs. Defaults to the production-backed current and past views. */
4024
+ enabledTabs?: TabKey[];
4025
+ /** Controlled active tab. */
4026
+ activeTab?: TabKey;
4027
+ /** Called when the user selects a tab. */
4028
+ onTabChange?: (tab: TabKey) => void;
4029
+ /** Controlled server filters. */
4030
+ filters?: Partial<IndividualTravelFilters>;
4031
+ /** Initial filters for uncontrolled/legacy mode. */
4032
+ defaultFilters?: Partial<IndividualTravelFilters>;
4033
+ /** Called with the complete next filter set. Hosts normally debounce requests. */
4034
+ onFiltersChange?: (filters: IndividualTravelFilters) => void;
4035
+ /** Controlled server pagination. */
4036
+ pagination?: IndividualTravelPagination;
4037
+ /** Called when the user requests another page. */
4038
+ onPageChange?: (page: number) => void;
4039
+ /** Initial data load. */
4040
+ loading?: boolean;
4041
+ /** Background refresh while existing rows remain visible. */
4042
+ refreshing?: boolean;
4043
+ /** Load error displayed instead of the table. */
4044
+ error?: ReactNode;
4045
+ /** Optional retry action for a load error. */
4046
+ onRetry?: () => void;
4047
+ /** Host-controlled export state. */
4048
+ exporting?: boolean;
4049
+ /**
4050
+ * Preferred export callback. It receives the tab and filters needed to export
4051
+ * the same controlled view the user sees.
4052
+ */
4053
+ onExportFiltered?: (request: IndividualTravelExportRequest) => void | Promise<void>;
4054
+ /** Preferred booked-trip callback. Receives the stable controlled row. */
4055
+ onSelectTrip?: (trip: TripData) => void;
4056
+ /** Preferred requested-trip callback. Receives the stable controlled row. */
4057
+ onSelectRequest?: (trip: TripData) => void;
4058
+ /** Optional handoff to a real host-owned request route. Hidden when absent. */
4059
+ onCreateRequest?: () => void;
4060
+ /** Message used when the active, unfiltered source is empty. */
4061
+ emptyMessage?: string;
4062
+ /** Accessible label for the primary search field. */
4063
+ searchLabel?: string;
4064
+ /** Placeholder for the primary search field. */
4065
+ searchPlaceholder?: string;
4066
+ /** @deprecated Use `trips` with controlled tab/filter/pagination props. */
4067
+ currentTrips?: TripData[];
4068
+ /** @deprecated Use `trips` with controlled tab/filter/pagination props. */
4069
+ pastTrips?: TripData[];
4070
+ /**
4071
+ * @deprecated Use `trips` and explicitly enable `requested` only when a real
4072
+ * requested-trip source and detail handler exist.
4073
+ */
4074
+ requestedTrips?: TripData[];
4075
+ /** Sport options for the filter. `All Sports` is added automatically. */
2407
4076
  sportOptions?: FilterOption[];
2408
- /** Traveler options for filter */
4077
+ /** Traveler options for the filter. `All Travelers` is added automatically. */
2409
4078
  travelerOptions?: FilterOption[];
2410
- /** Initial active tab */
4079
+ /** @deprecated Prefer controlled `activeTab`. */
2411
4080
  initialTab?: TabKey;
2412
- /** Table density */
4081
+ /** Table density. */
2413
4082
  density?: 'comfortable' | 'compact';
2414
- /** Vendor display mode */
4083
+ /** Vendor display mode. */
2415
4084
  vendorMode?: 'icon' | 'code';
2416
- /** Use service column mode */
4085
+ /** Use a unified service column. */
2417
4086
  useServiceColumn?: boolean;
2418
- /** Callback when viewing a trip */
4087
+ /** @deprecated Prefer `onSelectTrip`. */
2419
4088
  onViewTrip?: (id: string) => void;
2420
- /** Callback when viewing a request */
4089
+ /** @deprecated Prefer `onSelectRequest`. */
2421
4090
  onViewRequest?: (id: string) => void;
2422
- /** Callback when exporting */
2423
- onExport?: (scope: 'all' | 'current' | 'past') => void;
2424
- /** Show traveler scope info for standard users */
4091
+ /**
4092
+ * Legacy export callback. It remains async-capable but cannot receive filters
4093
+ * or export the requested tab. Prefer `onExportFiltered`.
4094
+ * @deprecated
4095
+ */
4096
+ onExport?: (scope: 'all' | 'current' | 'past') => void | Promise<void>;
4097
+ /** Show traveler scope information for standard users. */
2425
4098
  showTravelerScopeInfo?: boolean;
2426
- /** Additional CSS class */
4099
+ /** Additional CSS class. */
2427
4100
  className?: string;
2428
4101
  }
2429
4102
  declare const IndividualTravelPage: React__default.FC<IndividualTravelPageProps>;
2430
4103
 
4104
+ /** Travel services represented by the legacy individual-request record. */
4105
+ type IndividualTravelRequestService = 'air' | 'hotel' | 'car' | 'bus';
4106
+ type IndividualTravelRequestTravelerType = 'self' | 'other';
4107
+ type IndividualTravelRequestAirTripType = 'one-way' | 'round-trip' | 'multi-leg';
4108
+ type IndividualTravelRequestQuestionType = 'text' | 'yes-no' | 'single-select';
4109
+ interface IndividualTravelRequestOption {
4110
+ value: string;
4111
+ label: string;
4112
+ }
4113
+ /**
4114
+ * Display-only identity for the authenticated traveler. The host remains
4115
+ * responsible for deriving the submitting user and self traveler from auth.
4116
+ */
4117
+ interface IndividualTravelRequestCurrentTraveler {
4118
+ displayName: string;
4119
+ email?: string;
4120
+ }
4121
+ interface IndividualTravelRequestTraveler {
4122
+ firstName: string;
4123
+ middleName?: string;
4124
+ lastName: string;
4125
+ dateOfBirth?: string;
4126
+ gender?: string;
4127
+ }
4128
+ interface IndividualTravelRequestQuestion {
4129
+ id: string;
4130
+ label: string;
4131
+ type: IndividualTravelRequestQuestionType;
4132
+ description?: string;
4133
+ required?: boolean;
4134
+ minLength?: number;
4135
+ maxLength?: number;
4136
+ options?: IndividualTravelRequestOption[];
4137
+ defaultValue?: string | boolean;
4138
+ }
4139
+ interface IndividualTravelRequestAirLeg {
4140
+ departureLocation: string;
4141
+ arrivalLocation: string;
4142
+ departureDate: string;
4143
+ departureTime: string;
4144
+ /** Used by a round-trip request. Multi-leg trips use another leg instead. */
4145
+ returnDate?: string;
4146
+ returnTime?: string;
4147
+ }
4148
+ interface IndividualTravelRequestAirRequest {
4149
+ tripType: IndividualTravelRequestAirTripType;
4150
+ legs: IndividualTravelRequestAirLeg[];
4151
+ details?: string;
4152
+ farePreference?: string;
4153
+ flightPreference?: string;
4154
+ preferredAirline?: string;
4155
+ priority?: string;
4156
+ }
4157
+ interface IndividualTravelRequestHotelLeg {
4158
+ city: string;
4159
+ checkInDate: string;
4160
+ checkOutDate: string;
4161
+ }
4162
+ interface IndividualTravelRequestHotelRequest {
4163
+ legs: IndividualTravelRequestHotelLeg[];
4164
+ bedPreference?: string;
4165
+ smokingPreference?: string;
4166
+ preferredHotel?: string;
4167
+ }
4168
+ interface IndividualTravelRequestCarLeg {
4169
+ pickupCity: string;
4170
+ pickupLocation?: string;
4171
+ pickupDate: string;
4172
+ /** Exact local time in 24-hour `HH:MM` form. */
4173
+ pickupTime: string;
4174
+ dropoffLocation?: string;
4175
+ dropoffDate: string;
4176
+ /** Exact local time in 24-hour `HH:MM` form. */
4177
+ dropoffTime: string;
4178
+ }
4179
+ interface IndividualTravelRequestCarRequest {
4180
+ legs: IndividualTravelRequestCarLeg[];
4181
+ vehicleType?: string;
4182
+ rentalCompany?: string;
4183
+ flightNumberOrTailNumber?: string;
4184
+ }
4185
+ interface IndividualTravelRequestBusRequest {
4186
+ pickupCity?: string;
4187
+ pickupLocation?: string;
4188
+ pickupDateTime?: string;
4189
+ dropoffCity?: string;
4190
+ dropoffLocation?: string;
4191
+ dropoffDateTime?: string;
4192
+ vehicleType?: string;
4193
+ specialRequests?: string;
4194
+ }
4195
+ type IndividualTravelRequestAnswerValue = string | boolean;
4196
+ /**
4197
+ * Host-submittable request values. Account and actor IDs are deliberately not
4198
+ * represented; the server must derive them from the authenticated context.
4199
+ */
4200
+ interface IndividualTravelRequestValues {
4201
+ travelerType: IndividualTravelRequestTravelerType;
4202
+ /** Empty for self; populated only when travelerType is `other`. */
4203
+ travelers: IndividualTravelRequestTraveler[];
4204
+ /** Comma-delimited when emitted. The form also accepts semicolon input. */
4205
+ additionalEmails?: string;
4206
+ organizationAnswers: Record<string, string>;
4207
+ billingAnswers: Record<string, IndividualTravelRequestAnswerValue>;
4208
+ airRequest?: IndividualTravelRequestAirRequest;
4209
+ hotelRequest?: IndividualTravelRequestHotelRequest;
4210
+ carRequest?: IndividualTravelRequestCarRequest;
4211
+ busRequest?: IndividualTravelRequestBusRequest;
4212
+ specialRequests?: string;
4213
+ }
4214
+ interface IndividualTravelRequestFormConfiguration {
4215
+ organizationQuestions?: IndividualTravelRequestQuestion[];
4216
+ billingQuestions?: IndividualTravelRequestQuestion[];
4217
+ airlineOptions?: IndividualTravelRequestOption[];
4218
+ timeOptions?: IndividualTravelRequestOption[];
4219
+ fareOptions?: IndividualTravelRequestOption[];
4220
+ flightPreferenceOptions?: IndividualTravelRequestOption[];
4221
+ airPriorityOptions?: IndividualTravelRequestOption[];
4222
+ hotelOptions?: IndividualTravelRequestOption[];
4223
+ bedOptions?: IndividualTravelRequestOption[];
4224
+ smokingOptions?: IndividualTravelRequestOption[];
4225
+ vehicleOptions?: IndividualTravelRequestOption[];
4226
+ rentalCompanyOptions?: IndividualTravelRequestOption[];
4227
+ busVehicleOptions?: IndividualTravelRequestOption[];
4228
+ genderOptions?: IndividualTravelRequestOption[];
4229
+ /** Defaults to the currently verified air, hotel, and car request UI. */
4230
+ enabledServices?: IndividualTravelRequestService[];
4231
+ /** The host must authorize this capability. Defaults to false. */
4232
+ allowOtherTravelers?: boolean;
4233
+ /** Capped at the legacy maximum of 10. */
4234
+ maxTravelers?: number;
4235
+ /** Capped at the legacy maximum of four per service. */
4236
+ maxSegments?: number;
4237
+ }
4238
+ interface IndividualTravelRequestLabeledAnswer {
4239
+ id: string;
4240
+ label: string;
4241
+ value: IndividualTravelRequestAnswerValue;
4242
+ }
4243
+ interface IndividualTravelRequestSubmitter {
4244
+ name: string;
4245
+ email?: string;
4246
+ phone?: string;
4247
+ }
4248
+ /** Read-only detail model; all identity values are display text, never IDs. */
4249
+ interface IndividualTravelRequestDetail {
4250
+ requestId: string;
4251
+ submittedAt: string;
4252
+ completedAt?: string;
4253
+ submittedBy?: IndividualTravelRequestSubmitter;
4254
+ travelerType: IndividualTravelRequestTravelerType;
4255
+ travelers: IndividualTravelRequestTraveler[];
4256
+ additionalEmails?: string;
4257
+ organizationAnswers?: IndividualTravelRequestLabeledAnswer[];
4258
+ billingAnswers?: IndividualTravelRequestLabeledAnswer[];
4259
+ airRequest?: IndividualTravelRequestAirRequest;
4260
+ hotelRequest?: IndividualTravelRequestHotelRequest;
4261
+ carRequest?: IndividualTravelRequestCarRequest;
4262
+ busRequest?: IndividualTravelRequestBusRequest;
4263
+ specialRequests?: string;
4264
+ }
4265
+
4266
+ interface IndividualTravelRequestFormPageProps {
4267
+ /** Authenticated traveler display data. The component never emits an actor ID. */
4268
+ currentTraveler: IndividualTravelRequestCurrentTraveler;
4269
+ /** Account-aware questions and options loaded by the host. */
4270
+ configuration: IndividualTravelRequestFormConfiguration;
4271
+ /** Controlled form values. */
4272
+ values?: IndividualTravelRequestValues;
4273
+ /** Initial values for uncontrolled use. */
4274
+ initialValues?: Partial<IndividualTravelRequestValues>;
4275
+ /** Called with the complete next form value in controlled or uncontrolled use. */
4276
+ onChange?: (values: IndividualTravelRequestValues) => void;
4277
+ /** Hidden when absent; the remaining form is disabled and clearly read-only. */
4278
+ onSubmit?: (values: IndividualTravelRequestValues) => void | Promise<void>;
4279
+ /** Optional host-owned return/cancel route. */
4280
+ onCancel?: () => void;
4281
+ /** Configuration or initial-page loading state. */
4282
+ loading?: boolean;
4283
+ /** Host-controlled submit state. */
4284
+ submitting?: boolean;
4285
+ /** Load or submit error from the host. */
4286
+ error?: ReactNode;
4287
+ /** Server validation errors keyed with the form paths documented by this page. */
4288
+ fieldErrors?: Record<string, string>;
4289
+ /** Optional retry for a failed host operation. */
4290
+ onRetry?: () => void;
4291
+ /** Optional account-specific fee or response-time notice. */
4292
+ notice?: ReactNode;
4293
+ submitLabel?: string;
4294
+ className?: string;
4295
+ }
4296
+ declare const IndividualTravelRequestFormPage: React__default.FC<IndividualTravelRequestFormPageProps>;
4297
+
4298
+ interface IndividualTravelRequestDetailPageProps {
4299
+ /** Authorized request detail supplied by the host. */
4300
+ request?: IndividualTravelRequestDetail;
4301
+ /** Replaces request facts while the host loads the authorized record. */
4302
+ loading?: boolean;
4303
+ /** Replaces request facts when the host could not load the record. */
4304
+ error?: ReactNode;
4305
+ /** Important host-owned context shown above a loaded request. */
4306
+ notice?: ReactNode;
4307
+ /** Optional host-owned return route. Hidden when absent. */
4308
+ onBack?: () => void;
4309
+ backLabel?: string;
4310
+ /** Optional retry for a failed host query. Hidden unless an error is present. */
4311
+ onRetry?: () => void;
4312
+ className?: string;
4313
+ }
4314
+ /**
4315
+ * Read-only presentation for an authorized individual-travel request.
4316
+ *
4317
+ * The component performs no routing or lookup and intentionally exposes no
4318
+ * approve, edit, cancel, or email actions. Authorization and tenant scope stay
4319
+ * with the host that supplies `request`.
4320
+ */
4321
+ declare const IndividualTravelRequestDetailPage: ({ request, loading, error, notice, onBack, backLabel, onRetry, className, }: IndividualTravelRequestDetailPageProps) => React.JSX.Element;
4322
+
2431
4323
  interface InfoCenterArticle {
2432
4324
  id: string;
2433
4325
  title: string;
@@ -2478,6 +4370,78 @@ interface InfoCenterPageProps {
2478
4370
  */
2479
4371
  declare const InfoCenterPage: ({ title, accountName, articles, state, isAdmin, onAddArticle, onEditArticle, onOpenExternal, className, showBreadcrumb, homeHref, initialArticleId, onInitialArticleOpen, }: InfoCenterPageProps) => React.JSX.Element;
2480
4372
 
4373
+ /** The travel team contact shown alongside the itinerary. */
4374
+ interface ItineraryAgent {
4375
+ /** Agent or team name */
4376
+ name: string;
4377
+ /** Role, e.g. `Travel Consultant` */
4378
+ role?: string;
4379
+ /** Contact phone number */
4380
+ phone?: string;
4381
+ /** Contact email address */
4382
+ email?: string;
4383
+ }
4384
+ interface ItineraryPageProps {
4385
+ /** Trip name, e.g. `Las Vegas Invitational` */
4386
+ tripName: string;
4387
+ /** Airline record locator / PNR for the trip */
4388
+ recordLocator: string;
4389
+ /** Travelers on the itinerary. A team name can be passed as a single entry. */
4390
+ travelers: string[];
4391
+ /** First travel date as `YYYY-MM-DD` */
4392
+ startDate: string;
4393
+ /** Last travel date as `YYYY-MM-DD` */
4394
+ endDate: string;
4395
+ /** Every air, car and hotel booking on the trip */
4396
+ segments: ItinerarySegment[];
4397
+ /** Overall booking state shown next to the trip name */
4398
+ status?: ItinerarySegmentStatus;
4399
+ /** Sport or program code, e.g. `MBB` */
4400
+ sportCode?: string;
4401
+ /** Total trip cost; when omitted the cost summary is hidden */
4402
+ totalCost?: number;
4403
+ /** ISO 4217 currency code for all amounts on the page */
4404
+ currency?: string;
4405
+ /** Travel team contact for the trip */
4406
+ agent?: ItineraryAgent;
4407
+ /** Shows the loading state in place of the timeline */
4408
+ loading?: boolean;
4409
+ /** Message shown in place of the timeline when the itinerary could not be loaded */
4410
+ error?: ReactNode;
4411
+ /** Important host-owned context shown above the timeline without replacing it */
4412
+ notice?: ReactNode;
4413
+ /** Called when the traveler retries a failed itinerary load */
4414
+ onRetry?: () => void;
4415
+ /** Called when the traveler returns to the individual-travel list */
4416
+ onBack?: () => void;
4417
+ /** Accessible text for the optional return action */
4418
+ backLabel?: string;
4419
+ /** Called when the traveler prints the itinerary */
4420
+ onPrint?: () => void;
4421
+ /** Called when the traveler emails the itinerary */
4422
+ onEmail?: () => void;
4423
+ /** Called when the traveler adds the trip to their calendar */
4424
+ onAddToCalendar?: () => void;
4425
+ /** Called when the traveler opens the PDF virtual invoice */
4426
+ onDownloadInvoice?: () => void;
4427
+ /** Called when a traveler starts online check-in for a flight */
4428
+ onCheckIn?: (segment: ItineraryAirSegment) => void;
4429
+ /** Additional CSS class */
4430
+ className?: string;
4431
+ }
4432
+ /**
4433
+ * ItineraryPage — the traveler-facing itinerary for a single trip.
4434
+ *
4435
+ * Shows who is travelling, when, and every flight, rental car and hotel stay in
4436
+ * day order, together with the actions the Portal itinerary offers today: print
4437
+ * it, email it, add it to a calendar, or open the PDF invoice. The page holds no
4438
+ * data of its own — everything arrives as props.
4439
+ */
4440
+ declare const ItineraryPage: {
4441
+ ({ tripName, recordLocator, travelers, startDate, endDate, segments, status, sportCode, totalCost, currency, agent, loading, error, notice, onRetry, onBack, backLabel, onPrint, onEmail, onAddToCalendar, onDownloadInvoice, onCheckIn, className, }: ItineraryPageProps): React.JSX.Element;
4442
+ displayName: string;
4443
+ };
4444
+
2481
4445
  interface NotFoundPageProps {
2482
4446
  /** Error code to display */
2483
4447
  errorCode?: string | number;
@@ -2506,6 +4470,262 @@ declare const NotFoundPage: {
2506
4470
  displayName: string;
2507
4471
  };
2508
4472
 
4473
+ /** One (raw text → corrected JSON) pair appended to future extraction prompts. */
4474
+ interface OffFleetLearnedExample {
4475
+ /** Stable id used as the React key. */
4476
+ id: string;
4477
+ /** Operator the example is scoped to — examples only apply to the same operator. */
4478
+ operator: string;
4479
+ /** File the correction came from. */
4480
+ sourceFileName: string;
4481
+ /** When the correction was reprocessed, e.g. "3d ago". */
4482
+ learnedLabel: string;
4483
+ /** The raw document text, rendered verbatim. */
4484
+ rawText: string;
4485
+ /** The corrected JSON, rendered verbatim. */
4486
+ correctedJson: string;
4487
+ }
4488
+ interface OffFleetLearnedExamplesPageProps {
4489
+ /** Examples in the corpus. An empty array is the expected starting state. */
4490
+ examples?: OffFleetLearnedExample[];
4491
+ /** Fired with the example id when one is opened in full. */
4492
+ onOpenExample?: (exampleId: string) => void;
4493
+ /** Additional CSS class, appended last. */
4494
+ className?: string;
4495
+ }
4496
+ /** What the corpus is for and which requirement it satisfies. */
4497
+ declare const OFF_FLEET_LEARNED_DESCRIPTION = "Every correction submitted through this site is saved as a (raw text \u2192 corrected JSON) pair and appended to future extraction prompts for the same operator. This is ITD-8195\u2019s fourth requirement \u2014 the mechanism that is supposed to stop the same document format coming back to review week after week.";
4498
+ /** Why the corpus is empty until the first correction is reprocessed. */
4499
+ declare const OFF_FLEET_LEARNED_EMPTY_COPY = "The corpus starts empty and only /api/Reprocess writes to it, so the first row appears after the first correction is reprocessed from this site. Until then every extraction runs on the base prompt alone.";
4500
+ /**
4501
+ * Learned examples — the corrections corpus. The empty state explains the mechanism
4502
+ * rather than apologising, because an empty corpus is the correct starting state.
4503
+ */
4504
+ declare const OffFleetLearnedExamplesPage: {
4505
+ ({ examples, onOpenExample, className, }: OffFleetLearnedExamplesPageProps): React.JSX.Element;
4506
+ displayName: string;
4507
+ };
4508
+
4509
+ /** Where an off-fleet submission sits in the parser pipeline. */
4510
+ type OffFleetSubmissionStatus = 'needs-review' | 'received' | 'processing' | 'parsed';
4511
+ /** One carrier quote the parser could not reconcile against a Trip quote record. */
4512
+ interface OffFleetSubmission {
4513
+ /** Submission UUID — the row key. */
4514
+ id: string;
4515
+ /** Original document file name. */
4516
+ fileName: string;
4517
+ /** Flight Program GUID the submission was filed against. */
4518
+ flightProgramGuid: string;
4519
+ /**
4520
+ * Why the parser could not finish. Rendered verbatim and in full — never truncated,
4521
+ * because the exact list of unmatched flights is what the reviewer acts on.
4522
+ */
4523
+ failureReason: string;
4524
+ /** Resolved carrier name, or undefined when only a GUID is known. */
4525
+ carrierName?: string;
4526
+ /** Carrier GUID, shown when the name could not be resolved. */
4527
+ carrierGuid?: string;
4528
+ /** Pipeline status. */
4529
+ status: OffFleetSubmissionStatus;
4530
+ /** True when the raw document text was captured. */
4531
+ hasRawText?: boolean;
4532
+ /** True when the model's extraction JSON was stored. */
4533
+ hasExtraction?: boolean;
4534
+ /** Human relative time since the last update, e.g. "16h ago". */
4535
+ updatedLabel: string;
4536
+ }
4537
+ interface OffFleetReviewQueuePageProps {
4538
+ /** Submissions to list. */
4539
+ submissions: OffFleetSubmission[];
4540
+ /** Counts for the stat tiles; derived from `submissions` when omitted. */
4541
+ counts?: Partial<Record<OffFleetSubmissionStatus | 'all', number>>;
4542
+ /** Fired with the submission id when Review is pressed. */
4543
+ onReview?: (submissionId: string) => void;
4544
+ /** Fired when the raw document text is opened. */
4545
+ onOpenRawText?: (submissionId: string) => void;
4546
+ /** Fired when the stored extraction JSON is opened. */
4547
+ onOpenExtraction?: (submissionId: string) => void;
4548
+ /** Shows the table's loading row instead of data. */
4549
+ loading?: boolean;
4550
+ /** Additional CSS class, appended last. */
4551
+ className?: string;
4552
+ }
4553
+ /** Copy explaining what lands in this queue and why nothing here dies silently. */
4554
+ declare const OFF_FLEET_QUEUE_DESCRIPTION = "Off-fleet carrier quotes the parser could not reconcile against existing Trip quote records. Each one keeps the raw document text and whatever the model extracted, so it can be corrected and reprocessed rather than dying silently.";
4555
+ /**
4556
+ * Off-fleet review queue. Failure reasons render in full inside the Submission cell —
4557
+ * a reviewer cannot decide what to correct from the word "Error".
4558
+ */
4559
+ declare const OffFleetReviewQueuePage: {
4560
+ ({ submissions, counts, onReview, onOpenRawText, onOpenExtraction, loading, className, }: OffFleetReviewQueuePageProps): React.JSX.Element;
4561
+ displayName: string;
4562
+ };
4563
+
4564
+ /** How the stated prices group onto legs. Changing this changes every per-leg price. */
4565
+ type OffFleetPriceBasis = 'per_segment' | 'per_round_trip' | 'trip_total';
4566
+ /** Whether a leg was matched to a Trip segment, and how. */
4567
+ type OffFleetLegMatch = 'unmatched' | 'ferry' | 'matched';
4568
+ /** A Trip segment the parser could have matched a leg against. */
4569
+ interface OffFleetTripSegment {
4570
+ /** Stable id used as the React key. */
4571
+ id: string;
4572
+ /** Departure date, ISO `yyyy-mm-dd`. */
4573
+ departs: string;
4574
+ /** Departure airport code. */
4575
+ origin: string;
4576
+ /** Arrival airport code. */
4577
+ destination: string;
4578
+ /** Trip GUID the segment belongs to. */
4579
+ tripGuid: string;
4580
+ }
4581
+ /** One leg of the quote — one takeoff, one landing. */
4582
+ interface OffFleetLeg {
4583
+ /** Stable id used as the React key. */
4584
+ id: string;
4585
+ /** How this leg matched a Trip segment. */
4586
+ match: OffFleetLegMatch;
4587
+ /** Flight date, ISO `yyyy-mm-dd`. */
4588
+ date: string;
4589
+ /** Departure airport code. */
4590
+ from: string;
4591
+ /** Arrival airport code. */
4592
+ to: string;
4593
+ /** Scheduled departure time, `HH:mm`. */
4594
+ etd: string;
4595
+ /** Scheduled arrival time, `HH:mm`. */
4596
+ eta: string;
4597
+ /** Equipment for this leg. */
4598
+ aircraft: string;
4599
+ /** Seats on this leg. */
4600
+ seats: string;
4601
+ /** Price as stated in the document, before normalization. */
4602
+ price: string;
4603
+ }
4604
+ /** The fields the parser maps onto the Salesforce Flight Quote. */
4605
+ interface OffFleetQuoteHeader {
4606
+ /** Operator as stated in the document. */
4607
+ operator: string;
4608
+ /** School or organisation, only when the document states it explicitly. */
4609
+ charterer: string;
4610
+ /** Date of the quote, not of a flight. ISO `yyyy-mm-dd`. */
4611
+ quoteDate: string;
4612
+ /** ISO 4217 currency code. */
4613
+ currency: string;
4614
+ /** Fuel base price, numeric with no currency symbol. */
4615
+ fuelBasePrice: string;
4616
+ /** Unit price, only when it is distinct from the leg table. */
4617
+ unitPrice: string;
4618
+ /** How the stated prices group onto legs. */
4619
+ priceBasis: OffFleetPriceBasis;
4620
+ /** Total the document states, checked to ±$1 after normalization. */
4621
+ statedTotal: string;
4622
+ }
4623
+ /** One row of the money reconciliation. */
4624
+ interface OffFleetPreflightRow {
4625
+ /** Leg label, e.g. "Leg 1". */
4626
+ leg: string;
4627
+ /** Price as stated in the document. */
4628
+ asStated: string;
4629
+ /** Price assigned to the leg once the price basis is applied. */
4630
+ perLegAfterNormalization: string;
4631
+ }
4632
+ /** Legs grouped by the Trip they will be billed against. */
4633
+ interface OffFleetTripGrouping {
4634
+ /** Trip GUID. */
4635
+ tripGuid: string;
4636
+ /** How many legs land on this Trip. */
4637
+ legCount: number;
4638
+ /** Total for this Trip, formatted. */
4639
+ total: string;
4640
+ }
4641
+ /** A per-leg problem the reviewer can jump to. */
4642
+ interface OffFleetLegDiagnostic {
4643
+ /** Id of the leg the message is about. */
4644
+ legId: string;
4645
+ /** The diagnostic, rendered in full. */
4646
+ message: string;
4647
+ }
4648
+ /** Everything the pre-flight check reports. */
4649
+ interface OffFleetPreflightCheck {
4650
+ /** Per-leg reconciliation rows. */
4651
+ rows: OffFleetPreflightRow[];
4652
+ /** Total across every row, formatted. */
4653
+ total: string;
4654
+ /** How many legs are still unmatched. */
4655
+ unmatchedCount: number;
4656
+ /** How many legs there are in total. */
4657
+ legCount: number;
4658
+ /** Legs grouped by Trip. */
4659
+ tripGroupings: OffFleetTripGrouping[];
4660
+ /** Per-leg problems, each with a jump target. */
4661
+ diagnostics?: OffFleetLegDiagnostic[];
4662
+ /** Warnings that do not block, e.g. ferry-leg matching. */
4663
+ warnings?: string[];
4664
+ }
4665
+ interface OffFleetSubmissionDetailPageProps {
4666
+ /** Submission UUID, shown as the subtitle. */
4667
+ submissionId: string;
4668
+ /** Original document file name, shown as the H1. */
4669
+ fileName: string;
4670
+ /** Status badge next to the back button. */
4671
+ statusLabel?: string;
4672
+ /** Why the submission needs review, rendered verbatim and in full. */
4673
+ failureReason: string;
4674
+ /** The raw text the parser read, OCR damage included. */
4675
+ rawText: string;
4676
+ /** Carrier name as resolved. */
4677
+ carrier: string;
4678
+ /** Carrier Union GUID. */
4679
+ carrierUnion: string;
4680
+ /** Flight Program GUID. */
4681
+ flightProgram: string;
4682
+ /** UTC timestamp the submission was received. */
4683
+ receivedAt: string;
4684
+ /** UTC timestamp of the last update. */
4685
+ updatedAt: string;
4686
+ /** Trip segments available for matching. */
4687
+ tripSegments?: OffFleetTripSegment[];
4688
+ /** The extraction JSON exactly as stored. */
4689
+ extractionJson?: string;
4690
+ /** Quote header values the reviewer can correct. */
4691
+ quoteHeader: OffFleetQuoteHeader;
4692
+ /** Flight legs the reviewer can correct. */
4693
+ legs: OffFleetLeg[];
4694
+ /** Free-text ambiguity reason. */
4695
+ ambiguityReason?: string;
4696
+ /** The money reconciliation panel. */
4697
+ preflight?: OffFleetPreflightCheck;
4698
+ /**
4699
+ * Why the expensive actions are unavailable. When set, both buttons are disabled and
4700
+ * the reason is shown — an action is never disabled without saying why.
4701
+ */
4702
+ blockedReason?: string;
4703
+ /** Fired with the corrected header, legs, and ambiguity reason. */
4704
+ onCheckCorrection?: (values: {
4705
+ quoteHeader: OffFleetQuoteHeader;
4706
+ legs: OffFleetLeg[];
4707
+ ambiguityReason: string;
4708
+ }) => void;
4709
+ /** Fired when the submission is reprocessed. */
4710
+ onReprocess?: () => void;
4711
+ /** Label for the back link. */
4712
+ backLabel?: string;
4713
+ /** Fired when the back link is pressed. */
4714
+ onBack?: () => void;
4715
+ /** Additional CSS class, appended last. */
4716
+ className?: string;
4717
+ }
4718
+ /**
4719
+ * The off-fleet reviewer. Three properties are load-bearing and deliberate: every input
4720
+ * carries helper text explaining what the field *means* rather than how to format it,
4721
+ * failure reasons and diagnostics render in full, and the expensive actions are disabled
4722
+ * with the reason stated rather than silently greyed out.
4723
+ */
4724
+ declare const OffFleetSubmissionDetailPage: {
4725
+ ({ submissionId, fileName, statusLabel, failureReason, rawText, carrier, carrierUnion, flightProgram, receivedAt, updatedAt, tripSegments, extractionJson, quoteHeader: initialHeader, legs: initialLegs, ambiguityReason: initialAmbiguity, preflight, blockedReason, onCheckCorrection, onReprocess, backLabel, onBack, className, }: OffFleetSubmissionDetailPageProps): React.JSX.Element;
4726
+ displayName: string;
4727
+ };
4728
+
2509
4729
  type RosterProgramNumberId = number | string;
2510
4730
  interface RosterProgramNumberRow {
2511
4731
  id: RosterProgramNumberId;
@@ -2527,6 +4747,47 @@ declare const RosterProgramNumbersPage: {
2527
4747
  displayName: string;
2528
4748
  };
2529
4749
 
4750
+ interface RegularSeasonBidsPageProps {
4751
+ /** Flight programs for the selected queue. */
4752
+ bids: CharterFlightProgramBid[];
4753
+ /** Controlled queue selection; omit to let the page own it. */
4754
+ bidType?: RegularSeasonBidType;
4755
+ /** Queue selected on first render when `bidType` is omitted. */
4756
+ defaultBidType?: RegularSeasonBidType;
4757
+ /** Fired with the queue the carrier switched to. */
4758
+ onBidTypeChange?: (bidType: RegularSeasonBidType) => void;
4759
+ /** ACMI carriers may re-bid, so Submit Bid stays available after submission. */
4760
+ acmiCarrier?: boolean;
4761
+ /** "Today" used to decide which rows are expiring soon. */
4762
+ today?: string;
4763
+ /** Label for the back link above the header. */
4764
+ backLabel?: string;
4765
+ /** Fired when the back link is pressed; the link is hidden without it. */
4766
+ onBack?: () => void;
4767
+ /** Fired when Submit Bid is pressed at either level. */
4768
+ onSubmitBid?: (target: CharterBidTarget) => void;
4769
+ /** Fired when View Bid is pressed at either level. */
4770
+ onViewBid?: (target: CharterBidTarget) => void;
4771
+ /** Fired when a single No Bid button is pressed. */
4772
+ onNoBid?: (target: CharterBidTarget) => void;
4773
+ /** Fired with every checked row when "Submit No Bid for Selected" is pressed. */
4774
+ onBulkNoBid?: (targets: CharterBidTarget[]) => void;
4775
+ /** Shows the table's loading row instead of data. */
4776
+ loading?: boolean;
4777
+ /** BCP 47 locale used for date formatting. */
4778
+ locale?: string;
4779
+ /** Additional CSS class, appended last. */
4780
+ className?: string;
4781
+ }
4782
+ /**
4783
+ * Regular Season bid queues — the legacy `RegularSeasonBids/index.cfm` list with its six
4784
+ * status tabs, filters, and two-level accordion, rebuilt as a real page.
4785
+ */
4786
+ declare const RegularSeasonBidsPage: {
4787
+ ({ bids, bidType: controlledBidType, defaultBidType, onBidTypeChange, acmiCarrier, today, backLabel, onBack, onSubmitBid, onViewBid, onNoBid, onBulkNoBid, loading, locale, className, }: RegularSeasonBidsPageProps): React.JSX.Element;
4788
+ displayName: string;
4789
+ };
4790
+
2530
4791
  interface RosterReportOption {
2531
4792
  id: string;
2532
4793
  title: string;
@@ -2543,6 +4804,77 @@ declare const RosterReportsPage: {
2543
4804
  displayName: string;
2544
4805
  };
2545
4806
 
4807
+ /** The quote fields an admin may correct in place before approving. */
4808
+ interface SourcingQuoteDraft {
4809
+ /** Operating carrier as it should read on the Flight Quote. */
4810
+ carrier: string;
4811
+ /** Travel party the quote must seat. */
4812
+ passengers: string;
4813
+ /** First revenue departure, ISO `yyyy-mm-dd`. */
4814
+ departureDate: string;
4815
+ /** Cost line items; the quoted total is always derived from these. */
4816
+ lineItems: SourcingCostLineItem[];
4817
+ }
4818
+ interface SourcingQuoteDetailPageProps {
4819
+ /** The quote under review. */
4820
+ quote: SourcingQuote;
4821
+ /** Label for the back link above the header. */
4822
+ backLabel?: string;
4823
+ /** Fired when the back link is pressed. */
4824
+ onBack?: () => void;
4825
+ /** Fired with the corrected quote and every edit that must be persisted before approval. */
4826
+ onApprove?: (quoteId: string, changes: QuoteFieldChange[], draft: SourcingQuoteDraft) => void;
4827
+ /** Fired with the note explaining an outright rejection. */
4828
+ onReject?: (quoteId: string, note: string) => void;
4829
+ /** Shows the in-progress state on the approve confirmation. */
4830
+ actionsLoading?: boolean;
4831
+ /** Allow admins to edit facts and line items before approval. */
4832
+ editable?: boolean;
4833
+ /** BCP 47 locale used for currency and date formatting. */
4834
+ locale?: string;
4835
+ /** Additional CSS class, appended last. */
4836
+ className?: string;
4837
+ }
4838
+ /**
4839
+ * Hub's single-quote sourcing review screen. The admin corrects and records the quote here;
4840
+ * there is no request-changes round trip back to the carrier, so
4841
+ * every field is editable, the total stays derived from the line items, and approving
4842
+ * lists each edit old → new so the host can persist the edit before recording approval.
4843
+ */
4844
+ declare const SourcingQuoteDetailPage: {
4845
+ ({ quote, backLabel, onBack, onApprove, onReject, actionsLoading, editable, locale, className, }: SourcingQuoteDetailPageProps): React.JSX.Element;
4846
+ displayName: string;
4847
+ };
4848
+
4849
+ interface SourcingReviewQueuePageProps {
4850
+ /** Page title shown above the queue. */
4851
+ title?: string;
4852
+ /** Supporting copy under the title. */
4853
+ description?: string;
4854
+ /** Carrier-submitted quotes to review. */
4855
+ quotes: SourcingQuote[];
4856
+ /** Controlled selection of quote ids. */
4857
+ selectedQuoteIds?: string[];
4858
+ /** Fired whenever the selection changes. */
4859
+ onSelectionChange?: (selectedQuoteIds: string[]) => void;
4860
+ /** Fired when a quote is opened for review. */
4861
+ onOpenQuote?: (quoteId: string) => void;
4862
+ /** Fired with every selected id when the bulk-approve button is pressed. */
4863
+ onBulkApprove?: (quoteIds: string[]) => void;
4864
+ /** Hides the summary metrics above the queue. */
4865
+ hideSummary?: boolean;
4866
+ /** Rows shown per page. */
4867
+ pageSize?: number;
4868
+ /** Shows the table's loading row instead of data. */
4869
+ loading?: boolean;
4870
+ /** BCP 47 locale used for currency and date formatting. */
4871
+ locale?: string;
4872
+ /** Additional CSS class, appended last. */
4873
+ className?: string;
4874
+ }
4875
+ /** Hub's ACMI sourcing review queue — every carrier quote waiting on an admin decision. */
4876
+ declare const SourcingReviewQueuePage: ({ title, description, quotes, selectedQuoteIds, onSelectionChange, onOpenQuote, onBulkApprove, hideSummary, pageSize, loading, locale, className, }: SourcingReviewQueuePageProps) => React.JSX.Element;
4877
+
2546
4878
  interface TeamManagementTab extends TeamSubMenuTab {
2547
4879
  /** Tab icon */
2548
4880
  icon?: ReactNode;
@@ -2726,5 +5058,5 @@ declare const TripDetailPage: {
2726
5058
  displayName: string;
2727
5059
  };
2728
5060
 
2729
- export { Accordion, AdministrationPage, AirSegment, Alert, AppLayout, ArrowDownLeftIcon, ArrowUpRightIcon, Avatar, AvatarGroup, Badge, BuildingIcon, BusIcon, Button, CalendarIcon, CalendarTypeSelector, CalendarViewSelector, CarIcon, Card, CardBody, CardFooter, CardHeader, CharterManifestPage, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CloseIcon, ConfirmModal, ContactList, ContactUsPage, CubeIcon, DashboardIcon, DashboardPage, Datepicker, DocumentIcon, DownloadIcon, Drawer, DrawerBody, DrawerFooter, DrawerHeader, Dropdown, DueDatesDrawer, EditIcon, EyeIcon, FilterChip, FilterIcon, FormField, FormRow, FormSection, FormStack, GridIcon, GroundSegment, GroupTravelRequestPage, HUB_ADMIN_ITEM, HUB_INDIVIDUAL_TRAVEL_ITEM, HUB_NAV_ITEMS, HomeIcon, HotelIcon, HotelSegment, HubAppShell, Icons, IndividualTravelPage, InfoCenterPage, InfoIcon, Input, LightbulbIcon, LimoIcon, LockIcon, LogoIcon, MailIcon, ManifestCapacityStats, ManifestViewToggle, MegaphoneIcon, MembershipPrograms, MenuIcon, Metric, MinusIcon, Modal, ModalFooter, Module, ModuleDivider, ModuleVerticalDivider, NavItem, NotFoundPage, PageBanners, PhoneIcon, PlaneIcon, PlusIcon, PreferencesPanel, PrinterIcon, Progress, ProgressBar, ProgressCircle, RailIcon, RefreshIcon, ReportIcon, RequestFormFooter, RequestFormHeader, RequestFormLayout, RequestSummary, RosterProgramNumbersPage, RosterReportsPage, RosterToolbar, SUPPLIER_TYPE_OPTIONS, SchoolContactForm, SearchField, SearchIcon, Segment, SegmentedSelector, Select, SelectFilter, ServiceToggle, ServiceToggleList, SettingsIcon, Sidenav, Spinner, StatusBadge, SummarySection, SupplierTypeToggle, Table, Tag, TeamCard, TeamContactsPanel, TeamEquipmentForm, TeamHeader, TeamImportForm, TeamManagementPage, TeamProgramForm, TeamRosterMemberForm, TeamScheduleActions, TeamScheduleCompactTable, TeamScheduleEditor, TeamScheduleExpandedTable, TeamSchedulePage, TeamSubMenu, TeamTravelCalendarCardView, TeamTravelCalendarListView, TeamTravelCalendarPage, TeamTravelCalendarToolbar, TeamTravelCalendarView, TeamUserAccessForm, Textarea, Timepicker, Title, Toggle, Tooltip, Topbar, TrashIcon, TravelServiceIcon, TravelSummaryMetrics, TravelerForm, TrendDownIcon, TrendUpIcon, TripDetailPage, TripSegment, TripTable, TypeIcon, UploadIcon, UserIcon, UsersIcon, WarningIcon, XIcon, formatCompactTripCost, formatTeamScheduleDueDate, formatTeamScheduleTravelDates, getTeamTravelCalendarPeriodLabel, isTravelDueDateCompleted, moveTeamTravelCalendarPeriod };
2730
- export type { AccordionProps, AccountInfo, AdministrationCard, AdministrationPageProps, AdministrationTab, AirSegmentProps, AlertProps, AlertVariant, AppLayoutProps, AvatarGroupProps, AvatarProps, AvatarSize, BadgeProps, BadgeSize, BadgeVariant, ButtonProps, ButtonSize, ButtonVariant, CalendarMetric, CalendarTypeSelectorProps, CalendarTypeValue, CalendarView, CalendarViewSelectorProps, CalendarViewValue, CardBodyProps, CardFooterProps, CardHeaderProps, CardPadding, CardProps, CardVariant, CharterManifestEquipment, CharterManifestPageProps, CharterManifestPassenger, CharterManifestSegment, CheckboxProps, ConfirmModalProps, Contact, ContactCardData, ContactInfo, ContactListProps, ContactPair, ContactUsData, ContactUsPageProps, DashboardPageProps, DatepickerProps, DatepickerSize, DrawerBodyProps, DrawerFooterProps, DrawerHeaderProps, DrawerPosition, DrawerProps, DrawerSize, DropdownAlignment, DropdownItemProps, DropdownProps, DueDatesDrawerProps, FilterChipProps, FilterOption, FlightData, FormFieldProps, FormRowProps, FormSectionProps, FormStackProps, GroundData, GroundSegmentProps, GroupTravelRequestContact, GroupTravelRequestFieldValue, GroupTravelRequestPageProps, GroupTravelRequestValues, GroupedTravelDueDates, HotelData, HotelSegmentProps, HubAppShellActions, HubAppShellProps, HubNavigationItem, IconName, IconProps, IndividualTravelPageProps, InfoCenterArticle, InfoCenterPageProps, InfoCenterPageState, InputProps, InputSize, ManifestCapacityStatsProps, ManifestSendState, ManifestView, ManifestViewToggleProps, MembershipProgram, MembershipProgramsProps, MetricProps, ModalFooterProps, ModalProps, ModalSize, ModuleProps, ModuleSize, NavItemProps, NavItemSize, NavItemVariant, NotFoundPageProps, PageBannersProps, PreferenceField, PreferenceSection, PreferencesPanelProps, ProgressBarProps, ProgressCircleProps, ProgressSize, ProgressVariant, RequestFormFooterProps, RequestFormHeaderProps, RequestFormLayoutProps, RequestSummaryProps, RosterProgramNumberId, RosterProgramNumberRow, RosterProgramNumbersPageProps, RosterReportOption, RosterReportsPageProps, RosterToolbarProps, ScheduleFilterOption, ScheduleMetric, SchoolContactFormProps, SearchFieldProps, SeasonOption, SegmentOption, SegmentProps, SegmentVariant, SegmentedSelectorOption, SegmentedSelectorProps, SelectFilterOption, SelectFilterProps, SelectOption, SelectOptionGroup, SelectProps, SelectSize, ServiceConfig, ServiceToggleListProps, ServiceToggleProps, SidenavItem, SidenavProps, SpinnerProps, SpinnerSize, StatusBadgeProps, StatusBadgeVariant, SummaryItem, SummarySectionConfig, SummarySegment, SupplierTypeToggleProps, SupplierTypeValue, SystemBanner, TabKey, TableColumn, TableProps, TagProps, TagSize, TagVariant, TeamCardProps, TeamContactId, TeamContactOption, TeamContactsLoadingState, TeamContactsPanelProps, TeamContactsValue, TeamEquipmentFormProps, TeamEquipmentValues, TeamFormMode, TeamHeaderProps, TeamImportFormProps, TeamImportKind, TeamManagementPageProps, TeamManagementTab, TeamNumericValue, TeamOption, TeamPortalUserOption, TeamProgramFormProps, TeamProgramType, TeamProgramValues, TeamRosterMemberFormProps, TeamRosterMemberValues, TeamScheduleActionsProps, TeamScheduleCompactRow, TeamScheduleCompactTableProps, TeamScheduleDueDate, TeamScheduleEditorEvent, TeamScheduleEditorProps, TeamScheduleEditorTrip, TeamScheduleExpandedRow, TeamScheduleExpandedTableProps, TeamScheduleHomeAway, TeamSchedulePageProps, TeamSubMenuProps, TeamSubMenuTab, TeamTravelCalendarCardViewProps, TeamTravelCalendarDueDate, TeamTravelCalendarDuration, TeamTravelCalendarEvent, TeamTravelCalendarItemType, TeamTravelCalendarListViewProps, TeamTravelCalendarPageProps, TeamTravelCalendarSportGroup, TeamTravelCalendarToolbarProps, TeamTravelCalendarTrip, TeamTravelCalendarViewProps, TeamUserAccessFormProps, TeamUserAccessValues, TextareaProps, TimepickerProps, TimepickerSize, TitleProps, TitleWeight, ToggleProps, ToggleSize, ToolbarAction, TooltipPosition, TooltipProps, TooltipVariant, TopbarProps, TravelAlertBanner, TravelDueDateItem, TravelServiceIconProps, TravelSummaryMetricsProps, TravelType, TravelerFormData, TravelerFormProps, TripData, TripDetailPageProps, TripSegmentProps, TripTableProps, TypeIconProps, VendorCode };
5061
+ export { ACMI_AIRCRAFT_OPTIONS, ACMI_CARRIER_OPTIONS, ACMI_INSURANCE_FLAT, Accordion, AcmiQuoteCalculator, AdministrationPage, AgentGroupTravelRequestsPage, AgentGroupTravelRequestsTable, AirSegment, Alert, AppLayout, ArrowDownLeftIcon, ArrowUpRightIcon, Avatar, AvatarGroup, BID_TYPE_HEADINGS, Badge, BuildingIcon, BusIcon, Button, CARRIER_CATERING_OPTIONS, CARRIER_CONTACT_TYPES, CHAMPIONSHIP_BID_TYPES, CHAMPIONSHIP_HEADINGS, CHARTER_CONTACT_GROUPS, CHARTER_SECTIONS, CalendarIcon, CalendarTypeSelector, CalendarViewSelector, CarIcon, Card, CardBody, CardFooter, CardHeader, CarrierProfilePage, ChampionshipBidDetailPage, ChampionshipBidsPage, CharterBidResponsePage, CharterBidViewPage, CharterManifestPage, CharterSourcingEmailPreview, ChartersAccessManagementPage, ChartersHomePage, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CloseIcon, ConfirmModal, ContactList, ContactUsPage, CubeIcon, DashboardIcon, DashboardPage, Datepicker, DocumentIcon, DownloadIcon, Drawer, DrawerBody, DrawerFooter, DrawerHeader, Dropdown, DueDatesDrawer, EditIcon, EmptyState, EyeIcon, FeatureFlagManagementPage, FilterChip, FilterIcon, FormField, FormRow, FormSection, FormStack, GridIcon, GroundSegment, GroupTravelRequestPage, HUB_ADMIN_ITEM, HUB_AGENTS_ITEM, HUB_INDIVIDUAL_TRAVEL_ITEM, HUB_NAV_ITEMS, HUB_OFF_FLEET_ITEM, HUB_SOURCING_ITEM, HUB_STM_CHARTERS_ITEM, HeadsetIcon, HomeIcon, HotelIcon, HotelSegment, HubAppShell, Icons, IndividualTravelPage, IndividualTravelRequestDetailPage, IndividualTravelRequestFormPage, InfoCenterPage, InfoIcon, Input, ItineraryPage, ItinerarySegmentCard, ItineraryTimeline, LightbulbIcon, LimoIcon, LockIcon, LogoIcon, MailIcon, ManifestCapacityStats, ManifestViewToggle, MegaphoneIcon, MembershipPrograms, MenuIcon, Metric, MinusIcon, Modal, ModalFooter, Module, ModuleDivider, ModuleVerticalDivider, NavItem, NotFoundPage, OFF_FLEET_LEARNED_DESCRIPTION, OFF_FLEET_LEARNED_EMPTY_COPY, OFF_FLEET_QUEUE_DESCRIPTION, OffFleetLearnedExamplesPage, OffFleetReviewQueuePage, OffFleetSubmissionDetailPage, PageBanners, Pagination, PhoneIcon, PlaneIcon, PlusIcon, PreferencesPanel, PrinterIcon, Progress, ProgressBar, ProgressCircle, QuoteCostBreakdown, QuoteReviewActions, REGULAR_SEASON_BID_TYPES, RailIcon, RefreshIcon, RegularSeasonBidsPage, RegularSeasonBidsTable, ReportIcon, RequestFormFooter, RequestFormHeader, RequestFormLayout, RequestSummary, RosterProgramNumbersPage, RosterReportsPage, RosterToolbar, SOURCING_COST_CATEGORIES, SOURCING_COST_CATEGORY_LABELS, SUPPLIER_TYPE_OPTIONS, SchoolContactForm, SearchField, SearchIcon, Segment, SegmentedSelector, Select, SelectFilter, ServiceToggle, ServiceToggleList, SettingsIcon, Sidenav, SourcingQuoteDetailPage, SourcingReviewQueuePage, SourcingReviewQueueTable, Spinner, StatusBadge, SummarySection, SupplierTypeToggle, TRIP_MONTH_OPTIONS, Table, Tag, TeamCard, TeamContactsPanel, TeamEquipmentForm, TeamHeader, TeamImportForm, TeamManagementPage, TeamProgramForm, TeamRosterMemberForm, TeamScheduleActions, TeamScheduleCompactTable, TeamScheduleEditor, TeamScheduleExpandedTable, TeamSchedulePage, TeamSubMenu, TeamTravelCalendarCardView, TeamTravelCalendarListView, TeamTravelCalendarPage, TeamTravelCalendarToolbar, TeamTravelCalendarView, TeamUserAccessForm, Textarea, Timepicker, Title, Toggle, Tooltip, Topbar, TrashIcon, TravelServiceIcon, TravelSummaryMetrics, TravelerForm, TrendDownIcon, TrendUpIcon, TripDetailPage, TripSegment, TripTable, TypeIcon, UploadIcon, UserIcon, UsersIcon, WarningIcon, XIcon, buildPaginationItems, computeLineItemTotal, computeQuoteTotals, computeTravelTypeCodes, deriveProgramBidStatus, formatCompactTripCost, formatItineraryDate, formatItineraryDateRange, formatItineraryMoney, formatTeamScheduleDueDate, formatTeamScheduleTravelDates, getCharterSourcingEmailRoute, getCharterSourcingEmailSubject, getPageCount, getSegmentDate, getSegmentStartMinutes, getSegmentTitle, getTeamTravelCalendarPeriodLabel, groupSegmentsByDay, isExpiringSoon, isProgramBiddable, isQuoteActionable, isTravelDueDateCompleted, matchesQuoteSearch, moveTeamTravelCalendarPeriod, parseClockTime, parseItineraryDate };
5062
+ export type { AccordionProps, AccountInfo, AcmiAircraftOption, AcmiLeg, AcmiPositioningMode, AcmiQuoteCalculatorProps, AcmiQuoteInputs, AcmiQuoteResult, AdministrationCard, AdministrationPageProps, AdministrationTab, AgentGroupTravelRequest, AgentGroupTravelRequestSportOption, AgentGroupTravelRequestViewOption, AgentGroupTravelRequestsPageProps, AirSegmentProps, AlertProps, AlertVariant, AppLayoutProps, AvatarGroupProps, AvatarProps, AvatarSize, BadgeProps, BadgeSize, BadgeVariant, ButtonProps, ButtonSize, ButtonVariant, CalendarMetric, CalendarTypeSelectorProps, CalendarTypeValue, CalendarView, CalendarViewSelectorProps, CalendarViewValue, CardBodyProps, CardFooterProps, CardHeaderProps, CardPadding, CardProps, CardVariant, CarrierAircraft, CarrierContact, CarrierProfilePageProps, CarrierProfilePreferences, CarrierProfileTab, ChampionshipBid, ChampionshipBidDetail, ChampionshipBidDetailPageProps, ChampionshipBidType, ChampionshipBidsPageProps, CharterBidLevel, CharterBidResponsePageProps, CharterBidSubmission, CharterBidTarget, CharterBidViewPageProps, CharterContact, CharterContactGroup, CharterFlightProgramBid, CharterManifestEquipment, CharterManifestPageProps, CharterManifestPassenger, CharterManifestSegment, CharterSectionCard, CharterSourcingEmailChange, CharterSourcingEmailChanges, CharterSourcingEmailLeg, CharterSourcingEmailPreviewProps, CharterSourcingEmailQuote, CharterSourcingEmailVariant, CharterSubmissionType, CharterSubmittedBid, CharterTripBid, CharterTripBidStatus, ChartersAccessId, ChartersAccessManagementPageProps, ChartersAccessMembership, ChartersAccessRole, ChartersAccountUser, ChartersHomePageProps, CheckboxProps, ConfirmModalProps, Contact, ContactCardData, ContactInfo, ContactListProps, ContactPair, ContactUsData, ContactUsPageProps, DashboardPageProps, DatepickerProps, DatepickerSize, DrawerBodyProps, DrawerFooterProps, DrawerHeaderProps, DrawerPosition, DrawerProps, DrawerSize, DropdownAlignment, DropdownItemProps, DropdownProps, DueDatesDrawerProps, EmptyStateProps, EmptyStateSize, FeatureFlagDefinition, FeatureFlagIdentifier, FeatureFlagManagementPageProps, FeatureFlagRule, FeatureFlagRuleDeactivateRequest, FeatureFlagRuleEditRequest, FeatureFlagRuleEffect, FeatureFlagRuleFormValue, FeatureFlagTargetOption, FeatureFlagTargetOptions, FeatureFlagTargetType, FilterChipProps, FilterOption, FlightData, FormFieldProps, FormRowProps, FormSectionProps, FormStackProps, GroundData, GroundSegmentProps, GroupTravelDueField, GroupTravelDueStatus, GroupTravelPnr, GroupTravelRequestContact, GroupTravelRequestFieldValue, GroupTravelRequestPageProps, GroupTravelRequestSource, GroupTravelRequestValues, GroupedTravelDueDates, HotelData, HotelSegmentProps, HubAppShellActions, HubAppShellProps, HubNavigationItem, IconName, IconProps, IndividualTravelExportRequest, IndividualTravelExportScope, IndividualTravelFilters, IndividualTravelPageProps, IndividualTravelPagination, IndividualTravelRequestAirLeg, IndividualTravelRequestAirRequest, IndividualTravelRequestAirTripType, IndividualTravelRequestAnswerValue, IndividualTravelRequestBusRequest, IndividualTravelRequestCarLeg, IndividualTravelRequestCarRequest, IndividualTravelRequestCurrentTraveler, IndividualTravelRequestDetail, IndividualTravelRequestDetailPageProps, IndividualTravelRequestFormConfiguration, IndividualTravelRequestFormPageProps, IndividualTravelRequestHotelLeg, IndividualTravelRequestHotelRequest, IndividualTravelRequestLabeledAnswer, IndividualTravelRequestOption, IndividualTravelRequestQuestion, IndividualTravelRequestQuestionType, IndividualTravelRequestService, IndividualTravelRequestSubmitter, IndividualTravelRequestTraveler, IndividualTravelRequestTravelerType, IndividualTravelRequestValues, IndividualTravelTabCounts, InfoCenterArticle, InfoCenterPageProps, InfoCenterPageState, InputProps, InputSize, ItineraryAgent, ItineraryAirSegment, ItineraryCarSegment, ItineraryDay, ItineraryHotelSegment, ItineraryPageProps, ItinerarySegment, ItinerarySegmentCardProps, ItinerarySegmentStatus, ItineraryTimelineProps, ManifestCapacityStatsProps, ManifestSendState, ManifestView, ManifestViewToggleProps, MembershipProgram, MembershipProgramsProps, MetricProps, ModalFooterProps, ModalProps, ModalSize, ModuleProps, ModuleSize, NavItemProps, NavItemSize, NavItemVariant, NotFoundPageProps, OffFleetLearnedExample, OffFleetLearnedExamplesPageProps, OffFleetLeg, OffFleetLegDiagnostic, OffFleetLegMatch, OffFleetPreflightCheck, OffFleetPreflightRow, OffFleetPriceBasis, OffFleetQuoteHeader, OffFleetReviewQueuePageProps, OffFleetSubmission, OffFleetSubmissionDetailPageProps, OffFleetSubmissionStatus, OffFleetTripGrouping, OffFleetTripSegment, PageBannersProps, PaginationItem, PaginationProps, PreferenceField, PreferenceSection, PreferencesPanelProps, ProgressBarProps, ProgressCircleProps, ProgressSize, ProgressVariant, QuoteCostBreakdownProps, QuoteCostTotals, QuoteFieldChange, QuoteReviewActionsProps, RegularSeasonBidType, RegularSeasonBidsPageProps, RegularSeasonBidsTableProps, RequestFormFooterProps, RequestFormHeaderProps, RequestFormLayoutProps, RequestSummaryProps, RosterProgramNumberId, RosterProgramNumberRow, RosterProgramNumbersPageProps, RosterReportOption, RosterReportsPageProps, RosterToolbarProps, ScheduleFilterOption, ScheduleMetric, SchoolContactFormProps, SearchFieldProps, SeasonOption, SegmentOption, SegmentProps, SegmentVariant, SegmentedSelectorOption, SegmentedSelectorProps, SelectFilterOption, SelectFilterProps, SelectOption, SelectOptionGroup, SelectProps, SelectSize, ServiceConfig, ServiceToggleListProps, ServiceToggleProps, SidenavItem, SidenavProps, SourcingCostAdjustment, SourcingCostCategory, SourcingCostLineItem, SourcingQuote, SourcingQuoteDetailPageProps, SourcingQuoteLeg, SourcingQuoteLegType, SourcingQuoteStatus, SourcingReviewQueuePageProps, SourcingReviewQueueTableProps, SpinnerProps, SpinnerSize, StatusBadgeProps, StatusBadgeVariant, SummaryItem, SummarySectionConfig, SummarySegment, SupplierTypeToggleProps, SupplierTypeValue, SystemBanner, TabKey, TableColumn, TableProps, TableRowKey, TagProps, TagSize, TagVariant, TeamCardProps, TeamContactId, TeamContactOption, TeamContactsLoadingState, TeamContactsPanelProps, TeamContactsValue, TeamEquipmentFormProps, TeamEquipmentValues, TeamFormMode, TeamHeaderProps, TeamImportFormProps, TeamImportKind, TeamManagementPageProps, TeamManagementTab, TeamNumericValue, TeamOption, TeamPortalUserOption, TeamProgramFormProps, TeamProgramType, TeamProgramValues, TeamRosterMemberFormProps, TeamRosterMemberValues, TeamScheduleActionsProps, TeamScheduleCompactEvent, TeamScheduleCompactRow, TeamScheduleCompactTableProps, TeamScheduleCompactTrip, TeamScheduleDueDate, TeamScheduleEditorEvent, TeamScheduleEditorProps, TeamScheduleEditorTrip, TeamScheduleExpandedRow, TeamScheduleExpandedTableProps, TeamScheduleHomeAway, TeamSchedulePageProps, TeamSubMenuProps, TeamSubMenuTab, TeamTravelCalendarCardViewProps, TeamTravelCalendarDueDate, TeamTravelCalendarDuration, TeamTravelCalendarEvent, TeamTravelCalendarItemType, TeamTravelCalendarListViewProps, TeamTravelCalendarPageProps, TeamTravelCalendarSportGroup, TeamTravelCalendarToolbarProps, TeamTravelCalendarTrip, TeamTravelCalendarViewProps, TeamUserAccessFormProps, TeamUserAccessValues, TextareaProps, TimepickerProps, TimepickerSize, TitleProps, TitleWeight, ToggleProps, ToggleSize, ToolbarAction, TooltipPosition, TooltipProps, TooltipVariant, TopbarProps, TravelAlertBanner, TravelDueDateItem, TravelServiceIconProps, TravelSummaryMetricsProps, TravelType, TravelerFormData, TravelerFormProps, TripData, TripDetailPageProps, TripSegmentProps, TripTableProps, TypeIconProps, VendorCode };