{"version":3,"file":"main.fe15d87d4d67dc49d67c.js","mappings":"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","sources":["webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/EnrichmentForm.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Enrichments.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/const.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Modal.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Block.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/FundingBreakdown.tsx","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Bid.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/EntityLinks.tsx","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Match.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/HttpLog.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Deliveries.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Lead.tsx","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Call.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Timeline.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/MatchFilters.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/BiddingLog.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/MatchingLog.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/RoutingLog.tsx","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/HttpLogs.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/MatchableModal.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/index.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/constants.js","webpack://ue_platform_clicks_ui/./src/App/ChangeLog/index.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Channel/index.js","webpack://ue_platform_clicks_ui/./src/Components/Form/Select/EntityOptionLabel.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/SourceTokenForm.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/ClickTags.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/Details.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/schemaFields.ts","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/RequiredFields.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/EnrichmentForm.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/Enrichments.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/index.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/RuleTree.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/TreeRule.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/NavTabs.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Header.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/RuleSummary.js","webpack://ue_platform_clicks_ui/./src/Components/Form/BuyerSelect.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/BiddingIntegration.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/ValueEstimatorIntegration.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Settings.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/CapsType.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/PingDedupeType.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Caps.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Tracking.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/ActionsPanel.js","webpack://ue_platform_clicks_ui/./src/utils/numberFormat.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Advanced.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/RulesConfig.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Manager.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/EntityInfoBar.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Page.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/Modal.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Rules/ChannelSourceRoute.js","webpack://ue_platform_clicks_ui/./src/App/Tools/InputSchema/InputSchemaApi.js","webpack://ue_platform_clicks_ui/./src/Components/Chart/chart.js","webpack://ue_platform_clicks_ui/./src/Components/Form/CustomValidation.js","webpack://ue_platform_clicks_ui/./src/Components/Form/DynamicEnhancedSelect.js","webpack://ue_platform_clicks_ui/./src/Components/Form/FileDropzone.js","webpack://ue_platform_clicks_ui/./src/Components/Form/FormCommon.js","webpack://ue_platform_clicks_ui/./src/Components/Form/IconCheckbox.js","webpack://ue_platform_clicks_ui/./src/Components/Form/InputWithIcon.js","webpack://ue_platform_clicks_ui/./src/Components/Form/KeyValueBuilder.js","webpack://ue_platform_clicks_ui/./src/Components/Form/KeyValueRow.js","webpack://ue_platform_clicks_ui/./src/Components/Form/PasswordEntry.js","webpack://ue_platform_clicks_ui/./src/Components/Form/PasswordWithToggle.js","webpack://ue_platform_clicks_ui/./src/Components/Form/PixelForm.js","webpack://ue_platform_clicks_ui/./src/Components/Form/SimpleSelect.js","webpack://ue_platform_clicks_ui/./src/Components/Form/const.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/DMS/Mastodon.js","webpack://ue_platform_clicks_ui/./src/Components/Modal.js","webpack://ue_platform_clicks_ui/./src/Components/ProtectedRoute.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/BidDisplay.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/BidWidget.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/CopyWidget.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/DeliveryDestinations.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/MoveWidget.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/RuleIcons.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/Summaries.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/TargetDescription.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/TreeBranch.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/TreeProvider.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/constants.js","webpack://ue_platform_clicks_ui/./src/Components/Table/BooleanIconCell.js","webpack://ue_platform_clicks_ui/./src/Components/Table/Filter.js","webpack://ue_platform_clicks_ui/./src/Components/Table/FilterBar.js","webpack://ue_platform_clicks_ui/./src/Components/Table/FilterChoices.js","webpack://ue_platform_clicks_ui/./src/Components/Table/FilterSummaryTags.js","webpack://ue_platform_clicks_ui/./src/Components/Table/FlexTable.js","webpack://ue_platform_clicks_ui/./src/Components/Table/PaginationWidget.js","webpack://ue_platform_clicks_ui/./src/Components/Table/PagedTable.js","webpack://ue_platform_clicks_ui/./src/Components/Form/TimezoneSelect.js","webpack://ue_platform_clicks_ui/./src/Components/Form/DateRangeDropdown.js","webpack://ue_platform_clicks_ui/./src/Components/Table/RightDateAndControls.js","webpack://ue_platform_clicks_ui/./src/Components/Table/Table.js","webpack://ue_platform_clicks_ui/./src/Components/Table/TableSubcomponent.js","webpack://ue_platform_clicks_ui/./src/Components/Table/constants.js","webpack://ue_platform_clicks_ui/./src/Components/Table/queryString.js","webpack://ue_platform_clicks_ui/./src/Components/TargetingManager/TargetSelect.js","webpack://ue_platform_clicks_ui/./src/Components/TargetingManager/TargetValueForm.js","webpack://ue_platform_clicks_ui/./src/Components/ValueDeltaDisplay.js","webpack://ue_platform_clicks_ui/./src/Components/FaveHeart.tsx","webpack://ue_platform_clicks_ui/./src/Hooks/useApi.js","webpack://ue_platform_clicks_ui/./src/Hooks/useApiBatch.js","webpack://ue_platform_clicks_ui/./src/Hooks/useChartInterval.js","webpack://ue_platform_clicks_ui/./src/Hooks/useCollectionTracker.js","webpack://ue_platform_clicks_ui/./src/Hooks/useDidMount.js","webpack://ue_platform_clicks_ui/./src/Hooks/useImaskNiceAccept.js","webpack://ue_platform_clicks_ui/./src/Hooks/usePagedTableState.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/TreeUtil.js","webpack://ue_platform_clicks_ui/./src/Hooks/useRuleTree.js","webpack://ue_platform_clicks_ui/./src/Hooks/useTableGlobalFuzzyFilter.js","webpack://ue_platform_clicks_ui/./src/Hooks/useTimezoneDisplay.js","webpack://ue_platform_clicks_ui/./src/Hooks/useUniqueKeyArray.js","webpack://ue_platform_clicks_ui/./src/Layout/DocTitle.js","webpack://ue_platform_clicks_ui/./src/Layout/FaLibrary.js","webpack://ue_platform_clicks_ui/./src/Layout/LoaderDots.js","webpack://ue_platform_clicks_ui/./src/Layout/LoadingBar.js","webpack://ue_platform_clicks_ui/./src/Layout/NotAuthorized.js","webpack://ue_platform_clicks_ui/./src/Layout/NotFoundPage.js","webpack://ue_platform_clicks_ui/./src/Services/Authorizer.js","webpack://ue_platform_clicks_ui/./src/Services/CoreAPI.js","webpack://ue_platform_clicks_ui/./src/Services/PrivacyAPI.js","webpack://ue_platform_clicks_ui/./src/Services/AccountingAPI.js","webpack://ue_platform_clicks_ui/./src/Services/IntegrationsAPI.js","webpack://ue_platform_clicks_ui/./src/Services/ReportingAPI.js","webpack://ue_platform_clicks_ui/./src/Services/MatchingAPI.js","webpack://ue_platform_clicks_ui/./src/Providers/AppProvider.js","webpack://ue_platform_clicks_ui/./src/Providers/LiveFilteringProvider.js","webpack://ue_platform_clicks_ui/./src/Providers/RulesContext.js","webpack://ue_platform_clicks_ui/./src/Services/BaseAPI.js","webpack://ue_platform_clicks_ui/./src/Services/LocalStorageService.js","webpack://ue_platform_clicks_ui/./src/Hooks/useFavoriteOrder.ts","webpack://ue_platform_clicks_ui/./src/Hooks/useMatchPath.ts","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Order/index.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Order/OrderModal.tsx","webpack://ue_platform_clicks_ui/./src/Components/Icons/StatusDot.tsx","webpack://ue_platform_clicks_ui/./src/Components/AccountMegaMenu.tsx","webpack://ue_platform_clicks_ui/./src/Layout/ToolsMegaMenu.tsx","webpack://ue_platform_clicks_ui/./src/Layout/EnvironmentBadge.tsx","webpack://ue_platform_clicks_ui/./src/Layout/Header.js","webpack://ue_platform_clicks_ui/./src/Layout/Footer.js","webpack://ue_platform_clicks_ui/./src/App/VersionChecker.tsx","webpack://ue_platform_clicks_ui/./src/Layout/AuthLayout.js","webpack://ue_platform_clicks_ui/./src/Layout/EntryLayout.js","webpack://ue_platform_clicks_ui/./src/Layout/PublicLayout.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/Filters.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderLastSold.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/OrdersSubtable.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/AccountBalances.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/AccountNameCell.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/AccountsTable.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/AllAccounts.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/Favorites.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/OrderList/index.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/AccountTreePicker.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/AccountDetail.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/InlineConfirmDelete.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Goal.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/GoalPostingModal.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Goals.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/GoalTrackingUpload.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/TrackingResultModal.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/GoalTracking.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/ReturnTrackingUpload.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/ReturnTracking.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Accounting/EditCard.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/Amex.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/CardDefault.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/Diners.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/Discover.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/Jcb.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/Mastercard.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/Visa.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Card/CardIcon.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Accounting/CardService.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Accounting/Cards.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Accounting/TransfersInline.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Accounting/BalanceAndPlan.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Accounting/Funds.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Activity/types.ts","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Activity/rows.ts","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Activity/ActorLabel.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Activity/LegsTable.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Activity/Table.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Activity/query.ts","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Activity/index.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/Account/Settings.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/TreeSkeleton.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RuleTree.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/BidEdit.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/TreeRule.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Header.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Summary.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/ProxyBuyers.tsx","webpack://ue_platform_clicks_ui/./src/Hooks/useSimpleAnimation.js","webpack://ue_platform_clicks_ui/./src/Components/Form/JsonDisplay.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/ProxyBidding.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/SchedulableSettingInput.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Bidding.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Budgets.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/CallSettings.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Channels.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Prefill.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/SipConfig.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Destination.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Tracking.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Advanced.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Tag.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/Ads.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/NavTabs.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/ActionsPanel.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/SaleConfirmation.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/index.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RuleSkeleton.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/RulesConfig/CloneOrderModal.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/OrderInfoBar.tsx","webpack://ue_platform_clicks_ui/./src/App/Deliveries/List/RejectionCategorySelect.tsx","webpack://ue_platform_clicks_ui/./src/App/Deliveries/List/IntegrationRejectionList.tsx","webpack://ue_platform_clicks_ui/./src/App/Deliveries/DeliveryRejectStat.tsx","webpack://ue_platform_clicks_ui/./src/Hooks/useIntegrationNameLookup.ts","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/CapStats.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/OrderDashboard.tsx","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/RulesManager/index.js","webpack://ue_platform_clicks_ui/./src/App/AdvertiserManager/index.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Channel/ChannelSourceDetail.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Table.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Filters.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/List.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Show.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Edit.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Create.tsx","webpack://ue_platform_clicks_ui/./src/Components/JsonViewModal.tsx","webpack://ue_platform_clicks_ui/./src/Components/Table/SeedDataCell.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Table.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/Table.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/Filters.js","webpack://ue_platform_clicks_ui/./src/Hooks/useTableState.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/Vendors.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Filters.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/List.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Create.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Edit.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Show.js","webpack://ue_platform_clicks_ui/./src/Components/Rules/RoutingRuleIconTableCell.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Table.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Filters.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/Sources.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/List.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/PhoneNumbers/Table.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/PhoneNumbers/Filters.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/PhoneNumbers/PhoneNumber/index.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/PhoneNumbers/List.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/List.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/Edit.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/Create.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/Show.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SaleGroup/Table.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SaleGroup/index.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SaleGroup/Show.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SaleGroup/Edit.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SalesFlows/Table.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SalesFlows/index.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SalesFlows/Show.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SalesFlows/Edit.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/UeidTable.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/Ueids.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/ReturnIntegration.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/Edit.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/Create.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/Show.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/index.js","webpack://ue_platform_clicks_ui/./src/App/Reports/FilterSummary.js","webpack://ue_platform_clicks_ui/./src/App/Reports/LoadTimeWarning.js","webpack://ue_platform_clicks_ui/./src/App/Reports/ReportsFilter.js","webpack://ue_platform_clicks_ui/./src/App/Reports/constants.js","webpack://ue_platform_clicks_ui/./src/App/Reports/ReportHeader.js","webpack://ue_platform_clicks_ui/./src/Components/Icons/Delta.js","webpack://ue_platform_clicks_ui/./src/App/Reports/api.js","webpack://ue_platform_clicks_ui/./src/App/Reports/ViewControls.tsx","webpack://ue_platform_clicks_ui/./src/App/Reports/ComparisonViewControls.tsx","webpack://ue_platform_clicks_ui/./src/App/Reports/metricConstants.js","webpack://ue_platform_clicks_ui/./src/App/Reports/CategorizedMetricSelector.tsx","webpack://ue_platform_clicks_ui/./src/App/Reports/AggregateReport.js","webpack://ue_platform_clicks_ui/./src/App/Reports/AdvertiserReport.js","webpack://ue_platform_clicks_ui/./src/Components/Table/FilterSummary.js","webpack://ue_platform_clicks_ui/./src/App/Reports/ProspectFilters.js","webpack://ue_platform_clicks_ui/./src/App/Reports/returnEligibility.js","webpack://ue_platform_clicks_ui/./src/App/Reports/ReturnActionButton.tsx","webpack://ue_platform_clicks_ui/./src/App/Reports/ReturnStatusBadge.tsx","webpack://ue_platform_clicks_ui/./src/App/Reports/ProspectDetailModal.js","webpack://ue_platform_clicks_ui/./src/App/Reports/ColumnSelectChoices.js","webpack://ue_platform_clicks_ui/./src/App/Reports/CallColumnSelect.js","webpack://ue_platform_clicks_ui/./src/App/Reports/Calls.js","webpack://ue_platform_clicks_ui/./src/App/Reports/Leads.js","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/Page.js","webpack://ue_platform_clicks_ui/./src/App/Reports/Landing.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Matching/samples.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Matching/index.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Attributes/List/Table.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Attributes/List/Filters.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Attributes/Detail/OptionTarget.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Attributes/Detail/constants.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Attributes/Detail/Options.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Attributes/Detail/index.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Attributes/List/index.js","webpack://ue_platform_clicks_ui/./src/App/Tools/InputSchema/InputSchemaTable.tsx","webpack://ue_platform_clicks_ui/./src/App/Tools/InputSchema/InputSchemaForm.tsx","webpack://ue_platform_clicks_ui/./src/App/Tools/InputSchema/Filters.js","webpack://ue_platform_clicks_ui/./src/App/Tools/InputSchema/index.tsx","webpack://ue_platform_clicks_ui/./src/App/Tools/Integrations/index.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Rules/RuleSearchApi.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Rules/SearchByTarget/Filters.js","webpack://ue_platform_clicks_ui/./src/App/Tools/Rules/SearchByTarget/index.js","webpack://ue_platform_clicks_ui/./src/App/Tools/index.js","webpack://ue_platform_clicks_ui/./src/Layout/MainContent.js","webpack://ue_platform_clicks_ui/./src/App/TwoFactorVerify.tsx","webpack://ue_platform_clicks_ui/./src/App/TwoFactorEnroll.tsx","webpack://ue_platform_clicks_ui/./src/App/Login.js","webpack://ue_platform_clicks_ui/./src/App/ForgotPassword.js","webpack://ue_platform_clicks_ui/./src/App/ResetPassword.js","webpack://ue_platform_clicks_ui/./src/App/ActivateUser.js","webpack://ue_platform_clicks_ui/./src/App/Dashboard/Publishers/PostingInstructions/samples.js","webpack://ue_platform_clicks_ui/./src/App/Dashboard/Publishers/PostingInstructions/index.js","webpack://ue_platform_clicks_ui/./src/App/Public/PublisherPostDocs.js","webpack://ue_platform_clicks_ui/./src/App/App.js","webpack://ue_platform_clicks_ui/./src/Layout/ErrorBoundary.js","webpack://ue_platform_clicks_ui/./src/index.js","webpack://ue_platform_clicks_ui/./src/utils/Lazify.js","webpack://ue_platform_clicks_ui/./src/utils/math.js","webpack://ue_platform_clicks_ui/./src/utils/string.js","webpack://ue_platform_clicks_ui/./src/utils/types.js","webpack://ue_platform_clicks_ui/./src/App/AdManager/AdDisplay/index.tsx","webpack://ue_platform_clicks_ui/./src/App/Auctions/Details/RequestReturnModal.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Channel/ChannelSources.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/Form.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/Modal.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/RoutingApi.js","webpack://ue_platform_clicks_ui/./src/Components/Form/Select/ChannelOptionLabel.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/Filters.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/StatusBadge.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/SourceNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/EligibilityNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/InfoNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/LaneFilterNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/VendorNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/ChannelNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/SourceTokenNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/OrderNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/AlertNode.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/FlowHeaderNode.tsx","webpack://ue_platform_clicks_ui/./src/Components/WithProps.js","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/SourceTokenStep.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/SourceModal.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Sources/Source/LinkChannelSourceModal.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/SourceToken/SourceTokenModal.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Channels/Channel/ChannelModal.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/Select/SourceTokenOptionLabel.tsx","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/TokenOverflow.tsx","webpack://ue_platform_clicks_ui/./src/App/PublisherManager/Vendors/Vendor/Modal.js","webpack://ue_platform_clicks_ui/./src/App/Routing/Mapper/index.tsx","webpack://ue_platform_clicks_ui/./src/App/Tools/InputSchema/InputSchemaOptionLabel.tsx","webpack://ue_platform_clicks_ui/./src/App/Tools/InputSchema/InputSchemaViewModal.tsx","webpack://ue_platform_clicks_ui/./src/App/TwoFactorEnrollSteps.tsx","webpack://ue_platform_clicks_ui/./src/App/UserManager/User/PasswordRules.tsx","webpack://ue_platform_clicks_ui/./src/App/const.ts","webpack://ue_platform_clicks_ui/./src/Components/Chart/AggSelect.tsx","webpack://ue_platform_clicks_ui/./src/Components/Chart/StackedBarChart.tsx","webpack://ue_platform_clicks_ui/./src/Components/DataRow.tsx","webpack://ue_platform_clicks_ui/./src/Components/DataRows.tsx","webpack://ue_platform_clicks_ui/./src/Components/DownloadFileLink.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/DynamicSingleSelect.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/EnhancedSelect.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/OtpCodeInput.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/SeedDataBuilder.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/SeedDataDisplay.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/SeedDataValidation.ts","webpack://ue_platform_clicks_ui/./src/Components/Form/Select/DbaOptionLabel.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/Select/SourceOptionLabel.tsx","webpack://ue_platform_clicks_ui/./src/Components/Form/StatusToggler.tsx","webpack://ue_platform_clicks_ui/./src/Components/Rules/IntegrationSettings/IntegrationSettingsView.tsx","webpack://ue_platform_clicks_ui/./src/Components/Rules/IntegrationSettings/SettingsForm.tsx","webpack://ue_platform_clicks_ui/./src/Components/Rules/IntegrationSettings/IntegrationSettingsEditor.tsx","webpack://ue_platform_clicks_ui/./src/Components/Rules/IntegrationSettings/index.tsx","webpack://ue_platform_clicks_ui/./src/Components/Rules/IntegrationSettings/utils.ts","webpack://ue_platform_clicks_ui/./src/Components/Table/ApplyOrRefreshButton.tsx","webpack://ue_platform_clicks_ui/./src/Components/Table/ColumnSelect.tsx","webpack://ue_platform_clicks_ui/./src/Components/Table/EntityId.tsx","webpack://ue_platform_clicks_ui/./src/Hooks/useChangeTimeline.ts","webpack://ue_platform_clicks_ui/./src/Hooks/useFilters.ts","webpack://ue_platform_clicks_ui/./src/Hooks/useFormState.ts","webpack://ue_platform_clicks_ui/./src/Hooks/useLocalStorage.ts","webpack://ue_platform_clicks_ui/./src/Hooks/usePermission.ts","webpack://ue_platform_clicks_ui/./src/Hooks/useQueryState.ts","webpack://ue_platform_clicks_ui/./src/Hooks/useReturnReasons.ts","webpack://ue_platform_clicks_ui/./src/Hooks/useVerticals.ts","webpack://ue_platform_clicks_ui/./src/Layout/Breadcrumbs.tsx","webpack://ue_platform_clicks_ui/./src/Layout/Drawer.tsx","webpack://ue_platform_clicks_ui/./src/Layout/HideawayPanel.tsx","webpack://ue_platform_clicks_ui/./src/Layout/PageSection.tsx","webpack://ue_platform_clicks_ui/./src/Providers/ChangeProvider.tsx","webpack://ue_platform_clicks_ui/./src/utils/http.ts"],"sourcesContent":["import React, { useContext, useState, useEffect } from 'react';\nimport {\n  Row, Card, Col, FormGroup, Label, Input, FormText, Button, FormFeedback, CardBody,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\nimport copy from 'fast-copy';\nimport JSONPretty from 'react-json-prettify';\nimport { googlecode } from 'react-json-prettify/dist/themes';\nimport { useDebouncedCallback } from 'use-debounce';\nimport lazify from '../../../../utils/Lazify';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport IntegrationSettings from '../../../../Components/Rules/IntegrationSettings';\nimport { TargetGroupsDescription } from '../../../../Components/Rules/TargetDescription';\nimport usePermission from '../../../../Hooks/usePermission';\nimport {HelpPopper} from \"@thedmsgroup/mastodon-ui-components\";\nimport IconCheckbox from \"../../../../Components/Form/IconCheckbox\";\n\nconst LazyTargetingManager = lazify(() => import(/* webpackChunkName: \"TargetingManager\" */ '../../../../Components/TargetingManager'));\n\nconst timingChoices = {\n  matching: 'Pre-Matching', // BC naming\n  post_matching: 'Post-Matching',\n  suppression: 'Pre-Sale',\n}\n\n/*\n * Component for entering one lead \"enrichment\" aka sale condition (service, priority, settings, suppression conditions)\n */\nconst EnrichmentForm = (props) => {\n  const rulesContext = useContext(RulesContext);\n  const [willDelete, setWillDelete] = useState(false);\n  // Form modifies data in state, then rule will be updated on apply\n  const [tempData, setTempData] = useState(copy(props.addOn));\n  const allowEditIntegration = usePermission('integrations.edit');\n  const allowEditOrder = usePermission('orders.edit');\n\n  const getIntegrationLabel = (name) => {\n    const config = props.config.find((conf) => conf.name === name);\n    return config ? config.label : undefined;\n  };\n\n  // Reset form data state on close to current rule data\n  // (this will be the changed data after apply, or unchanged data after cancel)\n  useEffect(()=>{\n    if (!props.editMode) {\n      setTempData(copy(props.addOn))\n    }\n  }, [props.editMode])\n\n\n  const handleApply = () => props.onApply(tempData);\n\n\n  const handleCancel = () => {\n    if (props.isNew) {\n      props.onDelete(props.index);\n    }\n    props.onEditMode(-1);\n  };\n\n  const priorities = props.addOnCount > 1 ? [...Array(props.addOnCount)].map((item, index) => index + 1) : null;\n\n  const handleChangeIntegration = (integration) => {\n    setTempData({ ...tempData, integration })\n  };\n\n  const handleChangePriority = (e) => setTempData({ ...tempData, priority: e.target.value });\n\n  const handleChangeTiming = (e) => setTempData({ ...tempData, timing: e.target.value });\n\n  const handleChangeNotify = (name, val) => setTempData({ ...tempData, notify: val });\n\n  const handleChangeConditions = (conditions) => setTempData({ ...tempData, suppression_conditions: conditions });\n\n  const handleChangeVendorAttributes = useDebouncedCallback((attr) => {\n    setTempData({ ...tempData, vendor_attributes: attr })\n  }, 400);\n\n  const hasErrors = Object.keys(props.errors).length > 0;\n\n  return (\n    <Card className={classnames('form-section', 'sales-condition', 'mb-3', { odd: props.index > 0 && props.index % 2 > 0 })} id={`sales-condition-${props.index.toString()}`}>\n      <div className=\"form-section-header d-flex justify-content-between align-items-center\">\n        <div>\n          { getIntegrationLabel(props.addOn.integration.name) || (\n            <span>\n            Enrichment {props.addOnCount > 1 && <span>{props.index + 1}</span>}\n          </span>\n          )}\n        </div>\n\n\n        <div className=\"actions\">\n          {willDelete === true && (\n            <div className=\"delete-prompt\">\n              <i>Remove this integration?</i>\n              <Button color=\"success\" size=\"xs\" onClick={() => { props.onDelete(props.index); }} className=\"ms-2 me-2\">yes</Button>\n              <Button color=\"danger\" size=\"xs\" onClick={() => { setWillDelete(false); }}>no</Button>\n            </div>\n          )}\n\n          {props.isNew === false\n            && willDelete === false\n            && props.editMode === false\n            && allowEditIntegration\n            && (\n              <>\n                <Button\n                  color=\"link\"\n                  className=\"btn-edit inline\"\n                  size=\"sm\"\n                  onClick={() => props.onEditMode(props.index)}\n                  title=\"Edit\"\n                >\n                  <FaIcon icon=\"edit\" size=\"1x\" />\n                </Button>\n                <Button\n                  color=\"link\"\n                  className=\"btn-trash\"\n                  size=\"sm\"\n                  onClick={() => { setWillDelete(true); }}\n                  title=\"Remove\"\n                >\n                  <FaIcon icon=\"trash\" size=\"1x\" />\n                </Button>\n              </>\n          )}\n\n          {props.editMode  && (\n            <Button\n              color=\"link\"\n              className=\"btn-edit\"\n              size=\"sm\"\n              onClick={handleCancel}\n              title=\"Cancel\"\n            >\n              <FaIcon icon=\"times\" size=\"sm\" /> Cancel\n            </Button>\n          )}\n        </div>\n\n      </div>\n\n      <CardBody>\n        {hasErrors === true && (\n          <StandardAlert color=\"info\" className=\"validation\">\n            <div>This item has missing or invalid values</div>\n          </StandardAlert>\n        ) }\n        <div className=\"detail-table\">\n          <div className=\"detail-rows\">\n            <Row className=\"detail-row\">\n              <Label sm={2}>Timing <TypeHelp /></Label>\n              {/* <div className=\"description\">\n                &nbsp;\n              </div> */}\n              <Col sm={10} className=\"value\">\n                {props.editMode ? (\n                  <FormGroup>\n                    <Input\n                      type=\"select\"\n                      name=\"timing\"\n                      value={tempData.timing}\n                      onChange={handleChangeTiming}\n                      invalid={!!props.errors.timing}\n                    >\n                      {Object.keys(timingChoices).map(key => <option value={key}>{timingChoices[key]}</option>)}\n                    </Input>\n                    <FormFeedback>{props.errors.integration}</FormFeedback>\n\n                  </FormGroup>\n                ) : (\n                  <span>{timingChoices[props.addOn.timing] || '-invalid-'}</span>\n                )}\n              </Col>\n            </Row>\n\n            <Row className=\"detail-row\">\n              <Label sm={2}>Priority</Label>\n\n              <Col sm={10} className=\"value\">\n                {props.editMode ? (\n                  <>\n                    {props.addOnCount > 1 ? (\n                      <Input type=\"select\" name=\"priority\" value={tempData.priority} onChange={handleChangePriority}>\n                        {priorities.map((val, i) => <option key={i} value={val}>{val}</option>)}\n                      </Input>\n                    ) : (\n                      <span>1</span>\n                    )}\n                  </>\n                ) : (\n                  <span>{props.addOn.priority}</span>\n                )}\n              </Col>\n            </Row>\n\n            {/* MST-979 if user has no permission to edit integrations: hide if none exist, show read-only if integration exists */}\n\n            <Row className=\"detail-row\">\n              <Label sm={2}>Integration</Label>\n              <Col sm={10} className=\"mt-2\">\n\n                <div className=\"value\">\n                  <IntegrationSettings\n                    type=\"enrichment\"\n                    definitions={props.config}\n                    config={tempData.integration}\n                    allowControls={false}\n                    isMulti={false}\n                    editMode={props.editMode && allowEditIntegration}\n                    allowEdit={allowEditOrder}\n                    errors={props.errors}\n                    onUpdate={handleChangeIntegration}\n                    onDelete={() => {}}\n                    index={0}\n                  />\n                </div>\n\n              </Col>\n            </Row>\n\n            <Row className=\"detail-row\">\n              <Label sm={2}>Suppression Conditions <HelpPopper\n                name=\"conditions-type-help\"\n                iconClass=\"ms-1\"\n              >\n                <p>\n                  If condition evaluates to true, the match is suppressed.\n                </p>\n              </HelpPopper></Label>\n\n              {/* TODO: notice when no conditions exist yet. Put here or in summary component? */}\n              <Col sm={10} className=\"value\">\n                {props.editMode ? (\n\n                  <LazyTargetingManager\n                    conditions={Array.isArray(tempData.suppression_conditions) ? tempData.suppression_conditions : []}\n                    onUpdate={(c) => { handleChangeConditions(c); }}\n                    attributes={rulesContext.attributes}\n                    attributeGroups={rulesContext.attributeGroups}\n                    errors={props.errors ? props.errors.suppression_conditions : null}\n                  />\n\n                ) : (\n                  <div className=\"target-summary mt-2\">\n                    <TargetGroupsDescription\n                      attributes={rulesContext.attributes}\n                      groups={Array.isArray(tempData.suppression_conditions) ? tempData.suppression_conditions : []}\n                      limit={24}\n                    />\n                  </div>\n                )}\n              </Col>\n            </Row>\n\n            <Row className=\"detail-row\">\n              <Label sm={2}>Vendor Attributes</Label>\n\n              <Col sm={10} className=\"value\">\n                {props.editMode  ? (\n                  <FormGroup className=\" flex-fill mt-2\">\n                    <Input\n                      type=\"textarea\"\n                      rows={2}\n                      defaultValue={tempData.vendor_attributes || ''}\n                      name=\"vendor_attributes\"\n                      onChange={(e) => { handleChangeVendorAttributes(e.target.value); }}\n                      invalid={!!props.errors?.vendor_attributes}\n                    />\n                    <FormText>Enter a valid JSON expression</FormText>\n\n                  </FormGroup>\n                ) : (\n                  <div className=\"d-inline-block mt-1 json-pretty\">\n                    {props.addOn.vendor_attributes ? (\n                      <JSONPretty json={typeof props.addOn.vendor_attributes === 'string' ? JSON.parse(props.addOn.vendor_attributes) : props.addOn.vendor_attributes} theme={googlecode} />\n                    ) : <i>none</i>}\n                  </div>\n                )}\n              </Col>\n            </Row>\n\n            <Row className=\"detail-row\">\n              <Label sm={2}>Notify Only</Label>\n\n              <Col sm={10} className=\"value\">\n                {props.editMode  ? (\n                  <FormGroup className=\" flex-fill mt-2\">\n                    <IconCheckbox\n                      name=\"notify\"\n                      value={Boolean(tempData.notify)}\n                      onChange={handleChangeNotify}\n                    >\n                      Notify Only\n                    </IconCheckbox>\n                    <FormText>By checking this box, we will not wait for this integration to return data.</FormText>\n                  </FormGroup>\n                ) : (\n                  <div className=\"d-inline-block mt-1 json-pretty\">\n                    {props.addOn.notify ? \"Yes\" : \"No\"}\n                  </div>\n                )}\n              </Col>\n            </Row>\n\n          </div>\n        </div>\n\n        {props.editMode && (\n          <div className=\"text-end mt-2\">\n            {props.isNew === true ? (\n              <>\n                <Button size=\"sm\" color=\"link\" className=\"me-2\" onClick={handleCancel} >Cancel</Button>\n                <Button size=\"sm\" onClick={handleApply}>Add</Button>\n\n              </>\n            ) : (\n              <>\n                <Button size=\"sm\" color=\"link\" className=\"me-2\" onClick={handleCancel} outline>Cancel</Button>\n                <Button size=\"sm\" onClick={handleApply}>Apply</Button>\n              </>\n            )}\n          </div>\n        )}\n\n      </CardBody>\n    </Card>\n  );\n};\n\nconst TypeHelp = () =>\n  <HelpPopper\n    name=\"enrichment-type-help\"\n    iconClass=\"ms-1\"\n  >\n    <p>\n      <b>Pre-Matching</b> executes early during matching, BEFORE the match conditions are evaluated. This allows you to\n      obtain data you want to use in matching decisions. You probably don't have PII available at this stage.\n    </p>\n    <p>\n      <b>Post-Matching</b> executes AFTER the match conditions are evaluated and resulted in a match. Same as with Pre-Matching, you probably don't have PII available at this stage.\n    </p>\n    <p>\n      <b>Pre-Sale</b> executes before selling. You have PII available at this stage.\n    </p>\n  </HelpPopper>\n\n\nEnrichmentForm.propTypes = {\n  addOn: PropTypes.object,\n  addOnCount: PropTypes.number,\n  allowControls: PropTypes.bool,\n  config: PropTypes.oneOfType([PropTypes.object, PropTypes.array]).isRequired, // configuration for all available integrations\n  editMode: PropTypes.bool,\n  onEditMode: PropTypes.func,\n  errors: PropTypes.object,\n  index: PropTypes.number,\n  isNew: PropTypes.bool,\n  onApply: PropTypes.func.isRequired,\n  onDelete: PropTypes.func.isRequired,\n};\n\nEnrichmentForm.defaultProps = {\n  addOn: {},\n  addOnCount: 0,\n  config: [],\n  editMode: false,\n  errors: {},\n  index: 0,\n  isNew: false,\n};\n\nexport default EnrichmentForm;\n","import React, {useState, useContext, useEffect} from 'react';\nimport { Button } from 'reactstrap';\nimport copy from 'fast-copy';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport EnrichmentForm from './EnrichmentForm';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport usePermission from '../../../../Hooks/usePermission';\n\n/*\n * Component for entering one or more lead \"enrichments\" with conditions that affect matching/sales.\n * (In database, enrichment_addons)\n */\n\nconst NewEnrichment = {\n  priority: 0,\n  timing: 'matching',\n  suppression_conditions: [],\n  integration: { name: '', settings: {} },\n};\n\nconst Enrichments = ({ addOns = [], onChange, errors = {}, loadIntegrations }) => {\n  const allowEditIntegration = usePermission('integrations.edit');\n  const [intConfig, setIntConfig] = useState([]);\n  const [editIndex, setEditIndex] = useState(-1);\n  const [addIndex, setAddIndex] = useState(-1);\n  const [refreshKey, setRefreshKey] = useState(100);\n\n  const _loadIntegrations = async () => {\n    const ints = await loadIntegrations()\n    if (ints) {\n      setIntConfig(ints)\n    }\n  }\n\n  useEffect(() => {\n    _loadIntegrations()\n  }, [])\n\n  const handleApply = (newData) => {\n    if (newData) {\n      let temp = copy(addOns);//\n      if (editIndex >= 0 && addOns[editIndex]) {\n\n        temp[editIndex] = newData;\n        if (newData.priority !== addOns[editIndex].priority) {\n           temp = changePriority(temp, newData.priority, editIndex)\n        }\n\n        onChange(temp);\n      }\n    }\n    setRefreshKey(refreshKey + 1);\n    setAddIndex(-1);\n    setEditIndex(-1);\n\n  }\n\n\n  const handleCreate = () => {\n    const sc = copy(NewEnrichment);\n    sc.priority = addOns.length + 1;\n    onChange([...addOns, sc]);\n    setAddIndex(addOns.length)\n    setEditIndex(addOns.length)\n  };\n\n\n  const changePriority = (addOns, newPriority, index) => {\n    let temp = [...addOns];\n    // Get item at index, move into new slot\n    const removed = temp.splice(index, 1);\n    if (removed.length) {\n      temp.splice(newPriority - 1, 0, removed[0]);\n    }\n\n    temp = resetPriorities(temp);\n\n    return temp;\n  };\n\n  const resetPriorities = (addOns) => {\n    const temp = [...addOns];\n    temp.forEach((addOn, i) => {\n      addOn.priority = i + 1;\n    });\n    return temp;\n  }\n\n  const handleDelete = (index) => {\n    let temp = [...addOns];\n    temp.splice(index, 1);\n    temp = resetPriorities(temp);\n    onChange([...temp]);\n    setAddIndex(-1)\n    setEditIndex(-1)\n    setRefreshKey(refreshKey + 1);\n  };\n\n\n\n  return (\n    <div>\n      { Object.keys(errors).length > 0 && (\n        <StandardAlert color=\"info\" className=\"validation\">\n          Please correct the errors below before continuing\n        </StandardAlert>\n      )}\n\n      <p>Enrichment integrations connect to third party systems to send or fetch data during the matching/sales process.</p>\n\n\n      { addOns.length === 0 && (\n        allowEditIntegration ? (\n          <StandardAlert color=\"light\">\n            No enrichments configured.{' '}\n            <Button color=\"link\" className=\"inline\" onClick={handleCreate}>\n              <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />\n              Add Enrichment Integration\n            </Button>\n          </StandardAlert>\n        ) : (\n          <StandardAlert color=\"light\" icon=\"info\">No enrichments are configured.</StandardAlert>\n        )\n      )}\n\n      <div key={refreshKey}>\n        {addOns.map((addOn, i) => (\n          <EnrichmentForm\n            key={i}\n            addOn={addOn}\n            addOnCount={addOns.length}\n            config={intConfig}\n            index={i}\n            editMode={editIndex === i && allowEditIntegration}\n            isNew={addIndex === i}\n            errors={errors[i]}\n            onDelete={handleDelete}\n            onApply={handleApply}\n            onEditMode={setEditIndex}\n          />\n        ))}\n        {addOns.length > 0 && allowEditIntegration && (\n        <div className=\"text-end\">\n          <Button color=\"link\" onClick={handleCreate} disabled={editIndex >= 0 || addIndex >= 0}>\n            <FaIcon icon=\"plus\" className=\"me-1\" />\n            Add Enrichment Integration\n          </Button>\n        </div>\n        )}\n      </div>\n\n    </div>\n  );\n};\n\nEnrichments.propTypes = {\n  addOns: PropTypes.array.isRequired,\n  onChange: PropTypes.func.isRequired,\n  errors: PropTypes.object,\n  loadIntegrations: PropTypes.func,\n};\n\nexport default Enrichments;\n","// For now we only set bid modifiers by the hour interval, not less\nexport const BiddingScheduleConfig = {\n  defaultValue: 100,\n  max: 200,\n  labelInterval: 20,\n  lineInterval: 10,\n  allowHourParting: true,\n  showBaseline: true,\n  valueSuffix: '%',\n  dragStep: 1,\n};\n\nexport const CapScheduleConfig = {\n  defaultValue: null,\n  max: 300,\n  valueSuffix: \"\",\n  labelInterval: 25,\n  lineInterval: 25,\n  showBaseline: false,\n  dragStep: 1,\n  allowOpenValue: true,\n  allowHourParting: true,\n};\n","import React, {useState} from 'react';\nimport {\n  Modal as BootstrapModal, ModalBody, ModalHeader,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Link } from 'react-router-dom';\nimport Auction, {permaLink} from './index';\nimport {CopyButton} from \"@thedmsgroup/mastodon-ui-components\";\nimport qs from 'query-string';\n\n/*\n * Modal for auction detail view, wraps Auction Detail\n */\nconst Modal = ({ auctionId, isOpen, cancel, timezone='UTC', defaultTab }) => {\n  //Permalink may be updated with some query string parameters based on selections within the auction detail, eg delivery ID\n  const permalinkBase = permaLink(auctionId)\n  const [permalink, setPermalink] = useState(permalinkBase)\n\n  const handleChangeFilters = (filters) => {\n    setPermalink(permalinkBase + (filters ? '?' + qs.stringify(filters) : ''));\n    // qs gets confused about our hash\n    //setPermalink(qs.stringifyUrl({url:permalinkBase, query:filters}));\n  }\n\n  return (\n    <BootstrapModal isOpen={isOpen} toggle={cancel} size=\"xlg\" className=\"auction-detail\" unmountOnClose={true}>\n      <ModalHeader toggle={cancel}>\n        Auction Detail: {auctionId}\n      </ModalHeader>\n\n\n      <div className=\"ms-3\">\n        <Link target=\"_blank\" to={permalink} className=\"link auction-detail-link p-0\">\n          <FaIcon icon=\"external-link-alt\" size=\"sm\" />\n          {' '}\n          Permalink\n        </Link>\n\n        <CopyButton\n          id=\"copy-permalink\"\n          textToCopy={permalink}\n          buttonSize=\"sm\"\n        >\n          <FaIcon icon=\"copy\" size=\"sm\" />\n        </CopyButton>\n      </div>\n\n      <ModalBody>\n\n        <Auction\n          auction_id={auctionId}\n          timezone={timezone}\n          defaultTab={defaultTab}\n          onChangeFilters={handleChangeFilters}\n          useQueryString={false}\n        />\n\n      </ModalBody>\n    </BootstrapModal>\n  );\n};\n\nModal.propTypes = {\n  auctionId: PropTypes.string,\n  isOpen: PropTypes.bool,\n  loading: PropTypes.bool,\n  cancel: PropTypes.func,\n  timezone: PropTypes.string,\n  defaultTab: PropTypes.string,\n};\n\nModal.defaultProps = {\n\n};\n\nexport default Modal;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {Badge} from \"reactstrap\";\nimport { tokenToWords } from '../../../utils/string';\nimport {JsonDisplay} from '@thedmsgroup/mastodon-ui-components';\nimport {DataRows, DataRow} from \"../../../Components\";\n\n/* Block reason and details */\nconst Block = React.memo(({ reason='', details={}, indentClass=\"\", compact }) =>\n  // Reason (str) Details(object with various keys)\n  (\n    <div className=\"block d-flex flex-column\">\n      {/*<div className={`reason ${indentClass} mb-2`}><span>{tokenToWords(reason)}</span></div>*/}\n      <Badge className=\"mb-2\" size=\"sm\" color=\"danger\">{tokenToWords(reason)}</Badge>\n\n        {details && Object.keys(details).length > 0 ? (\n          <DataRows\n            className={indentClass}\n            labelWidth={compact ? '100px' : '125px'}\n            fieldStyle={compact}\n            noDivider\n          >\n            {\n              Object.entries(details).map(([dtKey, val], i) => (\n                <DataRow label={tokenToWords(dtKey)} key={i}>\n                  <div>{typeof val === 'object' ? <JsonDisplay data={val} scrollable={false} /> : val}</div>\n                </DataRow>\n              ))\n            }\n          </DataRows>\n        ) : (\n          <i>No details</i>\n        ) }\n\n    </div>\n\n  ));\n\n\nBlock.propTypes = {\n  reason: PropTypes.string,\n  details: PropTypes.object,\n  compact: PropTypes.bool\n};\n\nexport default Block;\n\n/*\nExample\n\"Blocks\":[\n            {\n               \"Reason\":\"proxy_rejected\",\n               \"Details\":{\n                  \"delivery_id\":154624270,\n                  \"disposition\":\"\",\n                  \"integration_name\":\"alm_pingpost_auto_calls\",\n                  \"reject_category\":\"duplicate\",\n                  \"reject_details\":\"Duplicate lead found.\",\n                  \"suppression\":{\n                     \"Name\":\"alm_pingpost_auto_calls\",\n                     \"Post\":false,\n                     \"Settings\":{\n                        \"api_key\":\"96087e6d2f3638a0e6e9292d14d376d37bfde9a1\",\n                        \"passthrough_external_id\":\"vendor_external\"\n                     }\n                  }\n               }\n            }\n         ],\n */\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { Badge } from 'reactstrap';\nimport classnames from 'classnames';\nimport { HelpPopper } from '@thedmsgroup/mastodon-ui-components';\nimport { MoneyFormatter, PercentFormatter } from '../../../Components/Table/Table';\nimport EntityId from '../../../Components/Table/EntityId';\nimport usePermission from '../../../Hooks/usePermission';\nimport type { FundingContribution } from '../../../types';\n\n// promotion id -> name, resolved once per auction load from GET /promotions/options\nexport type PromotionNames = Record<number, string>;\n\nexport const isHouse = (leg: FundingContribution) => leg.funded_by === 'house';\nexport const isBuyerPool = (leg: FundingContribution) => leg.pool === 'buyer';\n\nexport const sumLegs = (legs: FundingContribution[]) =>\n  legs.reduce((total, leg) => total + (Number(leg.amount) || 0), 0);\n\nconst round = (n: number) => Math.round(n * 100) / 100;\n\ntype FundingBreakdownProps = {\n  legs: FundingContribution[];\n  // true for a bid's legs (booked against the sponsor), false for a match's\n  // legs (resolved at match time, never funded because the bid didn't sell)\n  funded: boolean;\n  gross?: number;\n  transactionId?: number;\n  // the sale was reverted, so say what the reversal did with each leg\n  reverted?: boolean;\n  promotionNames?: PromotionNames;\n};\n\n// How the engine sized the leg, from the pricing inputs it froze on the document.\nconst Sizing = ({ leg }: { leg: FundingContribution }) => {\n  const cost = (leg.reprice_cost || 0) > 0\n    ? <> of <MoneyFormatter value={leg.reprice_cost} /></>\n    : null;\n  switch (leg.reprice_calc) {\n    case 'percent':\n      return <><PercentFormatter value={leg.reprice_percent} />{cost}</>;\n    case 'percent_capped':\n      return (\n        <>\n          <PercentFormatter value={leg.reprice_percent} />{cost}\n          {(leg.reprice_cap || 0) > 0 ? <>, cap <MoneyFormatter value={leg.reprice_cap} /></> : ', capped'}\n        </>\n      );\n    case 'flat':\n      return <>flat</>;\n    case 'full':\n      return <>full cost</>;\n    default:\n      return null;\n  }\n};\n\n// Which sponsor wallet accounting debited. Only bid legs carry this, and both\n// amounts absent means accounting reported nothing, not that it was all cash.\nconst walletLabel = (leg: FundingContribution): React.ReactNode => {\n  const credit = Number(leg.credit_amount) || 0;\n  const cash = Number(leg.cash_amount) || 0;\n  if (credit && cash) {\n    return <>Credit <MoneyFormatter value={credit} /> + Cash <MoneyFormatter value={cash} /></>;\n  }\n  if (credit) return 'Credit';\n  if (cash) return 'Cash';\n  return null;\n};\n\nconst LegName = ({ leg, promotionNames, canLink }: {\n  leg: FundingContribution;\n  promotionNames?: PromotionNames;\n  canLink: boolean;\n}) => {\n  const id = leg.source_id;\n  // a leg from some other engine than promotions: nothing to link to\n  if (leg.source && leg.source !== 'promotion') {\n    return <>{leg.source}{id ? ` #${id}` : ''}</>;\n  }\n  const name = id ? promotionNames?.[id] : undefined;\n  const label = name || (id ? `Promotion #${id}` : 'Promotion');\n  const linked = canLink && id\n    ? (\n      <Link\n        target=\"_blank\"\n        className=\"link\"\n        to={`/tools/promotions/${id}`}\n        title=\"View promotion\"\n      >\n        {label}\n      </Link>\n    )\n    : <span>{label}</span>;\n  // the fallback label already carries the id, so don't print it twice\n  return <>{linked}{name && id ? <> <EntityId id={id} title=\"Promotion ID\" /></> : null}</>;\n};\n\nconst LegRow = ({ leg, index, reverted, promotionNames, canLink }: {\n  leg: FundingContribution;\n  index: number;\n  reverted: boolean;\n  promotionNames?: PromotionNames;\n  canLink: boolean;\n}) => {\n  const sizing = Sizing({ leg });\n  const wallet = walletLabel(leg);\n  return (\n    <div className=\"fb-row fb-leg\" data-testid={`funding-leg-${index}`}>\n      <div className=\"fb-name flex-grow-1\">\n        <div><LegName leg={leg} promotionNames={promotionNames} canLink={canLink} /></div>\n        <div className=\"fb-meta text-muted\">\n          {sizing && <span className=\"me-2\">{sizing}</span>}\n          <Badge color=\"light\" className=\"text-dark me-1\">{isHouse(leg) ? 'House' : 'Sponsor'}</Badge>\n          {isBuyerPool(leg) && <Badge color=\"light\" className=\"text-dark me-1\">Buyer credit</Badge>}\n          {leg.auto_funded && <Badge color=\"light\" className=\"text-dark me-1\">Auto-funded</Badge>}\n          {leg.refundable\n            ? <Badge color=\"light\" className=\"text-muted me-1\">Refundable</Badge>\n            : <Badge color=\"warning\" className=\"text-dark me-1\">Non-refundable</Badge>}\n          {wallet && <Badge color=\"light\" className=\"text-dark me-1\">{wallet}</Badge>}\n          {reverted && (\n            <span className=\"fb-reverted\">\n              {leg.refundable ? 'returned on reversal' : 'kept by sponsor on reversal'}\n            </span>\n          )}\n        </div>\n      </div>\n      <div className=\"fb-amount text-end\">&minus;<MoneyFormatter value={leg.amount} /></div>\n    </div>\n  );\n};\n\n/*\n * Who paid for a bid besides the buyer: one row per promotion leg off the auction\n * document's funding_contributions, with the gross bid above and the buyer's net below.\n */\nconst FundingBreakdown = ({\n  legs,\n  funded,\n  gross,\n  transactionId,\n  reverted = false,\n  promotionNames,\n}: FundingBreakdownProps) => {\n  const canLink = usePermission('promotions.view');\n  if (!legs || legs.length === 0) return null;\n\n  const total = sumLegs(legs);\n  const grossAmount = Number(gross) || 0;\n  const buyerPays = round(Math.max(0, grossAmount - total));\n  const hasBuyerPool = legs.some(isBuyerPool);\n\n  return (\n    <div className={classnames('funding-breakdown', { 'resolved-only': !funded })}>\n      {/* The DataRow label already says \"Promotions\"; only a leg count is worth a header */}\n      {legs.length > 1 && (\n        <div className=\"fb-header mb-1\">\n          <Badge color=\"light\" className=\"text-dark\">{legs.length} legs</Badge>\n        </div>\n      )}\n\n      {grossAmount > 0 && (\n        <div className=\"fb-row\">\n          <div>Gross bid</div>\n          <div className=\"fb-amount\"><MoneyFormatter value={grossAmount} /></div>\n        </div>\n      )}\n\n      {legs.map((leg, i) => (\n        <LegRow\n          key={`${leg.funding_account_id}-${i}`}\n          leg={leg}\n          index={i}\n          reverted={reverted}\n          promotionNames={promotionNames}\n          canLink={canLink}\n        />\n      ))}\n\n      {funded && grossAmount > 0 && (\n        <div className=\"fb-row fb-total\">\n          <div>\n            Buyer pays\n            {hasBuyerPool && (\n              <HelpPopper name=\"promo-buyer-pays\" iconClass=\"ms-1\">\n                Buyer-credit legs draw on the buyer&apos;s own promotional credit, not a\n                promotion pool. This row is what the buyer&apos;s cash wallet covers.\n              </HelpPopper>\n            )}\n            {reverted && <span className=\"fb-reverted ms-2\">returned on reversal</span>}\n          </div>\n          {/* MoneyFormatter prints a bare 0 for zero; a fully subsidized buyer should read as money */}\n          <div className=\"fb-amount\">{buyerPays > 0 ? <MoneyFormatter value={buyerPays} /> : '$0.00'}</div>\n        </div>\n      )}\n\n      {funded && transactionId ? (\n        <div className=\"fb-row fb-txn text-muted\">\n          <div>Ledger txn</div>\n          <div className=\"fb-amount\">{transactionId}</div>\n        </div>\n      ) : null}\n\n      {/* The dashed panel already says \"not booked\"; the why lives behind the icon */}\n      {!funded && (\n        <span className=\"fb-help text-muted\">\n          <HelpPopper name=\"promo-resolved-not-funded\">\n            Resolved at match time, not funded. Matching sized these promotion legs when the\n            match was made, but they are only booked against a sponsor when the bid sells. A\n            match that lost, was blocked, or offered no bid keeps its legs without funding them,\n            and the amounts may differ from a final price.\n          </HelpPopper>\n        </span>\n      )}\n    </div>\n  );\n};\n\nexport default FundingBreakdown;\n","import React, {useState} from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Button } from 'reactstrap';\nimport Block from './Block';\nimport FundingBreakdown from './FundingBreakdown';\nimport RequestReturnModal from './RequestReturnModal';\nimport {DataRows, DataRow} from \"../../../Components\";\nimport { MoneyFormatter } from '../../../Components/Table/Table';\nimport usePermission from '../../../Hooks/usePermission';\nimport {useReturnReasons} from '../../../Hooks/useReturnReasons';\nimport {ReturnStatusLabels} from '../constants';\nimport {\n  HelpPopper,\n  RelativeTime,\n  UrlDisplayWidget,\n  ExpandableSection,\n  Stack\n} from '@thedmsgroup/mastodon-ui-components';\n\n/*\n * Auction bid detail\n */\nconst Bid = (bid) => {\n  const {\n    position,\n    transaction_id,\n    account_bid,\n    vendor_bid,\n    vendor_payout,\n    adjusted_account_bid,\n    blocks,\n    sale,\n    sale_attempt,\n    accountId,\n    product,\n    onReturnRequested,\n    funding_contributions,\n    promotionNames,\n  } = bid\n  const legs = funding_contributions || [];\n  const [showReturnModal, setShowReturnModal] = useState(false);\n  const canRequestReturn = usePermission('returns.create');\n  const {getLabel: getReasonLabel} = useReturnReasons();\n  const latestReturn = sale?.return_history?.length\n    ? sale.return_history[sale.return_history.length - 1]\n    : null;\n  const requestedReturn = sale?.return_history?.find((entry) => entry.status === 'requested');\n\n  const handleRequested = () => {\n    setShowReturnModal(false);\n    onReturnRequested && onReturnRequested();\n  };\n\n  return <div className=\"bid\">\n    <div className=\"form-section-header mb-2 fs-5\">\n      {sale ? (\n        <span>\n          <FaIcon icon=\"star\" color=\"gold\"/>\n          {' '}\n          Bid Sold {sale.reverted_at && '(Reverted)'}\n        </span>\n      ) : <span><FaIcon icon=\"hand-holding-usd\"/> Bid Offered</span>}\n    </div>\n\n\n  <DataRows labelWidth=\"100px\" gap=\"0.25em\" >\n    <DataRow label=\"Position\" >\n      {position}\n    </DataRow>\n    <DataRow label=\"Sale Attempt\" >\n      {sale_attempt}\n    </DataRow>\n    <DataRow label=\"Account Bid\">\n      <div>\n        {account_bid ? <MoneyFormatter value={account_bid}/> : <i>none</i>}\n        {adjusted_account_bid > 0 && adjusted_account_bid !== account_bid && <>\n          {' '}<FaIcon icon=\"arrow-right\"/> <MoneyFormatter value={adjusted_account_bid}/>\n          <HelpPopper name=\"what-is-this\" iconClass=\"ms-2\">The buyer has adjusted their bid on the sale</HelpPopper>\n        </>}\n      </div>\n    </DataRow>\n\n    {/* Promotion legs that funded this bid; the ledger txn moves in here when they exist */}\n    {legs.length > 0 && (\n      <DataRow label=\"Promotions\" fieldStyle>\n        <FundingBreakdown\n          legs={legs}\n          funded\n          gross={adjusted_account_bid > 0 ? adjusted_account_bid : account_bid}\n          transactionId={transaction_id}\n          reverted={!!sale?.reverted_at}\n          promotionNames={promotionNames}\n        />\n      </DataRow>\n    )}\n\n    <DataRow label=\"Vendor Bid\">\n      {vendor_bid ? <MoneyFormatter value={vendor_bid}/> : <i>none</i>}\n    </DataRow>\n    <DataRow label=\"Vendor Payout\">\n      {vendor_payout ? <MoneyFormatter value={vendor_payout}/> : <i>none</i>}\n    </DataRow>\n\n    {transaction_id && legs.length === 0 && <DataRow label=\"Transaction ID\">\n      <span>{transaction_id}</span>\n    </DataRow>}\n\n    <DataRow label=\"Blocks\" fieldStyle>\n\n        {blocks && blocks.length > 0 ? (\n          <Stack gap=\"0.5em\" className=\"ms-3\">\n            {blocks.map((b, i) => <Block {...b} compact key={i}/>)}\n          </Stack>\n        ) : (\n          \"-\"\n        )}\n\n\n    </DataRow>\n\n    {sale && (\n      <DataRow label=\"Sale\" fieldStyle>\n        <DataRows className=\"sale ms-3\" fieldStyle>\n\n            <DataRow label=\"Sale ID\">\n              {sale.sale_id}\n            </DataRow>\n            {sale.redirect_url && <DataRow label=\"Redirect URL\">\n              <div>\n                <ExpandableSection>\n                  <UrlDisplayWidget title=\"Redirect URL\" url={sale.redirect_url}/>\n                </ExpandableSection>\n              </div>\n            </DataRow>}\n\n            <DataRow label=\"When\">\n              <RelativeTime date={sale.sold_at}/>\n            </DataRow>\n\n            {sale.reverted_at && <DataRow label=\"Reverted\">\n              <div><RelativeTime date={sale.reverted_at}/> by user: {sale.reverted_by_name || sale.reverted_by} because: {sale.revert_reason}</div>\n            </DataRow>}\n\n            <DataRow label=\"Return\">\n              {sale.return_status ? (\n                <div>\n                  <FaIcon icon=\"exclamation-triangle\" className=\"me-1\" />\n                  {ReturnStatusLabels[sale.return_status] || sale.return_status}\n                  {requestedReturn && (\n                    <div className=\"text-muted\">\n                      Requested <RelativeTime date={requestedReturn.processed_at}/> by user: {requestedReturn.actor_name || requestedReturn.actor_id}\n                    </div>\n                  )}\n                  {latestReturn?.deny_reason && <> — {getReasonLabel(latestReturn.deny_reason)}</>}\n                  {!latestReturn?.deny_reason && latestReturn?.return_reason && <> — {getReasonLabel(latestReturn.return_reason)}</>}\n                  {latestReturn?.comment && <div className=\"text-muted\">{latestReturn.comment}</div>}\n                </div>\n              ) : canRequestReturn && accountId ? (\n                <Button color=\"link\" className=\"inline p-0\" onClick={() => setShowReturnModal(true)}>\n                  <FaIcon icon=\"sync\" className=\"me-1\" /> Request Return\n                </Button>\n              ) : '-'}\n            </DataRow>\n\n        </DataRows>\n      </DataRow>\n    )}\n\n    {sale && <RequestReturnModal\n      isOpen={showReturnModal}\n      accountId={accountId}\n      saleId={sale.sale_id}\n      product={product}\n      onCancel={() => setShowReturnModal(false)}\n      onRequested={handleRequested}\n    />}\n\n    <DataRow label=\"Public\">\n      <div>{bid.public ? 'yes' : 'no'}</div>\n    </DataRow>\n\n  </DataRows>\n\n\n  </div>\n}\n\nexport default Bid;\n","import React from 'react';\nimport {Button} from 'reactstrap';\nimport {Link} from \"react-router-dom\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\ntype EntityLinksProps = {\n  entityId:string|number;\n  accountId:string|number;\n  label:string;\n  linkPath:string;\n  linkSearch:string;\n  openRoutingModal:(filters:Record<string, any>)=>void;\n  routingFilter?:string;\n  className?:string;\n  title?:string;\n}\n/*\n * Shows source, channel, or order name with icon links to view/manage location and icon to open routing map.\n * routingFilter can be 'sourceId', 'orderId', 'channelId'\n * 'accountId' is needed with orderId\n */\nconst EntityLinks = ({\n                       entityId,\n                       accountId,\n                       label,\n                       linkPath,\n                       linkSearch=\"\",\n                       openRoutingModal,\n                       routingFilter,\n                       className=\"\",\n                       title=\"View/Manage\"\n}: EntityLinksProps) => {\n\n  return (\n    <div className={`d-flex align-items-center ${className} `}>\n      <div>{label}</div>\n      <div className=\"ms-1 d-flex no-wrap\">\n        <Link\n          target=\"_blank\"\n          className=\"link\"\n          to={{\n            pathname: linkPath,\n            search: linkSearch,\n          }}\n          title={title}\n        >\n          <FaIcon icon=\"external-link-alt\" size=\"sm\" className=\"me-1\"/>\n        </Link>\n        {routingFilter && (\n          <Button\n            size=\"sm\"\n            color=\"link\"\n            className=\"inline\"\n            onClick={() => openRoutingModal({[routingFilter]: entityId, accountId})}\n            title=\"Routing Map\">\n            <FaIcon icon=\"project-diagram\" size=\"sm\"\n            />\n          </Button>\n        )}\n\n      </div>\n\n    </div>\n  )\n}\n\nexport default EntityLinks;\n","import React, {useState} from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Link } from 'react-router-dom';\nimport { Button } from 'reactstrap';\nimport { MoneyFormatter, PercentFormatter } from '../../../Components/Table/Table';\nimport {Stack} from \"@thedmsgroup/mastodon-ui-components\";\nimport Block from './Block';\nimport Bid from './Bid';\nimport FundingBreakdown from './FundingBreakdown';\nimport AdDisplay from '../../AdManager/AdDisplay';\nimport EntityLinks from \"./EntityLinks\";\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {DataRows, DataRow} from \"../../../Components\";\n\n/*\n * Auction match detail\n */\nconst Match = ({\n  match_id,\n  matchable_id,\n  account,\n  order,\n  rule,\n  channel,\n  product,\n  bid,\n  account_bid_amount,\n  account_bid_explanation,\n  exclusive,\n  blocks,\n  tags,\n  buyer_name,\n  broker_name,\n  internal_bid,\n  internal_bid_modifiers,\n  match_delivery_id,\n  funding_contributions,\n  promotionNames,\n  onSelectDelivery,\n  onShowRouting,\n  onShowMatchable,\n  onReturnRequested,\n}) => {\n  // Legs resolved at match time but never booked: the bid carries its own copy\n  // once funding runs, so only show these when no funded copy exists.\n  const resolvedLegs = funding_contributions || [];\n  const showResolvedLegs = resolvedLegs.length > 0 && !(bid?.funding_contributions?.length > 0);\n\n  return (\n    <div className=\"match-container form-section\">\n\n      <div className=\"d-flex\">\n      <div className=\"match flex-grow-1\">\n\n        <div className=\"form-section-header\">\n          Match {match_id}\n        </div>\n\n\n        <DataRows labelWidth=\"120px\">\n          <DataRow label=\"Buyer\">\n            {buyer_name}\n          </DataRow>\n\n          <DataRow label=\"Broker\">\n          <>\n            {match_delivery_id ? <Button\n              className=\"inline\"\n              color=\"link\"\n              title={`Deliveries: ${broker_name}`}\n              onClick={() => onSelectDelivery(match_delivery_id)}\n            >\n              {broker_name}\n            </Button> : (broker_name || \"-\")}\n          </>\n          </DataRow>\n\n\n\n          <DataRow label=\"Account\">\n            {account?.id ? (\n              <EntityLinks\n                entityId={account.id}\n                accountId={account.id}\n                label={account.name}\n                linkPath={`/accounts/${account.id}/settings`}\n                linkSearch=\"tab=details\"\n                title=\"View account settings\"\n              />\n            ) : account?.name}\n          </DataRow>\n\n          <DataRow label=\"Order\">\n            <>\n              {account && order ? (\n                  <EntityLinks\n                    entityId={order.id}\n                    accountId={account.id}\n                    label={<span>{order.name} <EntityId id={order.id}/></span>}\n                    linkPath={ `/accounts/${account.id}/order/${order.id}/rules`}\n                    routingFilter=\"orderId\"\n                    openRoutingModal={onShowRouting}\n                  />\n              ) : (\n                <i>unknown order</i>\n              )}\n\n            </>\n          </DataRow>\n\n          <DataRow label=\"Rule\">\n            <>\n              {rule && account && (\n                <>\n                  <Link\n                    target=\"_blank\"\n                    className=\"link\"\n                    to={{\n                      pathname: `/accounts/${account.id}/order/${order.id}/rules`,\n                      search: `rule=${rule.id}`,\n                    }}\n                    title=\"View rule in order rule tree\"\n                  >\n                    {rule.label}\n                  </Link> <EntityId id={rule.id} />\n                </>\n\n              )}\n            </>\n          </DataRow>\n\n          <DataRow label=\"Channel\">\n            <>\n              {channel ? (\n                  <EntityLinks\n                    entityId={channel.id}\n                    label={<span>{channel.name} <EntityId id={channel.id} /></span>}\n                    linkPath=\"/publishing/channels\"\n                    linkSearch={`page=1&search=${channel.name}`}\n                    routingFilter=\"channelId\"\n                    openRoutingModal={onShowRouting}\n                  />\n              ) : '-'}\n            </>\n          </DataRow>\n\n          <DataRow label=\"Exclusive\">\n            {exclusive ? 'yes' : 'no'}\n          </DataRow>\n\n          <DataRow label=\"Bid\">\n            <div>\n              {account_bid_amount > 0 ? <MoneyFormatter value={account_bid_amount} /> : \"-\"}\n              {account_bid_explanation?.length > 0 && <Explanation>\n                <ul className={\"list-unstyled\"}>\n                  {account_bid_explanation\n                    .filter(reason => reason.indexOf(\"100%\") === -1)\n                    .map((reason, i) => <li key={i}>{reason}</li>)\n                  }\n                </ul>\n              </Explanation>}\n            </div>\n          </DataRow>\n\n          {internal_bid !== account_bid_amount &&<DataRow label=\"Internal Bid\">\n            <div>\n              {internal_bid > 0 ? <MoneyFormatter value={internal_bid} /> : \"-\"}\n              {internal_bid_modifiers?.length > 0 && <Explanation>\n                <ul className={\"list-unstyled\"}>\n                  {internal_bid_modifiers\n                    .map((bm, i) => <li key={i}><InternalBidModifier {...bm} key={i} /></li>)\n                  }\n                </ul>\n              </Explanation>}\n            </div>\n          </DataRow>}\n\n          {showResolvedLegs && (\n            <DataRow label=\"Promotions\" fieldStyle>\n              <FundingBreakdown\n                legs={resolvedLegs}\n                funded={false}\n                gross={account_bid_amount}\n                promotionNames={promotionNames}\n              />\n            </DataRow>\n          )}\n\n          <DataRow label=\"Blocks\">\n            <>\n              { blocks && blocks.length > 0 ? (\n                <Stack gap=\"0.75em\">\n                  {blocks.map((b, i) => <Block {...b} key={i} />)}\n                </Stack>\n              ) : \"-\"\n              }\n            </>\n\n          </DataRow>\n\n          { tags && tags.length > 0 && (\n            <DataRow label=\"Tags\">\n              {tags.join(', ')}\n            </DataRow>\n          )}\n\n\n\n          <DataRow label=\"Matchable ID\">\n            <Button\n              className=\"inline\"\n              color=\"link\"\n              title={`Matchable: ${matchable_id}`}\n              onClick={() => onShowMatchable(matchable_id)}\n            >\n              {matchable_id}\n            </Button>\n          </DataRow>\n        </DataRows>\n      </div> {/* match */}\n\n\n        <div className=\"match-bid flex-grow-1\">\n          {bid ? (\n            <Bid {...bid} product={product} accountId={account?.id} promotionNames={promotionNames} onReturnRequested={onReturnRequested} />\n          ) : (\n            <div className=\"bid no-bid\">\n              <div className=\"form-section-header mb-0 fs-5\"><FaIcon icon=\"hand-holding-usd\" /> No Bid Offered</div>\n            </div>\n          )}\n        </div>\n\n      </div>\n\n      {/* Ads are in a separate full span row because of their size */}\n      {product === 'clicks' && bid && (\n        <>\n          <DataRow label=\"Ad\">\n\n              <div className=\"ads-container\">\n                {bid.ad ? (\n                  <div>\n                    <AdDisplay {...bid.ad} />\n                  </div>\n                ) : \"-\"}\n              </div>\n\n          </DataRow>\n\n          <DataRow label=\"Auto Redirect\">\n            <div>{bid.match.auto_redirect ? 'yes' : 'no'}</div>\n          </DataRow>\n        </>\n      )}\n\n    </div>\n  );\n};\n\nconst Explanation = ({children}) => {\n  const [show, setShow] = useState(false);\n  const handleToggle = () => setShow(!show);\n  return (\n    <>\n      <Button onClick={handleToggle} color=\"link\" className=\"inline ms-2\">why?</Button>\n      {show && <div className=\"bid-explanation\">\n        {children}\n      </div>}\n    </>\n  );\n};\n\nconst InternalBidModifier = ({ amount, source }) => (\n  <span>\n    <PercentFormatter value={amount} />\n    {' '}\n    {source}\n  </span>\n);\n\nexport default Match;\n","import React, { useState } from 'react';\nimport {RelativeTime} from \"@thedmsgroup/mastodon-ui-components\";\nimport {RequestLog, ResponseLog} from \"@thedmsgroup/mastodon-ui-components/lib/components/HttpLog/HttpLog\";\nimport {Alert, Badge, Button} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {DataRow, DataRows} from \"../../../Components\";\nimport classnames from \"classnames\";\nimport {statusCodeColor} from \"../../../utils/http\";\n\n// Datadog trace URLs use the decimal form of the lower 64 bits of the\n// 128-bit (32-char hex) trace id.\nconst getDatadogTraceUrl = (traceId) => {\n  if (!traceId || !/^[0-9a-f]{32}$/i.test(traceId)) return null;\n  return `https://app.datadoghq.com/apm/trace/${BigInt(`0x${traceId.slice(-16)}`).toString()}`;\n};\n\nconst HttpLog = ({log}) => {\n  const traceUrl = getDatadogTraceUrl(log.trace_id);\n\n  return <div className=\"delivery flex-grow-1\" key={log.request_id}>\n    <DataRows>\n      <DataRow label=\"Request ID\">\n        {log.request_id}\n      </DataRow>\n\n      {traceUrl && (\n        <DataRow label=\"Trace\">\n          <a href={traceUrl} target=\"_blank\" rel=\"noopener noreferrer\">🐶 View in Datadog</a>\n          <span className=\"text-muted ms-2 small\">(traces are subject to random sampling and may not exist)</span>\n        </DataRow>\n      )}\n\n      <DataRow label=\"Send At\">\n       <RelativeTime date={log.sent_at} />\n      </DataRow>\n\n      <DataRow label=\"Duration\">\n        {log.response_time} ms\n      </DataRow>\n\n      <DataRow label=\"Status Code\">\n        {log.status_code ? <Badge color={statusCodeColor(log.status_code)}>{log.status_code}</Badge> : <span>&mdash;</span>}\n      </DataRow>\n\n      <DataRow label=\"Request\">\n          <ToggleMe>\n            <><HelpText>This is the actual request sent to the client. It is safe to share with the client.</HelpText>\n              {log.request && <RequestLog requestLog={log.request} />}</>\n          </ToggleMe>\n      </DataRow>\n\n      <DataRow label=\"Response\">\n          <ToggleMe>\n            <><HelpText>This is the actual response received from the client. It is safe to share with the client.</HelpText>\n              {log.response && <ResponseLog responseLog={log.response} bodyHeight={300} />}</>\n          </ToggleMe>\n      </DataRow>\n    </DataRows>\n\n  </div>\n}\n\n// todo extract to utilities\nconst HelpText = ({children}) => <Alert color=\"secondary\">{children}</Alert>\n\n// todo extract to utilities\nconst ToggleMe = ({ children }) => {\n  const [show, setShow] = useState(false);\n  const handleToggle = () => setShow(!show);\n  return (\n    <div className=\"toggle-me\">\n      <Button color=\"link\" size=\"sm\" className=\"inline d-flex align-items-center\" onClick={handleToggle}>\n        <FaIcon icon=\"eye\" className=\"me-1\" />\n        <div>{show ? 'hide' : 'show'}</div>\n      </Button>\n      <div className={classnames(['data', { show }])}>\n        {children}\n      </div>\n    </div>\n  );\n};\n\nexport default HttpLog\n","import React, { useState, useEffect, useMemo } from 'react';\nimport {\n  Badge,\n  Button,\n  Alert,\n} from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { titleCase } from '../../../utils/string';\nimport {DateFormatter} from \"../../../Components/Table/Table\";\nimport useApi from '../../../Hooks/useApi';\nimport {StandardAlert, JsonDisplay,  notify} from \"@thedmsgroup/mastodon-ui-components\";\nimport {DeliveryRejectCategoryChoices} from \"../../../Components/Table/FilterChoices\";\nimport {DataRows,DataRow} from \"../../../Components\";\nimport FlexTable from \"../../../Components/Table/FlexTable\";\nimport HttpLog from \"./HttpLog\";\nimport NumberFormat from \"react-number-format\";\n\nconst HelpText = ({children}) => <Alert color=\"secondary\">{children}</Alert>\n\n/*\n * Fetches and displays delivery detail.\n */\n\nconst Deliveries = ({\n                      deliveryOptions = [],\n                      selectedDeliveryId = null,\n                      onSelect\n}) => {\n\n  const { api } = useApi()\n\n  const [detail, setDetail] = useState(null)\n  const [selectedRows, setSelectedRows] = useState({})\n  const [view, setView] = useState('list')\n  const [deliveries, setDeliveries] = useState({}) // a cache of loaded delivery detail\n  const [loading, setLoading] = useState(false)\n\n  const toggleView = () => {\n    setView(view === 'list' ? 'detail' : 'list');\n    setSelectedRows({})\n  }\n\n\n  const handleClickRow = (index) => {\n    const delivery = deliveryOptions[index]\n    setSelectedRows({[index]:true})\n    setView('detail')\n\n    if (delivery) {\n      loadDetails(delivery)\n    }\n  }\n\n  //Scroll to row when detail opens (your selected row could be hidden when the table shortens)\n  useEffect(() => {\n    if (view === 'detail' && selectedRows) {\n      const rowKeys = Object.keys(selectedRows)\n      if (rowKeys.length) {\n        const row = document.getElementById(`row-${rowKeys[0]}`)\n        if (row) {\n          row.scrollIntoView({behavior:\"smooth\", block: \"nearest\"})\n        }\n      }\n    }\n  }, [view])\n\n  const columns = useMemo(() => [\n    {\n      Header: 'Type',\n      accessor: 'type',\n      Cell: ({ value }) => (\n        <Badge size=\"xs\" className={value.toLowerCase()}>{titleCase(value)}</Badge>\n      ),\n      maxWidth: 80,\n      id:'foobar'\n    },\n    {\n      Header: 'Integration',\n      accessor: 'integration_info.label',\n    },\n    {\n      Header: 'Version',\n      accessor: 'integration_info',\n      maxWidth: 80,\n      Cell: ({ value }) => (\n\n        <Link\n          target=\"_blank\"\n          className=\"link ads\"\n          to={`/tools/integrations/${value.id}`}\n          title=\"View Integration\"\n        >\n          {value.version}<FaIcon icon=\"external-link-alt\" size=\"sm\" className=\"ms-1\" />\n        </Link>\n\n      ),\n    },\n    {\n      Header: 'Rejection',\n      accessor: 'reject_category',\n      Cell: ({ value }) => (\n        <RejectionCategoryDisplay category={value} />\n      ),\n    },\n    {\n      Header: 'Duration',\n      accessor: 'duration',\n      Cell:({value}) => <NumberFormat value={value} displayType=\"text\" thousandSeparator suffix={' ms'}/>,\n      maxWidth:80\n    },\n    {\n      Header: 'Sent',\n      accessor: 'sent_at',\n      sortType: (a, b) => {\n        return new Date(b.sent_at) - new Date(a.sent_at);\n      },\n      Cell: ({ value }) => {\n        return <DateFormatter value={value} format=\"yyyy-MM-dd hh:mm:ss:SS\" />\n        // return <RelativeTime date={value} showTimezone={true} />;\n      },\n    },\n    {\n      Header: 'Account',\n      accessor: 'account.name',\n    },\n    {\n      Header: 'Order',\n      accessor: 'order.name',\n    },\n  ], [])\n\n  const initialTableState = useMemo(\n    () => ({\n      sortBy: [\n        { id: 'sent_at', 'desc' : false },\n      ],\n    }),\n    []\n  )\n\n  // On mount or when external ID selection, load the delivery detail\n  useEffect(() => {\n    if (deliveryOptions.length) {\n      if (selectedDeliveryId) {\n        const index = deliveryOptions.findIndex(el => el.id === selectedDeliveryId)\n        if (index >= 0) {\n          loadDetails(deliveryOptions[index])\n          setSelectedRows({[index]: true})\n          setView('detail')\n        }\n      }\n\n    }\n    //Unmount: clear delivery detail cache\n    return () => {\n      setDeliveries({})\n      setDetail(null)\n    }\n  }, [selectedDeliveryId]);\n\n  const loadDetails = async (delivery) => {\n    if (!delivery) return\n\n    // No delivery id means this integration never made an HTTP request -\n    // there is nothing to look up at /debug/deliveries/{id}, and nothing\n    // to deep-link to, so leave the URL/filter state alone.\n    if (!delivery.id) {\n      setDetail(delivery)\n      return\n    }\n\n    onSelect(delivery.id)\n    setLoading(true)\n    let result = await api.endpoints.debug.deliveries(delivery.id)\n\n    if (result) {\n      result = Object.assign(result, delivery)\n      result.timeout = delivery.reject_category === \"delivery_timeout\"\n      setDeliveries((prev) => {\n        const newDeliveries = prev ? {...prev} : {}\n        newDeliveries[delivery.id] = result\n        return newDeliveries\n      });\n      setDetail(result)\n\n\n    } else {\n      notify(`Unable to load delivery details: ${api.error.name}`, 'error')\n    }\n\n    setLoading(false)\n  };\n\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header d-flex justify-content-between\">\n        <div>Deliveries</div>\n\n      </div>\n      {deliveryOptions.length === 0 && (\n        <StandardAlert color=\"light\">\n          This auction has no deliveries\n        </StandardAlert>\n      )}\n\n\n\n      {deliveryOptions.length > 0 && (\n        <div className={classnames(\"deliveries-table-container\", {scrolling:view === 'detail'})}>\n          <FlexTable\n            columns={columns}\n            data={deliveryOptions}\n            initialState={initialTableState}\n            className='deliveries-table'\n            onClickRowCallback={handleClickRow}\n            selectedRowIds={selectedRows}\n            getRowClassName={(row) => classnames({ 'no-lookup': !row.original.id })}\n          />\n        </div>\n      )}\n\n      {view === 'detail' && detail && (\n        <>\n          {deliveryOptions.length > 0 && (\n            <div className=\"form-section border mt-2\">\n              <div className=\"form-section-header d-flex justify-content-between\">\n                <div>{detail.integration_info?.label}</div>\n                <Button onClick={toggleView}  color=\"transparent\" title=\"Close detail\">\n                  <FaIcon icon=\"times\" />\n                </Button>\n              </div>\n\n\n                <div>\n                  <div className=\"form-section delivery flex-grow-1\">\n                    {!detail.delivery_id && (\n                      <StandardAlert color=\"light\" icon=\"info\">\n                        This integration did not send a HTTP request.\n                      </StandardAlert>\n                    )}\n\n                    {!!detail.cached && <StandardAlert>\n                      This delivery used a cached response from a prior delivery.\n                    </StandardAlert>}\n\n                    {!!detail.timeout && <StandardAlert color=\"danger\" icon=\"clock\">\n                      This delivery timed out – the response was not used.\n                    </StandardAlert>}\n\n                    {!!detail.notified && <StandardAlert icon=\"clock\">\n                      This delivery only notified – we did not wait for a response & the response was not used.\n                    </StandardAlert>}\n\n                    <DataRows>\n                      <DataRow label=\"Delivery ID\">\n                        {detail.delivery_id || <span>&mdash;</span>}\n                      </DataRow>\n\n                      {!detail.integration_info && <DataRow label=\"Integration\">\n                        {detail.integration}\n                      </DataRow>}\n\n                      {detail.integration_info &&\n                        <DataRow label=\"Integration\">\n                          <Link\n                            target=\"_blank\"\n                            className=\"link ads\"\n                            to={`/tools/integrations/${detail.integration_info.id}`}\n                            title=\"View Integration\"\n                          >\n                            <FaIcon icon=\"external-link-alt\" size=\"sm\" className=\"me-1\" />\n                            {detail.integration_info.label} [version {detail.integration_info.version}]\n\n                          </Link>\n                        </DataRow>\n                      }\n\n                      <DataRow label=\"Result Data\">\n                        <div>\n                          {detail.data ? <>\n                            <HelpText>This data was returned from our integration after interpreting the client response. It is NOT the actual response returned from the client, only our interpretation of it.<br/>\n                              To see what the client actually responded, please review the actual response further below.</HelpText>\n                            <JsonDisplay data={detail.data || ''} scrollable height=\"300px\" /></> : <span>&mdash;</span>}\n                        </div>\n                      </DataRow>\n\n                      {detail.input_data && (\n                        <DataRow label=\"Integration Data\">\n                          <div>\n                            <ToggleMe>\n                              <HelpText>This is all the data that was available to our integration to work with. It does NOT mean this data was sent to clients.<br/>\n                                To see what was actually sent, please review the actual request further below. INTERNAL USE ONLY.</HelpText>\n                              <JsonDisplay data={detail.input_data || ''} scrollable height=\"300px\" />\n                            </ToggleMe>\n                          </div>\n                        </DataRow>\n                      )}\n\n                      {detail.settings && <DataRow label=\"Settings\">\n                        <ToggleMe>\n                          <JsonDisplay data={detail.settings || ''} scrollable height=\"300px\" />\n                        </ToggleMe>\n                      </DataRow>}\n\n                      {detail.error && <DataRow label=\"Error\">\n                        <div className=\"error\">\n                          {detail.error}\n                        </div>\n                      </DataRow>}\n                      {detail.api_operations?.map((log, i) => <HttpLog log={log} key={i} />)}\n\n                    </DataRows>\n\n\n                  </div>\n\n                </div>\n\n            </div>\n          )}\n        </>\n      )}\n\n\n\n    </div>\n  );\n};\n\n\n\nconst ToggleMe = ({ children }) => {\n  const [show, setShow] = useState(false);\n  const handleToggle = () => setShow(!show);\n  return (\n    <div className=\"toggle-me\">\n      <Button color=\"link\" size=\"sm\" className=\"inline d-flex align-items-center\" onClick={handleToggle}>\n        <FaIcon icon=\"eye\" className=\"me-1\" />\n        <div>{show ? 'hide' : 'show'}</div>\n      </Button>\n      <div className={classnames(['data', { show }])}>\n        {children}\n      </div>\n    </div>\n  );\n};\n\nconst RejectionCategoryDisplay = ({category, showIcon}) => {\n  const resolved = DeliveryRejectCategoryChoices.find(cat => cat.value === category);\n  return (\n    <span>\n      {showIcon && <FaIcon icon=\"exclamation-triangle\" size=\"sm\" className=\"me-1\" color=\"darkred\" />}\n      {resolved ? resolved.label : category}\n    </span>\n  )\n}\n\nDeliveries.propTypes = {\n  deliveryOptions: PropTypes.array,\n};\n\nexport default Deliveries;\n","import React, {useState, useCallback} from 'react';\nimport { Button} from 'reactstrap';\nimport { tokenToWords } from '../../../utils/string';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {faCode} from \"@fortawesome/free-solid-svg-icons\";\nimport { DateFormatter } from '../../../Components/Table/Table';\nimport { matchSorter } from 'match-sorter';\nimport { useDebouncedCallback } from 'use-debounce';\nimport {TextSearch} from \"../../../Components/Table/Filter\";\nimport {DeliveryType} from \"../../../types\";\nimport {JsonDisplay, UrlDisplayWidget, Utils, ViewSwitch, ViewSwitchButton} from \"@thedmsgroup/mastodon-ui-components\";\nimport useLocalStorage from \"../../../Hooks/useLocalStorage\";\nimport {DataRow, DataRows} from \"../../../Components\";\n\n\ntype LeadDataBlock= {\n  data:Record<string,any>;\n  scope:string;\n  delivery_id?:string;\n  description?:string;\n}\n\n// Filter by \"category\"?\n// const LeadCategoryFieldMap = {\n//   location : ['city', 'state', 'zip', 'postal'],\n//   connection: ['device', 'browser', 'isp', 'connection', 'isp','user_agent'],\n//   completion: ['leadid_provided', 'universal_lead_id_provided', 'trusted_form_provided', 'match_chance']\n// } as Record<string,string[]>\n\ntype LeadDetailProps = {\n  //pii:Record<string,string>;\n  lead:LeadDataBlock[];\n  timezone:string;\n  gotoDelivery:(id:string) => void;\n  deliveries:DeliveryType[];\n}\n\n/*\n * Auction lead detail\n */\nconst Lead = ({\n  lead,\n  timezone,\n  gotoDelivery,\n  deliveries\n}: LeadDetailProps) => {\n  const [searchTerm, setSearchTerm] = useState<string>(\"\");\n  const [scopeFilter, setScopeFilter] = useState<string | null>(null);\n  const [filteredData, setFilteredData] = useState<LeadDataBlock[]>(lead);\n  const [view, setView] = useLocalStorage(\"auction_detail_lead_view\",'list');\n\n  const resolveDelivery = useCallback((id:string) => {\n    const dv = deliveries.find((d) => d.id === id);\n    return dv ? dv.integration_info.label : 'Delivery';\n  }, [deliveries])\n\n  const applyFilters = useCallback((term: string, scope: string | null) => {\n    let result = lead;\n\n    // Apply scope filter first\n    if (scope) {\n      result = result.filter((block) => block.scope === scope);\n    }\n\n    // Apply search filter\n    if (term) {\n      const matchedRows = matchSorter(result, term, {\n        keys: [item => Object.keys(item.data).map((k) => k.replace(/_/g, ' '))],\n        threshold: matchSorter.rankings.CONTAINS,\n        sorter: (items) => items,\n      });\n\n      result = matchedRows.map((block) => {\n        const matchedKeys = matchSorter(Object.keys(block.data), term, {keys: [item => item.replace(/_/g, ' ')]});\n        const filteredBlock = Object.fromEntries(Object.entries(block.data).filter(([blockKey]) => matchedKeys.includes(blockKey)));\n        return {...block, data: filteredBlock};\n      });\n    }\n\n    setFilteredData(result);\n  }, [lead]);\n\n  const handleSearchDebounced = useDebouncedCallback((term: string) => {\n    setSearchTerm(term);\n    applyFilters(term, scopeFilter);\n  }, 400);\n\n  const handleClearSearch = () => {\n    setSearchTerm(\"\");\n    applyFilters(\"\", scopeFilter);\n  };\n\n  const handleScopeFilter = (scope: string) => {\n    const newScope = scopeFilter === scope ? null : scope;\n    setScopeFilter(newScope);\n    applyFilters(searchTerm, newScope);\n  };\n  return (\n    <div className=\"lead-data\">\n\n      <div className=\"above-table-filters d-flex align-items-center mb-3\">\n\n          <ViewSwitch currentView={view} onClick={setView} size=\"sm\">\n            <ViewSwitchButton view=\"list\" >\n              <FaIcon icon=\"list\" size=\"sm\"/> List\n            </ViewSwitchButton>\n            <ViewSwitchButton  view=\"json\" >\n              <FaIcon icon={faCode} size=\"sm\"/> JSON\n            </ViewSwitchButton>\n          </ViewSwitch>\n\n        {view === 'list' && (\n            <div className=\"ms-2 boxed-filter new-boxed-filter search-filter flex-fill\">\n              <TextSearch\n                // @ts-ignore  because of react.memo\n                value={searchTerm}\n                placeholder=\"Search...\"\n                onUpdate={handleSearchDebounced}\n                onClear={handleClearSearch}\n              />\n            </div>\n        )}\n\n        {scopeFilter && (\n          <div className=\"ms-2\">\n            <Button\n              color=\"secondary\"\n              size=\"sm\"\n              onClick={() => handleScopeFilter(scopeFilter)}\n              title=\"Clear scope filter\"\n            >\n              <FaIcon icon=\"eye\" size=\"sm\"/>{' '}\n              Scope: {scopeFilter}\n              {' '}<FaIcon icon=\"times\" size=\"sm\"/>\n            </Button>\n          </div>\n        )}\n\n      </div>\n{/*\n    For now we are not including auction.pii data here  MRK-9177\n      <div className=\"form-section border\">\n        <div className=\"form-section-header\">Pii</div>\n        {pii ? (\n          <>\n            <div className=\"data-row\">\n              <label>Name</label>\n              <div>\n                {pii.first_name}\n                {\" \"}\n                {pii.last_name}\n              </div>\n            </div>\n\n            <div className=\"data-row\">\n              <label>Email</label>\n              <div>{pii.email}</div>\n            </div>\n\n            <div className=\"data-row\">\n              <label>Phone</label>\n              <div>{pii.phone}</div>\n            </div>\n\n            <div className=\"data-row\">\n              <label>Address</label>\n              <div>{pii.address}</div>\n            </div>\n\n            <div className=\"data-row\">\n                <label>Age</label>\n                <div>{age || <i>unknown</i>}</div>\n              </div>\n          </>\n        ) : (\n          <i>None</i>\n        )}\n      </div>\n*/}\n\n\n      {view === 'json' ? (\n        <JsonDisplay data={lead} />\n      ) : (\n        <>\n          {filteredData.map((block, i: number) => (\n            <div className=\"form-section border mb-2\" key={i}>\n              <div className=\"d-flex justify-content-between mb-1\">\n                <div className=\"form-section-header mb-0\">{block.description ?? \"\"}</div>\n                <div className=\"d-flex no-wrap\">\n                  {block.scope && (\n                    <div\n                      className={`delivery-pill clickable${scopeFilter === block.scope ? ' active' : ''}`}\n                      onClick={() => handleScopeFilter(block.scope)}\n                      role=\"button\"\n                      title={scopeFilter === block.scope ? 'Clear scope filter' : `Filter by scope: ${block.scope}`}\n                    >\n                      <FaIcon icon=\"eye\" size=\"sm\"/>{' '}\n                      Scope: {block.scope}\n                    </div>\n                  )}\n                  {block.delivery_id && (\n                    <div className=\"delivery-pill ms-2\"><FaIcon icon=\"envelope\" size=\"sm\"/>{' '}\n                      <Button\n                        color=\"link\"\n                        className=\"inline\"\n                        onClick={() => gotoDelivery(block.delivery_id as string)}\n                        size=\"sm\">\n                        {resolveDelivery(block.delivery_id)}\n                      </Button>\n                    </div>\n                  )}\n                </div>\n              </div>\n\n              <DataRows>\n                {Object.entries(block.data).map(([dataKey, dataVal], i) => (\n                  <DataRow label={tokenToWords(dataKey)} key={i}>\n                    <LeadValueDisplay data={block.data} value={dataVal} dataKey={dataKey} timezone={timezone}/>\n                  </DataRow>\n                ))}\n              </DataRows>\n\n            </div>\n          ))}\n        </>\n      )}\n\n\n    </div>\n  )\n};\n\ntype LeadValueDisplayProps = {\n  data: any,\n  dataKey: string,\n  value: any,\n  timezone: string\n}\n\nconst LeadValueDisplay = ({data, dataKey, value, timezone}:LeadValueDisplayProps) => {\n  if (dataKey === 'source_url') {\n    return <UrlDisplayWidget title=\"Source URL\" url={value} />\n  } else if (dataKey === 'state_local_time' && data.state_timezone) {\n\n    return <div>\n      <DateFormatter value={value} format=\"MMM do y hh:mm:ss aaa zzz\" timezone={data.state_timezone} />\n      {' '}\n      <small>[{value}]</small>\n    </div>\n\n  } else if (typeof value === 'object') {\n    return (\n      <div>\n        {Array.isArray(value) ? (\n          <ArrayValueDisplay data={value} name={dataKey} timezone={timezone} />\n        ) : (\n          <ObjectValueDisplay data={value} timezone={timezone} />\n        )}\n      </div>\n    )\n  } else if (typeof value === 'boolean') {\n    return <div>{value ? 'Yes' : 'No'}</div>\n  } else if (value ) {\n\n    if (/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) {\n      return (<div>\n        <DateFormatter\n          value={value}\n          format=\"MMM do y hh:mm:ss aaa zzz\"\n          // @ts-ignore\n          timezone={timezone ?? null}\n        />\n        {' '} <small>[{value}]</small>\n        </div>)\n    }\n\n    return <div>{value.toString()}</div>\n  }\n\n  return <div>&mdash;</div>\n}\n\n\n/*\n * ObjectValueDisplay\n * When the value of a lead prop being processed by LeadValueDisplay is an object,\n * recursively call LeaveValueDisplay to produce a nested list\n * (also can toggle to JSON view)\n */\ntype ObjectValueDisplayProps = {\n  data:any,\n  allowJsonView?:boolean,\n  name?:string;\n  timezone:string\n}\nconst ObjectValueDisplay = ({data, allowJsonView=true, name, timezone}:ObjectValueDisplayProps) => {\n  const[jsonView, setJsonView] = useState(false);\n\n  const toggleView = () => setJsonView(!jsonView);\n\n  if (!Utils.isObject(data) || !Object.keys(data).length) {\n    return <div><i>No value</i></div>\n  }\n\n  return (\n    <div className=\"form-section border\">\n      {name && <div className=\"form-section-header\">{name}</div>}\n      {allowJsonView && <Button color=\"link\" size=\"xs\" className=\"inline ml-auto mb-1\" onClick={toggleView} >{jsonView ? 'List':'JSON'}</Button> }\n      {jsonView ? (\n        <JsonDisplay data={data} scrollable={false} />\n      ) : (\n        <DataRows>\n          {Object.entries(data).map(([k, v], i) => (\n            <DataRow label={tokenToWords(k)} key={i}>\n              <LeadValueDisplay data={data} value={v} dataKey={k} timezone={timezone}/>\n            </DataRow>\n          ))}\n        </DataRows>\n      )}\n\n    </div>\n  )\n}\n\n\n/*\n * ArrayValueDisplay\n * When the value of a lead prop being processed by LeadValueDisplay is an array,\n * recursively call LeaveValueDisplay to produce an array of nested lists\n * (also can toggle to JSON view)\n */\ntype ArrayValueDisplayProps = {\n  data:any,\n  name:string;\n  allowJsonView?:boolean,\n  timezone:string\n}\nconst ArrayValueDisplay = ({data, name, allowJsonView=true, timezone}:ArrayValueDisplayProps) => {\n  const[jsonView, setJsonView] = useState(false);\n\n  const toggleView = () => setJsonView(!jsonView);\n  if (!Array.isArray(data ) || !data.length) {\n    return <div><i>Empty</i></div>\n  }\n  // We're not anticipating mixed type arrays\n  // Could be array of strings (search_type) or array of objects (vehicles)\n  const isObjectElements = Utils.isObject(data[0]);\n\n  return (\n    <div>\n      {allowJsonView && <Button color=\"link\" size=\"xs\" className=\"inline mb-1\" onClick={toggleView} >{jsonView ? 'List':'JSON'}</Button> }\n      {jsonView ? (\n        <JsonDisplay data={data} />\n      ) : (\n        <>\n          {isObjectElements ? (\n            <>\n              {data.map((item:any, i:number) => (\n                <div className=\"form-section  mb-1 p-0\" key={i}>\n                  <ObjectValueDisplay data={item} name={`${tokenToWords(name)} ${i+1}`} timezone={timezone} allowJsonView={false} />\n                </div>\n              ))}\n            </>\n          ) : (\n            <div>{data.join(', ')}</div>\n          )}\n\n        </>\n      )}\n\n    </div>\n  )\n}\n\n\nexport default Lead;\n","import React, { Suspense } from 'react';\nimport PropTypes from 'prop-types';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport { DateFormatter, DurationFormatter } from '../../../Components/Table/Table';\nimport { titleCase } from '../../../utils/string';\nimport {HelpPopper} from \"@thedmsgroup/mastodon-ui-components\";\nimport {DispositionHelp} from \"../../const\";\nimport lazify from \"../../../utils/Lazify\";\nimport {RECORDING_URL_BASE} from \"../../const\";\nimport {DataRows, DataRow} from \"../../../Components\";\n\nconst ReactAudioPlayer = lazify(() => import(/* webpackChunkName: \"Media\" */ 'react-audio-player'));\n\n\n\n/* Display data from received_call   */\nconst Call = React.memo(({ call, ivrCall, ivrLog }) => (\n  <>\n    {call ? (\n      <div className=\"form-section col-8\">\n        <div className=\"form-section-header\">Received Call</div>\n        <CallDetails call={call} />\n\n        {/* MRK-8593 don't show IVR if the id is the same as the call */}\n        {ivrCall && ivrCall.id !== call.id && <>\n          <div className=\"form-section-header mt-4\">IVR Call</div>\n          <CallDetails call={ivrCall} />\n        </>}\n\n        {ivrLog && <>\n          <div className=\"form-section-header mt-4\">IVR Log</div>\n          <table className=\"ivr-log table table-bordered\">\n            {ivrLog.map(el => {\n              return <tr>\n                <td>\n                  <DateFormatter value={el.occurred_at} format=\"hh:mm:ss\" />{}\n                </td>\n                <td>\n                  {el.transcript.split(\"\\n\").map(el => {\n                    return <>{el} <br/></>\n                  })}\n                </td>\n                <td>\n                  {el.data}\n                </td>\n              </tr>\n            })}\n          </table>\n        </>}\n\n      </div>\n    ) : (\n      <StandardAlert color=\"light\">\n        No call received\n      </StandardAlert>\n    )}\n  </>\n\n));\n\nconst CallDetails = ({call}) => {\n  return <DataRows>\n    <DataRow label=\"ID\">\n      {call.id}\n    </DataRow>\n\n    <DataRow label=\"Disposition\">\n        <span id=\"disposition\">{titleCase(call.disposition)}</span>\n        {call.disposition && DispositionHelp[call.disposition] && (\n          <HelpPopper name=\"disposition\" iconClass=\"ms-2\">{DispositionHelp[call.disposition]}</HelpPopper>\n        )}\n    </DataRow>\n\n    <DataRow label=\"Origin number\">\n      {call.origin_number}\n    </DataRow>\n\n    <DataRow label=\"Transfer number\">\n      {call.transfer_number}\n    </DataRow>\n\n    <DataRow label=\"Destination number\">\n      {call.destination_number}\n    </DataRow>\n\n    <DataRow label=\"Received\">\n      <DateFormatter value={call.received_at} format=\"MMM do y hh:mm:ss aaa\" />\n    </DataRow>\n\n    <DataRow label=\"Ended\">\n      <DateFormatter value={call.ended_at} format=\"MMM do y hh:mm:ss aaa\" />\n    </DataRow>\n\n    <DataRow label=\"Duration\">\n      <div>\n        {call.duration ? (\n          <>\n            <DurationFormatter seconds={call.duration} /> {parseInt(call.duration) > 60 && <small>({call.duration} seconds)</small>}\n          </>\n        ) : (\n          <i>Unknown</i>\n        )}\n      </div>\n    </DataRow>\n\n\n    <DataRow label=\"Recording\">\n      <div>\n        {call.recording_url ? (\n          <Suspense fallback={<div>Loading</div>}>\n            <ReactAudioPlayer src={RECORDING_URL_BASE + encodeURIComponent(call.recording_url)} controls autoPlay={false} className=\"w-100\" />\n          </Suspense>\n        ) : (\n          <i>none</i>\n        )}\n      </div>\n    </DataRow>\n  </DataRows>\n}\n\nCall.propTypes = {\n  call: PropTypes.object,\n  ivrCall: PropTypes.object,\n  ivrLog: PropTypes.array,\n}\n\nexport default Call;\n","import React from 'react';\nimport { DateFormatter, DurationFormatter } from '../../../Components/Table/Table';\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {faConciergeBell, faGavel} from \"@fortawesome/free-solid-svg-icons\";\nimport {DataRow, DataRows} from \"../../../Components\";\nimport {HelpPopper} from \"@thedmsgroup/mastodon-ui-components\";\n\nconst ucfirst = (string) => {\n  return string[0].toUpperCase() + string.substring(1)\n}\n\nconst auctionToEvents = (auction) => {\n  const events = []\n  events.push({\n    id: 'auction_started_at',\n    when: auction.started_at,\n    label: 'Internal event - MST Ping for Match', //aka ping received\n    icon: faConciergeBell,\n    description:'Consumer went through IVR and we ping MST for Match'\n  })\n\n  // MRK-8863 requested display of new event action, but this has not been implemented yet\n  // in the data (see MRK-9025);\n  // events.push({\n  //   id: 'call_connect_attempt',\n  //   when: auction[TBD],\n  //   label: 'Call Connect Attempt to Advertiser',\n  //   icon: faConciergeBell,\n  //   description:'MST initiated the call connection to the advertiser. (Consumer will hear ringing until client answers)'\n  // })\n\n  if (auction.ivr_call) {\n    events.push({\n      id: 'ivr_call_received',\n      when: auction.ivr_call.received_at,\n      label: 'Consumer Initiated Call',\n      icon: 'phone',\n      description:'Consumer dialed DID and initiated call connection'\n    })\n    events.push({\n      id: 'consumer_ended_call',\n      when: auction.ivr_call.ended_at,\n      label: 'Consumer Call Ended',\n      icon: 'phone',\n      description: 'Consumer hung up the connection.'\n    })\n  }\n\n  if (auction.pii) {\n    events.push({\n      id: 'pii_received',\n      when: auction.pii.received_at,\n      label: 'Internal event - Post Initiated to Advertiser', //aka post received\n      icon: 'paper-plane',\n      description:'Lead details fired to client & returned destination number to MST '\n    })\n  }\n\n  if (auction.received_call) {\n    events.push({\n      id: 'call_received',\n      when: auction.received_call.received_at,\n      label: 'Call Received',\n      icon: 'phone',\n    })\n    events.push({\n      id: 'advertiser_ended_call',\n      when: auction.received_call.ended_at,\n      label: 'Advertiser Call Ended',\n      icon: 'phone',\n      description: 'Advertiser hung up the connection.'\n    })\n    if (auction.received_call.connected_at) {\n      events.push({\n        id: 'call_connected',\n        when: auction.received_call.connected_at,\n        label: 'Call Connected',\n        icon: 'phone',\n        description: 'Call was answered within 20 seconds by buyer. This is when we measure billable tracking from.'\n      })\n    }\n  }\n\n  if (auction.deliveries) {\n    for (let d of auction.deliveries) {\n      events.push({\n        id: 'delivery_sent',\n        when: d.sent_at,\n        label: `${d.integration_info?.label || d.integration.name} [${d.type}]`,\n        icon: 'envelope',\n      })\n    }\n  }\n\n  // this is a bit awkward since sales are not available on the auction root\n  const sales = auction.matches.reduce((sales, m) => {\n    if (m.final_bid?.sales) {\n      return [...sales, ...m.final_bid.sales]\n    }\n    return sales\n  }, [])\n  for (let s of sales) {\n    events.push({\n      id: 'sold_at',\n      when: s.sold_at,\n      label: ucfirst(auction.product.slice(0, -1)) + ` Sold`,\n      icon: faGavel,\n    })\n  }\n\n  // convert dates\n  events.map(e => {\n    e.when = e.when ? new Date(e.when) : null;\n    return e\n  })\n\n  // Sort events by time ascending\n  // Some times can be null, sort them at the bottom (will be displayed as pending)\n  events.sort((a, b) => {\n    if (!b.when) {\n      return -1\n    } else if (!a.when) {\n      return 1;\n    }\n\n    return a.when - b.when\n  })\n\n  return events\n}\n\nconst Duration = ({duration}) => {\n   return '..' + duration + 's..'\n}\n\n/* Display data from received_call   */\nconst Timeline = ({ auction }) => {\n  const events = auctionToEvents(auction)\n\n  let last = null\n\n  return <>\n    <div className=\"form-section timeline\">\n      <div className=\"form-section-header\">Timeline</div>\n      <DataRows>\n        {events.map((e, i) => {\n          //e.when might be null (end_date when call has not yet completed)\n          const diff = last && e.when ? parseInt((e.when - last)/1000) : 1\n          last = e.when\n          const label = e.when\n              ? diff > 0 ? <DateFormatter value={e.when} format=\"hh:mm:ss\" /> : \"\"\n              : <i>pending</i>\n\n          return <DataRow label={label} key={i}>\n            <div>\n              <span id={e.id}>{e.icon && <FaIcon className=\"me-2\" icon={e.icon} />}{e.label}</span>\n              {e.description && <HelpPopper name={e.id} iconClass=\"ms-2\">{e.description}</HelpPopper>}\n            </div>\n          </DataRow>\n        })}\n      </DataRows>\n\n    </div>\n  </>\n}\n\nexport default Timeline;\n","import React from 'react';\nimport {\n Button, Form, FormGroup, Label, Input, Row, Col,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\n\n\nconst MatchFilters = ({ buyers, brokers, filters, onChange, resultCount, total }) => {\n\n  const handleFilterBroker = (e) => onChange({ ...filters, broker: e.target.value });\n\n  const handleFilterBuyer = (e) => onChange({ ...filters, buyer: e.target.value });\n\n  const clearFilters = () => onChange({});\n\n  if (!buyers.length && !brokers.length) {\n    return null;\n  }\n\n  return (\n    <div className=\"match-filters mb-3\">\n      <Row className=\"d-flex align-items-center\">\n        <Col sm={12}>\n\n          <Row className=\"align-items-center\">\n            {buyers.length > 0 && (\n              <Col sm={5}>\n                <FormGroup row className=\"form-group align-items-center\">\n                  <Label sm={2} className=\"me-2\">Buyer</Label>\n                  <Col>\n                    <Input\n                      type=\"select\"\n                      value={filters.buyer || ''}\n                      name=\"buyer\"\n                      onChange={handleFilterBuyer}\n                      bsSize=\"sm\"\n                    >\n                      <option value=\"\">any</option>\n                      {buyers.map((buyer, i) => <option value={buyer} key={i}>{buyer}</option>)}\n                    </Input>\n                  </Col>\n\n                </FormGroup>\n              </Col>\n            )}\n\n            {brokers.length > 0 && (\n              <Col sm={5}>\n                <FormGroup row className=\"form-group ms-3\">\n                  <Label sm={2} className=\"me-2\">Broker</Label>\n                  <Input\n                    type=\"select\"\n                    value={filters.broker || ''}\n                    name=\"broker\"\n                    onChange={handleFilterBroker}\n                    bsSize=\"sm\"\n                  >\n                    <option value=\"\">any</option>\n                    {brokers.map((broker, i) => <option value={broker} key={i}>{broker}</option>)}\n                  </Input>\n                </FormGroup>\n              </Col>\n\n            )}\n\n            <Col>\n              <Button className=\"inline ms-3\" color=\"link\" size=\"xs\" onClick={clearFilters}>Clear Filters</Button>\n            </Col>\n          </Row>\n\n\n\n         </Col>\n      </Row>\n\n      {resultCount < total && (\n        <div className=\"filter-count\">\n          FILTERED: showing {resultCount} of {total} matches\n        </div>\n      )}\n\n    </div>\n\n  );\n};\n\nexport default MatchFilters;\n\nMatchFilters.propTypes = {\n  brokers: PropTypes.array.isRequired,\n  buyers: PropTypes.array.isRequired,\n  filters: PropTypes.object.isRequired,\n  onChange: PropTypes.func.isRequired,\n  resultCount: PropTypes.number.isRequired,\n  total: PropTypes.number.isRequired\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {MoneyFormatter} from \"../../../Components/Table/Table\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {DataRows, DataRow} from \"../../../Components\";\n\n/* Display data from received_call   */\nconst BiddingLog = ({ auction }) => (\n  <>\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Exclusive Bidding Decisions</div>\n\n        {auction.logs?.exclusive_bidding && (\n          <DataRows noDivider>\n            <DataRow label=\"Exclusive Estimate\">\n              {<MoneyFormatter value={auction.logs.exclusive_bidding.exclusive_estimate} />}\n            </DataRow>\n            {auction.logs.exclusive_bidding.exclusive_explanation && <DataRow label=\"Exclusive Explanation\">\n              <div>\n                <pre>{auction.logs.exclusive_bidding.exclusive_explanation}</pre>\n              </div>\n            </DataRow>}\n\n            <DataRow label=\"Shared Estimate\">\n                {<MoneyFormatter value={auction.logs.exclusive_bidding.shared_estimate} />}\n            </DataRow>\n\n            <DataRow label=\"Shared Explanation\">\n              <div>\n                <pre>{auction.logs.exclusive_bidding.shared_explanation}</pre>\n              </div>\n            </DataRow>\n          </DataRows>\n        )}\n\n        {!auction.logs?.exclusive_bidding && <StandardAlert color=\"light\">\n          No exclusive bidding decisions were made.\n        </StandardAlert>}\n\n        {auction.logs?.selling && <div className=\"mt-2\">\n          <div className=\"form-section-header\">Selling Decisions</div>\n          <pre>{auction.logs.selling}</pre>\n        </div>}\n\n      </div>\n  </>\n)\n\nBiddingLog.propTypes = {\n  auction: PropTypes.object,\n}\n\nexport default BiddingLog;\n","import React, {useState} from 'react';\nimport PropTypes from 'prop-types';\nimport EntityLinks from \"./EntityLinks\";\nimport {Button, Spinner} from \"reactstrap\";\nimport classnames from 'classnames';\nimport useApi from \"../../../Hooks/useApi\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { faThumbsDown, faSkullCrossbones } from '@fortawesome/free-solid-svg-icons'\n\nconst MatchingLog = ({ auction, onShowRouting }) => {\n  const orders = auction.logs?.matching?.candidates || []\n  // Note: on dev and staging, the accounts and orders might not be resolved\n  // because the auction data is from production.\n\n  return <>\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Matching Decisions</div>\n\n      <p>This auction attempted to match to the following {orders.length} orders:</p>\n\n      <table className=\"table table-bordered\">\n        <thead>\n          <tr>\n            <th>Account</th>\n            <th>Order</th>\n            <th className=\"text-center\">Matches</th>\n            <th className=\"text-center\">Bids</th>\n          </tr>\n        </thead>\n        <tbody>\n        {orders.map((cl, i) => {\n          return <tr key={i}>\n\n            <td>{cl.account?.name ? (\n              <>{cl.account?.name} <EntityId id={cl.account.id} /></>\n            ) : (\n              <i>unknown account</i>\n              )}\n            </td>\n\n            <td>\n              {cl.order?.name ? (\n                  <EntityLinks\n                    entityId={cl.order.id}\n                    accountId={cl.account.id}\n                    label={<span>{cl.order.name} <EntityId id={cl.order.id} /></span>}\n                    linkPath={`/accounts/${cl.account.id}/order/${cl.order.id}/rules`}\n                    routingFilter=\"orderId\"\n                    openRoutingModal={onShowRouting}\n                    className=\"justify-content-between\"\n                  />\n                ) : (\n                  <i>unknown order</i>\n                )}\n\n            </td>\n\n            <td className=\"text-center\">{auction.matches?.filter(m => m.order?.id === cl.order?.id).length || 0}</td>\n            <td className=\"text-center\">{auction.matches?.filter(m => m.order?.id === cl.order?.id && m.bid).length || 0}</td>\n            <td><span className=\"small text-center\">{cl.eval_time}ms</span> <br/><CandidateLog log={cl} /></td>\n          </tr>\n        })}\n        </tbody>\n\n      </table>\n\n    </div>\n  </>\n}\n\nconst CandidateLog = ({log}) => {\n  const { api } = useApi();\n  const [loading, setLoading] = useState(false);\n  const [matchable, setMatchable] = useState();\n\n  const onClick = () => loadDetails(log.matchable_id);\n\n\n  const loadDetails = async (matchableId) => {\n    setLoading(true)\n    let result = await api.endpoints.debug.matchables(matchableId, {minimal: true})\n\n    if (result) {\n      result = result.rules[0] // this is to remove the account-level rule which currently is not being used\n      adjustLog(result, log)\n      setMatchable(result)\n    } else {\n      notify(`Unable to load matchable details: ${api.error.name}`, 'error')\n    }\n\n    setLoading(false)\n  }\n\n  return <>\n    {loading && <Spinner size={\"sm\"} />}\n    {matchable && <div className={\"match-tree\"}>\n      <Tree node={matchable}/>\n    </div>}\n    {!matchable && <Button onClick={onClick} color=\"link\" size=\"xs\" className=\"text-nowrap inline\">\n      match log\n    </Button>}\n  </>\n}\n\nconst adjustLog = (matchable, matchLog, onlyMatched = false) => {\n  const ruleLog = matchLog.rules.find(el => el.rule_id === matchable.id)\n  if (ruleLog) {\n    matchable.matched = true\n    Object.assign(matchable, ruleLog)\n  } else {\n    //matchable.rules = [] // if no match, no point in getting into children\n  }\n  if (matchable.rules) {\n    matchable.rules.map(el => {\n      adjustLog(el, matchLog)\n    })\n    if (onlyMatched) {\n      matchable.rules = matchable.rules.filter(el => el.matched)\n    }\n  }\n}\n\nconst Tree = ({node}) => {\n  return <><span className={classnames({rule: true, matched: node.matched, 'no-match': !node.matched, blocked: node.blocked})}>{node.label ?? '-'}</span>\n    {!node.blocked && <>{node.matched ? <FaIcon icon={'check'} size=\"sm\" color={'green'} className=\"ms-1\" title=\"Matched\" /> : <><FaIcon size=\"sm\" icon=\"ban\" className=\"ms-1\" title=\"rule condition did not match lead data\" /> </>}</>}\n    {node.blocked && <><FaIcon icon={faThumbsDown} size=\"sm\" color={'red'} className=\"ms-1\" /> Blocked because: {node.message}</>}\n    {node.dead_end && <><FaIcon icon={faSkullCrossbones} size=\"sm\" color={'red'} className=\"ms-1\" /> Dead-End – missing: {node.dead_end_reasons.join(', ')}</>}\n    {node.rules && !node.blocked && <ul>{node.rules?.map((rule, i) => {\n      return <li key={i}><Tree node={rule} /></li>\n    })}</ul>}\n  </>\n}\n\nMatchingLog.propTypes = {\n  auction: PropTypes.object,\n  onShowRouting: PropTypes.func\n}\n\nexport default MatchingLog;\n","import React, { useState } from 'react';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames';\nimport { tokenToWords } from '../../../utils/string';\n\ntype RoutingVerdict =\n  | 'matched_include'\n  | 'condition_unmet'\n  | 'excluded'\n  | 'not_included'\n  | 'no_flow';\n\ntype RoutingDecision = {\n  stage: string;\n  rule_id?: number;\n  rule_label?: string;\n  verdict: RoutingVerdict;\n  reason?: string;\n};\n\ntype RouteDecision = {\n  channel_id: number;\n  channel_name?: string;\n  included: boolean;\n  decisions?: RoutingDecision[];\n};\n\nexport type RoutingLogData = {\n  vendor_id: number;\n  vendor_name?: string;\n  source_id: number;\n  source_name?: string;\n  route_found: boolean;\n  linear?: RoutingDecision[];\n  routes?: RouteDecision[];\n  included: boolean;\n};\n\ntype RoutingLogProps = {\n  routingLog?: RoutingLogData;\n};\n\nconst verdictIcon = (verdict: RoutingVerdict) => {\n  switch (verdict) {\n    case 'matched_include':\n      return <FaIcon icon=\"check\" size=\"sm\" color=\"green\" className=\"ms-1\" title=\"Included\" />;\n    case 'excluded':\n      return <FaIcon icon=\"times-circle\" size=\"sm\" color=\"red\" className=\"ms-1\" title=\"Explicitly excluded by this rule\" />;\n    case 'condition_unmet':\n      return <FaIcon icon=\"ban\" size=\"sm\" className=\"ms-1\" title=\"Lead data did not satisfy this rule's conditions\" />;\n    case 'not_included':\n      return <FaIcon icon=\"ban\" size=\"sm\" className=\"ms-1\" title=\"This rule never opted the lead in\" />;\n    case 'no_flow':\n    default:\n      return <FaIcon icon=\"question-circle\" size=\"sm\" className=\"ms-1\" title=\"No rule configured for this stage\" />;\n  }\n};\n\n/* One linear-path or per-route stage verdict (platform/vendor/source/channel_eligibility/channel) */\nconst DecisionRow = ({ decision }: { decision: RoutingDecision }) => (\n  <li className={classnames('rule', {\n    matched: decision.verdict === 'matched_include',\n    'no-match': decision.verdict === 'condition_unmet' || decision.verdict === 'not_included' || decision.verdict === 'no_flow',\n    blocked: decision.verdict === 'excluded',\n  })}\n  >\n    <span>{tokenToWords(decision.stage)}</span>\n    {decision.rule_label && <span className=\"text-muted\"> &ndash; {decision.rule_label}{decision.rule_id ? ` (#${decision.rule_id})` : ''}</span>}\n    {verdictIcon(decision.verdict)}\n    <span className=\"small text-muted ms-1\">{tokenToWords(decision.verdict)}</span>\n    {decision.reason && <div className=\"small text-muted\">{decision.reason}</div>}\n  </li>\n);\n\n/* One channel eligibility (\"route\") - expandable to see which of its 2 stages excluded the lead */\nconst RouteRow = ({ route }: { route: RouteDecision }) => {\n  const [expanded, setExpanded] = useState(false);\n  const hasDecisions = (route.decisions?.length ?? 0) > 0;\n\n  return (\n    <li className={classnames('rule', { matched: route.included, 'no-match': !route.included })}>\n      {hasDecisions ? (\n        <Button color=\"link\" size=\"sm\" className=\"p-0 inline\" onClick={() => setExpanded(!expanded)}>\n          <FaIcon icon={expanded ? 'chevron-down' : 'chevron-right'} size=\"sm\" className=\"me-1\" />\n          {route.channel_name || `Channel #${route.channel_id}`}\n        </Button>\n      ) : (\n        <span>{route.channel_name || `Channel #${route.channel_id}`}</span>\n      )}\n      {route.included\n        ? <FaIcon icon=\"check\" size=\"sm\" color=\"green\" className=\"ms-1\" title=\"Eligible\" />\n        : <FaIcon icon=\"ban\" size=\"sm\" className=\"ms-1\" title=\"Not eligible\" />}\n      {expanded && hasDecisions && (\n        <ul>\n          {route.decisions?.map((d, i) => <DecisionRow decision={d} key={i} />)}\n        </ul>\n      )}\n    </li>\n  );\n};\n\n/*\n * Visualizes routing.RoutingLog (auction.logs.routing): the stage-by-stage trace of why\n * routing did or didn't include a lead for each of a source's channels. Always present\n * (every auction resolves channel eligibility, not only a \"routing_block\"), so this shows\n * which channels were eligible and why even when the auction matched normally.\n */\nconst RoutingLog = ({ routingLog }: RoutingLogProps) => {\n  if (!routingLog) {\n    return null;\n  }\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Routing Decisions</div>\n\n      {!routingLog.route_found ? (\n        <i>No route configured for source {routingLog.source_name || routingLog.source_id} / vendor {routingLog.vendor_name || routingLog.vendor_id}.</i>\n      ) : (\n        <RoutingTree routingLog={routingLog} />\n      )}\n    </div>\n  );\n};\n\nconst RoutingTree = ({ routingLog }: { routingLog: RoutingLogData }) => {\n  const linear = routingLog.linear || [];\n  const blockedAt = linear.find((d) => d.verdict !== 'matched_include');\n  const routes = routingLog.routes || [];\n\n  return (\n    <div className=\"routing-tree\">\n      <ul className=\"list-unstyled mb-2\">\n        {linear.map((d, i) => <DecisionRow decision={d} key={i} />)}\n      </ul>\n\n      {!blockedAt && routes.length > 0 && (\n        <>\n          <div className=\"small text-muted mb-1\">\n            {routes.filter((r) => r.included).length} of {routes.length} channel(s) eligible:\n          </div>\n          <ul className=\"list-unstyled\">\n            {routes.map((r, i) => <RouteRow route={r} key={i} />)}\n          </ul>\n        </>\n      )}\n    </div>\n  );\n};\n\nexport default RoutingLog;\n","import React, { useState, useEffect } from 'react';\nimport { Badge } from \"reactstrap\";\nimport { parseRequest } from \"@thedmsgroup/mastodon-ui-components/lib/components/HttpLog/parser\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport HttpLog from \"./HttpLog\";\nimport LoaderDots from \"../../../Layout/LoaderDots\";\n\n// Ordered: first match wins. Most-specific patterns first so overlapping\n// substrings (pingpost/ping/post, click-redirects/clicks) resolve correctly.\nconst LOG_LABELS = [\n  { pattern: 'pingpost', label: 'Post' },\n  { pattern: 'click-redirects', label: 'Click Redirect' },\n  { pattern: 'clicks', label: 'Click' },\n  { pattern: 'ad-images', label: 'Impression' },\n  { pattern: 'calls', label: 'Incoming Call' },\n  { pattern: 'ping', label: 'Ping' },\n  { pattern: 'post', label: 'Direct Post' },\n];\n\nconst getLogLabel = (log) => {\n  if (!log?.request) return null;\n  const { uri = '' } = parseRequest(log.request);\n  const match = LOG_LABELS.find(({ pattern }) => uri.includes(pattern));\n  return match ? match.label : null;\n};\n\n// Source label derived from the request User-Agent header (case-insensitive).\nconst SOURCE_LABELS = [\n  { pattern: 'impressure', label: 'From Impressure' },\n  { pattern: 'mastodon', label: 'From Mastodon' },\n  { pattern: 'sellery', label: 'From Sellery' },\n];\n\nconst getLogSource = (log) => {\n  if (!log?.request) return null;\n  const { headers = {} } = parseRequest(log.request);\n  const ua = (headers['User-Agent'] || '').toLowerCase();\n  const match = SOURCE_LABELS.find(({ pattern }) => ua.includes(pattern));\n  return match ? match.label : null;\n};\n\nconst HttpLogs = ({ auctionId }) => {\n  const { api } = useApi();\n  const [logs, setLogs] = useState(null);\n  const [loading, setLoading] = useState(false);\n\n  const loadLogs = async (auctionId) => {\n    setLoading(true)\n    const result = await api.endpoints.debug.auctionHttpLogs(auctionId);\n\n    if (result?.http_logs) {\n      setLogs(result.http_logs.sort((a, b) => {\n        return a.sent_at > b.sent_at ? 1 : -1\n      }))\n    } else {\n      setLogs(false)\n      notify(`Unable to load http logs: ${api.error.name}`, 'error')\n    }\n\n    setLoading(false)\n  }\n\n  useEffect(() => {\n    loadLogs(auctionId)\n  }, [auctionId])\n\n  return <div className=\"form-section delivery flex-grow-1\">\n    <LoaderDots active={loading} width={160} />\n    {logs && logs.map(log => {\n      const label = getLogLabel(log)\n      const source = getLogSource(log)\n      return <div className={\"mb-4\"} key={log.request_id}>\n        {label && <Badge color=\"info\" className=\"mb-2 me-2\">{label}</Badge>}\n        {source && <Badge color=\"warning\" className=\"mb-2\">{source}</Badge>}\n        <HttpLog log={log} />\n      </div>\n    })}\n    {logs === false && <div>Http logs are only retained for 7 days...</div>}\n  </div>\n}\n\nexport default HttpLogs\n","import {Modal, ModalBody, ModalHeader} from \"reactstrap\";\nimport React, {useEffect, useState} from \"react\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {JsonDisplay} from \"@thedmsgroup/mastodon-ui-components\";\n\nexport const MatchableModal = ({ matchableId, isOpen, cancel }) => {\n  const {api} = useApi()\n  const [matchable, setMatchable] = useState(\"\")\n\n  const loadMatchable = async (id) => {\n    let result = await api.endpoints.debug.matchables(id)\n    setMatchable(result)\n  }\n  useEffect(() => {\n    if (matchableId) {\n      loadMatchable(matchableId)\n    }\n  }, [matchableId]);\n\n  return <Modal isOpen={isOpen} toggle={cancel} size=\"lg\">\n    <ModalHeader toggle={cancel}>Matchable {matchableId}</ModalHeader>\n    <ModalBody>\n      <JsonDisplay data={matchable} />\n    </ModalBody>\n  </Modal>\n}\n","import React, { useEffect, useState, useCallback } from 'react';\nimport {\n  Row, Col, TabContent, TabPane, Nav, NavLink, NavItem,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {faBrain} from \"@fortawesome/free-solid-svg-icons\";\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\nimport { titleCase } from '../../../utils/string';\nimport Match from './Match';\nimport Deliveries from './Deliveries';\nimport Lead from './Lead';\nimport Call from './Call';\nimport Timeline from './Timeline';\nimport MatchFilters from './MatchFilters';\nimport LoaderDots from '../../../Layout/LoaderDots';\nimport useApi from '../../../Hooks/useApi';\nimport usePermission from '../../../Hooks/usePermission';\nimport { isHouse, isBuyerPool, sumLegs } from './FundingBreakdown';\nimport { MoneyFormatter } from '../../../Components/Table/Table';\nimport './styles.scss';\nimport {matchSorter} from \"match-sorter\";\nimport BiddingLog from \"./BiddingLog\";\nimport MatchingLog from \"./MatchingLog\";\nimport RoutingLog from \"./RoutingLog\";\nimport {StandardAlert, JsonDisplay, RelativeTime, Stack} from '@thedmsgroup/mastodon-ui-components';\nimport RoutingModal from \"../../Routing/Mapper/Modal\";\nimport EntityLinks from \"./EntityLinks\";\nimport HttpLogs from \"./HttpLogs\";\nimport usePagedTableState from \"../../../Hooks/usePagedTableState\";\nimport {MatchableModal} from \"./MatchableModal\";\nimport Block from \"./Block\";\nimport {Link} from \"react-router-dom\";\n\nexport const permaLink = (auctionId) => `${location.protocol}//${location.host}/#/reports/auction/${auctionId}`\n\n/*\n * Auction detail view\n * Partitions auction data into formatted sections.\n * Can be used inside routed page view, or modal view from calls & leads lists.\n */\nconst Auction = ({\n                   auction_id,\n                   timezone = 'UTC',\n                   defaultTab='matches',\n                   onChangeFilters,\n                   useQueryString=true\n}) => {\n  const { api } = useApi();\n  const {\n    filters, setFilters, updateQuery\n  } = usePagedTableState(\n    undefined,\n    undefined,\n    {\n      useQueryString: useQueryString,\n      useTableControls: false,\n      restrict:['delivery']\n    },\n  );\n  const [loading, setLoading] = useState(true);\n  const [auction, setAuction] = useState(null);\n  const [auctionJSON, setAuctionJSON] = useState(null);\n  const [activeTab, _setActiveTab] = useState(filters.delivery ? 'deliveries' : defaultTab);\n  const [httpLogsShown, setHttpLogsShown] = useState(false);\n  const [filteredMatches, setFilteredMatches] = useState([]);\n  const [matchFilters, setMatchFilters] = useState({});\n  const [buyers, setBuyers] = useState([]);\n  const [brokers, setBrokers] = useState([]);\n  const[routingModalFilters, setRoutingModalFilters] = useState({});\n  const [matchableId, setMatchableId] = useState(null);\n  const [arbSellingAuctionId, setArbSellingAuctionId] = useState(null);\n  const [arbSellingLoading, setArbSellingLoading] = useState(false);\n  // promotion id -> name for the funding breakdown; the auction document only carries ids\n  const [promotionNames, setPromotionNames] = useState({});\n  const canViewPromotions = usePermission('promotions.view');\n\n  // the purpose of this is to only load http logs when the tab is selected, and keep it around once loaded (avoid double loads)\n  const setActiveTab = tab => {\n    if (tab === 'http_logs') {\n      setHttpLogsShown(true);\n    }\n    _setActiveTab(tab)\n  }\n\n  const openRoutingModal = useCallback((filters={}) => {\n    setRoutingModalFilters(filters);\n  }, []);\n\n  const closeRoutingModal = () => setRoutingModalFilters({});\n\n  // on change auction_id (navigation, manually entering new auction id)\n  useEffect(() => {\n    if (auction_id) {\n      load();\n    }\n\n    return () => {\n      setAuction(null);\n      setLoading(true);\n      setArbSellingAuctionId(null);\n      setArbSellingLoading(false);\n      setPromotionNames({});\n    };\n  }, [auction_id]);\n\n  useEffect(() => {\n    onChangeFilters && onChangeFilters(filters);\n  }, [filters])\n\n  const load = async () => {\n    const result = await api.endpoints.debug.auctions(auction_id);\n    // If not found, result could be: {\"auction\":[],\"json\":null}\n    if (result && result.auction && !Array.isArray(result.auction)) {\n      if (!result.auction.matches) {\n        result.auction.matches = []\n      }\n      if (!result.auction.deliveries) {\n        result.auction.deliveries = []\n      }\n\n      // Choices for filtering\n      const matchBrokers = [];\n      const matchBuyers = [];\n      result.auction.matches.forEach((match) => {\n        if (match.broker && !matchBrokers.includes(match.broker)) {\n          matchBrokers.push(match.broker);\n        }\n        if (match.buyer && !matchBuyers.includes(match.buyer)) {\n          matchBuyers.push(match.buyer);\n        }\n      });\n\n      setBrokers(matchBrokers);\n      setBuyers(matchBuyers);\n      setFilteredMatches(result.auction.matches);\n\n      setAuction(result.auction);\n      setAuctionJSON(JSON.parse(result.json));\n\n      // If this auction arbitrated (lead carries an arb_auction_id), find the\n      // arb selling auction: the auction whose parent is this one.\n      const arbAuctionId = result.auction.lead?.reduce((found, block) => found || block?.data?.arb_auction_id, null);\n      if (arbAuctionId) {\n        loadArbSellingAuction(result.auction);\n      }\n\n      if (canViewPromotions && summarizePromotions(result.auction.matches).resolved > 0) {\n        loadPromotionNames();\n      }\n    } else {\n      console.log('Unable to load auction data', api.error);\n    }\n    setLoading(false);\n  };\n\n  // Query the auctions list endpoint for the child auction whose parent is the\n  // current auction. Scoped to a window around started_at so old auctions still match.\n  const loadArbSellingAuction = async (auctionData) => {\n    setArbSellingLoading(true);\n    const started = auctionData.started_at ? new Date(auctionData.started_at) : new Date();\n    const dayMs = 24 * 60 * 60 * 1000;\n    const result = await api.endpoints.debug.auctionsList({\n      parent_auction_id: [auction_id],\n      product: 'clicks',\n      after: new Date(started.getTime() - dayMs).toISOString(),\n      before: new Date(started.getTime() + dayMs).toISOString(),\n      version: 2,\n      page: 1,\n      per_page: 1,\n    });\n    const hits = result?.auctions?.hits ?? [];\n    setArbSellingAuctionId(hits[0]?.auction_id ?? null);\n    setArbSellingLoading(false);\n  };\n\n  // One small list for the whole auction rather than a fetch per leg. The options\n  // endpoint needs promotions.view (the caller checks) and leaves out archived\n  // promotions, which then fall back to \"Promotion #id\" in the breakdown.\n  const loadPromotionNames = async () => {\n    const options = await api.endpoints.promotions.options();\n    if (Array.isArray(options)) {\n      setPromotionNames(Object.fromEntries(options.map((o) => [o.id, o.name])));\n    }\n  };\n\n  const handleChangeMatchFilters = (filters) => {\n    let matches = [...auction.matches];\n\n    if (filters.buyer) {\n      matches = matchSorter(matches, filters.buyer, {\n        keys: ['buyer'],\n        threshold: matchSorter.rankings.CONTAINS,\n        sorter: (items) => items, // disabled match sorting\n      });\n    }\n    if (filters.broker) {\n      matches = matchSorter(matches, filters.broker, {\n        keys: ['broker'],\n        threshold: matchSorter.rankings.CONTAINS,\n        sorter: (items) => items, // disabled match sorting\n      });\n    }\n    setFilteredMatches(matches);\n    setMatchFilters(filters);\n  };\n\n  const handleDeliverySelect = (id) => {\n    setActiveTab(\"deliveries\")\n    setFilters({...filters, delivery:id})\n    updateQuery();\n  }\n\n  return (\n\n    <div className=\"auction-detail d-flex\">\n\n      <LoaderDots active={loading} width={160} />\n\n      {!auction && !loading && (\n      <div className=\"flex-fill\">\n        <StandardAlert color=\"light\">Unable to load auction</StandardAlert>\n      </div>\n      )}\n\n      {auction && !loading && (\n\n      <>\n        <div className=\"overview\">\n          <div className=\"d-flex flex-column\">\n\n            <CountDisplay counts={auction.counts} matches={auction.matches} deliveries={auction.deliveries} gotoTab={setActiveTab} />\n\n            {auction.parent_auction_id && <div className=\"ov-pod\">\n              <div className=\"label\">Parent Auction</div>\n              <div>\n                <Link target=\"_blank\"\n                to={permaLink(auction.parent_auction_id)}\n                color='link'\n                className='inline'\n              >\n                  ...{auction.parent_auction_id.substring(auction.parent_auction_id.length - 26)} <FaIcon icon=\"external-link-alt\" size=\"sm\" />\n              </Link>\n              </div>\n            </div>}\n\n            {(() => {\n              const arbAuctionId = auction.lead?.reduce((found, block) => found || block?.data?.arb_auction_id, null);\n              if (!arbAuctionId) return null;\n              return (\n                <>\n                  <div className=\"ov-pod\">\n                    <div className=\"label\">Arb Bidding Auction</div>\n                    <div>\n                      <Link target=\"_blank\"\n                        to={permaLink(arbAuctionId)}\n                        color='link'\n                        className='inline'\n                      >\n                        ...{arbAuctionId.substring(Math.max(0, arbAuctionId.length - 26))} <FaIcon icon=\"external-link-alt\" size=\"sm\" />\n                      </Link>\n                    </div>\n                  </div>\n                  <div className=\"ov-pod\">\n                    <div className=\"label\">Arb Selling Auction</div>\n                    <div>\n                      {arbSellingLoading ? (\n                        <LoaderDots active width={40} />\n                      ) : arbSellingAuctionId ? (\n                        <Link target=\"_blank\"\n                          to={permaLink(arbSellingAuctionId)}\n                          color='link'\n                          className='inline'\n                        >\n                          ...{arbSellingAuctionId.substring(Math.max(0, arbSellingAuctionId.length - 26))} <FaIcon icon=\"external-link-alt\" size=\"sm\" />\n                        </Link>\n                      ) : (\n                        'none'\n                      )}\n                    </div>\n                  </div>\n                </>\n              );\n            })()}\n\n            <PromotionsPod matches={auction.matches} />\n\n            <div className=\"ov-pod\">\n              <div className=\"label\">Vertical</div>\n              <div>{auction.vertical.name}</div>\n            </div>\n\n            <div className=\"ov-pod\">\n              <div className=\"label\">Product</div>\n              <div>{titleCase(auction.product)}</div>\n            </div>\n\n            <div className=\"ov-pod\">\n              <div className=\"label\">Source</div>\n              <div>\n                {auction.source ? (\n                  <EntityLinks\n                    entityId={auction.source.id}\n                    label={auction.source.name}\n                    linkPath={`/routing/source/${auction.source.id}/rules`}\n                    routingFilter=\"sourceId\"\n                    openRoutingModal={openRoutingModal}\n                    title=\"Source Routing Rules\"\n                  />\n                ) : (\n                  <i>unknown</i>\n                )}\n              </div>\n            </div>\n\n            <div className=\"ov-pod\">\n              <div className=\"label\">Vendor</div>\n              <div>{auction.vendor?.name || <i>unknown</i>}</div>\n            </div>\n\n            <div className=\"ov-pod\">\n              <div className=\"label\">\n                Start\n              </div>\n              <div>\n                <RelativeTime date={auction.started_at}/>\n              </div>\n            </div>\n\n            <div className=\"ov-pod\">\n              <div className=\"label\">Timezone</div>\n              <div>{auction.timezone}</div>\n            </div>\n\n            <div className=\"ov-pod\">\n              <div className=\"label\">App Version</div>\n              <div>{auction.app_version}</div>\n            </div>\n\n            {auction.feature_flags &&\n            <div className=\"ov-pod\">\n              <div className=\"label\">Feature Flags</div>\n                {auction.feature_flags?.length > 0 ? (\n                  <ul className=\"list-unstyled\">\n                    {auction.feature_flags.map((flag, i) => <li key={i}>{flag}</li>)}\n                  </ul>\n                ) : (\n                  <i>none</i>\n                )}\n\n            </div>}\n\n            {auction.limit &&\n            <div className=\"ov-pod\">\n              <div className=\"label\">Limit</div>\n              {auction.limit}\n            </div>}\n\n            {auction.include_buyers && auction.include_buyers.length > 0 &&\n            <div className=\"ov-pod\">\n              <div className=\"label\">Include Buyers</div>\n              <ul className={\"list-unstyled\"}>\n                {auction.include_buyers.map((buyer, i) => <li key={i}>{buyer}</li>)}\n              </ul>\n            </div>}\n\n            {auction.exclude_buyers && auction.exclude_buyers.length > 0 &&\n            <div className=\"ov-pod\">\n              <div className=\"label\">Exclude Buyers</div>\n              <ul className={\"list-unstyled\"}>\n                {auction.exclude_buyers.map((buyer, i) => <li key={i}>{buyer}</li>)}\n              </ul>\n            </div>}\n\n          </div>\n        </div>\n\n        <div className=\"auction-subnav\">\n          <Nav className=\"auction-subnav d-flex flex-column flex-fill\">\n\n            <AuctionNavItem\n              tabId=\"matches\"\n              isActive={activeTab === 'matches'}\n              onClick={() => setActiveTab('matches')}\n              label=\"Matches & Bids\"\n              icon=\"comment-dollar\"\n            />\n\n            <AuctionNavItem\n              tabId=\"matching_log\"\n              isActive={activeTab === 'matching_log'}\n              onClick={() => setActiveTab('matching_log')}\n              label=\"Matching Log\"\n              icon={faBrain}\n            />\n\n            <AuctionNavItem\n              tabId=\"bidding_log\"\n              isActive={activeTab === 'bidding_log'}\n              onClick={() => setActiveTab('bidding_log')}\n              label=\"Bidding Log\"\n              icon=\"comment-dollar\"\n            />\n\n            <AuctionNavItem\n              tabId=\"deliveries\"\n              isActive={activeTab === 'deliveries'}\n              onClick={() => setActiveTab('deliveries')}\n              label=\"Deliveries\"\n              icon=\"envelope\"\n            />\n\n            <AuctionNavItem\n              tabId=\"lead\"\n              isActive={activeTab === 'lead'}\n              onClick={() => setActiveTab('lead')}\n              label=\"Lead\"\n              icon=\"id-card\"\n            />\n\n            {auction.product === 'calls' && (\n            <AuctionNavItem\n              tabId=\"call\"\n              isActive={activeTab === 'call'}\n              onClick={() => setActiveTab('call')}\n              label=\"Call\"\n              icon=\"phone\"\n            />\n            )}\n\n            <AuctionNavItem\n              tabId=\"timeline\"\n              isActive={activeTab === 'timeline'}\n              onClick={() => setActiveTab('timeline')}\n              label=\"Timeline\"\n              icon=\"stopwatch\"\n            />\n\n            <AuctionNavItem\n              tabId=\"json\"\n              isActive={activeTab === 'json'}\n              onClick={() => setActiveTab('json')}\n              label=\"JSON\"\n              icon=\"cog\"\n            />\n\n            <AuctionNavItem\n              tabId=\"http_logs\"\n              isActive={activeTab === 'http_logs'}\n              onClick={() => setActiveTab('http_logs')}\n              label=\"HTTP Logs\"\n              icon=\"envelope\"\n            />\n\n          </Nav>\n        </div>\n\n        <div className=\"auction-section ms-3 flex-fill\">\n\n          <TabContent activeTab={activeTab}>\n\n            <TabPane tabId=\"matches\" className=\"\">\n              <div className=\"auction-matches\">\n                {auction.matches?.length > 0 ? (\n                  <>\n                    <MatchFilters\n                      buyers={buyers}\n                      brokers={brokers}\n                      filters={matchFilters}\n                      onChange={handleChangeMatchFilters}\n                      resultCount={filteredMatches.length}\n                      total={auction.matches.length}\n                    />\n                    {filteredMatches.map((match, i) => <Match\n                        {...match}\n                        product={auction.product}\n                        promotionNames={promotionNames}\n                        key={i}\n                        onSelectDelivery={handleDeliverySelect}\n                        onShowRouting={openRoutingModal}\n                        onShowMatchable={setMatchableId}\n                        onReturnRequested={load}\n                      />\n                    )}\n                  </>\n                ) : (\n                  <div>\n                    <p>\n                      This auction has no matches\n                    </p>\n                    {auction.blocks?.length > 0  && (\n                      <div >\n                        <h5>Auction Blocks</h5>\n                        <Row>\n                          <Col sm={12} md={8} lg={6}>\n                            <Stack>\n                              {auction.blocks.map((b, i) => <Block {...b} key={i}/>)}\n                            </Stack>\n                          </Col>\n                        </Row>\n                      </div>\n                    )}\n\n                  </div>\n                )}\n              </div>\n            </TabPane>\n\n            <TabPane tabId=\"deliveries\" className=\"deliveries\">\n              {auction && <Deliveries\n                deliveryOptions={auction.deliveries}\n                selectedDeliveryId={filters.delivery}\n                onSelect={handleDeliverySelect}\n              />}\n            </TabPane>\n\n            <TabContent activeTab={activeTab}>\n              <TabPane tabId=\"lead\" className=\"\">\n                <Lead\n                  lead={auction.lead}\n                  timezone={timezone}\n                  deliveries={auction.deliveries}\n                  gotoDelivery={handleDeliverySelect}\n                />\n              </TabPane>\n            </TabContent>\n\n            <TabPane tabId=\"call\" className=\"\">\n              <Call call={auction.received_call} ivrCall={auction.ivr_call} ivrLog={auction.ivr_log} />\n            </TabPane>\n\n            <TabPane tabId=\"timeline\">\n              <Timeline auction={auction} />\n            </TabPane>\n\n            <TabPane tabId=\"bidding_log\">\n              <BiddingLog auction={auction} />\n            </TabPane>\n\n            <TabPane tabId=\"matching_log\">\n              <RoutingLog routingLog={auction.logs?.routing} />\n              <MatchingLog auction={auction} onShowRouting={openRoutingModal} />\n            </TabPane>\n\n            <TabPane tabId=\"json\" className=\"\">\n              <JsonDisplay data={auctionJSON} />\n            </TabPane>\n\n            <TabPane tabId=\"http_logs\" className=\"http_logs\">\n              {httpLogsShown && <HttpLogs auctionId={auction.id} />}\n            </TabPane>\n\n          </TabContent>\n        </div>\n\n        <RoutingModal\n          isOpen={Object.keys(routingModalFilters).length > 0}\n          toggle={closeRoutingModal}\n          {...routingModalFilters}\n        />\n        <MatchableModal matchableId={matchableId} isOpen={matchableId} cancel={() => setMatchableId(null)} />\n      </>\n      )}\n\n    </div>\n\n  );\n};\n\nconst AuctionNavItem = React.memo(function AuctionNavItem({\n  icon, label, isActive, onClick,\n}) {\n  return (\n    <NavItem className={classnames({ active: isActive })}>\n      <NavLink\n        className={classnames({ active: isActive })}\n        onClick={onClick}\n      >\n        <FaIcon icon={icon} size=\"2x\" />\n        <div className=\"tab-label\">{label}</div>\n      </NavLink>\n    </NavItem>\n  );\n});\n\nconst CountDisplay = React.memo(function CountDisplay({\n  matches, deliveries, counts, gotoTab,\n}) {\n  const matchBlocks = matches ? matches.find((m) => m.blocks && m.blocks.length > 0) : 0;\n  const bidBlocks = matches ? matches.find((m) => m.final_bid?.blocks && m.final_bid.blocks.length > 0) : 0;\n  const dvFail = deliveries ? deliveries.find((d) => d.status === 'failed') : 0;\n\n  return (\n    <div className=\"d-flex counts justify-content-between mb-2\">\n\n      <div className=\"count d-flex flex-column\" onClick={() => gotoTab('matches')}>\n        {matchBlocks && <FaIcon icon=\"exclamation-triangle\" size=\"sm\" title=\"Has blocks\" />}\n        <div className=\"number\">{counts.matches}</div>\n        <div>{counts.matches === 1 ? 'Match' : 'Matches'}</div>\n      </div>\n\n      <div className=\"count d-flex flex-column\" onClick={() => gotoTab('matches')}>\n        {bidBlocks && <FaIcon icon=\"exclamation-triangle\" size=\"sm\" />}\n        <div className=\"number\">{counts.bids}</div>\n        <div>{counts.bids === 1 ? 'Bid' : 'Bids'}</div>\n      </div>\n\n      <div className=\"count d-flex flex-column\" onClick={() => gotoTab('matches')}>\n        <div className=\"number\">{counts.sales}</div>\n        <div>{counts.sales === 1 ? 'Sale' : 'Sales'}</div>\n      </div>\n      <div className=\"count d-flex flex-column\" onClick={() => gotoTab('deliveries')}>\n        {dvFail && <FaIcon icon=\"exclamation-triangle\" size=\"sm\" />}\n        <div className=\"number\">{counts.deliveries}</div>\n        <div>{counts.deliveries === 1 ? 'Delivery' : 'Deliveries'}</div>\n      </div>\n\n    </div>\n  );\n});\nCountDisplay.displayName = 'CountDisplay';\n\n// Roll the promotion legs across matches up for the overview. Only a bid's legs\n// were booked, so the money totals come from those; a match's own legs just mean\n// a promotion resolved for it.\nexport const summarizePromotions = (matches) => {\n  const summary = { resolved: 0, funded: 0, sponsored: 0, house: 0, buyerCredit: 0 };\n  (matches || []).forEach((match) => {\n    const bidLegs = match.bid?.funding_contributions || [];\n    const matchLegs = match.funding_contributions || [];\n    if (bidLegs.length === 0 && matchLegs.length === 0) return;\n    summary.resolved += 1;\n    if (bidLegs.length === 0) return;\n    summary.funded += 1;\n    summary.house += sumLegs(bidLegs.filter(isHouse));\n    summary.buyerCredit += sumLegs(bidLegs.filter((leg) => isBuyerPool(leg) && !isHouse(leg)));\n    summary.sponsored += sumLegs(bidLegs.filter((leg) => !isHouse(leg) && !isBuyerPool(leg)));\n  });\n  return summary;\n};\n\nconst PromotionsPod = ({ matches }) => {\n  const summary = summarizePromotions(matches);\n  if (summary.resolved === 0) return null;\n  const totals = [\n    summary.sponsored > 0 && <span key=\"sponsored\"><MoneyFormatter value={summary.sponsored} /> sponsored</span>,\n    summary.house > 0 && <span key=\"house\"><MoneyFormatter value={summary.house} /> house</span>,\n    summary.buyerCredit > 0 && <span key=\"credit\"><MoneyFormatter value={summary.buyerCredit} /> buyer credit</span>,\n  ].filter(Boolean);\n\n  return (\n    <div className=\"ov-pod promotions-pod\">\n      <div className=\"label\">Promotions</div>\n      <div>\n        {summary.funded} of {summary.resolved} {summary.resolved === 1 ? 'match' : 'matches'} funded\n      </div>\n      {totals.length > 0 && (\n        <div className=\"text-muted\">\n          {totals.map((t, i) => <React.Fragment key={i}>{i > 0 && ' · '}{t}</React.Fragment>)}\n        </div>\n      )}\n    </div>\n  );\n};\n\nPromotionsPod.propTypes = {\n  matches: PropTypes.array,\n};\n\nAuction.propTypes = {\n  auction_id: PropTypes.string,\n  timezone: PropTypes.string,\n  defaultTab: PropTypes.string,\n  useQueryString: PropTypes.bool,\n  onChangeFilters: PropTypes.func\n};\n\nexport default Auction;\n","export const ReturnStatusLabels = {\n  requested: 'Return Pending',\n  approved: 'Return Accepted',\n  denied: 'Return Denied',\n};\n\n/*\n * Badge colors for the Return Status column (DMS-1651). Kept beside the\n * labels so the two can't drift, and so the lead-detail view (DMS-1652)\n * renders the same status the same way as the list row.\n *\n * `requested` is warning rather than info deliberately: it is the only\n * status that still needs someone to act, and it is the one ops filter on.\n */\nexport const ReturnStatusColors = {\n  requested: 'warning',\n  approved: 'success',\n  denied: 'danger',\n};\n","import React from 'react';\nimport { Routes, Route } from 'react-router-dom';\nimport ProtectedRoute from '../../Components/ProtectedRoute'\nimport Lazify from '../../utils/Lazify'\n\nconst LazyChangeLog = Lazify(() => import(/* webpackChunkName: \"ChangeLog\" */ './List'));\nconst LazyChangeDetail = Lazify(() => import(/* webpackChunkName: \"ChangeLog\" */ './Change'));\n\n/*\n * Entry point to all change log routes\n */\nconst ChangeLog = () => (\n  <Routes>\n\n    <Route path=\"\" element={<ProtectedRoute permission=\"changes.view\" /> } >\n      <Route index element={<LazyChangeLog />} />\n      <Route path=\":change_id\" element={<LazyChangeDetail />} />\n    </Route>\n  </Routes>\n)\n\nexport default ChangeLog\n","import React, { useEffect, useState, useContext, useMemo } from 'react';\nimport {\n  Row,\n  Col,\n  FormGroup,\n  Input,\n  Label,\n  Button,\n  FormFeedback,\n  InputGroup,\n  Nav,\n  TabPane,\n  TabContent\n} from 'reactstrap';\nimport {BodyWrapper, FooterWrapper} from \"../../../../Components/Modal\";\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport * as Yup from 'yup';\nimport PropTypes from 'prop-types';\nimport { Required } from '../../../../Components/Form/FormCommon';\nimport useFormState from '../../../../Hooks/useFormState';\nimport LoaderDots from '../../../../Layout/LoaderDots';\nimport DynamicEnhancedSelect from \"../../../../Components/Form/DynamicEnhancedSelect\";\nimport {ChannelSources} from \"./ChannelSources\";\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport {notify, StandardAlert, Utils, TabNav} from \"@thedmsgroup/mastodon-ui-components\";\nimport EntityId from \"../../../../Components/Table/EntityId\";\nimport { ProductChoices } from '../../../../Components/Table/FilterChoices';\nimport confirm from 'reactstrap-confirm'\n\nconst ValidationSchema = Yup.object().shape({\n  name: Yup.string().trim().required('Please enter a channel name'),\n  product: Yup.string().trim().required('Please select a product'),\n  vertical_id: Yup.number().transform((n) => (isNaN(n) ? 0 : n)).moreThan(0, 'Please select a vertical'),\n  account_id: Yup.number().transform((n) => (isNaN(n) ? 0 : n)).moreThan(0, 'Please select an account'),\n});\n\nconst FormLayout = ({ isModal, children }) => {\n  if (isModal) return <>{children}</>;\n  return (\n    <Row>\n      <Col sm={12} md={10} lg={6}>\n        {children}\n      </Col>\n    </Row>\n  );\n};\n\n/*\nComponent with form for editing/creating a Channel\n */\nconst Channel = ({\n                   channelId,\n                   close,\n                   onSuccess,\n                   onOpenChannelRules,\n                   onOpenChannelSourceRules,\n                   initialTab='details',\n                   isModal\n}) => {\n  const app = useContext(AppContext);\n\n  const [activeTab, setActiveTab] = useState(initialTab )\n  const [loading, setLoading] = useState(channelId > 0)\n  const [channel, setChannel] = useState(null)\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      id: channelId ?? 0,\n      name: '',\n      description: '',\n      product: '',\n      vertical_id: 0,\n      account_id: 0,\n      status: 'active',\n      sources:[]\n    },\n    ValidationSchema,\n  )\n\n  const isNew = !channelId;\n\n  useEffect(\n    () => {\n      if (!isNew && !channel) {\n        load()\n      }\n\n    }, []);\n\n  const handleSelectAccount = (id) => formApi.setValue('account_id', id ?? \"\")\n  const handleSelectVertical = (id) => formApi.setValue('vertical_id', id ?? \"\")\n  const handleChangeSources = (sources) => formApi.setValue('sources', sources)\n\n\n  const handleSave = () => {\n    const isValid = formApi.validate()\n    if (isValid) {\n      save()\n    }\n  };\n\n  const load = async () => {\n\n    const result = await app.api.endpoints.channels.show(channelId);\n\n    if (!result) {\n      notify(`Unable to load channel: ${app.api.error.name}`, 'error')\n    } else {\n     setChannel(result); //do we need this or can we work from form?\n     formApi.setValues(result)\n    }\n    setLoading(false);\n  };\n\n  const save = async () => {\n    app.showLoader('modal', isNew ? 'Creating channel' : 'Updating channel');\n\n    const ch = { ...formValues }\n\n    //translate source picks into eligibilities\n    const channelSources = ch.sources.map((src) => {\n      return {\n        source_id: src.id,\n        channel_id: channelId,\n        status: src.eligibility.status,\n        distribution: src.eligibility.distribution,\n        fixed_distribution: src.eligibility.fixed_distribution,\n      }\n    })\n\n    let result = null;\n\n    if (ch.id) {\n      ch.sources = channelSources\n      result = await app.api.endpoints.channels.update(ch)\n    } else {\n      //Need to create the channel first to get the ID, then set it in the sources\n      ch.sources = []\n      result = await app.api.endpoints.channels.create(ch)\n      if (result) {\n        ch.id = result.id\n        ch.sources = channelSources.map((cs) => {\n          return {...cs, channel_id: result.id}\n        })\n        result = await app.api.endpoints.channels.update(ch)\n      }\n    }\n\n    app.showLoader(false);\n\n    if (!result) {\n      notify(`Unable to save channel: ${app.api.error.name}`, 'error')\n    } else {\n      notify(`The channel was saved`, 'success')\n     onSuccess && onSuccess(result, isNew);\n     close()\n    }\n  };\n\n  // This awkwardness is because ChannelSources requires a channel-like object\n  // with a product and vertical\n  // but in creation mode we just have the form values, so here we make the form values\n  // looks like the channel object\n  const formValuesAsChannel = useMemo(() => {\n    if (isNew) {\n      return {\n        id: 0,\n        vertical: {id: formValues.vertical_id},\n        product: formValues.product,\n        account: { id: formValues.account_id },\n        status: formValues.status,\n        sources:formValues.sources\n      }\n    }\n    return channel;\n  }, [formValues])\n\n  const archiveConfirm = async () => await confirm({\n    title: 'Archive Channel',\n    message: 'Archive this item? It will be de-activated and removed from all listings.',\n    confirmText: 'Yes, archive it',\n    cancelText: \"Cancel archive\",\n  })\n\n  const handleChangeStatus = async(evt) => {\n    const status = evt?.target?.value\n    if (status) {\n      if (status === 'archived') {\n        const doArchive = await archiveConfirm()\n        if (doArchive) {\n          formApi.setValue('status', status)\n        }\n      } else {\n        formApi.setValue('status', status)\n      }\n    }\n  }\n\n  return (\n    <>\n    <BodyWrapper isModal={isModal}>\n      <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n      {!loading && <FormLayout isModal={isModal}>\n\n      {!formIsValid\n            && (\n            <StandardAlert color=\"warning\" className=\"alert-form-validation\">\n              <FaIcon icon=\"exclamation-triangle\" size=\"lg\" />\n              {' '}\n              Please correct the errors below\n              before continuing\n            </StandardAlert>\n            )}\n\n      <Nav className=\"mb-3 mastodon-tabs\">\n        <TabNav\n          isActive={activeTab === 'details'}\n          setActive={setActiveTab}\n          id=\"details\"\n        >\n          Details\n        </TabNav>\n        <TabNav\n          isActive={activeTab === 'sources'}\n          setActive={setActiveTab}\n          id=\"sources\"\n        >\n          Sources\n        </TabNav>\n      </Nav>\n\n      <TabContent activeTab={activeTab}>\n        <TabPane tabId=\"details\">\n          <div>\n            <Row>\n              <Col sm={12}>\n                <FormGroup>\n                  <Label>\n                    Name\n                    {' '}\n                    <Required />\n                  </Label>\n                  <Input\n                    type=\"text\"\n                    name=\"name\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.name}\n                    invalid={!!formErrors.name}\n                  />\n                  <FormFeedback>{formErrors.name}</FormFeedback>\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Description\n                  </Label>\n\n                  <Input\n                    type=\"textarea\"\n                    name=\"description\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.description}\n                  />\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Account { isNew && <Required />}\n                  </Label>\n\n                  { isNew && (\n                      <DynamicEnhancedSelect\n                        onChange={handleSelectAccount}\n                        value={formValues.account_id}\n                        name=\"account_id\"\n                        endpoint=\"accounts\"\n                        params={{options:true}}\n                        labelProperty=\"name\"\n                        className=\"w-100\"\n                        invalid={!!formErrors.account_id}\n                        invalidFeedback={formErrors.account_id}\n                        isClearable\n                        isSearchable\n                      />\n                  )}\n\n                  {/* Read only text for existing order */}\n                  { !isNew && channel && <div><EntityId id={channel.account.id} /> {channel.account.name}</div>}\n\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Vertical\n                    {' '}\n                    { isNew && <Required />}\n                  </Label>\n                  { isNew && (\n\n                    <DynamicEnhancedSelect\n                      onChange={handleSelectVertical}\n                      value={formValues.vertical_id}\n                      name=\"vertical_id\"\n                      endpoint=\"verticals\"\n                      params={{options:true}}\n                      labelProperty=\"display_name\"\n                      className=\"w-100\"\n                      invalid={!!formErrors.vertical_id}\n                      invalidFeedback={formErrors.vertical_id}\n                      isClearable\n                      isSearchable\n                    />\n\n                  )}\n\n                  {/* Read only for existing channel */}\n                  { !isNew && channel && <div><EntityId id={channel.vertical.id} /> {channel.vertical.display_name}</div>}\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Product { isNew && <Required />}\n                  </Label>\n                  { isNew && (\n\n                    <InputGroup>\n                      <Input\n                        type=\"select\"\n                        onChange={formApi.handleOnChange}\n                        defaultValue={formValues.product}\n                        name=\"product\"\n                        invalid={!!formErrors.product}\n                      >\n                        <option value=\"\">Select...</option>\n                        {ProductChoices.map((p) => <option value={p.value} key={p.value}>{p.label}</option>)}\n                      </Input>\n                      <FormFeedback>{formErrors.product}</FormFeedback>\n                    </InputGroup>\n\n                  )}\n\n                  {/* Read only for existing channel */}\n                  { !isNew && channel && <div>{Utils.titleCase(channel.product)}</div>}\n\n                  <FormFeedback>{formErrors.product}</FormFeedback>\n                </FormGroup>\n\n                {/* status for existing channel (new ones set active by default) */}\n                { !isNew && (\n                  <FormGroup>\n                    <Label>\n                      Status\n                    </Label>\n                    <InputGroup>\n                      <Input\n                        type=\"select\"\n                        onChange={handleChangeStatus}\n                        value={formValues.status}\n                        name=\"status\"\n                      >\n                        <option value=\"active\">Active</option>\n                        <option value=\"archived\">Archived</option>\n                      </Input>\n                    </InputGroup>\n                  </FormGroup>\n\n                )}\n                { !isNew && onOpenChannelRules && (\n                  <FormGroup>\n                    <Label>\n                      Routing Rules\n                    </Label>\n\n                    <div>\n                      <Button color=\"link\" className=\"inline me-3\" onClick={()=>onOpenChannelRules(channel)} title=\"Channelrouting rules\">\n                        <FaIcon icon=\"clipboard-list\" size=\"sm\" />\n                        {\" \"}\n                        Edit Routing Rules for Channel\n                      </Button>\n                    </div>\n                  </FormGroup>\n                )}\n              </Col>\n            </Row>\n\n          </div>\n        </TabPane>\n        <TabPane tabId=\"sources\"  style={{minHeight:'400px'}}>\n\n            <ChannelSources\n              channel={formValuesAsChannel}\n              sources={formValues.sources}\n              onChange={handleChangeSources}\n              onOpenRules={onOpenChannelSourceRules}\n            />\n\n\n        </TabPane>\n      </TabContent>\n      </FormLayout>}\n\n    </BodyWrapper>\n      {!loading && <FooterWrapper isModal={isModal}>\n          <Button\n            onClick={close}\n            color=\"link\"\n            size=\"sm\"\n          >\n            Cancel\n          </Button>\n          <Button\n            onClick={handleSave}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            Save\n          </Button>\n\n      </FooterWrapper>}\n    </>\n  );\n};\n\nChannel.propTypes = {\n  close: PropTypes.func.isRequired,\n  //channel: PropTypes.object.isRequired,\n  channelId: PropTypes.number.isRequired,\n  onSuccess: PropTypes.func,\n  tab:PropTypes.string\n};\n\nexport default Channel;\n","import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport EntityId from \"../../Table/EntityId\";\nimport React from \"react\";\n\n/*\n * A function that can be provided as react-select's formatOptionLabel function\n * that will show the entity ID along with the entity name in the options\n *\n * Value is assumed to be the id, and label == name\n */\nexport const EntityOptionLabel = ({\n                             value, label, selected,\n                           }: {value:number|string, label:string,  selected:boolean}) => (\n    <div className=\"d-flex align-items-center\">\n      <div>{selected && <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\" />}</div>\n      <div><EntityId id={value} /> {label}</div>\n    </div>\n\n);\n","import React, {useState, useEffect} from 'react'\nimport {\n  Row, Col, FormGroup,FormFeedback, FormText, Input, InputGroup, Label, Button, Spinner,\n} from \"reactstrap\"\nimport * as Yup from 'yup'\nimport { SeedDataValidation } from '../../../Components/Form/SeedDataValidation'\nimport useFormState from '../../../Hooks/useFormState'\nimport EnhancedSelect from \"../../../Components/Form/EnhancedSelect\"\nimport {CopyButton, StandardAlert, notify, Utils} from \"@thedmsgroup/mastodon-ui-components\"\nimport useApi from \"../../../Hooks/useApi\"\nimport EntityId from \"../../../Components/Table/EntityId\"\nimport {SourceOptionLabel} from \"../../../Components/Form/Select/SourceOptionLabel\"\nimport {EntityOptionLabel} from \"../../../Components/Form/Select/EntityOptionLabel\"\nimport {BodyWrapper, FooterWrapper} from \"../../../Components/Modal\";\nimport confirm from 'reactstrap-confirm'\nimport SeedDataBuilder from '../../../Components/Form/SeedDataBuilder'\nimport SeedDataDisplay from '../../../Components/Form/SeedDataDisplay'\n\n// Register custom Yup validation method (ensures import is not tree-shaken)\nvoid SeedDataValidation;\n\n// Seed data validation rules\nconst seedDataValidationRules = [\n  {\n    field: 'traffic_type',\n    type: 'system',\n    required: true,\n    errorMessage: 'Traffic type is required.',\n    inputType: 'select',\n    options: {\n      choices: {\n        'first_party': 'First Party',\n        'third_party': 'Third Party'\n      },\n      label: 'If Third Party is selected you must enter their Jornaya Entity code. If you do not have one please reach out to Compliance.'\n    }\n  },\n  {\n    field: 'jornaya_entity_code',\n    type: 'system',\n    requiredWhen: {\n      field: 'traffic_type',\n      condition: 'equals',\n      value: 'third_party'\n    },\n    options: {\n      label: 'If you do not have a code, please reach out to Compliance.'\n    },\n    errorMessage: 'The Vendor\\'s Jornaya Entity code is required for third party traffic. If you do not have a code, please reach out to Compliance.'\n  }\n];\n\nconst ValidationSchema =  Yup.object().shape({\n  source_id: Yup.number()\n    .transform((n) => (isNaN(n) ? 0 : n))\n    .moreThan(0, 'A source is required'),\n  vendor_id: Yup.number()\n    .transform((n) => (isNaN(n) ? 0 : n))\n    .moreThan(0, 'A vendor is required'),\n  token: Yup.string().trim().test('token-for-existing', 'A token value is required', function test(value){\n    // if new source-token, allow blank token, else require a value\n    const {isNew} = this.options.context;\n    return isNew || Boolean(value);\n  }),\n  seed_data: Yup.mixed().validSeedData(seedDataValidationRules, 'Invalid tracking data'),\n})\n\n\nexport const SourceTokenForm  = ({sourceToken, title, close, onSuccess, isModal, readOnly = false}) => {\n  const isNew = !sourceToken?.id;\n  const {api} = useApi();\n\n  const [vendorChoices, setVendorChoices] = useState([])\n  const [sourceChoices, setSourceChoices] = useState([])\n  const [isSaving, setIsSaving] = useState(false);\n  const [selectedSource, setSelectedSource ] = useState();\n  const [seedDataJsonValid, setSeedDataJsonValid] = useState(true);\n\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      id: sourceToken.id,\n      label: sourceToken.label || '',\n      description: sourceToken.description || '',\n      source_id:( (sourceToken?.source?.id) || '').toString(),\n      vendor_id: ((sourceToken?.vendor?.id) || '').toString(),\n      //seed_data: Array.isArray(sourceToken.seed_data) ? \"{}\" : JSON.stringify(sourceToken.seed_data), // php quirk, empty object = array\n      seed_data: Array.isArray(sourceToken.seed_data) || !sourceToken.seed_data ? {} : sourceToken.seed_data, // php quirk, empty object = array\n      post_type: sourceToken.post_type || '',\n      status: sourceToken.status || 'active',\n      token: sourceToken.token || ''\n    },\n    ValidationSchema,\n    null,\n    null,\n    {isNew}\n  );\n\n\n  //Reset form on unmount\n  useEffect(() => {\n    loadChoices();\n    return () => formApi.clearForm()\n  }, [])\n\n  const loadChoices = async() => {\n    const sources = await api.endpoints.sources.list({options:true})\n    if (sources) {\n      //we need to know source vertical id for the seed data builder\n      setSourceChoices(sources.map(source => {\n        return {value:source.id, label:source.name, status:source.status, vertical:source.vertical, product:source.product}\n      }))\n\n      if (sourceToken.source?.id) {\n        setSelectedSource(() => {\n          return sources.find(s => s.id.toString() === sourceToken.source.id.toString())\n        })\n      }\n    }\n\n    const vendors = await api.endpoints.vendors.list({limit:0})\n    if (vendors) {\n      setVendorChoices(vendors.data.map(vendor => {\n        return {value:vendor.id, label:vendor.name}\n      }))\n    }\n\n  }\n\n  const handleSave = () => {\n    if (!seedDataJsonValid) return;\n    const isValid = formApi.validate()\n    if (isValid) {\n      save()\n    }\n  };\n\n  const save = async() => {\n    setIsSaving(true)\n    const params = {...formValues}\n\n    params.seed_data = params.seed_data && Object.keys(params.seed_data).length > 0\n      ? JSON.stringify(params.seed_data)\n      : null\n\n    let result\n    if (isNew) {\n      delete params.id\n      result = await api.endpoints.sourceTokens.create(params)\n    } else {\n      result = await api.endpoints.sourceTokens.update(params)\n    }\n\n    if (result) {\n      notify(`The source-token has been saved`, 'success')\n      setIsSaving(false)\n      onSuccess && onSuccess()\n      close()\n    } else {\n      notify(`Unable to save vendor to source: ${api.error ? api.error.name : \"\"}`, 'error');\n    }\n    setIsSaving(false)\n  }\n\n  const archiveConfirm = async () => await confirm({\n    title: 'Archive Source Token',\n    message: 'Archive this item? It will be de-activated and removed from all listings.',\n    confirmText: 'Yes, archive it',\n    cancelText: \"Cancel archive\",\n  })\n\n  const handleChangeStatus = async(evt) => {\n    const status = evt?.target?.value\n    if (status) {\n      if (status === 'archived') {\n        const doArchive = await archiveConfirm()\n        if (doArchive) {\n          formApi.setValue('status', status)\n        }\n      } else {\n        formApi.setValue('status', status)\n      }\n    }\n  }\n\n  const handleUpdateSeedData = (obj) => formApi.setValue('seed_data', obj)\n  const handleSelectSource = (id) => {\n    formApi.setValue('source_id', id)\n    // pull the source from the source choices and put it into state\n    // (data needed for seed data builder)\n    setSelectedSource( () => {\n      return id ? sourceChoices.find(s => s.value.toString() === id.toString()) : null\n    })\n  }\n  const handleSelectVendor = (id) => {\n    formApi.setValue('vendor_id', id)\n  }\n\n\n  return (\n    <>\n\n        <BodyWrapper isModal={isModal}>\n          <div className=\"form-section  source-token-form\">\n            {title && <div className=\"form-section-header\">{title}</div>}\n\n            {!formIsValid\n            && (\n              <StandardAlert color=\"warning\" icon=\"alert\" className=\"alert-form-validation\">\n                Correct the errors indicated below\n              </StandardAlert>\n            )}\n\n            <Row>\n              <Col sm={12} lg={5} className=\"pe-lg-4\">\n                {/*<FormGroup>\n                  <Label>Vendor</Label>\n                  <div><EntityId id={vendor.id} /> {vendor.name}</div>\n                </FormGroup>*/}\n\n                {/* if provided a vendor, that means we are picking a source (vendor static) */}\n                <FormGroup>\n                  <Label>Vendor</Label>\n                  {isNew && !readOnly ? (\n                      <EnhancedSelect\n                        value={formValues.vendor_id}\n                        options={vendorChoices}\n                        controlShouldRenderValue\n                        isMulti={false}\n                        isSearchable\n                        onChange={handleSelectVendor}\n                        formatOptionLabel={EntityOptionLabel}\n                        isInvalid={!!formErrors.vendor_id}\n                        invalidFeedback={formErrors.vendor_id}\n                      />\n\n                  ) : (\n                    <div className={readOnly ? 'form-control-plaintext' : undefined}>\n                      <EntityId id={sourceToken.vendor?.id} /> {sourceToken.vendor?.name}\n                    </div>\n                  )}\n                </FormGroup>\n\n                {/* if provided a source, that means we are picking a vendor (source static) */}\n                <FormGroup>\n                  <Label>Source</Label>\n                  {isNew && !readOnly ? (\n                      <EnhancedSelect\n                        value={formValues.source_id}\n                        options={sourceChoices}\n                        controlShouldRenderValue\n                        isMulti={false}\n                        isSearchable\n                        onChange={handleSelectSource}\n                        formatOptionLabel={SourceOptionLabel}\n                        isInvalid={!!formErrors.source_id}\n                        invalidFeedback={formErrors.source_id}\n                      />\n                  ) : (\n                    <div className={readOnly ? 'form-control-plaintext' : undefined}>\n                      <EntityId id={sourceToken.source?.id} /> {sourceToken.source?.name}\n                    </div>\n                  )}\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Token\n                  </Label>\n                  {readOnly ? (\n                    <div className=\"form-control-plaintext\">\n                      {formValues.token || <i>none</i>}\n                      {formValues.token && <CopyButton id=\"copy-token\" textToCopy={formValues.token} buttonSize=\"xs\" className=\"ms-1\">Copy</CopyButton>}\n                    </div>\n                  ) : (\n                    <>\n                      <InputGroup>\n                        <Input\n                          type=\"text\"\n                          name=\"token\"\n                          value={formValues.token}\n                          onChange={formApi.handleOnChange}\n                          invalid={formErrors.token}\n                        />\n                        <CopyButton\n                          id=\"copy-token\"\n                          textToCopy={formValues.token}\n                          buttonSize=\"xs\"\n                        >\n                          Copy\n                        </CopyButton>\n                        <FormFeedback>{formErrors.token}</FormFeedback>\n                      </InputGroup>\n                      {isNew && <FormText>If blank, a token will be created automatically</FormText>}\n                    </>\n                  )}\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Label\n                  </Label>\n                  {readOnly ? (\n                    <div className=\"form-control-plaintext\">{formValues.label || '-'}</div>\n                  ) : (\n                    <Input\n                      type=\"text\"\n                      name=\"label\"\n                      value={formValues.label}\n                      onChange={formApi.handleOnChange}\n                    />\n                  )}\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Description\n                  </Label>\n                  {readOnly ? (\n                    <div className=\"form-control-plaintext\">{formValues.description || '-'}</div>\n                  ) : (\n                    <Input\n                      type=\"text\"\n                      name=\"description\"\n                      value={formValues.description}\n                      onChange={formApi.handleOnChange}\n                    />\n                  )}\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Status\n                  </Label>\n                  {readOnly ? (\n                    <div className=\"form-control-plaintext\">{Utils.titleCase(formValues.status)}</div>\n                  ) : (\n                    <InputGroup>\n                      <Input\n                        type=\"select\"\n                        onChange={handleChangeStatus}\n                        value={formValues.status}\n                        name=\"status\"\n                      >\n                        <option value=\"active\">Active</option>\n                        <option value=\"paused\">Paused</option>\n                        {!isNew && <option value=\"archived\">Archived</option>}\n                      </Input>\n                    </InputGroup>\n                  )}\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>\n                    Post Type\n                  </Label>\n                  {readOnly ? (\n                    <div className=\"form-control-plaintext\">{formValues.post_type ? Utils.titleCase(formValues.post_type.replace('_', ' ')) : 'Any'}</div>\n                  ) : (\n                    <InputGroup>\n                      <Input\n                        type=\"select\"\n                        onChange={formApi.handleOnChange}\n                        value={formValues.post_type}\n                        name=\"post_type\"\n                      >\n                        <option value=\"\">Any</option>\n                        <option value=\"ping_post\">PingPost</option>\n                        <option value=\"direct_post\">Direct Post</option>\n                      </Input>\n                    </InputGroup>\n                  )}\n                </FormGroup>\n\n              </Col>\n\n              <Col sm={12} lg={7} className=\"border-start ps-lg-4\">\n                <FormGroup>\n                  <Label>Tracking Data</Label>\n                  {readOnly ? (\n                    <SeedDataDisplay\n                      seedData={typeof formValues.seed_data === 'string'\n                        ? JSON.parse(formValues.seed_data)\n                        : formValues.seed_data\n                      }\n                      emptyMessage=\"No tracking data\"\n                    />\n                  ) : (\n                    <>\n                      <p>Tracking data are identifiers and metadata that attribute sources, vendors, or campaigns, and enable analytics, monitoring, and reporting.</p>\n                      {formErrors.seed_data && (\n                        <StandardAlert color=\"danger\" icon=\"alert\" className=\"mb-3\">\n                          <div style={{whiteSpace: 'pre-line'}}>{formErrors.seed_data}</div>\n                        </StandardAlert>\n                      )}\n                      <SeedDataBuilder\n                        seedData={formValues.seed_data}\n                        verticalId={selectedSource?.vertical?.id || 0}\n                        onUpdate={handleUpdateSeedData}\n                        onJsonValidChange={setSeedDataJsonValid}\n                        validationRules={seedDataValidationRules}\n                      />\n                    </>\n                  )}\n                </FormGroup>\n              </Col>\n            </Row>\n          </div>\n        </BodyWrapper>\n\n        <FooterWrapper isModal={isModal} className=\"mt-2 text-end\">\n          {readOnly ? (\n            <Button color=\"secondary\" size=\"sm\" onClick={close}>Close</Button>\n          ) : (\n            <>\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                onClick={close}\n                disabled={isSaving}\n              >\n                Cancel\n              </Button>\n              <Button\n                size=\"sm\"\n                onClick={handleSave}\n                disabled={isSaving || !seedDataJsonValid}\n                className=\"ms-1\"\n              >\n                Save {isSaving && <Spinner size=\"sm\" color=\"primary\" className=\"ms-1\" />}\n              </Button>\n            </>\n          )}\n        </FooterWrapper>\n\n    </>\n\n\n  );\n}\n\n","import React, { useEffect } from 'react';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport PixelForm from '../../../../Components/Form/PixelForm';\nimport useDidMount from '../../../../Hooks/useDidMount';\nimport useUniqueKeyArray from '../../../../Hooks/useUniqueKeyArray';\n\n/*\n * ClickTags: a form for entering multiple tracking pixels associated with a source.\n */\nconst ClickTags = ({ clickTags = [], onChange }) => {\n  const didMount = useDidMount();\n\n  const {\n    items,\n    addItem,\n    removeItem,\n    updateItem,\n  } = useUniqueKeyArray(clickTags);\n\n  // Update tag on state change\n  useEffect(() => {\n    if (didMount) {\n      onChange('click_tags', items.map((item) => item.value));\n    }\n  }, [items]);\n\n  return (\n    <>\n      <p>Enter URLs or tags for tracking clicks associated with this source.</p>\n      {clickTags.length === 0\n      && (\n      <StandardAlert color=\"light\">\n        <span>\n          No click tags are configured.\n          <Button color=\"link\" size=\"sm\" className=\"inline ms-1\" onClick={addItem}>\n            <FaIcon icon=\"plus\" className=\"me-1\" />\n            <span>Add a tag</span>\n          </Button>\n&nbsp;\n        </span>\n      </StandardAlert>\n      )}\n\n      <div>\n\n        {items.map((tag, i) => (\n          <PixelForm\n            pixel={tag.value}\n            className=\"click-tag\"\n            handleRemove={() => removeItem(i)}\n            handleChange={(val) => updateItem(i, val)}\n            key={tag.key}\n          />\n        ))}\n\n        {items.length > 0 && (\n        <div className=\"text-right\">\n          <Button color=\"link\" size=\"sm\" onClick={addItem}>\n            <FaIcon icon=\"plus\" className=\"me-1\" />\n            <span>Add Another</span>\n          </Button>\n        </div>\n        )}\n      </div>\n    </>\n  );\n};\n\nClickTags.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  clickTags: PropTypes.array.isRequired,\n};\n\nexport default ClickTags;\n","import React from 'react';\nimport {\n  Row, Col,\n  FormGroup, Label, FormText, Input, InputGroup, FormFeedback,\n} from 'reactstrap';\nimport {Link} from 'react-router-dom';\nimport NumberFormat from 'react-number-format';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport MaskedInput from 'react-text-mask';\nimport PropTypes from 'prop-types';\nimport {StandardAlert} from '@thedmsgroup/mastodon-ui-components';\nimport { Required } from '../../../../Components/Form/FormCommon';\nimport { ProductChoices } from '../../../../Components/Table/FilterChoices';\nimport { titleCaseWord } from '../../../../utils/string';\nimport DynamicEnhancedSelect from '../../../../Components/Form/DynamicEnhancedSelect';\nimport InputWithIcon from '../../../../Components/Form/InputWithIcon';\nimport confirm from 'reactstrap-confirm'\n\n// Mask dd.dd\nconst currencyMask = createNumberMask({\n  prefix: '',\n  allowDecimal: true,\n  decimalLimit: 2,\n  integerLimit: 3,\n  // fixedDecimalScale:true\n});\n\n// Mask ddd\nconst marginMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  integerLimit: 3,\n});\n\nconst Details = ({\n  source, errors, onChange, isNew,\n}) => {\n  const phoneCount = source.phone_numbers ? source.phone_numbers.length : 0;\n\n  const archiveConfirm = async () => await confirm({\n    title: 'Archive Source',\n    message: 'Archive this item? It will be de-activated and removed from all listings.',\n    confirmText: 'Yes, archive it',\n    cancelText: \"Cancel archive\",\n  })\n\n  const handleChangeStatus = async(evt) => {\n    const status = evt?.target?.value\n    if (status) {\n      if (status === 'archived') {\n        const doArchive = await archiveConfirm()\n        if (doArchive) {\n          onChange('status', status)\n        }\n      } else {\n        onChange('status', status)\n      }\n    }\n  }\n\n  return (\n    <Row>\n      <Col sm={6}>\n        <FormGroup>\n          <Label>\n            Name\n            {' '}\n            <Required />\n          </Label>\n          <Input\n            type=\"text\"\n            name=\"name\"\n            onChange={onChange}\n            value={source.name || ''}\n            invalid={!!errors.name}\n          />\n          <FormFeedback>{errors.name}</FormFeedback>\n        </FormGroup>\n\n        <FormGroup>\n          <Label>\n            Description\n          </Label>\n          <Input\n            type=\"textarea\"\n            name=\"description\"\n            onChange={onChange}\n            value={source.description || ''}\n          />\n\n        </FormGroup>\n\n\n        <StandardAlert color=\"warning\" icon=\"alert\" className=\"mb-2\">\n          <strong>Vendor Bid</strong>, <strong>Vendor Margin</strong>, and <strong>Match Limit</strong> below\n          are deprecated. Configure these on\n          {' '}\n          {source.id ? (\n            <Link to={`/routing/source/${source.id}/rules`}>Routing Rules</Link>\n          ) : 'Routing Rules'}\n          {' '}\n          instead — values set here may be ignored.\n        </StandardAlert>\n\n        <div className=\"d-flex\">\n\n          <FormGroup>\n            <Label>\n              Vendor Bid\n            </Label>\n\n            <MaskedInput\n              id=\"inp-bid\"\n              mask={currencyMask}\n              name=\"vendor_bid\"\n              value={source.vendor_bid || ''}\n              onChange={onChange}\n              invalid={false}\n              error={null}\n              render={(ref, props) => <InputWithIcon className=\"tiny\" innerRef={ref} icon=\"dollar-sign\" {...props} />}\n            />\n            <FormText>Bid, if set, will override margin</FormText>\n          </FormGroup>\n\n          <FormGroup className=\"ms-3\">\n            <Label>\n              Vendor Margin\n            </Label>\n            <MaskedInput\n              id=\"inp-margin\"\n              mask={marginMask}\n              name=\"vendor_margin\"\n              value={source.vendor_margin || ''}\n              onChange={onChange}\n              invalid={false}\n              error={null}\n              render={(ref, props) => <InputWithIcon className=\"tiny\" innerRef={ref} icon=\"percent\" iconSide=\"right\" {...props} />}\n            />\n          </FormGroup>\n\n\n\n        </div>\n\n        <FormGroup>\n          <Label>\n            Match Limit\n          </Label>\n          <Input\n            className=\"tiny\"\n            name=\"match_limit\"\n            value={source.match_limit || ''}\n            onChange={onChange}\n            invalid={false}\n            error={null}\n          />\n          <FormText>Limits the number of matches returned</FormText>\n        </FormGroup>\n\n      </Col>\n\n      <Col sm={6}>\n\n\n        { source.product === 'calls' && (\n          <>\n            <StandardAlert color=\"warning\" icon=\"alert\" className=\"mb-2\">\n              <strong>Vendor Billable Duration</strong> is deprecated. Configure this on\n              {' '}\n              {source.id ? (\n                <Link to={`/routing/source/${source.id}/rules`}>Routing Rules</Link>\n              ) : 'Routing Rules'}\n              {' '}\n              instead — the value set here may be ignored.\n            </StandardAlert>\n\n            <FormGroup>\n              <Label>\n                Vendor Billable Duration (seconds)\n              </Label>\n              <Input\n                type=\"number\"\n                name=\"vendor_billable_duration\"\n                max={500}\n                onChange={onChange}\n                className=\"tiny\"\n                value={source.vendor_billable_duration || ''}\n                invalid={!!errors.vendor_billable_duration}\n              />\n              <FormFeedback>{errors.vendor_billable_duration}</FormFeedback>\n              <FormText>Maximum 500 seconds</FormText>\n            </FormGroup>\n            <FormGroup>\n              <Label for=\"phone_number\">\n                Phone Numbers\n                {phoneCount > 0 && (\n                  <span>\n                (\n                    {phoneCount}\n                    )\n              </span>\n                )}\n              </Label>\n              {phoneCount > 0 ? (\n                <ul className=\"phone-number-list\">\n                  {source.phone_numbers.map((phone, i) => <li key={i}><NumberFormat value={phone.phone_number} displayType=\"text\" format=\"+###########\" /></li>)}\n                </ul>\n              ) : <div><i>No phone numbers assigned</i></div>}\n\n            </FormGroup>\n          </>\n\n        )}\n\n        <FormGroup>\n          <Label>\n            Status\n          </Label>\n          <InputGroup>\n            <Input type=\"select\" onChange={handleChangeStatus} value={source.status} name=\"status\">\n              <option value=\"active\">Active</option>\n              <option value=\"paused\">Paused</option>\n              {!isNew && <option value=\"archived\">Archived</option>}\n            </Input>\n          </InputGroup>\n        </FormGroup>\n\n        <FormGroup>\n\n          <Label>\n            Product\n            {' '}\n            { isNew && <Required />}\n          </Label>\n          { isNew && (\n\n            <InputGroup>\n              <Input\n                type=\"select\"\n                onChange={onChange}\n                defaultValue={source.product}\n                name=\"product\"\n                invalid={!!errors.product}\n              >\n                <option value=\"\">Select...</option>\n                {ProductChoices.map((p) => <option value={p.value} key={p.value}>{p.label}</option>)}\n              </Input>\n            </InputGroup>\n\n          )}\n\n          {/* Read only text for existing source */}\n          { !isNew && source.product && (\n            <Input type=\"text\" defaultValue={titleCaseWord(source.product)} readOnly />\n          )}\n          <FormFeedback>{errors.product}</FormFeedback>\n        </FormGroup>\n\n        <FormGroup>\n\n          <Label>\n            Vertical\n            {' '}\n            { isNew && <Required />}\n          </Label>\n          { isNew && (\n\n            <DynamicEnhancedSelect\n              onChange={(value) => onChange('vertical_id', value)}\n              value={source.vertical_id}\n              endpoint=\"verticals\"\n              name=\"vertical_id\"\n              params={{options:true}}\n              labelProperty=\"display_name\"\n              className=\"w-100\"\n              invalid={!!errors.vertical_id}\n              invalidFeedback={errors.vertical_id}\n              isClearable\n              isSearchable\n            />\n\n          )}\n\n          {/* Read only text for existing source */}\n          { !isNew && source.vertical && (\n            <Input type=\"text\" defaultValue={source.vertical.display_name || ''} readOnly />\n          )}\n        </FormGroup>\n\n\n\n      </Col>\n    </Row>\n  );\n};\n\nDetails.propTypes = {\n  source: PropTypes.object,\n  errors: PropTypes.object,\n  onChange: PropTypes.func,\n  isNew: PropTypes.bool,\n};\n\nexport default Details;\n","/**\n * Field management on a source is a flat list of paths into the vertical's\n * input schema. Nested fields are addressed with a dotted path — \"vehicles.vin\"\n * — which is the same form the API matches designations against, so the picker\n * has to offer every level of the schema rather than just the top one.\n */\n\nexport interface SchemaFieldOption {\n  /** dotted path, and what gets stored on the source */\n  value: string;\n  /** dotted path; EnhancedSelect searches on this, so parents stay findable */\n  label: string;\n  /** leaf name, for display */\n  name: string;\n  /** dotted path of the containing field, '' at the top level */\n  parent: string;\n  type: string;\n  description: string;\n  private: boolean | string;\n  example: string;\n}\n\ninterface SchemaProperty {\n  type?: string;\n  description?: string;\n  private?: boolean | string;\n  example?: string;\n  properties?: Record<string, SchemaProperty>;\n  items?: SchemaProperty;\n}\n\ninterface SchemaContent {\n  properties?: Record<string, SchemaProperty>;\n}\n\n/**\n * Walks a schema into a flat, selectable list. Each level is sorted on its own,\n * so children follow their parent instead of being scattered through one big\n * alphabetical list.\n *\n * Container fields stay selectable: requiring \"vehicles\" (at least one vehicle)\n * is a different requirement from requiring \"vehicles.vin\".\n */\nexport const flattenSchemaFields = (\n  schema?: SchemaContent | SchemaProperty,\n  parent = '',\n): SchemaFieldOption[] => {\n  const properties = schema?.properties;\n  if (!properties) return [];\n\n  return Object.keys(properties)\n    .sort((a, b) => a.localeCompare(b))\n    .flatMap((name) => {\n      const field = properties[name] ?? {};\n      const path = parent ? `${parent}.${name}` : name;\n\n      const option: SchemaFieldOption = {\n        value: path,\n        label: path,\n        name,\n        parent,\n        type: field.type ?? '',\n        description: field.description ?? '',\n        private: field.private ?? false,\n        example: field.example ?? '',\n      };\n\n      // arrays describe their element shape under `items`; objects nest directly\n      const nested = field.type === 'array'\n        ? flattenSchemaFields(field.items, path)\n        : flattenSchemaFields(field, path);\n\n      return [option, ...nested];\n    });\n};\n\n/** Splits a stored path for display, e.g. \"vehicles.vin\" -> [\"vehicles\", \"vin\"]. */\nexport const splitFieldPath = (path: string): {parent: string; name: string} => {\n  const at = String(path ?? '').lastIndexOf('.');\n\n  return at === -1\n    ? {parent: '', name: String(path ?? '')}\n    : {parent: path.slice(0, at), name: path.slice(at + 1)};\n};\n","import React, { useState, useEffect, useMemo } from 'react';\nimport {Link} from \"react-router-dom\";\nimport {Row, Col, Button, Input, Label, FormGroup} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport useApi from \"../../../../Hooks/useApi\";\nimport InputSchemaApi from \"../../../Tools/InputSchema/InputSchemaApi\";\nimport {HelpPopper, JsonDisplay, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport IconCheckbox from \"@thedmsgroup/mastodon-ui-components/lib/components/Form/IconCheckbox\";\nimport EnhancedSelect from \"../../../../Components/Form/EnhancedSelect\";\nimport FlexTable from \"../../../../Components/Table/FlexTable\";\nimport usePermission from \"../../../../Hooks/usePermission\";\nimport {titleCase} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport {flattenSchemaFields, splitFieldPath} from \"./schemaFields\";\n\nexport const RequiredFields = ({requiredFields=[], verticalId, onChange}) => {\n  const {api} = useApi();\n  const inputSchemaApi = new InputSchemaApi();\n  const [inputSchema, setInputSchema] = useState();\n  const [vertical, setVertical] = useState();\n  const [loading, setLoading] = useState(true);\n  const [fieldOptions, setFieldOptions] = useState([]);\n  //You can add more than one field at a time\n  const [newFields, setNewFields] = useState([])\n  const [rejectNew, setRejectNew] = useState(false);\n  const [lazyNew, setLazyNew] = useState(false);\n  const [recommendedNew, setRecommendedNew] = useState(false);\n  const allowInputSchema = usePermission('input_schema.edit');\n  const allowVerticals = usePermission('verticals.edit');\n  const allowViewInputSchema = usePermission('input_schema.view');\n  // Required fields are defined against the vertical's input schema. Without read\n  // access to that schema there is nothing to pick fields from, so the tab is\n  // limited to displaying what is already configured.\n  const readOnly = !allowViewInputSchema;\n\n\n  useEffect(() => {\n\n    loadInputSchema();\n\n  }, [verticalId, allowViewInputSchema])\n\n\n  const handleToggleRejectNew = (e) => {\n    setRejectNew(e.target.checked)\n  }\n  const handleToggleLazyNew = (e) => {\n    setLazyNew(e.target.checked)\n  }\n  // A recommended field is advisory only, so the enforcement flags stop applying to it.\n  const handleToggleRecommendedNew = (e) => {\n    setRecommendedNew(e.target.checked)\n    if (e.target.checked) {\n      setRejectNew(false);\n      setLazyNew(false);\n    }\n  }\n\n  const handleAdd = () => {\n    const newRequiredFields = newFields.map(fieldName => {\n      return {\n        field:fieldName,\n        lazy: recommendedNew ? false : lazyNew,\n        reject: recommendedNew ? false : rejectNew,\n        recommended: recommendedNew\n      }\n    });\n    //remove dupes from existing, then add new\n    const unDupedExisting = requiredFields.filter(f => !newRequiredFields.find(n => n.field === f.field));\n    onChange([...unDupedExisting, ...newRequiredFields]);\n    setNewFields([]);\n\n  }\n\n  const handleRemove = (index) => {\n    if (requiredFields[index]) {\n      const newRequired = [...requiredFields];\n      newRequired.splice(index, 1);\n      onChange(newRequired);\n    }\n  }\n\n\n  //toggle checkboxes in row\n  const handleToggleCheckedRow = (name, checked, index) => {\n    if (requiredFields[index]) {\n      const newRequired = [...requiredFields];\n      const row = {...newRequired[index], [name]: checked};\n      // Recommended fields are never enforced, so reject/lazy have nothing to act on.\n      if (name === 'recommended' && checked) {\n        row.reject = false;\n        row.lazy = false;\n      }\n      newRequired[index] = row;\n      onChange(newRequired);\n    }\n  }\n\n  const loadInputSchema = async() => {\n    if (!verticalId) {\n      setLoading(false);\n      setVertical(null);\n      return;\n    }\n\n    if (!loading) setLoading(true);\n    const vert = await api.endpoints.verticals.show(verticalId);\n    if (vert) {\n      setVertical(vert);\n      if (vert.input_schema && allowViewInputSchema) {\n\n        const schema= await inputSchemaApi.show(vert.input_schema.id, {full: true});\n        if (schema) {\n          setInputSchema(schema);\n          setFieldOptions(flattenSchemaFields(schema.content));\n        }\n\n      }  else {\n        setInputSchema(undefined);\n      }\n    } else {\n      setVertical(undefined);\n    }\n\n    setLoading(false);\n  }\n\n  // Reject and lazy only mean something for an enforced field, so they are\n  // inert on a recommended row rather than quietly claiming to do something.\n  const enforcementFlagColumn = (name, header) => ({\n    Header: header,\n    accessor: name,\n    Cell: ({row, value}) => {\n      if (row.original?.recommended) {\n        return <span className=\"text-muted\" title=\"Not enforced on a recommended field\">&mdash;</span>\n      }\n\n      return readOnly ? (\n        <ReadOnlyFlag value={value} />\n      ) : (\n        <IconCheckbox\n          name={name}\n          value={!!value}\n          onChange={(flag, checked) => handleToggleCheckedRow(flag, checked, row.index)}\n        />\n      )\n    },\n    maxWidth:100\n  });\n\n  const columns = useMemo(() => [\n    {\n      Header:'Field',\n      accessor: 'field',\n      Cell: ({value}) => <FieldPath path={value} />\n    },\n    enforcementFlagColumn(\n      'reject',\n      <div>Reject <HelpPopper name=\"field-reject-help\">Fail the auction if the field is missing</HelpPopper></div>\n    ),\n    enforcementFlagColumn(\n      'lazy',\n      <div>Lazy <HelpPopper name=\"field-lazy-help\">The value can be provided on the POST if it is not available at the time of the PING</HelpPopper></div>\n    ),\n    {\n      Header: <div>Recommended <HelpPopper name=\"field-recommended-help\">\n        Not enforced. The field is included in the sample request on the publisher&rsquo;s integration\n        instructions, so the example payload shows more than the bare minimum.\n      </HelpPopper></div>,\n      accessor: 'recommended',\n      Cell: ({row, value}) => (\n        readOnly ? (\n          <ReadOnlyFlag value={value} />\n        ) : (\n          <IconCheckbox\n            name=\"recommended\"\n            value={!!value}\n            onChange={(name, checked) => handleToggleCheckedRow(name, checked, row.index)}\n          />\n        )\n      ),\n      maxWidth:140\n    },\n    ...(readOnly ? [] : [{\n      id: 'remove',\n      Cell: ({row}) => {\n        return <Button size=\"sm\" className=\"inline\" color=\"link\" title=\"Remove this field\" onClick={() => handleRemove(row.index)}>\n          <FaIcon icon=\"times\" color=\"red\" />\n        </Button>\n      },\n      maxWidth:60\n    }]),\n  ])\n\n  //TODO: message: select a vertical (for new source)\n  return (\n    <div className=\"required-fields\">\n      <p>\n        {readOnly\n          ? 'Required fields for source input, based on the input schema of the source’s vertical.'\n          : 'Set the required fields for source input, based on the input schema of the source’s vertical.'}\n        {' '}Nested fields are addressed by path, e.g. <code>vehicles.vin</code>. Fields marked\n        {' '}<em>Recommended</em> are not enforced — they only fill out the sample request on the\n        {' '}publisher’s integration instructions.\n      </p>\n      <Row className=\"gx4\">\n      <Col sm={12} md={7}>\n\n        {!loading && !verticalId && (\n          <StandardAlert icon=\"alert\" color=\"danger\">A vertical for the source must be selected first.</StandardAlert>\n        )}\n\n        {!loading && vertical && readOnly && (\n          <>\n            <StandardAlert icon=\"info\" color=\"info\">\n              You do not have permission to view the input schema for this vertical.\n              Any required fields already configured are shown below and cannot be changed.\n            </StandardAlert>\n\n            <Row className=\"mt-2\">\n              <Col>\n                <FlexTable\n                  data={requiredFields}\n                  columns={columns}\n                  initialState={{\n                    sortBy: [{id: 'field', desc: false}]\n                  }}\n                  className=\"required-fields striped\"\n                  noDataMessage=\"No required fields are set\"\n                />\n              </Col>\n            </Row>\n          </>\n        )}\n\n        {!loading && vertical && !readOnly && (\n          <>\n            {inputSchema ? (\n              <>\n                <Row className=\"mb-3 mt-1\">\n                  <Col sm={12}>\n                    <div className=\"add-field-form align-items-center form-section border\">\n                      <Row className=\"align-items-center\">\n                        <Col sm={5}>\n                          <EnhancedSelect\n                            isClearable\n                            isSearchable\n                            onChange={setNewFields}\n                            options={fieldOptions}\n                            value={newFields}\n                            tabSelectsValue\n                            backspaceRemovesValue\n                            isMulti\n                            controlShouldRenderValue\n                            closeMenuOnSelect\n                            placeholder=\"Select Fields\"\n                            formatOptionLabel={RequiredFieldOptionLabel}\n                          />\n                        </Col>\n\n                        <Col sm={2}>\n                          <FormGroup check>\n                            <Label check className={recommendedNew ? 'text-muted' : undefined}>\n                              <Input\n                                type=\"checkbox\"\n                                checked={rejectNew}\n                                disabled={recommendedNew}\n                                onChange={handleToggleRejectNew}\n                              />\n                              Reject\n                            </Label>\n                          </FormGroup>\n                        </Col>\n\n                        <Col sm={2}>\n                          <FormGroup check>\n                            <Label check className={recommendedNew ? 'text-muted' : undefined}>\n                              <Input\n                                type=\"checkbox\"\n                                checked={lazyNew}\n                                disabled={recommendedNew}\n                                onChange={handleToggleLazyNew}\n                              />\n                              Lazy\n                            </Label>\n                          </FormGroup>\n                        </Col>\n\n                        <Col sm={2}>\n                          <FormGroup check>\n                            <Label check>\n                              <Input\n                                type=\"checkbox\"\n                                checked={recommendedNew}\n                                onChange={handleToggleRecommendedNew}\n                              />\n                              Recommended\n                            </Label>\n                          </FormGroup>\n                        </Col>\n\n                        <Col sm={1}>\n                          <Button\n                            color=\"primary\"\n                            size=\"sm\"\n                            onClick={handleAdd}\n                            disabled={!newFields.length}\n                          >Add</Button>\n                        </Col>\n                      </Row>\n                    </div>\n\n                  </Col>\n\n                </Row>\n\n                <Row className=\"mt-2\">\n                  <Col>\n                    <FlexTable\n                      data={requiredFields}\n                      columns={columns}\n                      initialState={{\n                        sortBy: [{id: 'field', desc: false}]\n                      }}\n                      className=\"required-fields striped\"\n                      noDataMessage=\"No required fields are set\"\n                    />\n                  </Col>\n                </Row>\n              </>\n              ) : (\n              <StandardAlert icon=\"alert\" color=\"danger\">The vertical {vertical.display_name} has no input schema. No required fields can be set.</StandardAlert>\n              )}\n\n          </>\n        )}\n\n      </Col>\n\n      <Col sm={12} md={5}>\n        {inputSchema && vertical && (\n          <>\n            <h5>{`Input Schema for Vertical: ${vertical.display_name}`}</h5>\n\n            {(allowInputSchema || allowVerticals) && (\n              <div className=\"mb-1\">\n                <div>{allowInputSchema && <Link to=\"/tools/inputschema\" target=\"_blank\">Manage Input Schema</Link>}</div>\n                <div>{allowVerticals && <Link to=\"/verticals\" target=\"_blank\">Manage Verticals</Link>}</div>\n              </div>\n            )}\n\n            <JsonDisplay data={inputSchema.content} scrollable height=\"300px\" />\n          </>\n\n        )}\n      </Col>\n    </Row>\n\n\n    </div>\n  )\n}\n\n// Keeps the leaf field readable while still showing which container it sits in\nconst FieldPath = ({path}) => {\n  const {parent, name} = splitFieldPath(path);\n\n  return (\n    <span className=\"field-path\">\n      {parent && <span className=\"text-muted\">{parent}.</span>}\n      {name}\n    </span>\n  );\n};\n\n// Static stand-in for IconCheckbox when the tab is read-only\nconst ReadOnlyFlag = ({value}) => (\n  value\n    ? <FaIcon icon=\"check\" color=\"green\" title=\"Yes\" />\n    : <FaIcon icon=\"minus\" className=\"text-muted\" title=\"No\" />\n);\n\nconst RequiredFieldOptionLabel = (option, meta, selected) => (\n\n    <div className=\"d-flex justify-content-between\">\n      <div className=\"d-flex\">\n        {meta.context === 'menu' &&\n          <div>{selected && <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\"/>}</div>}\n\n        <div>\n          <div>\n            {option.parent && <span className=\"text-muted\">{option.parent}.</span>}\n            {option.name ?? option.label}\n          </div>\n          {option.description && meta.context === 'menu' && <div>\n            <small>{option.description}</small>\n          </div>}\n          {option.private && meta.context === 'menu' && <div>\n            <small>{option.description && <span> | </span>}{option.private}</small>\n          </div>}\n        </div>\n      </div>\n\n      {meta.context === 'menu' && <div><small>{titleCase(option.type)}</small></div>}\n\n    </div>\n  );\n","import React, { useState, useEffect } from 'react';\nimport {\n  Row, Card, Col, FormGroup, Label, FormText, CardBody, Button,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\nimport copy from 'fast-copy';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport IntegrationSettings from '../../../../Components/Rules/IntegrationSettings';\nimport usePermission from '../../../../Hooks/usePermission';\nimport IconCheckbox from \"../../../../Components/Form/IconCheckbox\";\n\n/*\n * One configured enrichment integration on a source (DMS-1216): its integration\n * settings (service, settings, timeout, exclude PII) plus notify-only.\n */\nconst EnrichmentForm = (props) => {\n  const [willDelete, setWillDelete] = useState(false);\n  // Form modifies data in state, then source will be updated on apply\n  const [tempData, setTempData] = useState(copy(props.addOn));\n  const allowEditIntegration = usePermission('integrations.edit');\n  const allowEditSource = usePermission('sources.edit');\n\n  const getIntegrationLabel = (name) => {\n    const config = props.config.find((conf) => conf.name === name);\n    return config ? config.label : undefined;\n  };\n\n  // Reset form data state on close to current data\n  // (this will be the changed data after apply, or unchanged data after cancel)\n  useEffect(() => {\n    if (!props.editMode) {\n      setTempData(copy(props.addOn));\n    }\n  }, [props.editMode]);\n\n  const handleApply = () => props.onApply(tempData);\n\n  const handleCancel = () => {\n    if (props.isNew) {\n      props.onDelete(props.index);\n    }\n    props.onEditMode(-1);\n  };\n\n  const handleChangeIntegration = (integration) => setTempData({ ...tempData, integration });\n\n  const handleChangeNotify = (name, val) => setTempData({ ...tempData, notify: val });\n\n  const hasErrors = Object.keys(props.errors).length > 0;\n\n  return (\n    <Card className={classnames('form-section', 'sales-condition', 'mb-3', { odd: props.index > 0 && props.index % 2 > 0 })} id={`source-enrichment-${props.index.toString()}`}>\n      <div className=\"form-section-header d-flex justify-content-between align-items-center\">\n        <div>\n          { getIntegrationLabel(props.addOn.integration.name) || (\n            <span>\n            Edge Enrichment {props.addOnCount > 1 && <span>{props.index + 1}</span>}\n          </span>\n          )}\n        </div>\n\n        <div className=\"actions\">\n          {willDelete === true && (\n            <div className=\"delete-prompt\">\n              <i>Remove this integration?</i>\n              <Button color=\"success\" size=\"xs\" onClick={() => { props.onDelete(props.index); }} className=\"ms-2 me-2\">yes</Button>\n              <Button color=\"danger\" size=\"xs\" onClick={() => { setWillDelete(false); }}>no</Button>\n            </div>\n          )}\n\n          {props.isNew === false\n            && willDelete === false\n            && props.editMode === false\n            && allowEditIntegration\n            && (\n              <>\n                {props.addOnCount > 1 && (\n                  <>\n                    <Button\n                      color=\"link\"\n                      className=\"inline\"\n                      size=\"sm\"\n                      onClick={() => props.onMove(props.index, -1)}\n                      disabled={props.index === 0}\n                      title=\"Move up\"\n                    >\n                      <FaIcon icon=\"arrow-up\" size=\"1x\" />\n                    </Button>\n                    <Button\n                      color=\"link\"\n                      className=\"inline\"\n                      size=\"sm\"\n                      onClick={() => props.onMove(props.index, 1)}\n                      disabled={props.index === props.addOnCount - 1}\n                      title=\"Move down\"\n                    >\n                      <FaIcon icon=\"arrow-down\" size=\"1x\" />\n                    </Button>\n                  </>\n                )}\n                <Button\n                  color=\"link\"\n                  className=\"btn-edit inline\"\n                  size=\"sm\"\n                  onClick={() => props.onEditMode(props.index)}\n                  title=\"Edit\"\n                >\n                  <FaIcon icon=\"edit\" size=\"1x\" />\n                </Button>\n                <Button\n                  color=\"link\"\n                  className=\"btn-trash\"\n                  size=\"sm\"\n                  onClick={() => { setWillDelete(true); }}\n                  title=\"Remove\"\n                >\n                  <FaIcon icon=\"trash\" size=\"1x\" />\n                </Button>\n              </>\n          )}\n\n          {props.editMode && (\n            <Button\n              color=\"link\"\n              className=\"btn-edit\"\n              size=\"sm\"\n              onClick={handleCancel}\n              title=\"Cancel\"\n            >\n              <FaIcon icon=\"times\" size=\"sm\" /> Cancel\n            </Button>\n          )}\n        </div>\n\n      </div>\n\n      <CardBody>\n        {hasErrors === true && (\n          <StandardAlert color=\"info\" className=\"validation\">\n            <div>This item has missing or invalid values</div>\n          </StandardAlert>\n        ) }\n        <div className=\"detail-table\">\n          <div className=\"detail-rows\">\n            <Row className=\"detail-row\">\n              <Label sm={2}>Integration</Label>\n              <Col sm={10} className=\"mt-2\">\n\n                <div className=\"value\">\n                  <IntegrationSettings\n                    type=\"enrichment\"\n                    definitions={props.config}\n                    config={tempData.integration}\n                    allowControls={false}\n                    isMulti={false}\n                    editMode={props.editMode && allowEditIntegration}\n                    allowEdit={allowEditSource}\n                    errors={props.errors}\n                    onUpdate={handleChangeIntegration}\n                    onDelete={() => {}}\n                    index={0}\n                  />\n                </div>\n\n              </Col>\n            </Row>\n\n            <Row className=\"detail-row\">\n              <Label sm={2}>Notify Only</Label>\n\n              <Col sm={10} className=\"value\">\n                {props.editMode ? (\n                  <FormGroup className=\" flex-fill mt-2\">\n                    <IconCheckbox\n                      name=\"notify\"\n                      value={Boolean(tempData.notify)}\n                      onChange={handleChangeNotify}\n                    >\n                      Notify Only\n                    </IconCheckbox>\n                    <FormText>By checking this box, we will not wait for this integration to return data.</FormText>\n                  </FormGroup>\n                ) : (\n                  <div className=\"d-inline-block mt-1\">\n                    {props.addOn.notify ? \"Yes\" : \"No\"}\n                  </div>\n                )}\n              </Col>\n            </Row>\n\n          </div>\n        </div>\n\n        {props.editMode && (\n          <div className=\"text-end mt-2\">\n            {props.isNew === true ? (\n              <>\n                <Button size=\"sm\" color=\"link\" className=\"me-2\" onClick={handleCancel} >Cancel</Button>\n                <Button size=\"sm\" onClick={handleApply}>Add</Button>\n              </>\n            ) : (\n              <>\n                <Button size=\"sm\" color=\"link\" className=\"me-2\" onClick={handleCancel} outline>Cancel</Button>\n                <Button size=\"sm\" onClick={handleApply}>Apply</Button>\n              </>\n            )}\n          </div>\n        )}\n\n      </CardBody>\n    </Card>\n  );\n};\n\nEnrichmentForm.propTypes = {\n  addOn: PropTypes.object,\n  addOnCount: PropTypes.number,\n  config: PropTypes.oneOfType([PropTypes.object, PropTypes.array]).isRequired, // configuration for all available integrations\n  editMode: PropTypes.bool,\n  onEditMode: PropTypes.func,\n  onMove: PropTypes.func,\n  errors: PropTypes.object,\n  index: PropTypes.number,\n  isNew: PropTypes.bool,\n  onApply: PropTypes.func.isRequired,\n  onDelete: PropTypes.func.isRequired,\n};\n\nEnrichmentForm.defaultProps = {\n  addOn: {},\n  addOnCount: 0,\n  config: [],\n  editMode: false,\n  errors: {},\n  index: 0,\n  isNew: false,\n};\n\nexport default EnrichmentForm;\n","import React, {useState, useEffect} from 'react';\nimport { Button } from 'reactstrap';\nimport copy from 'fast-copy';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport EnrichmentForm from './EnrichmentForm';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport usePermission from '../../../../Hooks/usePermission';\n\n/*\n * Ordered list of enrichment integrations (DMS-1216) run against the raw lead\n * pre-validation, in matching. They run in array order, each seeing the previous\n * one's merged output.\n */\n\nconst NewEnrichment = {\n  notify: false,\n  integration: { name: '', settings: {} },\n};\n\nconst Enrichments = ({ addOns = [], onChange, errors = {}, loadIntegrations }) => {\n  const allowEditIntegration = usePermission('integrations.edit');\n  const [intConfig, setIntConfig] = useState([]);\n  const [editIndex, setEditIndex] = useState(-1);\n  const [addIndex, setAddIndex] = useState(-1);\n  const [refreshKey, setRefreshKey] = useState(100);\n\n  const _loadIntegrations = async () => {\n    const ints = await loadIntegrations();\n    if (ints) {\n      setIntConfig(ints);\n    }\n  };\n\n  useEffect(() => {\n    _loadIntegrations();\n  }, []);\n\n  const handleApply = (newData) => {\n    if (newData) {\n      const temp = copy(addOns);\n      if (editIndex >= 0 && addOns[editIndex]) {\n        temp[editIndex] = newData;\n        onChange(temp);\n      }\n    }\n    setRefreshKey(refreshKey + 1);\n    setAddIndex(-1);\n    setEditIndex(-1);\n  };\n\n  const handleCreate = () => {\n    onChange([...addOns, copy(NewEnrichment)]);\n    setAddIndex(addOns.length);\n    setEditIndex(addOns.length);\n  };\n\n  const handleDelete = (index) => {\n    const temp = [...addOns];\n    temp.splice(index, 1);\n    onChange(temp);\n    setAddIndex(-1);\n    setEditIndex(-1);\n    setRefreshKey(refreshKey + 1);\n  };\n\n  const handleMove = (index, direction) => {\n    const target = index + direction;\n    if (target < 0 || target >= addOns.length) return;\n    const temp = [...addOns];\n    [temp[index], temp[target]] = [temp[target], temp[index]];\n    onChange(temp);\n    setRefreshKey(refreshKey + 1);\n  };\n\n  return (\n    <div>\n      { Object.keys(errors).length > 0 && (\n        <StandardAlert color=\"info\" className=\"validation\">\n          Please correct the errors below before continuing\n        </StandardAlert>\n      )}\n\n      <StandardAlert color=\"light\" icon=\"info\" className=\"mb-3\">\n        Edge enrichments enrich the raw lead before matching. They run at the edge, before the source&apos;s data validation — so they can map vendor-specific fields onto canonical ones before validation strips anything it doesn&apos;t recognize. They run in order, each seeing the previous one&apos;s merged output.\n      </StandardAlert>\n\n      { addOns.length === 0 && (\n        allowEditIntegration ? (\n          <StandardAlert color=\"light\">\n            No edge enrichments configured.{' '}\n            <Button color=\"link\" className=\"inline\" onClick={handleCreate}>\n              <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />\n              Add Edge Enrichment\n            </Button>\n          </StandardAlert>\n        ) : (\n          <StandardAlert color=\"light\" icon=\"info\">No edge enrichments are configured.</StandardAlert>\n        )\n      )}\n\n      <div key={refreshKey}>\n        {addOns.map((addOn, i) => (\n          <EnrichmentForm\n            key={i}\n            addOn={addOn}\n            addOnCount={addOns.length}\n            config={intConfig}\n            index={i}\n            editMode={editIndex === i && allowEditIntegration}\n            isNew={addIndex === i}\n            errors={errors[i] || {}}\n            onDelete={handleDelete}\n            onApply={handleApply}\n            onEditMode={setEditIndex}\n            onMove={handleMove}\n          />\n        ))}\n        {addOns.length > 0 && allowEditIntegration && (\n        <div className=\"text-end\">\n          <Button color=\"link\" onClick={handleCreate} disabled={editIndex >= 0 || addIndex >= 0}>\n            <FaIcon icon=\"plus\" className=\"me-1\" />\n            Add Edge Enrichment\n          </Button>\n        </div>\n        )}\n      </div>\n\n    </div>\n  );\n};\n\nEnrichments.propTypes = {\n  addOns: PropTypes.array.isRequired,\n  onChange: PropTypes.func.isRequired,\n  errors: PropTypes.object,\n  loadIntegrations: PropTypes.func,\n};\n\nexport default Enrichments;\n","import React, { useContext, useState } from 'react';\nimport {\n  Row, Col, Button, Nav, TabContent, TabPane,\n} from 'reactstrap';\nimport * as Yup from 'yup';\nimport PropTypes from 'prop-types';\nimport useFormState from '../../../../Hooks/useFormState';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {FooterWrapper, BodyWrapper} from \"../../../../Components/Modal\";\nimport { FormTabFlat } from '../../../../Components/Form/FormCommon';\nimport LoadingBar from '../../../../Layout/LoadingBar';\nimport ClickTags from './ClickTags';\nimport Details from './Details';\nimport {RequiredFields} from \"./RequiredFields\";\nimport Enrichments from './Enrichments';\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport SeedDataBuilder from '../../../../Components/Form/SeedDataBuilder';\nimport { SeedDataValidation } from '../../../../Components/Form/SeedDataValidation';\n\n// Register custom Yup validation method (ensures import is not tree-shaken)\nvoid SeedDataValidation;\n\n// Seed data validation rules (empty array - no required fields for Sources)\nconst seedDataValidationRules = [];\n\nconst ValidationSchema = Yup.object().shape({\n  name: Yup.string()\n    .trim()\n    .required('Please enter a source name'),\n  product: Yup.string().trim().required('Please select a product'),\n  // token: Yup.string().trim().when(['$isNew'], (isNew, schema) => {\n  //   if (isNew) {\n  //     // allow it to be anything or empty (will auto-generate)\n  //     return schema.nullable();\n  //   }\n  //   return schema.required('Token is required');\n  // }),\n  vertical_id: Yup.number().transform((n) => (isNaN(n) ? 0 : n)).moreThan(0, 'Please select a vertical'),\n  //vendor_id: Yup.number().transform((n) => (isNaN(n) ? 0 : n)).moreThan(0, 'Please select a vendor'),\n  vendor_billable_duration: Yup.number().transform((n) => ((isNaN(n) || n === null) ? null : parseInt(n))).max(500, 'Maximum billable duration is 500 seconds').nullable(),\n  seed_data: Yup.mixed().validSeedData(seedDataValidationRules, 'Invalid tracking data'),\n});\n\n/*\n * Component for editing or creating a source\n */\nconst Source = ({ source, cancel, onSuccess, isModal }) => {\n  const isNew = source.id === 0;\n  const app = useContext(AppContext);\n\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      ...source,\n      seed_data: Array.isArray(source.seed_data) || !source.seed_data ? {} : source.seed_data,\n      vertical_id: source.vertical?.id ?? '',\n      required_fields: source.required_fields ?? [],\n      // GET returns {integration: {name, settings, timeout, exclude_pii}, notify} per\n      // item — core-api's SourceEnrichmentType validates that same shape (mirrors\n      // EnrichmentAddonType) and mastodon-matching's infra.parseSourceEnrichments\n      // (src/infra/sources_db.go) unwraps it into the runtime []auctions.Integration\n      // it uses, so it stays wrapped end-to-end here too.\n      enrichments: Array.isArray(source.enrichments) ? source.enrichments : [],\n      phone_numbers: source.phone_numbers ?? []\n\n      //vendor_id: source.vendor.id,\n    },\n    ValidationSchema,\n    null,\n    null,\n    { product: source.product, isNew }, // validationContext allows conditional validation\n  );\n\n  const [activeTab, setActiveTab] = useState('details');\n\n  // SeedDataBuilder provides object\n  const handleUpdateSeedData = (obj) => formApi.setValue('seed_data', obj);\n\n  const handleUpdateRequiredFields = (arr) => formApi.handleOnChange('required_fields', arr);\n\n  const handleUpdateEnrichments = (arr) => formApi.handleOnChange('enrichments', arr);\n\n  const loadEnrichmentIntegrations = async () => {\n    const result = await app.api.endpoints.integrations.list({\n      product: formValues.product,\n      vertical_id: formValues.vertical_id,\n      type: 'enrichment',\n      without_account: 1,\n      limit: 1000,\n    });\n    if (result?.data) {\n      // BC handling during api transition // todo remove after transition\n      return result.data.filter((int) => Boolean(int.current_version));\n    }\n    notify(`Unable to load integrations: ${app.api.error?.name}`, 'error');\n    return [];\n  };\n\n  const handleSelectTab = (activeTab) => setActiveTab(activeTab);\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      save();\n    }\n  };\n\n  const save = async () => {\n    app.showLoader('modal', isNew ? 'Creating source...' : 'Saving source...');\n    let result;\n    const data = { ...formValues };\nconsole.log(\"index.js:data from form values\", data);\n    data.name = data.name.trim();\n    //if (!data.vendor_id && data.vendor) data.vendor_id = data.vendor.id;\n    if (!data.vertical_id && data.vertical) data.vertical_id = data.vertical.id;\n\n    // format number to +18885552222  (masking should give us +1 already)\n    if (data.phone_number) {\n      data.phone_number = data.phone_number.replace(/[^\\d\\+]/g, '');\n    }\n\n    data.seed_data = data.seed_data && Object.keys(data.seed_data).length > 0\n      ? JSON.stringify(data.seed_data)\n      : null\n\n    // enrichments (wrapped {integration, notify} shape) is sent as-is, like\n    // click_tags/required_fields — core-api's SourceEnrichmentType validates it and\n    // stores it unchanged; mastodon-matching is what unwraps \"integration\".\n\n    // We're not updating these from the sources end yet\n    delete data.channel_eligibilities;\n\n    if (isNew) {\n      result = await app.api.endpoints.sources.create(data);\n    } else {\n      result = await app.api.endpoints.sources.update(data);\n    }\n\n    app.showLoader(false);\n\n    // {form:\n    //   token.token: \"This token already exists on another source\"\n    //   message: \"\"\n    //   name: \"Invalid Request\"\n    //   status: 400\n    // }\n\n    if (result) {\n      notify(`The source has been saved`, 'success');\n      onSuccess(result, isNew)\n    } else {\n      // Could get 'name already exists' error\n      if (app.api.error.form && app.api.error.form['token.token']) {\n        // TODO: error handling for tabs\n        notify(`Unable to save source: ${app.api.error.form['token.token']}`, 'error');\n      } else {\n        notify(`Unable to save source: ${app.api.error.name}`, 'error');\n      }\n    }\n  };\n\n  return (\n    <>\n      <BodyWrapper isModal={isModal}>\n        <LoadingBar name=\"modal\" />\n\n        {!formIsValid\n        && (\n          <StandardAlert color=\"warning\">\n            Please correct the errors below before continuing\n          </StandardAlert>\n        )}\n\n        <Nav className=\"mastodon-tabs\">\n          <FormTabFlat\n            id=\"details\"\n            label=\"Details\"\n            activeTab={activeTab}\n            setActive={handleSelectTab}\n          />\n\n          <FormTabFlat\n            id=\"required_fields\"\n            label=\"Required Fields\"\n            activeTab={activeTab}\n            setActive={handleSelectTab}\n          />\n\n          {source.product === 'clicks' && (\n            <FormTabFlat\n              id=\"tags\"\n              label=\"Click Tags\"\n              activeTab={activeTab}\n              setActive={handleSelectTab}\n            />\n          )}\n\n          <FormTabFlat\n            id=\"seed_data\"\n            label=\"Tracking Data\"\n            activeTab={activeTab}\n            setActive={handleSelectTab}\n          />\n\n          <FormTabFlat\n            id=\"enrichments\"\n            label=\"Edge Enrichments\"\n            activeTab={activeTab}\n            setActive={handleSelectTab}\n          />\n\n        </Nav>\n\n        <div className=\"source-form\">\n\n          <TabContent\n            activeTab={activeTab}\n            className=\"rules-transition\"\n          >\n            <TabPane tabId=\"details\">\n              <Details\n                source={formValues}\n                errors={formErrors}\n                onChange={formApi.handleOnChange}\n                isNew={isNew}\n              />\n            </TabPane>\n\n            {source.product === 'clicks' && (\n              <TabPane tabId=\"tags\">\n                <Row>\n                  <Col sm={12} md={9}>\n                    <ClickTags clickTags={formValues.click_tags} onChange={formApi.handleOnChange} />\n                  </Col>\n                </Row>\n              </TabPane>\n            )}\n\n            <TabPane tabId=\"required_fields\">\n              <Row>\n                <Col sm={12} >\n\n                    <RequiredFields\n                      requiredFields={formValues.required_fields}\n                      verticalId={formValues.vertical_id}\n                      onChange={handleUpdateRequiredFields}\n                    />\n\n\n                </Col>\n              </Row>\n\n            </TabPane>\n            <TabPane tabId=\"seed_data\">\n              <Row className=\"mb-2\">\n                <Col sm={12} md={10} lg={8}>\n                  <p>Tracking data are identifiers and metadata that attribute sources, vendors, or campaigns, and\n                    enable analytics, monitoring, and reporting.</p>\n                  {formErrors.seed_data && (\n                    <StandardAlert color=\"danger\" icon=\"alert\" className=\"mb-3\">\n                    <div style={{whiteSpace: 'pre-line'}}>{formErrors.seed_data}</div>\n                    </StandardAlert>\n                  )}\n                  <SeedDataBuilder\n                    seedData={formValues.seed_data}\n                    verticalId={formValues.vertical_id || 0}\n                    product={formValues.product}\n                    onUpdate={handleUpdateSeedData}\n                    validationRules={seedDataValidationRules}\n                  />\n                </Col>\n              </Row>\n\n            </TabPane>\n\n            <TabPane tabId=\"enrichments\">\n              <Row>\n                <Col sm={12}>\n                  <Enrichments\n                    addOns={formValues.enrichments}\n                    onChange={handleUpdateEnrichments}\n                    errors={formErrors.enrichments || {}}\n                    loadIntegrations={loadEnrichmentIntegrations}\n                  />\n                </Col>\n              </Row>\n            </TabPane>\n\n          </TabContent>\n\n        </div>\n      </BodyWrapper>\n\n\n      <FooterWrapper isModal={isModal} className=\"mt-2 text-end\">\n        <Button\n          onClick={cancel}\n          color=\"link\"\n          size=\"sm\"\n        >\n          Cancel\n        </Button>\n        <Button\n          onClick={handleSave}\n          color=\"primary\"\n          size=\"sm\"\n        >\n          Save\n        </Button>\n\n      </FooterWrapper>\n\n    </>\n  );\n};\n\nSource.propTypes = {\n  source: PropTypes.object,\n  cancel: PropTypes.func,\n  onSuccess: PropTypes.func,\n  isModal:PropTypes.bool\n};\n\nexport default Source;\n\n","import React, { useContext, useEffect, useState, useRef, useMemo} from 'react';\nimport PropTypes from 'prop-types';\nimport { useDebouncedCallback } from 'use-debounce';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Button } from 'reactstrap';\nimport { TreeContext } from '../../../Components/Rules/TreeProvider';\nimport PageSection from '../../../Layout/PageSection';\nimport TreeBranch from '../../../Components/Rules/TreeBranch';\nimport InputWithIcon from '../../../Components/Form/InputWithIcon';\nimport SimpleSelect from '../../../Components/Form/SimpleSelect';\nimport usePermission from '../../../Hooks/usePermission';\nimport {singularOrPlural} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport Sticky from \"react-stickynode\";\n\n/*\n * Component for sidebar tree view. Renders root branch, which recurses for all sub-branches.\n */\nconst RuleTree = ({\n  rule,\n  selectedRule,\n  ancestors,\n  ruleComponent,\n  isLoading,\n  isModal\n}) => {\n  const treeContext = useContext(TreeContext)\n  const containerRef = useRef()\n  const scrollRef = useRef()\n  const [treeHeight, setTreeHeight] = useState('100%')\n  const [scrollPosition, setScrollPosition] = useState(0)\n // const [expandedNodes, setExpandedNodes] = useState([])\n  const allowIntegration = usePermission('integrations.edit')\n  const allowAdvanced = usePermission('rules_advanced.edit')\n\n\n  // The tree can get much taller than the form area, which mean that without adjustments,\n  // there can be a lot of vertical ups and downs if you're clicking on a rule at the bottom\n  // of the tree then going back up to the form, then back down.\n  // To alleviate this:\n  // 1) contain the tree in a scrollable div,\n  // 2) Automatically adjust the height so it stretches to the bottom of the viewport.\n  // 3) Make the top of the container sticky, so it doesn't scroll out of view\n  const updateTreeHeight = () => {\n    if (containerRef.current) {\n      const containerRect = containerRef.current.getBoundingClientRect()\n      const top = Math.max(containerRect.top, 60);\n      const height = (window.innerHeight - top - 70)\n\n      setTreeHeight( Math.max(height, 200) + 'px')\n    }\n  }\n\n  const handleStickyStateChange = (status) => {\n    if (status.status === Sticky.STATUS_FIXED) {\n      updateTreeHeight()\n    }\n  };\n\n  const handleScroll = (e) => {\n    setScrollPosition(e.target.scrollTop)\n  }\n\n\n  useEffect(()=> {\n    updateTreeHeight();\n    window.addEventListener('scroll', updateTreeHeight)\n    window.addEventListener('resize', updateTreeHeight)\n\n    // clean up events on unmount\n    return () => window.removeEventListener('scroll', updateTreeHeight)\n    return () => window.removeEventListener('resize', updateTreeHeight)\n  }, [containerRef.current, rule])\n\n  //restore scroll position after re-load\n  useEffect(()=> {\n\n    if (!isLoading && scrollRef.current && scrollPosition > 0) {\n      //localize scope for timeout\n      const currentPos = scrollPosition\n      const element = scrollRef.current\n      setTimeout(() => {\n          element.scroll({top:currentPos,behavior:'auto'});\n      }, (300));\n    }\n\n  }, [isLoading])\n\n\n  const filterOptions = useMemo(() => {\n    let options = [\n      { value: 'sale_match_caps', label: 'Caps' },\n      { value: 'margin', label: 'Margin' },\n      { value: 'flow_control', label: 'Flow Control' },\n      { value: 'sell_strategy', label: 'Sell Strategy' },\n      { value: 'disabled', label: 'Disabled status' },\n      { value: 'post_sale', label: 'Post-sale integrations' },\n      { value: 'sale_conditions', label: 'Sale Conditions' },\n      { value: 'match_conditions', label: 'Targets' },\n      { value: 'advanced', label: 'Advanced rule settings' },\n    ];\n\n    // Filter out options based on product or permissions\n    // Note: memo dependent on isLoading because order (which has product) might not have loaded yet\n    options = allowIntegration ? options : options.filter((opt) => opt.value !== 'post_sale' && opt.value !== 'prefill' && opt.value !== 'proxy_bidding');\n    options = allowAdvanced ? options : options.filter(opt => !['advanced','dba'].includes(opt.value) );\n    return options;\n  }, [isLoading]);\n\n  const searchResult = treeContext.getMatches(rule);\n\n  const handleSearchDebounced = useDebouncedCallback((val) => {\n    treeContext.setSearch(val);\n  }, 400);\n\n  return (\n\n\n      <div className=\"col-rule-tree\" id=\"col-rule-tree\">\n      <Sticky enabled={!isModal} top={60} onStateChange={handleStickyStateChange}>\n        <ConditionalPageSection isPage={!isModal} title=\"Rule Tree\" className=\"me-3\">\n        <div ref={containerRef}  style={{height:treeHeight}} className=\"d-flex flex-column\">\n\n            {rule.rules.length > 0\n                && (\n                <>\n                  <div>\n\n                    <InputWithIcon\n                      icon=\"search\"\n                      iconSize=\"sm\"\n                      placeholder=\"Search by name\"\n                      name=\"search_term\"\n                      containerClass=\"expands\"\n                      defaultValue=\"\"\n                      onChange={(e) => handleSearchDebounced(e.target.value)}\n                      onClear={treeContext.clearSearch}\n                      className=\"mb-2\"\n                    />\n\n                  </div>\n\n                  <div className=\"mb-2\">\n\n                    <SimpleSelect\n                      isClearable\n                      isSearchable\n                      onChange={treeContext.setFilter}\n                      options={filterOptions}\n                      value={treeContext.filter}\n                      tabSelectsValue\n                      backspaceRemovesValue\n                      isMulti={false}\n                      controlShouldRenderValue\n                      hideSelectedOptions={false}\n                      closeMenuOnSelect\n                      placeholder=\"Rules with...\"\n                    />\n\n                  </div>\n\n                  <div className=\"text-end\">\n                    <Button className=\"inline\" color=\"link\" size=\"sm\" onClick={treeContext.expandAll} title=\"Expand All\">\n                      <FaIcon icon=\"expand-arrows-alt\" size=\"sm\" />\n                    </Button>\n                    <Button className=\"inline ms-1\" color=\"link\" size=\"sm\" onClick={treeContext.collapse} title=\"Collapse\">\n                      <FaIcon icon=\"compress-arrows-alt\" size=\"sm\" />\n                    </Button>\n                  </div>\n\n                </>\n                )}\n\n            {treeContext.isFiltered && (\n            <div className=\"filter-result d-flex justify-content-between align-items-center\">\n              <div>\n                Search Result:\n                {' '}\n                {treeContext.filteredResultCount || 'no'}\n                {' '}\n                {singularOrPlural(treeContext.filteredResultCount, 'rule', 'rules')}\n                {' '}\n                found\n              </div>\n              <Button size=\"sm\" color=\"link\" onClick={treeContext.clearSearch}><FaIcon icon=\"times\" size=\"sm\" /></Button>\n            </div>\n            )}\n\n            <div className=\"tree-scrollable thin-scrollbar flex-fill\" ref={scrollRef} onScroll={handleScroll}>\n              <TreeBranch\n                rule={searchResult}\n                selectedRule={selectedRule}\n                ancestors={ancestors}\n                ruleComponent={ruleComponent}\n                level={0}\n              />\n\n            </div>\n\n        </div>\n        </ConditionalPageSection>\n     </Sticky>\n    </div>\n\n  );\n};\n\nRuleTree.propTypes = {\n  rule: PropTypes.object.isRequired,\n  ruleComponent: PropTypes.func.isRequired,\n  selectedRule: PropTypes.object,\n  ancestors: PropTypes.array,\n  isLoading: PropTypes.bool,\n  isModal: PropTypes.bool,\n};\n\nRuleTree.defaultProps = {\n  selectedRule: null,\n  ancestors: [],\n};\n\nexport default RuleTree;\n\nconst ConditionalPageSection = ({isPage, title, children, className=\"\"}) => {\n  return isPage ? (\n    <PageSection title={title} className={className}>{children}</PageSection>\n  ): children\n}\n","import React, { useContext, useState, useEffect } from 'react';\nimport { Button } from 'reactstrap';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport RulesContext from '../../../Providers/RulesContext';\nimport { TreeContext } from '../../../Components/Rules/TreeProvider';\nimport BidDisplay from '../../../Components/Rules/BidDisplay';\nimport RuleIcons from '../../../Components/Rules/RuleIcons';\nimport { RoutingIconSet } from '../../../Components/Rules/constants';\n\n/**\n * Component for one item in the routing rules tree\n *\n * Note for future dev: the only difference between this and advertiser TreeRule\n * is this one has a button for opening rule actions\n * (in advertiser rules, the button and actions panel is in RulesConfig).\n * TODO: use a shared TreeRule, make actions panel work the same in both areas.\n */\nconst TreeRule = ({\n  rule, expanded, setExpanded, level, parentDisabled,\n}) => {\n  const rulesContext = useContext(RulesContext);\n  const treeContext = useContext(TreeContext);\n  const [bidEditMode, setBidEditMode] = useState(false);\n  // const[bidDelta, setBidDelta] = useState(null);\n  // const[bidWarning, setBidWarning] = useState(null);\n\n  const toggleBranch = (e) => {\n    e.stopPropagation();\n    setExpanded(!expanded);\n  };\n\n  // TODO: inline bidding\n  // const handleBidClick = (e) =>{\n  //   e.stopPropagation();\n  //   treeContext.setCurrentBidEdit(rule.id);\n  //   setBidEditMode(true);\n  // };\n\n  // If context tells us that rule focus has changed, set the bid edit mode if we are on this rule\n  // (allows tabbing from rule to rule while in edit mode)\n  useEffect(() => {\n    if (treeContext.currentBidEdit === rule.id) {\n      setBidEditMode(true);\n    }\n  }, [treeContext.currentBidEdit]);\n\n  const isSelected = rulesContext.selectedRule && rule.id === rulesContext.selectedRule.id;\n\n  const isDisabled = rule.disabled || parentDisabled;\n\n  return (\n    <div className={classnames(['tree-leaf', { root: level === 0 }])} id={`rule-${rule.id}`}>\n\n      <div\n        className={classnames('rule', {\n          'is-selected': isSelected,\n          'is-folder': rule.rules.length,\n          disabled: isDisabled,\n          'flow-include': rule.flow_control === 'include',\n          'flow-exclude': rule.flow_control === 'exclude',\n        })}\n        onClick={() => rulesContext.api.setSelected(rule)}\n      >\n\n        <div className=\"rule-descriptors\">\n          {rule.flow_control === 'include' && <div className=\"descriptor flow-control\">Include Only</div> }\n          {rule.flow_control === 'exclude' && <div className=\"descriptor flow-control exclude\">Exclude All</div> }\n        </div>\n\n        <div className=\"d-flex  align-items-center flex-wrap\">\n\n          {isDisabled && <FaIcon icon=\"ban\" className=\"me-1\" title=\"Rule disabled\" />}\n          <div className=\"rule-tree-label flex-fill\">\n            {!expanded && rule.rules.length > 0 && (\n              <span className=\"rule-child-count me-1\">\n                (\n                {rule.rules.length}\n                )\n              </span>\n            )}\n            {rule.label}\n          </div>\n\n          <div className=\"d-flex ms-auto align-items-center\">\n            {bidEditMode === false &&\n              <RuleIcons\n              size=\"sm\" rule={rule}\n              ruleType=\"routing\"\n              product={treeContext.product}\n              iconSet={RoutingIconSet}\n            />}\n\n            <BidDisplay\n              ruleId={rule.id}\n              ruleType=\"routing\"\n              {...rule.bidding}\n              clickHandler={() => {}}\n            />\n\n            <div className=\"rule-actions\">\n              { isSelected && rulesContext.allowEdit && (\n\n              <Button\n                color=\"link\"\n                className=\"m-0 pl-2\"\n                size=\"sm\"\n                disabled={rule.isNew}\n                onClick={rulesContext.api.toggleActionsPane}\n                title=\"Rule Actions\"\n              >\n                <FaIcon icon=\"ellipsis-v\" size=\"sm\" />\n              </Button>\n              )}\n            </div>\n          </div>\n\n        </div>\n\n      </div>\n\n    </div>\n  );\n};\n\nTreeRule.propTypes = {\n  rule: PropTypes.object,\n  expanded: PropTypes.bool,\n  setExpanded: PropTypes.func,\n  level: PropTypes.number,\n};\n\nTreeRule.defaultProps = {\n  expanded: true,\n};\n\nexport default TreeRule;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Nav } from 'reactstrap';\nimport { FormTabFlat } from '../../../Components/Form/FormCommon';\n\n/*\n * Navigation for RulesConfig form\n */\n\nconst NavTabs = ({\n  activeTab, onSelectTab, isSectionValid, allowAdvanced, product,\n}) => (\n  <Nav className=\"mastodon-tabs\">\n    <FormTabFlat\n      id=\"summary\"\n      label=\"Summary\"\n      activeTab={activeTab}\n      setActive={onSelectTab}\n      isValid\n    />\n    {/* <FormTabFlat id=\"bidding\"\n                       label=\"Bidding\"\n                       activeTab={activeTab}\n                       isValid={isSectionValid('bidding')}\n                       setActive={onSelectTab}\n          /> */}\n    <FormTabFlat\n      id=\"bidding\"\n      label=\"Settings\"\n      activeTab={activeTab}\n      setActive={onSelectTab}\n      isValid={isSectionValid('bidding')}\n    />\n    <FormTabFlat\n      id=\"targeting\"\n      label=\"Targeting\"\n      activeTab={activeTab}\n      setActive={onSelectTab}\n      isValid={isSectionValid('targeting')}\n    />\n    <FormTabFlat\n      id=\"caps\"\n      label=\"Caps & Dupes\"\n      activeTab={activeTab}\n      setActive={onSelectTab}\n      isValid={isSectionValid('caps')}\n    />\n    <FormTabFlat\n      id=\"integrations\"\n      label=\"Integrations\"\n      activeTab={activeTab}\n      setActive={onSelectTab}\n      isValid={isSectionValid('integrations')}\n    />\n\n    {/* MST-1970 hide schedule tab, sows confusion and chaos\n            <FormTabFlat id=\"activity\"\n                         label=\"Schedule\"\n                         activeTab={activeTab}\n                         setActive={onSelectTab}\n                         isValid={isSectionValid('activity')}\n            />\n            */}\n\n    {product === 'clicks'\n            && (\n            <FormTabFlat\n              id=\"tracking\"\n              label=\"Tracking\"\n              activeTab={activeTab}\n              setActive={onSelectTab}\n              isValid={isSectionValid('tracking')}\n            />\n            )}\n\n    {allowAdvanced && (\n    <FormTabFlat\n      id=\"advanced\"\n      label=\"Advanced\"\n      activeTab={activeTab}\n      setActive={onSelectTab}\n      isValid={isSectionValid('advanced')}\n    />\n    )}\n\n  </Nav>\n);\n\nNavTabs.propTypes = {\n  activeTab: PropTypes.string,\n  onSelectTab: PropTypes.func,\n  isSectionValid: PropTypes.func,\n  allowAdvanced: PropTypes.bool,\n  product: PropTypes.string,\n};\n\nNavTabs.defaultProps = {\n  activeTab: '1',\n  onSelectTab: () => {},\n  isSectionValid: true,\n};\n\nexport default NavTabs;\n","import React, {\n  useContext, useState, useEffect, useRef,\n} from 'react';\nimport {\n  Button,\n  Form, FormFeedback,\n  FormGroup, Input,\n  Spinner,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { useDebouncedCallback } from 'use-debounce';\nimport PropTypes from 'prop-types';\nimport RulesContext from '../../../Providers/RulesContext';\nimport usePermission from '../../../Hooks/usePermission'\n\n/*\n * Header area at top of rule config section, has rule name and operations like copy & move\n */\nconst Header = ({ rule, onChange, errors = {}, allowEdit = true }) => {\n  const rulesContext = useContext(RulesContext);\n  const [label, setLabel] = useState(rule.label);\n  const [isLabelUpdating, setIsLabelUpdating] = useState(false);\n  const [labelEditMode, setLabelEditMode] = useState(!!rule.isNew);\n  const labelInputRef = useRef(null);\n  const allowViewChangeLog = usePermission('changes.view')\n\n  const handleUpdateLabelClick = async () => {\n    setIsLabelUpdating(true);\n    const result = await rulesContext.api.updateRule({ label }); // updates label and saves rule independent of other rule values\n    if (result) {\n      onChange('label', label); // update form state\n      setIsLabelUpdating(false);\n      setLabelEditMode(false);\n    }\n  };\n\n  const handleChangeLabel = useDebouncedCallback((value) => {\n    onChange('label', value);\n  }, 400);\n\n  // Focus on label input when in label edit mode\n  useEffect(() => {\n    if (labelEditMode === true && labelInputRef.current) {\n      labelInputRef.current.select();\n    }\n  }, [labelEditMode]);\n\n  // For when we use the paste function to paste settings into a new rule, update label\n  useEffect(() => {\n    if (rule.isNew && labelInputRef.current) {\n      labelInputRef.current.value = rule.label;\n    }\n  }, [rule.label]);\n\n  if (!rule) return (null);\n\n  return (\n    <div className=\"rule-header\">\n      {labelEditMode === false && (\n        <div className=\"rule-title flex-fill\">\n          <h5 className=\"card-title\">\n            RULE: <span className=\"subtitle\">{rule.label}</span>\n            {allowEdit && (\n              <Button color=\"link\" onClick={() => setLabelEditMode(true)} size=\"sm\">\n                <FaIcon icon=\"pencil-alt\" size=\"sm\" />\n              </Button>\n            )}\n          </h5>\n        </div>\n      )}\n\n      {/* If rule is new, show validated name field */}\n      {rule.isNew === true && allowEdit && (\n        <div className=\"rule-title label-edit\">\n          <FormGroup inline>\n            {/* <Label>Rule Name <Required/> </Label> */}\n\n            <Input\n              type=\"text\"\n              name=\"label\"\n              size=\"25\"\n              defaultValue={rule.label}\n              onChange={(e) => handleChangeLabel(e.target.value)}\n              innerRef={labelInputRef}\n              invalid={!!errors.label}\n            />\n            <FormFeedback>{errors.label}</FormFeedback>\n\n          </FormGroup>\n\n        </div>\n      )}\n\n      {/* Synchronous editing of name (saves the new name on clicking check button, independent of other edits). Toolbar is hidden. */}\n      {labelEditMode === true && !rule.isNew && allowEdit && (\n        <div className=\"rule-title label-edit mb-2\">\n          <Form inline>\n            <Input type=\"text\" value={label} onChange={(e) => setLabel(e.target.value)} innerRef={labelInputRef} />\n            {isLabelUpdating === false ? (\n              <>\n                <Button\n                  color=\"primary\"\n                  size=\"sm\"\n                  className=\"ms-1\"\n                  disabled={label.trim().length === 0}\n                  onClick={handleUpdateLabelClick}\n                >\n                  <FaIcon icon=\"check\" />\n                </Button>\n                <Button color=\"secondary\" size=\"sm\" outline className=\"ms-1\" onClick={() => setLabelEditMode(false)}><FaIcon icon=\"times\" /></Button>\n              </>\n            ) : (\n              <Spinner size=\"sm\" color=\"secondary\" className=\"ms-2\" />\n            )}\n\n          </Form>\n\n        </div>\n      )}\n\n      <div>\n        {/* <Button color=\"link\" size=\"sm\" className=\"p-0\" onClick={rulesContext.api.toggleActionsPane} title=\"Rule Actions\">\n          <FaIcon icon=\"ellipsis-v\"/>\n        </Button> */}\n        {allowViewChangeLog && (\n          <Button\n            color=\"link\"\n            size=\"sm\"\n            onClick={rulesContext.api.viewRuleChanges}\n            title=\"Rule change history\"\n            className=\"inline me-2\"\n          >\n            <FaIcon icon=\"history\" />\n          </Button>\n        )}\n      </div>\n\n    </div>\n  );\n};\n\nHeader.propTypes = {\n  rule: PropTypes.object,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n  allowEdit: PropTypes.bool,\n};\n\n\nexport default Header;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport JSONPretty from 'react-json-prettify';\nimport { idea } from 'react-json-prettify/dist/themes';\nimport RulesContext from '../../../Providers/RulesContext';\nimport {\n  SummaryItemWrapper,\n  FlowControlSummary,\n  TargetingSummary,\n  RoutingCapsSummary,\n  BiddingSummary,\n  BidFalloffSummary,\n  EnrichmentSummary,\n  DestinationSummary,\n  PingDedupeCapsSummary,\n  SellStrategySummary,\n} from '../../../Components/Rules/Summaries';\n\n/*\n * Summary page for Routing rules\n */\nconst RuleSummary = ({\n  rule, allowAdvanced, gotoTab,\n}) => {\n  const rulesContext = useContext(RulesContext);\n\n  if (!rule) return (null);\n\n  return (\n    <div>\n      <div className=\"rule-summary-section\">\n\n        <div className=\"rule-summary\">\n\n          <FlowControlSummary\n            flowControl={rule.flow_control}\n            gotoTab={gotoTab}\n          />\n\n          <BiddingSummary\n            ruleType=\"routing\"\n            {...rule.bidding}\n            floor={rule.account_bid_floor}\n            bidRandomizationMin={rule.bid_randomization_min}\n            bidRandomizationMax={rule.bid_randomization_max}\n            gotoTab={gotoTab}\n            label=\"Payout/Margin\"\n          />\n\n          <TargetingSummary\n            attributes={rulesContext.attributes}\n            targets={rule.match_conditions}\n            matchIsRequired={rule.match_is_required}\n            expression={rule.match_expression}\n            gotoTab={gotoTab}\n          />\n\n          <BidFalloffSummary\n            bidFalloff={rule.bid_falloff}\n            gotoTab={gotoTab}\n          />\n\n          <SellStrategySummary\n            sellStrategy={rule.sell_strategy}\n            gotoTab={gotoTab}\n          />\n\n          <RoutingCapsSummary\n            caps={rule.sale_caps}\n            timezone={rule.caps_timezone}\n            title=\"Sale Caps\"\n            gotoTab={gotoTab}\n          />\n\n          <RoutingCapsSummary\n            caps={rule.match_caps}\n            title=\"Match Caps\"\n            timezone={rule.caps_timezone}\n            gotoTab={gotoTab}\n          />\n          <PingDedupeCapsSummary\n            caps={rule.ping_dedupe}\n            title=\"Ping Dedupe Caps\"\n            timezone={rule.caps_timezone}\n            gotoTab={gotoTab}\n          />\n\n          <EnrichmentSummary\n            attributes={rulesContext.attributes}\n            enrichments={rule.enrichment_addons}\n            integrations={[]}\n            tabName=\"integrations\"\n            gotoTab={gotoTab}\n          />\n\n          <DestinationSummary\n            isRouting={true}\n            product=\"\"\n            postSale={rule.delivery_destinations}\n            tabName=\"integrations\"\n            gotoTab={gotoTab}\n          />\n\n          {allowAdvanced && (\n          <AdvancedSummary\n            internalData={rule.internal_data}\n            title=\"Advanced Settings\"\n            gotoTab={gotoTab}\n          />\n          )}\n\n          {/*\n  MST-1970 hide schedule tab, sows confusion and chaos\n          <ActivityScheduleSummary schedule={rule.schedule} timezone={timezone} gotoTab={gotoTab}/>\n\n*/}\n\n        </div>\n\n      </div>\n\n    </div>\n\n  );\n};\n\nconst AdvancedSummary = ({ internalData, title, gotoTab }) => {\n  if (!internalData) return (null);\n\n  return (\n    <SummaryItemWrapper className=\"advanced-settings-summary\" label={title} tabId=\"advanced\" icon=\"cog\" gotoTab={gotoTab}>\n      <JSONPretty json={internalData} theme={idea} />\n    </SummaryItemWrapper>\n  );\n};\n\nRuleSummary.propTypes = {\n  rule: PropTypes.object,\n  gotoTab: PropTypes.func,\n  timezone: PropTypes.string,\n  allowAdvanced: PropTypes.bool,\n};\n\nRuleSummary.defaultProps = {\n\n};\n\nexport default RuleSummary;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { Spinner } from 'reactstrap';\nimport EnhancedSelect from './EnhancedSelect';\nimport { DbaOptionLabel } from './Select/DbaOptionLabel';\nimport useApi from '../../Hooks/useApi';\n\n/**\n * Pre-configured select component for choosing buyer DBAs\n * Automatically fetches and displays buyers with proper formatting\n */\nconst BuyerSelect = ({\n  value,\n  onChange,\n  isMulti = false,\n  placeholder = 'Select buyer DBA',\n  isDisabled = false,\n  isInvalid = false,\n  ...selectProps\n}) => {\n  const { api } = useApi();\n  const [buyerOptions, setBuyerOptions] = useState([]);\n  const [isLoading, setIsLoading] = useState(true);\n\n  useEffect(() => {\n    loadBuyers();\n  }, []);\n\n  const loadBuyers = async () => {\n    const result = await api.endpoints.dbas.list({ limit: 1000 });\n    if (result) {\n      setBuyerOptions(result.data);\n    }\n    setIsLoading(false);\n  };\n\n  if (isLoading) {\n    return (\n      <div className=\"inline-loading\">\n        <Spinner size=\"sm\" />\n        {' '}\n        Loading buyers...\n      </div>\n    );\n  }\n\n  return (\n    <EnhancedSelect\n      isClearable\n      isSearchable\n      onChange={onChange}\n      options={buyerOptions}\n      value={value}\n      tabSelectsValue\n      backspaceRemovesValue\n      isMulti={isMulti}\n      controlShouldRenderValue\n      closeMenuOnSelect={!isMulti}\n      placeholder={placeholder}\n      isInvalid={isInvalid}\n      formatOptionLabel={DbaOptionLabel}\n      getOptionValue={(opt) => opt.name}\n      getOptionLabel={(opt) => opt.name}\n      isDisabled={isDisabled}\n      {...selectProps}\n    />\n  );\n};\n\nBuyerSelect.propTypes = {\n  value: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),\n  onChange: PropTypes.func.isRequired,\n  isMulti: PropTypes.bool,\n  placeholder: PropTypes.string,\n  isDisabled: PropTypes.bool,\n  isInvalid: PropTypes.bool,\n};\n\nexport default BuyerSelect;\n","import React, { useRef, useContext } from 'react';\nimport {\n  Button, Col, FormGroup, FormText, Row, Label, Input, FormFeedback,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport RulesContext from '../../../Providers/RulesContext';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport IntegrationSettings from '../../../Components/Rules/IntegrationSettings';\nimport useCollectionTracker from '../../../Hooks/useCollectionTracker';\nimport usePermission from '../../../Hooks/usePermission';\nimport {useDebouncedCallback} from \"use-debounce\";\nimport BuyerSelect from '../../../Components/Form/BuyerSelect';\n\nconst BiddingIntegration = ({ biddingIntegration = {}, errors = {}, onChange }) => {\n  const rulesContext = useContext(RulesContext);\n  const allowEdit = usePermission('integrations.edit');\n  const definitionsRef = useRef(rulesContext.api.getIntegrationDefinitionsByType('bidding'));\n  const {\n    api: collection,\n    willDeleteIndex,\n    editIndex,\n    addMode,\n  } = useCollectionTracker();\n\n  const handleIntegrationUpdate = (integration) => onChange({ ...biddingIntegration, integration });\n\n  const handleBuyerUpdate = (value) => {\n    onChange({\n      ...biddingIntegration,\n      buyer_name: value,\n    });\n  };\n\n  const handleDelete = () => {\n    collection.onDelete();\n    onChange({});\n  };\n\n  const handleAdd = () => {\n    collection.add(0);\n    onChange({\n      integration: { name: '', settings: {} },\n    });\n  };\n\n  // Don't show anything if user can't edit and no integration exists (MST-979)\n  if (!allowEdit && !biddingIntegration.integration) {\n    return (null);\n  }\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Bidding Integration</div>\n\n      <p>Calculate vendor payout through an integration</p>\n\n      {definitionsRef.current.length === 0 &&\n        <StandardAlert color=\"light\" icon=\"alert\">No integration configurations found</StandardAlert>}\n\n      <Row>\n        <Col lg={12} xl={9}>\n\n          {!allowEdit &&\n            <StandardAlert color=\"light\">Managing this setting requires additional permissions.</StandardAlert>}\n\n          {biddingIntegration.integration !== undefined ? (\n            <>\n              <IntegrationSettings\n                config={biddingIntegration.integration}\n                definitions={definitionsRef.current}\n                type=\"bidding\"\n                editMode={editIndex === 0}\n                isNew={addMode}\n                errors={errors}\n                onUpdate={handleIntegrationUpdate}\n                onDelete={handleDelete}\n                onApply={collection.apply}\n                setEdit={collection.edit}\n                willDelete={willDeleteIndex === 0}\n                setWillDelete={(i) => collection.setWillDeleteIndex(i)}\n                allowEdit={allowEdit}\n                allowControls={allowEdit}\n              />\n\n              <div className=\"d-flex mt-3\">\n                <FormGroup className=\"me-3\">\n                  <Label>Buyer Name</Label>\n                  <div style={{width:'320px'}}>\n                    <BuyerSelect\n                      value={biddingIntegration.buyer_name}\n                      onChange={handleBuyerUpdate}\n                      isDisabled={!allowEdit}\n                    />\n                  </div>\n                  <FormText>Focus integration bidding on one buyer.</FormText>\n                </FormGroup>\n              </div>\n\n              <div className=\"d-flex mt-3\">\n                {/*<FormGroup className=\"me-3\">*/}\n                {/*  <Label>Bid Floor</Label>*/}\n                {/*  <MaskedInput*/}\n                {/*    mask={currencyMask}*/}\n                {/*    defaultValue={proxy.bid_floor}*/}\n                {/*    onChange={(e) => handleChangeFloorDebounced(e.target.value)}*/}\n                {/*    disabled={!allowEdit}*/}\n                {/*    render={(ref, props) => <InputWithIcon className=\"teeny\" innerRef={ref} icon=\"dollar-sign\" {...props} />}*/}\n                {/*  />*/}\n                {/*</FormGroup>*/}\n              </div>\n            </>\n          ) : (\n            <>\n              {allowEdit && (\n                <Button color=\"link\" onClick={handleAdd} disabled={editIndex !== null}>\n                  <FaIcon icon=\"plus\" className=\"me-1\"/>\n                  Add Bidding Integration\n                </Button>\n              )}\n            </>\n\n          )}\n\n        </Col>\n      </Row>\n\n    </div>\n\n  );\n};\n\nBiddingIntegration.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  biddingIntegration: PropTypes.object.isRequired,\n  errors: PropTypes.object,\n};\nexport default BiddingIntegration;\n","import React, { useRef, useContext } from 'react';\nimport { Button, Col, Row } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport RulesContext from '../../../Providers/RulesContext';\nimport { StandardAlert } from '@thedmsgroup/mastodon-ui-components';\nimport IntegrationSettings from '../../../Components/Rules/IntegrationSettings';\nimport useCollectionTracker from '../../../Hooks/useCollectionTracker';\nimport usePermission from '../../../Hooks/usePermission';\n\nconst ValueEstimatorIntegration = ({ valueEstimatorIntegration = {}, errors = {}, onChange }) => {\n  const rulesContext = useContext(RulesContext);\n  const allowEdit = usePermission('integrations.edit');\n  const definitionsRef = useRef(rulesContext.api.getIntegrationDefinitionsByType('value_estimator'));\n  const {\n    api: collection,\n    willDeleteIndex,\n    editIndex,\n    addMode,\n  } = useCollectionTracker();\n\n  const handleIntegrationUpdate = (integration) => onChange({ ...valueEstimatorIntegration, integration });\n\n  const handleDelete = () => {\n    collection.onDelete();\n    onChange({});\n  };\n\n  const handleAdd = () => {\n    collection.add(0);\n    onChange({\n      integration: { name: '', settings: {} },\n    });\n  };\n\n  // Don't show anything if user can't edit and no integration exists (MST-979)\n  if (!allowEdit && !valueEstimatorIntegration.integration) {\n    return (null);\n  }\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Value Estimator Integration</div>\n\n      <p>Estimate the value of a listing through an integration. Only used when the value estimator above is set to Integration.</p>\n\n      {definitionsRef.current.length === 0 &&\n        <StandardAlert color=\"light\" icon=\"alert\">No integration configurations found</StandardAlert>}\n\n      <Row>\n        <Col lg={12} xl={9}>\n\n          {!allowEdit &&\n            <StandardAlert color=\"light\">Managing this setting requires additional permissions.</StandardAlert>}\n\n          {valueEstimatorIntegration.integration !== undefined ? (\n            <IntegrationSettings\n              config={valueEstimatorIntegration.integration}\n              definitions={definitionsRef.current}\n              type=\"value_estimator\"\n              editMode={editIndex === 0}\n              isNew={addMode}\n              errors={errors}\n              onUpdate={handleIntegrationUpdate}\n              onDelete={handleDelete}\n              onApply={collection.apply}\n              setEdit={collection.edit}\n              willDelete={willDeleteIndex === 0}\n              setWillDelete={(i) => collection.setWillDeleteIndex(i)}\n              allowEdit={allowEdit}\n              allowControls={allowEdit}\n            />\n          ) : (\n            <>\n              {allowEdit && (\n                <Button color=\"link\" onClick={handleAdd} disabled={editIndex !== null}>\n                  <FaIcon icon=\"plus\" className=\"me-1\"/>\n                  Add Value Estimator Integration\n                </Button>\n              )}\n            </>\n          )}\n\n        </Col>\n      </Row>\n\n    </div>\n  );\n};\n\nValueEstimatorIntegration.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  valueEstimatorIntegration: PropTypes.object.isRequired,\n  errors: PropTypes.object,\n};\nexport default ValueEstimatorIntegration;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Row, Col, FormGroup, FormText, FormFeedback, Label, Input,\n} from 'reactstrap';\nimport {MaskedInput, MaskedInputGroup} from \"@thedmsgroup/mastodon-ui-components/lib/components/Form/MaskedInput\";\nimport useImaskNiceAccept from \"../../../Hooks/useImaskNiceAccept\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport BidWidget from '../../../Components/Rules/BidWidget';\nimport classnames from 'classnames';\nimport BiddingIntegration from \"./BiddingIntegration\";\nimport ValueEstimatorIntegration from \"./ValueEstimatorIntegration\";\nimport {SellStrategyLabels, SellStrategyDescriptions, ValueEstimatorLabels, ValueEstimatorDescriptions} from \"../../../Components/Rules/constants\";\n\n\nconst DurationMaskOptions = {\n  mask: Number,\n  unmask: true,\n  scale:0,\n  min:0,\n  max:300,\n  signed: false,\n}\nconst PercentMaskOptions = {\n  mask: Number,\n  unmask: true,\n  scale:0,\n  min:0,\n  max:999,\n  signed: false,\n}\n\nconst RandomizationPercentMaskOptions = {\n  mask: Number,\n  unmask: true,\n  scale:4,\n  min:-50,\n  max:50,\n  signed: true,\n}\n\nconst CurrencyMaskOptions = {\n  mask: Number,\n  unmask: true,\n  padFractionalZeros: true,\n  normalizeZeros: true,\n  scale:2,\n  min:0,\n  max:9999,\n  radix:\".\",\n  thousandsSeparator:\",\",\n  signed: false,\n}\n\nconst flowControlLabels = {\n  '': 'None',\n  include: 'Include only leads that match target conditions',\n  exclude: 'Exclude all leads that match target conditions',\n};\n\nconst Settings = ({\n  product,\n  bidding,\n  biddingIntegration,\n  bidFloor,\n  bidFalloff,\n  flowControl,\n  sellStrategy,\n  valueEstimator,\n  valueEstimatorIntegration,\n  billableCallDuration,\n  bidRandomizationMin,\n  bidRandomizationMax,\n  onChange,\n  isActiveTab,\n  errors,\n  allowEdit = true,\n}) => {\n\n  const {onAccept:onAcceptBillableDuration} = useImaskNiceAccept((val, mask)=>onChange('billable_call_duration', mask.masked.unmaskedValue));\n  const {onAccept:onAcceptBidFalloff} = useImaskNiceAccept((val, mask)=>onChange('bid_falloff', mask.masked.unmaskedValue));\n  const {onAccept:onAcceptBidFloor} = useImaskNiceAccept((val, mask)=>onChange('account_bid_floor', mask.masked.unmaskedValue));\n  const {onAccept:onAcceptBidRandomizationMin} = useImaskNiceAccept((val, mask)=>onChange('bid_randomization_min', mask.masked.unmaskedValue));\n  const {onAccept:onAcceptBidRandomizationMax} = useImaskNiceAccept((val, mask)=>onChange('bid_randomization_max', mask.masked.unmaskedValue));\n\n\n  return (\n    <div>\n      {Object.keys(errors).length > 0\n      && (\n      <StandardAlert color=\"info\" className=\"validation\">\n        Please correct the errors below before continuing\n      </StandardAlert>\n      )}\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Payout/Margin</div>\n\n        <BidWidget\n          {...bidding}\n          onChange={onChange}\n          isActiveTab={isActiveTab}\n          errors={errors}\n          ruleType=\"routing\"\n          allowEdit={allowEdit}\n        />\n\n          <FormGroup className=\"d-inline-block me-3\">\n            <Label>Bid Floor</Label>\n            {allowEdit ? (\n              <MaskedInputGroup\n                value={bidFloor || bidFloor === 0 ? bidFloor.toString() : '' }\n                onAccept={onAcceptBidFloor}\n                bsSize=\"sm\"\n                invalid={!!errors.bid_floor}\n                className=\"teeny\"\n                prefix=\"$\"\n                {...CurrencyMaskOptions}\n              />\n            ) : (\n              <div>{bidFloor || bidFloor === 0 ? `$${parseFloat(bidFloor).toFixed(2)}` : '—'}</div>\n            )}\n        </FormGroup>\n      </div>\n\n      <BiddingIntegration\n        biddingIntegration={biddingIntegration}\n        onChange={(config) => onChange('bidding_integration', config)}\n        //errors={proxyError}\n      />\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Selling Strategy</div>\n        {allowEdit ? (\n          <Row>\n            <Col sm={12} md={8}>\n              <FormGroup tag=\"fieldset\">\n                <FormGroup check  className={classnames('detailed', {selected:!sellStrategy})}>\n                  <div>\n                    <Input\n                      name=\"sell_strategy\"\n                      type=\"radio\"\n                      value=\"\"\n                      defaultChecked={!sellStrategy}\n                      onChange={onChange}\n                    />\n                    {' '}\n                    <Label check>\n                      Default / Inherit\n                    </Label>\n                  </div>\n                  <FormText>Use the strategy of the parent rule, or default to Attempt Once.</FormText>\n                </FormGroup>\n                <FormGroup check className={classnames('detailed', {selected:sellStrategy === 'legs'})}>\n                  <div>\n                    <Input\n                      name=\"sell_strategy\"\n                      type=\"radio\"\n                      value=\"legs\"\n                      defaultChecked={sellStrategy === 'legs'}\n                      onChange={onChange}\n                    />\n                    {' '}\n                    <Label check>\n                      Attempt Once\n                    </Label>\n                    <FormText>{SellStrategyDescriptions.legs}</FormText>\n                  </div>\n                </FormGroup>\n                <FormGroup  check  className={classnames('detailed', {selected:sellStrategy === 'legs_sequential'})}>\n                  <div>\n                    <Input\n                      name=\"sell_strategy\"\n                      type=\"radio\"\n                      value=\"legs_sequential\"\n                      defaultChecked={sellStrategy === 'legs_sequential'}\n                      onChange={onChange}\n                    />\n                    {' '}\n                    <Label check>\n                      Attempt Multiple\n                    </Label>\n                  </div>\n                  <FormText>{SellStrategyDescriptions.legs_sequential}</FormText>\n                </FormGroup>\n                <FormGroup  check  className={classnames('detailed', {selected:sellStrategy === 'waterfall'})}>\n                  <div>\n                    <Input\n                      name=\"sell_strategy\"\n                      type=\"radio\"\n                      value=\"waterfall\"\n                      defaultChecked={sellStrategy === 'waterfall'}\n                      onChange={onChange}\n                    />\n                    {' '}\n                    <Label check>\n                      Waterfall\n                    </Label>\n                  </div>\n                  <FormText>{SellStrategyDescriptions.waterfall}</FormText>\n                </FormGroup>\n                <FormGroup  check  className={classnames('detailed', {selected:sellStrategy === 'arbitrage'})}>\n                  <div>\n                    <Input\n                      name=\"sell_strategy\"\n                      type=\"radio\"\n                      value=\"arbitrage\"\n                      defaultChecked={sellStrategy === 'arbitrage'}\n                      onChange={onChange}\n                    />\n                    {' '}\n                    <Label check>\n                      Arbitrage\n                    </Label>\n                  </div>\n                  <FormText>{SellStrategyDescriptions.arbitrage}</FormText>\n                </FormGroup>\n              </FormGroup>\n            </Col>\n          </Row>\n        ) : (\n          <div>{SellStrategyLabels[sellStrategy || ''] || sellStrategy || '—'}</div>\n        )}\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Value Estimator</div>\n        {allowEdit ? (\n          <FormGroup className=\"d-flex\">\n            <div style={{ flexBasis: '400px' }}>\n              <Input\n                type=\"select\"\n                name=\"value_estimator\"\n                value={valueEstimator || ''}\n                onChange={onChange}\n              >\n                <option value=\"\">Default / Inherit</option>\n                <option value=\"simple_ctr\">Simple CTR</option>\n                <option value=\"static_ctr\">Static CTR</option>\n                <option value=\"integration\">Integration</option>\n              </Input>\n              <FormText>\n                {valueEstimator ? ValueEstimatorDescriptions[valueEstimator] : 'Use the strategy of the parent rule, or default to Simple CTR.'}\n              </FormText>\n            </div>\n          </FormGroup>\n        ) : (\n          <div>{ValueEstimatorLabels[valueEstimator || ''] || valueEstimator || '—'}</div>\n        )}\n      </div>\n\n      <ValueEstimatorIntegration\n        valueEstimatorIntegration={valueEstimatorIntegration}\n        onChange={(config) => onChange('value_estimator_integration', config)}\n      />\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Bid Falloff</div>\n        <p>The percentage difference to top bid at which lesser bids drop off (i.e. don&apos;t show bids lower than 80%\n          of top bid)</p>\n        <p>This &quot;compresses&quot; bids towards the top and prevents a low bid from distracting from a high bid.</p>\n        <FormGroup>\n          {allowEdit ? (\n            <MaskedInputGroup\n              value={bidFalloff || bidFalloff === 0 ? bidFalloff.toString() : ''}\n              onAccept={onAcceptBidFalloff}\n              bsSize=\"sm\"\n              invalid={!!errors.bid_falloff}\n              className=\"teeny text-end\"\n              suffix=\"%\"\n              {...PercentMaskOptions}\n            />\n          ) : (\n            <div>{bidFalloff || bidFalloff === 0 ? `${bidFalloff}%` : '—'}</div>\n          )}\n        </FormGroup>\n\n\n        <p>Example: <ul>\n          <li>original bids: $10, $8, $7</li>\n          <li>bid falloff = 80%</li>\n          <li>= $8 threshold (80% of $10)</li>\n          <li>= new bids: $10, $8</li>\n        </ul></p>\n\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Bid Randomization</div>\n        <p>Bid randomization introduces controlled randomness into external bidding for all external buying.\n          {' '}This will help to implement machine learning into our bidding strategies.\n        </p>\n        <p>Randomization is a positive or negative change in bid price (restricted to +- 50%). Existing floors or\n          ceilings are still respected.</p>\n        <FormGroup>\n          <Label>Minimum</Label>\n          {allowEdit ? (\n            <>\n              <MaskedInputGroup\n                value={bidRandomizationMin || bidRandomizationMin === 0 ? bidRandomizationMin.toString() : ''}\n                onAccept={onAcceptBidRandomizationMin}\n                bsSize=\"sm\"\n                invalid={!!errors.bid_randomization_min}\n                className=\"teeny text-end\"\n                suffix=\"%\"\n                {...RandomizationPercentMaskOptions}\n              />\n              <FormFeedback>{errors.bid_randomization_min}</FormFeedback>\n              <FormText>Usually negative, but may be positive as long as it is less than maximum</FormText>\n            </>\n          ) : (\n            <div>{bidRandomizationMin || bidRandomizationMin === 0 ? `${bidRandomizationMin}%` : '—'}</div>\n          )}\n        </FormGroup>\n        <FormGroup>\n          <Label>Maximum</Label>\n          {allowEdit ? (\n            <>\n              <MaskedInputGroup\n                value={bidRandomizationMax || bidRandomizationMax === 0 ? bidRandomizationMax.toString() : ''}\n                onAccept={onAcceptBidRandomizationMax}\n                bsSize=\"sm\"\n                invalid={!!errors.bid_randomization_max}\n                className=\"teeny text-end\"\n                suffix=\"%\"\n                {...RandomizationPercentMaskOptions}\n              />\n              <FormFeedback>{errors.bid_randomization_max}</FormFeedback>\n            </>\n          ) : (\n            <div>{bidRandomizationMax || bidRandomizationMax === 0 ? `${bidRandomizationMax}%` : '—'}</div>\n          )}\n        </FormGroup>\n\n\n        <p>Example: if bid is $10 and randomization is between -5% and +5%, the bid will range between $9.50 and\n          $10.50. </p>\n        <p>Both minimum and maximum are required (but may be zero). Leave both fields blank if no randomization is\n          desired.</p>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Flow Control</div>\n\n        <p>Restrictively include (whitelist) or exclude (blacklist) matching leads. This setting will apply to all\n          descendant rules unless overidden.</p>\n        <p>\n          If not set, targeting will not by itself limit leads. This is preferred if you use targeting to apply other settings, such as\n          payout, caps, or schedule.\n        </p>\n\n        <FormGroup className=\"mt-2 d-flex\">\n          {allowEdit ? (\n            <div style={{ flexBasis: '400px' }}>\n              <Input\n                type=\"select\"\n                name=\"flow_control\"\n                value={flowControl || ''}\n                onChange={onChange}\n              >\n                <option value=\"\">None</option>\n                <option value=\"include\">Include only leads that match target conditions</option>\n                <option value=\"exclude\">Exclude all leads that match target conditions</option>\n              </Input>\n            </div>\n          ) : (\n            <div>{flowControlLabels[flowControl || ''] || flowControl || '—'}</div>\n          )}\n        </FormGroup>\n      </div>\n\n      {product === 'calls' && (\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Call Settings</div>\n          <FormGroup>\n            <Label>Billable Call Duration (seconds)</Label>\n\n            {allowEdit ? (\n              <>\n                <MaskedInput\n                  value={billableCallDuration || billableCallDuration === 0 ? billableCallDuration.toString() : ''}\n                  onAccept={onAcceptBillableDuration}\n                  bsSize=\"sm\"\n                  placeholder=\"30\"\n                  invalid={!!errors.billable_call_duration}\n                  className=\"teeny\"\n                  {...DurationMaskOptions}\n                />\n                <FormText>Number of seconds before the call becomes billable. Defaults to 30 seconds. Maximum: 300 (5 minutes).</FormText>\n                <FormFeedback>{errors.billable_call_duration}</FormFeedback>\n              </>\n            ) : (\n              <div>{billableCallDuration || billableCallDuration === 0 ? `${billableCallDuration} seconds` : '—'}</div>\n            )}\n\n          </FormGroup>\n        </div>\n      )}\n\n    </div>\n  );\n};\n\nSettings.propTypes = {\n  bidding: PropTypes.object,\n  bidFloor: PropTypes.number,\n  bidFalloff: PropTypes.number,\n  billableCallDuration: PropTypes.number,\n  bidRandomizationMin: PropTypes.number,\n  bidRandomizationMax: PropTypes.number,\n  isActiveTab: PropTypes.bool,\n  flowControl: PropTypes.string,\n  sellStrategy: PropTypes.string,\n  valueEstimator: PropTypes.string,\n  valueEstimatorIntegration: PropTypes.object,\n  product: PropTypes.string,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n  allowEdit: PropTypes.bool,\n};\n\nexport default Settings;\n","import React, { useState } from 'react';\nimport { Row, Col, Input, Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {MaskedInput} from \"@thedmsgroup/mastodon-ui-components/lib/components/Form/MaskedInput\";\nimport useImaskNiceAccept from \"../../../Hooks/useImaskNiceAccept\";\nimport {Stack, RowDivider} from \"@thedmsgroup/mastodon-ui-components\";\nimport PropTypes from 'prop-types';\nimport {CapTimeframeChoices} from \"../../../Components/Table/Table\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\n\nconst NumberMaskOptions = {\n  mask: Number,\n  unmask: \"typed\",\n  scale:0,\n  max:99999999,\n  signed: false,\n  radix:\".\",\n  thousandsSeparator:\",\"\n}\n\n/*\n * CapsType\n * A titled section that lists caps for a given cap type\n * with options to edit and add.\n *\n * Caps are saved in the data as a single object {daily:10, weekly:100}\n * It's easier to work with a collection so we convert it to an array\n * and work with that in local state.\n\n */\nconst CapsType = ({\n  title, description, caps, onChange, error, allowEdit = true,\n}) => {\n  // Convert caps object to array of objects\n  const [capsCollection, setCapsCollection] = useState(Object.entries(caps).map(\n    ([timeframe, cap]) => ({ timeframe, cap }),\n  ));\n\n  const capsToObject = (rows) => {\n    const obj = {};\n    rows.map((c) => { obj[c.timeframe] = c.cap.toString().replace(/[^\\d]/, ''); });\n    return obj;\n  };\n\n  const addCap = () => {\n    const newVal = [...capsCollection, { timeframe: '', cap: '' }];\n    setCapsCollection(newVal);\n    onChange(capsToObject(newVal));\n  };\n\n  const handleRemove = (index) => {\n    const temp = [...capsCollection];\n    temp.splice(index, 1);\n    setCapsCollection(temp);\n    onChange(capsToObject(temp));\n  };\n\n  const handleChangeCap = (capValue, index) => {\n    if (capsCollection[index]) {\n      const newVal = [...capsCollection];\n      newVal[index].cap = capValue;\n      setCapsCollection(newVal);\n      onChange(capsToObject(newVal));\n    }\n  };\n\n  const handleChangeTimeframe = (timeframe, index) => {\n\n    if (capsCollection[index]) {\n      const newVal = [...capsCollection];\n      newVal[index].timeframe = timeframe;\n      setCapsCollection(newVal);\n      onChange(capsToObject(newVal));\n    }\n  };\n\n  const getTimeframesUsed = () => capsCollection.map((c) => c.timeframe);\n\n  return (\n    <>\n\n      {error\n      && (\n      <StandardAlert color=\"warning\">\n        {error}\n      </StandardAlert>\n      )}\n\n      <div className=\"form-section caps-container \">\n        <div className=\"form-section-header\">\n          {title}\n\n        </div>\n        <p>{description}</p>\n        {capsCollection.length === 0 && (\n          allowEdit ? (\n            <StandardAlert color=\"light\">\n              <span>\n                No caps are configured.\n                <Button color=\"link\" className=\"inline ms-2\" onClick={addCap}>\n                  <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />\n                  <span>Add a cap</span>\n                </Button>\n              </span>\n            </StandardAlert>\n          ) : (\n            <span className=\"text-muted\">None configured</span>\n          )\n        )}\n\n        <Row>\n          <Col sm={12} md={8} lg={6}>\n            <Stack gap=\"0.75em\" divider={<RowDivider />} >\n\n              {capsCollection.map((item, i) => (\n                <CapRow\n                  cap={item.cap !== null ? item.cap.toString() : ''}\n                  timeframe={item.timeframe}\n                  timeframesUsed={getTimeframesUsed()}\n                  onRemove={() => handleRemove(i)}\n                  onChangeCap={(val) => handleChangeCap(val, i)}\n                  onChangeTimeframe={(e) => handleChangeTimeframe(e.target.value, i)}\n                  key={`m-cap-${i}`}\n                  allowEdit={allowEdit}\n                />\n              ))}\n            </Stack>\n          </Col>\n        </Row>\n\n\n        {capsCollection.length > 0 && allowEdit && (\n        <div className=\"text-right\">\n          <Button color=\"link\" onClick={addCap}>\n            <FaIcon icon=\"plus\" />\n            {' '}\n            <span>Add Cap</span>\n          </Button>\n        </div>\n        )}\n      </div>\n\n    </>\n  );\n};\n\nconst CapRow = ({\n  cap,\n  timeframe,\n  timeframesUsed,\n  onRemove,\n  onChangeCap,\n  onChangeTimeframe,\n  allowEdit = true,\n}) => {\n  const {onAccept} = useImaskNiceAccept(onChangeCap);\n\n  if (!allowEdit) {\n    return (\n      <Row className=\"cap-row align-items-center\">\n        <Col sm={6}>\n          <span>{CapTimeframeChoices[timeframe] || timeframe || '—'}</span>\n        </Col>\n        <Col sm={4}>\n          <span>{cap || '—'}</span>\n        </Col>\n      </Row>\n    );\n  }\n\n  return (\n    <Row className=\"cap-row align-items-center\">\n\n      <Col sm={6}>\n        <Input\n          type=\"select\"\n          value={timeframe}\n          onChange={onChangeTimeframe}\n          name=\"timeframe\"\n          required\n        >\n          <option value=\"\" data-default hidden>Timeframe...</option>\n\n          {Object.entries(CapTimeframeChoices).map(([val, label], i) => {\n            // disable if timeframe already used in another entry\n            const disabled = (val !== timeframe && timeframesUsed.includes(val));\n            return <option value={val} key={i} disabled={disabled}>{label}</option>;\n          })}\n        </Input>\n      </Col>\n\n      <Col sn={4}>\n        <MaskedInput\n          value={cap}\n          onAccept={onAccept}\n          bsSize=\"sm\"\n          placeholder=\"Cap\"\n          {...NumberMaskOptions}\n        />\n      </Col>\n\n      <Col sm={2} className=\"text-end\">\n        <Button onClick={onRemove} color=\"link\" size=\"sm\" title=\"Remove\">\n          <FaIcon icon=\"times\" color=\"darkred\"/>\n        </Button>\n      </Col>\n\n    </Row>\n  )\n};\n\nCapsType.propTypes = {\n  title: PropTypes.string,\n  description: PropTypes.string,\n  caps: PropTypes.object,\n  onChange: PropTypes.func,\n  error: PropTypes.string,\n  allowEdit: PropTypes.bool,\n};\n\nexport default CapsType;\n","import React from 'react';\nimport { Row, Col, Input, Button, FormFeedback } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {MaskedInputGroup} from \"@thedmsgroup/mastodon-ui-components/lib/components/Form/MaskedInput\";\nimport {Stack, RowDivider, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport PropTypes from 'prop-types';\nimport IconCheckbox from \"../../../Components/Form/IconCheckbox\";\nimport useImaskNiceAccept from \"../../../Hooks/useImaskNiceAccept\";\n\nconst NumberMaskOptions = {\n  mask: Number,\n  unmask: \"typed\",\n  scale:0,\n  max:999999,\n  signed: false,\n  radix:\".\",\n  thousandsSeparator:\",\"\n}\n\n// A valid key expression is a single expression string, e.g. \"{universal_lead_id}\"\nconst isValidKeyExpression = (value) => {\n  const trimmed = (value || '').trim();\n  return trimmed.startsWith('{') && trimmed.endsWith('}') && trimmed.length > 2;\n};\n\n/*\n * PingDedupeType\n *\n * A titled section that lists dedupe rules with options to edit and add.\n */\nconst PingDedupeType = ({\n  title, description, dedupeRules = [], onChange, error, allowEdit = true,\n}) => {\n\n  const addEntry = () => {\n    const newVal = [...dedupeRules, { duration: \"\", key_expression: \"\" }];\n    onChange(newVal);\n  };\n\n  const handleRemove = (index) => {\n    const temp = [...dedupeRules];\n    temp.splice(index, 1);\n    onChange(temp);\n  };\n\n  const handleChangeKeyExpression = (value, index) => {\n    if (dedupeRules[index]) {\n      const newVal = [...dedupeRules];\n      newVal[index].key_expression = value;\n      onChange(newVal);\n    }\n  };\n\n  const handleChangeDuration = (duration, index) => {\n    if (dedupeRules[index]) {\n      const newVal = [...dedupeRules];\n      newVal[index].duration = duration;\n      onChange(newVal);\n    }\n  };\n\n  const handleChangeCacheResponse = (value, index) => {\n    if (dedupeRules[index]) {\n      const newVal = [...dedupeRules];\n      newVal[index].cache_response = value;\n      onChange(newVal);\n    }\n  };\n\n  return (\n    <>\n\n      {error\n      && (\n      <StandardAlert color=\"warning\">\n        {error}\n      </StandardAlert>\n      )}\n\n      <div className=\"form-section caps-container mb-4\">\n        <div className=\"form-section-header\">\n          {title}\n\n        </div>\n        <p>{description}</p>\n        {dedupeRules.length === 0 && (\n          allowEdit ? (\n            <StandardAlert color=\"light\">\n              <span>\n                No dedupe rules are configured.\n                <Button color=\"link\" className=\"inline ms-2\" onClick={addEntry}>\n                  <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />\n                  <span>Add a Dedupe Rule</span>\n                </Button>\n              </span>\n            </StandardAlert>\n          ) : (\n            <span className=\"text-muted\">None configured</span>\n          )\n        )}\n\n\n        <Stack gap=\"0.75em\" divider={<RowDivider />} >\n          {dedupeRules.map((item, i) => (\n            <PingDedupeRow\n              keyExpression={item.key_expression}\n              cacheResponse={item.cache_response}\n              duration={item.duration !== null ? item.duration.toString() : ''}\n              onRemove={() => handleRemove(i)}\n              onChangeKeyExpression={(e) => handleChangeKeyExpression(e.target.value, i)}\n              onChangeDuration={(val) => handleChangeDuration(val, i)}\n              onChangeCacheResponse={(name, value) => handleChangeCacheResponse(value, i)}\n              key={`m-cap-${i}`}\n              allowEdit={allowEdit}\n            />\n          ))}\n        </Stack>\n\n\n        {dedupeRules.length > 0 && allowEdit && (\n        <div className=\"text-right\">\n          <Button color=\"link\" onClick={addEntry}>\n            <FaIcon icon=\"plus\" />\n            {' '}\n            <span>Add Dedupe Rule</span>\n          </Button>\n        </div>\n        )}\n      </div>\n\n    </>\n  );\n};\n\nconst PingDedupeRow = ({\n  keyExpression,\n  duration,\n  cacheResponse,\n  onRemove,\n  onChangeKeyExpression,\n  onChangeDuration,\n  onChangeCacheResponse,\n  allowEdit = true,\n}) => {\n  const {onAccept:onAcceptDuration} = useImaskNiceAccept(onChangeDuration);\n\n  if (!allowEdit) {\n    return (\n      <Row className=\"cap-row align-items-center\">\n        <Col sm={5}>\n          <span>{keyExpression || '—'}</span>\n        </Col>\n        <Col sm={3}>\n          <span>{duration ? `${duration} seconds` : '—'}</span>\n        </Col>\n        <Col sm={2}>\n          <span>{cacheResponse ? 'Cache Response' : ''}</span>\n        </Col>\n      </Row>\n    );\n  }\n\n  return (\n    <Row className=\"cap-row align-items-center\">\n\n      <Col sm={5}>\n        <Input\n          name=\"key_expression\"\n          value={keyExpression}\n          onChange={onChangeKeyExpression}\n          placeholder=\"Key Expression\"\n          invalid={!!keyExpression && !isValidKeyExpression(keyExpression)}\n        />\n        <FormFeedback>\n          Expression must start with &#123; and end with &#125;, e.g. &#123;universal_lead_id&#125;\n        </FormFeedback>\n      </Col>\n\n      <Col sm={3}>\n        <MaskedInputGroup\n          suffix=\"seconds\"\n          value={duration}\n          onAccept={onAcceptDuration}\n          bsSize=\"sm\"\n          {...NumberMaskOptions}\n        />\n      </Col>\n      <Col sm={2}>\n        <IconCheckbox\n          name=\"cache_response\"\n          value={Boolean(cacheResponse)}\n          onChange={onChangeCacheResponse}\n        >\n          Cache Response\n        </IconCheckbox>\n      </Col>\n\n      <Col sm={1}>\n        <Button onClick={onRemove} color=\"link\" size=\"sm\" title=\"Remove\"><FaIcon icon=\"times\" color=\"darkred\"/></Button>\n      </Col>\n\n    </Row>\n  )\n};\n\nPingDedupeType.propTypes = {\n  title: PropTypes.string,\n  description: PropTypes.string,\n  dedupeRules: PropTypes.array,\n  onChange: PropTypes.func,\n  error: PropTypes.string,\n  allowEdit: PropTypes.bool,\n};\n\nexport default PingDedupeType;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {TimezoneOptions} from '../../../Components/Form/FormCommon';\nimport {Row, Col, Input, InputGroup, FormText} from \"reactstrap\";\nimport CapsType from './CapsType';\nimport PingDedupeType from \"./PingDedupeType\";\n\n/*\n * Tab content where we edit match caps and sale caps.\n */\nconst Caps = ({\n  capsTimezone, matchCaps, saleCaps, pingDedupes, onChange, errors, allowEdit = true,\n}) => {\n\n  const handleChangeMatchCaps = React.useCallback((caps) => onChange('match_caps', caps));\n  const handleChangeSaleCaps = React.useCallback((caps) => onChange('sale_caps', caps));\n  const handleChangePingDedupe = React.useCallback((dedupes) => onChange('ping_dedupe', dedupes));\n\n  return (\n    <>\n      <Row>\n        <Col sm={12} md={10} lg={7}>\n          <div className=\"form-section\">\n            <div className={\"form-section-header\"}>Cap Timezone</div>\n            <p>Sale and match cap timeframes will be calculated in this timezone. The constraint applies to child rules,\n              unless\n              overridden by those rules.</p>\n\n              {allowEdit ? (\n                <>\n                  <InputGroup>\n                    <Input\n                      type=\"select\"\n                      onChange={onChange}\n                      value={capsTimezone ?? ''}\n                      name=\"caps_timezone\"\n                    >\n                      <option value=\"\" key=\"none-cap-tz\">Select a timezone...</option>\n                      {TimezoneOptions.map((zone, i) => <option value={zone.value} key={i}>{zone.name}</option>)}\n                    </Input>\n                  </InputGroup>\n                  <FormText>\n                    If no timezone is selected, UTC will be used.\n                  </FormText>\n                </>\n              ) : (\n                <div>\n                  {capsTimezone\n                    ? (TimezoneOptions.find((z) => z.value === capsTimezone) || {}).name || capsTimezone\n                    : 'UTC (default)'}\n                </div>\n              )}\n\n          </div>\n        </Col>\n      </Row>\n\n\n      <CapsType\n        title=\"Sale Caps\"\n        description=\"Limit the number of sales within a timeframe\"\n        className=\"sale-caps\"\n        caps={saleCaps}\n        onChange={handleChangeSaleCaps}\n        error={errors.sale_caps}\n        allowEdit={allowEdit}\n      />\n\n      <CapsType\n        title=\"Match Caps\"\n        description=\"Limit the number of matches within a timeframe\"\n        className=\"match-caps\"\n        onChange={handleChangeMatchCaps}\n        caps={matchCaps}\n        error={errors.match_caps}\n        allowEdit={allowEdit}\n      />\n\n      <PingDedupeType\n        title=\"Ping Dedupe\"\n        description=\"Dedupe pings within a timeframe\"\n        className=\"ping-dedupe\"\n        onChange={handleChangePingDedupe}\n        dedupeRules={pingDedupes}\n        error={errors.ping_dedupe}\n        allowEdit={allowEdit}\n      />\n\n    </>\n  );\n};\n\nCaps.propTypes = {\n  capsTimezone: PropTypes.string,\n  matchCaps: PropTypes.object,\n  saleCaps: PropTypes.object,\n  pingDedupes: PropTypes.array,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n  allowEdit: PropTypes.bool,\n};\n\nexport default Caps;\n","import React, { useEffect } from 'react';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport PixelForm from '../../../Components/Form/PixelForm';\nimport useUniqueKeyArray from '../../../Hooks/useUniqueKeyArray';\nimport useDidMount from '../../../Hooks/useDidMount';\n\n/*\n * Tracking: a page for entering tracking pixels associated with a rule.\n */\nconst Tracking = ({ clickTags, onChange, allowEdit = true }) => {\n  const didMount = useDidMount();\n\n  const {\n    items,\n    addItem,\n    removeItem,\n    updateItem,\n  } = useUniqueKeyArray(clickTags);\n\n  // Update rule on state change\n  useEffect(() => {\n    if (didMount) {\n      onChange('click_tags', items.map((item) => item.value));\n    }\n  }, [items]);\n\n  if (!allowEdit) {\n    return (\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Click Pixels</div>\n        {(!clickTags || clickTags.length === 0) ? (\n          <span className=\"text-muted\">No pixels configured</span>\n        ) : (\n          clickTags.map((url, i) => (\n            <div key={i} className=\"mb-1\"><code>{url}</code></div>\n          ))\n        )}\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Click Pixels</div>\n      <p>Enter URLs or tags for tracking clicks.</p>\n\n      {items.length === 0\n        && (\n        <StandardAlert color=\"light\">\n          <span>\n            No click pixels are configured.\n            <Button color=\"link\" className=\"inline ms-1\" onClick={addItem}>\n              <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />\n              <span>Add a pixel</span>\n            </Button>\n&nbsp;\n          </span>\n        </StandardAlert>\n        )}\n\n      <div>\n\n        {items.map((tag, i) => (\n          <PixelForm\n            pixel={tag.value}\n            className=\"click-pixel\"\n            handleRemove={() => removeItem(i)}\n            handleChange={(val) => updateItem(i, val)}\n            key={tag.key}\n          />\n        ))}\n\n        {items.length > 0 && (\n          <div className=\"text-right\">\n            <Button color=\"link\" onClick={addItem}>\n              <FaIcon icon=\"plus\" />\n              {' '}\n              <span>Add Another</span>\n            </Button>\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nTracking.propTypes = {\n  clickTags: PropTypes.array,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n  allowEdit: PropTypes.bool,\n};\n\nexport default Tracking;\n","import React, { useContext, useState, useEffect } from 'react';\nimport {\n  Button,\n  DropdownItem,\n  DropdownMenu,\n  DropdownToggle,\n  UncontrolledDropdown,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport CopyWidget from '../../../Components/Rules/CopyWidget';\nimport MoveWidget from '../../../Components/Rules/MoveWidget';\nimport lazify from '../../../utils/Lazify';\nimport RulesContext from '../../../Providers/RulesContext';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\n\nconst LazyBatchRuleModal = lazify(() => import(/* webpackChunkName: \"RuleModals\" */ '../../../Components/Rules/BatchRuleModal'));\n// const LazySettingCopyModal = lazy( () => import(/* webpackChunkName: \"RuleModals\" */ \"../../../Components/Rules/SettingCopyModal\"));\n// const LazySettingPasteModal = lazy( () => import(/* webpackChunkName: \"RuleModals\" */ \"../../../Components/Rules/SettingPasteModal\"));\n\nconst ActionHeader = ({ label, setActionMode }) => (\n  <div className=\"header d-flex align-items-baseline\">\n    <Button onClick={() => setActionMode(null)} color=\"transparent\"><FaIcon icon=\"arrow-left\" size=\"1x\" className=\"me-2\" /></Button>\n    <h5 className=\"flex-fill\">{label}</h5>\n  </div>\n);\n\n/*\n * ACTIONS PANEL\n * Slide-out panel for Rule Manager containing rule actions like copy, add, bulk update, etc\n * Some actions are done within the menu, and others will open a modal or do some other external action\n */\nconst ActionsPanel = (props) => {\n  const rulesContext = useContext(RulesContext);\n  const [actionMode, setActionMode] = useState(null);\n  const [batchRuleModal, setBatchRuleModal] = useState(false);\n  // const[settingCopyModal, setSettingCopyModal] = useState(false);\n  // const[settingPasteModal, setSettingPasteModal] = useState(false);\n  // const allowTransferSettings = usePermission('orders.create');\n\n  const handleClose = () => {\n    setActionMode(null);\n    rulesContext.api.toggleActionsPane();\n  };\n\n  const handleDeleteRule = () => {\n    // props.onDeleteRule();\n    rulesContext.api.deleteRule(props.rule);\n    handleClose();\n  };\n\n  const handleAddRule = (placement) => {\n    rulesContext.api.addRule(props.rule, placement);\n    handleClose();\n  };\n\n  const toggleDisabled = () => {\n    if (props.rule.disabled) {\n      rulesContext.api.disableRule(props.rule, false);\n      handleClose();\n    } else {\n      // confirm\n      setActionMode('disable');\n    }\n  };\n\n  const handleDisable = () => {\n    rulesContext.api.disableRule(props.rule, true);\n    handleClose();\n  };\n  const handleSave = () => {\n    props.onSaveRule();\n    handleClose();\n  };\n\n  // close when modal opens\n  useEffect(() => {\n    if (batchRuleModal) {\n      handleClose();\n    }\n  }, [batchRuleModal]);\n\n  if (!props.rule) return (null);\n\n  return (\n    <>\n      {/* Hide RuleActions header when in action mode? */}\n      <div className={classnames(['actions-panel', { open: props.isOpen }])}>\n\n        {/* Show menu if NOT in action mode */}\n        {!actionMode && (\n        <>\n          <div className=\"header mb-3\">\n            <div className=\"d-flex justify-content-between align-items-baseline mb-1\">\n              <h5 className=\"m-0\">Rule Actions</h5>\n              <Button onClick={rulesContext.api.toggleActionsPane} color=\"transparent\"><FaIcon icon=\"times\" size=\"1x\" /></Button>\n            </div>\n            <div>{props.rule.label} {props.isRootRule && <span>(root rule)</span>}</div>\n          </div>\n\n          <div className=\"rule-action-menu d-flex flex-column mt-1\">\n\n            <div className=\"rule-action-item\">\n              <UncontrolledDropdown size=\"sm\">\n                <DropdownToggle color=\"link\" disabled={props.rule.isNew || !rulesContext.allowCreate} caret>\n                  <FaIcon icon=\"plus\" />\n                  {' '}\n                  Add\n                </DropdownToggle>\n\n                <DropdownMenu>\n                  <DropdownItem onClick={() => handleAddRule('below')} disabled={props.isRootRule}>\n                    <FaIcon icon=\"bars\" />\n                    {' '}\n                    One rule, below\n                  </DropdownItem>\n                  <DropdownItem onClick={() => handleAddRule('child')}>\n                    <FaIcon icon=\"indent\" />\n                    {' '}\n                    One rule, as child\n                  </DropdownItem>\n                  <DropdownItem onClick={() => setBatchRuleModal(true)}>\n                    <FaIcon icon=\"indent\" />\n                    {' '}\n                    Multiple rules, as children ...\n                  </DropdownItem>\n                </DropdownMenu>\n              </UncontrolledDropdown>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                className=\"\"\n                color=\"link\"\n                onClick={handleSave}\n                disabled={props.rule.isNew || !rulesContext.allowEdit}\n                size=\"sm\"\n              >\n                <FaIcon icon=\"pencil-alt\" />\n                Save\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                className=\"\"\n                color=\"link\"\n                onClick={() => setActionMode('copy')}\n                disabled={props.isRootRule || props.rule.isNew}\n                size=\"sm\"\n              >\n                <FaIcon icon=\"copy\" />\n                Copy\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                className=\"\"\n                color=\"link\"\n                onClick={() => setActionMode('move')}\n                disabled={props.isRootRule || props.rule.isNew}\n                size=\"sm\"\n              >\n                <FaIcon icon=\"arrows-alt\" />\n                Move\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                className=\"\"\n                color=\"link\"\n                onClick={toggleDisabled}\n                disabled={props.isRootRule || props.rule.isNew}\n                size=\"sm\"\n              >\n\n                {props.rule.disabled ? (\n                  <>\n                    <FaIcon icon=\"plug\" />\n                    Enable\n                  </>\n                ) : (\n                  <>\n                    <FaIcon icon=\"ban\" />\n                    Disable\n                      </>\n                ) }\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                className=\"\"\n                color=\"link\"\n                onClick={() => setActionMode('delete')}\n                disabled={props.isRootRule || props.rule.isNew || !rulesContext.allowCreate}\n                size=\"sm\"\n              >\n                <FaIcon icon=\"trash\" />\n                Delete\n              </Button>\n            </div>\n\n          </div>\n        </>\n        )}\n\n        {/*\n            * Action view (menu goes away, show action form\n           */}\n\n        {actionMode === 'copy' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Copy Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <CopyWidget rule={props.rule} close={handleClose} cancel={() => setActionMode()} />\n          </div>\n        </div>\n        )}\n\n        {actionMode === 'move' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Move Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <MoveWidget rule={props.rule} close={handleClose} />\n          </div>\n        </div>\n        )}\n\n        {actionMode === 'delete' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Delete Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <StandardAlert color=\"light\" className=\"p-0\">Are you sure? Any rules that descend from this rule will also be deleted.</StandardAlert>\n            <div className=\"d-flex mt-2 justify-content-end\">\n              <Button size=\"sm\" color=\"link\" onClick={() => setActionMode(null)} >Cancel</Button>\n              <Button size=\"sm\" className=\"ms-1\" color=\"primary\" onClick={handleDeleteRule}>Delete</Button>\n            </div>\n          </div>\n        </div>\n        )}\n\n        {actionMode === 'disable' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Disable Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <StandardAlert color=\"light\" className=\"p-0\">\n              Disabling will block the application of this rule and all descendant rules.\n              The rules can still be edited.\n            </StandardAlert>\n            <div className=\"d-flex mt-2 justify-content-end\">\n              <Button color=\"link\" size=\"sm\" onClick={() => setActionMode(null)} >Cancel</Button>\n              <Button size=\"sm\" className=\"ms-1\" color=\"primary\" onClick={handleDisable}>Disable</Button>\n\n            </div>\n          </div>\n        </div>\n        )}\n\n      </div>\n\n      <div\n        className={classnames(['actions-overlay', { open: props.isOpen }])}\n        onClick={handleClose}\n      />\n\n      <LazyBatchRuleModal\n        isOpen={batchRuleModal}\n        close={() => setBatchRuleModal(false)}\n        rule={props.rule}\n        attributes={rulesContext.attributes}\n        attributeGroups={rulesContext.attributeGroups}\n        refreshRules={rulesContext.api.refreshRules}\n        ruleType=\"routing\"\n      />\n\n    </>\n  );\n};\n\nActionsPanel.propTypes = {\n  isOpen: PropTypes.bool,\n  rule: PropTypes.object,\n  isRootRule: PropTypes.bool,\n  isDirty: PropTypes.bool,\n  onChange: PropTypes.func,\n  onPasteRule: PropTypes.func,\n  onSaveRule: PropTypes.func,\n  // onDeleteRule: PropTypes.func,\n};\n\nActionsPanel.defaultProps = {\n  isOpen: false,\n};\n\nexport default ActionsPanel;\n","import { roundNumber } from './math';\n\nexport function getCurrencyFormattedNumber(value) {\n  if (value === null) {\n    return '';\n  }\n\n  return '$' + getFormattedNumber(value / 100); // eslint-disable-line prefer-template\n}\n\nexport function getFormattedNumber(value) {\n  if (value === 0) {\n    return 0;\n  }\n\n  if (!value) {\n    return '';\n  }\n\n  if (!isInt(scrubFormatting(value))) {\n    return ''; // if it's not a number after scrubbing formatting, just return empty.\n  }\n\n  let roundedValue = roundNumber(value, 2); // round if more than 2 decimal points\n  roundedValue = roundedValue.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','); // add commas for 1,000's. RegEx from http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n  const roundedValueContainsDecimalPlace = (roundedValue.indexOf('.') !== -1);\n\n  if (roundedValueContainsDecimalPlace) {\n    const numbersToTheRightOfDecimal = roundedValue.split('.')[1];\n\n    switch (numbersToTheRightOfDecimal.length) {\n      case 0:\n        return roundedValue.replace('.', ''); // no decimal necessary since no numbers after decimal\n      case 1:\n        return `${roundedValue}0`;\n      default:\n        return roundedValue;\n    }\n  }\n  return roundedValue;\n}\n\nexport function isInt(n) {\n  if (n === '' || n === null) {\n    return false;\n  }\n\n  return n % 1 === 0;\n}\n\nexport function scrubFormatting(value) {\n  return value.toString().replace('$', '').replace(',', '').replace('.', '');\n}\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {FormGroup, FormFeedback, Input, Label, FormText} from 'reactstrap';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {JsonEditorLoadable} from \"@thedmsgroup/mastodon-ui-components\";\nimport IconCheckbox from \"../../../Components/Form/IconCheckbox\";\nimport BuyerSelect from '../../../Components/Form/BuyerSelect';\n// import {useDebouncedCallback} from \"use-debounce\";\n\n/*\n * Special settings for advanced life forms only\n */\nconst matchExclusivityLabels = {\n  '': 'None (allow both shared and exclusive)',\n  shared: 'Only allow shared matches',\n  exclusive: 'Only allow exclusive matches',\n};\n\nconst buyerFilterModeLabels = {\n  '': 'None',\n  include: 'Include only selected buyers',\n  exclude: 'Exclude selected buyers',\n};\n\nconst Advanced = ({\n  internalData,\n  excludeProfitReporting,\n  ignoreSaleRate,\n  autoRedirect,\n  uniqueLeadKey,\n  qualifiedRateKey,\n  matchLimit,\n  matchTimeout,\n  auctionExpiration,\n  matchExclusivity,\n  includeBuyers,\n  excludeBuyers,\n  onChange,\n  errors,\n  allowEdit = true,\n}) => {\n  const [buyerFilterMode, setBuyerFilterMode] = useState(\n    includeBuyers && includeBuyers.length > 0 ? 'include' :\n    excludeBuyers && excludeBuyers.length > 0 ? 'exclude' :\n    ''\n  );\n\n  //\n  // const handleChangeInternalDataDebounced = useDebouncedCallback( (value) =>{\n  //   console.log('Advanced.js:change value', value);\n  //   onChange('internal_data', value)\n  // }, 500);\n\n  const handleChangeInternalData = (value) => onChange('internal_data', value);\n  const handleExcludeProfitReporting = (name, val) => onChange('exclude_profit_reporting', val);\n  const handleIgnoreSaleRate = (name, val) => onChange('ignore_sale_rate', val);\n\n  const handleAutoRedirect = (name, val) => onChange('auto_redirect', val);\n\n  const handleMatchExclusivity = (e) => onChange('match_exclusivity', e.target.value || null);\n\n  const handleBuyerFilterModeChange = (e) => {\n    const mode = e.target.value;\n    setBuyerFilterMode(mode);\n\n    if (mode === 'include') {\n      onChange('include_buyers', excludeBuyers || []);\n      onChange('exclude_buyers', []);\n    } else if (mode === 'exclude') {\n      onChange('exclude_buyers', includeBuyers || []);\n      onChange('include_buyers', []);\n    } else {\n      onChange('include_buyers', []);\n      onChange('exclude_buyers', []);\n    }\n  };\n\n  const handleBuyerListUpdate = (values) => {\n    if (buyerFilterMode === 'include') {\n      onChange('include_buyers', values || []);\n      onChange('exclude_buyers', []);\n    } else if (buyerFilterMode === 'exclude') {\n      onChange('exclude_buyers', values || []);\n      onChange('include_buyers', []);\n    }\n  };\n\n  const selectedBuyers = buyerFilterMode === 'include' ? includeBuyers : excludeBuyers;\n\n  if (!allowEdit) {\n    const viewBuyerMode = includeBuyers && includeBuyers.length > 0\n      ? 'include'\n      : excludeBuyers && excludeBuyers.length > 0\n        ? 'exclude'\n        : '';\n    const viewBuyers = viewBuyerMode === 'include' ? includeBuyers : excludeBuyers;\n\n    return (\n      <div>\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Internal Data</div>\n          {internalData ? (\n            <pre className=\"mb-0\"><code>{internalData}</code></pre>\n          ) : (\n            <span className=\"text-muted\">—</span>\n          )}\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Exclude from Profit Reporting</div>\n          <div>{excludeProfitReporting ? 'Yes' : 'No'}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Disable Sale Rate</div>\n          <div>{ignoreSaleRate ? 'Yes' : 'No'}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Auto-Redirect</div>\n          <div>{autoRedirect ? 'Yes' : 'No'}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Unique Lead Key</div>\n          <div>{uniqueLeadKey || <span className=\"text-muted\">—</span>}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Sale Rate Key</div>\n          <div>{qualifiedRateKey || <span className=\"text-muted\">—</span>}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Match Limit</div>\n          <div>{matchLimit != null && matchLimit !== '' ? matchLimit : <span className=\"text-muted\">—</span>}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Match Timeout (in milliseconds)</div>\n          <div>{matchTimeout != null && matchTimeout !== '' ? matchTimeout : <span className=\"text-muted\">—</span>}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Auction Expiration (in minutes)</div>\n          <div>{auctionExpiration != null && auctionExpiration !== '' ? auctionExpiration : <span className=\"text-muted\">—</span>}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Match Exclusivity</div>\n          <div>{matchExclusivityLabels[matchExclusivity || ''] || matchExclusivity || <span className=\"text-muted\">—</span>}</div>\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Buyer Filter</div>\n          <div>{buyerFilterModeLabels[viewBuyerMode]}</div>\n          {viewBuyerMode && viewBuyers && viewBuyers.length > 0 && (\n            <div className=\"mt-2\">\n              {viewBuyers.map((b, i) => (\n                <div key={i}>{b.label || b.name || (typeof b === 'string' ? b : String(b.value || b.id || ''))}</div>\n              ))}\n            </div>\n          )}\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div>\n      {(errors.internal_data)\n        && (\n          <StandardAlert color=\"info\" className=\"validation\">\n            Please correct the errors below before continuing\n          </StandardAlert>\n        )}\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Internal Data</div>\n        <p>Settings for reporting and other internal processes, in JSON format</p>\n        <FormGroup className=\"mt-2\">\n\n          <JsonEditorLoadable\n            code={internalData}\n            onChange={handleChangeInternalData}\n            isInvalid={!!errors.internal_data}\n          />\n\n          <FormFeedback>{errors.internal_data}</FormFeedback>\n\n        </FormGroup>\n\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Exclude from Profit Reporting</div>\n        <p>Do not log revenue to DMS Profit Reporting. This will apply to all descendant rules.</p>\n\n        <IconCheckbox\n          name=\"exclude_profit_reporting\"\n          value={Boolean(excludeProfitReporting)}\n          onChange={handleExcludeProfitReporting}\n          className=\"mt-3\"\n        >\n          Exclude from profit reporting\n        </IconCheckbox>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Sale Rate Tracking</div>\n        <p>By default, the ratio of sales vs non-sales is included in bidding calculations and affects future win rate. This setting allows you to customize this behavior.</p>\n\n        <IconCheckbox\n          name=\"ignore_sale_rate\"\n          value={Boolean(ignoreSaleRate)}\n          onChange={handleIgnoreSaleRate}\n          className=\"mt-3\"\n        >\n          Disable Sale Rate\n        </IconCheckbox>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Auto-Redirect</div>\n        <p>For auctions with a single exclusive bid, redirect the visitor without requiring a click</p>\n\n        <IconCheckbox\n          name=\"auto_redirect\"\n          value={Boolean(autoRedirect)}\n          onChange={handleAutoRedirect}\n          className=\"mt-3\"\n        >\n          Auto Redirect Visitor\n        </IconCheckbox>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Unique Lead Key</div>\n        <p>Specify an expression to uniquely identify this lead</p>\n        <Input\n          name=\"unique_lead_key\"\n          type=\"text\"\n          value={uniqueLeadKey}\n          onChange={onChange}\n        />\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Sale Rate Key</div>\n        <p>Specify an expression to customize the way sale rate is aggregated. By default this is `{'{source_id}-{buyer_name}-{broker_name}'}`</p>\n        <Input\n          name=\"qualified_rate_key\"\n          type=\"text\"\n          placeholder={\"{source_id}-{buyer_name}-{broker_name}\"}\n          value={qualifiedRateKey}\n          onChange={onChange}\n        />\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Match Limit</div>\n        <p>Limit the number of matches to return from auctions</p>\n        <Input\n          name=\"match_limit\"\n          type=\"text\"\n          value={matchLimit}\n          onChange={onChange}\n          className=\"teeny\"\n          placeholder=\"3\"\n        />\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Match Timeout (in milliseconds)</div>\n        <p>Limit the amount of time an auction can take.</p>\n        <Input\n          name=\"match_timeout\"\n          type=\"text\"\n          value={matchTimeout}\n          onChange={onChange}\n          className=\"teeny\"\n          placeholder=\"5000\"\n        />\n        <FormText>This is a &ldquo;best effort&rdquo;, not a guarantee. Primarily, it affects timeouts of integrations used during\n          the auction.</FormText>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Auction Expiration (in minutes)</div>\n        <p>By default leads and calls auctions expire after 10 minutes, but sometimes you might require extended timeouts</p>\n        <Input\n          name=\"auction_expiration\"\n          type=\"text\"\n          value={auctionExpiration}\n          onChange={onChange}\n          className=\"teeny\"\n          placeholder=\"10\"\n        />\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Match Exclusivity</div>\n        <p>Restrict auction matches to only shared or exclusive bids</p>\n\n        <FormGroup className=\"mt-2\">\n          <div style={{ maxWidth: '400px' }}>\n            <Input\n              type=\"select\"\n              name=\"match_exclusivity\"\n              value={matchExclusivity || ''}\n              onChange={handleMatchExclusivity}\n            >\n              <option value=\"\">None (allow both shared and exclusive)</option>\n              <option value=\"shared\">Only allow shared matches</option>\n              <option value=\"exclusive\">Only allow exclusive matches</option>\n            </Input>\n          </div>\n        </FormGroup>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Buyer Filter</div>\n        <p>Restrictively include or exclude specific buyers from participating in auctions</p>\n\n        <FormGroup className=\"mt-2 mb-3\">\n          <Input\n            type=\"select\"\n            name=\"buyer_filter_mode\"\n            value={buyerFilterMode}\n            onChange={handleBuyerFilterModeChange}\n            style={{ maxWidth: '400px' }}\n          >\n            <option value=\"\">None</option>\n            <option value=\"include\">Include only selected buyers</option>\n            <option value=\"exclude\">Exclude selected buyers</option>\n          </Input>\n        </FormGroup>\n\n        {buyerFilterMode && (\n          <FormGroup>\n            <Label>Select Buyers</Label>\n            <div style={{ maxWidth: '500px' }}>\n              <BuyerSelect\n                isMulti={true}\n                value={selectedBuyers}\n                onChange={handleBuyerListUpdate}\n                placeholder=\"Select buyer DBAs\"\n              />\n            </div>\n            <FormText>\n              {buyerFilterMode === 'include'\n                ? 'Only the selected buyers will be able to participate in auctions'\n                : 'The selected buyers will be excluded from participating in auctions'\n              }\n            </FormText>\n          </FormGroup>\n        )}\n      </div>\n\n    </div>\n  );\n};\n\nAdvanced.propTypes = {\n  internalData: PropTypes.string,\n  autoRedirect: PropTypes.bool,\n  excludeProfitReporting: PropTypes.bool,\n  ignoreSaleRate: PropTypes.bool,\n  uniqueLeadKey: PropTypes.string,\n  qualifiedRateKey: PropTypes.string,\n  matchLimit: PropTypes.number,\n  matchTimeout: PropTypes.number,\n  auctionExpiration: PropTypes.number,\n  matchExclusivity: PropTypes.string,\n  includeBuyers: PropTypes.array,\n  excludeBuyers: PropTypes.array,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n  allowEdit: PropTypes.bool,\n};\n\nexport default Advanced;\n","import React, {useContext, useEffect} from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  TabPane,\n  TabContent,\n  Button,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport * as Yup from 'yup';\nimport RulesContext from '../../../Providers/RulesContext';\nimport lazify from '../../../utils/Lazify';\nimport NavTabs from './NavTabs';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {getDeprecatedSettings, getDeprecatedChoices} from \"../../../Components/Rules/IntegrationSettings/utils\";\nimport Header from './Header';\nimport RuleSummary from './RuleSummary';\nimport useFormState from '../../../Hooks/useFormState';\nimport Settings from './Settings';\nimport Caps from './Caps';\nimport Tracking from './Tracking';\nimport ActionsPanel from './ActionsPanel';\nimport {PixelValidation, JSONValidation} from '../../../Components/Form/CustomValidation';\nimport { getFormattedNumber } from '../../../utils/numberFormat';\nimport usePermission from '../../../Hooks/usePermission';\nimport Advanced from './Advanced';\nimport Enrichments from \"../../../App/AdvertiserManager/RulesManager/RulesConfig/Enrichments\";\nimport DeliveryDestinations from \"../../../Components/Rules/DeliveryDestinations\"; // brings in all custom methods\nimport {TargetGroupsDescription} from '../../../Components/Rules/TargetDescription';\n\n// brings in all custom methods\n\n// const LazyActivitySchedule = lazify( () => import(/* webpackChunkName: \"ActivitySchedule\" */ \"../ActivitySchedule\"));\nconst LazyTargetingManager = lazify(() => import(/* webpackChunkName: \"TargetingManager\" */ '../../../Components/TargetingManager'));\n\nconst ValidationSchema = Yup.object().shape({\n  label: Yup.string()\n    .trim()\n    .required('Please enter a name for the rule'),\n  // schedule: Yup.mixed().validSchedule('Please check that all dates are filled out, and from/to dates are in the right order'),\n  // channel_routes: Yup.mixed().validChannelRoutes('Invalid Channel Routes'),\n  bidding: Yup.object().shape({\n    type: Yup.string(), //\n    bid_modifier: Yup.mixed().when('type', { // note, error property will be 'bidding.bid_modifier'\n      is: 'modifier',\n      then: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : parseInt(n))).min(0, 'Bid adjustment is required').max(500, 'Maximum adjustment is 500'),\n    }),\n    absolute_bid: Yup.mixed().when('type', {\n      is: 'absolute',\n      then: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : n)).min(0, 'Bid is required').max(9999, 'Maximum bid is $99.99'),\n    }),\n  }),\n  sale_caps: Yup.mixed().validRoutingCaps('All caps must have a timeframe and a cap value'),\n  match_caps: Yup.mixed().validRoutingCaps('All caps must have a timeframe and a cap value'),\n  ping_dedupe: Yup.mixed().validPingDedupeCaps('All ping dedupe caps must have an expression and a time value'),\n  match_conditions: Yup.mixed().validTargeting('Invalid Targeting'),\n  schedule: Yup.mixed().validActivitySchedule('Please check that all dates are filled out, and from/to dates are in the right order'),\n  billable_call_duration: Yup.number().transform((n) => ((isNaN(n) || n === null) ? null : parseInt(n))).max(300, 'Maximum billable duration is 300 seconds').nullable(),\n  bid_randomization_min: Yup.number()\n    .transform((n) => ((isNaN(n) || n === null || n === '') ? null : parseFloat(n)))\n    .nullable()\n    .min(-50, 'Minimum randomization must be at least -50')\n    .max(50, 'Minimum randomization must be at most 50')\n    .test('required-together', 'Minimum randomization is required when maximum is set', function(value) {\n      const { bid_randomization_max } = this.parent;\n      if (bid_randomization_max !== null && bid_randomization_max !== undefined && bid_randomization_max !== '') {\n        return value !== null && value !== undefined && value !== '';\n      }\n      return true;\n    }),\n  bid_randomization_max: Yup.number()\n    .transform((n) => ((isNaN(n) || n === null || n === '') ? null : parseFloat(n)))\n    .nullable()\n    .min(-50, 'Maximum randomization must be at least -50')\n    .max(50, 'Maximum randomization must be at most 50')\n    .test('required-together', 'Maximum randomization is required when minimum is set', function(value) {\n      const { bid_randomization_min } = this.parent;\n      if (bid_randomization_min !== null && bid_randomization_min !== undefined && bid_randomization_min !== '') {\n        return value !== null && value !== undefined && value !== '';\n      }\n      return true;\n    })\n    .test('is-greater', 'Maximum randomization must be greater than minimum', function(value) {\n      const { bid_randomization_min } = this.parent;\n      if (value !== null && value !== undefined && bid_randomization_min !== null && bid_randomization_min !== undefined) {\n        return value > bid_randomization_min;\n      }\n      return true;\n    }),\n  click_tags: PixelValidation,\n  internal_data: JSONValidation,\n});\n\n// Maps a tab to a validated field\nconst FormSectionToFieldMap = {\n  summary: ['label'],\n  targeting: ['match_conditions'],\n  integrations: ['enrichment_addons', 'delivery_destinations'],\n  bidding: ['bidding.bid_modifier', 'bidding.absolute_bid', 'billable_call_duration', 'bid_randomization_min', 'bid_randomization_max'],\n  caps: ['match_caps', 'sale_caps', 'ping_dedupe'],\n  tracking: ['click_tags'],\n  advanced: ['internal_data'],\n};\n\nconst initializeRule = (rule) => {\n  if (rule) {\n    // empty budget or caps is array, expecting object\n    if (Array.isArray(rule.match_caps)) rule.match_caps = {};\n    if (Array.isArray(rule.sale_caps)) rule.sale_caps = {};\n\n    if (rule.bidding.absolute_bid) {\n      rule.bidding.absolute_bid = getFormattedNumber(rule.bidding.absolute_bid);\n      // let strBid = rule.bidding.absolute_bid.toString();\n      // let dotPos = strBid.indexOf('.');\n      // if(dotPos > 0 && strBid.indexOf('.') === strBid.length - 2){\n      //   rule.bidding.absolute_bid += '0';\n      // }\n    }\n\n    if (rule.account_bid_floor) {\n      rule.account_bid_floor = getFormattedNumber(rule.account_bid_floor);\n    }\n    if (rule.bid_randomization_min) {\n      rule.bid_randomization_min = getFormattedNumber(rule.bid_randomization_min);\n    }\n    if (rule.bid_randomization_max) {\n      rule.bid_randomization_max = getFormattedNumber(rule.bid_randomization_max);\n    }\n\n    // Internal data saved and edited as JSON string. Created a pretty-formatted string.\n    if (rule.internal_data) {\n      const data = JSON.parse(rule.internal_data);\n      rule.internal_data = data ? JSON.stringify(data, null, 2) : '';\n    }\n  }\n  return rule;\n};\n\nconst RulesConfig = (props) => {\n  const context = useContext(RulesContext);\n  const allowAdvanced = usePermission('rules_advanced.edit');\n\n  initializeRule(props.rule);\n\n  // Rule state is in the form state as you edit, reference formValues as 'rule'\n  const {\n    formApi, formIsDirty, formValues: rule, formErrors, formErrorSections,\n  } = useFormState(\n    props.rule,\n    ValidationSchema,\n    null,\n    FormSectionToFieldMap,\n    { attributes: context.attributes, product: props.product }\n  );\n\n  const isNew = rule && rule.hasOwnProperty('isNew');\n\n  // TODO: adjust this for scrolling within the modal\n  const scrollToTop = (t = 0) => window.scrollTo({ top: t, behavior: 'smooth' });\n\n  useEffect(() => {\n    // Go to errored section if not on it already\n    if (formErrorSections.length && !formErrorSections.includes(props.activeTab)) {\n      props.onSelectTab(formErrorSections[0]);\n      // TODO: scrollTOTop\n    }\n  }, [formErrorSections]);\n\n  // Send dirty form state to the top because it affects rule tree\n  useEffect(() => {\n    context.api.setIsDirty(formIsDirty);\n  }, [formIsDirty]);\n\n  const handleCancel = () => {\n    // if (isNew) {\n    //   // de-select (goes to previously selected)\n    //   context.api.setSelected(null);\n    // } else {\n    //   // reset current rule by reselecting with refresh\n    //   context.api.setSelected(rule, 'summary', true);\n    //   props.onSelectTab('summary');\n    // }\n    props.onCancel()\n    scrollToTop();\n    // react UUID: https://github.com/thearnica/react-uid\n  };\n\n  const checkForDeprecatedSettings = () => {\n    const errors = [];\n    const arrayChecks = [\n      { items: rule.enrichment_addons, type: 'enrichment', field: 'enrichment_addons' },\n      { items: rule.delivery_destinations, type: 'delivery', field: 'delivery_destinations' },\n    ];\n\n    arrayChecks.forEach(({ items, type, field }) => {\n      if (Array.isArray(items)) {\n        const defs = context.api.getIntegrationDefinitionsByType(type);\n        items.forEach((item) => {\n          if (item.integration) {\n            const deprecated = getDeprecatedSettings(item.integration, defs);\n            if (deprecated.length > 0) {\n              errors.push({ field, message: `Integration \"${item.integration.name}\" has deprecated settings that must be removed: ${deprecated.join(', ')}` });\n            }\n            const badChoices = getDeprecatedChoices(item.integration, defs);\n            if (badChoices.length > 0) {\n              errors.push({ field, message: `Integration \"${item.integration.name}\" has settings with choices that are no longer available: ${badChoices.map(c => c.label).join(', ')}` });\n            }\n          }\n        });\n      }\n    });\n\n    return errors;\n  };\n\n  const handleSave = () => {\n    const deprecatedErrors = checkForDeprecatedSettings();\n    const isValid = formApi.validate();\n\n    deprecatedErrors.forEach(({ field, message }) => {\n      formApi.setError(field, message);\n    });\n\n    if (isValid && deprecatedErrors.length === 0) {\n      save();\n    }\n  };\n\n  /* Process rule and call rule context save */\n  const save = () => {\n    const saveRule = { ...rule };\n\n    saveRule.label = saveRule.label.trim();\n\n    // Zip match condition comes in as array, must be saved as string.\n    // If it's still an array (no interaction), stringify it\n    if (saveRule.match_conditions) {\n      saveRule.match_conditions = saveRule.match_conditions.map((group) => group.map((target) => {\n        if (target.attribute === 'zipcode' && Array.isArray(target.value)) {\n          target.value = target.value.join(',');\n        }\n        return target;\n      }));\n    }\n\n    saveRule.schedule_type = rule.schedule.length > 0 ? 'inactive' : 'active';\n\n    if (saveRule.internal_data && typeof saveRule.internal_data === 'object') {\n      saveRule.internal_data = JSON.stringify(saveRule.internal_data);\n      if (!saveRule.internal_data) {\n        saveRule.internal_data = '';\n      }\n    }\n\n    context.api.saveRule(saveRule, isNew);\n  };\n\n  return (\n    <>\n\n      <ActionsPanel\n        rule={rule}\n        isOpen={props.actionsOpen}\n        isRootRule={props.isRoot}\n        isDirty={formIsDirty}\n        onChange={formApi.handleOnChange}\n          /* onPasteRule={this.handlePasteRule}\n          onDeleteRule={deleteRule} */\n        onSaveRule={handleSave}\n        allowAdvanced={allowAdvanced}\n      />\n\n      { !rule && (\n      <div className=\"rule-none-selected\">Please select a rule to configure</div>\n      )}\n\n      { rule && (\n\n      <>\n\n        <Header\n          rule={rule}\n          onChange={formApi.handleOnChange}\n          errors={formErrors}\n          allowEdit={context.allowEdit}\n        />\n\n        {rule.disabled && (\n        <div className=\"disabled-notice mt-2\">\n          <StandardAlert color=\"danger\" icon=\"alert\" className=\"validation mb-1\">\n            This rule is disabled. The rule and any descendent rules will be ignored.\n            <Button color=\"link\" className=\"p-0 ms-2\" onClick={() => context.api.disableRule(rule, false)}>Enable Rule</Button>\n          </StandardAlert>\n        </div>\n        ) }\n\n        {/* TODO: rule ancestors */}\n        {/* {this.disabledAncestor  && <div className=\"disabled-notice\">\n                    <StandardAlert color=\"danger\" icon=\"ale rt\" className=\"validation mb-0\">\n                      The ancestor rule &quot;{this.disabledAncestor.label}&quot; has been disabled. This rule will not be applied.\n                    </StandardAlert>\n                  </div> } */}\n\n        <NavTabs\n          activeTab={props.activeTab}\n          onSelectTab={props.onSelectTab}\n          isSectionValid={formApi.isSectionValid}\n          product={props.product}\n          allowAdvanced={allowAdvanced}\n        />\n\n        <div className=\"rule-config thin-scrollbar\">\n          <TabContent activeTab={props.activeTab} className=\"rules-transition\">\n\n            <TabPane tabId=\"summary\">\n\n              <RuleSummary\n                rule={rule}\n                product={props.product}\n                gotoTab={props.onSelectTab}\n                allowAdvanced={allowAdvanced}\n              />\n            </TabPane>\n\n\n            <TabPane tabId=\"integrations\">\n\n              {(formErrors.enrichment_addons || formErrors.delivery_destinations) && (\n                <StandardAlert color=\"info\" className=\"validation\">\n                  Please correct the errors below before continuing\n                </StandardAlert>\n              )}\n\n              <div className=\"form-section\">\n                <div className=\"form-section-header\">Enrichment Integrations</div>\n                <Enrichments\n                  addOns={rule.enrichment_addons}\n                  onChange={(sc) => {\n                    formApi.handleOnChange('enrichment_addons', sc)\n                  }}\n                  errors={{}}\n                  loadIntegrations={() => {\n                    return context.api.getIntegrationDefinitionsByType('enrichment')\n                  }}\n                />\n              </div>\n\n              <DeliveryDestinations\n                definitions={context.api.getIntegrationDefinitionsByType('delivery')}\n                label=\"Post-Sale Integrations\"\n                description=\"Configure post-sale deliveries or web hooks.\"\n                destinations={rule.delivery_destinations}\n                onChange={(dd) => {\n                  formApi.handleOnChange('delivery_destinations', dd)\n                }}\n                errors={{}}\n                showCombineSales\n              />\n\n            </TabPane>\n\n            <TabPane tabId=\"targeting\">\n\n              {context.allowEdit ? (\n                <LazyTargetingManager\n                  conditions={rule.match_conditions}\n                  onUpdate={(groups) => formApi.handleOnChange('match_conditions', groups)}\n                  attributes={context.attributes}\n                  attributeGroups={context.attributeGroups}\n                  errors={formErrors.match_conditions}\n                  className=\"routing\"\n                  allowEdit={context.allowEdit}\n                />\n              ) : (\n                rule.match_conditions.length > 0 && rule.match_conditions[0].length > 0 ? (\n                  <div className=\"target-description-block\">\n                    <TargetGroupsDescription\n                      groups={rule.match_conditions}\n                      attributes={context.attributes}\n                    />\n                  </div>\n                ) : (\n                  <StandardAlert color=\"light\" icon=\"info\">No targets defined.</StandardAlert>\n                )\n              )}\n\n            </TabPane>\n\n            <TabPane tabId=\"bidding\">\n              {/* This tab is for 'settings' which includes bidding, but we\n                  have to call it 'bidding' because rule tree icons and rule summaries are configured to link to that id.\n                   To handle this better we would need a mapping of tree icons to form sections,\n                   or not hard code that id into tree icons or summaries\n                   */}\n              <Settings\n                product={props.product}\n                bidding={rule.bidding}\n                bidFalloff={rule.bid_falloff}\n                bidFloor={rule.account_bid_floor}\n                flowControl={rule.flow_control}\n                sellStrategy={rule.sell_strategy}\n                valueEstimator={rule.value_estimator}\n                valueEstimatorIntegration={rule.value_estimator_integration}\n                billableCallDuration={rule.billable_call_duration}\n                bidRandomizationMin={rule.bid_randomization_min}\n                bidRandomizationMax={rule.bid_randomization_max}\n                biddingIntegration={rule.bidding_integration}\n                onChange={formApi.handleOnChange}\n                errors={formErrors}\n                isActiveTab={props.activeTab === 'settings'}\n                allowEdit={context.allowEdit}\n              />\n            </TabPane>\n\n            <TabPane tabId=\"caps\" className=\"caps\">\n              <Caps\n                capsTimezone={rule.caps_timezone}\n                saleCaps={rule.sale_caps}\n                matchCaps={rule.match_caps}\n                pingDedupes={rule.ping_dedupe}\n                onChange={formApi.handleOnChange}\n                errors={formErrors}\n                allowEdit={context.allowEdit}\n              />\n            </TabPane>\n            {/*\nMST-1970 hide schedule tab, sows confusion and chaos\n\n                <TabPane tabId=\"activity\">\n\n                  <LazyActivitySchedule\n                  schedule={rule.schedule}\n                  scheduleType={rule.schedule_type}\n                  onChangeSchedule={(s)=>formApi.handleOnChange('schedule', s)}\n                  onChangeScheduleType={(type)=>formApi.handleChange('schedule_type', type)}\n                  timezone={props.timezone}\n                  error={formErrors.schedule}\n\n                />\n\n                </TabPane> */}\n\n            {props.product === 'clicks' && (\n            <TabPane tabId=\"tracking\">\n              <Tracking\n                clickTags={rule.click_tags}\n                onChange={formApi.handleOnChange}\n                errors={formErrors}\n                allowEdit={context.allowEdit}\n              />\n            </TabPane>\n            )}\n\n            {allowAdvanced && (\n              <TabPane tabId=\"advanced\">\n                <Advanced\n                  internalData={rule.internal_data}\n                  autoRedirect={rule.auto_redirect}\n                  excludeProfitReporting={rule.exclude_profit_reporting}\n                  ignoreSaleRate={rule.ignore_sale_rate}\n                  uniqueLeadKey={rule.unique_lead_key}\n                  qualifiedRateKey={rule.qualified_rate_key}\n                  matchLimit={rule.match_limit}\n                  matchTimeout={rule.match_timeout}\n                  auctionExpiration={rule.auction_expiration}\n                  onChange={formApi.handleOnChange}\n                  matchExclusivity={rule.match_exclusivity}\n                  errors={formErrors}\n                  includeBuyers={rule.include_buyers}\n                  excludeBuyers={rule.exclude_buyers}\n                  allowEdit={context.allowEdit}\n                />\n              </TabPane>\n            )}\n\n          </TabContent>\n        </div>\n\n        <div className=\"footer d-flex align-items-center justify-content-end mt-2\">\n          {context.allowEdit && (\n          <>\n            { (formIsDirty || Object.entries(formErrors).length > 0) && (\n            <div className=\"me-2  dirty-alert\">\n              <FaIcon icon=\"exclamation-triangle\" color=\"#990000\" size=\"sm\" />\n&nbsp;\n              {Object.entries(formErrors).length > 0\n                ? <span>Please correct errors before saving.</span>\n                : <span>This rule has been modified. Save your changes or cancel.</span>}\n            </div>\n            )}\n\n            {/*\n                Only show cancel if editing a rule because its function is to back out of editing a rule,\n                    users might think it closes the modal\n            */}\n            {(isNew || formIsDirty)\n            && (\n              <Button\n                size=\"sm\"\n                onClick={handleCancel}\n                color=\"text\"\n                className=\"me-2\"\n              >\n                Cancel\n              </Button>\n            )}\n\n            <Button\n              size=\"sm\"\n              onClick={handleSave}\n              color=\"primary\"\n              disabled={false}\n            >\n              Save Rule\n            </Button>\n\n\n          </>\n          )}\n\n        </div>\n\n      </>\n      )}\n\n    </>\n\n  );\n};\n\nRulesConfig.propTypes = {\n  rule: PropTypes.object,\n  attributes: PropTypes.object,\n  attributeLookup: PropTypes.object,\n  product: PropTypes.string,\n  timezone: PropTypes.string,\n  isDirty: PropTypes.bool,\n  isRoot: PropTypes.bool,\n  activeTab: PropTypes.string,\n  onSelectTab: PropTypes.func,\n  actionsOpen: PropTypes.bool,\n};\n\nexport default RulesConfig;\n","import React, {\n  useState, useEffect, useContext,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport confirm from 'reactstrap-confirm';\nimport {useNavigate, useLocation} from \"react-router-dom\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport RulesContext from '../../../Providers/RulesContext';\nimport { TreeProvider } from '../../../Components/Rules/TreeProvider';\nimport qs from 'query-string';\nimport RuleTree from './RuleTree'\nimport TreeRule from './TreeRule';\nimport RulesConfig from './RulesConfig';\nimport useRuleTree from '../../../Hooks/useRuleTree';\nimport usePermission from '../../../Hooks/usePermission';\nimport './styles.scss';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport LoaderDots from \"../../../Layout/LoaderDots\";\nimport { AppContext } from '../../../Providers/AppProvider';\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\n\nconst NEW_RULE = {\n  id: 0,\n  parent_id: 0,\n  isNew: true,\n  label: 'New Rule',\n  disabled: false,\n  bidding: {\n    type: 'pass',\n    absolute_bid: '',\n    bid_modifier: '',\n  },\n  account_bid_floor: '',\n  sale_caps: {},\n  match_caps: {},\n  ping_dedupe: [],\n  match_conditions: [[]],\n  vendor_bid: '',\n  vendor_margin: '',\n  billable_call_duration: '',\n  rules: [],\n  schedule: [],\n  schedule_type: 'inactive',\n  internal_data: '',\n};\n\nexport const RulesManager = ({\n                        entityRuleId,\n                        entityType,\n                        entityName,\n                        verticalId,\n                        product,\n                        isModal,\n                        onRefresh,\n}) => {\n  const app = useContext(AppContext);\n  const location = useLocation();\n  const navigate = useNavigate();\n  const qsData = qs.parse(location.search);\n  const gotoRuleId = isModal ? null : qsData.rule;\n  const allowEdit = usePermission('routing.edit');\n  const allowCreate = usePermission('routing.create');\n  const {\n    tree,\n    refreshKey,\n    selectedRule,\n    getPrecedingRule,\n    setTree,\n    getRule,\n    deleteRule,\n    addTempRule,\n    addNewRule,\n    swapRule,\n    selectRule,\n    updateRuleTree,\n  } = useRuleTree(null, null, NEW_RULE);\n\n  // For non-global pages, entity comes from the entityRuleId prop.\n  // For global, entityRuleId is undefined but tree.id is available once loaded.\n  const changeEntity = entityRuleId\n    ? { id: entityRuleId, name: entityName || '', type: 'routingrule' }\n    : (entityType === 'global' && tree?.id)\n    ? { id: tree.id, name: 'Global Routing Rules', type: 'routingrule' }\n    : undefined;\n\n  // enabled:!isModal — skip drawer registration when used as a modal.\n  // notifyChange is always available so modal saves still refresh the page's timeline.\n  const { openChanges, notifyChange } = useChangeTimeline({\n    entityTypes: ['routingrule'],\n    parentFilters: {},\n    entity: changeEntity,\n    enabled: !isModal,\n  });\n\n  const [attributes, setAttributes] = useState();\n  const [integrations, setIntegrations] = useState();\n  const [actionsOpen, setActionsOpen] = useState(false);\n  const [attributeGroups, setAttributeGroups] = useState();\n  const [activeTab, setActiveTab] = useState(qsData.tab || 'summary');\n  const [isDirty, setIsDirty] = useState(false);\n // const [ready, setReady] = useState(false);\n\n  // get data when entityRuleId or entityType has been resolved\n  useEffect(() => {\n    if (entityRuleId || entityType === 'global') {\n      load();\n    }\n  }, [entityRuleId, entityType]);\n\n  useEffect(() => {\n    if (tree && !selectedRule ) {\n      if (gotoRuleId) {\n        const rule = getRule(parseInt(gotoRuleId));\n        selectRule(rule || tree);\n      } else {\n        // no goto Rule, select top of tree\n        selectRule(tree);\n      }\n    }\n  }, [tree]);\n\n  //Change URL on change rule, tab\n  useEffect(() => {\n    if (selectedRule && !selectedRule.isNew && !isModal) {\n      updateQueryString();\n    }\n  }, [selectedRule, activeTab]);\n\n  // Close actions panel on switch rule\n  useEffect(() => {\n    setActionsOpen(false);\n  }, [selectedRule?.id]);\n\n  const load = async() => {\n    await loadRulesTree();\n    await loadAttributes();\n    await loadIntegrations();\n  }\n\n  const loadRulesTree = async () => {\n    // some entities might not have a root rule yet\n    let rootRule;\n\n    if (entityType === 'global') {\n      rootRule = await app.api.endpoints.routingRules.show('global');\n    } else if (entityRuleId) {\n      rootRule = await app.api.endpoints.routingRules.show(entityRuleId);\n    }\n\n    setTree(rootRule);\n  };\n\n  const loadAttributes = async () => {\n    const attrByGroup = await app.api.endpoints.attributes.list({\n      options: true, vertical_id: verticalId, product, scope: 'routing',\n    });\n    if (attrByGroup) {\n      // Ungroup the attributeGroup data and store in attributes\n      const attr = {};\n      Object.entries(attrByGroup).map((group) => {\n        const groupName = group[0];\n        return group[1].map((a) => attr[a.alias] = { ...a, groupName });\n      });\n      setAttributes(attr);\n      setAttributeGroups(attrByGroup);\n    }\n  };\n\n  const toggleActionsPane = () => setActionsOpen(!actionsOpen);\n\n  // called from useEffect after selectRule or tab\n  const updateQueryString = () => {\n    const qry = qs.parse(location.search);\n    // console.log('index.js: updateQueryString', qs.stringify({...qry, tab:this.state.selectedTab, rule:this.state.selectedRule.id}) );\n    navigate({replace:true, search: qs.stringify({ ...qry, tab: activeTab, rule: selectedRule.id }) });\n  };\n\n  // Tabs can be selected from inside RulesConfig (where the tabs are)\n  // or from the rules tree (by clicking on icons).\n  // In the tree you can effectively select a tab and a rule at the same time,\n  // which is why we have the rule argument.\n  //\n  // Use a callback because it is passed to all tabs (keeps single reference to function)\n  const handleSetActiveTab = (tab, rule) => {\n    setActiveTab(tab);\n    if (rule && rule.id !== selectedRule?.id) {\n      selectRule(rule);\n    }\n  };\n\n  // Create a temporary rule to work on\n  const addRule = (targetRule, placement) => addTempRule(targetRule, placement, { ...NEW_RULE });\n\n  const disableRule = async (rule, isDisabled) => {\n    const targetRule = { id: rule.id, label: rule.label, disabled: !!isDisabled };\n\n    const result = await app.api.endpoints.routingRules.update(targetRule);\n\n    if (result) {\n      notify(`The rule has been ${isDisabled ? 'disabled' : 'enabled'}`, 'success');\n      notifyChange();\n      loadRulesTree(result);\n      selectRule(result, null, true);\n    }\n  };\n\n  const copyRule = async (rule, label = '') => {\n    const copy = {\n      parent_id: rule.parent_id,\n      label: label || `${rule.label} (Copy)`,\n      copy_from_id: rule.id,\n      // Api sets priority one higher than source rule\n    };\n    app.showLoader(isModal ? 'modal' : 'main', 'Copying Rule...');\n\n    const result = await app.api.endpoints.routingRules.create(copy);\n\n    app.showLoader(false);\n\n    if (!result) {\n      notify(`Unable to copy rule: ${app.api.error.name}`, 'error');\n    } else {\n      notify('The rule has been copied', 'success');\n      notifyChange();\n      addNewRule(result);\n    }\n  };\n\n  const moveRule = async (rule, targetRule, placement = 'below') => {\n    app.showLoader(isModal ? 'modal' : 'main', 'Moving Rule...');\n\n    let maxPriority = 0;\n    const parentRule = getRule(rule.parent_id);\n    if (parentRule && parentRule.rules.length) {\n      parentRule.rules.map((r) => {\n        if (r.priority > maxPriority) maxPriority = r.priority;\n      });\n    }\n\n    const moveRule = { id: rule.id, label: rule.label };\n\n    if (placement === 'below') {\n      moveRule.priority = targetRule.priority + 1;\n      moveRule.parent_id = targetRule.parent_id;\n    } else if (placement === 'above') {\n      if (maxPriority && targetRule.priority === maxPriority) {\n        moveRule.priority = maxPriority - 1;\n      } else {\n        moveRule.priority = targetRule.priority;\n      }\n      moveRule.parent_id = targetRule.parent_id;\n    } else if (placement === 'child') {\n      moveRule.priority = 0;\n      moveRule.parent_id = targetRule.id;\n    }\n    // console.log('Manager.js:MoveRule (target, moveRule):', targetRule, moveRule);\n    const result = await app.api.endpoints.routingRules.update(moveRule);\n\n    app.showLoader(false);\n\n    if (result) {\n      notifyChange();\n      loadRulesTree();\n      selectRule(result, true);\n    }\n  };\n\n  const handleDeleteRule = async (rule) => {\n    app.showLoader(isModal ? 'modal' : 'main', 'Deleting Rule...');\n\n    const result = await app.api.endpoints.routingRules.delete(rule.id);\n    app.showLoader(false);\n\n    if (!result) {\n      notify(`Unable to delete rule: ${app.api.error.name}`, 'error');\n    } else {\n      notify('The rule has been deleted', 'success');\n      notifyChange();\n\n      // Remove from tree\n      deleteRule(rule);\n      const fallbackRule = getPrecedingRule(rule)\n      selectRule(fallbackRule)\n    }\n  };\n\n  // Used for a few targeted async updates where we just want to update a specific prop\n  // Bid value edited in the tree, or edit rule name.\n  // NOTE: when we do bid edits in rule tree, see updateRule in advertiser rules\n  const updateRule = async (data) => {\n    // just the data and required fields\n    const { id, parent_id, label } = selectedRule;\n    const updatedRule = {\n      id, parent_id, label, ...data,\n    };\n    const result = await app.api.endpoints.routingRules.update(updatedRule);\n\n    if (result) {\n      notifyChange();\n      updateRuleTree(result);\n      onRefresh && onRefresh();\n    } else {\n      notify(`Unable to update rule: ${app.api.error.name}`, 'error');\n    }\n    return result;\n  };\n\n  const saveRule = async (saveRule, isNew) => {\n    app.showLoader(isModal ? 'modal' : 'main', 'Saving Rule...');\n    let result;\n    if (isNew) {\n      // delete rule.isNew;\n      result = await app.api.endpoints.routingRules.create(saveRule);\n      if (result) {\n        swapRule(result, saveRule);\n      }\n    } else {\n      result = await app.api.endpoints.routingRules.update(saveRule);\n      if (result) {\n        updateRuleTree(result);\n        selectRule(result, true);\n      }\n    }\n\n    app.showLoader(false);\n\n    if (!result) {\n      notify(`Unable to save rule: ${app.api.error.name}`, 'error');\n    } else {\n      notifyChange();\n      onRefresh && onRefresh();\n      selectRule(result, true);\n      notify('The rule has been saved', 'success');\n    }\n  };\n\n  const handleCancel = () => {\n    let rule\n    if (selectedRule.isNew) {\n      //remove the temporary new rule in the tree, select prev sibling or parent\n      rule = getPrecedingRule(selectedRule)\n      deleteRule(selectedRule)\n\n    } else {\n      //reload current\n      rule = selectedRule\n    }\n    selectRule(rule, true)\n    //loadRule(rule.id)\n  }\n\n  const handleSelectRule = async (rule, refresh) => {\n    if (rule && rule.id !== selectedRule?.id) {\n      if (isDirty) {\n        // confirm leaving a dirty rule\n        const stay = await dirtyRuleConfirm();\n        if (stay) return;\n      } else if (selectedRule?.isNew) {\n        // confirm leaving a new unsaved rule\n        const stay = await leaveNewRuleConfirm();\n        if (stay) return;\n        // discard the new rule and go to selected\n        deleteRule(selectedRule, rule);\n        return;\n      }\n    }\n\n    selectRule(rule, refresh);\n  };\n\n  const dirtyRuleConfirm = async () => await confirm({\n    title: 'Unsaved Rule',\n    message: 'The current rule has unsaved changes',\n    confirmText: 'Continue editing',\n    cancelText: 'Discard changes',\n  });\n\n  const leaveNewRuleConfirm = async () => await confirm({\n    title: 'Unsaved New Rule',\n    message: 'Please save or cancel the current new rule',\n    confirmText: 'Continue editing',\n    cancelText: 'Discard new rule',\n  });\n\n  const loadIntegrations = async (type) => {\n    const result = await app.api.endpoints.integrations.list({product, vertical_id: verticalId, type: type, without_account:1, limit:1000})\n\n    if (result?.data) {\n       // this is BC handling during api transition // todo remove after transition\n        // Filter out integrations with null versions, won't save\n        result.data = result.data.filter(int => Boolean(int.current_version));\n        // Group by type\n        result.data = result.data.reduce((acc, intg) => {\n          acc[intg.type] = (acc[intg.type] || []).concat(intg);\n          return acc;\n        }, {});\n        setIntegrations(result.data);\n\n    } else {\n      notify(`Unable to load integrations: ${app.api.error.name}`, 'error');\n    }\n  }\n\n  const getIntegrationDefinitionsByType = (type) => {\n    if (integrations) {\n      return integrations[type] || [];\n    }\n    return [];\n  };\n\n  const viewRuleChanges = () => {\n    if (selectedRule) {\n      openChanges({ id: selectedRule.id, name: selectedRule.label, type: 'routingrule' });\n    }\n  }\n\n  // An API that we can pass through context instead of\n  // passing all these methods via prop\n  const rulesAPI = {\n    selectedRule,\n    setTree,\n    getRule,\n    deleteRule: handleDeleteRule,\n    addTempRule,\n    addRule,\n    updateRule,\n    saveRule,\n    copyRule,\n    moveRule,\n    setSelected: handleSelectRule,\n    setActiveTab: handleSetActiveTab,\n    setIsDirty,\n    refreshRules: loadRulesTree, // used by bulk add\n    toggleActionsPane,\n    viewRuleChanges,\n    disableRule,\n    getIntegrationDefinitionsByType,\n  };\n\n  const ready = attributes && integrations && tree && selectedRule;\n\n  return (\n    <div className=\"rules-manager-container d-flex position-relative\">\n      <LoaderDots active={!ready} width={120} />\n      <RulesContext.Provider value={{\n        tree,\n        selectedRule,\n        attributes,\n        attributeGroups,\n        allowCreate,\n        allowEdit,\n        entityType,\n        api: rulesAPI,\n      }}\n      >\n\n        {ready && (\n          <>\n                <div className=\"col-rule-tree thin-scrollbar\">\n\n              <div className=\"tree\">\n                <TreeProvider rule={tree} product={product} ruleType=\"routing\" defaultExpandLevel={1}>\n                  <RuleTree\n                    rule={tree}\n                    selectedRule={selectedRule}\n                    ancestors={[]}\n                    ruleComponent={TreeRule}\n                    isLoading={!ready}\n                    isModal={isModal}\n                    />\n\n                </TreeProvider>\n              </div>\n              </div>\n\n\n\n            <ConditionalPageSection isPage={!isModal} className=\"flex-fill\">\n              <div className=\"col-rule-config flex-fill\">\n                {selectedRule && (\n                  <RulesConfig\n                    rule={selectedRule}\n                    isRoot={selectedRule ? selectedRule.id === tree.id : false}\n                    isDirty={false}\n                    key={selectedRule.id + refreshKey}\n                    product={product}\n                    timezone={app.user.timezone}\n                    actionsOpen={actionsOpen}\n                    activeTab={activeTab}\n                    onSelectTab={handleSetActiveTab}\n                    onCancel={handleCancel}\n                  />\n                ) }\n              </div>\n            </ConditionalPageSection>\n          </>\n\n        )}\n\n      </RulesContext.Provider>\n    </div>\n\n  )\n}\n\nRulesManager.propTypes = {\n  entityRuleId: PropTypes.number,\n  entityType: PropTypes.string,\n  entityName: PropTypes.string,\n  verticalId: PropTypes.number,\n  product: PropTypes.string,\n  isModal: PropTypes.bool,\n  onRefresh: PropTypes.func\n}\n\n\nconst ConditionalPageSection = ({isPage, title, children, className=\"\"}) => {\n  return isPage ? (\n    <PageSection title={title} className={className}>{children}</PageSection>\n  ): children\n}\n","import React, {useMemo} from 'react';\nimport { Link } from 'react-router-dom';\nimport { Label, Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PageSection from '../../../Layout/PageSection';\nimport usePermission from '../../../Hooks/usePermission';\nimport { titleCase } from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport StatusToggler from \"../../../Components/Form/StatusToggler\";\nimport useApi from '../../../Hooks/useApi';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport {RelativeTime} from \"@thedmsgroup/mastodon-ui-components\";\nimport {RoutedEntityType} from \"../../../types\";\n\ntype EntityInfoBarType = {\n  entityType:RoutedEntityType,\n  entity: any\n}\n\n/*\n * Bar at top of routing rules manager page shows info and links\n * related to the routed entity (source, channel, channel-source, or vendor)\n */\nconst EntityInfoBar = ({ entityType, entity }:EntityInfoBarType) => {\n  const allowEditSources = usePermission('sources.edit');\n  const allowEditChannels = usePermission('channels.edit');\n  const allowStatusToggle = (entityType===\"source\" && allowEditSources) || (entityType===\"channelsource\" && allowEditChannels);\n  const allowViewAuctions = usePermission('auctions.view');\n\n  const linkSearch = useMemo(()=>{\n    let routingMap, auctions;\n    switch (entityType) {\n      case \"channel\":\n        auctions = `page=1&${entityType}=${entity.id}`\n        routingMap = `${entityType}=${entity.id}`\n        break;\n      case \"source\":\n        auctions = `page=1&${entityType}=${entity.id}`\n        routingMap = `${entityType}=${entity.id}`\n        break;\n      case \"channelsource\":\n        //entity is ChannelSourceRoute\n        auctions = `page=1&source=${entity.source.id}&channel=${entity.channel.id}`\n        routingMap = `source=${entity.source.id}`\n        break;\n    }\n    return {routingMap, auctions};\n  }, [entityType])\n\n  const sourceUpdate = useApi('sources', 'update');\n  const channelUpdate = useApi('channels', 'update');\n\n  // Only sources or channel-sources\n  // We don't currently change channel status in the UI\n  const handleStatusChange = async (id:number, status:string) => {\n    if (allowStatusToggle) {\n      let result;\n      if (entityType === \"channelsource\") {\n        // we update the whole channel in this case\n        const chn = { ...entity.channel };\n\n        chn.sources = chn.sources.map((cs: any) =>\n          ({\n            source_id: cs.id,\n            channel_id: chn.id,\n            ...cs.eligibility,\n            status: cs.id === entity.source.id ? status : cs.eligibility.status\n          }));\n\n        result = await channelUpdate.fetch(chn);\n      } else if (entityType === \"source\") {\n        result = await sourceUpdate.fetch({\n          id: entity.id,\n          name: entity.name,\n          product: entity.product,\n          vendor_id: entity.vendor.id,\n          vertical_id: entity.vertical.id,\n          token: entity.token,\n          status,\n        });\n      }\n\n\n\n      if (result) {\n        notify('Status updated', 'success');\n      } else {\n        notify('Unable to update status', 'error');\n      }\n\n      return Boolean(result);\n    }\n    return false;\n  };\n\n  return (\n    <PageSection\n      className=\"entity-info-section mb-3\"\n      title={entityType === 'channelsource' ? 'Channel-Source' : titleCase(entityType)  + ' Routing'}\n      subtitle={entity.name}\n      >\n\n\n      <div className=\"d-flex justify-content-between align-items-center\">\n\n        {/* Links and actions */}\n        <div className=\"d-flex \">\n            {allowViewAuctions && entityType !== \"vendor\" && (\n              <>\n                <span className=\"action-item\">\n                  <Button\n                    tag={Link}\n                    color=\"link\"\n                    to={{\n                      pathname: '/auctions',\n                      search: linkSearch.auctions,\n                    }}\n                    title=\"Auctions\"\n                    className=\"inline ms-2\"\n                  >\n                    <FaIcon icon=\"comment-dollar\" size=\"sm\" /> Auctions\n                  </Button>\n                </span>\n                <span className=\"action-item\">\n                  <Button\n                    tag={Link}\n                    color=\"link\"\n                    to={{\n                      pathname: '/routing',\n                      search: linkSearch.routingMap,\n                    }}\n                    title=\"Routing Map\"\n                    className=\"inline ms-2\"\n                  >\n                    <FaIcon icon=\"project-diagram\" size=\"sm\" /> Routing\n                  </Button>\n                </span>\n                {allowEditSources && entityType  === \"source\" && (\n                  <span className=\"action-item\">\n                  <Button\n                     tag={Link}\n                     color=\"link\"\n                     to={`/publishing/sources/${entity.id}/edit`}\n                     title=\"Edit Source\"\n                     className=\"inline ms-2\"\n                >\n              <FaIcon icon=\"cog\" size=\"sm\"/> Source\n              </Button>\n              </span>\n\n                )}\n                </>\n\n\n          )}\n\n        </div>\n\n        {/* Entity Info */}\n        <div className=\"d-flex align-items-center\">\n\n\n          {entity.account && (\n            <div className=\"entity-info-cell\">\n              <Label>Account</Label>\n              <div>{entity.account.name}</div>\n            </div>\n          )}\n\n          {entityType !== \"vendor\" && (\n          <div className=\"entity-info-cell\">\n            <Label>Vertical</Label>\n            <div>{entity.vertical.display_name}</div>\n          </div>\n          )}\n\n          {entityType !== \"vendor\" && (\n            <div className=\"entity-info-cell\">\n              <Label>Product</Label>\n              <div>{titleCase(entity.product)}</div>\n            </div>\n          )}\n\n          {entityType === \"channelsource\" && (\n            <div className=\"entity-info-cell\">\n              <Label>Distribution</Label>\n              <div>\n                {!isNaN(parseInt(entity.distribution)) ? `${entity.distribution}%` : <span>&mdash;</span> }\n                {entity.fixed_distribution && <span> (fixed)</span>}\n              </div>\n            </div>\n          )}\n\n          {/* Can update source, but not channel */}\n          {(entityType === \"source\" || entityType === \"channel\") && (\n            <div className=\"entity-info-cell\">\n              <Label>{titleCase(entityType)} Status</Label>\n              <div>\n                <StatusToggler\n                  status={entity.status}\n                  target={entity.id}\n                  onChangeAsync={handleStatusChange}\n                  allowEdit={allowStatusToggle}\n                />\n              </div>\n            </div>\n          )}\n\n          {entityType === \"channelsource\" && (\n            <>\n              <div className=\"entity-info-cell\">\n                <Label>Channel Status</Label>\n                <div>\n                  <StatusToggler\n                    status={entity.channel.status}\n                    target={entity.channel.id}\n                    allowEdit={false}\n                  />\n\n                </div>\n              </div>\n\n              <div className=\"entity-info-cell\">\n                <Label>Channel-Source Status</Label>\n                <div>\n                  <StatusToggler\n                    status={entity.status}\n                    target={entity.channel.id}\n                    onChangeAsync={handleStatusChange}\n                    allowEdit={allowStatusToggle}\n                    showArchived={false}\n                  />\n\n                </div>\n              </div>\n            </>\n\n          )}\n\n          <div className=\"entity-info-cell\">\n            <Label>Last Matched</Label>\n            <div>\n              {entity.last_matched_at ? (\n                <RelativeTime date={entity.last_matched_at} showTimezone={true} />\n              ) : <span>&mdash;</span>}\n            </div>\n          </div>\n\n          <div className=\"entity-info-cell\">\n            <Label>Last Sold</Label>\n            <div>\n              {entity.last_sold_at ? (\n                <RelativeTime date={entity.last_sold_at} showTimezone={true} />\n              ) : <span>&mdash;</span>}\n            </div>\n          </div>\n\n\n        </div>\n\n\n      </div>\n\n\n    </PageSection>\n  );\n};\n\n\nexport default EntityInfoBar;\n","import React, {FC, useState, useEffect} from \"react\";\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport {RulesManager} from \"./Manager\";\nimport EntityInfoBar from \"./EntityInfoBar\";\nimport {useParams} from \"react-router-dom\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {RoutedEntityType} from \"../../../types\";\nimport {ChannelSourceRoute} from \".\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport PageSection from \"../../../Layout/PageSection\";\n\ntype RoutingRuleUrlParamsType = {\n  entityId: string,\n  entityType: RoutedEntityType,\n  channelId?: string,\n  sourceId?: string,\n}\n\n/*\n * Page for Routing rules\n * The routing rules manager contained in a page section\n */\nexport const Page: FC<any> = () => {\n\n  const { api } = useApi();\n   const { entityId, entityType, channelId, sourceId } = useParams<RoutingRuleUrlParamsType>();\n   const [entity, setEntity] = useState<any>(null);\n   const [isLoading, setIsLoading] = useState<boolean>(true)\n\n   useEffect(()=>{\n     setEntity(null);\n     setIsLoading(true);\n     loadRoutedEntity()\n   }, [entityId, entityType, channelId, sourceId])\n\n   const loadRoutedEntity = async() => {\n     let result;\n     switch (entityType){\n       case 'channel':\n         result = await api.endpoints.channels.show(entityId)\n         break;\n       case 'source':\n         result = await api.endpoints.sources.show(entityId)\n         break;\n       case 'vendor':\n         result = await api.endpoints.vendors.show(entityId)\n         break;\n       case 'channelsource':\n         const channel = await api.endpoints.channels.show(channelId)\n         if (channel) {\n\n           // the source array of a channel is its source eligibilities.\n           const source = channel.sources.find((s:any) => s.id.toString() === sourceId);\n\n           if (source) {\n             //setChannelSource(sourceEligibility);\n             result = new ChannelSourceRoute(channel, source)\n           }\n         }\n         break;\n     }\n     if (result) {\n       setEntity(result);\n     }\n     setIsLoading(false);\n   }\n\n\n  return (\n    <div id=\"routing-rule-manager\">\n      <DocTitle pageTitle={\n        entityType === 'global'\n          ? 'Global Routing Rules'\n          : entity?.name\n          ? `Routing Rules: ${entity.name}`\n          : 'Routing Rules'\n      } />\n\n      {!entity && entityType !== 'global' && !isLoading && (\n        <PageSection>\n          <StandardAlert color=\"light\">Unable to find the requested resource</StandardAlert>\n        </PageSection>\n      )}\n\n      {(entity || entityType === 'global') && (\n        <>\n          {entity && entityType && <EntityInfoBar entity={entity} entityType={entityType}/>}\n          {entityType === 'global' && <h1>Global Routing Rules</h1>}\n          <RulesManager\n            key={entityType === 'global' ? 'global' : entity?.rule_id}\n            entityType={entityType}\n            entityRuleId={entityType === 'global' ? undefined : entity?.rule_id}\n            entityName={entityType === 'global' ? undefined : entity?.name}\n            product={entity?.product}\n            verticalId={entity?.vertical?.id}\n          />\n        </>\n\n      )}\n\n    </div>\n  )\n}\n\n","import React from 'react';\nimport {Modal, ModalHeader, ModalBody} from \"reactstrap\";\nimport PropTypes from 'prop-types';\nimport './styles.scss';\nimport './RulesModal.scss';\nimport {RulesManager} from '.';\nimport { Link } from 'react-router-dom';\nimport { titleCase } from '../../../utils/string';\nimport LoadingBar from '../../../Layout/LoadingBar';\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {CopyButton} from \"@thedmsgroup/mastodon-ui-components\";\n\n/*\n * Modal container for routing rules configuration.\n * Entity may be Source, Vendor, Channel, or Channel-source (aka ChannelEligibility)\n */\nexport const RoutingRulesModal = ({\n  entity,\n  entityType,\n  isOpen,\n  close,\n  onRefresh,\n}) => {\n  if (!entity || !entityType) return null\n  const permalink = entityType === \"channelsource\"\n    ? `/routing/channelsource/channel/${entity.channel.id}/source/${entity.source.id}/rules`\n    : `/routing/${entityType}/${entity.id}/rules`\n\n  return (\n    <Modal isOpen={isOpen} toggle={close} size=\"xlg\" className=\"rules-modal\" id=\"routing-rules-modal\">\n\n      {entity.rule_id && (\n        <>\n          <ModalHeader toggle={close}>\n            {entityType === \"channelsource\" ? \"Channel-Source\" : titleCase(entityType)} Routing Rules | <span\n            className=\"modal-subheader\">{entity.name}</span>\n          </ModalHeader>\n\n          <div className=\"modal-subheader\">\n            <Link\n              target=\"_blank\"\n              to={permalink}\n              className=\"link rule-manager-link p-0\"\n              title=\"Link to Routing Rules Manager\"\n            >\n              <FaIcon icon=\"external-link-alt\" size=\"sm\"/>\n              {\" \"}\n              Permalink\n            </Link>\n            <CopyButton\n              id=\"copy-link\"\n              textToCopy={`${location.protocol}//${location.host}/#${permalink}`}\n              buttonSize=\"sm\"\n            >\n              <FaIcon icon=\"copy\" size=\"sm\"/>\n            </CopyButton>\n          </div>\n\n          <ModalBody className=\"\" id=\"routing-rule-manager\">\n            <LoadingBar name=\"modal\"/>\n            <RulesManager\n              entityRuleId={entity.rule_id}\n              entityType={entityType}\n              product={entity.product}\n              verticalId={entity.vertical?.id}\n              isModal={true}\n              onRefresh={onRefresh}\n            />\n\n          </ModalBody>\n        </>\n      )}\n    </Modal>\n\n  )\n};\n\nRoutingRulesModal.propTypes = {\n  entity: PropTypes.object.isRequired,\n  entityType: PropTypes.string.isRequired,\n  isOpen: PropTypes.bool.isRequired,\n  close: PropTypes.func.isRequired,\n  onRefresh: PropTypes.func\n};\n\n\n","\n/*\n * An entity that is a composite of a channel-source relationship.\n * This is useful for the routing rule management, where an entity\n * with certain properties is expected\n */\nclass ChannelSourceRoute {\n  constructor (channel, channelSource) {\n\n    this.name = `Source \"${channelSource.name}\" to Channel \"${channel.name}\"`;\n    this.channel = channel;\n    this.source = {\n      id: channelSource.id,\n      name: channelSource.name,\n      status: channelSource.status,\n    }\n\n    this.product = channel.product;\n    this.vertical = channel.vertical;\n\n    this.status = channelSource.eligibility.status;\n    this.rule_id = channelSource.eligibility.rule_id\n    this.distribution = channelSource.eligibility.distribution;\n    this.fixed_distribution = channelSource.eligibility.fixed_distribution;\n    this.last_matched_at = channelSource.eligibility.last_matched_at;\n    this.last_sold_at = channelSource.eligibility.last_sold_at;\n\n  }\n}\n\nexport default ChannelSourceRoute\n","import BaseAPI from \"../../../Services/BaseAPI\";\n\nclass InputSchemaApi extends BaseAPI {\n  constructor() {\n    super(process.env.API_URL_CORE);\n  }\n\n  list = ()     => this.makeRequest('get', `${this.url}/input-schemas`);\n  show = (id, params)    => this.makeRequest('get', `${this.url}/input-schemas/${id}`, params);\n  update = (id, params) => this.makeRequest('put', `${this.url}/input-schemas/${id}`, params);\n  create = (params) => this.makeRequest('post', `${this.url}/input-schemas`, params);\n}\n\nexport default InputSchemaApi\n","import {getProperty} from 'dot-prop';\n\n//eg, API uses 'm', Chart uses 'minute'\nexport const AggIntervalToUnit = {\n  's':'second',\n  'm':'minute',\n  'h':'hour',\n  'd':'day',\n  'w':'week',\n  'M':'month',\n  'q':'quarter',\n  'y':'year',\n}\n\n// Enforce a maximum number of buckets in a dataset\n// (Can keep bar charts from getting too crazy)\nexport const normalizeBuckets = (bucketsArr, MAX_BUCKETS) => {\n  const bucketLength = bucketsArr?.length;\n  if (bucketLength > MAX_BUCKETS) {\n    const scaleFactor = Math.ceil(bucketLength / MAX_BUCKETS);\n    const reduceArr = [];\n    for (let i = 0; i < bucketLength; i += scaleFactor) {\n      reduceArr.push(bucketsArr[i]);\n    }\n    return {buckets:reduceArr, scaleFactor};\n  }\n  return {buckets:bucketsArr, scaleFactor: 0}\n};\n\n\n/*\n * Refactor a time-based aggregation that has sub-aggregation per time slot\n * into labels and multiple datasets expected by ChartJS when producing a chart\n * with multiple datasets, such as a stacked bar chart\n */\nexport const aggregateToMultiDataset = (\n  timeBuckets,\n  timeField='key_as_string',\n  dataKeyField = 'key',\n  dataCountField = 'doc_count',\n  dataBucketPath = 'data',\n  dataLabelFormatter\n) => {\n  /*\n  Example: each time slot has an aggregation of integrations and their timeout counts.\n  delivery_errors_over_time.buckets[\n    {\n      key: long int\n      key_as_string:  \"2024-01-25T18:12:00.000Z\"\n      doc_count: 26\n      timeouts: {\n        doc_count: int\n        integrations.buckets[]\n          {key: 'iwebquotes_health_pingpost', doc_count: 12}\n      }\n    }\n    ...\n    ]\n\n    Transform into datasets by integration name:\n    {\n      labels: [ \"2024-01-25T18:12:00.000Z\", ...all other time slot keys... ],\n      datasets: [  ... dataset per integration.... ]\n    }\n    where each dataset is\n    {\n      label: integration name\n      data: [ array of counts per time period ]\n    }\n   */\n\n  // Labels are the time axis (timeField value)\n  const labels = [];\n\n  const datasets = {} ;\n\n  timeBuckets.forEach((timeBucket, timeIndex) => {\n    // console.log('index.tsx: iterating on a date bucket', bkt);\n    const time = timeBucket[timeField];\n    const data = getProperty(timeBucket, dataBucketPath);\n    if (time && data  ) {\n      labels.push(time);\n      //console.log('chart.js. time', time);\n      data.forEach((dataBucket) => {\n        const dataKey = getProperty(dataBucket, dataKeyField)\n        const dataCount = getProperty(dataBucket, dataCountField);\n        //console.log('chart.js: data ', `key:${dataKey}: ${dataCount}`);\n        if (dataKey && dataCount !== undefined) {\n          // With dataKey, create an entry in datasets with the key as the label,\n          // and counts as an array of zero counts equal to the number of time values\n          if (typeof datasets[dataKey] === 'undefined') {\n            datasets[dataKey] = {\n              label: typeof dataLabelFormatter === 'function' ? dataLabelFormatter(dataKey) : dataKey,\n              data: Array(timeBuckets.length).fill(0)\n            }\n          }\n\n          //Fill in the count at the current time position\n          datasets[dataKey].data[timeIndex] = dataCount;\n        }\n\n\n      })\n    } else {\n      throw new Error('aggregateToMultiDataset: unable to resolve data')\n    }\n\n  })\n\n  return {labels, datasets: Object.values(datasets)}\n}\n\nexport const aggregateToMultiDataset_Object = (\n  timeBuckets,\n  timeField='key_as_string',\n  dataBucketPath = 'data',\n  _hiddenKeys=[],\n  dataLabelFormatter\n) => {\n  /*\n  Example: each time slot has an aggregation of integrations and their timeout counts.\n  delivery_errors_over_time.buckets[\n    {\n      key: long int\n      key_as_string:  \"2024-01-25T18:12:00.000Z\"\n      doc_count: 26\n      timeouts: {\n        doc_count: int\n        integrations.buckets[]\n          {key: 'iwebquotes_health_pingpost', doc_count: 12}\n      }\n    }\n    ...\n    ]\n\n    Transform into datasets by integration name:\n    {\n      labels: [ \"2024-01-25T18:12:00.000Z\", ...all other time slot keys... ],\n      datasets: [  ... dataset per integration.... ]\n    }\n    where each dataset is\n    {\n      label: integration name\n      data: [ array of counts per time period ]\n    }\n   */\n\n  // Labels are the time axis (timeField value)\n  const labels = [];\n\n  const datasets = {} ;\n\n  timeBuckets.forEach((timeBucket, timeIndex) => {\n    // console.log('index.tsx: iterating on a date bucket', bkt);\n    const time = timeBucket[timeField];\n    const data = getProperty(timeBucket, dataBucketPath);\n    if (time && data  ) {\n      labels.push(time);\n      //console.log('chart.js. time', time);\n      Object.entries(data).forEach(([key, value]) => {\n        // With dataKey, create an entry in datasets with the key as the label,\n        // and counts as an array of zero counts equal to the number of time values\n        if (typeof datasets[key] === 'undefined') {\n          datasets[key] = {\n            label: typeof dataLabelFormatter === 'function' ? dataLabelFormatter(key) : key,\n            data: Array(timeBuckets.length).fill(0)\n          }\n        }\n\n        //Fill in the count at the current time position\n        datasets[key].data[timeIndex] = value;\n\n        //  datasets[key].hidden = hiddenKeys.includes(key) does not work\n\n      })\n\n    } else {\n      throw new Error('aggregateToMultiDataset: unable to resolve data')\n    }\n\n  })\n\n  return {labels, datasets: Object.values(datasets)}\n}\n\nexport const DefaultStackedChartOptions = {\n  responsive: true,\n  maintainAspectRatio: false,\n  scales: {\n    x: {\n      stacked:true,\n      title: {\n        display:true,\n        font: {\n          weight:'bolder'\n        }\n      },\n      clip:false,\n      offset:true,\n      type:'time',\n      time: {\n\n      },\n      grid: {\n        display: true,\n      },\n      ticks: {\n        autoSkip: true,\n        maxRotation: 0,\n        major: {enabled: true},\n        color: (ctx) => ctx.tick?.major ? '#222' : '#888',\n        font: (ctx) => ctx.tick?.major ? {weight: 'bold', size: 11} : {size: 11},\n      },\n    },\n    y:{\n      stacked:true\n    }\n  },\n  animation: {\n    y: {\n      duration: 850,\n      from: 190,\n      easing: 'easeInOut'\n    }\n  },\n  plugins: {\n    tooltip: {\n      intersect:true,\n      mode:'nearest'\n    },\n    legend: {\n      display: true,\n      responsive: true,\n      position: \"bottom\",\n      labels: {\n        boxWidth: 12,\n        padding: 6,\n        font: {\n          size: 9\n        },\n        // usePointStyle:true\n      },\n      align: \"start\",\n    },\n    autocolors: {\n      offset:2,\n      data: \"label\"\n    }\n  },\n}\n\nexport const DefaultLineChartOptions = {\n  responsive: true,\n  maintainAspectRatio: false,\n  pointRadius:0,\n  scales: {\n    x: {\n      stacked:true,\n      title: {\n        display:true,\n        font: {\n          weight:'bolder'\n        }\n      },\n      clip:false,\n      offset:true,\n      type:'time',\n      time: {\n\n      },\n      grid: {\n        display: true,\n      },\n      ticks: {\n        autoSkip: true,\n        maxRotation: 0,\n        major: {enabled: true},\n        color: (ctx) => ctx.tick?.major ? '#222' : '#888',\n        font: (ctx) => ctx.tick?.major ? {weight: 'bold', size: 11} : {size: 11},\n      },\n    },\n  },\n  animation: {\n    y: {\n      duration: 850,\n      from: 190,\n      easing: 'easeInOut'\n    }\n  },\n  plugins: {},\n}\n","import * as Yup from 'yup';\n\n/* Special validation\n * Import named constant and add to Yup schema like:\n * schedule: Yup.mixed().validActivitySchedule('This is just not acceptable')\n */\nexport const ActivityScheduleValidation = (\n  Yup.addMethod(Yup.mixed, 'validActivitySchedule', function (message) {\n    return this.test(\n      'test-name',\n      message,\n      (schedule) => {\n        const bad = schedule.filter((item) => {\n          const from = new Date(item.from);\n          const to = new Date(item.to);\n          if (from >= to) return item;\n        });\n        return !bad.length;\n      },\n    );\n  })\n);\n\nexport const ChannelRouteValidation = (\n  Yup.addMethod(Yup.mixed, 'validChannelRoutes', function (message) {\n    return this.test(\n      'test-name',\n      message,\n      (channels) => {\n        const bad = channels.filter((channel) => (!!((!channel.distribution || !channel.margin))));\n        return !bad.length;\n      },\n    );\n  })\n);\n\n// Just import and use in your schema like:\n// my_json_field:JSONValidation\nexport const JSONValidation = Yup.string()\n  .test('json_field', 'Please enter a well-formed JSON payload', (str) => {\n    if (!str || str.trim() === '') {\n      return true;\n    }\n    try {\n      return !!(JSON.parse(str) && !!str);\n    } catch (e) {\n      return false;\n    }\n  })\n  .nullable();\n\n// Import and use in your schema like:\n//    phone:PhoneNumberValidation.nullable()\n//    phone:PhoneNumberValidation.required('Give me number')\n// Used in several places. For rules, we only have the field if the order product is calls.\n// (product is provided in context)\nexport const PhoneNumberValidation = Yup.string().trim()\n  .test('phone', 'Enter a 10 digit phone number prefixed with +1, or leave blank', function (phone) {\n\n    if (!phone) {\n      return true;\n    }\n\n    if (this.options.context.product && this.options.context.product !== 'calls') {\n      // where product is defined in context, only validate for calls\n      return true;\n    }\n\n    return /^\\+1\\d{10,}/.test(phone)\n\n    // Note:masking on the input field prevents non-digit characters except \"()-\", and +1 at start\n   // phone = phone.replace(/^\\+1/, '');\n   // phone = phone.replace(/[^\\d]/g, '');\n   // return phone.length >= 10;\n\n  });\n\nexport const PixelValidation = Yup.array().ensure().of(Yup.string().ensure().trim().test(\n  'pixel',\n  'All tracking pixels require a value',\n  (pixel) =>\n    // Using this test so we don't get indexed pathnames like \"impression_urls[2]\" which are difficult to work with in current error display\n    (pixel ? true : new Yup.ValidationError(['All tracking pixels require a value'], '', 'impression_urls', 'type'))\n  ,\n));\n\nexport const RoutingCapsValidation = Yup.addMethod(Yup.mixed, 'validRoutingCaps', function (message) {\n  return this.test(\n    'routing-caps',\n    message,\n    function (caps) {\n      // just doing a check for existing values since form should restrict value entry\n      return Object.keys(caps).every(k => !!(k.trim())) && Object.values(caps).every(v => !isNaN(parseInt(v)) && parseInt(v) > -1);\n    },\n  );\n});\n\nexport const PingDedupeCapsValidation = Yup.addMethod(Yup.mixed, 'validPingDedupeCaps', function (message) {\n  return this.test(\n    'ping-dedupe-caps',\n    message,\n    function (caps) {\n      // just doing a check for existing values since form should restrict value entry\n      // key_expression must be a string wrapped in a single expression, e.g. \"{universal_lead_id}\"\n      return caps.every(cap => cap.key_expression && /^\\{.+\\}$/.test(cap.key_expression.trim()) && !isNaN(parseInt(cap.duration)) && parseInt(cap.duration) > -1);\n    },\n  );\n});\n\n// Import this constant and use in your schema like:\n// match_conditions: Yup.mixed().validTargeting('This targeting misses the mark'),\nexport const TargetingValidation = (\n  Yup.addMethod(Yup.mixed, 'validTargeting', function (message) {\n    return this.test(\n      'test-name',\n      message,\n      function (match_conditions) {\n        let errors = {};\n        const attributes = this.options.context.hasOwnProperty('attributes') ? this.options.context.attributes : {};\n\n        match_conditions.map((group, groupIndex) => {\n          group.map((target, targetIndex) => {\n            // {attribute: \"state\", matches: true, accept_unknown: false, value: Array(1)}\n            const attribute = target.attribute ? attributes[target.attribute] : null;\n            try {\n              TargetingSchema.validateSync(target, { abortEarly: false, stripUnknown: true, context: { attribute } });\n            } catch (err) {\n              /* Err is ValidationError\n                                errors: (2) [\"value field must have at least 1 items\", \"Please make a selection for attribute value\"]\n                                inner: Array(2)\n                                    0: ValidationError {name: \"ValidationError\", value: Array(0), path: \"value\", type: \"min\", errors: Array(1), …}\n                                    1: ValidationError {name: \"ValidationError\", value: Array(0), path: \"value\", type: \"required\", errors: Array(1), …}\n\n                             */\n              let attrErrors = null;\n              if (err.inner) {\n                // Key by target attribute (state, driver.age, etc) or default to path (for example, attribute field is not set)\n                attrErrors = err.inner.reduce((formError, innerError) => ({\n                  ...formError,\n                  [(target.attribute || innerError.path)]: innerError.message,\n                }), {});\n              }\n              if (attrErrors) {\n                errors = { ...errors, ...attrErrors };\n              }\n            }\n          });\n        });\n        // console.log('CustomValidation.js:TargetingValidation errors: ', errors); // example: {attribute: \"A target has no selected attribute\"}\n\n        // errors array will be assigned to the key defined by this.path, which is the parent key for the validated field.\n        // For example, if parent validation schema uses this validation function with key 'match_conditions' like so:\n        //    match_conditions: Yup.mixed().validTargeting('Invalid Targeting')\n        // then the error object will have {match_conditions: {attribute:\"bad\"}}\n        return Object.keys(errors).length ? new Yup.ValidationError(errors, '', this.path, 'type') : true;\n      },\n    );\n  })\n);\n\nconst doValidation = (schema, input) => {\n  let errors = {};\n  try {\n    schema.validateSync(input, { abortEarly: false, stripUnknown: true });\n  } catch (err) { // ValidationError\n    if (err.inner) {\n      errors = err.inner.reduce((formError, innerError) => ({\n        ...formError,\n        [(innerError.path)]: innerError.message,\n      }), {});\n    }\n  }\n\n  return errors;\n};\n\n// Import this constant and use in your schema like:\n// proxy_bidding: Yup.mixed().validProxyBidding('Invalid proxy bidding configuration'),\nexport const ProxyBiddingValidation = Yup.addMethod(Yup.mixed, 'validProxyBidding', function (message) {\n  return this.test(\n    'proxy-bidding',\n    message,\n    function (proxy) {\n      // allow pass for empty object which is default when no configuration exists\n      if (!proxy || Object.keys(proxy).length === 0) return true;\n      const errors = doValidation(ProxyBiddingSchema, proxy);\n      return Object.keys(errors).length ? new Yup.ValidationError(errors, 'proxy_bidding', this.path, 'type') : true;\n    },\n  );\n});\n\n// Import this constant and use in your schema like:\n// prefill: Yup.mixed().validPrefill('Invalid prefill configuration'),\nexport const PrefillValidation = Yup.addMethod(Yup.mixed, 'validPrefill', function (message) {\n  return this.test(\n    'prefill',\n    message,\n    function (prefill) {\n      // allow pass for empty object which is default when no configuration exists\n      if (!prefill || Object.keys(prefill).length === 0) return true;\n      const errors = doValidation(PrefillSchema, prefill);\n      return Object.keys(errors).length ? new Yup.ValidationError(errors, 'prefill', this.path, 'type') : true;\n    },\n  );\n});\n\nconst IntegrationSchema = Yup.object().shape({\n  name: Yup.string().required('Integration service is required'),\n});\n\nconst ProxyBiddingSchema = Yup.object().shape({\n  integration: IntegrationSchema,\n  vendor_attributes: JSONValidation,\n  post_timeout: Yup.number()\n    .nullable()\n    .integer('Post timeout must be a whole number of seconds')\n    .min(0, 'Post timeout cannot be negative')\n    .max(50, 'Post timeout cannot exceed 50 seconds'),\n  // validate bid_floor, bid_modifier?\n});\n\nconst PrefillSchema = Yup.object().shape({\n  integration: IntegrationSchema,\n  // template ??\n});\n\n// Use in your schema like:\n// enrichment_addons: Yup.mixed().validSalesConditions('Invalid Sales Conditions'),\n// note: the error is returned with key 'sales_conditions'\nexport const SaleConditionsValidation = (\n  Yup.addMethod(Yup.mixed, 'validSaleConditions', function (message) {\n    return this.test(\n      'test-sale-conditions',\n      message,\n      function (sales_conditions) {\n        const errors = {};\n        const attributes = this.options.context.hasOwnProperty('attributes') ? this.options.context.attributes : {};\n\n        sales_conditions.map((sc, index) => {\n          try {\n            SaleConditionsSchema.validateSync(sc, { abortEarly: false, stripUnknown: true, context: { attributes } });\n          } catch (err) { // ValidationError\n            let attrErrors = null;\n            if (err.inner) {\n              // Key by target attribute (state, driver.age, etc) or default to path (for example, attribute field is not set)\n              attrErrors = err.inner.reduce((formError, innerError) => ({\n                ...formError,\n                [(innerError.path)]: innerError.message,\n              }), {});\n            }\n            if (attrErrors) {\n              // errors = {...errors, ...attrErrors};\n              // key by index so we know which one errored\n              errors[index] = { ...attrErrors };\n            }\n          }\n        });\n\n        // console.log('CustomValidation.js:SalesConditionsValidation errors: ', errors);\n\n        /* Example, sales condition with no selected integration, one suppression condition without attribute selection\n         {\n           enrichment_addons: {  <-- this key will be the path provided, this.path\n              integration: \"A sales condition has no selected integration\"\n              suppression_conditions: {attribute: \"A target has no selected attribute\"}\n           }\n          }\n         */\n\n        return Object.keys(errors).length ? new Yup.ValidationError(errors, '', this.path, 'type') : true;\n      },\n    );\n  })\n);\n\nconst SaleConditionsSchema = Yup.object().shape({\n  integration: Yup.object().shape({\n    name: Yup.string().required('Integration service is required'),\n  }),\n  // timing: Yup.string().required('A sale condition has no selected timing'),\n  suppression_conditions: Yup.mixed().validTargeting('Invalid Targeting'),\n  vendor_attributes: JSONValidation,\n  notify: Yup.boolean,\n});\n\n// Use in your schema like:\n// enrichment_addons: Yup.mixed().validChannelModifiers('Invalid Channel Modifiers'), dsd\nexport const ChannelModifiersValidation = (\n  Yup.addMethod(Yup.mixed, 'validChannelModifiers', function (message) {\n    return this.test(\n      'test-channel-modifiers',\n      message,\n      function (modifiers) {\n        const errors = {};\n\n        modifiers.map((sc, index) => {\n          try {\n            ChannelModifiersSchema.validateSync(sc, { abortEarly: false, stripUnknown: true, context: {} });\n          } catch (err) { // ValidationError\n            let attrErrors = null;\n            if (err.inner) {\n              attrErrors = err.inner.reduce((formError, innerError) => ({\n                ...formError,\n                [(innerError.path)]: innerError.message,\n              }), {});\n            }\n            if (attrErrors) {\n              // key by index so we know which one errored\n              errors[index] = { ...attrErrors };\n            }\n          }\n        });\n\n        // console.log('CustomValidation.js:ChannelModifiersValidation errors: ', errors);\n        return Object.keys(errors).length ? new Yup.ValidationError(errors, '', this.path, 'type') : true;\n      },\n    );\n  })\n);\n\n// when status != disabled bid_modifiers is number\nconst ChannelModifiersSchema = Yup.object().shape({\n  type: Yup.string(), //\n  bid_modifier: Yup.mixed().when('type', { // note, error property will be 'bidding.bid_modifier'\n    is: (val) => val !== 'disabled',\n    then: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : parseInt(n))).min(0, 'Bid modifier is required').max(5000, 'Maximum bid adjustment is 5000%'),\n  }),\n});\n\n// Validation schema for testing a match condition (aka targeting)\nconst TargetingSchema = Yup.object().shape({\n  attribute: Yup.string().required('A target has no selected attribute'),\n  value: Yup.mixed().when(\n    // `$attribute` reference is context value provided when validating form\n    '$attribute', (attribute, schema) => {\n      if (attribute) {\n        const attrName = attribute.label;\n        switch (attribute.input_type) {\n          case 'integer':\n            return Yup.number()\n              .transform((n) => (isNaN(n) ? null : parseInt(n)))\n              .typeError(`${attrName}: Please enter a number for the value`)\n              .min(0, `${attrName}:  value must be 0 or greater`)\n              .required(`${attrName}: Please enter a number for the value`);\n          case 'integer_range':\n            // Much tricksyness\n            // There may or may not be a min or max value\n            // We allow either min or max not to be set, but not both unset\n            // We use NumberMask in UI to ensure integer entry\n            return Yup.object().transform((val) => {\n              // Value might not be an object in some cases, so transform to object before validating\n              // Example:  value:{} in the stored json will be sent from PHP as value:[]\n              if (!val) {\n                return { from: null, to: null };\n              } if (Array.isArray(val)) {\n                return { from: val.from || null, to: val.to || null };\n              }\n              return val;\n            }).shape({\n              from: Yup.number()\n              // .typeError(`${attrName}: Please enter a number for the minimum value`)\n                .transform((n) => (isNaN(n) ? null : n))\n                .test('rangeMinOption', `${attrName}: The minimum range value is ${attribute.options.min}. (Leave blank to accept any value)`, (val) =>\n                  // Allow not setting the value. Do comparison only if integer\n                  (attribute.options.min && val !== null ? parseInt(val) >= attribute.options.min : true))\n                .notRequired()\n                .nullable(true),\n              to: Yup.number()\n              // .typeError(`${attrName}: Please enter a number for the maximum value`)\n                .transform((n) => (isNaN(n) ? null : n))\n                .test('rangeMaxOption', `${attrName}: The maximum range value is ${attribute.options.max}. (Leave blank to accept any value)`, (val) => (attribute.options.max && val !== null ? parseInt(val) <= attribute.options.max : true))\n                .test('rangeMax', `${attrName}: Invalid range, first value must be smaller than second`, function (n) {\n                  if (n === null || !Number.isInteger(parseInt(this.parent.from))) {\n                    return true;\n                  }\n                  return n >= parseInt(this.parent.from);\n                })\n                .test('emptyRange', `${attrName}: You must provide one or more range values`, function (toVal) {\n                  // PASS: if from or to have a val (including 0). toVal has been transfomed to null or integer\n                  return toVal !== null || Number.isInteger(parseInt(this.parent.from));\n                })\n                .notRequired()\n                .nullable(true),\n            });\n          case 'choice':\n          case 'dynamic_choice':\n            return Yup.string().required(`${attrName}: a value is required`);\n          case 'text':\n            return Yup.string().required(`${attrName}: a value is required`);\n          case 'multiple_choice':\n          case 'dynamic_multiple_choice':\n          case 'metro_choice':\n          case 'state_choice':\n            // return Yup.array().ensure().required(`Please make a selection for attribute value`)\n            return Yup.array().of(Yup.string()).required(`${attrName}: a selection is required`);\n          case 'zipcode_list':\n            // Might be array if user has not interacted with the field, so do transform\n            return Yup.string().transform((list) => (Array.isArray(list) ? list.length ? list.join(',') : '' : list)).ensure().required('Zip Code: one or more postal codes are required');\n          case 'county_list':\n            return Yup.string().ensure().required('County: one or more county names are required');\n        }\n      }\n\n      return Yup.mixed().notRequired();\n    }),\n});\n","import React, { useState, useCallback, useEffect } from 'react';\nimport { InputGroup,  Spinner } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport useApi from '../../Hooks/useApi';\nimport EnhancedSelect from \"./EnhancedSelect\";\n\n/*\n * React-Select element for that fetches choices from the API for the indicated resource\n * Shows spinner while loading.\n *\n * React-select expects options to have a value and a label.\n * By default, this component will use 'id' for the option value and 'name' for the label value\n */\nconst DynamicEnhancedSelect = ({\n  name,\n  endpoint,\n  action = 'list',\n  params={},\n  value,\n  placeholder = 'Select...',\n  onChange,\n  returnOption=false,\n  valueProperty='id',\n  labelProperty='name',\n  invalid=false,\n  invalidFeedback='',\n  ...selectProps\n}) => {\n\n  const [isLoading, setIsLoading] = useState(true);\n  const [items, setItems] = useState([]);\n  const api = useApi(endpoint, action);\n\n  // fetch on load\n  useEffect(() => {\n    if (!items || !items.length) {\n      load();\n    }\n  }, []);\n\n  const load = async() => {\n\n    const result = await api.fetch(params);\n    if (result) {\n\n      //if paged, use 'data' array\n      const dataset = result.data ?? result;\n\n      const choices =  dataset.reduce((acc, item) => {\n          if (typeof item[valueProperty] !== 'undefined'){\n            acc.push({...item, value:item[valueProperty], label:item[labelProperty] ?? 'Label Unknown'})\n          }\n          return acc;\n        }, [])\n      setItems(choices)\n\n    } else  {\n      console.log('Unable to load items for dynamic select! ', name, api.error ?? '');\n    }\n\n    setIsLoading(false);\n  }\n\n  const handleOnChange = useCallback((val) => {\n    // Returned values will be the ID, or whatever was specified as the value property\n    // if Multiselect, value will be an array of IDs\n    // Optionally we can also return the entire object(s) from the source data\n    if (returnOption) {\n      const opts = Array.isArray(val)\n        ? items.filter((item) => val.includes(item.value))\n        : items.find((item) => item.value === val)\n\n      onChange(val, opts)\n    } else {\n      onChange(val)\n    }\n  }, [items])\n\n  return (\n    <>\n      { isLoading ? (\n        <div className=\"inline-loading\">\n          <Spinner size=\"sm\" />\n          {' '}\n          Loading...\n        </div>\n      ) : (\n        <InputGroup>\n\n          <EnhancedSelect\n            onChange={handleOnChange}\n            options={items}\n            value={value || ''}\n            isInvalid={invalid}\n            invalidFeedback={invalidFeedback}\n            placeholder={placeholder}\n            getOptionValue={(opt) => opt[valueProperty] ?? ''}\n            {...selectProps}\n          />\n        </InputGroup>\n      )}\n    </>\n\n  );\n};\n\nDynamicEnhancedSelect.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]),\n  placeholder: PropTypes.string,\n  invalid: PropTypes.bool,\n  invalidFeedback: PropTypes.string,\n  name: PropTypes.string.isRequired,\n  endpoint: PropTypes.string.isRequired,\n  action: PropTypes.string,\n  labelProperty: PropTypes.string,\n  params: PropTypes.object,\n};\nDynamicEnhancedSelect.defaultProps = {\n  onChange: () => {},\n  invalid: false,\n  labelProperty: 'name',\n};\n\nexport default DynamicEnhancedSelect;\n","import React, { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport filesize from 'filesize.js';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport {\n  FormGroup, Label, Button, Spinner, FormText,\n} from 'reactstrap';\nimport { useDropzone } from 'react-dropzone';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport './dropzone.scss';\n\nconst RejectedFiles = ({ files }) => {\n  /*\n  0:\n  errors: Array(1)\n    0: {code: \"file-invalid-type\", message: \"File type must be image/jpeg, image/png, image/gif\"}\n\n  file: File\n      lastModified: 1596478800973\n      lastModifiedDate: Mon Aug 03 2020 11:20:00 GMT-0700 (Pacific Daylight Time) {}\n      name: \"MastodonAdvertiserReport-2020-08-03 (1).csv\"\n      path: \"MastodonAdvertiserReport-2020-08-03 (1).csv\"\n      size: 730\n      type: \"text/csv\"\n      webkitRelativePath: \"\"\n   */\n  if (!files.length) return (null);\n  const { file } = files[0];\n  return (\n    <div className=\"rejected-file d-flex flex-column\">\n      <div className=\"text-center\">\n        <FaIcon icon=\"exclamation-triangle\" size=\"sm\" className=\"me-1\" />\n        {files.length > 1 ? (\n          <span>Please select only one file</span>\n        ) : <span>Please check file type and size:</span>}\n      </div>\n      {files.length === 1 && (\n      <div className=\"dropped-file text-center\">\n        {file.name}\n        {' '}\n        &bull;\n        {' '}\n        {file.type}\n        {' '}\n        &bull;\n        {' '}\n        {filesize(file.size)}\n        {' '}\n      </div>\n      )}\n    </div>\n  );\n};\n\n/*\n * Widget that uses Dropzone component for drag 'n drop file picking\n * Currently configured for single file entry.\n * see: https://react-dropzone.js.org/\n *\n * Note: In some places we might want to reset this component (say, after successful file upload).\n *    Recommended solution is set a key value on the component and update the key to reset.\n */\nconst FileDropzone = (props) => {\n  const [myFiles, setMyFiles] = useState([]);\n  const [badFiles, setBadFiles] = useState([]);\n\n  const removeFiles = (e) => {\n    e.stopPropagation();\n    // setMyFiles([]);\n    // setBadFiles([])\n    onDropAccepted([]);\n  };\n\n  const onDropAccepted = (files) => {\n    setMyFiles(files);\n    if (props.onDropAccepted) {\n      props.onDropAccepted(files);\n    }\n    setBadFiles([]);\n  };\n  const onDropRejected = (fileRejections) => {\n    setBadFiles(fileRejections);\n    setMyFiles([]);\n    if (props.onDropRejected) {\n      props.onDropRejected(fileRejections);\n    }\n  };\n  /*\n    Ad images\n      \"Upload\" button that puts image in account images so you can select it\n    Datasheets\n      No upload button\n   */\n  const {\n    getRootProps,\n    getInputProps,\n    isDragActive,\n    isDragAccept,\n    isDragReject,\n    open,\n  } = useDropzone({\n    noKeyboard: true,\n    noClick: true, // allows having buttons inside dropzone\n    maxSize: props.maxSize,\n    multiple: false,\n    onDropRejected,\n    onDropAccepted,\n    disabled: props.disabled,\n    accept: props.fileTypes,\n  });\n\n  const files = myFiles.map((file) => (\n    <div className=\"accepted-file text-center\" key={file.name}>\n      {file.name}\n      {' '}\n      &bull;\n      {' '}\n      {file.type}\n      {' '}\n      &bull;\n      {' '}\n      {filesize(file.size)}\n      {' '}\n    </div>\n  ));\n\n  const handleUploadClick = () => {\n    if (props.upload && myFiles.length) {\n      props.upload(myFiles[0]);\n    }\n  };\n\n  return (\n    <FormGroup className={props.className}>\n      {props.label && <Label className=\"d-block\">{props.label}</Label>}\n      {props.hint && <FormText>{props.hint}</FormText>}\n      <div {...getRootProps({\n        className: classnames('d-flex dropzone', {\n          'drag-active': isDragActive,\n          'drag-accept': isDragAccept,\n          'drag-reject': isDragReject,\n        }),\n      })}\n      >\n        <input {...getInputProps()} disabled={props.isUploading} />\n        <div className=\"file-icon\">\n          <div className=\"file-border\">\n            <div className=\"m-auto\">\n              <FaIcon icon={isDragReject ? 'times' : 'file-alt'} size=\"2x\" />\n            </div>\n          </div>\n        </div>\n        <div className=\"flex-fill d-flex flex-column justify-content-center\">\n\n          {isDragReject && (\n          <div className=\"rejected-file\">\n            <FaIcon icon=\"exclamation-triangle\" size=\"sm\" className=\"me-1\" />\n            Files will be rejected\n          </div>\n          )}\n          {!isDragReject && (\n            <>\n              {props.isUploading ? (\n                <div className=\"uploading d-flex align-items-center\">\n                  <Spinner color=\"secondary\" className=\"me-2\" />\n                  <div className=\"flex-fill\">Uploading...</div>\n                </div>\n              ) : (\n                <>\n                  {files.length > 0 && files}\n                  {files.length === 0 && badFiles.length === 0 && (\n                  <div className=\"prompt text-center\">\n                    Drop a file here, or {' '}\n                    <Button color=\"link\" className=\"inline\" onClick={open}>select a file</Button>\n                  </div>\n                  )}\n                  {badFiles.length > 0 && <RejectedFiles files={badFiles} />}\n                  <div className=\"d-flex justify-content-center\">\n                    { (files.length > 0 || badFiles.length > 0) && <Button size=\"sm\" color=\"link\" onClick={removeFiles}>Clear</Button>}\n                    {props.upload && files.length > 0 && <Button size=\"sm\" color=\"primary\" onClick={handleUploadClick} className=\"me-1\">Upload</Button>}\n\n                  </div>\n\n                </>\n              )}\n\n            </>\n          )}\n\n        </div>\n\n      </div>\n\n    </FormGroup>\n  );\n};\n\nFileDropzone.propTypes = {\n  fileTypes: PropTypes.string.isRequired, // comma delimted list of mime types\n  maxSize: PropTypes.number.isRequired,\n  onDropRejected: PropTypes.func,\n  onDropAccepted: PropTypes.func,\n  upload: PropTypes.func,\n  isUploading: PropTypes.bool,\n  className: PropTypes.string,\n  label: PropTypes.string,\n  hint: PropTypes.string,\n  disabled: PropTypes.bool,\n};\n\nFileDropzone.defaultProps = {\n  disabled: false,\n  isUploading: false,\n};\n\nexport default FileDropzone;\n","import React, { useState, useEffect } from 'react';\nimport {\n  NavItem, NavLink, Dropdown, DropdownToggle, DropdownMenu, DropdownItem,\n} from 'reactstrap';\nimport classnames from 'classnames';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\n/*\nShared items for forms\nimport { Required, TimezoneOptions} from \"../../../Form/FormCommon\";\n */\n\nexport const Required = React.memo(({ text = '(required)' }) => (\n  <span className={classnames(['required', 'ms-1', { asterisk: text === '*' }])} aria-label=\"required\" title=\"required\">\n    {text}\n  </span>\n));\n\nexport const GetValue = (e) => e.target.value;\nexport const GetChecked = (e) => e.target.checked;\nexport const ConvertBoolean = (val) => !(/^(false|0)$/i).test(val) && !!val;\n\nexport const TimezoneOptions = [\n\n  {\n    value: 'America/New_York',\n    name: 'Eastern Standard Time',\n  },\n  {\n    value: 'America/Chicago',\n    name: 'Central Standard Time',\n  },\n  {\n    value: 'America/Denver',\n    name: 'Mountain Standard Time',\n  },\n  {\n    value: 'America/Phoenix',\n    name: 'Mountain Standard Time - No DST',\n  },\n  {\n    value: 'America/Los_Angeles',\n    name: 'Pacific Standard Time',\n  },\n  {\n    value: 'America/Anchorage',\n    name: 'Alaska Standard Time',\n  },\n  {\n    value: 'Pacific/Honolulu',\n    name: 'Hawaii-Aleutian Standard Time',\n  },\n  {\n    value: 'UTC',\n    name: 'UTC / GMT',\n  },\n];\n\n// For tabbed forms, shows error state\nexport const FormTab = ({\n  label, id, activeTab, setActive, isValid,\n}) => (\n  <NavItem>\n    <NavLink\n      className={classnames({ active: activeTab === id, error: !isValid })}\n      onClick={() => { setActive(id); }}\n    >\n      {!isValid\n                && <FaIcon icon=\"exclamation-triangle\" size=\"1x\" />}\n      {label}\n    </NavLink>\n  </NavItem>\n);\n\nFormTab.defaultProps = {\n  isValid: true,\n};\n\n// Tab style used in most places.\nexport const FormTabFlat = ({\n  label, id, activeTab, setActive, isValid,\n}) => {\n  const isActive = activeTab === id;\n  return (\n    <NavItem className={classnames({ active: isActive })}>\n      {!isValid && <FaIcon icon=\"exclamation-circle\" size=\"1x\" className=\"tab-icon tab-icon-error\" />}\n\n      <NavLink\n        className={classnames({ active: isActive, error: !isValid })}\n        onClick={() => { setActive(id); }}\n      >\n        <div className=\"tab-label\">{label}</div>\n\n      </NavLink>\n\n    </NavItem>\n  );\n};\n\nFormTabFlat.defaultProps = {\n  isValid: true,\n};\n\n/*\n * Provides a way to \"hide\" tabs in a dropdown \"...\" menu.\n * Consists of one tab which shows the selected content,\n * and another tab with a \"...\" dropdown menu for selecting a tab.\n *\n * For use in rules manager (advertiser and publisher).\n */\n\nexport const FormTabMore = ({\n  items, activeTab, setActive, errorTabs,\n}) => {\n  // set selectedItem to activeTab (if in items), or the first item\n  const [selectedItem, setSelectedItem] = useState(items[0]);\n  const [dropdownOpen, setDropdownOpen] = useState(false);\n  const isActive = items.filter((item) => activeTab === item.id).length > 0;\n  const isInvalid = selectedItem ? errorTabs.includes(selectedItem.id) : false;\n  const anyInvalid = items.some((item) => errorTabs.includes(item.id));\n\n  useEffect(() => {\n    // Switch the displayed navItem if activated and in the items collection\n    const activeItem = items.find((item) => activeTab === item.id);\n    if (activeItem && activeItem.id !== selectedItem.id) {\n      setSelectedItem(activeItem);\n    }\n  }, [activeTab]);\n\n  const handleClick = (item) => {\n    setSelectedItem(item);\n    setActive(item.id);\n  };\n\n  const toggle = () => setDropdownOpen(!dropdownOpen);\n\n  return (\n    <>\n\n      {/* The currently selected member of \"more\" items */}\n      <NavItem className={classnames({ active: isActive })}>\n        {isInvalid && <FaIcon icon=\"exclamation-circle\" size=\"1x\" className=\"tab-icon tab-icon-error\" />}\n\n        <NavLink\n          className={classnames({ active: isActive, error: isInvalid })}\n          onClick={() => { setActive(selectedItem.id); }}\n        >\n          <div className=\"tab-label\">{selectedItem.label}</div>\n\n        </NavLink>\n\n      </NavItem>\n\n      {/* The \"more\" dropdown menu */}\n      <NavItem>\n        {/* Only show error icon over \"more\" ellipsis if the errored item is not selected */}\n        { anyInvalid && !isInvalid && <FaIcon icon=\"exclamation-circle\" size=\"1x\" className=\"tab-icon tab-icon-error\" />}\n        <NavLink onClick={toggle} className={classnames({ error: anyInvalid && !isInvalid })}>\n          <div className=\"tab-more\">\n            <Dropdown isOpen={dropdownOpen} toggle={toggle} >\n              <DropdownToggle color=\"link\" title=\"More Settings\" className=\"inline tab-label\" caret>\n                More\n              </DropdownToggle>\n              <DropdownMenu end>\n                {items.map((item, i) => (\n                  <DropdownItem\n                      key={i}\n                      onClick={() => handleClick(item)}\n                    >\n                      {item.label}\n                    </DropdownItem>\n                ))}\n\n              </DropdownMenu>\n            </Dropdown>\n          </div>\n\n        </NavLink>\n\n      </NavItem>\n    </>\n\n  );\n};\n\nFormTabMore.defaultProps = {\n  errorTabs: [],\n  items: [],\n};\n","import React from 'react';\nimport { FormGroup, Label } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\n/*\n * Checkbox formgroup with an icon instead of standard checkbox input\n */\nconst IconCheckbox = ({\n  name, value, className, onChange, disabled = false, children,\n}) => {\n  const handleClick = () => {\n    if (!disabled) {\n      onChange(name, !value);\n    }\n  };\n\n  return (\n    <FormGroup className={classnames(['icon-checkbox', className, { checked: value, disabled }])} check>\n      <Label check onClick={handleClick}>\n        <FaIcon\n          icon={['far', (value ? 'check-square' : 'square')]}\n          size=\"lg\"\n          className=\"cbx-icon\"\n        />\n        {children}\n      </Label>\n    </FormGroup>\n  );\n};\n\nIconCheckbox.propTypes = {\n  name: PropTypes.string.isRequired,\n  onChange: PropTypes.func.isRequired,\n  value: PropTypes.bool.isRequired,\n  disabled: PropTypes.bool,\n  className: PropTypes.string,\n  children: PropTypes.node,\n};\n\nexport default IconCheckbox;\n","import React, { useRef, useEffect } from 'react';\nimport { FormFeedback, Input } from 'reactstrap';\nimport classnames from 'classnames';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\n\n/*\n * Reactstrap input with an icon in the background\n * (see layout/main.scss for styles, and _faBackground.scss for sass functions)\n *\n * If you need a ref to the input use  <InputWithIcon innerRef={myRef} ....\n * Use inputSize=\"sm\" attribute when smaller input is desired\n */\nconst InputWithIcon = ({\n                         icon,\n                         iconSize=\"sm\",\n                         iconSide=\"left\",\n                         containerClass=\"\",\n                         onClear=null,\n                         inline=false,\n                         autofocus=false,\n                         ...restProps\n}) => {\n  const inputRef = useRef(null);\n  // Note on right aligned icons:\n  // This might conflict with reactstrap's input invalid state, which puts an svg X on the right in the background.\n  // Maybe turn off background or background-image for .form-control.is-invalid ?\n\n  // Wrapping in div keeps it in a block which ensures that input will go below label in a FormGroup.\n  // The input-icon-container is inline-block which works with fixed-width input classes like tiny or teeny\n  // (specifically, ensures that the right-aligned icon stays within the input).\n  // However, sometimes you want it to expand like a block div. Pass containerClass=\"expands\".\n\n  // focus on load if indicated\n  useEffect(() => {\n    if (autofocus && inputRef.current) {\n      inputRef.current.focus();\n    }\n  }, [inputRef]);\n\n  const handleClear = () => {\n    if (inputRef.current) inputRef.current.value = '';\n    onClear();\n  };\n\n  // The TextSearch component uses 'defaultValue' instead of value property because of debouncing.\n  // This results in the value not clearing properly in some cases.\n  // useEffect to the rescue.\n  useEffect(() => {\n    if (restProps.defaultValue !== undefined && !restProps.defaultValue && inputRef.current) {\n      inputRef.current.value = '';\n    }\n  }, [restProps.defaultValue]);\n\n  return (\n    <div className={classnames({ 'd-inline': inline })}>\n      <div className={classnames('input-icon-container', containerClass, [`icon-${iconSide}`], { 'size-sm': restProps.bSize === 'sm' })}>\n        <FaIcon icon={icon} size={iconSize} className={classnames('input-icon', iconSide)} />\n        {onClear && <FaIcon icon=\"times\" className=\"input-icon right clear\" onClick={handleClear} />}\n        <Input innerRef={inputRef} size={restProps.bSize || ''} {...restProps} />\n        <FormFeedback>{restProps.error}</FormFeedback>\n      </div>\n    </div>\n  );\n};\n\nInputWithIcon.propTypes = {\n  iconSize: PropTypes.string,\n  iconSide: PropTypes.string,\n  icon: PropTypes.string,\n  onClear: PropTypes.func,\n  containerClass: PropTypes.string,\n  className: PropTypes.string,\n  inline: PropTypes.bool,\n  autofocus: PropTypes.bool,\n};\n\nInputWithIcon.defaultProps = {\n  iconSize: 'sm',\n  iconSide: 'left',\n  icon: '',\n  onClear: null,\n  containerClass: '',\n  className: '',\n  inline: false,\n};\n\nexport default InputWithIcon;\n","/**\n * KeyValueBuilder Component\n *\n * A dynamic list builder for creating and managing key-value pairs.\n * Allows users to add/remove rows of key-value inputs with add/remove buttons.\n * Each row contains a KeyValueRow component for editing the key and value.\n *\n * Features:\n * - Add new key-value pairs with \"+\" button\n * - Remove individual pairs with \"-\" button\n * - Empty state with single \"Add\" button when no values exist\n * - Each row has both add and remove buttons for convenience\n *\n * Props:\n * - values: Array of {key, value} objects\n * - onChange: Callback function that receives updated values array\n * - className: Optional CSS class for styling\n * - label: Label text shown in the \"Add\" button when list is empty\n */\nimport React from 'react';\nimport {\n  Button,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport KeyValueRow from './KeyValueRow';\nimport './KeyValueBuilder.scss';\n\nconst KeyValueBuilder = ({ values= [], onChange, className='', label = '' }) => {\n\n  const onChangeAttribute = (key, i) => {\n    const newValues = [...values];\n    newValues[i].key = key;\n    onChange(newValues);\n  };\n\n  const onChangeValue = (val, i) => {\n    const newValues = [...values];\n    newValues[i].value = val;\n    onChange(newValues);\n  };\n\n  // Problem: in Integration, the change handler is expecting form event\n  const addRow = () => onChange([...values, { key: '', value: '' }]);\n\n  const removeRow = (index) => onChange(values.filter((pair, i) => i !== index));\n\n  return (\n    <div className={`key-value-builder ${className}`}>\n      {values.length > 0 ? (\n        <>\n          {values.map((item, i) => (\n            <div className=\"key-value-item d-flex mb-2\" key={i}>\n              <KeyValueRow\n                attribute={item.key}\n                value={item.value}\n                onChangeAttribute={(key) => { onChangeAttribute(key, i); }}\n                onChangeValue={(val) => onChangeValue(val, i)}\n              />\n\n              <div>\n                <Button color=\"link\" className=\"ms-2\" onClick={() => removeRow(i)}>\n                  <FaIcon icon=\"minus\" size=\"sm\" />\n                </Button>\n                <Button color=\"link\" className=\"ms-1\" onClick={addRow} size=\"sm\">\n                  <FaIcon icon=\"plus\" size=\"sm\" />\n                </Button>\n              </div>\n            </div>\n          ))}\n        </>\n      ) : (\n        <Button color=\"link\" className=\"\" onClick={addRow} size=\"sm\">\n          <FaIcon icon=\"plus\" className=\"me-1\" size=\"sm\" />\n          Add {label}\n        </Button>\n      )}\n    </div>\n  );\n};\n\nKeyValueBuilder.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  values: PropTypes.array.isRequired,\n  className: PropTypes.string,\n  label: PropTypes.string.isRequired\n};\n\nexport default KeyValueBuilder;\n","/**\n * KeyValueRow Component\n *\n * A single row component for inputting a key-value pair with optional object/JSON support.\n * The key input is masked to accept only lowercase alphanumeric characters and underscores\n * (query string parameter compatible format).\n *\n * Features:\n * - Masked key input: automatically converts to lowercase, allows only [a-z0-9_]\n * - Value type toggle (when allowObjects=true):\n *   - Text/Number mode: simple text input\n *   - Object mode: JSON editor for complex objects\n * - JSON validation: parses and validates JSON input in object mode\n * - Visual type indicator: icon shows current value type (text vs object)\n *\n * Props:\n * - attribute: The key string\n * - value: The value (string, number, or object/array when allowObjects is true)\n * - onChangeAttribute: Callback when key changes\n * - onChangeValue: Callback when value changes\n * - allowObjects: Boolean to enable object/JSON input mode\n * - keyReadOnly: Boolean to make the key input read-only and disabled\n */\nimport React, { useState, useEffect } from 'react';\nimport {\n  Input, InputGroup, ButtonDropdown, DropdownMenu, DropdownItem, DropdownToggle, FormText,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { faFont } from '@fortawesome/free-solid-svg-icons';\nimport PropTypes from 'prop-types';\nimport { isObject } from '../../utils/types';\nimport {JsonEditorLoadable, MaskedInput} from \"@thedmsgroup/mastodon-ui-components\";\n\n/**\n * Mask options for custom key input (query string parameter compatible)\n * Allows lowercase alphanumeric and underscores only\n */\nconst KeyMaskOptions = {\n  mask: /^[a-z0-9_]*$/,\n  prepare: function (str) {\n    return str.toLowerCase();\n  },\n};\n\n/* Row for custom key/value or key/object input */\nconst KeyValueRow = ({\n  attribute = '', value = '', onChangeAttribute, onChangeValue, allowObjects = false, valueHelpText = '', keyReadOnly = false\n}) => {\n  const [isOpen, setIsOpen] = useState(false);\n  const [valueType, setValueType] = useState(() => (allowObjects && (isObject(value) || Array.isArray(value)) ? 'object' : 'text'));\n  const [currentValue, setCurrentValue] = useState(() => {\n    if (isObject(value) || Array.isArray(value)) {\n      return JSON.stringify(value, null, 2);\n    }\n    return value;\n  });\n\n  useEffect(() => {\n    if (valueType === 'object') {\n      try {\n        const parsed = JSON.parse(currentValue);\n        if (parsed) {\n          onChangeValue(parsed);\n        }\n      } catch (e) {\n\n      }\n    }\n  }, [currentValue]);\n\n  const handleChangeType = (type) => {\n    if (type !== valueType) {\n      setValueType(type);\n      setCurrentValue('');\n      onChangeValue('');\n    }\n  };\n\n  const toggleDropDown = () => setIsOpen(!isOpen);\n\n\n  const onChangeCode = (editorCode, isValid) => {\n    if (editorCode !== currentValue && isValid) {\n      setCurrentValue(editorCode);\n    }\n  };\n\n  return (\n    <div className=\"key-value-row flex-fill d-flex justify-content-between\">\n      <div className=\"key flex-grow-1\">\n        <MaskedInput\n          {...KeyMaskOptions}\n          type=\"text\"\n          value={attribute}\n          placeholder=\"key\"\n          onAccept={(value) => onChangeAttribute(value)}\n          readOnly={keyReadOnly}\n        />\n      </div>\n\n      <div className=\"key-value-equals ms-2 me-2\"><b>=</b></div>\n\n      <div className=\"value\">\n\n        <InputGroup>\n\n          {allowObjects && (\n            <ButtonDropdown isOpen={isOpen} toggle={toggleDropDown}>\n              <DropdownToggle caret>\n                <FaIcon icon={valueType === 'text' ? faFont : 'list'} size=\"sm\" />\n              </DropdownToggle>\n              <DropdownMenu>\n                <DropdownItem onClick={() => handleChangeType('text')}>\n                  <FaIcon icon={faFont} size=\"sm\" />\n                  {' '}\n                  Text/Number\n                </DropdownItem>\n                <DropdownItem onClick={() => handleChangeType('object')}>\n                  <FaIcon icon=\"list\" size=\"sm\" />\n                  {' '}\n                  Object\n                </DropdownItem>\n              </DropdownMenu>\n            </ButtonDropdown>\n          )}\n\n\n          {valueType === 'text'\n            ? (\n              <Input\n                type=\"text\"\n                value={value}\n                placeholder=\"value\"\n                onChange={(e) => onChangeValue(e.target.value)}\n              />\n            )\n            : (\n              <Input\n                type=\"text\"\n                defaultValue=\"\"\n                placeholder=\"Enter valid JSON below\"\n                disabled\n                key=\"disabled-object-input\"\n              />\n            )}\n\n        </InputGroup>\n\n        {valueType === 'object' && (\n          <div className=\"object-value flex-fill\">\n            <JsonEditorLoadable\n              code={currentValue}\n              onChange={onChangeCode}\n            />\n          </div>\n        )}\n\n        {valueHelpText && (\n          <FormText>{valueHelpText}</FormText>\n        )}\n\n      </div>\n\n    </div>\n  );\n};\n\nKeyValueRow.propTypes = {\n  attribute: PropTypes.string,\n  value: PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.number]),\n  onChangeAttribute: PropTypes.func,\n  onChangeValue: PropTypes.func,\n  allowObjects: PropTypes.bool,\n  valueHelpText: PropTypes.string,\n  keyReadOnly: PropTypes.bool,\n};\n\nexport default KeyValueRow;\n","import React from 'react';\nimport { FormGroup, Label } from 'reactstrap';\nimport PasswordWithToggle from './PasswordWithToggle';\n\n/*\n * Password input with strength check, and confirm password input.\n * Used in: ActivateUser, ResetPassword, MyPasswordModal\n */\nconst PasswordEntry = ({\n  password, confirmPassword, onChange, errors, options, ...restProps\n}) => {\n\n  const { noLabel } = options;\n\n  return (\n    <>\n      <FormGroup>\n        {noLabel !== true && (\n        <Label>\n          New Password\n        </Label>\n        )}\n        <PasswordWithToggle\n          name=\"password\"\n          maxLength={60}\n          placeholder={noLabel ? 'Password' : ''}\n          autoComplete=\"new-password\"\n          onChange={onChange}\n          value={password}\n          invalid={!!errors.password}\n          error={errors.password}\n          {...restProps}\n        />\n      </FormGroup>\n\n      <FormGroup>\n        {noLabel !== true && (\n        <Label>\n          Confirm Password\n        </Label>\n        )}\n        <PasswordWithToggle\n          name=\"confirm_password\"\n          maxLength={60}\n          placeholder={noLabel ? 'Confirm Password' : ''}\n          onChange={onChange}\n          value={confirmPassword}\n          invalid={!!errors.confirm_password}\n          error={errors.confirm_password}\n          {...restProps}\n        />\n      </FormGroup>\n    </>\n  );\n};\n\nPasswordEntry.defaultProps = {\n  password: '',\n  confirmPassword: '',\n  options: {},\n};\n\nexport default PasswordEntry;\n","import React, { useState } from 'react';\nimport { FormFeedback, Input, InputGroup, InputGroupText } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { faEye } from '@fortawesome/free-solid-svg-icons';\nimport classnames from 'classnames';\n\n/*\n * Reactstrap Input with icon that toggles password visibility.\n*/\nconst PasswordWithToggle = ({ error, ...restProps }) => {\n  const [inputType, setInputType] = useState('password');\n  const handleClick = () => setInputType(inputType === 'password' ? 'text' : 'password');\n\n  return (\n    <InputGroup className={classnames('password-toggle', { visible: inputType === 'text'})}>\n      <Input type={inputType} {...restProps} />\n      <InputGroupText>\n        <FaIcon icon={faEye} onClick={handleClick} title=\"Show and hide password\" />\n      </InputGroupText>\n      <FormFeedback>{error}</FormFeedback>\n    </InputGroup>\n  );\n};\n\n\nexport default PasswordWithToggle;\n","import React from 'react';\nimport { useDebouncedCallback } from 'use-debounce';\nimport classnames from 'classnames';\nimport { Button, Input } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\n\n/*\n * Form entry for entering a pixel (script, url, etc)\n * Used in a list where you can add/remove\n */\nconst PixelForm = ({\n  pixel, handleRemove, handleChange, className,\n}) => {\n  // debounced to prevent delays while typing, since we are updating an array in a large object\n  const debouncedCallback = useDebouncedCallback((value) => {\n    handleChange(value);\n  }, 600);\n\n  return (\n    <div className={classnames('pixel-form', className, 'mb-3')}>\n\n      <div className=\"d-flex\">\n        <div className=\"flex-grow-1\">\n          <Input\n            type=\"textarea\"\n            defaultValue={pixel}\n            rows={3}\n            onChange={(e) => { debouncedCallback(e.target.value); }}\n            placeholder=\"Enter pixel tag\"\n          />\n\n        </div>\n        <div className=\"ms-2\">\n          <Button onClick={handleRemove} title=\"Remove item\" color=\"link\"><FaIcon icon=\"times\" /></Button>\n        </div>\n      </div>\n\n    </div>\n  );\n};\n\nPixelForm.propTypes = {\n  pixel: PropTypes.string,\n  handleRemove: PropTypes.func,\n  handleChange: PropTypes.func,\n  className: PropTypes.string,\n};\n\nexport default PixelForm;\n","import React from 'react';\nimport Select from 'react-select';\n\n// this file is adapted from https://github.com/jossmac/react-select-simple-value\n// based on discussion: https://github.com/JedWatson/react-select/issues/2669\n// it adapts react-select to accept simple value types (scalars or scalar arrays) instead of options objects\nfunction flatten(arr) {\n  return arr.reduce((acc, val) => (Array.isArray(val.options)\n    ? acc.concat(flatten(val.options))\n    : acc.concat(val)\n  ), []);\n}\n\nfunction getValue(opts, val, getOptVal, isMulti) {\n  if (val === undefined) return undefined;\n  if (isMulti && !Array.isArray(val)) {\n    val = [val];\n  }\n  const options = flatten(opts);\n  let simpleVal = isMulti\n    ? options.filter((o) => val.includes(getOptVal(o)))\n    : options.find((o) => getOptVal(o) === val);\n\n  // singleValue won't clear unless value is null\n  if (simpleVal === undefined) simpleVal = null;\n\n  return simpleVal;\n}\n\nconst defaultGetOptionValue = (opt) => opt.value;\n\nfunction wrapOnChange(onChange, value, isMulti, getOptVal) {\n  if (onChange === undefined) return;\n\n  const flatValue = isMulti\n    ? value.map(getOptVal)\n    : (value\n      ? getOptVal(value)\n      : null\n    );\n\n  onChange(flatValue);\n}\n\nfunction ReactSelectSimpleValue({\n  children,\n  defaultValue: simpleDefault,\n  getOptionValue = defaultGetOptionValue,\n  isMulti = false,\n  options,\n  value: simpleValue,\n  onChange: originalOnChange,\n}) {\n  const value = getValue(options, simpleValue, getOptionValue, isMulti);\n  const defaultValue = getValue(options, simpleDefault, getOptionValue, isMulti);\n  const onChange = (v) => wrapOnChange(originalOnChange, v, isMulti, getOptionValue);\n\n  return children({\n    defaultValue, getOptionValue, isMulti, options, value, onChange,\n  });\n}\n\nconst SimpleSelect = ({ className = '', ...restProps }) => (\n  <ReactSelectSimpleValue {...restProps}>\n    {(simpleProps) => <Select className={`simple-select ${className}`} {...restProps} {...simpleProps} />}\n  </ReactSelectSimpleValue>\n);\n\nexport default SimpleSelect;\n","\n// default props to use with react-select component\nexport const DefaultReactSelectProps = {\n  isSearchable: true,\n  isMulti: false,\n  controlShouldRenderValue: true,\n  hideSelectedOptions: false,\n  closeMenuOnSelect: true,\n  getOptionValue:(opt) => opt.value.toString()\n};\n","import React from 'react';\nimport classNames from 'classnames';\n\nconst Mastodon = ({ className, ...props }) => {\n  return (\n    <svg className={classNames(className)} width=\"25.888\" height=\"25.379\" viewBox=\"0 0 25.888 25.379\" {...props}>\n      <defs>\n        <clipPath id=\"clip-path\">\n          <path id=\"Path_876\" data-name=\"Path 876\" d=\"M8.17,35.39a4.093,4.093,0,0,0-1.785.371A4.343,4.343,0,0,0,3.69,39.889c-.024,4.461-.007,8.922-.008,13.383A4.261,4.261,0,0,0,4.4,55.694a4.381,4.381,0,0,0,3.617,2.048c.392.017.785.013,1.178.009.175,0,.349,0,.524,0a.975.975,0,0,0,.1-.011v-.184q0-5.52,0-11.039a1.818,1.818,0,1,1,3.635.05q0,5.5,0,10.99v.185h6.27v-.145q0-6.815,0-13.629a2.855,2.855,0,0,1,.038-.515,1.813,1.813,0,0,1,3.584.177c.024.307.015.616.016.924q0,5.119,0,10.238c0,.167,0,.167.167.167.5,0,1,.009,1.493,0a5.048,5.048,0,0,0,.857-.081A4.476,4.476,0,0,0,29.5,50.48q.012-5.323,0-10.645a4.341,4.341,0,0,0-.127-1.024,4.459,4.459,0,0,0-4.363-3.419q-3.5,0-7,0H8.17\" transform=\"translate(-3.677 -35.389)\" fill=\"none\"/>\n        </clipPath>\n        <clipPath id=\"clip-path-2\">\n          <rect id=\"Rectangle_1914\" data-name=\"Rectangle 1914\" width=\"29.167\" height=\"36.859\" fill=\"none\" />\n        </clipPath>\n        <clipPath id=\"clip-path-3\">\n          <path id=\"Path_837\" data-name=\"Path 837\" d=\"M29,41v7.524a1.845,1.845,0,0,1,.526.128,1.824,1.824,0,0,1,1.135,1.724q0,5.5,0,10.99v.185h6.27v-.145q0-6.815,0-13.629a2.855,2.855,0,0,1,.038-.515,1.813,1.813,0,0,1,3.584.177c.024.307.015.616.016.924q0,5.119,0,10.238c0,.167,0,.167.167.167.5,0,1,.009,1.493,0a5.048,5.048,0,0,0,.857-.081,4.476,4.476,0,0,0,3.617-4.391q.012-5.323,0-10.645a4.341,4.341,0,0,0-.127-1.024A4.571,4.571,0,0,0,45.813,41Z\" transform=\"translate(-29 -41)\" fill=\"none\"/>\n        </clipPath>\n        <clipPath id=\"clip-path-4\">\n          <rect id=\"Rectangle_1550\" data-name=\"Rectangle 1550\" width=\"26.282\" height=\"26.923\" fill=\"none\" />\n        </clipPath>\n      </defs>\n      <g id=\"Group_926\" data-name=\"Group 926\" transform=\"translate(-1772.975 -316.772)\">\n        <path id=\"Path_875\" data-name=\"Path 875\" d=\"M9.648,57.775c-.044,0-.071.011-.1.011-.567,0-1.136.019-1.7-.006A4.381,4.381,0,0,1,4.23,55.732a4.264,4.264,0,0,1-.718-2.423c0-4.461-.016-8.922.008-13.383A4.343,4.343,0,0,1,6.215,35.8,4.1,4.1,0,0,1,8,35.428q8.418,0,16.836,0A4.458,4.458,0,0,1,29.2,38.848a4.324,4.324,0,0,1,.127,1.024q.013,5.323,0,10.645a4.476,4.476,0,0,1-3.617,4.391,5.079,5.079,0,0,1-.857.081c-.5.013-.995,0-1.492,0-.167,0-.167,0-.167-.167q0-5.119,0-10.237c0-.308.008-.618-.016-.924a1.813,1.813,0,0,0-3.584-.177,2.852,2.852,0,0,0-.039.515q0,6.815,0,13.63v.145h-6.27v-.185q0-5.5,0-10.99a1.818,1.818,0,1,0-3.635-.05q-.006,5.52,0,11.039v.184\" transform=\"translate(1769.468 281.412)\" fill=\"#147cff\"/>\n        <g id=\"Group_699\" data-name=\"Group 699\" transform=\"translate(1773.03 316.827)\" clipPath=\"url(#clip-path)\">\n          <g id=\"Group_698\" data-name=\"Group 698\" transform=\"translate(-1.179 -11.343)\">\n            <g id=\"Group_697\" data-name=\"Group 697\" clipPath=\"url(#clip-path-2)\">\n              <image id=\"Rectangle_1913\" data-name=\"Rectangle 1913\" width=\"29.167\" height=\"36.859\" xlinkHref=\"data:image/png;base64,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\"/>\n            </g>\n          </g>\n        </g>\n        <g id=\"Group_700\" data-name=\"Group 700\" transform=\"translate(1781.146 318.625)\">\n          <g id=\"Group_611\" data-name=\"Group 611\" transform=\"translate(0 0)\" clipPath=\"url(#clip-path-3)\">\n            <g id=\"Group_610\" data-name=\"Group 610\">\n              <g id=\"Group_609\" data-name=\"Group 609\" clipPath=\"url(#clip-path-4)\">\n                <image id=\"Rectangle_1549\" data-name=\"Rectangle 1549\" width=\"26.282\" height=\"26.923\" xlinkHref=\"data:image/png;base64,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\"/>\n              </g>\n            </g>\n          </g>\n        </g>\n        <path id=\"Path_877\" data-name=\"Path 877\" d=\"M54.276,40.055a4.684,4.684,0,0,0-4.693-4.837c-3.827.063-5.511.079-9.272.076-.128,0-.17.03-.17.165,0,3.771,0,7.462,0,11.233a1.691,1.691,0,0,0,.032.355,1.233,1.233,0,0,0,1.281.964c.9,0,1.791.013,2.686,0a4.527,4.527,0,0,1,2.02.432c1.463.674,2.94,1.317,4.409,1.977a1.751,1.751,0,0,1,.4.249.187.187,0,0,1-.039.338,1.643,1.643,0,0,1-.436.142c-.758.139-1.517.269-2.277.4-.1.018-.151.049-.151.168,0,3.791.013,7.671.013,8.713,0,.167,0,.167.169.167.5,0,1.006.009,1.509,0a5.185,5.185,0,0,0,.866-.081,4.489,4.489,0,0,0,3.656-4.391c0-1.244-.012-12.935-.012-16.064m-7.412,5.462A1.238,1.238,0,1,1,48.1,44.272a1.232,1.232,0,0,1-1.239,1.245\" transform=\"translate(1744.575 281.554)\" fill=\"#36a5ff\"/>\n      </g>\n    </svg>\n  );\n};\n\nexport default Mastodon;\n","import {ModalBody, ModalFooter} from \"reactstrap\";\nimport React from \"react\";\n\n//Utilities that can optionally wrap content in Modal sections\nexport const FooterWrapper = ({isModal, children, className=\"\"}) => (\n  isModal\n    ? <ModalFooter className={className}>{children}</ModalFooter>\n    : <div className={className}>{children}</div>\n)\nexport const BodyWrapper = ({isModal, children, className=\"\"}) => (\n  isModal\n    ? <ModalBody className={className}>{children}</ModalBody>\n    : <div className={className}>{children}</div>\n)\n","import React from 'react';\nimport { Outlet } from 'react-router-dom';\nimport NotAuthorized from '../Layout/NotAuthorized';\nimport usePermission from '../Hooks/usePermission';\n\n/*\n * Wrapper for Route\n * Checks a permission, shows Component or NotAuthorized\n * (\"Outlet\" is react-router-6 term for an element associated with a route)\n */\nconst ProtectedRoute = ({permission}) => {\n  const allowRoute = usePermission(permission);\n  return allowRoute ? <Outlet /> : <NotAuthorized />\n}\n\nexport default ProtectedRoute;\n","import React, { useContext, useMemo } from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport { Spinner } from 'reactstrap';\nimport classnames from 'classnames';\nimport { TreeContext } from './TreeProvider';\n\nconst numberFormat = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });\n\n/*\n * Formats bid for display according to type and amount, used in rules trees and summar\n *\n */\nconst BidDisplay = ({\n  ruleId,\n  ruleType,\n  type,\n  absolute_bid,\n  bid_modifier,\n  exclusivity,\n  iconSize,\n  passText,\n  blockedText,\n  clickHandler,\n}) => {\n  const treeContext = useContext(TreeContext);\n  const isUpdating = (treeContext && ruleId === treeContext.currentBidUpdating);\n\n  const [formattedBid, zeroBid, modifierUp] = useMemo(() => {\n    let zeroBid = false;\n    let modifierUp = false;\n    let bid = '';\n    if (type === 'absolute') {\n      if (absolute_bid > 0) {\n        bid = numberFormat.format(parseFloat(absolute_bid));\n      } else {\n        bid = 0;\n        zeroBid = true;\n      }\n    } else if (type === 'modifier') {\n      if (bid_modifier && !isNaN(bid_modifier) && parseInt(bid_modifier) !== 0) {\n        bid = `${bid_modifier}%`;\n        modifierUp = bid_modifier > 100;\n      } else {\n        bid = bid_modifier;\n        zeroBid = true;\n      }\n    } else if (type === 'block') {\n      bid = (\n        <span>\n          <FaIcon icon=\"ban\" size={iconSize} />\n          {' '}\n          {blockedText}\n        </span>\n      );\n    } else if (type === 'pass') {\n      bid = passText ? (<span>{passText}</span>) : (<span>&nbsp;</span>);\n    }\n\n    return [bid, zeroBid, modifierUp];\n  }, [type, absolute_bid, bid_modifier]);\n\n  return (\n    <div className=\"bid-display d-flex align-items-center\">\n      {exclusivity === 'strict' && <FaIcon icon=\"star\" size=\"sm\" className=\"exclusive-star\" title=\"Exclusive only\" />}\n      {exclusivity === 'optional' && <FaIcon icon=\"star\" size=\"sm\" className=\"exclusive-star optional\" title=\"Exclusive optional\" />}\n\n      {type === 'modifier' && ruleType !== 'routing' && (<ModifierArrow bid={formattedBid} />)}\n\n      <div className={classnames([`rule-bid bid-${type}`, { 'zero-bid': zeroBid, 'over-100': modifierUp }])} onClick={clickHandler}>\n        {isUpdating ? <Spinner size=\"sm\" color=\"light\" /> : formattedBid}\n\n      </div>\n\n    </div>\n  );\n};\n\nconst ModifierArrow = React.memo(({ bid }) => {\n  bid = parseInt(bid);\n  //  {'bid-modifier-arrow ' + (bid < 100 ? 'sub-100':'')}\n  return (\n    <div className={classnames(['bid-modifier-arrow', { 'sub-100': bid < 100 }])}>\n      {bid === 100 && <FaIcon icon=\"arrows-alt-h\" size=\"sm\" />}\n      {bid > 100 && <FaIcon icon=\"arrow-up\" size=\"sm\" />}\n      {bid < 100 && <FaIcon icon=\"arrow-down\" size=\"sm\" />}\n    </div>\n  );\n});\n\nBidDisplay.propTypes = {\n  type: PropTypes.string.isRequired,\n  ruleId: PropTypes.number,\n  ruleType: PropTypes.string,\n  absolute_bid: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  bid_modifier: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  exclusivity: PropTypes.string,\n  passText: PropTypes.string,\n  blockedText: PropTypes.string,\n  iconSize: PropTypes.string,\n  clickHandler: PropTypes.func,\n};\n\nBidDisplay.defaultProps = {\n  type: 'pass',\n  absolute_bid: '',\n  bid_modifier: '',\n  passText: '',\n  blockedText: '',\n  iconSize: '1x',\n};\n\nexport default BidDisplay;\n","import React, { useEffect, useState } from 'react';\nimport {\n  Row, Col, FormGroup, FormText, Label, Input,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport MaskedInput from 'react-text-mask';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport { useDebouncedCallback } from 'use-debounce';\nimport InputWithIcon from '../Form/InputWithIcon';\nimport ValueDeltaDisplay from '../ValueDeltaDisplay';\nimport { MoneyFormatter, PercentFormatter } from '../Table/Table';\n\n// Mask dd.dd\nconst currencyMask = createNumberMask({\n  prefix: '',\n  allowDecimal: true,\n  decimalLimit: 2,\n  integerLimit: 3,\n  // fixedDecimalScale:true\n});\n\n// Mask ddd\nconst modifierMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  integerLimit: 3,\n});\n\n/*\n * Form elements for setting bid type and values (modifier or absolute bid).\n * Also for setting exclusivity option, which depends on the bid type\n * (exclusivity is only for advertiser rules)\n *\n * Note: When this component is used in routing rules, we use 'Margin' has a label\n * for bid_modifier, since that is technically what it is. But for consistency the API\n * uses the same properties for advertiser and routing rules.\n */\nconst BidWidget = ({\n  type,\n  absolute_bid,\n  bid_modifier,\n  ruleType,\n  isActiveTab,\n  showExclusivity,\n  exclusivity,\n  onChange,\n  errors = {},\n  allowEdit = true,\n}) => {\n  const [originalBidType] = useState(type);\n  const [originalAbsoluteBid] = useState(absolute_bid);\n  const [originalBidModifier] = useState(bid_modifier);\n\n  // Focus on input when tab becomes active\n  useEffect(() => {\n    if (isActiveTab && allowEdit) {\n      if (type === 'absolute') {\n        document.getElementById('inp-absolute-bid')?.select();\n      } else if (type === 'modifier') {\n        document.getElementById('inp-modifier-bid')?.select();\n      }\n    }\n  }, [isActiveTab]);\n\n  const updateBidding = (newValue) => {\n    const bidding = {\n      type,\n      absolute_bid,\n      bid_modifier,\n    };\n    onChange('bidding', { ...bidding, ...newValue });\n  };\n\n  const handleChangeAbsBidDebounced = useDebouncedCallback((value) => {\n    updateBidding({ absolute_bid: value });\n  }, 400);\n\n  const handleChangeModifierDebounced = useDebouncedCallback((value) => {\n    value.replace(/[^0-9]/g, ''); // unmask\n    value = (!value && value !== '0') ? null : Math.min(value, 500);\n    updateBidding({ bid_modifier: value });\n  }, 400);\n\n  const handleChangeType = (e) => updateBidding({ type: e.target.value });\n\n  const absBidError = errors['bidding.absolute_bid'];\n  const modifierError = errors['bidding.bid_modifier'];\n\n  const bidTypeLabels = {\n    pass: 'None specified',\n    block: 'Blocked',\n    absolute: 'Dollar Amount',\n    modifier: ruleType === 'routing' ? 'Margin' : 'Modifier',\n  };\n\n  const exclusivityLabels = {\n    '': 'None',\n    strict: 'Strict',\n    optional: 'Optional',\n  };\n\n  if (!allowEdit) {\n    return (\n      <div className=\"bid-widget\">\n        <div className=\"mb-2\">\n          <Label>Type</Label>\n          <div>{bidTypeLabels[type] || type}</div>\n        </div>\n        {type === 'absolute' && (\n          <div className=\"mb-2\">\n            <Label>Amount</Label>\n            <div><MoneyFormatter value={absolute_bid} /></div>\n          </div>\n        )}\n        {type === 'modifier' && (\n          <div className=\"mb-2\">\n            <Label>{ruleType === 'routing' ? 'Margin' : 'Modifier'}</Label>\n            <div><PercentFormatter value={bid_modifier} /></div>\n          </div>\n        )}\n        {showExclusivity && (\n          <div className=\"mb-2\">\n            <Label>Exclusivity</Label>\n            <div>{exclusivityLabels[exclusivity || ''] || exclusivity || 'None'}</div>\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"bid-widget\">\n\n      <div className=\"d-flex flex-nowrap align-items-center\">\n        <div className=\"me-3\" style={{ flexBasis: '225px' }}>\n          <FormGroup>\n            <Label for=\"bid_type\">Type</Label>\n            <Input type=\"select\" value={type} onChange={handleChangeType}>\n              <option value=\"pass\">None specified</option>\n              {/* Routing has no block (has the include/exclude flow_control field) */}\n              {ruleType !== 'routing' && <option value=\"block\">Blocked</option>}\n              <option value=\"absolute\">Dollar amount</option>\n              <option value=\"modifier\">{ruleType === 'routing' ? 'Margin' : 'Modifier'}</option>\n            </Input>\n          </FormGroup>\n        </div>\n        { (type === 'absolute' || type === 'modifier') && (\n          < >\n\n              {type === 'absolute' && (\n                <FormGroup className=\"d-inline-block me-3\">\n                  <Label>Amount</Label>\n                  <MaskedInput\n                    id=\"inp-absolute-bid\"\n                    mask={currencyMask}\n                    defaultValue={absolute_bid}\n                    disabled={type !== 'absolute'}\n                    onChange={(e) => handleChangeAbsBidDebounced(e.target.value)}\n                    invalid={!!absBidError}\n                    error={absBidError}\n                    render={(ref, props) => <InputWithIcon className=\"tiny\" innerRef={ref} icon=\"dollar-sign\" {...props} />}\n                  />\n                </FormGroup>\n              )}\n              {type === 'modifier' && (\n                <FormGroup className=\"d-inline-block  me-3\">\n                  <Label>{ruleType === 'routing' ? 'Margin' : 'Modifier'}</Label>\n                  <MaskedInput\n                    id=\"inp-modifier-bid\"\n                    mask={modifierMask}\n                    defaultValue={bid_modifier}\n                    disabled={type !== 'modifier'}\n                    onChange={(e) => handleChangeModifierDebounced(e.target.value)}\n                    invalid={!!modifierError}\n                    error={modifierError}\n                    render={(ref, props) => <InputWithIcon className=\"tiny\" icon=\"percent\" iconSide=\"right\" innerRef={ref} {...props} />}\n                  />\n                </FormGroup>\n              )}\n            <div>\n              {type === 'pass' && <BidAlert defaultMsg=\"Bidding is determined by parent or child rules\" />}\n              {type === 'block' && <BidAlert defaultMsg=\"Do not bid. This overrides bidding defaults.\" />}\n              {type === 'absolute' && <BidAlert type={type} bid={absolute_bid} previousBid={originalAbsoluteBid} previousType={originalBidType} />}\n              {type === 'modifier' && <BidAlert type={type} bid={bid_modifier} previousBid={originalBidModifier} previousType={originalBidType} />}\n            </div>\n\n          </>\n        )}\n\n      </div>\n\n      {showExclusivity && (\n        <Row>\n          <Col sm={10} md={7}>\n            <FormGroup className=\"d-inline-block\">\n              <Label>Exclusivity</Label>\n              <Input\n                name=\"exclusivity\"\n                type=\"select\"\n                value={exclusivity || ''}\n                onChange={onChange}\n              >\n                <option value=\"\">None</option>\n                <option value=\"strict\">Strict - bid only in exclusive auctions</option>\n                <option value=\"optional\" disabled={type !== 'modifier'}>\n                  Optional -\n                  {type === 'modifier' ? 'all auctions, or exclusive when permitted' : 'requires modifier bid type'}\n                </option>\n              </Input>\n              <FormText>Controls bidding in exclusive auctions. Purchased leads cannot be sold again.</FormText>\n\n            </FormGroup>\n          </Col>\n        </Row>\n      )}\n\n    </div>\n  );\n};\n\nconst BidAlert = ({\n  type, bid, previousBid, previousType, defaultMsg = '',\n}) => {\n  let alert = '';\n  if (type === 'modifier') {\n    bid = parseInt(bid);\n\n    if (bid === 0) {\n      alert = 'Setting the modifier to zero will disable bidding. Instead, choose Block as a bid type.';\n    } else if (bid === 100 && previousType === type) {\n      alert = 'A modifier of 100% will not modify the bid.';\n    } else if (bid && previousBid !== bid && previousType === type) {\n      alert = (\n        <span>\n          Bid change:\n          {' '}\n          <ValueDeltaDisplay oldValue={previousBid} newValue={bid} threshold={1000} />\n          {' '}\n          from <PercentFormatter value={previousBid} />\n        </span>\n      );\n    }\n  } else if (type === 'absolute') {\n    bid = parseFloat(bid);\n\n    if (bid === 0) {\n      alert = 'Setting the bid to zero will disable bidding. You can also choose Block as a bid type.';\n    } else if (bid && parseFloat(previousBid) !== bid && previousType === type) {\n      alert = (\n        <span>\n          Bid change:\n          {' '}\n          <ValueDeltaDisplay oldValue={previousBid} newValue={bid} threshold={1000} />\n          {' '}\n          from <MoneyFormatter value={previousBid} />\n        </span>\n      );\n    }\n  }\n  //\n  return (<FormText className=\"bid-alert\">{alert || defaultMsg}</FormText>);\n};\n\nBidWidget.propTypes = {\n\n  onChange: PropTypes.func.isRequired,\n  type: PropTypes.string.isRequired,\n  absolute_bid: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  bid_modifier: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  ruleType: PropTypes.string,\n  isActiveTab: PropTypes.bool,\n  errors: PropTypes.object,\n  showExclusivity: PropTypes.bool,\n  exclusivity: PropTypes.string,\n\n};\n\nexport default BidWidget;\n","import React, {\n  useState, useEffect, useRef, useContext,\n} from 'react';\nimport { Button, Input, FormGroup } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport RulesContext from '../../Providers/RulesContext';\n\nconst CopyWidget = ({ rule, cancel, close }) => {\n  const [label, setLabel] = useState(`${rule.label} (Copy)`);\n  const rulesContext = useContext(RulesContext);\n  const inputEl = useRef(null);\n\n  const handleCopyClick = () => {\n    rulesContext.api.copyRule(rule, label);\n    close();\n  };\n\n  useEffect(() => {\n    if (inputEl.current) {\n      inputEl.current.focus();\n    }\n  }, []);\n\n  return (\n\n    <FormGroup className=\"copy-rule-widget\">\n\n      <Input innerRef={inputEl} value={label} placeholder=\"Rule name\" onChange={(e) => setLabel(e.target.value)} />\n\n      <div className=\"d-flex mt-2 justify-content-end\">\n        <Button size=\"sm\" color=\"link\" onClick={cancel}>\n          Cancel\n        </Button>\n        <Button color=\"primary\" size=\"sm\" className=\"me-2\" onClick={handleCopyClick}>\n          Create Copy\n        </Button>\n\n      </div>\n\n    </FormGroup>\n\n  );\n};\n\nCopyWidget.propTypes = {\n  rule: PropTypes.object.isRequired,\n  cancel: PropTypes.func.isRequired,\n  close: PropTypes.func.isRequired,\n};\n\nCopyWidget.defaultProps = {\n  isRootRule: false,\n};\n\nexport default CopyWidget;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Col, Row } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport IntegrationSettings from './IntegrationSettings';\nimport useCollectionTracker from '../../Hooks/useCollectionTracker';\nimport usePermission from '../../Hooks/usePermission';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\n\n// AKA post sale integrations\nconst DeliveryDestinations = ({\n  destinations=[],\n  definitions,\n  description,\n  label = 'Delivery Destinations',\n  onChange,\n  errors,\n  showCombineSales,\n}) => {\n  // We are not restricting view, only edit\n  const allowEdit = usePermission('integrations.edit');\n\n  const {\n    api: collection,\n    willDeleteIndex,\n    editIndex,\n    addMode,\n  } = useCollectionTracker();\n\n  const handleAdd = () => {\n    const item = { integration: { name: '', settings: {} } };\n    onChange([...destinations, item]);\n    collection.add(destinations.length);\n  };\n\n  const handleUpdate = (intg, index) => {\n    const temp = [...destinations];\n    if (destinations[index]) {\n      temp[index].integration = intg;\n      onChange(temp);\n    }\n    // collection.apply();\n  };\n\n  const handleCombineSalesChange = (val, index) => {\n    const temp = [...destinations];\n    if (destinations[index]) {\n      temp[index].combine_sales = val;\n      onChange(temp);\n    }\n  };\n\n  const handleDelete = (index) => {\n    const temp = [...destinations];\n    temp.splice(index, 1);\n    /// setActiveIndex(temp.length ? temp.length -1 : null);\n    collection.onDelete();\n    onChange([...temp]);\n  };\n\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">{label}</div>\n      {description && <p>{description}</p>}\n      {definitions.length > 0 ? (\n        <>\n          {destinations.length === 0 && !allowEdit && (\n            <StandardAlert color=\"light\" icon=\"info\">No {label.toLowerCase()} are configured.</StandardAlert>\n          )}\n\n          <Row className=\"mt-3\">\n            <Col lg={12} xl={9}>\n\n              <div className=\"deliver-destinations-list\">\n                {destinations.map((dest, i) => (\n                  <IntegrationSettings\n                    key={i}\n                    index={i}\n                    config={dest.integration}\n                    definitions={definitions}\n                    type=\"delivery\"\n                    editMode={editIndex === i}\n                    isNew={addMode}\n                    errors={errors[i]}\n                    onUpdate={handleUpdate}\n                    onDelete={handleDelete}\n                    onApply={collection.apply}\n                    setEdit={collection.edit}\n                    allowEdit={allowEdit}\n                    willDelete={willDeleteIndex === i}\n                    setWillDelete={(i) => collection.setWillDeleteIndex(i)}\n                    allowControls={allowEdit}\n                    showCombineSales={showCombineSales}\n                    combineSales={Boolean(dest.combine_sales)}\n                    onCombineSalesChange={handleCombineSalesChange}\n                  />\n                ))}\n              </div>\n            </Col>\n          </Row>\n          {addMode === false && allowEdit\n          && (\n          <Button color=\"link\" onClick={handleAdd} disabled={editIndex !== null}>\n            <FaIcon icon=\"plus\" />\n            {' '}\n            Add Integration\n          </Button>\n          )}\n        </>\n      ) : (\n        <StandardAlert color=\"light\">\n          No\n          {' '}\n          {label.toLowerCase()}\n          {' '}\n          have been defined for the current product or\n          vertical.\n        </StandardAlert>\n      )}\n    </div>\n\n  );\n};\n\nDeliveryDestinations.propTypes = {\n  destinations: PropTypes.array,\n  definitions: PropTypes.array,\n  description: PropTypes.string,\n  errors: PropTypes.object,\n  label: PropTypes.string,\n  onChange: PropTypes.func,\n  showCombineSales: PropTypes.bool,\n};\n\nexport default DeliveryDestinations;\n","import React, { useState, useContext } from 'react';\nimport {\n  Button, FormGroup, ButtonGroup, UncontrolledDropdown, DropdownItem, FormText,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport RulesContext from '../../Providers/RulesContext';\n\nconst SelectionTree = ({ rule, onSelectTarget }) => (\n  <UncontrolledDropdown>\n    <DropdownItem onClick={() => onSelectTarget(rule)}>{rule.label}</DropdownItem>\n    {rule.rules.length > 0 && (\n\n    <div className=\"rule-branch\">\n      <div className=\"rule-branch-line\">\n        { rule.rules.map((childRule, i) => <SelectionTree key={childRule.id} rule={childRule} onSelectTarget={onSelectTarget} />)}\n      </div>\n    </div>\n    )}\n  </UncontrolledDropdown>\n);\n\n/*\n * I like to move it, move it\n */\nconst MoveWidget = ({ rule, close }) => {\n  const [placement, setPlacement] = useState('below');\n  const rulesContext = useContext(RulesContext);\n\n  const selectTargetHandler = (targetRule) => {\n    // For root rule as target, placement must be 'child'\n    // const plc = rulesContext.api.orderRule().id === targetRule.id ? 'child' : placement;\n    const isRoot = targetRule.id === rulesContext.tree.id;\n    if (isRoot && placement === 'above') {\n      return;\n    }\n    const plc = isRoot ? 'child' : placement;\n    if (rule.id !== targetRule.id) {\n      rulesContext.api.moveRule(rule, targetRule, plc);\n    }\n    close();\n  };\n\n  return (\n    <div className=\"\">\n\n      <div id=\"move-rule-widget\">\n        <FormGroup id=\"move-rule-placement\">\n          <FormText>Select position and destination</FormText>\n          <ButtonGroup vertical className=\"d-flex\">\n            <Button\n              value=\"below\"\n              active={placement === 'below'}\n              onClick={() => setPlacement('below')}\n              block\n              outline\n            >\n              Move below:\n            </Button>\n            <Button\n              value=\"above\"\n              active={placement === 'above'}\n              onClick={() => setPlacement('above')}\n              block\n              outline\n            >\n              Move above:\n            </Button>\n            <Button\n              value=\"child\"\n              active={placement === 'child'}\n              block\n              outline\n              onClick={() => setPlacement('child')}\n            >\n              Move as child of:\n            </Button>\n          </ButtonGroup>\n        </FormGroup>\n        <div id=\"rule-choice-container\">\n          <SelectionTree rule={rulesContext.tree} onSelectTarget={selectTargetHandler} />\n        </div>\n      </div>\n    </div>\n  );\n};\n\nMoveWidget.propTypes = {\n  rule: PropTypes.object.isRequired,\n  close: PropTypes.func.isRequired,\n};\n\nexport default MoveWidget;\n","import React, { useMemo, useContext } from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport {UncontrolledTooltip} from \"reactstrap\";\nimport RulesContext from '../../Providers/RulesContext';\nimport { IconData } from './constants';\n// import usePermission from \"../../Hooks/usePermission\";\n\n/*\n * Renders a row of icons that describe various rule states. Used in rules tree.\n */\nconst RuleIcons = ({ rule, ruleType=\"targeting\", iconSet = [] }) => {\n\n  const rulesContext = useContext(RulesContext);\n\n  if (!rule) return null;\n\n  const handleIconClick = (e, tab) => {\n    e.stopPropagation();\n    rulesContext.api.setActiveTab(tab, rule);\n  };\n\n  const ruleIcons = useMemo(() => {\n    const showIcons = []\n\n    //In add mode, a temporary rule is inserted and may not have summary\n    if (rule.summary) {\n      iconSet.forEach((iconName) => {\n        if (rule.summary.includes(iconName)) {\n          showIcons.push(iconName);\n        }\n\n      })\n    }\n    return showIcons;\n  }, [rule.summary])\n\n  const matchIsRequired = rule.summary && rule.summary.includes('match_is_required')\n\n  return (\n    <div className=\"rule-tree-icons\">\n      {ruleIcons.map((iconName, i) => (\n          <RuleIcon\n            key={i}\n            rule={rule}\n            ruleType={ruleType}\n            name={iconName}\n            show={true}\n            iconData={IconData[iconName]}\n            matchIsRequired={matchIsRequired}\n            onClick={handleIconClick}\n          />\n      ))}\n\n    </div>\n  );\n};\n\n/*\n * Icon - shows the icon or null based on rule property\n * (When rule has match conditions and match_is_required, show a special composite icon)\n *\n */\nconst RuleIcon = ({\n  rule, ruleType, name, show, iconData, matchIsRequired, onClick,\n}) => (iconData && show ? (\n  <>\n\n    {name === \"match_conditions\" && matchIsRequired ? (\n      <>\n        <span\n          className=\"fa-layers fa-fw\"\n          onClick={(e) => onClick(e, iconData.tab)}\n          id={`tree-icon-${name}-${rule.id}`}\n        >\n          <FaIcon icon={iconData.icon} size=\"sm\" className={name} />\n          <FaIcon icon={\"circle\"}  size=\"sm\" transform=\"right-8 up-5\" color=\"white\" />\n          <FaIcon icon={\"exclamation-circle\"}  size=\"sm\" transform=\"right-8 up-5\" color=\"red\" />\n        </span>\n        <UncontrolledTooltip target={`tree-icon-${name}-${rule.id}`}>\n          Match Conditions (match is required for bid)\n        </UncontrolledTooltip>\n      </>\n\n    ) : (\n      <>\n        <FaIcon\n          id={`tree-icon-${name}-${rule.id}`}\n          icon={iconData.icon}\n          size=\"sm\"\n          className={name}\n          onClick={(e) => onClick(e, (\n            ruleType === 'routing' && iconData.routing_tab ? iconData.routing_tab : iconData.tab\n          ))}\n        />\n        <UncontrolledTooltip target={`tree-icon-${name}-${rule.id}`}>\n          {iconData.title}\n        </UncontrolledTooltip>\n      </>\n\n    )}\n\n  </>\n\n) : null\n);\n\nRuleIcons.propTypes = {\n  rule: PropTypes.object,\n  product: PropTypes.string,\n  iconSet: PropTypes.array,\n};\n\nexport default RuleIcons;\n","import React, {useContext, useState, useMemo} from \"react\";\nimport {Badge, Button} from \"reactstrap\";\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport NumberFormat from 'react-number-format';\nimport BidDisplay from './BidDisplay';\nimport {titleCase} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport { TargetGroupsDescription } from './TargetDescription';\nimport {Stack, RowDivider, WeekSummarySVG, StandardAlert, Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport { CapTimeframeChoices, DateFormatter, MoneyFormatter, PercentFormatter } from '../Table/Table';\nimport {BiddingScheduleConfig} from \"../../App/AdvertiserManager/RulesManager/const\";\nimport {SellStrategyLabels, SellStrategyDescriptions} from \"./constants\";\nimport usePermission from \"../../Hooks/usePermission\";\nimport RulesContext from \"../../Providers/RulesContext\";\nimport AdDisplay from \"../../App/AdManager/AdDisplay\";\nimport {DataRows} from \"../DataRows\";\nimport {DataRow} from \"../DataRow\";\n\n\n/* Display a nice label for a given integration alias (indicate non-active status) */\nconst IntegrationDisplay = ({alias, type}) => {\n  const rulesContext = useContext(RulesContext);\n\n  const integration = useMemo(()=>{\n    const definitions = rulesContext.api.getIntegrationDefinitionsByType(type);\n    const intConf = definitions.find((conf) => conf.name === alias);\n    return intConf ?? {label:alias, status: \"\"}\n  }, [alias, type]);\n\n  return (<span>{integration.label}\n    {integration.status && integration.status !== 'active' && <Badge color=\"warning\" className=\"ms-1\">{titleCase(integration.status)}</Badge>}\n  </span>)\n}\n\nexport const ActivityScheduleSummary = React.memo(({ schedule, timezone, gotoTab }) => {\n  if (!schedule || schedule.length === 0) return (null);\n\n  return (\n    <SummaryItemWrapper label=\"On/Off Schedule\" tabId=\"activity\" icon=\"calendar-times\" gotoTab={gotoTab} className=\"activity-schedule-summary\">\n      <span>Paused ranges:</span>\n      <ul>\n        {schedule.map((range, i) => (\n\n          <li key={i}>\n            <b><DateFormatter value={range.from} timezone={timezone} format=\"M/d/y h:mm a\" /></b>\n            <span className=\"ms-2 me-2\">to</span>\n            <b><DateFormatter value={range.to} timezone={timezone} format=\"M/d/y h:mm a\" /></b>\n          </li>\n\n        ))}\n      </ul>\n    </SummaryItemWrapper>\n  );\n});\n\n/* Caps for Publisher Routing - sale caps, match caps */\nexport const RoutingCapsSummary = ({ caps, timezone, title, gotoTab }) => {\n  if (!caps || !Object.entries(caps).length) return null;\n\n  return (\n    <SummaryItemWrapper className=\"routing-caps-summary\" label={title} icon=\"hand-paper\" tabId=\"caps\" gotoTab={gotoTab}>\n      {timezone && <DataRows className=\"mb-2\"><DataRow label=\"Timezone\">{timezone}</DataRow></DataRows>}\n      <DataRows gap=\"0.5em\" divider={<RowDivider />} >\n      {Object.entries(caps).map(([timeframe, cap], i) => (\n        <DataRow key={i} label={CapTimeframeChoices[timeframe]}>\n          <NumberFormat value={cap} displayType=\"text\" thousandSeparator decimalScale={0} fixedDecimalScale />\n        </DataRow>\n      ))}\n\n      </DataRows>\n    </SummaryItemWrapper>\n  );\n};\n\n/* Ping Dedupe for Publisher Routing  */\nexport const PingDedupeCapsSummary = ({ caps, title, gotoTab }) => {\n  if (!caps || !caps.length) return null;\n\n  return (\n    <SummaryItemWrapper className=\"routing-caps-summary\" label={title} icon=\"copy\" tabId=\"caps\" gotoTab={gotoTab}>\n      <DataRows gap=\"0.5em\" divider={<RowDivider />}   labelWidth={\"250px\"}>\n      {caps.map((cap, i) => (\n        <DataRow key={i} label={cap.key_expression ?? 'none'}>\n\n          {cap.duration >= 0 && <span className=\"me-3\" >\n            <NumberFormat\n            value={cap.duration}\n            displayType=\"text\"\n            thousandSeparator\n            decimalScale={0}\n            /> {Utils.singularOrPlural(cap.duration, 'second', 'seconds')}\n          </span>}\n          {cap.cache_response && <span><i> (response cached)</i></span>}\n        </DataRow>\n      ))}\n      </DataRows>\n\n    </SummaryItemWrapper>\n  );\n};\n\n\nexport const BiddingSummary = ({\n  ruleType,\n  label = 'Bidding',\n  type,\n absolute_bid,\n  bid_modifier,\n  floor, // routing rules\n  ceiling,\n  showBidCeiling = false,\n  proxyBidding,\n  bidRandomizationMin,\n  bidRandomizationMax,\n  gotoTab,\n}) => (\n  <SummaryItemWrapper className=\"bid-summary\" label={label} tabId=\"bidding\" icon=\"comment-dollar\" gotoTab={gotoTab}>\n    <BidDisplay\n      ruleType={ruleType}\n      type={type}\n      absolute_bid={absolute_bid}\n      bid_modifier={bid_modifier}\n      blockedText=\"Blocked\"\n      passText=\"Pass\"\n    />\n\n    {ceiling && showBidCeiling && (\n      <div className=\"data-row\">\n        <label>Bid Ceiling:</label>\n        <div><MoneyFormatter value={ceiling} /></div>\n      </div>\n    )}\n\n    {floor > 0 && (\n      <div className=\"data-row\">\n        <label>Bid Floor:</label>\n        <div><MoneyFormatter value={floor} /></div>\n      </div>\n    )}\n\n    {(bidRandomizationMin || bidRandomizationMin === 0) && (\n      <div className=\"data-row\">\n        <label>Bid Randomization Minimum:</label>\n        <div><PercentFormatter value={bidRandomizationMin} /></div>\n      </div>\n    )}\n    {(bidRandomizationMax || bidRandomizationMax === 0 ) && (\n      <div className=\"data-row\">\n        <label>Bid Randomization Maximum:</label>\n        <div><PercentFormatter value={bidRandomizationMax} /></div>\n      </div>\n    )}\n\n\n    {proxyBidding?.integration && (\n      <>\n        <div className=\"mt-2 data-row\">\n          <label>Proxy:</label>\n          <div><IntegrationDisplay type=\"proxy_bidding\" alias={proxyBidding.integration.name} /></div>\n        </div>\n          <div className=\"data-row\">\n            <label>Direct transfer:</label>\n            <div>{proxyBidding.direct_transfer ? 'yes' : 'no'}</div>\n          </div>\n\n            {proxyBidding.bid_floor && (\n              <div className=\"data-row\">\n                <label>Bid Floor:</label>\n                <div><MoneyFormatter value={proxyBidding.bid_floor} /></div>\n              </div>\n            )}\n\n            {proxyBidding.bid_modifier && (\n              <div className=\"data-row\">\n                <label>Bid Modifier:</label>\n                <div><PercentFormatter value={proxyBidding.bid_modifier} /></div>\n              </div>\n            )}\n      </>\n    )}\n  </SummaryItemWrapper>\n);\n\nexport const BidScheduleSummary = ({ schedule, gotoTab }) => {\n  if (Object.keys(schedule).length === 0) return (null);\n\n  return (\n    <SummaryItemWrapper className=\"bid-schedule-summary\" label=\"Bid Schedule\" tabId=\"bidding\" icon=\"clock\" gotoTab={gotoTab}>\n\n      <WeekSummarySVG\n        schedule={schedule}\n        config={BiddingScheduleConfig}\n        labelSize=\"sm\"\n        onChangeSelectedDay={()=>{}}\n        selectedDay={\"monday\"}\n      />\n    </SummaryItemWrapper>\n  );\n};\n\nexport const TagSummary = ({ tags = [], gotoTab }) => {\n  if (tags.length === 0) return (null);\n  return (<SummaryItemWrapper className=\"tag-summary\" label=\"Tags\" tabId=\"tags\" icon=\"tags\" gotoTab={gotoTab}>{tags.join(', ')}</SummaryItemWrapper>);\n};\n\n/* Routing flow control  */\nexport const FlowControlSummary = ({ flowControl, gotoTab }) => {\n  if (!flowControl) return (null);\n  return (\n    <SummaryItemWrapper className=\"flow-control-summary\" label=\"Flow Control\" tabId=\"bidding\" icon=\"filter\" gotoTab={gotoTab}>\n      <div className=\"d-flex align-items-baseline mt-2\">\n        <div className=\"flow-setting\">{titleCase(flowControl)}</div>\n        <div className=\"ms-2\">\n          {flowControl === 'include' ? (\n            <span>only leads matching target conditions</span>\n          ) : <span>all leads matching target conditions</span>}\n        </div>\n      </div>\n    </SummaryItemWrapper>\n  );\n};\n\n/* Routing flow control */\nexport const BidFalloffSummary = ({ bidFalloff, gotoTab }) => {\n  if (!bidFalloff) return (null);\n  return (\n    <SummaryItemWrapper className=\"bid-falloff-summary\" label=\"Bid Falloff\" tabId=\"bidding\" icon=\"filter\" gotoTab={gotoTab}>\n      <p className=\"d-flex align-items-baseline mt-2\" style={{fontSize:'1.6rem'}}>\n        {bidFalloff}%\n      </p>\n    </SummaryItemWrapper>\n  );\n};\n\n/* Routing sell strategy  */\nexport const SellStrategySummary = ({ sellStrategy, gotoTab }) => {\n  if (!sellStrategy) return (null);\n  return (\n    <SummaryItemWrapper className=\"sell-strategy-summary\" label=\"Selling Strategy\" tabId=\"bidding\" icon=\"balance-scale\" gotoTab={gotoTab}>\n      <p className=\"d-flex align-items-baseline mt-2\">\n        <strong className=\"me-2\">{SellStrategyLabels[sellStrategy] || titleCase(sellStrategy)}:</strong>\n        {' '}\n        <span>{SellStrategyDescriptions[sellStrategy]}</span>\n      </p>\n    </SummaryItemWrapper>\n  );\n};\n\n\nexport const BudgetSummary = React.memo(({\n  budgets, caps, schedule, gotoTab,\n}) => {\n  if (!(budgets && Object.keys(budgets).length) && !(caps && Object.keys(caps).length)) return (null);\n\n  return (\n    <SummaryItemWrapper className=\"budget-summary\" label=\"Budget and Caps\" tabId=\"budget\" icon=\"dollar-sign\" gotoTab={gotoTab}>\n      <Stack gap=\"0.5em\" divider={<RowDivider />} className=\"caps-table\">\n        <div className=\"d-flex caps-row title\">\n          <div>&nbsp;</div>\n          <div className=\"cap\">Caps</div>\n          <div className=\"budget\">Budget</div>\n        </div>\n        {['total','monthly','weekly','daily'].map((interval, i) => (\n          <div key={`sum-cap${i}`} className=\"d-flex caps-row\">\n            <div>{titleCase(interval)}</div>\n            <div className=\"cap\">{caps[interval] ? <b>{caps[interval]}</b> : <i className=\"text-muted\">open</i>} </div>\n            <div className=\"budget\">{budgets[interval] ?\n\n                <NumberFormat className=\"fw-bold\" value={budgets[interval]} displayType=\"text\" prefix=\"$\" thousandSeparator decimalScale={0}  />\n\n              : <i className=\"text-muted\">open</i>}\n            </div>\n          </div>\n        ))}\n        {/* TBD: hourly feature is not live yet\n        <div className=\"d-flex caps-row\">\n          <div>Hourly</div>\n          <div className=\"cap\"><i>{schedule && Object.keys(schedule).length > 0 ? 'scheduled' : 'open'}</i></div>\n          <div className=\"budget\">N/A</div>\n        </div>*/}\n      </Stack>\n    </SummaryItemWrapper>\n  );\n});\n\n// const BudgetSummaryItem = React.memo(({\n//   name, budget = '', product, cap = '',\n// }) => (\n//   <li>\n//     <strong>{name}</strong>\n// &nbsp;&nbsp;\n//     <span>\n//       Spend:&nbsp;\n//       {budget ? `$${numberFormat.format(budget)}` : <i>open</i>}\n//     </span>\n//     {' '}\n// &nbsp;/&nbsp;\n//     <span>\n//       {' '}\n//       {titleCase(product)}\n//       :&nbsp;\n//       {cap ? numberFormat.format(cap) : <i>open</i>}\n//     </span>\n//\n//   </li>\n// ));\n\nexport const TargetingSummary = React.memo(({\n  attributes, targets, expression, matchIsRequired, isStandalone, gotoTab,\n}) => {\n  const [expressionMode, setExpressionMode] = useState(false);\n  const hasTargeting = targets.length > 0 && targets[0].length > 0;\n\n  // TODO: trim groups? might not be likely, but a lot of groups would blow up the summary\n  // <Input type=\"textarea\" rows={3} defaultValue={expression}/>\n  return (\n    <SummaryItemWrapper className=\"target-summary\" label=\"Targeting\" icon=\"bullseye\" tabId=\"targeting\" gotoTab={gotoTab}>\n      {matchIsRequired &&\n        <StandardAlert color=\"danger\" icon=\"alert\" className=\"validation mb-1\">\n          Match is required for bid\n        </StandardAlert>\n      }\n\n      {isStandalone &&\n        <StandardAlert color=\"warning\" icon=\"alert\" className=\"validation mb-1\">\n          Standalone Rule (does not affect sibling rules)\n        </StandardAlert>\n      }\n\n      {hasTargeting === true ? (\n        <>\n          { expressionMode === false ? (\n            <TargetGroupsDescription groups={targets} attributes={attributes} />\n          ) : (<div className=\"dont-break-out\">{expression}</div>)}\n\n          { expression && (\n            <div id=\"expression-toggler\">\n              <Button color=\"link\" className=\"inline\" size=\"xs\" onClick={() => setExpressionMode(!expressionMode)}>\n                [\n                {expressionMode === true ? 'Description' : 'Expression'}\n                ]\n              </Button>\n            </div>\n          )}\n        </>\n      ) : (\n        <span><i>No targets specified</i></span>\n      )}\n\n    </SummaryItemWrapper>\n  );\n});\n\n// iterate over match conditions and write a description for each\n// const TargetList = ({targets, attributes}) =>{\n//   if(!Array.isArray(targets)) return (null);\n//   return (<React.Fragment>\n//   { targets.map( (group, i) => {\n//     if(Array.isArray(group)){\n//       return (\n//         <div key={'group-'+ i}>\n//           {i > 0 && <div className=\"target-summary-group-or\">OR</div>}\n//           <ul>\n//             {group.map( (target, i)=>{\n//               return(\n//                 <li key={i}><TargetDescription attribute={attributes[target.attribute]} target={target}/></li>\n//               )\n//             })}\n//           </ul>\n//         </div>\n//\n//       );\n//     } else return (null);\n//   })\n//   }\n// </React.Fragment>)};\n\nexport const CallConfigSummary = React.memo(({ concurrency, billableDuration, gotoTab }) => {\n  return (\n    <SummaryItemWrapper className=\"call-summary flex-grow-1\" label=\"Call Settings\" icon=\"phone\" tabId=\"calls\" gotoTab={gotoTab}>\n      <div className=\"data-row mt-2\">\n        <label>Billable Duration:</label>\n        <div>{billableDuration ?  `${billableDuration} seconds` : <i>None configured (max 5 min.)</i>}</div>\n      </div>\n      <div className=\"data-row \">\n        <label>Concurrency:</label>\n        <div>{concurrency || <i>None configured (default 1)</i>}</div>\n      </div>\n    </SummaryItemWrapper>\n  );\n});\n\n\n//Note: advertiser rules has enrichments on its own tab; routing rules mixes integrations on an 'integrations' tab\nexport const EnrichmentSummary = React.memo(({\n                                                enrichments = [],\n                                               attributes = [],\n                                               tabName=\"enrichments\",\n                                               gotoTab,\n}) => {\n  if (enrichments.length === 0) return (null);\n\n\n  return (\n    <SummaryItemWrapper className=\"enrichment-summary flex-grow-1\" label=\"Enrichments\" icon=\"filter\" tabId={tabName} gotoTab={gotoTab}>\n\n      { enrichments.map((enrichment, i) => (\n        <div key={i} className=\"mt-1\">\n          <h5>\n            <IntegrationDisplay type=\"enrichment\" alias={enrichment.integration.name} />\n            {' '}\n            <small>\n              ( {titleCase(enrichment.timing)})\n            </small>\n          </h5>\n          <div className=\"ms-3\">\n            <TargetGroupsDescription groups={enrichment.suppression_conditions} attributes={attributes} />\n          </div>\n\n        </div>\n      ))}\n\n    </SummaryItemWrapper>\n  );\n});\n\nexport const PrefillSummary = React.memo(({ prefill = {} = [], gotoTab }) => {\n  if (!prefill.integration) return (null);\n\n  return (\n    <SummaryItemWrapper className=\"prefill-summary flex-grow-1\" label=\"Prefill\" icon=\"fill\" tabId=\"destinations\" gotoTab={gotoTab}>\n      <div className=\"mt-1\">\n        <IntegrationDisplay type=\"prefill\" alias={prefill.integration.name} />\n      </div>\n    </SummaryItemWrapper>\n  );\n});\n\n//Note: advertiser rules has destinations on its own tab; routing rules mixes integrations on an 'integrations' tab\nexport const DestinationSummary = React.memo(({\n  product,\n  isRouting,\n  destinationNumber,\n  destinationSip,\n  redirectUrl,\n  prefill,\n  postSale,\n  callStarted,\n  callEnded,\n  tabName=\"destinations\",\n  gotoTab\n}) => {\n\n  const hasIntegration = (val) =>  Array.isArray(val) && val.length || val && typeof val === 'object' && Object.keys(val).length\n  return (\n    <SummaryItemWrapper className=\"destination-summary flex-grow-1\" label=\"Destinations\" icon=\"envelope\" tabId={tabName} gotoTab={gotoTab}>\n      {product === 'calls' && (\n        <>\n          <div className=\"data-row mt-2\">\n            <label>Destination Number:</label>\n            <div>{destinationNumber || <i>none</i>}</div>\n          </div>\n          <div className=\"data-row \">\n            <label>Destination SIP:</label>\n            <div>{!Array.isArray(destinationSip) && destinationSip?.settings?.uri ? destinationSip.settings.uri : <i>none</i>}</div>\n          </div>\n        </>\n      )}\n      <div className=\"mt-1\">\n\n        {redirectUrl && (\n          <div className=\"data-row\">\n            <label>Redirect URL</label>\n            <div>{redirectUrl}</div>\n          </div>\n        )}\n\n        {!isRouting && (\n          <div className=\"data-row\">\n            <label>Prefill</label>\n            <div>\n              {hasIntegration(prefill) ? <IntegrationDisplay type=\"prefill\" alias={prefill.integration.name} /> : <i>none</i>}\n            </div>\n          </div>\n        )}\n\n\n        {product === 'calls' && (\n          <>\n            <div className=\"data-row\">\n              <label>Call Started</label>\n              <div>\n                {hasIntegration(callStarted) ? (\n                  <Stack gap=\"0.5em\">\n                    {callStarted.map((intg, i) => <IntegrationDisplay type=\"call_started\" alias={intg.integration.name} key={i}/>)}\n                  </Stack>\n                ) : (\n                  <i>none</i>\n                )}\n              </div>\n            </div>\n\n            <div className=\"data-row\">\n              <label>Call Ended</label>\n              <div>\n                {hasIntegration(callEnded) ? (\n                  <Stack gap=\"0.5em\" >\n                    {callEnded.map((intg, i) => <IntegrationDisplay type=\"call_ended\" alias={intg.integration.name} key={i} />)}\n                  </Stack>\n                ) : (\n                  <i>none</i>\n                )}\n              </div>\n            </div>\n          </>\n        )}\n\n        <div className=\"data-row\">\n          <label>Post Sale</label>\n          <div>\n            {hasIntegration(postSale) ? (\n              <Stack gap=\"0.5em\" >\n                {postSale.map((intg, i) => <IntegrationDisplay type=\"delivery\" key={i} alias={intg.integration.name} />)}\n              </Stack>\n            ) : (\n              <i>none</i>\n            )}\n          </div>\n        </div>\n\n\n      </div>\n    </SummaryItemWrapper>\n  );\n});\n\nexport const SaleConfirmationSummary = React.memo(({ confirmation = {} = [], gotoTab }) => {\n  if (!confirmation.integration) return (null);\n\n  return (\n    <SummaryItemWrapper className=\"sale-confirmation-summary flex-grow-1\" label=\"Sale Confirmation\" icon=\"fill\" tabId=\"sale_confirmation\" gotoTab={gotoTab}>\n      <div className=\"mt-1\">\n        <IntegrationDisplay type=\"sale_confirmation\" name={confirmation.integration.name} />\n      </div>\n    </SummaryItemWrapper>\n  );\n});\n\nexport const AdsSummary = React.memo(({ ads, accountAds, override, gotoTab }) => {\n  if (ads.length === 0 ) return (null);\n\n  const ruleAds = accountAds.filter((ad) => ads.includes(ad.id));\n\n  return (\n    <SummaryItemWrapper label=\"Ads\" className=\"ads-summary\" tabId=\"ads\" icon=\"ad\" gotoTab={gotoTab}>\n\n      {ruleAds.length > 0 && override === true && (\n        <div>\n          <FaIcon icon=\"check\" className=\"me-1\" />\n          <small>Override parent rule ads. Use only these ads for this rule.</small>\n        </div>\n      )}\n\n      {ruleAds.map((ad,i) => <AdDisplay {...ad} key={i} />)}\n    </SummaryItemWrapper>\n  );\n});\n\nexport const ChannelSummary = React.memo(({ modifiers, channels, gotoTab }) => {\n  // if(modifiers.length === 0) return (null)\n\n\n\n  return (\n    <SummaryItemWrapper label=\"Channel Modifiers\" className=\"channel-mod-summary mt-1\" icon=\"sliders-h\" tabId=\"channels\" gotoTab={gotoTab}>\n      {modifiers.length > 0 ? (\n        <div className=\"scroll-list thin-scrollbar\">\n          <DataRows labelWidth=\"400px\" gap=\"0.5rem\">\n          {modifiers\n            .filter(mod => mod.channel_status === \"active\")\n            .map((mod, i) => (\n            <DataRow key={`sum-mod${i}`} label={getChannelName(channels, mod.channel_id)}>\n\n                <b>\n                  {mod.bid_modifier}\n                  %\n                </b>\n\n            </DataRow>\n          ))}\n          </DataRows>\n        </div>\n      ) : (\n        <i>No channel modifiers</i>\n      )}\n\n    </SummaryItemWrapper>\n  );\n});\n\nconst getChannelName = (channels, channelId) => {\n  let name = 'Channel';\n  if (channels) {\n    const matching = channels.find((ch) => ch.id === channelId);\n    if (matching) name = matching.name;\n  }\n  return name;\n};\n\n/* For routing rules */\n// export const ChannelRouteSummary = memo(({channelRoutes, channels, gotoTab})=>{\n//\n//   if(channelRoutes.length === 0) return (null)\n//\n//   let excess = 0;\n//   if(channelRoutes.length > 6){\n//     excess = channelRoutes.length - 6;\n//     channelRoutes = channelRoutes.slice(0, 6);\n//   }\n//\n//   return(\n//     <SummaryItemWrapper label=\"Channels\" tabId=\"channels\" gotoTab={gotoTab}>\n//       <ul>\n//         {channelRoutes.map( (mod, i)=> <li key={'sum-mod'+i}> {getChannelName(channels, mod.channel_id)}: <b>{mod.distribution}%</b></li>)}\n//         {excess > 0 &&  <li><i>...and <strong>{excess} others</strong></i></li>}\n//       </ul>\n//     </SummaryItemWrapper>\n//   );\n// });\n\nexport const SummaryItemWrapper = ({\n  label, className = '', tabId, gotoTab, icon, children,\n}) => {\n  const allowEditOrder = usePermission('orders.edit');\n  return (\n    <div className={`form-section summary-item ${className}`}>\n      <div className=\"summary-item-label d-flex align-items-center justify-content-between\">\n        <div>\n          <FaIcon icon={icon} size=\"lg\" className=\"me-2\"/>\n          <label>{label}</label>\n        </div>\n        {gotoTab && <Button color=\"link\" className=\"inline\" onClick={() => gotoTab(tabId)}>{allowEditOrder ? 'edit' : 'view'}</Button>}\n      </div>\n      <div className=\"summary-item-data\">{children}</div>\n    </div>\n  )\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NumberFormat from 'react-number-format';\nimport { tokensToString } from '../../utils/string';\n// import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\n/*\n * Components for showing a summary display (non interactive) version of\n * rule targets\n */\n\nexport const TargetGroupsDescription = ({ groups, attributes, highlightAttribute, listLimit = 10 }) => {\n  if (!Array.isArray(groups)) return (null);\n  return (\n    <>\n      { groups.map((group, i) => {\n        if (Array.isArray(group)) {\n          return (\n            <div key={`group-${i}`}>\n              {i > 0 && <div className=\"target-summary-group-or\">OR</div>}\n              <ul className=\"fa-ul ms-0\">\n                {group.map((target, i) => (\n                  <li key={i}>\n                    <TargetDescription\n                      attribute={attributes[target.attribute]}\n                      highlight={target.attribute === highlightAttribute}\n                      target={target}\n                    />\n                  </li>\n                ))}\n              </ul>\n            </div>\n\n          );\n        } return (null);\n      })}\n    </>\n  );\n};\n\nTargetGroupsDescription.propTypes = {\n  attributes: PropTypes.object,\n  groups: PropTypes.array,\n  listLimit: PropTypes.number,\n};\n\n/*\n * Component for making a summary description out of a rule target object\n */\n\nexport const TargetDescription = ({ attribute, target, highlight, listLimit = 10 }) => {\n  if (!attribute) return (<span>No attribute</span>);\n  return (\n    <div className=\"d-inline-block target-description\">\n\n      <span className={`target-summary-label ${highlight ? 'highlight' : ''} me-1`}>{attribute.label ?? attribute.name}</span>\n      { (target.matches === true || target.matches === undefined) ? (<span className=\"target-match-bool target-is\">is </span>)\n        : (<span className=\"target-match-bool target-is-not\">is not </span>)}\n      <FormattedTargetValue attribute={attribute} value={target.value} listLimit={listLimit} />\n      {attribute.alias !== 'expression' && target.accept_unknown === true && <span className=\"ms-1 target-summary-unknown\"> (accept if unknown)</span> }\n    </div>\n  );\n};\n\nTargetDescription.propTypes = {\n  attribute: PropTypes.object,\n  target: PropTypes.object,\n  listLimit: PropTypes.number,\n};\n\nconst FormattedTargetValue = ({ value, attribute, listLimit = 10 }) => {\n  switch (attribute.input_type) {\n    case 'integer':\n      return <SingleValueFormat value={value} attribute={attribute} />;\n    case 'choice':\n    case 'dynamic_choice':\n    case 'text':\n      value = AttributeChoiceDisplay(attribute, value);\n      return <SingleValueFormat value={value} attribute={attribute} />;\n    case 'expression':\n      return <i><SingleValueFormat value={value} attribute={attribute} /></i>;\n    case 'integer_range':\n      return <IntegerRangeFormat value={value} />;\n    case 'multiple_choice':\n    case 'dynamic_multiple_choice':\n    case 'state_choice':\n      value = AttributeChoiceDisplay(attribute, value);\n      return <MultipleChoiceFormat value={value} limit={listLimit} />;\n    case 'boolean':\n      return <BooleanFormat value={value} />;\n    case 'zipcode_list':\n    case 'county_list':\n    case 'list':\n      // For now we are assuming csv input\n      return <TokenListFormat value={value} limit={listLimit} />;\n    default:\n      return (null);\n  }\n};\n\n// Get the choice values from the attribute so we can display a nice value\nconst AttributeChoiceDisplay = (attr, values) => {\n  if (Array.isArray(values)) {\n    values = values.map((val) => (attr.options.choices && attr.options.choices.hasOwnProperty(val) ? attr.options.choices[val] : val));\n  } else { // radio choice, one value\n    if (attr.options.choices) {\n      values = attr.options.choices[values];\n    }\n  }\n\n  return values;\n};\n\nconst BooleanFormat = ({ value }) => (\n  <span className=\"target-summary-boolval\">\n    {value === true || value === 'true' ? 'Yes' : 'No'}\n    {' '}\n  </span>\n);\n\nconst SingleValueFormat = ({ value, attribute }) => {\n  const label = attribute.options.hasOwnProperty('label') ? attribute.options.label : '';\n  return (\n    <span>\n      {value}\n      {' '}\n      {label}\n    </span>\n  );\n};\n\n// Expects array of strings or csv string\n// (zip list is provided by API as array but is modified and returned as a comma or new line delimited string)\nconst TokenListFormat = ({ value, limit }) => {\n  value = typeof value === 'string' ? value.replace('\\n', ',').split(',') : value;\n  const subset = LimitValues(value, limit);\n  return (<ListPhrase {...subset} />);\n};\n\nconst IntegerRangeFormat = ({ value }) => {\n  if (value.from && value.to) {\n    return value.from === value.to\n      ? <span><NumberFormat value={value.from} displayType=\"text\" thousandSeparator /></span>\n      : (\n        <span>\n          <NumberFormat value={value.from} displayType=\"text\" thousandSeparator />\n          {' '}\n          to\n          {' '}\n          <NumberFormat value={value.to} displayType=\"text\" thousandSeparator />\n        </span>\n      );\n  }\n\n  if (!value.from && !value.to) {\n    return <i>empty</i>;\n  }\n\n  if (!value.from) {\n    return (\n      <span>\n        <NumberFormat value={value.to} displayType=\"text\" thousandSeparator />\n        {' '}\n        or below\n      </span>\n    );\n  }\n\n  if (!value.to) {\n    return (\n      <span>\n        <NumberFormat value={value.from} displayType=\"text\" thousandSeparator />\n        {' '}\n        or above\n      </span>\n    );\n  }\n};\n\nconst MultipleChoiceFormat = ({ value, limit }) => {\n  if (!Array.isArray(value)) return (<i>invalid value</i>);\n\n  if (value.length) {\n    // Sorting, assuming if first is number, all are numbers\n    if (isNaN(value[0])) {\n      value.sort();\n    } else {\n      value.sort((a, b) => a - b);\n    }\n  } else {\n    return <i>empty</i>;\n  }\n\n  if (!Array.isArray(value)) return (<span>None selected</span>);\n  const subset = LimitValues(value, limit);\n  return (<ListPhrase {...subset} />);\n};\n\n// \"This,that,whatever and 5 others\"\nconst ListPhrase = ({ display, hiddenCount }) => (\n  <span>\n    {tokensToString(display)}\n    { hiddenCount > 0 && (\n    <span>\n      {' '}\n      and\n      {' '}\n      <strong>\n        {hiddenCount}\n        {' '}\n        { hiddenCount > 1 ? 'others' : 'other'}\n      </strong>\n    </span>\n    ) }\n  </span>\n);\n\nconst LimitValues = (values, limit = 5) => {\n  if (!Array.isArray(values)) return [values];\n  const count = values.length;\n  const display = count > limit ? values.slice(0, limit) : values;\n  const hiddenCount = count > limit ? count - limit : 0;\n  return { display, hiddenCount };\n};\n","import React, { useState, useEffect, useContext } from 'react';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { TreeContext } from './TreeProvider';\n\n/*\n * Component for one branch in the rule tree. Recurses to itself for each sub-branch of the tree\n */\nconst TreeBranch = ({\n  rule,\n  level,\n  //expandedRules,\n  selectedRule,\n  ancestors,\n  ruleComponent: RuleComponent, // Could be advertiser rule or routing rule component\n  isDisabled = false,\n}) => {\n  const treeContext = useContext(TreeContext);\n  // Override expanded to make sure branch with selected rule is open.\n  // For example, you add a new rule to a closed branch, the branch should open automatically.\n  // Or, you can link directly to a rule with a rule id in the query string\n  const isSelectedRuleBranch = selectedRule && (selectedRule.parent_id === rule.id)\n  const isAncestorBranch = ancestors.some(((ancId) => ancId === rule.parent_id))\n  const [expanded, setExpanded] = useState(treeContext.expandedRules.includes(rule.id) || isSelectedRuleBranch || isAncestorBranch)\n\n  const toggleBranch = (e) => {\n    e.stopPropagation();\n    setExpanded(!expanded);\n  };\n\n  // Open if selected\n  useEffect(() => {\n    if (isSelectedRuleBranch || isAncestorBranch || treeContext.currentBidEdit === rule.id || treeContext.search) {\n      setExpanded(true)\n    }\n  }, [selectedRule, treeContext.search])\n\n\n  useEffect(() => {\n    setExpanded(treeContext.expandedRules.includes(rule.id) || isSelectedRuleBranch || isAncestorBranch)\n  }, [treeContext.expandedRules])\n\n  // Open if in edit mode\n  useEffect(() => {\n    if (treeContext.currentBidEdit === rule.id) {\n      setExpanded(true)\n    }\n  }, [treeContext.currentBidEdit]);\n\n  return (\n    <div className=\"leaf\">\n\n      {/* TODO: Show only if descendants have search */}\n      {rule.hide !== true\n            && (\n            <div className={classnames(\"rule-container d-flex\", {root:level === 0})}>\n\n                  <div className=\"tree-bracket\" />\n                  <div onClick={toggleBranch} className={classnames(\"icon-outer\", {disabled:rule.rules.length === 0})}\n                  >\n                    { rule.rules.length > 0 && (\n                      <FaIcon\n                        size=\"sm\"\n                        icon={['far', (expanded ? 'minus-square' : 'plus-square') ]}\n                        className=\"icon-folder\"\n                      />\n                    )}\n                  </div>\n\n\n                <RuleComponent\n                  rule={rule}\n                  level={level}\n                  expanded={expanded}\n                  setExpanded={setExpanded}\n                  parentDisabled={isDisabled}\n                />\n            </div>\n            )}\n\n      {/* Map the rule's children. Render each sub-rule as a tree */}\n      {(rule.rules.length > 0 || rule.hasChildren === true) && rule.hide !== true && (\n\n        <div className={classnames('rule-branch', {\n          expanded, closed: !expanded, disabled: rule.disabled, root: level === 0,\n        })}\n        >\n\n              {/* Do we need a message if parent is disabled? {rule.disabled && <small><i>all disabled because parent!</i></small>} */}\n              { rule.rules.map((child, i) => (\n                <TreeBranch\n                  key={i}\n                  rule={child}\n                  level={level + 1}\n                  //expandedRules={expandedRules}\n                  selectedRule={selectedRule}\n                  ancestors={ancestors}\n                  ruleComponent={RuleComponent}\n                  isDisabled={rule.disabled}\n                />\n              ))}\n\n\n          </div>\n\n      )}\n      {rule.filteredCount > 0 && (\n        <div className=\"rule filtered-count\">\n          <FaIcon icon=\"filter\" size=\"1x\" className=\"icon-rule\" />\n          {' '}\n          <small>\n            <i>\n              (\n              {rule.filteredCount}\n              {' '}\n              filtered)\n            </i>\n          </small>\n        </div>\n      )}\n    </div>\n  );\n};\n\nTreeBranch.propTypes = {\n  rule: PropTypes.object.isRequired,\n  ruleComponent: PropTypes.func.isRequired,\n  selectedRule: PropTypes.object,\n  ancestors: PropTypes.array,\n  level: PropTypes.number,\n  isDisabled: PropTypes.bool,\n};\n\nTreeBranch.defaultProps = {\n  level: 0,\n  selectedRule: null,\n  ancestors: [],\n\n};\n\nexport default TreeBranch;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport copy from 'fast-copy';\n\nconst TreeContext = React.createContext()\n\nfunction getRuleIdArray(rule) {\n  let ids = []\n  if (rule) {\n    ids.push(rule.id)\n    if (rule.rules.length) {\n      rule.rules.map((rule) => {\n        const treeIds = getRuleIdArray(rule)\n        ids = [...ids, ...treeIds]\n      });\n    }\n  }\n\n  return ids\n}\n\nfunction getExpandedRules(rule, targetLevel=Infinity, currentLevel=0) {\n  let ids = []\n  if (rule) {\n    if (currentLevel > targetLevel) {\n      return []\n    }\n\n    if (rule.rules.length && currentLevel < targetLevel) {\n      ids.push(rule.id)\n      rule.rules.map((rule) => {\n        const treeIds = getExpandedRules(rule, targetLevel,currentLevel + 1)\n        ids = [...ids, ...treeIds]\n      });\n    }\n  }\n\n  return ids\n}\n\nconst TreeProvider = (props) => {\n  const [currentBidEdit, setCurrentBidEdit] = useState(0)\n  const [currentBidUpdating, setCurrentBidUpdating] = useState(0)\n  const [search, setSearch] = useState('')\n  const [filter, setFilter] = useState('')\n  const [isFiltered, setIsFiltered] = useState(false)\n  const [filteredResultCount, setFilteredResultCount] = useState(0)\n  // Array of just the rule ids so we can know our position in the tree while using keys to move\n  const [ruleIds, setRuleIds] = useState(getRuleIdArray(props.rule))\n  const [expandedRules, setExpandedRules] = useState([])\n\n  // Loading of rules might be async so update state when rule changes\n  useEffect(() => {\n    if(!ruleIds.length) {\n      setRuleIds(getRuleIdArray(props.rule))\n    }\n    // if(!expandedRules.length) {\n       setExpandedRules(getExpandedRules(props.rule, props.defaultExpandLevel))\n    // }\n  }, [props.rule])\n\n  // Set listeners for traversal of tree using keys\n  useEffect(() => {\n    const El = document.getElementById('col-rule-tree');\n\n    const handler = function (event) {\n\n      event.stopPropagation()\n\n      // TODO  revert if bad input\n      if (ruleIds.length <= 1) return\n\n      if ((event.shiftKey && event.key === 'Tab') || event.key === 'ArrowUp') {\n        event.preventDefault()\n        // MOVE UP\n         //console.log('TreeProvider.js:useEffect: SHIFT-tab OR UP was pressed!', currentBidEdit);\n        // Note: in Chrome, shift-tab will move focus from the input to the URL bar\n        setCurrentBidEdit((id) => {\n          const idx = ruleIds.indexOf(id);\n          return idx > 0 ? ruleIds[idx - 1] : ruleIds[ruleIds.length - 1]\n        });\n      } else if (event.key === 'Tab' || event.key === 'ArrowDown') {\n        event.preventDefault()\n        // MOVE DOWN\n        // console.log('TreeProvider.js:useEffect: tab or down was pressed!', currentBidEdit);\n        setCurrentBidEdit((id) => {\n          const idx = ruleIds.indexOf(id)\n          return idx + 1 < ruleIds.length ? ruleIds[idx + 1] : ruleIds[0]\n        })\n      }\n    };\n\n    El && El.addEventListener('keydown', handler)\n    return () => {\n      El && El.removeEventListener('keydown', handler)\n    };\n  }, [props.rule]);\n\n  // Pure filtering function — no state updates, safe to call during render\n  const filterRule = (rule, matchCount = 0) => {\n    const filteredRule = copy(rule)\n    filteredRule.isMatch = search ? filteredRule.label.toLowerCase().includes(search.toLowerCase()) : true\n\n    if (filteredRule.isMatch && filteredRule.summary) {\n      filteredRule.isMatch = filter ? filteredRule.summary.includes(filter) : true\n    }\n\n    if (filteredRule.isMatch) {\n      ++matchCount\n    }\n\n    filteredRule.hasChildren = filteredRule.rules.length > 0\n\n    filteredRule.rules = filteredRule.rules.reduce((acc, child) => {\n      child = filterRule(child, matchCount)\n      if (child.isMatch || child.rules.length) {\n        ++matchCount\n        acc.push(child)\n      }\n      return acc\n    }, [])\n\n    filteredRule._matchCount = matchCount\n    return filteredRule\n  };\n\n  const getMatches = (rule) => {\n    // TODO: don't show root rule if nothing matches, including root rule (show \"none found\" message?)\n    // or: show root rule but have message \"No matching rules found\")\n    if (search || filter) {\n      return filterRule(rule)\n    }\n    return rule\n  };\n\n  // Update filtered state in an effect instead of during render\n  useEffect(() => {\n    if (search || filter) {\n      const result = filterRule(props.rule)\n      setIsFiltered(true)\n      setFilteredResultCount(result._matchCount || 0)\n    } else {\n      setIsFiltered(false)\n      setFilteredResultCount(0)\n    }\n  }, [search, filter, props.rule]);\n\n  const clearSearch = () => {\n    setSearch('')\n    setFilter('')\n    setRuleIds(getRuleIdArray(props.rule))\n  };\n\n  const expandAll = () => setExpandedRules(getExpandedRules(props.rule, Infinity))\n  const collapse = () => setExpandedRules(getExpandedRules(props.rule, 1))\n\n\n  return (\n    <TreeContext.Provider value={{\n      currentBidEdit,\n      setCurrentBidEdit,\n      currentBidUpdating,\n      setCurrentBidUpdating,\n      getMatches,\n      search,\n      filter,\n      isFiltered,\n      filteredResultCount,\n      clearSearch,\n      setSearch,\n      setFilter,\n      ruleType: props.ruleType,\n      product: props.product,\n      expandedRules,\n      expandAll,\n      collapse\n    }}\n    >\n      {props.children}\n    </TreeContext.Provider>\n  );\n};\n\nTreeProvider.propTypes = {\n  rule: PropTypes.object,\n  ruleType: PropTypes.string, // routing (publisher) or targeting (advertiser)\n  children: PropTypes.node,\n  product: PropTypes.string,\n  defaultExpandLevel: PropTypes.number,\n};\n\nexport { TreeProvider, TreeContext };\n","export const IconData = {\n  ads: { icon: 'ad', name: 'ads', tab: 'ads', title: 'Ads' },\n  bid_blocked: { icon: 'ban', name: 'bid_blocked', tab: 'bidding', title: 'Blocked or zero bid' },\n  bid_schedule: { icon: 'clock', name: 'bid_schedule', tab: 'bidding', title: 'Scheduled Bid Modifiers' },\n  budget: { icon: 'dollar-sign', name: 'budget', tab: 'budget', title: 'Budget or caps' },\n  channel_modifiers: { icon: 'sliders-h', name: 'channel_modifiers', tab: 'channels', title: 'Channel modifiers' },\n  datasheets: { icon: 'paperclip', name: 'datasheets', tab: 'datasheets', title: 'Datasheets' },\n  destinations: { icon: 'paper-plane', name: 'destinations', tab: 'destinations', title: 'URL or Phone number destination' },\n  post_sale: { icon: 'envelope', name: 'post_sale', tab: 'destinations', routing_tab:'integrations',title: 'Post-sale integration' },\n  prefill: { icon: 'fill', name: 'prefill', tab: 'destinations', title: 'Prefill integration' },\n  match_conditions: { icon: 'bullseye', name: 'match_conditions', tab: 'targeting', title: 'Match Conditions' },\n  sale_conditions: { icon: 'cloud-download-alt', name: 'sale_conditions', tab: 'enrichments', routing_tab:'integrations', title: 'Enrichments' },\n  sale_confirmation: { icon: 'thumbs-up', name: 'sale_confirmation', tab: 'sale_confirmation', routing_tab:'integrations', title: 'Sale Confirmation' },\n  schedule: { icon: 'calendar-times', name: 'schedule', tab: 'activity', title: 'Scheduled pause dates' },\n  tags: { icon: 'tags', tab: 'tags', name: 'tags', title: 'Tags' },\n  tracking: { icon: 'shoe-prints', name: 'tracking', tab: 'tracking', title: 'Tracking pixels' },\n  proxy_bidding: { icon: 'project-diagram', name: 'proxy_bidding', tab: 'bidding', title: 'Proxy Bidding' },\n  advanced: { icon: 'cog', tab: 'advanced', name: 'advanced', title: 'Advanced Settings' },\n  // routing rules\n  sale_match_caps: { icon: 'hand-paper', name: 'sale_match_caps', tab: 'caps', title: 'Sale & Match caps' },\n  flow_control: { icon: 'filter', name: 'flow_control', tab: 'bidding', title: 'Flow Control' },\n  payout: { icon: 'dollar-sign', name: 'payout', tab: 'bidding', title: 'Payout' },\n  margin: { icon: 'percent', name: 'margin', tab: 'bidding', title: 'Margin' },\n  sell_strategy: { icon: 'balance-scale', name: 'sell_strategy', tab: 'bidding', title: 'Sell Strategy' },\n  match_limit: { icon: 'comment-slash', name: 'match_limit', tab: 'advanced', title: 'Match Limit' },\n  match_timeout: { icon: 'hourglass-half', name: 'match_timeout', tab: 'advanced', title: 'Match Timeout' },\n  bid_randomization: { icon: 'random', name: 'bid_randomization', tab: 'bidding', title: 'Bid Randomization' },\n};\n\nexport const SellStrategyLabels = {\n  '': 'Default / Inherit',\n  legs: 'Attempt Once',\n  legs_sequential: 'Attempt Multiple',\n  waterfall: 'Waterfall',\n  arbitrage: 'Arbitrage',\n};\n\nexport const SellStrategyDescriptions = {\n  legs: 'Sell to the highest bid. Do not attempt to sell to other bids.',\n  legs_sequential: 'Keep the auction open so the vendor can post each leg as a separate attempt, selling one bid per post.',\n  waterfall: 'In order from highest to lowest bid, sell to the first bidder that accepts.',\n  arbitrage: 'Like Waterfall, but the originally committed bids are honored.',\n};\n\nexport const ValueEstimatorLabels = {\n  '': 'Default / Inherit',\n  simple_ctr: 'Simple CTR',\n  static_ctr: 'Static CTR',\n  integration: 'Integration',\n};\n\nexport const ValueEstimatorDescriptions = {\n  simple_ctr: 'Value is estimated from historical CTR.',\n  static_ctr: 'Value is estimated from a static CTR table instead of history.',\n  integration: 'Value is estimated by the value estimator integration configured below. Falls back to Simple CTR when that integration cannot answer.',\n};\n\nexport const RuleProps = [\n  'flow_control',\n  'billable_duration',\n  'datasheets',\n  'dba',\n  'disabled',\n  'bid_blocked',\n  'bid_exclusivity',\n  'match_conditions',\n  'sale_conditions',\n  'sale_confirmation',\n  'prefill',\n  'destinations',\n  'destination_number',\n  'ads',\n  'budget', // advertiser rules, budget & caps\n  'sale_match_caps', // routing rules, sale_caps and match_caps\n  'bid_schedule',\n  'schedule',\n  'channel_modifiers',\n  'is_standalone',\n  'match_is_required',\n  'tracking',\n  'tags',\n  'proxy_bidding',\n  'post_sale',\n  'sell_strategy',\n  'advanced',\n  'bid_randomization',\n];\n\n// In rule tree this determines which icons may show, in this order.\n// Values are same as RuleProps because we check the rule's props array\nexport const AdvertiserIconSet = [\n\n  'datasheets',\n  // 'bid_blocked',\n  'match_conditions',\n  //'match_is_required',\n  'sale_conditions',\n  'sale_confirmation',\n  'prefill',\n  'destinations',\n  'post_sale',\n  'ads',\n  'budget', // budget & caps\n  'bid_schedule',\n  'schedule',\n  'channel_modifiers',\n  'tracking',\n  'tags',\n  'proxy_bidding',\n  'advanced',\n];\n\nexport const RoutingIconSet = [\n  'advanced',\n  'bid_blocked',\n  'disabled',\n  'flow_control',\n  'margin',\n  'match_conditions',\n  'payout',\n  'post_sale',  //post sale integrations\n  'sale_match_caps', // routing rules, sale_caps and match_caps,\n  'sale_conditions',\n  'sell_strategy',\n  'match_limit',\n  'match_timeout',\n  'bid_randomization',\n  'tracking'\n  // TODO: absolute and modifier?\n];\n\n// On server side\n// does not have 'sale_conditions' (enrichments), 'post_sale'\n// absolute and modifier we don't have icons for\n// sale & match caps are separate\n// no payout or margin  but looks like we did not have logic for this\n/*\n'flow_control',\n'absolute',\n'modifier',\n'match_conditions',\n'sale_caps',\n'match_caps',\n'sell_strategy',\n'match_limit',\n'match_timeout',\n */\n","import React from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\n// Display an icon based on boolean status.\n// Some of our \"booleans\" are yes/no\n// The value could be null/undefined, for example a call that has not been sold yet,\n// so we have the option of interpreting that as false or neither true nor false (showUndetermined)\nconst BooleanIconCell = ({ value, trueTitle, falseTitle, showUndetermined=true }) => (\n    <div className=\"bool-icon-cell w-100\" style={{textAlign: \"center\"}}>\n      {(value && (value === true || value.toString().toLowerCase() === \"yes\"))\n        ? <FaIcon icon=\"check-circle\" size=\"lg\" title={trueTitle} color=\"green\"/>\n        : (showUndetermined && (typeof value === 'undefined' || value === null)\n          ? <span title=\"Undetermined\">&mdash;</span>\n          : <FaIcon icon=\"times\" size=\"lg\" title={falseTitle} color=\"darkred\"/>)}\n    </div>\n  );\n\nexport default BooleanIconCell;\n","import React from 'react';\nimport {\n  Button, ButtonGroup, Col, Label, Row,\n} from 'reactstrap';\nimport { useDebouncedCallback } from 'use-debounce';\nimport Select from '../Form/SimpleSelect';\nimport EnhancedSelect from \"../Form/EnhancedSelect\";\nimport InputWithIcon from '../Form/InputWithIcon';\nimport {DefaultReactSelectProps} from \"../Form/const\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\n/*\n * TextSearch:\n *     Input for text search entry\n *\n * Filter and StackedFilter\n *    Configurable Multi or single select dropdown filter components\n *\n * for use in a filter panel\n */\n\n/* Single inline dropdown filter using react-select.\n * Wraps the EnhancedSelect component, but adds horizontal margin, and returns a parameter name as well as selected value.\n */\nconst Filter = ({\n  onChange,\n  options = [],\n  param,\n  value,\n  label,\n  disabled = false,\n  className=\"\",\n  loading=false,\n  ...rest\n}) => {\n  const onSelectChange = (value) => {\n    onChange && onChange(param, value);\n  };\n\n  const selectProps = { ...DefaultReactSelectProps, ...rest };\n  return (\n          <EnhancedSelect\n            isClearable\n            onChange={onSelectChange}\n            label={label}\n            disabled={disabled}\n            options={options}\n            value={value}\n            tabSelectsValue\n            backspaceRemovesValue\n            isDisabled={disabled}\n            className={`select-filter me-3 ${className}`}\n            isLoading={loading}\n            {...selectProps}\n          />\n  )\n\n  // return (\n  //   <div id={`filter-${param}`} className=\"select-filter me-3\">\n  //     <div>\n  //       {label && <label className=\"form-label\">{label}</label>}\n  //       <Select\n  //         classNamePrefix=\"select-filter\"\n  //         isClearable\n  //         onChange={onSelectChange}\n  //         options={options}\n  //         value={value}\n  //         tabSelectsValue\n  //         backspaceRemovesValue\n  //         {...selectProps}\n  //         isDisabled={disabled}\n  //       />\n  //     </div>\n  //   </div>\n  // );\n};\n\n// Two state filter from a button group. Off=default/no-filter, On=filtered\nconst ButtonToggleFilter = React.memo(\n  ({\n    onChange, param, active, labelOn, labelOff,\n  }) => {\n    const handleClick = () => {\n      onChange && onChange(param, !active);\n    }\n\n    return (\n      <ButtonGroup className='btn-toggle'>\n        <Button color=\"secondary\" onClick={handleClick} outline={active}>\n          {labelOff}\n        </Button>\n        <Button color=\"secondary\" onClick={handleClick} outline={!active}>\n          {labelOn}\n        </Button>\n      </ButtonGroup>\n    );\n  },\n);\n\n/* Filter that is stacked with other filters in a single dropdown */\nconst StackedFilter = ({\n  onChange, onApply=null, options, param, value, label, ...rest\n}) => {\n\n  const onSelectChange = (value) => {\n    onChange && onChange(param, value);\n  };\n\n  const selectProps = { ...DefaultReactSelectProps, ...rest };\n\n  return (\n    <Row id={`filter-${param}`} className=\"select-filter align-items-center\">\n      {label && (\n        <Col sm={3}>\n          <Label>{label}</Label>\n        </Col>\n      )}\n      <Col sm={label ? 9 : 12}>\n        <div className=\"d-flex\">\n          <div className=\"flex-grow-1\">\n            <Select\n              classNamePrefix=\"select-filter\"\n              isClearable\n              onChange={onSelectChange}\n              options={options}\n              value={value}\n              tabSelectsValue\n              backspaceRemovesValue\n              {...selectProps}\n            />\n          </div>\n\n          {/* optional apply link to right of select */}\n          {typeof onApply === 'function' && (\n          <div>\n            <Button className=\"ms-1\" size=\"sm\" color=\"link\" onClick={onApply}>apply</Button>\n          </div>\n          )}\n        </div>\n      </Col>\n    </Row>\n  );\n};\n\nconst TextSearch = ({\n    value,\n    placeholder,\n    onUpdate,\n    onClear,\n    autofocus = true,\n    disabled = false,\n    delay = 500,\n    style={}\n  }) => {\n    const handleChangeDebounced = useDebouncedCallback((val) => {\n      onUpdate(val.trim());\n    }, delay);\n\n    // This was done for auction list, an odd case where search is handled differently\n    const handleEnter = (e) => {\n      if (e.key === 'Enter') {\n        onUpdate(e.target.value.trim());\n      }\n    };\n\n    // Why the key?\n    // We need to use an uncontrolled input (defaultValue) for debounce to work.\n    // https://github.com/xnimorz/use-debounce/issues/13\n    // This can be a problem in cases where the value changes from some external event,\n    // such as when filtering is wired to the query string and the URL changes.\n    // The uncontrolled component won't react to this, but the changed key will\n    // force a re-render\n\n    return (\n      <div className=\"search-filter-wrapper\" key={`search-filter-key-${value}`} style={style}>\n        <InputWithIcon\n          icon=\"search\"\n          iconSize=\"lg\"\n          placeholder={placeholder}\n          name=\"search_term\"\n          containerClass=\"expands\"\n          defaultValue={value}\n          autofocus={autofocus}\n          onChange={(e) => handleChangeDebounced(e.target.value)}\n          onKeyDown={handleEnter}\n          onClear={onClear}\n          disabled={disabled}\n        />\n      </div>\n    );\n  };\n\n// A group of icon buttons for reset, refresh, apply\nconst FilterControls = ({\n  className='',\n  onExecute,\n  onRefresh,\n  onReset,\n  isLoading,\n  executeLabel='Apply'\n}) => {\n\n  return (\n    <div className={`my-1 d-flex flex-wrap ${className} `}>\n\n      {onExecute && (\n        <Button color=\"primary\" size=\"sm\" className=\"px-1\" onClick={onExecute} disabled={isLoading}>\n          {executeLabel}\n        </Button>\n      )}\n\n      {onRefresh && (\n        <Button color=\"link\" title=\"Refresh data\" onClick={onRefresh} disabled={isLoading} className=\"px-1 py-0\">\n          <FaIcon icon=\"sync\" />\n        </Button>\n      )}\n\n      {onReset && (\n        <Button color=\"link\" title=\"Clear filters\" onClick={onReset} disabled={isLoading} className=\"px-1 py-0\">\n            <span className=\"fa-layers fa-fw\">\n              <FaIcon icon=\"filter\" size=\"lg\" />\n              <FaIcon icon=\"circle\" inverse size=\"sm\" transform=\"right-7 up-2\" />\n              <FaIcon icon=\"ban\" size=\"sm\" color=\"red\" transform=\"right-7 up-2\" />\n            </span>\n        </Button>\n      )}\n    </div>\n  )\n}\nexport {\n  Filter, StackedFilter, ButtonToggleFilter, TextSearch, FilterControls\n};\n","import React from 'react';\nimport classnames from 'classnames';\nimport {\n  Card, CardBody,\n} from 'reactstrap';\n\n/*\n * Component Wrapper for Card layout wrapping a filter bar that appears above tables\n * Filters are arranged as nav items.\n * <Nav navbar className=\"me-auto\" >\n *   <NavItem className=\"boxed-filter search-filter\">\n *     <Filter....\n */\nconst FilterBar = ({ className=\"\", children, ...restProps }) => (\n  <div className={classnames(['page-section-filters', 'align-items-center', 'mb-3', className])} {...restProps}>\n\n    <Card>\n      <CardBody>\n\n        {children}\n\n      </CardBody>\n\n    </Card>\n\n  </div>\n);\n\n/*\n<Navbar  expand=\"md\">\n            <Collapse navbar>\n              {children}\n            </Collapse>\n          </Navbar>\n */\n\nexport default FilterBar;\n","export const ProductChoices = [\n  { value: 'clicks', label: 'Clicks' },\n  { value: 'leads', label: 'Leads' },\n  { value: 'calls', label: 'Calls' },\n  { value: 'opportunities', label: 'Opportunities' },\n];\n\nexport const DeliveryRejectCategoryChoices = [\n  {value: 'no match', label: 'No Match'},\n  {value: 'duplicate', label: 'Duplicate'},\n  {value: 'invalid', label: 'Invalid'},\n  {value: 'delivery_failure', label: 'Delivery Failure'},\n  {value: 'delivery_timeout', label: 'Delivery Timeout'},\n  {value: 'general', label: 'General'},\n  {value: 'todo', label: 'TODO'},\n  {value: 'capped', label: 'Capped'},\n  {value: 'compliance', label: 'Compliance'},\n  {value: 'dnc', label: 'DNC'},\n  {value: 'geo', label: 'Geo'},\n];\n\n// Which platform's auctions a promotion applies to. These are the matching service's\n// auctioneer router keys, so the values must match core-api's Promotion::PLATFORM_*\n// exactly — a promotion on a platform matching doesn't recognise never pays.\nexport const PlatformChoices = [\n  { value: 'mastodon', label: 'Mastodon' },\n  { value: 'alm', label: 'ALM' },\n  { value: 'zq', label: 'ZQ' },\n];\n\n// Platforms whose auctions the read-service indexes, for the auctions search\n// filter. Not PlatformChoices: ALM auctions aren't indexed, so filtering on it\n// would always come back empty. No selection means mastodon only (read-service\n// default), so this is not an \"Any\" filter.\nexport const AuctionPlatformChoices = [\n  { value: 'mastodon', label: 'Mastodon' },\n  { value: 'zq', label: 'ZQ' },\n];\n\nexport const StatusChoices = [\n  { value: 'active', label: 'Active' },\n  { value: 'paused', label: 'Paused' },\n  { value: 'archived', label: 'Archived' },\n];\n\nexport const VerificationChoices = [\n  { value: '1', label: 'Verified' },\n  { value: '0', label: 'Unverified' },\n];\n\nexport const LockedChoices = [\n  { value: '1', label: 'Locked' },\n  { value: '0', label: 'Unlocked' },\n];\n\nexport const EnabledChoices = [\n  { value: '1', label: 'Enabled' },\n  { value: '0', label: 'Disabled' },\n];\n\nexport const DispositionChoices = [\n  { value: 'answered', label: 'Answered' },\n  { value: 'completed', label: 'Completed' },\n  { value: 'failed', label: 'Failed' },\n  { value: 'canceled', label: 'Canceled' },\n  { value: 'no-answer', label: 'No Answer' },\n  { value: 'busy', label: 'Busy' },\n  { value: 'ringing_inbound', label: 'Ringing Inbound' },\n  { value: 'ringing_outbound', label: 'Ringing Outbound' },\n];\n\nexport const StateChoices = [\n  { value: 'AL', label: 'Alabama' },\n  { value: 'AK', label: 'Alaska' },\n  { value: 'AZ', label: 'Arizona' },\n  { value: 'AR', label: 'Arkansas' },\n  { value: 'CA', label: 'California' },\n  { value: 'CO', label: 'Colorado' },\n  { value: 'CT', label: 'Connecticut' },\n  { value: 'DE', label: 'Delaware' },\n  { value: 'DC', label: 'District ' },\n  { value: 'FL', label: 'Florida' },\n  { value: 'GA', label: 'Georgia' },\n  { value: 'HI', label: 'Hawaii' },\n  { value: 'ID', label: 'Idaho' },\n  { value: 'IL', label: 'Illinois' },\n  { value: 'IN', label: 'Indiana' },\n  { value: 'IA', label: 'Iowa' },\n  { value: 'KS', label: 'Kansas' },\n  { value: 'KY', label: 'Kentucky' },\n  { value: 'LA', label: 'Louisiana' },\n  { value: 'ME', label: 'Maine' },\n  { value: 'MD', label: 'Maryland' },\n  { value: 'MA', label: 'Massachusetts' },\n  { value: 'MI', label: 'Michigan' },\n  { value: 'MN', label: 'Minnesota' },\n  { value: 'MS', label: 'Mississippi' },\n  { value: 'MO', label: 'Missouri' },\n  { value: 'MT', label: 'Montana' },\n  { value: 'NE', label: 'Nebraska' },\n  { value: 'NV', label: 'Nevada' },\n  { value: 'NH', label: 'New Hampshire' },\n  { value: 'NJ', label: 'New Jersey' },\n  { value: 'NM', label: 'New Mexico' },\n  { value: 'NY', label: 'New York' },\n  { value: 'NC', label: 'North Carolina' },\n  { value: 'ND', label: 'North Dakota' },\n  { value: 'OH', label: 'Ohio' },\n  { value: 'OK', label: 'Oklahoma' },\n  { value: 'OR', label: 'Oregon' },\n  { value: 'PA', label: 'Pennsylvania' },\n  { value: 'RI', label: 'Rhode Island' },\n  { value: 'SC', label: 'South Carolina' },\n  { value: 'SD', label: 'South Dakota' },\n  { value: 'TN', label: 'Tennessee' },\n  { value: 'TX', label: 'Texas' },\n  { value: 'UT', label: 'Utah' },\n  { value: 'VT', label: 'Vermont' },\n  { value: 'VA', label: 'Virginia' },\n  { value: 'WA', label: 'Washington' },\n  { value: 'WV', label: 'West Virginia' },\n  { value: 'WI', label: 'Wisconsin' },\n  { value: 'WY', label: 'Wyoming' },\n];\n\n// export const ChangeTypeChoices = [\n//   { value: \"bid\", label: \"Bid Changes\"},\n//   { value: \"status\", label: \"Status Changes\"},\n//   { value: \"target\", label: \"Targeting Changes\"},\n//   { value: \"ad\", label: \"Ad Changes\"},\n//   { value: \"user\", label: \"User Changes\"},\n// ];\nexport const ChangeGroupChoices = [\n  { value: 5, label: 'Ad Changes' }, // entity\n  { value: 2, label: 'Bid Changes' }, // fields\n  { value: 3, label: 'Budget Changes' }, // fields\n  { value: 4, label: 'Schedule Changes' }, // fields, different entities\n  { value: 1, label: 'Status Changes' }, // field, different entities\n  { value: 6, label: 'Targeting Changes' }, // field\n  { value: 7, label: 'User Changes' }, // entity\n  { value: 9, label: 'Access/Permissions' },\n  { value: 10, label: 'Publishing Changes' },\n  { value: 11, label: 'Vertical Changes' },\n  { value: 12, label: 'Channel Modifiers (advertiser)' }, // field\n];\n\nexport const ChangeActionChoices = [\n  { value: 'update', label: 'Update' },\n  { value: 'create', label: 'Create' },\n  { value: 'delete', label: 'Delete' },\n  // User archival is logged as 'archive' as of DMS-1508; records from before that are 'delete'\n  { value: 'archive', label: 'Archive' },\n  { value: 'unlock', label: 'Unlock User' },\n  { value: 'login', label: 'User Login' },\n];\n\nexport const ChangeEntityTypeChoices = [\n  { value: 'account', label: 'Accounts' },\n  { value: 'attribute', label: 'Attributes' },\n  { value: 'ad', label: 'Ads' },\n  { value: 'channel', label: 'Channels' },\n  { value: 'datasheet', label: 'Datasheets' },\n  { value: 'dba', label: 'DBAs' },\n  { value: 'goal,goaltrackingfile', label: 'Goals' },\n  { value: 'inputschema', label: 'Input Schema' },\n  { value: 'integration', label: 'Integrations' },\n  { value: 'order', label: 'Orders' },\n  { value: 'partner', label: 'Partners' },\n  { value: 'password_reset_token', label: 'Password Resets' },\n  { value: 'permission', label: 'Permission Definitions' },\n  { value: 'phonenumber', label: 'Phone Numbers' },\n  { value: 'promotion', label: 'Promotions' },\n  { value: 'role', label: 'Role Definitions' },\n  { value: 'routingrule', label: 'Routing Rules' },\n  { value: 'salegroup', label: 'Sale Groups' },\n  { value: 'salesflow', label: 'Sales Flows' },\n  { value: 'source', label: 'Sources' },\n  { value: 'sourcetoken', label: 'Source Tokens' },\n  { value: 'system', label: 'System Users' },\n  { value: 'targetrule', label: 'Target Rules' },\n  { value: 'user', label: 'Users' },\n  { value: 'vendor', label: 'Vendors' },\n  { value: 'vertical', label: 'Verticals' },\n];\n\nexport const IntegrationTypeChoices = [\n  { value: 'delivery', label: 'Delivery'},\n  { value: 'proxy_bidding', label: 'Proxy Bidding'},\n  { value: 'prefill', label: 'Prefill'},\n  { value: 'enrichment', label: 'Enrichment'},\n  { value: 'sale_confirmation', label: 'Sale Confirmation'},\n  { value: 'bidding', label: 'Bidding'},\n  { value: 'pre_transfer', label: 'Pre-Transfer'},\n  { value: 'value_estimator', label: 'Value Estimator'},\n  { value: 'return', label: 'Return'},\n];\n\n//Chart aggregation intervals\nexport const ChartIntervalOptions = [\n  {\n    label: 'Auto',\n    value: 'auto',\n  },\n  {\n    label: 'Second',\n    value: '1s',\n  },\n  {\n    label: 'Minute',\n    value: '1m',\n  },\n  {\n    label: 'Hour',\n    value: '1h',\n  },\n  {\n    label: 'Day',\n    value: '1d',\n  },\n  {\n    label: 'Week',\n    value: '1w',\n  },\n  {\n    label: 'Month',\n    value: '1M',\n  },\n  {\n    label: 'Quarter',\n    value: '1q',\n  },\n  {\n    label: 'Year',\n    value: '1y',\n  },\n];\n\n// For DateRangeSelect component in MST library. Will be displayed in 2 columns as ordered here.\nexport const DateRangeRelativeTimePresets = {\n  today: {start:'now/d', end:'now/d',label:'Today'},\n  yesterday: {start:'now-1d/d', end:'now-1d/d',label:'Yesterday'},\n  thisdaylastweek: {start:'now-1w/d', end:'now-1w/d',label:'This day last week'},\n  thisweek: {start:'now/w', end:'now/w',label:'This week'},\n  last15m: {start:'now-15m', end:'now',label:'Last 15 minutes'},\n  last30m: {start:'now-30m', end:'now',label:'Last 30 minutes'},\n  last1h: {start:'now-1h', end:'now',label:'Last hour'},\n  last24h: {start:'now-24h', end:'now',label:'Last 24 hours'},\n  last7d: {start:'now-7d', end:'now',label:'Last 7 days'},\n  last30d: {start:'now-30d', end:'now',label:'Last 30 days'},\n}\n\n\nexport const LmsVerticalChoices = [\n  { value: 'autoins', label: 'Auto Insurance' },\n  { value: 'autofinance', label: 'Auto Finance' },\n  { value: 'autowarranty', label: 'Auto Warranty' },\n  { value: 'b2b', label: 'B2B' },\n  { value: 'debtcon', label: 'Debt' },\n  { value: 'edu', label: 'Education' },\n  { value: 'finalexpense', label: 'Final Expense' },\n  { value: 'healthins', label: 'Health Insurance' },\n  { value: 'homeimprovement', label: 'Home Improvement' },\n  { value: 'homeins', label: 'Home Insurance' },\n  { value: 'homeservice', label: 'Home Service' },\n  { value: 'lifeins', label: 'Life Insurance' },\n  { value: 'medsup', label: 'Medicare Supplement' },\n  { value: 'mortgage', label: 'Mortgage' },\n  { value: 'personalloan', label: 'Personal Loan' },\n  { value: 'solar', label: 'Solar' },\n  { value: 'studentloan', label: 'Student Loan' },\n];\n","import React, {useMemo} from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport {Button} from 'reactstrap';\nimport PropTypes from 'prop-types';\n\n\n//\n// const FilterLabelMap = {\n//   account: 'ACCOUNT',\n//   accounts: 'ACCOUNT',\n//   account_ids:'ACCOUNT',\n//   billable: 'BILLABLE',\n//   channel: 'CHANNEL',\n//   channel_id: 'CHANNEL',\n//   change_action: 'CHANGE ACTION',\n//   change_group: 'CHANGE TYPE',\n//   currentlyInsured: 'INSURED',\n//   device: 'DEVICE',\n//   disposition: 'DISPOSITION',\n//   entity_type: 'OBJECT',\n//   order: 'ORDER',\n//   orders: 'ORDER',\n//   // order_ids: 'ORDER',\n//   phase: 'PHASE',\n//   product: 'PRODUCT',\n//   reject_category:'REJECT CATEGORY',\n//   script: 'SCRIPT',\n//   sold: 'SOLD',\n//   source: 'SOURCE',\n//   sources: 'SOURCE',\n//   state: 'STATE',\n//   status: 'STATUS',\n//   tag: 'TAG',\n//   vendor: 'VENDOR',\n//   vendors: 'VENDOR',\n//   vertical: 'VERTICAL',\n//   verticals: 'VERTICAL',\n//   vertical_id: 'VERTICAL',\n//   version: 'API VERSION',\n//   integration: 'INTEGRATION',\n//   integrations: 'INTEGRATIONS',\n//   'vertical.name': 'VERTICAL',\n//   'include_buyers': 'INCLUDE_BUYERS',\n//   'match_rejection': 'MATCH REJECTION',\n//   'sale_rejection': 'SALE REJECTION',\n// };\n\n// Map of filter keys to choices keys\nconst FilterChoiceMap = {\n  'vertical.name': 'vertical',\n  vertical_id: 'vertical',\n  channel_id: 'channel',\n  vendor_id: 'vendor',\n  source_id: 'source',\n  order_id: 'order',\n  // order_ids: 'order',\n  //account_ids: 'account',\n};\n\n/*\n * Present active filters as row of tags with label and value\n * Each tag has a clear button.\n * There is a 'clear all' button and an optional 'apply' button.\n */\nconst FilterSummaryTags = ({\n                             filters,\n                             filterKeys = [],\n                             normalizedKeys = {},\n                             choices,\n                             entity,\n                             isLoading,\n                             fnGetLabel,\n                             fnCustomTags,\n                             onRemoveFilter,\n                             onClear,\n                             onClearEntity,\n                             onApply,\n                             isPendingApply\n                           }) => {\n\n\n  // Reduce the filter set: Only make tags for filters named in filterKeys\n  const targetFilters = keepKeys(filters, filterKeys)\n\n  if (Object.keys(targetFilters).length === 0 && !fnCustomTags) {\n    return null;\n  }\n\n  const summarizeFilterSettings = (filters, choices) => {\n\n    let filterSummary = {};\n    Object.entries(filters).map(([filter, val]) => {\n      if (fnGetLabel && typeof fnGetLabel[filter] === 'function' ) {\n        //we can provide getter functions for specific filters\n        const label = fnGetLabel[filter](val, choices[filter]);\n        filterSummary[filter] = {name:getDisplayFilterName(filter), value:label};\n      } else {\n        //Get labels by mapping value to choices, or default to the current value\n        // Map: param could be vertical.name, but choices prop is 'vertical'\n        let name = normalizedKeys[filter];\n        if (!name) {\n          name = FilterChoiceMap[filter] ?? filter;\n        }\n\n        if (choices.hasOwnProperty(name)) {\n          const label = getValueLabels(choices[name], val);\n          filterSummary[filter] = {name:getDisplayFilterName(name), value:(label||val)};\n\n        } else {\n          // todo guard against non-strings\n          filterSummary[filter] = {name:getDisplayFilterName(name), value:val};\n        }\n      }\n\n    })\n\n    if (fnCustomTags && typeof fnCustomTags === 'function') {\n      const tags = fnCustomTags();\n      if (tags) {\n        filterSummary = {...filterSummary, ...tags}\n      }\n\n    }\n\n    return filterSummary;\n  };\n\n  const getDisplayFilterName = (name) => Utils.tokenToWords(Utils.titleCase(name))\n\n  const getValueLabels = (options, values) => {\n    //console.log('ReportsFilter.js:summarize getLabels:', options, values);\n\n    if (values && Array.isArray(options)) {\n      // options.filter((opt) => values.includes(opt.value))\n      const selected = Array.isArray(values)\n        ? options.filter((opt) => values.some(val => val.toString() === opt.value.toString()))\n        : options.filter((opt) => opt.value.toString() === values.toString());\n\n      const labels = selected.length ? selected.map((opt) => opt.label) : null;\n\n      //console.log('FilterSummary.js:summarize, getLabels: selected, labels:', selected, labels);\n      return labels;\n    }\n    return null;\n  };\n\n  // Keys in the summary object are the filter keys\n  const summary = useMemo(() => summarizeFilterSettings(targetFilters, choices),\n    [filters, choices]);\n\n  if (!Object.keys(summary).length) return null;\n\n  // clear only the filters that are displayed in the summary\n  const handleClear = () => {\n    if (onClear) {\n      onClear(Object.keys(filters).reduce((acc, key) => {\n        if (!filterKeys.includes(key)) {\n          acc[key] = filters[key]\n        }\n        return acc\n      }, {}));\n    }\n  }\n\n\n  return (\n    <div className=\"filter-summary\">\n\n      {entity && onClearEntity && (\n        <div className=\"filter-tag entity d-flex align-items-center\">\n          <div className=\"filter-value\">\n            <strong>{entity.type}: </strong>\n              <span >\n              {entity.name}\n              </span>\n\n          </div>\n          <Button color=\"link\" className=\"\" size=\"sm\" onClick={onClearEntity}>\n            <FaIcon icon=\"times\" size=\"sm\" />\n          </Button>\n        </div>\n      )}\n\n      {Object.entries(summary).map(([filter, item], i) => (\n        <div className=\"filter-tag d-flex align-items-center\" key={i}>\n          <div className=\"filter-value\">\n            <strong>{item.name}: </strong>\n            {Array.isArray(item.value) && item.value.length > 0  ? (\n              <span >\n              {item.value.join(', ')}\n              </span>\n            ) : (\n              <span >\n              {item.value}\n              </span>\n            )}\n          </div>\n          <Button color=\"link\" className=\"\" size=\"sm\" onClick={()=>onRemoveFilter(filter)}>\n            <FaIcon icon=\"times\" size=\"sm\" />\n          </Button>\n        </div>\n      ))}\n\n      {!isLoading && (\n        <>\n          {onApply && isPendingApply && (\n            <Button color=\"link\" size=\"sm\" className=\"btn-apply inline ms-1\" onClick={onApply}>\n              Apply\n            </Button>\n          )}\n\n          {!isPendingApply && onClear && <Button color=\"link\" size=\"sm\" className=\"inline ms-1\" onClick={handleClear}>\n            Clear\n          </Button>}\n        </>\n      )}\n\n    </div>\n  );\n};\n\nconst keepKeys = (obj, keys) => {\n  obj = { ... obj }\n  Object.keys(obj).map(key => {\n    if (!keys.includes(key)) {\n      delete obj[key]\n    }\n  })\n  return obj\n}\n\nFilterSummaryTags.propTypes = {\n  filters: PropTypes.object,\n  filterKeys: PropTypes.array,\n  choices: PropTypes.object,\n  entity: PropTypes.object,\n  onRemoveFilter:PropTypes.func,\n  onClear:PropTypes.func,\n  onClearEntity:PropTypes.func,\n  onApply:PropTypes.func,\n  fnGetLabel:PropTypes.func,\n  fnCustomTags:PropTypes.func,\n  isPendingApply: PropTypes.bool,\n  isLoading: PropTypes.bool\n};\n\nexport default FilterSummaryTags;\n\n\n// unitLabel should be plural if not abbreviated, typically seconds or milliseconds\nexport const makeDurationTag = (min, max, unitLabel) => {\n  if (min || max){\n    const tag = {name:'Duration', value:''}\n    if (min && max) {\n      tag.value = `${min} to ${max} ${unitLabel}`;\n    } else if (min && !max) {\n      tag.value = `${min} or more ${unitLabel}`;\n    } else if (!min && max) {\n      tag.value = `Up to ${max} ${unitLabel}`;\n    }\n    return {duration:tag};\n  }\n  return null;\n\n}\n","import React, { useEffect, useContext } from 'react';\nimport {\n  useTable,\n  useSortBy,\n  useFlexLayout,\n  useResizeColumns,\n  useExpanded,\n  useFilters,\n  useGlobalFilter\n} from 'react-table';\nimport './ReactTableFlex.scss';\nimport { Spinner } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { NoDataComponent } from './Table';\nimport { DefaultTableState } from './constants';\nimport { LiveFilteringContext } from '../../Providers/LiveFilteringProvider';\n\nconst defaultColumn = {};\n\n/*\n * Table component using hook-based ReactTable 7\n * Uses Flex-based layout\n *\n * Filtering and sorting is executed locally\n * Filtering controls are outside of the table component.\n * Uses context for live filtering (Filters components sets state in context,\n * and it is read here and applied to built-in react-table row filtering)\n * https://codesandbox.io/s/react-table-provider-8rfh3?file=/src/TableFilter.js\n * outside live filtering by prop\n * https://codesandbox.io/s/react-table-render-header-q4vg8?file=/src/Table.js\n  *\n  * A note on flexLayout:\n  * The column property width:(int) is the flex-basis style.\n  * Therefore, it is more of a relative value, not a fixed width.\n  * minWidth and maxWidth values are only relevant to column resizing\n */\nconst FlexTable = ({\n  data=[],\n  columns,\n  loading,\n  noDataMessage = 'No Rows Found',\n  className=\"\",\n  renderRowSubcomponent=null,\n  reloadCallback=null,\n  getInstanceCallback=null,\n  onSelectRowsCallback=null,\n  onClickRowCallback=null,\n  getRowClassName=null,\n  isStateControlled=false,\n  showFooter=false,\n\n  // Table config\n  disableFilters=false,\n  addinHooks = [],\n  initialState = {},\n  globalFilter,\n  filterTypes=[],\n\n  // for controlled state\n  expandedRows = {},\n  hiddenColumns = [], // array of column ids to hide\n  selectedRowIds = {}, // {1:true, 2:false, ...}\n\n}) => {\n  const FilterContext = useContext(LiveFilteringContext);\n\n  // return instance using a callback\n  const useInstance = (instance) => {\n    if (instance && instance.getInstanceCallback) {\n      instance.getInstanceCallback(instance);\n    }\n  };\n\n  const defaultHooks = [\n    useFlexLayout,\n    useResizeColumns,\n    useFilters,\n    useGlobalFilter,\n    useSortBy,\n    useExpanded,\n    ...addinHooks,\n  ];\n\n  const {\n    // instance methods & props\n    getTableProps,\n    getTableBodyProps,\n    headerGroups,\n    footerGroups,\n    rows,\n    prepareRow,\n    state: { expanded, sortBy },\n    setAllFilters,\n    setGlobalFilter,\n    selectedFlatRows,\n\n    // access state's expanded and sortBy, but not the whole state object\n    // if you want whole state object, we would just use 'state' here\n    // The 'state' prop of instance can look like\n    /*\n    columnResizing: {columnWidths: {…}}\n    expanded: {0: true}\n    hiddenColumns: []\n    sortBy:[\n      0: {sortBy: \"name\", desc: true}\n      ]\n     */\n\n  } = useTable(\n    // config\n    {\n      columns,\n      data,\n      getInstanceCallback,\n      filterTypes,\n      defaultColumn, // reason to use this?\n      globalFilter,\n      autoResetGlobalFilter: false,\n      initialState: {\n        ...DefaultTableState,\n        ...initialState,\n      },\n      // useControlledState: Allows update of table state from outside components.\n      // This can be tricky if you are control some state properties externally,\n      // but let the table control others. You can end up with infinite loops.\n      // Unfortunately, react-table-7 does not allow us to selectively update state items.\n      // It's recommended that you either control all of these properties externally, or none.\n      // Hence the boolean isStateControlled.\n      useControlledState: isStateControlled\n        ? (state) =>\n\n          // this fires on any state change\n          React.useMemo(\n            () => ({\n              ...state,\n              selectedRowIds,\n              hiddenColumns,\n              // expanded:expandedRows\n            }),\n            [state, selectedRowIds, hiddenColumns, expandedRows],\n          )\n\n        : (state) => state,\n\n      // manualPagination: true, //tells pagination hook that we handle data fetching manually (must provide pageCount)\n      // manualSortBy:true, //letting server do the sorting,\n      disableSortRemove: true, // disable 3rd click to turn off sort\n      disableMultiSort: true,\n      disableFilters,\n      autoResetExpanded: false, // prevent expanded rows from collapsing when data refreshes\n      // Prevents filters/sort from being reset if data changes when using \"live\" (client side) filtering\n      autoResetSortBy: false,\n      autoResetFilters: false,\n      autoResetRowState: false\n    },\n    // hooks\n    ...defaultHooks,\n    (hooks) => {\n      // Add in custom hook\n      hooks.useInstance.push(useInstance);\n    },\n  );\n\n  useEffect(() => {\n    if (onSelectRowsCallback) {\n      onSelectRowsCallback(selectedFlatRows || []);\n    }\n  }, [selectedFlatRows]);\n\n  // Global filter allows multi-column search with one string\n  // @see: https://react-table.tanstack.com/docs/api/useGlobalFilter\n  useEffect(() => {\n    if (FilterContext && !disableFilters) {\n      setGlobalFilter(FilterContext.globalFilter);\n    }\n  }, [FilterContext?.globalFilter, data.length]);\n\n\n\n  // Filters from context, Reset if changed.\n  // Also reset if data length changes\n  // (there can be a race condition where filters get set before data is loaded but then do not\n  // get applied after the data is loaded)\n  useEffect(() => {\n    // Filter prop received as object\n    // Filter state must be array: [{ id: 'name', value: 'Jane'}, { id: 'age', value: 21 }]\n     //console.log(`SimpleTable. js :useEffect, filters changed`, FilterContext.filters);\n    if (FilterContext?.filters && !disableFilters) {\n      const newFilters = Object.entries(FilterContext.filters).map(([id, value]) => ({ id, value }));\n\n      //console.log(`FlexTable:useEffect, newFilters from context:`, FilterContext.filters, newFilters);\n      setAllFilters(newFilters);\n    }\n  }, [FilterContext?.filters, data.length]);\n\n\n  //\"rows\" will change based on filtering. Report back to context so it can be used to show \"n out of x rows\"\n  useEffect(() => {\n    if (FilterContext) {\n      FilterContext.setFilteredCount(rows.length);\n    }\n  }, [rows.length]);\n\n\n\n  return (\n    <div className={classnames('table-container', { loading })}>\n\n      {!loading && rows.length === 0 && <NoDataComponent>{noDataMessage}</NoDataComponent>}\n\n      {loading && <div className=\"table-loader\"><div><Spinner color=\"secondary\" /></div></div> }\n\n      {rows.length > 0 && (\n        <div className={`table flex-table ${[className]}`} {...getTableProps()}>\n          <div className=\"thead\">\n            {headerGroups.map((headerGroup, groupIndex) => (\n              <div key={groupIndex} {...headerGroup.getHeaderGroupProps()} className=\"thr\">\n                {headerGroup.headers.map((header, i) => {\n                  // three new addition to column: isSorted, isSortedDesc, getSortByToggleProps\n\n                  const {\n                    render,\n                    getHeaderProps,\n                    // defaultCanSort,\n                    isSorted,\n                    isSortedDesc,\n                    getSortByToggleProps,\n                    // resizer\n                    isResizing,\n                    getResizerProps,\n                    canSort,\n                    headerClassName,\n                  } = header;\n\n                  const { onClick, ...rest } = getHeaderProps(getSortByToggleProps());\n\n                  return (\n                    <div\n                      key={`th-${i}`}\n                      className={classnames('th', headerClassName, { sortable: canSort, desc: isSorted && isSortedDesc, asc: isSorted && !isSortedDesc })}\n                      onClick={onClick}\n                      {...rest}\n                    >\n                      <div>\n                        {render('Header')}\n                      </div>\n\n                      {canSort && (\n                      <div className={classnames(['sort-icon', { 'sort-active': isSorted }])}>\n                        {isSorted && !isSortedDesc && <FaIcon icon=\"sort-up\" size=\"sm\" />}\n                        {isSorted && isSortedDesc && <FaIcon icon=\"sort-down\" size=\"sm\" />}\n                        {!isSorted && <FaIcon icon=\"sort\" size=\"sm\" />}\n                      </div>\n                      )}\n\n                      {/* resizer div */}\n\n                      <div\n                        {...getResizerProps()}\n                        className={`resizer ${isResizing ? 'isResizing' : ''}`}\n                      />\n\n                    </div>\n                  );\n                })}\n              </div>\n            ))}\n          </div>\n\n          <div className=\"tbody\" {...getTableBodyProps()}>\n            {rows.map((row, i) => {\n              prepareRow(row);\n\n              return (\n                <React.Fragment key={`rt-tb-trs${i}`}>\n                  <div id={`row-${row.id}`} className={classnames('tr', { odd: i % 2 !== 1, selected: selectedRowIds[row.id] }, getRowClassName && getRowClassName(row))} {...row.getRowProps()} onClick={(e) => {\n                    e.stopPropagation();\n                    onClickRowCallback && onClickRowCallback(row.id)\n                  }}>\n                    {row.cells.map((cell, i) => (\n                      <div\n                        key={i}\n                        {...cell.getCellProps({\n                          className: `td ${cell.column.className || ''}`,\n                          style: cell.column.style,\n                        })}\n                      >\n                        {cell.render('Cell')}\n                      </div>\n                    ))}\n                  </div>\n                  {row.isExpanded && renderRowSubcomponent ? (\n                    <div className=\"tr subcomponent\">\n                      {renderRowSubcomponent(row, reloadCallback)}\n                    </div>\n                  ) : null}\n                </React.Fragment>\n\n              );\n            })}\n          </div>\n\n            {showFooter && footerGroups.length > 0 && (\n\n              <div className=\"tfoot\">\n                {footerGroups.map((group, groupKey) => (\n                  <div className=\"tr\" {...group.getFooterGroupProps()} key={groupKey}>\n                    {group.headers.map((col, c) => {\n                      //Top-level pivot table columns might not have a Footer (mst-3230)\n                      return col.Footer ? (\n                        <div  key={c} {...col.getFooterProps()}\n                            className={`td ${col.footerClassName || ''}`}>{col.render('Footer')}</div>\n                      ) : null\n                    })}\n                  </div>\n                ))}\n              </div>\n            )}\n\n        </div>\n      )}\n\n    </div>\n\n  );\n};\n\nFlexTable.propTypes = {\n\n  loading: PropTypes.bool,\n  data: PropTypes.array,\n  columns: PropTypes.array,\n  defaultColumn: PropTypes.object,\n  noDataMessage: PropTypes.string,\n  className: PropTypes.string,\n  renderRowSubcomponent: PropTypes.func,\n  reloadCallback: PropTypes.func,\n  onClickRowCallback: PropTypes.func,\n  isStateControlled: PropTypes.bool,\n  showFooter: PropTypes.bool,\n\n  // Table config props\n  disableFilters: PropTypes.bool,\n  addinHooks: PropTypes.array,\n\n  // Table state\n  initialState: PropTypes.object,\n  hiddenColumns: PropTypes.array, // list of col ids: ['status', ...]\n  selectedRowIds: PropTypes.object,\n  expandedRows: PropTypes.object, // {1:true,2:false, ...}\n  filters: PropTypes.object,\n  globalFilter: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\n};\n\nFlexTable.defaultProps = {\n  data: [],\n  initialSort: [],\n  hiddenColumns: [],\n  noDataMessage: 'No rows found',\n  className: '',\n  disableFilters: false,\n  defaultColumn: { width: 'auto', minWidth: 100 },\n  onClickRowCallback: () => {},\n};\n\nexport default FlexTable;\n","import React, { useState, useEffect } from 'react';\nimport {\n  Label, Input, Pagination, PaginationItem, PaginationLink,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\n\n/*\n * PaginationWidget component\n * //Todo: pageCount instead of limit\n * Usage\n */\n\nconst PaginationWidget = (props) => {\n  const [visiblePages, setVisiblePages] = useState(getVisiblePages(null, props.pages));\n\n  useEffect(() => {\n    setVisiblePages(getVisiblePages(props.page, props.pages));\n  }, [props.pages, props.page]);\n\n  const handleKeyDownJump = (e) => {\n    if (e.key === 'Tab' || e.key === 'Enter') {\n      let jump = parseInt(e.target.value);\n      if (!jump) {\n        jump = 1;\n      } else if (jump > props.pages) {\n        jump = props.pages;\n      }\n      props.onPageChange(jump);\n    }\n  };\n\n  const changePage = (page) => {\n    if (page === props.page) {\n      return;\n    }\n\n    props.onPageChange(page);\n  };\n\n  const handleClickPrev = (_e) => {\n    if (activePage === 1) return;\n    changePage(activePage - 1);\n  };\n\n  const handleClickNext = (_e) => {\n    if (activePage + 1 === props.pages) return;\n    changePage(activePage + 1);\n  };\n\n  let activePage = props.page;\n\n  // if(props.data.length === 0 ) return (null);\n  if (!props.pages) return (null);\n\n  return (\n    <div className=\"pagination-container\">\n      {/* <div className=\"page-summary\"> Props.page:{props.page}, props.pages:{props.pages},  activePage:{activePage}, totalRows{props.totalRows}</div> */}\n\n      <div className=\"d-flex align-items-center\">\n\n        {props.totalRows > 20 && props.showPageSize === true && (\n          <div className=\"page-show me-3\">\n            <Label>Display: </Label>\n            <Input\n              type=\"select\"\n              bsSize=\"sm\"\n              value={props.pageSize || props.defaultPageSize}\n              onChange={(e) => props.onPageSizeChange(e.target.value)}\n            >\n              <option value=\"20\">20</option>\n              <option value=\"50\">50</option>\n              <option value=\"100\">100</option>\n            </Input>\n          </div>\n        )}\n\n        <div className=\"page-summary me-3\">\n          <PageSummary page={props.page} totalRows={props.totalRows} totalCapped={props.totalCapped} pageSize={props.pageSize || props.defaultPageSize} />\n        </div>\n\n        {props.pages > 1 && (\n          <div className=\"page-jump\">\n            <Label>Jump: </Label>\n            <Input bsSize=\"sm\" defaultValue=\"\" onKeyDown={handleKeyDownJump} />\n          </div>\n        )}\n\n      </div>\n\n\n      <Pagination className=\"pagination-default\">\n\n        {/* <PaginationItem disabled={activePage === 1}>\n              <PaginationLink first title=\"First Page\" onClick={(e)=>changePage(1)}/>\n            </PaginationItem> */}\n\n        <PaginationItem disabled={activePage === 1}>\n          <PaginationLink\n            title=\"Previous Page\"\n            previous\n            className=\"Table__pageButton\"\n            onClick={handleClickPrev}\n          />\n        </PaginationItem>\n\n        {visiblePages.map((page, index, array) => (\n          <React.Fragment key={index}>\n            {/*  <div>page:{page},index:{index}, arry:{array.join(',')}</div> */}\n            {array[index - 1] + 2 < page && <div className=\"ellipsis\">...</div>}\n            <PaginationItem active={activePage === page}>\n              <PaginationLink\n                tag=\"div\"\n                onClick={() => changePage(page)}\n              >\n                {page}\n              </PaginationLink>\n            </PaginationItem>\n          </React.Fragment>\n        ))}\n\n        <PaginationItem disabled={activePage === props.pages}>\n          <PaginationLink\n            next\n            title=\"Next Page\"\n            onClick={handleClickNext}\n\n          />\n        </PaginationItem>\n\n        {/* <PaginationItem  disabled={activePage === props.pages}>\n              <PaginationLink last title=\"Last Page\"  onClick={(e)=>changePage(props.pages-1)}/>\n            </PaginationItem> */}\n\n      </Pagination>\n\n    </div>\n\n  );\n};\n\nconst PageSummary = React.memo(function PageSummary({ page, pageSize, totalRows, totalCapped }) {\n  const rowStart = ((page - 1) * pageSize) + 1;\n  const rowEnd = Math.min((rowStart + pageSize) - 1, totalRows);\n  return (\n    <span>\n      {rowStart}\n      {' '}\n      to\n      {' '}\n      {rowEnd}\n      {' '}\n      of\n      {' '}\n      {totalRows}{totalCapped ? '+' : ''}\n      {' '}\n      results\n    </span>\n  );\n});\n\nconst filterPages = (visiblePages, totalPages) => visiblePages.filter((page) => page <= totalPages);\n\n//  1 ... 4 5 6 ... 99\n// 1 2 3 4 5 ... 99\n// 1 ... 96 97 98 99\nconst getVisiblePages = (page, total) => {\n  // console.log('ReactTablePagination.js:getVisiblePages, page', page);\n  if (total < 7) {\n    return filterPages([1, 2, 3, 4, 5, 6], total);\n  }\n  if (page % 5 >= 0 && page > 4 && page + 2 < total) {\n    return [1, page - 1, page, page + 1, total];\n  } if (page % 5 >= 0 && page > 4 && page + 2 >= total) {\n    return [1, total - 3, total - 2, total - 1, total];\n  }\n  return [1, 2, 3, 4, 5, total];\n};\n\nPaginationWidget.propTypes = {\n  page: PropTypes.number,\n  pages: PropTypes.number,\n  pageSize: PropTypes.number,\n  defaultPageSize: PropTypes.number,\n  totalRows: PropTypes.number,\n  onPageChange: PropTypes.func,\n  onPageSizeChange: PropTypes.func,\n  showPageSize: PropTypes.bool,\n};\n\nPaginationWidget.defaultProps = {\n  page: 1,\n  showPageSize: true,\n};\nexport default PaginationWidget;\n","import React, { useEffect } from 'react';\nimport {\n  useTable,\n  useSortBy,\n  useFlexLayout,\n  useResizeColumns,\n  useExpanded,\n} from 'react-table';\nimport './ReactTableFlex.scss';\nimport { Spinner } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport PaginationWidget from './PaginationWidget';\nimport { DefaultTableState } from './constants';\nimport { NoDataComponent } from './Table';\n\nconst defaultColumn = {};\n\n/*\n * Generic Paged Table component using hook-based React-table-7\n * Uses Flex Layout\n * Filtering and sorting is executed server-side.\n * Filtering controls are outside of the table component.\n *\n */\nconst PagedTable = (props) => {\n  const {\n    // instance methods and props\n    getTableProps,\n    getTableBodyProps,\n    headerGroups,\n    rows,\n    prepareRow,\n    // setFilter,\n    // setGlobalFilter,\n    state: { sortBy },\n\n\n  } = useTable(\n    // config\n    {\n      columns: props.columns,\n      data: props.data,\n      defaultColumn, // defaults to {}\n      initialState: {\n        ...DefaultTableState,\n        ...props.initialState,\n      },\n      manualPagination: true, // tells pagination hook that we handle data fetching manually (must provide pageCount)\n      manualSortBy: true, // letting server do the sorting,\n      disableSortRemove: true, // disable 3rd click to turn off sort\n      disableMultiSort: true,\n      autoResetExpanded: true,\n       //isStateControlled ?\n      useControlledState:  (state) =>\n\n          // this fires on any state change\n          React.useMemo(\n            () => ({\n              ...state,\n              selectedRowIds:props.selectedRowIds ?? [],\n              hiddenColumns: props.hiddenColumns ?? [],\n              // expanded:props.expandedRows ?? []\n            }),\n            [state, props.selectedRowIds, props.hiddenColumns, props.expandedRows],\n          )\n\n       // : (state) => state,\n    },\n    // hooks\n    useSortBy,\n    useFlexLayout,\n    useResizeColumns,\n    useExpanded,\n  );\n\n  useEffect(() => {\n    if (sortBy.length && props.setSort) {\n      const { desc } = sortBy[0]; // just doing single sort\n      props.setSort(sortBy);\n      props.setSortDir &&  props.setSortDir(desc ? 'desc' : 'asc');\n    }\n  }, [sortBy]);\n\n\n  return (\n    <div className={classnames('table-container', { loading: props.loading })}>\n      {/* eslint-disable-next-line react/destructuring-assignment */}\n      {!props.loading && props.data.length === 0 && (\n        <NoDataComponent>{props.noDataMessage}</NoDataComponent>\n      )}\n\n      {props.loading && (\n        <div className=\"table-loader\">\n          <div>\n            <Spinner color=\"secondary\" />\n          </div>\n        </div>\n      )}\n\n      {props.data.length > 0 && (\n        <>\n          <div\n            className={`table flex-table ${[props.className]}`}\n            {...getTableProps()}\n          >\n            {props.noHeader !== true && (\n              <div className=\"thead\">\n                {headerGroups.map((headerGroup, groupIndex) => (\n                  <div\n                    key={groupIndex}\n                    {...headerGroup.getHeaderGroupProps()}\n                    className=\"thr\"\n                  >\n                    {headerGroup.headers.map((header, i) => {\n                      // three new addition to column: isSorted, isSortedDesc, getSortByToggleProps\n\n                      const {\n                        render,\n                        getHeaderProps,\n                        isSorted,\n                        isSortedDesc,\n                        getSortByToggleProps,\n                        // resizer\n                        isResizing,\n                        getResizerProps,\n                        canSort,\n                        headerClassName,\n                      } = header;\n\n                      const { onClick, ...rest } = getHeaderProps(\n                        getSortByToggleProps(),\n                      );\n\n                      return (\n                        <div\n                          key={`th-${i}`}\n                          className={classnames([\n                            'th',\n                            headerClassName,\n                            {\n                              sortable: canSort,\n                              desc: isSorted && isSortedDesc,\n                              asc: isSorted && !isSortedDesc,\n                            },\n                          ])}\n                          {...rest}\n                          // getHeaderProps now receives a function\n                        >\n                          <div onClick={onClick}>{render('Header')}</div>\n\n                          {canSort && (\n                            <div\n                              className={classnames([\n                                'sort-icon',\n                                { 'sort-active': isSorted },\n                              ])}\n                            >\n                              {isSorted && !isSortedDesc && (\n                                <FaIcon icon=\"sort-up\" size=\"sm\" />\n                              )}\n                              {isSorted && isSortedDesc && (\n                                <FaIcon icon=\"sort-down\" size=\"sm\" />\n                              )}\n                              {!isSorted && <FaIcon icon=\"sort\" size=\"sm\" />}\n                            </div>\n                          )}\n\n                          {/* resizer div */}\n                          <div\n                            {...getResizerProps()}\n                            className={`resizer ${\n                              isResizing ? 'isResizing' : ''\n                            }`}\n                          />\n                        </div>\n                      );\n                    })}\n                  </div>\n                ))}\n              </div>\n            )}\n\n\n            <div className=\"tbody\" {...getTableBodyProps()}>\n              {rows.map((row, i) => {\n                prepareRow(row);\n                return (\n                  <React.Fragment key={`rt-tb-trs${i}`}>\n                    <div\n                      className={classnames(['tr', { odd: i % 2 !== 1 }])}\n                      {...row.getRowProps()}\n                    >\n                      {row.cells.map((cell) => (\n                        <div\n                          key={i}\n                          {...cell.getCellProps({\n                            className: `td ${cell.column.className || ''}`,\n                            style: cell.column.style,\n                          })}\n                        >\n                          {cell.render('Cell')}\n                        </div>\n                      ))}\n                    </div>\n                    {row.isExpanded && props.renderRowSubcomponent ? (\n                      <div className=\"tr subcomponent\">\n\n                          {props.renderRowSubcomponent(row, props.reload)}\n\n                      </div>\n                    ) : null}\n                  </React.Fragment>\n                );\n              })}\n            </div>\n          </div>\n\n          <PaginationWidget\n            page={props.page}\n            pages={props.pageCount}\n            pageSize={props.limit}\n            defaultPageSize={25}\n            totalRows={props.totalRows}\n            totalCapped={props.totalCapped}\n            onPageChange={props.setPage}\n            onPageSizeChange={props.setLimit}\n            showPageSize\n          />\n        </>\n      )}\n    </div>\n  );\n};\n\nPagedTable.propTypes = {\n  loading: PropTypes.bool,\n  data: PropTypes.array,\n  columns: PropTypes.array,\n  defaultColumn: PropTypes.object,\n\n  totalRows: PropTypes.number,\n  pageCount: PropTypes.number,\n  page: PropTypes.number,\n  limit: PropTypes.number,\n  sort_by: PropTypes.string,\n  sort_dir: PropTypes.string,\n  setPage: PropTypes.func,\n  setLimit: PropTypes.func,\n  setSort: PropTypes.func,\n  noDataMessage: PropTypes.string,\n  noHeader: PropTypes.bool,\n  className: PropTypes.string,\n  renderRowSubcomponent: PropTypes.func,\n  disableFilters : PropTypes.bool,\n\n  // Table state\n  initialState: PropTypes.object,\n  hiddenColumns: PropTypes.array, // list of col ids: ['status', ...]\n  selectedRowIds: PropTypes.object,\n  expandedRows: PropTypes.object, // {1:true,2:false, ...}\n};\n\nPagedTable.defaultProps = {\n  data: [],\n  initialState: {},\n  initialSort: [],\n  hiddenColumns: [],\n  noDataMessage: 'No rows found',\n  className: '',\n  defaultColumn: { width: 'auto', minWidth: 100 },\n};\n\nexport default PagedTable;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  DropdownItem, DropdownMenu, DropdownToggle, UncontrolledDropdown,\n} from 'reactstrap';\nimport { TimezoneOptions } from './FormCommon';\n\nexport const TimezoneSelect = ({\n                          defaultTimezone = 'America/Los_Angeles',\n                          selectedTimezone,\n                          onSelectTimezone,\n                          alignRight = true,\n}) => (\n  <UncontrolledDropdown>\n    <DropdownToggle tag=\"a\" className=\"timezone-toggle p-0 mt-1 link\" caret size=\"sm\" color=\"transparent\">\n      <TimezoneDisplay timezone={selectedTimezone || defaultTimezone} />\n    </DropdownToggle>\n    <DropdownMenu end={alignRight}>\n      {TimezoneOptions.map((zone, i) => (\n        <DropdownItem\n          value={zone.value}\n          key={i}\n          onClick={() => onSelectTimezone(zone.value)}\n        >\n          {zone.name}\n        </DropdownItem>\n      ))}\n    </DropdownMenu>\n  </UncontrolledDropdown>\n);\n\nTimezoneSelect.propTypes = {\n  defaultTimezone: PropTypes.string,\n  onSelectTimezone: PropTypes.func.isRequired,\n  selectedTimezone: PropTypes.string.isRequired,\n  alignRight: PropTypes.bool,\n};\n\nexport const TimezoneDisplay = ({ timezone }) => (\n  timezone ? (<span className=\"tz-display\">\n    {TimezoneOptions.find((opt) => opt.value === timezone)?.name}\n  </span>) : null\n);\n\nTimezoneDisplay.propTypes = {\n  timezone: PropTypes.string,\n};\n\n\n","import React, { useState } from 'react';\nimport 'react-date-range/dist/styles.css'; // main style file\nimport 'react-date-range/dist/theme/default.css'; // theme css file\nimport { DateRangePicker } from 'react-date-range';\nimport { DropdownMenu, DropdownToggle, Dropdown } from 'reactstrap';\nimport {\n  format, startOfDay, endOfDay, isSameDay, differenceInCalendarDays, addDays,\n} from 'date-fns';\nimport PropTypes from 'prop-types';\n\nconst dateFormat = 'MMM d, yyyy';\n\nconst StartOfDay = startOfDay(new Date());\nconst EndOfToday = endOfDay(new Date());\n\n// Inputs at bottom left where you can input \"n days up to today\"\n// We aren't using the default input ranges because those allow future dates\nconst InputRanges = [{\n  label: 'days up to today',\n  range: function range(value) {\n    return {\n      startDate: addDays(StartOfDay, (Math.max(Number(value), 1) - 1) * -1),\n      endDate: EndOfToday,\n      widget: 'daysUpTo',\n    };\n  },\n  getCurrentValue: function getCurrentValue(range) {\n    if (!isSameDay(range.endDate, EndOfToday)) return '-';\n    if (!range.startDate) return '∞';\n    return differenceInCalendarDays(EndOfToday, range.startDate) + 1;\n  },\n}];\n\nconst DateRangeDropdown = ({\n  startDate, endDate, onSelect, useEndOfDay = true, allowFuture = true,\n}) => {\n  const [isOpen, setIsOpen] = useState(false);\n\n  const toggleMe = () => setIsOpen(!isOpen);\n\n  // TODO: might need controlled menu so we can close on select\n  const handleChange = (dr) => {\n    // console.log('DateRangeDropdown.js:handleChange', dr);\n\n    // Pre-defined ranges will set endDate to 23:59:59\n    // but manually selected ranges will set endDate time to beginning of the day.\n\n    if (useEndOfDay) {\n      dr.selection.endDate = endOfDay(dr.selection.endDate);\n    }\n\n    // setState([dr.selection]);\n    onSelect(dr.selection);\n\n    // Close automatically if range is selected\n    // Unfortunately this means if you intend to select just today (either in defined ranges or in calendar),\n    // it will not automatically close.\n    // (if you are just clicking one day, we don't know at this point if you just want that day or you intend to select a range)\n\n    // dr.selection.widget: kludge to prevent menu from closing if you are filling out the 'days up to' field.\n    // So if you mean to type '12' it won't close at '1'.\n    if (!dr.selection.widget && !isSameDay(dr.selection.startDate, dr.selection.endDate)) {\n      setIsOpen(false);\n    }\n  };\n\n  if (!startDate || !endDate) return (null);\n\n  return (\n    <Dropdown isOpen={isOpen} toggle={toggleMe}>\n      <DropdownToggle nav caret className=\"react-bootstrap-daterangepicker-container p-0\">\n        {`${format(startDate, dateFormat)} - ${format(endDate, dateFormat)}`}\n      </DropdownToggle>\n      <DropdownMenu\n        end\n        className=\"date-range-dropdown\"\n        modifiers={[\n          {\n            name: 'preventOverflow',\n            options: { enabled: true },\n          },\n          {\n            name: 'flip',\n            options: {\n              enabled: true,\n              flipVariations: true,\n              flipVariationsByContent: true,\n              behavior: ['bottom', 'top', 'bottom'],\n            },\n          },\n        ]}\n      >\n        <DateRangePicker\n          onChange={handleChange}\n          showSelectionPreview\n          moveRangeOnFirstSelection={false}\n          preventSnapRefocus={false}\n          months={2}\n          ranges={[{\n            startDate,\n            endDate,\n            key: 'selection',\n          }]}\n          direction=\"horizontal\"\n          maxDate={allowFuture ? null : new Date()}\n          inputRanges={InputRanges}\n        />\n      </DropdownMenu>\n\n    </Dropdown>\n  );\n};\n\nDateRangeDropdown.propTypes = {\n  startDate: PropTypes.object,\n  endDate: PropTypes.object,\n  onSelect: PropTypes.func,\n  useEndOfDay: PropTypes.bool, // force end of date range to have end of day time\n  allowFuture: PropTypes.bool,\n};\n\nexport default DateRangeDropdown;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { TimezoneSelect, TimezoneDisplay } from '../Form/TimezoneSelect';\nimport DateRangeDropdown from '../Form/DateRangeDropdown';\nimport {FilterControls} from \"./Filter\";\n\n/*\n * A filter bar section with a date picker, refresh/execute button, and clear filter button\n * Meant to be aligned on right side of filter bar\n *\n * If an update function is not provided for each item it will not be shown\n *\n * onExecute and onRefresh technically would do the same thing, but the former shows\n * a labelled button and the latter has a refresh icon. We use 'execute' for reports\n * because the report does not auto-update when you change the filters; you have to click\n * 'view report'. So it makes more sense to have such a button rather than a refresh symbol\n *\n * NOTE: The date picker functionality for this is mostly deprecated in favor of DateRangeSelect\n * from the component library. We still use this for date in the old reports (looker) and accounting activity list\n */\nconst RightDateAndControls = ({\n  startDate,\n  endDate,\n  onChangeDate,\n  onRefresh,\n  onReset,\n  onExecute,\n  onSelectTimezone,\n  timezone,\n  defaultTimezone,\n  allowFuture = false,\n  isLoading,\n  executeLabel = 'Apply',\n  className = '',\n}) => (\n  <div className={`right-date-controls ${className}`}>\n    <div className=\"d-flex flex-grow-2 justify-content-end align-items-center\">\n\n      {onChangeDate && (\n      <div className=\"d-flex flex-column align-items-end me-3\">\n\n        <DateRangeDropdown\n          startDate={startDate}\n          endDate={endDate}\n          onSelect={onChangeDate}\n          allowFuture={allowFuture}\n        />\n\n        { (timezone || defaultTimezone)\n              && (\n              <>\n                {typeof onSelectTimezone === 'function' ? (\n                  <TimezoneSelect\n                    defaultTimezone={defaultTimezone}\n                    selectedTimezone={timezone}\n                    onSelectTimezone={onSelectTimezone}\n                  />\n                ) : (\n                  <TimezoneDisplay timezone={timezone || defaultTimezone} />\n                )}\n              </>\n        )}\n\n      </div>\n      )}\n\n      <FilterControls\n        onExecute={onExecute}\n        onReset={onReset}\n        onRefresh={onRefresh}\n        isLoading={isLoading}\n        executeLabel={executeLabel}\n      />\n    </div>\n  </div>\n);\n\nRightDateAndControls.propTypes = {\n  startDate: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n  endDate: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n  allowFuture: PropTypes.bool,\n  onChangeDate: PropTypes.func,\n  onRefresh: PropTypes.func,\n  onReset: PropTypes.func,\n  onExecute: PropTypes.func,\n  onSelectTimezone: PropTypes.func,\n  timezone: PropTypes.string,\n  defaultTimezone: PropTypes.string,\n  isLoading: PropTypes.bool,\n  executeLabel: PropTypes.bool,\n  className: PropTypes.string,\n};\n\nexport default RightDateAndControls;\n","/*\n * Components and helpers for use with react-table and table data formatting\n * @see https://react-table.tanstack.com/\n */\nimport React from 'react';\nimport classnames from 'classnames';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {\n  parseJSON, format as formatDate, isDate, isValid as isValidDate,\n} from 'date-fns';\nimport { format as formatDateTz, utcToZonedTime } from 'date-fns-tz';\nimport { Spinner } from 'reactstrap';\nimport NumberFormat from 'react-number-format';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\n\n// For translating values in vertical column\nexport const VerticalMap = {\n  'auto-insurance': 'Auto Insurance',\n  autoins: 'Auto Insurance',\n  'auto-warranty': 'Auto Warranty',\n  autowarranty: 'Auto Warranty',\n  debt: 'Debt',\n  'disability-benefits': 'Disability Benefits',\n  education: 'Education',\n  'final-expense': 'Final Expense',\n  'health-insurance': 'Health Insurance',\n  healthins: 'Health Insurance',\n  'home-insurance': 'Home Insurance',\n  homeins: 'Home Insurance',\n  jobs: 'Jobs',\n  legal: 'Legal',\n  'life-insurance': 'Life Insurance',\n  lifeins: 'Life Insurance',\n  'medical-alert-device': 'Medical Alert Device',\n  medicare: 'Medicare',\n  mortgage: 'Mortgage',\n  'non-profit': 'Non-Profit',\n  pathways: 'Pathways',\n  'personal-loan': 'Personal Loan',\n  rewards: 'Rewards',\n  roofing: 'Roofing',\n  solar: 'Solar',\n  ssdi: 'SSDI',\n  'tax-debt': 'Tax Debt',\n  windows: 'Windows',\n};\n\n// For translating values in change log type column\nexport const ChangeLogTypeMap = {\n  'order.updated': 'Order Updated',\n  'order.created': 'Order Created',\n  'order.status': 'Order Status',\n  'targetrule.bid': 'Bid',\n  'targetrule.deleted': 'Rule Deleted',\n  'targetrule.created': 'Rule Created',\n};\n\n// Labels for match and sale rejections\nexport const AuctionRejectionMap = {\n  'proxy_rejected:no match': 'Proxy Rejected: No Match',\n  'proxy_rejected:duplicate': 'Proxy Rejected: Duplicate',\n  'proxy_rejected:invalid': 'Proxy Rejected: Invalid',\n  'proxy_rejected:capped': 'Proxy Rejected: Capped',\n  'proxy_rejected:geo': 'Proxy Rejected: Geo',\n  'proxy_rejected:todo': 'Proxy Rejected: TODO',\n  'proxy_rejected:delivery_failure': 'Proxy Rejected: Delivery Failure',\n  'proxy_rejected:delivery_timeout': 'Proxy Rejected: Delivery Timeout',\n  'bid_floor': 'Bid Floor',\n  'bid_falloff': 'Bid Falloff',\n  'dedupe_scope': 'Dedupe (scope)',\n  'bid': 'Bid',\n  'cap': 'Cap',\n  'missing_ad': 'Missing Ad',\n  'suppression':'Suppression',\n  'dnc': 'DNC',\n  'proxy_rejected:': 'Proxy Rejected: Unknown',\n  'delivery_timeout': 'Delivery Timeout',\n  'timeout': 'Timeout',\n  'compliance': 'Compliance',\n}\nexport const CapTimeframeChoices = {\n  second: 'Per second',\n  minute: 'Per minute',\n  hourly: 'Hourly',\n  daily: 'Daily',\n  weekly: 'Weekly',\n  monthly: 'Monthly',\n  annual: 'Annually',\n  total: 'Total',\n};\n\n// Header that uses font awesome sort icons instead of the default box-shadow effect\n// Usage in table props: ThComponent={IconSortHeader}\n// This depends on sort props injected by getTheadThPropsWithSort\n// Turn off the box-shadow at .ReactTable .rt-thead .rt-th.-sort-asc  (and .-sort-desc)\nexport const IconSortHeader = (props) =>\n  // console.log('Leads.js:CustomHeader props', props);\n  // props.sorted is object {desc: true|false, id: \"first_name\"},  or it is undefined if never sorted\n  (\n    <div className={`rt-th ${props.className}`} style={props.style} onClick={props.toggleSort}>\n      {props.children}\n      {props.sortable\n    && (\n    <div className={classnames(['sort-icon', { 'sort-active': props.sorted }])}>\n      {props.sorted && props.sorted.desc === false && <FaIcon icon=\"sort-up\" size=\"sm\" />}\n      {props.sorted && props.sorted.desc === true && <FaIcon icon=\"sort-down\" size=\"sm\" />}\n      {!props.sorted && <FaIcon icon=\"sort\" size=\"sm\" />}\n    </div>\n    )}\n    </div>\n  )\n;\n\nexport const AnyCell = () => <span className='text-black-50'>- any -</span>;\n\n// Helper to display value or mdash for empty cells\nexport const displayValue = (value, fallback = <span>&mdash;</span>) => value ?? fallback;\n\n/*\n * Formatters\n * With ReactTable you can assign these in the column definition like:\n * Cell:MoneyFormatter\n */\nexport const MoneyFormatter = ({ value }) => (value\n  ? (<NumberFormat value={value} displayType=\"text\" thousandSeparator prefix=\"$\" decimalScale={2} fixedDecimalScale />)\n  : <>0</>);\n\n// Assumes E.164 format +15552220000\nexport const PhoneFormatter = ({ value }) => (value\n  ? (<NumberFormat value={value} displayType=\"text\" format=\"+###########\" />)\n  : '');\n\nexport const PercentFormatter = ({ value, decimals = 0 }) => (value\n  ? (<NumberFormat value={value} displayType=\"text\" thousandSeparator suffix=\"%\" decimalScale={decimals} />)\n  : <span>0</span>);\n\nexport const DateFormatter = ({ value, format = 'yyyy-MM-dd', timezone=null }) => {\n  if (!value) return <span>&mdash;</span>;\n   //console.log('Table.js:DateFormatter, date value', value, isDate(value));\n   if (Number.isInteger(value)) {\n     value = new Date(value);\n   }\n  const dt = isDate(value) ? value : value.indexOf('T') > 0 ? parseJSON(value) : new Date(value);\n\n  if (!isValidDate(dt)) return <span>&mdash;</span>;\n\n  if (timezone) {\n    // console.log('Table.js:DateFormatter format to timezone :dt, timezone', dt, timezone);\n    const tzDate = utcToZonedTime(dt, timezone);\n    return <span>{formatDateTz(tzDate, format, { timeZone: timezone })}</span>;\n  }\n\n  return <span>{formatDate(dt, format)}</span>;\n};\n\n// Seconds as hh:mm:ss\nexport const DurationFormatter = ({seconds}) => {\n  if (!seconds) return (null);\n\n  const sec = Math.ceil(seconds) % 60;\n  const minutes = Math.floor((seconds / 60) % 60);\n  const hours = Math.floor(seconds / 3600);\n\n  // hh:mm:ss ( no hours if zero)\n  return <span>{(hours ? `${hours}:` : '') + (`${minutes}`).padStart(hours ? 2 : 1, '0') + ':' + (`${sec}`).padStart(2, '0')}</span>;\n};\n\nexport const NoDataComponent = (props) => (\n  <div className={classnames('rt-noData', { loading: props.loading })}>\n    <StandardAlert color=\"light\">{props.children}</StandardAlert>\n  </div>\n);\n\nexport const LoadingComponent = (props) => (\n  <div className={classnames('-loading', { 'active -active': props.loading })}>\n    <div><Spinner color=\"secondary\" /></div>\n  </div>\n);\n","import React from 'react';\nimport classnames from 'classnames';\n\n/*\n * Container for react-table subcomponent\n */\nconst TableSubcomponent = ({ className, children }) => (\n  <div className={classnames(['subcomponent-container', className])}>\n\n    <div className=\"pointer\" />\n\n    <div className=\"subcomponent-contents\">\n      {children}\n    </div>\n\n  </div>\n);\n\nexport default TableSubcomponent;\n","export const DefaultTableState = {\n  sortBy: [], //  [{id: 'name', desc: false}]\n  expanded: {}, // {1:true, 2:false}   keys are table row ids\n  hiddenColumns: [], // list of column ids to hide\n  filters: [], // [{ id: 'name', value: 'Jane'}, { id: 'age', value: 21 }]\n  globalFilter: '', // string or function\n  selectedRowIds: {}, // {1:true, 2:false}   keys are table row ids\n};\n","import qs from 'query-string';\nimport { parse, format } from 'date-fns';\n\nconst startDateParams = ['from', 'after', 'start', 'startDate', 'purchased_after', 'received_after', 'since'];\nconst endDateParams = ['to', 'before', 'end', 'endDate', 'purchased_before', 'received_before'];\nconst arrayParams = ['fields', 'view_cols', 'selected_metrics']; // CSV parameters to convert to/from arrays\nconst defaultParseOptions = { parseNumbers: true, forceEndOfDay: false };\n\nexport function queryStringToFilters(queryString, dateFormat = 'yyyy-MM-dd', parseOptions={}) {\n  const params = qs.parse(queryString, { arrayFormat: 'bracket', ...defaultParseOptions, ...parseOptions });\n  const refDate = new Date();\n  const startParam = Object.keys(params).find((p) => startDateParams.includes(p));\n  const endParam = Object.keys(params).find((p) => endDateParams.includes(p));\n\n  //Transform to date. In some places we use relative dates like \"now-1h\"; pass these along as is.\n  if (startParam && params[startParam]) {\n    const dt = parse(params[startParam], dateFormat, refDate);\n    if (dt && !isNaN(dt)) {\n      params[startParam] = dt;\n    }\n  }\n\n\n  if (endParam && params[endParam]) {\n    const dt = parse(params[endParam], dateFormat, refDate);\n    if (dt && !isNaN(dt) ) {\n      params[endParam] = dt;\n    }\n\n  }\n\n  // Convert CSV array parameters to arrays\n  arrayParams.forEach(param => {\n    if (params[param] && typeof params[param] === 'string') {\n      params[param] = params[param].split(',').filter(Boolean);\n    }\n  });\n\n  return params;\n}\n\nexport function filtersToQueryString(filters, dateFormat = 'yyyy-MM-dd') {\n  const qsData = { ...filters };\n\n  // Format dates. Usually filter components provide data as data objects (fns requires this)\n  // But Auctions list uses relative phrases like 'now-1h' which go into the query string as such\n  const startParam = Object.keys(qsData).find((p) => startDateParams.includes(p));\n  const endParam = Object.keys(qsData).find((p) => endDateParams.includes(p));\n\n  if (startParam && qsData[startParam] && typeof qsData[startParam] === 'object') {\n    try {\n      qsData[startParam] = format(qsData[startParam], dateFormat);\n    } catch (e) {\n    }\n\n  }\n\n  if (endParam && qsData[endParam] && typeof qsData[endParam] === 'object') {\n    try {\n      qsData[endParam] = format(qsData[endParam], dateFormat);\n    } catch (e) {\n    }\n  }\n\n  // remove empties\n  Object.keys(qsData).forEach((k) => !qsData[k] && delete qsData[k]);\n\n  // Convert array parameters to CSV strings\n  arrayParams.forEach(param => {\n    if (qsData[param] && Array.isArray(qsData[param])) {\n      qsData[param] = qsData[param].join(',');\n    }\n  });\n\n  return `?${qs.stringify(qsData, { arrayFormat: 'bracket' })}`;\n}\n","import React from 'react';\nimport EnhancedSelect from \"../Form/EnhancedSelect\";\nimport PropTypes from 'prop-types';\n\n// Styles for attribute selection, see https://react-select.com/styles\nconst AttributeSelectStyles = {\n  option: (provided, state) => ({\n    ...provided,\n    color: '#333',\n    margin: 0,\n    marginLeft: '4px',\n    padding: '2px',\n    fontSize: '0.85rem',\n  }),\n  groupHeading: (provided, state) => ({\n    ...provided,\n    color: '#572770',\n    fontWeight: 'bold',\n    margin: 0,\n    marginLeft: '4px',\n    padding: 0,\n    marginBottom: '3px',\n  }),\n  menu: (provided, state) => ({\n    ...provided,\n    zIndex: 5000,\n  }),\n};\n\n// Create array for use in attribute type select with grouped attribute options\nconst AttributeSelectOptions = (attributeGroups) => {\n  const options = Object.entries(attributeGroups).map(([groupName, groupAttributes]) => {\n    const group = { label: groupName, options: [] };\n    group.options = groupAttributes.map((attr) => ({ label: attr.label, value: attr.alias }));\n    return group;\n  });\n\n  return options;\n};\n\n/*\n * React-select for target attributes\n * attributeGroups is object with attribute data grouped by attribute group\n */\nconst TargetSelect = (props) =>  (\n    <EnhancedSelect\n      value={props.value}\n      options={AttributeSelectOptions(props.attributeGroups)}\n      styles={AttributeSelectStyles}\n      isMulti={false}\n      isSearchable\n      onChange={props.onChange}\n      placeholder=\"Search for target type\"\n    />\n  );\n\nTargetSelect.propTypes = {\n  value: PropTypes.string,\n  attributeGroups: PropTypes.object,\n  onChange: PropTypes.func,\n};\n\nTargetSelect.defaultProps = {\n  value:\"\", //the attribute alias\n  attributeGroups: {},\n};\n\nexport default TargetSelect;\n","import React from 'react';\nimport {\n  Row, Col, Input, Label, Card, CardBody, Button, ButtonGroup,\n} from 'reactstrap';\n// import {ConvertBoolean} from '../Form/FormCommon';\nimport PropTypes from 'prop-types';\nimport MaskedInput from 'react-text-mask';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport { useDebouncedCallback } from 'use-debounce';\nimport SimpleSelect from '../Form/SimpleSelect';\nimport { tokensToString } from '../../utils/string';\n\nconst IntegerMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  includeThousandsSeparator: false,\n  integerLimit: 6,\n});\n\nconst TargetValueForm = (props) => {\n  // Debounce used for text input. Because the rule configuration object can be large,\n  // updating it with each change can cause typing to lag.\n  const onChangeDebounced = useDebouncedCallback((val) => {\n    props.onChangeValue(val);\n  }, 300);\n\n  return (\n    <div className=\"target-value-form flex-grow-1\">\n      <FormOfType {...props} onChangeDebounced={onChangeDebounced} />\n    </div>\n  );\n};\n\nconst FormOfType = (props) => {\n  if (props.attribute) {\n    switch (props.attribute.input_type) {\n      case 'integer':\n        return (<IntegerInput {...props} />);\n      case 'integer_range':\n        return (<IntegerRange {...props} />);\n      case 'text':\n        return (<TextInput {...props} />);\n      case 'multiple_choice':\n      case 'dynamic_multiple_choice':\n      case 'state_choice':\n        return (Object.keys(props.attribute.options.choices).length >= 10)\n          ? (<MultipleChoiceSelect {...props} />)\n          : (<MultipleChoiceCheck {...props} />);\n      case 'choice':\n      case 'dynamic_choice':\n        return (<Choice {...props} />);\n      case 'boolean':\n        return (<BooleanChoice {...props} />);\n      case 'zipcode_list':\n      case 'county_list':\n      case 'list':\n        return (<TextAreaInput {...props} />);\n      case 'expression':\n        return (<TextAreaInput {...props} rows={3} />);\n    }\n  }\n\n  return (null);\n};\n\n/*\n * TargetValueForm\n * A set of components for different types of target attribute value inputs (multiple select, range, etc).\n * (Subcomponent of TargetForm)\n * Note: the onChangeValue function is debounced (TargetForm), so we use defaultValue attribute for inputs instead of 'value',\n * because it is then not directly tied to state.\n */\n\nconst IntegerInput = ({ attribute, value = '', onChangeDebounced }) => {\n  const label = attribute.options.hasOwnProperty('label') ? attribute.options.label : '';\n  return (\n    <Row>\n      <Col sm={3}>\n        <MaskedInput\n          mask={IntegerMask}\n          min={attribute.options.min}\n          max={attribute.options.max}\n          defaultValue={value}\n          name=\"value\"\n          onChange={(e) => onChangeDebounced(e.target)}\n          maxLength={6}\n          render={(ref, props) => <Input type=\"text\" innerRef={ref} className=\"teeny inp-int\" {...props} />}\n        />\n      </Col>\n      <Col>\n        <span>\n          {' '}\n          {label}\n        </span>\n      </Col>\n    </Row>\n  );\n};\n\nconst IntegerRange = (props) => (\n  <div className=\"form-inline integer-range d-flex align-items-center\">\n    <div className=\"mb-2 me-sm-2 mb-sm-0\">\n      <MaskedInput\n        mask={IntegerMask}\n        min={props.attribute.options.min}\n        max={props.attribute.options.max}\n        defaultValue={isNaN((props.value || {}).from) ? '' : props.value.from}\n        name=\"from\"\n        onChange={(e) => props.onChangeDebounced(e.target)}\n        render={(ref, props) => <Input type=\"text\" innerRef={ref} className=\"teeny inp-int\" {...props} />}\n      />\n    </div>\n    <Label for=\"input-range-max\" className=\"me-sm-2\">to</Label>\n    {/* defaultValue={(props.value || {}).to || \"\"} */}\n    <div className=\"mb-2 me-sm-2 mb-sm-0\">\n\n      <MaskedInput\n        mask={IntegerMask}\n        min={props.attribute.options.min}\n        max={props.attribute.options.max}\n        defaultValue={isNaN((props.value || {}).to) ? '' : props.value.to}\n        name=\"to\"\n        onChange={(e) => props.onChangeDebounced(e.target)}\n        render={(ref, props) => <Input type=\"text\" innerRef={ref} className=\"teeny inp-int\" {...props} />}\n      />\n    </div>\n  </div>\n);\n\n// This is the version that works with the IntegerRangeType dropdown\n// It still needs work to cover some edge cases\n// Example:   {\"attribute\":\"drivers.num_accidents_at_fault\",\"matches\":false,\"target\":\"primary\",\"value\":{\"from\":1,\"to\":null}},\n//     This must mean \"no accidents\"  (not 1 to null)\n//    But in new IntegerRange, resulting in '>= 1' because not taking into account the 'matches=false'\n//\n// or : {\"attribute\":\"drivers.num_tickets\",\"matches\":false,\"accept_unknown\":true,\"target\":\"primary\",\"value\":{\"from\":2,\"to\":null}},\n// This must mean \"tickets not greater than 2)   (not 2 to null)\n//  BUt in new IntegerRange, resulting in '>= 2' because not taking into account the 'matches=false'\n//\n// const IntegerRange = ({attribute, value, onChangeValue, integerRangeType}) => (\n//     <div className=\"form-inline\">\n//       {(integerRangeType === 'between' ||integerRangeType === 'not_between') && (\n//         <React.Fragment>\n//           <FormGroup  className=\"mb-2 me-sm-2 mb-sm-0\">\n//             <Input type=\"number\"\n//                    className=\"teeny\"\n//                    min={attribute.options.min}\n//                    max={attribute.options.max}\n//                    value={value.from || \"\"}\n//                    name=\"from\"\n//                    onChange={onChangeValue}\n//             />\n//           </FormGroup>\n//\n//           <FormGroup  className=\"mb-2 me-sm-2 mb-sm-0\" >\n//             <Label for=\"to\" className=\"me-sm-2\">and</Label>\n//             <Input type=\"number\"\n//                    className=\"teeny\"\n//                    min={attribute.options.min}\n//                    max={attribute.options.max}\n//                    value={value.to || \"\"}\n//                    name=\"to\"\n//                    onChange={onChangeValue}\n//             />\n//           </FormGroup>\n//           <FormText> (inclusive)</FormText>\n//         </React.Fragment>\n//       )}\n//\n//       {integerRangeType === 'greater_than'  && (\n//         <FormGroup  className=\"mb-2 me-sm-2 mb-sm-0\">\n//           <Input type=\"number\" id=\"input-range-min\"\n//                  className=\"teeny\"\n//                  min={attribute.options.min}\n//                  max={attribute.options.max}\n//                  value={value.from || \"\"}\n//                  name=\"from\"\n//                  onChange={onChangeValue}\n//           />\n//         </FormGroup>\n//       )}\n//\n//       {integerRangeType === 'less_than'  && (\n//         <FormGroup  className=\"mb-2 me-sm-2 mb-sm-0\">\n//           <Input type=\"number\" id=\"input-range-max\"\n//                  className=\"teeny\"\n//                  min={attribute.options.min}\n//                  max={attribute.options.max}\n//                  value={value.to || \"\"}\n//                  name=\"to\"\n//                  onChange={onChangeValue}\n//           />\n//         </FormGroup>\n//       )}\n//\n//       {integerRangeType === 'not_set'  && (null)}\n//\n//     </div>\n// );\n\nconst TextAreaInput = React.memo(({ value, onChangeDebounced, rows = 5 }) => (\n  <div>\n    <Input\n      type=\"textarea\"\n      defaultValue={tokensToString(value) || ''}\n      name=\"value\"\n      rows={rows}\n      onChange={(e) => onChangeDebounced(e.target)}\n    />\n  </div>\n));\nTextAreaInput.displayName = 'TextAreaInput';\n\nconst TextInput = React.memo(({ value, onChangeDebounced }) => (\n  <Row>\n    <Col>\n      <Input\n        type=\"text\"\n        defaultValue={value || ''}\n        name=\"value\"\n        onChange={(e) => onChangeDebounced(e.target)}\n      />\n    </Col>\n\n  </Row>\n\n));\nTextInput.displayName = 'TextInput';\n\nconst MultipleChoiceCheck = ({ attribute, value=[], onChangeValue }) => {\n  if (!attribute.options.hasOwnProperty('choices')) return (<span>No choices have been defined!</span>);\n  const arrChoices = Object.entries(attribute.options.choices);\n\n  if (!arrChoices.length) return (<span>No choices have been defined!</span>);\n\n  const checkAll = () => { onChangeValue(Object.keys(attribute.options.choices)); };\n  const checkNone = () => { onChangeValue([]); };\n\n\n  // Note: choice keys might be numeric, but selection is string (watch out when comparing)\n  return (\n    <Card className=\"target-value-options-card\">\n      <div className=\"batch-check\">\n        <Button color=\"link\" onClick={checkAll} size=\"xs\" className=\"me-2\">\n          All\n        </Button>\n        <Button color=\"link\" onClick={checkNone} size=\"xs\" className=\"me-2\">\n          None\n        </Button>\n      </div>\n\n      <CardBody>\n        <div>\n          {arrChoices.map(([choiceVal, label], i) => (\n            // Set key with attribute alias so checked status does not carry over\n            // when switching between components of this type\n\n              <div key={`${attribute.alias}-${i}`}>\n                <Label>\n                  <Input\n                    type=\"checkbox\"\n                    name={`${attribute.alias}-value`}\n                    value={choiceVal}\n                    checked={Array.isArray(value) ? Boolean(value.find(v =>  v.toString() === choiceVal.toString())) : value === choiceVal}\n                    onChange={onChangeValue}\n                  />\n                  {label}\n                </Label>\n              </div>\n            )\n          )}\n        </div>\n      </CardBody>\n    </Card>\n  );\n};\n\nconst MultipleChoiceSelect = ({ attribute, value, onChangeValue }) => {\n  if (!attribute.options.hasOwnProperty('choices')) return (<span>No choices have been defined!</span>);\n  const arrChoices = Object.entries(attribute.options.choices).map(([value, label]) => ({ value, label }));\n  if (!arrChoices.length) return (<span>No choices have been defined!</span>);\n  const selectedValues = Array.isArray(value) ? value.map((v) => v.toString()) : [];\n\n  return (\n    <div className=\"multi-choice-select\">\n      <SimpleSelect\n        defaultValue={selectedValues}\n        options={arrChoices}\n        controlShouldRenderValue\n        isMulti\n        isSearchable\n        onChange={onChangeValue}\n        placeholder={`Select ${attribute.label}`}\n      />\n    </div>\n  );\n};\n\nconst Choice = React.memo(({ attribute, value, onChangeValue }) => {\n  if (!attribute.options.hasOwnProperty('choices')) return (<span>No choices have been defined!</span>);\n  const arrChoices = Object.entries(attribute.options.choices);\n  if (!arrChoices.length) return (<span>No choices have been defined!</span>);\n\n  // Note: value comparison not strict in default checked so we can handle 2 == \"2\" wewqer\n\n  return (\n    <Card className=\"target-value-options-card\">\n      {/* <CardHeader>{props.attribute.label} Options</CardHeader> */}\n      <CardBody>\n        {arrChoices.map((opt, i) => (\n          <div key={i}>\n            <Label>\n              <Input\n                type=\"radio\"\n                name=\"value\"\n                value={opt[0]}\n                defaultChecked={value == opt[0]}\n                onChange={onChangeValue}\n                className=\"me-1\"\n              />\n              {opt[1]}\n            </Label>\n          </div>\n        )) }\n\n      </CardBody>\n    </Card>\n  );\n});\nChoice.displayName = 'Choice';\n\nconst BooleanChoice = ({ value, onChangeValue }) => (\n  <ButtonGroup className=\"yes-no\">\n\n    <Button\n      color={value ? 'success' : 'outline-secondary'}\n      type=\"button\"\n      name=\"value\"\n      value\n      onClick={onChangeValue}\n      className=\"me-1\"\n    >\n      Yes\n    </Button>\n\n    <Button\n      color={!value ? 'danger' : 'outline-secondary'}\n      type=\"button\"\n      name=\"value\"\n      value={false}\n      onClick={onChangeValue}\n    >\n      No\n    </Button>\n\n  </ButtonGroup>\n);\n\nTargetValueForm.propTypes = {\n  attribute: PropTypes.object.isRequired,\n  onChangeValue: PropTypes.func.isRequired,\n  value: PropTypes.any,\n  // integerRangeType:PropTypes.string\n};\n\nexport default TargetValueForm;\n","import React from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { PercentFormatter } from './Table/Table';\nimport { getDelta } from '../utils/math';\n\n// Calculates and displays percentage change between 2 numbers with up or down arrow.\n// Option for alerting of threshold overflow\nconst ValueDeltaDisplay = ({\n  oldValue, newValue, classNames, threshold,\n}) => {\n  const delta = getDelta(oldValue, newValue);\n  const overflow = threshold !== undefined && delta >= threshold;\n  const increase = delta > 0;\n\n  return (\n    <span className={classnames(['value-delta', classNames, { overflow }])}>\n      <FaIcon icon={increase ? 'arrow-up' : 'arrow-down'} size=\"sm\" color={increase ? 'green' : 'red'} className=\"me-1\" />\n      {overflow && <FaIcon icon=\"exclamation-triangle\" size=\"sm\" color=\"red\" className=\"me-1\" />}\n      <PercentFormatter value={Math.abs(delta)} decimals={1} />\n    </span>\n  );\n};\n\nValueDeltaDisplay.propTypes = {\n  classNames: PropTypes.string,\n  threshold: PropTypes.number,\n  oldValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  newValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n};\n\nValueDeltaDisplay.defaultProps = {\n  classNames: '',\n};\n\nexport default ValueDeltaDisplay;\n","import React, { FC, useState, useEffect } from 'react';\nimport {\n  Spinner,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {SizeProp} from \"@fortawesome/fontawesome-svg-core\";\nimport classnames from 'classnames';\n\n\ntype FaveHeartPropertiesType = {\n  isFavorite:boolean;\n  id: number;\n  size: SizeProp;\n  onChange?:(id:any, favorite:boolean) => any;\n  className?: string;\n}\n\n/*\n * Icon for indicating and toggling favorites\n */\nexport const FaveHeart:FC<FaveHeartPropertiesType> = ({\n  isFavorite,\n  id,\n  size=\"xs\",\n  onChange,\n  className\n }) => {\n\n  const [localState, setLocalState] = useState<boolean>(isFavorite);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const handleChange = () => {\n    console.log('FaveHeart.tsx: handleChagne');\n    if (!isLoading) {\n      updateFavorite(!isFavorite);\n    }\n  };\n\n  const updateFavorite = async (newState:boolean) => {\n\n    if (typeof onChange === 'function') {\n\n      setIsLoading(true);\n      setLocalState(newState);\n      await onChange(id, newState);\n      setIsLoading(false);\n      // TODO: could have alert icon if result false\n     // if (!updated) {\n        setLocalState(newState);\n     // }\n    }\n\n  };\n\n  useEffect(() => {\n    if (localState !== isFavorite) {\n      setLocalState(isFavorite);\n    }\n  }, [isFavorite]);\n\n  return (\n    <span key={id} className={classnames([\"fav-heart\", className])}>\n\n        <>\n          {isLoading ? (\n            <Spinner size={size} color=\"danger\" type=\"grow\" />\n          ) : (\n            <span onClick={handleChange} title=\"Toggle Favorite\" style={{cursor:'pointer'}}>\n            <FaIcon\n              //@ts-ignore\n              icon={isFavorite? 'heart' : ['far', 'heart']}\n              size={size}\n              className={classnames(['favorite-icon',  'me-2'],\n                {favorite:isFavorite})}\n              style={{color:isFavorite ? 'red' : 'inherit'}}\n            />\n            </span>\n          )}\n        </>\n    </span>\n\n  );\n};\n\nexport default FaveHeart;\n","import { useState, useContext } from 'react';\nimport { AppContext } from '../Providers/AppProvider';\n\n/*\n * Hook for using the global API class with functional components\n * Usage:\n *    // assign hook result to whatever variable you want\n *    const api = useApi('accounts', 'list');\n *    const data =  api.fetch(someRequestData);// call the api\n *    // Then use api.result, api.error\n *    useEffect( ()=>{ if(api.result) ...do stuff... }, [api.result, api.error]);\n *\n *    You can also get the result directly in an async wrapper:\n *    const getStuff = async() => { const stuff = await api.fetch(); ...do stuff...}\n *\n *   Or, use the api for any endpoint like this:\n *   const {api} = useApi()\n *   const data = await api.api.accounts.list(someRequestData)\n *   const moreData = await api.api.orders.show(orderId)\n */\nconst useApi = (resource, action) => {\n\n  const appContext = useContext(AppContext);\n  const [result, setResult] = useState(null);\n  const [error, setError] = useState({name:'', message:''});\n  const [isLoading, setIsLoading] = useState(false);\n  const endpoint = resource ? appContext.api.endpoints[resource] : null;\n  // if(!endpoint) throw new Error(`Unknown API endpoint ${resource}`);\n\n  const fetch = async (data) => {\n    if (!endpoint || !action) {\n      setError('Undefined endpoint or action');\n    }\n\n    setIsLoading(true);\n    const res = await endpoint[action](data);\n    setResult(res);\n    setIsLoading(false);\n    if (!res) {\n      setError(appContext.api.error); // object with name and message\n    } else {\n      if (error.name) {\n        setError({name:'', message:''});\n      }\n    }\n    return res;\n  };\n\n  return {\n    api: appContext.api, result, error, fetch, isLoading,\n  };\n};\n\nexport default useApi;\n","import { useState } from 'react';\nimport useApi from './useApi';\n// import useDidMount from '../Hooks/useDidMount'\n\n/*\n * Hook for using the global API class 'batchGet' with functional components,\n * Useful for populating multiple filters with dynamic data\n *\n * Usage:\n *    // assign hook result to whatever variable you want\n *    const api = useApi('accounts', 'list');\n *    //provide array of resources\n *    const batches =  await batcher.fetch( [\n *        {endpoint:'vendors',action:'list'},\n *        {endpoint:'verticals',action:'list'}\n *        {endpoint:'orders',action:'list',params:{account_id:10}}\n *        ])\n *    // You can handle api.result, api.error with useEffect\n *    useEffect( ()=>{ if(api.result) ...do stuff... }, [api.result, api.error]);\n *\n *\n */\nconst useApiBatch = () => {\n  const [result, setResult] = useState(null);\n  const [error, setError] = useState(null);\n  const [isLoading, setIsLoading] = useState(false);\n  const { api } = useApi();\n\n  const fetch = async (resources) => {\n    if (!Array.isArray(resources)) throw new Error('Resources must be an array');\n    setError(null);\n    setIsLoading(true);\n    const batches = await api.batchGet(resources);\n    setResult(batches);\n    setIsLoading(false);\n    if (!batches) {\n      setError(api.error); // object with name and message\n    }\n    return batches;\n  };\n\n  return {\n    result, error, fetch, isLoading,\n  };\n};\n\nexport default useApiBatch;\n","import {useDateRangeValue} from \"@thedmsgroup/mastodon-ui-components\";\nimport {intervalToDuration, differenceInSeconds} from \"date-fns\";\n\nexport const useChartInterval = () => {\n  const {valueToDate} = useDateRangeValue();\n\n  const unitLabels = {\n    ms: 'millisecond',\n    s: 'second',\n    m: 'minute',\n    h: 'hour',\n    d: 'day',\n    w: 'week',\n    M: 'month',\n    y: 'year',\n  }\n\n  /*\n   * Given an interval selection and time range values, convert to an API interval\n   * and scale the interval if needed.\n   * Examples:\n   * 'auto' for 'now-1h' (last hour) converts to '1m'\n   * '1m' for 'now-1h'  remains '1m'\n   * '1s' for 'now-1h' is scaled to '1m'\n   */\n  const intervalToApi = (interval, start, end, maxBuckets=60) => {\n    let scaledInterval;\n    if (interval === 'auto') {\n      interval = getAutoChartInterval(start, end);\n    } else {\n      scaledInterval = getScaledInterval( interval, start, end, maxBuckets)\n    }\n    return {interval, scaledInterval}\n  }\n\n  // convert the date selection (which might be an absolute date, or relative dates like 'now-1h')\n  // into start and end dates\n  const normalizeDateSelection = (start, end) => {\n    const startDate = valueToDate('start', start);\n    let endDate = valueToDate('end', end)\n\n    //Sometimes end dates are in the future, eg \"today\", \"this week\"\n    //In that case, change end date to now because we aren't getting date for the future\n    //so it will not be charted\n    const nowUTC = new Date();\n    if (endDate > nowUTC) {\n      endDate = nowUTC;\n    }\n    return {startDate, endDate}\n  }\n\n  const getAutoChartInterval = (start, end) => {\n    const {startDate, endDate } = normalizeDateSelection(start, end)\n    if (startDate && endDate && endDate > startDate) {\n      const { years, months,weeks, days, hours, minutes, seconds} = intervalToDuration({start:startDate, end: endDate})\n     // console.log(\"useChartInterval.js:\",`weeks: ${weeks}, days: ${days}, hours:${hours}, min:${minutes}, sec:${seconds}` );\n      if (years > 0) {\n        return years > 1 ? '1y' : '1w';\n      } else if (months > 0) {\n        return months > 2 ? '1w' : '1d'\n      } else if (weeks > 0) {\n        if (weeks === 1) {\n          return '3h'\n        } else if (weeks < 8) {\n          return '12h'\n        }\n        return '1d'\n      } else if (days > 0) {\n        if (days < 2) {\n          return '30m'\n        } else if (days < 5) {\n          return '1h'\n        }\n        return '3h';\n      } else if (hours > 0 ) {\n        if (hours < 3) {\n          return '1m'\n        } else if (hours < 8) {\n          return '5m'\n        } else if (hours < 17) {\n          return '10m'\n        }\n        return '30m';\n      } else if (minutes > 0 ) {\n        if (minutes <= 2) {\n          return '1s'\n        } else if (minutes <= 5) {\n          return '5s'\n        } else if (minutes <= 10) {\n          return '10s'\n        }\n        return '30s';\n      } else if (seconds > 0 ) {\n        if (seconds <= 10) {\n          return '200ms'\n        } else if (seconds <= 10) {\n          return '400ms'\n        }\n        return '1s';\n      }\n\n    }\n\n\n    return '';\n  }\n\n  const getIntervalLabel = (interval, showOne) => {\n    let label = '';\n    if (interval && typeof interval === 'string') {\n      const {amount, unit} = parseInterval(interval);\n      if (amount && unit) {\n        const unitLabel = unitLabels[unit];\n        if (unitLabel) {\n          label = `${unitLabel}${amount > 1 ? 's':''}`\n          if (amount > 1 || showOne) {\n            label = `${amount} ${label}`\n          }\n        }\n      }\n    }\n    return label\n  }\n\n\n  /*\n   * Get an adjusted interval if the given interval would produce too many chart buckets.\n   */\n  const getScaledInterval = (interval, start, end, maxBuckets=60) => {\n    let newInterval;\n    const {startDate, endDate } = normalizeDateSelection(start, end)\n\n    if (startDate && endDate && endDate > startDate) {\n\n      const durationSec = differenceInSeconds(endDate, startDate);\n      const intervalSec = intervalToSeconds(interval);\n      if (intervalSec && durationSec > intervalSec) {\n        //given interval makes too many chart buckets\n        if (Math.ceil(durationSec / intervalSec) > maxBuckets) {\n\n          const scale = ['1s', '30s', '1m', '5m', '10m', '30m', '1h', '3h', '12h', '1d', '1w', '1M', '1q'];\n          const scaleIndex = scale[interval] ? scale.indexOf(interval) : 0;\n          if (scaleIndex < scale.length - 1) {\n            for (let i = scaleIndex + 1; i < scale.length - 1; i++) {\n              const intervalSec = intervalToSeconds(scale[i]);\n              if (Math.ceil(durationSec / intervalSec) <= maxBuckets) {\n                newInterval = scale[i];\n                break;\n              }\n            }\n          }\n\n        }\n      }\n    }\n\n    return newInterval;\n  }\n\n  const intervalToSeconds = (interval) => {\n    const {amount, unit} = parseInterval(interval);\n    if (amount && unit) {\n      switch(unit) {\n        case 's':\n          return amount * 1;\n        case 'm':\n          return amount * 60;\n        case 'h':\n          return amount * 60 * 60;\n        case 'd':\n          return amount * 24 * 60 * 60;\n        case 'w':\n          return amount * 7 * 24 * 60 * 60;\n        case 'M':\n          return amount * 30 * 7 * 24 * 60 * 60;\n      }\n    }\n    return 0;\n  }\n\n  // const intervalUnitToSeconds = (unit) => {\n  //\n  //     switch(unit) {\n  //       case 's':\n  //         return 1;\n  //       case 'm':\n  //         return 60;\n  //       case 'h':\n  //         return 60 * 60;\n  //       case 'd':\n  //         return 24 * 60 * 60;\n  //       case 'w':\n  //         return 7 * 24 * 60 * 60;\n  //       case 'M':\n  //         //approximate\n  //         return 30 * 7 * 24 * 60 * 60;\n  //       default:\n  //         return 0;\n  //     }\n  //\n  // }\n\n  const parseInterval = (interval) => {\n    const result = {amount:null, unit: null}\n    if (typeof interval === 'string') {\n      const matches = interval.match(/(\\d+)([a-zA-Z]+)/)\n      if (matches && matches.length >= 3) {\n        result.amount = matches[1];\n        result.unit = matches[2];\n      }\n    }\n    return result;\n  }\n\n  return {intervalToApi, getAutoChartInterval, getIntervalLabel, getScaledInterval}\n}\n","import { useState } from 'react';\n\n/**\n * Hook used by components that handle an array of objects where items can be deleted or added,\n * or change state between display and edit mode, or delete prompt mode.\n *\n * Note: this only tracks what type of work is being done on what index. It does not\n * modify the collection.\n *\n * Use like:\n *   const{\n *   api:collection,\n *   willDeleteIndex,\n *   editIndex,\n *   addMode} = useCollectionTracker();\n *\n *   collection.apply(), etc\n */\nconst useCollectionTracker = () => {\n  const [activeIndex, setActiveIndex] = useState(null);\n  const [editIndex, setEditIndex] = useState(null);\n  // willDelete: if not null, show prompt for this item\n  const [willDeleteIndex, setWillDeleteIndex] = useState(null);\n  // addMode generally controls whether the add button is shown (hide if addMode)\n  // (usually we only add one at a time)\n  const [addMode, setAddMode] = useState(false);\n\n  // Done editing\n  const apply = () => {\n    setEditIndex(null);\n    setActiveIndex(null);\n    setAddMode(false);\n  };\n\n  // switch to edit mode\n  const edit = (index) => {\n    setEditIndex(index);\n    setActiveIndex(index);\n    setWillDeleteIndex(null);\n    setAddMode(false);\n  };\n\n  const add = (newIndex) => {\n    setActiveIndex(newIndex);\n    setWillDeleteIndex(null);\n    setEditIndex(newIndex);\n    setAddMode(true);\n  };\n\n  const onDelete = () => {\n    setWillDeleteIndex(null);\n    setAddMode(false);\n    setEditIndex(null);\n  };\n\n  return {\n    api: {\n      apply,\n      edit,\n      add,\n      onDelete,\n      setWillDeleteIndex,\n    },\n    willDeleteIndex,\n    editIndex,\n    activeIndex,\n    addMode,\n  };\n};\n\nexport default useCollectionTracker;\n","import React, { useState, useEffect } from 'react';\n\n// Used to prevent useEffect from making change on mount\n// const didMount = useDidMount();\n// useEffect(() => { if(didMount) ... do stuff...}, []);\nconst useDidMount = () => {\n  const [didMount, setDidMount] = useState(false);\n  useEffect(() => setDidMount(true), []);\n  return didMount;\n};\n\nexport default useDidMount;\n","\n/* A hook that works around an iMask issue.\n * https://github.com/uNmAnNeR/imaskjs/issues/881\n * iMask recommends using their 'onAccept' as a change handler,\n * but unfortunately it will fire on load, causing our form\n * validator to falsely believe the form has changed.\n * This hook checks for an event, and fires the provided callback\n * if a user event exists.\n *\n * The callback should accept \"value\" at minimum, but could accept (value, mask, event)\n * https://github.com/uNmAnNeR/imaskjs/tree/master/packages/react-imask\n *\n * usage:\n * const myHandler = (val) => console.log('the value from the masked input!', val)\n * You can just use 'onAccept', or call it your own name\n * const {onAccept:myAcceptHandler} = useImaskNiceAccept(myHandler)\n * <MaskedInput onAccept={myAcceptHandler} ...other props... />\n *\n * TODO: incorporate this workaround into the UI library component \"MaskedInput\"\n*/\nconst useImaskNiceAccept = (callback) => {\n\n  const onAccept = (value, mask, evt) => {\n    if (evt && typeof callback === 'function') {\n      callback(value, mask, evt);\n    }\n  }\n  return {onAccept}\n}\n\nexport default useImaskNiceAccept\n","import { useEffect, useReducer } from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport qs from 'query-string';\nimport { filtersToQueryString, queryStringToFilters } from '../Components/Table/queryString';\nimport isEqual from \"react-fast-compare\";\n\nconst DefaultControls = {\n  page: 1,\n  limit: 20,\n  sort_by: '',\n  sort_dir: '',\n};\n\nconst DefaultOptions = {\n  // Read and set query string\n  // In some cases we use this hook in a secondary table (like change log)\n  // and don't want to alter the query string\n  useQueryString: false,\n  // track page, limit, sort values\n  useTableControls: true,\n  // Options to either restrict filters to a given set, or ignore query string parameters.\n  // Useful for when multiple components are updating and reacting to the query string\n  // and we don't want the components to react to irrelevant parameters.\n  // If neither are set, all query string parameters are considered filters or controls, and\n  // any change can cause an update.\n  ignore:[],\n  restrict:[],\n  // Update query string when filters change\n  // Sometimes where we have a lot of filters we prefer to execute the fetch\n  // on clicking a button, to reduce queries\n  updateOnFilterChange: true,\n  urlDateFormat: undefined,\n  parseOptions: {parseNumbers: false}\n};\n\nconst TableStateReducer = (state, action) => {\n  // Name can be field name or a named action\n  const { name, value } = action;\n\n  switch (name) {\n    case 'controls':\n      return { ...state, controls: value };\n    case 'page':\n      return { ...state, controls: { ...state.controls, page: value }, tableEvent: 'page' };\n    case 'sort':\n      return { ...state, controls: { ...state.controls, ...value }, tableEvent: 'sort' };\n    case 'sortBy':\n      return { ...state, controls: { ...state.controls, sort_by: value }, tableEvent: 'sort' };\n    case 'sortDir':\n      return { ...state, controls: { ...state.controls, sort_dir: value }, tableEvent: 'sort' };\n    case 'limit':\n      return { ...state, controls: { ...state.controls, limit: value }, tableEvent: 'limit' };\n    case 'filters':\n      return {\n        ...state, filters: value, controls: { ...state.controls, page: 1 }, tableEvent: 'filters',\n      };\n    case 'currentQuery':\n      return { ...state, currentQuery: value };\n    case 'tableEvent':\n      return { ...state, tableEvent: value };\n    case 'navigation':\n      // user navigates (eg, uses back button)\n      // value.controls, value.filters\n      return { ...state, ...value, tableEvent: 'navigation' };\n    case 'reset':\n      return { ...state, ...value, tableEvent: 'reset' };\n    default:\n      return state;\n  }\n};\n\n/*\n * Hook for maintaining the state of query parameters for a paged table.\n * Keeps state of any and all filters as well as controls for page, limit, sort, etc.\n * Optionally updates the query string with the current state, or responds to query string\n * changes such as back button.\n *\n * Despite the name, the data does not have to be paged.\n *\n * Note: it's useful to keep table \"controls\" (page, limit, etc) separate from filters\n * because different components handle them.\n * We use this hook for LiveFilterProvider (context for \"live\" filtering) which does not use\n * table controls like paging\n */\nconst usePagedTableState = (initialFilters = {}, initialControls = {}, options = {}) => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  options = { ...DefaultOptions, ...options };\n\n  const controlsFromQueryString = () => {\n    if (!options.useTableControls) {\n      return {};\n    }\n    let controls = { ...DefaultControls, ...initialControls };\n\n    if (options.useQueryString && location.search) {\n      const qsData = qs.parse(location.search);\n      const {\n        page, limit, sort_by, sort_dir,\n      } = qsData;\n      controls = {\n        ...controls, page: parseInt(page) || 1, limit: parseInt(limit) || DefaultControls.limit, sort_by, sort_dir,\n      };\n    }\n    return controls;\n  };\n\n  const initFilters = (state) => {\n\n    // Populate from query string, or use default values\n    if (options.useQueryString && location.search) {\n      const qsData = queryStringToFilters(location.search, options.urlDateFormat, options.parseOptions);\n\n      // separate filters from table control\n      const controlKeys = new Set(['page', 'limit', 'sort_by', 'sort_dir']);\n      const filters = Object.fromEntries(\n        Object.entries(qsData).filter(([key]) => !controlKeys.has(key))\n      );\n\n      // Merge query-string filters on top of provided initial filters\n      state.filters = reduceFilters({ ...state.filters, ...filters });\n    }\n\n    state.filters = reduceFilters(state.filters);\n    return state;\n  };\n\n  //Reduce filters to those allowed by options, if set\n  const reduceFilters = (filters) => {\n    let reduced = filters;\n    if (options.restrict.length) {\n      reduced =  Object.keys(reduced).reduce((acc, key) => {\n        if (options.restrict.includes(key))  {\n          acc[key] = reduced[key];\n        }\n        return acc;\n      }, {})\n    }\n    if (options.ignore.length) {\n      reduced =  Object.keys(reduced).reduce((acc, key) => {\n        if (!options.ignore.includes(key))  {\n          acc[key] = reduced[key];\n        }\n        return acc;\n      }, {})\n    }\n\n    // Remove empty arrays - they don't survive URL round-trip\n    // (qs.stringify omits empty arrays, so comparison would fail)\n    reduced = Object.keys(reduced).reduce((acc, key) => {\n      const val = reduced[key];\n      if (!(Array.isArray(val) && val.length === 0)) {\n        acc[key] = val;\n      }\n      return acc;\n    }, {});\n\n    return reduced;\n  }\n\n  const [state, dispatch] = useReducer(TableStateReducer, {\n    filters: initialFilters,\n    controls: controlsFromQueryString(),\n    tableEvent: 'loadpage',\n    currentQuery: location.search,\n  }, initFilters);\n\n  const handleChangeFilters = (filters) => dispatch({ name: 'filters', value: (filters || { ...initialFilters }) });\n\n  const handleSetPage = (page) => dispatch({ name: 'page', value: page });\n\n  const handleSetSortBy = (sort_by) => dispatch({ name: 'sortBy', value: sort_by });\n\n  const handleSetSortDir = (sort_dir) => dispatch({ name: 'sortDir', value: sort_dir });\n\n  // Used for ReactTable onSort event which sets both field and direction\n  // arg is array: [{id:\"purchased_at\", desc:false}]\n  // We are assuming it's not multisort since we config the tables multisort=false\n  const handleSetSort = (rtSort) => {\n    const sort = {};\n    if (rtSort && rtSort.length) {\n      sort.sort_by = rtSort[0].id;\n      sort.sort_dir = rtSort[0].desc ? 'desc' : 'asc';\n      dispatch({ name: 'sort', value: sort });\n    }\n  };\n\n  const handleSetLimit = (limit) => dispatch({ name: 'limit', value: limit });\n\n\n  // handle change router location (for example, user clicks back button)\n  useEffect(() => {\n    if (options.useQueryString && (!state.currentQuery || state.currentQuery !== location.search)) {\n      const qsData = queryStringToFilters(location.search || {}, options.urlDateFormat, options.parseOptions);\n      let{\n        page, limit, sort_by, sort_dir, ...qsFilters\n      } = qsData;\n      qsFilters = reduceFilters(qsFilters);\n      if (!qsFilters || !Object.keys(qsData).length) qsFilters = initialFilters;\n\n      let controls;\n      if (options.useTableControls) {\n        controls = {\n          page: (parseInt(page) || state.controls.page),\n          sort_by: (sort_by || state.controls.sort_by),\n          sort_dir: (sort_dir || state.controls.sort_dir),\n          limit: (parseInt(limit) || state.controls.limit),\n        };\n      } else {\n        controls = { ...state.controls };\n      }\n\n      // Compare reduced versions of both to ignore params that shouldn't trigger updates\n      const reducedStateFilters = reduceFilters(state.filters);\n      if (!isEqual(reducedStateFilters, reduceFilters(qsFilters)) || !isEqual(state.controls, controls)) {\n        dispatch({\n          name: 'navigation',\n          value: {\n            filters: qsFilters,\n            controls,\n          },\n        });\n      }\n\n      // Update currentQuery to match location.search so the second useEffect doesn't try to \"fix\" it\n      // This is crucial for forward/back button support\n      // Only dispatch if the value actually changed to avoid unnecessary re-renders\n      if (state.currentQuery !== location.search) {\n        dispatch({ name: 'currentQuery', value: location.search });\n      }\n    }\n  }, [location.search]);\n\n  // After updating the query, update query string if we are using it\n  useEffect(() => {\n    if (options.useQueryString && state.currentQuery !== location.search) {\n      // Use navigate \"replace\" if there is no current query string.\n      // This is because landing on \"/my-list\" may immediately be updated to \"/my-list?page=1\"\n      // and we don't want two history entries (then you would have to \"back\" through both)\n      navigate(state.currentQuery, {replace: location.search === \"\"})\n\n    }\n  }, [state.currentQuery]);\n\n  const reset = (resetTo = {}) => {\n    dispatch({\n      name: 'reset',\n      value: {\n        filters: { ...initialFilters, ...resetTo },\n        controls: { ...DefaultControls, ...initialControls },\n      },\n    });\n  };\n\n  const updateQuery = () => {\n\n    let qsData = { ...state.filters };\n    delete qsData.diffInMinutes;\n    if (options.useTableControls) {\n      qsData = {\n        ...qsData, page: state.controls.page, limit: state.controls.limit, sort_by: state.controls.sort_by, sort_dir: state.controls.sort_dir,\n      };\n    }\n\n    const params = qs.parse(location.search);\n\n    // if there are any 'ignored' params, add them in\n    const ignoredParams = options.ignore.reduce((acc,prop) => {\n      if (typeof params[prop] !== 'undefined') {\n        acc[prop] = params[prop];\n      }\n      return acc;\n    }, {})\n\n    qsData = {\n      ...ignoredParams,\n      ...qsData\n    }\n    const search = filtersToQueryString(qsData, options.urlDateFormat);\n    dispatch({ name: 'currentQuery', value: search });\n  };\n\n  return {\n    filters: state.filters,\n    setFilters: handleChangeFilters,\n    updateQuery,\n    tableEvent: state.tableEvent,\n    reset,\n    controls: {\n      ...state.controls,\n      setPage: handleSetPage,\n      setSortBy: handleSetSortBy,\n      setSortDir: handleSetSortDir,\n      setSort: handleSetSort,\n      setLimit: handleSetLimit,\n    },\n    query: state.currentQuery,\n  };\n};\n\nexport default usePagedTableState;\n","/*\n * Recursive functions for working with a rule tree (order rules, channel rules)\n */\n\n// Use id to find a rule in the tree\nexport function getDeep(rule, targetId) {\n  let match = null;\n  if (rule && targetId) {\n    if (rule.id === targetId) {\n      match = rule;\n    } else if (rule.rules.length) {\n      rule.rules.map((child) => {\n        const matchChild = getDeep(child, targetId);\n        if (matchChild) match = matchChild;\n      });\n    }\n  }\n\n  return match;\n}\n\n// Get an array of ids of a rule's ancestors\n// NOT USED\nexport function getAncestorIds(rootRule, rule) {\n  let ancestors = [];\n  const parent = getDeep(rootRule, rule.parent_id);\n  if (!parent) {\n    return ancestors;\n  } if (parent.id === rootRule.id) {\n    ancestors.push(parent.id);\n    return ancestors;\n  }\n  ancestors.push(parent.id);\n  const nextAncestors = getAncestorIds(rootRule, parent);\n  ancestors = [...ancestors, ...nextAncestors];\n\n  return ancestors;\n}\n\nexport function getPreceding(rootRule, rule) {\n  if (!rule) return null\n  const parent = getDeep(rootRule, rule.parent_id)\n  let previous\n  if (parent) {\n      const ruleIndex = parent.rules.findIndex((sibling) => sibling.id === rule.id)\n      if (ruleIndex > 0) {\n        previous = parent.rules[ruleIndex - 1]\n      } else {\n        previous = parent\n      }\n\n  } else {\n    previous = rootRule\n  }\n  return previous;\n}\n\n// Find most immediate ancestor of rule where disabled property is set true\n// We might not be using this\nexport function getDisabledAncestor(rootRule, rule) {\n  if (!rule) return null;\n  let disabledParent = null;\n  const parent = getDeep(rootRule, rule.parent_id);\n  if (parent) {\n    if (parent.disabled) {\n      disabledParent = parent;\n    } else {\n      disabledParent = getDisabledAncestor(rootRule, parent);\n    }\n  }\n  return disabledParent;\n}\n\nexport function getAncestorWithProps(rootRule, rule, funcMap, result = []) {\n  if (!rule) return null;\n\n  // Go up the rule tree\n  const parent = getDeep(rootRule, rule.parent_id);\n\n\n  if (parent) {\n    Object.entries(funcMap).map(([prop, fn]) => {\n      // If most recent prop not found yet, apply functions to parent to get values\n      // console.log('TreeUtil.js:testing prop in parent:', prop, parent.label);\n      if (!result[prop]) {\n        const value = fn(parent);\n        if (value) {\n          result[prop] = { id: parent.id, label: parent.label, value };\n        }\n      }\n    });\n\n    result = getAncestorWithProps(rootRule, parent, funcMap, result);\n  }\n  return result;\n}\n\n// Update a rule object in the tree\nexport function setDeep(parent, targetItem) {\n  if (parent.id === targetItem.id) {\n    return targetItem;\n  }\n  parent.rules = parent.rules.map((item) => {\n    // Found it, update it\n    if (item.id === targetItem.id) return targetItem;\n    // Go deeper\n    if (item.rules.length) {\n      item = setDeep(item, targetItem);\n    }\n    return item;\n  });\n\n  return parent;\n}\n\n// Add a rule object to the tree\nexport function addDeep(parent, newItem) {\n  if (parent.id === newItem.parent_id) {\n    if (!newItem.priority) {\n      // priority 0 or not set, make top child\n      parent.rules = [newItem, ...parent.rules]; // add to top\n    } else {\n      // priority > 0, splice into children\n      parent.rules.splice(newItem.priority, 0, newItem);\n    }\n\n    return parent;\n  }\n\n  parent.rules = parent.rules.map((item) => {\n    item = addDeep(item, newItem);\n    return item;\n  });\n\n  return parent;\n}\n\n// Remove a rule object from the tree\nexport function removeDeep(parent, targetRule) {\n  if (parent.id === targetRule.parent_id) {\n    parent.rules = parent.rules.filter((item) => item.id !== targetRule.id);\n    return parent;\n  }\n  parent.rules = parent.rules.map((item) => {\n    item = removeDeep(item, targetRule);\n    return item;\n  });\n\n  return parent;\n}\n\n//\n// export function getAncestors(targetRule, rootRule, result=null) {\n//\n//   //set up result object\n//   if(!result) result = {ancestors:[], match:false};\n//   if(!targetRule) return result;\n//\n//   if(rootRule.id === targetRule.parent_id){\n//     // This is the parent of the target, consider this a match\n//     result.ancestors.push(rootRule);\n//     result.match = true;\n//   } else if (rootRule.rules.length){\n//     //Recurse all the way down this node until we get a match\n//     let nodeResult = {ancestors: [rootRule], match:false};\n//     rootRule.rules.map( childRule =>{\n//       if(!nodeResult.match) {\n//         nodeResult = getAncestors(targetRule, childRule, nodeResult);\n//\n//         if(nodeResult.match){\n//           result.ancestors = [...result.ancestors, ...nodeResult.ancestors];\n//           result.match = true;\n//         }\n//\n//       }\n//     });\n//   }\n//\n//   return result;\n// }\n\n// Get tree of ancestor rules for give rule (used for breadcrumbs)\n// export function getRuleTree( rule ){\n//   if(!rule) return [];\n//   const {ancestors} = this.getAncestors( rule, this.state.orderRule);\n//   ancestors.push(rule);\n//   return ancestors;\n// }\n","import { useState } from 'react';\nimport copy from 'fast-copy';\nimport {\n  getDeep, setDeep, addDeep, removeDeep, getPreceding, getDisabledAncestor, getAncestorWithProps,\n} from '../Components/Rules/TreeUtil';\n\n\n\n/*\n * Hook for managing a tree of rules\n */\nconst useRuleTree = (initialTree = null, initialRule = null, newRuleDefault = {}) => {\n\n  // Tree is the root rule object, with an array of child rules\n  // (which themselves may have child rules to nth level)\n  const [tree, setTree] = useState(initialTree);\n  const [selectedRule, setSelectedRule] = useState(initialRule);\n  const [previousSelectedRule, setPreviousSelectedRule] = useState();\n  const [refreshKey, setRefreshKey] = useState(1001);\n\n  // getRule is only used in RulesConfig where we show parent\n  const getRule = (targetId) => getDeep(tree, targetId);\n\n  // Places rule with temporary ID as first step in adding new rule.\n  // On save will be swapped out with the final saved rule (or delete if user cancels process)\n  const addTempRule = (rule, placement, newRule) => {\n    if (selectedRule && selectedRule.isNew) {\n      // TODO: return value for this case?\n      // notify('You are currently editing a new rule. Please save or cancel.', 'warning');\n      return;\n    }\n\n    newRule = newRule || newRuleDefault;\n\n    // Create a unique id because we use id as component key to ensure update\n    newRule.id = new Date().getTime();\n\n    if (placement === 'below') {\n      newRule.parent_id = rule.parent_id;\n      newRule.priority = rule.priority + 1;\n    } else { // child\n      newRule.parent_id = rule.id; // priority will be 0 (default set by api)\n      newRule.priority = 0;\n    }\n\n    const ruleTree = addDeep(tree, newRule);\n    setTree(ruleTree);\n    setPreviousSelectedRule(selectedRule);\n    setSelectedRule(newRule);\n  };\n\n  // Use for Copy\n  const addNewRule = (newRule, selectNew = true) => {\n    const ruleTree = addDeep(tree, newRule);\n    setTree(ruleTree);\n    if (selectNew) {\n      setPreviousSelectedRule(selectedRule);\n      setSelectedRule(newRule);\n    }\n  };\n\n  // Used to replace temporary new rule with new saved rule\n  const swapRule = (newRule, tempRule) => {\n    let ruleTree = removeDeep(tree, tempRule);\n    ruleTree = addDeep(tree, newRule);\n    setPreviousSelectedRule(selectedRule);\n    setTree(ruleTree);\n    setSelectedRule(newRule);\n  };\n\n  const deleteRule = (rule, newSelection) => {\n    // on delete, go to provided rule, previously selected rule, or root\n   // if (!newSelection) {\n   //   newSelection = (previousSelectedRule && !previousSelectedRule.isNew) ? previousSelectedRule : tree;\n   // }\n    console.log(\"useRuleTree.js:deleteRule from tree\", rule, tree );\n    const newTree = removeDeep(tree, rule);\n    console.log(\"useRuleTree.js:deleteRule, setTree\", newTree );\n    setTree(newTree);\n    //setPreviousSelectedRule(null);\n    //setSelectedRule(newSelection);\n  };\n\n  const selectRule = (rule = null, reset = false) => {\n    // console.log('index.js:setSelected (rule, selected, tab):', rule, typeof rule, selectedRule, tab);\n\n    // already selected\n    if (rule && selectedRule && selectedRule.id === rule.id) {\n      if (reset) {\n        // Rule is being cancelled, or rule is re-selected post-update\n        // Fetch current value from rule tree.\n        setSelectedRule(copy(rule));\n        setRefreshKey(refreshKey + 1);\n      }\n\n      return;\n    } else if (!rule) {\n      // on cancel new rule, deselect the rule and revert to previous (go to root as default)\n      rule = previousSelectedRule && !previousSelectedRule.isNew ? previousSelectedRule : tree;\n    }\n\n    setSelectedRule(copy(rule));\n  };\n\n  // Updates one rule in tree\n  const updateRuleTree = (updatedRule) => {\n    const ruleTree = setDeep({ ...tree }, updatedRule);\n    setTree(ruleTree);\n  };\n\n\n\n  // enhance the tree rules with properties before setting\n//  const processTree = (tree) => setTree(enhanceTree(copy(tree)));\n\n  // const ruleHasProp = (rule, prop) => {\n  //\n  //   switch (prop) {\n  //     case 'ads':\n  //       return rule.ads && Object.keys(rule.ads).length > 0;\n  //     case 'bid_blocked':\n  //       if (rule.bidding) {\n  //         if (rule.bidding.type === 'block') {\n  //           return true;\n  //         } if (rule.bidding.type === 'absolute') {\n  //           return (!rule.bidding.absolute_bid || isNaN(rule.bidding.absolute_bid));\n  //         } if (rule.bidding.type === 'modifier') {\n  //           return (!rule.bidding.bid_modifier || isNaN(rule.bidding.bid_modifier));\n  //         }\n  //       }\n  //       return false;\n  //     case 'disabled':\n  //       return rule.disabled;\n  //     case 'bid_schedule':\n  //       return rule.schedule_modifiers && Object.keys(rule.schedule_modifiers).length;\n  //     case 'billable_duration':\n  //       return rule.billable_duration;\n  //     case 'budget':\n  //       return rule.budgets && (Object.values(rule.budgets).length || Object.values(rule.caps).length);\n  //     case 'channel_modifiers':\n  //       return Array.isArray(rule.channel_modifiers) && rule.channel_modifiers.length;\n  //     case 'datasheets':\n  //       return rule.datasheets && Object.keys(rule.datasheets).length;\n  //     case 'destinations':\n  //       return rule.redirect_url || (allowIntegration && rule.prefill_integration) || rule.destination_number || (allowIntegration && Array.isArray(rule.delivery_destinations) && rule.delivery_destinations.length);\n  //     case 'destination_number':\n  //       return rule.destination_number;\n  //     case 'dba':\n  //       return rule.dba;\n  //     case 'bid_exclusivity':\n  //       return rule.exclusivity;\n  //\n  //     case 'delivery_destinations':\n  //     case 'post_sale':\n  //       return allowIntegration && Array.isArray(rule.delivery_destinations) && rule.delivery_destinations.length;\n  //     case 'prefill':\n  //       return allowIntegration && rule?.prefill?.integration;\n  //     case 'match_conditions':\n  //       return Array.isArray(rule.match_conditions) && rule.match_conditions.length && rule.match_conditions[0].length;\n  //     case 'match_is_required':\n  //       return rule.match_is_required;\n  //     case 'sale_conditions':\n  //       return Array.isArray(rule.enrichment_addons) && rule.enrichment_addons.length;\n  //     case 'sale_confirmation':\n  //       return allowIntegration && isObject(rule.sale_confirmation)\n  //     case 'schedule':\n  //       return Array.isArray(rule.schedule) && rule.schedule.length;\n  //     case 'is_standalone':\n  //       return rule.is_standalone;\n  //     case 'tags':\n  //       return Array.isArray(rule.tags) && rule.tags.length;\n  //     case 'advanced':\n  //       return allowAdvanced && (rule.dba || rule.internal_bid_modifier || rule.track_qualifying_rate || rule.exclude_profit_reporting || rule.vendor_attributes);\n  //     case 'tracking':\n  //       return (Array.isArray(rule.impression_urls) && rule.impression_urls.length)\n  //         || (Array.isArray(rule.click_urls) && rule.click_urls.length)\n  //         || (Array.isArray(rule.click_tags) && rule.click_tags.length);\n  //\n  //     // Routing Rules\n  //     case 'sale_match_caps':\n  //       return (rule.sale_caps && Object.values(rule.sale_caps).length)\n  //         || (rule.match_caps && Object.values(rule.match_caps).length);\n  //\n  //     case 'sell_strategy':\n  //       return Boolean(rule.sell_strategy);\n  //\n  //     case 'flow_control':\n  //       return Boolean(rule.flow_control);\n  //\n  //     case 'proxy_bidding':\n  //       return allowIntegration && isObject(rule.proxy_bidding) && Object.keys(rule.proxy_bidding).length > 0;\n  //   }\n  //   return false;\n  // };\n\n  const findPropAncestors = (startRule, funcMap) => getAncestorWithProps(tree, startRule, funcMap);\n\n  const getPrecedingRule = (rule) => getPreceding(tree, rule)\n\n  return {\n    tree,\n    refreshKey,\n    selectedRule,\n    setTree, //: processTree, might not need to do this\n    getRule,\n    deleteRule,\n    addTempRule,\n    addNewRule,\n    swapRule,\n    selectRule,\n    updateRuleTree,\n    getPrecedingRule,\n    getDisabledAncestor: (rule) => getDisabledAncestor(tree, rule),\n    findPropAncestors,\n  };\n};\n\nexport default useRuleTree;\n","import { useMemo } from 'react';\nimport { matchSorter } from 'match-sorter';\n/*\n * Hook for using react-table global search (search multiple columns)\n * Applies a text filter using matchSorter CONTAINS.\n * usage:\n * //Provide accessors for the columns to search on\n * const globalFilterType =  useTableGlobalFuzzyFilter([\"original.name\", \"original.alias\"]);\n\n *  // and provide these values in the table props\n *  // (If you have other custom filter types, merge these with the GlobalFilterType)\n *     filterTypes={globalFilterType}\n *     globalFilter=\"globalType\"\n *\n * In the column definition you can disable global filtering on a column with disableGlobalFilter:true\n */\nconst useTableGlobalFuzzyFilter = (keys = []) => {\n  const globalFilterFn = useMemo(() => {\n    const fn = (rows, colIds, filterValue) => matchSorter(rows, filterValue, {\n      threshold: matchSorter.rankings.CONTAINS,\n      sorter: (items) => items, // disabled match sorting\n      keys,\n    });\n\n    // Let the table remove the filter if the string is empty\n    fn.autoRemove = (val) => !val;\n\n    return fn;\n  }, [keys]);\n\n  const globalFilterType = useMemo(() => ({\n    globalType: globalFilterFn,\n  }), []);\n\n  return globalFilterType;\n};\n\nexport default useTableGlobalFuzzyFilter;\n","import { useMemo, useCallback } from 'react';\nimport { format as formatTz, utcToZonedTime } from 'date-fns-tz';\nimport { TimezoneOptions } from '../Components/Form/FormCommon';\n\n/*\n *Given America/Los_Angeles, return \"Pacific Standard Time\"\n */\nconst useTimezoneDisplay = (timezone) => {\n  const formatToTimezone = useCallback((strDate, format) => formatTz(utcToZonedTime(new Date(strDate), timezone), format, { timeZone: timezone }), [timezone]);\n\n  // Given America/Los_Angeles, return \"Pacific Standard Time\"\n  const timezoneDisplay = useMemo(\n    () => (timezone ? TimezoneOptions.find((opt) => opt.value === timezone).name : null),\n    [timezone],\n  );\n\n  return {\n    formatToTimezone,\n    timezoneDisplay,\n  };\n};\n\nexport default useTimezoneDisplay;\n","import { useState, useEffect } from 'react';\nimport { nanoid } from 'nanoid';\nimport useDidMount from './useDidMount';\n\n/*\n * For managing lists where items can be removed or appended, and the items don't have a unique id\n * that can be used for a component key (for example, click urls).\n *\n * We use nanoid to create a unique key, so the array items end up like\n * [ {value: 'whatever', key: 'a32cr0vz' }, ...]\n *\n * Reason: when mapping over a collection and using the map function's index as the component key,\n *    items.map( (item, i) => <Component value={item} key={`item-${i}`} />)\n * unexpected things can happen when removing items. For example, if you have a list of 4 items,\n * and delete the item with the key item-2, the refreshed list will still have an item keyed with item-2\n * (because there are still 3 items) and react will not re-render item-2.\n *\n * If the values are objects you can use 'updateItemProperty' to update\n * a property within the object (will only work for simple objects)\n *\n * Usage:\n * const{\n *   items:keyedClickUrls, //optional: rename (if you are managing more than 1 list)\n *   addItem: addClickUrl,\n *   removeItem: removeClickUrl,\n *   updateItem: updateClickUrl\n * } = useUniqueKeyArray(clickUrls);\n *\n * items.map( ({key, value}, i) => <Component value={value} key={key} />)\n */\nconst useUniqueKeyArray = (arr = [], updateCallback) => {\n  const [items, setItems] = useState(() => arr.map((item) => ({ value: item, key: nanoid(7) })));\n  const didMount = useDidMount();\n\n\n  // Get items without the keys\n  const getValues = () => items.map((item) => item.value);\n\n  // Fire optional callback when items change\n  useEffect(() => {\n    if (didMount && updateCallback) {\n      updateCallback(getValues(items));\n    }\n  }, [items]);\n\n  const addItem = (item = '') => {\n    // if addItem function is used in onClick without arguments, event object will be passed. Throw it out.\n    if (item && item.target) item = '';\n    return setItems([...items, { value: item, key: nanoid(7) }]);\n  };\n\n  const addItemBelow = (item = '', index) => {\n    const newItems = [...items];\n    return setItems(newItems.splice(index, 0, { value: item, key: nanoid(7) }));\n  };\n\n  const removeItem = (index) => {\n    setItems((prev) => {\n      const temp = [...prev];\n      temp.splice(index, 1);\n      return temp;\n    });\n  };\n\n  const updateItem = (index, val) => {\n    setItems((prev) => {\n      const temp = [...prev];\n      temp[index].value = val;\n      return temp;\n    });\n  };\n\n  const updateItemProperty = (index, val, property) => {\n    setItems((prev) => {\n      const temp = [...prev];\n      temp[index].value = { ...temp[index].value, [property]: val };\n      return temp;\n    });\n  };\n\n  return {\n    items,\n    addItem,\n    addItemBelow,\n    removeItem,\n    updateItem,\n    updateItemProperty,\n    getValues,\n  };\n};\n\nexport default useUniqueKeyArray;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nconst DocTitle = ({ pageTitle, siteTitle }) => {\n  const titleEl = document.getElementsByTagName('title')[0];\n\n  let fullTitle;\n  if (pageTitle) {\n    fullTitle = `${pageTitle} - ${siteTitle}`;\n  } else {\n    fullTitle = siteTitle;\n  }\n\n  return ReactDOM.createPortal(fullTitle || '', titleEl);\n};\n\nDocTitle.defaultProps = {\n  pageTitle: null,\n  siteTitle: 'Mastodon: by DMS Group',\n};\n\nexport default DocTitle;\n","import { library } from '@fortawesome/fontawesome-svg-core';\n// General icons\nimport {\n  faArchive,\n  faBan,\n  faBars,\n  faBullseye,\n  faCalendar,\n  faCheck,\n  faCheckCircle,\n  faTimesCircle,\n  faClipboardList,\n  faCog,\n  faCopy,\n  faEdit,\n  faEllipsisH,\n  faEllipsisV,\n  faEnvelope,\n  faExternalLinkAlt, // \"source\"\n  faEye,\n  faFileAlt,\n  faFileDownload,\n  faFileExcel,\n  faFlask,\n  faFolder,\n  faFolderOpen,\n  faGripLines,\n  faHandHoldingUsd,\n  faHeart,\n  faIdCard,\n  faImages,\n  faIndent,\n  faList,\n  faLock,\n  faUnlock,\n  faMagic,\n  faMinus,\n  faPaste,\n  faPause,\n  faPencilAlt,\n  faPercent,\n  faPhone,\n  faPiggyBank,\n  faPlay,\n  faPlug,\n  faPlus,\n  faSearch,\n  faShoePrints,\n  faStream,\n  faTags,\n  faThumbsUp,\n  faTimes,\n  faTrash,\n  faUsers,\n  faShieldAlt,\n} from '@fortawesome/free-solid-svg-icons';\n\n// rules tree\nimport {\n  faAd, faBalanceScale, faClock, faCalendarTimes, faCommentDollar, faCommentSlash, faCompressArrowsAlt, faDollarSign, faExpandArrowsAlt, faFill, faHandPaper, faHourglassHalf, faPaperclip, faPaperPlane, faProjectDiagram, faRandom, faSlidersH, faStar, faStopwatch, faCloudDownloadAlt\n} from '@fortawesome/free-solid-svg-icons';\n// notifiers\nimport {\n  faUserCircle, faQuestionCircle, faInfoCircle, faExclamationCircle, faExclamationTriangle,\n} from '@fortawesome/free-solid-svg-icons';\n// pointers\nimport {\n  faArrowUp, faArrowDown, faArrowsAltH, faArrowsAlt, faArrowRight, faArrowLeft, faChevronUp,\n  faChevronLeft, faChevronRight, faChevronDown, faChevronCircleRight, faChevronCircleDown, faChevronCircleUp, faChevronCircleLeft, faLongArrowAltUp, faLongArrowAltDown, faMousePointer,\n} from '@fortawesome/free-solid-svg-icons';\n// reports and tables\nimport {\n  faSync, faFilter, faThLarge, faCircle, faColumns, faFileCsv, faHistory, faSort, faSortUp, faSortDown,\n} from '@fortawesome/free-solid-svg-icons';\n// password meter and permissions, regular-svg\n import {\n   faFrown, faMeh, faSmile, faGrinBeam, faDotCircle,  faCircle as faCircleRegular,\n } from '@fortawesome/free-regular-svg-icons';\n// more regular\n// (need to alias the heart because we also load it from 'regular' style. To use this one, ['far', 'heart']\nimport { faPlusSquare, faMinusSquare, faCheckSquare, faSquare, faHeart as faHeartOpen } from '@fortawesome/free-regular-svg-icons';\n\n/*\n * Font Awesome library.\n * @see: https://www.npmjs.com/package/@fortawesome/react-fontawesome\n * Usage:\n *    import { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n *    <FaIcon icon=\"clock\"  />  //Loads faClock\n *    (there is no need to import the faClock icon because it has already been registered in the library)\n *\n * Note: the fas prefix (for Font Awesome Solid) is being inferred as the default (most of our icons are solid)\n * To use a different font, specify it like this: <FaIcon icon={[\"far\",\"smile\"]}  />  (far = font-awesome-regular)\n */\nexport const FaLibrary = () => {\n  library.add(\n    faArchive,\n    faBan,\n    faBars,\n    faBullseye,\n    faCalendar,\n    faCheck,\n    faCheckCircle,\n    faTimesCircle,\n    faCheckSquare,\n    faClipboardList,\n    faCog,\n    faCopy,\n    faEdit,\n    faEllipsisH,\n    faEllipsisV,\n    faEnvelope,\n    faExternalLinkAlt,\n    faEye,\n    faFileAlt,\n    faFileDownload,\n    faFileExcel,\n    faFlask,\n    faFolder,\n    faFolderOpen,\n    faGripLines,\n    faHandHoldingUsd,\n    faHeart,\n    faIdCard,\n    faImages,\n    faIndent,\n    faList,\n    faLock,\n    faUnlock,\n    faMagic,\n    faMinus,\n    faPaste,\n    faPause,\n    faPencilAlt,\n    faPercent,\n    faPhone,\n    faPiggyBank,\n    faPlay,\n    faPlug,\n    faPlus,\n    faSearch,\n    faShoePrints,\n    faSquare,\n    faStream,\n    faTags,\n    faThumbsUp,\n    faTimes,\n    faTrash,\n    faUsers,\n    faShieldAlt,\n  );\n  // rules tree\n  library.add(faAd, faBalanceScale, faClock, faCalendarTimes, faCommentDollar, faCommentSlash, faCompressArrowsAlt,faDollarSign, faExpandArrowsAlt, faFill, faHandPaper, faHourglassHalf, faPaperclip, faPaperPlane, faProjectDiagram, faRandom, faSlidersH, faStar, faStopwatch, faCloudDownloadAlt);\n  // notifiers\n  library.add(faUserCircle, faQuestionCircle, faInfoCircle, faExclamationCircle, faExclamationTriangle);\n  // password meter\n  library.add(faFrown, faMeh, faSmile, faGrinBeam,  faDotCircle, faCircleRegular);\n  // pointers\n  library.add(\n    faArrowUp,\n    faArrowDown,\n    faArrowsAltH,\n    faArrowsAlt,\n    faArrowRight,\n    faArrowLeft,\n    faChevronUp,\n    faChevronLeft,\n    faChevronRight,\n    faChevronDown,\n    faChevronCircleRight,\n    faChevronCircleDown,\n    faChevronCircleUp,\n    faChevronCircleLeft,\n    faLongArrowAltUp,\n    faLongArrowAltDown,\n    faMousePointer,\n  );\n  // reports and tables\n  library.add(faColumns, faSync, faHistory, faFilter, faThLarge, faCircle, faFileCsv, faSort, faSortUp, faSortDown);\n  // more regular\n  library.add(faPlusSquare, faMinusSquare, faHeartOpen);\n};\n","import React from 'react';\nimport ContentLoader from 'react-content-loader';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\n\n/*\n * Uses content-loader component for animated svg dots.\n */\nconst LoaderDots = ({active, inline, width, className}) => (\n  <div className={classnames(['svg-loader-container m-auto', className, { active, inline }])}>\n    <div className=\"svg-loader d-inline\" style={{ width: `${width.toString()}px`, left: `calc(50% - ${width.toString() / 2}px)` }}>\n      {active && (\n        <ContentLoader\n          viewBox=\"0 0 110 40\"\n          speed={1.2}\n          backgroundColor=\"transparent\"\n          backgroundOpacity=\"1\"\n          style={{ width: `${width.toString()}px` }}\n          active={Boolean(active)}\n          inline={Boolean(inline)}\n          width={width.toString()}\n        >\n          <circle cx=\"10\" cy=\"20\" r=\"8\" />\n          <circle cx=\"54\" cy=\"20\" r=\"8\" />\n          <circle cx=\"98\" cy=\"20\" r=\"8\" />\n        </ContentLoader>\n      )}\n    </div>\n  </div>\n);\n\nLoaderDots.metadata = {\n  name: 'RioF',\n  github: 'clariokids',\n  description: 'Three Dots',\n  filename: 'ThreeDots',\n};\n\nLoaderDots.defaultProps = {\n  active: false,\n  inline: false,\n  width: 100,\n};\n\nLoaderDots.propTypes = {\n  active: PropTypes.bool,\n  inline: PropTypes.bool,\n  width: PropTypes.number,\n  className: PropTypes.string,\n};\n\nexport default LoaderDots;\n","import React, { useContext, useEffect } from 'react';\nimport { ProgressBar } from 'reprogressbars';\nimport { AppContext } from '../Providers/AppProvider';\nimport Mastodon from '../Components/Icons/DMS/Mastodon';\n\n/*\n *  Progress bar style loader, covers area and shows animated horizontal bar at top\n *  ( visual only, does not  track actual loading progress)\n *  There's no queue of loaders so it's only one at a time. In general this loader is\n *  meant for obscuring an area and providing activity indication to the user while\n *  loading or saving remote data.\n *\n *  Component needs to have a reference to the AppContext\n *    const app = useContext(AppContext);\n *\n *  To apply to the whole page, put <LoadingBar name=\"main\"/> at top of main content area\n *  Activate the loader:\n *    app.showLoader() //will default to area 'main' with default message\n *  Set false to deactivate\n *    app.showLoader(false)\n *\n *  For loaders in different areas such as modal, use a different name\n *  <LoadingBar name=\"modal\"/>\n *  Activate the loader: app.showLoader('modal', 'Updating password...')\n *\n */\nconst LoadingBar = ({\n  name, message=\"\", active=false, overlay=true, fnScrollTo, scrollToTop,\n}) => {\n  const app = useContext(AppContext);\n\n  // Determine if loader is currently in loading state\n  // 1) prop 'active' set true in jsx\n  // 2) global loader == true and loader name prop is the default (eg, 'main')\n  // 3) global loader == 'some name' that matches this loader's name prop  (eg, 'modal')\n  // const isLoading = (active === true ||  (name === LoadingBar.defaultProps.name ? loader===true : name === app.loader));\n  const isLoading = (active === true || name === app.loader);\n\n  useEffect(() => {\n    if (isLoading ) {\n      if (typeof fnScrollTo === 'function') {\n        fnScrollTo()\n      } else if (scrollToTop) {\n        window.scrollTo({ top: 0, behavior: 'smooth' });\n      }\n\n    }\n  }, [isLoading]);\n\n  return (\n    <div className=\"loading-bar-container\" data-state={isLoading ? 'active' : 'hidden'}>\n\n      <ProgressBar isLoading={isLoading} className=\"loading-bar\" height=\"4px\" color=\"#5cb935\" useBoxShadow />\n      {overlay && (\n        <>\n          <div className=\"loading-bar-overlay\"></div>\n          {/* <div className={'loading-bar-message'}>{message || globalMessage}</div> */}\n          <div className=\"loading-bar-message text-center\">\n            <div className=\"mb-1 me-1\">\n              <Mastodon />\n            </div>\n            <div>\n              {message || app.loaderMessage}\n            </div>\n\n          </div>\n        </>\n      )}\n\n    </div>\n  );\n};\n\nLoadingBar.defaultProps = {\n  name: 'main',\n  active: false,\n  fnScrollTo:undefined,\n  scrollToTop: false,\n  overlay: true\n};\n\nexport default LoadingBar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport PageSection from './PageSection';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\n\nconst NotAuthorized = ({ title }) => (\n  <PageSection\n    title={title}\n    className=\"not-authorized\"\n  >\n    <StandardAlert icon=\"alert\" color=\"light\">You are not authorized for this page</StandardAlert>\n  </PageSection>\n);\n\nNotAuthorized.propTypes = {\n  title: PropTypes.string,\n};\n\nexport default NotAuthorized;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport {Button} from \"reactstrap\";\nimport PageSection from './PageSection';\n\nconst NotFoundPage = () => (\n  <PageSection title=\"Page Not Found\">\n    <p>There&apos;s nothing at this location.</p>\n    <Button tag={Link} to=\"/accounts\" className=\"mt-2\"> Back to home page </Button>\n  </PageSection>\n);\n\nexport default NotFoundPage;\n","/*\n * Service that does \"/me\" auth check, cross-tab auth, and logout\n */\n\n\nclass Authorizer {\n  constructor(authUrl, logoutCallback) {\n    this.authUrl = authUrl;\n    this.logoutCallback = logoutCallback;\n\n    this.tabQueryTimer = null;\n\n    // Listen for localStorage changes (for auth sharing between tabs)\n    window.addEventListener('storage', this.handleBroadcast);\n  }\n\n  /* SHARE AUTH ACROSS MULTIPLE TABS\n     * A tab \"broadcasts\" a request for auth token by setting a localStorage item,\n     * which triggers a storage event.\n     * Before doing auth check, test if we have a token, get it from another tab if not, then make request\n     */\n\n  /* Using the storage event to broadcast between tabs. */\n  broadcastTokenRequest = () => {\n    // Timer, since we don't really know if the broadcast query failed\n    if (!this.tabQueryTimer) {\n      this.tabQueryTimer = window.setTimeout(() => {\n        // No tab responded with a token\n        window.dispatchEvent(new Event('Mastodon.CrossTabTokenFail'));\n      }, 1000);\n      // Trigger storage event\n      localStorage.setItem('TokenRequest', Date.now().toString());\n      localStorage.removeItem('TokenRequest');\n    }\n  };\n\n\n  broadcastLogout = (message = '') => {\n    localStorage.setItem('LogoutAllTabs', message);\n    localStorage.removeItem('LogoutAllTabs');\n  };\n\n  broadcastLogin = (token) => {\n    localStorage.setItem('LoginAllTabs', JSON.stringify(token));\n    localStorage.removeItem('LoginAllTabs');\n  };\n\n  handleBroadcast = (storageEvent) => {\n    //console.log('Authorizer.js:handleBroadcast', storageEvent.key, storageEvent.newValue);\n    if (storageEvent.key === 'TokenRequest' && storageEvent.newValue) {\n      // Another tab is requesting an auth token\n       //console.log('Authorizer.js:got a token request from another tab, sending....', storageEvent.newValue);\n      if (window.sessionStorage.UE_CLICKS_AUTH_TOKEN) {\n        localStorage.setItem('TokenResponse', JSON.stringify(window.sessionStorage.UE_CLICKS_AUTH_TOKEN));\n      } else {\n        localStorage.setItem('TokenResponse', '');\n      }\n\n      localStorage.removeItem('TokenResponse');\n    } else if (storageEvent.key === 'TokenResponse' || storageEvent.key === 'LoginAllTabs') {\n      // Another tab gave us a current token. Set and re-auth.\n      if (storageEvent.newValue) {\n        if (this.tabQueryTimer) window.clearTimeout(this.tabQueryTimer);\n        try {\n          const token = JSON.parse(storageEvent.newValue)\n          if (token) {\n            this.setAuthToken(token);\n            window.dispatchEvent(new Event('Mastodon.CrossTabTokenSuccess')); //calls authorize()\n          }\n        } catch(e) {}\n\n      }\n    } else if (storageEvent.key === 'LogoutAllTabs') {\n      this.logout(storageEvent.newValue, {broadcast:false});\n    }\n\n  };\n\n\n  getAuthToken = () => window.sessionStorage.UE_CLICKS_AUTH_TOKEN;\n\n  // Can be called on login, or from cross-tab message\n  setAuthToken = (token, doBroadcast= false) => {\n    window.sessionStorage.setItem(\"UE_CLICKS_AUTH_TOKEN\", token);\n    // We now have a token; cancel the cross-tab query timeout so it doesn't\n    // fire CrossTabTokenFail and flip us back to unauthorized post-login.\n    // (storage events don't fire in the setting tab, so broadcastLogin alone\n    // wouldn't clear this.)\n    if (this.tabQueryTimer) {\n      window.clearTimeout(this.tabQueryTimer);\n      this.tabQueryTimer = null;\n    }\n    if (doBroadcast) {\n      this.broadcastLogin(token);\n    }\n\n  }\n\n  getRequestOptions = () =>\n    ({\n      method: 'GET',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${this.getAuthToken()}`,\n      },\n    }) ;\n\n  logout = (message = '', options={}) => {\n    window.sessionStorage.removeItem('UE_CLICKS_AUTH_TOKEN');\n    if (options.broadcast) this.broadcastLogout(message); // notify all tabs\n    this.logoutCallback && this.logoutCallback(message, options);\n  };\n\n  // called after updating My Profile\n  refreshAuth = () => this.fetchInfo();\n\n  // Does the auth check\n  authorize = async () => {\n    // Try to get authorization from another tab if no token in this tab\n    if (!this.getAuthToken()) {\n      this.broadcastTokenRequest();\n      return 'pending';\n    }\n\n    const options = this.getRequestOptions();\n\n    const result = await fetch(this.authUrl, options);\n\n    if (!result.ok) {\n      let msg\n       msg = result.json().then((data) => {\n        if (data.error !== undefined && data.error.message !== undefined) {\n          return data.error.message\n        }\n      })\n\n      if (msg !== undefined) {\n        return msg\n      }\n    }\n\n    if (result.ok) {\n      return result.json();\n    }\n\n    return false;\n  };\n}\n\nexport default Authorizer;\n","import BaseAPI from './BaseAPI';\n\n// Array of identifiers for endpoints,\n// (base of every endpoint path, eg ads/, ads/23, etc)\nconst CORE_ENDPOINTS = [\n  'accounts',\n  'activations',\n  'ads',\n  'attributes',\n  'buyer-names',\n  'changes',\n  'channels',\n  'datasheets',\n  'dbas',\n  'debug',\n  'sale-groups',\n  'sales',\n  'sales-flows',\n  'sample-data',\n  'dynamic-integrations',\n  'goals',\n  'goals-tracking',\n  'returns-tracking',\n  'return-rules',\n  'images',\n  'integrations',\n  'matchables',\n  'notification-preference',\n  'orders',\n  'partners',\n  'partner-verticals',\n  // 'access/permissions',\n  // 'platform', // legacy platform api\n  'phone-numbers',\n  'promotions',\n  'promotion-participations',\n  'publishers',\n  // 'roles', // moved to access/roles, see createSpecialMethods\n  'routing-rules',\n  'rules',\n  'scripts',\n  'sources',\n  'source-tokens',\n  'statefarm-imports',\n  'system-users',\n  'tenants',\n  'tokens',\n  'users',\n  'vendors',\n  'verticals',\n];\n\n/*\n * API for core Mastodon function.\n * An instance of this class is created in AppProvider and available in react context.\n */\nclass CoreAPI extends BaseAPI {\n  constructor(requestCallback) {\n    // Create CRUD methods for each core endpoint\n    super(process.env.API_URL_CORE, CORE_ENDPOINTS, requestCallback);\n    this.createSpecialMethods();\n  }\n\n  createSpecialMethods = () => {\n    this.endpoints.rules.tree = (id) => this.makeRequest('get', `rules/${id}/tree`, null, { accept: 'text' });\n    this.endpoints.rules.export = (id) => this.makeRequest('get', `rules/${id}/export`, null, { accept: 'text' });\n    this.endpoints.rules.exportChannels = (id) => this.makeRequest('get', `rules/${id}/export/channels`, null, { accept: 'text' });\n    this.endpoints.rules.import = (data) => this.makeRequest('post', `rules/${data.id}/import`, data.content, { bodyType: 'text' });\n    this.endpoints.rules.importChannels = (data) => this.makeRequest('post', `rules/${data.id}/import/channels`, data.content, { bodyType: 'text' });\n    this.endpoints.rules.createBatch = (data) => this.makeRequest('post', `rules/${data.id}/rules`, data);\n    this.endpoints.routingRules.createBatch = (data) => this.makeRequest('post', `routing-rules/${data.id}/rules`, data);\n\n    this.endpoints.attributes.groups = () => this.makeRequest('get', 'attributes/groups');\n\n    this.endpoints.saleReturns = {\n      request: (data) => this.makeRequest('post', 'sale-returns', data),\n      reasons: () => this.makeRequest('get', 'return-reasons'),\n      denyReasons: () => this.makeRequest('get', 'return-deny-reasons'),\n    };\n\n    this.endpoints.images.upload = (formData) => this.makeRequest(\n      'post',\n      'images/upload',\n      formData,\n    );\n\n    this.endpoints.datasheets.updateFile = (id, formData) => this.makeRequest(\n      'post',\n      `datasheets/${id}/file`,\n      formData,\n    );\n\n    this.endpoints.partners.upload = (formData) => this.makeRequest(\n      'post',\n      'partners/upload',\n      formData,\n    );\n\n    this.endpoints.datasheets.download = (id) => this.makeRequest(\n      'get',\n      `datasheets/download/${id}`,\n      null,\n      { responseType: 'blob' },\n    );\n\n    this.endpoints.goalsTracking.download = (id) => this.makeRequest(\n      'get',\n      `goals-tracking/download/${id}`,\n      null,\n      { responseType: 'blob' },\n    );\n\n    this.endpoints.returnsTracking.download = (id) => this.makeRequest(\n      'get',\n      `returns-tracking/download/${id}`,\n      null,\n      { responseType: 'blob' },\n    );\n\n    this.endpoints.accounts.options = (params) => this.makeRequest('get', 'accounts/options', params, { accept: 'text' });\n    this.endpoints.debug.auctionsList = (params) => this.makeRequest('get', 'debug/auctions', params, { accept: 'text' });\n    this.endpoints.debug.auctionFields = () => this.makeRequest('get', 'debug/auctions/fields', null, { accept: 'text' });\n    this.endpoints.debug.auctionHttpLogs = (id) => this.makeRequest('get', `debug/auction-http-logs/${id}`, null, { accept: 'text' });\n    this.endpoints.debug.deliveriesList = (params) => this.makeRequest('get', 'debug/deliveries', params, { accept: 'text' });\n    this.endpoints.debug.callsList = (params) => this.makeRequest('get', 'debug/calls', params, { accept: 'text' });\n    this.endpoints.debug.auctions = (id) => this.makeRequest('get', `debug/auctions/${id}`, null, { accept: 'text' });\n    this.endpoints.debug.deliveries = (id) => this.makeRequest('get', `debug/deliveries/${id}`, null, { accept: 'text' });\n    this.endpoints.debug.matchables = (id) => this.makeRequest('get', `matchables/${id}`, null, { accept: 'text' });\n\n    // todo move to dedicated delivery requests endpoint\n    this.endpoints.debug.getDeliveryRequest = (id) => this.makeRequest('get', `debug/delivery-requests/${id}`, null, { accept: 'text' });\n    this.endpoints.debug.sendDeliveryRequest = (params) => this.makeRequest('post', `delivery-requests`, params, { accept: 'text' }, true);\n    this.endpoints.debug.listDeliveryRequest = (params) => this.makeRequest('get', `delivery-requests`, params, { accept: 'text' }, true);\n    this.endpoints.debug.updateDeliveryRequest = (id, params) => this.makeRequest('put', `delivery-requests/${id}`, params, { accept: 'text' }, true);\n    this.endpoints.debug.deleteDeliveryRequest = (id) => this.makeRequest('delete', `delivery-requests/${id}`, null, { accept: 'text' }, true);\n\n    this.endpoints.sampleData.listSampleData = (params) => this.makeRequest('get', `sample-data`, params, { accept: 'text' }, true);\n    this.endpoints.sampleData.getSampleData = (id) => this.makeRequest('get', `sample-data/${id}`, null, { accept: 'text' }, true);\n    this.endpoints.sampleData.createSampleData = (params) => this.makeRequest('post', `sample-data`, params, { accept: 'text' }, true);\n    this.endpoints.sampleData.updateSampleData = (id, params) => this.makeRequest('put', `sample-data/${id}`, params, { accept: 'text' }, true);\n    this.endpoints.sampleData.deleteSampleData = (id) => this.makeRequest('delete', `sample-data/${id}`, null, { accept: 'text' }, true);\n\n    this.endpoints.debug.listDeliveryQueue = (params) => this.makeRequest('get', `debug/delivery-queue`, params, { accept: 'text' }, true);\n    this.endpoints.debug.cancelDelivery = (id) => this.makeRequest('delete', `debug/delivery-queue/${id}`, {}, { accept: 'text' }, true);\n    this.endpoints.debug.bumpDelivery = (id) => this.makeRequest('put', `debug/delivery-queue/bump/${id}`, {}, { accept: 'text' }, true);\n    this.endpoints.debug.template = (params) => this.makeRequest('post', `debug/template`, params);\n    this.endpoints.datasheets.simulate = (id, params) => this.makeRequest('post', `datasheets/${id}/simulate`, params, {}, true);\n    this.endpoints.changes.export = {\n      bids: (params) => this.makeRequest(\"get\", \"changes/export/bids\", params, {responseType: \"blob\"}),\n      channelModifiers: (params) => this.makeRequest(\"get\", \"changes/export/channel-modifiers\", params, {responseType: \"blob\"})\n    }\n\n    this.endpoints.users.updatePermissions = (id, data) => this.makeRequest(\n      'put',\n      `users/${id}/permissions`,\n      data,\n    );\n    this.endpoints.users.unlock = ( id ) => this.makeRequest('put', `users/${id}/unlock`, null, { accept: 'text' });\n\n    this.endpoints.systemUsers.updatePermissions = (id, data) => this.makeRequest(\n      'put',\n      `system-users/${id}/permissions`,\n      data,\n    );\n\n    this.endpoints.activations.getUserActivation = (userId) => this.makeRequest('get', `activations/user/${userId}`, {}, { accept: 'text' }, true);\n\n    this.endpoints.vendors.addUeids = (id, params) => this.makeRequest('post', `vendors/${id}/ueids`, params );\n\n    // DMS-1325: per-vendor return integration config. GET 404s when the vendor has\n    // none configured yet -- treat that as a normal \"not set up\" state, not an error to notify.\n    this.endpoints.vendors.getReturnIntegration = (id) => this.makeRequest('get', `vendors/${id}/return-integration`);\n    this.endpoints.vendors.updateReturnIntegration = (id, data) => this.makeRequest('put', `vendors/${id}/return-integration`, data);\n\n    this.endpoints.integrations.listRevisions = (id, params) => this.makeRequest('get', `integrations/${id}/versions`, params);\n    this.endpoints.integrations.showRevision = (id, version) => this.makeRequest('get', `integrations/${id}/versions/${version}`);\n\n    // StateFarm monthly imports (DMS-608): kind is 'legend' or 'agents'\n    this.endpoints.statefarmImports.download = (id, kind) => this.makeRequest(\n      'get',\n      `statefarm-imports/download/${id}/${kind}`,\n      null,\n      { responseType: 'blob' },\n    );\n\n    // Promotions: lightweight id/name list for dropdowns, pool funding, and accounting activity\n    this.endpoints.promotions.options = (params) => this.makeRequest('get', 'promotions/options', params);\n    this.endpoints.promotions.credit = (id, params) => this.makeRequest('post', `promotions/${id}/credits`, params);\n    this.endpoints.promotions.activity = (id, params) => this.makeRequest('get', `promotions/${id}/activity`, params);\n\n    // Promotion participations: a buyer account's enrollment in a promotion. It holds\n    // no money — funding lives on the promotion pool — so what a participation has to\n    // show is consumption: `activity` lists the contributions, `usageSummary` totals\n    // them per cap window for a whole page of rows at once.\n    this.endpoints.promotionParticipations.activity = (id, params) => this.makeRequest('get', `promotion-participations/${id}/activity`, params);\n    this.endpoints.promotionParticipations.usageSummary = (params) => this.makeRequest('get', 'promotion-participations/usage-summary', params);\n\n    this.endpoints.favorites = {\n      list: () => this.makeRequest('get', 'favorites', null, { accept: 'text' }),\n      addOrder: (id) => this.makeRequest('post', `favorites/orders/${id}`, null, { accept: 'text' }),\n      deleteOrder: (id) => this.makeRequest('delete', `favorites/orders/${id}`, null, { accept: 'text' }),\n    }\n\n    this.endpoints.permissions = {\n      list: (params) => this.makeRequest('get', 'access/permissions', params, { accept: 'text' }),\n      update: (data) => this.makeRequest('put', `access/permissions`, data, { accept: 'text' }),\n    }\n    this.endpoints.roles = {\n      list: (params) => this.makeRequest('get', 'access/roles', params),\n      show: (id, params) => this.makeRequest('get', `access/roles/${id}`, params),\n      assignable: (params) => this.makeRequest('get', 'access/roles/assignable', params),\n      assignableSystem: (params) => this.makeRequest('get', 'access/roles/assignable-system', params),\n      platforms: () => this.makeRequest('get', 'access/roles/platforms'),\n      update: (id, data) => this.makeRequest('put', `access/roles/${id}`, data),\n    };\n    this.endpoints.caps = {\n      list: (orderIds) => this.makeRequest('get', 'caps', {order_id: orderIds}, { accept: 'text' }),\n    }\n\n    // Ledger read model (read-service via core; AccountingAPI stays the write/CRUD proxy)\n    this.endpoints.accounting = {\n      transactionsList: (params) => this.makeRequest('get', 'accounting/transactions', params, { accept: 'text' }),\n      entriesList: (params) => this.makeRequest('get', 'accounting/entries', params, { accept: 'text' }),\n    };\n\n    //Currently only one action on notifications\n    this.endpoints.notifications = {\n      send: (params={}) => this.makeRequest('post', `notifications/send`, params, {accept: 'text'}),\n    }\n\n    // Two-factor authentication\n    this.endpoints.twoFactor = {\n      enroll: () => this.makeRequest('post', '2fa/enroll'),\n      confirmEnroll: (data) => this.makeRequest('post', '2fa/enroll/confirm', data),\n      disable: (data) => this.makeRequest('delete', '2fa', data),\n      adminReset: (userId) => this.makeRequest('delete', `users/${userId}/2fa`),\n    };\n  };\n\n  login = (credentials) => this.makeRequest('post', `${this.url}/auth-tokens`, credentials);\n\n  verify2fa = (pendingToken, code) => this.makeRequest(\n    'post', `${this.url}/auth-tokens/verify-2fa`, { code }, { token: pendingToken }\n  );\n\n  enrollPending = (pendingToken) => this.makeRequest(\n    'post', `${this.url}/2fa/enroll`, {}, { token: pendingToken }\n  );\n\n  confirmEnrollPending = (pendingToken, code) => this.makeRequest(\n    'post', `${this.url}/2fa/enroll/confirm`, { code }, { token: pendingToken }\n  );\n\n  requestPasswordReset = (email) => this.makeRequest('post', `${this.url}/password-resets`, { email });\n\n  resetPassword = (token, password) => this.makeRequest('put', `${this.url}/password-resets/${token}`, { password });\n}\n\nexport default CoreAPI;\n","import BaseAPI from './BaseAPI';\n\n/* Used for DNC requests */\nclass PrivacyAPI extends BaseAPI {\n  constructor() {\n    super(process.env.API_URL_PRIVACY, []);\n  }\n\n  getPii = async (params) => await this.makeRequest('get', `${this.url}/admin/pii`, params);\n\n  optOut = async (params) => await this.makeRequest('post', `${this.url}/admin/optout`, params);\n}\n\nexport default PrivacyAPI;\n","import BaseAPI from './BaseAPI';\n\nclass AccountingAPI extends BaseAPI {\n  constructor(requestCallback) {\n    // Instead of having the UI talk directly to the accounting service,\n    // it now routes all requests through core.\n    // Since there are a lot of specialized requests beyond CRUD,\n    // we kept this class instead of using only CoreAPI class.\n\n    // Note: accountID provided in the requests is the Mastodon account id.\n    // This will be translated to the accounting account id when the request\n    // is passed on.\n\n    // super(process.env.API_URL_ACCOUNTING, []);\n    super(`${process.env.API_URL_CORE}/accounting`, [], requestCallback);\n  }\n\n  getAccount = async (account_id) => {\n    const url = `${this.url}/${account_id}`;\n    return await this.makeRequest('get', url, {});\n  };\n\n  updateAccount = async (account_id, account) => {\n    const url = `${this.url}/${account_id}`;\n    return await this.makeRequest('put', url, account);\n  };\n\n  addAccountCredit = async (account_id, amount) => {\n    const url = `${this.url}/credits/${account_id}`;\n    return await this.makeRequest('post', url, { amount });\n  };\n\n  createRefund = async (account_id, invoice_number) => {\n    const url = `${this.url}/refunds/${account_id}`;\n    const params = { invoice_number };\n    return await this.makeRequest('post', url, params);\n  };\n\n  transfer = async (params) => {\n    const url = `${this.url}/transfers`;\n    return await this.makeRequest('post', url, params, {}, true);\n  }\n\n  // getAccountCharges = async(account_id) =>{\n  //   const url = `${this.url}/charges`;\n  //   const params = {account_id};\n  //   return await this.makeRequest( 'get', url, params );\n  // }\n\n  getCreditCardList = async (account_id) => {\n    const url = `${this.url}/credit-cards/${account_id}`;\n    return await this.makeRequest('get', url);\n  };\n\n  getActivity = async (account_id, params) => {\n    const url = `${this.url}/activity/${account_id}`;\n    return await this.makeRequest('get', url, params);\n  };\n\n  downloadActivity = async (account_id, file_type, params) => {\n    const url = `${this.url}/activity/${account_id}/download/${file_type}`;\n    return await this.makeRequest('get', url, params, { responseType: 'blob' } );\n  };\n\n  // not used?\n  getRefunds = async (account_id) => {\n    const url = `${this.url}/refunds/${account_id}`;\n    return await this.makeRequest('get', url);\n  };\n\n  // not used?\n  getCharges = async (account_id) => {\n    const url = `${this.url}/charges/${account_id}`;\n    return await this.makeRequest('get', url);\n  };\n\n  // query the Accounting api for the URL of the MeS checkout page\n  getCheckoutPage = async (account_id, return_url, cancel_url) => {\n    const url = `${this.url}/checkout-page/${account_id}`;\n    const params = { return_url, cancel_url };\n    return await this.makeRequest('post', url, params);\n  };\n\n  chargeToCard = async (account_id, card_id, amount) => {\n    const url = `${this.url}/credit-cards/${account_id}/charge`;\n    const params = { card_id, amount };\n    return await this.makeRequest('post', url, params);\n  };\n\n  updateCard = async (account_id, card_id, priority, auto_billing_eligible) => {\n    const url = `${this.url}/credit-cards/${account_id}/${card_id}`;\n    const params = { priority, auto_billing_eligible };\n    return await this.makeRequest('put', url, params);\n  };\n\n  removeCard = async (account_id, card_id) => {\n    const url = `${this.url}/credit-cards/${account_id}/${card_id}`;\n    return await this.makeRequest('delete', url, {});\n  };\n}\n\nexport default AccountingAPI;\n","import BaseAPI from './BaseAPI';\n\n/* Used for Dynamic Integrations\n*/\nclass IntegrationsAPI extends BaseAPI {\n  constructor() {\n    super(process.env.API_URL_INTEGRATIONS, []);\n  }\n}\n\nexport default IntegrationsAPI;\n","import BaseAPI from './BaseAPI';\n\nclass ReportingAPI extends BaseAPI {\n  constructor() {\n    super(process.env.API_URL_LOOKER_REPORTING, []);\n  }\n\n  resolveAggregateReportFunc = (type) => {\n    if (type === 'advertiser') {\n      return this.getAdvertiserReport;\n    } if (type === 'vendor') {\n      return this.getVendorReport;\n    }\n    return null;\n  };\n\n  getFilterOptions = async (params, type = 'reports') => await this.makeRequest(\n    'get',\n    `${this.url}/options/${type}`,\n    params || {},\n  );\n\n  getCalls = async (params, responseType = 'json') => await this.makeRequest(\n    'get',\n    `${this.url}/reports/looker/calls.${responseType}`,\n    params || {},\n    responseType === 'csv' ? { responseType: 'blob' } : {},\n  );\n\n  getLeads = async (params, responseType = 'json') => await this.makeRequest(\n    'get',\n    `${this.url}/reports/looker/leads.${responseType}`,\n    params || {},\n    responseType === 'csv' ? { responseType: 'blob' } : {},\n  );\n\n  // Get detail view for 'calls' or 'leads'\n  getProspectDetail = async (id, type, params={}) => await this.makeRequest(\n    'get',\n    `${this.url}/reports/looker/${type}/${id}`,\n     params\n  );\n\n  getAdvertiserReport = async (params, responseType = 'json') => await this.makeRequest(\n    'get',\n    `${this.url}/reports/looker/advertiser.${responseType}`,\n    params || {},\n    responseType === 'csv' || responseType === 'xlsx' ? { responseType: 'blob' } : {},\n  );\n\n  getVendorReport = async (params, responseType = 'json') => await this.makeRequest(\n    'get',\n    `${this.url}/reports/looker/vendor.${responseType}`,\n    params || {},\n    responseType === 'csv' ? { responseType: 'blob' } : {},\n  );\n\n}\n\nexport default ReportingAPI;\n","import BaseAPI from './BaseAPI';\n\n/* Used for Dynamic Integrations\n*/\nclass MatchingAPI extends BaseAPI {\n  constructor() {\n    super(process.env.API_URL_MATCHING, []);\n  }\n\n  runPing = async (params) => await this.makeRequest('post', `${this.url}/ping`, params);\n}\n\nexport default MatchingAPI;\n","import React, { useEffect, useReducer, useCallback, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport Authorizer from '../Services/Authorizer';\nimport CoreAPI from '../Services/CoreAPI';\nimport PrivacyAPI from '../Services/PrivacyAPI';\nimport AccountingAPI from '../Services/AccountingAPI';\nimport IntegrationsAPI from '../Services/IntegrationsAPI';\nimport ReportingAPI from '../Services/ReportingAPI';\nimport MatchingAPI from '../Services/MatchingAPI';\n\nconst LOADER_MESSAGE_DEFAULT = 'Loading...';\nconst AppContext = React.createContext();\n\n\nconst AppStateReducer = (state, action) => {\n  const { type, value } = action;\n  switch (type) {\n    case 'authorizing':\n      return { ...state, isAuthorizing: true };\n    case 'auth_fail':\n    case 'logout':\n      // Todo: auth err?\n      return {\n        ...state, user: null, isAuthorized: false, isAuthorizing: false, currentAccount: null, ...value,\n      };\n    case 'auth_ready':\n      return {\n        ...state, isAuthorized: false, isAuthorizing: false, authErr: '', loginAction:'', logoutAction:'', ...value,\n      };\n    case 'auth_success':\n      return {\n        ...state, isAuthorized: true, isAuthorizing: false, authErr: '', loginAction:'', logoutAction:'', ...value,\n      };\n\n    case 'show_loader':\n      return { ...state, ...value };\n    case 'global_modal':\n      // for toggling modals that can be opened on any route (my profile, etc). Expecting string name.\n      return { ...state, globalModal: value };\n    case 'current_account':\n      return { ...state, currentAccount: value };\n    case 'update_favorite_orders':\n      return { ...state, favorite_orders: value };\n    case 'bump_accounts_menu_version':\n      return { ...state, accountsMenuVersion: state.accountsMenuVersion + 1 };\n    case 'bump_accounts_page_version':\n      return { ...state, accountsPageVersion: state.accountsPageVersion + 1 };\n  }\n  return state;\n};\n\nconst AppProvider = ({ authUrl, version='', buildHash='', children }) => {\n\n  const [appState, dispatch] = useReducer(\n    AppStateReducer,\n    {\n      user: null,\n      permissions: [],\n      role: null,\n      authToken: '',\n      authError: '',\n      verticals: [],\n      isAuthorized: false,\n      isAuthorizing: true, // always starts with auth check\n      loader: true,\n      loaderMessage: 'Loading...',\n      currentAccount: null,\n      globalModal: '',\n      logoutAction: '',\n      accountsMenuVersion: 0,\n      accountsPageVersion: 0,\n    },\n  );\n\n  // Use a ref to current state for the postLogout and cross-tab callbacks\n  const appStateRef = useRef(appState);\n\n  const postLogout = (err, options={}) => {\n\n    // if (options.timeout && appStateRef.current?.user?.id) {\n    //   const timeoutReturn = window.location.hash.replace('#', '');\n    //   if (timeoutReturn && !timeoutReturn.match(/(login|logout)/i)) {\n    //     window.sessionStorage.setItem('TimeoutReturn', JSON.stringify({ [appStateRef.current.user.id]: timeoutReturn }));\n    //   }\n    // }\n\n    dispatch({ type: 'logout', value: { authError: err, logoutAction: options.timeout ? 'timeout' : 'user' } });\n  };\n\n  // Keep the ref updated\n  useEffect(() => {\n    appStateRef.current = appState;\n  }, [appState]);\n\n\n  const authorizer = React.useMemo(\n    () => new Authorizer(authUrl, postLogout),\n    [],\n  );\n\n  const getApi = useCallback(\n    (apiName) => {\n      switch (apiName) {\n        case 'accounting':\n          return new AccountingAPI();\n        case 'integrations':\n          return new IntegrationsAPI();\n        case 'reporting':\n          return new ReportingAPI();\n        case 'privacy':\n          return new PrivacyAPI();\n        case 'matching':\n          return new MatchingAPI();\n        default:\n          return new CoreAPI();\n      }\n    },\n    [],\n  );\n\n  const api = React.useMemo(() => getApi(), []);\n\n\n  const handleCrossTabTokenSuccess = () => {\n    if (!appStateRef.current.isAuthorized) {\n      authorize()\n    }\n  };\n\n  const handleCrossTabTokenFail = () => dispatch({ type: 'auth_fail' });\n\n\n  // Auth check on mount\n  useEffect(() => {\n     window.addEventListener('Mastodon.CrossTabTokenSuccess', handleCrossTabTokenSuccess);\n     window.addEventListener('Mastodon.CrossTabTokenFail', handleCrossTabTokenFail);\n     authorize();\n\n     return () => {\n       window.removeEventListener('Mastodon.CrossTabTokenSuccess', handleCrossTabTokenSuccess);\n       window.removeEventListener('Mastodon.CrossTabTokenFail', handleCrossTabTokenFail);\n     };\n  }, []);\n\n  const authorize = async () => {\n    dispatch({ type: 'authorizing' });\n    const result = await authorizer.authorize();\n\n    if (result === false) {\n      dispatch({ type: 'auth_fail' });\n    } else if (result === 'pending') {\n      // Authorizer is checking other tabs for an authentication token.\n      // Do nothing here. The result from that async check is handled by window events in Authorizer\n    } else if (typeof result === 'string' && result.includes('Invalid')) {\n      //API failed to authenticate user\n      dispatch({ type: 'auth_fail' });\n      notify(result, 'error')\n    } else if (typeof result === 'object') {\n      dispatch({ type: 'auth_success', value: makeAuthData(result) });\n    }\n\n\n  };\n\n  // Login page passes results to app on success\n  const onLogin = (result) => {\n    if (result) {\n      authorizer.setAuthToken(result.authorization.token, true);\n      dispatch({ type: 'auth_success', value: makeAuthData(result) });\n    }\n  };\n\n  // After 2FA verification, we receive just the promoted token.\n  // Set it and call authorize() to fetch full user data from /me.\n  const onTwoFactorVerified = (token) => {\n    authorizer.setAuthToken(token, true);\n    authorize();\n  };\n\n  const authReady = () => dispatch({ type: 'auth_ready',value:{}});\n\n  const makeAuthData = (authResult) => {\n    // extract props from auth result for user data\n    const data = (({\n                        account_id,\n                        accounts,\n                        authorization,\n                        user,\n                        permissions,\n                        role,\n                        timezone,\n                        verified,\n                        vendor_id,\n                        favorite_orders,\n                      }) => ({\n      account_id,\n      accounts,\n      authorization,\n      user,\n      permissions,\n      role,\n      timezone,\n      verified,\n      vendor_id,\n      favorite_orders\n    }))(authResult);\n\n    // two_factor_enabled and two_factor_required are top-level fields from /me, attach them to the user object\n    if (data.user && authResult.two_factor_enabled !== undefined) {\n      data.user.two_factor_enabled = authResult.two_factor_enabled;\n    }\n    if (data.user && authResult.two_factor_required !== undefined) {\n      data.user.two_factor_required = authResult.two_factor_required;\n    }\n\n    data.currentAccount = authResult.accounts.find((a) => a.id === authResult.account_id);\n\n    return data;\n  };\n\n  const refreshAuth = () => authorize();\n\n  const logout = (message, options={}) => authorizer.logout(message, {...options, broadcast:true});\n\n\n  const showLoader = (name = 'main', message = '') => {\n    if (name === 'false') message = LOADER_MESSAGE_DEFAULT;\n    dispatch({ type: 'show_loader', value: { loader: name, loaderMessage: message } });\n  };\n\n  const updateFavoriteOrders = (orders) => {\n    dispatch({ type: 'update_favorite_orders', value: orders });\n  }\n\n  // Cache used for DynamicSingleSelect.\n  // We need a better system so we can cache, for example, attributes for given product & vertical\n  const getCache = (name) => appState[name] || false;\n  const setCache = (name, value) => dispatch({ type: 'set_cache', value: { name, value } });\n\n  return (\n    <AppContext.Provider value={{\n      ...appState,\n      api, // CoreAPI class\n      getApi, // For getting other API classes\n      dispatch,\n      showLoader,\n      onLogin,\n      onTwoFactorVerified,\n      logout,\n      refreshAuth,\n      authReady,\n      getCache,\n      setCache,\n      updateFavoriteOrders,\n      version,\n      buildHash\n    }}\n    >\n      {children}\n    </AppContext.Provider>\n  );\n};\n\nAppProvider.propTypes = {\n  authUrl: PropTypes.string.isRequired,\n  children: PropTypes.node,\n};\n\nexport { AppProvider, AppContext };\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { matchSorter } from 'match-sorter';\nimport usePagedTableState from '../Hooks/usePagedTableState';\n\n/*\n * Provider that wraps a table and set of filters\n * and allows \"live\" (not by api request) filtering of data.\n * The filters component consumes the filters state, and the\n * table consumes the filteredData.\n *\n * For text search across multiple fields, provide an array of searchKeys.\n * The items in the array are usually field names, but they could be\n * resolver functions or dot notation. This is useful when one field's data is an object,\n * and you want to search within it.\n *\n */\n\nconst LiveFilteringContext = React.createContext();\n\n\nconst LiveFilteringProvider = (props) => {\n  const [initialFilters] = useState(props.filters || {});\n  const { filters, setFilters, updateQuery } = usePagedTableState(\n    props.filters || {},\n    null,\n    { useQueryString: props.useQueryString, useTableControls: false },\n  );\n\n  // React-table feature, can provide a string to search on all columns.\n  // @see: https://react-table.tanstack.com/docs/api/useGlobalFilter\n  // Technically this value could be a function\n  const [globalFilter, setGlobalFilter] = useState('');\n  const [filteredCount, setFilteredCount] = useState(0);\n\n  // Update results when filters change\n  // Can use refreshKey prop to force update independent of filters asdf\n  // (For example, if the data has changed. In some tables  there are inputs in the rows, and the data updates)\n  useEffect(() => {\n    if (props.useQueryString) {\n      updateQuery();\n    }\n  }, [filters, props.refreshKey]);\n\n  const updateFilter = (param, value) => {\n    const f = { ...filters };\n    if (value && !(Array.isArray(value) && value.length === 0)) {\n      f[param] = value;\n    } else if (param in f) {\n      delete f[param];\n    }\n\n    setFilters(f);\n  };\n\n  const resetFilter = (param) => {\n    // TODO: reset to default value\n    const f = { ...filters };\n    if (f.hasOwnProperty(param)) {\n      delete f[param];\n      setFilters(f);\n    } else if (param === 'global') {\n      setGlobalFilter('');\n    }\n  };\n\n  const resetFilters = () => {\n    setFilters(initialFilters);\n    setGlobalFilter('');\n  };\n\n  const updateGlobalFilter = (val) => setGlobalFilter(val);\n\n  /*\n   * If not using built-in filtering with react-table, use this method.\n   * Useful where filtering rows with filterable sub-tables.\n   * See the documentation for MatchSorter https://github.com/kentcdodds/match-sorter\n   */\n  const applyFilters = (rows, subtableName, skipFilters) => {\n    // console.log('LiveFilterProvider.js:applyFilters, filters ' + subtableName);\n\n    // Apply each filter to the data list, method depending on type\n    Object.entries(filters).map(([param, val], i) => {\n      let field;\n\n      if (!skipFilters || !skipFilters.includes(param)) {\n        // Subtable params should be like 'orders|product' or 'orders|vertical.name'\n        if (param.indexOf('|') > 0) {\n          if (subtableName) {\n            const [subtable, subtableField] = param.split('|');\n            if (subtable === subtableName) {\n              field = subtableField;\n            }\n          }\n        } else {\n          field = param;\n        }\n      }\n\n      if (field) {\n        if (field === 'search_term') {\n          // Search_term often searches on multiple fields (searchKeys)\n          // Sorting behavior disabled to keep the original table sort\n          if (val && props.searchKeys) {\n            rows = matchSorter(rows, val, {\n              keys: props.searchKeys,\n              threshold: matchSorter.rankings.CONTAINS,\n              sorter: (items) => items, // disabled match sorting\n            });\n          }\n        } else if (Array.isArray(val)) {\n          // multi-select widget  (react-select)\n          if (val.length) {\n            rows = val.reduceRight(\n              (results, term) => {\n                const r = matchSorter(rows, term.toString(), { keys: [field] });\n                return [...results, ...r];\n              },\n              [],\n            );\n          }\n        } else {\n          // simple equal\n          rows = matchSorter(rows, val, {\n            keys: [field],\n            threshold: matchSorter.rankings.CONTAINS,\n            sorter: (items) => items, // disabled match sorting\n          });\n        }\n      }\n    });\n    return rows;\n  };\n\n  const isFiltered = Object.keys(filters).length > 0;\n\n  return (\n    <LiveFilteringContext.Provider value={{\n      filters,\n      isFiltered,\n      updateFilter,\n      resetFilter,\n      resetFilters,\n      applyFilters,\n      globalFilter,\n      updateGlobalFilter,\n      filteredCount,\n      setFilteredCount\n    }}\n    >\n      { props.children }\n    </LiveFilteringContext.Provider>\n  );\n};\n\nLiveFilteringProvider.propTypes = {\n  data: PropTypes.array, // data rows to be filtered\n  filters: PropTypes.object, // current state of filters\n  globalFilter: PropTypes.string, // react-table feature, filters all columns\n  searchKeys: PropTypes.array, // which keys to match for text search\n  subTableKey: PropTypes.string,\n  refreshKey: PropTypes.number,\n  children: PropTypes.node, // nodes wrapped by this context,\n  useQueryString: PropTypes.bool, // read and set filters in query stirng\n};\n\nLiveFilteringProvider.defaultProps = {\n  data: [],\n  filters: {},\n  useQueryString: false,\n  refreshKey: 0,\n};\n\nexport { LiveFilteringProvider, LiveFilteringContext };\n","import React from 'react';\n\n\nconst RulesContext = React.createContext({\n  tree:[],\n  selectedRule: null,\n  verticalId: 0,\n  product: '',\n  attributes: [],\n  attributeGroups: [],\n  api:{},\n  allowEdit: false,\n});\n\nexport default RulesContext;\n","import axios from 'axios';\n\n/*\n * Adapted from: https://github.com/FrancescoSaverioZuppichini/API-Class\n * Sets up Axios client and handlers used for all APIs.\n * Creates generic list, show, create, update, and delete methods that are\n * used for many Core API endpoints.\n *\n * Instances of API classes are created in AppProvider and available through React context (AppContext)\n *\n * Usage:\n * Create class that extends the base and provide a base URL\n *  class CoreAPI extends BaseAPI {\n *    constructor() {\n *      super(process.env.API_URL_CORE, [... optional array of endpoint names...] );\n *    }\n *\n * If endpointNames array is provided, methods for list, show, update, create, and delete\n * will be created for each of them. In addition, custom methods can be created in the extended class.\n *\n * Using the core API in the global scope:\n * In components with a reference to context\n * const app = useContext(AppContext);\n * const accounts =  await app.api.endpoints.accounts.list();\n *\n * Using the useApi hook (which has its own context reference\n *    const{api} = useApi();  //core api for general usage\n *    or\n *    const apiUpdate = useApi('orders', 'update');\n *\n * Using other APIs.\n *    const app = useContext(AppContext);\n *    const Accounting = React.useMemo( () => app.getApi('accounting'), []);\n *    const result = await Accounting.updateCard(params);\n */\nclass BaseAPI {\n  constructor(baseUrl, endpointNames = [], requestCallback) {\n    this.url = baseUrl;\n    this.endpoints = {};\n    this.requestCallback = requestCallback;\n    this.error = {};\n    this.client = axios.create({\n      baseURL: this.url,\n    });\n    this.client.interceptors.request.use(\n      (request) => this.requestHandler(request),\n    );\n    this.client.interceptors.response.use(\n      (response) => this.successHandler(response),\n      (error) => this.errorHandler(error),\n    );\n    if (endpointNames) {\n      this.createAll(endpointNames);\n    }\n  }\n\n  /**\n   * Create and store a single entity's endpoints\n   * @param entityName string\n   */\n  createEntity = (entityName) => {\n    // check for format (eg,'target-segments' in url, but targetSegments as object property)\n    const key = this.kebabCaseToCamel(entityName);\n    if (!this.endpoints.hasOwnProperty(key)) {\n      this.endpoints[key] = this.createEndpoints(entityName);\n    }\n  };\n\n  createEntities = (arrayOfEntity) => arrayOfEntity.map((entity) => this.createEntity(entity));\n\n  createAll = (endpointNames) => this.createEntities(endpointNames);\n\n  kebabCaseToCamel = (str) => str.replace(/(-\\w)/g, (matches) => matches[1].toUpperCase());\n\n  /**\n   * Create the basic endpoints handlers for CRUD operations\n   * Called like:\n   * api.endpoints.accounts.list()\n   * api.endpoints.orders.show(29)\n   *\n   * @param name string\n   */\n  createEndpoints = (name) => {\n    const endpoints = {};\n\n    // Create the basic REST endpoints\n    endpoints.list = (params = {}) => this.makeRequest('get', name, params);\n\n    endpoints.show = (id, params={}) => this.makeRequest('get', `${name}/${id}`, params);\n\n    endpoints.create = (toCreate) => this.makeRequest('post', `${name}`, toCreate);\n\n    endpoints.update = (toUpdate) => {\n      const {id, ...rest} = toUpdate;\n      return this.makeRequest(\"put\", `${name}/${id}`, rest)\n    };\n\n    endpoints.delete = (id) => this.makeRequest('delete', `${name}/${id}`);\n\n    return endpoints;\n  };\n\n  batchGet = async (requests) => {\n    let promises = [];\n    if (Array.isArray(requests) && requests.length) {\n      // array of objects likes {endpoint:'vendors',action:'list', params:{param:1}}\n      promises = requests.reduce((acc, { endpoint, action, params }) => {\n        // console.log('API.js: endpoint, action', endpoint, action, this.endpoints[endpoint][action]);\n        if (this.endpoints.hasOwnProperty(endpoint)) {\n          acc.push(this.endpoints[endpoint][action](params));\n        }\n        return acc;\n      }, []);\n    }\n\n    let result = false;\n    try {\n      result = await Promise.all(promises);\n    } catch (error) {\n      this.setError(error);\n    }\n    return result;\n  };\n\n  requestHandler = (request) => {\n    this.clearError();\n\n    const token = request.token || window.sessionStorage.UE_CLICKS_AUTH_TOKEN;\n\n    if (token) {\n      request.headers.Authorization = `Bearer ${token}`;\n    }\n\n    // For go-accounting service, we get a CORS error if we use content-type application/json\n    // (because it triggers pre-flight request)\n    if (request.url.indexOf('accounting.platform.ue.co') !== -1) {\n      request.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n    }\n\n    return request;\n  };\n\n  errorHandler = (error) => {\n    this.setError(error.response.data, error.response.status);\n    return Promise.reject(error.response);\n  };\n\n  successHandler = (response) => {\n    this.requestCallback && this.requestCallback();\n\n    // Some endpoints return no body (Privacy API optout 201, 2FA delete 204, etc)\n    if ((response.status === 201 || response.status === 204) && !response.data) {\n      return response;\n    }\n\n    // For blob requests (file downloads) send everything so we can read content-disposition headers, etc\n    if (response.request.responseType && response.request.responseType === 'blob') {\n      return response;\n    }\n\n    return response.data;\n  };\n\n  makeRequest = async (method, url, paramsOrData, config = {}, throwError = false) => {\n    const requestConfig = {\n      url,\n      method,\n      ...config,\n    };\n\n    if (method === 'get') {\n      requestConfig.params = paramsOrData || '';\n    } else {\n      requestConfig.data = paramsOrData || {};\n    }\n\n    try {\n      const response = await this.client.request(requestConfig);\n      return response;\n      // return this.transformResponse(response)\n    } catch (error) {\n      if (throwError) {\n        throw error;\n      }\n      return false;\n    }\n  };\n\n  setError(result, status) {\n    let error = {\n      name: '',\n      message: '',\n      status,\n      form: {},\n    };\n\n    if (status === 500) {\n      error.name = 'Server Error';\n      if (result.error) {\n        if (result.error?.exception && Array.isArray(result.error.exception)) {\n          error.message = result.error.exception[0].message;\n        } else {\n          error.message = result.error;\n        }\n      } else if (result.message) {\n        error.message = result.message;\n      } else {\n        error.message = 'Unknown Server Error';\n      }\n    } else if (status === 404) {\n      error.name = 'Resource Not Found';\n      if (Array.isArray(result.exception) && result.exception.length) {\n        error.message = result.exception[0].message;\n      }\n    } else if (status === 400) {\n      // bad request, parse form errors\n      if (result.form && result.form.hasOwnProperty('children')) {\n        // old return value from symfony form error\n        error.name = 'Invalid Request';\n        // filter out fields with no errors\n        error.form = Object.keys(result.form.children).reduce((acc, field) => {\n          if (result.form.children[field].hasOwnProperty('errors')) {\n            acc[field] = result.form.children[field].errors[0];\n          }\n          return acc;\n        }, {});\n      } else if (result.errors) {\n        // new form validation response  {errors: {some_field: \"This value is not valid.\"}}\n        error.name = 'Invalid Request';\n        error.form = result.errors;\n      }\n    } else if (status === 401) {\n\n      //401s might have reason, account lockout info, reset token\n        error = {\n          name: 'Unauthorized Request',\n          message:'Invalid Credentials',\n          ...error,\n          ...(result.error && typeof result.error === 'object' ? result.error : {}),\n        };\n        if (typeof result.error === 'string') {\n          error.error = result.error;\n        }\n        if (result.message) {\n          error.message = result.message;\n        }\n\n    } else {\n      error.message = `Unknown Error (${status})`;\n    }\n\n    // console.log('API.js:setError', error);\n\n    this.error = error;\n  }\n\n  clearError() {\n    this.error = {\n      name: '',\n      message: '',\n      status: 0,\n      form: {},\n    };\n  }\n\n  // getQueryString(params) {\n  //     return Object\n  //         .keys(params)\n  //         .map(k => {\n  //             if (Array.isArray(params[k])) {\n  //                 return params[k]\n  //                     .map(val => `${encodeURIComponent(k)}[]=${encodeURIComponent(val)}`)\n  //                     .join('&')\n  //             }\n  //\n  //             return `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`\n  //         })\n  //         .join('&')\n  // }\n}\n\nexport default BaseAPI;\n","const LocalStorageService = {\n\n  setLocalItem(key, val) {\n    try {\n      const serialized = JSON.stringify(val);\n      localStorage.setItem(key, serialized);\n    } catch (err) {\n      // Ignore write errors.\n    }\n  },\n\n  getLocalItem(key) {\n    try {\n      const val = localStorage.getItem(key);\n      if (val === null) {\n        return undefined;\n      }\n      return JSON.parse(val);\n    } catch (err) {\n      return undefined;\n    }\n  },\n\n  setSessionItem(key, val) {\n    try {\n      const serialized = JSON.stringify(val);\n      sessionStorage.setItem(key, serialized);\n    } catch (err) {\n      // Ignore write errors.\n    }\n  },\n\n  getSessionItem(key) {\n    try {\n      const val = sessionStorage.getItem(key);\n      if (val === null) {\n        return undefined;\n      }\n      return JSON.parse(val);\n    } catch (err) {\n      return undefined;\n    }\n  },\n\n};\n\nexport default LocalStorageService;\n","import { useState, useContext } from 'react';\nimport { AppContext } from '../Providers/AppProvider';\nimport {Order} from \"../types\";\n//import useApi from \"./useApi\";\n\nconst useFavoriteOrder = () => {\n  const app = useContext(AppContext);\n  const [loading, setLoading] = useState<boolean>(false);\n  //const api = useApi();\n\n  const addOrder = async (id:number) => {\n    setLoading(true);\n    const result = await app.api.endpoints.favorites.addOrder(id);\n    if (result) {\n      app.updateFavoriteOrders(result);\n    }\n    setLoading(false);\n    return result;\n\n  }\n\n  const removeOrder = async (id:number) => {\n    setLoading(true);\n    const result = await app.api.endpoints.favorites.deleteOrder(id);\n    if (result) {\n      app.updateFavoriteOrders(result);\n    }\n    setLoading(false);\n    return result;\n\n  }\n\n  const updateUserFavorites = (orders:Order[]) => app.updateFavoriteOrders(orders)\n\n  return {\n    favorites: app.favorite_orders,\n    loading,\n    addOrder,\n    removeOrder,\n    updateUserFavorites\n  }\n}\n\nexport default useFavoriteOrder;\n","import { useState, useEffect } from 'react';\nimport { matchPath } from 'react-router-dom';\n\nconst getPathMatch = (pathToMatch:string, pattern:string):any =>\n  /* const pattern = [\n        \"/accounts/:accountId/ads\",\n        \"/accounts/:accountId/order/:orderId\",\n       // \"/accounts/:accountId\",\n       //\n\n    ]; */\n  matchPath({\n    path: pattern,\n  },\n    pathToMatch)\n;\n\n  type UseMatchPathReturn = {\n    accountId:number|null;\n    orderId:number|null;\n    setMatchPath:(path:string)=>void;\n  }\n/*\n * Hook for reading account id and order id from router path\n */\nconst useMatchPath = (path:string):UseMatchPathReturn => {\n  const [accountId, setAccountId] = useState<number|null>(null);\n  const [orderId, setOrderId] = useState<number|null>(null);\n\n  const setMatchPath = (path:string) => {\n    const accountMatchPath = getPathMatch(path, '/accounts/:accountId');\n    setAccountId(accountMatchPath ? parseInt(accountMatchPath.params.accountId) : null);\n    const orderMatchPath = getPathMatch(path, '/accounts/:accountId/order/:orderId');\n    setOrderId(orderMatchPath ? parseInt(orderMatchPath.params.orderId) : null);\n  };\n\n  useEffect(() => {\n    if (path) {\n      setMatchPath(path);\n    }\n  }, [path]);\n\n  return {accountId, orderId, setMatchPath} as UseMatchPathReturn;\n};\n\nexport default useMatchPath;\n","import React, {useContext, useState, useEffect, ChangeEvent} from 'react';\nimport {\n  Row,\n  Col,\n  Button,\n  FormGroup,\n  ModalFooter,\n  Label,\n  Input,\n  FormFeedback,\n  InputGroup,\n  Spinner,\n} from 'reactstrap';\nimport * as Yup from 'yup';\nimport { Required } from '../../../Components/Form/FormCommon';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport DynamicSingleSelect from '../../../Components/Form/DynamicSingleSelect';\nimport LoadingBar from '../../../Layout/LoadingBar';\nimport { titleCaseWord } from '../../../utils/string';\nimport usePermission from '../../../Hooks/usePermission';\nimport useFormState from '../../../Hooks/useFormState';\nimport useApi from '../../../Hooks/useApi';\nimport { AppContext } from '../../../Providers/AppProvider';\nimport {OrderPropertiesType} from \"../advertiser\";\nimport {Account} from \"../../../types\";\n//@ts-ignore\nimport confirm from \"reactstrap-confirm\";\nimport IconCheckbox from \"../../../Components/Form/IconCheckbox\";\n\nconst ValidationSchema = Yup.object().shape({\n  name: Yup.string().trim().required('Please enter an order name'),\n  product: Yup.string().trim().required('Please select a product'),\n  account_id: Yup.number().transform((n) => (isNaN(n) ? 0 : n)).moreThan(0, 'Please select an account'),\n  vertical_id: Yup.number().transform((n) => (isNaN(n) ? 0 : n)).moreThan(0, 'Please select a vertical'),\n});\n\n/*\n * Component for editing settings or creating an order associated with an account\n */\nconst Order = ({ order = {}, account, cancel }:OrderPropertiesType) => {\n  const { api } = useApi();\n  const app = useContext(AppContext);\n  const [accountList, setAccountList] = useState<Account[]>([]);\n  // const[loader, setLoader] = useGlobal('loader');\n  const isNew = order.id === 0;\n  const allowEdit = usePermission('orders.edit');\n  const allowEditStatus = usePermission('order_status.edit');\n\n  // Ad data may be already set from clicking on a link in the list.\n  // If not, it we are creating a new ad, or we will load the ad from the API\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      id: 0,\n      account_id: account.id,\n      vertical_id: isNew ? 0 : order.vertical?.id,\n      vertical: {},\n      status: 'active',\n      name: '',\n      product: '',\n      transfer_number: '',\n      skip_accounting: false,\n      ...order,\n    },\n    ValidationSchema,\n  );\n\n  useEffect(() => {\n    loadAccountListOptions()\n  }, []);\n\n  const handleSave = () => {\n    if (formApi.validate()) {\n      save();\n    }\n  };\n\n  const loadAccountListOptions = async () => {\n    const accountList = await api.endpoints.accounts.list();\n    setAccountList(accountList);\n  };\n\n  const save = async () => {\n    app.showLoader('modal', 'Saving Order...');\n    let result;\n\n    const order = { ...formValues };\n\n    // format number to +18885552222  (masking should give us +1 already)\n    // no longer setting this here\n    // if(order.transfer_number){\n    //   order.transfer_number = order.transfer_number.replace(/[^\\d\\+]/g, '')\n    // }\n\n    if (order.id) {\n      result = await api.endpoints.orders.update(order);\n    } else {\n      result = await api.endpoints.orders.create(order);\n    }\n\n    app.showLoader(false);\n\n    if (!result) {\n      notify(`Unable to save order: ${api.error.name}`, 'error');\n    } else {\n      cancel(true);\n    }\n  };\n\n  const archiveConfirm = async () => await confirm({\n    title: 'Archive Order',\n    message: 'Archive this item? It will be de-activated and removed from all listings.',\n    confirmText: 'Yes, archive it',\n    cancelText: \"Cancel archive\",\n  })\n\n  const handleChangeStatus = async(evt:ChangeEvent<HTMLInputElement>) => {\n    const status = evt?.target?.value\n    if (status) {\n      if (status === 'archived') {\n        const doArchive = await archiveConfirm()\n        if (doArchive) {\n          formApi.setValue('status', status)\n        }\n      } else {\n        formApi.setValue('status', status)\n      }\n    }\n  }\n\n  // const {name, product, status, vertical, vertical_id, account_id} = this.state.order;\n  if (!allowEdit) return null;\n\n  return (\n    <>\n      <LoadingBar name=\"modal\" />\n\n      {!formIsValid\n            && (\n            <StandardAlert color=\"warning\" className=\"alert-form-validation\">\n              Please correct the errors below before continuing\n            </StandardAlert>\n            )}\n\n      <Row>\n        <Col sm={12}>\n          <FormGroup>\n            <Label>\n              Name\n              {' '}\n              <Required />\n            </Label>\n\n            <Input\n              type=\"text\"\n              name=\"name\"\n              onChange={formApi.handleOnChange}\n              value={formValues.name || ''}\n              invalid={!!formErrors.name}\n            />\n            <FormFeedback>{formErrors.name}</FormFeedback>\n          </FormGroup>\n\n          <FormGroup>\n            <Label>\n              Account\n              {' '}\n              { isNew && <Required />}\n            </Label>\n\n            {/* New order: Async fetch of account options */}\n            {isNew && accountList.length > 0 && (\n              <Input\n                type=\"select\"\n                name=\"account_id\"\n                defaultValue={formValues.account_id}\n                onChange={formApi.handleOnChange}\n                invalid={!!formErrors.account_id}\n              >\n                <option value=\"0\">Select...</option>\n                {\n                   accountList.map((acct, index) => (<option value={acct.id} key={index}>{acct.name}</option>))\n                 }\n\n              </Input>\n\n            )}\n\n            {/* New Order: Spin until we get Accounts */}\n            { isNew && accountList.length === 0 && (\n              <div className=\"inline-loading\">\n                <Spinner size=\"sm\" />\n                {' '}\n                Loading...\n              </div>\n            )}\n\n            {/* Read only text for existing order */}\n            { !isNew && account && (\n              <>\n                <Input type=\"text\" defaultValue={account.name} readOnly />\n                <Input type=\"hidden\" name=\"account_id\" defaultValue={account.id} />\n              </>\n            )}\n            <FormFeedback>{formErrors.account_id}</FormFeedback>\n\n          </FormGroup>\n\n          <FormGroup>\n\n            <Label>\n              Vertical\n              {' '}\n              { isNew && <Required />}\n            </Label>\n            { isNew && (\n              <DynamicSingleSelect\n                onChange={formApi.handleOnChange}\n                value={formValues.vertical_id ? String(formValues.vertical_id) : ''}\n                name=\"vertical_id\"\n                endpoint=\"verticals\"\n                invalid={!!formErrors.vertical_id}\n                labelProperty=\"display_name\"\n                params={{options:true}}\n              />\n            )}\n\n            {/* Read only text for existing order */}\n            { !isNew && formValues.vertical && (\n              <>\n                <Input type=\"text\" defaultValue={formValues.vertical.display_name} readOnly />\n                <Input type=\"hidden\" name=\"vertical_id\" defaultValue={formValues.vertical.id} />\n              </>\n            )}\n            <FormFeedback>{formErrors.vertical_id}</FormFeedback>\n          </FormGroup>\n\n          <FormGroup>\n\n            <Label>\n              Product\n              {' '}\n              { isNew && <Required />}\n            </Label>\n            { isNew && (\n\n              <InputGroup>\n                <Input\n                  type=\"select\"\n                  onChange={formApi.handleOnChange}\n                  defaultValue={formValues.product}\n                  name=\"product\"\n                  invalid={!!formErrors.product}\n                >\n                  <option value=\"\">Select...</option>\n                  <option value=\"clicks\">Clicks</option>\n                  <option value=\"calls\">Calls</option>\n                  <option value=\"leads\">Leads</option>\n                  <option value=\"opportunities\">Opportunities</option>\n                </Input>\n              </InputGroup>\n\n            )}\n\n            {/* Read only text for existing order */}\n            { !isNew && formValues.product && (\n              <>\n                <Input type=\"text\" defaultValue={titleCaseWord(formValues.product)} readOnly />\n                <Input type=\"hidden\" name=\"product\" defaultValue={formValues.product} />\n              </>\n            )}\n            <FormFeedback>{formErrors.product}</FormFeedback>\n          </FormGroup>\n\n          <FormGroup>\n            <Label>\n              Status\n            </Label>\n            {/* special permission where product is c2c (leads) or calls */}\n            { (allowEditStatus || formValues.product === 'clicks') ? (\n              <InputGroup>\n                <Input type=\"select\" onChange={handleChangeStatus} value={formValues.status} name=\"status\">\n                  <option value=\"active\">Active</option>\n                  <option value=\"paused\">Paused</option>\n                  {!isNew && <option value=\"archived\">Archived</option>}\n                </Input>\n              </InputGroup>\n            ) : (\n              <span>\n                :\n                {isNew === true ? 'Paused' : titleCaseWord(formValues.status)}\n              </span>\n            )}\n          </FormGroup>\n\n          <FormGroup>\n            <Label>\n              Skip Accounting\n            </Label>\n            <IconCheckbox\n              name=\"skip_accounting\"\n              value={Boolean(formValues.skip_accounting)}\n              onChange={formApi.handleOnChange}\n            >\n              If checked, lead sales to this order will NOT reduce funds on the account. Only use this for orders that are internal, or on invoice agreements!\n            </IconCheckbox>\n          </FormGroup>\n\n        </Col>\n\n      </Row>\n\n      <ModalFooter>\n\n\n          <Button\n            onClick={()=>cancel(false)}\n            color=\"link\"\n            size=\"sm\"\n          >\n            Cancel\n          </Button>\n\n          <Button\n            onClick={handleSave}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            Save\n          </Button>\n\n      </ModalFooter>\n\n    </>\n  );\n};\n\n\nexport default Order;\n","import React, {FC} from 'react';\nimport { Modal, ModalBody, ModalHeader } from 'reactstrap';\nimport Order from './index';\nimport {OrderModalPropertiesType} from \"../advertiser\";\n\n/*\n * Modal for order edit form\n */\nconst OrderModal:FC<OrderModalPropertiesType> = ({\n  order, account, isOpen, cancel,\n}) => {\n\n  if (!order || !account) return null;\n\n  const handleToggle = () => cancel();\n\n  const title = order.id ? 'Edit Order Settings' : 'Create Order';\n  return (\n    <Modal isOpen={isOpen} toggle={handleToggle}>\n      <ModalHeader toggle={handleToggle}>{title}</ModalHeader>\n      <div className=\"modal-subheader\">\n        <span>\n          {account.name}\n          {' '}\n          &gt;\n          {' '}\n          {order.id ? order.name : 'New Order' }\n        </span>\n      </div>\n      <ModalBody>\n        <Order\n          order={order}\n          account={account}\n          cancel={cancel}\n        />\n      </ModalBody>\n    </Modal>\n  );\n};\n\nexport default OrderModal;\n","import React, {FC} from \"react\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\nconst StatusDot: FC<any> = ({status, className=\"\", size=\"xs\"}:any) => {\n  return (\n    <div className={`status-dot ${className}`} style={{display:\"inline-block\"}}>\n      {status === 'active' && <span><FaIcon icon=\"circle\" color=\"limegreen\" size={size} title=\"Active\" /></span>}\n      {status === 'paused' && <span><FaIcon icon=\"circle\" color=\"gold\" size={size} title=\"Paused\" /></span>}\n      {status === 'archived' && <span><FaIcon icon=\"circle\" color=\"red\" size={size} title=\"Archived\" /></span>}\n    </div>\n  )\n}\n\nexport default StatusDot;\n","import React, { useState, useEffect, useLayoutEffect, useMemo, useContext, ChangeEvent } from 'react';\nimport { useNavigate, useLocation, Link } from 'react-router-dom';\nimport {\n  Button, ButtonGroup, Row, Col, Nav, NavItem, NavLink, Dropdown, DropdownToggle, DropdownMenu\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames';\nimport { AppContext } from '../Providers/AppProvider';\nimport useApi from '../Hooks/useApi';\nimport useFavoriteOrder from \"../Hooks/useFavoriteOrder\";\nimport useMatchPath from '../Hooks/useMatchPath';\nimport InputWithIcon from './Form/InputWithIcon';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport { titleCaseWord } from '../utils/string';\nimport OrderModal from '../App/AdvertiserManager/Order/OrderModal';\nimport usePermission from '../Hooks/usePermission';\nimport StatusDot from \"./Icons/StatusDot\";\nimport {Account, Order} from \"../types\";\nimport useLocalStorage from \"../Hooks/useLocalStorage\";\n\ntype AccountsObject = {\n  [key:number]:Partial<Account> & {orders:Order[]}\n}\n\n// The menu is 900px wide and right-aligned to its toggle, which sits mid-navbar, so\n// it hangs left across the logo and leaves dead space on the right. This shifts it\n// right via Popper's offset skidding — a margin would be ignored/fought by Popper's\n// positioning transform. Popper's preventOverflow still clamps it inside the\n// viewport, so a narrow window pins it to the right edge rather than overflowing.\nconst MENU_RIGHT_NUDGE = 250;\n// Options-only override of Popper's built-in offset modifier, as DateRangeDropdown\n// does. Reactstrap types `modifiers` as full Popper Modifier objects (enabled/phase/fn\n// required), but supplying those would *replace* the built-in offset implementation\n// rather than configure it — so the partial is what's correct at runtime, and the cast\n// is here because @popperjs/core is only a transitive dep whose types we shouldn't import.\nconst menuModifiers = [{ name: 'offset', options: { offset: [MENU_RIGHT_NUDGE, 0] } }] as any;\n\n/**\n * Large dropdown with searchable list of all accessible accounts, their orders, and links to various functions\n */\nconst AccountMegaMenu = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const app = useContext(AppContext);\n  const [allAccounts, setAllAccounts] = useState<Account[]>([]);\n  const [filtered, setFiltered] = useState<Account[]>([]);\n  const {favorites} = useFavoriteOrder();\n  // show favorites or all tab based on stored setting\n  const [orderViewSetting, setOrderViewSetting] = useLocalStorage(\n    \"favorites_orders_view\",\n    favorites?.length > 0 ? 'favorites' : 'all'\n  )\n  const [view, setView] = useState<string>(orderViewSetting);\n  const [searchVal, setSearchVal] = useState<string>('');\n  const [isOpen, setIsOpen] = useState<boolean>(false);\n  // Selections, set from route params or on click list items\n  const [selectedAccount, setSelectedAccount] = useState<Account|null>(null);\n  const [selectedOrder, setSelectedOrder] = useState<Order|null>(null);\n  const [editOrder, setEditOrder] = useState<Order|null>(null); // might be different from current route\n  const [orderModalOpen, setOrderModalOpen] = useState<boolean>(false);\n  const inpRef = React.createRef(); // useRef(); ?? the useRef hook won't work, maybe because it's forwarded?\n  // Custom hooks\n  const api = useApi('accounts', 'list');\n  const {accountId:routeAccountId, orderId:routeOrderId, setMatchPath} = useMatchPath(location.pathname);\n  const allowViewOrders = usePermission('orders.view');\n  const allowViewUsers = usePermission('users.view');\n  const allowViewAds = usePermission('ads.view');\n  const allowViewLeads = usePermission('leads.view');\n  const allowViewCalls = usePermission('calls.view');\n  const [showLeadsLink, setShowLeadsLink] = useState<boolean>(false);\n  const [showCallsLink, setShowCallsLink] = useState<boolean>(false);\n\n  //Invert the favorites so it is a list by account\n  const favoritesByAccount:Account[] = useMemo(() => {\n    if (!favorites.length) return [];\n    const accounts:AccountsObject = {};\n    if (favorites) {\n      favorites.map((order:Order) => {\n        if (!accounts[order.account.id]){\n          accounts[order.account.id] = {...order.account, orders:[]};\n        }\n        accounts[order.account.id].orders.push(order);\n      })\n    }\n\n\n    return Object.values(accounts).sort((a, b) => {\n      if (a.name && b.name) {\n        return a.name > b.name ? 1 : -1\n      }\n      return 0;\n    }) as Account[];\n  }, [favorites])\n\n\n\n  // Search filters client-side, so the menu needs every account. Without `page` the API\n  // returns the full unpaged list; a capped page silently dropped everything past it\n  // alphabetically once accounts passed 1000.\n  const load = async() => {\n    const result = await api.fetch({});\n\n    if (result) {\n      setAllAccounts(result);\n\n      if (view === 'favorites') {\n        toggleView('favorites')\n      } else {\n        setFiltered(result);\n      }\n\n    }\n  }\n\n  const gotoRoute = (route:string) => { navigate(route); setIsOpen(false); };\n\n  const handleEditOrder = (order:Order) => {\n    setEditOrder(order);\n    setOrderModalOpen(true);\n  };\n\n  const handleCloseOrderModal = (refresh:boolean=false) => {\n    setOrderModalOpen(false);\n    if (refresh) {\n      load()\n      app.dispatch({type: 'bump_accounts_page_version'});\n    }\n  };\n\n  const hasOrderWithProduct = (account:Account|null, product:string):boolean => {\n    if (account && account.orders) {\n      return account.orders.some((ord) => ord.product === product);\n    }\n    return false;\n  };\n\n  const toggleView = (v:string) => {\n    if (v === 'favorites'){\n      setFiltered(favoritesByAccount);\n      if (favoritesByAccount.length) {\n        setSelectedAccount(favoritesByAccount[0])\n        scrollToAccount(favoritesByAccount[0].id)\n      } else {\n        setSelectedAccount(null)\n      }\n\n      setSearchVal('')\n    } else {\n      if (!selectedAccount) {\n        setSelectedFromRoute();\n      } else {\n        scrollToAccount(selectedAccount.id)\n      }\n      setFiltered(allAccounts)\n    }\n    setView(v);\n    setOrderViewSetting(v)\n  }\n\n  //Called on mount, when route changes, or when toggling view to All\n  const setSelectedFromRoute = () => {\n    if (allAccounts?.length) {\n      let targetAccount;\n      let routeAccount = allAccounts.find((acc) => acc.id === routeAccountId);\n      if (!routeAccount && allAccounts.length === 1) routeAccount = allAccounts[0]; // only one account\n      const routeOrder = routeAccount ? routeAccount.orders.find((ord) => ord.id === routeOrderId) : null;\n      if (routeAccount || routeOrder) {\n        targetAccount = routeAccount;\n        app.dispatch({ type: 'current_account', value: routeAccount });\n        setSelectedOrder(routeOrder ?? null);\n      } else if (app.currentAccount) {\n        //setSelectedAccount(allAccounts.find((acc) => acc.id === app.currentAccount.id));\n        targetAccount = allAccounts.find((acc) => acc.id === app.currentAccount.id)\n      }\n\n      if (targetAccount) {\n        setSelectedAccount(targetAccount);\n      } else {\n        setSelectedAccount(allAccounts[0]);\n      }\n      //setView('all');\n    }\n  };\n\n  const scrollToAccount = (id:number) => {\n    const el = document.getElementById(`account-link-${id}`)\n    if (el) {\n      //sometimes we need a bit of time to render because tabs have to switch etc\n      setTimeout(()=> {\n        if (!isScrolledIntoView(el)){\n          el.scrollIntoView({behavior:\"auto\"})\n        }\n      }, 200)\n    }\n  }\n\n  const isScrolledIntoView = (elem:HTMLElement) => {\n    const container = document.getElementById('account-list-pane')\n    if (container) {\n      const { bottom, height, top } = elem.getBoundingClientRect();\n      const containerRect = container.getBoundingClientRect();\n      return top <= containerRect.top ? containerRect.top - top <= height : bottom - containerRect.bottom <= height;\n    }\n  }\n\n  // Load data on mount\n  // TODO: account filter for user role (this might be on server side)\n  useEffect(() => {\n    load()\n  }, []);\n\n  // Refresh when OrderList signals a change (e.g. order created/updated from that page)\n  useEffect(() => {\n    if (app.accountsMenuVersion === 0) return\n    load()\n    setSelectedAccount(null)\n  }, [app.accountsMenuVersion]);\n\n  // Focus to input on mount\n  useEffect(() => {\n    if (isOpen && inpRef.current) { // @ts-ignore\n      inpRef.current.focus();\n    }\n    }, [inpRef]);\n\n  // Monitor favorites changes\n  useEffect(() => {\n    if (!favorites?.length && view !== 'all') toggleView('all');\n  }, [favorites]);\n\n  // Monitor stored favorites setting changes\n  useEffect(() => {\n    if (view !== orderViewSetting) {\n      toggleView(orderViewSetting);\n    }\n  }, [ orderViewSetting]);\n\n\n  useLayoutEffect(()=> {\n    if (selectedAccount) {\n      scrollToAccount(selectedAccount.id);\n    }\n  }, [view])\n\n  // Extract account/order when location changes\n  useEffect(() => {\n    setMatchPath(location.pathname);\n  }, [location.pathname]);\n\n  // Set selected account when accounts load or route changes\n  useEffect(() => {\n    setSelectedFromRoute();\n  }, [allAccounts, routeAccountId, routeOrderId]);\n\n  // Handle account selection change, set viewable links\n  useEffect(() => {\n    setShowLeadsLink(hasOrderWithProduct(selectedAccount, 'leads'));\n    setShowCallsLink(hasOrderWithProduct(selectedAccount, 'calls'));\n  }, [selectedAccount]);\n\n  useLayoutEffect(()=>{\n    if (isOpen && selectedAccount) {\n      scrollToAccount(selectedAccount.id)\n    }\n  }, [isOpen])\n\n  // execute search\n  useEffect(() => {\n    if (allAccounts) {\n      if (searchVal) {\n        const filtered = allAccounts.filter((a) => a.name.toLowerCase().search(searchVal.toLowerCase()) !== -1);\n        setView('all');\n        setFiltered(filtered);\n        setSelectedAccount(filtered.length === 1 ? filtered[0] : null);\n      } else {\n        setFiltered([...allAccounts]);\n        if (app.currentAccount) {\n          const acc = allAccounts.find((acc) => acc.id == app.currentAccount.id)\n          setSelectedAccount(acc ?? null);\n        }\n      }\n    }\n  }, [searchVal]);\n\n  if (!allAccounts) return (null);\n\n  return (\n    <>\n      <Dropdown nav isOpen={isOpen} toggle={() => setIsOpen(!isOpen)}>\n        <DropdownToggle nav caret className={classnames({ active: location.pathname.indexOf('accounts') > 0 })}>\n          {/*<MegaMenuButton account={selectedAccount} order={selectedOrder} />*/}\n          Advertisers\n        </DropdownToggle>\n        <DropdownMenu id=\"select-account-dropdown\" className=\"animate dropDownX\" end modifiers={menuModifiers}>\n          <div id=\"account-mega-menu\" className=\"body\">\n            <div className=\"menu-rows\">\n\n              <Row className=\"align-items-center\">\n                <Col sm={9}>\n                  <div className=\"search-wrapper search-filter\">\n                    <InputWithIcon\n                      icon=\"search\"\n                      iconSize=\"lg\"\n                      placeholder=\"Search for Accounts\"\n                      value={searchVal}\n                      onChange={(e:ChangeEvent<HTMLInputElement>) => setSearchVal(e.target.value)}\n                      innerRef={inpRef}\n                      containerClass=\"expands\"\n                    />\n                  </div>\n                </Col>\n                <Col className=\"text-end\">\n                  {/* TODO: Display based on role permissions */}\n                  {/* TODO: Open modal? for now we are just going to the accounts page, which has the modals */}\n                  {/* <Button outline block onClick={()=>{ gotoRoute( \"/accounts\");}}>New Account</Button> */}\n                  <Button color=\"link\" size=\"xs\" onClick={() => { gotoRoute('/accounts'); }}>Account Dashboard</Button>\n                </Col>\n              </Row>\n\n              <Row className=\"account-header border-top border-bottom\">\n                <Col sm={4}>\n                  <div className=\"d-flex align-items-center\">\n                    <h5>ACCOUNTS</h5>\n                    <ButtonGroup className=\"ms-3\">\n                      <Button size=\"xs\" outline active={view==='all'} onClick={()=>toggleView('all')}>All</Button>\n                      <Button size=\"xs\" outline active={view==='favorites'} onClick={()=>toggleView('favorites')} disabled={!favorites?.length}>Favorite Orders</Button>\n                    </ButtonGroup>\n                  </div>\n\n                </Col>\n                <Col className=\"d-flex align-items-center justify-content-between\">\n                  {selectedAccount && (\n                    <>\n                      <h5>{selectedAccount.name}</h5>\n\n                      <div className=\"account-actions text-right\">\n\n                        {allowViewLeads && showLeadsLink && (\n                          <Button color=\"link\" size=\"sm\" title={`View leads for account ${selectedAccount.name}`} onClick={() => gotoRoute(`/reports/leads?accounts=${selectedAccount.id}`)}>\n                            <FaIcon icon=\"id-card\" size=\"sm\" />\n                            &nbsp;Leads\n                          </Button>\n                        )}\n\n                        {allowViewCalls && showCallsLink && (\n                          <Button color=\"link\" size=\"sm\" title={`View calls for account ${selectedAccount.name}`} onClick={() => gotoRoute(`/reports/calls?accounts=${selectedAccount.id}`)}>\n                            <FaIcon icon=\"phone\" size=\"sm\" />\n                            &nbsp;Calls\n                          </Button>\n                        )}\n\n                        {allowViewAds === true && (\n                          <Button color=\"link\" size=\"sm\" title={`View and Edit ads for account ${selectedAccount.name}`} onClick={() => gotoRoute(`/accounts/${selectedAccount.id}/ads`)}>\n                            <FaIcon icon=\"images\" size=\"sm\" />\n                            &nbsp;Ads\n                          </Button>\n                        )}\n\n                      {allowViewUsers === true && (\n                        <Button color=\"link\" size=\"sm\" title={`Edit users for account ${selectedAccount.name}`} onClick={() => gotoRoute(`/users?account=${selectedAccount.id}`)}>\n                          <FaIcon icon=\"users\" size=\"sm\" />\n                          &nbsp;Users\n                        </Button>\n                      )}\n\n                        {/* <Button  size=\"sm\" color=\"warning\" onClick={()=>{\n                                      gotoRoute( \"/accounts\");\n                                  }}>Account Dashboard</Button> */}\n\n                        {/* <Button  size=\"sm\" color=\"primary\" onClick={()=>{\n                                      gotoRoute( \"/accounts\");\n                                  }}>New Order</Button> */}\n                      </div>\n                    </>\n                  )}\n                </Col>\n              </Row>\n\n\n                <Row className=\"account-row\">\n                  <Col sm={4} className=\"account-list-col border-right\" id=\"account-list-pane\">\n                    <Nav vertical>\n                      {filtered.map((account, i) => (\n                        <NavItem key={i} id={`account-link-${account.id}`}>\n                          <NavLink\n                            className={classnames({ active: selectedAccount && account.id === selectedAccount.id })}\n                            onClick={() => { setSelectedAccount(account); }}\n                          >\n                            {account.name}\n                          </NavLink>\n\n                        </NavItem>\n                      ))}\n                    </Nav>\n                  </Col>\n                  <Col className=\"account-orders-col\">\n                    <OrderDetails\n                      account={selectedAccount}\n                      selectedOrder={selectedOrder}\n                      gotoRoute={gotoRoute}\n                      closeMenu={() => setIsOpen(false)}\n                      onEditClick={handleEditOrder}\n                      allowViewOrders={allowViewOrders}\n                      allowViewLeads={allowViewLeads}\n                      allowViewCalls={allowViewCalls}\n                    />\n\n                  </Col>\n                </Row>\n\n            </div>\n\n          </div>\n        </DropdownMenu>\n      </Dropdown>\n\n      <OrderModal\n        order={editOrder}\n        account={selectedAccount}\n        isOpen={orderModalOpen}\n        cancel={handleCloseOrderModal}\n      />\n\n    </>\n\n  );\n};\n\ntype OrderDetailsPropertiesType = {\n  account:Account|null;\n  selectedOrder:Order|null;\n  gotoRoute:(route:string) => void;\n  closeMenu:() => void;\n  onEditClick: any;\n  allowViewOrders: boolean;\n  allowViewLeads: boolean;\n  allowViewCalls:boolean;\n}\n\nconst OrderDetails = ({\n  account, selectedOrder, gotoRoute, closeMenu, onEditClick, allowViewOrders, allowViewLeads, allowViewCalls,\n}:OrderDetailsPropertiesType) => {\n  if (!account) return (null);\n\n  const allowEdit = usePermission('orders.edit');\n\n  // TODO: if account has no orders\n  if (account.orders.length === 0) {\n    return (<StandardAlert color=\"light\">This account has no orders</StandardAlert>);\n  }\n\n  return (\n    <>\n      <Row className=\"order-header\">\n        <Col>\n          <h5>Orders</h5>\n        </Col>\n      </Row>\n      <div>\n\n        {account.orders.map((order:Order, i:number) => {\n          const base = `/accounts/${account.id}/order/${order.id}`;\n          return (\n            <div className={classnames({ 'order-row': true, selected: selectedOrder && order.id === selectedOrder.id })} key={i}>\n              <StatusDot status={order.status}  className=\"order-status\" />\n              <div className=\"order-name\">\n                {allowViewOrders\n                  ? <Link to={`${base}/rules`} state={{account}} onClick={closeMenu} title={`Rules and targets for ${order.name}`}>{order.name}</Link>\n                  : order.name\n                }\n              </div>\n\n              <div className=\"order-vertical\">{order.vertical.display_name}</div>\n              <div className=\"order-product\">{titleCaseWord(order.product)}</div>\n              <div className=\"order-actions\">\n                {allowViewOrders && (\n                  <span onClick={() => gotoRoute(`${base}/rules`)}>\n                    <FaIcon\n                      icon=\"clipboard-list\"\n                      size=\"sm\"\n                      title={`Rules and targets for ${order.name}`}\n                    />\n                  </span>\n                )}\n\n\n                {/* TODO: open modal */}\n                {allowEdit && (\n                  <span onClick={() => onEditClick(order)}>\n                     <FaIcon\n                       icon=\"cog\"\n                       size=\"sm\"\n                       title={`Order settings for ${order.name}`}\n                     />\n                  </span>\n\n                )}\n\n                {order.product === 'leads' && allowViewLeads && (\n                  <span onClick={() => gotoRoute(`/reports/leads?accounts=${account.id}&orders=${order.id}`)}>\n                    <FaIcon\n                      icon=\"id-card\"\n                      size=\"sm\"\n                      title={`Lead prospects for ${order.name}`}\n                    />\n                  </span>\n\n                )}\n                {order.product === 'calls' && allowViewCalls && (\n                  <span onClick={() => gotoRoute(`/reports/calls?accounts=${account.id}&orders=${order.id}`)}>\n                    <FaIcon\n                      icon=\"phone\"\n                      size=\"sm\"\n                      title={`Call prospects for ${order.name}`}\n                    />\n                  </span>\n\n                )}\n\n              </div>\n            </div>\n          );\n        })}\n\n      </div>\n    </>\n  );\n};\n\n/* Button that toggles the dropdown, displays selected account and order */\n// const MegaMenuButton = ({ account, order }) =>\n// // Will there be a default account/order that we can set?\n//\n//   (\n//     <>\n//       <small>\n//         Accounts {account && (<span>&gt; {account.name}</span>)}\n//       </small>\n//       {order && <div className=\"order\">{order.name}</div>}\n//     </>\n//   );\nexport default AccountMegaMenu;\n","import React from 'react';\nimport {\n  UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem,\n} from 'reactstrap';\nimport { useLocation, Link } from 'react-router-dom';\nimport classnames from 'classnames';\nimport usePermission from '../Hooks/usePermission';\n\ntype ToolLink = {\n  to: string;\n  label: string;\n  allowed: boolean;\n};\n\ntype ToolGroup = {\n  title: string;\n  links: ToolLink[];\n};\n\n// Shifts the menu right of the toggle it's end-aligned to. Done through Popper's\n// offset modifier rather than CSS, since a margin would be fought by Popper's\n// positioning transform (same reason the width lives in App.scss). Popper's\n// preventOverflow still clamps it inside the viewport at narrow widths.\n// Options-only override of the built-in modifier; cast because reactstrap types the\n// prop as full Popper Modifiers — see AccountMegaMenu for the longer note.\nconst MENU_RIGHT_NUDGE = 50;\nconst menuModifiers = [{ name: 'offset', options: { offset: [MENU_RIGHT_NUDGE, 0] } }] as any;\n\n/**\n * The Tools nav menu, laid out as a multi-column mega menu so the full list of\n * tools fits without a tall scrolling dropdown. Column layout lives in App.scss\n * (see #tools-mega-menu-dropdown) rather than inline on the DropdownMenu, and the\n * menu deliberately has no '.dropDown' animation class — that animation's\n * keyframes end on a transform which, with animation-fill-mode:both, permanently\n * overrides Popper's positioning transform and leaves the menu misplaced.\n */\nconst ToolsMegaMenu = () => {\n  const location = useLocation();\n\n  const allowAuctions = usePermission('auctions.view');\n  const allowDNC = usePermission('dnc.edit');\n  const allowIntegrations = usePermission('integrations.view');\n  const allowMatchTool = usePermission('match_tool.view');\n  const allowRuleSearch = usePermission('rules.search.view');\n  const allowAttributes = usePermission('attributes.edit');\n  const allowInputSchema = usePermission('input_schema.edit');\n  const allowPartners = usePermission('partners.view');\n  const allowDBA = usePermission('dbas.view');\n  const allowVerticals = usePermission('verticals.edit');\n  const allowPromotions = usePermission('promotions.view');\n  const allowUsers = usePermission('users.view');\n  const allowRoles = usePermission('roles.edit');\n  const allowPermissions = usePermission('permissions.edit');\n  const allowChanges = usePermission('changes.view');\n  const allowReturnRules = usePermission('return_rules.view');\n\n  // Column order is deliberate: the menu is right-aligned under the Tools toggle at\n  // the right end of the navbar, so the LAST column sits closest to the cursor.\n  // Operations goes last because its items (Auctions, Change Log, Integrations) are\n  // the most frequently used, making them the shortest trip from the toggle.\n  const groups: ToolGroup[] = [\n    {\n      title: 'Users & Access',\n      links: [\n        { to: '/tools/permissions', label: 'Permissions', allowed: allowPermissions },\n        { to: '/tools/roles', label: 'Roles', allowed: allowRoles },\n        { to: '/users', label: 'Users', allowed: allowUsers },\n      ],\n    },\n    {\n      title: 'Targeting & Matching',\n      links: [\n        { to: '/tools/inputschema', label: 'Input Schema', allowed: allowInputSchema },\n        { to: '/tools/matching', label: 'Match Tool', allowed: allowMatchTool },\n        { to: '/tools/rules', label: 'Rule Search', allowed: allowRuleSearch },\n        { to: '/tools/attributes', label: 'Targeting Attributes', allowed: allowAttributes },\n      ],\n    },\n    {\n      title: 'Partners & Monetization',\n      links: [\n        { to: '/tools/dba', label: 'DBAs', allowed: allowDBA },\n        { to: '/tools/partners', label: 'Partners', allowed: allowPartners },\n        { to: '/tools/promotions', label: 'Promotions', allowed: allowPromotions },\n        { to: '/verticals', label: 'Verticals', allowed: allowVerticals },\n      ],\n    },\n    {\n      title: 'Operations',\n      links: [\n        { to: '/auctions', label: 'Auctions', allowed: allowAuctions },\n        // Change Log lives here rather than under Users & Access: it's a read-only\n        // view of live activity, like the rest of this group, not an admin control.\n        { to: '/changes', label: 'Change Log', allowed: allowChanges },\n        { to: '/deliveries', label: 'Deliveries', allowed: allowAuctions },\n        { to: '/deliveries/queue', label: 'Delivery Queue', allowed: allowAuctions },\n        { to: '/tools/dnc', label: 'DNC/Opt-out', allowed: allowDNC },\n        { to: '/tools/integrations', label: 'Integrations', allowed: allowIntegrations },\n        { to: '/tools/return-rules', label: 'Return Rules', allowed: allowReturnRules },\n      ],\n    },\n  ]\n    // Links are written in alphabetical order above; the sort keeps them that way\n    // so a new entry can be appended to its group without hunting for the spot.\n    .map((group) => ({\n      ...group,\n      links: group.links\n        .filter((link) => link.allowed)\n        .sort((a, b) => a.label.localeCompare(b.label)),\n    }))\n    .filter((group) => group.links.length > 0);\n\n  if (!groups.length) return null;\n\n  const isActive = location.pathname.indexOf('tools') > 0 || location.pathname.indexOf('changes') > 0;\n\n  return (\n    <UncontrolledDropdown nav>\n      <DropdownToggle nav caret className={classnames({ active: isActive })}>Tools</DropdownToggle>\n      <DropdownMenu id=\"tools-mega-menu-dropdown\" end modifiers={menuModifiers}>\n        <div className=\"tools-mega-menu\">\n          {groups.map((group) => (\n            <div className=\"tools-group\" key={group.title}>\n              <DropdownItem header>{group.title}</DropdownItem>\n              {group.links.map((link) => (\n                <DropdownItem tag={Link} to={link.to} key={link.to}>{link.label}</DropdownItem>\n              ))}\n            </div>\n          ))}\n        </div>\n      </DropdownMenu>\n    </UncontrolledDropdown>\n  );\n};\n\nexport default ToolsMegaMenu;\n","import React from 'react';\n\nconst ENV_LABELS: Record<string, string> = {\n  development: 'Dev',\n  stage: 'Stage',\n  integration: 'Integration',\n  preview: 'Preview',\n  convergence: 'Convergence',\n};\n\n/*\n * Shows which non-production environment the app is running in.\n * APP_ENV is baked in at build time per webpack config; renders nothing in production.\n */\nconst EnvironmentBadge = () => {\n  const env = process.env.APP_ENV;\n\n  if (!env || env === 'production') {\n    return null;\n  }\n\n  return (\n    <span\n      className={`env-badge env-badge-${env}`}\n      title={`You are in the ${ENV_LABELS[env] || env} environment, not production`}\n    >\n      {ENV_LABELS[env] || env}\n    </span>\n  );\n};\n\nexport default EnvironmentBadge;\n","import React, { useContext } from 'react';\nimport {\n  Collapse, Navbar, NavbarBrand, Nav, UncontrolledDropdown, DropdownMenu, DropdownToggle, DropdownItem,\n} from 'reactstrap';\nimport {\n  useLocation, Link,\n} from 'react-router-dom';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames';\nimport AccountMegaMenu from '../Components/AccountMegaMenu';\nimport ToolsMegaMenu from './ToolsMegaMenu';\nimport EnvironmentBadge from './EnvironmentBadge';\nimport usePermission from '../Hooks/usePermission';\nimport { AppContext } from '../Providers/AppProvider';\nimport logoImage from '../images/DMS_logo_mastodon_white.svg';\n// import AppSelect from './AppSelect';\n\n\nconst Header = () => {\n  const location = useLocation();\n  const appContext = useContext(AppContext);\n  // const[settingsModalOpen, setSettingsModalOpen] = useGlobal('mySettingsModal');\n  const allowAccountsView = usePermission('accounts.view');\n  const allowViewAdvReports = usePermission('advertiser_reports.view');\n  const allowViewPubReports = false; //usePermission('vendor_reports.view'); //MRK-8107 disable\n  const allowViewCalls = usePermission('calls.view');\n  const allowViewLeads = usePermission('leads.view');\n  const allowChannels = usePermission('channels.view');\n  const allowRouting= usePermission('routing.view');\n  const allowSources = usePermission('sources.view');\n  const allowSaleGroups = usePermission('sales_groups.view');\n  const allowSalesFlows = usePermission('sales_flows.view');\n  const allowPhoneNumbers = usePermission('phone_numbers.view');\n  const allowAuctions = usePermission('auctions.view');\n  const allowClickArbs = usePermission('click_arb_reports.view');\n  const allowVendors = usePermission('vendors.view');\n  const allowPublisherPortal = false; //MRK-10881 HIDE appContext.vendor_id !== null;\n  const allowNotifications = usePermission('notifications.edit');\n  const allowSourceTokens = usePermission('source_tokens.view');\n\n  const openProfileModal = () => appContext.dispatch({ type: 'global_modal', value: 'profile' });\n  const openPasswordModal = () => appContext.dispatch({ type: 'global_modal', value: 'password' });\n  const openTwoFactorModal = () => appContext.dispatch({ type: 'global_modal', value: '2fa' });\n\n  return (\n    <header className=\"header-main\">\n      <Navbar className=\"main-navbar\" expand=\"md\" fixed=\"top\">\n\n        { allowAccountsView === true ? (\n          <NavbarBrand tag={Link} to=\"/accounts\">\n            <img src={logoImage} width=\"160\" alt=\"Mastodon: powered by DMS\" />\n          </NavbarBrand>\n        ) : (\n          <NavbarBrand>\n            <img src={logoImage} width=\"160\" alt=\"Mastodon: powered by DMS\" />\n          </NavbarBrand>\n        )}\n\n        <EnvironmentBadge />\n\n          <Collapse navbar className=\"navbar-light\">\n\n            <Nav className=\"ms-auto\" navbar>\n\n              { (allowAuctions) && (\n                <UncontrolledDropdown nav>\n                  <DropdownToggle nav caret className={classnames({ active: location.pathname.indexOf('dashboard') > 0 })}>Dashboard</DropdownToggle>\n                  <DropdownMenu>\n                    <DropdownItem tag={Link} to=\"/dashboard/calls\">Calls</DropdownItem>\n                    {allowClickArbs && <DropdownItem tag={Link} to=\"/dashboard/click-arb\">Click Arb</DropdownItem>}\n                    {allowPublisherPortal &&\n                      <DropdownItem tag={Link} to=\"/dashboard/publishers\">Publishers</DropdownItem>}\n                  </DropdownMenu>\n                </UncontrolledDropdown>\n              )}\n\n              <AccountMegaMenu />\n\n              { (allowChannels || allowSources || allowVendors || allowPhoneNumbers || allowRouting || allowSourceTokens) && (\n                <UncontrolledDropdown nav>\n                  <DropdownToggle nav caret className={classnames({ active: location.pathname.indexOf('publishing') > 0 })}>Publishing</DropdownToggle>\n                  <DropdownMenu end>\n                    {allowRouting && <DropdownItem tag={Link} to=\"/routing\">Routing Map</DropdownItem>}\n                    {allowRouting && <DropdownItem tag={Link} to=\"/routing/global\">Global Routing Rules</DropdownItem>}\n                    {allowChannels && <DropdownItem tag={Link} to=\"/publishing/channels\">Channels</DropdownItem>}\n                    {allowSources && <DropdownItem tag={Link} to=\"/publishing/sources\">Sources</DropdownItem>}\n                    {allowSourceTokens && <DropdownItem tag={Link} to=\"/publishing/source-tokens\">Source Tokens</DropdownItem>}\n                    {allowPhoneNumbers && <DropdownItem tag={Link} to=\"/publishing/sources/phone-numbers\">Phone Numbers</DropdownItem>}\n                    {allowVendors && <DropdownItem tag={Link} to=\"/publishing/vendors\">Vendors</DropdownItem>}\n                    {allowSaleGroups && <DropdownItem tag={Link} to=\"/publishing/sale-groups\">Sale Groups</DropdownItem>}\n                    {allowSalesFlows && <DropdownItem tag={Link} to=\"/publishing/sales-flows\">Sales Flows</DropdownItem>}\n                  </DropdownMenu>\n                </UncontrolledDropdown>\n              )}\n\n              { (allowViewPubReports || allowViewAdvReports || allowViewCalls || allowViewLeads) && (\n                <UncontrolledDropdown nav>\n                  <DropdownToggle nav caret className={classnames({ active: location.pathname.indexOf('reports') > 0 })}>Reports</DropdownToggle>\n                  <DropdownMenu>\n                    {allowViewAdvReports && <DropdownItem tag={Link} to=\"/reports/advertiser\">Advertiser Report</DropdownItem>}\n                    {allowViewPubReports && <DropdownItem tag={Link} to=\"/reports/publisher\">Publisher Report</DropdownItem>}\n                    {allowViewCalls && <DropdownItem tag={Link} to=\"/reports/calls\">Calls</DropdownItem>}\n                    {allowViewLeads && <DropdownItem tag={Link} to=\"/reports/leads\">Leads</DropdownItem>}\n                  </DropdownMenu>\n                </UncontrolledDropdown>\n              )}\n\n              <ToolsMegaMenu />\n\n\n              {appContext.user && (\n                <UncontrolledDropdown nav id=\"user-control\">\n                  <DropdownToggle nav className=\"identity-toggle\">\n                    <FaIcon icon=\"user-circle\" className=\"identity-icon\"/>\n                    <span className=\"identity-name\">\n                      {appContext.user.first_name} {appContext.user.last_name}\n                    </span>\n                    {appContext.role && (\n                      <>\n                        <span className=\"identity-divider\" />\n                        <span className={`role-badge role-${appContext.role.name}`}>\n                          {appContext.role.display_name}\n                        </span>\n                      </>\n                    )}\n                    <FaIcon icon=\"chevron-down\" className=\"identity-chevron\"/>\n                  </DropdownToggle>\n                  <DropdownMenu end>\n\n                    <DropdownItem onClick={() => appContext.logout()}>Log Out</DropdownItem>\n                    {/* <DropdownItem tag={Link} to=\"/settings/me\">My Settings</DropdownItem> */}\n                    {/* <DropdownItem tag={Button}  color=\"link\" onClick={()=>setSettingsModalOpen('profile')} >My Profile</DropdownItem>\n                                          <DropdownItem tag={Button}  color=\"link\" onClick={()=>setSettingsModalOpen('password')} >Change Password</DropdownItem> */}\n                    <DropdownItem  onClick={openProfileModal}>My Profile</DropdownItem>\n                    <DropdownItem  onClick={openPasswordModal}>Change Password</DropdownItem>\n                    <DropdownItem  onClick={openTwoFactorModal}>Two-Factor Authentication</DropdownItem>\n                    {allowNotifications && <DropdownItem  tag={Link} to=\"/preferences/notifications\">Notification Preferences</DropdownItem>}\n                  </DropdownMenu>\n                </UncontrolledDropdown>\n              )}\n\n             {/* Removing until we get single sign-on across platforms\n             <NavItem>\n                <AppSelect />\n              </NavItem>*/}\n\n\n\n            </Nav>\n          </Collapse>\n\n      </Navbar>\n\n    </header>\n\n  );\n};\n\nexport default Header;\n","import React from 'react';\nimport {\n  Row, Col, Nav, Navbar, NavItem,\n} from 'reactstrap';\n\nconst Footer = () => (\n  <footer id=\"footer\">\n    <Row className=\"footer-contents\">\n      <Col md={12} lg={4} className=\"d-flex align-items-end mb-lg-0 mb-sm-3\">\n        <Navbar expand=\"md\" className=\"\">\n          <Nav fill>\n            <NavItem>\n              <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ue.co/terms-of-services.html\">\n                Terms of Service\n                      </a>\n            </NavItem>\n            <NavItem>\n              <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ue.co/privacy-policy.html\">\n                Privacy Policy\n                      </a>\n            </NavItem>\n            <NavItem>\n              <a href=\"mailto:support@app.platform.ue.co\">\n                Contact\n                      </a>\n            </NavItem>\n          </Nav>\n        </Navbar>\n      </Col>\n\n      <Col md={12} lg={4}>\n        <div className=\"d-flex flex-column text-md-left text-lg-center\">\n          <div className=\"company\"><img src={require('../images/dms-logo-blue-small.png')} alt=\"Digital Media Solutions\" /></div>\n          <div>(877) 423-1366</div>\n          <div>MST version: {process.env.REACT_APP_VERSION}</div>\n          <div>3665 East Bay Dr., Suite 204-431, Largo, Fl, 33771</div>\n        </div>\n      </Col>\n\n      <Col md={12} lg={4} className=\"d-flex align-items-end mt-sm-3 mt-lg-0\">\n        <div className=\"ms-lg-auto\">&copy; 2020 Digital Media Solutions&reg;, LLC. All Rights Reserved. </div>\n      </Col>\n\n    </Row>\n  </footer>\n);\n\nexport default Footer;\n","import React, {useContext, useEffect, useRef, useState, useCallback} from \"react\";\nimport {\n  Modal, ModalBody, ModalHeader, Button\n} from 'reactstrap';\nimport {AppContext} from \"../Providers/AppProvider\";\nimport useLocalStorage from \"../Hooks/useLocalStorage\";\nimport Mastodon from '../Components/Icons/DMS/Mastodon';\n\nconst CHECK_INTERVAL_SEC = 30;\nconst DELAY_SEC = 60*30; //wait this long when user chooses to delay update\n\n/*\n * VersionChecker component\n *\n * Polls the server for a version file at regular intervals and presents a dialog\n * when the current site version is outdated. The user may choose to refresh or keep working.\n *\n * This component should be placed in a high level layout component.\n *\n * Current version data is inserted into the src/index.js file during the CI build, and becomes\n * a property of the app context during runtime. This component compares that value\n * to a version file in the dist directory, to see if the app is outdated.\n *\n * To make this work in Dev, we need to reconfigure the dev server\n * 1) in config/webpack.dev.js, in the dev server config, set hot:false, and\n *    devMiddleware to 'writeToDisk:true'. This will serve files from disk instead of memory,\n *    and disable hot reloading so the webpack server is not making the site refresh itself\n * 2) In src/index.js, set AppHash to any string value. Comment out the insertion of the environmental variable.\n * 3) In this component, set the interval and delay constants to something fairly quick, say 30 sec with 90 sec delay\n * 4) Restart the container, let the build complete\n * 5) In the ./dist directory, create version.json with contents like: {\"version\": 1, \"hash\": \"foo123\"},\n *    setting the hash value the same as in step 2\n * 6) Refresh the browser, and you will see the site regularly checking version.json (the hashes will be current\n *    so it will not ask to update)\n * 7) Change the hash in version.json, and set it the same in index.js. The site will recompile, and the version\n *    checker will see the new version.json file, causing the update dialog to appear.\n */\nconst VersionChecker = ({}) => {\n  const app = useContext(AppContext);\n\n  const[isOpen, setIsOpen] = useState(false);\n  const[versionDelayStart, setVersionDelayStart] = useLocalStorage('version_delay_start')\n\n  const toggleModal = () => setIsOpen(!isOpen);\n\n  const versionCheckInterval = useRef<NodeJS.Timeout|null>();\n  const delayUpdateTimer = useRef<NodeJS.Timeout|null>();\n\n  useEffect(() => {\n\n    if (app.buildHash) {\n      console.log('Version Check: local:', `version:${app.version}, hash:${app.buildHash}`);\n      if (!versionCheckInterval.current && !delayUpdateTimer.current) {\n        versionCheckInterval.current = setInterval(() => checkVersion(), CHECK_INTERVAL_SEC * 1000)\n      }\n    } else {\n      console.log('Version Check: App has no build hash, version check disabled');\n    }\n\n    // Unmount: clean up timers\n    return () => {\n      if (versionCheckInterval.current) {\n        clearInterval(versionCheckInterval.current)\n      }\n      if (delayUpdateTimer.current) {\n        clearTimeout(delayUpdateTimer.current)\n      }\n      versionCheckInterval.current = null;\n      delayUpdateTimer.current = null;\n    }\n\n  }, [])\n\n  // useCallback so we can keep state in scope when called back from timer function\n  const isDelayed = useCallback(() => {\n    if (versionDelayStart ) {\n      console.log('Version update delayed', (Date.now() - versionDelayStart) * 1000);\n    }\n\n    return delayUpdateTimer.current || versionDelayStart && ((Date.now() - versionDelayStart) * 1000) < DELAY_SEC\n  }, [versionDelayStart])\n\n  const checkVersion = async () => {\n    if (isDelayed()) {\n        return;\n    }\n\n    const remote = await fetch('/version.json?time=' + Date.now(), {\n      cache: \"no-store\",\n      headers: {Pragma: 'no-cache', Expires:'-1'}\n    }).then((response)=>{\n\n      if (response.ok) {\n        return response.json();\n      }\n\n      // Otherwise, throw an error\n      throw response.status;\n    }).then((data) => {\n      return data;\n    }).catch((err)=>{\n      console.log('Version Check: error getting version:', err);\n    })\n\n    if (remote && remote.hash !== app.buildHash) {\n      console.log('Version Check:outdated build:', `current:${app.buildHash}, new:${remote.hash}`);\n      setIsOpen(true);\n    }\n\n    if (delayUpdateTimer.current) {\n      clearTimeout(delayUpdateTimer.current);\n      delayUpdateTimer.current = null;\n    }\n\n  }\n\n  const doUpdate = () => {\n   // setLastCheck('');\n    setVersionDelayStart('')\n    hardReload();\n  }\n\n  const delayUpdate = () => {\n    setIsOpen(false);\n    setVersionDelayStart(Date.now());\n\n    delayUpdateTimer.current = setTimeout(() => {\n      delayUpdateTimer.current = null;\n      setVersionDelayStart('');\n      checkVersion();\n    }, DELAY_SEC * 1000);\n  }\n\n  const hardReload = async() => {\n    await fetch(window.location.href, {\n      headers: {\n        Pragma: 'no-cache',\n        Expires: '-1',\n        'Cache-Control': 'no-cache',\n      },\n    });\n    window.location.reload();\n  }\n\n\n  return (\n    <Modal  isOpen={isOpen} toggle={toggleModal} size=\"sm\" id=\"version-update-modal\" unmountOnClose={false}>\n      <ModalHeader toggle={toggleModal}>\n        Update Available\n      </ModalHeader>\n      <ModalBody>\n        <div className=\"text-center mb-2\" >\n          <Mastodon width=\"80\" height=\"80\" className=\"\" />\n        </div>\n        <p>A newer version of Mastodon is available. Be sure that any changes have been saved.</p>\n\n        <div className=\"mt-3 d-flex flex-column\">\n          <Button\n            size=\"sm\"\n            onClick={doUpdate}\n            className=\"mb-1\"\n            block\n          >\n            Update Now\n          </Button>\n\n          <Button\n            color=\"link\"\n            size=\"sm\"\n            onClick={delayUpdate}\n            block\n          >\n            Not now, I'm working\n          </Button>\n        </div>\n      </ModalBody>\n    </Modal>\n  )\n}\n\nexport default VersionChecker;\n","import React, {useContext, useEffect, useState} from \"react\";\nimport {Outlet, Navigate, useLocation} from \"react-router-dom\";\nimport { TimezoneContextProvider } from '@thedmsgroup/mastodon-ui-components';\nimport {useIdleTimer} from \"react-idle-timer\";\nimport Header from './Header'\nimport Footer from './Footer';\nimport {Navbar} from \"reactstrap\";\nimport {AppContext} from \"../Providers/AppProvider\";\nimport {singularOrPlural} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport {Button, NavbarBrand, Spinner} from \"reactstrap\";\n// eslint-disable-next-line import/no-extraneous-dependencies -- installed via @thedmsgroup/mastodon-ui-components\nimport {toast} from \"react-toastify\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport logoImage from '../images/DMS_logo_mastodon_white.svg'\nimport VersionChecker from \"../App/VersionChecker\";\n\nconst IDLE_TIMEOUT_MS = 60*60*1000;\nconst PROMPT_BEFORE_IDLE_MS = 120_000;\n\nconst IdlePrompt = ({onStillHere, getRemainingTime}) => {\n  const [remaining, setRemaining] = useState(0)\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setRemaining(Math.ceil(getRemainingTime() / 1000));\n    }, 500)\n\n    return () => {\n      clearInterval(interval)\n    }\n  }, [])\n\n  return (\n    <div>\n      {remaining <= 1 ? (\n        <p>Goodbye!</p>\n      ) : (\n        <p>Are you still here? {remaining && <span>You will be logged out in {remaining} {singularOrPlural(remaining, 'second', 'seconds')}</span>}</p>\n      )}\n\n\n      <Button size=\"sm\" className=\"mt-1\" block onClick={onStillHere}>Yes, still working</Button>\n    </div>)\n    ;\n};\n\n/*\n * Template wrapper for authenticated pages\n */\nexport const AuthLayout = () => {\n  const app = useContext(AppContext);\n  const location = useLocation();\n\n  const tz = app.user?.timezone || 'America/Los_Angeles';\n\n  const onIdle = () => {\n    toast.dismiss('timeout-toast');\n    app.logout('', {timeout:true});\n  }\n\n  const onActive = () => {\n    toast.dismiss('timeout-toast');\n  }\n\n  const onIdlePrompt = () => {\n    notify(<IdlePrompt onStillHere={handleStillHere} getRemainingTime={getRemainingTime}/> , 'warning', { autoClose: false }, 'timeout-toast');\n  }\n\n  const { getRemainingTime, activate, isPrompted  } = useIdleTimer({\n    onIdle,\n    onActive,\n    onPrompt:onIdlePrompt,\n    timeout:IDLE_TIMEOUT_MS,\n    promptBeforeIdle:PROMPT_BEFORE_IDLE_MS,\n    crossTab:true,\n    syncTimers: 200,\n    eventsThrottle:200,// prevent too much cpu usage for user actions\n    throttle: 500 // will only call server at most every n seconds for onAction\n  })\n\n\n  const handleStillHere = () => {\n    activate();\n  }\n\n\n  if (!app.isAuthorizing && !app.isAuthorized) {\n\n      if (isPrompted()) {\n        toast.dismiss('timeout-toast');\n      }\n    // Return to login. We provide a redirect param if the user timed out, but not for manually logging out.\n    const excludeRedirect = ['login', 'forgot-password', 'activate', 'reset-password'];\n    const shouldRedirect = app.logoutAction !== 'user' && !excludeRedirect.some(keyword => location.pathname.includes(keyword));\n\n    return <Navigate\n      to={{\n        pathname: \"/login\",\n        search: shouldRedirect\n          ? `redir=${encodeURIComponent(location.pathname + (location.search || \"\"))}`\n          : \"\"\n      }}\n      />\n\n\n  }\n\n\n  return (\n    <>\n      <TimezoneContextProvider timezone={tz}>\n        {app.isAuthorizing ? (\n          <header className=\"header-main\">\n            <Navbar className=\"main-navbar\" expand=\"md\" fixed=\"top\">\n              <NavbarBrand>\n                <img src={logoImage} width=\"160\" alt=\"Mastodon: powered by DMS\" />\n                <Spinner size=\"sm\" color=\"light\" className=\"ms-2\" />\n              </NavbarBrand>\n            </Navbar>\n          </header>\n        ) : (\n          <>\n            <Header />\n            <Outlet/>\n            <Footer/>\n          </>\n        )}\n\n      </TimezoneContextProvider>\n      <VersionChecker />\n    </>\n\n  )\n\n};\n\n","import React from 'react';\nimport {Outlet} from 'react-router-dom';\nimport Footer from '../Layout/Footer';\nimport EnvironmentBadge from './EnvironmentBadge';\nimport logoImage from '../images/DMS_logo_mastodon_white.svg';\n\n/*\n * Template wrapper for non-authenticated pages like Login, reset password.\n */\nexport const EntryLayout = () => {\n\n\n  return (\n    <>\n    <div id=\"entry-layout\">\n\n      <div className=\"blue-top\"></div>\n\n      <div id=\"entry-form-container\">\n\n        <div className=\"text-center mb-3\">\n          <img src={logoImage} width=\"240\" alt=\"Mastodon: powered by DMS\"/>\n          <div className=\"mt-2\"><EnvironmentBadge /></div>\n        </div>\n\n        <Outlet/>\n\n      </div>\n\n      <div className=\"push-footer\"/>\n\n    </div>\n    <Footer/>\n  </>\n  )\n\n};\n\n","import React from 'react';\nimport {Link, Outlet} from 'react-router-dom';\nimport Footer from '../Layout/Footer';\nimport {Navbar, NavbarBrand} from \"reactstrap\";\nimport logoImage from \"../images/DMS_logo_mastodon_white.svg\";\n//import logoImage from '../images/DMS_logo_mastodon_white.svg';\nimport './main_content.scss';\n\n/*\n * Template wrapper for non-authenticated pages like Login, reset password.\n */\nexport const PublicLayout = () => (\n  <>\n    <div id=\"public-layout\">\n\n      <header className=\"header-main\">\n        <Navbar className=\"main-navbar\" expand=\"md\" fixed=\"top\">\n\n            <NavbarBrand tag={Link} to=\"/login\">\n              <img src={logoImage} width=\"160\" alt=\"Mastodon: powered by DMS\" />\n            </NavbarBrand>\n\n        </Navbar>\n      </header>\n\n      <div id=\"public-content\">\n\n        <Outlet />\n\n      </div>\n\n      <div className=\"push-footer\" />\n\n    </div>\n    <Footer />\n  </>\n\n);\n\n","import React, { useContext, useState, useEffect } from 'react';\nimport {DropdownItem, DropdownMenu, DropdownToggle, InputGroup, UncontrolledDropdown} from \"reactstrap\";\nimport { Filter, TextSearch } from '../../../Components/Table/Filter';\nimport { StatusChoices, ProductChoices } from '../../../Components/Table/FilterChoices';\nimport RightDateAndControls from '../../../Components/Table/RightDateAndControls';\nimport { AppContext } from '../../../Providers/AppProvider';\nimport {useFilters} from \"../../../Hooks/useFilters\";\n\nconst Filters = ({filters, onChange, onRefresh}) => {\n  const app = useContext(AppContext);\n  const [choices, setChoices] = useState({});\n  const {onChangeFilter, clearSearch, reset} = useFilters(filters, onChange, {defaultFilters:{search_type:'accounts'}});\n\n  // load choices\n  useEffect(() => {\n    const getChoices = async () => {\n      const verticals = await app.api.endpoints.verticals.list({options:true});\n      if (verticals) {\n        setChoices({\n          status: StatusChoices,\n          product: ProductChoices,\n          vertical: verticals.map((item) => ({ value: item.id, label: item.display_name })),\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n\n  return (\n    <div className=\"d-flex justify-content-between position-relative\">\n      {/*<div className={classnames(['loading-overlay', { show: loading }])} />*/}\n      <div className=\"d-flex\">\n        <div className=\"boxed-filter search-filter me-3\">\n          <InputGroup className=\"flex-nowrap align-items-center\">\n            <TextSearch\n              value={filters.search || ''}\n              placeholder={\"Search \" + filters.search_type}\n              onUpdate={(val) => onChangeFilter('search', val)}\n              onClear={clearSearch}\n              autofocus\n              style={{minWidth:\"250px\"}}\n            />\n            <UncontrolledDropdown>\n              <DropdownToggle caret size=\"xs\" color=\"link\">{filters.search_type}</DropdownToggle>\n              <DropdownMenu>\n                <DropdownItem onClick={() => { onChangeFilter('search_type','accounts'); }}>Account</DropdownItem>\n                <DropdownItem onClick={() => { onChangeFilter('search_type', 'orders'); }}>Order</DropdownItem>\n              </DropdownMenu>\n            </UncontrolledDropdown>\n\n          </InputGroup>\n\n\n        </div>\n\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Vertical\"\n            param=\"vertical_id\"\n            options={choices.vertical}\n            value={filters['vertical_id'] || []}\n            onChange={onChangeFilter}\n            isMulti={false}\n          />\n        </div>\n\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Product\"\n            param=\"product\"\n            options={choices.product}\n            value={filters['product'] || []}\n            onChange={onChangeFilter}\n            isMulti={false}\n          />\n        </div>\n\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Order Status\"\n            param=\"order_status\"\n            options={choices.status}\n            value={filters['order_status'] || \"\"}\n            onChange={onChangeFilter}\n            isMulti={false}\n          />\n        </div>\n\n      </div>\n\n      <RightDateAndControls onRefresh={onRefresh} onReset={reset} />\n    </div>\n  );\n};\n\nexport default Filters;\n","import React from 'react';\nimport classnames from 'classnames';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport {OrderLastSoldPropertiesType} from \"./advertiser\";\n\n/*\n * Component that formats the last_sold_at date of an order\n * Used in accounts list table cell and rules manager order info\n */\nconst OrderLastSold = React.memo<OrderLastSoldPropertiesType>(\n    ({ date, isStale, orderId, status }) => {\n        if (!date || status === 'archived') return null;\n\n        return (\n            <>\n                <span\n                    className={classnames({ stale: isStale })}\n                    id={`last-sold-${orderId}`}\n                >\n                    {isStale && (\n                        <FaIcon icon='exclamation-triangle' className='me-1' />\n                    )}\n                    <RelativeTime date={date} showTimezone={true} />\n                </span>\n            </>\n        );\n    }\n);\n\nOrderLastSold.displayName = \"OrderLastSold\";\nexport default OrderLastSold;\n","import React, { FC, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport FlexTable from '../../../Components/Table/FlexTable';\nimport StatusToggler from '../../../Components/Form/StatusToggler';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport { titleCaseWord } from '../../../utils/string';\nimport OrderLastSold from '../OrderLastSold';\nimport {OrdersSubtablePropertiesType} from \"../advertiser\";\nimport {FaveHeart} from \"../../../Components\";\n\nconst OrdersSubtable: FC<OrdersSubtablePropertiesType> = ({\n  view,\n  account,\n  orders,\n  openOrderModal,\n  onFavorite,\n  favoriteOrderIds=[],\n  allowViewOrders,\n  allowViewLeads,\n  allowViewCalls,\n  allowEditOrder,\n  allowEditOrderStatus,\n  allowViewAuctions,\n  onStatusChange,\n  allowCreateOrder,\n  locationSearch,\n}) => {\n\n\n\n  const filteredOrders = useMemo(() => {\n\n    if (view === 'favorites' ) {\n      return orders.filter((ord) => favoriteOrderIds.includes(ord.id));\n    }\n    return orders;\n  }, [favoriteOrderIds])\n\n\n  const columns = useMemo(\n    () =>  [\n        {\n          accessor: \"name\",\n          Header: \"Order\",\n          disableSortBy: true,\n          className: \"order-name-cell\",\n          Cell: ({value, row}: any) => <OrderName\n            account={row.original.account}\n            name={value}\n            id={row.original.id}\n            isFavorite={favoriteOrderIds.includes(row.original.id)}\n            onFavorite={onFavorite}\n            allowViewOrders={allowViewOrders}\n            locationSearch={locationSearch}\n          />\n        },\n        {\n          accessor: \"vertical.display_name\", Header: \"Vertical\", disableSortBy: true, maxWidth: 200,\n        },\n        {\n          accessor: \"product\",\n          Header: \"Product\",\n          maxWidth: 110,\n          disableSortBy: true,\n          Cell: ({value}: any) => titleCaseWord(value),\n        },\n        {\n          accessor: \"status\",\n          Header: \"Status\",\n          disableSortBy: true,\n          disableGlobalFilter: true,\n          className: \"status-cell\",\n          maxWidth: 120,\n          Cell: ({row}: any) => (\n            <StatusCell\n              status={row.original.status}\n              orderId={row.original.id}\n              product={row.original.product}\n              allowEditOrder={allowEditOrder}\n              allowEditOrderStatus={allowEditOrderStatus}\n              updateStatusCallback={(id: number, status: string) => onStatusChange(row.original, status)}\n            />\n          ),\n        },\n        {\n          accessor: \"last_sold_at\",\n          Header: \"Last Sold\",\n          disableSortBy: true,\n          disableGlobalFilter: true,\n          className: \"last-sold-cell\",\n          Cell: ({row}: any) => (\n            <OrderLastSold\n              date={row.original.last_sold_at}\n              isStale={row.original.last_sold_alert}\n              status={row.original.status}\n              orderId={row.original.id}\n            />\n          ),\n        },\n        {\n          id: \"actions\",\n          disableGlobalFilter: true,\n          Cell: ({row}: any) => (\n            <OrderActions\n              account={account}\n              order={row.original}\n              onEditClick={openOrderModal}\n              allowViewOrders={allowViewOrders}\n              allowViewCalls={allowViewCalls}\n              allowViewLeads={allowViewLeads}\n              allowEditOrder={allowEditOrder}\n              allowViewAuctions={allowViewAuctions}\n              locationSearch={locationSearch}\n            />\n          ),\n          width: 275,\n        },\n\n      ],\n    [favoriteOrderIds],\n  );\n\n  const initialTableState = useMemo(() => ({ gridLayout: { columnWidths: ['300px', '1fr', '1fr', '1fr', '230px', '2fr'] } }), []);\n\n  return (\n    <>\n\n      {orders.length > 0 ? (\n        <>\n\n          <FlexTable\n            columns={columns}\n            className=\"orders-subtable\"\n            initialState={initialTableState}\n            /* data={FilterContext.filteredData} */\n            data={filteredOrders}\n            loading={false}\n            noDataMessage=\"No orders were found\"\n            disableFilters\n          />\n\n\n          {allowCreateOrder && (\n            <span style={{ marginLeft: '2rem' }}>\n              <Button\n                title={`New order for ${account.name}`}\n                onClick={() => openOrderModal(null, account)}\n                size=\"sm\"\n                color=\"link\"\n\n              >\n                <FaIcon icon=\"plus\" size=\"sm\" />\n                {' '}\n                New Order\n              </Button>\n            </span>\n          )}\n\n        </>\n      ) : (\n        <>\n          <StandardAlert color=\"light\" className=\"mb-0\">This account has no orders.</StandardAlert>\n          {allowCreateOrder && (\n            <span style={{ marginLeft: '2rem' }}>\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                title={`New order for ${account.name}`}\n                onClick={() => openOrderModal(null, account)}\n              >\n                <FaIcon icon=\"plus\" size=\"sm\" />\n                {' '}\n                New Order\n              </Button>\n            </span>\n          )}\n        </>\n      )}\n      {' '}\n      {/* orders.length */}\n\n    </>\n\n  );\n};\n\nconst OrderName = ({account, name, id, isFavorite, onFavorite, allowViewOrders, locationSearch}: any) => {\n  return (\n    <div>\n      <FaveHeart isFavorite={isFavorite} id={id} size=\"xs\" onChange={onFavorite} className=\"me-1\" key={`fav-${id}`} />\n      {allowViewOrders ? (\n        <Link\n          to={`/accounts/${account.id}/order/${id}/rules`}\n          state={{account, search: locationSearch}}\n          title=\"Rules and targets for this order\"\n        >\n          {name}\n        </Link>\n      ) : name}\n    </div>\n  )\n}\n\nconst OrderActions = ({\n  account,\n  order,\n  onEditClick,\n  allowViewOrders,\n  allowViewLeads,\n  allowViewCalls,\n  allowEditOrder,\n  allowViewAuctions,\n  locationSearch,\n}: any) => (\n  <div className=\"list-actions\">\n    {allowViewOrders && (\n      <Link\n        to={`/accounts/${account.id}/order/${order.id}/rules`}\n        state={{account, search: locationSearch}}\n        title=\"Rules and targets for this order\"\n        className=\"action-item\"\n      >\n        <FaIcon icon=\"clipboard-list\" size=\"1x\" />\n      </Link>\n    )}\n\n    {allowEditOrder === true && (\n      <Button\n        color=\"link\"\n        onClick={() => { onEditClick(order, account); }}\n        className=\"action-item inline\"\n        title=\"Order Settings\"\n      >\n        <FaIcon icon=\"cog\" size=\"1x\" />\n      </Button>\n    )}\n\n    {order.product === 'leads' && allowViewLeads && (\n      <Link\n        to={{\n          pathname: '/reports/leads',\n          search: `accounts=${account.id}&orders=${order.id}&sort_by=received_time&sort_dir=desc`,\n        }}\n        title=\"Lead prospects for this order\"\n        className=\"action-item\"\n      >\n        <FaIcon icon=\"id-card\" size=\"1x\" />\n      </Link>\n    )}\n\n    {order.product === 'calls' && allowViewCalls && (\n      <Link\n        to={{\n          pathname: '/reports/calls',\n          search: `accounts=${account.id}&orders=${order.id}&sort_by=received_time&sort_dir=desc`,\n        }}\n        title=\"Call prospects for this order\"\n        className=\"action-item\"\n      >\n        <FaIcon icon=\"phone\" size=\"1x\" />\n      </Link>\n    )}\n\n    {allowViewAuctions && (\n      <Link\n        to={{\n          pathname: '/auctions',\n          search: `page=1&order=${order.id}`,\n        }}\n        title=\"Auctions\"\n        className=\"action-item\"\n      >\n        <FaIcon icon=\"comment-dollar\" size=\"1x\" />\n      </Link>\n    )}\n\n  </div>\n);\n\nconst StatusCell = ({\n  status, orderId,  allowEditOrderStatus, updateStatusCallback,\n}: any) =>\n  (\n    <StatusToggler\n      status={status}\n      target={orderId}\n      onChangeAsync={updateStatusCallback}\n      allowEdit={allowEditOrderStatus}\n    />\n  );\nexport default OrdersSubtable;\n","import React from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\nimport { Link } from 'react-router-dom';\nimport NumberFormat from 'react-number-format';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\n\ntype AccountBalancesProperties = {\n  accountId:number;\n  cash:string;\n  credit:string;\n  isLow:boolean;\n  hasOrders:boolean;\n  locationSearch?:string;\n}\n/*\n * Display of an account's cash/credit balances with warning for low balances\n */\nconst AccountBalances = React.memo<AccountBalancesProperties>(({\n  accountId, cash, credit, isLow = false, hasOrders, locationSearch,\n}) => {\n  const lowBal = hasOrders && isLow;\n\n  return (\n    <div className=\"accounting d-flex justify-content-end align-content-center\">\n\n      {lowBal\n          && (\n          <div className=\"bal-alert\">\n            <FaIcon icon=\"exclamation-triangle\" />\n            {' '}\n            Low balance\n          </div>\n          )}\n\n      <div className={classnames(['bal-pod', 'me-2', { 'bal-alert': lowBal, 'no-orders': !hasOrders }])}>\n        <div className=\"type\">Cash</div>\n        <div className=\"bal\"><NumberFormat value={cash} displayType=\"text\" thousandSeparator prefix=\"$\" decimalScale={0} /></div>\n      </div>\n\n      <div className={classnames(['bal-pod', 'me-2', { 'no-orders': !hasOrders }])}>\n        <div className=\"type\">Credit</div>\n        <div className=\"bal\"><NumberFormat value={credit} displayType=\"text\" thousandSeparator prefix=\"$\" decimalScale={0} /></div>\n      </div>\n\n      <div>\n        <Link\n          to={{\n            pathname: `/accounts/${accountId}/settings`,\n            search: 'tab=funds',\n          }}\n          state={{ search: locationSearch }}\n          title=\"Account funds management\"\n          className=\"link\"\n        >\n          Funds\n        </Link>\n      </div>\n    </div>\n  );\n});\n\n\nAccountBalances.displayName = \"AccountBalances\";\nexport default AccountBalances;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport AccountBalances from './AccountBalances';\nimport usePermission from '../../../Hooks/usePermission';\nimport {Account} from \"../../../types\";\n\ntype AccountNameCellProperties = {\n  account: Account;\n  locationSearch?: string;\n}\n/*\n * Used by account list table to product account name cell with links and account balances\n */\nconst AccountNameCell = React.memo<AccountNameCellProperties>(({\n  account,\n  locationSearch,\n}) => {\n  const allowViewAds = usePermission('ads.view');\n  const allowViewUsers = usePermission('users.view');\n  const allowViewAccounting = usePermission('accounting.view');\n  const allowViewLeads = usePermission('leads.view');\n  const allowViewCalls = usePermission('calls.view');\n  const allowEdit = usePermission('accounts.edit');\n  const showLeadsLink = allowViewLeads && account.orders.some((ord) => ord.product === 'leads');\n  const showCallsLink = allowViewCalls && account.orders.some((ord) => ord.product === 'calls');\n\n  return (\n    <div className=\"account-cell d-flex justify-content-between\">\n      <div className=\"d-flex align-items-center\">\n        <h5 className=\"account-name me-4 m-0 fw-bolder\">{account.name}</h5>\n        <div className=\"list-actions\">\n          <span className=\"action-item\">\n            <Link\n              to={{\n                pathname: `/accounts/${account.id}/settings`,\n                search: 'tab=details',\n              }}\n              state={{account, search: locationSearch}}\n              className=\"link\"\n              title={`Account settings for ${account.name}`}\n            >\n              Settings\n            </Link>\n            <span className=\"bull-delim\">&bull;</span>\n          </span>\n\n          <span className=\"action-item\">\n            <Link\n              to={{\n                pathname: `/accounts/${account.id}/settings`,\n                search: 'tab=goals'\n              }}\n              state={{account, search: locationSearch}}\n              className=\"link\"\n              title={`Goals for ${account.name}`}\n            >\n              Goals\n            </Link>\n            <span className=\"bull-delim\">&bull;</span>\n          </span>\n\n          {allowEdit && (\n          <span className=\"action-item\">\n            <Link\n              to={{\n                pathname: `/accounts/${account.id}/settings`,\n                search: 'tab=return_tracking'\n              }}\n              state={{account, search: locationSearch}}\n              className=\"link\"\n              title={`Return Tracking for ${account.name}`}\n            >\n              Returns\n            </Link>\n            <span className=\"bull-delim\">&bull;</span>\n          </span>\n          )}\n\n          {allowViewAds\n          && (\n          <span className=\"action-item\">\n            <Link\n              title={`Ad Library for ${account.name}`}\n              to={{\n                pathname: `/accounts/${account.id}/ads`,\n              }}\n              state={{account}}\n              className=\"link\"\n            >\n              Ad Library\n            </Link>\n            <span className=\"bull-delim\">&bull;</span>\n          </span>\n          )}\n\n          {showLeadsLink && allowViewLeads && (\n            <span className=\"action-item\">\n              <Link\n                to={{\n                  pathname: '/reports/leads',\n                  search: `accounts=${account.id}&sort_by=received_time&sort_dir=desc`,\n                }}\n                className=\"link\"\n                title=\"View leads for this account\"\n              >\n                Leads\n              </Link>\n              <span className=\"bull-delim\">&bull;</span>\n            </span>\n          )}\n\n          {showCallsLink && allowViewCalls && (\n            <span className=\"action-item\">\n              <Link\n                to={{\n                  pathname: '/reports/calls',\n                  search: `accounts=${account.id}&sort_by=received_time&sort_dir=desc`,\n                }}\n                title=\"View calls for this account\"\n                className=\"link\"\n              >\n                Calls\n              </Link>\n              <span className=\"bull-delim\">&bull;</span>\n            </span>\n          )}\n\n          {allowViewUsers && (\n            <span className=\"action-item\">\n              <Link\n                title={`View users for ${account.name}`}\n                to={{\n                  pathname: '/users',\n                  search:`account=${account.id}`,\n                }}\n                className=\"link\"\n              >\n                Users\n              </Link>\n              <span className=\"bull-delim\">&bull;</span>\n            </span>\n          )}\n        </div>\n      </div>\n\n      {allowViewAccounting\n      && (\n      <AccountBalances\n        accountId={account.id}\n        cash={account.cash_balance}\n        credit={account.credit_balance}\n        isLow={account.low_balance}\n        hasOrders={account.orders.length > 0}\n        locationSearch={locationSearch}\n      />\n      )}\n\n    </div>\n\n  );\n});\n\n\nAccountNameCell.displayName = \"AccountNameCell\";\n\nexport default AccountNameCell;\n","import React, {\n  FC, useCallback, useMemo,\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport PagedTable from '../../../Components/Table/PagedTable';\nimport OrdersSubtable from './OrdersSubtable';\nimport usePermission from '../../../Hooks/usePermission';\nimport AccountNameCell from './AccountNameCell';\nimport { NoDataComponent } from '../../../Components/Table/Table';\n\nconst AccountsTable:FC<any> = ({\n  loading, accounts, onStatusChange, onFavorite, openOrderModal, favoriteOrderIds, view='all',\n                       totalRows,\n                       pageCount,\n                       page,\n                       sort_by,\n                       sort_dir,\n                       limit,\n                       setPage,\n                       setLimit,\n                       setSort,\n}) => {\n  const location = useLocation();\n  const allowViewOrders = usePermission('orders.view');\n  const allowCreateOrder = usePermission('orders.create');\n  const allowEditOrder = usePermission('orders.edit');\n  const allowEditOrderStatus = usePermission('order_status.edit');\n  const allowViewLeads = usePermission('leads.view');\n  const allowViewCalls = usePermission('calls.view');\n  const allowViewAuctions = usePermission('auctions.view');\n\n\n  const initialTableState = useMemo(\n    () => ({\n      sortBy: [{ id: 'name', desc: false }],\n    }),\n    []\n  );\n\n  const columns = useMemo(() => [\n    {\n      accessor: 'name',\n      Header: () => null,\n      disableSortBy: true,\n      defaultCanSort: false,\n      className: 'account-cell',\n      Cell: ({ row }:any) => <AccountNameCell account={row.original} locationSearch={location.search} />,\n    },\n\n  ], [favoriteOrderIds, location.search]);\n\n\n  const renderAccountOrderTable = useCallback((row:any) => (\n\n      <OrdersSubtable\n        view={view}\n        account={row.original}\n        orders={row.original.orders}\n        openOrderModal={openOrderModal}\n        onStatusChange={onStatusChange}\n        onFavorite={onFavorite}\n        favoriteOrderIds={favoriteOrderIds}\n        allowViewOrders={allowViewOrders}\n        allowEditOrder={allowEditOrder}\n        allowEditOrderStatus={allowEditOrderStatus}\n        allowCreateOrder={allowCreateOrder}\n        allowViewLeads={allowViewLeads}\n        allowViewCalls={allowViewCalls}\n        allowViewAuctions={allowViewAuctions}\n        locationSearch={location.search}\n      />\n\n    ), [favoriteOrderIds, location.search]);\n\n  return (\n    <div className=\"react-table-container mh-400\">\n      {!loading && accounts.length === 0 && <NoDataComponent>{view === 'favorites' ? 'No favorites!' : 'No accounts were found'}</NoDataComponent>}\n      {/* React table has build in fade effect when loading. Hide only when done loading and no results */}\n      { (loading || accounts.length > 0)\n      && (\n      <PagedTable\n        columns={columns}\n        noHeader={true}\n        className=\"accounts-table\"\n        initialState={initialTableState}\n        data={accounts}\n        loading={loading}\n        totalRows={totalRows}\n        pageCount={pageCount}\n        page={page}\n        limit={limit}\n        sort_by={sort_by}\n        sort_dir={sort_dir}\n        setPage={setPage}\n        setLimit={setLimit}\n        setSort={setSort}\n        noDataMessage={view === 'favorites' ? \"No favorites!\" : \"No results were found\"}\n        renderRowSubcomponent={renderAccountOrderTable}\n        disableFilters\n\n      />\n      )}\n    </div>\n  );\n};\n\n\n\nexport default AccountsTable;\n","import React, { FC,  useState, useEffect } from \"react\";\nimport AccountsTable from \"./AccountsTable\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport useApi from \"../../../Hooks/useApi\";\nimport useFavoriteOrder from \"../../../Hooks/useFavoriteOrder\";\n\n\n\n/*\n * All Accounts\n * Shows paged table listing all accounts\n */\nconst AllAccounts: FC<any> = ({filters, controls, updateQuery, onStatusChange, openOrderModal, favoriteOrderIds, onFavorite}) => {\n\n  const { api } = useApi();\n  const [list, setList] = useState<any[]>([]);\n  const {addOrder, removeOrder} = useFavoriteOrder();\n  const [pageCount, setPageCount] = useState<number>(1);\n  const [totalRows, setTotalRows] = useState<number>(0);\n  const [loading, setLoading] = useState(false);\n  const [refreshKey, setRefreshKey] = useState(1);\n\n  // load orders on mount or when filters/controls change\n  useEffect(() => {\n    load();\n  }, [filters, controls.sort_by, controls.sort_dir, controls.page, controls.limit]);\n\n  const filterParamsToApi = () => {\n    const apiFilters = {...filters};\n\n    // 'search' filters accounts, 'order_search' looks for orders\n    if (apiFilters.search) {\n      if (apiFilters.search_type === 'orders') {\n        apiFilters.order_search = apiFilters.search;\n        delete apiFilters.search;\n      }\n    }\n\n    delete apiFilters.search_type;\n\n    return apiFilters;\n  }\n\n\n  const load = async (refresh = false) => {\n    // Get list of accounts, each with orders collections\n\n    const apiFilters = filterParamsToApi();\n    if (!refresh) {\n      setLoading(true);\n    }\n\n    updateQuery();\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls;\n    const result = await api.endpoints.accounts.list({\n      ...apiFilters,\n      page,\n      sort_by,\n      sort_dir,\n      limit\n    });\n\n    if (result) {\n      const { limit, total, data } = result; // row:0, page:1, limit:20, data:[]\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1);\n      setTotalRows(total);\n      //set subrows (order list) expanded for all\n      setList(data.map((a:any) => ({ ...a, expanded: true })));\n      setRefreshKey(refreshKey + 1);\n    } else {\n      notify(`Unable to load orders: ${api.error.name}`, 'error');\n    }\n\n\n    if (!refresh) {\n      setLoading(false);\n    }\n  };\n\n  const doFavorite = async (id:number, setFavorite:boolean) => {\n    let result;\n\n    if (setFavorite){\n      result = await addOrder(id);\n    } else {\n      result = await removeOrder(id);\n    }\n\n    if (result) {\n      onFavorite(id);\n    }\n\n\n  }\n\n  return (\n\n      <AccountsTable\n        accounts={list}\n        onStatusChange={onStatusChange}\n        openOrderModal={openOrderModal}\n        onFavorite={doFavorite}\n        favoriteOrderIds={favoriteOrderIds}\n        loading={loading}\n        pageCount={pageCount}\n        totalRows={totalRows}\n        {...controls}\n        key={refreshKey}\n      />\n\n  )\n}\n\nexport default AllAccounts;\n","import React, {FC, useEffect, useState} from \"react\";\nimport AccountsTable from \"./AccountsTable\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport useFavoriteOrder from \"../../../Hooks/useFavoriteOrder\";\n\n\n/*\n * Favorite Orders\n * Shows paged table listing all favorited orders (by account)\n */\nconst Favorites: FC<any> = ({onStatusChange, openOrderModal, favoriteOrderIds, onFavorite}) => {\n  const { api } = useApi(null, null);\n  const {addOrder, removeOrder} = useFavoriteOrder();\n  const [loading, setLoading] = useState<boolean>(false);\n  const [list, setList] = useState<any[]>([]);\n  const [refreshKey, setRefreshKey] = useState(1);\n\n  // load favorite orders on mount or if favorites change\n  useEffect(() => {\n    load();\n  }, [favoriteOrderIds]);\n\n  const load = async (refresh = false) => {\n    // Get list of accounts , each with FULL orders collections\n    if (!refresh) {\n      setLoading(true);\n    }\n\n\n    // high limit to get everything\n    const result = await api.endpoints.accounts.list({\n      page: 1,\n      limit:1000,\n      favorite_orders:1\n    });\n\n    if (result) {\n      const { data } = result;\n      // sets subrow (order list)0 to expanded for all\n      setList(data.map((a:any) => ({ ...a, expanded: true })));\n      setRefreshKey(refreshKey+1)\n    } else {\n      notify(`Unable to load favorite orders: ${api.error.name}`, 'error');\n    }\n\n\n    if (!refresh) {\n      setLoading(false);\n    }\n  };\n\n  const doFavorite = async (id:number, setAsFavorite:boolean) => {\n\n    let result;\n\n    if (setAsFavorite){\n     // result = await api.endpoints.favorites.addOrder(id);\n      result = await addOrder(id)\n    } else {\n      //result = await api.endpoints.favorites.deleteOrder(id);\n      result = await removeOrder(id);\n    }\n\n    if (result) {\n      onFavorite(id);\n    }\n\n  }\n\n  return (\n    <AccountsTable\n      accounts={list}\n      view=\"favorites\"\n      onStatusChange={onStatusChange}\n      onFavorite={doFavorite}\n      favoriteOrderIds={favoriteOrderIds}\n      openOrderModal={openOrderModal}\n      loading={loading}\n      key={`favorites-${refreshKey}`}\n    />\n  )\n}\n\nexport default Favorites;\n","import React, {useState, useEffect, useContext, useMemo} from \"react\";\nimport { Button, Nav, TabContent, TabPane } from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport { FormTabFlat } from '../../../Components/Form/FormCommon';\nimport PageSection from '../../../Layout/PageSection';\nimport OrderModal from '../Order/OrderModal';\nimport DocTitle from '../../../Layout/DocTitle';\nimport FilterBar from '../../../Components/Table/FilterBar';\nimport Filters from './Filters';\nimport AllAccounts from \"./AllAccounts\";\nimport usePermission from '../../../Hooks/usePermission';\nimport useApi from '../../../Hooks/useApi';\nimport usePagedTableState from \"../../../Hooks/usePagedTableState\";\nimport Favorites from \"./Favorites\";\nimport useFavoriteOrder from \"../../../Hooks/useFavoriteOrder\";\nimport {Account, Order} from \"../../../types\";\nimport useLocalStorage from \"../../../Hooks/useLocalStorage\";\nimport {AppContext} from '../../../Providers/AppProvider';\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\nconst DefaultFilters = {\n  search_type:'accounts',\n};\n\nconst DefaultControls = {\n  limit: 20,\n  sort_by: 'name',\n  sort_dir: 'asc',\n};\n\nconst ListHeaderTools = ({ allowCreateAccount }:any) => (allowCreateAccount ? (\n  <Button\n    tag={Link}\n    color=\"primary\"\n    size=\"sm\"\n    to={{ pathname: '/accounts/create' }}\n  >\n    New Account\n  </Button>\n) : null);\n\n\nconst OrderList = () => {\n\n  const app = useContext(AppContext);\n  const {favorites} = useFavoriteOrder();\n  const {\n    filters, setFilters, controls, updateQuery,\n  } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: true, useTableControls: true },\n  );\n\n  //Splitting up the query string filters, they go to different APIs\n  const hasFilters = Object.keys(filters).filter(k => k !== 'search_type').length > 0;\n  const [account, setAccount] = useState<Account|null>(null);\n  const [order, setOrder] = useState<Partial<Order>|null>(null);\n  const [favoriteOrderIds, setFavoriteOrderIds] = useState<number[]>(() => {\n    return favorites ? favorites.map((fav:Order) => fav.id) : [];\n  });\n  // Show favorites or all tab based on stored setting, or if any favorites exists and there is no account/order filtering.\n  const [orderViewSetting, setOrderViewSetting] = useLocalStorage(\n    \"favorites_orders_view\",\n    favorites?.length > 0 && !hasFilters ? 'favorites' : 'all'\n    )\n  const [activeTab, setActiveTab] = useState<string>(orderViewSetting);\n  const [autoChangeTabs, setAutoChangeTabs] = useState(false);\n  const [orderModal, setOrderModal] = useState<boolean>(false);\n  const [allRefreshKey, setAllRefreshKey] = useState<number>(99);\n  const allowCreateAccount = usePermission('accounts.create');\n  const { api } = useApi();\n\n\n\n  useChangeTimeline({\n    entityTypes: ['order', 'account', 'goal'],\n    parentFilters: filters.vertical_id\n      ? { ...filters, vertical: filters.vertical_id, vertical_id: undefined }\n      : filters,\n  });\n\n\n  // on mount and filter change\n  useEffect(() => {\n    // When list filters change we want the tab to switch to 'All' since that is the list that is filtered.\n    // However, don't do this on load, since it should default to Favorites if any exist.\n    if (autoChangeTabs) {\n      handleSelectTab('all');\n    } else {\n      setAutoChangeTabs(true);\n    }\n  }, [filters]);\n\n  // Refresh when AccountMegaMenu signals a change (e.g. order edited from the menu)\n  useEffect(() => {\n    if (app.accountsPageVersion === 0) return\n    setAllRefreshKey(k => k + 1)\n  }, [app.accountsPageVersion]);\n\n\n  const handleSelectTab = (tab:string) => {\n    setActiveTab(tab);\n    setOrderViewSetting(tab);\n  }\n\n  const closeOrderModal = (refresh = false) => {\n\n    setOrder(null);\n    setOrderModal(false);\n\n    if (refresh) {\n      setAllRefreshKey(k => k + 1);\n      // refresh accounts dropdown in header\n      app.dispatch({type: 'bump_accounts_menu_version'});\n    }\n  };\n\n  const openOrderModal = (order:Partial<Order>|null, account:Account) => {\n    if (!order) {\n      order = {\n        id: 0,\n        name: '',\n      };\n    }\n    setOrder(order);\n    setAccount(account);\n    setOrderModal(true);\n  };\n\n\n  // Update IDs\n  const handleFavoritesUpdate = (id:number) => {\n    //remove if in\n    const newFavorites = [...favoriteOrderIds];\n    const existing = favoriteOrderIds.indexOf(id)\n\n    if (existing >= 0){\n      newFavorites.splice(existing, 1);\n    } else {\n      newFavorites.push(id);\n    }\n    setFavoriteOrderIds(() => newFavorites);\n  }\n\n  const handleStatusChange = async (order:Order, status:string) => {\n    if (order) {\n      const result = await api.endpoints.orders.update({\n        id: order.id, name: order.name, status,\n      });\n\n      //sync status in 2 tables by refreshing\n      setAllRefreshKey(allRefreshKey + 1);\n      setFavoriteOrderIds([...favoriteOrderIds])\n\n      return Boolean(result);\n    }\n    return false;\n  };\n\n  const handleRefresh = () => {\n    setAllRefreshKey(allRefreshKey + 1);\n  }\n\n  // Monitor stored favorites setting changes (from other tabs, etc)\n  useEffect(() => {\n    if (activeTab !== orderViewSetting) {\n      setActiveTab(orderViewSetting);\n    }\n  }, [orderViewSetting]);\n\n\n  return (\n    <>\n\n      <FilterBar>\n        <Filters filters={filters}  onChange={setFilters}  onRefresh={handleRefresh}  />\n      </FilterBar>\n\n\n      <PageSection\n        title=\"Accounts & Orders\"\n        tools={<ListHeaderTools allowCreateAccount={allowCreateAccount} />}\n      >\n        <DocTitle pageTitle=\"Accounts\" />\n\n        <Nav className=\"mastodon-tabs\">\n          <FormTabFlat\n            id=\"all\"\n            label={hasFilters ? \"All Accounts (filtered)\" : \"All Accounts\"}\n            activeTab={activeTab}\n            setActive={handleSelectTab}\n          />\n\n          <FormTabFlat\n            id=\"favorites\"\n            label=\"Favorites\"\n            activeTab={activeTab}\n            setActive={handleSelectTab}\n          />\n\n        </Nav>\n\n        <TabContent activeTab={activeTab}>\n          <TabPane tabId=\"all\">\n\n            <AllAccounts\n              filters={filters}\n              controls={controls}\n              updateQuery={updateQuery}\n              onStatusChange={handleStatusChange}\n              openOrderModal={openOrderModal}\n              favoriteOrderIds={favoriteOrderIds}\n              onFavorite={handleFavoritesUpdate}\n              key={allRefreshKey}\n            />\n          </TabPane>\n\n          <TabPane tabId=\"favorites\">\n            <Favorites\n              onStatusChange={handleStatusChange}\n              openOrderModal={openOrderModal}\n              favoriteOrderIds={favoriteOrderIds}\n              onFavorite={handleFavoritesUpdate}\n            />\n\n          </TabPane>\n\n        </TabContent>\n\n\n        {/* OrderModal is also used in AccountMegamenu */}\n        <OrderModal\n          order={order}\n          account={account}\n          isOpen={orderModal}\n          cancel={closeOrderModal}\n        />\n\n      </PageSection>\n    </>\n  );\n};\n\n\nexport default OrderList;\n","import React, { useMemo, useState } from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\ntype AccountItem = {\n  id: number;\n  name: string;\n  parent?: { id: number } | null;\n  descendant_ids?: string[];\n};\n\ntype TreeNode = AccountItem & {\n  children: TreeNode[];\n  depth: number;\n};\n\ntype FlattenedNode = TreeNode & {\n  // For each depth level (0 to depth-1), true if there are more siblings below at that level\n  ancestorHasMoreSiblings: boolean[];\n  // Whether this node is the last child of its parent\n  isLastChild: boolean;\n};\n\ntype AccountTreePickerProps = {\n  accounts: AccountItem[];\n  currentAccountId: number;\n  currentAccountDescendantIds: string[];\n  currentParentId: number | null;\n  selectedValue: string;\n  onSelect: (id: string, name?: string) => void;\n  closeOnClick?: boolean;\n};\n\nconst flattenTree = (nodes: TreeNode[], ancestorHasMoreSiblings: boolean[] = []): FlattenedNode[] => {\n  const result: FlattenedNode[] = [];\n  nodes.forEach((node, index) => {\n    const isLastChild = index === nodes.length - 1;\n    result.push({\n      ...node,\n      ancestorHasMoreSiblings: [...ancestorHasMoreSiblings],\n      isLastChild,\n    });\n    result.push(...flattenTree(node.children, [...ancestorHasMoreSiblings, !isLastChild]));\n  });\n  return result;\n};\n\nconst highlightMatch = (name: string, term: string): React.ReactNode => {\n  if (!term) return name;\n  const idx = name.toLowerCase().indexOf(term.toLowerCase());\n  if (idx === -1) return name;\n  return (\n    <>\n      {name.slice(0, idx)}\n      <mark className=\"tree-match\">{name.slice(idx, idx + term.length)}</mark>\n      {name.slice(idx + term.length)}\n    </>\n  );\n};\n\nconst AccountTreePicker = ({\n  accounts,\n  currentAccountId,\n  currentAccountDescendantIds,\n  currentParentId,\n  selectedValue,\n  onSelect,\n  closeOnClick = false,\n}: AccountTreePickerProps) => {\n  // Build tree structure from flat list\n  const tree = useMemo(() => {\n    const accountMap = new Map<number, TreeNode>();\n    const roots: TreeNode[] = [];\n\n    // First pass: create nodes\n    accounts.forEach((acc) => {\n      accountMap.set(acc.id, { ...acc, children: [], depth: 0 });\n    });\n\n    // Second pass: build parent-child relationships\n    accounts.forEach((acc) => {\n      const node = accountMap.get(acc.id)!;\n      const parentId = acc.parent?.id;\n\n      if (parentId && accountMap.has(parentId)) {\n        const parent = accountMap.get(parentId)!;\n        parent.children.push(node);\n      } else {\n        // No parent or parent not in our accessible list = root level\n        roots.push(node);\n      }\n    });\n\n    // Third pass: calculate depths and sort children alphabetically\n    const setDepths = (nodes: TreeNode[], depth: number) => {\n      nodes.sort((a, b) => a.name.localeCompare(b.name));\n      nodes.forEach((node) => {\n        node.depth = depth;\n        setDepths(node.children, depth + 1);\n      });\n    };\n    setDepths(roots, 0);\n\n    return roots;\n  }, [accounts]);\n\n  // Flatten tree for rendering with sibling tracking info\n  const flattenedTree = useMemo(() => flattenTree(tree), [tree]);\n\n  const [filterText, setFilterText] = useState('');\n  const showFilter = accounts.length > 1;\n\n  const filterResult = useMemo(() => {\n    const term = filterText.trim().toLowerCase();\n    if (!term) return null;\n\n    const matchingIds = new Set<number>();\n\n    const findMatches = (nodes: TreeNode[]) => {\n      nodes.forEach((node) => {\n        if (node.name.toLowerCase().includes(term)) matchingIds.add(node.id);\n        findMatches(node.children);\n      });\n    };\n    findMatches(tree);\n\n    const visibleIds = new Set<number>(matchingIds);\n\n    const addAncestors = (nodes: TreeNode[], path: number[]) => {\n      nodes.forEach((node) => {\n        const newPath = [...path, node.id];\n        if (matchingIds.has(node.id)) path.forEach((id) => visibleIds.add(id));\n        addAncestors(node.children, newPath);\n      });\n    };\n    addAncestors(tree, []);\n\n    return { matchingIds, visibleIds };\n  }, [filterText, tree]);\n\n  const displayTree = useMemo(() => {\n    if (!filterResult) return flattenedTree;\n\n    const { visibleIds } = filterResult;\n\n    const pruneTree = (nodes: TreeNode[]): TreeNode[] =>\n      nodes\n        .filter((n) => visibleIds.has(n.id))\n        .map((n) => ({ ...n, children: pruneTree(n.children) }));\n\n    return flattenTree(pruneTree(tree));\n  }, [filterResult, tree, flattenedTree]);\n\n  const isDisabled = (accountId: number): boolean => {\n    return (\n      accountId === currentAccountId ||\n      currentAccountDescendantIds.includes(String(accountId))\n    );\n  };\n\n  const handleClick = (accountId: number, accountName: string) => {\n    if (!isDisabled(accountId)) {\n      onSelect(String(accountId), closeOnClick ? accountName : undefined);\n    }\n  };\n\n  // Render tree guide elements for a node\n  const renderTreeGuides = (node: FlattenedNode) => {\n    if (node.depth === 0) {\n      return null; // Root level has no guides\n    }\n\n    const guides: React.ReactNode[] = [];\n\n    // Render guides for ancestor levels (continuing vertical lines)\n    for (let i = 0; i < node.depth - 1; i++) {\n      const hasMoreSiblings = node.ancestorHasMoreSiblings[i];\n      guides.push(\n        <span\n          key={`guide-${i}`}\n          className={`tree-guide ${hasMoreSiblings ? 'has-vertical' : ''}`}\n        />\n      );\n    }\n\n    // Render guide for this node's level (branch connector)\n    guides.push(\n      <span\n        key={`guide-${node.depth - 1}`}\n        className={`tree-guide has-branch ${node.isLastChild ? 'has-elbow' : 'has-vertical'}`}\n      />\n    );\n\n    return <span className=\"tree-guides\">{guides}</span>;\n  };\n\n  return (\n    <div className=\"account-tree-picker\">\n      {showFilter && (\n        <div className=\"account-tree-filter\">\n          <input\n            type=\"text\"\n            className=\"form-control form-control-sm\"\n            placeholder=\"Filter accounts…\"\n            value={filterText}\n            onChange={(e) => setFilterText(e.target.value)}\n          />\n          {filterText && (\n            <button\n              type=\"button\"\n              className=\"account-tree-filter-clear\"\n              onClick={() => setFilterText('')}\n              aria-label=\"Clear filter\"\n            >\n              ×\n            </button>\n          )}\n        </div>\n      )}\n      {filterResult && filterResult.visibleIds.size === 0 ? (\n        <div className=\"account-tree-empty\">No accounts match &ldquo;{filterText}&rdquo;</div>\n      ) : (\n        displayTree.map((node) => {\n          const disabled = isDisabled(node.id);\n          const isCurrentAccount = node.id === currentAccountId;\n          const isCurrentParent = node.id === currentParentId;\n          const isSelected = selectedValue === String(node.id);\n\n          const isAncestorContext = filterResult\n            ? filterResult.visibleIds.has(node.id) && !filterResult.matchingIds.has(node.id)\n            : false;\n\n          const classNames = [\n            'account-tree-item',\n            disabled ? 'disabled' : 'selectable',\n            isSelected ? 'selected' : '',\n            isCurrentParent ? 'current-parent' : '',\n            isAncestorContext ? 'ancestor-context' : '',\n          ].filter(Boolean).join(' ');\n\n          return (\n            <div\n              key={node.id}\n              data-account-id={node.id}\n              className={classNames}\n              onClick={() => handleClick(node.id, node.name)}\n            >\n              {renderTreeGuides(node)}\n              <div className=\"item-content\">\n                <span className=\"item-name\">\n                  {filterResult\n                    ? highlightMatch(node.name, filterText)\n                    : node.name}\n                </span>\n                {isCurrentAccount && (\n                  <span className=\"badge-this-account\">(this account)</span>\n                )}\n                {isCurrentParent && (\n                  <span className=\"badge-current-parent\">Current Parent</span>\n                )}\n                {isSelected ? (\n                  <span className=\"selected-check\">\n                    <FaIcon icon=\"check\" />\n                  </span>\n                ) : !disabled && (\n                  <span className=\"select-indicator\">\n                    <span>Select</span>\n                    <FaIcon icon=\"chevron-right\" />\n                  </span>\n                )}\n              </div>\n            </div>\n          );\n        })\n      )}\n    </div>\n  );\n};\n\nexport default AccountTreePicker;\n","import React, { useState, useContext, useMemo } from 'react';\nimport {\n  Badge, Button, FormFeedback, FormText, FormGroup, Input, InputGroup, Label, Spinner,\n} from 'reactstrap';\nimport * as Yup from 'yup';\nimport { Link } from 'react-router-dom';\nimport { Required, TimezoneOptions } from '../../../Components/Form/FormCommon';\nimport useFormState from '../../../Hooks/useFormState';\nimport {HelpPopper, StandardAlert}  from '@thedmsgroup/mastodon-ui-components';\nimport DynamicEnhancedSelect from \"../../../Components/Form/DynamicEnhancedSelect\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport { AppContext } from '../../../Providers/AppProvider';\nimport AccountTreePicker from './AccountTreePicker';\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nconst ValidationSchema = Yup.object().shape({\n  name: Yup.string().trim().required('Please enter an advertiser name'),\n  compliance_buyer_notifications: Yup.string()\n    .test(\n      'comma-separated-emails',\n      'Enter one or more valid email addresses, separated by commas.',\n      (value?: string) => {\n        if (!value) return true;\n        return value\n          .split(',')\n          .map((s) => s.trim())\n          .filter((s) => s.length > 0)\n          .every((s) => EMAIL_RE.test(s));\n      },\n    ),\n});\n\ntype Account = {\n  id: number;\n  name: string;\n  type?: string;\n  description?: string;\n  dba?: { id: number; name?: string } | null;\n  buyer_name?: string;\n  buyer_group?: string;\n  buyer_contact_display?: string | null;\n  buyer_contact_display_enabled?: boolean;\n  compliance_buyer_notifications?: string | null;\n  account_executive?: { id: number; name: string } | null;\n  timezone?: string;\n  parent?: { id: number; name?: string } | null;\n  descendant_ids?: string[];\n};\n\ntype UserOption = {\n  id: number;\n  first_name?: string;\n  last_name?: string;\n  email?: string;\n  value: number;\n  label: string;\n};\n\nconst initialsFor = (option: UserOption): string => {\n  const f = (option.first_name ?? '').trim().charAt(0);\n  const l = (option.last_name ?? '').trim().charAt(0);\n  const initials = `${f}${l}`.toUpperCase();\n  return initials || (option.email ?? '?').charAt(0).toUpperCase();\n};\n\nconst fullNameFor = (option: UserOption): string =>\n  `${option.first_name ?? ''} ${option.last_name ?? ''}`.trim() || (option.email ?? '');\n\nconst renderAccountExecutiveOption = (option: UserOption) => (\n  <span className=\"d-inline-flex align-items-center\">\n    <span\n      className=\"account-executive-avatar d-inline-flex align-items-center justify-content-center rounded-circle text-white fw-semibold me-2\"\n      style={{ width: 24, height: 24, fontSize: 11, background: '#5b8def' }}\n    >\n      {initialsFor(option)}\n    </span>\n    <span>{fullNameFor(option)}</span>\n  </span>\n);\n\ntype AccountDetailProps = {\n  account?: Account;\n  onSave: (values: Record<string, unknown>) => void;\n  accountsSearch?: string;\n  readOnly?: boolean;\n};\n\ntype ParentAccount = {\n  id: number;\n  name: string;\n  parent?: { id: number } | null;\n};\n\n/*\n * Form for basic account fields. Create/update account.\n * Fetch and save methods are in parent Settings component\n */\nconst AccountDetail = ({ account = {} as Account, onSave, accountsSearch = '', readOnly = false }: AccountDetailProps) => {\n  const app = useContext(AppContext);\n  const allowEdit = usePermission('accounts.edit');\n  const isNew = !account.id;\n  const [isParentEditActive, setIsParentEditActive] = useState(false);\n  const [parentAccounts, setParentAccounts] = useState<ParentAccount[]>([]);\n  const [isLoadingParents, setIsLoadingParents] = useState(false);\n  const [selectedParentName, setSelectedParentName] = useState<string | null>(null);\n\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      name: account.name,\n      type: account.type,\n      description: account.description,\n      dba_id: account.dba?.id ? String(account.dba.id) : '',\n      buyer_name: account.buyer_name,\n      buyer_group: account.buyer_group,\n      buyer_contact_display: account.buyer_contact_display ?? '',\n      buyer_contact_display_enabled: account.buyer_contact_display_enabled ?? false,\n      compliance_buyer_notifications: account.compliance_buyer_notifications ?? '',\n      account_executive_id: account.account_executive?.id\n        ? String(account.account_executive.id)\n        : '',\n      timezone: account.timezone,\n      parent_id: account.parent?.id\n        ? String(account.parent.id)\n        : (account.id ? '' : String(app.currentAccount?.id || '')),\n    },\n    ValidationSchema,\n  );\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      onSave(formValues);\n    }\n  };\n\n  const loadParentAccounts = async () => {\n    setIsLoadingParents(true);\n    const result = await app.api.endpoints.accounts.list({ limit: 1000 });\n    if (result) {\n      setParentAccounts(result);\n    }\n    setIsLoadingParents(false);\n  };\n\n  // Check if any accounts are selectable (not this account, not a descendant, and not the current parent)\n  const hasSelectableAccounts = useMemo(() => {\n    if (parentAccounts.length === 0) return true; // Don't show message while loading\n    // For new accounts, all loaded accounts are selectable\n    if (isNew) return parentAccounts.length > 0;\n    const descendantIds = account.descendant_ids || [];\n    const currentParentId = account.parent?.id;\n    return parentAccounts.some(\n      (acc) =>\n        acc.id !== account.id &&\n        !descendantIds.includes(String(acc.id)) &&\n        acc.id !== currentParentId\n    );\n  }, [parentAccounts, account.id, account.descendant_ids, account.parent?.id, isNew]);\n\n  const handleActivateParentEdit = () => {\n    setIsParentEditActive(true);\n    loadParentAccounts();\n  };\n\n  const handleCancelParentEdit = () => {\n    const defaultParentId = isNew\n      ? String(app.currentAccount?.id || '')\n      : (account.parent?.id ? String(account.parent.id) : '');\n    formApi.handleOnChange('parent_id', defaultParentId as never);\n    setSelectedParentName(null);\n    setIsParentEditActive(false);\n  };\n\n  const handleParentSelect = (id: string, name?: string) => {\n    formApi.handleOnChange('parent_id', id as never);\n    if (name) {\n      // Don't show selection message if selecting the current/default parent (no change)\n      const defaultParentId = isNew ? app.currentAccount?.id : account.parent?.id;\n      const isDefaultParent = defaultParentId && String(defaultParentId) === id;\n      setSelectedParentName(isDefaultParent ? null : name);\n      setIsParentEditActive(false);\n    }\n  };\n\n  const typeChoices = [\n    '',\n    'Agent',\n    'Enterprise',\n    'Exchange',\n    'Internal',\n  ]\n\n  const buyerContactDisplayHelp = (\n    <HelpPopper name=\"buyer-contact-display\" title=\"Buyer Contact Display\" iconClass=\"ms-1\">\n      Public-facing contact info for this buyer. Required for Rhode Island state\n      data privacy compliance. When enabled, this content is displayed publicly\n      on the O&amp;O Contact pages so consumers can request removal of their data\n      directly from this buyer.\n    </HelpPopper>\n  );\n\n  return (\n    <div className=\"form-section\">\n      <form>\n\n        {!readOnly && !formIsValid\n        && (\n        <StandardAlert color=\"warning\" className=\"alert-form-validation\">\n          Please correct the errors below before continuing\n        </StandardAlert>\n        )}\n\n        <FormGroup>\n          <Label>\n            Name\n            {!readOnly && <> <Required /></>}\n          </Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">{account.name}</div>\n          ) : (\n            <>\n              <Input\n                type=\"text\"\n                name=\"name\"\n                onChange={formApi.handleOnChange}\n                value={formValues.name}\n                invalid={!!formErrors.name}\n              />\n              <FormFeedback>{formErrors.name}</FormFeedback>\n            </>\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>Description</Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">{account.description || '—'}</div>\n          ) : (\n            <Input\n              type=\"textarea\"\n              name=\"description\"\n              onChange={formApi.handleOnChange}\n              value={formValues.description}\n            />\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>Type</Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">{account.type || '—'}</div>\n          ) : (\n            <InputGroup>\n              <Input\n                type=\"select\"\n                onChange={formApi.handleOnChange}\n                value={formValues.type}\n                name=\"type\"\n              >\n                {typeChoices.map((t, i) => <option value={t} key={i}>{t}</option>)}\n              </Input>\n            </InputGroup>\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>\n            Time Zone\n            {!readOnly && <Required />}\n          </Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">{account.timezone || '—'}</div>\n          ) : (\n            <InputGroup>\n              <Input\n                type=\"select\"\n                onChange={formApi.handleOnChange}\n                value={formValues.timezone}\n                name=\"timezone\"\n              >\n                {TimezoneOptions.map((zone, i) => <option value={zone.value} key={i}>{zone.name}</option>)}\n              </Input>\n            </InputGroup>\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>DBA</Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">{account.dba?.name || '—'}</div>\n          ) : (\n            <DynamicEnhancedSelect\n              onChange={(id: string) => formApi.handleOnChange('dba_id', id as never)}\n              value={formValues.dba_id}\n              name=\"dba\"\n              endpoint=\"dbas\"\n              params={{limit:1000}}\n              labelProperty=\"name\"\n              // The stored value is a string id; stringify the option id so the\n              // numeric dba id from /dbas matches and the dropdown preselects.\n              getOptionValue={(opt: { value: number }) => String(opt.value)}\n              className=\"w-100\"\n              isClearable\n              isSearchable\n            />\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>\n            Buyer Name\n            {!readOnly && (\n              <>\n                {' '}\n                <HelpPopper name=\"buyer-name\" title=\"Buyer Name\">\n                  <p>Target this buyer for auctions. If matches are provided from third party integrations,\n                    the buyer name will be used to de-duplicate them.</p>\n                  <StandardAlert icon=\"alert\" color=\"light\" inline>\n                    Buyer name will be deprecated.<br/>\n                    Use DBA instead.\n                  </StandardAlert>\n                </HelpPopper>\n              </>\n            )}\n          </Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">{account.buyer_name || '—'}</div>\n          ) : (\n            <>\n              <Input\n                type=\"text\"\n                name=\"buyer_name\"\n                onChange={formApi.handleOnChange}\n                value={formValues.buyer_name}\n              />\n              <FormText>\n                <StandardAlert icon=\"alert\" color=\"light\" inline>\n                  Buyer name will be deprecated. Use DBA.\n                </StandardAlert>\n              </FormText>\n            </>\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>\n            Buyer Group\n            {!readOnly && (\n              <>\n                {' '}\n                <HelpPopper name=\"buyer-group\" title=\"Buyer Group\">\n                  Used to prevent duplication of lead purchasing within a group of accounts.\n                  &nbsp;Accounts that share a buyer group will only buy a single lead once.\n                </HelpPopper>\n              </>\n            )}\n          </Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">{account.buyer_group || '—'}</div>\n          ) : (\n            <Input\n              type=\"text\"\n              name=\"buyer_group\"\n              onChange={formApi.handleOnChange}\n              value={formValues.buyer_group}\n            />\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          {readOnly ? (\n            <>\n              <Label>\n                Buyer Contact Display\n                {buyerContactDisplayHelp}\n              </Label>\n              <div className=\"mb-1\">\n                <Badge color={account.buyer_contact_display_enabled ? 'success' : 'danger'}>\n                  Public display: {account.buyer_contact_display_enabled ? 'Enabled' : 'Disabled'}\n                </Badge>\n              </div>\n              <div className=\"form-control-plaintext\" style={{ whiteSpace: 'pre-wrap' }}>\n                {account.buyer_contact_display || '—'}\n              </div>\n            </>\n          ) : (\n            <>\n              <div className=\"d-flex align-items-center\">\n                <Label className=\"d-flex align-items-center mb-0\">\n                  <Input\n                    type=\"checkbox\"\n                    name=\"buyer_contact_display_enabled\"\n                    className=\"mt-0 me-2\"\n                    checked={!!formValues.buyer_contact_display_enabled}\n                    onChange={(e) =>\n                      formApi.handleOnChange(\n                        'buyer_contact_display_enabled',\n                        e.target.checked as never,\n                      )\n                    }\n                    aria-label=\"Display Buyer Contact Display publicly on O&O Contact pages\"\n                  />\n                  Buyer Contact Display\n                </Label>\n                {buyerContactDisplayHelp}\n              </div>\n              <Input\n                type=\"textarea\"\n                rows={5}\n                name=\"buyer_contact_display\"\n                onChange={formApi.handleOnChange}\n                value={formValues.buyer_contact_display}\n              />\n            </>\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>\n            Compliance Buyer Notifications\n            {' '}\n            <HelpPopper name=\"compliance-buyer-notifications\" title=\"Compliance Buyer Notifications\">\n              Internal-only email recipients for DNC and DSAR deletion requests. Accepts a\n              single address or a comma-separated list.\n            </HelpPopper>\n          </Label>\n          {readOnly ? (\n            <div className=\"form-control-plaintext\">\n              {account.compliance_buyer_notifications || '—'}\n            </div>\n          ) : (\n            <>\n              <Input\n                type=\"text\"\n                name=\"compliance_buyer_notifications\"\n                onChange={formApi.handleOnChange}\n                value={formValues.compliance_buyer_notifications}\n                invalid={!!formErrors.compliance_buyer_notifications}\n              />\n              <FormFeedback>{formErrors.compliance_buyer_notifications}</FormFeedback>\n            </>\n          )}\n        </FormGroup>\n\n        <FormGroup>\n          <Label>\n            Account Executive\n              {' '}\n              <HelpPopper name=\"account-executive\" title=\"Account Executive\">\n                The internal Mastodon team member responsible for this buyer relationship.\n                Employees should contact this person with questions about the account.\n              </HelpPopper>\n            </Label>\n            {readOnly ? (\n              <div className=\"form-control-plaintext\">\n                {account.account_executive?.name || '—'}\n              </div>\n            ) : (\n              <>\n                <DynamicEnhancedSelect\n                  onChange={(id: string) => formApi.handleOnChange('account_executive_id', id as never)}\n                  value={formValues.account_executive_id}\n                  name=\"account_executive\"\n                  endpoint=\"users\"\n                  params={{ role_internal: true, limit: 1000 }}\n                  labelProperty=\"last_name\"\n                  formatOptionLabel={renderAccountExecutiveOption}\n                  getOptionLabel={fullNameFor}\n                  // The stored value is a string id; stringify the option id so the\n                  // numeric user id from /users matches and the dropdown preselects.\n                  getOptionValue={(opt: UserOption) => String(opt.value)}\n                  className=\"w-100\"\n                  isClearable\n                  isSearchable\n                />\n              </>\n            )}\n          </FormGroup>\n\n        {(account.id > 0 || isNew) && (\n          <FormGroup>\n            <Label>\n              Parent Account\n              {!readOnly && (\n                <>\n                  {' '}\n                  <HelpPopper name=\"parent-account\" title=\"Parent Account\">\n                    {isNew\n                      ? 'Choose which account this new account will be created under.'\n                      : 'The parent account in the account hierarchy. Changing the parent will move this account and all of its sub-accounts under the new parent.'}\n                  </HelpPopper>\n                </>\n              )}\n            </Label>\n            {readOnly ? (\n              <div className=\"form-control-plaintext\">{account.parent?.name || 'None (Root Account)'}</div>\n            ) : (\n              <>\n                {!isParentEditActive ? (\n                  <div className=\"d-flex align-items-center\">\n                    {selectedParentName ? (\n                      <span className=\"me-2\">\n                        {isNew ? (\n                          <>Parent: <strong>{selectedParentName}</strong></>\n                        ) : (\n                          <>Move to <strong>{selectedParentName}</strong></>\n                        )}\n                      </span>\n                    ) : (\n                      <span className=\"me-2\">\n                        {isNew\n                          ? app.currentAccount?.name\n                          : (account.parent?.name || 'None (Root Account)')}\n                      </span>\n                    )}\n                    {allowEdit && (account.parent || isNew) && (\n                      <Button\n                        color=\"link\"\n                        size=\"sm\"\n                        onClick={handleActivateParentEdit}\n                        className=\"inline\"\n                      >\n                        Change\n                      </Button>\n                    )}\n                  </div>\n                ) : (\n                  <div>\n                    {isLoadingParents ? (\n                      <div className=\"d-flex align-items-center\">\n                        <Spinner size=\"sm\" className=\"me-2\" />\n                        <span>Loading accounts...</span>\n                      </div>\n                    ) : (\n                      <>\n                        {!hasSelectableAccounts ? (\n                          <StandardAlert color=\"info\" icon=\"info\">\n                            This account&apos;s parent cannot be changed. Accounts cannot be placed under their own\n                            sub-accounts, and no other parent accounts are available.\n                          </StandardAlert>\n                        ) : (\n                          <>\n                            {!isNew && (\n                              <StandardAlert color=\"warning\" icon=\"alert\">\n                                Changing the parent account will move this account and all sub-accounts (if any) under the new parent.\n                              </StandardAlert>\n                            )}\n                            <div className=\"mb-2\">\n                              <small>\n                                Account hierarchy is for organizational purposes and does not affect orders or data collection.\n                              </small>\n                            </div>\n                            <div className=\"mb-2\">\n                              <small>\n                                All users of the parent account will have access to sub-accounts (level of access may vary).\n                              </small>\n                            </div>\n                          </>\n                        )}\n                        <AccountTreePicker\n                          accounts={parentAccounts}\n                          currentAccountId={account.id || 0}\n                          currentAccountDescendantIds={account.descendant_ids || []}\n                          currentParentId={isNew ? (app.currentAccount?.id || null) : (account.parent?.id || null)}\n                          selectedValue={formValues.parent_id}\n                          onSelect={handleParentSelect}\n                          closeOnClick\n                        />\n                      </>\n                    )}\n                    <Button\n                      color=\"link\"\n                      size=\"sm\"\n                      onClick={handleCancelParentEdit}\n                      className=\"mt-2 p-0\"\n                    >\n                      Cancel\n                    </Button>\n                  </div>\n                )}\n              </>\n            )}\n          </FormGroup>\n        )}\n      </form>\n\n      {!readOnly && allowEdit && (\n        <div className=\"mt-2 d-flex justify-content-end\">\n          <Button\n            tag={Link}\n            to={{ pathname: '/accounts', search: accountsSearch }}\n            color=\"link\"\n            size=\"sm\"\n            className=\"me-2\"\n          >\n            Cancel\n          </Button>\n          <Button\n            onClick={handleSave}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            Save\n          </Button>\n        </div>\n      )}\n\n    </div>\n  );\n};\n\nexport default AccountDetail;\n","import React from 'react';\nimport { Button } from 'reactstrap';\n\nconst InlineConfirmDelete = ({\n  prompt, onDelete, onCancel, justify = 'center',\n}) => (\n  <div className={`inline-confirm d-flex justify-content-${justify}`}>\n    <div className=\"text-center\">\n      <div>{prompt}</div>\n      <Button onClick={onDelete} size=\"sm\" color=\"danger\" className=\"me-2\">Yes</Button>\n      <Button onClick={onCancel} size=\"sm\" color=\"secondary\" outline>No</Button>\n    </div>\n\n  </div>\n);\n\nexport default InlineConfirmDelete;\n","import React, { useState } from 'react';\nimport {\n  Row, Col, FormGroup, Input, Label, Button, Card, CardBody, CardTitle, FormFeedback,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport MaskedInput from 'react-text-mask';\nimport NumberFormat from 'react-number-format';\nimport classnames from 'classnames';\nimport InputWithIcon from '../../../Components/Form/InputWithIcon';\nimport { Required } from '../../../Components/Form/FormCommon';\nimport {CopyButton} from \"@thedmsgroup/mastodon-ui-components\";\nimport InlineConfirmDelete from '../../../Components/Form/InlineConfirmDelete';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport useApi from '../../../Hooks/useApi';\n\n// Mask dd.dd\nconst currencyMask = createNumberMask({\n  prefix: '',\n  allowDecimal: true,\n  decimalLimit: 2,\n  integerLimit: 9,\n  // fixedDecimalScale:true\n});\n\nconst Goal = ({\n  goal, onRemove, onSaved, reloadList, allowEdit\n}) => {\n  const { api } = useApi();\n  const [editMode, setEditMode] = useState(!goal.id);\n  const [deleteConfirm, setDeleteConfirm] = useState(false);\n  const [name, setName] = useState(goal.name);\n  const [value, setValue] = useState(goal.value);\n  const [isUpdating, setIsUpdating] = useState(false);\n  const [errors, setErrors] = useState({});\n  const [originalGoal] = useState(goal);\n  const isNew = !goal.id;\n  const copyTag = `<img src=\"${goal.url}\" width=\"1\" height=\"1\" border=\"0\" alt=\"\">`;\n\n  const toggleDeleteConfirm = () => setDeleteConfirm(!deleteConfirm);\n\n  const handleCancel = () => {\n    setName(originalGoal.name);\n    setValue(originalGoal.value);\n    setEditMode(false);\n    if (isNew) {\n      // if cancel new, remove\n      onRemove();\n    }\n  };\n\n  const handleSave = () => {\n    if (!isUpdating) {\n      const valid = !!name;\n      if (valid) {\n        setErrors({});\n        save();\n      } else {\n        setErrors({ name: 'Please enter a name' });\n      }\n    }\n  };\n\n  const save = async () => {\n    // for new, will need to update list\n    setIsUpdating(true);\n    const newGoal = { ...goal, name, value };\n    let result;\n    if (isNew) {\n      result = await api.endpoints.goals.create(newGoal);\n    } else {\n      result = await api.endpoints.goals.update(newGoal);\n    }\n\n    setIsUpdating(false);\n\n    if (result) {\n      setEditMode(false);\n      onSaved();\n      reloadList();\n    } else {\n      // Could get 'name already exists' error\n      if (api.error.form && api.error.form['name.name']) {\n        notify(`Unable to save goal: ${api.error.form['name.name']}`, 'error');\n      } else {\n        notify(`Unable to save goal: ${api.error.name}`, 'error');\n      }\n    }\n  };\n\n  const removeGoal = async () => {\n    setIsUpdating(true);\n    const result = await api.endpoints.goals.delete(goal.id);\n    setIsUpdating(false);\n    onRemove();\n  };\n\n  return (\n    <Card className={classnames('goal mt-3 mb-3', { new: isNew })}>\n\n      <CardBody>\n        {editMode === false && (\n        <CardTitle>\n          {name}\n          {' '}\n          {value && (\n          <span className=\"value ms-2\">\n            <NumberFormat value={value} displayType=\"text\" thousandSeparator prefix=\"$\" decimalScale={2} fixedDecimalScale />\n          </span>\n          ) }\n        </CardTitle>\n        )}\n        <Row>\n\n          {editMode === false && (\n            <>\n              <Col sm={9}>\n                <div>\n                  <code>\n                    &lt;img src=&quot;\n                    {goal.url}\n                    &quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;\n                  </code>\n                </div>\n                <div>\n                  <CopyButton\n                    id={`copy-goal-tag-${goal.id}`}\n                    textToCopy={copyTag}\n                    buttonSize=\"sm\"\n                  >\n                    Copy Pixel Tag\n                  </CopyButton>\n                  &nbsp;|&nbsp;\n                  <CopyButton\n                    id={`copy-goal-id-${goal.id}`}\n                    textToCopy={goal.uuid}\n                    buttonSize=\"sm\"\n                  >\n                    Copy Goal ID\n                  </CopyButton>\n                </div>\n              </Col>\n              {allowEdit && (\n                <Col sm={3} className=\"text-end\">\n                  {deleteConfirm === true ? (\n                    <InlineConfirmDelete prompt=\"Remove goal?\" onDelete={removeGoal} onCancel={toggleDeleteConfirm} justify=\"end\" />\n                  ) : (\n                    <>\n                      <Button onClick={() => setEditMode(true)} color=\"link\"><FaIcon icon=\"pencil-alt\" /></Button>\n\n                      <Button onClick={toggleDeleteConfirm} color=\"link\"><FaIcon icon=\"times\" color=\"darkred\" /></Button>\n\n                    </>\n                  )}\n\n                </Col>\n              )}\n\n            </>\n          )}\n\n          {editMode && allowEdit && (\n            <>\n              <Col sm={5}>\n                <FormGroup>\n                  <Label>\n                    Name\n                    <Required />\n                  </Label>\n                  <Input\n                    name=\"name\"\n                    maxLength={100}\n                    value={name}\n                    invalid={errors.name}\n                    onChange={(e) => setName(e.target.value)}\n                  />\n                  <FormFeedback>{errors.name}</FormFeedback>\n                </FormGroup>\n              </Col>\n              <Col sm={3}>\n                <FormGroup>\n                  <Label>Value</Label>\n\n                  <MaskedInput\n                    mask={currencyMask}\n                    value={value || ''}\n                    onChange={(e) => setValue(e.target.value)}\n                    render={(ref, props) => <InputWithIcon className=\"tiny\" innerRef={ref} icon=\"dollar-sign\" {...props} />}\n                  />\n                </FormGroup>\n              </Col>\n              <Col sm={4} className=\"text-right\">\n                <FormGroup>\n                  <Label>&nbsp;</Label>\n                  <div>\n                    <Button onClick={handleSave} color=\"primary\" size=\"sm\" className=\"me-2\">\n                      <FaIcon icon=\"save\" />\n                      Save\n                    </Button>\n                    <Button onClick={handleCancel} color=\"secondary\" size=\"sm\" outline>Cancel</Button>\n                  </div>\n                </FormGroup>\n              </Col>\n            </>\n\n          )}\n\n        </Row>\n      </CardBody>\n    </Card>\n  );\n};\n\nexport default Goal;\n","import React from 'react';\nimport {\n  Alert, Modal, ModalHeader, ModalBody,\n} from 'reactstrap';\n// import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {JsonDisplay} from '@thedmsgroup/mastodon-ui-components';\n// import GoalTracking from \"./GoalTracking\";\n\nconst GoalPostingModal = ({ isOpen, cancel }) => {\n  const jsonExample = {\n    sale_id: 'c3b7aad2-c221-4568-925b-5a2a97a01373',\n    unique_id: 'sale-123',\n    value: '12.99',\n  };\n  return (\n    <Modal isOpen={isOpen} toggle={cancel} size=\"lg\" id=\"post-goal-help-modal\">\n      <ModalHeader toggle={cancel}>\n        The Mastodon Goal Webhook\n      </ModalHeader>\n      <ModalBody>\n        <p>The Mastodon API provides a webhook for registering goals or conversions. POST to:</p>\n\n        <Alert color=\"secondary\">\n          <strong>\n            https://matching.platform.ue.co/goals/\n            <code>&lt;goal_id&gt;</code>\n          </strong>\n        </Alert>\n\n        <p>\n          The\n          <code>&lt;goal_id&gt;</code>\n          {' '}\n          to be placed in this URL is the 36 character\n          unique ID associated with each goal that you create in Mastodon. It can be copied from the list of goals.\n        </p>\n\n        <p>The body of the request should contain JSON data in this format:</p>\n\n        <JsonDisplay data={jsonExample} showCopy={false} />\n\n        <table>\n          <thead>\n            <tr>\n              <th>Field</th>\n              <th>Description</th>\n            </tr>\n\n          </thead>\n          <tbody>\n            <tr>\n              <td><code>sale_id</code></td>\n              <td>\n                The\n                <code>click_id</code>\n                {' '}\n                or\n                <code>lead_id</code>\n                {' '}\n                of the click or lead you received from us.\n              </td>\n            </tr>\n            <tr>\n              <td><code>unique_id</code></td>\n              <td>\n                <b>Optional</b>\n                . Your own unique ID for the conversion. This helps to de-duplicate multiple conversions.\n              </td>\n            </tr>\n            <tr>\n              <td><code>value</code></td>\n              <td>\n                <b>Optional</b>\n                . A dollar value for the conversion. This will override the goal&apos;s configured value, if set.\n              </td>\n            </tr>\n          </tbody>\n\n        </table>\n\n        <p>\n          A successful response will have status\n          <strong>201</strong>\n          {' '}\n          and a\n          unique\n          <code>conversion_id</code>\n          {' '}\n          that you can keep for your records.\n        </p>\n\n      </ModalBody>\n    </Modal>\n  );\n};\n\nexport default GoalPostingModal;\n","import React, { useEffect, useState } from 'react';\nimport { Button, Col, Row } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport Goal from './Goal';\nimport GoalPostingModal from './GoalPostingModal';\nimport useApi from '../../../Hooks/useApi';\nimport usePermission from \"../../../Hooks/usePermission\";\n\nconst Goals = ({ accountId }) => {\n  const allowEdit = usePermission('accounts.edit');\n  const [goals, setGoals] = useState([]);\n  const [goalPostingModalOpen, setGoalPostingModalOpen] = useState(false);\n  const [isAdding, setIsAdding] = useState(false);\n  const { api } = useApi();\n\n  useEffect(() => {\n    loadGoals();\n  }, []);\n\n  const loadGoals = async () => {\n    const goals = await api.endpoints.goals.list({ account_id: accountId });\n    if (goals) {\n      setGoals(goals);\n    } else {\n      // notify\n    }\n  };\n\n  const toggleModal = () => setGoalPostingModalOpen(!goalPostingModalOpen);\n\n  const addGoal = () => {\n    setIsAdding(true); // TODO: when do we set this false?\n    setGoals([...goals, {\n      id: 0, name: '', account_id: accountId, value: '', url: '',\n    }]);\n  };\n\n  const removeGoal = (itemIndex) => {\n    if (goals.length > itemIndex) {\n      const list = [...goals];\n      if (list[itemIndex].id === 0) setIsAdding(false);\n      list.splice(itemIndex, 1);\n      setGoals(list);\n    }\n  };\n\n  const handleSaveGoal = () => {\n    setIsAdding(false);\n  };\n\n  return (\n    <Row>\n      <Col>\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Goal Pixels</div>\n          <p>\n            Create tracking pixels for named events, with an optional dollar value. In addition to placing these pixels\n            on visited pages, you can trigger a goal by\n            {' '}\n            <Button className=\"inline\" color=\"link\" onClick={toggleModal}>using a webhook</Button>\n            .\n          </p>\n          {goals.length === 0\n        && (\n        <StandardAlert color=\"light\">\n          <span>\n            No goals are configured.\n            {allowEdit && <Button color=\"link\" onClick={addGoal} className=\"p-0 ms-2\">Add a goal</Button>}\n\n\n          </span>\n        </StandardAlert>\n        )}\n\n          <div className=\"goals-container\">\n\n            {goals.map((goal, i) => (\n              <Goal\n                key={i}\n                goal={goal}\n                onRemove={() => removeGoal(i)}\n                onAdd={addGoal}\n                onSaved={handleSaveGoal}\n                reloadList={loadGoals}\n                allowEdit={allowEdit}\n              />\n            ))}\n\n            {goals.length > 0 && allowEdit && (\n            <div className=\"text-right\">\n              <Button color=\"primary\" disabled={isAdding} onClick={addGoal}>\n                <FaIcon icon=\"plus\" />\n                {' '}\n                <span>Add Goal</span>\n              </Button>\n            </div>\n            )}\n          </div>\n        </div>\n      </Col>\n\n      {allowEdit && (\n        <GoalPostingModal isOpen={goalPostingModalOpen} cancel={toggleModal} />\n      )}\n\n\n    </Row>\n  );\n};\n\nexport default Goals;\n","import React, { useState } from 'react';\nimport {\n  FormGroup, Label, Button, Input,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport FileDropzone from '../../../Components/Form/FileDropzone';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport LoadingBar from '../../../Layout/LoadingBar';\nimport useApi from '../../../Hooks/useApi';\nimport {Required} from \"../../../Components/Form/FormCommon\";\nimport DynamicSingleSelect from \"../../../Components/Form/DynamicSingleSelect\";\nimport IconCheckbox from \"../../../Components/Form/IconCheckbox\";\n\nconst FILE_TYPES = 'text/plain,text/csv,application/vnd.ms-excel,application/excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/csv, text/x-csv, application/x-csv, text/comma-separated-values,text/x-comma-separated-values';\n\nconst GoalTrackingUpload = ({ close, accountId }) => {\n  const [isUploading, setIsUploading] = useState(false);\n  const [csvFile, setCsvFile] = useState(null);\n  const [goalId, setGoalId] = useState('');\n  const [note, setNote] = useState('');\n  const [isBadFile, setIsBadFile] = useState(false);\n  const [dedupeSales, setDedupeSales] = useState(true);\n  // const[description, setDescription] = useState('');\n  const [formError, setFormError] = useState('');\n\n  const { api } = useApi();\n\n  // const handleChangeAccount = (e) => setAccountId(e.target.value);\n\n  const handleChangeNote = (e) => setNote(e.target.value);\n\n  const handleChangeDedupeSales = (name, value) => {\n    setDedupeSales(value);\n  }\n\n  const handleChangeGoal = (_, goal_id) => {\n    if(formError) setFormError(null);\n    setGoalId(goal_id ? goal_id.toString(): '');\n  }\n\n  const handleFilesAccepted = (files) => {\n    setIsBadFile(false);\n    setFormError(null);\n    if (files && files.length) {\n      setCsvFile(files[0]);\n    } else {\n      setCsvFile(null);\n    }\n  };\n\n  const handleFilesRejected = (files) => {\n    if (files && files.length) {\n      setIsBadFile(true);\n    } else {\n      setIsBadFile(false);\n    }\n  };\n\n  const handleUpload = () => {\n    if (!csvFile) {\n      setFormError('Please add a valid CSV file');\n    } else if (isBadFile) {\n      setFormError('The selected file is not valid');\n    } else if (!accountId) {\n      setFormError('Please choose a target account.');\n    } else if (!goalId) {\n      setFormError('Please choose a goal.');\n    } else {\n      setFormError(null);\n      uploadFile();\n    }\n  };\n\n  const uploadFile = async () => {\n    setIsUploading(true);\n\n    const formData = new FormData();\n\n    formData.append('account_id', accountId);\n    formData.append('goal_id', goalId);\n    formData.append('note', note);\n    formData.append('dedupe_sales', dedupeSales ? '1' : '0');\n    formData.append('tracking_file', csvFile);\n\n    const result = await api.endpoints.goalsTracking.create(formData);\n    setIsUploading(false);\n\n    if (result) {\n      notify('Tracking file saved', 'success');\n      close(true);\n    } else {\n      // header error will be Api.error.form.tracking_file\n      const err = api.error?.form?.tracking_file;\n      console.log('GoalTrackingUpload.js:', api.error, err);\n      /*\n      Error could look like:\n      {\n    \"errors\": {\n        \"tracking_file\": \"Invalid spreadsheet header: Header must exist and have columns sales_id, goal_name, and datetime\"\n    }\n}\n       */\n      if (err) {\n        setFormError(err || 'Unknown upload error');\n      } else {\n        notify(`Unable to upload file: ${api.error.name}`, 'error');\n      }\n    }\n  };\n\n  return (\n    <div>\n\n      <LoadingBar name=\"modal\" active={isUploading} message=\"Uploading...\" />\n\n      {formError\n      && (\n      <StandardAlert color=\"info\" className=\"validation\">\n        {formError}\n      </StandardAlert>\n      )}\n\n      <p>\n        Provide a CSV or spreadsheet file that matches lead tracking data to goals. The spreadsheet must at least\n        have the <span style={{ color: 'red' }}>required</span>\n        {' '} header fields as indicated below. Only the first worksheet will be processed. The optional <i>unique_id</i>\n        {' '} value is used for de-duplication. The optional <i>quantity</i> value indicates how many conversions to record\n        {' '}  for each sale (if using this column, provide 1 as the default value).\n      </p>\n\n      <div id=\"header-example-header\">\n        <div>Required Columns (at least one of these)</div>\n        <div>Optional Columns</div>\n      </div>\n\n      <div id=\"header-example\">\n        <div className=\"req\">auction_id</div>\n        <div className=\"req\">sale_id</div>\n        <div className=\"req\">email</div>\n        <div className=\"req\">phone</div>\n        <div>datetime</div>\n        <div>value</div>\n        <div>unique_id</div>\n        <div>quantity</div>\n\n        <div>4e9b67f2...</div>\n        <div>5271533</div>\n        <div>joe@example.com</div>\n        <div>+16198881234</div>\n        <div>2021-07-12 16:11:00</div>\n        <div>42.00</div>\n        <div>4e9b67f2...</div>\n        <div>2</div>\n      </div>\n\n      <FormGroup>\n        <Label>\n          Goal <Required/>\n        </Label>\n          <DynamicSingleSelect\n            onChange={handleChangeGoal}\n            value={goalId ?? ''}\n            endpoint=\"goals\"\n            name=\"goal_id\"\n            params={{account_id: accountId}}\n          />\n      </FormGroup>\n\n      <FormGroup>\n        <Label>\n          De-Duplicate Sales\n        </Label>\n        <IconCheckbox\n          name=\"dedupe_sales\"\n          value={dedupeSales}\n          onChange={handleChangeDedupeSales}\n        >\n          If checked, conversions in this file will only be attributed to a single sale once.\n        </IconCheckbox>\n      </FormGroup>\n\n      <FormGroup>\n        <Label>Note</Label>\n        <Input type=\"text\" name=\"note\" placeholder=\"Describe this file\" value={note} onChange={handleChangeNote} />\n      </FormGroup>\n\n      <FileDropzone\n        fileTypes={FILE_TYPES}\n        maxSize={10485760}\n        disabled={isUploading}\n        isUploading={isUploading}\n        onDropAccepted={handleFilesAccepted}\n        onDropRejected={handleFilesRejected}\n        label=\"File\"\n        hint=\"Add a CSV file or Excel spreadsheet up to 10 megabytes\"\n      />\n\n      <div className=\"d-flex justify-content-end\">\n        <Button color=\"link\" onClick={close} size=\"sm\">Cancel</Button>\n        <Button color=\"primary\" onClick={handleUpload} size=\"sm\">Save</Button>\n      </div>\n\n    </div>\n  );\n};\n\nGoalTrackingUpload.propTypes = {\n  close: PropTypes.func.isRequired,\n  accountId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n};\n\nexport default GoalTrackingUpload;\n","import React, { useMemo } from 'react';\nimport {\n  FormGroup, Modal, ModalHeader, ModalBody, ModalFooter, Button,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { CopyButton } from '@thedmsgroup/mastodon-ui-components';\n\n/*\n * Modal for display of row errors from a tracking file import. Shared by goal\n * tracking and return tracking, so the wording comes from the caller — a default\n * naming one of them would mislabel the other.\n */\nconst TrackingResultModal = ({\n  isOpen, close, rowErrors, title, description,\n}) => {\n  // object keys that look like integers iterate in ascending numeric order, so\n  // row 9 precedes row 10 without sorting\n  const entries = useMemo(\n    () => Object.entries(rowErrors || {}).map(([rowNum, val]) => [rowNum, val || 'unknown error']),\n    [rowErrors],\n  );\n\n  // what the Copy button puts on the clipboard: one row per line, tab-separated\n  const asText = useMemo(\n    () => entries.map(([rowNum, val]) => `${rowNum}\\t${val}`).join('\\n'),\n    [entries],\n  );\n\n  return (\n    <Modal isOpen={isOpen} toggle={close} size=\"lg\" id=\"tracking-result-modal\">\n      <ModalHeader toggle={close}>\n        {title}\n      </ModalHeader>\n      <ModalBody>\n        <p>{description}</p>\n\n        <FormGroup>\n          <CopyButton\n            id=\"copy-error-rows\"\n            textToCopy={asText}\n            buttonSize=\"sm\"\n          >\n            Copy\n          </CopyButton>\n\n          {/* a two-column layout rather than a textarea: a long message (an AWS\n              error, say) wraps under its own message column instead of under the\n              row number, so it stays obvious where one row ends and the next\n              begins */}\n          <div className=\"row-errors\">\n            {entries.map(([rowNum, val]) => (\n              <div className=\"row-error\" key={rowNum}>\n                <div className=\"row-num\">{rowNum}</div>\n                <div className=\"row-message\">{val}</div>\n              </div>\n            ))}\n          </div>\n        </FormGroup>\n\n      </ModalBody>\n\n      <ModalFooter>\n        <div className=\"d-flex justify-content-end\">\n          <Button size=\"sm\" onClick={close}>Done</Button>\n        </div>\n      </ModalFooter>\n    </Modal>\n  );\n};\n\nTrackingResultModal.propTypes = {\n  isOpen: PropTypes.bool,\n  close: PropTypes.func,\n  rowErrors: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n  title: PropTypes.string,\n  description: PropTypes.string,\n};\n\nTrackingResultModal.defaultProps = {\n  title: 'Import Errors',\n  description: 'These rows could not be processed.',\n};\n\nexport default TrackingResultModal;\n","import React, { useEffect, useState, useMemo } from 'react';\nimport {\n  Button, Modal, ModalBody, ModalHeader,\n} from 'reactstrap'\nimport {useNavigate} from \"react-router-dom\";\nimport filesize from 'filesize.js';\nimport PropTypes from 'prop-types';\nimport GoalTrackingUpload from './GoalTrackingUpload';\nimport PagedTable from '../../../Components/Table/PagedTable';\nimport { DateFormatter, NoDataComponent } from '../../../Components/Table/Table';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport BooleanIconCell from \"../../../Components/Table/BooleanIconCell\";\n//import InlineConfirmDelete from '../../../Components/Form/InlineConfirmDelete';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport DownloadFileLink from '../../../Components/DownloadFileLink';\nimport TrackingResultModal from './TrackingResultModal';\nimport usePermission from \"../../../Hooks/usePermission\";\nimport useApi from '../../../Hooks/useApi';\n\nconst GoalTracking = ({ accountId }) => {\n  const navigate = useNavigate();\n  const allowEdit = usePermission('accounts.edit');\n  const [tracking, setTracking] = useState([]);\n  const [goals, setGoals] = useState([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [uploadModalOpen, setUploadModalOpen] = useState(false);\n  const [rowErrorModalOpen, setRowErrorModalOpen] = useState(false);\n  const [rowErrors, setRowErrors] = useState();\n  const { api } = useApi();\n\n  const closeUploadModal = (refresh) => {\n    setUploadModalOpen(false);\n    if (refresh) {\n      load();\n    }\n  };\n\n  const showRowErrors = (errors) => {\n    setRowErrors(errors);\n    setRowErrorModalOpen(true);\n  };\n\n  const closeRowErrors = () => {\n    setRowErrors(null);\n    setRowErrorModalOpen(false);\n  };\n\n  useEffect(() => {\n    load();\n  }, []);\n\n  const load = async () => {\n    setIsLoading(true);\n    const files = await api.endpoints.goalsTracking.list({ account_id: accountId });\n    if (files) {\n      setTracking(files.data);\n    } else {\n      notify(`Unable to get tracking files: ${api.error?.name}`, 'error');\n    }\n\n    const goals = await api.endpoints.goals.list({ account_id: accountId });\n    if (goals) {\n      setGoals(goals);\n    }\n\n    setIsLoading(false);\n  };\n\n\n  const deleteTrackingFile = async (id) => {\n    setIsLoading(true);\n    const result = await api.endpoints.goalsTracking.delete(id);\n    if (result) {\n      load();\n      notify('The file has been removed', 'success');\n    } else {\n      notify(`Unable to remove file: ${api.error?.name}`, 'error');\n      setIsLoading(false);\n    }\n  };\n\n  /*\n  account: {id: 9, name: \"Acme Insurance\"}\nfile: {file_name: \"mst_test_2_sheet.xlsx\", size: 8879, created_at: \"2021-09-27T18:56:25+00:00\"}\ncreated_at: \"2021-09-27T18:56:25+00:00\"\nfile_name: \"mst_test_2_sheet.xlsx\"\nsize: 8879\nid: 35\nnote: \"Excel with 2 sheets\"\nuser: {id: 5, name: \"Don Admin\"}\n   */\n\n  const columns = useMemo(() => [\n    {\n      Header: 'File',\n      accessor: 'file.file_name',\n      Cell: ({ row, value }) => <FileNameCell name={value} size={row.original.file.size} />,\n      minWidth: 180,\n    },\n    {\n      Header: 'Goal',\n      accessor: 'goal',\n      Cell: ({value}) => <><EntityId id={value.id} /> {value.name}</>\n    },\n    {\n      Header: 'Note',\n      accessor: 'note',\n      minWidth: 200,\n    },\n    {\n      Header: 'Dedupe Sales',\n      accessor: 'dedupe_sales',\n      maxWidth: 100,\n      Cell: ({ value }) => <BooleanIconCell value={value} trueTitle=\"De-duplication enabled\" falseTitle=\"De-duplication disabled\" />,\n    },\n    {\n      Header: 'User',\n      accessor: 'user.name',\n      maxWidth: 100,\n    },\n    {\n      Header: 'Success',\n      accessor: 'num_success',\n      maxWidth: 80,\n    },\n    {\n      Header: 'Errors',\n      accessor: 'num_errors',\n      Cell: ({ value, row }) => <RowErrorCell numErrors={value} errors={row.original.row_errors} openModal={() => showRowErrors(row.original.row_errors)} />,\n      minWidth: 100,\n    },\n\n    {\n      Header: 'Processed',\n      accessor: 'processed_at',\n      maxWidth: 120,\n      Cell: ({ value }) => <DateCell date={value} />,\n    },\n    {\n      Header: 'Created',\n      accessor: 'file.created_at',\n      maxWidth: 120,\n      Cell: ({ value }) => <DateCell date={value} />,\n    },\n    {\n      id: 'actions',\n      disableSortBy: true,\n      maxWidth: 60,\n      Cell: ({ row }) => (\n        <ActionCell\n          id={row.original.id}\n          filename={row.original.file.file_name}\n          onDelete={() => deleteTrackingFile(row.original.id)}\n        />\n      ),\n    },\n\n  ]);\n\n  const initialTableState = useMemo(() => ({\n    sortBy: [{ id: 'created_at', desc: true }],\n  }), []);\n\n  const gotoGoals = () => {\n    navigate({\n      replace: true,\n      search: 'tab=goals'\n    });\n  }\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header d-flex justify-content-between\">\n\n        <div>Goal Tracking Files</div>\n        {tracking.length > 0 && allowEdit && <Button size=\"sm\" color=\"primary\" onClick={() => setUploadModalOpen(true)}>Add File</Button>}\n      </div>\n\n      <p>Associate conversion funnel events with goals for enhanced reporting.</p>\n\n      {!isLoading && tracking.length === 0 && (\n\n        <>\n          {goals.length > 0 ? (\n            <NoDataComponent>\n              No tracking files.\n              {allowEdit && <Button color=\"link\" className=\"p-0 ms-2\" onClick={() => setUploadModalOpen(true)}>Upload a file.</Button>}\n            </NoDataComponent>\n          ) : (\n            <NoDataComponent>\n              No goals have been defined.\n              {allowEdit && <Button color=\"link\" className=\"p-0 ms-2\" onClick={gotoGoals}>Add a goal.</Button>}\n            </NoDataComponent>\n          )}\n\n        </>\n\n      )}\n\n      {(isLoading || tracking.length > 0)\n      && (\n      <div className=\"react-table-container\">\n\n        <PagedTable\n          columns={columns}\n          initialState={initialTableState}\n          className=\"goal-tracking-table\"\n          data={tracking}\n          loading={isLoading}\n          noDataMessage=\"No tracking files were found\"\n        />\n      </div>\n      )}\n\n      {allowEdit && (\n        <Modal isOpen={uploadModalOpen} toggle={closeUploadModal} size=\"lg\" id=\"goal-tracking-modal\">\n\n          <ModalHeader toggle={closeUploadModal}>Upload Goal Tracking File</ModalHeader>\n          <ModalBody>\n            <GoalTrackingUpload close={closeUploadModal} accountId={accountId} />\n          </ModalBody>\n\n        </Modal>\n      )}\n\n\n      <TrackingResultModal\n        isOpen={rowErrorModalOpen}\n        close={closeRowErrors}\n        rowErrors={rowErrors}\n        title=\"Goal Tracking Errors\"\n        description=\"These rows could not be processed, or did not result in a conversion.\"\n      />\n    </div>\n  );\n};\n\nconst DateCell = ({ date }) => {\n  if (!date) return (null);\n  return (\n    <>\n      <div>\n        <DateFormatter value={date} format=\"MMM d, yyy\" />\n      </div>\n      <div>\n        <small><DateFormatter value={date} format=\"h:mm a\" /></small>\n      </div>\n    </>\n\n  );\n};\n\nconst FileNameCell = ({ name, size, note }) => (\n  <div>\n    <div className=\"file-name\">\n      {name}\n      {' '}\n      <span className=\"file-size\">\n        (\n        {filesize(size, 0)}\n        )\n      </span>\n    </div>\n    {note && <div className=\"file-note\"><i>{note}</i></div>}\n  </div>\n);\n\nconst RowErrorCell = ({ numErrors, errors, openModal }) => (\n  <span>\n    {numErrors}\n    {errors && !Array.isArray(errors) && <Button color=\"link\" size=\"sm\" className=\"p-0 m-0 inline\" onClick={openModal}>view</Button>}\n  </span>\n);\n\n//  We probably don't need the delete file action\n// const ActionCell = React.memo( ({id, filename, onDelete}) => {\n//   const[showPrompt, setShowPrompt] = useState(false);\n//   const handleDelete = () => onDelete(id);\n//   const togglePrompt = () => setShowPrompt(!showPrompt);\n//\n//   return (\n//     <div className=\"list-actions\">\n//         <span className=\"action-item\">\n//           {showPrompt ? (\n//             <InlineConfirmDelete prompt=\"Remove this file?\" onDelete={handleDelete} onCancel={togglePrompt}/>\n//           ) : (\n//             <>\n//               <DownloadFileLink identifier={id} downloadSource=\"goalsTracking\" defaultFilename={filename}/>\n//               <Button color=\"link\" title=\"Remove File\" onClick={togglePrompt}  >\n//                 <FaIcon icon=\"times\" color=\"darkred\"/>\n//               </Button>\n//             </>\n//\n//           )}\n//\n//         </span>\n//\n//     </div>\n//   )\n// });\n\nconst ActionCell = React.memo(({ id, filename }) => (\n  <div className=\"list-actions\">\n    <span className=\"action-item\">\n\n      <DownloadFileLink identifier={id} downloadSource=\"goalsTracking\" defaultFilename={filename} />\n    </span>\n  </div>\n));\n\nActionCell.displayName = 'ActionCell';\n\nGoalTracking.propTypes = {\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport default GoalTracking;\n","import React, { useState } from 'react';\nimport {\n  FormGroup, Label, Button, Input,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport FileDropzone from '../../../Components/Form/FileDropzone';\nimport { StandardAlert } from '@thedmsgroup/mastodon-ui-components';\nimport { notify } from '@thedmsgroup/mastodon-ui-components/lib/common/Notify';\nimport LoadingBar from '../../../Layout/LoadingBar';\nimport useApi from '../../../Hooks/useApi';\n\nconst FILE_TYPES = '.csv,.xlsx,.xls,text/plain,text/csv,application/vnd.ms-excel,application/excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/csv,text/x-csv,application/x-csv,text/comma-separated-values,text/x-comma-separated-values';\n\nconst ReturnTrackingUpload = ({ close, accountId }) => {\n  const [isUploading, setIsUploading] = useState(false);\n  const [csvFile, setCsvFile] = useState(null);\n  const [note, setNote] = useState('');\n  const [isBadFile, setIsBadFile] = useState(false);\n  const [formError, setFormError] = useState('');\n\n  const { api } = useApi();\n\n  const handleChangeNote = (e) => setNote(e.target.value);\n\n  const handleFilesAccepted = (files) => {\n    setIsBadFile(false);\n    setFormError(null);\n    if (files && files.length) {\n      setCsvFile(files[0]);\n    } else {\n      setCsvFile(null);\n    }\n  };\n\n  const handleFilesRejected = (files) => {\n    setIsBadFile(!!(files && files.length));\n  };\n\n  const handleUpload = () => {\n    if (!csvFile) {\n      setFormError('Please add a CSV or Excel file');\n    } else if (isBadFile) {\n      setFormError('The selected file is not valid');\n    } else if (!accountId) {\n      setFormError('Please choose a target account.');\n    } else {\n      setFormError(null);\n      uploadFile();\n    }\n  };\n\n  const uploadFile = async () => {\n    setIsUploading(true);\n\n    const formData = new FormData();\n    formData.append('account_id', accountId);\n    formData.append('note', note);\n    formData.append('tracking_file', csvFile);\n\n    const result = await api.endpoints.returnsTracking.create(formData);\n    setIsUploading(false);\n\n    if (result) {\n      notify('Return tracking file saved', 'success');\n      close(true);\n    } else {\n      const err = api.error?.form?.tracking_file;\n      if (err) {\n        setFormError(err || 'Unknown upload error');\n      } else {\n        notify(`Unable to upload file: ${api.error.name}`, 'error');\n      }\n    }\n  };\n\n  return (\n    <div>\n      <LoadingBar name=\"modal\" active={isUploading} message=\"Uploading...\" />\n\n      {formError && (\n        <StandardAlert color=\"info\" className=\"validation\">\n          {formError}\n        </StandardAlert>\n      )}\n\n      <p>\n        Provide a CSV or Excel file with return decisions for leads. Only the first\n        worksheet is processed.\n        {' '}\n        <i>decision</i>\n        {' '}\n        is required, along with\n        {' '}\n        <i>auction_id</i>\n        {' '}\n        and/or\n        {' '}\n        <i>sale_id</i>\n        . A\n        {' '}\n        <i>sale_id</i>\n        {' '}\n        names the sale directly; with only an\n        {' '}\n        <i>auction_id</i>\n        , the return is matched to this account&apos;s sale in that auction.\n        {' '}\n        <i>buyer_name</i>\n        {' '}\n        is for your own reference and is ignored.\n      </p>\n\n      <div id=\"header-example-header\">\n        <div>Columns</div>\n      </div>\n\n      <div id=\"header-example\">\n        <div className=\"anyof\">auction_id</div>\n        <div className=\"anyof\">sale_id</div>\n        <div className=\"req\">decision</div>\n        <div>buyer_name</div>\n\n        <div>4e9b67f2...</div>\n        <div>5271533</div>\n        <div>approved</div>\n        <div>Allstate</div>\n      </div>\n\n      <div id=\"header-example-legend\">\n        <span className=\"req\">required</span>\n        <span className=\"anyof\">one of these</span>\n        <span>optional</span>\n      </div>\n\n      <FormGroup>\n        <Label>Note</Label>\n        <Input type=\"text\" name=\"note\" placeholder=\"Describe this file\" value={note} onChange={handleChangeNote} />\n      </FormGroup>\n\n      <FileDropzone\n        fileTypes={FILE_TYPES}\n        maxSize={8388608}\n        disabled={isUploading}\n        isUploading={isUploading}\n        onDropAccepted={handleFilesAccepted}\n        onDropRejected={handleFilesRejected}\n        label=\"File\"\n        hint=\"Add a CSV or Excel file up to 8 megabytes\"\n      />\n\n      <div className=\"d-flex justify-content-end\">\n        <Button color=\"link\" onClick={close} size=\"sm\">Cancel</Button>\n        <Button color=\"primary\" onClick={handleUpload} size=\"sm\">Save</Button>\n      </div>\n    </div>\n  );\n};\n\nReturnTrackingUpload.propTypes = {\n  close: PropTypes.func.isRequired,\n  accountId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n};\n\nexport default ReturnTrackingUpload;\n","import React, { useEffect, useState, useMemo } from 'react';\nimport {\n  Button, Modal, ModalBody, ModalHeader,\n} from 'reactstrap';\nimport filesize from 'filesize.js';\nimport PropTypes from 'prop-types';\nimport ReturnTrackingUpload from './ReturnTrackingUpload';\nimport PagedTable from '../../../Components/Table/PagedTable';\nimport { DateFormatter, NoDataComponent } from '../../../Components/Table/Table';\nimport { notify } from '@thedmsgroup/mastodon-ui-components/lib/common/Notify';\nimport DownloadFileLink from '../../../Components/DownloadFileLink';\nimport TrackingResultModal from './TrackingResultModal';\nimport usePermission from '../../../Hooks/usePermission';\nimport useApi from '../../../Hooks/useApi';\n\nconst ReturnTracking = ({ accountId }) => {\n  const allowEdit = usePermission('accounts.edit');\n  const [tracking, setTracking] = useState([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [uploadModalOpen, setUploadModalOpen] = useState(false);\n  const [rowErrorModalOpen, setRowErrorModalOpen] = useState(false);\n  const [rowErrors, setRowErrors] = useState();\n  const { api } = useApi();\n\n  const closeUploadModal = (refresh) => {\n    setUploadModalOpen(false);\n    if (refresh) {\n      load();\n    }\n  };\n\n  const showRowErrors = (errors) => {\n    setRowErrors(errors);\n    setRowErrorModalOpen(true);\n  };\n\n  const closeRowErrors = () => {\n    setRowErrors(null);\n    setRowErrorModalOpen(false);\n  };\n\n  useEffect(() => {\n    load();\n  }, []);\n\n  const load = async () => {\n    setIsLoading(true);\n    const files = await api.endpoints.returnsTracking.list({ account_id: accountId });\n    if (files) {\n      setTracking(files.data);\n    } else {\n      notify(`Unable to get return tracking files: ${api.error?.name}`, 'error');\n    }\n    setIsLoading(false);\n  };\n\n  const columns = useMemo(() => [\n    {\n      Header: 'File',\n      accessor: 'file.file_name',\n      Cell: ({ row, value }) => <FileNameCell name={value} size={row.original.file.size} />,\n      minWidth: 180,\n    },\n    {\n      Header: 'Note',\n      accessor: 'note',\n      minWidth: 200,\n    },\n    {\n      Header: 'User',\n      accessor: 'user.name',\n      maxWidth: 100,\n    },\n    {\n      Header: 'Success',\n      accessor: 'num_success',\n      maxWidth: 80,\n    },\n    {\n      Header: 'Errors',\n      accessor: 'num_errors',\n      Cell: ({ value, row }) => <RowErrorCell numErrors={value} errors={row.original.row_errors} openModal={() => showRowErrors(row.original.row_errors)} />,\n      minWidth: 100,\n    },\n    {\n      Header: 'Processed',\n      accessor: 'processed_at',\n      maxWidth: 120,\n      Cell: ({ value }) => <DateCell date={value} />,\n    },\n    {\n      Header: 'Created',\n      accessor: 'file.created_at',\n      maxWidth: 120,\n      Cell: ({ value }) => <DateCell date={value} />,\n    },\n    {\n      id: 'actions',\n      disableSortBy: true,\n      maxWidth: 60,\n      Cell: ({ row }) => (\n        <ActionCell\n          id={row.original.id}\n          filename={row.original.file.file_name}\n        />\n      ),\n    },\n  ]);\n\n  const initialTableState = useMemo(() => ({\n    sortBy: [{ id: 'created_at', desc: true }],\n  }), []);\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header d-flex justify-content-between\">\n        <div>Return Tracking Files</div>\n        {tracking.length > 0 && allowEdit && <Button size=\"sm\" color=\"primary\" onClick={() => setUploadModalOpen(true)}>Add File</Button>}\n      </div>\n\n      <p>Upload return decisions for leads. Each row must include a sale ID, auction ID, buyer name, and decision (approved or denied).</p>\n\n      {!isLoading && tracking.length === 0 && (\n        <NoDataComponent>\n          No return tracking files.\n          {allowEdit && <Button color=\"link\" className=\"p-0 ms-2\" onClick={() => setUploadModalOpen(true)}>Upload a file.</Button>}\n        </NoDataComponent>\n      )}\n\n      {(isLoading || tracking.length > 0) && (\n        <div className=\"react-table-container\">\n          <PagedTable\n            columns={columns}\n            initialState={initialTableState}\n            className=\"return-tracking-table\"\n            data={tracking}\n            loading={isLoading}\n            noDataMessage=\"No return tracking files were found\"\n          />\n        </div>\n      )}\n\n      {allowEdit && (\n        <Modal isOpen={uploadModalOpen} toggle={closeUploadModal} size=\"lg\" id=\"return-tracking-modal\">\n          <ModalHeader toggle={closeUploadModal}>Upload Return Tracking File</ModalHeader>\n          <ModalBody>\n            <ReturnTrackingUpload close={closeUploadModal} accountId={accountId} />\n          </ModalBody>\n        </Modal>\n      )}\n\n      <TrackingResultModal\n        isOpen={rowErrorModalOpen}\n        close={closeRowErrors}\n        rowErrors={rowErrors}\n        title=\"Return Tracking Errors\"\n        description=\"These rows could not be processed. Correct them and upload the file again — rows that succeeded do not need to be resubmitted.\"\n      />\n    </div>\n  );\n};\n\nconst DateCell = ({ date }) => {\n  if (!date) return null;\n  return (\n    <>\n      <div>\n        <DateFormatter value={date} format=\"MMM d, yyy\" />\n      </div>\n      <div>\n        <small><DateFormatter value={date} format=\"h:mm a\" /></small>\n      </div>\n    </>\n  );\n};\n\nconst FileNameCell = ({ name, size }) => (\n  <div>\n    <div className=\"file-name\">\n      {name}\n      {' '}\n      <span className=\"file-size\">\n        (\n        {filesize(size, 0)}\n        )\n      </span>\n    </div>\n  </div>\n);\n\nconst RowErrorCell = ({ numErrors, errors, openModal }) => (\n  <span>\n    {numErrors}\n    {errors && !Array.isArray(errors) && <Button color=\"link\" size=\"sm\" className=\"p-0 m-0 inline\" onClick={openModal}>view</Button>}\n  </span>\n);\n\nconst ActionCell = React.memo(function ActionCell({ id, filename }) {\n  return (\n    <div className=\"list-actions\">\n      <span className=\"action-item\">\n        <DownloadFileLink identifier={id} downloadSource=\"returnsTracking\" defaultFilename={filename} />\n      </span>\n    </div>\n  );\n});\n\nReturnTracking.propTypes = {\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport default ReturnTracking;\n","import React, { useState } from 'react';\nimport {\n  Button, FormGroup, Input, Label, Spinner,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\n\nconst EditCard = ({\n  card, updateCard, removeCard, cancelEdit, isUpdating,\n}) => {\n  const [autoBilling, setAutoBilling] = useState(card.auto_billing_eligible);\n  const [deleteCardConfirm, setDeleteCardConfirm] = useState(false);\n\n  const handleUpdateCard = () => {\n    updateCard(autoBilling);\n  };\n\n  return (\n    <div className=\"edit-card mt-1 mb-1 py-3 px-2\">\n      <div className=\"cc-auto-pay-col d-flex justify-content-between\">\n        <div>\n          <FormGroup check>\n            <Label check>\n              <Input\n                name=\"exclusive\"\n                type=\"checkbox\"\n                defaultChecked={!!autoBilling}\n                onChange={(e) => setAutoBilling(e.target.checked)}\n              />\n              Use for automatic payments\n              {' '}\n              <br />\n              <small>(if payment plan is configured)</small>\n            </Label>\n          </FormGroup>\n        </div>\n        <div>\n          {deleteCardConfirm === true ? (\n            <>\n              {isUpdating === true ? (\n                <Spinner size=\"sm\" />\n              ) : (\n                <div className=\"inline-confirm\">\n                  <span className=\"me-2\">Remove card?</span>\n                  <Button onClick={() => removeCard(card.id)} size=\"sm\" color=\"danger\" className=\"me-2\">Yes</Button>\n                  <Button onClick={() => setDeleteCardConfirm(false)} size=\"sm\" color=\"secondary\" outline>No</Button>\n                </div>\n              )}\n            </>\n          ) : (\n            <>\n              {isUpdating === true ? (\n                <Spinner size=\"sm\" />\n              ) : (\n                <>\n                  <Button color=\"link\" size=\"sm\" className=\"me-2\" onClick={cancelEdit}>Cancel</Button>\n                  <Button color=\"danger\" size=\"sm\" className=\"me-2\" onClick={() => setDeleteCardConfirm(true)}>Remove Card</Button>\n                  <Button color=\"primary\" size=\"sm\" onClick={handleUpdateCard}>Update</Button>\n\n                </>\n              )}\n            </>\n          )}\n        </div>\n\n      </div>\n    </div>\n  );\n};\n\nEditCard.propTypes = {\n  card: PropTypes.object,\n  updateCard: PropTypes.func,\n  removeCard: PropTypes.func,\n  cancelEdit: PropTypes.func,\n  isUpdating: PropTypes.bool,\n};\n\nexport default EditCard;\n","import * as React from 'react';\n\nconst Amex = (props) => (\n  <svg width={props.width} {...props}>\n    <g fill=\"none\">\n      <rect fill=\"#2557D6\" width={750} height={471} rx={40} />\n      <path\n        d=\"M.003 221.185h36.024l8.123-19.51h18.185l8.101 19.51h70.88V206.27l6.327 14.98h36.796l6.327-15.202v15.138h176.151l-.082-32.026h3.408c2.386.083 3.083.302 3.083 4.226v27.8h91.106v-7.455c7.349 3.92 18.779 7.455 33.819 7.455h38.328l8.203-19.51h18.185l8.021 19.51h73.86v-18.532l11.186 18.532h59.187V98.678h-58.576v14.468l-8.202-14.468h-60.105v14.468l-7.532-14.468h-81.188c-13.59 0-25.536 1.889-35.186 7.153v-7.153h-56.026v7.153c-6.14-5.426-14.508-7.153-23.812-7.153H179.908l-13.734 31.641-14.104-31.641H87.6v14.468l-7.083-14.468H25.534L0 156.924v64.261h.003zm227.397-17.67h-21.615l-.08-68.794-30.573 68.793H156.62l-30.652-68.854v68.854H83.084l-8.101-19.592h-43.9L22.9 203.514H0l37.756-87.837h31.326l35.859 83.164v-83.164h34.412l27.593 59.587 25.347-59.587h35.104v87.837h.003zM67.777 165.692l-14.43-35.017-14.35 35.017h28.78zm245.642 37.821h-70.433v-87.837h70.433v18.291h-49.348V149.8h48.165v18.005H264.07v17.542h49.348v18.166zm99.256-64.18c0 14.004-9.386 21.24-14.856 23.412 4.613 1.748 8.553 4.838 10.43 7.397 2.976 4.369 3.49 8.271 3.49 16.116v17.255h-21.266l-.08-11.077c0-5.285.508-12.886-3.328-17.112-3.081-3.09-7.777-3.76-15.368-3.76h-22.633v31.95H327.98v-87.838h48.495c10.775 0 18.714.283 25.53 4.207 6.67 3.924 10.67 9.652 10.67 19.45zm-26.652 13.042c-2.898 1.752-6.324 1.81-10.43 1.81H349.98v-19.51h25.962c3.674 0 7.508.164 9.998 1.584 2.735 1.28 4.427 4.003 4.427 7.765 0 3.84-1.61 6.929-4.344 8.351zm60.466 51.138h-21.513v-87.837h21.513v87.837zm249.74 0H666.35l-39.964-65.927v65.927h-42.94l-8.204-19.592h-43.799l-7.96 19.592H498.81c-10.248 0-23.224-2.257-30.572-9.715-7.41-7.458-11.265-17.56-11.265-33.533 0-13.027 2.304-24.936 11.366-34.347 6.816-7.01 17.49-10.242 32.02-10.242h20.412v18.821h-19.984c-7.694 0-12.039 1.14-16.224 5.203-3.594 3.699-6.06 10.69-6.06 19.897 0 9.41 1.878 16.196 5.797 20.628 3.245 3.476 9.144 4.53 14.694 4.53h9.469l29.716-69.076h31.592l35.696 83.081v-83.08h32.103l37.062 61.174V115.68h21.596v87.834zm-128.159-37.82l-14.591-35.017-14.51 35.017h29.1zm181.886 178.074c-5.121 7.458-15.101 11.239-28.611 11.239h-40.718v-18.84h40.553c4.022 0 6.837-.527 8.532-2.175a7.71 7.71 0 002.493-5.73c0-2.56-1.024-4.592-2.575-5.81-1.53-1.341-3.757-1.95-7.429-1.95-19.797-.67-44.495.609-44.495-27.194 0-12.743 8.125-26.157 30.25-26.157h41.998l.002-17.48h-39.022c-11.776 0-20.33 2.808-26.388 7.174v-7.175H626.83c-9.23 0-20.063 2.279-25.187 7.175v-7.175H498.578v7.175c-8.203-5.892-22.043-7.175-28.431-7.175h-67.983v7.175c-6.49-6.258-20.92-7.175-29.716-7.175h-76.085l-17.41 18.763-16.307-18.763H148.99v122.592h111.516l17.94-19.06 16.9 19.06 68.739.061v-28.838h6.757c9.12.14 19.878-.226 29.368-4.31v33.085h56.697v-31.952h2.735c3.49 0 3.834.143 3.834 3.616v28.333H635.71c10.935 0 22.365-2.787 28.695-7.845v7.845h54.632c11.369 0 22.471-1.587 30.918-5.651v-22.838zm-341.503-47.154c0 24.406-18.286 29.445-36.716 29.445H345.43v29.469h-40.98l-25.962-29.085-26.981 29.085H167.99v-87.859h84.8l25.941 28.799 26.819-28.799h67.371c16.732 0 35.532 4.613 35.532 28.945zm-167.625 40.434h-51.839v-17.481h46.289V301.64h-46.289v-15.973h52.86l23.062 25.604-24.083 25.776zm83.526 10.06l-32.37-35.788 32.37-34.651v70.439zm47.873-39.066H344.98v-22.374h27.492c7.612 0 12.896 3.09 12.896 10.773 0 7.598-5.04 11.601-13.14 11.601zm142.744-40.373h70.369v18.17h-49.372v15.973h48.167v17.925h-48.167v17.481l49.372.08v18.23h-70.37v-87.859zm-27.054 47.03c4.693 1.724 8.53 4.816 10.329 7.375 2.977 4.29 3.408 8.293 3.493 16.037v17.417H480.57v-10.992c0-5.286.511-13.112-3.408-17.198-3.08-3.147-7.777-3.9-15.468-3.9h-22.533v32.09h-21.186v-87.859h48.678c10.674 0 18.448.47 25.369 4.146 6.654 4.004 10.839 9.488 10.839 19.51-.003 14.024-9.395 21.18-14.945 23.373zM476 303.59c-2.82 1.667-6.308 1.81-10.41 1.81h-25.614v-19.733h25.962c3.754 0 7.51.08 10.062 1.587 2.732 1.423 4.366 4.144 4.366 7.903 0 3.76-1.634 6.788-4.366 8.433zm190.336 5.597c4.106 4.23 6.306 9.572 6.306 18.614 0 18.9-11.858 27.723-33.122 27.723h-41.065v-18.84h40.9c4 0 6.836-.527 8.613-2.175 1.45-1.359 2.49-3.333 2.49-5.73 0-2.56-1.125-4.592-2.573-5.81-1.612-1.34-3.836-1.95-7.508-1.95-19.717-.67-44.41.61-44.41-27.193 0-12.744 8.04-26.158 30.144-26.158h42.269v18.7h-38.677c-3.834 0-6.327.143-8.447 1.587-2.31 1.422-3.166 3.534-3.166 6.32 0 3.315 1.96 5.57 4.613 6.545 2.224.77 4.613.996 8.205.996l11.35.305c11.446.278 19.303 2.249 24.078 7.066zM750 285.667h-38.427c-3.836 0-6.385.143-8.532 1.587-2.224 1.423-3.081 3.534-3.081 6.322 0 3.314 1.878 5.569 4.61 6.544 2.225.77 4.614.996 8.126.996l11.427.304c11.531.284 19.228 2.258 23.921 7.072.855.67 1.368 1.422 1.956 2.175v-25z\"\n        fill=\"#FFF\"\n      />\n    </g>\n  </svg>\n);\n\nAmex.defaultProps = {\n  viewBox: '0 0 750 471',\n  width: 100,\n};\n\nexport default Amex;\n","import * as React from 'react';\n\nconst CardDefault = (props) => (\n  <svg width={props.width} {...props}>\n    <g fill=\"none\">\n      <rect fill=\"#D8D8D8\" width={750} height={471} rx={40} />\n      <rect\n        fill=\"#FFF\"\n        x={590}\n        y={100.576}\n        width={110.324}\n        height={99.679}\n        rx={20.323}\n      />\n      <path\n        d=\"M78.102 310.37v-3.795h-5.117v-11.27h-4.198l-.402 11.27H56.942l10.58-25.07-3.967-1.725-11.673 27.14v3.45h16.445v9.66h4.658v-9.66h5.117zm19.586-30.59c-4.025 0-7.878 1.38-11.213 4.6l2.588 2.933c2.645-2.473 5.002-3.68 8.395-3.68 4.197 0 7.532 2.357 7.532 6.727 0 4.773-3.737 6.958-7.532 6.958H95.1l-.575 3.795h3.335c4.658 0 8.223 1.84 8.223 7.532 0 4.945-3.278 8.108-8.855 8.108-3.22 0-6.555-1.323-8.798-3.968l-3.22 2.645c2.99 3.68 7.705 5.233 12.133 5.233 8.165 0 13.742-5.175 13.742-12.018 0-6.152-4.37-9.372-9.027-9.717 4.197-.805 7.762-4.428 7.762-9.2 0-5.405-4.715-9.948-12.132-9.948zm34.477 0c-5.347 0-8.912 1.898-12.075 5.693l3.335 2.53c2.53-2.933 4.658-4.198 8.568-4.198 4.427 0 7.072 2.76 7.072 7.188 0 6.497-3.22 10.81-18.17 25.127v3.91h23.518l.575-4.082h-18.63c13.052-11.903 17.71-17.825 17.71-25.07 0-6.325-4.428-11.098-11.903-11.098zm48.738 36.34h-8.28v-35.65h-4.198l-11.73 7.245 2.07 3.393 9.085-5.463v30.475h-9.775v3.91h22.828v-3.91zm69.587-5.75v-3.795h-5.117v-11.27h-4.198l-.402 11.27H229.33l10.58-25.07-3.967-1.725-11.673 27.14v3.45h16.445v9.66h4.658v-9.66h5.117zm19.585-30.59c-4.025 0-7.877 1.38-11.212 4.6l2.587 2.933c2.645-2.473 5.003-3.68 8.395-3.68 4.198 0 7.533 2.357 7.533 6.727 0 4.773-3.738 6.958-7.533 6.958h-2.357l-.575 3.795h3.335c4.657 0 8.222 1.84 8.222 7.532 0 4.945-3.277 8.108-8.855 8.108-3.22 0-6.555-1.323-8.797-3.968l-3.22 2.645c2.99 3.68 7.705 5.233 12.132 5.233 8.165 0 13.743-5.175 13.743-12.018 0-6.152-4.37-9.372-9.028-9.717 4.198-.805 7.763-4.428 7.763-9.2 0-5.405-4.715-9.948-12.133-9.948zm34.478 0c-5.348 0-8.913 1.898-12.075 5.693l3.335 2.53c2.53-2.933 4.657-4.198 8.567-4.198 4.428 0 7.073 2.76 7.073 7.188 0 6.497-3.22 10.81-18.17 25.127v3.91H316.8l.575-4.082h-18.63c13.053-11.903 17.71-17.825 17.71-25.07 0-6.325-4.427-11.098-11.902-11.098zm48.737 36.34h-8.28v-35.65h-4.197l-11.73 7.245 2.07 3.393 9.085-5.463v30.475h-9.775v3.91h22.827v-3.91zm69.588-5.75v-3.795h-5.118v-11.27h-4.197l-.403 11.27h-11.442l10.58-25.07-3.968-1.725-11.672 27.14v3.45h16.445v9.66h4.657v-9.66h5.118zm19.585-30.59c-4.025 0-7.878 1.38-11.213 4.6l2.588 2.933c2.645-2.473 5.002-3.68 8.395-3.68 4.197 0 7.532 2.357 7.532 6.727 0 4.773-3.737 6.958-7.532 6.958h-2.358l-.575 3.795h3.335c4.658 0 8.223 1.84 8.223 7.532 0 4.945-3.278 8.108-8.855 8.108-3.22 0-6.555-1.323-8.798-3.968l-3.22 2.645c2.99 3.68 7.705 5.233 12.133 5.233 8.165 0 13.742-5.175 13.742-12.018 0-6.152-4.37-9.372-9.027-9.717 4.197-.805 7.762-4.428 7.762-9.2 0-5.405-4.715-9.948-12.132-9.948zm34.477 0c-5.347 0-8.912 1.898-12.075 5.693l3.335 2.53c2.53-2.933 4.658-4.198 8.568-4.198 4.427 0 7.072 2.76 7.072 7.188 0 6.497-3.22 10.81-18.17 25.127v3.91h23.518l.575-4.082h-18.63c13.052-11.903 17.71-17.825 17.71-25.07 0-6.325-4.428-11.098-11.903-11.098zm48.738 36.34h-8.28v-35.65H513.2l-11.73 7.245 2.07 3.393 9.085-5.463v30.475h-9.775v3.91h22.828v-3.91zm69.588-5.75v-3.795h-5.118v-11.27h-4.197l-.403 11.27h-11.442l10.58-25.07-3.968-1.725-11.672 27.14v3.45h16.445v9.66h4.657v-9.66h5.118zm19.584-30.59c-4.024 0-7.877 1.38-11.212 4.6l2.588 2.933c2.645-2.473 5.002-3.68 8.395-3.68 4.197 0 7.532 2.357 7.532 6.727 0 4.773-3.737 6.958-7.532 6.958h-2.358l-.575 3.795h3.335c4.658 0 8.223 1.84 8.223 7.532 0 4.945-3.278 8.108-8.855 8.108-3.22 0-6.555-1.323-8.798-3.968l-3.22 2.645c2.99 3.68 7.705 5.233 12.133 5.233 8.165 0 13.742-5.175 13.742-12.018 0-6.152-4.37-9.372-9.027-9.717 4.197-.805 7.762-4.428 7.762-9.2 0-5.405-4.715-9.948-12.132-9.948zm34.478 0c-5.347 0-8.912 1.898-12.075 5.693l3.335 2.53c2.53-2.933 4.658-4.198 8.568-4.198 4.427 0 7.072 2.76 7.072 7.188 0 6.497-3.22 10.81-18.17 25.127v3.91h23.518l.575-4.082h-18.63c13.052-11.903 17.71-17.825 17.71-25.07 0-6.325-4.428-11.098-11.903-11.098zm48.738 36.34h-8.28v-35.65h-4.198l-11.73 7.245 2.07 3.393 9.085-5.463v30.475h-9.775v3.91h22.828v-3.91z\"\n        fill=\"#999\"\n      />\n      <path\n        d=\"M55.607 415.42h6.445v-22.245l-7.012 1.406v-3.594l6.973-1.406h3.945v25.84h6.446v3.32H55.607zm25.468 0h6.446v-22.245l-7.012 1.406v-3.594l6.973-1.406h3.945v25.84h6.445v3.32H81.075zm40.918 0h13.77v3.321h-18.516v-3.32a762.619 762.619 0 016.114-6.23c2.59-2.618 4.218-4.304 4.882-5.06 1.263-1.418 2.142-2.616 2.637-3.593.508-.99.762-1.96.762-2.91 0-1.55-.547-2.813-1.64-3.79-1.082-.976-2.494-1.464-4.24-1.464-1.236 0-2.545.215-3.925.645-1.367.43-2.832 1.08-4.394 1.953v-3.985c1.588-.638 3.073-1.12 4.453-1.445 1.38-.326 2.643-.488 3.789-.488 3.02 0 5.43.755 7.226 2.265 1.797 1.51 2.696 3.529 2.696 6.055a8.707 8.707 0 01-.684 3.418c-.443 1.068-1.256 2.33-2.441 3.789-.326.378-1.361 1.471-3.106 3.281a2473.283 2473.283 0 01-7.383 7.559zm34.024-12.401c1.888.403 3.36 1.243 4.414 2.52 1.068 1.275 1.601 2.85 1.601 4.726 0 2.877-.99 5.104-2.968 6.68-1.98 1.575-4.792 2.363-8.438 2.363-1.224 0-2.487-.124-3.789-.372a26.623 26.623 0 01-4.004-1.074v-3.808a13.669 13.669 0 003.594 1.445 16.77 16.77 0 004.082.488c2.474 0 4.355-.488 5.645-1.465 1.302-.976 1.953-2.395 1.953-4.257 0-1.72-.606-3.06-1.817-4.024-1.198-.976-2.87-1.465-5.02-1.465h-3.398v-3.242h3.555c1.94 0 3.424-.384 4.453-1.152 1.029-.781 1.543-1.901 1.543-3.36 0-1.497-.534-2.643-1.601-3.437-1.055-.807-2.572-1.211-4.551-1.211-1.081 0-2.24.117-3.477.352-1.237.234-2.597.599-4.082 1.093v-3.515a38.347 38.347 0 014.2-.938 23.777 23.777 0 013.71-.312c2.995 0 5.365.683 7.11 2.05 1.744 1.355 2.617 3.19 2.617 5.508 0 1.615-.462 2.982-1.387 4.102-.924 1.107-2.24 1.875-3.945 2.305zm26.289-13.438h15.488v3.32H185.92v7.149a10.371 10.371 0 011.719-.43 9.59 9.59 0 011.719-.156c3.255 0 5.833.892 7.734 2.676 1.901 1.783 2.852 4.199 2.852 7.246 0 3.138-.977 5.58-2.93 7.324-1.953 1.732-4.707 2.598-8.262 2.598a23.29 23.29 0 01-3.75-.313 29.94 29.94 0 01-3.926-.937v-3.965a15.373 15.373 0 003.633 1.426c1.25.312 2.572.468 3.965.468 2.253 0 4.037-.592 5.352-1.777 1.315-1.185 1.972-2.793 1.972-4.824 0-2.032-.657-3.64-1.972-4.825-1.315-1.184-3.1-1.777-5.352-1.777a14.5 14.5 0 00-3.164.352 16.66 16.66 0 00-3.203 1.093v-14.648zm33.867 15.313c-1.875 0-3.353.5-4.434 1.503-1.067 1.003-1.601 2.383-1.601 4.141s.534 3.138 1.601 4.14c1.081 1.003 2.56 1.505 4.434 1.505 1.875 0 3.353-.502 4.434-1.504 1.08-1.016 1.62-2.396 1.62-4.14 0-1.759-.54-3.139-1.62-4.142-1.068-1.002-2.546-1.503-4.434-1.503zm-3.945-1.68c-1.693-.417-3.015-1.205-3.965-2.363-.938-1.16-1.406-2.572-1.406-4.239 0-2.33.827-4.173 2.48-5.527 1.667-1.354 3.945-2.031 6.836-2.031 2.904 0 5.182.677 6.836 2.03 1.654 1.355 2.48 3.198 2.48 5.528 0 1.667-.475 3.08-1.425 4.239-.938 1.158-2.246 1.946-3.926 2.363 1.901.443 3.379 1.308 4.434 2.597 1.067 1.29 1.601 2.865 1.601 4.727 0 2.826-.866 4.994-2.598 6.504-1.718 1.51-4.186 2.266-7.402 2.266s-5.69-.756-7.422-2.266c-1.719-1.51-2.578-3.678-2.578-6.504 0-1.862.534-3.437 1.602-4.727 1.067-1.289 2.552-2.154 4.453-2.597zm-1.446-6.23c0 1.51.47 2.688 1.407 3.535.95.846 2.278 1.27 3.984 1.27 1.693 0 3.014-.424 3.965-1.27.963-.847 1.445-2.025 1.445-3.536 0-1.51-.482-2.688-1.445-3.535-.95-.846-2.272-1.27-3.965-1.27-1.706 0-3.034.424-3.984 1.27-.938.847-1.407 2.025-1.407 3.535zM308.836 414.453h6.445v-22.246l-7.011 1.406v-3.593l6.972-1.407h3.946v25.84h6.445v3.32h-16.797zm36.738-12.403c1.888.404 3.36 1.244 4.415 2.52 1.067 1.276 1.601 2.852 1.601 4.727 0 2.877-.99 5.104-2.969 6.68-1.979 1.575-4.791 2.363-8.437 2.363-1.224 0-2.487-.124-3.79-.371a26.623 26.623 0 01-4.003-1.074v-3.81a13.669 13.669 0 003.594 1.446 16.77 16.77 0 004.082.489c2.474 0 4.355-.489 5.644-1.465 1.302-.977 1.953-2.396 1.953-4.258 0-1.719-.605-3.06-1.816-4.024-1.198-.976-2.871-1.464-5.02-1.464h-3.398v-3.243h3.555c1.94 0 3.424-.384 4.453-1.152 1.028-.781 1.543-1.901 1.543-3.36 0-1.497-.534-2.643-1.602-3.437-1.055-.807-2.571-1.21-4.55-1.21-1.081 0-2.24.116-3.477.35-1.237.235-2.598.6-4.082 1.095v-3.516a38.348 38.348 0 014.199-.938 23.777 23.777 0 013.71-.312c2.996 0 5.366.684 7.11 2.05 1.745 1.355 2.617 3.19 2.617 5.509 0 1.614-.462 2.981-1.386 4.101-.925 1.107-2.24 1.875-3.946 2.305zm16.915 12.403h13.77v3.32h-18.517v-3.32a762.755 762.755 0 016.114-6.23c2.59-2.618 4.218-4.304 4.883-5.059 1.263-1.42 2.141-2.617 2.636-3.594.508-.99.762-1.96.762-2.91 0-1.55-.547-2.812-1.64-3.789-1.081-.976-2.494-1.465-4.239-1.465-1.237 0-2.546.215-3.926.645-1.367.43-2.832 1.08-4.394 1.953v-3.984c1.588-.638 3.073-1.12 4.453-1.446 1.38-.325 2.643-.488 3.789-.488 3.02 0 5.43.755 7.226 2.266 1.797 1.51 2.696 3.528 2.696 6.054a8.707 8.707 0 01-.684 3.418c-.442 1.068-1.256 2.33-2.441 3.79-.326.377-1.36 1.47-3.106 3.28a2474.291 2474.291 0 01-7.382 7.56zm22.753 0h6.446v-22.246l-7.012 1.406v-3.593l6.973-1.407h3.945v25.84h6.445v3.32h-16.797zm49.473-12.403c1.888.404 3.36 1.244 4.414 2.52 1.068 1.276 1.602 2.852 1.602 4.727 0 2.877-.99 5.104-2.969 6.68-1.98 1.575-4.792 2.363-8.438 2.363-1.223 0-2.487-.124-3.789-.371a26.623 26.623 0 01-4.004-1.074v-3.81a13.669 13.669 0 003.594 1.446 16.77 16.77 0 004.082.489c2.474 0 4.356-.489 5.645-1.465 1.302-.977 1.953-2.396 1.953-4.258 0-1.719-.606-3.06-1.816-4.024-1.198-.976-2.872-1.464-5.02-1.464h-3.398v-3.243h3.554c1.94 0 3.425-.384 4.453-1.152 1.029-.781 1.543-1.901 1.543-3.36 0-1.497-.534-2.643-1.601-3.437-1.055-.807-2.572-1.21-4.551-1.21-1.08 0-2.24.116-3.477.35-1.237.235-2.597.6-4.082 1.095v-3.516a38.347 38.347 0 014.2-.938 23.777 23.777 0 013.71-.312c2.995 0 5.365.684 7.11 2.05 1.745 1.355 2.617 3.19 2.617 5.509 0 1.614-.462 2.981-1.387 4.101-.924 1.107-2.24 1.875-3.945 2.305zm24.355-10l-9.96 15.567h9.96v-15.566zm-1.035-3.437h4.961v19.004h4.16v3.281h-4.16v6.875h-3.925v-6.875h-13.165v-3.808l12.13-18.477zm15.704 0h15.488v3.32h-11.875v7.149a10.37 10.37 0 011.719-.43 9.59 9.59 0 011.718-.156c3.256 0 5.834.892 7.735 2.676 1.9 1.784 2.851 4.2 2.851 7.246 0 3.138-.976 5.58-2.93 7.324-1.953 1.732-4.706 2.598-8.261 2.598-1.224 0-2.474-.104-3.75-.313a29.94 29.94 0 01-3.926-.937v-3.965a15.373 15.373 0 003.633 1.426c1.25.312 2.571.469 3.965.469 2.252 0 4.036-.593 5.351-1.778 1.315-1.185 1.973-2.793 1.973-4.824 0-2.031-.658-3.64-1.973-4.824-1.315-1.185-3.099-1.778-5.351-1.778-1.055 0-2.11.118-3.164.352a16.66 16.66 0 00-3.203 1.094v-14.649zm25.468 0h15.489v3.32H502.82v7.149a10.37 10.37 0 011.718-.43 9.59 9.59 0 011.72-.156c3.254 0 5.832.892 7.733 2.676 1.901 1.784 2.852 4.2 2.852 7.246 0 3.138-.977 5.58-2.93 7.324-1.953 1.732-4.707 2.598-8.261 2.598-1.224 0-2.474-.104-3.75-.313a29.94 29.94 0 01-3.926-.937v-3.965a15.373 15.373 0 003.633 1.426c1.25.312 2.571.469 3.964.469 2.253 0 4.037-.593 5.352-1.778 1.315-1.185 1.973-2.793 1.973-4.824 0-2.031-.658-3.64-1.973-4.824-1.315-1.185-3.099-1.778-5.352-1.778-1.054 0-2.109.118-3.164.352a16.66 16.66 0 00-3.203 1.094v-14.649z\"\n        fill=\"#999\"\n      />\n    </g>\n  </svg>\n);\n\nCardDefault.defaultProps = {\n  viewBox: '0 0 750 471',\n  width: 100,\n};\n\nexport default CardDefault;\n","import * as React from 'react';\n\nconst Diners = (props) => (\n  <svg width={props.width} {...props}>\n    <g fill=\"none\">\n      <rect fill=\"#0079BE\" width={750} height={471} rx={40} />\n      <path\n        d=\"M584.934 237.947c0-99.415-82.981-168.133-173.895-168.1h-78.242c-92.003-.033-167.73 68.705-167.73 168.1 0 90.93 75.727 165.64 167.73 165.204h78.242c90.914.436 173.895-74.293 173.895-165.204z\"\n        fill=\"#FFF\"\n      />\n      <path\n        d=\"M333.28 83.93c-84.07.027-152.194 68.308-152.214 152.58.02 84.258 68.144 152.533 152.214 152.56 84.09-.027 152.228-68.302 152.24-152.56-.012-84.272-68.15-152.553-152.24-152.58z\"\n        fill=\"#0079BE\"\n      />\n      <path\n        d=\"M237.066 236.098c.08-41.18 25.746-76.296 61.94-90.25v180.48c-36.194-13.947-61.861-49.044-61.94-90.23zm131 90.275V145.847c36.207 13.92 61.914 49.057 61.98 90.257-.066 41.212-25.773 76.322-61.98 90.269z\"\n        fill=\"#FFF\"\n      />\n    </g>\n  </svg>\n);\n\nDiners.defaultProps = {\n  viewBox: '0 0 750 471',\n  width: 100,\n};\n\nexport default Diners;\n","import * as React from 'react';\n\nconst Discover = (props) => (\n  <svg width={props.width} {...props}>\n    <g fill=\"none\">\n      <path\n        d=\"M52.877 0C23.68 0 0 23.155 0 51.71v367.58C0 447.85 23.672 471 52.877 471h644.246C726.32 471 750 447.845 750 419.29V51.71C750 23.15 726.328 0 697.123 0H52.877z\"\n        fill=\"#4D4D4D\"\n      />\n      <path\n        d=\"M314.57 152.198c8.496 0 15.623 1.733 24.295 5.912v22.087c-8.215-7.633-15.341-10.828-24.765-10.828-18.523 0-33.09 14.576-33.09 33.055 0 19.488 14.116 33.196 34.008 33.196 8.955 0 15.95-3.029 23.847-10.54v22.098c-8.981 4.02-16.26 5.607-24.765 5.607-30.075 0-53.444-21.935-53.444-50.224 0-27.984 23.991-50.363 53.914-50.363zm-93.379.609c11.102 0 21.26 3.612 29.754 10.673l-10.335 12.86c-5.145-5.48-10.01-7.792-15.927-7.792-8.513 0-14.713 4.606-14.713 10.667 0 5.198 3.48 7.95 15.332 12.118 22.467 7.808 29.124 14.732 29.124 30.021 0 18.633-14.399 31.602-34.923 31.602-15.029 0-25.955-5.626-35.055-18.32l12.758-11.68c4.549 8.36 12.136 12.837 21.557 12.837 8.811 0 15.334-5.779 15.334-13.576 0-4.042-1.976-7.507-5.921-9.958-1.987-1.16-5.921-2.89-13.653-5.481-18.55-6.347-24.914-13.132-24.914-26.391 0-15.75 13.667-27.58 31.582-27.58zm225.695 1.678h21.575l27.004 64.645 27.35-64.645h21.412l-43.744 98.713h-10.628l-42.969-98.713zm-382.065.148h28.991c32.03 0 54.359 19.786 54.359 48.19 0 14.163-6.831 27.856-18.382 36.944-9.72 7.67-20.795 11.11-36.13 11.11H64.822v-96.244zm92.437 0h19.751v96.245h-19.75v-96.245zm395.899 0h56.011v16.308h-36.275v21.362h34.938v16.3h-34.938v25.98h36.275v16.295h-56.011v-96.245zm69.094 0h29.283c22.78 0 35.833 10.397 35.833 28.416 0 14.735-8.187 24.406-23.064 27.284l31.873 40.545h-24.288l-27.336-38.664h-2.575v38.664h-19.726v-96.245zm19.726 15.159v29.148h5.771c12.612 0 19.297-5.206 19.297-14.88 0-9.367-6.686-14.268-18.985-14.268h-6.083zm-557.42 1.149v63.642h5.3c12.763 0 20.823-2.324 27.028-7.648 6.83-5.782 10.94-15.015 10.94-24.25 0-9.222-4.11-18.18-10.94-23.961-6.523-5.61-14.265-7.783-27.028-7.783h-5.3z\"\n        fill=\"#FFF\"\n      />\n      <path\n        d=\"M399.164 151.56c29.75 0 53.867 22.167 53.867 49.552v.031c0 27.385-24.117 49.584-53.867 49.584-29.75 0-53.867-22.199-53.867-49.584v-.03c0-27.386 24.117-49.554 53.867-49.554zm350.819 119.534c-25.048 17.233-212.574 140.397-537.264 199.891h484.387c29.197 0 52.877-23.154 52.877-51.71V271.094z\"\n        fill=\"#F47216\"\n      />\n    </g>\n  </svg>\n);\n\nDiscover.defaultProps = {\n  viewBox: '0 0 750 471',\n  width: 100,\n};\n\nexport default Discover;\n","import * as React from 'react';\n\nconst Jcb = (props) => (\n  <svg width={props.width} {...props}>\n    <defs>\n      <linearGradient\n        x1=\".032%\"\n        y1=\"50%\"\n        x2=\"99.974%\"\n        y2=\"50%\"\n        id=\"jcb_svg__a\"\n      >\n        <stop stopColor=\"#007B40\" offset=\"0%\" />\n        <stop stopColor=\"#55B330\" offset=\"100%\" />\n      </linearGradient>\n      <linearGradient\n        x1=\".472%\"\n        y1=\"50%\"\n        x2=\"99.986%\"\n        y2=\"50%\"\n        id=\"jcb_svg__b\"\n      >\n        <stop stopColor=\"#1D2970\" offset=\"0%\" />\n        <stop stopColor=\"#006DBA\" offset=\"100%\" />\n      </linearGradient>\n      <linearGradient\n        x1=\".114%\"\n        y1=\"50.001%\"\n        x2=\"99.986%\"\n        y2=\"50.001%\"\n        id=\"jcb_svg__c\"\n      >\n        <stop stopColor=\"#6E2B2F\" offset=\"0%\" />\n        <stop stopColor=\"#E30138\" offset=\"100%\" />\n      </linearGradient>\n    </defs>\n    <g fill=\"none\">\n      <rect fill=\"#0E4C96\" width={750} height={471} rx={40} />\n      <path\n        d=\"M617.243 346.766c0 41.615-33.728 75.36-75.36 75.36H132.757V124.245c0-41.626 33.733-75.37 75.365-75.37l409.121-.001v297.892z\"\n        fill=\"#FFF\"\n      />\n      <path\n        d=\"M483.859 242.045c11.684.253 23.437-.516 35.077.4 11.787 2.2 14.628 20.043 4.156 25.888-7.141 3.85-15.633 1.432-23.379 2.113H483.86v-28.401zm41.833-32.145c2.596 9.165-6.238 17.392-15.066 16.13h-26.767c.185-8.642-.368-18.021.272-26.208 10.724.301 21.549-.616 32.21.48 4.58 1.15 8.413 4.916 9.35 9.598zM590.12 73.997c.498 17.501.071 35.927.214 53.783-.035 72.596.072 145.194-.055 217.79-.469 27.207-24.582 50.844-51.6 51.387-27.046.111-54.095.016-81.142.047v-109.75c29.47-.154 58.959.307 88.417-.232 13.667-.86 28.632-9.876 29.27-24.915 1.61-15.102-12.632-25.55-26.153-27.201-5.198-.135-5.044-1.515 0-2.117 12.892-2.787 23.02-16.133 19.226-29.499-3.236-14.058-18.773-19.499-31.697-19.472-26.351-.18-52.709-.026-79.063-.077.172-20.489-.354-41 .286-61.474 2.087-26.716 26.806-48.747 53.447-48.27h78.85z\"\n        fill=\"url(#jcb_svg__a)\"\n      />\n      <path\n        d=\"M159.74 125.04c.674-27.163 24.889-50.611 51.875-51.007 26.944-.083 53.891-.012 80.837-.036-.074 90.885.148 181.777-.112 272.658-1.038 26.834-24.99 49.834-51.679 50.307-26.996.099-53.995.014-80.992.042V283.551c26.223 6.194 53.722 8.832 80.473 4.721 15.993-2.575 33.488-10.424 38.902-27.014 3.986-14.192 1.742-29.126 2.334-43.692v-33.824h-46.297c-.208 22.37.426 44.78-.335 67.125-1.248 13.734-14.846 22.46-27.8 21.995-16.066.169-47.898-11.64-47.898-11.64-.08-41.917.466-94.408.692-136.182z\"\n        fill=\"url(#jcb_svg__b)\"\n      />\n      <path\n        d=\"M309.72 197.39c-2.434.517-.49-8.3-1.114-11.646.166-21.15-.346-42.323.284-63.458 2.083-26.829 26.991-48.916 53.739-48.288h78.766c-.074 90.884.147 181.775-.112 272.656-1.039 26.834-24.992 49.833-51.68 50.308-26.998.1-53.998.015-80.997.043V272.708c18.44 15.128 43.5 17.484 66.472 17.525 17.317-.006 34.534-2.675 51.35-6.67V260.79c-18.953 9.447-41.233 15.446-62.243 10.018-14.656-3.65-25.294-17.811-25.056-32.936-1.699-15.728 7.524-32.335 22.981-37.011 19.19-6.008 40.108-1.413 58.096 6.398 3.855 2.018 7.765 4.521 6.222-1.921v-17.9c-30.084-7.157-62.101-9.792-92.329-2.004-8.748 2.468-17.27 6.21-24.379 11.956z\"\n        fill=\"url(#jcb_svg__c)\"\n      />\n    </g>\n  </svg>\n);\n\nJcb.defaultProps = {\n  viewBox: '0 0 750 471',\n  width: 100,\n};\n\nexport default Jcb;\n","import * as React from 'react';\n\nconst Mastercard = (props) => (\n  <svg width={props.width} {...props}>\n    <g fill=\"none\">\n      <rect fill=\"#000\" width={750} height={471} rx={40} />\n      <path\n        d=\"M221.13 421.67v-24.85c0-9.53-5.8-15.74-15.32-15.74-5 0-10.35 1.66-14.08 7-2.9-4.56-7-7-13.25-7a14.07 14.07 0 00-12 5.8v-5h-7.87v39.76h7.87v-22.75c0-7 4.14-10.35 9.94-10.35s9.11 3.73 9.11 10.35v22.78h7.87v-22.78c0-7 4.14-10.35 9.94-10.35s9.11 3.73 9.11 10.35v22.78h8.68zm129.22-39.35h-14.5v-12H328v12h-8.28v7H328V408c0 9.11 3.31 14.5 13.25 14.5a23.17 23.17 0 0010.75-2.9l-2.49-7a13.63 13.63 0 01-7.46 2.07c-4.14 0-6.21-2.49-6.21-6.63V389h14.5v-6.63l.01-.05zm73.72-1.24a12.39 12.39 0 00-10.77 5.8v-5h-7.87v39.76h7.87v-22.33c0-6.63 3.31-10.77 8.7-10.77a24.24 24.24 0 015.38.83l2.49-7.46a28 28 0 00-5.8-.83zm-111.41 4.14c-4.14-2.9-9.94-4.14-16.15-4.14-9.94 0-16.15 4.56-16.15 12.43 0 6.63 4.56 10.35 13.25 11.6l4.14.41c4.56.83 7.46 2.49 7.46 4.56 0 2.9-3.31 5-9.53 5a21.84 21.84 0 01-13.25-4.14l-4.14 6.21c5.8 4.14 12.84 5 17 5 11.6 0 17.81-5.38 17.81-12.84 0-7-5-10.35-13.67-11.6l-4.14-.41c-3.73-.41-7-1.66-7-4.14 0-2.9 3.31-5 7.87-5 5 0 9.94 2.07 12.43 3.31l4.07-6.25zm120.11 16.57c0 12 7.87 20.71 20.71 20.71 5.8 0 9.94-1.24 14.08-4.56l-4.14-6.21a16.74 16.74 0 01-10.35 3.73c-7 0-12.43-5.38-12.43-13.25S446 389 453.07 389a16.74 16.74 0 0110.35 3.73l4.14-6.21c-4.14-3.31-8.28-4.56-14.08-4.56-12.43-.83-20.71 7.87-20.71 19.88v-.05zm-55.5-20.71c-11.6 0-19.47 8.28-19.47 20.71 0 12.43 8.28 20.71 20.29 20.71a25.33 25.33 0 0016.15-5.38l-4.14-5.8a19.79 19.79 0 01-11.6 4.14c-5.38 0-11.18-3.31-12-10.35h29.41v-3.31c0-12.43-7.46-20.71-18.64-20.71v-.01zm-.41 7.46c5.8 0 9.94 3.73 10.35 9.94h-21.53c1.24-5.8 5-9.94 11.18-9.94zm-107.27 13.25v-19.88h-7.87v5c-2.9-3.73-7-5.8-12.84-5.8-11.18 0-19.47 8.7-19.47 20.71 0 12.01 8.28 20.71 19.47 20.71 5.8 0 9.94-2.07 12.84-5.8v5h7.87v-19.94zm-31.89 0c0-7.46 4.56-13.25 12.43-13.25 7.46 0 12 5.8 12 13.25 0 7.87-5 13.25-12 13.25-7.87.41-12.43-5.8-12.43-13.25zm306.08-20.71a12.39 12.39 0 00-10.77 5.8v-5h-7.87v39.76H533v-22.33c0-6.63 3.31-10.77 8.7-10.77a24.24 24.24 0 015.38.83l2.49-7.46a28 28 0 00-5.8-.83h.01zm-30.65 20.71v-19.88h-7.87v5c-2.9-3.73-7-5.8-12.84-5.8-11.18 0-19.47 8.7-19.47 20.71 0 12.01 8.28 20.71 19.47 20.71 5.8 0 9.94-2.07 12.84-5.8v5h7.87v-19.94zm-31.89 0c0-7.46 4.56-13.25 12.43-13.25 7.46 0 12 5.8 12 13.25 0 7.87-5 13.25-12 13.25-7.87.41-12.43-5.8-12.43-13.25zm111.83 0v-35.62h-7.87v20.71c-2.9-3.73-7-5.8-12.84-5.8-11.18 0-19.47 8.7-19.47 20.71 0 12.01 8.28 20.71 19.47 20.71 5.8 0 9.94-2.07 12.84-5.8v5h7.87v-19.91zm-31.89 0c0-7.46 4.56-13.25 12.43-13.25 7.46 0 12 5.8 12 13.25 0 7.87-5 13.25-12 13.25-7.88.42-12.44-5.79-12.44-13.25h.01z\"\n        fill=\"#FFF\"\n      />\n      <path fill=\"#FF5F00\" d=\"M303.55 80.39h143.72v234.42H303.55z\" />\n      <path\n        d=\"M318.05 197.6a149.5 149.5 0 0156.74-117.21c-61.128-48.061-148.928-41.075-201.687 16.048-52.758 57.123-52.758 145.2 0 202.324 52.759 57.123 140.559 64.11 201.687 16.048a149.5 149.5 0 01-56.74-117.21z\"\n        fill=\"#EB001B\"\n      />\n      <path\n        d=\"M616.26 197.6c.041 57.047-32.503 109.106-83.804 134.056-51.302 24.95-112.347 18.408-157.196-16.846a149.43 149.43 0 000-234.42c44.85-35.254 105.894-41.797 157.196-16.846 51.3 24.95 83.845 77.01 83.804 134.056z\"\n        fill=\"#F79E1B\"\n      />\n    </g>\n  </svg>\n);\n\nMastercard.defaultProps = {\n  viewBox: '0 0 750 471',\n  width: 100,\n};\n\nexport default Mastercard;\n","import * as React from 'react';\n\nconst Visa = (props) => (\n  <svg width={props.width} {...props}>\n    <g fill=\"none\">\n      <rect fill=\"#0E4595\" width={750} height={471} rx={40} />\n      <path\n        fill=\"#FFF\"\n        d=\"M278.197 334.228l33.361-195.763h53.36l-33.385 195.763zm246.111-191.54c-10.572-3.966-27.137-8.222-47.823-8.222-52.725 0-89.865 26.55-90.18 64.603-.298 28.13 26.513 43.822 46.753 53.186 20.77 9.594 27.752 15.714 27.654 24.283-.132 13.121-16.587 19.116-31.923 19.116-21.357 0-32.703-2.966-50.226-10.276l-6.876-3.111-7.49 43.824c12.464 5.464 35.51 10.198 59.438 10.443 56.09 0 92.501-26.246 92.916-66.882.2-22.268-14.016-39.216-44.8-53.188-18.65-9.055-30.072-15.099-29.951-24.268 0-8.137 9.667-16.839 30.556-16.839 17.45-.27 30.089 3.535 39.937 7.5l4.781 2.26 7.234-42.43m137.307-4.222h-41.231c-12.774 0-22.332 3.487-27.942 16.234l-79.245 179.404h56.032s9.161-24.123 11.233-29.418c6.124 0 60.554.084 68.337.084 1.596 6.853 6.491 29.334 6.491 29.334h49.513l-43.188-195.638zm-65.418 126.407c4.413-11.279 21.26-54.723 21.26-54.723-.316.522 4.38-11.334 7.075-18.684l3.606 16.879s10.217 46.728 12.352 56.528h-44.293z\"\n      />\n      <path\n        d=\"M45.879 138.465l-.682 4.074c21.091 5.106 39.93 12.494 56.422 21.686l47.346 169.691 56.455-.066 84.004-195.385h-56.522l-52.24 133.496-5.566-27.129a88.005 88.005 0 00-.823-2.49l-18.166-87.35c-3.23-12.396-12.598-16.095-24.187-16.527H45.879z\"\n        fill=\"#fff\"\n      />\n    </g>\n  </svg>\n);\n\nVisa.defaultProps = {\n  viewBox: '0 0 750 471',\n  width: 100,\n};\n\nexport default Visa;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Visa, Mastercard, Amex, CardDefault, Discover, Jcb, Diners,\n} from './index';\n\nconst getComponentFromType = (type) => {\n  if (!type) return CardDefault;\n  switch (type.toLowerCase()) {\n    case 'amex':\n    case 'americanexpress':\n    case 'ax':\n    case 'am':\n      return Amex;\n    case 'visa':\n    case 'vs':\n      return Visa;\n    case 'mastercard':\n    case 'mc':\n      return Mastercard;\n    case 'discover':\n    case 'di':\n      return Discover;\n    case 'jcb':\n    case 'jc':\n      return Jcb;\n    case 'diners':\n    case 'dn':\n      return Diners;\n    default:\n      return CardDefault;\n  }\n};\n\nconst CardIcon = ({ type, width, className }) => {\n  const CardComponent = getComponentFromType(type);\n\n  return (\n    <span className={className}>\n      <CardComponent width={width} />\n    </span>\n  );\n};\n\nCardIcon.propTypes = {\n  type: PropTypes.string.isRequired,\n  width: PropTypes.number,\n  className: PropTypes.string,\n};\n\nexport default CardIcon;\n","// import LocalStorageService from \"../../../../Services/LocalStorageService\";\n// import moment from \"moment\";\n\n// const PENDING_TTL = 500;\n\n/*\n * Functions for managing credit cards,\n * including storing and retrieving pending credit card info in session storage.\n *\n * NOTE: the pending card stuff is not currently used. It displayed a newly added card in a pending state\n * until the API updated it  (TODO: change date functions to date-fns)\n * Instead, we just display a message saying the card will be available to use in a few minutes\n */\nconst CardService = {\n\n  getCardNameFromType(type) {\n    switch (type.toLowerCase()) {\n      case 'amex':\n      case 'americanexpress':\n      case 'ax':\n      case 'am':\n        return 'American Express';\n      case 'visa':\n      case 'vs':\n        return 'Visa';\n      case 'mastercard':\n      case 'mc':\n        return 'Mastercard';\n      case 'discover':\n      case 'di':\n        return 'Discover';\n      case 'jcb':\n      case 'jc':\n        return 'JCB';\n      case 'diners':\n      case 'dn':\n        return 'Diners Club';\n      default:\n        return 'Unknown Card Type';\n    }\n  },\n\n  getLast4(num) {\n    return num.length > 4 ? num.slice(-4, num.length) : num;\n  },\n\n  // getPendingCards() {\n  //   const cards = LocalStorageService.getSessionItem('PENDING_CARDS');\n  //   return cards || [];\n  // },\n  //\n  // storePendingCard(number, type, exp) {\n  //   number = this.getLast4(number);\n  //   const cards = this.getPendingCards();\n  //   if (Array.isArray(cards) && !cards.some(card => card.last_four === number)) {\n  //     cards.push({last_four: number, type, expiration_date: exp, time: moment().format()});\n  //     LocalStorageService.setSessionItem('PENDING_CARDS', cards);\n  //   }\n  // },\n\n  // Checks pending cards from storage, clears if they are in the API list or stale\n  // (There's no official status of 'stale' from the API, we're just assuming that if\n  // MeS never called our server with the response, the card is lost and we don't want\n  // to keep it in the list\n  //   updatePendingCards(cardsOnFile) {\n  //     const cards = this.getPendingCards();\n  //     if (!cards || cards.length === 0) {\n  //       sessionStorage.removeItem('PENDING_CARDS');\n  //       return null;\n  //     } else {\n  //       let filtered = cards.reduce((acc, storedCard) => {\n  //         console.log('Funds.js:updatePendingCards, moment check', storedCard.time, moment().diff(storedCard.time, 'seconds'));\n  //         if (moment().diff(storedCard.time, 'seconds') < PENDING_TTL) {\n  //           if (!cardsOnFile.some(card => card.last_four === storedCard.last_four)) {\n  //             acc.push(storedCard);\n  //           }\n  //         }\n  //\n  //         return acc;\n  //       }, []);\n  //       if (filtered.length) {\n  //         LocalStorageService.setSessionItem('PENDING_CARDS', filtered);\n  //         return filtered;\n  //       } else {\n  //         sessionStorage.removeItem('PENDING_CARDS');\n  //         return null;\n  //       }\n  //     }\n  //\n  //\n  //   },\n\n  // removePendingCard(last4) {\n  //   const cards = this.getPendingCards();\n  //   const filtered = cards.filter( card => card.last_four !== last4);\n  //   if (filtered.length) {\n  //     LocalStorageService.setSessionItem('PENDING_CARDS', filtered);\n  //   } else {\n  //     sessionStorage.removeItem('PENDING_CARDS');\n  //   }\n  //\n  //   return filtered.length ? filtered : null;\n  // },\n\n};\n\nexport default CardService;\n","import React, {\n  useEffect, useState, useReducer, useContext,\n} from 'react';\nimport {\n  Form, Button, Spinner,\n} from 'reactstrap';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport MaskedInput from 'react-text-mask';\nimport Payment from 'payment';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { isBefore, startOfDay } from 'date-fns';\nimport classnames from 'classnames';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport qs from 'query-string';\nimport PropTypes from 'prop-types';\nimport {BlockUI} from 'ns-react-block-ui';\nimport InputWithIcon from '../../../../Components/Form/InputWithIcon';\nimport EditCard from './EditCard';\nimport CardIcon from '../../../../Components/Icons/Card/CardIcon';\nimport CardService from './CardService';\nimport { MoneyFormatter, DateFormatter } from '../../../../Components/Table/Table';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport usePermission from '../../../../Hooks/usePermission';\nimport { AppContext } from '../../../../Providers/AppProvider';\n\n// Mask dd.dd\nconst currencyMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  decimalLimit: 0,\n  integerLimit: 5,\n  // fixedDecimalScale:true\n});\n\nconst CardMessage = ({ type, message, onDismiss }) => {\n  if (!type) return (null);\n  const icon = 'info';\n  let color = 'info';\n  if (type === 'storeCardSuccess') {\n    message = message || 'Your credit card information has been submitted. Please allow a few minutes for processing before it is available to use.';\n    color = 'success';\n  } else if (type === 'storeCardCancel') {\n    message = message || 'New card verification was cancelled.';\n  } else if (type === 'chargeSuccess') {\n    message = message || 'The charge for added funds has been submitted';\n    color = 'success';\n  } else if (type === 'chargeFail') {\n    message = message || 'We were unable to process this charge.';\n    color = 'warning';\n  }\n  return (<StandardAlert icon={icon} color={color} dismissable onDismiss={onDismiss}>{message}</StandardAlert>);\n};\n\nconst CreditCardMaskedDisplay = ({ last4 }) => (\n  <span className=\"cc-masked\">\n    <span className=\"mask\">&bull;&bull;&bull;&bull;&nbsp;&bull;&bull;&bull;&bull;&nbsp;&bull;&bull;&bull;&bull;&nbsp;</span>\n    {last4}\n  </span>\n);\n\nconst CardStateReducer = (state, action) => {\n  // Name can be field name or a named action\n  const { name, value } = action;\n\n  // clear message for any action except setting a message\n  if (name !== 'message') {\n    state = { ...state, message: null };\n  }\n\n  switch (name) {\n    case 'select_card':\n      return { ...state, selectedCard: value };\n    case 'payment_amount':\n      return { ...state, paymentAmount: value };\n    case 'cancel':\n      return {\n        ...state,\n        selectedCard: null,\n        paymentAmount: '',\n      };\n    case 'message':\n      return { ...state, message: value };\n\n    default:\n      return state;\n  }\n};\n\nconst initialState = {\n  selectedCard: null,\n  paymentAmount: '',\n  message: '',\n  error: null,\n  isValid: true,\n};\n\n/*\n * Component for managing credit cards, adding funds to your account, and managing\n * payment plans\n *\n */\nconst Cards = ({ accountId, cards, refreshAccount }) => {\n  const app = useContext(AppContext);\n  const Accounting = React.useMemo(() => app.getApi('accounting'), []);\n  const [state, updateState] = useReducer(CardStateReducer, initialState);\n  const [cardsLoaded, setCardsLoaded] = useState(false);\n  const [cardsOnFile, setCardsOnFile] = useState(cards);\n  const [editCard, setEditCard] = useState(null);\n  const [chargeCardConfirm, setChargeCardConfirm] = useState(false);\n  const [isUpdating, setIsUpdating] = useState(false);\n  const [isRedirecting, setIsRedirecting] = useState(false);\n  const allowEdit = usePermission('accounting.edit');\n  const allowView = usePermission('accounting.view');\n\n  if (!allowView) return (<span>Not authorized</span>);\n\n  const routerLocation = useLocation();\n  const navigate = useNavigate();\n\n  // On mount, read query string for MeS response\n  useEffect(() => {\n    // Check for return result so we can message the user about MeS cancel or success.\n    // (Read query string on timeout because the parent Settings component's\n    // tab navigaton also reads and changes query string)\n    window.setTimeout(() => {\n      const search = qs.parse(routerLocation.search);\n\n      if ('cardresult' in search) {\n        updateState({ name: 'message', value: { type: search.cardresult } });\n        delete (search.cardresult);\n        delete (search.last4);\n        navigate({replace:true, search: qs.stringify({ ...search }) });\n      }\n    }, 500);\n  }, []);\n\n  // Process card list  when we first get it\n  useEffect(() => {\n    if (cards) {\n      cards = cards.map((card) => {\n        const exp = startOfDay(new Date(card.expiration_date));\n        card.is_expired = isBefore(exp, new Date());\n        return card;\n      });\n      // if(cards.length === 1) updateState({name:'select_card', value:cards[0]});\n\n      setCardsOnFile(cards);\n      setCardsLoaded(true);\n    }\n  }, [cards]);\n\n  // Focus on amount input when card is selected\n  useEffect(() => {\n    if (state.selectedCard) {\n      const el = document.getElementById(`inp-amount-${state.selectedCard.id}`);\n      if (el) el.select();\n    }\n  }, [state.selectedCard]);\n\n  const updateForm = React.useCallback(({ target: { value, name } }) => {\n    if (name === 'new_card_number') {\n      value = Payment.fns.formatCardNumber(value);\n    }\n    updateState({ name, value });\n  }, []);\n\n  const removeCard = async () => {\n    if (editCard) {\n      setIsUpdating(true);\n      await Accounting.removeCard(accountId, editCard.id);\n      // TODO: check the result\n      // if(result){\n      setEditCard(null);\n      notify('The card has been removed', 'success');\n      refreshAccount();\n      // } else {\n      //   notify('Unable to get remove card: ' + Accounting.error.name, 'error')\n      // }\n\n      setIsUpdating(false);\n    }\n  };\n\n  // This is only used by EditCard\n  const updateCard = async (useForAutoPay) => {\n    if (editCard) {\n      setIsUpdating(true);\n      const result = await Accounting.updateCard(accountId, editCard.id, editCard.priority, useForAutoPay);\n\n      if (result) {\n        setEditCard(null);\n        refreshAccount();\n        notify('The credit card was updated', 'success');\n      } else {\n        notify(`Unable to update card: ${Accounting.error.name}`, 'error');\n      }\n\n      setIsUpdating(false);\n    }\n  };\n\n  const updatePriority = async (card, direction) => {\n    // Note: priority is descending (higher number first)\n    if (card && !isUpdating) {\n      setIsUpdating(true);\n      const newPriority = direction === 'up' ? ++card.priority : Math.max(--card.priority, 0);\n      const result = await Accounting.updateCard(card.id, newPriority, card.auto_billing_eligible);\n\n      if (result) {\n        setEditCard(null);\n        await refreshAccount();\n        // notify('The credit card priority was updated', 'success')\n      } else {\n        notify(`Unable to update card priority: ${Accounting.error.name}`, 'error');\n      }\n\n      setIsUpdating(false);\n    }\n  };\n\n  // Open/shut edit card pane\n  const toggleEditCard = (card) => {\n    if (card?.id) {\n      setEditCard(editCard && editCard.id === card.id ? null : card);\n      // TODO: need to cancel add new card\n    } else {\n      setEditCard(null);\n    }\n  };\n\n  const gotoCheckout = async () => {\n    setIsRedirecting(true);\n    const search = (routerLocation.search || '?tab=funds');\n    const { origin, pathname } = window.location;\n    const baseReturn = `${origin + pathname}#${routerLocation.pathname}${search}`;\n\n    const response = await Accounting.getCheckoutPage(\n      accountId,\n      `${baseReturn}&cardresult=storeCardSuccess`,\n      `${baseReturn}&cardresult=storeCardCancel`,\n    );\n\n    if (response) {\n      // CardService.storePendingCard(cardNumber, state.newCardIssuer, state.newCardExp);\n      location.href = response.url;\n    } else {\n      notify('Unable to redirect to checkout', 'error');\n      setIsRedirecting(false);\n    }\n  };\n\n  const doManualCharge = async () => {\n    // TODO validation\n    if (state.selectedCard) {\n      setIsUpdating(true);\n      const payment = parseInt(state.paymentAmount.replace(/[^0-9]/g, ''));\n      const result = await Accounting.chargeToCard(accountId, state.selectedCard.id, payment);\n\n      /* result is an array of charges, false on error\n      0:\n        amount: 33\n        card_id: 14\n        created_at: \"2020-04-14T22:53:51.960739605Z\"\n        invoice_number: \"ue5e963eff191ba\"\n        status: \"accepted\"\n        transaction_id: \"b4bd490dab5a3254bf57a5ccc370dbd3\"\n       */\n      if (result) {\n        const cardName = CardService.getCardNameFromType(state.selectedCard.type);\n        updateState({ name: 'cancel' });\n        updateState({\n          name: 'message',\n          type: 'chargeSuccess',\n          value: {\n            type: 'chargeSuccess',\n            message: (<span>\n              A charge of\n              <MoneyFormatter value={state.paymentAmount} />\n              {' '}\n              on\n              {cardName}\n              {' '}\n              {state.selectedCard.last_four}\n              {' '}\n              has been submitted.\n                      </span>),\n          },\n        });\n\n        notify((<span>\n          A charge of\n          <MoneyFormatter value={state.paymentAmount} />\n          {' '}\n          on\n          {cardName}\n          {' '}\n          {state.selectedCard.last_four}\n          {' '}\n          has been submitted.\n                </span>), 'success');\n\n        refreshAccount();\n      } else {\n        // We don't get a useful error structure from the Accounting api\n        updateState({ name: 'message', value: { type: 'chargeFail', message: (<span>An error occurred while submitting this charge </span>) } });\n        /* error is\n        form: {}\n        message: \"\"\n        name: \"\"\n        status: 400\n         */\n      }\n      setChargeCardConfirm(false);\n      setIsUpdating(false);\n    }\n  };\n\n  const cancelCharge = () => updateState({ name: 'cancel' });\n\n  const handleClickSelectCard = (card) => {\n    if (card && state.selectedCard && card.id === state.selectedCard.id) {\n      // close if already selected\n      updateState({ name: 'select_card', value: null });\n    } else {\n      updateState({ name: 'select_card', value: card });\n      toggleEditCard(null);\n    }\n  };\n\n  const handleDismissMessage = () => updateState({ name: 'message', value: null });\n\n  if (!cardsLoaded) {\n    return (\n      <div>\n        <Spinner className=\"ms-4 mt-3 d-block\" color=\"secondary\" />\n        {' '}\n      </div>\n    );\n  }\n\n  return (\n\n    <div id=\"manage-cards-section\" className=\"form-section\">\n      <h5>Credit Cards</h5>\n      <div>\n\n        {cardsOnFile.length > 0\n          ? (\n            <p>\n              Select a credit card to make a one-time addition of funds to your account.\n              If automatic billing is configured, cards will be used in the order shown.\n            </p>\n          )\n          : (\n            <p>\n              Enter a credit card to add funds to your account.\n              Funds can be maintained automatically by selecting a payment plan, or manually with one-time payments.\n            </p>\n          )}\n      </div>\n\n      {state.message && <CardMessage {...state.message} onDismiss={handleDismissMessage} />}\n\n      <div id=\"cards-on-file\">\n        <BlockUI\n          tag=\"div\"\n          blocking={isUpdating}\n          mode=\"stretch\"\n          loader={<Spinner color=\"success\" />}\n        >\n\n          {/* List existing cards */}\n          {cardsOnFile && cardsOnFile.length > 0 && (\n          <>\n\n            {cardsOnFile.map((card, i) => {\n              const isSelected = !!(state.selectedCard && state.selectedCard.id === card.id);\n              return (\n                <div className={classnames('card-on-file-row', { selected: isSelected })} key={i}>\n\n                  <div className=\"d-flex justify-content-between align-items-center\">\n                    {allowEdit === true && (\n                    <div className=\"cc-priority-col\">\n                      {/*  Don't show if only 1 card. */}\n                      {isUpdating === false && cardsOnFile.length > 1 ? (\n                        <>\n                          {i > 0 && (\n                          <FaIcon\n                            icon=\"long-arrow-alt-up\"\n                            className=\"me-1\"\n                            size=\"lg\"\n                            title=\"Increase priority\"\n                            onClick={() => updatePriority(card, 'up')}\n                          />\n                          )}\n                          {i < cardsOnFile.length - 1 && (\n                          <FaIcon\n                            icon=\"long-arrow-alt-down\"\n                            size=\"lg\"\n                            title=\"Lower priority\"\n                            onClick={() => updatePriority(card, 'down')}\n                          />\n                          )}\n                        </>\n                      ) : (null)}\n\n                    </div>\n                    )}\n\n                    <div className=\"cc-image-col\" onClick={() => handleClickSelectCard(card)}>\n                      <CardIcon type={card.type} width={54} />\n                    </div>\n                    <div className=\"cc-number-col\">\n                      <CreditCardMaskedDisplay last4={card.last_four} />\n                      {card.is_default === true && (\n                      <span className=\"default ms-1 me-2\">\n                        <FaIcon icon=\"check\" size=\"1x\" color=\"green\" className=\"ms-2\" />\n                        <small>default</small>\n                      </span>\n                      ) }\n                    </div>\n                    <div className=\"cc-exp-col\">\n                      <DateFormatter value={card.expiration_date} format=\"MM/yy\" />\n                      {card.is_expired && (\n                      <small className=\"expired ms-1\">\n                        <FaIcon icon=\"exclamation-triangle\" size=\"sm\" color=\"darkred\" />\n                        {' '}\n                        Expired\n                      </small>\n                      ) }\n                    </div>\n\n                    {isSelected === false && (\n                    <div className=\"cc-auto-pay-col\">\n                      {card.auto_billing_eligible === true && (\n                      <span>\n                        <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\" />\n                        {' '}\n                        <small>use for auto-payment plan</small>\n                        {' '}\n                      </span>\n                      )}\n                    </div>\n                    )}\n\n                    {isSelected && (\n                    <div className=\"cc-checkout flex-grow-1 text-right\">\n\n                      <Form inline>\n\n                        {chargeCardConfirm === true ? (\n                          <>\n                            {isUpdating ? (\n                              <Spinner size=\"sm\" />\n                            ) : (\n                              <div className=\"inline-confirm\">\n                                <span className=\"me-2\">\n                                  <b>Charge  <MoneyFormatter value={state.paymentAmount} /> to card? </b>\n                                </span>\n                                <Button onClick={doManualCharge} size=\"sm\" color=\"primary\" className=\"me-2\">Yes</Button>\n                                <Button onClick={() => setChargeCardConfirm(false)} size=\"sm\" color=\"secondary\" outline>No</Button>\n                              </div>\n                            )}\n\n                          </>\n\n                        ) : (\n                          <div className=\"d-flex nowrap align-items-center\">\n                            <div className=\"me-2\">\n                              <MaskedInput\n                                mask={currencyMask}\n                                value={state.paymentAmount || ''}\n                                onChange={updateForm}\n                                id={`inp-amount-${card.id}`}\n                                placeholder=\"Amount\"\n                                name=\"payment_amount\"\n                                render={(ref, props) => <InputWithIcon className=\"teeny\" size=\"sm\" innerRef={ref} icon=\"dollar-sign\" {...props} />}\n                              />\n                            </div>\n\n                            <Button size=\"sm\" color=\"link\" onClick={cancelCharge}>Cancel</Button>\n                            <Button\n                              size=\"sm\"\n                              color=\"primary\"\n                              onClick={() => setChargeCardConfirm(true)}\n                              className=\"me-2\"\n                              disabled={state.paymentAmount <= 0}\n                            >\n                              Add Funds\n                            </Button>\n\n                          </div>\n                        )}\n                      </Form>\n                    </div>\n                    )}\n\n                    {!isSelected && allowEdit && (\n                    <div className=\"cc-action flex-fill text-right\">\n\n                      <Button\n                        color=\"link\"\n                        size=\"sm\"\n                        onClick={() => handleClickSelectCard(card)}\n                        className=\"inline me-2\"\n                      >\n                        Add Funds\n                      </Button>\n\n                      <Button\n                        color=\"link\"\n                        size=\"sm\"\n                        onClick={() => toggleEditCard(card)}\n                        className=\"inline\"\n                      >\n                        Edit\n                        {' '}\n                        <FaIcon className=\"ms-1\" icon={editCard && card.id === editCard.id ? 'chevron-down' : 'chevron-right'} />\n                      </Button>\n                    </div>\n\n                    )}\n                  </div>\n\n                  {/* Edit card section */}\n                  {!isSelected && editCard && card.id === editCard.id && (\n                  <EditCard\n                    card={card}\n                    cancelEdit={toggleEditCard}\n                    updateCard={updateCard}\n                    removeCard={removeCard}\n                    isUpdating={isUpdating}\n                  />\n                  )}\n\n                </div>\n              );\n            })}\n            {' '}\n            {/* end map cardsOnFile */}\n\n          </>\n          )}\n          {' '}\n          {/* if cardsOnFile length */}\n\n          {allowEdit && (\n          <div className=\"card-on-file-row new-card d-flex justify-content-start align-items-center\">\n            <div>\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                className=\"btn-add-card\"\n                onClick={gotoCheckout}\n                disabled={isRedirecting || editCard}\n              >\n                {isRedirecting === true ?\n                  <Spinner size=\"sm\" color=\"light\" className=\"me-1\" />\n                  : <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />}\n                Add Card\n              </Button>\n              <small className=\"ms-3\">You will be directed to a secure card verification page.</small>\n\n            </div>\n          </div>\n          )}\n\n       </BlockUI>\n\n      </div>\n    </div>\n\n  );\n};\n\nCards.propTypes = {\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  cards: PropTypes.array,\n  refreshAccount: PropTypes.func,\n};\n\nexport default Cards;\n","import {Button, Form, FormGroup, Label, Spinner} from \"reactstrap\";\nimport React, {useContext, useState} from \"react\";\nimport EnhancedSelect from \"../../../../Components/Form/EnhancedSelect\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport useFormState from \"../../../../Hooks/useFormState\";\nimport * as Yup from \"yup\";\nimport {AppContext} from \"../../../../Providers/AppProvider\";\nimport {MaskedInputGroup} from \"@thedmsgroup/mastodon-ui-components/lib/components/Form/MaskedInput\";\n\nconst FundTransferValidationSchema = Yup.object().shape({\n  receiver_account_id: Yup.number().transform((n) => (isNaN(n) ? 0 : n)).moreThan(0,'Please select an Account to transfer to'),\n  amount: Yup.number().min(1).positive().required('Please enter an amount to transfer'),\n});\n\nconst TransfersInline = ({accountId, accountOptions, close}) => {\n  const [isTransferring, setIsTransferring] = useState(false);\n  const {\n    formApi,formValues, formErrors,\n  } = useFormState(\n    {\n      sender_account_id: accountId,\n      receiver_account_id: '',\n      amount: '',\n    },\n    FundTransferValidationSchema,\n  );\n\n  const app = useContext(AppContext);\n  const Accounting = React.useMemo(() => app.getApi('accounting'), []);\n\n  const transferFunds = async () => {\n    setIsTransferring(true);\n    const request = {...formValues};\n\n    let result;\n\n    try {\n      result = await Accounting.transfer(request);\n    } catch(err) {\n      setIsTransferring(false);\n      if (err.status === 403) {\n        notify('You do not have permission to initiate transfers on this account.', 'error')\n        return\n      }\n      if (err.data.error) {\n        notify(err.data.error, 'error')\n      }\n      return\n    }\n    setIsTransferring(false);\n\n    if (result.error) {\n      notify('Failed to transfer funds: ' + result.error, 'error')\n      return\n    }\n\n    notify(`Transaction successful.`, 'success')\n    formApi.clearForm()\n    close(true);\n  }\n\n  const handleTransferFunds = () => {\n    if (formApi.validate()) {\n      transferFunds();\n    }\n  }\n\n  const handleCancel = () => {\n    formApi.clearForm();\n    close();\n  }\n\n  const DefaultMaskOptions = {\n    mask: Number,\n    unmask: \"typed\",\n    scale:0,\n    max:99999,\n    signed: false,\n    radix:\".\",\n    thousandsSeparator:\",\"\n  }\n\n  return (\n    <>\n\n        <Form>\n            <FormGroup className=\"mt-2\">\n              <Label>Transfer Cash</Label>\n            </FormGroup>\n\n            <FormGroup>\n\n              <EnhancedSelect\n                isClearable\n                isSearchable\n                onChange={(val) => formApi.handleOnChange('receiver_account_id', val)}\n                options={accountOptions}\n                value={formValues.receiver_account_id ?? ''}\n                tabSelectsValue\n                backspaceRemovesValue\n                isMulti={false}\n                controlShouldRenderValue\n                hideSelectedOptions\n                closeMenuOnSelect\n                placeholder=\"Receiving Account\"\n                isInvalid={!!formErrors.receiver_account_id}\n                invalidFeedback={formErrors.receiver_account_id}\n              />\n\n\n              <div className=\"mt-2\">\n                <MaskedInputGroup\n                  className=\"\"\n                  prefix=\"$\"\n                  placeholder=\"Transfer Amount\"\n                  {...DefaultMaskOptions}\n                  value={formValues.amount ?? ''}\n                  onAccept={(value) => formApi.handleOnChange('amount', value)}\n                  invalid={!!formErrors.amount}\n                  bsSize=\"sm\"\n                />\n              </div>\n            </FormGroup>\n\n            <Button\n              size=\"sm\"\n              color=\"link\"\n              onClick={handleCancel}\n              disabled={isTransferring}\n            >\n              Cancel\n            </Button>\n\n            <Button\n              size=\"sm\"\n              color=\"primary\"\n              onClick={handleTransferFunds}\n              className=\"me-2\"\n              disabled={isTransferring}\n            >\n              Transfer Cash{isTransferring && <Spinner size=\"sm\" className=\"ms-1\" /> }\n            </Button>\n        </Form>\n\n    </>\n  );\n}\n\nexport default TransfersInline;\n","import React, { useState, useEffect } from 'react';\nimport {\n  FormGroup, Button, Input, Label, Card, CardHeader, CardBody, Spinner,\n} from 'reactstrap';\n//import createNumberMask from 'text-mask-addons/dist/createNumberMask';\n//import MaskedInput from 'react-text-mask';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { isDate } from 'date-fns';\nimport Flatpickr from 'react-flatpickr';\nimport * as Yup from 'yup';\nimport PropTypes from 'prop-types';\n//import InputWithIcon from '../../../../Components/Form/InputWithIcon';\nimport { DateFormatter, MoneyFormatter } from '../../../../Components/Table/Table';\nimport 'flatpickr/dist/themes/airbnb.css';\nimport useFormState from '../../../../Hooks/useFormState';\nimport { titleCaseWord } from '../../../../utils/string';\nimport usePermission from '../../../../Hooks/usePermission';\nimport useTimezoneDisplay from '../../../../Hooks/useTimezoneDisplay';\nimport {MaskedInputGroup, MaskedInput, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport TransfersInline from \"./TransfersInline\";\n\nconst isEmptyCap = (cap) => cap === '' || cap === null || cap === undefined;\n\nconst validationSchema = Yup.object().shape({\n  type: Yup.mixed().notRequired(),\n  amount: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : parseInt(n))).moreThan(0, 'Please enter an amount greater than zero').required('Please set a dollar amount'),\n  threshold: Yup.mixed().when('type', { // note, error property will be 'bidding.bid_modifier'\n    is: 'recharge',\n    then: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : parseInt(n))).moreThan(0, 'Set a threshold greater than zero').required('Please set a threshold amount'),\n  }),\n  interval: Yup.mixed().when('type', { // note, error property will be 'bidding.bid_modifier'\n    is: 'subscription',\n    then: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : parseInt(n))).moreThan(0, 'Day interval is required'),\n  }),\n  charge_date: Yup.mixed().when('type', { // note, error property will be 'bidding.bid_modifier'\n    is: 'subscription',\n    then: Yup.string().required('Start date is required'),\n  }),\n  monthly_cap: Yup.mixed().when('type', { // optional: empty means no cap\n    is: 'recharge',\n    then: Yup.number().transform((n, orig) => (isEmptyCap(orig) ? null : parseInt(n))).nullable().moreThan(0, 'Set a monthly cap greater than zero, or leave it empty'),\n  }),\n\n});\n\nconst DefaultMaskOptions = {\n  mask: Number,\n  unmask: \"typed\",\n  scale:0,\n  max:99999,\n  signed: false,\n  radix:\".\",\n  thousandsSeparator:\",\"\n}\n\nconst CreditMaskOptions = {...DefaultMaskOptions, signed:true, min:-99999}\nconst PlanAmountMaskOptions = {...DefaultMaskOptions}\n\nconst IntervalMaskOptions = {...DefaultMaskOptions, max:999, min:1}\n\n\nconst pickerOptions = {\n  enableTime: false,\n  minDate: 'today',\n  dateFormat: 'm-d-Y',\n  altInput: true,\n  altFormat: 'F j, Y',\n};\n\n// formState hook controls payment plan form\nconst initialPlanFormState = {\n  type: '',\n  amount: '',\n  interval: 14,\n  charge_date: new Date(),\n  threshold: '',\n  monthly_cap: '',\n};\n\n// Note: API account request will not have a payment_plan field if there is no plan,\n// so the currentPlan property could be undefined\nconst BalanceAndPlan = ({\n  plan,\n  balance,\n  cashBalance,\n  creditBalance,\n  savePlan,\n  addCredit,\n  isUpdating,\n  cards,\n  accountTimezone,\n  accountId, transfereeAccountOptions,\n  refreshAccount\n}) => {\n\n  const [planEditMode, setPlanEditMode] = useState(false);\n  const [addCreditMode, setAddCreditMode] = useState(false);\n  const [transferCashMode, setTransferCashMode] = useState(false);\n  const [newCreditAmount, setNewCreditAmount] = useState('');\n  const [balanceError, setBalanceError] = useState(null);\n  const [hasCards, setHasCards] = useState(cards.length > 0);\n  const [hasAutoBillCard, setHasAutoBillCard] = useState(cards.some((card) => card.auto_billing_eligible));\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState({ ...initialPlanFormState, ...plan }, validationSchema);\n  const { formatToTimezone } = useTimezoneDisplay(accountTimezone);\n  const allowEdit = usePermission('accounting.edit');\n  const allowView = usePermission('accounting.view');\n  const allowAddCredit = usePermission('accounting_credit.create');\n  const allowAccountingTransferCreate = usePermission('accounting_transfers.create');\n\n  if (!allowView) return (<span>Not authorized</span>);\n\n  const toggleTransferCashMode = () => setTransferCashMode(!transferCashMode);\n\n  useEffect(() => {\n    setHasCards(cards.length > 0);\n    if (cards.length) {\n      setHasAutoBillCard(cards.some((card) => card.auto_billing_eligible));\n    }\n  }, [cards]);\n\n  const handleAddCredit = async () => {\n    const amt = parseInt(newCreditAmount.toString().replace(',', ''));\n\n    if (amt === 0 || isNaN(amt)) {\n      setBalanceError('Credit amount is required');\n    } else {\n      setBalanceError(null);\n      await addCredit(amt);\n      setAddCreditMode(false);\n    }\n  };\n\n  const handleSavePlan = async () => {\n    // PROBLEM: subscription charge date is string on load. But date widget changes it to Date.\n    // If we save to account timezone, it could display one day behind\n    //  \"2021-09-16T03:00:00Z\"  displays as 9:15 because converted to browser timezone PST\n    // See how we are doing it in Rules/ Advanced.js (quaifying rate start )\n\n    // If valid, convert values for API\n    //console.log('BalanceAndPlan.js: save plan formvalue', formValues.charge_date);\n    //console.log('BalanceAndPlan.js: to timezone', accountTimezone, formatToTimezone(formValues.charge_date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\"));\n\n    if (formApi.validate()) {\n      let newPlan = null;\n      if (formValues.type === 'subscription') {\n        newPlan = (({\n          type, amount, interval, charge_date,\n        }) => ({\n          type, amount, interval, charge_date,\n        }))(formValues);\n\n        if (isDate(newPlan.charge_date)) {\n          newPlan.charge_date = formatToTimezone(\n            isDate(newPlan.charge_date) ? newPlan.charge_date.toString() : newPlan.charge_date,\n            \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n          );\n        }\n\n        // will take \"2020-05-01T00:00:00-07:00\"  or \"2020-05-01T00:00:00Z\"\n        // newPlan.charge_date = format(newPlan.charge_date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\"); //newPlan.charge_date.toString();//moment(newPlan.charge_date).format(); // 2020-04-27T00:00:00-07:00\n        newPlan.interval = parseInt(newPlan.interval);\n        // need to unmask the dollar values\n        newPlan.amount = parseInt(newPlan.amount.toString().replace(',', ''));\n        // TODO: user timezone\n      } else if (formValues.type === 'recharge') {\n        newPlan = (({\n          type, amount, threshold, monthly_cap,\n        }) => ({\n          type, amount, threshold, monthly_cap,\n        }))(formValues);\n        newPlan.threshold = parseInt(newPlan.threshold.toString().replace(',', ''));\n        newPlan.amount = parseInt(newPlan.amount.toString().replace(',', ''));\n        newPlan.monthly_cap = isEmptyCap(newPlan.monthly_cap) ? null : parseInt(newPlan.monthly_cap.toString().replace(',', ''));\n      }\n      // updatePlan(newPlan)\n      await savePlan(newPlan);\n      setPlanEditMode(false);\n    }\n  };\n\n  const toggleAddCredit = () => {\n    if (allowAddCredit) {\n      if (addCreditMode) {\n        setAddCreditMode(false);\n        setBalanceError('');\n      } else {\n        if (planEditMode) {\n          formApi.clearForm();\n          setPlanEditMode(false);\n        }\n        setAddCreditMode(true);\n      }\n    }\n\n  };\n\n  const toggleEditPlan = () => {\n    if (planEditMode) {\n      formApi.clearForm();\n      setPlanEditMode(false);\n    } else {\n      setAddCreditMode(false);\n      setNewCreditAmount('');\n      setPlanEditMode(true);\n    }\n  };\n\n  const handleTransfersClose = (refresh) => {\n    setTransferCashMode(false);\n    if (refresh === true) {\n      refreshAccount();\n    }\n  }\n\n  return (\n    <div className=\"accounting-details form-section d-flex p-4 mb-2\">\n\n      <Card className=\"account-balance  me-4\">\n        <CardHeader>Account Balance</CardHeader>\n        <CardBody>\n\n          {balanceError && (\n          <StandardAlert color=\"light\" className=\"\">\n            {balanceError}\n          </StandardAlert>\n          )}\n\n          <div className=\"detail-table\">\n            <div className=\"detail-rows\">\n              <div className=\"detail-row\">\n                <Label>Balance</Label>\n                <div className=\"value\">\n                  {balance === 0 && <FaIcon icon=\"exclamation-triangle\" color=\"#990000\" size=\"1x\" className=\"me-1\" /> }\n                  <MoneyFormatter className=\"balance\" value={balance} />\n                </div>\n              </div>\n              <div className=\"detail-row\">\n                <Label>\n                  Credit\n                  {allowAddCredit && !addCreditMode && <Button color=\"link\" size=\"sm\" className=\"inline ms-2\" onClick={toggleAddCredit}>Add</Button>}\n                </Label>\n                <div className=\"value flex-fill\">\n                  {addCreditMode === true ? (\n                    <div className=\"add-credit d-flex align-items-center justify-content-end\">\n                      {isUpdating === true && <Spinner size=\"sm\" className=\"me-1\" /> }\n\n                      <MaskedInputGroup\n                        className=\"teeny me-2\"\n                        title=\"Add Credit\"\n                        prefix=\"$\"\n                        {...CreditMaskOptions}\n                        value={newCreditAmount}\n                        onAccept={(value) => setNewCreditAmount(value)}\n                        bsSize=\"sm\"\n                        />\n\n                      <Button size=\"xs\" color=\"primary\" className=\"ms-1 me-1\" disabled={isUpdating} onClick={handleAddCredit}>Add</Button>\n                      <Button size=\"xs\" outline className=\"me-2\" onClick={toggleAddCredit}><FaIcon icon=\"times\" /></Button>\n                      <span><MoneyFormatter value={creditBalance} /></span>\n                    </div>\n                  ) : (\n                    <span><MoneyFormatter value={creditBalance} /></span>\n                  )}\n\n                </div>\n              </div>\n              <div className=\"detail-row\">\n                <Label>Cash {\n                  allowAccountingTransferCreate\n                  && transfereeAccountOptions.length > 0\n                  && <Button\n                    color=\"link\"\n                    size=\"sm\"\n                    className=\"inline ms-2\"\n                    onClick={toggleTransferCashMode}\n                    disabled={transferCashMode}\n                    title=\"Transfer cash to another account\"\n                  >Transfer</Button>\n                }\n                </Label>\n                <div className=\"value\"><MoneyFormatter value={cashBalance} /></div>\n              </div>\n\n              {allowAccountingTransferCreate && transferCashMode && transfereeAccountOptions.length > 0 &&\n                <TransfersInline accountId={accountId} accountOptions={transfereeAccountOptions} close={handleTransfersClose}/>}\n\n            </div>\n          </div>\n        </CardBody>\n      </Card>\n\n      <Card className=\"payment-plan\">\n        <CardHeader>\n          <div className=\"d-flex justify-content-between align-items-center\">\n            <div>Payment Plan</div>\n            {allowEdit && (\n              <Button className=\"inline\" color=\"link\" size=\"sm\" onClick={toggleEditPlan}>\n                <FaIcon icon=\"pencil-alt\" size=\"sm\" />\n              </Button>\n            )}\n          </div>\n\n\n        </CardHeader>\n        <CardBody>\n\n          {!formIsValid && (\n          <StandardAlert color=\"light\" className=\"\">\n            {Object.values(formErrors)[0]}\n          </StandardAlert>\n          )}\n\n          {hasCards === false && formValues.type && (\n          <StandardAlert color=\"light\" className=\"\">\n            The selected plan requires a credit card\n          </StandardAlert>\n          )}\n\n          {hasCards && !hasAutoBillCard && formValues.type && (\n            <StandardAlert color=\"light\" className=\"\">\n              A credit card must be configured for use with automatic payments\n            </StandardAlert>\n          )}\n\n          <div className=\"detail-table mb-2\">\n\n            <div className=\"detail-rows\">\n              <div className=\"detail-row d-flex\">\n                <Label>Billing</Label>\n                <div className=\"description flex-fill\">\n                  <small>\n                    {formValues.type === 'recharge' && <i>Keep cash balance above a threshold</i>}\n                    {formValues.type === 'subscription' && <i>Add funds at regular intervals</i>}\n                    {!formValues.type && <i>No automatic payments</i>}\n                  </small>\n                </div>\n                <div className=\"value\">\n                  {planEditMode === true ? (\n                    <Input type=\"select\" size=\"sm\" name=\"type\" onChange={formApi.handleOnChange} value={formValues.type}>\n                      <option value=\"\">None</option>\n                      <option value=\"subscription\">Subscription</option>\n                      <option value=\"recharge\">Recharge</option>\n                    </Input>\n                  ) : (\n                    <span>{titleCaseWord(formValues.type) || (null)}</span>\n\n                  )}\n                </div>\n              </div>\n\n              {formValues.type !== '' && (\n              <div className=\"detail-row d-flex\">\n                <Label>Amount</Label>\n                <div className=\"description\">&nbsp;</div>\n                <div className=\"value\">\n\n                  {planEditMode === true ? (\n                    <MaskedInputGroup\n                      className=\"teeny me-2\"\n                      prefix=\"$\"\n                      placeholder=\"Amount\"\n                      {...PlanAmountMaskOptions}\n                      value={formValues.amount ?? ''}\n                      onAccept={(value) => formApi.handleOnChange('amount', value)}\n                      invalid={!!formErrors.amount}\n                      bsSize=\"sm\"\n                    />\n                  ) : (\n                    <span><MoneyFormatter value={formValues.amount} /></span>\n                  )}\n                </div>\n              </div>\n              )}\n\n              {formValues.type === 'recharge' && (\n              <div className=\"detail-row d-flex\">\n                <Label>Threshold</Label>\n                <div className=\"description flex-fill\"><small><i>Maintain cash balance at or above:</i></small></div>\n                <div className=\"value\">\n\n                  {planEditMode === true ? (\n                    <MaskedInputGroup\n                      className=\"teeny me-2\"\n                      prefix=\"$\"\n                      {...{...PlanAmountMaskOptions, max:99999999}}\n                      value={formValues.threshold ?? ''}\n                      onAccept={(value) => formApi.handleOnChange('threshold', value)}\n                      invalid={!!formErrors.threshold}\n                      placeholder=\"Threshold\"\n                      bsSize=\"sm\"\n                    />\n                  ) : (\n                    <span><MoneyFormatter value={formValues.threshold} /></span>\n                  )}\n                </div>\n              </div>\n              )}\n\n              {formValues.type === 'recharge' && (\n              <div className=\"detail-row d-flex\">\n                <Label>Monthly Cap</Label>\n                <div className=\"description flex-fill\"><small><i>Stop recharging once card charges this month (UTC) reach:</i></small></div>\n                <div className=\"value\">\n\n                  {planEditMode === true ? (\n                    <MaskedInputGroup\n                      className=\"teeny me-2\"\n                      prefix=\"$\"\n                      {...{...PlanAmountMaskOptions, max:999999}}\n                      value={formValues.monthly_cap ?? ''}\n                      onAccept={(value) => formApi.handleOnChange('monthly_cap', value)}\n                      invalid={!!formErrors.monthly_cap}\n                      placeholder=\"No cap\"\n                      bsSize=\"sm\"\n                    />\n                  ) : (\n                    <span>{isEmptyCap(formValues.monthly_cap) ? 'None' : <MoneyFormatter value={formValues.monthly_cap} />}</span>\n                  )}\n                </div>\n              </div>\n              )}\n\n              {formValues.type === 'subscription' && (\n              <div className=\"detail-row d-flex\">\n                <Label>Interval</Label>\n                <div className=\"description flex-fill\"><small><i>Days between charges</i></small></div>\n                <div className=\"value\">\n                  {planEditMode === true ? (\n\n                    <MaskedInput\n                      className=\"teeny me-2\"\n                      {...IntervalMaskOptions}\n                      value={formValues.interval}\n                      onAccept={(value) => formApi.handleOnChange('interval', value)}\n                      invalid={!!formErrors.interval}\n                      placeholder=\"days\"\n                    />\n\n                  ) : (\n                    <span>\n                      {formValues.interval}\n                      {' '}\n                      days\n                    </span>\n                  )}\n                </div>\n              </div>\n              )}\n\n              {formValues.type === 'subscription' && (\n              <div className=\"detail-row d-flex\">\n                <Label>Charge Date</Label>\n                <div className=\"description flex-fill\"><small><i>Charges start from this day forward</i></small></div>\n                <div className=\"value\">\n                  {planEditMode === true ? (\n                    <FormGroup>\n                      <Flatpickr\n                        options={pickerOptions}\n                        value={formValues.charge_date}\n                        className=\"form-control form-control-sm\"\n                        placeholder=\"Select date...\"\n                        onChange={(date) => formApi.handleOnChange('charge_date', date[0])}\n                      />\n                    </FormGroup>\n                  ) : (\n                    <span>\n                      <DateFormatter value={formValues.charge_date} format=\"MMM do, y\" timezone={accountTimezone} />\n                      {' '}\n                    </span>\n                  )}\n                </div>\n              </div>\n              )}\n\n            </div>\n\n            {planEditMode === true && allowEdit && (\n            <div className=\" d-flex mt-3\">\n              <div className=\"ms-auto\">\n                {isUpdating === true && <Spinner size=\"sm\" className=\"me-1\" /> }\n                <Button size=\"sm\" color=\"link\" onClick={toggleEditPlan}>Cancel</Button>\n                <Button size=\"sm\" color=\"primary\" onClick={handleSavePlan} disabled={isUpdating} className=\"me-2\">Save Plan</Button>\n\n              </div>\n            </div>\n            )}\n          </div>\n\n        </CardBody>\n      </Card>\n\n    </div>\n\n  );\n};\n\nBalanceAndPlan.propTypes = {\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  balance: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  cashBalance: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  creditBalance: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  plan: PropTypes.object,\n  updatePlan: PropTypes.func,\n  savePlan: PropTypes.func,\n  addCredit: PropTypes.func,\n  cards: PropTypes.array,\n  accountTimezone: PropTypes.string,\n};\n\nexport default BalanceAndPlan;\n","import React, { useEffect, useState, useContext } from 'react';\nimport { Row, Col, Spinner } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport Cards from './Cards';\nimport BalanceAndPlan from './BalanceAndPlan';\n//import Activity from './Activity';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\n// import LoaderDots from \"../../../Layout/LoaderDots\";\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport useApi from \"../../../../Hooks/useApi\";\n\n// Accounting API will not return null fields.\n// Use this so we have a complete data structure.\nconst AccountDefault = {\n  id: 0,\n  balance: 0,\n  cash_balance: 0,\n  credit_balance: 0,\n  credit_cards: [],\n  payment_plan: {},\n};\n\n/*\n * Component for managing credit cards, adding funds to your account, and managing\n * payment plans\n */\nconst Funds = ({ accountId, accountTimezone }) => {\n  const app = useContext(AppContext);\n  const Accounting = React.useMemo(() => app.getApi('accounting'), []);\n  const { api } = useApi();\n\n  // Account is an entity from Accounting API, not same as core\n  const [account, setAccount] = useState({\n    id: null, // same as core account id\n    balance: null,\n    credit_cards: null,\n    payment_plan: null,\n  });\n  const [transfereeAccountOptions, setTransfereeAccountOptions] = useState([])\n  const [isUpdating, setIsUpdating] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n\n  // On mount\n  useEffect(() => {\n    if (accountId) {\n      getAccounting();\n    }\n  }, [accountId]);\n\n  const getAccountingData = async () => {\n    const account = await Accounting.getAccount(accountId);\n\n    if (account) {\n      setAccount({ ...AccountDefault, ...account });\n    } else {\n      notify(`Unable to get accounting data: ${Accounting.error.name}`, 'error');\n    }\n\n    const transferAccounts = await api.endpoints.accounts.list()\n    if (transferAccounts) {\n      setTransfereeAccountOptions(transferAccounts.filter( acc => acc.id.toString() !== accountId.toString()).map(acc => {\n        return {value: acc.id, label: acc.name}\n      }))\n    }\n  }\n\n  const getAccounting = async () => {\n    setIsLoading(true);\n\n    await getAccountingData();\n\n    setIsLoading(false);\n  };\n\n  const refreshAccount = async () => {\n    getAccountingData()\n  };\n\n  const savePaymentPlan = async (plan) => {\n    setIsUpdating(true);\n    const result = await Accounting.updateAccount(accountId, { payment_plan: plan });\n    if (result) {\n      notify('The payment plan has been updated', 'success');\n    } else {\n      notify(`The payment plan could not be saved: ${Accounting.error}`, 'error');\n    }\n    setIsUpdating(false);\n  };\n\n  const addCredit = async (amount) => {\n    setIsUpdating(true);\n    const result = await Accounting.addAccountCredit(accountId, amount);\n    if (result) {\n      getAccounting();\n      notify('The account has been credited', 'success');\n    } else {\n      notify(`The account could not be credited: ${Accounting.error?.name || \"Server Error\"}`, 'error');\n    }\n    setIsUpdating(false);\n  };\n\n  // if(isLoading) return (<div style={{minHeight:'200px',position:'relative'}}><LoaderDots active={true}/></div>);\n  if (isLoading) return (<div className=\"text-center mt-4\" style={{ minHeight: '200px' }}><Spinner color=\"primary\" /></div>);\n\n  return (\n    <div id=\"manage-funds-section\">\n\n      {account.id === null && <StandardAlert color=\"light\">Accounting data is unavailable for this account</StandardAlert> }\n\n      {account.id && (\n        <>\n\n            <Row>\n              <Col sm={12} md={10}>\n                <BalanceAndPlan\n                  balance={account.balance}\n                  cashBalance={account.cash_balance}\n                  creditBalance={account.credit_balance}\n                  plan={account.payment_plan}\n                  savePlan={savePaymentPlan}\n                  addCredit={addCredit}\n                  isUpdating={isUpdating}\n                  cards={account.credit_cards}\n                  accountTimezone={accountTimezone}\n                  accountId={accountId}\n                  transfereeAccountOptions={transfereeAccountOptions}\n                  refreshAccount={refreshAccount}\n                />\n              </Col>\n            </Row>\n\n            <Row className=\"mt-3\">\n              <Col sm={12} md={10}>\n                <Cards\n                  cards={account.credit_cards}\n                  accountId={accountId}\n                  refreshAccount={getAccounting}\n                />\n              </Col>\n\n            </Row>\n{/*\n\n            <Row className=\"mt-3\">\n              <Col sm={12}>\n                <Activity\n                  cards={account.credit_cards}\n                  accountId={accountId}\n                  refreshAccount={getAccounting}\n                />\n              </Col>\n            </Row>\n*/}\n\n\n          {/* <Col widths={['sm','md','lg','xl', 'xxl']}  lg={{ size: 12, order: 1}}  xl={{ size: 4, order: 2}} >\n            <BalanceAndPlan\n              balance={account.balance}\n              cashBalance={account.cash_balance}\n              creditBalance={account.credit_balance}\n              plan={account.payment_plan}\n              savePlan={savePaymentPlan}\n              addCredit={addCredit}\n              isUpdating={isUpdating}\n              cards={account.credit_cards}\n            />\n          </Col> */}\n\n        </>\n      )}\n\n    </div>\n  );\n};\n\nFunds.propTypes = {\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  accountTimezone: PropTypes.string,\n};\n\nexport default Funds;\n","import { Utils } from '@thedmsgroup/mastodon-ui-components';\n\n// A core-api owner label for an accounting UUID. `accounts` on a hit omits\n// UUIDs core-api could not label, so it is not positionally aligned with\n// `account_ids`: always key by accounting_account_id.\nexport type AccountLabel = {\n  type: 'account' | 'promotion' | 'user' | 'system' | string;\n  id: number;\n  name: string;\n  accounting_account_id?: string;\n};\n\n// One leg of the transaction as stored on the doc. Complete for every\n// transaction (unlike the entries endpoint, which is scoped to accessible\n// accounts). balance_after is deliberately absent; Funds stays the balance\n// source.\nexport type StoredEntry = {\n  sequence: number;\n  account_id: string;\n  wallet_type?: string;\n  amount: number;\n  reversed?: boolean;\n  role?: 'buyer' | 'contribution' | string;\n  promotion_id?: number;\n};\n\nexport type Contribution = {\n  promotion_id?: number;\n  participation_id?: number;\n  account_id: string;\n  cash: number;\n  credit: number;\n  total: number;\n  refundable: boolean;\n  auto_funded?: boolean;\n  reversed: boolean;\n};\n\n// Present only on split-funded sales indexed after the producers started\n// sending attribution data. All amounts are positive dollars.\nexport type Funding = {\n  gross: number;\n  buyer_cash: number;\n  buyer_credit: number;\n  buyer_total: number;\n  promotion_cash: number;\n  promotion_credit: number;\n  promotion_total: number;\n  contributions: Contribution[];\n};\n\nexport type TransactionData = {\n  auction_id?: string;\n  order_id?: number;\n  sale_id?: string;\n  buyer_account_id?: number;\n  promotion_id?: number;\n  reason?: string;\n  source?: string;\n  [key: string]: unknown;\n};\n\nexport type TransactionRow = {\n  transaction_id: string;\n  type?: string;\n  status?: string; // '' | 'reverted'\n  revision?: number; // on a reverted original: the reversing transaction id\n  posted_at: string;\n  memo?: string;\n  actor_id?: number;\n  actor?: AccountLabel;\n  gateway_transaction_id?: string;\n  card?: { id: number; last_four?: string; type?: string };\n  account_ids: string[];\n  accounts?: AccountLabel[];\n  wallet_types: string[];\n  entry_count: number;\n  total_amount: number;\n  amount_moved: number;\n  reverses_transaction_id?: string;\n  entries?: StoredEntry[];\n  data?: TransactionData;\n  promotion_ids?: number[];\n  funding?: Funding;\n};\n\nexport type TransactionsResponse = {\n  num_hits: number;\n  hits: TransactionRow[];\n  duration_ms: number;\n};\n\n// Not a transaction type: a hold-and-release pair from an auction that never\n// sold is hidden by default (ledger mechanics, not a purchase). Picking this\n// in the type filter brings them back; it never narrows the list on its own.\nexport const IncludeUnsoldHolds = 'include_unsold_holds';\n\nexport const TransactionTypeChoices = [\n  { label: 'Payment', value: 'payment' },\n  { label: 'Reversal', value: 'reversal' },\n  { label: 'Credit Issue', value: 'credit_issue' },\n  { label: 'Cash Transfer', value: 'cash_transfer' },\n  { label: 'Card Charge', value: 'charge' },\n  { label: 'Card Refund', value: 'refund' },\n  { label: 'Include Unsold Holds', value: IncludeUnsoldHolds },\n];\n\nexport const typeLabel = (type?: string) => (type ? Utils.titleCase(type.replace(/_/g, ' ')) : '(untyped)');\n","import {\n  AccountLabel, StoredEntry, TransactionRow,\n} from './types';\n\n// Pure row helpers for the account Activity table.\n//\n// Two generations of transaction docs exist. Docs indexed after the producers\n// started sending attribution data carry `data` (auction, sale, buyer) and,\n// on split-funded sales, a `funding` block plus a `role` on every leg. Older\n// docs carry only `entries[]` and a memo. Every helper here reads the rich\n// shape first and falls back to the legs, so history renders without\n// pretending to know more than it does: Gross always comes from the doc,\n// Net always from this account's own legs, and the buyer/promotion split is\n// null when neither `funding` nor roles exist.\n\nexport type Split = { cash: number; credit: number; total: number };\n\nconst rxGuid = /[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;\n\nconst cents = (n: number) => Math.round(n * 100) / 100;\n\nconst emptySplit = (): Split => ({ cash: 0, credit: 0, total: 0 });\n\nconst addLeg = (split: Split, leg: StoredEntry) => {\n  const amount = Math.abs(leg.amount);\n  if (leg.wallet_type === 'credit') {\n    split.credit = cents(split.credit + amount);\n  } else {\n    split.cash = cents(split.cash + amount);\n  }\n  split.total = cents(split.cash + split.credit);\n  return split;\n};\n\nexport const auctionIdFor = (row: TransactionRow): string | undefined => {\n  if (row.data?.auction_id) return row.data.auction_id;\n  const memo = row.memo ?? '';\n  if (!/auction/i.test(memo)) return undefined;\n  return memo.match(rxGuid)?.[0];\n};\n\nconst hasRoles = (row: TransactionRow) => (row.entries ?? []).some((e) => !!e.role);\n\n// What the buyer paid. `accountUuid` is this account's own UUID; on a\n// legacy payment without roles, its own debits are the buyer's share.\nexport const buyerPaid = (row: TransactionRow, accountUuid?: string): Split | null => {\n  if (row.funding) {\n    return { cash: row.funding.buyer_cash, credit: row.funding.buyer_credit, total: row.funding.buyer_total };\n  }\n  const entries = row.entries ?? [];\n  if (hasRoles(row)) {\n    return entries.filter((e) => e.role === 'buyer').reduce(addLeg, emptySplit());\n  }\n  if (row.type === 'payment' && accountUuid) {\n    return entries\n      .filter((e) => e.account_id === accountUuid && e.amount < 0)\n      .reduce(addLeg, emptySplit());\n  }\n  return null;\n};\n\n// What promotion pools contributed. Null when the doc cannot say.\nexport const promotionPaid = (row: TransactionRow): Split | null => {\n  if (row.funding) {\n    return { cash: row.funding.promotion_cash, credit: row.funding.promotion_credit, total: row.funding.promotion_total };\n  }\n  if (!hasRoles(row)) return null;\n  return (row.entries ?? []).filter((e) => e.role === 'contribution').reduce(addLeg, emptySplit());\n};\n\nexport const accountLabels = (row: TransactionRow): Record<string, AccountLabel> => {\n  const labels: Record<string, AccountLabel> = {};\n  (row.accounts ?? []).forEach((label) => {\n    if (label.accounting_account_id) labels[label.accounting_account_id] = label;\n  });\n  return labels;\n};\n\n// Promotion names for a row: core-api labels first, then a placeholder per\n// promotion id the doc knows about (labels are absent when core-api could\n// not resolve the pool, e.g. an archived promotion).\nexport const promotionNames = (row: TransactionRow): string[] => {\n  const named = (row.accounts ?? []).filter((a) => a.type === 'promotion').map((a) => a.name);\n  if (named.length) return named;\n  const ids = new Set<number>();\n  (row.promotion_ids ?? []).forEach((id) => ids.add(id));\n  (row.funding?.contributions ?? []).forEach((c) => { if (c.promotion_id) ids.add(c.promotion_id); });\n  (row.entries ?? []).forEach((e) => { if (e.promotion_id) ids.add(e.promotion_id); });\n  return Array.from(ids).map((id) => `Promotion #${id}`);\n};\n\n// This account's own money movement on the transaction, signed.\nexport const netForAccount = (row: TransactionRow, accountUuid?: string): number | null => {\n  if (!accountUuid) return null;\n  const own = (row.entries ?? []).filter((e) => e.account_id === accountUuid);\n  if (!own.length) return null;\n  return cents(own.reduce((sum, e) => sum + e.amount, 0));\n};\n\n// Resolve this account's accounting UUID from the labelled hits. Every hit is\n// scoped to the account, so its label is on each; fall back to the one UUID\n// common to every hit if labels are missing.\nexport const ownAccountUuid = (rows: TransactionRow[], accountId: number): string | undefined => {\n  for (const row of rows) {\n    const label = (row.accounts ?? []).find((a) => a.type === 'account' && a.id === accountId);\n    if (label?.accounting_account_id) return label.accounting_account_id;\n  }\n  if (!rows.length) return undefined;\n  const common = rows\n    .map((r) => new Set(r.account_ids ?? []))\n    .reduce((acc, ids) => new Set(Array.from(acc).filter((id) => ids.has(id))));\n  return common.size === 1 ? Array.from(common)[0] : undefined;\n};\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\ntype ActorLabelProps = {\n  actorId?: number;\n  actor?: { type: string, id: number, name: string };\n}\n\n// Named users link to their user page; system actors and unlabelled ids stay\n// plain text.\nconst ActorLabel = ({ actorId, actor }: ActorLabelProps) => {\n  const id = actor?.id ?? actorId;\n  if (!id) return null;\n\n  if (actor?.type === 'user') {\n    return (\n      <Link\n        to={`/users/${actor.id}`}\n        target=\"_blank\"\n        className=\"entity-link text-nowrap\"\n        title={`Open user #${actor.id} in new tab`}\n      >\n        {actor.name}<FaIcon icon=\"external-link-alt\" size=\"sm\" className=\"ms-1\" />\n      </Link>\n    );\n  }\n\n  if (!actor) {\n    return <span className=\"text-muted\" title=\"Actor not known to this platform\">#{id}</span>;\n  }\n\n  return <span title={`${actor.type} #${actor.id}`}>{actor.name}</span>;\n};\n\nexport default ActorLabel;\n","import React from 'react';\nimport { Badge, Table } from 'reactstrap';\nimport NumberFormat from 'react-number-format';\nimport { TransactionRow } from './types';\nimport { accountLabels } from './rows';\n\ntype LegsTableProps = {\n  transaction: TransactionRow;\n  accountUuid?: string;\n};\n\n// Every leg of one transaction, from the doc's stored entries: complete even\n// when a leg belongs to a wallet this user cannot otherwise see (a promotion\n// pool). This account's own legs are highlighted.\nconst LegsTable = ({ transaction, accountUuid }: LegsTableProps) => {\n  const labels = accountLabels(transaction);\n  const legs = transaction.entries ?? [];\n\n  if (!legs.length) {\n    return <div className=\"text-muted p-2\">No entries stored on this transaction.</div>;\n  }\n\n  return (\n    <Table size=\"sm\" className=\"mb-0 legs-table\">\n      <thead>\n        {transaction.card && (\n          <tr>\n            <th colSpan={6} className=\"fw-normal\">\n              Card: {transaction.card.type} ····{transaction.card.last_four}\n            </th>\n          </tr>\n        )}\n        <tr>\n          <th>Seq</th>\n          <th>Account</th>\n          <th>Role</th>\n          <th>Wallet</th>\n          <th className=\"text-end\">Amount</th>\n          <th />\n        </tr>\n      </thead>\n      <tbody>\n        {legs.map((leg) => {\n          const label = labels[leg.account_id];\n          const own = accountUuid && leg.account_id === accountUuid;\n          return (\n            <tr key={leg.sequence} className={own ? 'table-active' : undefined}>\n              <td className=\"text-muted\">{leg.sequence}</td>\n              <td title={leg.account_id}>\n                {label ? label.name : <span className=\"text-muted\">unlabelled</span>}\n                {label?.type === 'promotion' && <Badge color=\"info\" className=\"ms-1\">promotion</Badge>}\n              </td>\n              <td>{leg.role ?? ''}</td>\n              <td>{leg.wallet_type ?? ''}</td>\n              <td className=\"text-end\">\n                <NumberFormat value={leg.amount} displayType=\"text\" thousandSeparator prefix=\"$\" decimalScale={2} fixedDecimalScale />\n              </td>\n              <td>{leg.reversed && <Badge color=\"danger\">reversed</Badge>}</td>\n            </tr>\n          );\n        })}\n      </tbody>\n    </Table>\n  );\n};\n\nexport default LegsTable;\n","import React, { useMemo } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Badge } from 'reactstrap';\nimport NumberFormat from 'react-number-format';\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PagedTable from '../../../../Components/Table/PagedTable';\nimport { PagedTableProps } from '../../../../types';\nimport { TransactionRow, typeLabel } from './types';\nimport {\n  auctionIdFor, buyerPaid, netForAccount, promotionNames, promotionPaid, Split,\n} from './rows';\nimport ActorLabel from './ActorLabel';\nimport LegsTable from './LegsTable';\n\ntype ActivityTableProps = PagedTableProps & {\n  accountUuid?: string;\n  allowAuction: boolean;\n};\n\nconst Money = ({ value }: { value: number }) => (\n  <NumberFormat value={value} displayType=\"text\" thousandSeparator prefix=\"$\" decimalScale={2} fixedDecimalScale />\n);\n\nconst Dash = () => <span className=\"text-muted\">&mdash;</span>;\n\n// A total with its cash/credit split underneath.\nconst SplitCell = ({ split, names }: { split: Split | null; names?: string[] }) => {\n  if (!split) return <Dash />;\n  return (\n    <div className=\"text-end\">\n      <Money value={split.total} />\n      <div className=\"small text-muted text-nowrap\">\n        cash <Money value={split.cash} /> · credit <Money value={split.credit} />\n      </div>\n      {names && names.length > 0 && <div className=\"small text-nowrap\">{names.join(', ')}</div>}\n    </div>\n  );\n};\n\nconst Table = ({ accountUuid, allowAuction, ...tableProps }: ActivityTableProps) => {\n  const columns = useMemo(() => [\n    {\n      Header: '',\n      id: 'expander',\n      disableSortBy: true,\n      width: 32,\n      Cell: ({ row }: any) => (\n        <div\n          {...row.getToggleRowExpandedProps()}\n          onClick={(e: React.MouseEvent) => { e.stopPropagation(); row.toggleRowExpanded(); }}\n          title=\"Show every leg of this transaction\"\n        >\n          <FaIcon icon={row.isExpanded ? 'chevron-circle-down' : 'chevron-circle-right'} size=\"sm\" />\n        </div>\n      ),\n    },\n    {\n      Header: 'Transaction',\n      accessor: 'transaction_id',\n      disableSortBy: true,\n      Cell: ({ value }: any) => <span className=\"font-monospace\" title={`Transaction ${value}`}>{value}</span>,\n      maxWidth: 100,\n    },\n    {\n      Header: 'Posted At',\n      accessor: 'posted_at',\n      disableSortBy: true, // server sorts posted_at desc\n      Cell: ({ value }: any) => <RelativeTime date={value} showTimezone />,\n    },\n    {\n      Header: 'Type',\n      accessor: 'type',\n      disableSortBy: true,\n      Cell: ({ row }: any) => {\n        const {\n          type, status, revision, reverses_transaction_id: reverses,\n        } = row.original as TransactionRow;\n        return (\n          <>\n            {typeLabel(type)}\n            {status === 'reverted' && <Badge color=\"danger\" className=\"ms-1\">reverted</Badge>}\n            {status === 'reverted' && revision ? <div className=\"small text-muted text-nowrap\">by {revision}</div> : null}\n            {reverses && <div className=\"small text-muted text-nowrap\">reverses {reverses}</div>}\n          </>\n        );\n      },\n    },\n    {\n      Header: 'Auction',\n      id: 'auction',\n      disableSortBy: true,\n      Cell: ({ row }: any) => {\n        const auctionId = auctionIdFor(row.original);\n        if (!auctionId) return <Dash />;\n        const short = `${auctionId.slice(0, 8)}…`;\n        return allowAuction\n          ? <Link target=\"_blank\" to={`/reports/auction/${auctionId}`} className=\"link auction-detail-link p-0\" title={auctionId}>{short}</Link>\n          : <span title={auctionId}>{short}</span>;\n      },\n      maxWidth: 110,\n    },\n    {\n      Header: 'Gross',\n      id: 'gross',\n      disableSortBy: true,\n      className: 'text-end',\n      Cell: ({ row }: any) => {\n        const r = row.original as TransactionRow;\n        return <Money value={r.funding ? r.funding.gross : r.amount_moved} />;\n      },\n      maxWidth: 100,\n    },\n    {\n      Header: 'Buyer Paid',\n      id: 'buyer_paid',\n      disableSortBy: true,\n      Cell: ({ row }: any) => <SplitCell split={buyerPaid(row.original, accountUuid)} />,\n      maxWidth: 170,\n    },\n    {\n      Header: 'Promotion Paid',\n      id: 'promotion_paid',\n      disableSortBy: true,\n      Cell: ({ row }: any) => <SplitCell split={promotionPaid(row.original)} names={promotionNames(row.original)} />,\n      maxWidth: 190,\n    },\n    {\n      Header: 'Net',\n      id: 'net',\n      disableSortBy: true,\n      className: 'text-end',\n      Cell: ({ row }: any) => {\n        const net = netForAccount(row.original, accountUuid);\n        return net === null ? <Dash /> : <span className={net < 0 ? 'text-danger' : ''}><Money value={net} /></span>;\n      },\n      maxWidth: 100,\n    },\n    {\n      Header: 'Memo',\n      accessor: 'memo',\n      disableSortBy: true,\n      Cell: ({ value }: any) => <span title={value}>{value && value.length > 60 ? `${value.slice(0, 60)}…` : value}</span>,\n    },\n    {\n      Header: 'Actor',\n      accessor: 'actor_id',\n      disableSortBy: true,\n      Cell: ({ value, row }: any) => <ActorLabel actorId={value} actor={row.original.actor} />,\n      maxWidth: 140,\n    },\n  ], [accountUuid, allowAuction]);\n\n  return (\n    <PagedTable\n      columns={columns}\n      initialState={{}}\n      className=\"account-activity-table\"\n      {...tableProps}\n      renderRowSubcomponent={(row: any) => <LegsTable transaction={row.original} accountUuid={accountUuid} />}\n      noDataMessage=\"No transactions were found\"\n    />\n  );\n};\n\nexport default Table;\n","import { zonedTimeToUtc } from 'date-fns-tz';\nimport { IncludeUnsoldHolds } from './types';\n\nexport type ActivityFilters = {\n  start_date?: Date;\n  end_date?: Date;\n  type?: string[]; // transaction types, plus the IncludeUnsoldHolds pseudo-type\n  promotion?: string; // '' | 'any' | 'none' | '<promotion id>'\n};\n\n// Query for core-api's /accounting/transactions from the tab's filter state.\n// Unsold holds (a payment secured at post and released when the auction\n// closed without that sale) are excluded by their reversal reason unless the\n// type filter includes IncludeUnsoldHolds; a returned sale is reverted for a\n// different reason and always shows.\nexport const apiParams = (\n  filters: ActivityFilters,\n  controls: { page?: number; limit?: number },\n  accountId: number,\n  timezone: string,\n): Record<string, any> => {\n  const params: Record<string, any> = {\n    account_id: accountId,\n    page: controls.page,\n    per_page: controls.limit,\n  };\n  if (filters.start_date && filters.end_date) {\n    params.after = zonedTimeToUtc(filters.start_date, timezone).toISOString();\n    params.before = zonedTimeToUtc(filters.end_date, timezone).toISOString();\n  }\n  const types = (filters.type ?? []).filter((t) => t !== IncludeUnsoldHolds);\n  if (types.length) {\n    params.type = types;\n  }\n  if (filters.promotion === 'any') {\n    params.has_promotion = true;\n  } else if (filters.promotion === 'none') {\n    params.has_promotion = false;\n  } else if (filters.promotion) {\n    params.promotion_id = filters.promotion;\n  }\n  if (!(filters.type ?? []).includes(IncludeUnsoldHolds)) {\n    params.exclude_reason = 'unsold';\n  }\n  return params;\n};\n","import React, {\n  useContext, useEffect, useMemo, useState,\n} from 'react';\nimport { endOfDay, startOfMonth } from 'date-fns';\nimport { notify } from '@thedmsgroup/mastodon-ui-components';\nimport useApi from '../../../../Hooks/useApi';\nimport usePermission from '../../../../Hooks/usePermission';\nimport usePagedTableState from '../../../../Hooks/usePagedTableState';\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport { Filter } from '../../../../Components/Table/Filter';\nimport RightDateAndControls from '../../../../Components/Table/RightDateAndControls';\nimport Table from './Table';\nimport { TransactionRow, TransactionTypeChoices, TransactionsResponse } from './types';\nimport { ownAccountUuid } from './rows';\nimport { apiParams } from './query';\n\ntype ActivityProps = {\n  accountId: number;\n  accountTimezone?: string | null;\n};\n\nconst DefaultFilters = {\n  start_date: startOfMonth(new Date()),\n  end_date: endOfDay(new Date()),\n  type: [] as string[],\n  promotion: '' as string, // '' | 'any' | 'none' | '<promotion id>'\n};\n\nconst PromotionBaseChoices = [\n  { label: 'Any promotion', value: 'any' },\n  { label: 'No promotion', value: 'none' },\n];\n\nconst DefaultControls = { limit: 25 };\n\n// Ledger activity for one account, from the read model (Elasticsearch via\n// core-api's /accounting/transactions). One row per transaction with every\n// leg available in the expander; the account's balance stays on Funds.\nconst Activity = ({ accountId, accountTimezone }: ActivityProps) => {\n  const app = useContext(AppContext);\n  const api = useApi('accounting', 'transactionsList');\n  const promotionsApi = useApi('promotions', 'options');\n  const allowAuction = usePermission('auctions.view');\n  const allowPromotions = usePermission('promotions.view');\n  const [promotionChoices, setPromotionChoices] = useState(PromotionBaseChoices);\n  // Users can have a null timezone; an empty tz makes zonedTimeToUtc return Invalid Date.\n  const timezone = accountTimezone\n    || (app.user && app.user.timezone)\n    || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n  const [rows, setRows] = useState<TransactionRow[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const { filters, setFilters, controls } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: false, useTableControls: true },\n  );\n\n  const accountUuid = useMemo(() => ownAccountUuid(rows, accountId), [rows, accountId]);\n\n  useEffect(() => {\n    if (!allowPromotions) return;\n    (async () => {\n      const options = await promotionsApi.fetch({});\n      if (Array.isArray(options)) {\n        setPromotionChoices([\n          ...PromotionBaseChoices,\n          ...options.map((p: { id: number; name: string }) => ({ label: p.name, value: String(p.id) })),\n        ]);\n      }\n    })();\n  }, [allowPromotions]);\n\n  const filterParamsToApi = () => apiParams(filters, controls, accountId, timezone);\n\n  const load = async () => {\n    setLoading(true);\n    const result: TransactionsResponse | false = await api.fetch(filterParamsToApi());\n    if (result) {\n      setRows(result.hits ?? []);\n      setPageCount(result.num_hits > controls.limit ? Math.ceil(result.num_hits / controls.limit) : 1);\n      setTotalRows(result.num_hits);\n    } else {\n      notify(`Unable to load transactions: ${api.error?.name}`, 'error');\n    }\n    setLoading(false);\n  };\n\n  useEffect(() => {\n    load();\n  }, [accountId, filters, controls.page, controls.limit]);\n\n  const handleChangeDate = (selection: any) => {\n    setFilters({ ...filters, start_date: selection.startDate, end_date: endOfDay(selection.endDate) });\n  };\n\n  const handleChangeFilter = (param: string, val: any) => {\n    if (val) {\n      setFilters({ ...filters, [param]: val });\n    } else {\n      const next = { ...filters };\n      delete next[param];\n      setFilters(next);\n    }\n  };\n\n  return (\n    <div className=\"account-activity\">\n      <div className=\"d-flex justify-content-end above-table-filters mb-2\">\n        <div className=\"ms-2 min-250\">\n          <Filter\n            label={undefined}\n            placeholder=\"Any type\"\n            param=\"type\"\n            options={TransactionTypeChoices}\n            value={filters.type || []}\n            onChange={handleChangeFilter}\n            onClear={() => handleChangeFilter('type', '')}\n            isMulti\n          />\n        </div>\n        <div className=\"ms-2 min-250\">\n          <Filter\n            label={undefined}\n            placeholder=\"Promotion\"\n            param=\"promotion\"\n            options={promotionChoices}\n            value={filters.promotion || ''}\n            onChange={handleChangeFilter}\n            onClear={() => handleChangeFilter('promotion', '')}\n          />\n        </div>\n        <RightDateAndControls\n          startDate={filters.start_date}\n          endDate={filters.end_date}\n          allowFuture={false}\n          onChangeDate={handleChangeDate}\n          onRefresh={load}\n          onReset={() => setFilters(DefaultFilters)}\n          isLoading={loading}\n          timezone={timezone}\n        />\n      </div>\n\n      <Table\n        data={rows}\n        loading={loading}\n        pageCount={pageCount}\n        totalRows={totalRows}\n        accountUuid={accountUuid}\n        allowAuction={allowAuction}\n        {...controls}\n      />\n    </div>\n  );\n};\n\nexport default Activity;\n","import React, { useState, useEffect, useContext, useMemo } from 'react';\nimport {\n  Row, Col, TabContent, TabPane, Nav,\n} from 'reactstrap';\nimport {useNavigate, useLocation, useParams, Link} from 'react-router-dom';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport { FormTabFlat } from '../../../Components/Form/FormCommon';\nimport AccountDetail from './AccountDetail';\nimport Goals from './Goals';\nimport GoalTracking from './GoalTracking';\nimport ReturnTracking from './ReturnTracking';\nimport Funds from './Accounting/Funds';\nimport Activity from './Activity';\nimport PageSection from '../../../Layout/PageSection';\nimport usePermission from '../../../Hooks/usePermission';\nimport DocTitle from '../../../Layout/DocTitle';\nimport Breadcrumbs from '../../../Layout/Breadcrumbs';\nimport { AppContext } from '../../../Providers/AppProvider';\n//import AccountBreadcrumb from \"../AccountBreadcrumb\";\nimport useQueryState from \"../../../Hooks/useQueryState\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\ntype Account = {\n  id: number;\n  name: string;\n  account_id?: number;\n  timezone?: string;\n  dba?: { id: number; name?: string } | null;\n  buyer_contact_display?: string | null;\n  buyer_contact_display_enabled?: boolean;\n  compliance_buyer_notifications?: string | null;\n  account_executive?: { id: number; name: string } | null;\n};\n\n/*\nComponent with form for editing/creating an Account\n */\nconst AccountSettings = () => {\n\n  const app = useContext(AppContext);\n  const [query, setQuery] = useQueryState({}, {historyAction:\"push\"});\n  const { accountId } = useParams();\n  const location = useLocation();\n  const navigate = useNavigate();\n  const isNew = location.pathname.indexOf('create') > 0;\n  const allowView = usePermission('accounts.view');\n  const allowEdit = usePermission('accounts.edit');\n  const allowCreate = usePermission('accounts.create');\n  const allowAccounting = usePermission('accounting.view');\n  const [activeTab, setActiveTab] = useState(query.tab ?? 'details');\n  const [account, setAccount] = useState<Account | null>(null);\n  // Capture the accounts page search string on mount (before tab changes clear location.state)\n  const [accountsSearch] = useState(() => location.state?.search ?? '');\n\n  const {notifyChange} = useChangeTimeline({\n    entityTypes: ['account'],\n    entity: account?.id ? { id: account.id, name: account.name ?? '', type: 'account' } : undefined,\n    enabled: !isNew,\n  });\n  //const [goals, setGoals] = useState([]);\n\n\n  useEffect(() => {\n    if (!allowView) {\n      navigate({ pathname: '/accounts', search: accountsSearch });\n    } else {\n      load();\n    }\n  }, []);\n\n  useEffect(() => {\n    if (query.tab && query.tab !== activeTab) {\n      handleSelectTab(query.tab);\n    }\n  }, [query]);\n\n\n  const handleSelectTab = (tab: string) => {\n    if (tab !== activeTab) {\n      setActiveTab(tab)\n      setQuery({tab})\n    }\n\n  };\n\n  const handleSaveDetails = (values: Record<string, unknown>) => saveDetails(values);\n\n  const load = async () => {\n    if (isNew) {\n      app.showLoader(false);\n      setAccount({ id: 0, name: '' });\n      return;\n    }\n    app.showLoader(true);\n    const result = await app.api.endpoints.accounts.show(accountId);\n\n    if (result === false) {\n      notify(`Unable to load account:${app.api.error.name}`, 'error');\n      return;\n    }\n\n    result.account_id = result.id;\n\n    // TODO: serializer might not include value if null\n\n    setAccount(result);\n\n    app.showLoader(false);\n  };\n\n  const saveDetails = async (values: Record<string, unknown>) => {\n    app.showLoader('main', 'Saving Account...');\n\n    const acc: Record<string, unknown> = { ...values };\n\n    // Empty-string select values clear the relation on the server.\n    acc.account_executive_id = values.account_executive_id\n      ? parseInt(values.account_executive_id as string, 10)\n      : '';\n\n    // Server's CheckboxType expects \"1\"/\"\" — boolean false would coerce to \"false\".\n    acc.buyer_contact_display_enabled = values.buyer_contact_display_enabled ? '1' : '';\n\n    let result = null;\n    if (isNew) {\n      // Use the selected parent from the form, or default to user's account\n      acc.parent_id = values.parent_id\n        ? parseInt(values.parent_id as string, 10)\n        : app.account_id;\n      if (acc.parent_id) {\n        result = await app.api.endpoints.accounts.create(acc);\n      } else {\n        notify('Unable to save account: unknown parent account', 'error');\n      }\n    } else {\n      acc.id = account!.id;\n      // Only include parent_id if a valid parent was selected (non-empty value)\n      if (values.parent_id) {\n        acc.parent_id = parseInt(values.parent_id as string, 10);\n      }\n      result = await app.api.endpoints.accounts.update(acc);\n    }\n\n    app.showLoader(false);\n\n    if (!result) {\n      notify(`Unable to save account: ${app.api.error.name}`, 'error');\n    } else if (isNew) {\n      notify('The account was created', 'success');\n      navigate(`/accounts/${result.id}/settings`, { replace: true, state: { search: accountsSearch } });\n\n    } else {\n      setAccount(result);\n      notify('The account settings were saved', 'success');\n      notifyChange();\n    }\n  };\n\n  const title = isNew ? 'Create Account' : 'Account Settings';\n\n  const crumbs = useMemo(() => {\n    const accountsLink = {\n      pathname: '/accounts',\n      search: accountsSearch,\n    };\n    if (isNew) {\n      return [\n        { label: 'Accounts & Orders', to: accountsLink },\n        { label: 'Create Account' },\n      ];\n    }\n    if (account?.id) {\n      return [\n        { label: 'Accounts & Orders', to: accountsLink },\n        { label: account.name },\n        { label: 'Settings' },\n      ];\n    }\n    return [];\n  }, [account, isNew, accountsSearch]);\n\n  if (!account) return null;\n\n  // No permission to create\n  if (isNew && !allowCreate) {\n    return (\n      <PageSection title={title}>\n        <StandardAlert color=\"light\">\n          You do not have permission to create an account.\n          {' '}\n          <Link to={{ pathname: '/accounts', search: accountsSearch }}>Return to Accounts</Link>\n        </StandardAlert>\n      </PageSection>\n    );\n  }\n\n  return (\n    <>\n      <Breadcrumbs crumbs={crumbs} />\n\n      <PageSection\n        title={title}\n        subtitle={account.name ?? ''}\n        className=\"account-settings\"\n      >\n        <DocTitle pageTitle={`${title} ${account?.name ?? ''} - ${activeTab}`} />\n        {!isNew && (\n          <Nav className=\"mastodon-tabs\">\n            <FormTabFlat\n              id=\"details\"\n              label=\"Details\"\n              activeTab={activeTab}\n              setActive={handleSelectTab}\n            />\n\n            <FormTabFlat\n              id=\"goals\"\n              label=\"Goals\"\n              activeTab={activeTab}\n              setActive={handleSelectTab}\n            />\n\n            {allowEdit && (\n              <FormTabFlat\n                id=\"goal_tracking\"\n                label=\"Goal Tracking\"\n                activeTab={activeTab}\n                setActive={handleSelectTab}\n              />\n            )}\n\n            {allowEdit && (\n              <FormTabFlat\n                id=\"return_tracking\"\n                label=\"Return Tracking\"\n                activeTab={activeTab}\n                setActive={handleSelectTab}\n              />\n            )}\n\n            {allowAccounting  && (\n              <FormTabFlat\n                id=\"funds\"\n                label=\"Funds\"\n                activeTab={activeTab}\n                setActive={handleSelectTab}\n              />\n            )}\n\n            {allowAccounting  && (\n              <FormTabFlat\n                id=\"activity\"\n                label=\"Activity\"\n                activeTab={activeTab}\n                setActive={handleSelectTab}\n              />\n            )}\n\n          </Nav>\n        )}\n\n\n        <TabContent activeTab={activeTab}>\n          <TabPane tabId=\"details\">\n\n            <Row>\n              <Col sm={12} md={4}>\n                {account && <AccountDetail account={account} onSave={handleSaveDetails} accountsSearch={accountsSearch} readOnly={!allowEdit && !isNew} />}\n              </Col>\n            </Row>\n          </TabPane>\n\n          { !isNew\n          && (\n            <>\n              <TabPane tabId=\"goals\">\n                <Goals accountId={accountId} />\n              </TabPane>\n\n              {allowEdit && (\n                <TabPane tabId=\"goal_tracking\">\n                  <GoalTracking accountId={accountId} />\n                </TabPane>\n              )}\n\n              {allowEdit && (\n                <TabPane tabId=\"return_tracking\">\n                  <ReturnTracking accountId={accountId} />\n                </TabPane>\n              )}\n\n              {allowAccounting  && (\n                <TabPane tabId=\"funds\">\n                  <Funds accountId={account.id} accountTimezone={account.timezone} />\n                </TabPane>\n              )}\n\n              {allowAccounting  && (\n                <TabPane tabId=\"activity\">\n                  {activeTab === 'activity' && <Activity accountId={account.id} accountTimezone={account.timezone} />}\n                </TabPane>\n              )}\n\n            </>\n          )}\n        </TabContent>\n      </PageSection>\n    </>\n\n  );\n};\n\nAccountSettings.displayName = 'Account';\n\n\n\nexport default AccountSettings;\n","import React from 'react';\nimport ContentLoader from 'react-content-loader';\n\n/*\n * https://github.com/danilowoz/create-content-loader/blob/master/src/Gallery/insertYourLoaderHere/Gmail.js\n */\nconst TreeSkeleton = (props) => (\n  <ContentLoader\n    height={500}\n    width=\"100%\"\n    speed={0.8}\n    {...props}\n  >\n    <rect x=\"10\" y=\"20\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"30\" y=\"60\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"30\" y=\"100\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"10\" y=\"140\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"10\" y=\"180\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"30\" y=\"220\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"30\" y=\"260\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"30\" y=\"300\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"10\" y=\"340\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"30\" y=\"380\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n    <rect x=\"30\" y=\"420\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"30\" />\n\n  </ContentLoader>\n);\n\nTreeSkeleton.metadata = {\n  name: 'Caio Davi',\n  github: 'caio-davi',\n  description: 'Rules Manager Skeleton',\n  filename: 'RulesManagerSkeleton',\n};\n\nexport default TreeSkeleton;\n","import React, { useContext, useEffect, useState, useRef, useMemo} from 'react';\nimport PropTypes from 'prop-types';\nimport { useDebouncedCallback } from 'use-debounce';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Button } from 'reactstrap';\nimport { TreeContext } from '../../../Components/Rules/TreeProvider';\nimport PageSection from '../../../Layout/PageSection';\nimport TreeBranch from '../../../Components/Rules/TreeBranch';\nimport InputWithIcon from '../../../Components/Form/InputWithIcon';\nimport TreeSkeleton from './TreeSkeleton';\nimport SimpleSelect from '../../../Components/Form/SimpleSelect';\nimport usePermission from '../../../Hooks/usePermission';\nimport {singularOrPlural} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport Sticky from \"react-stickynode\";\n\n\n/*\n * Component for sidebar tree view. Renders root branch, which recurses for all sub-branches.\n * Has text input for searching the tree.\n */\nconst RuleTree = ({\n  rule,\n  selectedRule,\n  ancestors,\n  ruleComponent,\n  isLoading,\n}) => {\n  const treeContext = useContext(TreeContext)\n  const containerRef = useRef()\n  const scrollRef = useRef()\n  const [treeHeight, setTreeHeight] = useState('100%')\n  const [scrollPosition, setScrollPosition] = useState(0)\n  const allowIntegration = usePermission('integrations.edit')\n  const allowAdvanced = usePermission('rules_advanced.edit')\n\n\n  // The tree can get much taller than the form area, which mean that without adjustments,\n  // there can be a lot of vertical ups and downs if you're clicking on a rule at the bottom\n  // of the tree then going back up to the form, then back down.\n  // To alleviate this:\n  // 1) contain the tree in a scrollable div,\n  // 2) Automatically adjust the height so it stretches to the bottom of the viewport.\n  // 3) Make the top of the container sticky, so it doesn't scroll out of view\n  const updateTreeHeight = () => {\n    if (containerRef.current) {\n      const containerRect = containerRef.current.getBoundingClientRect()\n      const top = Math.max(containerRect.top, 60);\n      const height = (window.innerHeight - top - 70)\n\n      setTreeHeight( Math.max(height, 200) + 'px')\n    }\n  }\n\n  const handleStickyStateChange = (status) => {\n    if (status.status === Sticky.STATUS_FIXED) {\n      updateTreeHeight()\n    }\n  };\n\n  const handleScroll = (e) => {\n    setScrollPosition(e.target.scrollTop)\n  }\n\n\n  useEffect(()=> {\n    updateTreeHeight();\n    window.addEventListener('scroll', updateTreeHeight)\n    window.addEventListener('resize', updateTreeHeight)\n\n    // clean up events on unmount\n    return () => window.removeEventListener('scroll', updateTreeHeight)\n    return () => window.removeEventListener('resize', updateTreeHeight)\n  }, [containerRef.current, rule])\n\n  //restore scroll position after re-load\n  useEffect(()=> {\n\n    if (!isLoading && scrollRef.current && scrollPosition > 0) {\n      //localize scope for timeout\n      const currentPos = scrollPosition\n      const element = scrollRef.current\n      setTimeout(() => {\n          element.scroll({top:currentPos,behavior:'auto'});\n      }, (300));\n    }\n\n  }, [isLoading])\n\n\n\n\n  const filterOptions = useMemo(() => {\n    let options = [\n      { value: 'schedule', label: 'Activation Schedule' },\n      { value: 'ads', label: 'Ads' },\n      { value: 'bid_blocked', label: 'Bid Blocked' },\n      { value: 'bid_schedule', label: 'Bid Schedule (hourly)' },\n      { value: 'bid_exclusivity', label: 'Bid Exclusivity' },\n      { value: 'billable_duration', label: 'Billable Duration' },\n      { value: 'budget', label: 'Budget/Caps' }, // advertiser rules, budget & caps\n      { value: 'channel_modifiers', label: 'Channel Modifiers' },\n      { value: 'datasheets', label: 'Datasheets' },\n      { value: 'dba', label: 'DBA designation' },\n      { value: 'destination_number', label: 'Destination Phone Number' },\n      { value: 'disabled', label: 'Disabled status' },\n      { value: 'prefill', label: 'Prefill' },\n      { value: 'match_is_required', label: 'Match Required' },\n      { value: 'post_sale', label: 'Post-sale integrations' },\n      { value: 'proxy_bidding', label: 'Proxy Bidding' },\n      { value: 'sale_conditions', label: 'Sale Conditions' },\n      { value: 'is_standalone', label: 'Standalone' },\n      { value: 'tags', label: 'Tags' },\n      { value: 'match_conditions', label: 'Targets' },\n      { value: 'tracking', label: 'Tracking' },\n      { value: 'advanced', label: 'Advanced rule settings' },\n    ];\n\n    // Filter out options based on product or permissions\n    // Note: memo dependent on isLoading because order (which has product) might not have loaded yet\n    options = allowIntegration ? options : options.filter((opt) => opt.value !== 'post_sale' && opt.value !== 'prefill' && opt.value !== 'proxy_bidding');\n    options = allowAdvanced ? options : options.filter(opt => !['advanced','dba'].includes(opt.value) );\n    options = treeContext.product === 'calls' ? options : options.filter((opt) => opt.value !== 'billable_duration' && opt.value !== 'destination_number');\n    return options;\n  }, [isLoading]);\n\n  const searchResult = treeContext.getMatches(rule);\n\n  const handleSearchDebounced = useDebouncedCallback((val) => {\n    treeContext.setSearch(val);\n  }, 400);\n\n  return (\n\n    <div className=\"col-rule-tree\" id=\"col-rule-tree\">\n      <Sticky enabled={true} top={60} onStateChange={handleStickyStateChange}>\n      <PageSection title=\"Rules Tree\">\n        <div ref={containerRef}  style={{height:treeHeight}} className=\"d-flex flex-column\">\n        {(isLoading || !rule) ? (\n          <TreeSkeleton />\n        ) : (\n          <>\n            {rule.rules.length > 0\n                && (\n                <>\n                  <div>\n\n                    <InputWithIcon\n                      icon=\"search\"\n                      iconSize=\"sm\"\n                      placeholder=\"Search by name\"\n                      name=\"search_term\"\n                      containerClass=\"expands\"\n                      defaultValue=\"\"\n                      onChange={(e) => handleSearchDebounced(e.target.value)}\n                      onClear={treeContext.clearSearch}\n                      className=\"mb-2\"\n                    />\n\n                  </div>\n\n                  <div className=\"mb-2\">\n\n                    <SimpleSelect\n                      isClearable\n                      isSearchable\n                      onChange={treeContext.setFilter}\n                      options={filterOptions}\n                      value={treeContext.filter}\n                      tabSelectsValue\n                      backspaceRemovesValue\n                      isMulti={false}\n                      controlShouldRenderValue\n                      hideSelectedOptions={false}\n                      closeMenuOnSelect\n                      placeholder=\"Rules with...\"\n                    />\n\n                  </div>\n\n                  <div className=\"text-end\">\n                    <Button className=\"inline\" color=\"link\" size=\"sm\" onClick={treeContext.expandAll} title=\"Expand All\">\n                      <FaIcon icon=\"expand-arrows-alt\" size=\"sm\" />\n                    </Button>\n                    <Button className=\"inline ms-1\" color=\"link\" size=\"sm\" onClick={treeContext.collapse} title=\"Collapse\">\n                      <FaIcon icon=\"compress-arrows-alt\" size=\"sm\" />\n                    </Button>\n                  </div>\n\n                </>\n                )}\n\n            {treeContext.isFiltered && (\n            <div className=\"filter-result d-flex justify-content-between align-items-center\">\n              <div>\n                Search Result:\n                {' '}\n                {treeContext.filteredResultCount || 'no'}\n                {' '}\n                {singularOrPlural(treeContext.filteredResultCount, 'rule', 'rules')}\n                {' '}\n                found\n              </div>\n              <Button size=\"sm\" color=\"link\" onClick={treeContext.clearSearch}><FaIcon icon=\"times\" size=\"sm\" /></Button>\n            </div>\n            )}\n\n            <div className=\"tree-scrollable flex-fill\" ref={scrollRef} onScroll={handleScroll}>\n              <TreeBranch\n                rule={searchResult}\n                selectedRule={selectedRule}\n                ancestors={ancestors}\n                //expandedRules={expandedRules}\n                ruleComponent={ruleComponent}\n                level={0}\n              />\n\n            </div>\n\n          </>\n        )}\n        </div>\n      </PageSection>\n     </Sticky>\n    </div>\n\n  );\n};\n\nRuleTree.propTypes = {\n  rule: PropTypes.object,\n  ruleComponent: PropTypes.func.isRequired,\n  selectedRule: PropTypes.object,\n  ancestors: PropTypes.array,\n  isLoading: PropTypes.bool,\n};\n\nRuleTree.defaultProps = {\n  selectedRule: null,\n  ancestors: [],\n};\n\nexport default RuleTree;\n","import React, {\n  useRef, useEffect, useState, useContext,\n} from 'react';\nimport { Input } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { useDebouncedCallback } from 'use-debounce';\nimport { TreeContext } from '../../../Components/Rules/TreeProvider';\nimport RulesContext from '../../../Providers/RulesContext';\n\nconst numberFormat = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });\n\nconst makeNumeric = (bid) => (bid ? Number(bid.toString().replace(/[^0-9\\.]/, '')) : 0);\n\n/*\n * Input for editing bid directly in the rule tree.\n * We only assign modifier, absolute, or block (not pass)\n */\nconst BidEdit = ({\n  rule, type, absolute_bid, bid_modifier, exclusivity, setBidEditMode, onBidDelta, onBidWarning,\n}) => {\n  const rulesContext = useContext(RulesContext)\n  const treeContext = useContext(TreeContext)\n\n  // Save original values for comparison\n  const [originalBidType] = useState(type)\n  const [originalAbsoluteBid] = useState(makeNumeric(absolute_bid))\n  const [originalBidModifier] = useState(makeNumeric(bid_modifier))\n\n  // newBid: the string that the user enters, maybe contain % or $\n  const [newBid, setNewBid] = useState(getFormattedBid(type, absolute_bid, bid_modifier))\n  // derived value based on newBid or original bid type\n  const [newType, setNewType] = useState(type)\n\n  const inputEl = useRef(null)\n\n  const updateBid = async () => {\n    treeContext.setCurrentBidUpdating(rule.id)\n    // const result = await rulesContext.api.updateBid(rule, makeNumeric(newBid), newType)\n\n    const result = await rulesContext.api.updateRule(\n      {\n        bidding: {\n          type: newType,\n          bid_modifier: newType === 'modifier' ? makeNumeric(newBid) : '',\n          absolute_bid: newType === 'absolute' ? makeNumeric(newBid) : '',\n        },\n      },\n      rule,\n      true,\n    )\n    treeContext.setCurrentBidUpdating(0)\n    if (!result) {\n      console.log('BidEdit.js:Could not update bid', newBid, result)\n    }\n  };\n\n  const postChangeBid = () => {\n    if (!isBidChanged()) {\n      onBidDelta(null)\n      onBidWarning(null)\n    } else {\n      let bid = makeNumeric(newBid);\n\n      if (newType === 'modifier') {\n        bid = parseInt(bid)\n\n        if (bid === 100) {\n          onBidWarning('Unmodified')\n        } else if (bid) {\n          // only delta if type has not changed\n          if (originalBidType === 'modifier') {\n            onBidDelta({ newValue: bid, oldValue: parseFloat(originalBidModifier) });\n          } else {\n            onBidDelta(null)\n          }\n          onBidWarning(null)\n        }\n      } else if (newType === 'absolute') {\n        bid = parseFloat(bid)\n        if (bid === 0) {\n          onBidWarning('Bid disabled')\n        } else {\n          // only delta if type has not changed\n          if (originalBidType === 'absolute') {\n            onBidDelta({ newValue: bid, oldValue: parseFloat(originalAbsoluteBid) })\n          } else {\n            onBidDelta(null)\n          }\n\n          onBidWarning(null);\n        }\n      } else {\n        onBidDelta(null);\n        if (newType === 'block') {\n          onBidWarning('Bidding blocked')\n        } else if (newType === 'pass') {\n          onBidWarning('No bid')\n        }\n      }\n    }\n\n    // onBidWarning(warning);\n  };\n\n  const isBidChanged = () => {\n    // console.log('BidEdit.js:isBidChanged, types: from ', originalBidType, ' to:' + newType);\n    if (newType === originalBidType) {\n      const newBidNum = makeNumeric(newBid)\n      // let oldBidNum;\n      if (newType === 'modifier') {\n        return (parseInt(newBidNum) !== parseInt(originalBidModifier))\n      } if (newType === 'absolute') {\n        return (parseFloat(newBidNum) !== parseFloat(originalAbsoluteBid))\n      }\n      // still blocked\n      return false\n    }\n\n    return true;\n  };\n\n  const handleChangeDebounced = useDebouncedCallback((bid) => {\n    const type = deriveType(bid);\n\n    if (type) {\n      if (exclusivity === 'optional' && type === 'absolute') {\n        // Optionally exclusive bid can only be modifier. Revert to modifier value.\n        setNewType('modifier')\n        setNewBid(bid_modifier)\n        inputEl.current.value = getFormattedBid('modifier', absolute_bid, bid_modifier)\n        return\n      }\n\n      setNewType(type);\n    }\n\n    if (type === 'modifier') {\n      if (bid && parseInt(bid) > 500) {\n        bid = '500%'\n        inputEl.current.value = bid\n      }\n    } else if (type === 'absolute') {\n      if (bid && parseFloat(bid.replace('$', '')) > 200) {\n        bid = '$200'\n        inputEl.current.value = bid\n      }\n    } else if (isNaN(bid)) {\n      bid = ''\n      inputEl.current.value = bid\n    }\n\n    // console.log('BidEdit.js:onChange setting new bid: ', bid, ' of type:'+type);\n    setNewBid(bid);\n  }, 400);\n\n  const deriveType = (bid) => {\n    if (bid === '') {\n      return 'block'\n    } if (bid.indexOf('%') >= 0) {\n      return 'modifier'\n    } if (parseFloat(bid) === 0) {\n      // parseFloat, allow for testing 0.nn\n      return 'pass'\n    } if (bid.indexOf('$') >= 0 || /\\d{0,}\\.\\d+/.test(bid) || bid === '.') {\n      // has dollar sign or n.nn, 0.nn, .nn\n      // Or has started bid of less than $ by typing '.'\n      return 'absolute'\n    } if (isNaN(bid)) {\n      return ''\n    }\n\n    return originalBidType !== 'block' ? originalBidType : 'absolute';\n  };\n\n  const handleBlur = () => setBidEditMode(false)\n\n  const keyHandler = (event) => {\n\n    if (event.key === 'Enter' || event.key === 'Tab' || (event.shiftKey && event.key === 'Tab')) {\n      if (isBidChanged()) {\n        updateBid()\n      }\n\n      setBidEditMode(false)\n    } else if (event.key === 'Escape' || event.key === 'Esc') {\n      setBidEditMode(false)\n    }\n  };\n\n  // Focus on mount\n  useEffect(() => {\n    if (inputEl.current) {\n      inputEl.current.select()\n    }\n  }, [])\n\n  // Key listeners on mount\n  useEffect(() => {\n    if (inputEl.current) {\n      inputEl.current.addEventListener('keydown', keyHandler)\n    }\n\n    // unmount\n    return () => {\n      if (inputEl.current) {\n        inputEl.current.removeEventListener('keydown', keyHandler)\n      }\n\n    };\n  }); /* <- no dependency array, to enclose most recent state */\n\n  // Report bid changes to parent\n  useEffect(() => {\n    postChangeBid()\n  }, [newBid])\n\n  return (\n    <div className=\"d-flex flex-column justify-content-end align-items-end\">\n\n      <div className=\"rule-bid-input\">\n\n        <Input\n          type=\"text\"\n          innerRef={inputEl}\n          size=\"sm\"\n          className=\"teeny\"\n          defaultValue={newBid}\n          onChange={(e) => handleChangeDebounced(e.target.value)}\n          onBlur={handleBlur}\n          maxLength={6}\n        />\n\n        {/* Using MaskedInput. You need to refer to the input ref like this: inputEl.current.inputElement.\n              Hard to make this work for both $1.00 and 100%\n          */}\n        {/* <MaskedInput\n            mask={bidMask}\n            defaultValue={bid}\n            ref={inputEl}\n            onBlur={handleBlur}\n            render={(maskRef,props) => {\n              return (\n                  <Input\n                    type=\"text\"\n                    innerRef={maskRef}\n                    size=\"sm\"\n                    className=\"tiny\"\n                    {...props}\n                  />\n                )\n\n            }}\n            /> */}\n\n      </div>\n\n    </div>\n  );\n};\n\nconst getFormattedBid = (type, absolute_bid, bid_modifier) => {\n  let bid = '';\n  if (type === 'absolute') {\n    if (absolute_bid && !isNaN(absolute_bid)) {\n      bid = numberFormat.format(parseFloat(absolute_bid));\n    } else {\n      bid = absolute_bid;\n    }\n  } else if (type === 'modifier') {\n    if (bid_modifier && !isNaN(bid_modifier) && parseInt(bid_modifier) !== 0) {\n      bid = `${bid_modifier}%`;\n    } else {\n      bid = bid_modifier;\n    }\n  } else if (type === 'block') {\n    bid = '';\n  } else if (type === 'pass') {\n    bid = '0';\n  }\n\n  return bid;\n};\n\nBidEdit.propTypes = {\n  rule: PropTypes.object.isRequired,\n  type: PropTypes.string.isRequired,\n  absolute_bid: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  bid_modifier: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  exclusivity: PropTypes.string,\n  setBidEditMode: PropTypes.func,\n  onBidDelta: PropTypes.func,\n  onBidWarning: PropTypes.func,\n};\n\nBidEdit.defaultProps = {\n  type: 'pass',\n  absolute_bid: '',\n  bid_modifier: '',\n};\n\nexport default BidEdit;\n","import React, { useState, useContext, useEffect } from 'react';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {faMale} from '@fortawesome/free-solid-svg-icons';\nimport RulesContext from '../../../Providers/RulesContext';\nimport { TreeContext } from '../../../Components/Rules/TreeProvider';\nimport BidDisplay from '../../../Components/Rules/BidDisplay';\nimport BidEdit from './BidEdit';\nimport RuleIcons from '../../../Components/Rules/RuleIcons';\nimport ValueDeltaDisplay from '../../../Components/ValueDeltaDisplay';\nimport { AdvertiserIconSet } from '../../../Components/Rules/constants';\nimport {UncontrolledTooltip} from \"reactstrap\";\n\n/**\n * Component for one rule in an advertiser (order) rules tree branch\n */\nconst TreeRule = ({\n  rule, level, expanded, parentDisabled,\n}) => {\n  const rulesContext = useContext(RulesContext)\n  const treeContext = useContext(TreeContext)\n  const [bidEditMode, setBidEditMode] = useState(false)\n  const [bidDelta, setBidDelta] = useState(null)\n  const [bidWarning, setBidWarning] = useState(null)\n\n  const handleBidClick = (e) => {\n    e.stopPropagation()\n    if (rulesContext.allowEdit) {\n      treeContext.setCurrentBidEdit(rule.id)\n      setBidEditMode(true)\n    }\n\n  };\n\n  // If context tells us that rule focus has changed, set the bid edit mode if we are on this rule\n  //  (allows tabbing from rule to rule while in edit mode)\n  useEffect(() => {\n    if (rulesContext.allowEdit && treeContext.currentBidEdit === rule.id) {\n      setBidEditMode(true)\n    }\n  }, [treeContext.currentBidEdit])\n\n  const isSelected = rulesContext.selectedRule && rule.id === rulesContext.selectedRule.id\n  const isDisabled = rule.disabled || parentDisabled\n\n  return (\n    <div className={classnames(['tree-leaf', { root: level === 0 }])} id={`rule-${rule.id}`}>\n\n      <div\n        className={classnames('rule', {\n          'is-match': rule.isMatch,\n          'is-not-match': treeContext.isFiltered && !rule.isMatch,\n          'is-selected': isSelected,\n          'is-folder': rule.rules.length,\n          disabled: isDisabled,\n          'is-standalone': rule.is_standalone,\n        })}\n        onClick={() => rulesContext.api.setSelected(rule)}\n      >\n        {rule.is_standalone && (\n          <>\n            <FaIcon icon={faMale} size=\"sm\" className=\"icon-standalone\" id={`tip-standalone-rule-${rule.id}`}/>\n            <UncontrolledTooltip target={`tip-standalone-rule-${rule.id}`}>\n              Standalone Rule: does not affect sibling rules\n            </UncontrolledTooltip>\n          </>\n\n        )}\n\n        {/* First bid row, shows label, attributes, and bid (or in edit mode, shows label and bid entry) */}\n        {/* Use of flex-fill and flex-wrap to handle long labels */}\n        <div className=\"d-flex flex-wrap\">\n          <div className=\"d-flex icon-and-label flex-fill\">\n\n\n            {isDisabled && <FaIcon size=\"sm\" icon=\"ban\" className=\"icon-disabled me-1\" title=\"Rule disabled\" />}\n\n            <div className=\"rule-tree-label flex-fill\" id={`tip-standalone-rule-${rule.id}`}>\n              {rule.label}\n              {!expanded && rule.rules.length > 0 && (\n                <span className=\"child-count ms-1\">\n                  ({rule.rules.length})\n                </span>\n              )}\n            </div>\n\n\n\n          </div>\n\n          <div className=\"d-flex ms-auto attributes-and-bid\">\n            {bidEditMode === false && <RuleIcons size=\"sm\" rule={rule} product={treeContext.product} iconSet={AdvertiserIconSet} />}\n\n            {bidEditMode === false && rule.bidding\n                  && <BidDisplay ruleId={rule.id} {...rule.bidding} exclusivity={rule.exclusivity} clickHandler={handleBidClick} />}\n\n            {bidEditMode === true && (\n            <BidEdit\n              rule={rule}\n              {...rule.bidding}\n              exclusivity={rule.exclusivity}\n              setBidEditMode={setBidEditMode}\n              onBidDelta={setBidDelta}\n              onBidWarning={setBidWarning}\n            />\n            )}\n          </div>\n        </div>\n\n        {/* Second row only for bid editing, shows warnings or delta */}\n        {bidEditMode === true && (\n        <>\n\n          <ExclusiveStarMessage exclusivity={rule.exclusivity} />\n\n          <div className=\"d-flex justify-content-between mt-2\">\n\n            <div className=\"bid-edit-help flex-fill\">\n              <small>ENTER/Tab=submit, ESC=cancel</small>\n            </div>\n\n            <div className=\"bid-warning\">\n              {bidWarning ? (\n                <span>{bidWarning}</span>\n              ) : (\n                <>\n                  {bidDelta && (\n                  <span>\n                    Bid change: <ValueDeltaDisplay {...bidDelta} threshold={1000} />\n                  </span>\n                  )}\n                </>\n              )}\n            </div>\n          </div>\n        </>\n\n        )}\n\n\n      </div>\n\n    </div>\n  );\n};\n\nconst ExclusiveStarMessage = React.memo(({ exclusivity }) => {\n  if (!exclusivity) return null;\n  return (\n    <div className=\"exclusive-warning\">\n      <FaIcon icon=\"star\" size=\"sm\" className={classnames(['exclusive-star', 'me-1', { optional: exclusivity === 'optional' }])} />\n      {exclusivity === 'optional' && <b>Optionally exclusive bidding (bid must be modifier)</b>}\n      {exclusivity === 'strict' && <b>Exclusive bidding only</b>}\n    </div>\n  );\n});\n\nTreeRule.propTypes = {\n  rule: PropTypes.object,\n  level: PropTypes.number,\n  expanded: PropTypes.bool,\n  setExpanded: PropTypes.func,\n  parentDisabled: PropTypes.bool,\n};\n\nTreeRule.defaultProps = {\n  expanded: true,\n};\n\nexport default TreeRule;\n","import React, {\n  useContext, useState, useEffect, useRef,\n} from 'react';\nimport {\n  Button,\n  Form, FormFeedback,\n  FormGroup, Input,\n  Spinner,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { useDebouncedCallback } from 'use-debounce';\nimport PropTypes from 'prop-types';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport usePermission from \"../../../../Hooks/usePermission\";\n\n/*\n * Header area at top of rule config section, has rule name and operations like copy & move\n */\nconst Header = ({ rule, onChange, errors, isUpdating }) => {\n  const rulesContext = useContext(RulesContext)\n  const [label, setLabel] = useState(rule.label)\n  const [isLabelUpdating, setIsLabelUpdating] = useState(false)\n  const [labelEditMode, setLabelEditMode] = useState(!!rule.isNew)\n  const labelInputRef = useRef(null)\n  const allowEdit = usePermission('orders.edit')\n  const allowViewChangeLog = usePermission('changes.view')\n\n  const handleUpdateLabelClick = async () => {\n    setIsLabelUpdating(true)\n    // await updateLabel(label); //updates label and saves rule independent of other rule values\n    const result = await rulesContext.api.updateRule({ label }); // updates label and saves rule independent of other rule values\n    if (result) {\n      onChange('label', label); // update form state\n      rulesContext.api.refreshRules()\n      setIsLabelUpdating(false)\n      setLabelEditMode(false)\n    }\n  };\n\n  const handleChangeLabel = useDebouncedCallback((value) => {\n    onChange('label', value);\n  }, 400);\n\n  // Focus on label input when in label edit mode\n  useEffect(() => {\n    if (labelEditMode === true && labelInputRef.current) {\n      labelInputRef.current.select()\n    }\n  }, [labelEditMode]);\n\n  // For when we use the paste function to paste settings into a new rule, update label\n  useEffect(() => {\n    if (rule.isNew && labelInputRef.current) {\n      labelInputRef.current.value = rule.label\n    }\n  }, [rule.label])\n\n  if (!rule) return (null);\n\n  return (\n    <div className=\"rule-header\">\n      {labelEditMode === false && (\n        <div className=\"rule-name\">\n          <h5>\n            <span className=\"card-title\">RULE:</span>\n            {' '}\n            <span className=\"subtitle\">\n              {rule.label}\n              {' '}\n            </span>\n\n            {allowEdit && (\n              <Button\n                color=\"link\"\n                className=\"inline ms-1\"\n                onClick={() => setLabelEditMode(true)}\n                size=\"sm\"\n                title=\"Edit rule label\"\n                disabled={isUpdating}\n              >\n                <FaIcon icon=\"pencil-alt\" size=\"sm\" />\n              </Button>\n            )}\n\n          </h5>\n        </div>\n      )}\n\n      {/* If rule is new, show validated name field */}\n      {rule.isNew === true && (\n        <div className=\"rule-name label-edit\">\n          <FormGroup inline>\n            {/* <Label>Rule Name <Required/> </Label> */}\n\n            <Input\n              type=\"text\"\n              name=\"label\"\n              size=\"25\"\n              defaultValue={rule.label}\n              onChange={(e) => handleChangeLabel(e.target.value)}\n              innerRef={labelInputRef}\n              invalid={!!errors.label}\n            />\n            <FormFeedback>{errors.label}</FormFeedback>\n\n          </FormGroup>\n\n        </div>\n      )}\n\n      {/* Synchronous editing of name (saves the new name on clicking check button, independent of other edits). Toolbar is hidden. */}\n      {labelEditMode === true && allowEdit && !rule.isNew && (\n        <div className=\"rule-name label-edit mb-2\">\n          <Form >\n            <div className=\"d-flex align-items-center\">\n              <Input type=\"text\" className=\"w-25\" value={label} onChange={(e) => setLabel(e.target.value)} innerRef={labelInputRef} />\n              {isLabelUpdating === false ? (\n                <div>\n                  <Button\n                    color=\"primary\"\n                    size=\"xs\"\n                    className=\"ms-1\"\n                    disabled={label.trim().length === 0}\n                    onClick={handleUpdateLabelClick}\n                  >\n                    <FaIcon icon=\"check\" size=\"sm\" />\n                  </Button>\n                  <Button color=\"secondary\" size=\"xs\" outline className=\"ms-1\" onClick={() => setLabelEditMode(false)}>\n                    <FaIcon icon=\"times\" size=\"sm\" />\n                  </Button>\n                </div>\n              ) : (\n                <div><Spinner size=\"sm\" color=\"secondary\" className=\"ms-2\" /></div>\n              )}\n            </div>\n\n\n          </Form>\n\n        </div>\n      )}\n\n      <div>\n        {allowViewChangeLog && (\n          <Button\n            color=\"link\"\n            size=\"sm\"\n            onClick={rulesContext.api.viewRuleChanges}\n            title=\"Rule change history\"\n            className=\"inline me-2\"\n            disabled={isUpdating}\n          >\n            <FaIcon icon=\"history\" />\n          </Button>\n        )}\n\n        {allowEdit && (\n          <Button\n            color=\"link\"\n            size=\"sm\"\n            onClick={rulesContext.api.toggleActionsPane}\n            title=\"Rule Actions\"\n            className=\"inline\"\n            disabled={isUpdating}\n          >\n            <FaIcon icon=\"ellipsis-v\" />\n          </Button>\n        )}\n      </div>\n\n\n    </div>\n  );\n};\n\nHeader.propTypes = {\n  rule: PropTypes.object,\n  onChange: PropTypes.func,\n  isUpdating: PropTypes.bool,\n  errors: PropTypes.object,\n};\n\nHeader.defaultPros = {\n  errors: {},\n};\n\nexport default Header;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport {\n  ActivityScheduleSummary,\n  AdsSummary,\n  BidScheduleSummary,\n  BiddingSummary,\n  BudgetSummary,\n  CallConfigSummary,\n  ChannelSummary,\n  DestinationSummary,\n  EnrichmentSummary,\n  SaleConfirmationSummary,\n  TagSummary,\n  TargetingSummary,\n} from \"../../../../Components/Rules/Summaries\";\nimport usePermission from '../../../../Hooks/usePermission';\n\n\nconst Summary = ({\n  rule, timezone, gotoTab, channels, product, accountAds, isRootRule,\n}) => {\n  const rulesContext = useContext(RulesContext);\n  const allowEditIntegrations = usePermission('integrations.edit');\n\n  if (!rule || !rulesContext.attributes) return (null);\n\n  return (\n    <div>\n      <div className=\"rule-summary-section\">\n\n        <div className=\"rule-summary\">\n\n          <BiddingSummary\n            {...rule.bidding}\n            ceiling={rule.bid_ceiling}\n            showBidCeiling={allowEditIntegrations}\n            proxyBidding={rule.proxy_bidding}\n            gotoTab={gotoTab}\n          />\n\n          <TargetingSummary\n            attributes={rulesContext.attributes}\n            targets={rule.match_conditions}\n            matchIsRequired={rule.match_is_required}\n            isStandalone={rule.is_standalone}\n            expression={rule.match_expression}\n            gotoTab={gotoTab}\n          />\n\n\n          <ChannelSummary modifiers={rule.channel_modifiers} channels={channels} isRootRule={isRootRule} gotoTab={gotoTab} />\n          <BidScheduleSummary schedule={rule.schedule_modifiers} gotoTab={gotoTab} />\n          <ActivityScheduleSummary schedule={rule.schedule} timezone={timezone} gotoTab={gotoTab} />\n\n          <BudgetSummary budgets={rule.budgets} caps={rule.caps} schedule={rule.schedule_caps} product={product} gotoTab={gotoTab} />\n\n\n          {product === 'calls' && (\n            <CallConfigSummary\n              concurrency={rule.call_concurrency}\n              billableDuration={rule.billable_duration}\n              gotoTab={gotoTab}\n            />\n          )}\n\n\n          {/*<PrefillSummary  Now in destinations\n            prefill={rule.prefill}\n            gotoTab={gotoTab}\n          />*/}\n          <EnrichmentSummary\n            attributes={rulesContext.attributes}\n            enrichments={rule.enrichment_addons}\n            gotoTab={gotoTab}\n          />\n          <SaleConfirmationSummary\n            confirmation={rule.sale_confirmation}\n            gotoTab={gotoTab}\n          />\n          <DestinationSummary\n            product={product}\n            destinationNumber={rule.destination_number}\n            destinationSip={rule.destination_sip}\n            prefill={rule.prefill}\n            redirectUrl={rule.redirect_url}\n            postSale={rule.delivery_destinations}\n            callStarted={rule.call_started_webhooks}\n            callEnded={rule.call_ended_webhooks}\n            gotoTab={gotoTab}\n          />\n          <TagSummary tags={rule.tags} gotoTab={gotoTab} />\n          {product === 'clicks' && <AdsSummary ads={rule.ads}  accountAds={accountAds} override={rule.override_parent_ads} gotoTab={gotoTab} />}\n        </div>\n\n      </div>\n\n    </div>\n\n  );\n};\n\nSummary.propTypes = {\n  rule: PropTypes.object,\n  gotoTab: PropTypes.func,\n  timezone: PropTypes.string,\n  channels: PropTypes.array,\n  accountAds: PropTypes.array,\n  isRootRule: PropTypes.bool,\n  product: PropTypes.string,\n};\n\nSummary.defaultProps = {\n\n};\n\nexport default Summary;\n","import React, {useState, useEffect, FC} from \"react\";\nimport {DbaType} from \"../../../../types\";\nimport EnhancedSelect from \"../../../../Components/Form/EnhancedSelect\";\nimport {Badge, Button, Table} from \"reactstrap\";\nimport {MaskedInputGroup} from \"@thedmsgroup/mastodon-ui-components\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {DbaOptionLabel} from \"../../../../Components/Form/Select/DbaOptionLabel\";\nimport useApi from \"../../../../Hooks/useApi\";\nimport IconCheckbox from \"../../../../Components/Form/IconCheckbox\";\n\ntype ProxyBiddingBuyerType = {\n  buyer_name:string;\n  no_bid:boolean;\n  bid_floor: string|number|null;\n}\n\ntype ProxyBuyersProps = {\n  proxyBuyers: ProxyBiddingBuyerType[];\n  onChange: (buyers:ProxyBiddingBuyerType[]) => void;\n  className?: string;\n  allowEdit?: boolean;\n}\n\nconst ProxyBuyers:FC<ProxyBuyersProps> = ({proxyBuyers, onChange, className='', allowEdit=true}) => {\n  const { api } = useApi()\n  const [buyerOptions, setBuyerOptions] = useState<DbaType[]>([])\n  const [addMode, setAddMode] = useState(false)\n  const [newBuyerSelection, setNewBuyerSelection] = useState<string>('')\n\n  useEffect(() => {\n    loadBuyers()\n  }, [])\n\n\n  const handleChangeBuyer = (buyer:ProxyBiddingBuyerType, index:number) => {\n\n    const newBuyers = [...proxyBuyers]\n    if (newBuyers[index]) {\n      newBuyers[index] = buyer\n    } else if (addMode) {\n      newBuyers.push(buyer)\n    }\n\n    onChange(newBuyers)\n    setAddMode(false)\n  }\n\n  const handleAddNew = () => {\n\n    if (newBuyerSelection) {\n      const newBuyers = [...proxyBuyers, {buyer_name: newBuyerSelection, bid_floor: '', no_bid: false}]\n      onChange(newBuyers)\n      setNewBuyerSelection('')\n    }\n  }\n\n  const removeEmptyRows = (arr:ProxyBiddingBuyerType[]) =>  arr.filter(b => b.buyer_name)\n\n\n  const handleRemove = (index:number) => {\n    let newBuyers = [...proxyBuyers]\n    newBuyers.splice(index, 1)\n    newBuyers = removeEmptyRows(newBuyers)\n    onChange(newBuyers)\n  };\n\n  const loadBuyers= async() => {\n    const result = await api.endpoints.dbas.list({limit:1000})\n\n    if (result) {\n      setBuyerOptions(result.data)\n    }\n  }\n\n\n  if (!allowEdit) {\n    if (proxyBuyers.length === 0) {\n      return <div className={`proxy-buyers ${className}`}><span className=\"text-muted\">None</span></div>\n    }\n    return (\n      <div className={`proxy-buyers ${className}`}>\n        <Table size=\"sm\" className=\"mb-1\">\n          <thead>\n          <tr>\n            <th>Buyer (DBA)</th>\n            <th>Bid Floor</th>\n            <th>Status</th>\n          </tr>\n          </thead>\n          <tbody>\n          {proxyBuyers.map((buyer:any, i:number) => (\n            <tr key={`buyer-${i}`}>\n              <td>{buyer.buyer_name}</td>\n              <td>{buyer.bid_floor ? `$${buyer.bid_floor}` : <span className=\"text-muted\">Not set</span>}</td>\n              <td>{buyer.no_bid ? <Badge size=\"sm\" color=\"danger\">Blocked</Badge> : 'Active'}</td>\n            </tr>\n          ))}\n          </tbody>\n        </Table>\n      </div>\n    )\n  }\n\n  return (\n    <div className={`proxy-buyers ${className}`}>\n      <div className=\"proxy-buyer-rows\">\n        {(proxyBuyers.length > 0 || addMode) && (\n          <Table size=\"sm\" className=\"mb-1\">\n            <thead>\n            <tr>\n              <th>Buyer (DBA)</th>\n              <th>Bid Floor</th>\n              <th>&nbsp;</th>\n              <th>&nbsp;</th>\n            </tr>\n\n            </thead>\n            <tbody>\n            {proxyBuyers.map((buyer:any, i:any) => (\n              <BuyerRow\n                index={i}\n                buyer={buyer}\n                onRemove={handleRemove}\n                onChangeBuyer={handleChangeBuyer}\n                key={`buyer-${i}`}\n              />\n            ))}\n\n            </tbody>\n\n          </Table>\n\n        )}\n\n        <div className=\"d-flex align-items-center\">\n          <div style={{width:'320px'}}>\n            {/*\n            Buyer name is unique so we are using it as an identifier\n            Note: in the options it is 'name' but in proxy config it is 'buyer_name'\n           */}\n\n            <EnhancedSelect\n              isClearable\n              isSearchable\n              onChange={setNewBuyerSelection}\n              options={buyerOptions}\n              value={newBuyerSelection}\n              tabSelectsValue\n              backspaceRemovesValue\n              isMulti={false}\n              controlShouldRenderValue\n              closeMenuOnSelect\n              placeholder=\"Select buyer DBA\"\n              isInvalid={false}\n              formatOptionLabel={DbaOptionLabel}\n              getOptionValue={(opt:any) => opt.name}\n              getOptionLabel={(opt:any) => opt.name}\n              //Note: we use these functions to mark selected/disabled based on the proxyBuyers prop\n              //The problem is react-select seems to memoize these functions, so proxyBuyers is no longer in scope.\n              //We added the key value in order to force a refresh.\n              //Another way to do this would be to set an 'isSelected' props in the options\n              isOptionDisabled={(opt:any) => Boolean(proxyBuyers.find((b:any) => b.buyer_name === opt.name))}\n              isOptionSelected={(opt:any, selectValue:string) => opt.name === selectValue || Boolean(proxyBuyers.find((b: any) => b.buyer_name === opt.name))}\n              key={`select-buyer-${proxyBuyers.length}`}\n              //menuIsOpen={true}\n            />\n          </div>\n\n          {/*  disabled={!allowAdd} */}\n          <Button color=\"link\" size=\"sm\" onClick={handleAddNew} disabled={!newBuyerSelection} >\n            <FaIcon icon=\"plus\" />{' '}Add\n          </Button>\n        </div>\n\n\n      </div>\n\n    </div>\n  )\n}\n\nexport default ProxyBuyers\n\n\n/*\n * Buyer Row: one row in the buyers table, with form elements for settings, removal button\n */\ntype BuyerRowProps = {\n  index:number,\n  buyer:ProxyBiddingBuyerType,\n  onRemove:(index:number) => void,\n  onChangeBuyer: (buyerConfig:ProxyBiddingBuyerType, index:number)=>any,\n}\n\n\nconst BuyerRow = ({\n                            index,\n                            buyer,\n                            onRemove,\n                            onChangeBuyer,\n                          }:BuyerRowProps) => {\n\n  const handleChangeFloor = (floor:string) => {\n    onChangeBuyer({...buyer, bid_floor: floor}, index)\n  }\n  const handleChangeNoBid = (noBid:boolean) => {\n    onChangeBuyer({...buyer, no_bid: noBid}, index)\n  }\n\n  return (\n    <tr className=\"buyer-row align-items-center\">\n\n      <td  valign=\"middle\">\n        {buyer.buyer_name}\n      </td>\n\n      <td valign=\"middle\">\n        <MaskedInputGroup\n          mask={Number}\n          unmask=\"typed\"\n          padFractionalZeros\n          scale={2}\n          min={0}\n          max={999}\n          radix=\".\"\n          type=\"text\"\n          name=\"name\"\n          onAccept={handleChangeFloor}\n          value={buyer.bid_floor ? buyer.bid_floor.toString() : ''}\n          prefix=\"$\"\n          className=\"teeny\"\n          placeholder=\"Floor\"\n        />\n      </td>\n      <td valign=\"middle\">\n        <IconCheckbox\n              name=\"no_bid\"\n              value={buyer.no_bid}\n              onChange={(name, val) => handleChangeNoBid(val)}\n        >\n          {buyer.no_bid ? <Badge size=\"sm\" color=\"danger\" className=\"ms-1\">Blocked</Badge> : <span>Block</span>}\n        </IconCheckbox>\n      </td>\n      <td valign=\"middle\" className=\"text-end\">\n        <Button onClick={()=>onRemove(index)} color=\"link\" size=\"sm\" className=\"inline\" title=\"Remove\">\n          <FaIcon icon=\"times\" size=\"sm\" color=\"darkred\"/>\n        </Button>\n      </td>\n\n    </tr>\n  )\n};\n","import { useState } from 'react';\n\n/*\n * Hook for applying simple keyframe animation via class.\n * Usage:\n * In stylesheet create a named keyframe animation class.\n * Set up the hook\n * const{ animationClass,animate,handleAnimationStart,handleAnimationEnd} = useSimpleAnimation('copy-animation');\n * Put the class and event handlers on the animated element\n * <div className={`scrollable ${animationClass}`} onAnimationStart={handleAnimationStart} onAnimationEnd={handleAnimationEnd}>\n * Trigger the animation with animate()\n */\nconst useSimpleAnimation = (aniClass) => {\n  const [animationFinished, setAnimationFinished] = useState(true);\n  const [animationClass, setAnimationClass] = useState(''); // not set at first\n\n  const animate = () => setAnimationClass(aniClass);\n\n  const handleAnimationStart = () => setAnimationFinished(false);\n\n  const handleAnimationEnd = () => {\n    setAnimationClass('');\n    setAnimationFinished(true);\n  };\n\n  return {\n    animationClass,\n    animationFinished,\n    animate,\n    handleAnimationStart,\n    handleAnimationEnd,\n  };\n};\n\nexport default useSimpleAnimation;\n","import React, { useRef } from 'react';\nimport { Button, Input } from 'reactstrap';\nimport JSONPretty from 'react-json-prettify';\nimport { idea } from 'react-json-prettify/dist/themes';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport useSimpleAnimation from '../../Hooks/useSimpleAnimation';\nimport './JsonDisplay.scss';\n\n/*\n * An area for prettified display of JSON data, with copy button.\n * Optionally vertically scrollable (set a specific height if using)\n */\nconst JsonDisplay = ({\n  data = '',\n  scrollable = false,\n  className = '',\n  height = 'auto',\n  showCopy = true,\n}) => {\n  const copyAreaRef = useRef();\n\n  const {\n    animationClass,\n    animate,\n    handleAnimationStart,\n    handleAnimationEnd,\n  } = useSimpleAnimation('copy-animation');\n\n  const handleCopy = () => {\n    if (data) {\n      animate();\n      copyAreaRef.current.value = JSON.stringify(data, null, 2);\n      copyAreaRef.current.select();\n      document.execCommand('copy');\n    }\n  };\n\n  return (\n    <div className=\"json-display-wrapper position-relative\">\n\n      {showCopy && (\n        <div className=\"copy-btn text-right\">\n          <Button color=\"link\" size=\"xs\" onClick={handleCopy}>Copy</Button>\n        </div>\n      )}\n\n      <div\n        className={classnames(['json-display', className, animationClass, { scrollable }])}\n        style={{ \"maxHeight\": height }}\n        onAnimationStart={handleAnimationStart}\n        onAnimationEnd={handleAnimationEnd}\n      >\n\n        {/* Hidden from view, used for copy to clipboard */}\n        <div className=\"hidden-copy-area\">\n          <Input\n            type=\"textarea\"\n            defaultValue=\"\"\n            innerRef={copyAreaRef}\n            rows={8}\n          />\n        </div>\n\n        <div className=\"json-container\">\n          <code>\n            <JSONPretty json={data} theme={idea} />\n          </code>\n\n        </div>\n      </div>\n\n    </div>\n\n  );\n};\n\nJsonDisplay.propTypes = {\n  data: PropTypes.oneOfType([PropTypes.string, PropTypes.array, PropTypes.object]),\n  scrollable: PropTypes.bool,\n  height: PropTypes.string,\n  className: PropTypes.string,\n  showCopy: PropTypes.bool,\n};\n\nexport default JsonDisplay;\n","import React, { useRef, useContext } from 'react';\nimport {\n  Button, Col, FormGroup, FormText, Row, Label, Input, FormFeedback,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport MaskedInput from 'react-text-mask';\nimport { useDebouncedCallback } from 'use-debounce';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport IntegrationSettings from '../../../../Components/Rules/IntegrationSettings';\nimport useCollectionTracker from '../../../../Hooks/useCollectionTracker';\nimport InputWithIcon from '../../../../Components/Form/InputWithIcon';\nimport usePermission from '../../../../Hooks/usePermission';\nimport IconCheckbox from '../../../../Components/Form/IconCheckbox';\nimport ProxyBuyers from './ProxyBuyers'\nimport JsonDisplay from '../../../../Components/Form/JsonDisplay';\n\n// Mask dd.dd\nconst currencyMask = createNumberMask({\n  prefix: '',\n  allowDecimal: true,\n  decimalLimit: 2,\n  integerLimit: 3,\n  // fixedDecimalScale:true\n});\n\n// Mask ddd\nconst modifierMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  integerLimit: 3,\n});\n\nconst ProxyBidding = ({ proxy, errors = {}, onChange }) => {\n  const rulesContext = useContext(RulesContext);\n  const allowEdit = usePermission('integrations.edit');\n  const definitionsRef = useRef(rulesContext.api.getIntegrationDefinitionsByType('proxy_bidding'));\n  const {\n    api: collection,\n    willDeleteIndex,\n    editIndex,\n    addMode,\n  } = useCollectionTracker();\n\n  const handleUpdate = (integration) => onChange({ ...proxy, integration });\n\n  const handleDelete = () => {\n    collection.onDelete();\n    onChange({});\n  };\n\n  const handleAdd = () => {\n    collection.add(0);\n    onChange({\n      integration: { name: '', settings: {} },\n    });\n  };\n\n  const handleChangeModifierDebounced = useDebouncedCallback((value) => {\n    onChange({\n      ...proxy,\n      bid_modifier: value,\n    });\n  }, 400);\n\n  const handleChangeFloorDebounced = useDebouncedCallback((value) => {\n    onChange({\n      ...proxy,\n      bid_floor: value,\n    });\n  }, 400);\n\n  const handleDedupeTimeframeDebounced = useDebouncedCallback((value) => {\n    onChange({\n      ...proxy,\n      dedupe_timeframe: value,\n    });\n  }, 400);\n\n  const handlePostTimeoutDebounced = useDebouncedCallback((value) => {\n    onChange({\n      ...proxy,\n      post_timeout: value === '' ? null : Number(value),\n    });\n  }, 400);\n\n  const handleChangeVendorAttributesDebounced = useDebouncedCallback((value) => {\n    onChange({\n      ...proxy,\n      vendor_attributes: value,\n    });\n  }, 400);\n\n  // const handleChangeDirectTransfer = (e) => onChange({...proxy, direct_transfer:e.target.checked})\n  const handleChangeDirectTransfer = (name, checked) => onChange({ ...proxy, direct_transfer: checked });\n\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Proxy Bidding</div>\n\n      <p>Receive bids through a third party service by configuring a proxy integration</p>\n\n      {definitionsRef.current.length === 0 && <StandardAlert color=\"light\" icon=\"alert\">No integration configurations found</StandardAlert>}\n\n      <Row>\n        <Col lg={12} xl={9}>\n\n          {proxy.integration !== undefined ? (\n            <>\n              <IntegrationSettings\n                config={proxy.integration}\n                definitions={definitionsRef.current}\n                type=\"proxy_bidding\"\n                editMode={editIndex === 0}\n                isNew={addMode}\n                errors={errors}\n                onUpdate={handleUpdate}\n                onDelete={handleDelete}\n                onApply={collection.apply}\n                setEdit={collection.edit}\n                willDelete={willDeleteIndex === 0}\n                setWillDelete={(i) => collection.setWillDeleteIndex(i)}\n                allowEdit={allowEdit}\n                allowControls={allowEdit}\n              />\n\n              <div className=\"d-flex mt-3\">\n                <FormGroup className=\"me-3\">\n                  <Label>Bid Floor</Label>\n                  {allowEdit ? (\n                    <MaskedInput\n                      mask={currencyMask}\n                      defaultValue={proxy.bid_floor}\n                      onChange={(e) => handleChangeFloorDebounced(e.target.value)}\n                      render={(ref, props) => <InputWithIcon className=\"teeny\" innerRef={ref} icon=\"dollar-sign\" {...props} />}\n                    />\n                  ) : (\n                    <div>{proxy.bid_floor != null && proxy.bid_floor !== '' ? `$${proxy.bid_floor}` : 'None'}</div>\n                  )}\n                </FormGroup>\n\n                <FormGroup className=\"ms-3\">\n                  <Label>Bid Modifier</Label>\n                  {allowEdit ? (\n                    <MaskedInput\n                      mask={modifierMask}\n                      defaultValue={proxy.bid_modifier}\n                      onChange={(e) => handleChangeModifierDebounced(e.target.value)}\n                      render={(ref, props) => <InputWithIcon className=\"teeny\" innerRef={ref} icon=\"percent\" iconSide=\"right\" {...props} />}\n                    />\n                  ) : (\n                    <div>{proxy.bid_modifier != null && proxy.bid_modifier !== '' ? `${proxy.bid_modifier}%` : 'None'}</div>\n                  )}\n                </FormGroup>\n              </div>\n\n              <FormGroup>\n                <Label>Buyer Constraints</Label>\n                <p>Set buyer-specific bid floors, or block bidding for a buyer. Bidding will still be open for buyers not listed here,\n                  {' '} and the general bid floor, if set, will apply.</p>\n                <ProxyBuyers\n                  proxyBuyers={proxy.buyer_constraints || []}\n                  onChange={allowEdit ? (buyers) => onChange({ ...proxy, buyer_constraints:buyers }) : () => {}}\n                  allowEdit={allowEdit}\n                />\n              </FormGroup>\n\n              <FormGroup className=\"me-3\">\n                <Label>Dedupe Timeframe</Label>\n                {allowEdit ? (\n                  <Input\n                    className=\"teeny\"\n                    defaultValue={proxy.dedupe_timeframe}\n                    onChange={(e) => handleDedupeTimeframeDebounced(e.target.value)}\n                  />\n                ) : (\n                  <div>{proxy.dedupe_timeframe != null && proxy.dedupe_timeframe !== '' ? `${proxy.dedupe_timeframe} hours` : 'None'}</div>\n                )}\n                <FormText>Only send unique pings to this integration once within this timeframe.</FormText>\n              </FormGroup>\n\n              <FormGroup className=\"me-3\">\n                <Label>Post Timeout</Label>\n                {allowEdit ? (\n                  <>\n                    <Input\n                      type=\"number\"\n                      min={0}\n                      max={50}\n                      className=\"teeny\"\n                      name=\"post_timeout\"\n                      defaultValue={proxy.post_timeout ?? ''}\n                      onChange={(e) => handlePostTimeoutDebounced(e.target.value)}\n                      invalid={!!errors.post_timeout}\n                    />\n                    <FormFeedback>{errors.post_timeout}</FormFeedback>\n                  </>\n                ) : (\n                  <div>{proxy.post_timeout ? `${proxy.post_timeout} seconds` : 'Default (29 seconds)'}</div>\n                )}\n                <FormText>\n                  In seconds, up to 50. Limits the post that confirms a sale. The integration&apos;s custom timeout\n                  {' '}only limits the ping. Leave empty for the default of 29 seconds.\n                </FormText>\n              </FormGroup>\n\n              <FormGroup className=\"mt-2\">\n                {allowEdit ? (\n                  <IconCheckbox\n                    name=\"direct_transfer\"\n                    value={!!proxy.direct_transfer}\n                    onChange={handleChangeDirectTransfer}\n                  >\n                    Direct Transfer\n                  </IconCheckbox>\n                ) : (\n                  <>\n                    <Label>Direct Transfer</Label>\n                    <div>{proxy.direct_transfer ? 'Yes' : 'No'}</div>\n                  </>\n                )}\n                <FormText>Direct Transfer sends calls directly to the destination, and does NOT track calls on this platform.</FormText>\n              </FormGroup>\n\n              <FormGroup className=\"mt-2\">\n                <Label>Vendor Attributes</Label>\n                {allowEdit ? (\n                  <>\n                    <Input\n                      type=\"textarea\"\n                      rows={2}\n                      defaultValue={proxy.vendor_attributes || ''}\n                      name=\"vendor_attributes\"\n                      onChange={(e) => handleChangeVendorAttributesDebounced(e.target.value)}\n                      invalid={!!errors.vendor_attributes}\n                    />\n                    <FormText>Enter a valid JSON expression</FormText>\n                    <FormFeedback>{errors.vendor_attributes}</FormFeedback>\n                  </>\n                ) : (\n                  proxy.vendor_attributes ? (\n                    <JsonDisplay data={proxy.vendor_attributes} showCopy={false} />\n                  ) : (\n                    <div className=\"text-muted\">None</div>\n                  )\n                )}\n              </FormGroup>\n            </>\n          ) : (\n            <>\n              {allowEdit ? (\n                <Button color=\"link\" onClick={handleAdd} disabled={editIndex !== null}>\n                  <FaIcon icon=\"plus\" className=\"me-1\" />\n                  Add Proxy\n                </Button>\n              ) : (\n                <StandardAlert color=\"light\" icon=\"info\">No proxy bidding is configured.</StandardAlert>\n              )}\n            </>\n\n          )}\n\n        </Col>\n      </Row>\n\n    </div>\n\n  );\n};\n\nProxyBidding.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  proxy: PropTypes.object.isRequired,\n  errors: PropTypes.object,\n};\nexport default ProxyBidding;\n","import React, { useState, useEffect, ReactNode } from 'react';\nimport {\n  FormGroup,\n  FormText,\n  Button,\n  Input,\n  Label,\n} from 'reactstrap';\n// @ts-ignore\nimport MaskedInput from 'react-text-mask';\n// @ts-ignore\nimport createNumberMask from \"text-mask-addons/dist/createNumberMask\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport classnames from \"classnames\";\nimport {\n  DayList,\n  WeekSummarySVG,\n  SchedulerModal,\n  StandardAlert\n} from \"@thedmsgroup/mastodon-ui-components\";\n\n// Mask ddd,ddd\nconst numberMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  integerLimit: 8,\n});\n\ntype SchedulableSettingInputProps = {\n  scheduleSetting: string;\n  scheduleTimezone?: string;\n  setting: string;\n  note?: string;\n  title?: string;\n  hideInput?: boolean;\n  summaryNote?: string;\n  schedule?: Record<string, unknown>;\n  config?: Record<string, unknown>;\n  value?: number | string;\n  onChange: (setting: string, value: unknown, timezone?: string) => void;\n  allowEdit?: boolean;\n  readOnly?: boolean;\n  className?: string;\n  size?: string;\n  children?: ReactNode;\n};\n\n/*\n *  Component for a numeric setting that can be scheduled by day/hour\n *  Presents a text input, and a visual display of the week's adjustments (svg graph).\n *  Provides a link to open the Scheduler component in a modal.\n *\n *  The text input is for the default value to be (optionally) modified.\n *  The scheduled modifications are set in a modal.\n *  In some cases, like bidding, the bid value is set in another part of the form,\n *  so we use the hideInput property.\n *\n *  \"config\" property should be the Scheduler component config:\n *    {default:100, max:200, labelInterval:20, lineInterval:10};\n *  minimum is presumed zero.\n *  optional config for:\n *    allowHourParting:false  (prevents splitting hour into halves or quarters)\n *    showBaseline: false   highlighted horizontal value line indicates default value. Default true.\n *    valueSuffix: \"%\"\n */\nconst SchedulableSettingInput = (props: SchedulableSettingInputProps) => {\n  const [modal, setModal] = useState(false);\n  const [hasSchedule, setHasSchedule] = useState(false);\n  const [clearPrompt, setClearPrompt] = useState(false);\n  const thisDayIndex = new Date().getDay();\n  // Note: Daylist is monday first\n  const [selectedDay, setSelectedDay] = useState(DayList[thisDayIndex > 0 ? thisDayIndex - 1 : 6]);\n\n  const { allowEdit = true, hideInput = false, readOnly = false } = props;\n\n  useEffect(() => {\n    if (props.schedule) {\n      setHasSchedule(Object.keys(props.schedule).length > 0);\n    }\n  }, [props.schedule]);\n\n  const handleClickDay = (day: string | null) => {\n    setSelectedDay(day);\n    setModal(true);\n  };\n\n  const clearSchedule = () => {\n    props.onChange(props.scheduleSetting, {});\n    setClearPrompt(false);\n    setHasSchedule(false);\n  };\n\n  return (\n    <div className={classnames(['scheduled-setting-input', 'mb-4', props.className])}>\n      {hideInput !== true && (\n        <FormGroup>\n          <Label>{props.title}</Label>\n          <div className=\"d-flex\">\n            <div>\n              <MaskedInput\n                mask={numberMask}\n                placeholder=\"open\"\n                value={props.value || ''}\n                disabled={hasSchedule}\n                onChange={(e: any) => props.onChange(props.setting, e.target.value)}\n                render={(ref: any, maskProps: any) => <Input className=\"teeny\" innerRef={ref} {...maskProps} />}\n              />\n              {/* optional extra form elements that relate to input, like a checkbox for override parent */}\n              {props.children}\n            </div>\n\n            <div className=\"flex-grow-1\">\n              { hasSchedule === true && (\n              <StandardAlert color=\"light\" icon={clearPrompt ? 'warning' : 'info'}>\n                {clearPrompt === true ? (\n                  <>\n                    Are you sure?\n                    <Button color=\"warning\" size=\"sm\" className=\"ms-3\" onClick={clearSchedule}>\n                      Yes\n                    </Button>\n                    <Button color=\"link\" className=\"ms-2\" size=\"sm\" onClick={() => setClearPrompt(false)}>\n                      Cancel\n                    </Button>\n                  </>\n                ) : (\n                  <>\n                    This setting has scheduled adjustments\n                    {allowEdit && (\n                      <>\n                        <Button color=\"link\" className=\"ms-2\" onClick={() => handleClickDay(null)}>\n                          <FaIcon icon=\"calendar-times\" size=\"sm\" />\n                          {' '}\n                          Edit Schedule\n                        </Button>\n                        <Button color=\"link\" className=\"ms-2\" onClick={() => setClearPrompt(true)}>\n                          <FaIcon icon=\"times\" size=\"sm\" />\n                          {' '}\n                          Clear Schedule\n                        </Button>\n                      </>\n                    )}\n\n                  </>\n                )}\n\n              </StandardAlert>\n              )}\n            </div>\n\n          </div>\n          {props.note && <FormText>{props.note}</FormText>}\n        </FormGroup>\n      )}\n\n      {/* Show Summary graph and edit icon if we have a schedule, or alert and create button if no schedule */}\n      <FormGroup>\n\n        {hasSchedule && allowEdit\n              && (\n              <Button color=\"link\" className=\"mb-2\" onClick={() => handleClickDay(null)} title=\"Edit Schedule\">\n                <FaIcon icon=\"edit\" />\n                {' '}Edit {props.title} Schedule\n              </Button>\n              )}\n\n        <div>\n          { hasSchedule === true ? (\n            <>\n              {props.summaryNote && <p>{props.summaryNote}</p>}\n              <WeekSummarySVG\n                config={props.config}\n                schedule={props.schedule}\n                onChangeSelectedDay={handleClickDay}\n                selectedDay={selectedDay}\n                labelSize={props.size}\n              />\n            </>\n\n          ) : (\n            <StandardAlert color=\"light\" icon=\"info\">\n              There are no scheduled adjustments for this setting{' '}\n              {allowEdit && (\n                <Button color=\"link\" className=\"inline ms-1\" onClick={() => handleClickDay(null)}>\n                  <FaIcon icon=\"calendar-times\" size=\"sm\" />\n                  {' '}\n                  Set Schedule\n                </Button>\n              )}\n\n            </StandardAlert>\n          )}\n\n        </div>\n      </FormGroup>\n\n      <SchedulerModal\n        timezone={props.scheduleTimezone}\n        config={props.config}\n        title={props.title}\n        startDay={selectedDay}\n        isOpen={modal}\n        schedule={props.schedule}\n        onUpdate={props.onChange}\n        close={() => setModal(false)}\n        readOnly={readOnly}\n      />\n    </div>\n\n  );\n};\n\nexport default SchedulableSettingInput;\n","import React, {useCallback} from \"react\";\nimport { FormGroup, FormText, Label } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport MaskedInput from 'react-text-mask';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport { useDebouncedCallback } from 'use-debounce';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport ProxyBidding from './ProxyBidding';\nimport BidWidget from '../../../../Components/Rules/BidWidget';\nimport SchedulableSettingInput from '../../../../Components/Rules/SchedulableSettingInput';\nimport ValueDeltaDisplay from '../../../../Components/ValueDeltaDisplay';\nimport { MoneyFormatter, PercentFormatter } from '../../../../Components/Table/Table';\nimport usePermission from '../../../../Hooks/usePermission';\nimport InputWithIcon from '../../../../Components/Form/InputWithIcon';\nimport {BiddingScheduleConfig} from \"../const\";\n\n// Mask dd.dd\nconst currencyMask = createNumberMask({\n  prefix: '',\n  allowDecimal: true,\n  decimalLimit: 2,\n  integerLimit: 3,\n  // fixedDecimalScale:true\n});\n\n\n\nconst Bidding = (props) => {\n  const allowEditIntg = usePermission('integrations.edit');\n  const allowEditOrder = props.allowEdit !== undefined ? props.allowEdit : usePermission('orders.edit');\n  if (!props.hasOwnProperty('type')) return (null);\n\n  const handleChangeCeilingDebounced = useDebouncedCallback((val) => {\n    props.onChange('bid_ceiling', val);\n  }, 400);\n\n  const handleChangeSchedule = useCallback((sched, tz) => {\n    props.onChangeSchedule('schedule_modifiers', sched, tz);\n  }, []);\n\n  const absBidError = props.errors['bidding.absolute_bid'];\n  const modifierError = props.errors['bidding.bid_modifier'];\n  const proxyError = props.errors.proxy_bidding;\n\n  return (\n    <div id=\"rule-bidding\">\n\n      {(absBidError || modifierError || proxyError)\n      && (\n      <StandardAlert color=\"info\" className=\"validation\">\n        Please correct the errors below before continuing\n      </StandardAlert>\n      )}\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Bidding</div>\n\n        <BidWidget\n          type={props.type}\n          absolute_bid={props.absolute_bid}\n          bid_modifier={props.bid_modifier}\n          onChange={props.onChange}\n          showExclusivity\n          exclusivity={props.exclusivity}\n          isActiveTab={props.isActiveTab}\n          errors={props.errors}\n          allowEdit={allowEditOrder}\n        />\n\n        {allowEditIntg && allowEditOrder ? (\n          <FormGroup className=\"d-inline-block me-3\">\n            <Label>Bid Ceiling</Label>\n            <MaskedInput\n              id=\"inp-bid-ceiling\"\n              mask={currencyMask}\n              defaultValue={props.bid_ceiling || ''}\n              onChange={(e) => handleChangeCeilingDebounced(e.target.value)}\n              name=\"bid_ceiling\"\n              render={(ref, props) => <InputWithIcon className=\"tiny\" innerRef={ref} icon=\"dollar-sign\" {...props} />}\n            />\n            <FormText>If set, final adjusted bid may not exceed this dollar amount</FormText>\n          </FormGroup>\n        ) : allowEditIntg && props.bid_ceiling ? (\n          <div className=\"mb-2\">\n            <Label>Bid Ceiling</Label>\n            <div><MoneyFormatter value={props.bid_ceiling} /></div>\n          </div>\n        ) : null}\n\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Bidding Schedule</div>\n        <p>Modify bids by day and hour (of the consumer)</p>\n        <div>\n          <FormGroup>\n\n            { (props.type !== 'block') ? (\n              <SchedulableSettingInput\n                setting=\"bid\"\n                scheduleSetting=\"schedule_modifiers\"\n                scheduleTimezone={props.scheduleTimezone}\n                title=\"Bid Modifier\"\n                summaryNote=\"Scheduled modifiers are a percentage of the bid determined by this rule and/or parent rules.\"\n                config={BiddingScheduleConfig}\n                hideInput\n                allowEdit={allowEditOrder}\n                readOnly={!allowEditOrder}\n                value=\"\"\n                schedule={props.schedule}\n                onChange={handleChangeSchedule}\n                size=\"lg\"\n              />\n            ) : (\n              <FormGroup>\n                <StandardAlert color=\"light\" icon=\"info\">\n                  Schedule inactive: bidding blocked.\n                </StandardAlert>\n              </FormGroup>\n\n            )}\n          </FormGroup>\n\n        </div>\n      </div>\n\n      <ProxyBidding\n        proxy={props.proxyBidding}\n        onChange={(config) => props.onChange('proxy_bidding', config)}\n        errors={proxyError}\n      />\n\n    </div>\n  );\n};\n\nconst BidAlert = ({\n  type, bid, previousBid, previousType, defaultMsg = '',\n}) => {\n  let alert = '';\n  if (type === 'modifier') {\n    bid = parseInt(bid);\n\n    if (bid === 0) {\n      alert = 'Setting the modifier to zero will disable bidding. Instead, choose Block as a bid type.';\n    } else if (bid === 100 && previousType === type) {\n      alert = 'A modifier of 100% will not modify the bid.';\n    } else if (bid && previousBid !== bid && previousType === type) {\n      alert = (\n        <span>\n          Bid change:\n          <ValueDeltaDisplay oldValue={previousBid} newValue={bid} threshold={1000} />\n          {' '}\n          from\n          <PercentFormatter value={previousBid} />\n        </span>\n      );\n    }\n  } else if (type === 'absolute') {\n    bid = parseFloat(bid);\n\n    if (bid === 0) {\n      alert = 'Setting the bid to zero will disable bidding. You can also choose Block as a bid type.';\n    } else if (bid && parseFloat(previousBid) !== bid && previousType === type) {\n      alert = (\n        <span>\n          Bid change:\n          {' '}\n          <ValueDeltaDisplay oldValue={previousBid} newValue={bid} threshold={1000} />\n          {' '}\n          from <MoneyFormatter value={previousBid} />\n        </span>\n      );\n    }\n  }\n  //\n  return (<FormText className=\"bid-alert\">{alert || defaultMsg}</FormText>);\n};\n\n// const BidAlert = ({type, bid, previousBid, defaultMsg=''}) => {\n//   let alert = '';\n//   if(type === 'modifier' && parseInt(bid) === 0){\n//     alert = ' Setting the modifier to zero will disable bidding. Instead, choose Block as a bid type.';\n//   }else if(type === 'modifier' && parseInt(bid) === 100){\n//\n//     alert = ' An modifier of 100% will not modify the bid.';\n//   }else if(type === 'absolute'){\n//     bid = parseFloat(bid);\n//     if(bid === 0){\n//       alert = ' Setting the bid to zero will disable bidding. You can also choose Block as a bid type.';\n//     } else {\n//       alert = <span>Bid change: <ValueDeltaDisplay delta={getDelta(parseFloat(previousBid), bid)}/></span>\n//     }\n//\n//   }\n//   //\n//   return(<FormText>{alert || defaultMsg}</FormText>)\n//\n// };\n\nBidding.propTypes = {\n  accountId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  onChangeSchedule: PropTypes.func.isRequired,\n  onChange: PropTypes.func.isRequired,\n  type: PropTypes.string.isRequired,\n  absolute_bid: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  bid_modifier: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  bid_ceiling: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  proxyBidding: PropTypes.object,\n  errors: PropTypes.object,\n  product: PropTypes.string,\n  isActiveTab: PropTypes.bool,\n  exclusivity: PropTypes.string,\n  allowEdit: PropTypes.bool,\n};\n\nexport default React.memo(Bidding);\n","import React from 'react';\nimport {\n  Row, Col,\n} from 'reactstrap';\nimport {CapManager} from \"@thedmsgroup/mastodon-ui-components\";\nimport PropTypes from 'prop-types';\nimport {CapScheduleConfig} from \"../const\";\n\n\nconst CapsFormOptions = {\n  intervals: [\"total\",\"monthly\", \"weekly\",\"daily\"],\n  max: 99999,\n}\n\nconst BudgetOptions = {\n  intervals: [\"total\",\"monthly\", \"weekly\",\"daily\"],\n  max: 99999,\n}\n\nconst Budgets = ({\n  product,\n  budgets,\n  caps,\n  saleAttemptCaps,\n  onChange,\n  onChangeSchedule,\n  schedule,\n  scheduleTimezone,\n  scheduleSaleAttemptCaps,\n  scheduleSaleAttemptCapsTimezone,\n  allowEdit = true,\n\n}) => {\n\n  const handleChangeCapSchedule = (sched, tz) => {\n    onChangeSchedule('schedule_caps', sched, tz);\n  };\n\n\n  const handleChangeCaps = (caps) => {\n    onChange('caps', caps);\n  }\n\n  // MRK-9151 TBD\n  // const handleChangeSaleAttemptCapSchedule = (sched, tz) => {\n  //   onChangeSchedule('schedule_sale_attempt_caps', sched, tz);\n  // };\n\n  // const handleChangeSaleAttemptCaps = (caps) => {\n  //   onChange('sale_attempt_caps', caps);\n  // }\n\n  const handleChangeBudget = (caps) => {\n    onChange('budgets', caps);\n  }\n\n\n  return (\n    <div className=\"form-section\">\n      <p>\n        Pause the order upon reaching the specified limits. If budget and cap values are both set for a specific timeframe, the order will pause temporarily when one of the\n        limits is reached, whichever is reached first.\n      </p>\n\n      {product === 'calls' && (\n        <p><i>Caps</i> will restrict the number of sold calls. </p>\n      )}\n\n      {/* Add to above when sale attempt caps are implemented MRK-9151: <i>Sale Attempt Caps</i> include both billable and unbillable calls.*/}\n\n      <Row className=\"mt-3 gx-lg-4\">\n        <Col sm={12} lg={4} className=\"border-end\">\n          < CapManager\n            caps={caps}\n            schedule={schedule}\n            scheduleTimezone={scheduleTimezone}\n            scheduleConfig={CapScheduleConfig}\n            onChange={handleChangeCaps}\n            onChangeSchedule={handleChangeCapSchedule}\n            label={\"Caps\"}\n            gap=\"12px\"\n            options={CapsFormOptions}\n            readOnly={!allowEdit}\n          />\n        </Col>\n\n{/*  TBD MRK-9151\n        {product === 'calls' && (\n          <Col sm={12} lg={4} className=\"border-end\">\n            < CapManager\n              caps={saleAttemptCaps}\n              schedule={scheduleSaleAttemptCaps}\n              scheduleTimezone={scheduleSaleAttemptCapsTimezone}\n              scheduleConfig={CapScheduleConfig}\n              onChange={handleChangeSaleAttemptCaps}\n              onChangeSchedule={handleChangeSaleAttemptCapSchedule}\n              label={\"Sale Attempt Caps\"}\n              gap=\"12px\"\n              options={CapsFormOptions}\n            />\n          </Col>\n        )}*/}\n\n        <Col sm={12} lg={4} >\n            <CapManager\n              caps={budgets}\n              onChange={handleChangeBudget}\n              label={\"Budget\"}\n              gap=\"12px\"\n              options={BudgetOptions}\n              inputPrefix=\"$\"\n              readOnly={!allowEdit}\n            />\n        </Col>\n\n\n      </Row>\n    </div>\n  )\n};\n\n\nBudgets.propTypes = {\n  product: PropTypes.string,\n  budgets: PropTypes.object.isRequired,\n  onChange: PropTypes.func.isRequired,\n  caps: PropTypes.object.isRequired,\n  schedule: PropTypes.object,\n  scheduleTimezone: PropTypes.string,\n  onChangeSchedule: PropTypes.func,\n  scheduleSaleAttemptCaps: PropTypes.object,\n  scheduleSaleAttemptCapsTimezone:PropTypes.string,\n  saleAttemptCaps: PropTypes.object,\n};\n\nexport default React.memo(Budgets);\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Row, Col, FormGroup, FormText, FormFeedback, Label, Input, Button,\n} from 'reactstrap';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport MaskedInput from 'react-text-mask';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport RulesContext from '../../../../Providers/RulesContext';\n\n// When we do scheduled settings, we can use this component (which has its own input and does its own masking)\n// import SchedulableSettingInput from \"../../../../Components/Rules/SchedulableSettingInput\";\n// const ConcurrencyScheduleConfig = {default:1, max:400, labelInterval:50, lineInterval:25, showBaseline:false, allowHourParting:true};\n\n// Mask ddd,ddd\nconst numberMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  integerLimit: 4,\n});\n\nconst CallSettings = ({\n  concurrency, billableDuration, onChange, propAncestors, errors, allowEdit = true,\n}) => {\n  const rulesContext = useContext(RulesContext);\n\n  const handleClickDurationAncestor = () => {\n    const targetRule = rulesContext.api.getRule(propAncestors.billable_duration.id);\n    targetRule && rulesContext.api.setSelected(targetRule);\n  };\n\n  return (\n    <div>\n      {(errors.call_concurrency || errors.billable_duration)\n          && (\n          <StandardAlert color=\"info\" className=\"validation\">\n            Please correct the errors below before continuing\n          </StandardAlert>\n          )}\n\n      <p>For phone number and SIP configuration, see\n        {' '}<Button color=\"link\" className=\"inline\" onClick={() => rulesContext.api.setActiveTab('destinations')}>Destinations</Button></p>\n      {allowEdit ? (\n        <>\n          <Row>\n            <Col sm={12}>\n              <FormGroup>\n                <Label>Call Concurrency</Label>\n                <FormText>The maximum number of concurrent calls. Defaults to 1 call.</FormText>\n\n                <MaskedInput\n                  mask={numberMask}\n                  name=\"call_concurrency\"\n                  placeholder=\"1\"\n                  value={concurrency || ''}\n                  onChange={onChange}\n                  invalid={!!errors.call_concurrency}\n                  render={(ref, props) => <Input className=\"teeny\" innerRef={ref} {...props} />}\n                />\n                <FormFeedback>{errors.call_concurrency}</FormFeedback>\n\n              </FormGroup>\n            </Col>\n          </Row>\n          <Row>\n            <Col sm={12}>\n              <FormGroup>\n                <Label>Billable Duration (seconds)</Label>\n                <FormText>Number of seconds before the call becomes billable.  Maximum: 300 (5 minutes).</FormText>\n\n                {propAncestors.billable_duration && (\n                  <Row>\n                    <Col sm={12} md={8}>\n                      <p>\n                        The ancestor rule{' '}\n                        <Button color=\"link\" size=\"sm\" className=\"inline\" onClick={handleClickDurationAncestor}>{propAncestors.billable_duration.label}</Button>\n                        {' '}\n                        has the value\n                        {propAncestors.billable_duration.value}\n                        .\n                        The ancestor value will be used if no value is entered here.\n                      </p>\n                    </Col>\n                  </Row>\n                )}\n\n                <MaskedInput\n                  mask={numberMask}\n                  name=\"billable_duration\"\n                  value={billableDuration || ''}\n                  onChange={onChange}\n                  invalid={!!errors.billable_duration}\n                  render={(ref, props) => <Input className=\"teeny\" innerRef={ref} {...props} />}\n                />\n                <FormFeedback>{errors.billable_duration}</FormFeedback>\n\n              </FormGroup>\n            </Col>\n          </Row>\n        </>\n      ) : (\n        <div>\n          <div className=\"mb-3\">\n            <Label>Call Concurrency</Label>\n            <div>{concurrency || <span className=\"text-muted\">Default (1)</span>}</div>\n          </div>\n          <div className=\"mb-3\">\n            <Label>Billable Duration (seconds)</Label>\n            {propAncestors.billable_duration && (\n              <p>\n                The ancestor rule{' '}\n                <Button color=\"link\" size=\"sm\" className=\"inline\" onClick={handleClickDurationAncestor}>{propAncestors.billable_duration.label}</Button>\n                {' '}has the value {propAncestors.billable_duration.value}.\n              </p>\n            )}\n            <div>{billableDuration || <span className=\"text-muted\">Not configured</span>}</div>\n          </div>\n        </div>\n      )}\n\n    </div>\n  );\n};\n\n/* For when we do scheduling of concurrency or duration, use this instead:\n\n          <Row>\n            <Col sm={12}>\n              <SchedulableSettingInput\n                setting=\"concurrency\"\n                scheduleSetting=\"call_concurrency_schedule\"\n                title=\"Call Concurrency\"\n                config={ConcurrencyScheduleConfig}\n                hideInput={false}\n                value={concurrency || ConcurrencyScheduleConfig.default}\n                schedule={concurrencySchedule}\n                onChange={onChange}\n                size=\"sm\"\n              />\n\n            </Col>\n          </Row>\n */\n\nCallSettings.propTypes = {\n  concurrency: PropTypes.number,\n  billableDuration: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  // concurrencySchedule: PropTypes.object,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n};\n\nexport default React.memo(CallSettings);\n","import React, {\n  useState, useEffect, useMemo, useCallback, useRef, Suspense, lazy, useContext,\n} from 'react';\nimport {\n  Col, Row, Button, Input, Label, FormText,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport useLocalStorage from \"../../../../Hooks/useLocalStorage\";\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { useDebouncedCallback } from 'use-debounce';\nimport classnames from 'classnames';\nimport {StandardAlert, HelpPopper, MaskedInputGroup} from \"@thedmsgroup/mastodon-ui-components\"\nimport { LiveFilteringProvider, LiveFilteringContext } from '../../../../Providers/LiveFilteringProvider';\nimport {Filter, TextSearch, ButtonToggleFilter} from \"../../../../Components/Table/Filter\";\nimport usePermission from '../../../../Hooks/usePermission';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport{ singularOrPlural} from \"../../../../utils/string\";\nimport FlexTable from \"../../../../Components/Table/FlexTable\";\nimport StatusToggler from \"../../../../Components/Form/StatusToggler\";\n\nconst MAX_MODIFIER = 5000;\n\nconst ChannelStatusChoices = [\n  { value: 'active', label: 'Active' },\n  { value: 'archived', label: 'Archived' },\n  { value: 'any', label: 'Any' },\n];\n\nconst LazyBulkEditChannelsModal = lazy(() => import(/* webpackChunkName: \"RuleModals\" */ './BulkEditChannelsModal'));\n\n/*\n * Form for setting bid modifiers and bid ceilings on channels.\n */\nconst Channels = ({\n                    rule,\n                    channels,\n                    modifiers = [],\n                    overrideParentModifiers = false,\n                    isRootRule = false,\n                    onChange,\n                    errors,\n                  }) => {\n  const rulesContext = useContext(RulesContext);\n  const allowEdit = usePermission('orders.edit');\n  const allowBidCeiling = usePermission('rules_advanced.edit');\n  const [allModifiers, setAllModifiers] = useState([]);\n  //stored setting dictates if list view is ALL or APPLIED\n  const [viewFilter, setViewFilter] = useLocalStorage(\"channel_modifiers_filter_view\", modifiers.length > 0 ? 'applied' : 'all')\n\n  const [bulkEditModal, setBulkEditModal] = useState(false);\n\n  // Ref: Workaround for problems with getting current state of allModifiers from the change handlers;\n  const stateRef = useRef();\n  stateRef.current = allModifiers;\n\n  const toggleBulkEditModal = () => setBulkEditModal(!bulkEditModal);\n\n  const handleChangeView = (isViewApplied) => {\n    setViewFilter(isViewApplied ? 'applied' : 'all')\n  }\n\n  // Compose the rows: Existing channel modifiers + unset modifiers for all other channels\n  useEffect(() => {\n    if (!allModifiers.length && Array.isArray(channels)) {\n      const cm = channels.map((ch) => {\n        let row = {\n          channel_name: ch.name,\n          channel_id: ch.id,\n          bid_modifier: '',\n          bid_ceiling: '',\n          channel_status: ch.status,\n          status: 'disabled',\n        };\n        const mod = modifiers.find((m) => m.channel_id === ch.id) ;\n\n        if (mod) {\n          row = { ...row, ...mod };\n        }\n        return row;\n      });\n\n      setAllModifiers(cm);\n    }\n  }, [channels]);\n\n  const handleModifierChange = useCallback((bid_modifier, channel_id) => {\n\n    bid_modifier = isNaN(parseInt(bid_modifier)) ? '' : parseInt(bid_modifier);\n    if (bid_modifier && bid_modifier > MAX_MODIFIER) bid_modifier = MAX_MODIFIER;\n    const status = bid_modifier !== '' ? 'manual' : 'disabled';\n\n    const index = stateRef.current.findIndex((mod) => {\n      return mod.channel_id.toString() === channel_id.toString()\n    });\n    if (index >= 0) {\n      const newModifiers = Object.assign([], stateRef.current); //[...allModifiers];\n      newModifiers[index] = {...newModifiers[index], bid_modifier, status };\n      setAllModifiers(newModifiers);\n      updateModifiers(newModifiers);\n\n    }\n\n  }, [stateRef.current]);\n\n  const handleCeilingChange = (bid_ceiling, channel_id) => {\n    bid_ceiling = isNaN(parseFloat(bid_ceiling)) ? '' : parseFloat(bid_ceiling);\n    const index = stateRef.current.findIndex((mod) => mod.channel_id === channel_id);\n    if (index >= 0) {\n      const newModifiers = Object.assign([], stateRef.current); //[...allModifiers];\n      newModifiers[index] = {...newModifiers[index], bid_ceiling };\n      setAllModifiers(newModifiers);\n      updateModifiers(newModifiers);\n    }\n  };\n\n  // Update parent with items that have a bid modifier\n  const updateModifiers = (newModifiers) => {\n\n    let filtered = newModifiers.filter((cm) => cm.status === 'manual' && !isNaN(parseInt(cm.bid_modifier)));\n    // Remove channel_name and sort by channel_id\n    // or we get a false positive for formIsDirty\n    filtered = filtered.map((cm) => {\n      const { channel_name, ...rest } = cm;\n      return rest;\n    });\n    doSort(filtered, 'channel_id', true);\n    onChange('channel_modifiers', filtered);\n\n  };\n\n\n  const doSort = (arr, col, asc) => {\n    if (asc) {\n      arr.sort((a, b) => (a[col] > b[col] ? 1 : -1));\n    } else {\n      arr.sort((a, b) => (a[col] < b[col] ? 1 : -1));\n    }\n  };\n\n  const handleClear = (channel_id) => {\n    const newList = stateRef.current.map((mod) => {\n      if (mod.channel_id === channel_id) {\n        return {\n          ...mod,\n          bid_modifier: '',\n          bid_ceiling: '',\n          status: 'disabled',\n        };\n      }\n      return mod;\n    });\n    setAllModifiers(newList);\n    updateModifiers(newList);\n  };\n\n  const handlePostBulkUpdate = (newRule) => {\n    // Bulk update saves the rule, but only the channel_modifiers.\n    // It's possible that the rule has other changes before the update.\n    // Here, we are merging the new channel modifiers into the existing (and possibly changed) rule.\n    // TODO: this will probably reset the \"isDirty\" flag, removing the message. Can we preserve it?\n    rulesContext.api.setSelected({ ...newRule, ...rule, channel_modifiers: newRule.channel_modifiers }, true);\n  };\n\n  const handleChangeOverride = (e) => onChange('override_parent_channel_modifiers', e.target.checked);\n\n  return (\n    <div className=\"form-section channel-modifiers\">\n      <div className=\"form-section-header d-flex justify-content-between\">\n        <div>Channel Bid Modifiers</div>\n        {allowEdit && (\n          <Button size=\"sm\" color=\"link\" className=\"inline\" onClick={toggleBulkEditModal}>\n            <FaIcon icon=\"columns\" className=\"me-1\" />\n            Bulk Edit\n          </Button>\n        )}\n\n      </div>\n      <p>\n        Use a percentage to modify bids by channel. If not set, or zero, the channel will not be used.\n        {allowBidCeiling && <span> The bid ceiling is optional.</span>}\n      </p>\n\n\n      <div className=\"mt-3\">\n\n        { Object.keys(errors).length > 0 && (\n          <StandardAlert color=\"info\" className=\"validation\">\n            Please check that all active channels have a modifier value (0 to 5000%) or are blank\n          </StandardAlert>\n        )}\n\n        {!channels?.length && (\n          <StandardAlert color=\"light\" icon=\"alert\">\n            No channels found for this vertical and product\n          </StandardAlert>\n        )}\n\n        {/* For all but account rule, allow override choice */}\n        {!isRootRule && allModifiers.length > 0 && (\n          allowEdit ? (\n            <div className=\"form-section parent-override mb-3 d-flex\">\n              <div className=\"me-1\">\n                <Input\n                  name=\"override_parent_channel_modifiers\"\n                  type=\"checkbox\"\n                  defaultChecked={!!overrideParentModifiers}\n                  onChange={handleChangeOverride}\n                />\n              </div>\n              <div className=\"flex-fill\">\n                <Label>\n                  Override Parent Channel Modifiers\n                </Label>\n                <FormText> (Override parent modifiers instead of modifying them)</FormText>\n              </div>\n            </div>\n          ) : (\n            <div className=\"mb-3\">\n              <span>Override Parent Channel Modifiers: <strong>{overrideParentModifiers ? 'Yes' : 'No'}</strong></span>\n            </div>\n          )\n        )}\n\n        {channels?.length > 0 && (\n          <Row>\n            <Col sm={12}>\n\n              <LiveFilteringProvider filters={{channel_status:'active',bid_modifier:viewFilter === 'applied'}}>\n\n                <ModifierFilters\n                  channelsCount={allModifiers.length}\n                  modifiersCount={modifiers.length}\n                  onChangeView={handleChangeView}\n                />\n\n\n                <ModifierTable\n                  data={allModifiers}\n                  onBidChange={handleModifierChange}\n                  onCeilingChange={handleCeilingChange}\n                  onClear={handleClear}\n                  allowEdit={allowEdit}\n                  allowBidCeiling={allowBidCeiling}\n                  highlightApplied={viewFilter !== 'applied'}\n                />\n\n              </LiveFilteringProvider>\n\n            </Col>\n          </Row>\n\n\n        )}\n\n        <Suspense fallback={<div />}>\n          <LazyBulkEditChannelsModal\n            isOpen={bulkEditModal}\n            close={toggleBulkEditModal}\n            rule={rule}\n            onAfterSave={handlePostBulkUpdate}\n          />\n        </Suspense>\n\n      </div>\n\n    </div>\n  );\n};\n\nconst ModifierFilters = ({modifiersCount, channelsCount, onChangeView}) => {\n  const context = useContext(LiveFilteringContext);\n\n  const handleChangeView = (param, value) => {\n\n    context.updateFilter(param, value);\n    onChangeView(value); //sets local storage\n  }\n\n  return (\n    <>\n      <ListCount\n        allCount={channelsCount}\n        filteredCount={context.filteredCount}\n        modifierCount={modifiersCount}\n      />\n      <div className=\"above-table-filters mt-1 mb-3\">\n\n        <div className=\"boxed-filter search-filter flex-fill\">\n\n          <TextSearch\n            value={context.filters.channel_name ?? \"\"}\n            placeholder=\"Search...\"\n            onUpdate={(val) => context.updateFilter(\"channel_name\", val)}\n            onClear={() => context.resetFilter(\"channel_name\")}\n          />\n        </div>\n\n        <div className=\"ms-2 min-250\">\n          <Filter\n            placeholder=\"Status\"\n            param=\"channel_status\"\n            options={ChannelStatusChoices}\n            value={context.filters?.channel_status ?? \"\"}\n            onChange={context.updateFilter}\n            onClear={() => context.resetFilter(\"channel_status\")}\n            isMulti={false}\n          />\n        </div>\n\n        <div className=\"ms-2\">\n          <ButtonToggleFilter\n            param=\"bid_modifier\"\n            active={context.filters.bid_modifier || false}\n            onChange={handleChangeView}\n            labelOn=\"Applied\"\n            labelOff=\"All\"\n          />\n        </div>\n\n      </div>\n    </>\n\n  )\n}\nconst BidModifierInput = ({\n                            id, modifier=\"\", onChange,\n                          }) => {\n\n  // When we handle this as number, it tends to interpret '' as 0\n  const handleChangeDebounced = useDebouncedCallback((val, mask) => {\n    // Mask insists on 0 even if ''\n    val = mask.unmaskedValue || '';\n\n    // Mask seems to fire onAccept when we filter the list, even if the bid didn't change\n    // so test for change\n    if (val.toString() !== modifier.toString()) {\n      onChange(mask.unmaskedValue, id);\n    }\n  }, 600);\n\n\n  return (\n    <MaskedInputGroup\n      mask={Number}\n      unmask=\"typed\"\n      padFractionalZeros={false}\n      scale={0}\n      min={0}\n      max={MAX_MODIFIER}\n      type=\"text\"\n      name=\"name\"\n      onAccept={handleChangeDebounced}\n      value={modifier}\n      suffix=\"%\"\n      className=\"teeny\"\n    />\n  )\n};\n\n\n\nconst BidCeilingInput = ({\n                           channelId, bidCeiling='', disabled = false, onChange,\n                         }) => {\n  const handleChangeDebounced = useDebouncedCallback((val, mask) => {\n    if (mask.unmaskedValue.toString() !== bidCeiling.toString()) {\n      onChange(mask.unmaskedValue, channelId);\n    }\n  }, 600);\n\n  return (\n    <MaskedInputGroup\n      mask={Number}\n      unmask=\"typed\"\n      padFractionalZeros\n      scale={2}\n      min={0}\n      max={999}\n      radix=\".\"\n      type=\"text\"\n      name=\"name\"\n      onAccept={handleChangeDebounced}\n      value={bidCeiling}\n      prefix=\"$\"\n      className=\"teeny\"\n      disabled={disabled}\n    />\n  )\n};\n\n\n\n// eg, 50 channels available (30 shown), 2 applied modifiers\nconst ListCount = ({filteredCount, allCount, modifierCount}) => {\n  return (<small className=\"list-count\">\n    {allCount} channels available {filteredCount < allCount && (<span> ({filteredCount || \"none\"} shown)</span>)},\n    {' '}{modifierCount || 'no'} {singularOrPlural(modifierCount, 'modifier', 'modifiers')} applied\n  </small>)\n};\n\n\n\nconst BidCell = ({channelId, modifier, onChange, allowEdit}) => {\n\n  return (\n    <div>\n      {allowEdit ? (\n        <BidModifierInput\n          id={channelId}\n          modifier={modifier}\n          onChange={onChange}\n        />\n      ) : (\n        <span>\n          {modifier > 0 ? `${modifier}%` : modifier === 0 ? '0' : <>&mdash;</>}\n        </span>\n      )}\n\n    </div>\n  );\n}\n\nconst ChannelCell = ({name, status, modifier}) => {\n  return (\n    <div className={classnames({archived:status === 'archived', blocked:modifier === 0})}>\n      <span className=\"channel-name\">{name}</span>\n      {status === 'archived' && (\n        <>\n          <span className=\"channel-tag inactive-channel\">Inactive</span>\n          <HelpPopper name=\"inactive-channel\" title=\"Inactive Channel\">\n            This channel is no longer active.\n          </HelpPopper>\n        </>\n\n      )}\n      {modifier === 0 && (\n        <>\n          <span className=\"channel-tag blocked-channel\">Blocked</span>\n          <HelpPopper name=\"blocked-channel\" title=\"Blocked Channel\">\n            When the bid modifier is zero, activity on this channel is blocked.\n          </HelpPopper>\n        </>\n\n      )}\n    </div>\n  )\n}\n\nconst ModifierTable = ({data, onBidChange, onCeilingChange, onClear, allowBidCeiling, allowEdit, highlightApplied}) => {\n\n  const getRowClassName = useCallback((row) => {\n    if (!highlightApplied) return '';\n    const { bid_modifier, bid_ceiling } = row.original;\n    return (!isNaN(parseInt(bid_modifier)) || bid_ceiling) ? 'row-applied' : '';\n  }, [highlightApplied]);\n\n  // hide columns depending on permissions\n  const initialTableState = useMemo(() => {\n    const state = {\n      sortBy: [{ id: 'channel_name', desc: false }],\n      hiddenColumns: []\n    };\n    if (!allowBidCeiling) {\n      state.hiddenColumns.push('bid_ceiling')\n    }\n    if (!allowEdit) {\n      state.hiddenColumns.push('clear-btn-col')\n    }\n    return state;\n  }, []);\n\n  const columns = useMemo(() => [\n    {\n      Header: 'Name',\n      accessor: 'channel_name',\n      defaultCanSort: true,\n      minWidth: 200,\n      className: 'name-cell',\n      Cell: ({row, value}) => <ChannelCell name={value} modifier={row.original.bid_modifier} status={row.original.channel_status} />\n    },\n    {\n      Header: 'Status',\n      accessor: 'channel_status',\n      defaultCanSort: true,\n      maxWidth: 120,\n      className: 'status-cell',\n      disableGlobalFilter: true,\n      Cell: ({ value }) => <StatusToggler status={value} allowEdit={false} />,\n      filter: (rows, colIds, filterVal) => {\n        if (filterVal && filterVal !== 'any') {\n          return rows.filter((row) => row.original.channel_status === filterVal)\n        }\n\n        return rows\n      }\n    },\n    {\n      Header:'Bid Modifier',\n      headerClasses: 'channel-modifer-bid-column',\n      accessor: 'bid_modifier',\n      Cell: ({row, value}) => <BidCell\n        channelId={row.original.channel_id} /* not used */\n        modifier={value}\n        onChange={onBidChange}\n        allowEdit={allowEdit}\n      />,\n      maxWidth:100,\n      filter: (rows, colIds, filterVal) => {\n        // filterVal will be boolean. True = return rows where a modifier is set\n        if (filterVal) {\n          return rows.filter((row) => {\n            return  !isNaN(parseInt(row.original.bid_modifier))\n          })\n        }\n        return rows;\n      }\n    },\n    {\n      Header: 'Bid Ceiling',\n      headerClasses: 'channel-ceiling-column',\n      accessor: 'bid_ceiling',\n      Cell: ({row, value}) => allowEdit ? (\n        <BidCeilingInput\n          bidCeiling={value}\n          channelId={row.original.channel_id}\n          disabled={row.original.bid_modifier === ''}\n          onChange={onCeilingChange}\n        />\n      ) : (\n        <span>{value ? `$${parseFloat(value).toFixed(2)}` : <>&mdash;</>}</span>\n      ),\n      maxWidth: 120,\n    },\n    {\n      Header: '',\n      id: 'clear-btn-col',\n      Cell: ({row}) => <div>\n        { (row.original.bid_modifier !== '' || row.original.bid_ceiling !== '') && (\n          <Button\n            color=\"link\"\n            size=\"sm\"\n            className=\"ms-1 p-0\"\n            onClick={() => onClear(row.original.channel_id)}\n            title=\"Remove channel modifier\"\n          >\n            clear\n          </Button>\n        )}\n\n      </div>,\n      width:100\n    }\n  ], [])\n\n  return (\n    <FlexTable\n      columns={columns}\n      initialState={initialTableState}\n      className=\"channel-modifiers-table striped\"\n      data={data}\n      noDataMessage=\"No modifiers found\"\n      getRowClassName={getRowClassName}\n    />\n  )\n}\n\nChannels.propTypes = {\n  rule: PropTypes.object,\n  channels: PropTypes.array,\n  modifiers: PropTypes.array,\n  onChange: PropTypes.func,\n  overrideParentModifiers: PropTypes.bool,\n  isRootRule: PropTypes.bool,\n  errors: PropTypes.object,\n};\n\nexport default Channels;\n","import React, { useRef, useContext } from 'react';\nimport { Button, Col, Row } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport IntegrationSettings from '../../../../Components/Rules/IntegrationSettings';\nimport useCollectionTracker from '../../../../Hooks/useCollectionTracker';\n// import {useDebouncedCallback} from \"use-debounce\";\nimport usePermission from '../../../../Hooks/usePermission';\n\nconst Prefill = ({ integration, errors = {}, onChange }) => {\n  const allowEdit = usePermission('integrations.edit');\n  const rulesContext = useContext(RulesContext);\n  const definitionsRef = useRef(rulesContext.api.getIntegrationDefinitionsByType('prefill'));\n\n  const {\n    api: collection,\n    willDeleteIndex,\n    editIndex,\n    addMode,\n  } = useCollectionTracker();\n\n  const handleUpdateIntegration = (intg) => onChange({ integration: intg });\n\n  const handleDelete = () => {\n    collection.onDelete();\n    onChange({});\n  };\n\n  const handleAdd = () => {\n    collection.add(0);\n    onChange({\n      integration: { name: '', settings: {} },\n    });\n  };\n\n  // const handleChangeTemplateDebounced = useDebouncedCallback( (template) =>{\n  //   onChange({integration, template})\n  // }, 700);\n\n  const hasIntegration = integration && Object.keys(integration).length > 0;\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Prefill Integrations</div>\n      <p>Configure integration with external systems such as CRMs</p>\n\n      {definitionsRef.current.length === 0 && <StandardAlert color=\"light\" icon=\"alert\">No integration definitions found for product and vertical</StandardAlert>}\n\n      <Row>\n        <Col lg={12} xl={9}>\n\n          {hasIntegration ? (\n            <Row>\n              <Col>\n                <IntegrationSettings\n                  config={integration}\n                  definitions={definitionsRef.current}\n                  type=\"prefill\"\n                  editMode={editIndex === 0}\n                  isNew={addMode}\n                  errors={errors}\n                  onUpdate={handleUpdateIntegration}\n                  onDelete={handleDelete}\n                  onApply={collection.apply}\n                  setEdit={collection.edit}\n                  allowEdit={allowEdit}\n                  willDelete={willDeleteIndex === 0}\n                  setWillDelete={(i) => collection.setWillDeleteIndex(i)}\n                  allowControls={allowEdit}\n                />\n              </Col>\n            </Row>\n          ) : (\n            <>\n              {allowEdit ? (\n                <Button color=\"link\" onClick={handleAdd} disabled={editIndex !== null}>\n                  <FaIcon icon=\"plus\" />\n                  {' '}\n                  Add Integration\n                </Button>\n              ) : (\n                <StandardAlert color=\"light\" icon=\"info\">No prefill integration is configured.</StandardAlert>\n              )}\n            </>\n          )}\n\n        </Col>\n      </Row>\n\n    </div>\n\n  );\n};\n\nPrefill.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  integration: PropTypes.object.isRequired,\n  errors: PropTypes.object,\n};\nPrefill.defaultProps = {\n  integration: {},\n};\nexport default Prefill;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Button,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport IntegrationSettings from '../../../../Components/Rules/IntegrationSettings';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport usePermission from \"../../../../Hooks/usePermission\";\n\n\nconst SipConfig = ({sip={}, onChange, error}) => {\n  const [editMode, setEditMode] = useState(false);\n  const [willDelete, setWillDelete] = useState(false);\n  const allowEdit = usePermission('orders.edit');\n  // We are pretending this is an integration so we can use the\n  // integration component\n  const configDef = [\n    {\n      name: 'sip',\n      label: 'Sip Configuration',\n      type: 'sip',\n      supported_settings: [\n        { name: 'uri', label: 'URI', input_type: 'text' },\n        { name: 'username', label: 'User Name', input_type: 'text' },\n        { name: 'password', label: 'Password', input_type: 'text' },\n        { name: 'headers', label: 'Headers', input_type: 'keyvalue' },\n      ],\n    }\n  ];\n\n  const handleUpdate = (sip) => onChange(sip);\n\n  const handleAdd = () => {\n    if (allowEdit) {\n      onChange({ name: 'sip', settings: {} });\n      setEditMode(true);\n    }\n\n  }\n\n  const handleApply = () => setEditMode(false);\n\n  const handleDelete = () => {\n    if (allowEdit) {\n      onChange({ });\n      setEditMode(false);\n      setWillDelete(false);\n    }\n\n  };\n\n  const toggleEdit = () => setEditMode(!editMode);\n\n  // \"Will Delete\" prompt\n  // Configuration provides an index number if turning on the prompt\n  const handleWillDelete = (val) => setWillDelete(val === 0);\n\n  return (\n    <div className=\"sip-configuration\">\n\n      {error\n      && (\n        <StandardAlert color=\"info\" className=\"validation\">\n          {error}\n        </StandardAlert>\n      )}\n\n      {/* Since this is not a collection of configurations, it's always \"new\" */}\n      {Object.keys(sip).length > 0 || editMode ? (\n        <IntegrationSettings\n          index={0}\n          config={sip}\n          definitions={configDef}\n          type=\"sip\"\n          editMode={editMode}\n          isNew={!sip.settings || Object.keys(sip.settings).length === 0}\n          errors={{}}\n          onUpdate={handleUpdate}\n          onDelete={handleDelete}\n          onApply={handleApply}\n          setEdit={toggleEdit}\n          willDelete={willDelete}\n          setWillDelete={handleWillDelete}\n          allowControls\n          allowEdit={allowEdit}\n          showServiceChooser={false}\n        />\n      ) : (\n        <Button color=\"link\" onClick={handleAdd} disabled={!allowEdit}>\n          <FaIcon icon=\"cog\" className=\"me-1\" />\n          Configure SIP\n        </Button>\n      )}\n    </div>\n  );\n};\n\nSipConfig.propTypes = {\n  error: PropTypes.string,\n  onChange: PropTypes.func.isRequired,\n  sip: PropTypes.object.isRequired\n};\n\nexport default SipConfig;\n\n","import React, { useContext,  useRef, useState, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Row, Col, FormText, FormGroup, Label, Button, Input, FormFeedback\n} from \"reactstrap\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport RulesContext from '../../../../Providers/RulesContext';\nimport DeliveryDestinations from '../../../../Components/Rules/DeliveryDestinations';\nimport Prefill from './Prefill';\nimport SipConfig from './SipConfig';\nimport {TokenTextarea} from \"@thedmsgroup/mastodon-ui-components\";\nimport useApi from \"../../../../Hooks/useApi\";\nimport {HelpPopper} from \"@thedmsgroup/mastodon-ui-components\";\n\n\nconst Destination = ({ allowEdit = true, ...props }) => {\n  const rulesContext = useContext(RulesContext);\n  const deliveryDefinitionsRef = useRef(rulesContext.api.getIntegrationDefinitionsByType('delivery'));\n  const preTransferDefinitionsRef = useRef(rulesContext.api.getIntegrationDefinitionsByType('pre_transfer'));\n  const debugApi = useApi('debug', 'template');\n  const[redirectUrl, setRedirectUrl] = useState(props.redirectUrl);\n  const[redirectUrlTemplate, setRedirectUrlTemplate] = useState(props.redirectUrlTemplate);\n\n  const handleDeliveryChange = (destinations) => {\n    props.onChange('delivery_destinations', destinations);\n  };\n\n  const handleCallStartedWebhookChange = (destinations) => {\n    props.onChange('call_started_webhooks', destinations);\n  };\n\n  const handleCallEndedWebhookChange = (destinations) => {\n    props.onChange('call_ended_webhooks', destinations);\n  };\n\n  const handlePreTransferIntegrationsChange = (destinations) => {\n    props.onChange('pre_transfer_integrations', destinations);\n  };\n\n  const handlePrefillChange = (prefill) => {\n    props.onChange('prefill', prefill);\n  };\n\n  const handleSipChange = (sip) => {\n    props.onChange('destination_sip', sip);\n  };\n\n\n  const handleChangeRedirectUrl = useCallback((val) => {\n    setRedirectUrl(val);\n    props.onChange('redirect_url', val);\n  }, []);\n\n\n  const handleChangeRedirectUrlTemplate = (val) => {\n    setRedirectUrlTemplate(val);\n    props.onChange('redirect_url_template', val);\n  };\n\n  const handleClickDestinationNumberAncestor = () => {\n    const targetRule = rulesContext.api.getRule(props.propAncestors.destination_number.id);\n    targetRule && rulesContext.api.setSelected(targetRule);\n  };\n\n  const handleUrlPreview = async(url) => {\n    const result =  await debugApi.fetch( {\n      template:url\n    });\n    return result ? result.result : \"\";\n  }\n\n  const { errors } = props;\n\n  return (\n    <div>\n      {(errors.destination_number || errors.delivery_destinations || errors.destination_sip)\n          && (\n          <StandardAlert color=\"info\" className=\"validation\">\n            Please correct the errors below before continuing\n          </StandardAlert>\n      )}\n      { props.product === 'clicks' && (\n        <>\n          <div className=\"form-section\">\n            <div className=\"form-section-header\">Redirect URL</div>\n            {allowEdit ? (\n              <>\n                <Row className=\"mb-3\">\n                  <Col lg={12} xl={9}>\n                    <FormGroup>\n                      <TokenTextarea\n                        tokens={props.tokens}\n                        text={redirectUrl || \"\"}\n                        onChange={handleChangeRedirectUrl}\n                        rows={3}\n                        label=\"Redirect URL\"\n                        onPreview={handleUrlPreview}\n                      />\n                      <FormText className=\"mb-2\">\n                        The visitor will be redirected to this URL upon clicking an ad.\n                        Insert lead data by providing placeholder names surrounded by braces:\n                        <i>&amp;insured=&#123;currently_insured&#125;</i>\n                        .&nbsp;\n                        This destination may be overriden by prefill or proxy integration, if set.\n                      </FormText>\n                    </FormGroup>\n                  </Col>\n                </Row>\n\n                <Row className=\"mb-3\">\n                  <Col lg={12} xl={9}>\n                    <FormGroup>\n                      <TokenTextarea\n                        tokens={props.tokens}\n                        text={redirectUrlTemplate || \"\"}\n                        onChange={handleChangeRedirectUrlTemplate}\n                        rows={3}\n                        label=\"Redirect URL Template\"\n                        onPreview={handleUrlPreview}\n                      />\n                      <FormText>\n                        If receiving a redirect URL from a third party integration, use this template to add additional parameters.\n                        <br />\n                        You can use\n                        {' '}\n                        <i>&#123;redirect_url&#125;</i>\n                        {' '}\n                        as a placeholder for the provided URL. Or, if only query string parameters are specified,\n                        they will be appended to the given redirect URL (for example,d\n                        {' '}\n                        <i>insured=&#123;currently_insured&#125;&amp;sub1=&#123;sub_1&#125;</i>\n                        )\n                      </FormText>\n                    </FormGroup>\n                  </Col>\n                </Row>\n              </>\n            ) : (\n              <>\n                <div className=\"mb-3\">\n                  <Label>Redirect URL</Label>\n                  <div>{redirectUrl || <span className=\"text-muted\">Not configured</span>}</div>\n                </div>\n                {redirectUrlTemplate && (\n                  <div className=\"mb-3\">\n                    <Label>Redirect URL Template</Label>\n                    <div>{redirectUrlTemplate}</div>\n                  </div>\n                )}\n              </>\n            )}\n          </div>\n\n          <FormGroup>\n            <Prefill\n              onChange={handlePrefillChange}\n              integration={props.prefill.integration}\n                  /* template={props.prefill.template} */\n              errors={errors.prefill}\n            />\n          </FormGroup>\n\n        </>\n      )}\n\n      { props.product === 'calls' && (\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Call Destination</div>\n        <p>Enter a phone number or configure SIP transfer.</p>\n\n        {/* would like to  use a link to ancestor\n                Need to call rulesContext.setSelected(rule, tab)\n                */}\n\n        {props.propAncestors.destination_number && (\n        <Row>\n          <Col sm={12} md={8}>\n            <p>\n              The ancestor rule{' '}\n              <Button color=\"link\" size=\"sm\" className=\"inline\" onClick={handleClickDestinationNumberAncestor}>{props.propAncestors.destination_number.label}</Button>\n              {' '}  has the value {props.propAncestors.destination_number.value}. The ancestor value will be used if no value is entered here.\n            </p>\n\n          </Col>\n        </Row>\n        )}\n\n        <Row>\n          <Col sm={12} md={6}>\n            <FormGroup>\n              <Label >Phone Number\n                <HelpPopper\n                name=\"phone-number-help\"\n                iconClass=\"ms-1\"\n              >\n                <p>The phone number should be a 10 digit number prefixed with &quot;+1&quot;, with no dashes or spaces.</p>\n                  <p>A Twilio template can be appended to the number.</p>\n              </HelpPopper>\n              </Label>\n\n              {allowEdit ? (\n                <>\n                  <Input\n                    bsSize=\"sm\"\n                    name=\"destination_number\"\n                    placeholder=\"10 digit number\"\n                    value={props.destinationNumber || ''}\n                    onChange={props.onChange}\n                    error={errors.destination_number}\n                    invalid={!!errors.destination_number}\n                  />\n                  <FormFeedback>{errors.destination_number}</FormFeedback>\n                </>\n              ) : (\n                <div>{props.destinationNumber || <span className=\"text-muted\">Not configured</span>}</div>\n              )}\n\n            </FormGroup>\n          </Col>\n\n        </Row>\n\n        <Row className=\"mt-2\">\n          <Col lg={12} xl={9}>\n            <FormGroup>\n              <div><Label>SIP Transfer</Label></div>\n              <FormText>Configuring SIP will override the destination phone number</FormText>\n\n              <SipConfig sip={props.destinationSip} onChange={handleSipChange} error={errors.destination_sip} />\n\n            </FormGroup>\n\n          </Col>\n        </Row>\n\n      </div>\n      )}\n\n      { props.product === 'calls' && (\n      <div className=\"mt-2\">\n        <DeliveryDestinations\n          definitions={deliveryDefinitionsRef.current}\n          label=\"Call Started Integrations\"\n          destinations={props.callStartedWebhooks}\n          onChange={handleCallStartedWebhookChange}\n          errors={errors}\n        />\n        <DeliveryDestinations\n          definitions={deliveryDefinitionsRef.current}\n          label=\"Call Ended Integrations\"\n          destinations={props.callEndedWebhooks}\n          onChange={handleCallEndedWebhookChange}\n          errors={errors}\n        />\n        <DeliveryDestinations\n          definitions={preTransferDefinitionsRef.current}\n          label=\"Pre-Transfer Integrations\"\n          destinations={props.preTransferIntegrations}\n          onChange={handlePreTransferIntegrationsChange}\n          errors={errors}\n        />\n      </div>\n      )}\n\n      <div className=\"mt-2\">\n        <DeliveryDestinations\n          definitions={deliveryDefinitionsRef.current}\n          label=\"Post-Sale Integrations\"\n          description=\"Configure post-sale deliveries or web hooks.\"\n          destinations={props.deliveryDestinations}\n          onChange={handleDeliveryChange}\n          errors={errors}\n        />\n      </div>\n\n    </div>\n  );\n};\n\nDestination.propTypes = {\n  redirectUrl: PropTypes.string,\n  redirectUrlTemplate: PropTypes.string,\n  prefill: PropTypes.object,\n  // deliverySettings: PropTypes.string,\n  deliveryDestinations: PropTypes.array,\n  callStartedWebhooks: PropTypes.array,\n  callEndedWebhooks: PropTypes.array,\n  preTransferIntegrations: PropTypes.array,\n  destinationNumber: PropTypes.string,\n  twilioTemplate: PropTypes.string,\n  destinationSip: PropTypes.object,\n  tokens: PropTypes.array,\n  product: PropTypes.string,\n  verticalId: PropTypes.number,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n};\n\nDestination.defaultProps = {\n  deliveryDestinations: [],\n  callStartedWebhooks: [],\n  callEndedWebhooks: [],\n  preTransferIntegrations: [],\n}\n\nexport default Destination;\n","import React from 'react';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport PixelForm from '../../../../Components/Form/PixelForm';\nimport useUniqueKeyArray from '../../../../Hooks/useUniqueKeyArray';\n\n/*\n * Tracking: a page for entering tracking pixels associated with a rule.\n */\nconst Tracking = ({\n  impressionUrls, clickUrls, onChange, errors, allowEdit = true,\n}) => {\n\n  const {\n    items: keyedClickUrls,\n    addItem: addClickUrl,\n    removeItem: removeClickUrl,\n    updateItem: updateClickUrl,\n  } = useUniqueKeyArray(clickUrls, (items) => onChange('click_urls', items));\n\n  const {\n    items: keyedImpUrls,\n    addItem: addImpUrl,\n    removeItem: removeImpUrl,\n    updateItem: updateImpUrl,\n  } = useUniqueKeyArray(impressionUrls, (items) => onChange('impression_urls', items));\n\n\n  if (!allowEdit) {\n    return (\n      <>\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Impression Pixels</div>\n          {impressionUrls.length === 0 ? (\n            <span className=\"text-muted\">No pixels configured</span>\n          ) : (\n            impressionUrls.map((url, i) => (\n              <div key={i} className=\"mb-1\"><code>{url}</code></div>\n            ))\n          )}\n        </div>\n\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Click Pixels</div>\n          {clickUrls.length === 0 ? (\n            <span className=\"text-muted\">No pixels configured</span>\n          ) : (\n            clickUrls.map((url, i) => (\n              <div key={i} className=\"mb-1\"><code>{url}</code></div>\n            ))\n          )}\n        </div>\n      </>\n    );\n  }\n\n  return (\n    <>\n\n      {errors.impression_urls\n        && (\n        <StandardAlert color=\"warning\">\n          {errors.impression_urls}\n        </StandardAlert>\n        )}\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Impression Pixels</div>\n        <p>Enter URLs or tags for tracking impressions.</p>\n\n        {keyedImpUrls.length === 0\n          && (\n          <StandardAlert color=\"light\">\n            <span>\n              No impression pixels are configured.\n              <Button color=\"link\" className=\"inline ms-1\" onClick={addImpUrl}>\n                <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />\n                <span>Add a pixel</span>\n              </Button>\n&nbsp;\n            </span>\n          </StandardAlert>\n          )}\n\n        <div>\n\n          {keyedImpUrls.map((px, i) => (\n            <PixelForm\n              pixel={px.value}\n              className=\"impression-pixel\"\n              handleRemove={() => removeImpUrl(i)}\n              handleChange={(val) => updateImpUrl(i, val)}\n              key={px.key}\n            />\n          ))}\n\n          {keyedImpUrls.length > 0 && (\n            <div className=\"text-right\">\n              <Button color=\"link\" onClick={addImpUrl}>\n                <FaIcon icon=\"plus\" />\n                {' '}\n                <span>Add Another</span>\n              </Button>\n            </div>\n          )}\n        </div>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Click Pixels</div>\n        <p>Enter URLs or tags for tracking clicks.</p>\n\n        {keyedClickUrls.length === 0\n        && (\n        <StandardAlert color=\"light\">\n          <span>\n            No click pixels are configured.\n            <Button color=\"link\" className=\"inline ms-1\" onClick={addClickUrl}>\n              <FaIcon icon=\"plus\" size=\"sm\" className=\"me-1\" />\n              <span>Add a pixel</span>\n            </Button>\n&nbsp;\n          </span>\n        </StandardAlert>\n        )}\n\n        <div>\n\n          {keyedClickUrls.map((px, i) => (\n            <PixelForm\n              pixel={px.value}\n              className=\"click-pixel\"\n              handleRemove={() => removeClickUrl(i)}\n              handleChange={(val) => updateClickUrl(i, val)}\n              key={px.key}\n            />\n          ))}\n\n          {clickUrls.length > 0 && (\n          <div className=\"text-right\">\n            <Button color=\"link\" onClick={addClickUrl}>\n              <FaIcon icon=\"plus\" />\n              {' '}\n              <span>Add Another</span>\n            </Button>\n          </div>\n          )}\n        </div>\n      </div>\n\n    </>\n  );\n};\n\nTracking.propTypes = {\n  impressionUrls: PropTypes.array,\n  clickUrls: PropTypes.array,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n};\n\nexport default Tracking;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Row, Col, FormGroup, Label, FormText, Button, Input,\n} from 'reactstrap';\nimport {MaskedInputGroup} from \"@thedmsgroup/mastodon-ui-components/lib/components/Form/MaskedInput\";\nimport Flatpickr from 'react-flatpickr';\nimport { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport IconCheckbox from '../../../../Components/Form/IconCheckbox';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport useTimezoneDisplay from '../../../../Hooks/useTimezoneDisplay';\nimport {TokenTextarea} from \"@thedmsgroup/mastodon-ui-components\";\nimport {startOfHour, startOfMinute, addHours, compareAsc} from \"date-fns\";\nimport DynamicEnhancedSelect from \"../../../../Components/Form/DynamicEnhancedSelect\";\n\n// Mask ddd,ddd\n// const modifierMask = createNumberMask({\n//   prefix: '',\n//   allowDecimal: false,\n//   integerLimit: 3,\n// });\n\n/*\n * Special settings for advanced life forms only\n */\nconst Advanced = ({\n  buyer_name,\n  buyer_group,\n  dbaId,\n  internalBidModifier,\n  qualifyingRateStart,\n  trackQualifyingRate,\n  ignoreSaleRate,\n  vendorAttributes,\n  excludeProfitReporting,\n  searchableLeads,\n  searchableLeadsEffective,\n  isRootRule,\n  billMissedCalls,\n  maxUnqualifiedCalls,\n  unqualifiedCallsStart,\n  duplicateWindow,\n  tokens,\n  timezone,\n  onChange,\n  errors,\n}) => {\n  const ctx = useContext(RulesContext);\n\n  const defaultRateStart = startOfHour(addHours(new Date(), 1));\n\n  const { timezoneDisplay } = useTimezoneDisplay(timezone);\n\n  const pickerOptions = {\n    enableTime: true,\n    allowInput: true,\n    maxDate: defaultRateStart, //'today',\n    // minDate: \"today\",\n    dateFormat: 'Y-m-d H:i',\n    altInput: true,\n    altFormat: 'F j, Y h:i K',\n    minuteIncrement: 15,\n    isRangeValid: true,\n    defaultHour: 0,\n    defaultMinute: 0,\n    // onChange does not fire when typing in the input, only when you tab out\n    // of the input or pick from the dropdown. This onClose function is a workaround.\n    // https://github.com/flatpickr/flatpickr/issues/1551#issuecomment-522942541\n    onClose(dates, currentdatestring, picker){\n      picker.setDate(picker.altInput.value, true, picker.config.altFormat)\n    }\n    // parseDate: (strDate, format) => {\n    //   const pd =  utcToLocalDate(strDate, timezone);\n    //   console.log('Advanced.js:parseDate: ', pd, ', FROM: ', strDate, \", Format:\"+format);\n    //   return pd;\n    // },\n  };\n\n  // Restrict a date to now or past\n  const dateUpToNow = (date) => {\n    const now = new Date();\n    return compareAsc(date, now) === 1 ? now : date;\n  }\n\n  const handleChangeQRResetDate = (date) => {\n    if (date) {\n      // const utc = dateToUTC(date, timezone);\n      const utc = zonedTimeToUtc(startOfMinute(dateUpToNow(date)), timezone).toISOString();\n      onChange('qualifying_rate_start', utc);\n    }\n  };\n\n  const handleClearQRStartDate = () => {\n    onChange('qualifying_rate_start', null);\n  };\n\n\n  const handleQRStartDateNow = () => {\n    const now = startOfMinute(new Date());\n    onChange('qualifying_rate_start', zonedTimeToUtc(now, timezone).toISOString());\n  };\n\n  const handleChangeResetUnqualifiedDate = (date) => {\n    if (date) {\n      const utc = zonedTimeToUtc(startOfMinute(dateUpToNow(date)), timezone).toISOString();\n      onChange('unqualified_calls_start', utc);\n    }\n  };\n\n  const handleUnqualifiedCallsStartDateNow = () => {\n    const now = startOfMinute(new Date());\n    onChange('unqualified_calls_start', zonedTimeToUtc(now, timezone).toISOString());\n  };\n\n\n  const handleClearUnqualifiedCallsStartDate = () => {\n    onChange('unqualified_calls_start', null);\n  };\n\n  // API is fussy about this true/false/null setting\n  // We need to ensure that the empty value is set to the API as null\n  const handleChangeBillMissedCalls = (e) => {\n    onChange('bill_missed_calls', e.target.value === '' ? null : e.target.value === 'true');\n  };\n\n  const handleChangeVendorAttributes = (value) => {\n    onChange('vendor_attributes', value);\n  };\n\n  const handleChangeDba = (id) => {\n    onChange('dba_id', id);\n  }\n\n  const handleUrlPreview = async(url) => {\n    const result =  await debugApi.fetch( {\n      template:url\n    });\n    return result ? result.result : \"\";\n  }\n\n  return (\n    <div>\n      {(errors.internal_bid_modifier || errors.qualifying_rate_start || errors.vendor_attributes)\n      && (\n      <StandardAlert color=\"info\" className=\"validation\">\n        Please correct the errors below before continuing\n      </StandardAlert>\n      )}\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Sale Rate Tracking</div>\n        <p>By default, the ratio of sales vs non-sales is included in bidding calculations and affects future win rate. Settings in this section allow you to customize this behavior.</p>\n\n        <IconCheckbox\n          name=\"ignore_sale_rate\"\n          value={Boolean(ignoreSaleRate)}\n          onChange={onChange}\n          className=\"mt-3\"\n        >\n          Disable Sale Rate\n        </IconCheckbox>\n\n        <IconCheckbox\n          name=\"track_qualifying_rate\"\n          value={Boolean(trackQualifyingRate)}\n          onChange={onChange}\n          className=\"mt-3\"\n        >\n          Track Sale Rate specific to this Rule\n        </IconCheckbox>\n        <p>By default, sale rate is tracked between source and buyer. If you enable this setting, this rule is tracking its own qualifying rate.\n          You might do this if there is something special about this rule that significantly affects sale rate, and you want to isolate this behavior from the overall sale rate.</p>\n\n        <div className=\"mt-3\">\n          <Row>\n\n            <Col sm={12} md={9}>\n\n              <FormGroup>\n                <Label>\n                  Start Date\n                </Label>\n                <p>Start rate tracking from the specified date. If not set,\n                  all available historic data will be used.</p>\n\n\n                <div className=\"d-flex align-items-center\">\n                  <div style={{flexBasis:'300px'}}>\n                    <Flatpickr\n                      options={pickerOptions}\n                      value={qualifyingRateStart ? utcToZonedTime(new Date(qualifyingRateStart), timezone) : null}\n                      className=\"form-control\"\n                      placeholder=\"Set a date and time\"\n                      onChange={(dates) => handleChangeQRResetDate(dates[0])}\n                    />\n\n                  </div>\n\n                  {qualifyingRateStart && <Button color=\"link\" className=\"ms-1\" onClick={handleClearQRStartDate}>Clear</Button>}\n                  <Button color=\"link\"  onClick={handleQRStartDateNow}>Set to Now</Button>\n\n                </div>\n\n                {timezoneDisplay && <FormText><i>Timezone: {timezoneDisplay} </i></FormText> }\n\n              </FormGroup>\n\n            </Col>\n          </Row>\n        </div>\n\n      </div>\n\n      <div className=\"form-section mt-2\">\n        <div className=\"form-section-header\">Internal Bid Modifier</div>\n        <p>Modifies internal bid for sorting purposes. Does not affect the actual bid shown to vendors.</p>\n\n        <FormGroup>\n          <MaskedInputGroup\n            mask={Number}\n            unmask=\"typed\"\n            padFractionalZeros={false}\n            scale={0}\n            min={-1}\n            name=\"internal_bid_modifier\"\n            value={internalBidModifier || ''}\n            onChange={onChange}\n            suffix=\"%\"\n            className=\"teeny\"\n          />\n          <FormText>Set to -1 to enable shadow bidding.</FormText>\n        </FormGroup>\n      </div>\n\n      <div className=\"form-section mt-2\">\n        <div className=\"form-section-header\">DBA (Doing Business As)</div>\n        <p>Select the DBA Name you would like to relate with this match.</p>\n        <FormGroup>\n\n          <DynamicEnhancedSelect\n            onChange={handleChangeDba}\n            value={dbaId || ''}\n            name=\"dba_id\"\n            endpoint=\"dbas\"\n            params={{limit:1000}}\n            labelProperty=\"name\"\n            className=\"w-50\"\n            isClearable\n            isSearchable\n          />\n        </FormGroup>\n      </div>\n\n\n      <div className=\"form-section mt-2\">\n        <div className=\"form-section-header\">Buyer Name / Group</div>\n        <StandardAlert icon=\"alert\" >This setting will be deprecated. Please use DBA above.</StandardAlert>\n        <p>Attributes bids to specified buyer/group. This is used to de-duplicate bids within a feed - only one bid per buyer name is returned inside a single feed.</p>\n\n        <FormGroup>\n          <Label>Buyer Name</Label>\n          <Input\n            name=\"buyer_name\"\n            value={buyer_name || ''}\n            onChange={onChange}\n            placeholder=\"defaults to account name\"\n            className=\"w-25\"\n          />\n        </FormGroup>\n\n        <FormGroup>\n          <Label>Buyer Group</Label>\n          <Input\n            name=\"buyer_group\"\n            value={buyer_group || ''}\n            onChange={onChange}\n            placeholder=\"defaults to account buyer group\"\n            className=\"w-25\"\n          />\n        </FormGroup>\n      </div>\n\n      <div className=\"form-section mt-2\">\n        <div className=\"form-section-header\">Vendor Attributes</div>\n        <p>\n          Provide data to the vendor in match responses. Insert placeholder data with token names surrounded\n          by braces (in quotes):\n          <i>&quot;insured&quot;:&quot;&#123;currently_insured&#125;&quot;</i>\n          .&nbsp;\n        </p>\n        <FormGroup className=\"mt-2\">\n\n          <FormText className=\"mb-2\" />\n\n            <TokenTextarea\n              tokens={tokens}\n              text={vendorAttributes || \"\"}\n              onChange={handleChangeVendorAttributes}\n              rows={5}\n              error={errors.vendor_attributes}\n              invalid={Boolean(errors.vendor_attributes)}\n            />\n\n        </FormGroup>\n\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Exclude from Profit Reporting</div>\n        <p>Do not log revenue to DMS Profit Reporting. This will apply to all descendant rules.</p>\n\n        <IconCheckbox\n          name=\"exclude_profit_reporting\"\n          value={Boolean(excludeProfitReporting)}\n          onChange={onChange}\n          className=\"mt-3\"\n        >\n          Exclude from profit reporting\n        </IconCheckbox>\n      </div>\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Searchable Leads</div>\n        <p>\n          Index leads matched by this rule so they can be searched in near\n          real time, instead of waiting for the reporting batch. This will\n          apply to all descendant rules.\n          {isRootRule\n            ? ' Set here, it covers every order and segment on this account.'\n            : ' Set it on the account rule to cover the whole account.'}\n        </p>\n\n        {/*\n          * Only leads matched by an opted-in rule are indexed, and they are\n          * held for 30 days. Say so plainly: this turns on retention of lead\n          * PII, and whoever ticks it should know that rather than discover it.\n          */}\n        <p className=\"text-muted\">\n          Leads are retained for 30 days and include personal information.\n          Only accounts that opt in can search them.\n        </p>\n\n        {!searchableLeads && searchableLeadsEffective && (\n          <StandardAlert color=\"info\" className=\"mt-2\">\n            Already enabled by a parent rule. Leads matched here are searchable\n            whether or not this box is ticked.\n          </StandardAlert>\n        )}\n\n        <IconCheckbox\n          name=\"searchable_leads\"\n          value={Boolean(searchableLeads)}\n          onChange={onChange}\n          className=\"mt-3\"\n        >\n          Make matched leads searchable\n        </IconCheckbox>\n      </div>\n\n      {ctx.product === 'calls' && (\n        <div className=\"form-section\">\n          <div className=\"form-section-header\">Call Settings</div>\n          <Row>\n              <Col sm={12} md={8}>\n              <FormGroup>\n                <Label for=\"bill_missed_calls\">Bill Missed Calls</Label>\n                <Input type=\"select\" name=\"bill_missed_calls\" value={billMissedCalls ?? ''} onChange={handleChangeBillMissedCalls}>\n                  <option value=\"\">Inherit parent setting</option>\n                  <option value=\"true\">Yes</option>\n                  <option value=\"false\">No</option>\n                </Input>\n              </FormGroup>\n\n              <FormGroup>\n                <Label for=\"max_unqualified_calls\" className=\"d-block\">Max Unqualified Calls</Label>\n                <p>After this many unqualified calls, further matches will be blocked.</p>\n                <Input\n                  type=\"number\"\n                  name=\"max_unqualified_calls\"\n                  value={maxUnqualifiedCalls ?? ''}\n                  className=\"tiny\"\n                  onChange={onChange}\n                />\n              </FormGroup>\n\n              <FormGroup>\n                <Label for=\"unqualified_calls_start_date\">Unqualified Start Date</Label>\n                <p>Use this to reset unqualified calls blocking.</p>\n\n                <div className=\"d-flex align-items-center\">\n                  <div style={{flexBasis:'300px'}}>\n                    <Flatpickr\n                      options={pickerOptions}\n                      value={unqualifiedCallsStart ? utcToZonedTime(new Date(unqualifiedCallsStart), timezone) : null}\n                      className=\"form-control\"\n                      placeholder=\"Set a date and time\"\n                      onChange={(dates) => handleChangeResetUnqualifiedDate(dates[0])}\n                    />\n\n\n\n                  </div>\n                  <div>\n                    {unqualifiedCallsStart && <Button color=\"link\" className=\"ms-1\" onClick={handleClearUnqualifiedCallsStartDate}>Clear</Button>}\n                    <Button color=\"link\" onClick={handleUnqualifiedCallsStartDateNow}>Set to Now</Button>\n                  </div>\n                </div>\n\n                {timezoneDisplay && <FormText><i>Timezone: {timezoneDisplay} </i></FormText> }\n\n\n              </FormGroup>\n            </Col>\n          </Row>\n        </div>\n      )}\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Duplicate Settings</div>\n        <div className=\"mt-3\">\n            <FormGroup>\n              <Label>Duplicate Window (in days)</Label>\n              <p>The amount of days to check for duplicates (-1 is disabled and 0 is infinite).</p>\n              <Input\n                name=\"duplicate_window\"\n                value={duplicateWindow || ''}\n                onChange={onChange}\n                placeholder=\"defaults to predefined values\"\n                className=\"w-25\"\n              />\n            </FormGroup>\n        </div>\n\n      </div>\n\n    </div>\n  );\n};\n\n/* For when we do scheduling of concurrency or duration, use this instead:\n\n          <Row>\n            <Col sm={12}>\n              <SchedulableSettingInput\n                setting=\"concurrency\"\n                scheduleSetting=\"call_concurrency_schedule\"\n                title=\"Call Concurrency\"\n                config={ConcurrencyScheduleConfig}\n                hideInput={false}\n                value={concurrency || ConcurrencyScheduleConfig.default}\n                schedule={concurrencySchedule}\n                onChange={onChange}\n                size=\"sm\"\n              />\n\n            </Col>\n          </Row>\n */\n\nAdvanced.propTypes = {\n  internalBidModifier: PropTypes.number,\n  trackQualifyingRate: PropTypes.bool,\n  ignoreSaleRate: PropTypes.bool,\n  qualifyingRateStart: PropTypes.string,\n  vendorAttributes: PropTypes.string,\n  excludeProfitReporting: PropTypes.bool,\n  searchableLeads: PropTypes.bool,\n  searchableLeadsEffective: PropTypes.bool,\n  isRootRule: PropTypes.bool,\n  billMissedCalls: PropTypes.bool,\n  duplicateWindow: PropTypes.number,\n  maxUnqualifiedCalls: PropTypes.number,\n  unqualifiedCallsStart: PropTypes.string,\n  dbaId:PropTypes.number,\n  tokens: PropTypes.array,\n  timezone: PropTypes.string,\n  onChange: PropTypes.func,\n  errors: PropTypes.object,\n};\n\nexport default React.memo(Advanced);\n","import React from 'react';\nimport {\n  Row, Col, FormGroup, Input, Badge,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { useDebouncedCallback } from 'use-debounce';\n\n/*\n * For entering a rule tag\n * Note: we used to allow an array of tags per rule (see the Tagger component).\n * Now it's only one tag per rule, but the API still handles it as an array;\n */\nconst Tag = (props) => {\n  const handleChangeDebounced = useDebouncedCallback((val) => {\n    // must be array due to API requirements\n    val = val.trim(val);\n    props.onChange(val ? [val] : []);\n  }, 400);\n\n  const tagValue = props.tags && props.tags.length > 0 ? props.tags[0] : '';\n\n  return (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">Rule Tag</div>\n      <p>\n        A tag can be used to create special filters and groupings in reports.\n        For example: &quot;Mobile Leads&quot;, &quot;Generic Search&quot;, or &quot;Premium Search&quot;\n      </p>\n\n      {props.allowEdit ? (\n        <Row>\n          <Col sm={12} md={6}>\n            <FormGroup>\n              <Input\n                defaultValue={tagValue}\n                name=\"tags\"\n                onChange={(e) => handleChangeDebounced(e.target.value)}\n                placeholder=\"Enter a word or phrase\"\n                maxLength={50}\n              />\n            </FormGroup>\n          </Col>\n        </Row>\n      ) : (\n        <div>{tagValue ? <Badge>{tagValue}</Badge> : <span className=\"text-muted\">No tags have been configured</span>}</div>\n      )}\n\n    </div>\n  );\n};\n\nTag.propTypes = {\n  tags: PropTypes.array.isRequired,\n  onChange: PropTypes.func.isRequired,\n\n};\nexport default Tag;\n","import React, { useState, useEffect } from 'react';\nimport {\n  Button, FormText, Input, Label, Row, Col\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\nimport AdDisplay from '../../../AdManager/AdDisplay';\nimport classnames from \"classnames\";\nimport usePermission from \"../../../../Hooks/usePermission\";\n\n/*\n * Component for selecting ads to be used in a given rule.\n * Using the row select hook in react-table-7 is somewhat awkward as there\n * are no built-in callbacks on select.\n * For the reset functionality we could theoretically use the\n * useControlledState, but I wasn't able to make this work.\n * Instead we use a refresh key to re-render the table with its initial values.\n */\nconst Ads = ({\n  ruleAds, accountAds, onChangeAds, overrideParent, isRootRule, accountId,\n}) => {\n\n  const [selectedAds, setSelectedAds] = useState(ruleAds);\n  const [originalRuleAds] = useState(ruleAds);\n  const allowEditOrder = usePermission('orders.edit');\n\n  useEffect(() => {\n    onChangeAds('ads', selectedAds);\n  }, [selectedAds]);\n\n  const handleSelectAd = (adId) => {\n    setSelectedAds((prev) => {\n      if (prev.includes(adId)) {\n        prev.splice(prev.indexOf(adId), 1);\n      } else {\n        prev.push(adId);\n      }\n      return [...prev];\n    });\n  };\n  const handleRemoveAd = (adId) => {\n    setSelectedAds((prev) => {\n        prev.splice(prev.indexOf(adId), 1);\n\n      return [...prev];\n    });\n  };\n\n  const handleSelectAll = () => {\n    setSelectedAds(() => {\n      const ads = [];\n      if (selectedAds.length !== accountAds.length) {\n        // not in an all-selected state\n        accountAds.map((ad) => ads.push(ad.id));\n      }\n      return ads;\n    });\n  };\n\n  const handleReset = () => setSelectedAds([...originalRuleAds]);\n\n  return (\n    <div className=\"rule-ad-form\">\n\n      {accountAds.length === 0 && (\n      <StandardAlert color=\"danger\">\n        The account has no ads. This will block all bidding.\n      </StandardAlert>\n      )}\n\n\n      <div className=\"form-section\">\n        <div className=\"form-section-header\">Rule Ads {ruleAds.length >=1 && <span>({ruleAds.length})</span>}</div>\n\n\n        {ruleAds.length > 0 ? (\n          <>\n            <p>These ads{!isRootRule && !overrideParent && <span>, and the ads from parent rules, </span>}\n              {' '}will be used for this rule and all child rules, unless overridden.</p>\n            {/* For all but account rule, allow override choice */}\n            {!isRootRule  && (\n              allowEditOrder ? (\n                <div className=\"ad-override mb-3 d-flex\">\n                  <div className=\"me-1\">\n                    <Input\n                      name=\"override_parent_ads\"\n                      type=\"checkbox\"\n                      defaultChecked={!!overrideParent}\n                      onChange={onChangeAds}\n                    />\n                  </div>\n                  <div className=\"flex-fill\">\n                    <Label>\n                      Override Parent Ads\n                    </Label>\n                    <FormText color=\"muted\"> Use only the selected ads. Do not use ads defined in parent rules.</FormText>\n                  </div>\n                </div>\n              ) : (\n                <div className=\"mb-3\">\n                  <span>Override Parent Ads: <strong>{overrideParent ? 'Yes' : 'No'}</strong></span>\n                </div>\n              )\n            )}\n\n            <div className=\"rule-ad-list ms-2\">\n              {accountAds.filter((ad) => ruleAds.includes(ad.id)).map((ad, i) => (\n                <Row key={i} className=\"ad-row\">\n                  <Col sm={12} md={9} lg={10} className=\"ad-col\">\n\n                    <div className=\"d-flex justify-content-between align-items-center\">\n                      <div className=\"ad-name\">{ad.name}</div>\n                      {allowEditOrder && (\n                        <Button size=\"sm\" color=\"link\" className=\"inline\" onClick={() => handleRemoveAd(ad.id)}>\n                          <FaIcon icon=\"times\" size=\"sm\" /> Remove\n                        </Button>\n                      )}\n\n                    </div>\n\n                    <AdDisplay {...ad} />\n                  </Col>\n\n                </Row>\n\n              ))}\n            </div>\n          </>\n\n\n\n        ) : (\n          <span className=\"me-2\">\n             <span>No ads are selected for this rule.</span>\n          </span>\n        )}\n\n      </div>\n\n\n        {accountAds && allowEditOrder && (\n\n          <div className=\"form-section mt-2\">\n            <div className=\"form-section-header\">Account Ads </div>\n            <p>Select from the ads below to apply an ad to this rule</p>\n            <div className=\"rule-ad-header mb-1\">\n              {allowEditOrder && (\n                <>\n                  <Button color=\"link\" className=\"me-2\" onClick={handleSelectAll}>Select All</Button>\n                  <Button color=\"link\" className=\"me-2\" onClick={handleReset}>Reset</Button>\n                </>\n              )}\n\n              <Button\n                tag={Link}\n                color=\"link\"\n                to={{\n                  pathname: `/accounts/${accountId}/ads`,\n                }}\n                title=\"Account Ad Library\"\n              >\n                Account Ad Library\n              </Button>\n            </div>\n\n            <div className=\"rule-ad-list ms-2\">\n              {accountAds.map((ad, i) => {\n                let isSelected = selectedAds.includes(ad.id)\n                return (\n\n                  <Row key={i} className=\"ad-row\">\n                    <Col sm={12} md={9} lg={10} className={classnames(\"ad-col\", {selected:isSelected})}>\n\n                      <div className=\"d-flex justify-content-between align-items-center\">\n                        <div className=\"ad-name\">{ad.name}</div>\n\n                        { isSelected ? (\n                          <div>\n                            <FaIcon icon=\"check-circle\" size=\"sm\"/> Selected\n                          </div>\n                        ) : (\n                          <>\n                            {allowEditOrder && (\n                              <Button size=\"sm\" color=\"link\" className=\"inline\" onClick={() => handleSelectAd(ad.id)}>\n                                <FaIcon icon=\"plus\" size=\"sm\"/> Select\n                              </Button>\n                            )}\n                          </>\n\n                        )}\n\n\n                      </div>\n\n                      <AdDisplay {...ad} />\n                    </Col>\n\n                  </Row>\n                )\n              })}\n            </div>\n          </div>\n\n        )}\n\n      </div>\n\n\n\n  );\n};\n\nconst AdSelectIcon = React.memo(({ checked = false, onChange }) => (\n  <FaIcon\n    icon=\"check-circle\"\n    size=\"2x\"\n    style={{ margin: '0px 6px', color: checked ? '#009900' : '#e1e1e1', cursor: 'pointer' }}\n    onClick={onChange}\n  />\n));\nconst AdRemoveIcon = React.memo(({  onChange }) => (\n  <FaIcon\n    icon=\"times\"\n    size=\"2x\"\n    style={{ margin: '0px 6px', color: '#990000', cursor: 'pointer' }}\n    onClick={onChange}\n  />\n));\n\nconst SelectAllIcon = ({ checked = false, onChange }) => (\n  <Button onClick={onChange} className=\"me-2\" color=\"link\">\n    <FaIcon\n      icon=\"check-circle\"\n      size=\"1x\"\n      style={{ margin: '0px 6px', color: checked ? '#009900' : '#e1e1e1', cursor: 'pointer' }}\n    />\n    Select All\n  </Button>\n\n);\n\nAds.propTypes = {\n  ruleAds: PropTypes.array.isRequired,\n  accountAds: PropTypes.array.isRequired,\n  onChangeAds: PropTypes.func.isRequired,\n  overrideParent: PropTypes.bool,\n  isRootRule: PropTypes.bool,\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nAds.defaultProps = {\n  overrideParent: false,\n  isRootRule: false,\n};\n\nexport default Ads;\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { Nav } from 'reactstrap';\nimport { FormTabFlat, FormTabMore } from '../../../../Components/Form/FormCommon';\nimport usePermission from \"../../../../Hooks/usePermission\";\n\n/*\n * Navigation for RulesConfig form\n */\n\nconst NavTabs = ({\n  activeTab, handleSelectTab, errorTabs, isSectionValid, product, allowAdvanced,\n}) => {\n  const allowEditOrder = usePermission('order.edit');\n  const moreTabs = useMemo(() => {\n    const tabs = product === 'calls' ? [\n      { id: 'budget', label: 'Budget/Caps', valid: isSectionValid('datasheets') },\n      { id: 'datasheets', label: 'Datasheets', valid: isSectionValid('budget') },\n      { id: 'destinations', label: 'Destinations', valid: isSectionValid('destinations') },\n      { id: 'tags', label: 'Tag', valid: isSectionValid('tags') },\n      { id: 'calls', label: 'Call Settings', valid: isSectionValid('calls') },\n      { id: 'activity', label: 'On/Off', valid: isSectionValid('activity') },\n    ] : [\n      { id: 'budget', label: 'Budget', valid: isSectionValid('budget') },\n      { id: 'datasheets', label: 'Datasheets', valid: isSectionValid('budget') },\n      { id: 'destinations', label: 'Destinations', valid: isSectionValid('destinations') },\n      { id: 'tags', label: 'Tag', valid: isSectionValid('tags') },\n      { id: 'activity', label: 'On/Off', valid: isSectionValid('activity') },\n    ];\n\n    if (product === 'clicks') {\n      tabs.push({ id: 'tracking', label: 'Tracking', valid: isSectionValid('tracking') });\n    }\n\n    if (allowAdvanced) {\n      tabs.push({ id: 'advanced', label: 'Advanced', valid: isSectionValid('advanced') });\n    }\n\n    return tabs;\n  }, [product, allowAdvanced]);\n\n  return (\n    <Nav className=\"mastodon-tabs flex-nowrap mb-4\">\n      <FormTabFlat\n        id=\"summary\"\n        label=\"Summary\"\n        activeTab={activeTab}\n        isValid\n        setActive={handleSelectTab}\n      />\n      <FormTabFlat\n        id=\"targeting\"\n        label=\"Targeting\"\n        activeTab={activeTab}\n        isValid={isSectionValid('targeting')}\n        setActive={handleSelectTab}\n      />\n      <FormTabFlat\n        id=\"bidding\"\n        label=\"Bidding\"\n        activeTab={activeTab}\n        isValid={isSectionValid('bidding')}\n        setActive={handleSelectTab}\n      />\n\n      <FormTabFlat\n        id=\"enrichments\"\n        label=\"Enrichments\"\n        activeTab={activeTab}\n        isValid={isSectionValid('enrichments')}\n        setActive={handleSelectTab}\n      />\n      <FormTabFlat\n        id=\"sale_confirmation\"\n        label=\"Sale Confirmation\"\n        activeTab={activeTab}\n        isValid={isSectionValid('sale_confirmation')}\n        setActive={handleSelectTab}\n      />\n\n      {product === 'clicks' && (\n        <FormTabFlat\n          id=\"ads\"\n          label=\"Ads\"\n          activeTab={activeTab}\n          setActive={handleSelectTab}\n          isValid={isSectionValid('ads')}\n        />\n      )}\n      <FormTabFlat\n        id=\"channels\"\n        label=\"Channels\"\n        activeTab={activeTab}\n        setActive={handleSelectTab}\n        isValid={isSectionValid('channels')}\n      />\n\n      {moreTabs.length > 0 && (\n      <FormTabMore\n        items={moreTabs}\n        activeTab={activeTab}\n        setActive={handleSelectTab}\n        errorTabs={errorTabs}\n      />\n      )}\n    </Nav>\n  );\n};\n\nNavTabs.propTypes = {\n  activeTab: PropTypes.string,\n  handleSelectTab: PropTypes.func,\n  isSectionValid: PropTypes.func,\n  errorTabs: PropTypes.array,\n  product: PropTypes.string,\n  allowAdvanced: PropTypes.bool,\n};\n\nNavTabs.defaultProps = {\n  activeTab: '1',\n  handleSelectTab: () => {},\n  isSectionValid: true,\n};\n\nexport default NavTabs;\n","import React, {\n  useContext, useState, useEffect, Suspense, lazy,\n} from 'react';\nimport {\n  Button,\n  DropdownItem,\n  DropdownMenu,\n  DropdownToggle,\n  UncontrolledDropdown,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport CopyWidget from '../../../Components/Rules/CopyWidget';\nimport MoveWidget from '../../../Components/Rules/MoveWidget';\n\nimport RulesContext from '../../../Providers/RulesContext';\nimport usePermission from '../../../Hooks/usePermission';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\"\n\nconst LazyBulkEditModal = lazy(() => import(/* webpackChunkName: \"RuleModals\" */ './RulesConfig/BulkEditRulesModal'));\nconst LazyBatchRuleModal = lazy(() => import(/* webpackChunkName: \"RuleModals\" */ '../../../Components/Rules/BatchRuleModal'));\nconst LazySettingCopyModal = lazy(() => import(/* webpackChunkName: \"RuleModals\" */ '../../../Components/Rules/SettingCopyModal'));\nconst LazySettingPasteModal = lazy(() => import(/* webpackChunkName: \"RuleModals\" */ '../../../Components/Rules/SettingPasteModal'));\n\nconst ActionHeader = ({ label, setActionMode }) => (\n  <div className=\"header d-flex align-items-baseline\">\n    <Button onClick={() => setActionMode(null)} color=\"transparent\"><FaIcon icon=\"arrow-left\" size=\"1x\" className=\"me-2\" /></Button>\n    <h5 className=\"flex-fill\">{label}</h5>\n  </div>\n);\n\n/*\n * ACTIONS PANEL\n * Slide-out panel for Rule Manager containing rule actions like copy, add, bulk update, etc\n * Some actions are done within the menu, and others will open a modal or do some other external action\n */\nconst ActionsPanel = (props) => {\n  const rulesContext = useContext(RulesContext);\n  const [actionMode, setActionMode] = useState(null);\n  const [bulkEditModal, setBulkEditModal] = useState(false);\n  const [batchRuleModal, setBatchRuleModal] = useState(false);\n  const [settingCopyModal, setSettingCopyModal] = useState(false);\n  const [settingPasteModal, setSettingPasteModal] = useState(false);\n  const allowOrdersEdit = usePermission('orders.edit');\n\n  const toggleBulkEditModal = () => setBulkEditModal(!bulkEditModal);\n  const toggleSettingCopyModal = () => setSettingCopyModal(!settingCopyModal);\n  const toggleSettingPasteModal = () => setSettingPasteModal(!settingPasteModal);\n  const toggleBatchRuleModal = () => setBatchRuleModal(!batchRuleModal);\n\n  const handleClose = () => {\n    setActionMode(null);\n    rulesContext.api.toggleActionsPane();\n  };\n\n  const handleDeleteRule = () => {\n    // props.onDeleteRule();\n    rulesContext.api.deleteRule(props.rule);\n    handleClose();\n  };\n\n  const handleAddRule = (action) => {\n    rulesContext.api.addRule(props.rule, action);\n    handleClose();\n  };\n\n  const toggleDisabled = () => {\n    if (props.rule.disabled) {\n      rulesContext.api.disableRule(props.rule, false);\n      handleClose();\n    } else {\n      // confirm\n      setActionMode('disable');\n    }\n  };\n\n  const handleDisable = () => {\n    rulesContext.api.disableRule(props.rule, true);\n    handleClose();\n  };\n  const handleSave = () => {\n    props.onSaveRule();\n    handleClose();\n  };\n\n  // close when modal opens\n  useEffect(() => {\n    if (batchRuleModal || settingCopyModal || settingPasteModal || bulkEditModal) {\n      handleClose();\n    }\n  }, [batchRuleModal, settingCopyModal, settingPasteModal, bulkEditModal]);\n\n  if (!props.rule) return (null);\n\n  return (\n    <>\n      {/* Hide RuleActions header when in action mode? */}\n      <div className={classnames(['actions-panel', { open: props.isOpen }])}>\n\n        {/* Show menu if NOT in action mode */}\n        {!actionMode && (\n        <>\n          <div className=\"header d-flex justify-content-between align-items-baseline\">\n            <h4 className=\"m-0\">Rule Actions</h4>\n            <Button onClick={rulesContext.api.toggleActionsPane} color=\"transparent\"><FaIcon icon=\"times\" size=\"1x\" /></Button>\n          </div>\n\n          <div className=\"rule-action-menu d-flex flex-column mt-1\">\n\n            <div className=\"rule-action-item\" style={{ marginLeft: '-5px' }}>\n              <UncontrolledDropdown direction=\"left\" size=\"sm\">\n                <DropdownToggle color=\"link\" className=\"no-case\" disabled={props.rule.isNew || !allowOrdersEdit} caret>\n                  <FaIcon icon=\"plus\" />\n                  {' '}\n                  Add Rules\n                </DropdownToggle>\n\n                <DropdownMenu>\n                  <DropdownItem onClick={() => handleAddRule('below')} disabled={props.isRootRule}>\n                    <FaIcon icon=\"bars\" />\n                    {' '}\n                    One, Below\n                  </DropdownItem>\n                  <DropdownItem onClick={() => handleAddRule('child')}>\n                    <FaIcon icon=\"indent\" />\n                    {' '}\n                    One, As Child\n                  </DropdownItem>\n                  <DropdownItem onClick={toggleBatchRuleModal}>\n                    <FaIcon icon=\"indent\" />\n                    {' '}\n                    Create Multiple...\n                  </DropdownItem>\n                </DropdownMenu>\n              </UncontrolledDropdown>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                onClick={handleSave}\n                disabled={props.rule.isNew}\n                className=\"no-case\"\n              >\n                <FaIcon icon=\"pencil-alt\" />\n                Save Rule\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                onClick={() => setActionMode('copy')}\n                disabled={props.isRootRule || props.rule.isNew}\n                className=\"no-case\"\n              >\n                <FaIcon icon=\"copy\" />\n                Copy Rule\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                onClick={() => setActionMode('move')}\n                disabled={props.isRootRule || props.rule.isNew}\n                className=\"no-case\"\n              >\n                <FaIcon icon=\"arrows-alt\" />\n                Move Rule\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                onClick={toggleDisabled}\n                disabled={props.isRootRule || props.rule.isNew}\n                className=\"no-case\"\n              >\n\n                {props.rule.disabled ? (\n                  <>\n                    <FaIcon icon=\"plug\" />\n                    Enable\n                  </>\n                ) : (\n                  <>\n                    <FaIcon icon=\"ban\" />\n                    Disable\n                  </>\n                ) }\n                {' '}\n                Rule\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                onClick={() => setActionMode('delete')}\n                disabled={props.isRootRule || props.rule.isNew}\n                className=\"no-case\"\n              >\n                <FaIcon icon=\"trash\" />\n                Delete Rule\n              </Button>\n            </div>\n\n            <div className=\"rule-action-item\">\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                onClick={toggleBulkEditModal}\n                disabled={props.rule.isNew}\n                className=\"no-case\"\n              >\n                <FaIcon icon=\"list\" />\n                Bulk Edit\n              </Button>\n            </div>\n\n            {allowOrdersEdit === true && (\n            <div className=\"rule-action-item\" style={{ marginLeft: '-5px' }}>\n              <UncontrolledDropdown direction=\"left\" size=\"sm\">\n                <DropdownToggle color=\"link\" className=\"no-case\" caret>\n                  <FaIcon icon=\"cog\" className=\"me-1\" />\n                  Transfer Settings\n                </DropdownToggle>\n\n                <DropdownMenu>\n                  <DropdownItem onClick={toggleSettingCopyModal}>\n                    <FaIcon icon=\"copy\" />\n                    {' '}\n                    Copy Setting...\n                  </DropdownItem>\n                  <DropdownItem onClick={toggleSettingPasteModal}>\n                    <FaIcon icon=\"paste\" />\n                    {' '}\n                    Paste Setting...\n                  </DropdownItem>\n                </DropdownMenu>\n              </UncontrolledDropdown>\n            </div>\n            )}\n\n          </div>\n        </>\n        )}\n\n        {/*\n            * Action view (menu goes away, show action form\n           */}\n\n        {actionMode === 'copy' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Copy Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <CopyWidget rule={props.rule} close={handleClose} cancel={() => setActionMode()} />\n          </div>\n        </div>\n        )}\n\n        {actionMode === 'move' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Move Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <MoveWidget rule={props.rule} close={handleClose} />\n          </div>\n        </div>\n        )}\n\n        {actionMode === 'delete' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Delete Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <StandardAlert color=\"light\" className=\"p-0\">Are you sure? Any rules that descend from this rule will also be deleted.</StandardAlert>\n            <div className=\"d-flex mt-2 justify-content-end\">\n              <Button size=\"sm\" color=\"link\" onClick={() => setActionMode(null)} >Cancel</Button>\n              <Button className=\"ms-1\" size=\"sm\" color=\"primary\" onClick={handleDeleteRule}>Delete</Button>\n            </div>\n          </div>\n        </div>\n        )}\n\n        {actionMode === 'disable' && (\n        <div className=\"rule-action\">\n          <ActionHeader label=\"Disable Rule\" setActionMode={setActionMode} />\n\n          <div className=\"mt-3\">\n            <StandardAlert color=\"light\" className=\"p-0\">\n              Disabling will block the application of this rule and all descendant rules.\n              The rules can still be edited.\n            </StandardAlert>\n            <div className=\"d-flex mt-2 justify-content-end\">\n\n              <Button size=\"sm\" color=\"link\" onClick={() => setActionMode(null)} >Cancel</Button>\n              <Button size=\"sm\" className=\"ms-1\" color=\"primary\" onClick={handleDisable}>Disable</Button>\n\n            </div>\n          </div>\n        </div>\n        )}\n\n      </div>\n\n      <div\n        className={classnames(['actions-overlay', { open: props.isOpen }])}\n        onClick={handleClose}\n      />\n\n      <Suspense fallback={<div />}>\n        <LazyBulkEditModal\n          isOpen={bulkEditModal}\n          close={toggleBulkEditModal}\n          rule={props.rule}\n          refreshRules={rulesContext.api.refreshRules}\n        />\n      </Suspense>\n\n      {allowOrdersEdit === true && (\n      <Suspense fallback={<div />}>\n        <LazySettingCopyModal\n          isOpen={settingCopyModal}\n          close={toggleSettingCopyModal}\n          isDirtyRule={props.isDirty}\n          rule={props.rule}\n        />\n      </Suspense>\n      )}\n\n      {allowOrdersEdit === true && (\n      <Suspense fallback={<div />}>\n        <LazySettingPasteModal\n          isOpen={settingPasteModal}\n          close={toggleSettingPasteModal}\n          rule={props.rule}\n          onChange={props.onChange}\n          onPasteRule={props.onPasteRule}\n        />\n      </Suspense>\n      )}\n\n      <Suspense fallback={<div />}>\n        <LazyBatchRuleModal\n          isOpen={batchRuleModal}\n          close={toggleBatchRuleModal}\n          rule={props.rule}\n          attributes={rulesContext.attributes}\n          attributeGroups={rulesContext.attributeGroups}\n          refreshRules={rulesContext.api.refreshRules}\n        />\n      </Suspense>\n    </>\n  );\n};\n\nActionsPanel.propTypes = {\n  isOpen: PropTypes.bool,\n  rule: PropTypes.object,\n  isRootRule: PropTypes.bool,\n  isDirty: PropTypes.bool,\n  onChange: PropTypes.func,\n  onPasteRule: PropTypes.func,\n  onSaveRule: PropTypes.func,\n};\n\nActionsPanel.defaultProps = {\n  isOpen: false,\n};\n\nexport default ActionsPanel;\n","import React, {useContext, useRef} from \"react\";\nimport RulesContext from \"../../../../Providers/RulesContext\";\nimport usePermission from \"../../../../Hooks/usePermission\";\nimport useCollectionTracker from \"../../../../Hooks/useCollectionTracker\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {Button, Col, Row} from \"reactstrap\";\nimport IntegrationSettings from \"../../../../Components/Rules/IntegrationSettings\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport PropTypes from \"prop-types\";\n\nconst SaleConfirmation = (args) => {\n  return <SaleConfirmationIntegration {...args} />\n}\n\nexport default SaleConfirmation\n\nconst SaleConfirmationIntegration = ({ saleConfirmation, errors = {}, onChange }) => {\n  const rulesContext = useContext(RulesContext);\n  const allowEdit = usePermission('integrations.edit');\n  const definitionsRef = useRef(rulesContext.api.getIntegrationDefinitionsByType('sale_confirmation'));\n  const {\n    api: collection,\n    willDeleteIndex,\n    editIndex,\n    addMode,\n  } = useCollectionTracker();\n\n  const handleUpdate = (integration) => onChange({ ...saleConfirmation, integration });\n\n  const handleDelete = () => {\n    collection.onDelete();\n    onChange({});\n  };\n\n  const handleAdd = () => {\n    collection.add(0);\n    onChange({\n      integration: { name: '', settings: {} },\n    });\n  };\n\n\n  return (\n    <div className=\"form-section\">\n\n\n      <p>Confirm lead sales by sending data to a third party. This is also referred to as POST integration.</p>\n\n      {definitionsRef.current.length === 0 && <StandardAlert color=\"light\" icon=\"alert\">No integration configurations found</StandardAlert>}\n\n      <Row>\n        <Col lg={12} xl={9}>\n\n\n          {saleConfirmation.integration !== undefined ? (\n            <>\n              <IntegrationSettings\n                config={saleConfirmation.integration}\n                definitions={definitionsRef.current}\n                type=\"sale_confirmation\"\n                editMode={editIndex === 0}\n                isNew={addMode}\n                errors={errors}\n                onUpdate={handleUpdate}\n                onDelete={handleDelete}\n                onApply={collection.apply}\n                allowEdit={allowEdit}\n                setEdit={collection.edit}\n                willDelete={willDeleteIndex === 0}\n                setWillDelete={(i) => collection.setWillDeleteIndex(i)}\n                allowControls={allowEdit}\n              />\n\n            </>\n          ) : (\n            <>\n              {allowEdit && definitionsRef.current.length > 0 ? (\n                <Button color=\"link\" onClick={handleAdd} disabled={editIndex !== null}>\n                  <FaIcon icon=\"plus\" className=\"me-1\" />\n                  Add Sale Confirmation Integration\n                </Button>\n              ) : (\n                <StandardAlert color=\"light\" icon=\"info\">No sale confirmation is configured.</StandardAlert>\n              )}\n            </>\n\n          )}\n\n        </Col>\n      </Row>\n\n    </div>\n\n  );\n};\n\nSaleConfirmationIntegration.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  saleConfirmation: PropTypes.object.isRequired,\n  errors: PropTypes.object,\n};\n","import React, { useContext, useState, useEffect, useRef } from 'react';\nimport {\n  TabPane,\n  Button, TabContent, Input, Label, FormText,\n} from 'reactstrap';\nimport * as Yup from 'yup';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport copy from 'fast-copy';\nimport lazify from '../../../../utils/Lazify';\nimport PageSection from '../../../../Layout/PageSection';\nimport RulesContext from '../../../../Providers/RulesContext';\nimport Header from './Header';\nimport Summary from './Summary';\nimport Bidding from './Bidding';\nimport Budgets from './Budgets';\nimport CallSettings from './CallSettings';\nimport Channels from './Channels';\nimport Enrichments from './Enrichments';\nimport Destination from './Destination';\nimport Tracking from './Tracking';\nimport Advanced from './Advanced';\nimport Tag from './Tag';\nimport Ads from './Ads';\nimport NavTabs from './NavTabs';\nimport useFormState from '../../../../Hooks/useFormState';\nimport {\n  JSONValidation,\n  PhoneNumberValidation,\n  PixelValidation,\n} from '../../../../Components/Form/CustomValidation';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {DataRow} from \"../../../../Components/DataRow\";\nimport {TargetGroupsDescription} from \"../../../../Components/Rules/TargetDescription\";\nimport {getDeprecatedSettings, getDeprecatedChoices} from \"../../../../Components/Rules/IntegrationSettings/utils\";\nimport LoadingBar from '../../../../Layout/LoadingBar';\nimport ActionsPanel from '../ActionsPanel';\nimport SaleConfirmation from \"./SaleConfirmation\";\nimport usePermission from \"../../../../Hooks/usePermission\";\n\nconst LazyActivitySchedule = lazify(() => import(/* webpackChunkName: \"ActivitySchedule\" */ '../../../../Components/Rules/ActivitySchedule'));\nconst LazyTargetingManager = lazify(() => import(/* webpackChunkName: \"TargetingManager\" */ '../../../../Components/TargetingManager'));\nconst LazyDatasheets = lazify(() => import(/* webpackChunkName: \"TargetingManager\" */ './Datasheets'));\n// const LazyBidSchedule = lazy( () => import(/* webpackChunkName: \"BidSchedule\" */ \"./BidSchedule\"));\n\nconst ValidationSchema = Yup.object().shape({\n  label: Yup.string()\n    .trim()\n    .required('Please enter a name for the rule'),\n  schedule: Yup.mixed().validActivitySchedule('Check that all dates are filled out, and from/to dates are in the right order'),\n  match_conditions: Yup.mixed().validTargeting('Invalid Targeting'),\n  enrichment_addons: Yup.mixed().validSaleConditions('Invalid Enrichments'),\n  channel_modifiers: Yup.mixed().validChannelModifiers('Invalid Channel Modifiers'),\n  bidding: Yup.object().shape({\n    type: Yup.string(), //\n    bid_modifier: Yup.mixed().when('type', { // note, error property will be 'bidding.bid_modifier'\n      is: 'modifier',\n      then: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : parseInt(n))).min(0, 'Bid adjustment is required').max(500, 'Maximum adjustment is 500'),\n    }),\n    absolute_bid: Yup.mixed().when('type', {\n      is: 'absolute',\n      then: Yup.number().transform((n) => ((isNaN(n) || n === null) ? -1 : n)).min(0, 'Bid is required').max(9999, 'Maximum bid is $99.99'),\n    }),\n  }),\n  proxy_bidding: Yup.mixed().validProxyBidding('Invalid proxy bidding configuration'),\n  destination_number: PhoneNumberValidation.notRequired().nullable(),\n  call_concurrency: Yup.number().transform((n) => ((isNaN(n) || n === null) ? null : parseInt(n))).max(500, 'Maximum call concurrency is 500').nullable(),\n  // validate:  if destination number is set anywhere, billable duration must be set in it OR above it\n\n  billable_duration: Yup.number()\n    .test('destination-number-exists', <span>\n      Billable duration is required for rules with a destination number.\n      <br />\n      It can be set here, or in an ancestor rule\n                                       </span>, (value, testContext) => {\n      // if the rule has a #, test that (1) rule has duration set, or (2) ancestor has it set\n      if (testContext.parent.destination_number) {\n        if (!value && !testContext.options.context.propAncestors.billable_duration) {\n          return false;\n        }\n      }\n      return true;\n    })\n  // .when(`$propAncestors`, (propAncestors, schema) => {\n  //   console.log('index.js:WHEN propAncestors, schema', propAncestors, schema);\n  //   //if itself OR ancestors has destination_number, AND no ancestor has billable duration, must require duration\n  //   return propAncestors.\n  // })\n    .transform((n) => ((isNaN(n) || n === null) ? null : parseInt(n)))\n    .min(1, 'Enter a number greater than zero or leave blank')\n    .max(500, 'Maximum billable duration is 500 seconds')\n    .nullable(),\n  // destination_sip: Yup.object().shape({\n  //   settings: Yup.object().shape({\n  //     uri: Yup.string().required('URI is required'),\n  //   })\n  //     .nullable(),\n  // })\n  //   .nullable(),\n  destination_sip: Yup.mixed().test('destination-sip', 'SIP configuration must have a URI.', (value) => {\n    // if set, expect object with 'name' and 'settings'\n    const settings = value && typeof value === 'object' ? value.settings : null;\n    if (!settings) {\n      return true; // empty okay\n    } else if (typeof settings === 'object') {\n      if (Object.keys(settings).length === 0) {\n        return true;\n      }\n      const uri = settings.uri ? settings.uri.trim() : '';\n      if (!uri) {\n        return false;\n      }\n    }\n    return true;\n  }).nullable(),\n  impression_urls: PixelValidation,\n  click_urls: PixelValidation,\n  prefill: Yup.mixed().validPrefill('Invalid prefill configuration'),\n  vendor_attributes: JSONValidation,\n\n});\n\n// Associates a tab to a validated field (mark tab/ goto tab after error)\nconst FormSectionToFieldMap = {\n  summary: ['label'],\n  targeting: ['match_conditions'],\n  bidding: ['bidding.bid_modifier', 'bidding.absolute_bid', 'proxy_bidding'],\n  enrichments: ['enrichment_addons'],\n  channels: ['channel_modifiers'],\n  sale_confirmation: ['sale_confirmation'],\n  activity: ['schedule'],\n  destinations: ['destination_number', 'delivery_destinations', 'prefill'],\n  calls: ['billable_duration', 'call_concurrency'],\n  tracking: ['impression_urls', 'click_urls'],\n  advanced: ['vendor_attributes', 'internal_bid_modifier', 'qualifying_rate_start', 'bill_missed_calls', 'duplicate_window', 'buyer_name', 'buyer_group'],\n};\n\nconst initializeRule = (rule) => {\n  if (rule) {\n\n    // Empty budget or caps is array, expecting object\n    if (Array.isArray(rule.budgets)) rule.budgets = {};\n    if (Array.isArray(rule.caps)) rule.caps = {};\n    if (Array.isArray(rule.sale_attempt_caps)) rule.sale_attempt_caps = {};\n\n    if (Array.isArray(rule.proxy_bidding)) {\n      rule.proxy_bidding = {};\n    }\n\n    // Extract ids from ads collection\n    if (Array.isArray(rule.ads)) {\n      rule.ads = rule.ads.map((ad) => (typeof ad === 'object' ? ad.id : ad));\n    }\n\n    // Bids, zero padding: in db as 4.20, but api provides '4.2'\n    if (rule.bidding.absolute_bid) {\n      const strBid = rule.bidding.absolute_bid.toString();\n      const dotPos = strBid.indexOf('.');\n      if (dotPos > 0 && strBid.indexOf('.') === strBid.length - 2) {\n        rule.bidding.absolute_bid += '0';\n      }\n    }\n\n    rule.dba_id = rule.dba?.id ?? null;\n\n    if (!rule.prefill) rule.prefill = {};\n    if (!rule.sale_confirmation) rule.sale_confirmation = {};\n\n    rule.channel_modifiers = rule.channel_modifiers.map((cm) => {\n      if (cm.bid_ceiling === null) cm.bid_ceiling = '';\n      return cm;\n    });\n\n    if (Array.isArray(rule.destination_sip) || !rule.destination_sip) {\n      rule.destination_sip = {};\n    } else if (!rule.destination_sip.settings && Object.keys(rule.destination_sip).length > 0) {\n      const config = {\n        name: 'sip',\n        settings: rule.destination_sip,\n      };\n\n      if (typeof config.settings.headers === 'object' && !Array.isArray(config.settings.headers)) {\n        config.settings.headers = Object.entries(rule.destination_sip.headers).map(([key, value]) => {\n          return { key, value };\n        });\n      }\n\n      rule.destination_sip = config;\n    }\n  }\n\n  return rule;\n};\n\n/*\n * Component for updating a rule\n *\n * Includes multiple tabs for editing different aspects of the rule,\n * update functions, validation, and a sliding pane for rule actions (copy, bulk update, etc).\n * Keeps state of rule object as forms are changed.\n *\n * Calls the remote API directly for create, update, and delete. For other actions it calls the\n * api provided by the context (RulesManager).\n *\n * Note: active tab is set by property (things outside of this component can update the selected tab)\n */\nconst RulesConfig = (props) => {\n  const context = useContext(RulesContext)\n  const [propAncestors, setPropAncestors] = useState({})\n  const scrollTargetRef = useRef()\n  const allowEdit = usePermission('orders.edit')\n  initializeRule(props.rule)\n\n  // For looking up the state of ancestor rules\n  const ancestorFuncMap = {\n    disabled: (r) => r.disabled,\n    billable_duration: (r) => r.billable_duration,\n    destination_number: (r) => r.destination_number,\n    schedule_affects_siblings: (r) => r.schedule_affects_siblings,\n  }\n\n  // Rule state is the form state\n  const {\n    formApi, formIsDirty, formValues: rule, formErrors, formErrorSections, validationContext,\n  } = useFormState(\n    props.rule,\n    ValidationSchema,\n    null,\n    FormSectionToFieldMap,\n    { attributes: context.attributes, product: props.order.product },\n  )\n\n  const isNew = rule && rule.hasOwnProperty('isNew')\n\n  // TODO: adjust this for scrolling within the modal\n  const scrollToTop = () => {\n    if (scrollTargetRef.current) {\n      scrollTargetRef.current.scrollIntoView({behavior:'smooth'})\n    }\n\n  }\n\n  // Read up the tree to find the immediate ancestors with certain properties.\n  // For some things we need to display inherited values, and validate data based on whether the values exist.\n  useEffect(() => {\n    window.setTimeout(() => {\n      const ap = context.api.findPropAncestors(props.rule, ancestorFuncMap);\n      setPropAncestors(ap);\n      formApi.setValidationContext({ ...validationContext, propAncestors: ap });\n    }, 500);\n  }, []);\n\n  useEffect(() => {\n    // Go to errored section if not on it already\n    if (formErrorSections.length && !formErrorSections.includes(props.activeTab)) {\n      props.onSelectTab(formErrorSections[0]);\n      scrollToTop();\n    }\n  }, [formErrorSections]);\n\n  // Send dirty form state to the top because it affects rule tree\n  useEffect(() => {\n    context.api.setIsDirty(formIsDirty);\n  }, [formIsDirty]);\n\n  const handlePasteRule = (rule) => {\n    if (typeof rule !== 'object') return;\n    rule.id = props.rule.id;\n    rule.parent_id = props.rule.parent_id;\n    rule.priority = props.rule.priority;\n    rule.rules = [];\n    if (props.rule.isNew) {\n      rule.isNew = props.rule.isNew;\n    }\n\n    if (props.order.product !== 'clicks') {\n      rule.ads = [];\n      rule.impression_urls = [];\n      rule.click_urls = [];\n      rule.redirect_url = '';\n      rule.prefill = {};\n    } else {\n      rule.delivery_destinations = [];\n    }\n\n    if (props.order.product !== 'calls') {\n      rule.destination_number = '';\n      rule.call_concurrency = null;\n      rule.billable_duration = null;\n    }\n\n    formApi.setValues({ ...rule });\n  };\n\n  //Some settings can be dayparted: bidding and caps\n  const handleChangeSettingSchedule = (setting, value, timezone) => {\n    formApi.setValues({\n      ...rule,\n      [setting]: value,\n      [`${setting}_timezone`]: timezone || null,\n    });\n  };\n\n  const handleCancel = () => {\n    props.onCancel()\n    scrollToTop();\n  };\n\n  const checkForDeprecatedSettings = () => {\n    const errors = [];\n    const checks = [\n      { path: rule.proxy_bidding?.integration, type: 'proxy_bidding', field: 'proxy_bidding' },\n      { path: rule.prefill?.integration, type: 'prefill', field: 'prefill' },\n      { path: rule.sale_confirmation?.integration, type: 'sale_confirmation', field: 'sale_confirmation' },\n    ];\n\n    checks.forEach(({ path, type, field }) => {\n      if (path) {\n        const defs = context.api.getIntegrationDefinitionsByType(type);\n        const deprecated = getDeprecatedSettings(path, defs);\n        if (deprecated.length > 0) {\n          errors.push({ field, message: `Integration \"${path.name}\" has deprecated settings that must be removed: ${deprecated.join(', ')}` });\n        }\n        const badChoices = getDeprecatedChoices(path, defs);\n        if (badChoices.length > 0) {\n          errors.push({ field, message: `Integration \"${path.name}\" has settings with choices that are no longer available: ${badChoices.map(c => c.label).join(', ')}` });\n        }\n      }\n    });\n\n    // Array-based integrations\n    const arrayChecks = [\n      { items: rule.delivery_destinations, type: 'delivery', field: 'delivery_destinations' },\n      { items: rule.enrichment_addons, type: 'enrichment', field: 'enrichment_addons' },\n      { items: rule.pre_transfer_integrations, type: 'pre_transfer', field: 'delivery_destinations' },\n    ];\n\n    arrayChecks.forEach(({ items, type, field }) => {\n      if (Array.isArray(items)) {\n        const defs = context.api.getIntegrationDefinitionsByType(type);\n        items.forEach((item) => {\n          if (item.integration) {\n            const deprecated = getDeprecatedSettings(item.integration, defs);\n            if (deprecated.length > 0) {\n              errors.push({ field, message: `Integration \"${item.integration.name}\" has deprecated settings that must be removed: ${deprecated.join(', ')}` });\n            }\n            const badChoices = getDeprecatedChoices(item.integration, defs);\n            if (badChoices.length > 0) {\n              errors.push({ field, message: `Integration \"${item.integration.name}\" has settings with choices that are no longer available: ${badChoices.map(c => c.label).join(', ')}` });\n            }\n          }\n        });\n      }\n    });\n\n    return errors;\n  };\n\n  const handleSave = () => {\n    const deprecatedErrors = checkForDeprecatedSettings();\n    const isValid = formApi.validate();\n\n    deprecatedErrors.forEach(({ field, message }) => {\n      formApi.setError(field, message);\n    });\n\n    if (isValid && deprecatedErrors.length === 0) {\n      save();\n    }\n  };\n\n  const save = () => {\n    scrollToTop();\n    // Fully de-ref and prep values for save\n    const saveRule = copy(rule);\n    delete saveRule.rules;\n    saveRule.order_id = props.order.id;\n\n    saveRule.label = saveRule.label.trim();\n\n    saveRule.ad_ids = saveRule.ads;\n    delete saveRule.ads;\n    saveRule.dba_id = saveRule.dba_id ?? null;\n    delete saveRule.dba;\n    saveRule.datasheet_ids = saveRule.datasheets.map((ds) => ds.id);\n    delete saveRule.datasheets;\n\n    // format number to +18885552222  (masking should give us +1 already)\n    // MRK-9038 allow any string due to Twilio syntax\n    // if (saveRule.destination_number) {\n    //   saveRule.destination_number = saveRule.destination_number.replace(/[^\\d\\+]/g, '');\n    // }\n\n\n    // Empty proxy bidding config, remove keys\n    if (!saveRule.proxy_bidding || Object.values(saveRule.proxy_bidding).filter((i) => i).length === 0) saveRule.proxy_bidding = {};\n\n    saveRule.schedule_type = saveRule.schedule.length > 0 ? 'inactive' : 'active';\n\n    // Zip match condition comes in as array, must be saved as string.\n    // If it's still an array (no interaction), stringify it\n    if (rule.match_conditions) {\n      rule.match_conditions = rule.match_conditions.map((group) => group.map((target) => {\n        if ((target.attribute === 'zipcode' || target.attribute === 'sub_1') && Array.isArray(target.value)) {\n          target.value = target.value.join(',');\n        }\n        return target;\n      }));\n    }\n\n    if (rule.vendor_attributes) {\n      rule.vendor_attributes = JSON.stringify(rule.vendor_attributes);\n    }\n\n    // Vendor_attributes of integration config - stringify JSON\n    // MST-1264 we are moving this value to a rule-level field\n    // but for now we are keeping it in the integrations for BC reasons\n    if (saveRule.enrichment_addons) {\n      saveRule.enrichment_addons = saveRule.enrichment_addons.map((addOn) => {\n        if (addOn.integration && addOn.integration.vendor_attributes) {\n          addOn.integration.vendor_attributes = JSON.stringify(addOn.integration.vendor_attributes);\n        }\n        return addOn;\n      });\n    }\n\n    if (saveRule.proxy_bidding && !Array.isArray(saveRule.proxy_bidding)) {\n      if (saveRule.proxy_bidding.integration && saveRule.proxy_bidding.integration.vendor_attributes) {\n        saveRule.proxy_bidding.integration.vendor_attributes = JSON.stringify(saveRule.proxy_bidding.integration.vendor_attributes);\n      }\n    }\n\n    if (saveRule.delivery_destinations) {\n      saveRule.delivery_destinations = saveRule.delivery_destinations.map((dest) => {\n        if (dest.integration && dest.integration.vendor_attributes) {\n          dest.integration.vendor_attributes = JSON.stringify(dest.integration.vendor_attributes);\n        }\n        return dest;\n      });\n    }\n\n    if (saveRule.channel_modifiers) {\n      saveRule.channel_modifiers = Object.values(saveRule.channel_modifiers);\n    }\n\n    if (saveRule.destination_sip?.settings && Object.keys(saveRule.destination_sip.settings).length) {\n      // Discard name, label... just the settings\n      saveRule.destination_sip = saveRule.destination_sip.settings;\n      // Transform array of objects with literal key/value attributes to an object of { key1:value1, key2:value2, etc }\n      if (saveRule.destination_sip.headers) {\n        const headers = {};\n        saveRule.destination_sip.headers.map((header) => {\n          headers[header.key] = header.value;\n        });\n        saveRule.destination_sip.headers = headers;\n      }\n    } else {\n      saveRule.destination_sip = null;\n    }\n\n     context.api.saveRule(saveRule, isNew);\n  };\n\n  return (\n    <>\n      <div ref={scrollTargetRef} style={{scrollMarginTop:'100px'}}></div>\n      <PageSection  className=\"rules-config-section\" >\n\n        <LoadingBar name=\"rulesConfig\" active={props.isUpdating} fnScrollTo={scrollToTop} overlay={false}/>\n\n        <ActionsPanel\n          rule={rule}\n          isOpen={props.actionsOpen}\n          isRootRule={props.isRoot}\n          isDirty={props.isDirty}\n          onChange={formApi.handleOnChange}\n          onPasteRule={handlePasteRule}\n          onSaveRule={handleSave}\n        />\n\n        { !rule && (\n          <div className=\"rule-none-selected\">Please select a rule to configure</div>\n        )}\n\n        { rule && (\n          <>\n            <Header\n              rule={rule}\n              onChange={formApi.handleOnChange}\n              isUpdating={props.isUpdating}\n              errors={formErrors}\n            />\n\n            {rule.disabled && (\n              <div className=\"disabled-notice mt-2\">\n                <StandardAlert color=\"danger\" icon=\"alert\" className=\"validation mb-0\">\n                  This rule is disabled. Bid, attributes, and descendant rules will not be applied.\n                  {allowEdit && <Button color=\"link\" className=\"p-0 ms-2\" onClick={() => context.api.disableRule(rule, false)}>Enable Rule</Button>}\n                </StandardAlert>\n              </div>\n            ) }\n\n            {/* Rule is not disabled but ancestor is */}\n            {propAncestors.disabled && (\n              <div className=\"disabled-notice mt-2\">\n                <StandardAlert color=\"danger\" icon=\"alert\" className=\"validation mb-0\">\n                  The ancestor rule &quot;\n                  {propAncestors.disabled.label}\n                  &quot; has been disabled. This rule will not be applied.\n                </StandardAlert>\n              </div>\n            ) }\n\n            <NavTabs\n              activeTab={props.activeTab}\n              handleSelectTab={props.onSelectTab}\n              isSectionValid={formApi.isSectionValid}\n              errorTabs={formErrorSections}\n              product={props.order.product}\n              allowAdvanced={props.allowAdvanced}\n            />\n\n\n            <div className=\"rule-config\">\n              <TabContent activeTab={props.activeTab} className=\"rules-transition\">\n\n                <TabPane tabId=\"summary\">\n                  <Summary\n                    rule={rule}\n                    timezone={props.order.account.timezone}\n                    gotoTab={props.onSelectTab}\n                    onChange={formApi.handleOnChange}\n                    errors={formErrors}\n                    channels={props.channels}\n                    accountAds={props.accountAds}\n                    product={props.order.product}\n                    isRootRule={props.isRoot}\n                    isDirty={formIsDirty}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"targeting\">\n\n                  <div className=\"mb-3\">\n                    {allowEdit ? (\n                      <>\n                        <div className=\"d-flex\">\n                          <div className=\"me-1\">\n                            <Input\n                              name=\"match_is_required\"\n                              type=\"checkbox\"\n                              checked={rule.match_is_required}\n                              onChange={(e) => formApi.handleOnChange('match_is_required', e.target.checked)}\n                            />\n                          </div>\n                          <div className=\"flex-fill\">\n                            <Label>Match is required for bid</Label>\n                            <FormText color=\"muted ms-2\">\n                              If this option is selected, and the rule does not match, the bidding process for this order will stop.\n                            </FormText>\n                          </div>\n                        </div>\n\n                        <div className=\"mt-1 d-flex\">\n                          <div className=\"me-1\">\n                            <Input\n                              name=\"is_standalone\"\n                              type=\"checkbox\"\n                              checked={rule.is_standalone}\n                              onChange={(e) => formApi.handleOnChange('is_standalone', e.target.checked)}\n                            />\n                          </div>\n                          <div className=\"flex-fill\">\n                            <Label>Standalone Rule</Label>\n                            <FormText color=\"muted ms-2\">\n                              If this option is selected, the rule does not pass any of its settings along to its sibling rules.\n                            </FormText>\n                          </div>\n                        </div>\n                      </>\n                    ) : (\n                      <>\n                        <DataRow label=\"Match is required\">{rule.match_is_required ? 'Yes' : 'No'}</DataRow>\n                        <DataRow label=\"Standalone rule\">{rule.is_standalone ? 'Yes' : 'No'}</DataRow>\n                      </>\n                    )}\n                  </div>\n\n                  {allowEdit ? (\n                    <LazyTargetingManager\n                      conditions={rule.match_conditions}\n                      onUpdate={(groups) => formApi.handleOnChange('match_conditions', groups)}\n                      attributes={context.attributes}\n                      attributeGroups={context.attributeGroups}\n                      errors={formErrors.match_conditions}\n                      className=\"advertiser\"\n                      allowEdit={allowEdit}\n                    />\n                  ) : (\n                    rule.match_conditions.length > 0 && rule.match_conditions[0].length > 0 ? (\n                      <div className=\"target-description-block\">\n                        <TargetGroupsDescription\n                          groups={rule.match_conditions}\n                          attributes={context.attributes}\n                        />\n                      </div>\n                    ) : (\n                      <StandardAlert color=\"light\" icon=\"info\">No targets defined.</StandardAlert>\n                    )\n                  )}\n\n                </TabPane>\n\n                <TabPane tabId=\"datasheets\">\n                  <LazyDatasheets\n                    datasheets={rule.datasheets}\n                    accountDatasheets={props.datasheets}\n                    accountId={props.order.account.id}\n                    onChange={(sheets, dirtyForm) => formApi.handleOnChange('datasheets', sheets, dirtyForm)}\n                    errors={formErrors.datasheets}\n                    allowEdit={allowEdit}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"bidding\">\n                  <Bidding\n                    isActiveTab={props.activeTab === 'bidding'}\n                    accountId={props.order.account.id}\n                    {...rule.bidding}\n                    bid_ceiling={rule.bid_ceiling}\n                    proxyBidding={rule.proxy_bidding}\n                    product={props.order.product}\n                    exclusivity={rule.exclusivity}\n                    schedule={rule.schedule_modifiers}\n                    scheduleTimezone={rule.schedule_modifiers_timezone}\n                    onChangeSchedule={handleChangeSettingSchedule}\n                    onChange={formApi.handleOnChange}\n                    errors={formErrors}\n                    allowEdit={allowEdit}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"enrichments\">\n                  <Enrichments\n                    addOns={rule.enrichment_addons}\n                    onChange={(sc) => formApi.handleOnChange('enrichment_addons', sc)}\n                    errors={formErrors.enrichment_addons || {}}\n                    loadIntegrations={() => {\n                      return context.api.getIntegrationDefinitionsByType('enrichment')\n                    }}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"sale_confirmation\">\n                  <SaleConfirmation\n                    saleConfirmation={rule.sale_confirmation}\n                    onChange={(sc) => formApi.handleOnChange('sale_confirmation', sc)}\n                    errors={formErrors.sale_confirmation || {}}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"activity\">\n                  <LazyActivitySchedule\n                    schedule={rule.schedule}\n                    scheduleType={rule.schedule_type}\n                    scheduleAffectsSiblings={rule.schedule_affects_siblings}\n                    onChangeSchedule={(s) => formApi.handleOnChange('schedule', s)}\n                    onChangeScheduleType={(type) => formApi.handleOnChange('schedule_type', type)}\n                    onChangeScheduleAffectsSiblings={(val) => formApi.handleOnChange('schedule_affects_siblings', val)}\n                    timezone={props.order.account.timezone}\n                    propAncestors={propAncestors}\n                    isRootRule={props.isRoot}\n                    error={formErrors.schedule}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"budget\">\n                  <Budgets\n                    product={props.order.product}\n                    budgets={rule.budgets}\n                    caps={rule.caps}\n                    saleAttemptCaps={rule.sale_attempt_caps}\n                    onChange={formApi.handleOnChange}\n                    onChangeSchedule={handleChangeSettingSchedule}\n                    schedule={rule.schedule_caps}\n                    scheduleTimezone={rule.schedule_caps_timezone}\n                    scheduleSaleAttemptCaps={rule.schedule_sale_attempt_caps}\n                    scheduleSaleAttemptCapsTimezone={rule.schedule_sale_attempt_caps_timezone}\n                    allowEdit={allowEdit}\n                  />\n                </TabPane>\n\n                {props.order.product === 'clicks' && (\n                  <TabPane tabId=\"ads\">\n                    <Ads\n                      ruleAds={rule.ads}\n                      accountAds={props.accountAds}\n                      overrideParent={rule.override_parent_ads}\n                      onChangeAds={formApi.handleOnChange}\n                      isRootRule={props.isRoot}\n                      accountId={props.order.account.id}\n                    />\n                  </TabPane>\n                )}\n\n                <TabPane tabId=\"channels\">\n                  <Channels\n                    rule={rule}\n                    isRootRule={props.isRoot}\n                    channels={props.channels}\n                    modifiers={rule.channel_modifiers}\n                    overrideParentChannelModifiers={rule.override_parent_channel_modifiers}\n                    onChange={formApi.handleOnChange}\n                    errors={formErrors.channel_modifiers || {}}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"destinations\">\n                  <Destination\n                    redirectUrl={rule.redirect_url}\n                    redirectUrlTemplate={rule.redirect_url_template}\n                    destinationNumber={rule.destination_number}\n                    deliveryDestinations={rule.delivery_destinations}\n                    destinationSip={rule.destination_sip}\n                    callStartedWebhooks={rule.call_started_webhooks}\n                    callEndedWebhooks={rule.call_ended_webhooks}\n                    preTransferIntegrations={rule.pre_transfer_integrations}\n                    tokens={props.tokens}\n                    prefill={rule.prefill}\n                    onChange={formApi.handleOnChange}\n                    product={props.order.product}\n                    verticalId={props.order.vertical.id}\n                    propAncestors={propAncestors}\n                    errors={formErrors}\n                    allowEdit={allowEdit}\n                  />\n                </TabPane>\n\n                <TabPane tabId=\"tags\">\n                  <Tag\n                    tags={rule.tags}\n                    onChange={(tags) => formApi.handleOnChange('tags', tags)}\n                    allowEdit={allowEdit}\n                  />\n                </TabPane>\n\n                {props.order.product === 'calls' && (\n                  <TabPane tabId=\"calls\">\n                    <CallSettings\n                      concurrency={rule.call_concurrency}\n                      billableDuration={rule.billable_duration}\n                      propAncestors={propAncestors}\n                      onChange={formApi.handleOnChange}\n                      errors={formErrors}\n                      allowEdit={allowEdit}\n                    />\n                  </TabPane>\n                )}\n\n                {props.order.product === 'clicks' && (\n                  <TabPane tabId=\"tracking\">\n                    <Tracking\n                      impressionUrls={rule.impression_urls}\n                      clickUrls={rule.click_urls}\n                      onChange={formApi.handleOnChange}\n                      errors={formErrors}\n                      allowEdit={allowEdit}\n                    />\n                  </TabPane>\n                )}\n\n                <TabPane tabId=\"advanced\">\n                  {props.allowAdvanced && (\n                    <Advanced\n                      internalBidModifier={rule.internal_bid_modifier}\n                      trackQualifyingRate={rule.track_qualifying_rate}\n                      ignoreSaleRate={rule.ignore_sale_rate}\n                      qualifyingRateStart={rule.qualifying_rate_start}\n                      excludeProfitReporting={rule.exclude_profit_reporting}\n                      searchableLeads={rule.searchable_leads}\n                      searchableLeadsEffective={rule.searchable_leads_effective}\n                      isRootRule={props.isRoot}\n                      billMissedCalls={rule.bill_missed_calls}\n                      duplicateWindow={rule.duplicate_window}\n                      vendorAttributes={rule.vendor_attributes}\n                      tokens={props.tokens}\n                      timezone={props.order.account.timezone}\n                      buyer_name={rule.buyer_name}\n                      buyer_group={rule.buyer_group}\n                      dbaId={rule.dba_id}\n                      maxUnqualifiedCalls={rule.max_unqualified_calls}\n                      unqualifiedCallsStart={rule.unqualified_calls_start}\n                      onChange={formApi.handleOnChange}\n                      errors={formErrors}\n                    />\n                  )}\n                </TabPane>\n              </TabContent>\n            </div>\n\n            { rule && allowEdit && (\n              <div className=\"mt-5 d-flex justify-content-end align-items-center\">\n\n                { (formIsDirty || Object.entries(formErrors).length > 0) && (\n                  <span className=\"me-3 d-inline-block dirty-alert\">\n                <FaIcon icon=\"exclamation-circle\" color=\"#990000\" size=\"sm\" />\n                    &nbsp;\n                    {Object.entries(formErrors).length > 0\n                      ? <span>Please correct errors before saving.</span>\n                      : <span>This rule has been modified. Save your changes or cancel.</span>}\n              </span>\n                )}\n\n                <Button\n                  size=\"sm\"\n                  onClick={handleCancel}\n                  color=\"link\"\n                  disabled={(!rule.isNew && !formIsDirty) || props.isUpdating}\n                  className=\"me-2\"\n                >\n                  Cancel\n                </Button>\n\n                <Button\n                  size=\"sm\"\n                  onClick={handleSave}\n                  color=\"primary\"\n                  disabled={props.isUpdating}\n                >\n                  Save Rule\n                </Button>\n\n              </div>\n            )}\n          </>\n        )}\n\n    </PageSection>\n    </>\n\n\n  );\n};\n\nRulesConfig.propTypes = {\n  rule: PropTypes.object,\n  attributes: PropTypes.object,\n  attributeLookup: PropTypes.object,\n  product: PropTypes.string,\n  channels: PropTypes.array,\n  accountAds: PropTypes.array,\n  datasheets: PropTypes.array,\n  dbas: PropTypes.array,\n  tokens: PropTypes.array,\n  timezone: PropTypes.string,\n  isDirty: PropTypes.bool,\n  isUpdating: PropTypes.bool,\n  isRoot: PropTypes.bool,\n  activeTab: PropTypes.string,\n  onSelectTab: PropTypes.func,\n  actionsOpen: PropTypes.bool,\n  allowAdvanced: PropTypes.bool,\n};\n\nexport default RulesConfig;\n","import React from 'react';\nimport ContentLoader from 'react-content-loader';\nimport PageSection from '../../../Layout/PageSection';\n\n/*\n * https://github.com/danilowoz/create-content-loader/blob/master/src/Gallery/insertYourLoaderHere/Gmail.js\n */\nconst RuleSkeleton = (props) => (\n  <PageSection\n    className=\"rules-config-section\"\n    title=\"Rule Manager\"\n  >\n    <ContentLoader\n      height={510}\n      width=\"100%\"\n\n      speed={0.8}\n      {...props}\n    >\n\n      <rect x=\"0\" y=\"20\" rx=\"0\" ry=\"0\" width=\"100\" height=\"30\" />\n      <rect x=\"120\" y=\"20\" rx=\"0\" ry=\"0\" width=\"100\" height=\"30\" />\n      <rect x=\"240\" y=\"20\" rx=\"0\" ry=\"0\" width=\"100\" height=\"30\" />\n      <rect x=\"360\" y=\"20\" rx=\"0\" ry=\"0\" width=\"100\" height=\"30\" />\n      <rect x=\"480\" y=\"20\" rx=\"0\" ry=\"0\" width=\"100\" height=\"30\" />\n\n      <rect x=\"0\" y=\"60\" rx=\"0\" ry=\"0\" width=\"100%\" height=\"400\" />\n\n      <rect x=\"92%\" y=\"480\" rx=\"0\" ry=\"0\" width=\"100\" height=\"32\" />\n\n    </ContentLoader>\n\n  </PageSection>\n);\n\nRuleSkeleton.metadata = {\n  name: 'Caio Davi',\n  github: 'caio-davi',\n  description: 'Reles Manager Skeleton',\n  filename: 'RulesManagerSkeleton',\n};\n\nexport default RuleSkeleton;\n","import React, {FC, useContext} from \"react\";\nimport {\n  Button, Modal, ModalHeader, ModalFooter, ModalBody, Input, FormGroup, Label, FormFeedback\n} from \"reactstrap\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport LoadingBar from '../../../../Layout/LoadingBar';\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport { useNavigate } from 'react-router-dom';\nimport useFormState from \"../../../../Hooks/useFormState\";\nimport {Order} from \"../../../../types\";\n/*\nIf later we want to clone across verticals, products, accounts\n import { ProductChoices } from '../../../../Components/Table/FilterChoices';\nimport {Filter} from \"../../../../Components/Table/Filter\";\nimport {VerticalMap} from \"../../../../Components/Table/Table\";\nimport {titleCase} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\n */\n\n\n\ntype CloneOrderFormValues = {\n  name: string;\n  status: string;\n}\n\n\ntype CloneOrderModalType = {\n  isOpen: boolean,\n  close: any,\n  order: Order,\n  accountOrders: Order[]\n}\n\nconst CloneOrderModal: FC<CloneOrderModalType> = ({\n  isOpen,\n  close,\n  order,\n  accountOrders\n}) => {\n  const app = useContext(AppContext);\n  const navigate = useNavigate();\n  const {\n    formApi, formValues, formErrors\n  }: any = useFormState({\n    name:\"\",\n    status: \"paused\"\n  } as CloneOrderFormValues);\n\n\n  const handleSave = () => {\n    //@ts-ignore\n    const {name, status} = formValues;\n    const orderNames = accountOrders.map((o:Order) => o.name.toLowerCase());\n    if (!name) {\n      formApi.setError(\"name\", \"Name is required\")\n    } else if (orderNames.includes(name.toLowerCase())) {\n      formApi.setError(\"name\", \"An existing order has this name already\")\n    }\n\n    createOrder();\n  }\n\n  const handleCloseModal = () => {\n    formApi.clearForm();\n    close();\n  }\n\n  const createOrder = async () => {\n\n    app.showLoader('modal', 'Copying Order...');\n\n    const params = {\n      name: formValues.name,\n      status: formValues.status,\n      product: order.product,\n      vertical_id: order.vertical.id,\n      account_id: order.account.id,\n      copy_rules_from_id: order.id\n    }\n    const newOrder = await app.api.endpoints.orders.create(params)\n    if (newOrder) {\n      notify(`The order has been copied`, 'success');\n      navigate(`/accounts/${order.account.id}/order/${newOrder.id}/rules`);\n      handleCloseModal();\n    } else {\n      notify(`Unable to save order: ${app.api.error.name}`, 'error');\n    }\n\n    app.showLoader(false);\n  }\n\n  return (\n    <Modal isOpen={isOpen} toggle={close} size=\"md\">\n      <ModalHeader toggle={close}>Clone Order</ModalHeader>\n      <div className=\"modal-subheader\">{order.name}</div>\n      <ModalBody>\n        <LoadingBar name=\"modal\" />\n\n        <FormGroup>\n          <Label>New Order Name</Label>\n\n          <Input\n            type=\"text\"\n            value={formValues.name}\n            name=\"name\"\n            onChange={formApi.handleOnChange}\n            invalid={!!formErrors.name}\n          />\n          <FormFeedback>\n            {formErrors.name}\n          </FormFeedback>\n        </FormGroup>\n\n        <FormGroup check>\n          <Label>\n\n            <Input\n              type=\"radio\"\n              onChange={formApi.handleOnChange}\n              value=\"paused\"\n              checked={formValues.status === \"paused\"}\n              name=\"status\"\n            />\n            Paused\n        </Label>\n\n        <Label>\n          <Input\n            type=\"radio\"\n            onChange={formApi.handleOnChange}\n            value=\"active\"\n            //@ts-ignore\n            checked={formValues.status === \"active\"}\n            name=\"status\"\n            className=\"ms-2 me-1\"\n          />\n          Active\n        </Label>\n\n        </FormGroup>\n\n      </ModalBody>\n      <ModalFooter>\n\n        <Button\n          onClick={handleCloseModal}\n          color=\"link\"\n          size=\"sm\"\n        >\n          Cancel\n        </Button>\n        <Button\n          onClick={handleSave}\n          color=\"primary\"\n          size=\"sm\"\n        >\n          Clone\n        </Button>\n\n      </ModalFooter>\n    </Modal>\n  );\n};\n\nexport default CloneOrderModal;\n","import React, {useState, useMemo, useEffect} from 'react';\nimport {Link, useNavigate} from \"react-router-dom\";\nimport {\n  Label,\n  Button,\n  UncontrolledDropdown,\n  DropdownToggle,\n  DropdownMenu,\n  DropdownItem\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PageSection from '../../../Layout/PageSection';\nimport usePermission from '../../../Hooks/usePermission';\nimport { titleCaseWord } from '../../../utils/string';\nimport StatusToggler from '../../../Components/Form/StatusToggler';\nimport useApi from '../../../Hooks/useApi';\nimport useFavoriteOrder from \"../../../Hooks/useFavoriteOrder\";\nimport {FaveHeart} from \"../../../Components\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport OrderLastSold from '../OrderLastSold';\nimport CloneOrderModal from \"./RulesConfig/CloneOrderModal\";\nimport {Order, StatusType} from \"../../../types\";\nimport StatusDot from \"../../../Components/Icons/StatusDot\";\n//@ts-ignore\nimport confirm from \"reactstrap-confirm\"\n\ntype OrderInfoBarProps = {\n  order:Order\n}\n\n/*\n * Bar at top of rules manager shows order info and links\n */\nconst OrderInfoBar = ({ order }:OrderInfoBarProps) => {\n  const [accountOrders, setAccountOrders] = useState<Order[]>([]);\n  const navigate = useNavigate();\n  const allowEditOrderStatus = usePermission('order_status.edit');\n  const allowViewLeads = usePermission('leads.view');\n  const allowViewCalls = usePermission('calls.view');\n  const allowViewAuctions = usePermission('auctions.view');\n  const allowCloneOrders = usePermission('orders_clone.create');\n  const allowChangeLog = usePermission('changes.view');\n  const {api} = useApi();\n  const {favorites, addOrder, removeOrder} = useFavoriteOrder();\n\n  const isFavorite = useMemo(\n    () => {\n      return favorites ? Boolean(favorites.find((fav:any) => fav.id === order.id)) : false;\n    },\n    [favorites]\n  )\n\n  const [isCloneOpen, setCloneOpen] = useState(false);\n\n  useEffect(()=>{\n    getExistingOrders(order.account.id)\n  }, [])\n\n\n  const getExistingOrders = async(account_id: any) => {\n    // (this won't get archived orders but that's dandy\n    if (account_id) {\n      //setLoadingOrders(true);\n      const orders = await api.endpoints.orders.list({account_id});\n      if (orders) {\n        setAccountOrders(orders);\n      }\n    }\n\n  }\n\n  const toggleClone = () => setCloneOpen(!isCloneOpen);\n\n  const gotoOrder = (order:Order) => {\n    navigate(`/accounts/${order.account.id}/order/${order.id}/rules`);\n  }\n\n  const archiveConfirm = async () => await confirm({\n    title: 'Archive Order',\n    message: 'Archive this item? It will be de-activated and removed from all listings.',\n    confirmText: 'Yes, archive it',\n    cancelText: \"Cancel archive\",\n  })\n\n\n\n  const handleStatusChange = async (orderId:number, status:StatusType) => {\n    if (order) {\n\n      if (status === 'archived') {\n        const doArchive = await archiveConfirm()\n        if (!doArchive) {\n          return false\n        }\n      }\n\n      const result = await api.endpoints.orders.update({\n        id: orderId, name: order.name, status,\n      });\n\n      if (result) {\n        notify('Order status updated', 'success');\n      } else {\n        notify('Unable to update order status', 'error');\n      }\n\n      return Boolean(result);\n    }\n    return false;\n  };\n\n  const handleSetFavorite = async (id:number, setAsFavorite:boolean) => {\n    if (setAsFavorite) {\n      await addOrder(id);\n    } else {\n      await removeOrder(id);\n    }\n  }\n\n\n  return (\n    <PageSection\n      title={\"ORDER\"}\n      subtitle={<span>\n        {order.name} <FaveHeart isFavorite={isFavorite} id={order.id} size=\"sm\" onChange={handleSetFavorite} className=\"ms-1 mb-1\" />\n      </span>}\n      tools={\n        <OrderActionLinks\n          order={order}\n          allowChangeLog={allowChangeLog}\n          allowCloneOrders={allowCloneOrders}\n          allowViewLeads={allowViewLeads}\n          allowViewAuctions={allowViewAuctions}\n          allowViewCalls={allowViewCalls}\n          onClone={toggleClone}\n          />\n      }\n      className=\"order-info-section mb-3\"\n    >\n      <div >\n\n\n\n        <div className=\"d-flex align-items-center\">\n\n\n          <div className=\"order-info-cell\">\n            <Label>Account</Label>\n            <div className=\"d-flex no-wrap\">\n              {order.account.name}\n              {accountOrders.length > 1 && (\n                <UncontrolledDropdown  >\n                  <DropdownToggle className=\"ms-1 inline\" color=\"link\" size=\"xs\" caret>Orders</DropdownToggle>\n                  <DropdownMenu >\n                    {accountOrders.map((ord, i) =>(\n                      <DropdownItem onClick={()=>gotoOrder(ord)} key={i}>\n                        <StatusDot status={ord.status}  className=\"order-status\" /> {ord.name}\n                      </DropdownItem>\n                    ))}\n                  </DropdownMenu>\n                </UncontrolledDropdown>\n              )}\n            </div>\n          </div>\n\n          <div className=\"order-info-cell\">\n            <Label>Vertical</Label>\n            <div>{order.vertical.display_name}</div>\n          </div>\n\n          <div className=\"order-info-cell\">\n            <Label>Product</Label>\n            <div>{titleCaseWord(order.product)}</div>\n          </div>\n\n          <div className=\"order-info-cell\">\n            <Label>Status</Label>\n            <div>\n              <StatusToggler\n                status={order.status}\n                target={order.id}\n                onChangeAsync={handleStatusChange}\n                allowEdit={allowEditOrderStatus}\n              />\n\n            </div>\n          </div>\n\n          <div className=\"order-info-cell\">\n            <Label>Last Sold</Label>\n            <div>\n              {order.last_sold_at ? (\n                <OrderLastSold\n                  date={order.last_sold_at}\n                  isStale={order.last_sold_alert}\n                  status={order.status}\n                  orderId={order.id}\n                />\n              ) : <span>&mdash;</span>}\n            </div>\n          </div>\n\n        </div>\n\n\n\n\n      </div>\n\n      {allowCloneOrders && <CloneOrderModal\n        isOpen={isCloneOpen}\n        close={toggleClone}\n        order={order}\n        accountOrders={accountOrders}\n      />}\n\n    </PageSection>\n  );\n};\n\n\nexport default OrderInfoBar;\n\n\ntype OrderActionLinksProps = {\n  order:Order,\n  allowChangeLog:boolean,\n  allowCloneOrders:boolean,\n  allowViewLeads:boolean,\n  allowViewAuctions:boolean,\n  allowViewCalls:boolean,\n  onClone:any,\n}\n\nconst OrderActionLinks = ({\n  order,\n  allowChangeLog,\n  allowCloneOrders,\n  allowViewLeads,\n  allowViewAuctions,\n  allowViewCalls,\n  onClone,\n                          }:OrderActionLinksProps) => {\n\n  return (\n    <div className=\"d-flex justify-content-between mb-2\">\n      {/*<h5 className=\"p-0 m-0 \">\n            <span className=\"card-title\">ORDER: {order.name}</span>\n            <FaveHeart isFavorite={isFavorite} id={order.id} size=\"sm\" onChange={handleSetFavorite} className=\"ms-1 mb-1\" />\n          </h5>*/}\n      {/* Links and actions */}\n      <div>\n\n        {allowChangeLog && (\n          <span className=\"action-item\">\n              <Button\n                tag={Link}\n                color=\"link\"\n                target=\"_blank\"\n                to={{\n                  pathname: '/changes',\n                  search: `accounts=${order.account.id}&orders=${order.id}&page=1&sort_by=occurred_at&sort_dir=desc&limit=20`,\n                }}\n                title=\"Go to change log for this order\"\n                className=\"inline\"\n              >\n               <FaIcon icon=\"list\" size=\"sm\"  /> Change Log\n              </Button>\n            </span>\n        )}\n\n        {allowCloneOrders && (\n          <span className=\"action-item\">\n              <Button\n                color=\"link\"\n                title=\"Clone Order\"\n                className=\"inline ms-2\"\n                onClick={onClone}\n              >\n              <FaIcon icon=\"copy\" size=\"sm\" className=\"me-1\" />Clone\n              </Button>\n            </span>\n        )}\n\n\n        {order.product === 'leads' && allowViewLeads && (\n          <span className=\"action-item\">\n              <Button\n                tag={Link}\n                color=\"link\"\n                target=\"_blank\"\n                to={{\n                  pathname: '/reports/leads',\n                  search: `accounts=${order.account.id}&orders=${order.id}&sort_by=received_time&sort_dir=desc`,\n                }}\n                title=\"Lead prospects for this order\"\n                className=\"inline ms-2\"\n              >\n               <FaIcon icon=\"id-card\" size=\"sm\" className=\"me-1\" />Lead prospects\n              </Button>\n            </span>\n        )}\n\n        {order.product === 'calls' && allowViewCalls && (\n          <span className=\"action-item\">\n\n              <Button\n                tag={Link}\n                target=\"_blank\"\n                color=\"link\"\n                to={{\n                  pathname: '/reports/calls',\n                  search: `accounts=${order.account.id}&orders=${order.id}&sort_by=received_time&sort_dir=desc`,\n                }}\n                title=\"Call prospects for this order\"\n                className=\"inline ms-2\"\n              >\n                <FaIcon icon=\"phone\" size=\"sm\" /> Call Prospects\n              </Button>\n            </span>\n        )}\n\n        {allowViewAuctions && (\n          <>\n                <span className=\"action-item\">\n                  <Button\n                    tag={Link}\n                    target=\"_blank\"\n                    color=\"link\"\n                    to={{\n                      pathname: '/auctions',\n                      search: `page=1&order=${order.id}`,\n                    }}\n                    title=\"Auctions\"\n                    className=\"inline ms-2\"\n                  >\n                    <FaIcon icon=\"comment-dollar\" size=\"sm\" /> Auctions\n                  </Button>\n                </span>\n            <span className=\"action-item\">\n                  <Button\n                    tag={Link}\n                    color=\"link\"\n                    target=\"_blank\"\n                    to={{\n                      pathname: '/routing',\n                      search: `account=${order.account.id}&order=${order.id}`,\n                    }}\n                    title=\"Routing Map\"\n                    className=\"inline ms-2\"\n                  >\n                    <FaIcon icon=\"project-diagram\" size=\"sm\" /> Routing\n                  </Button>\n                </span>\n          </>\n\n        )}\n      </div>\n    </div>\n  )\n}\n","import React, {ChangeEvent} from \"react\";\nimport {Input} from \"reactstrap\";\nimport {DeliveryRejectCategoryChoices} from \"../../../Components/Table/FilterChoices\";\n\n\nconst RejectionCategorySelect = ({\n                                   selected='delivery_timeout',\n                                   onChange\n}:{selected:string, onChange:(e:ChangeEvent<HTMLInputElement>)=>void}) => {\n\n  return (\n    <Input\n      type=\"select\"\n      bsSize=\"sm\"\n      value={selected}\n      onChange={onChange}\n    >\n      {/*<option value=\"\" >All Categories</option>)*/}\n      {DeliveryRejectCategoryChoices.map(\n        (c:Record<string, string>, i:number) => <option key={i} value={c.value}>{c.label}</option>\n      )}\n\n    </Input>\n  )\n}\n\nexport default RejectionCategorySelect;\n","/*\n * Lists integrations and rejection counts for given rejection category\n */\nimport NumberFormat from \"react-number-format\";\nimport React from \"react\";\n\ntype IntegrationsRejectionsCountsProps = {\n  rejectionsByCategory: Record<string, {integration:string, count:number}[]>\n  category: string;\n  className?:string;\n}\n\nconst IntegrationRejectionList = ({rejectionsByCategory, category, className=\"\"}:IntegrationsRejectionsCountsProps) => {\n\n  return (\n    <div className={`${className} integrations-rejected`}>\n      <div className=\"form-section border\">\n\n        <div className=\"list thin-scrollbar\">\n          {rejectionsByCategory && typeof rejectionsByCategory[category] !== 'undefined' ? (\n            <>\n              {rejectionsByCategory[category].map((data:any,i:number) => (\n                <div className=\"data-row\" key={i}>\n                  <label>{data.integration}</label>\n                  <div className=\"text-end me-1\"><NumberFormat value={data.count} displayType=\"text\" thousandSeparator /></div>\n                </div>\n              ))}\n            </>\n          ) : (\n            <i>None found</i>\n          )}\n\n        </div>\n\n      </div>\n    </div>\n  )\n}\n\nexport default IntegrationRejectionList\n","import React, {ChangeEvent, useState} from \"react\";\nimport StackedBarChart from \"../../Components/Chart/StackedBarChart\";\nimport {DefaultStackedChartOptions} from \"../../Components/Chart/chart\";\nimport { Nav, TabContent, TabPane} from \"reactstrap\";\nimport RejectionCategorySelect from \"./List/RejectionCategorySelect\";\nimport IntegrationRejectionList from \".//List/IntegrationRejectionList\";\nimport NumberFormat from \"react-number-format\";\nimport {TabNav} from \"@thedmsgroup/mastodon-ui-components\";\n\n// can't get ChartOptions type to validate type:'time'\nconst StackedChartOptions = DefaultStackedChartOptions as any;\n\n\n/*\n * Tabbed widget that displays lists and graphs derived from aggregate\n * data about delivery rejections, from the read service.\n *\n * TODO: when aggregating by day, the label on the last day bar is missing\n *  ( or if just one day, there is no label)\n *  Doesn't happen for one hour bar\n */\ntype DeliveryRejectStatProps = {\n  rejectCategory:string;\n  onChangeRejectCategory:(category:string) => void;\n  data: Record<string, any>,\n  isLoading:boolean,\n  className?:string\n  aggInterval?:string\n  intervalLabel?:string;\n  chartMinTime?:string;\n  chartMaxTime?:string;\n  onZoom?:(start:Date, end:Date) =>void,\n}\n\nconst DeliveryRejectStat = ({\n  rejectCategory,\n  onChangeRejectCategory,\n  data = [],\n  className = \"\",\n  aggInterval,\n  intervalLabel,\n  chartMinTime,\n  chartMaxTime,\n  onZoom,\n\n}: DeliveryRejectStatProps) => {\n\n  const [activeTab, setActiveTab] = useState(\"categories\");\n  const [selectedRejectCategory, setSelectedRejectCategory] = useState<string>(rejectCategory);\n\n  const handleChangeRejectCategory = (e:ChangeEvent<HTMLInputElement>) => {\n    setSelectedRejectCategory(e.target.value);\n    onChangeRejectCategory(e.target.value);\n  }\n\n\n  return (\n    <div className={`list-and-chart ${className}`}>\n\n      <Nav tabs className=\"mb-2\">\n        <TabNav\n          isActive={activeTab === \"categories\"}\n          setActive={setActiveTab}\n          id=\"categories\"\n        >\n          By Category\n        </TabNav>\n        <TabNav\n          isActive={activeTab === \"integrations\"}\n          setActive={setActiveTab}\n          id=\"integrations\"\n        >\n          By Integration\n        </TabNav>\n\n      </Nav>\n\n      <TabContent activeTab={activeTab} style={{ height: '220px' }}>\n        <TabPane tabId=\"categories\">\n          <div className=\"chart-grid\">\n\n            <div className=\"scrolling-list\">\n              <div className=\"form-section border\">\n                <div className=\"list thin-scrollbar\">\n                  {data.rejectionCategoryTotals && data.rejectionCategoryTotals.length > 0\n                    ? (\n                    data.rejectionCategoryTotals.map((bkt:any,i:number) => (\n                    <div className=\"data-row\" key={i}>\n                      <label>{bkt.key}</label>\n                      <div className=\"text-end me-1\"><NumberFormat value={bkt.doc_count} displayType=\"text\" thousandSeparator /></div>\n                    </div>\n                    ))) : (\n                    <i>None found</i>\n                  )}\n                </div>\n\n              </div>\n            </div>\n\n\n            {data.rejectionsOverTimeByCategory && (\n              <StackedBarChart\n                labels={data.rejectionsOverTimeByCategory.labels}\n                datasets={data.rejectionsOverTimeByCategory.datasets}\n                options={StackedChartOptions}\n                styles={{ height: '200px' }}\n                aggInterval={aggInterval ?? \"\"}\n                xLabel={`Sent per ${intervalLabel}`}\n                minTime={chartMinTime}\n                maxTime={chartMaxTime}\n                onZoom={onZoom}\n                showNow\n                showNowLabel\n              />\n            )}\n\n          </div>\n        </TabPane>\n\n        <TabPane tabId=\"integrations\">\n\n          <div className=\"chart-grid integrations-rejected\">\n            <div>\n              <div className=\"mb-1\">\n                <RejectionCategorySelect selected={selectedRejectCategory} onChange={handleChangeRejectCategory} />\n              </div>\n              <IntegrationRejectionList\n                rejectionsByCategory={data.integrationRejectionTotals}\n                category={selectedRejectCategory}\n                className=\"scrolling-list\"\n              />\n            </div>\n\n            {data.rejectionsOverTimeByIntegration && (\n              <StackedBarChart\n                labels={data.rejectionsOverTimeByIntegration.labels}\n                datasets={data.rejectionsOverTimeByIntegration.datasets}\n                options={StackedChartOptions}\n                styles={{ height: '200px' }}\n                aggInterval={aggInterval ?? \"\"}\n                xLabel={`Sent per ${intervalLabel}`}\n                minTime={chartMinTime}\n                maxTime={chartMaxTime}\n                onZoom={onZoom}\n                showNow\n                showNowLabel\n              />\n            )}\n\n          </div>\n\n        </TabPane>\n\n      </TabContent>\n\n    </div>\n  )\n}\n\nexport default DeliveryRejectStat;\n\n","import {useEffect, useState} from 'react';\nimport useApi from \"./useApi\";\n\n// Translates integration alias to a display name.\n// This is useful because some services, like the read service, only provide an alias\n// Example usage:\n// const {isLoaded: isIntegrationsLoaded, getIntegrationName} = useIntegrationNameLookup();\n// if (isIntegrationsLoaded) getIntegrationName('alias_shmalias');\nconst useIntegrationNameLookup = (params:Record<string, any> = {}) => {\n  const [lookup, setLookup] = useState<Record<string, string>>({})\n  const [isLoaded, setIsLoaded] = useState(false);\n  const apiIntegrations = useApi('integrations', 'list');\n\n  useEffect(() => {\n\n    const loadIntegrations = async() => {\n      const result = await apiIntegrations.fetch({ ...params, limit: 1000 } );\n      if (result) {\n        setLookup(() => {\n          const records = {} as Record<string, any>;\n          result.data.map((intg:any) => {\n            records[intg.name] = intg.label;\n          })\n          return records;\n        })\n      }\n      setIsLoaded(true);\n    }\n\n    if (!Object.keys(lookup).length) {\n      loadIntegrations()\n    }\n\n  }, [])\n\n  const getIntegrationName = (alias:string) => {\n    return lookup[alias] ?? alias;\n  }\n\n  return {lookup, isLoaded, getIntegrationName};\n\n};\n\nexport default useIntegrationNameLookup;\n","import React, {FC, useMemo} from 'react';\nimport {Button} from \"reactstrap\";\nimport FlexTable from \"../../../Components/Table/FlexTable\";\nimport {PercentFormatter, MoneyFormatter} from \"../../../Components/Table/Table\";\nimport {Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport NumberFormat from \"react-number-format\";\n\ntype RuleCapStat = {\n  rule_id: string;\n  order_id: string;\n  type: string;\n  start_date: string;\n  budget_cap: string;\n  budget_cap_used: string;\n  budget_fill_rate: string;\n  sale_cap: string | null;\n  sale_cap_used: string | null;\n  sale_fill_rate: string | null;\n  rule_path: string;\n};\n\ntype CapStatsProps = {\n  stats: RuleCapStat[],\n  onSelectRule: (rule_id: number|string) => void,\n  isLoading?: boolean,\n};\n\nexport const CapStats:FC<CapStatsProps> = ({stats, onSelectRule, isLoading}) => {\n  const columns = useMemo(() => [\n    {\n      Header: 'Rule',\n      accessor:'rule_path',\n      disableSortBy:true,\n      Cell:({value, row}:any) => <RulePathCell rulePath={value} ruleId={row.original.rule_id} onSelect={onSelectRule} />\n    },\n    {\n      Header: 'Type',\n      accessor:'type',\n      Cell: ({ value }:any) => Utils.titleCase(value)\n    },\n    {\n      Header: 'Budget Cap',\n      accessor:'budget_cap',\n      Cell: ({ value }:any) => <MoneyFormatter value={value} />\n    },\n    {\n      Header: 'Budget Used',\n      accessor:'budget_cap_used',\n      Cell: ({ value }:any) => <MoneyFormatter value={value} />\n    },\n    {\n      Header: 'Budget Fill Rate',\n      accessor:'budget_fill_rate',\n      Cell: ({ value }:any) => <PercentFormatter value={value} />\n    },\n    {\n      Header: 'Sale Cap',\n      accessor:'sale_cap',\n      Cell: ({ value }:any) => value ? <NumberFormat value={value} displayType=\"text\" thousandSeparator /> : '-'\n    },\n    {\n      Header: 'Sale Used',\n      accessor:'sale_cap_used',\n      Cell: ({ value }:any) => value ? <NumberFormat value={value} displayType=\"text\" thousandSeparator /> : '-'\n    },\n    {\n      Header: 'Sale Fill Rate',\n      accessor:'sale_fill_rate',\n      Cell: ({ value }:any) => value ? <PercentFormatter value={value} /> : '-'\n    }\n  ], [])\n    return (\n        <div>\n          <FlexTable\n            columns={columns}\n            //initialState={initialTableState}\n            className=\"rule-cap-stats\"\n            data={stats}\n            noDataMessage=\"No cap usage recorded\"\n            loading={isLoading}\n          />\n        </div>\n    )\n}\n\ntype RulePathProps = {\n  rulePath: string;\n  onSelect: (rule_id: number) => void;\n  ruleId: number;\n};\n\nconst RulePathCell: React.FC<RulePathProps> = ({ rulePath, ruleId, onSelect }) => {\n  const segments = rulePath.split(' > ');\n\n  return (\n    <div>\n      {segments.length > 1 ? (\n        <>\n          {segments.slice(0, -1).join(' > ')}{' > '}\n          <Button color=\"link\" className=\"inline\" onClick={() => onSelect(ruleId)}>\n            {segments[segments.length - 1]}\n          </Button>\n        </>\n      ) : (\n        <button color=\"link\" className=\"inline\" onClick={() => onSelect(ruleId)}>\n          {rulePath}\n        </button>\n      )}\n    </div>\n  );\n};\n","import React, {useState, useEffect, useRef, useContext} from \"react\";\nimport useDateRangeValue from \"@thedmsgroup/mastodon-ui-components/lib/components/DateRangeSelect/useDateRangeValue\";\nimport {\n  Button,\n  Spinner\n} from \"reactstrap\";\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {faCommentsDollar, faCompress, faDollarSign, faFileInvoiceDollar} from \"@fortawesome/free-solid-svg-icons\";\nimport usePermission from '../../../Hooks/usePermission';\nimport useApi from '../../../Hooks/useApi';\nimport PageSection from \"../../../Layout/PageSection\";\nimport DeliveryRejectStat from \"../../Deliveries/DeliveryRejectStat\";\nimport {aggregateToMultiDataset} from \"../../../Components/Chart/chart\";\nimport {ReadServiceBucket} from \"../../../types\";\nimport {BlockUI} from 'ns-react-block-ui';\nimport {DateRangeSelect, DefaultDateRangeSelectOptions, StandardAlert, Tile} from \"@thedmsgroup/mastodon-ui-components\";\nimport {HideawayPanel} from \"../../../Layout/HideawayPanel\";\nimport ApplyOrRefreshButton from \"../../../Components/Table/ApplyOrRefreshButton\";\nimport useIntegrationNameLookup from \"../../../Hooks/useIntegrationNameLookup\";\nimport NumberFormat from \"react-number-format\";\nimport {AggSelect} from \"../../../Components/Chart/AggSelect\";\nimport {useChartInterval} from \"../../../Hooks/useChartInterval\";\nimport {CapStats} from \"./CapStats\";\nimport RulesContext from \"../../../Providers/RulesContext\";\nimport {RulesApi} from \"./types\";\nimport useLocalStorage from \"../../../Hooks/useLocalStorage\";\n\n//import {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\n\ntype OrderDashboardProps = {\n  orderId:number,\n  userTimezone:string,\n  onToggle?:(expanded:boolean) => void,\n  onSelectRule?:(ruleId:number|string) => void\n}\n\n/*\n * Section of Order/Rules Manager that shows order stats\n */\nconst OrderDashboard = ({ orderId, userTimezone, onToggle }:OrderDashboardProps) => {\n  const context = useContext(RulesContext)\n  const rulesApi = context.api as RulesApi\n  const {fetch: capsApi} = useApi(\"caps\", \"list\")\n\n  const allowViewAuctions = usePermission('auctions.view');\n  if (!allowViewAuctions) return ;\n  const [isLoadingAuctions, setIsLoadingAuctions] = useState(false);\n  const [isLoadingCaps, setIsLoadingCaps] = useState(false);\n  const [isLoadingDeliveries, setIsLoadingDeliveries] = useState(true);\n  const [deliveryData, setDeliveryData] = useState<any>({});\n  const [auctionData, setAuctionData] = useState<any>({});\n  const [capsData, setCapsData] = useState<any>([]);\n  const [capsDataError, setCapsDataError] = useState<string>('');\n  const {isLoaded: isIntegrationsLoaded, getIntegrationName} = useIntegrationNameLookup();\n  const {valueToISO} = useDateRangeValue();\n  const [filters, setFilters] = useState<Record<string, any>>({\n      start: 'now/d',\n      end: 'now/d',\n      agg_interval: 'auto',\n      agg_reject_category:'delivery_timeout',\n      agg_timezone: userTimezone\n    });\n  const [zoomReset, setZoomReset] = useState<Record<string,Date>|undefined>();\n  const [chartMinMaxTime, setChartMinMaxTime] = useState({min:\"\", max:\"\"})\n  const {intervalToApi, getIntervalLabel} = useChartInterval();\n  const [intervalLabel, setIntervalLabel] = useState('')\n  const realIntervalRef =  useRef<string>('auto');\n  const [isScaledInterval, setIsScaledInterval] = useState(false);\n  const [isCapsPanelOpen, setIsCapsPanelOpen] = useLocalStorage('order_manager_caps_expanded', false);\n\n  const apiDeliveries = useApi('debug', 'deliveriesList');\n  const apiAuctions = useApi('debug', 'auctionsList');\n\n\n  const MAX_CHART_BUCKETS = 120;\n  const NUM_CHART_BUCKETS = 15;\n\n\n  //Use query string?\n  // const [deliveryFilters, setDeliveryFilters] = useState(() => {\n  //   return {\n  //     start: searchParams.delivery_start ?? 'now/d',\n  //     end: searchParams.delivery_end ?? 'now/d',\n  //     agg_interval: '1m',\n  //     tz: \"America/Los_Angeles\"\n  //   }\n  // })\n\n\n  useEffect(() => {\n\n     if (isIntegrationsLoaded) {\n      loadDeliveries();\n      loadAuctionData();\n      loadCaps()\n     }\n  }, [filters, isIntegrationsLoaded]);\n\n  const paramsToReadService = () => {\n    const apiParams = {} as Record<string,any>;\n\n    if (filters.start) {\n      apiParams.after = valueToISO('start', filters.start, userTimezone)\n    }\n\n    if (filters.end) {\n      apiParams.before = valueToISO('end', filters.end, userTimezone)\n    }\n    apiParams.tz = \"America/Los_Angeles\"; //deliveryFilters.delivery_tz\n    apiParams.agg_interval = filters.agg_interval ?? 'auto';\n    apiParams.agg_buckets = NUM_CHART_BUCKETS;\n    if (filters.agg_reject_category) {\n      apiParams.agg_reject_category = filters.agg_reject_category;\n    }\n    return apiParams;\n  }\n\n  const loadCaps = async () => {\n    setIsLoadingCaps(true);\n    if (capsDataError) {\n      setCapsDataError('');\n    }\n    const result = await capsApi([orderId])\n\n    setIsLoadingCaps(false);\n    if (result) {\n      setCapsData(result)\n    } else {\n      setCapsDataError('Unable to get cap statistics');\n    }\n\n  }\n\n  const loadDeliveries = async () => {\n    setIsLoadingDeliveries(true);\n    const params = paramsToReadService();\n\n    // Interval adjustment\n    // The interval value in the filters is what the user selects\n    // This may be adjusted in order to scale the data to the chart\n    // In that case, the adjusted (\"real\") value is sent to the API, but the filter value remains what\n    // was selected, and a message about the scaling is shown.\n    const {interval, scaledInterval} = intervalToApi(params.agg_interval, filters.start, filters.end, MAX_CHART_BUCKETS)\n    params.agg_interval = scaledInterval || interval\n    realIntervalRef.current = params.agg_interval;\n\n    const result = await apiDeliveries.fetch({\n      ...params,\n      order_id: orderId,\n      page: 1,\n      per_page: 1, //don't need list, just aggregation detail (but setting to zero will result in default per_page in read service)\n    });\n\n    if (result && result.deliveries) {\n      const { aggregations } = result.deliveries;\n\n      const agg= {} as Record<string, any>;\n\n      if (aggregations.reject_categories) {\n        agg.rejectionCategoryTotals = aggregations.reject_categories.buckets;\n      }\n\n      if (aggregations.deliveries_over_time) {\n\n        agg.rejectionsOverTimeByIntegration = aggregateToMultiDataset(\n          aggregations.deliveries_over_time.buckets,\n          'key_as_string',\n          'key',\n          'doc_count',\n          'rejected.integrations.buckets',\n          getIntegrationName\n        );\n      }\n\n      if (aggregations.delivery_rejects_over_time) {\n        agg.rejectionsOverTimeByCategory = aggregateToMultiDataset(\n          aggregations.delivery_rejects_over_time.buckets,\n          'key_as_string',\n          'key',\n          'doc_count',\n          'reject_category.buckets'\n        );\n      }\n\n      if (aggregations.integrations_rejected) {\n        // buckets by rejection, each with integration counts\n        const rejections = {} as Record<string, any>;\n        aggregations.integrations_rejected.buckets.forEach((bkt:ReadServiceBucket) => {\n          rejections[bkt.key] = bkt.integrations.buckets.map((b:ReadServiceBucket) => {\n            return {integration:getIntegrationName(b.key.toString()), count:b.doc_count}\n          });\n\n        })\n        agg.integrationRejectionTotals = rejections;\n      }\n\n      //This label is used to show actual requested interval, below the graph\n      const label = getIntervalLabel(params.agg_interval);\n      setIntervalLabel(label);\n      setIsScaledInterval(Boolean(scaledInterval));\n\n      setChartMinMaxTime({min:params.after, max:params.before})\n\n      setDeliveryData(agg);\n\n    } else {\n      //@ts-ignore\n      //notify(`Unable to load delivery data: ${apiDeliveries.error?.name}`, 'error');\n    }\n\n    setIsLoadingDeliveries(false);\n  };\n\n  const loadAuctionData = async () => {\n    setIsLoadingAuctions(true);\n\n    const params = paramsToReadService();\n    delete params.agg_interval; //not charting\n    delete params.agg_buckets;\n\n    const result = await apiAuctions.fetch({\n      ...params,\n      order_id: orderId,\n      agg_interval: '1h',\n      version: 2, //the one with aggregations\n      page: 1,\n      per_page: 1, //don't need list, just aggregation detail (but setting to zero will result in default per_page in read service)\n      aggregations: [\"overall\"],\n    });\n\n    if (result?.auctions) {\n      setChartMinMaxTime({min:params.after, max:params.before})\n      setAuctionData(result.auctions.aggregations?.overall);\n    } else {\n      //@ts-ignore\n     // notify(`Unable to load auction data: ${apiDeliveries.error?.name}`, 'error');\n    }\n\n    setIsLoadingAuctions(false);\n  };\n\n  const handleSelectRuleCap = (ruleId:number|string) => {\n    rulesApi.setActiveTab('budget', {id: ruleId})\n  }\n\n  const handleChangeRejectCategory = (category:string) => {\n    setFilters({...filters, agg_reject_category:category});\n  }\n\n  const handleChangeInterval = (interval:string) => {\n    setFilters({...filters, agg_interval:interval});\n  }\n\n  const handleChartZoom = (start:Date, end:Date) => {\n\n    if (start && end) {\n      setZoomReset({start:filters.start,end:filters.end})\n      setFilters({...filters, start, end})\n    }\n  }\n\n  const resetChartZoom = () => {\n    if (zoomReset) {\n      setFilters({...filters, ...zoomReset})\n      setZoomReset(undefined)\n\n    }\n  }\n\n  return (\n    <PageSection\n      title=\"Order Stats\"\n      expanded={true}\n      expandable={true}\n      tools={\n        <DeliveryDetailFilters\n          onChange={setFilters}\n          onRefresh={loadDeliveries}\n          isLoading={isLoadingDeliveries}\n          filters={filters}\n        />\n      }\n      onToggle={onToggle}\n      storageKey=\"order_manager_dashboard_expanded\"\n      className=\"dashboard-section order-dashboard mb-3\"\n    >\n\n\n\n      <BlockUI\n        blocking={isLoadingAuctions}\n        mode=\"stretch\"\n        loader={<Spinner color=\"success\" />}\n      >\n\n        {auctionData && (\n          <div className=\"tile-grid mb-4\">\n\n            <Tile\n              content={<NumberFormat value={auctionData.num_auctions} displayType=\"text\" thousandSeparator />}\n              contentType=\"number\"\n              icon={<FaIcon icon={faCommentsDollar} size=\"5x\"/>}\n               horizontal\n               horizontalColor=\"info\"\n              title=\"Total Auctions\"\n            />\n\n            <Tile\n              content={<NumberFormat value={auctionData.num_matches} displayType=\"text\" thousandSeparator />}\n              contentType=\"number\"\n              horizontal\n              horizontalColor=\"danger\"\n              icon={<FaIcon icon={faCompress} size=\"5x\"/>}\n              title=\"Match Attempts\"\n            />\n\n            <Tile\n              content={<NumberFormat value={auctionData.num_bids} displayType=\"text\" thousandSeparator />}\n              contentType=\"number\"\n              horizontal\n              horizontalColor=\"primary\"\n              icon={<FaIcon icon=\"comment-dollar\" size=\"5x\"/>}\n              title=\"Bid Attempts\"\n            />\n\n            <Tile\n              content={<NumberFormat value={auctionData.num_vendor_accepted} displayType=\"text\" thousandSeparator />}\n              contentType=\"number\"\n              horizontal\n              horizontalColor=\"warning\"\n              icon={<FaIcon icon=\"id-card\" size=\"5x\"/>}\n              title=\"Leads Posted\"\n            />\n\n            <Tile\n              content={<NumberFormat value={auctionData.num_sales} displayType=\"text\" thousandSeparator />}\n              contentType=\"number\"\n              horizontal\n              horizontalColor=\"info\"\n              icon={<FaIcon icon={faFileInvoiceDollar} size=\"5x\"/>}\n              title=\"Sale Count\"\n            />\n            <Tile\n              content={<NumberFormat value={auctionData.num_sales / auctionData.num_vendor_accepted * 100} suffix={\"%\"} displayType=\"text\" thousandSeparator decimalScale={2} fixedDecimalScale />}\n              contentType=\"number\"\n              horizontal\n              horizontalColor=\"info\"\n              icon={<FaIcon icon={faFileInvoiceDollar} size=\"5x\"/>}\n              title=\"Sale Rate\"\n            />\n\n            <Tile\n              content={<NumberFormat value={auctionData.sum_account_bid} displayType=\"text\" prefix=\"$\" thousandSeparator decimalScale={0} fixedDecimalScale />}\n              contentType=\"number\"\n              horizontal\n              horizontalColor=\"success\"\n              icon={<FaIcon icon={faDollarSign} size=\"5x\"/>}\n              title=\"Advertiser Cost\"\n            />\n\n          </div>\n        )}\n      </BlockUI>\n\n\n          <div className=\"form-section p-0 m-0\">\n            <HideawayPanel\n              label={\"Budgets & Caps\"}\n              headerClassName={\"form-section-header\"}\n              isOpen={isCapsPanelOpen}\n              onToggle={setIsCapsPanelOpen}\n            >\n              {isLoadingCaps ? (\n                <Spinner color=\"success\" size=\"sm\" className=\"my-1\" />\n              ) : (\n                <>\n                  {capsDataError ?\n                    (\n                      <StandardAlert color=\"danger\" className=\"my-2\">{capsDataError} <Button className=\"inline\" color=\"link\" onClick={()=>loadCaps()}>Retry</Button> </StandardAlert>\n                    )\n                    :(\n                      <CapStats stats={capsData} onSelectRule={handleSelectRuleCap} />\n                    )\n                  }\n\n                </>\n\n              )}\n            </HideawayPanel>\n\n          </div>\n\n\n\n        <div className=\"form-section p-0 m-0\">\n          <div className=\"d-flex justify-content-between\">\n            <div className=\"form-section-header\">Delivery Rejections</div>\n            <div className=\"d-flex align-items-start\">\n              {zoomReset && <Button\n                size=\"sm\" onClick={resetChartZoom} color=\"light\" outline className=\"me-2\" disabled={isLoadingAuctions}>Reset Zoom</Button> }\n              <AggSelect\n                value={filters.agg_interval}\n                onChange={handleChangeInterval}\n                scaledTo={isScaledInterval ? intervalLabel : undefined}\n                loading={isLoadingAuctions}\n              />\n            </div>\n\n          </div>\n\n          <DeliveryRejectStat\n            rejectCategory={filters.agg_reject_category ?? 'delivery_timeout'}\n            onChangeRejectCategory={handleChangeRejectCategory}\n            data={deliveryData}\n            isLoading={isLoadingAuctions || isLoadingDeliveries}\n            className=\"mb-2\"\n            aggInterval={realIntervalRef.current}\n            intervalLabel={intervalLabel}\n            chartMinTime={chartMinMaxTime.min}\n            chartMaxTime={chartMinMaxTime.max}\n            onZoom={handleChartZoom}\n          />\n        </div>\n\n    </PageSection>\n  );\n};\n\n\nexport default OrderDashboard;\n\n\ntype DeliveryDetailFiltersProps = {\n  filters:Record<string,any>;\n  defaultTimezone?:string;\n  onChange:any;\n  onRefresh:any;\n  //reset:any;\n  isLoading: boolean;\n}\n\nconst DeliveryDetailFilters = ({\n                                 filters,\n                                 defaultTimezone=\"\",\n                                 onChange,\n                                 onRefresh,\n                                 isLoading,\n                                 /* reset*/\n                               }: DeliveryDetailFiltersProps) => {\n  const [pendingFilters, setPendingFilters] = useState(filters)\n  const [isPendingApply, setIsPendingApply] = useState(false)\n\n\n  const handleApply = () => {\n    setIsPendingApply(false);\n    onChange(pendingFilters)\n  }\n\n/*  const handleIntervalChange = (e:ChangeEvent<HTMLInputElement>) => {\n\n    const newFilters = { ...pendingFilters, agg_interval:e.target.value}\n\n    setIsPendingApply(true);\n    setPendingFilters(newFilters)\n  };*/\n\n  const handleDateRangeChange = (start:Date, end:Date, isQuickPick=false) => {\n    const newFilters = {...pendingFilters, start, end}\n    if (isQuickPick) {\n      onChange(newFilters)\n      setIsPendingApply(false);\n    } else {\n      setIsPendingApply(true);\n      setPendingFilters(newFilters)\n    }\n  };\n\n  const reset = () => {\n    setIsPendingApply(false);\n    onChange(null);\n  };\n\n  return (\n    <div className=\"d-flex justify-content-end flex-grow-1 align-items-center\">\n\n\n      <div style={{minWidth:'500px'}}>\n        <DateRangeSelect\n          start={filters.start}\n          end={filters.end}\n          defaultTimezone={defaultTimezone}\n          options={DefaultDateRangeSelectOptions}\n          className=\"flex-fill me-2\"\n          onChangeRange={handleDateRangeChange}\n          disabled={isLoading}\n          /*onChangeTimezone={handleTimezoneChange}*/\n          /* autoRefresh={autoRefresh}*/\n          /*onChangeAutoRefresh={onChangeAutoRefresh}*/\n        />\n      </div>\n\n      <div className=\"d-flex flex-wrap flex-shrink-0\">\n\n        <ApplyOrRefreshButton\n          isLoading={isLoading}\n          pendingApply={isPendingApply}\n          onApply={handleApply}\n          onRefresh={onRefresh}\n        />\n\n        <Button color=\"link\" className=\"px-1 py-0\" title=\"Clear filters\" onClick={reset} disabled={isLoading}>\n          <span className=\"fa-layers fa-fw\">\n            <FaIcon icon=\"filter\" size=\"lg\" />\n            <FaIcon icon=\"circle\" inverse size=\"sm\" transform=\"right-7 up-2\" />\n            <FaIcon icon=\"ban\" size=\"sm\" color=\"red\" transform=\"right-7 up-2\" />\n          </span>\n        </Button>\n\n      </div>\n    </div>\n  )\n}\n","import React, {\n  useState, useContext, useEffect, useCallback, useRef,\n} from \"react\";\nimport { Row, Col } from 'reactstrap';\nimport {useParams, useSearchParams, useLocation} from \"react-router-dom\";\nimport confirm from 'reactstrap-confirm';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport RulesContext from '../../../Providers/RulesContext';\nimport RuleTree from './RuleTree';\nimport TreeRule from './TreeRule';\nimport { TreeProvider } from '../../../Components/Rules/TreeProvider';\nimport RulesConfig from './RulesConfig';\nimport DocTitle from '../../../Layout/DocTitle';\nimport Breadcrumbs from '../../../Layout/Breadcrumbs';\nimport usePermission from '../../../Hooks/usePermission';\nimport useRuleTree from '../../../Hooks/useRuleTree';\nimport RuleSkeleton from './RuleSkeleton';\nimport OrderInfoBar from './OrderInfoBar';\nimport { AppContext } from '../../../Providers/AppProvider';\nimport OrderDashboard from \"./OrderDashboard\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\nimport '../../../Components/Rules/styles.scss';\nimport './styles.scss';\n\n\n\nconst NEW_RULE = {\n  id: 0,\n  isNew: true,\n  label: 'New Rule',\n  ads: [],\n  bidding: {\n    type: 'pass',\n    absolute_bid: 1,\n    bid_modifier: 100,\n  },\n  budgets: {},\n  caps: {},\n  channel_modifiers: [],\n  click_urls: [],\n  datasheets: [],\n  delivery_destinations: [],\n  call_started_webhooks: [],\n  call_ended_webhooks: [],\n  pre_transfer_integrations: [],\n  destination_sip: {},\n  exclusive: false,\n  enrichment_addons: [],\n  impression_urls: [],\n  match_conditions: [[]],\n  override_parent_ads: false,\n  override_parent_channel_modifiers: false,\n  parent_id: 0,\n  proxy_bidding: [],\n  redirect_url: '',\n  redirect_url_template: '',\n  rules: [],\n  schedule: [],\n  schedule_type: 'inactive',\n  schedule_modifiers: {},\n  schedule_caps: {},\n  schedule_affects_siblings: false,\n  tags: [],\n  internal_data: '',\n};\n\nconst RulesManager = () => {\n  const app = useContext(AppContext)\n  const {orderId} = useParams()\n  const location = useLocation()\n  //Use a ref for back-link value because we write to URL history in this component and might lose  previous state\n  const accountsSearch = useRef(location.state?.search ?? '')\n\n  const [searchParams, setSearchParams] = useSearchParams()\n  const gotoRuleId = searchParams.get('rule')\n  const allowAdvanced = usePermission('rules_advanced.edit')\n  const allowViewAuctions = usePermission('auctions.view')\n  const allowEdit = usePermission('orders.edit')\n  const [order, setOrder] = useState(null)\n  // parentFilters update when order loads; hook's deep-comparison effect keeps drawerConfig in sync\n  const { openChanges } = useChangeTimeline({\n    entityTypes: ['order', 'targetrule'],\n    parentFilters: order ? { orders: [order.id.toString()], accounts: [order.account.id.toString()] } : {},\n  });\n  const {\n    tree,\n    refreshKey,\n    selectedRule,\n    setTree,\n    getRule,\n    deleteRule,\n    addTempRule,\n    swapRule,\n    selectRule,\n    updateRuleTree,\n    getPrecedingRule,\n    getDisabledAncestor,\n    findPropAncestors,\n  } = useRuleTree(null, null, NEW_RULE)\n  const [linkedData, setLinkedData] = useState({})\n  const [actionsOpen, setActionsOpen] = useState(false)\n  const [activeTab, setActiveTab] = useState(searchParams.get('tab') || 'summary' )\n  const [isDirty, setIsDirty] = useState(false)\n  const [isUpdating, setIsUpdating] = useState(false)\n  const [isLoading, setIsLoading] = useState(false)\n  const [isLoadingTree, setIsLoadingTree] = useState(false)\n  const [ready, setReady] = useState(false)\n\n\n  // URL change: order pickers outside of this component may change the URL\n  // Go back to not-ready mode\n  useEffect(() => {\n    if (ready) setReady(false)\n    loadOrder()\n  }, [orderId])\n\n\n\n  useEffect(() => {\n    if (selectedRule && !selectedRule.isNew) {\n      updateQueryString()\n    }\n  }, [selectedRule, activeTab])\n\n\n  const copyRule = async (rule, label = '') => {\n    const copy = {\n      parent_id: rule.parent_id,\n      label: label || `${rule.label} (Copy)`,\n      copy_from_id: rule.id,\n      // Api sets priority one higher than source rule\n    }\n    app.showLoader('rulesConfig', 'Copying Rule...')\n\n    const result = await app.api.endpoints.rules.create(copy)\n\n    app.showLoader(false)\n\n    if (!result) {\n      notify(`Unable to copy rule: ${app.api.error.name}`, 'error')\n    } else {\n      notify('The rule has been copied', 'success')\n      //TODO need to set the new rule as the one selected\n      loadRulesTree()\n      handleSelectRule(result)\n    }\n  }\n\n  const moveRule = async (rule, targetRule, placement = 'below') => {\n    app.showLoader('rulesConfig', 'Moving Rule...')\n\n    // console.log('index.js:MoveRule:', `Moving ${rule.id} [pr ${rule.priority}, parent ${rule.parent_id}] ${placement}  ${targetRule.id} [pr ${targetRule.priority}, parent ${targetRule.parent_id}]`);\n\n    let maxPriority = 0\n    const parentRule = getRule(rule.parent_id)\n    if (parentRule && parentRule.rules.length) {\n      parentRule.rules.map((r) => {\n        if (r.priority > maxPriority) maxPriority = r.priority\n      });\n    }\n\n    const movingRule = { id: rule.id, label: rule.label }\n\n    if (placement === 'below') {\n      movingRule.priority = targetRule.priority + 1;\n      movingRule.parent_id = targetRule.parent_id\n    } else if (placement === 'above') {\n      if (maxPriority && targetRule.priority === maxPriority) {\n        movingRule.priority = maxPriority - 1\n      } else {\n        movingRule.priority = targetRule.priority\n      }\n      movingRule.parent_id = targetRule.parent_id\n    } else if (placement === 'child') {\n      movingRule.priority = 0\n      movingRule.parent_id = targetRule.id\n    }\n\n    const result = await app.api.endpoints.rules.update(movingRule);\n    app.showLoader(false);\n\n    if (result) {\n      loadRulesTree(tree.id);\n      loadRule(rule.id)\n    }\n  }\n\n  // called from useEffect after selectRule or tab\n  const updateQueryString = () => {\n\n    setSearchParams({ ...searchParams, tab: activeTab, rule: selectedRule.id }, {replace:true});\n  }\n\n  const dirtyRuleConfirm = async () => await confirm({\n    title: 'Unsaved Rule',\n    message: 'The current rule has unsaved changes',\n    confirmText: 'Continue editing',\n    cancelText: 'Discard changes',\n  })\n\n  const leaveNewRuleConfirm = async () => await confirm({\n    title: 'Unsaved New Rule',\n    message: 'Please save or cancel the current new rule',\n    confirmText: 'Continue editing',\n    cancelText: 'Discard new rule',\n  })\n\n  const loadOrder = async () => {\n    const order = await app.api.endpoints.orders.show(orderId)\n\n    const groupBy = key => array =>\n      array.reduce((objectsByKeyValue, obj) => {\n        const value = obj[key]\n        objectsByKeyValue[value] = (objectsByKeyValue[value] || []).concat(obj)\n        return objectsByKeyValue\n      }, {});\n\n    if (order === false) {\n      notify(`Unable to load order: ${app.api.error.name}`, 'error')\n    } else {\n      setOrder(order)\n      let accountAds; let channels; const attributes = {}; let attributeGroups; let tokens; let integrations; let\n        datasheets\n      // Get account peripheral data used by rules\n      // (note: integrations data comes paged so we use a high limit to get all\n      const batchResult = await app.api.batchGet([\n        { endpoint: 'ads', action: 'list', params: { account_id: order.account.id } },\n        { endpoint: 'channels', action: 'list', params: { options:true, account_id: order.account.id, vertical_id: order.vertical.id, product: order.product } },\n        { endpoint: 'attributes', action: 'list', params: { options: true, vertical_id: order.vertical.id, product: order.product } },\n        { endpoint: 'tokens', action: 'list', params: { vertical_id: order.vertical.id, product: order.product } },\n        { endpoint: 'integrations', action: 'list', params: { limit:1000,vertical_id: order.vertical.id, product: order.product, account_id: order.account.id } },\n        { endpoint: 'datasheets', action: 'list', params: { account_id: order.account.id } },\n      ])\n\n      if (Array.isArray(batchResult)) {\n        [accountAds, channels, attributeGroups, tokens, integrations, datasheets] = batchResult\n\n        // Ungroup the attributeGroup data and store in attributes\n        Object.entries(attributeGroups).map((attrGroup) => {\n          const groupName = attrGroup[0]\n          return attrGroup[1].map((attr) => attributes[attr.alias] = { ...attr, groupName })\n        })\n\n        if (integrations.data) { // this is BC handling during api transition // todo remove after transition\n          // Filter out integrations with null versions, won't save\n          integrations.data = integrations.data.filter(int => Boolean(int.current_version))\n          integrations = groupBy('type')(integrations.data)\n        }\n      }\n\n      setLinkedData({\n        order, accountAds, channels, attributes, tokens, attributeGroups, integrations, datasheets,\n      });\n\n      loadRulesTree(order.rule_id)\n      const rule = await loadRule(gotoRuleId || order.rule_id)\n      if (rule) {\n        setReady(true)\n      }\n\n\n    }\n  };\n\n\n  const loadRule = async (ruleId) => {\n    setIsLoading(true)\n\n    const rule = await app.api.endpoints.rules.show(ruleId, {v2:1})\n\n    if (rule === false) {\n      notify(`Unable to load rule: ${app.api.error.name}`, 'error')\n    } else {\n      selectRule(rule, true)\n    }\n\n    setIsLoading(false)\n\n    return rule\n  };\n\n  // Loads the rule tree by loading the account's rule (the order's \"parent\" rule)l\n  // Called after loading order (on mount), and after save, disable, move\n  const loadRulesTree = async (rootRuleId) => {\n    if (!rootRuleId && tree) {\n      rootRuleId = tree.id\n    }\n    setIsLoadingTree(true)\n    const ruleTree = await app.api.endpoints.rules.tree(rootRuleId )\n\n    if (ruleTree === false) {\n      notify(`Unable to load rules: ${app.api.error.name}`, 'error')\n    } else {\n      setTree(ruleTree)\n    }\n\n    setIsLoadingTree(false)\n  };\n\n  const getIntegrationDefinitionsByType = (type) => {\n    if (linkedData.integrations) {\n      return linkedData.integrations[type] || []\n    }\n    return [];\n  }\n\n  // after updating or creating an account datasheet\n  const refreshAccountDatasheetList = async () => {\n    const datasheets = await app.api.endpoints.datasheets.list({ account_id: linkedData.order.account.id })\n    if (datasheets) {\n      setLinkedData((prev) => ({ ...prev, datasheets }))\n    } else {\n      console.log('Unable to refresh account datasheet list')\n    }\n  }\n\n  const toggleActionsPane = () => setActionsOpen(!actionsOpen)\n\n  // Tabs can be selected from inside RulesConfig (where the tabs are)\n  // or from the rules tree (by clicking on icons).\n  // In the tree you can effectively select a tab and a rule at the same time,\n  // which is why we have the rule argument.\n  //\n  // Use a callback because it is passed to all tabs (keeps single reference to function)\n  const handleSetActiveTab = useCallback((tab, rule) => {\n    setActiveTab(tab);\n    if (rule && rule.id !== selectedRule?.id) {\n      handleSelectRule(rule)\n    }\n  }, [selectedRule, isLoading])\n\n  // Create a temporary rule to work on\n  const addRule = (targetRule, placement) => addTempRule(targetRule, placement, { ...NEW_RULE })\n\n  const disableRule = async (rule, isDisabled) => {\n    const targetRule = { id: rule.id, label: rule.label, disabled: !!isDisabled }\n\n    const result = await app.api.endpoints.rules.update(targetRule)\n\n    if (result) {\n      notify(`The rule has been ${isDisabled ? 'disabled' : 'enabled'}`, 'success')\n      loadRulesTree(tree.id)\n      selectRule(result, true)\n    }\n  }\n\n  const handleDeleteRule = async (rule) => {\n    app.showLoader('rulesConfig', 'Deleting Rule...')\n\n    const result = await app.api.endpoints.rules.delete(rule.id)\n    app.showLoader(false)\n    if (!result) {\n      notify(`Unable to delete rule: ${app.api.error.name}`, 'error')\n    } else {\n      notify('The rule has been deleted', 'success');\n\n      const fallbackRule = getPrecedingRule(rule)\n      handleSelectRule(fallbackRule)\n      loadRulesTree()\n\n    }\n  }\n\n  // Used for a few targeted async updates where we just want to update a specific prop\n  // Bid value edited in the tree, or edit rule name.\n  const updateRule = async (data, rule, reset = false) => {\n    // just the data and required fields\n    const { id, parent_id, label } = rule || selectedRule\n    const updatedRule = {\n      id, parent_id, label, ...data,\n    }\n    const result = await app.api.endpoints.rules.update(updatedRule)\n\n    if (result) {\n      updateRuleTree(result);\n      if (reset && selectedRule.id === rule.id) {\n        loadRule(rule.id)\n      }\n    } else {\n      notify(`Unable to update rule: ${app.api.error.name}`, 'error')\n    }\n    return result;\n  }\n\n  const saveRule = async (saveRule, isNew) => {\n    setIsUpdating(true)\n    let result\n    if (isNew) {\n      result = await app.api.endpoints.rules.create(saveRule);\n      if (result) {\n        swapRule(result, saveRule)\n      }\n    } else {\n      result = await app.api.endpoints.rules.update(saveRule);\n      if (result) {\n        updateRuleTree(result)\n        selectRule(result, true)\n      }\n    }\n\n    setIsUpdating(false);\n    if (!result) {\n      notify(`Unable to save rule: ${app.api.error.name}`, 'error')\n    } else {\n      selectRule(result, true);\n      loadRulesTree()\n      notify('The rule has been saved', 'success')\n    }\n\n  }\n\n\n  const handleCancel = () => {\n    let rule\n    if (selectedRule.isNew) {\n      //remove the temporary new rule in the tree, select prev sibling or parent\n      rule = getPrecedingRule(selectedRule)\n      deleteRule(selectedRule)\n\n    } else {\n      //reload current\n      rule = selectedRule\n    }\n\n    loadRule(rule.id)\n  }\n\n  const handleSelectRule = async (rule, refresh) => {\n    if (isLoading) return\n    //TODO: Consider changing this function to only accept ID\n    if (typeof rule === 'number' || typeof rule === 'string') {\n      rule = {id:rule}\n    }\n    if (rule ) {\n      if (rule.id !== selectedRule?.id){\n        if (isDirty) {\n          // confirm leaving a dirty rule\n          const stay = await dirtyRuleConfirm()\n          if (stay) return\n        } else if (selectedRule?.isNew) {\n          // confirm leaving a new unsaved rule\n          const stay = await leaveNewRuleConfirm();\n          if (stay) return\n          // discard the new rule and go to previous\n          deleteRule(selectedRule)\n          const previous = getPrecedingRule(selectRule)\n          loadRule(previous.id)\n          return\n        }\n      } else if (!refresh) {\n        //already selected\n        return\n      }\n\n    } else {\n      //if no rule provided, select previous\n      rule = getPrecedingRule(selectedRule)\n    }\n\n    if (rule) {\n      loadRule(rule.id)\n    }\n\n  }\n\n  // Kludge to get tree height to reset itself\n  // Tree watches scroll and resize to set its height, but closing the order stats panel\n  // does not trigger these events so we force it.\n  // Other (less performant) solutions might be using a ResizeObserver or requestAnimationFrame\n  const handleToggleSection = (expanded) => {\n    if(!expanded) {\n      window.scrollTo({top:window.scrollY + 1})\n    }\n  }\n\n  const viewRuleChanges = () => {\n    if (selectedRule) {\n      openChanges({ id: selectedRule.id, name: selectedRule.label, type: 'targetrule' });\n    }\n  }\n\n  const rulesAPI = {\n    selectedRule,\n    getRule,\n    deleteRule: handleDeleteRule,\n    addTempRule,\n    addRule,\n    updateRule,\n    saveRule,\n    copyRule,\n    moveRule,\n    setSelected: handleSelectRule,\n    setActiveTab: handleSetActiveTab,\n    setIsDirty,\n    refreshRules: loadRulesTree, // used by bulk add\n    updateRuleTree,\n    refreshAccountDatasheetList,\n    toggleActionsPane,\n    disableRule,\n    viewRuleChanges,\n    getDisabledAncestor,\n    findPropAncestors,\n    getIntegrationDefinitionsByType,\n  }\n\n  return (\n    <div id=\"target-rule-manager\">\n\n      <DocTitle pageTitle={`${linkedData?.order?.name} - Target Rules`} />\n\n      <RulesContext.Provider value={{\n        tree,\n        selectedRule,\n        verticalId: linkedData.order ? linkedData.order.vertical.id : 0,\n        product: linkedData.order ? linkedData.order.product : '',\n        attributes: linkedData.attributes,\n        attributeGroups: linkedData.attributeGroups,\n        api: rulesAPI,\n        allowEdit\n      }}\n      >\n\n        {ready && linkedData.order && (\n          <>\n            <Row>\n              <Col sm={12}>\n\n                <Breadcrumbs crumbs={[\n                  {label: 'Accounts', to: {pathname: '/accounts', search: accountsSearch.current}},\n                  {\n                    label: linkedData.order.account.name,\n                    to: {pathname: `/accounts/${linkedData.order.account.id}/settings`, search: 'tab=details'},\n                    state: {search: accountsSearch.current},\n                  },\n                  {label: 'Edit Order'},\n                ]} />\n\n                <OrderInfoBar order={linkedData.order} userTimezone={app.user.timezone} />\n\n              </Col>\n\n            </Row>\n\n            {allowViewAuctions && (\n              <OrderDashboard\n                orderId={linkedData.order.id}\n                userTimezone={app.user.timezone}\n                onToggle={handleToggleSection}\n              />)}\n          </>\n\n        )}\n\n\n        <div className=\"d-flex flex-nowrap\" key={`order-${orderId}`}>\n\n          {/* TODO: selectedRuleAncestors (used in TreeBranch for isAncestorBranch) */}\n          <TreeProvider rule={tree} product={linkedData?.order?.product} defaultExpandLevel={1}>\n\n              <RuleTree\n                rule={tree}\n                selectedRule={selectedRule}\n                ancestors={[]}\n                ruleComponent={TreeRule}\n                isLoading={isLoadingTree || !ready}\n              />\n\n\n          </TreeProvider>\n\n          {/* ID for routine that checks if form is in viewport */}\n          <div className=\"col-rule-config flex-grow-1 d-flex flex-column\" id=\"col-rule-config\">\n\n\n\n            {/* The ref allows the sibling Tree to call activeTab method in RulesConfig */}\n            {!ready ? (\n              <RuleSkeleton />\n            ) : (\n              <RulesConfig\n                rule={selectedRule}\n                activeTab={activeTab}\n                onSelectTab={handleSetActiveTab}\n                onCancel={handleCancel}\n                isRoot={selectedRule ? selectedRule.id === order.rule_id : false}\n                order={linkedData.order}\n                accountAds={linkedData.accountAds}\n                channels={linkedData.channels}\n                datasheets={linkedData.datasheets}\n                tokens={linkedData.tokens}\n                treeOpen\n                actionsOpen={actionsOpen}\n                isDirty={isDirty}\n                //TODO: separate props for these states?\n                isUpdating={isUpdating || isLoading}\n                allowAdvanced={allowAdvanced}\n                key={orderId + (selectedRule?.id ?? 0) + refreshKey}\n              />\n            )}\n\n\n          </div>\n        </div>\n      </RulesContext.Provider>\n\n    </div>\n\n  );\n};\n\nexport default RulesManager;\n","import React from 'react';\nimport { Routes, Route } from 'react-router-dom';\nimport { Navigate } from 'react-router-dom';\nimport OrderList from './OrderList';\nimport AccountSettings from './Account/Settings';\nimport RulesManager from './RulesManager';\nimport NotAuthorized from '../../Layout/NotAuthorized';\nimport usePermission from '../../Hooks/usePermission';\nimport ProtectedRoute from '../../Components/ProtectedRoute';\nimport './styles.scss';\nimport NotFoundPage from '../../Layout/NotFoundPage'\n\n/*\n * Entry point to all advertiser routes\n */\nconst AdvertiserManager = () => {\n\n  const allowAccountsView = usePermission('accounts.view');\n  const allowChannelsView = usePermission('channels.view');\n  const allowPublishersView = false; //hide MRK-10881  app.vendor_id !== null;\n\n  if (!allowAccountsView) {\n    if (allowChannelsView) {\n      return <Navigate to=\"/publishing/channels\" />;\n    }\n\n    if (allowPublishersView) {\n      return <Navigate to=\"/dashboard/publishers\" />;\n    }\n\n    // permissions gave them nothing to view?\n    return <Routes><Route element={NotAuthorized} /></Routes>;\n  }\n\n\n  // Paths relative to /accounts\n  return (\n    <Routes>\n      <Route index element={<OrderList />} />\n\n      <Route path=\"/:accountId/order/:orderId/rules\" element={<RulesManager />} />\n\n      <Route path=\"/:accountId/settings\" element={<AccountSettings />} />\n\n      <Route path=\"create\" element={<ProtectedRoute permission=\"accounts.create\" /> } >\n        <Route index element={<AccountSettings />} />\n      </Route>\n\n      <Route path=\"*\" element={<NotFoundPage />} />\n\n    </Routes>\n  );\n};\n\nexport default AdvertiserManager;\n","import React, {\n  useState, useCallback, useMemo,\n} from 'react';\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask';\nimport MaskedInput from 'react-text-mask';\nimport EnhancedSelect from \"../../../../Components/Form/EnhancedSelect\";\n// import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport PropTypes from 'prop-types';\nimport { Button, Spinner } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Link } from 'react-router-dom';\nimport IconCheckbox from '../../../../Components/Form/IconCheckbox';\nimport InputWithIcon from '../../../../Components/Form/InputWithIcon';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {Modal as RoutingRulesModal} from '../../../Routing/Rules';\nimport {HelpPopper}  from '@thedmsgroup/mastodon-ui-components';\nimport useFormState from '../../../../Hooks/useFormState';\nimport useApi from '../../../../Hooks/useApi';\nimport usePermission from '../../../../Hooks/usePermission';\nimport {ChannelSourceRoute} from \"../../../Routing/Rules\";\nimport StatusToggler from \"../../../../Components/Form/StatusToggler\";\nimport {SourceOptionLabel} from \"../../../../Components/Form/Select/SourceOptionLabel\";\nimport EntityId from \"../../../../Components/Table/EntityId\";\n\n// We decided to allow distribution to be nullable\n// import * as Yup from \"yup\";\n// const ChannelSourceValidation = (\n//   Yup.addMethod(Yup.mixed, 'validChannelSources', function(message) {\n//     return this.test('test-channel-sources', message,\n//       function(channelSources) {\n//         let valid = true;\n//         channelSources.map( (item) => {\n//           //console.log('ChannelSourceDetail.js:testing', item, parseInt(item.distribution));\n//           if( isNaN(parseInt(item.distribution))){\n//             valid = false;\n//           }\n//         });\n//\n//         return valid;\n//       })\n//   })\n// );\n//\n// const ChannelSourceValidationSchema = Yup.object().shape({\n//   sources: Yup.mixed().validChannelSources('Please check that all dates are filled out, and from/to dates are in the right order'),\n// });\n\nconst percentMask = createNumberMask({\n  prefix: '',\n  allowDecimal: false,\n  integerLimit: 3,\n});\n\n\nconst DefaultChannelSource = {\n  id:0,\n  name:\"\",\n  status: \"\",\n  eligibility: {\n    distribution:\"\",\n    fixed_distribution:false,\n    status: \"active\"\n  }\n\n}\nconst   ChannelSourceDetail = ({ channel, sources = [], allSources, onCancel, refreshChannels, allowEdit = true }) => {\n\n  // options without current selections\n  const [selectedChannelSource, setSelectedChannelSource] = useState(null);\n  const [rulesModalOpen, setRulesModalOpen] = useState(false);\n  const allowViewRules = usePermission('routing.view');\n  const [addIndex, setAddIndex] = useState(sources.length ? null : 0);\n\n  const sortDistributionDesc = (items) => items.sort((a, b) => (parseInt(a.distribution) < parseInt(b.distribution) ? 1 : -1));\n\n  const {\n    formApi, formIsValid, formValues,\n  } = useFormState(\n    {\n      sources: sources.length ? sortDistributionDesc([...sources])\n                : [{...DefaultChannelSource}],\n    },\n  );\n;\n  const [loading, setLoading] = useState(false);\n  const { api } = useApi();\n\n  const sourceOptions = useMemo(() => {\n\n    return allSources.reduce((acc, src) => {\n        // Filter all source select options by product/vertical of the channel.\n        // Filter out those already selected.\n        if (\n          (src.vertical.id === channel.vertical.id && src.product === channel.product)\n          && (!formValues.sources.some(s => s.id === src.id))\n        ) {\n          acc.push({\n            value: src.id,\n            label: src.name,\n            status: src.status,\n            id: src.id,\n            name: src.name\n          });\n        }\n\n        return acc;\n      }, [])\n    },\n    [formValues.sources]\n  );\n\n  const handleChangeDistribution = useCallback((val, index) => {\n    const sources = [...formValues.sources];\n\n    if (sources[index]) {\n      sources[index].eligibility.distribution = val;\n      formApi.setValues({ sources });\n    }\n  }, [formValues]);\n\n  const handleChangeFixed = useCallback((fixed, index) => {\n    const sources = [...formValues.sources];\n    if (sources[index]) {\n      sources[index].eligibility.fixed_distribution = fixed;\n\n      formApi.setValues({ sources });\n    }\n  }, [formValues]);\n\n  const handleChangeEligibilityStatus = useCallback((status, index) => {\n    const sources = [...formValues.sources];\n    if (sources[index]) {\n      sources[index].eligibility.status = status;\n\n      formApi.setValues({ sources });\n    }\n  }, [formValues]);\n\n  const handleChangeSource = useCallback((source, index) => {\n    const sources = [...formValues.sources];\n    if (sources[index]) {\n      sources[index] = source;\n      formApi.setValues({ sources });\n    }\n  }, [formValues]);\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      save();\n    }\n  };\n\n  const save = async () => {\n    setLoading(true);\n\n    const chn = { ...channel };\n    const sources = removeEmptySources(formValues.sources);\n\n    chn.sources = sources.map((row) =>\n      ({\n        source_id: row.id,\n        channel_id: channel.id,\n        ...row.eligibility\n      }));\n\n    const result = await api.endpoints.channels.update(chn);\n    setLoading(false);\n\n    if (result) {\n      notify('The channel sources were saved', 'success', );\n      formApi.setValues({ sources: result.sources });\n      setAddIndex(null);\n      refreshChannels();\n    } else {\n      console.log('ChannelSourceDetail.js:error saving channel', api.error.name);\n      notify(`Unable to save channel-source: ${api.error.name}`, 'error', { containerId: `channel-source-${channel.id}` });\n    }\n  };\n\n  // close the subrow\n  const handleCancel = () => {\n    formApi.setValues([...sources])\n    setAddIndex(null);\n    onCancel();\n  };\n\n\n  const handleAddNew = () => {\n    let newSources = removeEmptySources(formValues.sources);\n    newSources.push({...DefaultChannelSource})\n    setAddIndex(newSources.length - 1);\n    formApi.setValue(\"sources\", newSources);\n  }\n\n  //We're just removing rows without selected sources instead of bothering with validation\n  const removeEmptySources = (arr) =>  arr.filter(src => src.id)\n\n\n  const handleRemove = (index) => {\n    let sources = [...formValues.sources];\n    sources.splice(index, 1);\n    sources = removeEmptySources(sources);\n    formApi.setValues({ sources });\n    setAddIndex(null);\n\n  };\n\n  const handleOpenRules = (index) => {\n    const source = formValues.sources[index];\n\n    if (source) {\n      if (source.eligibility.rule_id) {\n        setSelectedChannelSource(new ChannelSourceRoute(channel, source));\n        setRulesModalOpen(true);\n      } else {\n        notify('Please save before editing rules', 'info', { containerId: `channel-source-${channel.id}` });\n      }\n    }\n  };\n\n  const handleCloseRulesModal = () => {\n    setRulesModalOpen(false);\n    setSelectedChannelSource(null);\n  };\n\n  return (\n    <div className=\"form-section channel-source-detail position-relative\">\n\n\n      <div className=\"form-section-header\">Channel Sources</div>\n\n      {formValues.sources.length === 0\n      && <StandardAlert color=\"light\">No sources are assigned.</StandardAlert>}\n\n      {formIsValid === false\n      && (\n      <StandardAlert color=\"warning\" className=\"alert-form-validation\">\n        All sources require a value (zero is allowed)\n      </StandardAlert>\n      )}\n\n      <div className=\"ms-4 me-4\">\n\n\n        <div className=\"source-rows\">\n\n          <div className=\"d-flex channel-source-row align-items-center fw-bold\" style={{fontSize: '0.85rem'}}>\n            <div className=\"cs-cell name flex-fill me-2\">Source</div>\n            <div className=\"cs-cell source-status-cell\">Source Status{' '}\n              <HelpPopper name=\"source-status\" title=\"Source Status\">\n                The source must be active for the channel-source distribution to work.\n              </HelpPopper>\n            </div>\n            <div className=\"cs-cell distro\">Distribution{' '}\n              <HelpPopper name=\"source-distribution\" title=\"Distribution\">\n                Optionally specify a distribution percentage.\n                The value may be automatically raised to adjust for low volume\n                in other sources. When fixed, the distribution will not change.\n              </HelpPopper>\n            </div>\n            <div className=\"cs-cell status\">Channel-Source Status</div>\n            {(allowViewRules || allowEdit) && <div className=\"cs-cell links d-flex justify-content-end\">{allowViewRules ? 'Rules' : ''}</div>}\n          </div>\n\n          {formValues.sources.map((source, i) => (\n            <ChannelSourceRow\n              index={i}\n              source={source}\n              sourceOptions={sourceOptions}\n              isNew={i === addIndex}\n              onRemove={() => handleRemove(i)}\n              onChangeSource={handleChangeSource}\n              onChangeDistribution={(e) => handleChangeDistribution(e.target.value, i)}\n              onChangeFixed={(name, value) => handleChangeFixed(value, i)}\n              onChangeEligibilityStatus={(status) => handleChangeEligibilityStatus(status, i)}\n              openRules={() => handleOpenRules(i)}\n              allowEdit={allowEdit}\n              allowViewRules={allowViewRules}\n              key={`source-${i}`}\n            />\n          ))}\n\n\n        </div>\n\n        {allowEdit && (\n          <div className=\"text-end\">\n            <Button color=\"link\" size=\"sm\" onClick={handleAddNew} >\n              <FaIcon icon=\"plus\" />{' '}Add Source\n            </Button>\n          </div>\n        )}\n\n      </div>\n\n      <div className=\"d-flex align-items-center justify-content-end mt-3\">\n        {allowEdit ? (\n          <>\n            <Button color=\"text\" size=\"sm\"  onClick={handleCancel} disable={loading}>\n              Cancel\n            </Button>\n\n            <Button color=\"primary\" size=\"sm\"  onClick={handleSave} disable={loading}>\n              {loading ? <Spinner size=\"sm\" /> : \"Save\"}\n            </Button>\n          </>\n        ) : (\n          <Button color=\"link\" size=\"sm\" onClick={() => onCancel()}>\n            Close\n          </Button>\n        )}\n      </div>\n\n      {selectedChannelSource && (\n        <RoutingRulesModal\n          entityType=\"channelsource\"\n          entity={selectedChannelSource}\n          isOpen={rulesModalOpen}\n          close={handleCloseRulesModal}\n        />\n      )}\n\n    </div>\n  );\n};\n\n\nexport const ChannelSourceRow = ({\n  index,\n  isNew,\n  source,\n  onRemove,\n  onChangeSource,\n  onChangeDistribution,\n  onChangeFixed,\n  onChangeEligibilityStatus,\n  openRules,\n  sourceOptions,\n  allowEdit = true,\n  allowViewRules = false\n}) => {\n\n  const handleSelectSource = (selected) => {\n    if (selected ) {\n      onChangeSource({\n        id: selected.value,\n        name: selected.label,\n        status: selected.status,\n        eligibility: {\n          distribution:\"\",\n          fixed_distribution: false,\n          status: \"active\"\n        }\n      } , index);\n    }\n\n  }\n\n  const distroValue = source.eligibility.distribution;\n  const fixedValue = !!source.eligibility.fixed_distribution;\n\n  return (\n    <div className=\"d-flex channel-source-row align-items-center\">\n\n      {isNew ? (\n        <div className=\"cs-cell name flex-fill me-2\">\n          <div className=\"flex-fill\">\n            <EnhancedSelect\n              isClearable\n              isSearchable\n              onChange={handleSelectSource}\n              options={sourceOptions}\n              defaultValue={source}\n              tabSelectsValue\n              backspaceRemovesValue\n              isMulti={false}\n              controlShouldRenderValue\n              hideSelectedOptions\n              closeMenuOnSelect\n              placeholder=\"Select Source (type to search)\"\n              invalid={false}\n              getOptionValue={(option) => option}\n              formatOptionLabel={SourceOptionLabel}\n            />\n          </div>\n        </div>\n      ) : (\n        <div className=\"cs-cell name flex-fill me-2\">\n          <Button\n            size=\"sm\"\n            tag={Link}\n            color=\"link\"\n            className=\"inline text-start\"\n            to={`/publishing/sources/${source.id}`}\n            target=\"_blank\"\n          >\n            <EntityId id={source.id}/>\n            {source.name}\n          </Button>\n        </div>\n      )}\n\n      <div className=\"cs-cell source-status-cell d-flex align-items-center\">\n        {!isNew && <StatusToggler status={source.status} showArchived allowEdit={false} />}\n      </div>\n\n      <div className=\"cs-cell distro d-flex align-items-center\" title=\"Distribution %\">\n        {allowEdit ? (\n          <>\n            <SourceDistributionInput value={distroValue} onChange={onChangeDistribution}/>\n            <SourceDistributionFixedCheckbox value={fixedValue} onChange={onChangeFixed}/>\n          </>\n        ) : (\n          <span>\n            {distroValue > 0 ? `${distroValue}%` : 'Open'}\n            {fixedValue && ' Fixed'}\n          </span>\n        )}\n      </div>\n\n\n      <div className=\"cs-cell status d-flex align-items-center\">\n        <StatusToggler\n          status={source.eligibility.status}\n          target={index}\n          onChange={(id, status) => onChangeEligibilityStatus(status, id)}\n          showArchived={false}\n          allowEdit={allowEdit}\n        />\n        {allowEdit && (\n          <HelpPopper name=\"channel-source-status\" title=\"Channel-Source Status\" iconClass=\"ms-1\">\n            Activate or pause a specific channel source. This does not affect\n            the status of the channel or source in general.\n          </HelpPopper>\n        )}\n      </div>\n\n\n      {(allowViewRules || allowEdit) && (\n        <div className=\"cs-cell links d-flex justify-content-end\">\n          {allowViewRules && (\n            <Button color=\"link\" className=\"inline me-2\" onClick={openRules} title=\"Channel-Source routing rules\">\n              <FaIcon icon=\"clipboard-list\" size=\"sm\" />\n              {\" \"}\n              Rules\n            </Button>\n          )}\n          {allowEdit && (\n            <Button onClick={onRemove} color=\"link\" size=\"sm\" className=\"inline\" title=\"Remove\">\n              <FaIcon icon=\"times\" size=\"sm\" color=\"darkred\"/>\n            </Button>\n          )}\n        </div>\n      )}\n\n    </div>\n  )\n};\n\n\nexport const SourceDistributionInput = ({ value, onChange, readOnly = false }) => (\n  <div className=\"me-2\">\n\n    <MaskedInput\n      mask={percentMask}\n      name=\"distribution\"\n      value={value}\n      onChange={onChange}\n      placeholder=\"Open\"\n      disabled={readOnly}\n      render={(ref, props) => <InputWithIcon className=\"teeny\" icon=\"percent\" iconSide=\"right\" innerRef={ref} {...props} />}\n    />\n\n  </div>\n);\n\nexport const SourceDistributionFixedCheckbox = ({ value, onChange, readOnly = false }) => (\n  <div>\n    <IconCheckbox\n      name=\"fixed_distribution\"\n      value={!!value}\n      onChange={readOnly ? undefined : onChange}\n      disabled={readOnly}\n    >\n      Fixed\n    </IconCheckbox>\n\n  </div>\n);\n\nChannelSourceDetail.propTypes = {\n  channel: PropTypes.object,\n  sources: PropTypes.array,\n  onCancel: PropTypes.func,\n  allSources: PropTypes.array,\n  refreshChannels: PropTypes.func\n  // refresh:PropTypes.func\n};\nexport default ChannelSourceDetail;\n","import React, { useMemo, useCallback } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport { titleCaseWord } from '../../../utils/string';\nimport usePermission from '../../../Hooks/usePermission';\nimport ChannelSourceDetail from './Channel/ChannelSourceDetail';\nimport PagedTable from '../../../Components/Table/PagedTable';\nimport TableSubcomponent from '../../../Components/Table/TableSubcomponent';\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport StatusToggler from \"../../../Components/Form/StatusToggler\";\nimport {ColumnSelect} from \"../../../Components/Table/ColumnSelect\";\nimport useLocalStorage from \"../../../Hooks/useLocalStorage\";\nimport {ChangeHistoryButton} from \"../../../Providers/ChangeProvider\";\n\nconst DefaultHiddenColumns = ['modified_at', 'inserted_at'];\n\nconst ActionCell = ({\n    channel,\n    searchParams,\n    onRulesClick,\n    onRoutingClick,\n    allowEditChannel,\n    allowViewRules,\n    allowViewAuction,\n}) => (\n    <div className='list-actions'>\n        <Link\n            to={`/publishing/channels/${channel.id}`}\n            state={{search: searchParams.toString()}}\n            className='action-item'\n            title='View'\n        >\n            <FaIcon icon='eye' size='1x' />\n        </Link>\n        {allowEditChannel && (\n            <Link\n                to={`/publishing/channels/${channel.id}/edit`}\n                state={{search: searchParams.toString()}}\n                className='action-item'\n                title='Settings'\n            >\n                <FaIcon icon='cog' size='1x' />\n            </Link>\n        )}\n\n        {allowViewRules && (\n            <Button\n                color='link'\n                onClick={() => {\n                    onRulesClick(channel);\n                }}\n                title='Channel routing rules'\n                className='action-item inline'\n            >\n                <FaIcon icon='clipboard-list' size='1x' />\n            </Button>\n        )}\n\n        {allowViewAuction && (\n          <>\n            <Link\n              to={`/auctions?page=1&channel=${channel.id}`}\n              target=\"_blank\"\n              title='Auction List'\n              className='action-item'\n            >\n              <FaIcon icon='comment-dollar' size='1x' />\n            </Link>\n            <Button\n              color='link'\n              onClick={() => {\n                onRoutingClick(channel.id);\n              }}\n              title='Routing Map'\n              className='action-item inline'\n            >\n              <FaIcon icon='project-diagram' size='1x' />\n            </Button>\n          </>\n        )}\n        <ChangeHistoryButton id={channel.id} name={channel.name} type=\"channel\" />\n    </div>\n);\n\nconst SourceExpander = ({ sourceCount, isExpanded, allowEdit }) => {\n    if (!sourceCount) {\n        if (!allowEdit) return <span>&mdash;</span>;\n        return (\n            <Button color=\"link\" size=\"sm\" className='inline' onClick={null} >\n                Add sources\n            </Button>\n        );\n    }\n\n    return (\n        <div>\n            {sourceCount} {sourceCount > 1 ? 'Sources' : 'Source'}{' '}\n            {isExpanded ? (\n                <FaIcon icon='chevron-circle-down' size='sm' />\n            ) : (\n                <FaIcon icon='chevron-circle-right' size='sm' />\n            )}\n        </div>\n    );\n};\n\n// const StatusCell = ({status, channel, allowEdit, onChange }) =>{\n//\n//   return allowEdit === true ? (\n//     <StatusToggler status={status} id={channel} onChangeAsync={onChange} allowEdit={allowEdit}/>\n//   ) : (titleCaseWord(status))\n// }\n//\n// const SourceStatusCell = ({status}) => (<span className=\"status-toggler\">\n//       <FaIcon icon=\"circle\" size=\"xs\" className={classnames([\"current-status-icon\", status, \"me-2\"])}/>{status}\n//     </span>\n// );\n\nconst Table = ({\n    data,\n    loading,\n    totalRows,\n    pageCount,\n    page,\n    sort_by,\n    sort_dir,\n    limit,\n    setPage,\n    setLimit,\n    setSortBy,\n    setSortDir,\n    openChannelRulesModal,\n    openRoutingMapModal,\n    refreshChannels,\n    allSources=[],\n}) => {\n    const [searchParams] = useSearchParams();\n    const [hiddenColumns, setHiddenColumns] = useLocalStorage('hidden_columns_channels', DefaultHiddenColumns)\n    const allowEdit = usePermission('channels.edit');\n    const allowViewRules = usePermission('routing.view');\n    const allowViewAuction = usePermission('auctions.view');\n    // controlled row expansion overrides default react-table behavior\n    // const [expanded, setExpanded] = useState({})\n\n    const columns = useMemo(\n        () => [\n          {\n            Header: 'ID',\n            id: 'id',\n            accessor: 'id',\n            defaultCanSort: false,\n            Cell: ({value}) => (\n              <EntityId id={value} title=\"Channel ID\" />\n            ),\n            maxWidth: 60\n          },\n            {\n                Header: 'Status',\n                accessor: 'status',\n                defaultCanSort: true,\n                width: 110,\n                Cell: (c) => (\n                  <StatusToggler\n                    status={c.value}\n                    target={c.row.original}\n                    allowEdit={false}\n                  />\n\n              ),\n            },\n            {\n                Header: 'Channel',\n                accessor: 'name',\n                defaultCanSort: true,\n                width: 275,\n                sortType: 'string',\n                Cell: ({ value, row }) => (\n                  <Link to={`/publishing/channels/${row.original.id}${allowEdit ? '/edit' : ''}`} state={{search: searchParams.toString()}}>{value}</Link>\n                ),\n            },\n            {\n                Header: 'Sources',\n                id: 'sources',\n                disableSortBy: true,\n                className: 'sources-link',\n                Cell: ({ row }) => {\n                    const sourceCount = row.original.sources.length;\n                    if (!sourceCount && !allowEdit) return <span>&mdash;</span>;\n                    return (\n                        <div {...row.getToggleRowExpandedProps()}>\n                            <SourceExpander\n                                isExpanded={row.isExpanded}\n                                sourceCount={sourceCount}\n                                allowEdit={allowEdit}\n                            />\n                        </div>\n                    );\n                },\n                style: { cursor: 'pointer' },\n            },\n            {\n                Header: 'Vertical',\n                id: 'vertical.id',\n                defaultCanSort: true,\n                Cell: ({row}) => row.original.vertical.display_name,\n                width: 140,\n            },\n            {\n                Header: 'Product',\n                accessor: 'product',\n\n                Cell: (c) => titleCaseWord(c.value),\n                defaultCanSort: true,\n               // filter: 'includesSome',\n                width: 90,\n            },\n            {\n                Header: 'Account',\n                accessor: 'account.name',\n                disableSortBy: true,\n                width: 150,\n            },\n            {\n                Header: 'Created',\n                accessor: 'inserted_at',\n                defaultCanSort: true,\n                Cell: ({ value }) => <RelativeTime date={value} />,\n            },\n            {\n                Header: 'Modified',\n                accessor: 'modified_at',\n                defaultCanSort: true,\n                Cell: ({ value }) => <RelativeTime date={value} />,\n            },\n            {\n              Header: 'Last Match',\n              accessor: 'last_matched_at',\n              defaultCanSort: true,\n              Cell: ({ value }) => <RelativeTime date={value} />,\n            },\n            {\n              Header: 'Last Sold',\n              accessor: 'last_sold_at',\n              defaultCanSort: true,\n              Cell: ({ value }) => <RelativeTime date={value} />,\n            },\n            {\n                Cell: ({ row }) => (\n                    <ActionCell\n                        channel={row.original}\n                        searchParams={searchParams}\n                        onRulesClick={openChannelRulesModal}\n                        onRoutingClick={openRoutingMapModal}\n                        allowEditChannel={allowEdit}\n                        allowViewRules={allowViewRules}\n                        allowViewAuction={allowViewAuction}\n                    />\n                ),\n                id: 'actions',\n                width: 132,\n            },\n        ],\n        [searchParams, allowEdit, allowViewRules, allowViewAuction]\n    );\n\n    const columnPicks = useMemo(() => columns.reduce((acc, col) => {\n        if (col.id !== 'actions') {\n          acc.push({id:col.accessor ?? col.id, label: col.Header})\n        }\n        return acc\n        }, []),\n      [])\n\n    const initialTableState = useMemo(\n        () => ({\n            sortBy: [{ id: 'name', desc: false }],\n            hiddenColumns\n        }),\n        []\n    );\n\n\n    const renderDetailSubRow = useCallback(\n        (row) => (\n            <TableSubcomponent className='channel-sources'>\n                <ChannelSourceDetail\n                    channel={row.original}\n                    sources={row.original.sources}\n                    onCancel={row.toggleRowExpanded}\n                    refreshChannels={refreshChannels}\n                    allSources={allSources}\n                    allowEdit={allowEdit}\n                />\n            </TableSubcomponent>\n        ),\n        [allSources]\n    );\n\n    return (\n      <>\n        <div className=\"mb-1\">\n          <ColumnSelect\n            columns={columnPicks}\n            hiddenColumns={hiddenColumns}\n            onChange={setHiddenColumns}\n            loading={loading}\n          />\n        </div>\n        <PagedTable\n          columns={columns}\n          initialState={initialTableState}\n          className='channels-table striped'\n          data={data}\n          loading={loading}\n          totalRows={totalRows}\n          pageCount={pageCount}\n          page={page}\n          limit={limit}\n          sort_by={sort_by}\n          sort_dir={sort_dir}\n          setPage={setPage}\n          setLimit={setLimit}\n          setSortBy={setSortBy}\n          setSortDir={setSortDir}\n          noDataMessage='No channels were found'\n          renderRowSubcomponent={renderDetailSubRow}\n          hiddenColumns={hiddenColumns}\n        />\n      </>\n\n    );\n};\n\nTable.propTypes = {\n  loading: PropTypes.bool,\n  data: PropTypes.array,\n  totalRows: PropTypes.number,\n  pageCount: PropTypes.number,\n  page: PropTypes.number,\n  sort_by: PropTypes.string,\n  sort_dir: PropTypes.string,\n  limit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  attributes: PropTypes.object,\n  setPage: PropTypes.func,\n  setLimit: PropTypes.func,\n  setSort: PropTypes.func,\n    onStatusChange: PropTypes.func,\n    openChannelRulesModal: PropTypes.func,\n    openRoutingMapModal: PropTypes.func,\n};\n\nexport default Table;\n","import React, {  useEffect, useState } from 'react';\nimport classnames from 'classnames';\nimport {StackedFilter, TextSearch} from \"../../../Components/Table/Filter\";\nimport { ProductChoices, StatusChoices } from '../../../Components/Table/FilterChoices';\nimport RightDateAndControls from '../../../Components/Table/RightDateAndControls';\nimport useApi from '../../../Hooks/useApi';\nimport {useFilters} from \"../../../Hooks/useFilters\";\nimport {DropdownToggle, UncontrolledDropdown, DropdownMenu} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport FilterSummaryTags from \"../../../Components/Table/FilterSummaryTags\";\n\nconst Filters = ({ filters, onChange, loading, onRefresh }) => {\n  const [choices, setChoices] = useState({});\n  const { api } = useApi();\n  const {onChangeFilter, reset,clearFilter, clearSearch} = useFilters(filters, onChange)\n\n\n  // load choices\n  useEffect(() => {\n    const getChoices = async () => {\n      const verticals = await api.endpoints.verticals.list({options:true});\n      const sources = await api.endpoints.sources.list({options:true});\n      if (verticals && sources) {\n        setChoices({\n          status: StatusChoices.filter((opt) => opt.value !== 'paused'),\n          product: ProductChoices,\n          vertical: verticals.map((item) => ({ value: item.id, label: item.display_name })),\n          source: sources.map((item) => ({ value: item.id, label: item.name })),\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n\n  return (\n\n    <div className=\"channel-filters  position-relative\">\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n      <div className=\"d-flex justify-content-between\">\n\n\n        <div className=\"d-flex\">\n          <div className=\"boxed-filter new-boxed-filter search-filter me-3\">\n\n            <TextSearch\n              value={filters.search || ''}\n              placeholder=\"Search channels\"\n              onUpdate={(val) => onChangeFilter('search', val)}\n              onClear={clearSearch}\n            />\n\n          </div>\n\n          <UncontrolledDropdown  className=\"simple-filters-dropdown me-2\">\n\n            <DropdownToggle  caret className=\"boxed-filter new-boxed-filter filter-group-dropdown\">\n              <FaIcon icon=\"filter\" size=\"1x\" className=\"fa-icons\" />\n            </DropdownToggle>\n\n            <DropdownMenu className=\"select-filters-dropdown animate dropDown\">\n              <div className=\"modal-body\">\n                <StackedFilter\n                  placeholder=\"Any Vertical\"\n                  label=\"Vertical\"\n                  param=\"vertical\"\n                  options={choices.vertical || []}\n                  value={filters.vertical || ''}\n                  onChange={onChangeFilter}\n                  isMulti={false}\n                />\n\n                <StackedFilter\n                  placeholder=\"Any product\"\n                  label=\"Product\"\n                  param=\"product\"\n                  options={choices.product || []}\n                  value={filters.product || []}\n                  onChange={onChangeFilter}\n                  isMulti\n                />\n\n                <StackedFilter\n                  placeholder=\"Status\"\n                  label=\"Status\"\n                  param=\"status\"\n                  options={choices.status ?? []}\n                  value={filters.status ?? ''}\n                  onChange={onChangeFilter}\n                  isMulti={false}\n                />\n\n                <StackedFilter\n                  label=\"Source\"\n                  placeholder=\"Any Source\"\n                  param=\"source_id\"\n                  options={choices.source ?? []}\n                  value={filters.source_id || ''}\n                  onChange={onChangeFilter}\n                  isMulti={false}\n                />\n\n              </div>\n            </DropdownMenu>\n          </UncontrolledDropdown>\n\n\n        </div>\n\n        <RightDateAndControls onRefresh={onRefresh} onReset={reset} />\n      </div>\n\n      <FilterSummaryTags\n        choices={choices}\n        filters={filters}\n        filterKeys={Object.keys(filters)}\n        onRemoveFilter={clearFilter}\n        onClear={reset}\n        isLoading={false}\n        isPendingApply={false}\n      />\n\n    </div>\n  );\n};\n\nexport default Filters;\n","import React, { useState, useEffect } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport {\n  Button,\n} from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport Table from './Table';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport FilterBar from '../../../Components/Table/FilterBar';\nimport Filters from './Filters';\nimport DocTitle from '../../../Layout/DocTitle';\nimport usePermission from '../../../Hooks/usePermission';\nimport {Modal as RoutingRulesModal} from '../../Routing/Rules';\nimport useApi from '../../../Hooks/useApi';\nimport usePagedTableState from \"../../../Hooks/usePagedTableState\";\nimport RoutingMapModal from \"../../Routing/Mapper/Modal\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\n\nconst DefaultFilters = {\n};\n\nconst DefaultControls = {\n  limit: 50,\n  sort_by: 'name',\n  sort_dir: 'asc',\n};\n\nconst ListHeaderTools = ({ allowCreate, searchParams }) => {\n  if (!allowCreate) return (null);\n  return (\n    <Button\n      tag={Link}\n      to=\"/publishing/channels/create\"\n      state={{search: searchParams.toString()}}\n      color=\"primary\"\n      size=\"sm\"\n    >\n      Create\n    </Button>\n  );\n};\n\n\nconst ChannelList = () => {\n  const {\n    filters, setFilters, controls, updateQuery,\n  } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: true, useTableControls: true },\n  );\n  const [loading, setLoading] = useState(false);\n  const [channels, setChannels] = useState([]);\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const [allSources, setAllSources] = useState([]);\n  const [channelRulesModalOpen, setChannelRulesModalOpen] = useState(false);\n  const [selectedChannel, setSelectedChannel] = useState(null);\n  const [selectedChannelSource, setSelectedChannelSource] = useState(null);\n  const [routingMapId, setRoutingMapId] = useState(null);\n\n  const [searchParams] = useSearchParams();\n  const allowView = usePermission('channels.view');\n  const allowCreate = usePermission('channels.create');\n  const { api } = useApi();\n  useChangeTimeline({ entityTypes: ['channel', 'routingrule'], parentFilters: filters });\n\n  if (!allowView) return (null)\n\n  useEffect(() => {\n    if (!loading) {\n      load();\n    }\n    if (!allSources.length) {\n      loadSources(); // for picker\n    }\n  }, [filters, controls.sort_by, controls.sort_dir, controls.page, controls.limit])\n\n  const openRoutingMapModal = (channelId) => setRoutingMapId(channelId)\n  const closeRoutingMapModal = () => setRoutingMapId(null)\n\n  const openChannelRulesModal = (channel) => {\n    setSelectedChannel(channel)\n    setChannelRulesModalOpen(true)\n  };\n\n\n  const closeChannelRulesModal = () => {\n    setChannelRulesModalOpen(false)\n    setSelectedChannel(null)\n    setSelectedChannelSource(null)\n  }\n\n  const openChannelSourceRulesModal = (channelSource) => {\n    setSelectedChannelSource(channelSource)\n  };\n\n  const closeChannelSourceRulesModal = () => {\n    setSelectedChannelSource(null)\n\n  };\n\n\n  const load = async (refresh = false) => {\n    if (!refresh) {\n      setLoading(true)\n    }\n\n    updateQuery();\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls\n\n    const params = {...filters}\n    if (params.vertical) {\n      params.vertical_id = params.vertical\n      delete params.vertical\n    }\n    const result = await api.endpoints.channels.list({\n      ...params,\n      page,\n      sort_by,\n      sort_dir,\n      limit,\n    })\n\n    if (result) {\n      const { limit, total, data } = result; // row:0, page:1, limit:20, data:[]\n      setChannels(data)\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1);\n      setTotalRows(total)\n    } else {\n      notify(`Unable to load channels: ${api.error.name}`, 'error')\n    }\n\n\n    if (!refresh) {\n      setLoading(false)\n    }\n  };\n\n  const loadSources = async () => {\n    const allSources = await api.endpoints.sources.list({ options: true });\n    if (allSources) {\n      setAllSources(allSources);\n    }\n  };\n\n  const handleStatusChange = async (channelId, status) => {\n    const result = await api.endpoints.channels.update({ id: channelId, status });\n    return result;\n  };\n\n  /*  Currently API does not expose status\n   handleStatusChange = async(channel, status) => {\n      if(channel && this.hasPermission('channels.edit')){\n        channel.vertical_id = channel.vertical.id;\n        let result = await this.global.api.endpoints.channels.update({\n          ...channel, status\n        });\n\n        if(result) this.load(true);\n        return result ? true : false;\n      }\n      return false;\n    }\n  */\n\n  return (\n\n    <>\n      <DocTitle pageTitle=\"Channels\" />\n\n\n        <FilterBar>\n          <Filters filters={filters} loading={loading} onChange={setFilters}  onRefresh={() => load(true)} />\n        </FilterBar>\n\n        <PageSection\n          title=\"Channels\"\n          className=\"overflow-section\"\n          tools={<ListHeaderTools allowCreate={allowCreate} searchParams={searchParams} />}\n        >\n\n          <Table\n            loading={loading}\n            data={channels}\n            pageCount={pageCount}\n            totalRows={totalRows}\n            {...controls}\n            openChannelRulesModal={openChannelRulesModal}\n            openChannelSourceRulesModal={openChannelSourceRulesModal}\n            openRoutingMapModal={openRoutingMapModal}\n            onStatusChange={handleStatusChange}\n            refreshChannels={()=>load(true)}\n            allSources={allSources}\n          />\n\n          <RoutingRulesModal\n            entityType=\"channel\"\n            entity={selectedChannel}\n            isOpen={channelRulesModalOpen}\n            close={closeChannelRulesModal}\n          />\n\n          <RoutingRulesModal\n            entityType=\"channelsource\"\n            entity={selectedChannelSource}\n            isOpen={Boolean(selectedChannelSource)}\n            close={closeChannelSourceRulesModal}\n          />\n\n          <RoutingMapModal\n            isOpen={Boolean(routingMapId)}\n            toggle={closeRoutingMapModal}\n            channelId={routingMapId}\n          />\n\n        </PageSection>\n\n    </>\n  );\n};\n\nexport default ChannelList;\n","import React, { useEffect, useState, useMemo } from 'react';\nimport { useParams, useLocation, useNavigate, Link } from 'react-router-dom';\nimport { Row, Col, FormGroup, Label, Button } from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport DocTitle from '../../../Layout/DocTitle';\nimport { notify, RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport { titleCaseWord } from '@thedmsgroup/mastodon-ui-components/lib/utils/string';\nimport Breadcrumbs from '../../../Layout/Breadcrumbs';\nimport LoaderDots from '../../../Layout/LoaderDots';\nimport usePermission from '../../../Hooks/usePermission';\nimport useApi from '../../../Hooks/useApi';\n\nconst ChannelShow = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const { id } = useParams();\n  const [loading, setLoading] = useState(true);\n  const [channel, setChannel] = useState<any>(null);\n  const { api } = useApi();\n  const allowView = usePermission('channels.view');\n  const allowEdit = usePermission('channels.edit');\n  const allowViewRouting = usePermission('routing.view');\n\n  if (!allowView) return null;\n\n  useEffect(() => {\n    if (!channel) {\n      load();\n    }\n  }, []);\n\n  const load = async () => {\n    const result = await api.endpoints.channels.show(id);\n\n    if (result) {\n      setChannel(result);\n    } else {\n      notify(`Unable to load channel: ${api.error ? api.error.name : ''}`, 'error');\n      navigate(\n        {\n          pathname: '/publishing/channels',\n          search: location.state?.search ?? '',\n        },\n        { replace: false }\n      );\n    }\n\n    setLoading(false);\n  };\n\n  const crumbs = useMemo(() => {\n    if (channel) {\n      return [\n        { label: 'Publishing' },\n        {\n          label: 'Channels',\n          to: {\n            pathname: '/publishing/channels',\n            search: location.state?.search ?? '',\n          },\n        },\n        { label: channel.name },\n      ];\n    }\n    return [];\n  }, [channel, location.state?.search]);\n\n  return (\n    <>\n      <DocTitle pageTitle={`Channel Details - ${channel?.name ?? ''}`} />\n      <Breadcrumbs crumbs={crumbs} />\n      <PageSection\n        title=\"Channel\"\n        subtitle={channel?.name ?? ''}\n        tools={\n          <>\n            {allowViewRouting && channel && (\n              <Button\n                size=\"sm\"\n                tag={Link}\n                to={`/routing/channel/${channel.id}/rules`}\n                className=\"me-2\"\n              >\n                Routing Rules\n              </Button>\n            )}\n            {allowEdit && channel && (\n              <Button\n                size=\"sm\"\n                tag={Link}\n                to={{\n                  pathname: `/publishing/channels/${channel.id}/edit`,\n                }}\n                state={{ search: location.state?.search ?? '' }}\n              >\n                Edit\n              </Button>\n            )}\n          </>\n        }\n      >\n        <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n        {channel !== null && (\n          <Row>\n            <Col sm={12} md={8} lg={5}>\n              <div className=\"d-flex gap-4\">\n                <FormGroup>\n                  <Label>ID</Label>\n                  <div>{channel.id}</div>\n                </FormGroup>\n                <FormGroup>\n                  <Label>Created</Label>\n                  <div>\n                    <RelativeTime date={channel.inserted_at} showTimezone={true} />\n                  </div>\n                </FormGroup>\n                <FormGroup>\n                  <Label>Modified</Label>\n                  <div>\n                    <RelativeTime date={channel.modified_at} showTimezone={true} />\n                  </div>\n                </FormGroup>\n              </div>\n\n              <FormGroup>\n                <Label>Name</Label>\n                <div>{channel.name ?? ''}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Description</Label>\n                <div>{channel.description || <i>None</i>}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Account</Label>\n                <div>{channel.account?.name || <i>None</i>}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Product</Label>\n                <div>{channel.product ? titleCaseWord(channel.product) : <i>None</i>}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Vertical</Label>\n                <div>\n                  {channel.vertical?.display_name || channel.vertical?.name || <i>None</i>}\n                </div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Status</Label>\n                <div>{channel.status ? titleCaseWord(channel.status) : <i>None</i>}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Sources</Label>\n                <div>\n                  {channel.sources && channel.sources.length > 0 ? (\n                    <ul>\n                      {channel.sources.map((source: any) => (\n                        <li key={source.id}>{source.name}</li>\n                      ))}\n                    </ul>\n                  ) : (\n                    <i>No sources assigned</i>\n                  )}\n                </div>\n              </FormGroup>\n            </Col>\n          </Row>\n        )}\n      </PageSection>\n    </>\n  );\n};\n\nexport default ChannelShow;\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { useNavigate, useLocation, useParams, Link } from 'react-router-dom';\nimport { Button } from 'reactstrap';\nimport { notify } from '@thedmsgroup/mastodon-ui-components';\nimport useApi from '../../../Hooks/useApi';\nimport usePermission from '../../../Hooks/usePermission';\nimport DocTitle from '../../../Layout/DocTitle';\nimport Breadcrumbs from '../../../Layout/Breadcrumbs';\nimport PageSection from '../../../Layout/PageSection';\nimport Channel from './Channel';\n\nconst ChannelEdit = () => {\n  const { id } = useParams();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const { api } = useApi();\n  const [channel, setChannel] = useState<any>(null);\n  const allowEdit = usePermission('channels.edit');\n  const allowViewRouting = usePermission('routing.view');\n\n  useEffect(() => {\n    if (allowEdit) {\n      load();\n    }\n  }, [id, allowEdit]);\n\n  const load = async () => {\n    const result = await api.endpoints.channels.show(id);\n    if (result) {\n      setChannel(result);\n    } else {\n      notify(`Unable to load channel: ${api.error?.name || 'Unknown error'}`, 'error');\n      handleClose();\n    }\n  };\n\n  const handleClose = () => {\n    navigate(\n      {\n        pathname: '/publishing/channels',\n        search: location.state?.search ?? '',\n      },\n      { replace: false }\n    );\n  };\n\n  const handleSuccess = () => {\n    handleClose();\n  };\n\n  const crumbs = useMemo(() => {\n    if (channel) {\n      return [\n        { label: 'Publishing' },\n        {\n          label: 'Channels',\n          to: {\n            pathname: '/publishing/channels',\n            search: location.state?.search ?? '',\n          },\n        },\n        { label: channel.name, to: `/publishing/channels/${channel.id}` },\n        { label: 'Edit' },\n      ];\n    }\n    return [];\n  }, [channel, location.state]);\n\n  if (!allowEdit) {\n    return null;\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Edit Channel\" />\n\n      <Breadcrumbs crumbs={crumbs} />\n\n      <PageSection\n        title=\"Edit Channel\"\n        subtitle={channel ? channel.name : ''}\n        tools={\n          allowViewRouting && channel && (\n            <Button size=\"sm\" tag={Link} to={`/routing/channel/${channel.id}/rules`}>\n              Routing Rules\n            </Button>\n          )\n        }\n      >\n        <Channel\n          channelId={Number(id)}\n          close={handleClose}\n          onSuccess={handleSuccess}\n          onOpenChannelRules={() => {}}\n          onOpenChannelSourceRules={() => {}}\n          isModal={false}\n        />\n      </PageSection>\n    </>\n  );\n};\n\nexport default ChannelEdit;\n","import React from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport usePermission from '../../../Hooks/usePermission';\nimport DocTitle from '../../../Layout/DocTitle';\nimport Breadcrumbs from '../../../Layout/Breadcrumbs';\nimport PageSection from '../../../Layout/PageSection';\nimport Channel from './Channel';\n\nconst ChannelCreate = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const allowCreate = usePermission('channels.create');\n\n  const handleClose = () => {\n    navigate(\n      {\n        pathname: '/publishing/channels',\n        search: location.state?.search ?? '',\n      },\n      { replace: false }\n    );\n  };\n\n  const handleSuccess = () => {\n    handleClose();\n  };\n\n  if (!allowCreate) {\n    return null;\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Create Channel\" />\n\n      <Breadcrumbs\n        crumbs={[\n          { label: 'Publishing' },\n          {\n            label: 'Channels',\n            to: {\n              pathname: '/publishing/channels',\n              search: location.state?.search ?? '',\n            },\n          },\n          { label: 'Create' },\n        ]}\n      />\n\n      <PageSection title=\"Create Channel\">\n        <Channel\n          channelId={0}\n          close={handleClose}\n          onSuccess={handleSuccess}\n          onOpenChannelRules={() => {}}\n          onOpenChannelSourceRules={() => {}}\n          isModal={false}\n        />\n      </PageSection>\n    </>\n  );\n};\n\nexport default ChannelCreate;\n","import React from \"react\";\nimport {Modal, ModalBody, ModalHeader, } from \"reactstrap\";\n// @ts-ignore\nimport JSONPretty from 'react-json-prettify';\n// @ts-ignore\nimport { idea } from 'react-json-prettify/dist/themes';\n\n\n/*\n * Modal for displaying a json value, prettified\n */\nconst JsonViewModal = ({\n                                json, title, size=\"md\", isOpen, close\n                              }:any) => {\n\n  return (\n    <Modal isOpen={isOpen} toggle={close} size={size} scrollable>\n      <ModalHeader toggle={close}>{title}</ModalHeader>\n      <ModalBody>\n        <JSONPretty json={json} theme={idea} />\n\n      </ModalBody>\n    </Modal>\n  );\n};\n\nexport default JsonViewModal;\n","import React, { useState } from 'react';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport JsonViewModal from \"../JsonViewModal\";\n\n// Cell used in a few tables, has toggling display of seed data JSON\nconst SeedDataCell = ({ seedData }) => {\n  const [showData, setShowData] = useState(false);\n  const toggleData = () => setShowData(!showData);\n  return seedData && !Array.isArray(seedData) ? (\n    <div className=\"fw-bolder\">\n      <div className=\"\">\n        <Button\n          color=\"link\"\n          className=\"inline\"\n          onClick={toggleData}\n        >\n          <FaIcon icon=\"eye\" size=\"sm\" />\n          {' '}View\n        </Button>\n      </div>\n      <JsonViewModal\n        json={seedData}\n        title=\"Seed Data\"\n        isOpen={showData}\n        close={toggleData}\n        />\n    </div>\n  ) : (<span>&mdash;</span>);\n};\n\nexport default SeedDataCell;\n","import React, { useMemo, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {faKey} from \"@fortawesome/free-solid-svg-icons\";\nimport PropTypes from 'prop-types';\nimport NumberFormat from 'react-number-format';\nimport {singularOrPlural, titleCaseWord} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport usePermission from '../../../Hooks/usePermission';\nimport StatusToggler from '../../../Components/Form/StatusToggler';\nimport SeedDataCell from '../../../Components/Table/SeedDataCell';\nimport PagedTable from '../../../Components/Table/PagedTable';\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport useLocalStorage from \"../../../Hooks/useLocalStorage\";\nimport {ColumnSelect} from \"../../../Components/Table/ColumnSelect\";\nimport {ChangeHistoryButton} from \"../../../Providers/ChangeProvider\";\n\nconst DefaultHiddenColumns = ['modified_at', 'inserted_at', 'seed_data'];\n\nconst NameCell = ({ name, description, sourceId, allowEdit, searchParams }) => (\n    <div>\n        <Link to={`/publishing/sources/${sourceId}${allowEdit ? '/edit' : ''}`} state={{search: searchParams?.toString()}}>{name}</Link>\n        {description && (\n            <small className='d-block font-weight-light ms-1 description'>\n                {description}\n            </small>\n        )}\n    </div>\n);\n\nconst ActionCell = ({\n    source,\n    searchParams,\n    onRulesClick,\n    onRoutingClick,\n    onVendorClick,\n    allowEditSource,\n    allowViewTokens,\n    allowViewRules,\n    allowViewAuction,\n}) => (\n      <div className='list-actions'>\n          {allowEditSource && (\n            <Button\n              tag={Link}\n              color='link'\n              className='action-item inline'\n              title='Settings'\n              state={{search: searchParams.toString()}}\n              to={{\n                pathname: `/publishing/sources/${source.id}/edit`,\n              }}\n            >\n              <FaIcon icon='cog' size='1x' />\n            </Button>\n          )}\n          {allowViewTokens && (\n            <Button\n              color='link'\n              className='action-item inline'\n              title='Source-Tokens'\n              onClick={() => {\n                onVendorClick(source);\n              }}\n            >\n              <FaIcon icon={faKey} size='1x' />\n            </Button>\n          )}\n          {allowViewRules && (\n              <Button\n                  color='link'\n                  className='action-item inline'\n                  title='Source routing rules'\n                  onClick={() => {\n                      onRulesClick(source);\n                  }}\n              >\n                  <FaIcon icon='clipboard-list' size='1x' />\n              </Button>\n          )}\n          {allowViewAuction && (\n            <>\n              <Link\n                className='action-item'\n                to={`/auctions?page=1&source=${source.id}`}\n                title='Auction List'\n                target=\"_blank\"\n              >\n                <FaIcon icon='comment-dollar' size='1x' />\n              </Link>\n              <Button\n                color='link'\n                onClick={() => {\n                  onRoutingClick(source.id);\n                }}\n                title='Routing Map'\n                className='action-item inline'\n              >\n                <FaIcon icon='project-diagram' size='1x' />\n              </Button>\n            </>\n          )}\n          <ChangeHistoryButton id={source.id} name={source.name} type=\"source\" />\n      </div>\n);\n\n\nconst BidCell = ({ vendor_bid, vendor_margin }) => {\n    // bid takes precedence over margin\n    if (vendor_bid) {\n        return (\n            <NumberFormat\n                value={vendor_bid}\n                displayType='text'\n                thousandSeparator\n                prefix='$'\n                decimalScale={2}\n                fixedDecimalScale\n            />\n        );\n    }\n    if (vendor_margin) {\n        return <span>{vendor_margin}%</span>;\n    }\n    return <span>&mdash;</span>;\n};\n\nconst ChannelsCell = ({ channels, sourceId }) => {\n    // channels, actually channel_eligibilities\n    const [showData, setShowData] = useState(false);\n    return channels?.length > 0 ? (\n        <div className='source-channels-cell'>\n            <Button\n                color='link'\n                className='fw-bolder inline'\n                onClick={() => {\n                    setShowData(!showData);\n                }}\n            >\n                {channels.length}{' '}\n                {singularOrPlural(channels.length, 'channel', 'channels')}\n                <FaIcon\n                    icon={showData ? 'chevron-down' : 'chevron-right'}\n                    size='sm'\n                    className='ms-1'\n                />\n            </Button>\n\n            {showData &&\n                channels.map((c, i) => (\n                    <div className='source-channels mt-1' key={i}>\n                        <EntityId id={c.id} title=\"Source ID\" />\n                        {c.name}\n                      <Link\n                        to={`/publishing/channels?page=1&&limit=50&sort_by=name&sort_dir=asc&source_id=${sourceId}`}\n                        title='Channels List'\n                        target=\"blank\"\n                      >\n                         <FaIcon icon='external-link-alt' size='sm' className=\"ms-1\" />\n                      </Link>\n\n                        {c.distribution > 0 && (\n                            <span>\n                                {' '}\n                                - {c.distribution}%\n                                {c.distribution_fixed && ' (fixed)'}\n                            </span>\n                        )}\n                    </div>\n                ))}\n        </div>\n    ) : (\n        <span>&mdash;</span>\n    );\n};\n\nconst TokensCell = ({ tokens }) => {\n    const [showData, setShowData] = useState(false);\n    const nonArchived = tokens.filter(t => t.status !== 'archived');\n    return nonArchived?.length > 0 ? (\n        <div className='source-tokens-cell' onClick={() => setShowData(!showData)} style={{ cursor: 'pointer' }}>\n            <div>\n                {nonArchived.length} {singularOrPlural(nonArchived.length, 'Vendor', 'Vendors')}{' '}\n                <FaIcon icon={showData ? 'chevron-circle-down' : 'chevron-circle-right'} size='sm' />\n            </div>\n\n            {showData &&\n                nonArchived.map((st, i) => (\n                    <div className='source-tokens mt-1' key={i}>\n                        <EntityId id={st.vendor.id} title=\"Vendor ID\" />\n                        {st.vendor.name}\n                    </div>\n                ))}\n        </div>\n    ) : (\n        <span>&mdash;</span>\n    );\n};\n\nconst Table = (props) => {\n    // default sort by name asc, all sortable except actions\n    const allowEditSource = usePermission('sources.edit');\n    const allowViewTokens = usePermission('source_tokens.view');\n    const allowViewRules = usePermission('routing.view');\n    const allowViewAuction = usePermission('auctions.view');\n    const [hiddenColumns, setHiddenColumns] = useLocalStorage('hidden_columns_sources', DefaultHiddenColumns)\n\n    const columns = useMemo(\n        () => [\n            {\n                Header: 'ID',\n                className: 'id-cell',\n                id: 'id',\n                accessor: 'id',\n                defaultCanSort: false,\n                Cell: ({value}) => (\n                  <EntityId id={value} title=\"Source ID\" />\n                ),\n                maxWidth: 60\n            },\n            {\n                Header: 'Status',\n                accessor: 'status',\n                defaultCanSort: true,\n                width: 90,\n                className: 'status-cell',\n                Cell: (c) => (\n                  <StatusToggler\n                    status={c.value}\n                    target={c.row.original}\n                    onChangeAsync={props.onStatusChange}\n                    allowEdit={allowEditSource}\n                  />\n\n                ),\n            },\n            {\n                Header: 'Name',\n                className: 'name-cell',\n                id: 'name', // used to id sort\n                accessor: 'name',\n                defaultCanSort: true,\n                Cell: (c) => (\n                    <NameCell\n                        name={c.value}\n                        description={c.row.original.description}\n                        sourceId={c.row.original.id}\n                        allowEdit={allowEditSource}\n                        searchParams={props.searchParams}\n                    />\n                ),\n                minWidth: 200\n            },\n            /*     {Header:'Description', accessor: 'description', sortable:false }, */\n            /* {Header:'Vendor',accessor:'vendor.name', sortable:true, maxWidth:180}, */\n            {\n                Header: 'Vertical',\n                accessor: 'vertical.display_name',\n                defaultCanSort: true,\n                id: 'vertical',\n                width: 120,\n            },\n            {\n                Header: 'Product',\n                accessor: 'product',\n                id: 'product',\n                defaultCanSort: true,\n                Cell: (c) => titleCaseWord(c.value),\n                width: 100,\n            },\n            {\n                id: 'bid-or-margin',\n                Header: 'Bid/Margin',\n                width: 110,\n                className: 'bid-margin',\n                disableSortBy: true,\n                Cell: (c) => (\n                    <BidCell\n                        vendor_bid={c.row.original.vendor_bid}\n                        vendor_margin={c.row.original.vendor_margin}\n                    />\n                ),\n            },\n            {\n                Header: 'Seed Data',\n                disableSortBy: true,\n                accessor: 'seed_data',\n                Cell: ({ value }) => <SeedDataCell seedData={value} />,\n                width: 100,\n            },\n            {\n                Header: 'Channels',\n                disableSortBy: true,\n                accessor: 'channels',\n                Cell: ({ value, row }) => <ChannelsCell channels={value} sourceId={ row.original.id} />,\n                width: 170,\n            },\n            {\n                Header: 'Tokens',\n                disableSortBy: true,\n                accessor: 'tokens',\n                Cell: ({ value }) => <TokensCell tokens={value} />,\n                width: 170,\n            },\n            {\n                Header: 'Created',\n                accessor: 'inserted_at',\n                defaultCanSort: true,\n\n                Cell: ({ value }) => <RelativeTime date={value} />,\n            },\n          {\n            Header: 'Updated',\n            accessor: 'modified_at',\n            defaultCanSort: true,\n\n            Cell: ({ value }) => <RelativeTime date={value} />,\n          },\n          {\n            Header: 'Last Match',\n            accessor: 'last_matched_at',\n            defaultCanSort: true,\n\n            Cell: ({ value }) => <RelativeTime date={value} />,\n          },\n          {\n            Header: 'Last Sale',\n            accessor: 'last_sold_at',\n            defaultCanSort: true,\n\n            Cell: ({ value }) => <RelativeTime date={value} />,\n          },\n            {\n                width: 150,\n                disableSortBy: true,\n                id: 'actions',\n                Cell: (c) => (\n                    <ActionCell\n                        source={c.row.original}\n                        searchParams={props.searchParams}\n                        onRulesClick={props.openRulesModal}\n                        onRoutingClick={props.openRoutingModal}\n                        onVendorClick={props.openVendorModal}\n                        allowEditSource={allowEditSource}\n                        allowViewTokens={allowViewTokens}\n                        allowViewRules={allowViewRules}\n                        allowViewAuction={allowViewAuction}\n                    />\n                ),\n            },\n        ],\n        [props.searchParams, allowEditSource, allowViewTokens, allowViewRules, allowViewAuction]\n    );\n\n  const columnPicks = useMemo(() => columns.reduce((acc, col) => {\n      if (col.id !== 'actions') {\n        acc.push({id:col.accessor ?? col.id, label: col.Header})\n      }\n      return acc\n    }, []),\n    [])\n\n    const initialTableState = useMemo(\n        () => ({\n            sortBy: [\n                {\n                    id: props.sort_by,\n                    desc:\n                        typeof props.sort_dir !== 'undefined'\n                            ? props.sort_dir === 'desc'\n                            : true,\n                },\n            ],\n            hiddenColumns\n        }),\n        []\n    );\n\n    return (\n      <>\n        <div className=\"mb-1\">\n          <ColumnSelect\n            columns={columnPicks}\n            hiddenColumns={hiddenColumns}\n            onChange={setHiddenColumns}\n            loading={props.loading}\n          />\n        </div>\n        <PagedTable\n          columns={columns}\n          initialState={initialTableState}\n          className='sources-table striped'\n          {...props}\n          noDataMessage='No sources were found'\n          hiddenColumns={hiddenColumns}\n        />\n      </>\n\n    );\n};\n\nTable.propTypes = {\n    loading: PropTypes.bool,\n    data: PropTypes.array,\n    totalRows: PropTypes.number,\n    pageCount: PropTypes.number,\n    page: PropTypes.number,\n    sort_by: PropTypes.string,\n    sort_dir: PropTypes.string,\n    limit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n    attributes: PropTypes.object,\n    setPage: PropTypes.func,\n    setLimit: PropTypes.func,\n    setSort: PropTypes.func,\n    searchParams: PropTypes.object,\n    openRulesModal: PropTypes.func,\n    openRoutingModal: PropTypes.func,\n    openVendorModal: PropTypes.func,\n    onStatusChange: PropTypes.func,\n};\n\nexport default Table;\n","import React, {useMemo} from \"react\";\nimport {Link, useSearchParams} from 'react-router-dom';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {CopyButton, HelpPopper, RelativeTime, Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport StatusToggler from \"../../../Components/Form/StatusToggler\";\nimport {Button, UncontrolledTooltip} from \"reactstrap\";\nimport PagedTable from \"../../../Components/Table/PagedTable\";\nimport {ChangeHistoryButton} from '../../../Providers/ChangeProvider';\n\n\nexport const SourceTokenTable = ({\n                                   data,\n                                   onEdit,\n                                   onArchive,\n                                   loading,\n                                   noDataMessage,\n                                   showSource=true,\n                                   showVendor=true,\n                                   allowEdit=true,\n                                   ...tableProps\n}) => {\n  const [searchParams] = useSearchParams();\n\n  const columns = useMemo(() => {\n\n    const optionalCols = [];\n    // Optional columns\n    // From vendors list, we are just showing tokens for one vendor, so don't show vendor column.\n    // Similar if showing this table from the sources list\n    if (showSource) {\n      optionalCols.push({\n        Header: 'Source',\n        className: 'source-cell',\n        accessor: 'source',\n        defaultCanSort: true,\n        Cell: ({value}) => (\n          <Button\n            size=\"sm\"\n            tag={Link}\n            color=\"link\"\n            className=\"inline text-start\"\n            to={`/publishing/sources/${value.id}`}\n            target=\"_blank\"\n          >\n            <EntityId id={value.id} title=\"Source ID\"/>\n            {value.name}\n          </Button>\n        ),\n      })\n    }\n\n    if (showVendor) {\n      optionalCols.push({\n        Header: 'Vendor',\n        className: 'vendor-cell',\n        accessor: 'vendor',\n        defaultCanSort: true,\n        Cell: ({value}) => (\n          <Button\n            size=\"sm\"\n            tag={Link}\n            color=\"link\"\n            className=\"inline text-start\"\n            to={`/publishing/vendors/${value.id}`}\n            target=\"_blank\"\n          >\n            <EntityId id={value.id} title=\"Vendor ID\"/>\n            {value.name}\n          </Button>\n        ),\n      })\n    }\n    return [\n      {\n      Header: 'Token',\n      id: 'token',\n      defaultCanSort: false,\n      minWidth: 130,\n      className: 'token-cell',\n      Cell: ({row}) => (\n        <TokenCell tokenId={row.original.id} label={row.original.label} description={row.original.description} token={row.original.token} />\n      ),\n    },\n      {\n        Header: 'Token Status',\n        accessor: 'status',\n        defaultCanSort: true,\n        width: 90,\n        className: 'status-cell',\n        disabledGlobalFilter: true,\n        Cell: (c) => (\n          <StatusToggler\n            status={c.value}\n            target={c.row.original}\n          />\n        ),\n        filter: (rows, colIds, filterVal) => {\n          if (Array.isArray(filterVal) && filterVal.length) {\n            return rows.filter(r => filterVal.includes(r.original.status));\n          }\n          return rows;\n        }\n      },\n      ...optionalCols,\n/*      {\n        Header: 'Token',\n        className: 'token-name-cell',\n        id: 'token-name',\n        defaultCanSort: true,\n        Cell: ({row}) => <NameCell label={row.original.label} description={row.original.description}/>\n      },*/\n\n\n      {\n        Header: 'Post Type',\n        accessor: 'post_type',\n        defaultCanSort: true,\n        width: 90,\n        disabledGlobalFilter: true,\n        Cell: (c) => <span>{Utils.titleCase(Utils.tokenToWords(c.value ?? ''))}</span>\n      },\n      {\n        Header: <>Traffic Type<HelpPopper iconClass=\"mx-1\" name={`trf-type-help`}>Tracking data indicating first party or third party traffic</HelpPopper></>,\n        headerClassName: 'nowrap',\n        accessor: 'traffic_type',\n        defaultCanSort: true,\n        width: 90,\n        disabledGlobalFilter: true,\n        Cell: (c) => <span>{Utils.titleCase(Utils.tokenToWords(c.value ?? ''))}</span>\n      },\n\n      {\n        Header: 'Last Matched',\n        accessor: 'last_matched_at',\n        maxWidth: 110,\n        defaultCanSort: true,\n        disableGlobalFilter: true,\n        Cell: ({value}) => <RelativeTime date={value}/>,\n      },\n      {\n        Header: 'Last Sold',\n        accessor: 'last_sold_at',\n        maxWidth: 110,\n        defaultCanSort: true,\n        disableGlobalFilter: true,\n        Cell: ({value}) => <RelativeTime date={value}/>,\n      },\n      {\n        Header: 'Created',\n        accessor: 'created_at',\n        defaultCanSort: true,\n        maxWidth: 110,\n        disableGlobalFilter: true,\n        Cell: ({value}) => <RelativeTime date={value}/>,\n      },\n      {\n        Header: 'Archived',\n        accessor: 'archived_at',\n        maxWidth: 110,\n        defaultCanSort: true,\n        disableGlobalFilter: true,\n        Cell: ({value}) => <RelativeTime date={value}/>,\n      },\n      {\n        Header: 'Actions',\n        id: 'actions',\n        Cell: ({row}) => <ActionCell sourceToken={row.original} searchParams={searchParams} onEdit={onEdit} allowEdit={allowEdit} />,\n        canSort: false,\n        maxWidth: 60,\n        disableGlobalFilter: true,\n        className: 'table-cell-actions',\n      },\n    ]\n  }, [searchParams, onEdit, allowEdit])\n\n\n  const initialTableState = useMemo(() => ({\n    sortBy: [{ id: 'vendor', desc: false }],\n  }), []);\n\n\n  return (\n    <div className=\"table-container\">\n\n      <PagedTable\n        columns={columns}\n        data={data}\n        initialState={initialTableState}\n        className='sources-tokens-table striped'\n        loading={loading}\n        {...tableProps}\n        noDataMessage={noDataMessage}\n      />\n    </div>\n\n  )\n}\n\n\nconst ActionCell = ({sourceToken, searchParams, onEdit, allowEdit=true}) => {\n  const name = sourceToken.label || sourceToken.token;\n  // If onEdit callback is provided (modal context), use it\n  // Otherwise use navigation (list page context)\n  if (onEdit) {\n    return (\n      <div className='list-actions'>\n        <Button\n          color='link'\n          className='action-item inline'\n          title={allowEdit ? 'Edit' : 'View'}\n          onClick={() => onEdit(sourceToken)}\n        >\n          <FaIcon icon={allowEdit ? 'cog' : 'eye'} size='1x' />\n        </Button>\n      </div>\n    )\n  }\n\n  if (allowEdit) {\n    return (\n      <div className='list-actions'>\n        <Button\n          tag={Link}\n          color='link'\n          className='action-item inline'\n          title='Edit'\n          state={{search: searchParams.toString()}}\n          to={{\n            pathname: `/publishing/source-tokens/${sourceToken.id}/edit`,\n          }}\n        >\n          <FaIcon icon='cog' size='1x' />\n        </Button>\n        <ChangeHistoryButton id={sourceToken.id} name={name} type='sourcetoken' />\n      </div>\n    )\n  }\n\n  return (\n    <div className='list-actions'>\n      <Button\n        tag={Link}\n        color='link'\n        className='action-item inline'\n        title='View'\n        state={{search: searchParams.toString()}}\n        to={{\n          pathname: `/publishing/source-tokens/${sourceToken.id}`,\n        }}\n      >\n        <FaIcon icon='eye' size='1x' />\n      </Button>\n      <ChangeHistoryButton id={sourceToken.id} name={name} type='sourcetoken' />\n    </div>\n  )\n}\n\nconst TokenCell = ({tokenId, label, description, token}) => {\n  return (\n    <>\n      <div className=\"text-break\">{label || token}</div>\n\n        {description && <small>{description}</small>}\n       <small>\n\n         <div className=\"mt-1 d-flex flex-nowrap align-items-center\" style={{borderTop:'1px solid #dee2e6'}}>\n\n           <div className=\"d-flex flex-nowrap align-items-center\">\n             {`...${token.substring(token.length - 8)}`}\n             <CopyButton\n               id={`copy-token-${tokenId}`}\n               textToCopy={token}\n               buttonSize=\"xs\"\n               title=\"Copy token\"\n               className=\"m-0  p-0\"\n             >\n               <FaIcon icon=\"copy\" size=\"sm\"/>\n             </CopyButton>\n           </div>\n\n           <div className=\"me-1\">|</div>\n           <div className=\"d-flex flex-nowrap align-items-center me-1\">\n             <Button tag={Link} color=\"link\" to={`/publishers/${token}`} size=\"xs\" target=\"_blank\" className=\"inline\" id={`link-publisher-${token}`}>\n               Instructions\n             </Button>\n             <CopyButton\n               id={`copy-publisher-link-${tokenId}`}\n               textToCopy={`${location.protocol}//${location.host}/#/publishers/${token}`}\n               buttonSize=\"xs\"\n               title=\"Copy link to instructions\"\n               className=\"m-0 p-0\"\n             >\n               <FaIcon icon=\"copy\" size=\"sm\"/>\n             </CopyButton>\n             <UncontrolledTooltip target={`link-publisher-${token}`}>\n               View publisher instructions (public link)\n             </UncontrolledTooltip>\n           </div>\n\n         </div>\n       </small>\n\n\n    </>\n  )}\n\n","import React, {useEffect, useState} from \"react\";\nimport {\n  DropdownMenu,\n  DropdownToggle,\n  UncontrolledDropdown\n} from 'reactstrap';\nimport {FilterControls, StackedFilter, TextSearch} from \"../../../Components/Table/Filter\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport { StatusChoices} from \"../../../Components/Table/FilterChoices\";\nimport FilterSummaryTags from \"../../../Components/Table/FilterSummaryTags\";\nimport {useFilters} from \"../../../Hooks/useFilters\";\nimport useApi from \"../../../Hooks/useApi\";\nimport classnames from \"classnames\";\n\n/*\n * Filtering for SourceTokens list\n * This list is displayed stand-alone as well as in modals that open from the\n * sources and vendors list.\n * When in modals, we hide the source or vendor filter depending on which page,\n * because the modal is detail for only one vendor or one source\n */\nexport const Filters = ({\n                          filters,\n                          onChange,\n                          onRefresh,\n                          loading = false,\n                          showVendors = true,\n                          showSources = true,\n                 }) => {\n  const {api} = useApi();\n  const [choices, setChoices] = useState({});\n  const {onChangeFilter, reset, clearFilter, clearSearch} = useFilters(filters, onChange)\n\n  // load choices\n  useEffect(() => {\n    const getChoices = async () => {\n\n      const vendors = await api.endpoints.vendors.list({limit:0});\n      const sources = await api.endpoints.sources.list({options:true});\n      if (vendors && sources) {\n        setChoices({\n          vendor: vendors.data.map((item) => ({ value: item.id, label: item.name })),\n          source: sources.map((item) => ({ value: item.id, label: item.name })),\n          status: StatusChoices,\n          traffic_type: [\n            { value: 'first_party', label: 'First Party' },\n            { value: 'third_party', label: 'Third Party' },\n          ],\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n\n  return (\n    <>\n\n\n    <div className=\"position-relative\">\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n\n      <div className=\"d-flex align-items-center\">\n        <div className=\"d-flex\">\n          <div className=\"boxed-filter new-boxed-filter search-filter me-2\">\n            <TextSearch\n              value={filters.search}\n              placeholder={'Search...'}\n              onUpdate={(val) => onChangeFilter(\"search\", val)}\n              onClear={clearSearch}\n              autofocus\n            />\n          </div>\n\n          <UncontrolledDropdown  className=\"simple-filters-dropdown me-2\">\n\n            <DropdownToggle  caret className=\"boxed-filter new-boxed-filter filter-group-dropdown\">\n              <FaIcon icon=\"filter\" size=\"1x\" className=\"fa-icons\" />\n            </DropdownToggle>\n\n            <DropdownMenu className=\"select-filters-dropdown animate dropDown\">\n              {showSources && (\n                <StackedFilter\n                  label=\"Source\"\n                  placeholder=\"Any Source\"\n                  param=\"source\"\n                  options={choices.source ?? []}\n                  value={filters.source || ''}\n                  onChange={onChangeFilter}\n                  isMulti={false}\n                />\n              )}\n\n              {showVendors && (\n                <StackedFilter\n                  label=\"Vendor\"\n                  placeholder=\"Any Vendor\"\n                  param=\"vendor\"\n                  options={choices.vendor ?? []}\n                  value={filters.vendor || ''}\n                  onChange={onChangeFilter}\n                  isMulti={false}\n                />\n              )}\n\n\n              <StackedFilter\n                placeholder=\"Active/Paused\"\n                label=\"Status\"\n                param=\"status\"\n                options={choices.status ?? []}\n                value={filters.status ?? []}\n                onChange={onChangeFilter}\n                isMulti={true}\n              />\n\n              <StackedFilter\n                placeholder=\"Traffic Type\"\n                label=\"Traffic Type\"\n                param=\"traffic_type\"\n                options={choices.traffic_type ?? []}\n                value={filters.traffic_type ?? \"\"}\n                onChange={onChangeFilter}\n                isMulti={false}\n              />\n            </DropdownMenu>\n\n          </UncontrolledDropdown>\n\n          <FilterControls\n            onRefresh={onRefresh}\n          />\n\n        </div>\n\n      </div>\n\n    </div>\n\n      <FilterSummaryTags\n        choices={choices}\n        filters={filters}\n        filterKeys={['source', 'vendor',  'status', 'traffic_type']}\n        onRemoveFilter={clearFilter}\n        onClear={reset}\n        isLoading={loading}\n        isPendingApply={false}\n      />\n\n    </>\n  )\n}\n\n","import { useEffect,useState, useMemo, useRef } from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport { filtersToQueryString, queryStringToFilters } from '../Components/Table/queryString';\n\n\nconst DefaultControls = {\n  page: 1,\n  limit: 20,\n  sort_by: '',\n  sort_dir: '',\n};\n\nconst DefaultOptions = {\n  // Read and set query string\n  // In some cases we use this hook in a secondary table (like change log)\n  // and don't want to alter the query string\n  useQueryString: false,\n\n  useTableControls: true,// track page, limit, sort values\n  urlDateFormat: undefined,\n  // Options for the query string parser\n  // Safer to leave IDs as strings because some form elements always return value as string\n  parseOptions: {parseNumbers: false},\n  zeroPageIndex: true,\n  allowedFilters: []\n};\n\n\n/*\n * Hook for maintaining table state.\n * Keeps state of any and all filters as well as controls for page, limit, sort, etc.\n * Optionally updates the query string with the current state, or responds to query string\n * changes such as back button.\n *\n * Note: it's useful to keep table \"controls\" (page, limit, etc) separate from filters\n * because different components handle them.\n */\nconst useTableState = (\n  initialFilters = {},\n  initialControls = {},\n  options = {}\n) => {\n\n  const navigate = useNavigate();\n  const location = useLocation();\n  const lastSearch = useRef(location.search);\n  options = { ...DefaultOptions, ...options };\n\n  const cleanFilters = (filters) => {\n    if (options.allowedFilters && options.allowedFilters.length) {\n      filters = {...filters};\n      options.allowedFilters.forEach( f => {\n        if (typeof filters[f] !== 'undefined') {\n          delete filters[f]\n        }\n      })\n    }\n    return filters;\n  }\n\n  const stateFromQueryString = () => {\n    const qsData = queryStringToFilters(location.search || {}, options.urlDateFormat, options.parseOptions);\n    let{\n      page, limit, sort_by, sort_dir, ...filters\n    } = qsData;\n    if (!filters || !Object.keys(filters).length) filters = initialFilters;\n\n    filters = cleanFilters(filters);\n\n    let controls = {};\n    if (options.useTableControls) {\n      controls = {...DefaultControls, ...initialControls,};\n      if (page) {\n        controls.page = page;\n      }\n      if (sort_by) {\n        controls.sort_by = sort_by;\n      }\n      if (sort_dir) {\n        controls.sort_dir = sort_dir\n      }\n      if (limit) {\n        controls.limit = limit;\n      }\n    }\n\n    return {\n      filters,\n      filterArray: Object.entries(filters).map(([id, value]) => {\n        return {id, value}\n      }),\n      controls}\n  }\n\n  const [state, setState] = useState(() => stateFromQueryString())\n\n  // targetQuery:\n  // Current filters and controls turned into a query string.\n  // Used to update the browser location as needed (if configured to do so)\n  // Can also be monitored by the consuming component to know when to update data\n  const targetQuery = useMemo(() => {\n    let qsData = { ...state.filters };\n    delete qsData.diffInMinutes;\n    if (options.useTableControls) {\n      qsData = {...qsData, ...state.controls};\n    }\n    return filtersToQueryString(qsData, options.urlDateFormat);\n  }, [state])\n\n  //console.group()\n  //console.log('usePagedTableState2.js:state', state)\n  //console.log('usePagedTableState2.js:targetQuery', targetQuery);\n  //console.groupEnd();\n\n\n\n  const setFilters = (filters) => {\n    filters = cleanFilters(filters);\n\n    setState((old) => {\n      const newState = {\n        ...old,\n        filters,\n        filterArray: filtersToArray(filters)\n      }\n      if (options.useTableControls) {\n        newState.controls.page = 1;\n      }\n      return newState;\n    })\n  }\n\n  // React table filter state is an array of {id, value}\n  const filtersToArray = (f) => {\n    return Object.entries(f).map(([id, value]) => {\n      return {id, value}\n    })\n  }\n\n  const setPagination = (pagination) => {\n    //console.log('usePagedTableState2.js:update Pagination', pagination);\n    const p = {\n      page: pagination.pageIndex + 1 ,\n      limit: pagination.pageSize\n    }\n    setState((old) => {\n      return {\n        ...old,\n        controls: {...old.controls, ...p}\n      }\n    })\n  }\n\n  const getPagination = () => {\n    return {\n      pageIndex: options.zeroPageIndex ? state.controls.page-1 : state.controls.page,\n      pageSize: state.controls.limit\n    }\n  }\n\n  //const handleSetSortBy = (sort_by) => setState((old) => {\n  //       return {...old, controls: {...old.controls, ...sort_by}}\n  //     });\n  //const handleSetSortDir = (sort_dir) => setState((old) => {\n  //       return {...old, controls: {...old.controls, ...sort_dir}}\n  //     });\n  // const handleSetLimit = (limit) => setState((old) => {\n  //       return {...old, controls: {...old.controls, ...limit}}\n  //     });\n\n  // Used for ReactTable onSort event which sets both field and direction\n  // arg is array: [{id:\"purchased_at\", desc:false}]\n  // We are assuming it's not multisort since we config the tables multisort=false\n  const setSorting = (rtSort) => {\n\n    const sort = {};\n    if (rtSort && rtSort.length) {\n      sort.sort_by = rtSort[0].id;\n      sort.sort_dir = rtSort[0].desc ? 'desc' : 'asc';\n    }\n    setState((old) => {\n      return {...old, controls: {...old.controls, ...sort}}\n    })\n  };\n\n  const getSorting = () => {\n    return [{id:state.controls.sort_by, desc: state.controls.sort_dir === 'desc'}]\n  }\n\n\n  // Handle change of location or target\n  useEffect(() => {\n    //console.log(\"useTableState.js useEffect targetQuery, location.search\", targetQuery, location.search);\n    if (options.useQueryString) {\n      if (location.search !== lastSearch.current) {\n        // The query string changed (for example, user clicked the back button)\n        // Derive the new state from the query string\n        //console.log('usePagedTableState2.js:useEffect SEARCH CHANGED', `old:\"${lastSearch.current}\", new:\"${location.search}\"`);\n        lastSearch.current = location.search;\n        setState(stateFromQueryString());\n      } else if (targetQuery !== location.search) {\n        // The state changed (filters and/or controls), so update the query string\n        //console.log('usePagedTableState2.js: useEffect NAVIGATING to:', `targetQuery:\"${targetQuery}\", from location.search:\"${location.search}\"`);\n        // Use navigate \"replace\" if there is no current query string.\n        // This is because landing on \"/my-list\" may immediately be updated with default params \"/my-list?page=1&...\"\n        // and we don't want two history entries (then you would have to \"back\" through both)\n        navigate(targetQuery, {replace: location.search === \"\"})\n      }\n    }\n\n  }, [targetQuery, location.search]);\n\n  const reset = (resetTo = {}) => {\n    const filters = {...initialFilters, ...resetTo};\n    setState({\n      filters,\n      filterArray:filtersToArray(filters),\n      controls: {...DefaultControls, ...initialControls},\n    })\n  };\n\n  return {\n    filters:state.filters,\n    controls:state.controls,\n    filterArray: state.filterArray,\n    setFilters,\n    reset,\n    setPagination,\n    pagination: getPagination(),\n    setSorting,\n    sorting:getSorting(),\n    query: targetQuery,\n  };\n};\n\nexport default useTableState;\n","import React, {useState, useEffect} from \"react\"\nimport {\n  Button, Modal, ModalHeader, ModalBody\n} from 'reactstrap'\nimport useApi from \"../../../../Hooks/useApi\"\nimport usePermission from \"../../../../Hooks/usePermission\"\nimport {SourceTokenTable, SourceTokenForm, Filters} from \"../../SourceToken\"\nimport useTableState from \"../../../../Hooks/useTableState\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\"\n\nconst DefaultControls = {\n  limit: 20,\n  sort_by: 'created_at',\n  sort_dir: 'desc',\n};\n\n/*\n * Modal that lists vendors related to sources (via a token).\n * Allows editing and adding tokens\n */\nconst Vendors = ({source, isOpen, close}) => {\n  if(!source) return null\n  const {api} = useApi()\n  const allowTokenEdit = usePermission('source_tokens.edit')\n  const allowTokenCreate = usePermission('source_tokens.create')\n  const {\n    filters, setFilters,  query, controls\n  } = useTableState(\n    {source:source.id},\n    DefaultControls,\n    { useQueryString: false, useTableControls: true },\n  )\n  const [isLoading, setIsLoading] = useState(true)\n  const [tokens, setTokens] = useState([])\n  const [pageCount, setPageCount] = useState(1)\n  const [totalRows, setTotalRows] = useState(0)\n  const [selectedToken, setSelectedToken] = useState(null)\n  const [refreshOnClose, setRefreshOnClose] = useState(false)\n\n\n  useEffect(() => {\n    if (isOpen) {\n      load()\n    }\n    return () => {\n      setTokens([]);\n    }\n  }, [isOpen, source, query])\n\n  const load = async() => {\n    setIsLoading(true);\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls\n    const result = await api.endpoints.sourceTokens.list({\n      source: source.id,\n      ...filters,\n      page,\n      sort_by,\n      sort_dir,\n      limit,\n    });\n\n    if (result) {\n      const { limit, total, data } = result\n      setTokens(data)\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1)\n      setTotalRows(total)\n    }\n    setIsLoading(false)\n  }\n\n\n  const archive = async(sourceToken) => {\n    setIsLoading(true)\n    const result = await api.endpoints.sourceTokens.update({id:sourceToken.id, status:'archived'})\n    if (result) {\n      load()\n    }\n    setIsLoading(false);\n  }\n\n\n  const onCloseForm = (refresh) => {\n    if (refresh === true) { // could be click event\n      load()\n    }\n    setSelectedToken(null);\n  }\n\n  const onAdd = () => {\n    setSelectedToken({\n      id: 0,\n      token: \"\",\n      seed_data: null,\n      status: 'active',\n      source: source,\n      vendor: {id:0, name:''}\n    })\n  }\n\n  const onCloseModal = () => {\n    setSelectedToken(null)\n    close(refreshOnClose);\n  }\n  const onEdit = (sourceToken=null) => {\n    setSelectedToken(sourceToken)\n  }\n\n  const handleUpdateTokenSuccess = () => {\n    setRefreshOnClose(true)\n    load()\n  }\n\n\n  return (\n    <Modal isOpen={isOpen} toggle={onCloseModal} size=\"xlg\" id=\"source-vendor-modal\" scrollable>\n        <ModalHeader toggle={onCloseModal}>\n          {selectedToken?.id > 0 && <Button color=\"link\" size=\"sm\" className=\"inline me-1\" onClick={onCloseForm}>\n            <FaIcon icon=\"arrow-left\" />\n          </Button>\n          }\n          {selectedToken ? (selectedToken.id > 0 ? 'Edit Source Token' : 'Create Source Token') : 'Source Tokens for Source'}\n        </ModalHeader>\n        <div className=\"modal-subheader\">{source.name}</div>\n\n          {selectedToken ? (\n            <SourceTokenForm\n              source={source}\n              sourceToken={selectedToken}\n              close={onCloseForm}\n              onSuccess={handleUpdateTokenSuccess}\n              isModal\n              readOnly={selectedToken.id ? !allowTokenEdit : !allowTokenCreate}\n            />\n          ) : (\n            <ModalBody>\n                <div className=\"source-vendors above-table-filters d-block flex-fill mb-2\">\n                  <Filters\n                    filters={filters}\n                    onChange={setFilters}\n                    onRefresh={load}\n                    loading={isLoading}\n                    showVendors={false}\n                  />\n                </div>\n\n\n              {allowTokenCreate && (\n                <div className=\"text-end\">\n                  <Button\n                    size=\"sm\"\n                    onClick={onAdd}\n                    className=\"ms-2\"\n                  >\n                    <FaIcon icon=\"plus\" size=\"sm\"/> Add Token\n                  </Button>\n                </div>\n              )}\n\n              <SourceTokenTable\n                showSource={false}\n                data={tokens}\n                loading={isLoading}\n                noDataMessage=\"No source tokens were found\"\n                onEdit={onEdit}\n                onArchive={allowTokenEdit ? archive : undefined}\n                allowEdit={allowTokenEdit}\n                pageCount={pageCount}\n                totalRows={totalRows}\n                {...controls}\n              />\n            </ModalBody>\n          )}\n\n      </Modal>\n  )\n}\n\nexport default Vendors\n\n","import React, { useEffect, useState } from 'react';\nimport { DropdownMenu, DropdownToggle, UncontrolledDropdown } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { TextSearch, StackedFilter } from '../../../Components/Table/Filter';\nimport { StatusChoices, ProductChoices } from '../../../Components/Table/FilterChoices';\nimport FilterSummaryTags from \"../../../Components/Table/FilterSummaryTags\";\nimport useApiBatch from '../../../Hooks/useApiBatch';\nimport RightDateAndControls from '../../../Components/Table/RightDateAndControls';\nimport {useFilters} from \"../../../Hooks/useFilters\";\n\nconst Filters = ({\n  filters, onChange, onRefresh, loading = false,\n}) => {\n  const batcher = useApiBatch();\n  const [choices, setChoices] = useState({});\n  const {onChangeFilter, reset, clearFilter, clearSearch} = useFilters(filters, onChange)\n\n  // load choices\n  useEffect(() => {\n    const getChoices = async () => {\n      const batches = await batcher.fetch([\n        //{ endpoint: 'vendors', action: 'list', params: { limit: 0 }  },\n        { endpoint: 'verticals', action: 'list' },\n        { endpoint: 'channels', action: 'list', params: { options: 1 } },\n      ]);\n      if (batches && batches.length) {\n        const [verticals, channels] = batches;\n        setChoices({\n          status: StatusChoices,\n          product: ProductChoices,\n         // vendors: vendors.data.map((item) => ({ value: item.id.toString(), label: item.name })),\n          vertical: verticals.map((item) => ({ value: item.id, label: item.display_name })),\n          channel: channels.map((item) => ({ value: item.id, label: item.name })),\n\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n\n  return (\n    <div className=\" position-relative\">\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n      <div className=\"d-flex justify-content-between\">\n        <div className=\"status-filters d-flex\">\n\n          <div className=\"boxed-filter new-boxed-filter search-filter me-3\">\n            <TextSearch\n              value={filters.search || ''}\n              placeholder=\"Search by source name or token\"\n              onUpdate={(val) => onChangeFilter('search', val)}\n              onClear={clearSearch}\n              delay={500}\n            />\n          </div>\n\n          {/* Use of  inNavbar={true} disables popper and allows application of '.dropDown' animation class to menu */}\n          <UncontrolledDropdown  className=\"simple-filters-dropdown me-2\">\n\n            <DropdownToggle  caret className=\"boxed-filter new-boxed-filter filter-group-dropdown\">\n              <FaIcon icon=\"filter\" size=\"1x\" className=\"fa-icons\" />\n            </DropdownToggle>\n\n            <DropdownMenu className=\"select-filters-dropdown animate dropDown\">\n\n              <div className=\"modal-body\">\n                <StackedFilter\n                  placeholder=\"Any Vertical\"\n                  label=\"Vertical\"\n                  param=\"vertical\"\n                  options={choices.vertical || []}\n                  value={filters.vertical || ''}\n                  onChange={onChangeFilter}\n                  isMulti={false}\n                />\n\n                <StackedFilter\n                  placeholder=\"Any product\"\n                  label=\"Product\"\n                  param=\"product\"\n                  options={choices.product || []}\n                  value={filters.product || []}\n                  onChange={onChangeFilter}\n                  isMulti\n                />\n\n                <StackedFilter\n                  placeholder=\"Any channel\"\n                  label=\"Channel\"\n                  param=\"channel_id\"\n                  options={choices.channel || []}\n                  value={filters.channel_id || []}\n                  onChange={onChangeFilter}\n                  isMulti={false}\n                />\n\n                <StackedFilter\n                  placeholder=\"Any status\"\n                  label=\"Status\"\n                  param=\"status\"\n                  options={choices.status || []}\n                  value={filters.status || []}\n                  onChange={onChangeFilter}\n                  isMulti\n                />\n\n              </div>\n\n            </DropdownMenu>\n          </UncontrolledDropdown>\n\n        </div>\n\n        <RightDateAndControls\n          onChangeDate={null}\n          onRefresh={onRefresh}\n          onReset={reset}\n        />\n      </div>\n\n      <FilterSummaryTags\n        choices={choices}\n        filters={filters}\n        filterKeys={Object.keys(filters)}\n        onRemoveFilter={clearFilter}\n        onClear={reset}\n        isLoading={false}\n        isPendingApply={false}\n      />\n\n    </div>\n\n  );\n};\n\nFilters.propTypes = {\n  filters: PropTypes.object,\n  onChange: PropTypes.func,\n  onRefresh: PropTypes.func,\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  loading: PropTypes.bool,\n};\n\nexport default Filters;\n","import React, { useEffect, useState } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { Button } from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport Table from './Table';\nimport Vendors from \"./Source/Vendors\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport FilterBar from '../../../Components/Table/FilterBar';\nimport Filters from './Filters';\nimport DocTitle from '../../../Layout/DocTitle';\nimport usePagedTableState from '../../../Hooks/usePagedTableState';\nimport useApi from '../../../Hooks/useApi';\nimport usePermission from '../../../Hooks/usePermission';\nimport {Modal as RoutingRulesModal} from '../../Routing/Rules';\nimport RoutingMapModal from \"../../Routing/Mapper/Modal\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\nconst DefaultFilters = {\n}\n\nconst DefaultControls = {\n  limit: 50,\n  sort_by: 'name',\n  sort_dir: 'asc',\n}\n\n/*\n * Sources List - paged table with filters\n *\n */\nconst SourceList = () => {\n  const navigate = useNavigate();\n  const [searchParams] = useSearchParams();\n  const {\n    filters, setFilters, controls, updateQuery,\n  } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: true, useTableControls: true },\n  );\n  const [data, setData] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const [rulesModalOpen, setRulesModalOpen] = useState(false);\n  const [vendorModalOpen, setVendorModalOpen] = useState(false);\n  const [selectedSource, setSelectedSource] = useState(null);\n  const [routingMapId, setRoutingMapId] = useState(null);\n  const apiList = useApi('sources', 'list');\n  const apiUpdate = useApi('sources', 'update');\n  const allowView = usePermission('sources.view');\n  const allowCreate = usePermission('sources.create');\n  const allowEdit = usePermission('sources.edit');\n\n  useChangeTimeline({\n    entityTypes: ['source', 'sourcetoken', 'routingrule'],\n    parentFilters: filters,\n  });\n\n  useEffect(() => {\n    if (!loading) {\n      load();\n    }\n\n  }, [filters, controls.sort_by, controls.sort_dir, controls.page, controls.limit])\n\n  const openRoutingModal = (sourceId) => setRoutingMapId(sourceId)\n  const closeRoutingModal = () => setRoutingMapId(null)\n  const closeVendorModal = (refresh) => {\n    if (refresh === true) {\n      load()\n    }\n    setVendorModalOpen(false);\n  }\n\n  const load = async () => {\n\n    setLoading(true)\n    updateQuery()\n\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls;\n\n    const params = {...filters}\n    if (params.vertical) {\n      params.vertical_id = params.vertical\n      delete params.vertical\n    }\n\n    const result = await apiList.fetch({\n      ...params,\n      page,\n      sort_by,\n      sort_dir,\n      limit,\n    })\n\n    if (result) {\n      const { limit, total, data } = result // row:0, page:1, limit:20, data:[]\n      setData(data)\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1)\n      setTotalRows(total)\n    } else {\n      notify(`Unable to load sources: ${apiList.error?.name}`, 'error')\n    }\n\n    setLoading(false)\n  };\n\n  const onAdd = () => {\n    navigate('/publishing/sources/create', {\n      state: { search: searchParams.toString() },\n    });\n  };\n\n  const openVendorModal = (source) => {\n    setSelectedSource(source)\n    setVendorModalOpen(true)\n  };\n\n  const openRulesModal = (source) => {\n    setSelectedSource(source)\n    setRulesModalOpen(true)\n  };\n\n  const closeRulesModal = () => setRulesModalOpen(false)\n\n  const handleStatusChange = async (source, status) => {\n    if (source && allowEdit) {\n      // send status along with required form fields\n      const result = await apiUpdate.fetch(\n        {\n          id: source.id,\n          name: source.name,\n          product: source.product,\n          vertical_id: source.vertical.id,\n          status,\n        },\n      )\n      if (result) {\n        // update the existing list data with the inline change\n        setData((prev) => prev.map((src) => (src.id === source.id ? result : src)))\n      } else {\n        notify(`Unable to update status: ${apiUpdate.error?.name}`, 'error')\n      }\n      return Boolean(result)\n    }\n    return false;\n  };\n\n  if (!allowView) return (null)\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Sources\" />\n\n      <FilterBar>\n        <Filters filters={filters} onChange={setFilters} onRefresh={() => load()} loading={loading} />\n      </FilterBar>\n\n      <PageSection\n        title=\"Sources\"\n        className=\"overflow-section\"\n        tools={allowCreate === true ? (\n          <Button\n            className=\"ms-auto\"\n            onClick={onAdd}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            New Source\n          </Button>\n        ) : (null)}\n      >\n\n        <Table\n          data={data}\n          loading={loading}\n          pageCount={pageCount}\n          totalRows={totalRows}\n          showObject={false}\n          {...controls}\n          onStatusChange={handleStatusChange}\n          searchParams={searchParams}\n          openRulesModal={openRulesModal}\n          openRoutingModal={openRoutingModal}\n          openVendorModal={openVendorModal}\n        />\n\n        {selectedSource && (\n          <RoutingRulesModal\n            entityType=\"source\"\n            entity={selectedSource}\n            isOpen={rulesModalOpen}\n            close={closeRulesModal}\n          />\n\n        )}\n\n        {selectedSource && (\n            <Vendors\n              source={selectedSource}\n              isOpen={vendorModalOpen}\n              close={closeVendorModal}\n            />\n        )}\n\n\n      </PageSection>\n\n\n      <RoutingMapModal\n        isOpen={Boolean(routingMapId)}\n        toggle={closeRoutingModal}\n        sourceId={routingMapId}\n      />\n\n    </>\n  );\n};\n\nexport default SourceList;\n","import React from 'react';\nimport {useNavigate, useLocation} from 'react-router-dom';\nimport usePermission from '../../../Hooks/usePermission';\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport Breadcrumbs from \"../../../Layout/Breadcrumbs\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport Source from \"./Source\";\n\nconst SourceCreate = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const allowCreate = usePermission('sources.edit');\n\n  const handleClose = () => {\n    navigate({\n      pathname: '/publishing/sources',\n      search: location.state?.search ?? '',\n    }, {replace: false});\n  };\n\n  const handleSuccess = () => {\n    handleClose();\n  };\n\n  if (!allowCreate) {\n    return null;\n  }\n\n  const newSource = {\n    id: 0,\n    name: '',\n    description: '',\n    product: '',\n    status: 'active',\n    vertical: { id: 0, name: '' },\n    phone_number: '',\n    phone_numbers: [],\n    required_fields: [],\n    seed_data: null,\n    click_tags: [],\n    vendor_billable_duration: null,\n  };\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Create Source\" />\n\n      <Breadcrumbs crumbs={[\n        {label: \"Publishing\"},\n        {label: \"Sources\", to: {\n            pathname: '/publishing/sources',\n            search: location.state?.search ?? '',\n          }},\n        {label: \"Create\"},\n      ]}/>\n\n      <PageSection\n        title=\"Create Source\"\n      >\n        <Source\n          source={newSource}\n          cancel={handleClose}\n          onSuccess={handleSuccess}\n          isModal={false}\n        />\n      </PageSection>\n    </>\n  );\n};\n\nexport default SourceCreate;\n","import React, {useState, useEffect, useMemo} from 'react';\nimport {useNavigate, useLocation, useParams, Link} from 'react-router-dom';\nimport {Button} from 'reactstrap';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components\";\nimport useApi from \"../../../Hooks/useApi\";\nimport usePermission from '../../../Hooks/usePermission';\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport Breadcrumbs from \"../../../Layout/Breadcrumbs\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport Source from \"./Source\";\nimport LoaderDots from \"../../../Layout/LoaderDots\";\n\nconst SourceEdit = () => {\n  const {id} = useParams();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const {api} = useApi();\n  const [source, setSource] = useState(null);\n  const [isLoading, setIsLoading] = useState(true);\n  const allowEdit = usePermission('sources.edit');\n  const allowViewRouting = usePermission('routing.view');\n  useChangeTimeline({\n    entityTypes: ['source'],\n    parentFilters: {},\n    entity: source ? { id: source.id, name: source.name, type: 'source' } : undefined,\n  });\n\n  useEffect(() => {\n    if (allowEdit) {\n      load();\n    }\n  }, [id, allowEdit]);\n\n  const load = async () => {\n    setIsLoading(true);\n    const result = await api.endpoints.sources.show(id);\n    if (result) {\n      setSource(result);\n    } else {\n      notify(`Unable to load source: ${api.error?.name || 'Unknown error'}`, 'error');\n      handleClose();\n    }\n    setIsLoading(false);\n  };\n\n  const handleClose = () => {\n    navigate({\n      pathname: '/publishing/sources',\n      search: location.state?.search ?? '',\n    }, {replace: false});\n  };\n\n  const handleSuccess = () => {\n    handleClose();\n  };\n\n  const crumbs = useMemo(() => {\n    if (source) {\n      return [\n        {label: \"Publishing\"},\n        {label: \"Sources\", to: {\n            pathname: '/publishing/sources',\n            search: location.state?.search ?? '',\n          }},\n        {label: source.name, to: `/publishing/sources/${source.id}`},\n        {label: \"Edit\"},\n      ]\n    }\n    return []\n  }, [source, location.state]);\n\n  if (!allowEdit) {\n    return null;\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Edit Source\" />\n\n      <Breadcrumbs crumbs={crumbs} />\n\n      <PageSection\n        title=\"Edit Source\"\n        subtitle={source ? source.name : ''}\n        tools={\n          allowViewRouting && (\n            <Button\n              size=\"sm\"\n              tag={Link}\n              to={`/routing/source/${source?.id}/rules`}\n            >\n              Routing Rules\n            </Button>\n          )\n        }\n      >\n        <LoaderDots active={isLoading} width={120} className=\"my-3\" />\n\n        {source && (\n          <Source\n            source={source}\n            cancel={handleClose}\n            onSuccess={handleSuccess}\n            isModal={false}\n          />\n        )}\n      </PageSection>\n    </>\n  );\n};\n\nexport default SourceEdit;\n","import React, { useEffect, useState, useMemo } from 'react';\nimport { useParams, useLocation, useNavigate, Link } from 'react-router-dom';\nimport { Row, Col, FormGroup, Label, Button } from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport DocTitle from '../../../Layout/DocTitle';\nimport { notify, RelativeTime, JsonDisplay } from '@thedmsgroup/mastodon-ui-components';\nimport { titleCaseWord } from '@thedmsgroup/mastodon-ui-components/lib/utils/string';\nimport Breadcrumbs from '../../../Layout/Breadcrumbs';\nimport LoaderDots from '../../../Layout/LoaderDots';\nimport usePermission from '../../../Hooks/usePermission';\nimport useApi from '../../../Hooks/useApi';\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\nimport NumberFormat from 'react-number-format';\n\nconst SourceShow = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const { id } = useParams();\n  const [loading, setLoading] = useState(true);\n  const [source, setSource] = useState(null);\n  const { api } = useApi();\n  const allowView = usePermission('sources.view');\n  const allowEdit = usePermission('sources.edit');\n  const allowViewRouting = usePermission('routing.view');\n  useChangeTimeline({\n    entityTypes: ['source'],\n    parentFilters: {},\n    entity: source ? { id: source.id, name: source.name, type: 'source' } : undefined,\n  });\n\n  if (!allowView) return null;\n\n  useEffect(() => {\n    if (!source) {\n      load();\n    }\n  }, []);\n\n  const load = async () => {\n    const result = await api.endpoints.sources.show(id);\n\n    if (result) {\n      setSource(result);\n    } else {\n      notify(`Unable to load source: ${api.error ? api.error.name : ''}`, 'error');\n      navigate(\n        {\n          pathname: '/publishing/sources',\n          search: location.state?.search ?? '',\n        },\n        { replace: false }\n      );\n    }\n\n    setLoading(false);\n  };\n\n  const crumbs = useMemo(() => {\n    if (source) {\n      return [\n        {label: 'Publishing'},\n        {\n          label: 'Sources',\n          to: {\n            pathname: '/publishing/sources',\n            search: location.state?.search ?? '',\n          },\n        },\n        { label: source.name },\n      ];\n    }\n    return [];\n  }, [source, location.state?.search]);\n\n  const phoneCount = source?.phone_numbers ? source.phone_numbers.length : 0;\n\n  return (\n    <>\n      <DocTitle pageTitle={`Source Details - ${source?.name ?? ''}`} />\n      <Breadcrumbs crumbs={crumbs} />\n      <PageSection\n        title=\"Source\"\n        subtitle={source?.name ?? ''}\n        tools={\n          <>\n            {allowViewRouting && (\n              <Button\n                size=\"sm\"\n                tag={Link}\n                to={`/routing/source/${source?.id}/rules`}\n                className=\"me-2\"\n              >\n                Routing Rules\n              </Button>\n            )}\n            {allowEdit && (\n              <Button\n                size=\"sm\"\n                tag={Link}\n                to={{\n                  pathname: `/publishing/sources/${source?.id}/edit`,\n                }}\n                state={{ search: location.state?.search ?? '' }}\n              >\n                Edit\n              </Button>\n            )}\n          </>\n        }\n      >\n        <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n        {source !== null && (\n          <>\n            <Row>\n              <Col sm={12} md={8} lg={5}>\n                <div className=\"d-flex gap-4\">\n                  <FormGroup>\n                    <Label>ID</Label>\n                    <div>{source.id}</div>\n                  </FormGroup>\n                  <FormGroup>\n                    <Label>Created</Label>\n                    <div>\n                      <RelativeTime date={source.inserted_at} showTimezone={true} />\n                    </div>\n                  </FormGroup>\n                  <FormGroup>\n                    <Label>Modified</Label>\n                    <div>\n                      <RelativeTime date={source.modified_at} showTimezone={true} />\n                    </div>\n                  </FormGroup>\n                </div>\n\n                <FormGroup>\n                  <Label>Name</Label>\n                  <div>{source.name ?? ''}</div>\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>Description</Label>\n                  <div>{source.description || <i>None</i>}</div>\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>Product</Label>\n                  <div>{source.product ? titleCaseWord(source.product) : <i>None</i>}</div>\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>Vertical</Label>\n                  <div>\n                    {source.vertical?.display_name || source.vertical?.name || <i>None</i>}\n                  </div>\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>Status</Label>\n                  <div>{source.status ? titleCaseWord(source.status) : <i>None</i>}</div>\n                </FormGroup>\n\n                {source.product === 'calls' && (\n                  <>\n                    <FormGroup>\n                      <Label>Phone Numbers</Label>\n                      {phoneCount > 0 ? (\n                        <ul className=\"phone-number-list\">\n                          {source.phone_numbers.map((phone, i) => (\n                            <li key={i}>\n                              <NumberFormat\n                                value={phone.phone_number}\n                                displayType=\"text\"\n                                format=\"+###########\"\n                              />\n                            </li>\n                          ))}\n                        </ul>\n                      ) : (\n                        <div>\n                          <i>No phone numbers assigned</i>\n                        </div>\n                      )}\n                    </FormGroup>\n\n                    <FormGroup>\n                      <Label>Vendor Billable Duration</Label>\n                      <div>\n                        {source.vendor_billable_duration\n                          ? `${source.vendor_billable_duration} seconds`\n                          : <i>None</i>}\n                      </div>\n                    </FormGroup>\n                  </>\n                )}\n\n                <FormGroup>\n                  <Label>Seed Data</Label>\n                  <div>\n                    {source.seed_data && Object.keys(source.seed_data).length > 0 ? (\n                      <JsonDisplay data={source.seed_data} scrollable height=\"200px\" />\n                    ) : (\n                      <i>None</i>\n                    )}\n                  </div>\n                </FormGroup>\n              </Col>\n            </Row>\n\n            <Row>\n              <Col sm={12} md={8}>\n                <FormGroup>\n                  <Label>Required Fields</Label>\n                  <div>\n                    {source.required_fields && source.required_fields.length > 0 ? (\n                      <ul>\n                        {source.required_fields.map((field, i) => (\n                          <li key={i}>\n                            {field.field}\n                            {/* Recommended fields live in the same list but are not enforced */}\n                            {field.recommended && <span className=\"text-muted\"> (recommended)</span>}\n                          </li>\n                        ))}\n                      </ul>\n                    ) : (\n                      <i>None</i>\n                    )}\n                  </div>\n                </FormGroup>\n\n                {source.product === 'clicks' && source.click_tags && (\n                  <FormGroup>\n                    <Label>Click Tags</Label>\n                    <div>\n                      {source.click_tags.length > 0 ? (\n                        <ul>\n                          {source.click_tags.map((tag, i) => (\n                            <li key={i}>{tag}</li>\n                          ))}\n                        </ul>\n                      ) : (\n                        <i>None</i>\n                      )}\n                    </div>\n                  </FormGroup>\n                )}\n              </Col>\n            </Row>\n          </>\n        )}\n      </PageSection>\n    </>\n  );\n};\n\nexport default SourceShow;\n","import React, {useMemo} from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n//import {UncontrolledTooltip} from \"reactstrap\";\nimport { IconData } from './constants';\n\n/*\n * Show icons in a table cell describing aspects of an entity's routing rules.\n * Routing rules have a 'summary' field which is an array of strings.\n * It is derived from scanning all rules in a tree.\n * Note, because it is based on all rules, you can get contradictory values,\n * such as both 'include' and 'exclude' if rules have different flow control settings.\n * Here we just show one icon indicating a flow control setting exists.\n *\n * This icon component is NOT for each rule in the full rule tree. See RuleIcons\n */\nconst RoutingRuleIconTableCell = ({ruleId, summary, onOpenRules}) => {\n\n\n  const iconData = useMemo(() => {\n\n    return summary.map((item) => {\n      switch(item) {\n        case 'sale_caps':\n        case 'match_caps':\n          return IconData['sale_match_caps'];\n        case 'include':\n        case 'exclude':\n          return IconData['flow_control'];\n        case 'absolute':\n          return IconData['payout'];\n        case 'modifier':\n          return IconData['margin'];\n        case 'match_conditions':\n          return IconData[item];\n        default:\n          return null;\n      }\n    }).filter(i => i)\n  }, [])\n\n  return (\n    <span className=\"table-rule-icons rule-tree-icons\">\n      {iconData.map( (icon,i) => (\n        <div className=\"table-tag\" key={i} onClick={onOpenRules}>\n          <div>\n            <FaIcon\n              id={`tree-icon-${icon.name}-${ruleId}`}\n              icon={icon.icon}\n              size=\"sm\"\n              className={icon.name}\n            />\n            <div className=\"label\">{icon.title}</div>\n          </div>\n\n          {/*<UncontrolledTooltip target={`tree-icon-${icon.name}-${ruleId}`}>\n            {icon.title}\n          </UncontrolledTooltip>*/}\n        </div>\n      ))}\n    </span>\n  )\n}\n\nexport default RoutingRuleIconTableCell;\n","import React, {useMemo, useState} from 'react';\nimport { Button } from 'reactstrap';\nimport { useSearchParams, Link } from 'react-router-dom';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport usePermission from '../../../Hooks/usePermission';\nimport PagedTable from '../../../Components/Table/PagedTable';\nimport { DateFormatter } from '../../../Components/Table/Table';\nimport RoutingRuleIconTableCell from \"../../../Components/Rules/RoutingRuleIconTableCell\";\nimport {singularOrPlural} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {faKey} from \"@fortawesome/free-solid-svg-icons\";\nimport {ChangeHistoryButton} from \"../../../Providers/ChangeProvider\";\n\nconst NameCell = ({ name, vendorId, allowEdit, searchParams }) => (\n  <Link to={`/publishing/vendors/${vendorId}${allowEdit ? '/edit' : ''}`} state={{search: searchParams?.toString()}}>{name}</Link>\n);\n\nconst ActionCell = ({\n  vendor,\n  searchParams,\n  onRulesClick,\n  onSourceTokensClick,\n  onRoutingClick,\n  allowEditVendor,\n  allowViewTokens,\n  allowViewRules,\n  allowViewAuction,\n}) => (\n    <div className=\"list-actions\">\n      <Link\n        to={`/publishing/vendors/${vendor.id}`}\n        state={{search: searchParams.toString()}}\n        className=\"action-item\"\n        title=\"View\"\n      >\n        <FaIcon icon=\"eye\" size=\"1x\"/>\n      </Link>\n      {allowEditVendor && (\n        <Button\n          tag={Link}\n          color=\"link\"\n          className=\"action-item inline\"\n          title=\"Edit\"\n          state={{search: searchParams.toString()}}\n          to={{\n            pathname: `/publishing/vendors/${vendor.id}/edit`,\n          }}\n        >\n          <FaIcon icon=\"cog\" size=\"1x\"/>\n        </Button>\n      )}\n      {allowViewTokens && (\n        <Button\n          color='link'\n          className='action-item inline'\n          title='Source Tokens'\n          onClick={() => {\n            onSourceTokensClick(vendor);\n          }}\n        >\n          <FaIcon icon={faKey} size='1x'/>\n        </Button>\n      )}\n      {allowViewRules && (\n        <Button\n          color='link'\n          className='action-item inline'\n          title='Vendor routing rules'\n          onClick={() => {\n            onRulesClick(vendor);\n          }}\n        >\n          <FaIcon icon='clipboard-list' size='1x'/>\n        </Button>\n      )}\n      {allowViewAuction && (\n        <>\n          <Link\n            to={`/auctions?page=1&vendor=${vendor.id}`}\n            target=\"_blank\"\n            title='Auction List'\n            className='action-item'\n          >\n            <FaIcon icon='comment-dollar' size='1x'/>\n          </Link>\n          <Button\n            color='link'\n            onClick={() => {\n              onRoutingClick(vendor.id);\n            }}\n            title='Routing Map'\n            className='action-item inline'\n          >\n            <FaIcon icon='project-diagram' size='1x'/>\n          </Button>\n        </>\n\n      )}\n      <ChangeHistoryButton id={vendor.id} name={vendor.name} type=\"vendor\" />\n    </div>\n  )\n\nconst TokensCell = ({ tokens }) => {\n  const [showData, setShowData] = useState(false);\n  const nonArchived = tokens.filter(t => t.status !== 'archived');\n  return nonArchived?.length > 0 ? (\n    <div className='source-tokens-cell' onClick={() => setShowData(!showData)} style={{ cursor: 'pointer' }}>\n      <div>\n        {nonArchived.length} {singularOrPlural(nonArchived.length, 'Source', 'Sources')}{' '}\n        <FaIcon icon={showData ? 'chevron-circle-down' : 'chevron-circle-right'} size='sm' />\n      </div>\n\n      {showData &&\n        nonArchived.map((st, i) => (\n          <div className='source-tokens mt-1' key={i}>\n            <EntityId id={st.source.id} title=\"Source ID\" />\n            {st.source.name}\n          </div>\n        ))}\n    </div>\n  ) : (\n    <span>&mdash;</span>\n  );\n};\n\nconst UeidsCell = ({ vendorId, ueids, searchParams }) => {\n  const [showData, setShowData] = useState(false);\n\n  return ueids?.length > 0 ? (\n    <div className='ueids-cell'>\n      <div onClick={() => setShowData(!showData)} style={{ cursor: 'pointer' }}>\n        {ueids.length} {singularOrPlural(ueids.length, 'UEID', 'UEIDs')}{' '}\n        <FaIcon icon={showData ? 'chevron-circle-down' : 'chevron-circle-right'} size='sm' />\n      </div>\n\n      {showData &&\n        <>\n          {ueids.map((id, i) => (\n            <div className='ueids mt-1' key={i}>\n              {id.ueid}\n            </div>\n          ))}\n          <Button\n            tag={Link}\n            color=\"link\"\n            className=\"inline mt-1\"\n            title=\"Manage UEIDs\"\n            state={{search: searchParams.toString()}}\n            to={{\n              pathname: `/publishing/vendors/${vendorId}/edit`,\n              search: `tab=ueids`\n            }}\n          >\n            Add UEIDs\n          </Button>\n        </>\n        }\n    </div>\n  ) : (\n    <span>&mdash;</span>\n  );\n};\n\nconst VendorsTable = ({\n                        vendors,\n                        loading,\n                        totalRows,\n                        pageCount,\n                        page,\n                        sort_by,\n                        sort_dir,\n                        limit,\n                        setPage,\n                        setLimit,\n                        setSortBy,\n                        setSortDir,\n                        openRulesModal,\n                        openSourceTokensModal,\n                        openRoutingMapModal,\n}) => {\n  const [searchParams] = useSearchParams()\n  const allowEditVendor = usePermission('vendors.edit');\n  const allowViewTokens = usePermission('source_tokens.view');\n  const allowViewRules = usePermission('routing.view');\n  const allowViewAuction = usePermission('auctions.view');\n\n  const initialTableState = useMemo(() => ({\n    sortBy: [{ id: 'name', desc: false }],\n  }), []);\n\n  const columns = useMemo(\n    () => [\n      {\n        Header: 'ID',\n        accessor: 'id',\n        defaultCanSort: false,\n        Cell: ({value}) => (\n          <EntityId id={value} title=\"Vendor ID\" />\n        ),\n        maxWidth: 60\n      },\n      {\n        Header: 'Vendor',\n        accessor: 'name',\n        id: 'name',\n        className: 'name-cell',\n        defaultCanSort: true,\n        maxWidth: 300,\n        Cell: (c) => (\n          <NameCell\n            name={c.value}\n            vendorId={c.row.original.id}\n            allowEdit={allowEditVendor}\n            searchParams={searchParams}\n          />\n        ),\n      },\n      {\n        Header: 'Rule Summary',\n        accessor: 'rule_summary',\n        Cell:({value, row}) => <RoutingRuleIconTableCell summary={value} ruleId={row.original.rule_id} onOpenRules={()=>openRulesModal(row.original)} /> ,\n      },\n      {\n        Header: 'Tokens',\n        disableSortBy: true,\n        accessor: 'source_tokens',\n        Cell: ({ value }) => <TokensCell tokens={value}  />,\n        width: 170,\n      },\n      {\n        Header: 'UEIDs',\n        disableSortBy: true,\n        accessor: 'ueids',\n        Cell: ({ row }) => <UeidsCell vendorId={row.original.id} ueids={row.original.ueids} searchParams={searchParams}  />,\n        width: 170,\n      },\n      {\n        Header: 'Created',\n        accessor: 'inserted_at',\n        defaultCanSort: true,\n        width: 130,\n        disableGlobalFilter: true,\n        Cell: ({ value }) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n      {\n        Header: 'Modified',\n        accessor: 'modified_at',\n        defaultCanSort: true,\n        disableGlobalFilter: true,\n        Cell: ({ value }) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n      {\n        maxWidth: 100,\n        disableSortBy: true,\n        id: 'actions',\n        disableGlobalFilter: true,\n        Cell: (c) => (\n          <ActionCell\n            searchParams={searchParams}\n            vendor={c.row.original}\n            onRulesClick={openRulesModal}\n            onSourceTokensClick={openSourceTokensModal}\n            onRoutingClick={openRoutingMapModal}\n            allowEditVendor={allowEditVendor}\n            allowViewTokens={allowViewTokens}\n            allowViewRules={allowViewRules}\n            allowViewAuction={allowViewAuction}\n          />\n        ),\n      },\n    ],\n    [vendors, searchParams, allowEditVendor, allowViewTokens, allowViewRules, allowViewAuction],\n  );\n\n  return (\n    <PagedTable\n      columns={columns}\n      initialState={initialTableState}\n      className=\"vendors-table striped\"\n      data={vendors}\n      loading={loading}\n      totalRows={totalRows}\n      pageCount={pageCount}\n      page={page}\n      limit={limit}\n      sort_by={sort_by}\n      sort_dir={sort_dir}\n      setPage={setPage}\n      setLimit={setLimit}\n      setSortBy={setSortBy}\n      setSortDir={setSortDir}\n      noDataMessage=\"No vendors were found\"\n    />\n\n  );\n};\n\nVendorsTable.propTypes = {\n  loading: PropTypes.bool,\n  vendors: PropTypes.array,\n  totalRows: PropTypes.number,\n  pageCount: PropTypes.number,\n  page: PropTypes.number,\n  sort_by: PropTypes.string,\n  sort_dir: PropTypes.string,\n  limit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  attributes: PropTypes.object,\n  setPage: PropTypes.func,\n  setLimit: PropTypes.func,\n  setSort: PropTypes.func,\n  openRulesModal: PropTypes.func,\n  openSourceTokensModal: PropTypes.func,\n  openRoutingMapModal: PropTypes.func,\n};\n\nexport default VendorsTable;\n","import React from 'react';\nimport classnames from 'classnames';\nimport {DropdownItem, DropdownMenu, DropdownToggle, InputGroup, UncontrolledDropdown} from \"reactstrap\";\nimport { TextSearch } from '../../../Components/Table/Filter';\nimport RightDateAndControls from '../../../Components/Table/RightDateAndControls'\nimport {useFilters} from '../../../Hooks/useFilters'\n\nconst Filters = ({filters, onChange, onRefresh, loading}) => {\n  const {onChangeFilter, reset, clearSearch} = useFilters(filters, onChange)\n\n  return (\n\n    <div>\n\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n\n      <div className=\"d-flex justify-content-between\">\n\n        <div className=\"boxed-filter search-filter\">\n          <InputGroup className=\"flex-nowrap align-items-center\">\n            <TextSearch\n              value={filters.search || ''}\n              placeholder={`Search by vendor ${filters.search_type || 'name'}`}\n              onUpdate={(val) => onChangeFilter('search', val)}\n              onClear={clearSearch}\n              autofocus\n              style={{minWidth:\"250px\"}}\n            />\n            <UncontrolledDropdown>\n              <DropdownToggle caret size=\"xs\" color=\"link\">{filters.search_type || 'Vendor name'}</DropdownToggle>\n              <DropdownMenu>\n                <DropdownItem onClick={() => { onChangeFilter('search_type','name'); }}>Vendor name</DropdownItem>\n                <DropdownItem onClick={() => { onChangeFilter('search_type', 'ueid'); }}>UEID</DropdownItem>\n              </DropdownMenu>\n            </UncontrolledDropdown>\n          </InputGroup>\n\n        </div>\n\n        <RightDateAndControls onRefresh={onRefresh} onReset={reset} />\n      </div>\n    </div>\n  );\n};\n\nexport default Filters;\n","import React, {useState, useEffect} from \"react\"\nimport {\n  Button,Modal, ModalHeader, ModalBody\n} from 'reactstrap'\nimport useApi from \"../../../../Hooks/useApi\"\nimport usePermission from \"../../../../Hooks/usePermission\"\nimport {SourceTokenTable, SourceTokenForm, Filters} from \"../../SourceToken\"\nimport useTableState from \"../../../../Hooks/useTableState\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\n\nconst DefaultControls = {\n  limit: 15,\n  sort_by: 'created_at',\n  sort_dir: 'desc',\n}\n\n/*\n * Modal that lists the sources for a vendor (related by token)\n * Allows editing and creating tokens.\n */\nconst Sources = ({vendor, isOpen, close}) => {\n  if(!vendor) return null\n  const {api} = useApi()\n  const allowTokenEdit = usePermission('source_tokens.edit')\n  const allowTokenCreate = usePermission('source_tokens.create')\n  const [isLoading, setIsLoading] = useState(true)\n  const [pageCount, setPageCount] = useState(1)\n  const [totalRows, setTotalRows] = useState(0)\n  const {\n    filters, setFilters,  query, controls\n  } = useTableState(\n    {vendor:vendor.id},\n    DefaultControls,\n    { useQueryString: false, useTableControls: true },\n  )\n\n  const [tokens, setTokens] = useState([])\n  const [selectedToken, setSelectedToken] = useState(null)\n  const [refreshOnClose, setRefreshOnClose] = useState(false)\n\n  useEffect(() => {\n    if (isOpen) {\n      load()\n    }\n    return () => {\n      setTokens([])\n    }\n  }, [isOpen, vendor, query])\n\n  const load = async() => {\n    setIsLoading(true)\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls\n    const result = await api.endpoints.sourceTokens.list({\n      vendor: vendor.id,\n      ...filters,\n      page,\n      sort_by,\n      sort_dir,\n      limit,\n    })\n\n\n    if (result) {\n      const { limit, total, data } = result\n      setTokens(data)\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1)\n      setTotalRows(total)\n    }\n    setIsLoading(false)\n  }\n\n  const archive = async(sourceToken) => {\n    setIsLoading(true)\n    const result = await api.endpoints.sourceTokens.update({id:sourceToken.id, status:'archived'})\n    if (result) {\n      load()\n    }\n    setIsLoading(false)\n  }\n\n  const handleUpdateTokenSuccess = () => {\n    setRefreshOnClose(true)\n    load()\n  }\n\n\n  const onCloseForm = (refresh) => {\n    if (refresh === true) { // could be click event\n      load()\n    }\n    setSelectedToken(null)\n  }\n\n\n  const onAdd = () => {\n    setSelectedToken({\n      id: 0,\n      token: \"\",\n      seed_data: null,\n      status: 'active',\n      source: {id:0, name:''},\n      vendor: vendor\n    })\n  }\n\n  const onCloseModal = () => {\n    setSelectedToken(null)\n    close(refreshOnClose)\n  }\n  const onEdit = (sourceToken=null) => {\n    setSelectedToken(sourceToken)\n  }\n\n  return (\n    <Modal isOpen={isOpen} toggle={onCloseModal} size=\"xlg\" id=\"source-vendor-modal\" scrollable>\n        <ModalHeader toggle={onCloseModal}>\n          {selectedToken?.id > 0 && <Button color=\"link\" size=\"sm\" className=\"inline me-1\" onClick={onCloseForm}>\n            <FaIcon icon=\"arrow-left\" />\n          </Button>\n          }\n          {selectedToken ? (selectedToken.id > 0 ? 'Edit Source Token' : 'Create Source Token') : 'Source Tokens for Vendor'}\n        </ModalHeader>\n        <div className=\"modal-subheader\">{vendor.name}</div>\n\n          {selectedToken ? (\n            <SourceTokenForm\n              vendor={vendor}\n              sourceToken={selectedToken}\n              close={onCloseForm}\n              onSuccess={handleUpdateTokenSuccess}\n              isModal\n              readOnly={selectedToken.id ? !allowTokenEdit : !allowTokenCreate}\n            />\n          ) : (\n            <ModalBody>\n              <div className=\"d-flex justify-content-between align-items-center mb-2\">\n                <div className=\"source-vendors above-table-filters d-block flex-fill\">\n                  <Filters\n                    filters={filters}\n                    onChange={setFilters}\n                    loading={isLoading}\n                    showVendors={false}\n                    onRefresh={load}\n                  />\n                </div>\n\n              </div>\n\n              {allowTokenCreate && (\n                <div className=\"text-end\">\n                  <Button\n                    size=\"sm\"\n                    onClick={onAdd}\n                    className=\"mt-1 ms-2\"\n                  >\n                    <FaIcon icon=\"plus\" size=\"sm\"/> Add Token\n                  </Button>\n                </div>\n              )}\n\n              <SourceTokenTable\n                showVendor={false}\n                data={tokens}\n                loading={isLoading}\n                noDataMessage=\"No sources tokens were found\"\n                onEdit={onEdit}\n                onArchive={allowTokenEdit ? archive : undefined}\n                allowEdit={allowTokenEdit}\n                pageCount={pageCount}\n                totalRows={totalRows}\n                {...controls}\n              />\n            </ModalBody>\n\n          )}\n\n      </Modal>\n  )\n}\n\nexport default Sources\n\n\n","import React, { useEffect, useState } from 'react';\nimport {\n  Button\n} from 'reactstrap';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport PageSection from '../../../Layout/PageSection';\nimport VendorsTable from './Table';\nimport {Modal as RoutingRulesModal} from \"../../Routing/Rules\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport DocTitle from '../../../Layout/DocTitle';\nimport useApi from '../../../Hooks/useApi';\nimport usePermission from '../../../Hooks/usePermission';\nimport FilterBar from '../../../Components/Table/FilterBar';\nimport Filters from './Filters';\nimport Sources from \"./Vendor/Sources\";\nimport RoutingMapModal from \"../../Routing/Mapper/Modal\";\nimport usePagedTableState from '../../../Hooks/usePagedTableState'\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\nconst DefaultFilters = {\n\n};\n\nconst DefaultControls = {\n  limit: 50,\n  sort_by: 'name',\n  sort_dir: 'asc',\n};\n\n/*\n * Sources List - table\n *\n */\nconst VendorsList = () => {\n  const {\n    filters, setFilters, controls, updateQuery,\n  } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: true, useTableControls: true },\n  );\n  const [searchParams] = useSearchParams()\n  const [loading, setLoading] = useState(false);\n  const [vendors, setVendors] = useState([]);\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const [rulesModalOpen, setRulesModalOpen] = useState(false);\n  const [sourceTokensModalOpen, setSourceTokensModalOpen] = useState(false);\n  const [selectedVendor, setSelectedVendor] = useState(null);\n  const [routingMapId, setRoutingMapId] = useState(null);\n  const apiList = useApi('vendors', 'list');\n  const allowView = usePermission('vendors.view');\n  const allowCreate = usePermission('vendors.create');\n\n  useChangeTimeline({\n    entityTypes: ['vendor', 'routingrule', 'sourcetoken'],\n  });\n\n  if (!allowView) return null;\n\n  useEffect(() => {\n    if (!loading) {\n      load();\n    }\n  }, [filters, controls.sort_by, controls.sort_dir, controls.page, controls.limit]);\n\n  const load = async () => {\n    setLoading(true);\n\n    updateQuery();\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls;\n    const result = await apiList.fetch({\n      ...filters,\n      page,\n      sort_by,\n      sort_dir,\n      limit,\n    });\n\n    if (result) {\n      //setVendors(result);\n      const { limit, total, data } = result; // row:0, page:1, limit:20, data:[]\n      setVendors(data);\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1);\n      setTotalRows(total);\n    } else {\n      notify(`Unable to load vendors: ${apiList.error?.name}`, 'error');\n    }\n\n    setLoading(false);\n  };\n\n  const openRulesModal = (vendor) => {\n    setSelectedVendor(vendor);\n    setRulesModalOpen(true);\n  };\n\n\n  const closeRulesModal = () => setRulesModalOpen(false);\n\n  const openSourceTokensModal = (vendor) => {\n    setSelectedVendor(vendor);\n    setSourceTokensModalOpen(true);\n  };\n\n  const closeSourcesModal = (refresh) => {\n    if (refresh === true) {\n      load();\n    }\n    setSourceTokensModalOpen(false);\n  }\n\n  const openRoutingMapModal = (vendorId) => setRoutingMapId(vendorId)\n  const closeRoutingMapModal = () => setRoutingMapId(null)\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Vendors\" />\n\n      <FilterBar>\n        <Filters  loading={loading} onChange={setFilters}  filters={filters} onRefresh={load} />\n      </FilterBar>\n\n      <PageSection\n        title=\"Vendors\"\n        tools={allowCreate === true ? (\n          <Button size=\"sm\" tag={Link} state={{search: searchParams.toString()}}\n                  to={{\n                    pathname: `/publishing/vendors/create`,\n                  }} >\n            Create\n          </Button>\n\n        ) : (null)}\n      >\n\n\n        <VendorsTable\n          vendors={vendors}\n          loading={loading}\n          pageCount={pageCount}\n          totalRows={totalRows}\n          {...controls}\n          openRulesModal={openRulesModal}\n          openSourceTokensModal={openSourceTokensModal}\n          openRoutingMapModal={openRoutingMapModal}\n        />\n\n\n\n        {selectedVendor && (\n          <>\n            <RoutingRulesModal\n              entityType=\"vendor\"\n              entity={selectedVendor}\n              isOpen={rulesModalOpen}\n              close={closeRulesModal}\n              onRefresh={load}\n            />\n            <Sources\n              isOpen={sourceTokensModalOpen}\n              vendor={selectedVendor}\n              close={closeSourcesModal}\n            />\n          </>\n\n        )}\n\n        <RoutingMapModal\n          isOpen={Boolean(routingMapId)}\n          toggle={closeRoutingMapModal}\n          vendorId={routingMapId}\n        />\n\n      </PageSection>\n\n    </>\n  );\n};\n\n\n\nexport default VendorsList;\n","import React, { useMemo } from 'react';\nimport { Button } from 'reactstrap';\nimport NumberFormat from 'react-number-format';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport usePermission from '../../../Hooks/usePermission';\nimport {ChangeHistoryButton} from '../../../Providers/ChangeProvider';\nimport PagedTable from '../../../Components/Table/PagedTable';\nimport SeedDataCell from '../../../Components/Table/SeedDataCell';\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport EntityId from \"../../../Components/Table/EntityId\";\n\n// Assumes all numbers are +1 with 10 digits\nconst NumberCell = ({ number }) => (\n    <div>\n        <span>\n            <NumberFormat\n                value={number}\n                displayType='text'\n                format='+# (###) ###-####'\n            />\n        </span>\n    </div>\n);\n\nconst SourceCell = ({ source }) => (\n    <span>\n        {source ? (\n            <span className='status-toggler'>\n                  <FaIcon\n                    icon='circle'\n                    size='xs'\n                    className={classnames([\n                      'current-status-icon',\n                      source.status,\n                      'me-2',\n                    ])}\n                  />\n              <EntityId id={source.id} /> {source.name}\n              </span>\n\n        ) : (\n            <i>available</i>\n        )}\n    </span>\n);\n\nconst ActionCell = ({ number, allowEdit, onEditClick }) => (\n  <div className='list-actions'>\n    {allowEdit && (\n      <Button\n        color='link'\n        className='action-item inline'\n        onClick={() => { onEditClick(number); }}\n        title='Settings'\n      >\n        <FaIcon icon='cog' size='1x' />\n      </Button>\n    )}\n    <ChangeHistoryButton id={number.id} name={number.phone_number} type=\"phonenumber\" />\n  </div>\n)\n\nconst Table = (props) => {\n    const allowEdit = usePermission('phone_numbers.edit');\n\n    const columns = useMemo(\n        () => [\n            {\n                Header: 'Number',\n                className: 'number-cell',\n                // id:'number', //used to id sort\n                accessor: 'phone_number',\n                defaultCanSort: true,\n                Cell: (c) => <NumberCell number={c.value} />,\n                minWidth: 150,\n            },\n            {\n                Header: 'Source',\n                className: 'source-cell',\n                accessor: 'source',\n                disableSortBy: true,\n                Cell: (c) => <SourceCell source={c.value} />,\n                minWidth: 250,\n            },\n            {\n                Header: 'Vendor',\n                accessor: 'vendor',\n                disableSortBy: true,\n                minWidth: 100,\n              Cell: ({ value }) => (\n                <span>\n                        {value ? (\n                          <span><EntityId id={value.id} />{value.name}</span>\n                        ) : (\n                          <span>&mdash;</span>\n                        )}\n                    </span>\n              ),\n            },\n            {\n                Header: 'UEID',\n                accessor: 'ueid',\n                defaultCanSort: true,\n                minWidth: 120,\n                Cell: ({ value }) => (\n                  <span>{value || <span>&mdash;</span>}</span>\n                ),\n            },\n            {\n                Header: 'Vertical',\n                disableSortBy: true,\n                id: 'vertical',\n                Cell: ({ row }) => (\n                    <span>\n                        {row.original.source\n                            ? row.original.source.vertical.display_name\n                            : null}\n                    </span>\n                ),\n                maxWidth: 180,\n            },\n            {\n                Header: 'IVR Script',\n                sortable: false,\n                id: 'script',\n                Cell: ({ row }) => (\n                    <span>\n                        {row.original.script ? (\n                            row.original.script.name\n                        ) : (\n                            <span>&mdash;</span>\n                        )}\n                    </span>\n                ),\n                minWidth: 180,\n            },\n            {\n                Header: 'Seed Data',\n                disableSortBy: true,\n                accessor: 'seed_data',\n                Cell: (c) => <SeedDataCell seedData={c.value} />,\n                minWidth: 100,\n            },\n\n            {\n                Header: 'Created',\n                accessor: 'inserted_at',\n                defaultCanSort: true,\n                width: 130,\n                Cell: ({ value }) => <RelativeTime date={value} />,\n            },\n            {\n                Header: 'Modified',\n                accessor: 'modified_at',\n                defaultCanSort: true,\n                width: 130,\n                Cell: ({ value }) => (value ? <RelativeTime date={value} /> : <span>&mdash;</span>),\n            },\n            {\n                Header: 'Last Used',\n                accessor: 'last_used_at',\n                defaultCanSort: true,\n                width: 130,\n                Cell: ({ value }) => (value ? <RelativeTime date={value} /> : <span>&mdash;</span>),\n            },\n            ...(allowEdit ? [{\n                maxWidth: 60,\n                sortable: false,\n                id: 'actions',\n                Cell: (c) => (\n                    <ActionCell\n                        number={c.row.original}\n                        allowEdit={allowEdit}\n                        onEditClick={() => props.openModal(c.row.original)}\n                    />\n                ),\n            }] : []),\n        ],\n        [allowEdit]\n    );\n\n    const initialTableState = useMemo(\n        () => ({\n            sortBy: [\n                {\n                    id: props.sort_by,\n                    desc:\n                        typeof props.sort_dir !== 'undefined'\n                            ? props.sort_dir === 'desc'\n                            : true,\n                },\n            ],\n        }),\n        []\n    );\n\n    return (\n        <PagedTable\n            columns={columns}\n            initialState={initialTableState}\n            className='phone-numbers-table striped'\n            {...props}\n            noDataMessage='No phone numbers were found'\n        />\n    );\n};\n\nTable.propTypes = {\n    loading: PropTypes.bool,\n    data: PropTypes.array,\n    totalRows: PropTypes.number,\n    pageCount: PropTypes.number,\n    page: PropTypes.number,\n    limit: PropTypes.number,\n    sort_by: PropTypes.string,\n    sort_dir: PropTypes.string,\n    attributes: PropTypes.object,\n    setPage: PropTypes.func,\n    setLimit: PropTypes.func,\n    setSort: PropTypes.func,\n    openModal: PropTypes.func,\n    //  onStatusChange:PropTypes.func\n};\n\nexport default Table;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { TextSearch, Filter, ButtonToggleFilter } from '../../../Components/Table/Filter';\nimport { StatusChoices } from '../../../Components/Table/FilterChoices';\nimport useApiBatch from '../../../Hooks/useApiBatch';\nimport RightDateAndControls from '../../../Components/Table/RightDateAndControls';\nimport {useFilters} from \"../../../Hooks/useFilters\";\n\nconst Filters = ({\n  filters, onChange, onRefresh, loading,\n}) => {\n\n  const batcher = useApiBatch();\n  const [choices, setChoices] = useState({});\n  const {onChangeFilter, clearSearch, reset} = useFilters(filters, onChange)\n  // load choices\n  useEffect(() => {\n\n    const getChoices = async () => {\n      const batches = await batcher.fetch([\n        // { endpoint: 'vendors', action: 'list' },\n        { endpoint: 'verticals', action: 'list' },\n        { endpoint: 'scripts', action: 'list' },\n      ]);\n      if (batches && batches.length) {\n        const [verticals, scripts] = batches;\n        setChoices({\n          status: StatusChoices,\n          // product:ProductChoices,\n         // vendors: vendors.map((item) => ({ value: item.id, label: item.name })),\n          vertical: verticals.map((item) => ({ value: item.id, label: item.display_name })),\n          script: scripts.map((item) => ({ value: item.id, label: item.name })),\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n\n  return (\n    <div className=\"d-flex  justify-content-between position-relative\">\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n\n      <div className=\"phone-number-filters d-flex\">\n\n        <div className=\"boxed-filter search-filter me-3 asdfasf\">\n\n          <TextSearch\n            value={filters.search || ''}\n            placeholder=\"Search number or source\"\n            onUpdate={(val) => onChangeFilter('search', val)}\n            onClear={clearSearch}\n            delay={500}\n          />\n\n        </div>\n\n        <div className=\"min-250\" style={{ width: '300px' }}>\n          <Filter\n            placeholder=\"Vertical\"\n            param=\"vertical\"\n            options={choices.vertical || []}\n            value={filters.vertical || ''}\n            onChange={onChangeFilter}\n            isMulti={false}\n          />\n        </div>\n\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Script\"\n            param=\"script\"\n            options={choices.script || []}\n            value={filters.script || ''}\n            onChange={onChangeFilter}\n            isMulti={false}\n          />\n        </div>\n\n        <div className=\"\">\n          <ButtonToggleFilter\n            param=\"available\"\n            active={filters.available || false}\n            onChange={onChangeFilter}\n            labelOn=\"Available\"\n            labelOff=\"All\"\n          />\n        </div>\n\n        {/*  Use dropdown? Not yet sure how many filters we will have.\n\n        <UncontrolledDropdown nav inNavbar={true} id=\"report-group-menu\" className=\"ms-3\" >\n          <DropdownToggle nav caret className=\"boxed-filter filter-group-dropdown\">\n            <FaIcon icon=\"filter\" size=\"lg\" className=\"fa-icons\" />\n            <span className=\"title d-block\">Applied Filters</span>\n            <small>\n              <FilterSummary choices={choices} filters={filters}/>\n            </small>\n          </DropdownToggle>\n          <DropdownMenu  className=\"select-filters-dropdown animate dropDown\">\n\n            <div className=\"modal-body\">\n              <StackedFilter\n                placeholder=\"Any Vertical\"\n                label={\"Vertical\"}\n                param=\"vertical\"\n                options={choices.vertical}\n                value={filters.vertical}\n                onChange={onChangeFilter}\n                isMulti={false}\n              />\n\n              <StackedFilter\n                placeholder=\"Any product\"\n                label=\"Product\"\n                param=\"product\"\n                options={choices.product}\n                value={filters.product}\n                onChange={onChangeFilter}\n                isMulti={true}\n              />\n\n              <StackedFilter\n                placeholder=\"Any status\"\n                label=\"Status\"\n                param=\"status\"\n                options={choices.status}\n                value={filters.status}\n                onChange={onChangeFilter}\n                isMulti={true}\n              />\n\n            </div>\n\n          </DropdownMenu>\n        </UncontrolledDropdown>\n\n*/}\n\n      </div>\n\n      <RightDateAndControls\n        onChangeDate={null}\n        onRefresh={onRefresh}\n        onReset={reset}\n      />\n    </div>\n\n  );\n};\n\nFilters.propTypes = {\n  filters: PropTypes.object,\n  onChange: PropTypes.func,\n  onRefresh: PropTypes.func,\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  loading: PropTypes.bool,\n};\n\nexport default Filters;\n","import React, { useState, useEffect, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Row, Col, FormGroup, Form, Label, Button, FormFeedback, FormText, Spinner,\n} from 'reactstrap';\nimport * as Yup from 'yup';\nimport NumberFormat from 'react-number-format';\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport LoadingBar from '../../../../Layout/LoadingBar';\nimport useFormState from '../../../../Hooks/useFormState';\nimport EnhancedSelect from \"../../../../Components/Form/EnhancedSelect\";\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport SeedDataBuilder from '../../../../Components/Form/SeedDataBuilder';\nimport useApiBatch from \"../../../../Hooks/useApiBatch\";\n\nconst ValidationSchema = Yup.object().shape({\n  // source_id: Yup.number().transform(n => isNaN(n) ? 0:n).moreThan(0,'Please select a source'),\n});\n\n/*\n * Form component for editing & creating a phone number.\n * Allows assignment of IVR script, Source, and Seed Data\n */\n\nconst PhoneNumber = ({\n  id,\n  phone_number,\n  seed_data,\n  script_id,\n  source,\n  vendor,\n  ueid,\n//  sourceOptions = [],\n  isNew = false,\n  closeModal,\n}) => {\n  const app = useContext(AppContext);\n  const batcher = useApiBatch();\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      script_id: script_id ? script_id.toString() : '',\n      source_id: source ? source.id.toString() : '',\n      vendor_id: vendor ? vendor.id.toString() : '',\n      ueid: ueid || '',\n      seed_data,\n    },\n    ValidationSchema,\n  );\n  // const[sourceList, setSourceList] = useState(null);\n  // const[verticalsList, setVerticalsList] = useState(null);\n  // const[sourceFilterVertical, setSourceFilterVertical] = useState('');\n  // const[sourceFilterStatus, setSourceFilterStatus] = useState('active');\n  const [choices, setChoices] = useState({});\n  const [scriptsLoading, setScriptsLoading] = useState(!!source);\n  const [scriptOptions, setScriptOptions] = useState(null);\n  const [sourceVertical, setSourceVertical] = useState(source ? source.vertical : null);\n\n  // Load scripts on mount\n  useEffect(() => {\n\n\n\n    const getChoices = async () => {\n\n      if (!scriptOptions && sourceVertical) {\n        loadScripts(sourceVertical);\n      }\n\n      const batches = await batcher.fetch([\n        { endpoint: 'sources', action: 'list', params:{options:true}  },\n        { endpoint: 'vendors', action: 'list', params:{limit:0}  },\n      ]);\n      if (batches && batches.length) {\n        const [sources, vendors] = batches;\n        setChoices({\n          source: sources.map((item) => ({ value: item.id.toString(), label: item.name, vertical:item.vertical })),\n          vendor: vendors.data.map((item) => ({ value: item.id.toString(), label: item.name, ueids: item.ueids ?? [] })),\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n  // Refresh scripts and attributes on source change if vertical is different\n  useEffect(() => {\n    if (formValues.source_id && choices.source) {\n      const source = choices.source.find((opt) => opt.value === formValues.source_id);\n\n      if (source && (!sourceVertical || source.vertical.id !== sourceVertical.id)) {\n        setSourceVertical(source.vertical);\n        loadScripts(source.vertical);\n      }\n    } else {\n      setScriptOptions(null);\n      setSourceVertical(null);\n    }\n  }, [formValues.source_id]);\n\n  const selectedVendor = (choices.vendor ?? []).find((opt) => opt.value === formValues.vendor_id);\n  const ueidOptions = (selectedVendor?.ueids ?? []).map((u) => ({ value: u.ueid, label: u.ueid }));\n\n  const handleVendorChange = (val) => {\n    if (val !== formValues.vendor_id && formValues.ueid) {\n      formApi.handleOnChange('ueid', '');\n    }\n    formApi.handleOnChange('vendor_id', val);\n  };\n\n  const loadScripts = async (vertical) => {\n    // script vertical matches source vertical\n    setScriptsLoading(true);\n\n    const result = await app.api.endpoints.scripts.list({ vertical_id: vertical.id });\n\n    if (result) {\n\n      const opt = result.map((script) => ({ value: script.id.toString(), label: script.name }));\n\n      opt.sort((a, b) => (a.label === b.label ? 0 : +(a.label > b.label) || -1));\n      setScriptOptions(opt);\n    } else {\n      console.log('index.js:Could not load scripts', app.api.error);\n    }\n    setScriptsLoading(false);\n  };\n\n  // SeedDataBuilder provides object\n  const handleUpdateSeedData = (obj) => formApi.handleOnChange('seed_data', obj);\n\n  const handleCancel = () => {\n    formApi.clearForm();\n    closeModal(false);\n  };\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      save();\n    }\n  };\n\n  const save = async () => {\n    app.showLoader('modal', isNew ? 'Creating phone number' : 'Updating phone number');\n    let result;\n    let { script_id, source_id, vendor_id, ueid, seed_data } = formValues;\n\n    seed_data = seed_data && Object.keys(seed_data).length > 0\n      ? JSON.stringify(seed_data)\n      : null;\n\n    ueid = ueid || null;\n\n    if (isNew) {\n      result = await app.api.endpoints.phoneNumbers.create({\n        seed_data,\n        source_id,\n        vendor_id,\n        ueid,\n        script_id,\n      });\n    } else {\n      result = await app.api.endpoints.phoneNumbers.update({\n        id,\n        seed_data,\n        source_id,\n        vendor_id,\n        ueid,\n        script_id,\n      });\n    }\n    app.showLoader(false);\n    if (result) {\n      closeModal(true);\n    } else {\n      console.log('index.js:phoneApi error', app.api.error);\n      notify(`Unable to save phone number: ${app.api.error.name}`, 'error');\n    }\n  };\n\n  // const filterOptions = (option, input) => {\n  //  // console.log('index.js:filterOptions', option, input);\n  //  // if (input) {\n  //     return option.data.vertical.id === 2\n  //   //}\n  //  // return true;\n  // };\n\n  // empty data may be empty array\n\n  // const hasSeedData = Array.isArray(seedData) && seedData.length;\n\n  return (\n    <>\n      <Row>\n        <Col>\n          <LoadingBar name=\"modal\" />\n          {formIsValid === false\n          && (\n          <StandardAlert color=\"warning\" className=\"alert-form-validation\">\n            Please correct the errors below before continuing\n          </StandardAlert>\n          )}\n\n          <div className=\"modal-content-background\">\n            <Form>\n\n              <FormGroup row>\n                <Label sm={2}>\n                  Number\n                </Label>\n                <Col sm={10}>\n                  {id === 0 ? <FormText>A new toll-free number will be purchased.</FormText>\n                    : <div className=\"col-form-text\"><NumberFormat value={phone_number} displayType=\"text\" format=\"+###########\" /></div>}\n                </Col>\n              </FormGroup>\n\n              <FormGroup row>\n                <Label sm={2}>\n                  Source\n                </Label>\n                <Col sm={10}>\n\n                    <EnhancedSelect\n                      isClearable\n                      isSearchable\n                      onChange={(val) => formApi.handleOnChange('source_id', val)}\n                      options={choices.source ?? []}\n                      value={formValues.source_id || ''}\n                      tabSelectsValue\n                      backspaceRemovesValue\n                      isMulti={false}\n                      controlShouldRenderValue\n                      hideSelectedOptions\n                      closeMenuOnSelect\n                      placeholder=\"Select (type to search)\"\n                      isInvalid={!!formErrors.source_id}\n\n                    />\n                    <FormFeedback>{formErrors.source_id}</FormFeedback>\n\n                </Col>\n              </FormGroup>\n\n              <FormGroup row>\n                <Label sm={2}>\n                  Vendor\n                </Label>\n                <Col sm={10}>\n\n                    <EnhancedSelect\n                      isClearable\n                      isSearchable\n                      onChange={handleVendorChange}\n                      options={choices.vendor ?? []}\n                      value={formValues.vendor_id || ''}\n                      tabSelectsValue\n                      backspaceRemovesValue\n                      isMulti={false}\n                      controlShouldRenderValue\n                      hideSelectedOptions\n                      closeMenuOnSelect\n                      placeholder=\"Select (type to search)\"\n                      isInvalid={!!formErrors.vendor_id}\n                    />\n                    <FormFeedback>{formErrors.vendor_id}</FormFeedback>\n\n                </Col>\n              </FormGroup>\n\n              <FormGroup row>\n                <Label sm={2}>\n                  UEID\n                </Label>\n                <Col sm={10}>\n\n                  {formValues.vendor_id ? (\n                    <>\n                      {ueidOptions.length > 0 || formValues.ueid ? (\n                        <>\n                          <EnhancedSelect\n                            isClearable\n                            isSearchable\n                            onChange={(val) => formApi.handleOnChange('ueid', val)}\n                            options={ueidOptions}\n                            value={formValues.ueid || ''}\n                            tabSelectsValue\n                            backspaceRemovesValue\n                            isMulti={false}\n                            controlShouldRenderValue\n                            hideSelectedOptions\n                            closeMenuOnSelect\n                            placeholder=\"Select (type to search)\"\n                            isInvalid={!!formErrors.ueid}\n                          />\n                          <FormFeedback>{formErrors.ueid}</FormFeedback>\n                        </>\n                      ) : (\n                        <FormText>Selected vendor has no UEIDs</FormText>\n                      )}\n                    </>\n                  ) : <FormText>No UEID (select a vendor)</FormText>}\n\n                </Col>\n              </FormGroup>\n\n              <FormGroup row>\n                <Label sm={2}>\n                  Seed Data\n                </Label>\n                <Col sm={10}>\n                  {formValues.source_id ? (\n                    <SeedDataBuilder\n                      seedData={formValues.seed_data}\n                      verticalId={sourceVertical ? sourceVertical.id : 0}\n                      onUpdate={handleUpdateSeedData}\n                    />\n                  ) : <FormText>No seed data (select a source)</FormText>}\n\n                </Col>\n\n              </FormGroup>\n\n              {/*\n            MST-949\n            Script list fetched from core requires code from conversation-service branch\n            of core API. We can't use this until we have a way of syncing changes in\n            core to the Conversation data. */}\n              <FormGroup row>\n                <Label sm={2}>\n                  IVR Script\n                </Label>\n                <Col sm={10}>\n\n                  {!scriptsLoading ? (\n                    <>\n                      {scriptOptions ? (\n                        <>\n                          <EnhancedSelect\n                            isClearable\n                            isSearchable\n                            onChange={(val) => formApi.handleOnChange('script_id', val)}\n                            options={scriptOptions}\n                            value={formValues.script_id || ''}\n                            tabSelectsValue\n                            backspaceRemovesValue\n                            isMulti={false}\n                            controlShouldRenderValue\n                            hideSelectedOptions={false}\n                            closeMenuOnSelect\n                            placeholder=\"Select (type to search)...\"\n                          />\n                          <FormFeedback>{formErrors.script_id}</FormFeedback>\n                        </>\n                      ) : (\n                        <>\n                          {formValues.source_id ? <i>No scripts found for source vertical</i> : <FormText>No script (select a source)</FormText>}\n                        </>\n\n                      )}\n\n                    </>\n\n                  ) : (\n                    <Spinner size=\"sm\" color=\"secondary\" />\n                  )}\n\n                </Col>\n\n              </FormGroup>\n\n            </Form>\n          </div>\n        </Col>\n      </Row>\n\n      <Row className=\"modal-content-footer\">\n\n        <Col sm={12} className=\"text-right\">\n          <Button\n            onClick={handleCancel}\n            color=\"link\"\n            size=\"sm\"\n          >\n            Cancel\n          </Button>\n          <Button\n            onClick={handleSave}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            Save\n          </Button>\n\n\n\n        </Col>\n      </Row>\n    </>\n  );\n};\n\nPhoneNumber.propTypes = {\n  id: PropTypes.number,\n  phone_number: PropTypes.string,\n  closeModal: PropTypes.func,\n  isNew: PropTypes.bool,\n  vendor: PropTypes.object,\n  ueid: PropTypes.string,\n  seed_data: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n  source: PropTypes.object,\n  script_id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  // script:PropTypes.object,\n};\n\nexport default PhoneNumber;\n","import React, { useEffect, useState } from 'react';\nimport {\n  Button, Modal, ModalHeader, ModalBody,\n} from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport Table from './Table';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport FilterBar from '../../../Components/Table/FilterBar';\nimport Filters from './Filters';\nimport DocTitle from '../../../Layout/DocTitle';\nimport usePagedTableState from '../../../Hooks/usePagedTableState';\nimport useApi from '../../../Hooks/useApi';\nimport usePermission from '../../../Hooks/usePermission';\nimport PhoneNumber from './PhoneNumber';\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\nconst DefaultFilters = {\n  available: '',\n};\n\nconst DefaultControls = {\n  limit: 50,\n  sort_by: 'inserted_at',\n  sort_dir: 'desc',\n};\n\n/*\n * Phone Numbers List - paged table with filters\n *\n */\nconst PhoneNumberList = () => {\n  const {\n    filters, setFilters, controls, updateQuery,\n  } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: true, useTableControls: true },\n  );\n  const [data, setData] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const [editModalOpen, setEditModalOpen] = useState(false);\n  const [selectedNumber, setSelectedNumber] = useState(null);\n  const [changeLogKey, setChangeLogKey] = useState(1);\n  const apiList = useApi('phoneNumbers', 'list');\n  // const apiUpdate = useApi('phoneNumbers', 'update');\n  const allowView = usePermission('phone_numbers.view');\n  const allowCreate = usePermission('phone_numbers.create');\n  useChangeTimeline({ entityTypes: ['phonenumber'], parentFilters: filters });\n\n  useEffect(() => {\n    if (!loading) {\n      load();\n    }\n  }, [filters, controls.sort_by, controls.sort_dir, controls.page, controls.limit]);\n\n  const filterParamsToApi = (filters) => {\n    const apiParams = { ...filters };\n\n    if (filters.vertical) {\n      apiParams.vertical_id = filters.vertical;\n      delete apiParams.vertical;\n    }\n\n    if (filters.available !== undefined && !filters.available) {\n      delete apiParams.available;\n    }\n\n    return apiParams;\n  };\n\n  const load = async () => {\n    // if(!this.isUserAccount) return;\n    setLoading(true);\n    updateQuery();\n    const apiFilters = filterParamsToApi(filters);\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls;\n    const result = await apiList.fetch({\n      ...apiFilters,\n      page,\n      sort_by,\n      sort_dir,\n      limit,\n    });\n\n    if (result) {\n      const { limit, total, data } = result; // row:0, page:1, limit:20, data:[]\n      setData(data);\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1);\n      setTotalRows(total);\n    } else {\n      notify(`Unable to load phone numbers: ${apiList.error.name}`, 'error');\n    }\n\n    setLoading(false);\n  };\n\n  const closeEditModal = (refresh = false) => {\n    setEditModalOpen(false);\n    setSelectedNumber(null);\n    if (refresh === true) {\n      load();\n      setChangeLogKey(changeLogKey + 1);\n    }\n  };\n\n  const openEditModal = (number) => {\n    if (!number) {\n      number = {\n        id: 0,\n        phone_number: '',\n        source: null,\n        script: null,\n        ueid: null,\n        seed_data: {},\n      };\n    }\n    setSelectedNumber(number);\n    setEditModalOpen(true);\n  };\n\n  // const handleStatusChange = async(source, status) => {\n  //\n  //   if(source && allowEdit){\n  //     let result = await apiUpdate.fetch(\n  //       { ...source,\n  //         vendor_id:source.vendor.id,\n  //         vertical_id:source.vertical.id,\n  //         status:status\n  //       }\n  //     );\n  //     return result ? true : false;\n  //   }\n  //   return false;\n  //\n  // }\n\n  if (!allowView) return (null);\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Phone Numbers\" />\n\n      <FilterBar>\n        <Filters filters={filters} onChange={setFilters} onRefresh={() => load()} loading={loading} />\n      </FilterBar>\n\n      <PageSection\n        title=\"Phone Numbers\"\n        tools={allowCreate === true ? (\n          <Button\n            className=\"ms-auto\"\n            onClick={() => openEditModal(null)}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            New Number\n          </Button>\n        ) : (null)}\n      >\n\n        {/* onStatusChange={handleStatusChange}  */}\n        <Table\n          data={data}\n          loading={loading}\n          pageCount={pageCount}\n          totalRows={totalRows}\n          showObject={false}\n          {...controls}\n          openModal={openEditModal}\n        />\n\n        <Modal isOpen={editModalOpen} toggle={closeEditModal} size=\"lg\" id=\"phone-number-modal\" scrollable>\n          {selectedNumber && (\n            <>\n              <ModalHeader toggle={closeEditModal}>{selectedNumber.id === 0 ? 'Create Phone Number' : 'Phone Number Settings'}</ModalHeader>\n              <ModalBody>\n\n                <PhoneNumber\n                  {...selectedNumber}\n                  isNew={selectedNumber.id === 0}\n                  closeModal={closeEditModal}\n                />\n\n              </ModalBody>\n            </>\n          )}\n        </Modal>\n\n      </PageSection>\n\n\n\n    </>\n  );\n};\n\nexport default PhoneNumberList;\n","import React, {useState, useEffect} from \"react\";\nimport {\n  Button,\n} from 'reactstrap';\nimport {useNavigate, useLocation} from 'react-router-dom';\nimport useApi from \"../../../Hooks/useApi\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport {SourceTokenTable, Filters} from \"../SourceToken\";\nimport usePagedTableState from \"../../../Hooks/usePagedTableState\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport FilterBar from \"../../../Components/Table/FilterBar\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\n\nconst DefaultControls = {\n  limit: 15,\n  sort_by: 'created_at',\n  sort_dir: 'desc',\n};\n\nconst SourceTokenList = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const {api} = useApi();\n  const [isLoading, setIsLoading] = useState(true);\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const {\n    filters, setFilters,  updateQuery, controls\n  } = usePagedTableState(\n    {},\n    DefaultControls,\n    { useQueryString: true, useTableControls: true },\n  );\n  const allowCreate = usePermission('source_tokens.create');\n  const allowEdit = usePermission('source_tokens.edit');\n  const [tokens, setTokens] = useState([]);\n\n  useChangeTimeline({\n    entityTypes: ['sourcetoken'],\n    parentFilters: filters,\n  });\n\n  useEffect(() => {\n    load();\n  }, [filters, controls.sort_by, controls.sort_dir, controls.page, controls.limit])\n\n  const load = async() => {\n    setIsLoading(true);\n    updateQuery();\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls;\n    const result = await api.endpoints.sourceTokens.list({\n      ...filters,\n      page,\n      sort_by,\n      sort_dir,\n      limit,\n    });\n\n\n    if (result) {\n      const { limit, total, data } = result;\n      setTokens(data);\n      setPageCount(total > limit ? Math.ceil(total / limit) : 1);\n      setTotalRows(total);\n    }\n    setIsLoading(false);\n  }\n\n  const onAdd = () => {\n    navigate('/publishing/source-tokens/create', {\n      state: {search: location.search}\n    });\n  };\n\n  return (\n   <>\n     <DocTitle pageTitle=\"Source-Vendor Tokens\" />\n\n     <FilterBar>\n       <Filters\n         filters={filters}\n         onChange={setFilters}\n         loading={isLoading}\n         onRefresh={load}\n       />\n\n\n     </FilterBar>\n\n     <PageSection\n       title=\"Source-Tokens\"\n       tools={allowCreate ? <Button\n         size=\"sm\"\n         onClick={onAdd}\n       >\n         Add\n       </Button> : null}\n     >\n\n        <SourceTokenTable\n          data={tokens}\n          loading={isLoading}\n          noDataMessage=\"No source-tokens were found\"\n          allowEdit={allowEdit}\n          pageCount={pageCount}\n          totalRows={totalRows}\n          {...controls}\n        />\n\n   </PageSection>\n\n   </>\n  )\n}\n\nexport default SourceTokenList;\n\n\n","import React, {useState, useEffect, useMemo} from 'react';\nimport {useNavigate, useLocation, useParams} from 'react-router-dom';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components\";\nimport useApi from \"../../../Hooks/useApi\";\nimport usePermission from '../../../Hooks/usePermission';\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport Breadcrumbs from \"../../../Layout/Breadcrumbs\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport {SourceTokenForm} from \"./SourceTokenForm\";\nimport LoaderDots from \"../../../Layout/LoaderDots\";\n\nconst SourceTokenEdit = () => {\n  const {id} = useParams();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const {api} = useApi();\n  const [sourceToken, setSourceToken] = useState(null);\n  const [isLoading, setIsLoading] = useState(true);\n  const allowEdit = usePermission('source_tokens.edit');\n  useChangeTimeline({\n    entityTypes: ['sourcetoken'],\n    parentFilters: {},\n    entity: sourceToken ? { id: sourceToken.id, name: sourceToken.label || sourceToken.token, type: 'sourcetoken' } : undefined,\n  });\n\n  useEffect(() => {\n    if (allowEdit) {\n      load();\n    }\n  }, [id, allowEdit]);\n\n  const load = async () => {\n    setIsLoading(true);\n    const result = await api.endpoints.sourceTokens.show(id);\n    if (result) {\n      setSourceToken(result);\n    } else {\n      notify(`Unable to load source token: ${api.error?.name || 'Unknown error'}`, 'error');\n      handleClose();\n    }\n    setIsLoading(false);\n  };\n\n  const handleClose = () => {\n    navigate({\n      pathname: '/publishing/source-tokens',\n      search: location.state?.search ?? '',\n    }, {replace: false});\n  };\n\n  const handleSuccess = () => {\n    handleClose();\n  };\n\n  const crumbs = useMemo(() => {\n    if (sourceToken) {\n      return [\n        {label: \"Publishing\"},\n        {label: \"Source Tokens\", to: {\n            pathname: '/publishing/source-tokens',\n            search: location.state?.search ?? '',\n          }},\n        {label: sourceToken.label || sourceToken.token, to: `/publishing/source-tokens/${sourceToken.id}`},\n        {label: \"Edit\"},\n      ]\n    }\n    return []\n  }, [sourceToken, location.state]);\n\n  if (!allowEdit) {\n    return null;\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Edit Source Token\" />\n      <Breadcrumbs crumbs={crumbs} />\n\n      <PageSection\n        title=\"Edit Source Token\"\n        subtitle={sourceToken ? `${sourceToken.source?.name || ''} - ${sourceToken.vendor?.name || ''}` : ''}\n      >\n        <LoaderDots active={isLoading} width={120} className=\"my-3\" />\n\n        {sourceToken && (\n          <SourceTokenForm\n            sourceToken={sourceToken}\n            close={handleClose}\n            onSuccess={handleSuccess}\n            isModal={false}\n          />\n        )}\n      </PageSection>\n    </>\n  );\n};\n\nexport default SourceTokenEdit;\n","import React from 'react';\nimport {useNavigate, useLocation} from 'react-router-dom';\nimport usePermission from '../../../Hooks/usePermission';\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport Breadcrumbs from \"../../../Layout/Breadcrumbs\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport {SourceTokenForm} from \"./SourceTokenForm\";\n\nconst SourceTokenCreate = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const allowCreate = usePermission('source_tokens.create');\n\n  const handleClose = () => {\n    navigate({\n      pathname: '/publishing/source-tokens',\n      search: location.state?.search ?? '',\n    }, {replace: false});\n  };\n\n  const handleSuccess = () => {\n    handleClose();\n  };\n\n  if (!allowCreate) {\n    return null;\n  }\n\n  const newSourceToken = {\n    id: 0,\n    token: \"\",\n    seed_data: null,\n    status: 'active',\n    post_type: '',\n    label: '',\n    description: '',\n    source: undefined,\n    vendor: undefined,\n  };\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Create Source Token\" />\n\n      <Breadcrumbs crumbs={[\n        {label: \"Publishing\"},\n        {label: \"Source Tokens\", to: {\n            pathname: '/publishing/source-tokens',\n            search: location.state?.search ?? '',\n          }},\n        {label: \"Create\"},\n      ]}/>\n\n      <PageSection\n        title=\"Create Source Token\"\n      >\n        <SourceTokenForm\n          sourceToken={newSourceToken}\n          close={handleClose}\n          onSuccess={handleSuccess}\n          isModal={false}\n        />\n      </PageSection>\n    </>\n  );\n};\n\nexport default SourceTokenCreate;\n","import React, {useEffect, useState, useMemo} from \"react\";\nimport {useParams, useLocation, useNavigate, Link} from \"react-router-dom\";\nimport {\n  Row,\n  Col,\n  FormGroup,\n  Label,\n  Button,\n} from \"reactstrap\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport {notify, CopyButton, RelativeTime, Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport Breadcrumbs from \"../../../Layout/Breadcrumbs\";\nimport LoaderDots from \"../../../Layout/LoaderDots\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport SeedDataDisplay from \"../../../Components/Form/SeedDataDisplay\";\n\n/*\n * Display of source token details\n */\nconst SourceTokenShow = () => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const {id} = useParams();\n  const [loading, setLoading] = useState(true);\n  const [sourceToken, setSourceToken] = useState(null);\n  const {api} = useApi();\n  const allowView = usePermission('source_tokens.view');\n  const allowEdit = usePermission('source_tokens.edit');\n  useChangeTimeline({\n    entityTypes: ['sourcetoken'],\n    parentFilters: {},\n    entity: sourceToken ? { id: sourceToken.id, name: sourceToken.label || sourceToken.token, type: 'sourcetoken' } : undefined,\n  });\n\n  if (!allowView) return null;\n\n  useEffect(() => {\n    if (!sourceToken) {\n      load();\n    }\n  }, []);\n\n  const load = async () => {\n    const result = await api.endpoints.sourceTokens.show(id);\n\n    if (result) {\n      setSourceToken(result);\n    } else {\n      notify(`Unable to load source token: ${api.error?.name || 'Unknown error'}`, 'error');\n      handleCancel();\n    }\n\n    setLoading(false);\n  };\n\n  const handleCancel = () => {\n    navigate({\n      pathname: '/publishing/source-tokens',\n      search: location.state?.search ?? '',\n    }, {replace: false});\n  };\n\n  const crumbs = useMemo(() => {\n    if (sourceToken) {\n      return [\n        {label: \"Publishing\"},\n        {label: \"Source Tokens\", to: {\n          pathname: '/publishing/source-tokens',\n          search: location.state?.search ?? '',\n        }},\n        {label: sourceToken.label || sourceToken.token || 'Token'},\n      ];\n    }\n    return [];\n  }, [sourceToken, location.state]);\n\n  return (\n    <>\n      <DocTitle pageTitle={`Source Token - ${sourceToken?.label || sourceToken?.token || ''}`} />\n      <Breadcrumbs crumbs={crumbs} />\n\n      <PageSection\n        title=\"Source Token\"\n        subtitle={sourceToken ? `${sourceToken.source?.name || ''} - ${sourceToken.vendor?.name || ''}` : ''}\n        tools={allowEdit ? (\n          <Button\n            size=\"sm\"\n            tag={Link}\n            to={{\n              pathname: `/publishing/source-tokens/${id}/edit`,\n            }}\n            state={{search: location.state?.search}}\n          >\n            Edit\n          </Button>\n        ) : null}\n      >\n        <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n        {sourceToken && (\n          <Row>\n            <Col sm={12} md={6} lg={5}>\n\n              <FormGroup>\n                <Label>Source</Label>\n                <div>\n                  <EntityId id={sourceToken.source?.id} /> {sourceToken.source?.name || '-'}\n                </div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Vendor</Label>\n                <div>\n                  <EntityId id={sourceToken.vendor?.id} /> {sourceToken.vendor?.name || '-'}\n                </div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Token</Label>\n                <div>\n                  {sourceToken.token ? (\n                    <>\n                      {sourceToken.token}{' '}\n                      <CopyButton\n                        id=\"copy-token\"\n                        textToCopy={sourceToken.token}\n                        buttonSize=\"sm\"\n                        className=\"m-0 ms-1 p-0\"\n                      />\n                    </>\n                  ) : (\n                    <i>none</i>\n                  )}\n                </div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Label</Label>\n                <div>{sourceToken.label || '-'}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Description</Label>\n                <div>{sourceToken.description || '-'}</div>\n              </FormGroup>\n\n              <div className=\"d-flex gap-4\">\n                <FormGroup>\n                  <Label>Status</Label>\n                  <div>{Utils.titleCase(sourceToken.status)}</div>\n                </FormGroup>\n\n                <FormGroup>\n                  <Label>Post Type</Label>\n                  <div>{sourceToken.post_type ? Utils.titleCase(sourceToken.post_type.replace('_', ' ')) : 'Any'}</div>\n                </FormGroup>\n              </div>\n\n              {(sourceToken.inserted_at || sourceToken.modified_at) && (\n                <div className=\"d-flex gap-4\">\n                  {sourceToken.inserted_at && (\n                    <FormGroup>\n                      <Label>Created</Label>\n                      <div><RelativeTime date={sourceToken.inserted_at} showTimezone={true} /></div>\n                    </FormGroup>\n                  )}\n                  {sourceToken.modified_at && (\n                    <FormGroup>\n                      <Label>Modified</Label>\n                      <div><RelativeTime date={sourceToken.modified_at} showTimezone={true} /></div>\n                    </FormGroup>\n                  )}\n                </div>\n              )}\n\n              {sourceToken.seed_data && (\n                <FormGroup>\n                  <Label>Seed Data</Label>\n                  <SeedDataDisplay\n                    seedData={typeof sourceToken.seed_data === 'string'\n                      ? JSON.parse(sourceToken.seed_data)\n                      : sourceToken.seed_data\n                    }\n                  />\n                </FormGroup>\n              )}\n\n            </Col>\n          </Row>\n        )}\n\n      </PageSection>\n    </>\n  );\n};\n\nexport default SourceTokenShow;\n","import React, { FC, useMemo } from 'react';\nimport { Link, useLocation } from 'react-router-dom';\nimport FlexTable from \"../../../Components/Table/FlexTable\";\nimport { RelativeTime, Stack, RowDivider } from '@thedmsgroup/mastodon-ui-components';\nimport {AnyCell} from \"../../../Components/Table/Table\";\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {SaleGroupListing, TableProps} from \"../../../types\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport {Button} from \"reactstrap\";\nimport {ChangeHistoryButton} from \"../../../Providers/ChangeProvider\";\n\ntype SaleGroupListTableProps = TableProps & {\n  data:SaleGroupListing[];\n}\n\nexport const SaleGroupTable:FC<SaleGroupListTableProps> = ({data, loading}) => {\n  const allowEdit = usePermission('sales_groups.edit');\n  const location = useLocation();\n\n\n  const columns = useMemo(() => [\n    {\n      Header: 'ID',\n      accessor: 'id',\n      Cell: ({value}: {value:number}) => <><EntityId id={value} /></>,\n      maxWidth: 60\n    },\n    {\n      Header: 'Sale Group',\n      accessor: 'name',\n      Cell: ({value, row}:{value:string, row:any}) => (\n        allowEdit ? (\n          <Link to={`/publishing/sale-groups/${row.original.id}`} state={{search: location.search}}>{value}</Link>\n        ) : (\n          <span>{value}</span>\n        )\n      ),\n    },\n    {\n      Header: 'Sources',\n      accessor: 'sources',\n      Cell:({value}:{value:SaleGroupListing[]}) => <SourcesCell sources={value} />,\n      minWidth:250,\n    },\n\n    {\n      Header: 'Sales Limit',\n      accessor: 'shared_sales_limit',\n    },\n    {\n      Header: 'Time Frame (days)',\n      accessor: 'timeframe',\n    },\n    {\n      Header: 'Exempt Buyers',\n      accessor: 'exempt_buyers',\n      Cell:({value}:{value:string[]}) => <ExemptBuyersCell buyers={value} />,\n      minWidth:150,\n    },\n    {\n      Header: 'Created',\n      accessor: 'created_at',\n      Cell: ({ value }:any) => {\n        return <RelativeTime date={value} showTimezone={true} />;\n      },\n    },\n    {\n      Header: 'Updated',\n      accessor: 'updated_at',\n      Cell: ({ value }:any) => {\n        return <RelativeTime date={value} showTimezone={true} />;\n      },\n    },\n    ...(allowEdit ? [{\n      Header: 'Actions',\n      id: 'actions',\n      Cell: ({row}:{row:any}) => {\n        return <ActionCell\n          saleGroup={row.original}\n          allowEdit={allowEdit}\n          listSearch={location.search}\n        />\n      },\n      maxWidth:80\n    }] : [])\n  ], [allowEdit, location.search]);\n\n  return (\n    <FlexTable\n      data={data}\n      columns={columns}\n      initialState={{\n        sortBy: [{id: 'name', desc: false}]\n      }}\n      className=\"sale-group-table striped\"\n      noDataMessage=\"No rows found\"\n      loading={loading}\n      />\n  )\n}\n\ntype SaleGroupActionCell = {\n  saleGroup:any;\n  allowEdit:boolean;\n  listSearch:string;\n}\nconst ActionCell = ({saleGroup, allowEdit, listSearch}:SaleGroupActionCell) => (\n  <div className=\"list-actions\">\n    {allowEdit && <Link\n      to={saleGroup.id.toString()}\n      state={{search: listSearch}}\n      title='Edit'\n      className='action-item'\n    >\n      <FaIcon icon='cog' size='1x' />\n    </Link>}\n    <ChangeHistoryButton id={saleGroup.id} name={saleGroup.name} type=\"salegroup\" />\n  </div>\n)\n\nconst SourcesCell = ({sources}:{sources:any[]}) => {\n\n  return (\n    <>\n      {sources.length > 0 ? (\n        <Stack gap=\"4px\" divider={<RowDivider/>}>\n          {sources.map((s:any, i:number) => (\n            <div key={i}>\n              <Link to={`/publishing/sources/${s.id}`} target=\"_blank\">\n                <EntityId id={s.id} />\n                {s.name}\n              </Link>\n            </div>\n          ))}\n        </Stack>\n      ) : (\n        <AnyCell />\n      )}\n    </>\n  )\n}\n\nconst ExemptBuyersCell = ({buyers}:{buyers?:string[]}) => (\n  <>\n    {buyers && buyers.length > 0 ? (\n      <Stack gap=\"4px\" divider={<RowDivider/>}>\n        {buyers.map((name:string) => <div key={name}>{name}</div>)}\n      </Stack>\n    ) : (\n      <AnyCell />\n    )}\n  </>\n)\n","import React, { useEffect, useState} from 'react';\nimport {useNavigate, useLocation} from 'react-router-dom';\nimport { notify } from '@thedmsgroup/mastodon-ui-components/lib/common/Notify';\nimport useApi from \"../../../Hooks/useApi\";\nimport { Button} from 'reactstrap';\nimport type {SaleGroupListing} from \"../../../types\";\nimport {SaleGroupTable} from \"./Table\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport {useChangeTimeline} from \"../../../Hooks/useChangeTimeline\";\n\n\nexport const SaleGroupList = () => {\n  const {api} = useApi();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const [loading, setLoading] = useState(true);\n  const [saleGroups, setSaleGroups] = useState<SaleGroupListing[]>([])\n  const allowEdit = usePermission('sales_groups.edit');\n  useChangeTimeline({ entityTypes: ['salegroup'], parentFilters: {} });\n\n  useEffect(() => {\n    load();\n  }, [])\n\n  const load = async() => {\n    setLoading(true);\n    const result = await api.endpoints.saleGroups.list();\n    if (result) {\n      setSaleGroups(result as SaleGroupListing[]);\n    } else {\n      notify(\"Unable to load Sale Group data\", \"error\");\n    }\n    setLoading(false);\n  }\n\n  const onAdd = () => {\n    navigate(\"create\", { state: { search: location.search } });\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Sale Groups\" />\n\n      <PageSection\n        title=\"Sale Groups\"\n        tools={allowEdit ? (<Button\n          size=\"sm\"\n          onClick={onAdd}\n        >\n          Add\n        </Button>) : null}\n      >\n        <SaleGroupTable\n          loading={loading}\n          data={saleGroups}\n        />\n      </PageSection>\n    </>\n  );\n}\n","import React, {useEffect, useState} from 'react';\nimport {useParams, useNavigate, Link} from 'react-router-dom';\nimport {Row, Col, FormGroup, Label, Button} from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport DocTitle from '../../../Layout/DocTitle';\nimport {notify, RelativeTime} from '@thedmsgroup/mastodon-ui-components';\nimport LoaderDots from '../../../Layout/LoaderDots';\nimport usePermission from '../../../Hooks/usePermission';\nimport useApi from '../../../Hooks/useApi';\nimport EntityId from '../../../Components/Table/EntityId';\n\nexport const SaleGroupShow = () => {\n  const navigate = useNavigate();\n  const {id} = useParams();\n  const [loading, setLoading] = useState(true);\n  const [saleGroup, setSaleGroup] = useState<any>(null);\n  const {api} = useApi();\n  const allowEdit = usePermission('sales_groups.edit');\n\n  useEffect(() => {\n    load();\n  }, []);\n\n  const load = async () => {\n    const result = await api.endpoints.saleGroups.show(id);\n    if (result) {\n      setSaleGroup(result);\n    } else {\n      notify(`Unable to load sale group: ${api.error?.name || 'Unknown error'}`, 'error');\n      navigate('/publishing/sale-groups');\n    }\n    setLoading(false);\n  };\n\n  return (\n    <>\n      <DocTitle pageTitle={`Sale Group - ${saleGroup?.name || ''}`} />\n\n      <PageSection\n        title=\"Sale Group\"\n        subtitle={saleGroup?.name || ''}\n        tools={allowEdit ? (\n          <Button\n            size=\"sm\"\n            tag={Link}\n            to={`/publishing/sale-groups/${id}/edit`}\n            state={{return: window.location.hash}}\n          >\n            Edit\n          </Button>\n        ) : null}\n      >\n        <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n        {saleGroup && (\n          <Row>\n            <Col sm={12} md={6} lg={5}>\n\n              <FormGroup>\n                <Label>Name</Label>\n                <div>{saleGroup.name}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Sources</Label>\n                <div>\n                  {saleGroup.sources?.length > 0 ? (\n                    saleGroup.sources.map((s: any, i: number) => (\n                      <div key={i}>\n                        <Link to={`/publishing/sources/${s.id}`} target=\"_blank\">\n                          <EntityId id={s.id} />\n                          {s.name}\n                        </Link>\n                      </div>\n                    ))\n                  ) : (\n                    <span className=\"text-muted\">None</span>\n                  )}\n                </div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Shared Sales Limit</Label>\n                <div>{saleGroup.shared_sales_limit ?? 0}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Timeframe (days)</Label>\n                <div>{saleGroup.timeframe ?? 0}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Exempt Buyers</Label>\n                <div>\n                  {saleGroup.exempt_buyers?.length > 0 ? (\n                    saleGroup.exempt_buyers.map((name: string) => (\n                      <div key={name}>{name}</div>\n                    ))\n                  ) : (\n                    <span className=\"text-muted\">None</span>\n                  )}\n                </div>\n              </FormGroup>\n\n              {saleGroup.created_at && (\n                <FormGroup>\n                  <Label>Created</Label>\n                  <div><RelativeTime date={saleGroup.created_at} showTimezone={true} /></div>\n                </FormGroup>\n              )}\n\n              {saleGroup.updated_at && (\n                <FormGroup>\n                  <Label>Updated</Label>\n                  <div><RelativeTime date={saleGroup.updated_at} showTimezone={true} /></div>\n                </FormGroup>\n              )}\n\n            </Col>\n          </Row>\n        )}\n\n      </PageSection>\n    </>\n  );\n};\n","import React, {useEffect, useState, useMemo} from 'react';\nimport {useLocation, useNavigate, useParams} from \"react-router-dom\";\nimport useFormState from \"../../../Hooks/useFormState\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\nimport {Row, Col, Button, Input,  FormGroup, Label, FormFeedback, FormText, Spinner} from 'reactstrap';\nimport CreatableSelect from 'react-select/creatable';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport {BlockUI} from \"ns-react-block-ui\";\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport Breadcrumbs from \"../../../Layout/Breadcrumbs\";\nimport * as Yup from \"yup\";\nimport EnhancedSelect from \"../../../Components/Form/EnhancedSelect\";\nimport {SourceOptionLabel} from \"../../../Components/Form/Select/SourceOptionLabel\";\n\nconst ValidationSchema = Yup.object().shape({\n  name: Yup.string()\n    .trim()\n    .required('Please enter a source name'),\n  //originally we were allowing blank for the numbers\n  //timeframe:Yup.number().transform((val, orig) => orig == \"\" ? undefined : val).min(1, 'Enter a positive number for timeframe, or leave blank').nullable(),\n // shared_sales_limit:Yup.number().transform((val, orig) => orig == \"\" ? undefined : val).min(1, 'Enter a positive number for sales limit, or leave blank').nullable(),\n\n  timeframe:Yup.number().transform((val, orig) => orig == \"\" ? undefined : val).min(1, 'Enter a positive number for timeframe, or leave blank').required('Timeframe is required'),\n  shared_sales_limit:Yup.number().transform((val, orig) => orig == \"\" ? undefined : val).min(1, 'Enter a positive number for sales limit, or leave blank').required('Sales Limit is required'),\n\n});\n\n\n\nexport const SaleGroupForm = () => {\n  const location = useLocation();\n  const navigate = useNavigate();\n  const params = useParams();\n  const [loading, setLoading] = useState(true);\n\n  const {api} = useApi();\n  const [sourceChoices, setSourceChoices] = useState([])\n  const [buyerNameChoices, setBuyerNameChoices] = useState<{value:string, label:string}[]>([])\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      shared_sales_limit:0,\n      timeframe:0,\n      sources:[],\n      exempt_buyers:[],\n    },\n    ValidationSchema,\n    undefined,\n    undefined,\n    { id:params.id }, // validationContext allows conditional validation\n  );\n\n  useChangeTimeline({\n    entityTypes: ['salegroup'],\n    parentFilters: {},\n    entity: params.id && formValues.name ? { id: params.id, name: formValues.name, type: 'salegroup' } : undefined,\n    enabled: !!params.id,\n  });\n\n  //Reset form on unmount\n  useEffect(() => {\n    loadChoices();\n    loadSaleGroup();\n    return () => formApi.clearForm();\n  }, [])\n\n  const loadChoices = async() => {\n    // effective buyer names as matching resolves them; free text is still allowed\n    const buyerNames = await api.endpoints.buyerNames.list()\n    if (buyerNames) {\n      setBuyerNameChoices(buyerNames.map((name:string) => ({value:name, label:name})));\n    }\n\n    const sources = await api.endpoints.sources.list({options:true})\n    if (sources) {\n      //we need to know source vertical id for the seed data builder\n      setSourceChoices(sources.map((source:any )=> {\n        return {\n          value:source.id,\n          label:source.name,\n          status:source.status,\n          vertical:source.vertical,\n          product:source.product\n        }\n      }));\n    }\n  }\n\n  const loadSaleGroup = async () => {\n    if (params.id) {\n      const result = await api.endpoints.saleGroups.show(params.id);\n      if (result) {\n\n        formApi.setValues( {\n          name: result.name,\n          shared_sales_limit: result.shared_sales_limit ?? 0,\n          timeframe:result.timeframe ?? 0,\n          sources: result.sources ? result.sources.map((s:any) => s.id.toString()) : [],\n          exempt_buyers: result.exempt_buyers ?? [],\n        })\n      } else {\n        notify(`Unabled to find the sale group`, 'error');\n      }\n    }\n    setLoading(false);\n  }\n\n  const handleSelectSources = (sources:any[]) => formApi.setValue('sources', sources);\n\n  const handleSelectExemptBuyers = (selected:any) =>\n    formApi.setValue('exempt_buyers', (selected ?? []).map((opt:any) => opt.value));\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      save();\n    }\n  }\n\n  const save = async() => {\n    setLoading(true);\n    const values = {...formValues};\n    if (!values.shared_sales_limit) {\n      values.shared_sales_limit = 0;\n    }\n\n    if (!values.timeframe) {\n      values.timeframe = 0;\n    }\n\n    let result;\n    if (params.id) {\n      result = await api.endpoints.saleGroups.update({id:params.id, ...values});\n    } else {\n      result = await api.endpoints.saleGroups.create(values);\n    }\n\n    setLoading(false);\n    if (result) {\n      notify(`The sale group has been saved`, 'success');\n      goBack();\n\n    } else {\n      notify(`Unable to save the sale group: ${api.error ? api.error.name : \"\"}`, 'error');\n    }\n  }\n\n  const goBack = () => {\n    navigate({\n      pathname: '/publishing/sale-groups',\n      search: location.state?.search ?? '',\n    });\n  };\n\n  const crumbs = useMemo(() => [\n    { label: \"Publishing\" },\n    { label: \"Sale Groups\", to: { pathname: '/publishing/sale-groups', search: location.state?.search ?? '' } },\n    ...(params.id\n      ? [{ label: formValues.name || `Sale Group ${params.id}` }]\n      : [{ label: \"Create\" }]\n    ),\n  ], [params.id, formValues.name, location.state]);\n\n  return (\n    <>\n    <DocTitle pageTitle={`${params.id ? 'Edit' : 'Create'} Sale Group`}/>\n    <Breadcrumbs crumbs={crumbs} />\n    <PageSection title={`${params.id ? 'Edit' : 'Create'} Sale Group`}>\n\n        <Row>\n\n          <Col sm={12} md={6} >\n            <BlockUI\n              blocking={loading}\n              mode=\"stretch\"\n              loader={<Spinner color=\"success\" />}\n            >\n\n            {!formIsValid\n              && (\n                <StandardAlert color=\"warning\" icon=\"alert\" className=\"alert-form-validation\">\n                  Correct the errors indicated below\n                </StandardAlert>\n              )}\n\n            <FormGroup>\n              <Label>\n                Name\n              </Label>\n              <Input\n                type=\"text\"\n                name=\"name\"\n                onChange={formApi.handleOnChange}\n                value={formValues.name || ''}\n                invalid={!!formErrors.name}\n              />\n              <FormFeedback>{formErrors.name}</FormFeedback>\n            </FormGroup>\n\n            <FormGroup>\n              <Label>Sources</Label>\n\n              <EnhancedSelect\n                value={formValues.sources}\n                options={sourceChoices}\n                controlShouldRenderValue\n                isMulti\n                isSearchable\n                onChange={handleSelectSources}\n                formatOptionLabel={SourceOptionLabel}\n                isInvalid={!!formErrors.sources}\n                invalidFeedback={formErrors.sources}\n              />\n            </FormGroup>\n\n            <FormGroup>\n              <Label>\n                Shared Sales Limit\n              </Label>\n              <Input\n                type=\"number\"\n                min={0}\n                name=\"shared_sales_limit\"\n                onChange={formApi.handleOnChange}\n                value={formValues.shared_sales_limit || ''}\n                className=\"teeny\"\n                invalid={!!formErrors.shared_sales_limit}\n              />\n              <FormFeedback>{formErrors.shared_sales_limit}</FormFeedback>\n            </FormGroup>\n\n            <FormGroup>\n              <Label>\n                Timeframe (days)\n              </Label>\n              <Input\n                type=\"number\"\n                min={0}\n                name=\"timeframe\"\n                onChange={formApi.handleOnChange}\n                value={formValues.timeframe || ''}\n                className=\"teeny\"\n                invalid={!!formErrors.timeframe}\n              />\n              <FormFeedback>{formErrors.timeframe}</FormFeedback>\n            </FormGroup>\n\n            <FormGroup>\n              <Label>Exempt Buyers</Label>\n              <CreatableSelect\n                inputId=\"exempt-buyers\"\n                className=\"enhanced-select\"\n                classNamePrefix=\"enhanced-select\"\n                isMulti\n                isClearable\n                options={buyerNameChoices}\n                value={(formValues.exempt_buyers ?? []).map((name:string) => ({value:name, label:name}))}\n                onChange={handleSelectExemptBuyers}\n                placeholder=\"Select or type a buyer name...\"\n                formatCreateLabel={(input:string) => `Use \"${input}\"`}\n              />\n              <FormText>\n                Sales to these buyers are ignored by this group: they count toward neither the exclusive\n                check nor the shared sales limit. Names must match the buyer name exactly as it appears\n                on sales.\n              </FormText>\n            </FormGroup>\n\n            <div className=\"mt-2 text-end\">\n              <Button\n                size=\"sm\"\n                onClick={goBack}\n                color=\"link\"\n                className=\"me-1\"\n                disabled={loading}\n              >\n                Cancel\n              </Button>\n              <Button\n                onClick={handleSave}\n                disabled={loading}\n              >\n                Save\n              </Button>\n            </div>\n            </BlockUI>\n          </Col>\n\n        </Row>\n\n    </PageSection>\n    </>\n  );\n}\n","import React, { FC, useMemo } from 'react';\nimport { Link, useLocation } from 'react-router-dom';\nimport FlexTable from \"../../../Components/Table/FlexTable\";\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {SalesFlowListing, TableProps} from \"../../../types\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport {Badge} from 'reactstrap';\n\ntype SalesFlowListTableProps = TableProps & {\n  data:SalesFlowListing[];\n}\n\nexport const SalesFlowTable:FC<SalesFlowListTableProps> = ({data, loading}) => {\n  const allowEdit = usePermission('sales_flows.edit');\n  const location = useLocation();\n  const columns = useMemo(() => [\n    {\n      Header: 'ID',\n      accessor: 'id',\n      Cell: ({value}: {value:number}) => <><EntityId id={value} /></>,\n      maxWidth: 60\n    },\n    {\n      Header: 'Name',\n      accessor: 'name',\n      Cell: ({value, row}: {value:string, row:any}) => (\n        <div>\n          <div>\n            {allowEdit\n              ? <Link to={row.original.id.toString()} state={{search: location.search}}>{row.original.name}</Link>\n              : row.original.name\n            }\n          </div>\n          {row.original.description && <small className=\"text-muted\">{row.original.description}</small>}\n        </div>\n      ),\n    },\n    {\n      Header: 'Active',\n      accessor: 'is_active',\n      Cell: ({value}: {value:boolean}) => (\n        <Badge color={value ? 'success' : 'secondary'}>{value ? 'Yes' : 'No'}</Badge>\n      ),\n      maxWidth: 80\n    },\n    {\n      Header: 'Concurrency',\n      accessor: 'concurrency',\n      maxWidth: 100\n    },\n    {\n      Header: 'Rate Limit',\n      accessor: 'rate_limit',\n      maxWidth: 100\n    },\n    {\n      Header: 'Load Interval',\n      accessor: 'load_interval',\n      maxWidth: 110\n    },\n    {\n      Header: 'Cooldown',\n      accessor: 'cooldown',\n      maxWidth: 100\n    },\n    {\n      Header: 'Updated',\n      accessor: 'updated_at',\n      Cell: ({ value }:any) => {\n        return <RelativeTime date={value} showTimezone={true} />;\n      },\n    },\n    ...(allowEdit ? [{\n      Header: 'Actions',\n      id: 'actions',\n      Cell: ({row}:{row:any}) => {\n        return <ActionCell salesFlowId={row.original.id} allowEdit={allowEdit} listSearch={location.search} />\n      },\n      maxWidth:80\n    }] : [])\n  ], [allowEdit, location.search]);\n\n  return (\n    <FlexTable\n      data={data}\n      columns={columns}\n      initialState={{\n        sortBy: [{id: 'name', desc: false}]\n      }}\n      className=\"sales-flow-table striped\"\n      noDataMessage=\"No rows found\"\n      loading={loading}\n      />\n  )\n}\n\nconst ActionCell = ({salesFlowId, allowEdit, listSearch}:{salesFlowId:number, allowEdit:boolean, listSearch:string}) => {\n\n  return (\n    <div className=\"list-actions\">\n      {allowEdit && <Link\n        to={salesFlowId.toString()}\n        state={{search: listSearch}}\n        title='Edit'\n        className='action-item'\n      >\n        <FaIcon icon='cog' size='1x' />\n      </Link>}\n    </div>\n  )\n}\n","import React, { useEffect, useState} from 'react';\nimport {useNavigate, useLocation} from 'react-router-dom';\nimport { notify } from '@thedmsgroup/mastodon-ui-components/lib/common/Notify';\nimport useApi from \"../../../Hooks/useApi\";\nimport { Button} from 'reactstrap';\nimport type {SalesFlowListing} from \"../../../types\";\nimport {SalesFlowTable} from \"./Table\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\n\nexport const SalesFlowList = () => {\n  const {api} = useApi();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const [loading, setLoading] = useState(true);\n\n  useChangeTimeline({ entityTypes: ['salesflow'] });\n  const [salesFlows, setSalesFlows] = useState<SalesFlowListing[]>([])\n  const allowEdit = usePermission('sales_flows.edit');\n\n  useEffect(() => {\n    load();\n  }, [])\n\n  const load = async() => {\n    setLoading(true);\n    const result = await api.endpoints.salesFlows.list();\n    if (result) {\n      setSalesFlows(result as SalesFlowListing[]);\n    } else {\n      notify(\"Unable to load Sales Flow data\", \"error\");\n    }\n    setLoading(false);\n  }\n\n  const onAdd = () => {\n    navigate(\"create\", { state: { search: location.search } });\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Sales Flows\" />\n\n      <PageSection\n        title=\"Sales Flows\"\n        tools={allowEdit ? (<Button\n          size=\"sm\"\n          onClick={onAdd}\n        >\n          Add\n        </Button>) : null}\n      >\n        <SalesFlowTable\n          loading={loading}\n          data={salesFlows}\n        />\n      </PageSection>\n    </>\n  );\n}\n","import React, {useEffect, useState} from 'react';\nimport {useParams, useNavigate, Link} from 'react-router-dom';\nimport {Row, Col, FormGroup, Label, Button, Badge} from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport DocTitle from '../../../Layout/DocTitle';\nimport {notify, RelativeTime} from '@thedmsgroup/mastodon-ui-components';\nimport LoaderDots from '../../../Layout/LoaderDots';\nimport usePermission from '../../../Hooks/usePermission';\nimport useApi from '../../../Hooks/useApi';\n\nexport const SalesFlowShow = () => {\n  const navigate = useNavigate();\n  const {id} = useParams();\n  const [loading, setLoading] = useState(true);\n  const [salesFlow, setSalesFlow] = useState<any>(null);\n  const {api} = useApi();\n  const allowEdit = usePermission('sales_flows.edit');\n\n  useEffect(() => {\n    load();\n  }, []);\n\n  const load = async () => {\n    const result = await api.endpoints.salesFlows.show(id);\n    if (result) {\n      setSalesFlow(result);\n    } else {\n      notify(`Unable to load sales flow: ${api.error?.name || 'Unknown error'}`, 'error');\n      navigate('/publishing/sales-flows');\n    }\n    setLoading(false);\n  };\n\n  return (\n    <>\n      <DocTitle pageTitle={`Sales Flow - ${salesFlow?.name || ''}`} />\n\n      <PageSection\n        title=\"Sales Flow\"\n        subtitle={salesFlow?.name || ''}\n        tools={allowEdit ? (\n          <Button\n            size=\"sm\"\n            tag={Link}\n            to={`/publishing/sales-flows/${id}/edit`}\n            state={{return: window.location.hash}}\n          >\n            Edit\n          </Button>\n        ) : null}\n      >\n        <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n        {salesFlow && (\n          <Row>\n            <Col sm={12} md={8} lg={6}>\n\n              <FormGroup>\n                <Label>Name</Label>\n                <div>{salesFlow.name}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Active</Label>\n                <div>\n                  <Badge color={salesFlow.is_active ? 'success' : 'secondary'}>\n                    {salesFlow.is_active ? 'Yes' : 'No'}\n                  </Badge>\n                </div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Lead Query</Label>\n                <div style={{whiteSpace: 'pre-wrap'}}>{salesFlow.lead_query || '-'}</div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Sales Script</Label>\n                <div style={{whiteSpace: 'pre-wrap'}}>{salesFlow.sales_script || '-'}</div>\n              </FormGroup>\n\n              <Row>\n                <Col sm={6}>\n                  <FormGroup>\n                    <Label>Concurrency</Label>\n                    <div>{salesFlow.concurrency ?? 0}</div>\n                  </FormGroup>\n                </Col>\n                <Col sm={6}>\n                  <FormGroup>\n                    <Label>Rate Limit</Label>\n                    <div>{salesFlow.rate_limit ?? 0}</div>\n                  </FormGroup>\n                </Col>\n              </Row>\n\n              <Row>\n                <Col sm={6}>\n                  <FormGroup>\n                    <Label>Load Interval</Label>\n                    <div>{salesFlow.load_interval ?? 0}</div>\n                  </FormGroup>\n                </Col>\n                <Col sm={6}>\n                  <FormGroup>\n                    <Label>Cooldown</Label>\n                    <div>{salesFlow.cooldown ?? 0}</div>\n                  </FormGroup>\n                </Col>\n              </Row>\n\n              {salesFlow.updated_at && (\n                <FormGroup>\n                  <Label>Updated</Label>\n                  <div><RelativeTime date={salesFlow.updated_at} showTimezone={true} /></div>\n                </FormGroup>\n              )}\n\n            </Col>\n          </Row>\n        )}\n\n      </PageSection>\n    </>\n  );\n};\n","import React, {useEffect, useState, useMemo} from 'react';\nimport {useLocation, useNavigate, useParams} from \"react-router-dom\";\nimport useFormState from \"../../../Hooks/useFormState\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {useChangeTimeline} from '../../../Hooks/useChangeTimeline';\nimport {Row, Col, Button, Input, FormGroup, Label, FormFeedback, Spinner} from 'reactstrap';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport PageSection from \"../../../Layout/PageSection\";\nimport {BlockUI} from \"ns-react-block-ui\";\nimport DocTitle from \"../../../Layout/DocTitle\";\nimport Breadcrumbs from \"../../../Layout/Breadcrumbs\";\nimport * as Yup from \"yup\";\n\nconst ValidationSchema = Yup.object().shape({\n  name: Yup.string()\n    .trim()\n    .required('Please enter a name'),\n  lead_query: Yup.string()\n    .trim()\n    .required('Please enter a lead query'),\n  sales_script: Yup.string()\n    .trim()\n    .required('Please enter a sales script URL'),\n  concurrency: Yup.number()\n    .transform((val, orig) => orig === \"\" ? undefined : val)\n    .min(0, 'Concurrency must be 0 or greater')\n    .required('Concurrency is required'),\n  rate_limit: Yup.number()\n    .transform((val, orig) => orig === \"\" ? undefined : val)\n    .min(0, 'Rate limit must be 0 or greater')\n    .required('Rate limit is required'),\n  load_interval: Yup.number()\n    .transform((val, orig) => orig === \"\" ? undefined : val)\n    .min(0, 'Load interval must be 0 or greater')\n    .nullable(),\n  cooldown: Yup.number()\n    .transform((val, orig) => orig === \"\" ? undefined : val)\n    .min(0, 'Cooldown must be 0 or greater')\n    .required('Cooldown is required'),\n});\n\nexport const SalesFlowForm = () => {\n  const location = useLocation();\n  const navigate = useNavigate();\n  const params = useParams();\n  const [loading, setLoading] = useState(true);\n\n  const {api} = useApi();\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      name: '',\n      description: '',\n      is_active: true,\n      lead_query: '',\n      sales_script: '',\n      concurrency: 1,\n      rate_limit: 0,\n      load_interval: '',\n      cooldown: 0,\n    },\n    ValidationSchema,\n    undefined,\n    undefined,\n    { id:params.id },\n  );\n\n  useChangeTimeline({\n    entityTypes: ['salesflow'],\n    parentFilters: {},\n    entity: params.id && formValues.name ? { id: params.id, name: formValues.name, type: 'salesflow' } : undefined,\n    enabled: !!params.id,\n  });\n\n  useEffect(() => {\n    loadSalesFlow();\n    return () => formApi.clearForm();\n  }, [])\n\n  const loadSalesFlow = async () => {\n    if (params.id) {\n      const result = await api.endpoints.salesFlows.show(params.id);\n      if (result) {\n        formApi.setValues({\n          name: result.name,\n          description: result.description ?? '',\n          is_active: result.is_active ?? true,\n          lead_query: result.lead_query ?? '',\n          sales_script: result.sales_script ?? '',\n          concurrency: result.concurrency ?? 1,\n          rate_limit: result.rate_limit ?? 0,\n          load_interval: result.load_interval ?? '',\n          cooldown: result.cooldown ?? 0,\n        })\n      } else {\n        notify(`Unable to find the sales flow`, 'error');\n      }\n    }\n    setLoading(false);\n  }\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      save();\n    }\n  }\n\n  const save = async() => {\n    setLoading(true);\n    const values = {...formValues};\n\n    let result;\n    if (params.id) {\n      result = await api.endpoints.salesFlows.update({id:params.id, ...values});\n    } else {\n      result = await api.endpoints.salesFlows.create(values);\n    }\n\n    setLoading(false);\n    if (result) {\n      notify(`The sales flow has been saved`, 'success');\n      goBack();\n    } else {\n      notify(`Unable to save the sales flow: ${api.error ? api.error.name : \"\"}`, 'error');\n    }\n  }\n\n  const goBack = () => {\n    navigate({\n      pathname: '/publishing/sales-flows',\n      search: location.state?.search ?? '',\n    });\n  };\n\n  const crumbs = useMemo(() => [\n    { label: \"Publishing\" },\n    { label: \"Sales Flows\", to: { pathname: '/publishing/sales-flows', search: location.state?.search ?? '' } },\n    ...(params.id\n      ? [{ label: formValues.name || `Sales Flow ${params.id}` }]\n      : [{ label: \"Create\" }]\n    ),\n  ], [params.id, formValues.name, location.state]);\n\n  return (\n    <>\n    <DocTitle pageTitle={`${params.id ? 'Edit' : 'Create'} Sales Flow`}/>\n    <Breadcrumbs crumbs={crumbs} />\n    <PageSection title={`${params.id ? 'Edit' : 'Create'} Sales Flow`}>\n\n        <Row>\n\n          <Col sm={12} md={8} >\n            <BlockUI\n              blocking={loading}\n              mode=\"stretch\"\n              loader={<Spinner color=\"success\" />}\n            >\n\n            {!formIsValid\n              && (\n                <StandardAlert color=\"warning\" icon=\"alert\" className=\"alert-form-validation\">\n                  Correct the errors indicated below\n                </StandardAlert>\n              )}\n\n            <FormGroup>\n              <Label>\n                Name\n              </Label>\n              <Input\n                type=\"text\"\n                name=\"name\"\n                onChange={formApi.handleOnChange}\n                value={formValues.name || ''}\n                invalid={!!formErrors.name}\n              />\n              <FormFeedback>{formErrors.name}</FormFeedback>\n            </FormGroup>\n\n            <FormGroup>\n              <Label>\n                Description\n              </Label>\n              <Input\n                type=\"textarea\"\n                name=\"description\"\n                onChange={formApi.handleOnChange}\n                value={formValues.description || ''}\n              />\n            </FormGroup>\n\n            <FormGroup check className=\"mb-3\">\n              <Input\n                type=\"checkbox\"\n                name=\"is_active\"\n                id=\"is_active\"\n                checked={!!formValues.is_active}\n                onChange={(e) => formApi.setValue('is_active', e.target.checked)}\n              />\n              <Label check htmlFor=\"is_active\">\n                Active\n              </Label>\n            </FormGroup>\n\n            <FormGroup>\n              <Label>\n                Lead Query\n              </Label>\n              <Input\n                type=\"textarea\"\n                name=\"lead_query\"\n                onChange={formApi.handleOnChange}\n                value={formValues.lead_query || ''}\n                invalid={!!formErrors.lead_query}\n              />\n              <FormFeedback>{formErrors.lead_query}</FormFeedback>\n            </FormGroup>\n\n            <FormGroup>\n              <Label>\n                Sales Script\n              </Label>\n              <Input\n                type=\"textarea\"\n                name=\"sales_script\"\n                onChange={formApi.handleOnChange}\n                value={formValues.sales_script || ''}\n                invalid={!!formErrors.sales_script}\n              />\n              <FormFeedback>{formErrors.sales_script}</FormFeedback>\n            </FormGroup>\n\n            <Row>\n              <Col sm={6}>\n                <FormGroup>\n                  <Label>\n                    Concurrency\n                  </Label>\n                  <Input\n                    type=\"number\"\n                    min={0}\n                    name=\"concurrency\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.concurrency ?? ''}\n                    className=\"teeny\"\n                    invalid={!!formErrors.concurrency}\n                  />\n                  <FormFeedback>{formErrors.concurrency}</FormFeedback>\n                  <small className=\"text-muted\">Max number of leads processed at the same time</small>\n                </FormGroup>\n              </Col>\n              <Col sm={6}>\n                <FormGroup>\n                  <Label>\n                    Rate Limit\n                  </Label>\n                  <Input\n                    type=\"number\"\n                    min={0}\n                    step=\"0.01\"\n                    name=\"rate_limit\"\n                    onChange={(e) => formApi.setValue('rate_limit', parseFloat(e.target.value) || 0)}\n                    value={formValues.rate_limit ?? ''}\n                    className=\"teeny\"\n                    invalid={!!formErrors.rate_limit}\n                  />\n                  <FormFeedback>{formErrors.rate_limit}</FormFeedback>\n                  <small className=\"text-muted\">Leads per second. Use decimals for slower rates (e.g. 0.5 = 1 per 2s, 0.1 = 1 per 10s). 0 = unlimited.</small>\n                </FormGroup>\n              </Col>\n            </Row>\n\n            <Row>\n              <Col sm={6}>\n                <FormGroup>\n                  <Label>\n                    Load Interval\n                  </Label>\n                  <Input\n                    type=\"number\"\n                    min={0}\n                    name=\"load_interval\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.load_interval ?? ''}\n                    className=\"teeny\"\n                    invalid={!!formErrors.load_interval}\n                  />\n                  <FormFeedback>{formErrors.load_interval}</FormFeedback>\n                  <small className=\"text-muted\">Wait time between running the load query loop. Defaults to 10 seconds if empty</small>\n                </FormGroup>\n              </Col>\n              <Col sm={6}>\n                <FormGroup>\n                  <Label>\n                    Cooldown\n                  </Label>\n                  <Input\n                    type=\"number\"\n                    min={0}\n                    name=\"cooldown\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.cooldown ?? ''}\n                    className=\"teeny\"\n                    invalid={!!formErrors.cooldown}\n                  />\n                  <FormFeedback>{formErrors.cooldown}</FormFeedback>\n                  <small className=\"text-muted\">Wait time in seconds between processing each lead</small>\n                </FormGroup>\n              </Col>\n            </Row>\n\n            <div className=\"mt-2 text-end\">\n              <Button\n                size=\"sm\"\n                onClick={goBack}\n                color=\"link\"\n                className=\"me-1\"\n                disabled={loading}\n              >\n                Cancel\n              </Button>\n              <Button\n                onClick={handleSave}\n                disabled={loading}\n              >\n                Save\n              </Button>\n            </div>\n            </BlockUI>\n          </Col>\n\n        </Row>\n\n    </PageSection>\n    </>\n  );\n}\n","import React, {useMemo} from 'react';\nimport FlexTable from \"../../../../Components/Table/FlexTable\";\nimport { DateFormatter } from '../../../../Components/Table/Table';\nimport type {Ueid} from \"../../../../types\";\n\ntype UeidTableProps = {\n  ueids: Ueid[];\n  loading?: boolean;\n}\nexport const UeidTable = ({ueids=[], loading}:UeidTableProps) => {\n\n  const columns = useMemo(\n    () => [\n      {\n        Header: 'UEID',\n        accessor: 'ueid',\n        defaultCanSort: true,\n        minWidth: 300,\n      },\n\n      // TODO: last_used\n      {\n        Header: 'Last Matched',\n        accessor: 'last_matched_at',\n        defaultCanSort: true,\n        width: 130,\n        disableGlobalFilter: true,\n        Cell: ({ value }:{value:string}) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n      {\n        Header: 'Last Sold',\n        accessor: 'last_sold_at',\n        defaultCanSort: true,\n        width: 130,\n        disableGlobalFilter: true,\n        Cell: ({ value }:{value:string}) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n      {\n        Header: 'Created',\n        accessor: 'created_at',\n        defaultCanSort: true,\n        width: 130,\n        disableGlobalFilter: true,\n        Cell: ({ value }:{value:string}) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n      {\n        Header: 'Modified',\n        accessor: 'updated_at',\n        defaultCanSort: true,\n        disableGlobalFilter: true,\n        Cell: ({ value }: {value:string}) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n\n    ],\n    [ueids],\n  );\n\n  const initialTableState = useMemo(() => ({\n    sortBy: [{ id: 'ueid', desc: false }],\n  }), []);\n\n  return (\n    <FlexTable\n      columns={columns}\n      initialState={initialTableState}\n      className=\"vendors-table striped\"\n      data={ueids}\n      loading={loading}\n      noDataMessage=\"No UEIDs for this vendor\"\n    />\n\n  );\n}\n","import React, {useState} from \"react\";\nimport * as Yup from \"yup\";\nimport { useLocation, useNavigate} from \"react-router-dom\";\nimport useFormState from \"../../../../Hooks/useFormState\";\nimport {notify, StandardAlert, MaskedInput} from \"@thedmsgroup/mastodon-ui-components\";\nimport useApi from \"../../../../Hooks/useApi\";\nimport {Button, Col, FormFeedback, FormText, FormGroup, Input, Label, Row} from \"reactstrap\";\nimport {UeidTable} from \"./UeidTable\";\nimport EnhancedSelect from \"../../../../Components/Form/EnhancedSelect\";\nimport {LmsVerticalChoices} from \"../../../../Components/Table/FilterChoices\";\nimport {Required} from \"../../../../Components/Form/FormCommon\";\n\n/*\n * UEID\n * Shows a table of existing UEIDs and a form for adding new ones.\n * This is part of vendor edit but has its own form handling, validation, and save function.\n */\nexport const UeidValidationSchema = Yup.object().shape({\n  verticals: Yup.array().min(1, 'Select one or more verticals'),\n  prefix: Yup.string().trim().required('Prefix is required').min(3, 'Prefix must be at least 3 characters long').max(15, 'Prefix must be at most 15 characters long'),\n  network_name: Yup.string().trim().required('Network name is required'),\n  vendor_name: Yup.string().trim().required('Vendor name is required'),\n  traffic_type: Yup.string().trim().required('Traffic type is required'),\n  traffic_source: Yup.string().trim().required('Traffic source is required'),\n})\n\nconst DefaultUeidConfig = {\n  verticals: [],\n  traffic_type: \"\",\n  traffic_source: \"\",\n  vendor_name: \"\",\n  network_name: \"\",\n  prefix: \"\",\n}\n\ntype UeidsProps = {\n  vendor:Record<string, any>;\n  //onChange: (ueids: string[]) => void;\n  onUpdateCallback?: (vendor:any) => void;\n  loading: boolean;\n}\n\nconst TokenMaskOptions: any = {\n  mask: /^[a-z0-9]{0,15}$/,\n  maxLength: 15,\n  prepare: function (str:string) {\n    return str.toLowerCase();\n  },\n}\n\nexport const Ueids = ({vendor, loading, onUpdateCallback}: UeidsProps) => {\n\n  const {api} = useApi()\n  const navigate = useNavigate()\n  const location = useLocation()\n  const [saving, setSaving] = useState<boolean>(false)\n  const [newUeids, setNewUeids] = useState<string[]>([])\n  const [ueidError, setUeidError] = useState<string|null>(null)\n  const {\n    formApi,\n    formValues,\n    formErrors,\n    formIsValid,\n    } = useFormState({\n      ...DefaultUeidConfig,\n      vendor_name:vendor.name\n    }\n  , UeidValidationSchema)\n\n  const handleAdd = () => {\n    if (formApi.validate()) {\n      save()\n    }\n  }\n\n  const save = async() => {\n\n      setSaving(true)\n      setNewUeids([])\n      setUeidError(null)\n      const result = await api.endpoints.vendors.addUeids(vendor.id, formValues)\n\n      if (result) {\n        //Result is the updated vendor. Find new UEIDs\n        const currentIds = vendor.ueids.map((u:any)=>u.ueid)\n        const newIds = result.ueids\n          .map((ueidRecord:any) => ueidRecord.ueid)\n          .filter((ueid:string) => !currentIds.includes(ueid))\n        setNewUeids(newIds)\n        if (newIds.length) {\n          notify(`The UEIDs have been created`, 'success')\n          formApi.clearForm()\n          typeof onUpdateCallback === 'function' && onUpdateCallback(result)\n        } else {\n          setUeidError('No new UEIDs were created. If the UEIDs suggested by the service are the same as current ones, the current ones are kept.')\n        }\n\n      } else {\n        notify(`Unable to create UEIDs: ${api.error ? api.error.name : \"\"}`, 'error')\n        setUeidError(`Unable to create UEIDs due to server error: ${api.error ? api.error.name : \"error unspecified\"}`)\n      }\n      setSaving(false);\n  }\n\n  const handleSelectVerticals = (selectedOptions: string[]) => {\n    formApi.setValue('verticals', selectedOptions )\n  }\n\n  const onDismissNewIds = () => setNewUeids([])\n\n  const returnToList = () => {\n    formApi.clearForm()\n\n    navigate({\n        pathname: '/publishing/vendors',\n        search:location.state?.search ?? '',\n      },\n      {replace:false}\n    )\n  }\n\n  const handleChangePrefix = (value:string, mask:any) => {\n    formApi.setValue('prefix', value);\n  }\n\n  return (\n    <div className=\"ueids-container\">\n      <p>\n        A UEID (Universal Event Identifier) is a standardized tracking code used to uniquely identify\n        {' '} and attribute traffic sources, vendors, and verticals across digital marketing platforms.\n      </p>\n\n\n      <Row>\n        <Col>\n          <h5>Current UEIDs</h5>\n          <UeidTable ueids={vendor.ueids || []} loading={loading} />\n        </Col>\n      </Row>\n\n\n      <Row className=\"mt-2\">\n\n        <Col sm={12} md={8} lg={6} >\n          <h5>Add UEIDs</h5>\n          <p className=\"mb-2\">\n            UEIDs will be created for each selected vertical, using the specified prefix, name, and traffic descriptors.\n          </p>\n\n          {newUeids.length > 0 && (\n            <StandardAlert  color=\"success\" dismissable onDismiss={onDismissNewIds}>\n              <div>New UEIDs created:</div>\n              <ul>\n                {newUeids.map((ueid:string) => (\n                  <li key={ueid}>\n                    <strong>{ueid}</strong>\n                  </li>\n                ))}\n              </ul>\n              <Button color=\"link\" size=\"sm\" className=\"inline mt-1\" onClick={returnToList}>\n                Return to vendors\n              </Button>\n            </StandardAlert>\n          )}\n\n          {ueidError && (\n            <StandardAlert icon=\"alert\" color=\"danger\" dismissable >\n              {ueidError}\n            </StandardAlert>\n          )}\n\n          {!formIsValid  && (\n              <StandardAlert color=\"warning\" className=\"my-2 alert-form-validation\">\n                Please correct the errors below before continuing\n              </StandardAlert>\n            )}\n\n          <FormGroup>\n            <Label for=\"network_name\">Vendor Name <Required /></Label>\n            <Input\n              type=\"text\"\n              name=\"vendor_name\"\n              onChange={formApi.handleOnChange}\n              value={formValues.vendor_name}\n              invalid={!!formErrors.vendor_name}\n              maxLength={255}\n            />\n            <FormText>\n              LMS requires that the vendor name be unique with each set of UEIDs requested.\n              {' '}If LMS rejects this vendor name, try altering this value. It will not change\n              {' '} the vendor name in Mastodon.\n            </FormText>\n            <FormFeedback>{formErrors.vendor_name}</FormFeedback>\n          </FormGroup>\n\n          <FormGroup>\n            <Label>Verticals <Required /></Label>\n\n            <EnhancedSelect\n              value={formValues.verticals || []}\n              options={LmsVerticalChoices}\n              controlShouldRenderValue\n              isMulti\n              isSearchable\n              onChange={handleSelectVerticals}\n              isInvalid={!!formErrors.verticals}\n              invalidFeedback={formErrors.verticals}\n            />\n          </FormGroup>\n\n          <FormGroup >\n            <Label for=\"traffic_type\">Traffic_type <Required /></Label>\n            <Input\n              type=\"select\"\n              bsSize=\"sm\"\n              name=\"traffic_type\"\n              value={formValues.traffic_type || ''}\n              onChange={formApi.handleOnChange}\n              invalid={!!formErrors.traffic_type}\n            >\n              <option value=\"\">Select</option>\n              <option value=\"affiliate\">Affiliate</option>\n              <option value=\"display\">Display</option>\n              <option value=\"email\">Email</option>\n              <option value=\"internalprem\">Internal Premium</option>\n              <option value=\"search\">Search</option>\n              <option value=\"seo\">SEO</option>\n              <option value=\"social\">Social</option>\n\n\n            </Input>\n            <FormFeedback>{formErrors.traffic_type}</FormFeedback>\n          </FormGroup>\n\n          <FormGroup >\n            <Label for=\"traffic_source\">Traffic Source <Required /></Label>\n            <Input\n              type=\"select\"\n              bsSize=\"sm\"\n              name=\"traffic_source\"\n              value={formValues.traffic_source || ''}\n              onChange={formApi.handleOnChange}\n              invalid={!!formErrors.traffic_source}\n            >\n              <option value=\"\">Select</option>\n              <option value=\"affiliate\">Affiliate</option>\n              <option value=\"internal\">Internal</option>\n            </Input>\n            <FormFeedback>{formErrors.traffic_source}</FormFeedback>\n          </FormGroup>\n\n          <FormGroup>\n            <Label for=\"network_name\">Network Name <Required /></Label>\n            <Input\n              type=\"text\"\n              name=\"network_name\"\n              onChange={formApi.handleOnChange}\n              value={formValues.network_name}\n              invalid={!!formErrors.network_name}\n              maxLength={255}\n            />\n\n            <FormFeedback>{formErrors.network_name}</FormFeedback>\n          </FormGroup>\n\n          <FormGroup>\n            <Label for=\"prefix\">Prefix <Required /></Label>\n\n            <MaskedInput\n              {...TokenMaskOptions}\n              type=\"text\"\n              name=\"prefix\"\n              onAccept={handleChangePrefix}\n              value={formValues.prefix}\n              invalid={!!formErrors.prefix}\n            />\n            <FormText>Lower case, alphanumeric only. 3 to 15 characters.</FormText>\n            <FormFeedback>{formErrors.prefix}</FormFeedback>\n          </FormGroup>\n\n          <div className=\"mt-2\">\n            <div className=\"d-flex align-items-center justify-content-end\">\n\n              <Button\n                disabled={!formIsValid  || saving}\n                color=\"primary\"\n                className=\"me-2\"\n                name=\"save\"\n                size=\"sm\"\n                onClick={handleAdd}\n              >\n                Add UEIDs\n              </Button>\n\n            </div>\n          </div>\n\n        </Col>\n      </Row>\n    </div>\n  )\n}\n","import React, {useState, useEffect} from \"react\";\nimport {Button, Col, FormGroup, Label, Row} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport useApi from \"../../../../Hooks/useApi\";\nimport usePermission from \"../../../../Hooks/usePermission\";\nimport IntegrationSettings from \"../../../../Components/Rules/IntegrationSettings\";\nimport StatusToggler from \"../../../../Components/Form/StatusToggler\";\nimport {IntegrationConfig, IntegrationDefinition} from \"../../../../Components/Rules/IntegrationSettings/types\";\nimport {StatusType} from \"../../../../types\";\n\n/*\n * Returns section of the vendor edit page (DMS-1325).\n * Configures the outbound return integration Mastodon dispatches to this vendor\n * when a return is requested for one of their leads (dispatched by DMS-1212).\n *\n * Backed by GET/PUT /vendors/{id}/return-integration. A 404 on GET means \"not configured yet\" --\n * a normal state (e.g. ZQ vendors, whose returns are admin-driven and never get one), not an\n * error.\n *\n * Return integrations are NOT minted per vendor. A fixed set of \"return\" type Integration\n * records (the dispatch config -- url, headers, auth, field mapping, response parsing -- used\n * by mastodon-dynamic-integrations) already exist, created through the normal Integrations\n * admin. This tab attaches a vendor to one of those existing integrations, reusing the same\n * IntegrationSettings/Editor/View components that back the rule \"Destinations\" (post-sale\n * integrations) tab -- just adapted from a list of attachments down to a single, optional one.\n *\n * The integration's own *schema* (`supported_settings`) and *status* are never touched from\n * here -- this vendor's own setting values (GET/PUT response's `settings`) and pause switch\n * (top-level `status`) are stored separately, so saving a vendor's real credentials or pausing\n * this vendor's return integration can't clobber the shared integration definition or its\n * catalog lifecycle state.\n */\n\ntype ReturnIntegrationProps = {\n  vendor: Record<string, any>;\n};\n\nconst EMPTY_CONFIG: IntegrationConfig = {name: '', settings: {}};\n\nexport const ReturnIntegration = ({vendor}: ReturnIntegrationProps) => {\n  const {api} = useApi();\n  const allowEdit = usePermission('integrations.edit');\n\n  const [loading, setLoading] = useState<boolean>(true);\n  const [definitions, setDefinitions] = useState<IntegrationDefinition[]>([]);\n  // Whether this vendor currently has a return integration attached (200 vs 404 on GET).\n  const [configured, setConfigured] = useState<boolean>(false);\n  // This vendor's own pause switch -- independent of the attached integration's own status.\n  const [status, setStatus] = useState<StatusType>('active');\n  const [config, setConfig] = useState<IntegrationConfig>(EMPTY_CONFIG);\n  // Toggles the attached integration between IntegrationSettingsView and IntegrationSettingsEditor.\n  const [editMode, setEditMode] = useState<boolean>(false);\n  // True only while attaching for the first time (nothing configured yet).\n  const [adding, setAdding] = useState<boolean>(false);\n\n  useEffect(() => {\n    load();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [vendor.id]);\n\n  const load = async () => {\n    setLoading(true);\n    setEditMode(false);\n    setAdding(false);\n\n    // Sequential, not parallel -- api.error is shared instance state on the CoreAPI singleton,\n    // so two in-flight requests would race to overwrite each other's error.\n    const definitionsResult: any = await api.endpoints.integrations.list({type: 'return', search: 'return', limit: 50});\n    if (definitionsResult) {\n      setDefinitions(definitionsResult.data || []);\n    } else {\n      notify(`Unable to load return integrations: ${api.error ? api.error.name : ''}`, 'error');\n    }\n\n    const integrationResult: any = await api.endpoints.vendors.getReturnIntegration(vendor.id);\n\n    if (integrationResult) {\n      setConfigured(true);\n      setStatus(integrationResult.status);\n      setConfig({\n        name: integrationResult.integration.name,\n        settings: integrationResult.settings || {},\n        timeout: integrationResult.timeout ?? undefined,\n      });\n    } else if (api.error?.status === 404) {\n      setConfigured(false);\n      setStatus('active');\n      setConfig(EMPTY_CONFIG);\n    } else {\n      notify(`Unable to load return integration: ${api.error ? api.error.name : ''}`, 'error');\n    }\n\n    setLoading(false);\n  };\n\n  // The vendor's pause switch saves immediately, independent of the integration box's own\n  // Cancel/Apply flow -- ops should be able to pause/resume without entering edit mode.\n  const handleStatusChange = async (_target: any, newStatus: StatusType) => {\n    const result: any = await api.endpoints.vendors.updateReturnIntegration(vendor.id, {status: newStatus});\n\n    if (result) {\n      setStatus(result.status);\n      return true;\n    }\n\n    notify(`Unable to update status: ${api.error ? api.error.name : ''}`, 'error');\n    return false;\n  };\n\n  const handleUpdate = (newConfig: IntegrationConfig) => setConfig(newConfig);\n\n  const handleCancelAdd = () => {\n    if (adding) {\n      setAdding(false);\n      setConfig(EMPTY_CONFIG);\n    }\n    // Otherwise unreachable: allowDelete={false} on the View suppresses the trash button\n    // that would call this once a return integration is configured (no detach endpoint yet --\n    // v1 scope gap).\n  };\n\n  const handleApply = async () => {\n    const definition = definitions.find((d) => d.name === config.name);\n    if (!definition) return;\n\n    const payload = {\n      integration_id: definition.id,\n      settings: config.settings,\n      timeout: config.timeout,\n    };\n\n    const result: any = await api.endpoints.vendors.updateReturnIntegration(vendor.id, payload);\n\n    if (result) {\n      notify('The return integration has been saved', 'success');\n      setConfigured(true);\n      setAdding(false);\n      setEditMode(false);\n      setStatus(result.status);\n      setConfig({\n        name: result.integration.name,\n        settings: result.settings || {},\n        timeout: result.timeout ?? undefined,\n      });\n    } else {\n      notify(`Unable to save return integration: ${api.error ? api.error.name : ''}`, 'error');\n    }\n  };\n\n  if (loading) return null;\n\n  return (\n    <div className=\"form-section vendor-return-config\">\n      <div className=\"form-section-header\">Return Notifications</div>\n      <p>Configure return notification webhooks.</p>\n\n      {configured && (\n        <FormGroup className=\"d-flex align-items-center\">\n          <Label className=\"me-2 mb-0\">Status</Label>\n          <StatusToggler\n            status={status}\n            target={vendor.id}\n            onChangeAsync={handleStatusChange}\n            allowEdit={allowEdit}\n            showArchived={false}\n          />\n        </FormGroup>\n      )}\n\n      {!configured && !adding && !allowEdit && (\n        <StandardAlert color=\"light\" icon=\"info\">No return integration is configured for this vendor.</StandardAlert>\n      )}\n\n      {!configured && !adding && allowEdit && (\n        <Button color=\"link\" onClick={() => setAdding(true)}>\n          <FaIcon icon=\"plus\" />\n          {' '}\n          Add Integration\n        </Button>\n      )}\n\n      {(configured || adding) && (\n        <Row className=\"mt-3\">\n          <Col lg={12} xl={9}>\n            <IntegrationSettings\n              index={0}\n              type=\"return\"\n              definitions={definitions}\n              config={config}\n              editMode={adding || editMode}\n              isNew={adding}\n              allowEdit={allowEdit}\n              allowControls={allowEdit}\n              allowDelete={false}\n              showExcludePii={false}\n              onUpdate={handleUpdate}\n              onDelete={handleCancelAdd}\n              onApply={handleApply}\n              setEdit={() => setEditMode(true)}\n            />\n          </Col>\n        </Row>\n      )}\n    </div>\n  );\n};\n","import React, {useEffect, useState, useMemo} from \"react\";\nimport {useParams, useLocation, useNavigate, useSearchParams} from \"react-router-dom\";\nimport {\n  Row,\n  Col,\n  Button,\n  Nav, TabContent, TabPane\n} from \"reactstrap\";\nimport PageSection from \"../../../../Layout/PageSection\";\nimport DocTitle from \"../../../../Layout/DocTitle\";\nimport {notify, TabNav} from \"@thedmsgroup/mastodon-ui-components\";\nimport useFormState from \"../../../../Hooks/useFormState\";\nimport Breadcrumbs from \"../../../../Layout/Breadcrumbs\";\nimport LoaderDots from \"../../../../Layout/LoaderDots\";\nimport usePermission from \"../../../../Hooks/usePermission\";\nimport useApi from \"../../../../Hooks/useApi\";\nimport {useChangeTimeline} from '../../../../Hooks/useChangeTimeline';\nimport {VendorForm, VendorValidationSchema} from \"./Form\";\nimport {Ueids} from \"./Ueids\";\nimport {ReturnIntegration} from \"./ReturnIntegration\";\n\n\nconst DefaultVendor = {\n  id: 0,\n  name: \"\",\n  crypto_key: \"\",\n  //ueid_config: DefaultUeidConfig\n}\n\nconst VendorEdit = () => {\n  const navigate = useNavigate()\n  const location = useLocation()\n  const {vendor_id} = useParams()\n  const [searchParams] = useSearchParams();\n  const [activeTab, setActiveTab] = useState<string>(searchParams.get('tab') || 'details')\n  const [loading, setLoading] = useState<boolean>(true)\n  const [saving, setSaving] = useState<boolean>(false)\n  const [vendor, setVendor] = useState<any>(null)\n  const {api} = useApi()\n  const allowEdit = usePermission('vendors.edit')\n  useChangeTimeline({\n    entityTypes: ['vendor'],\n    parentFilters: {},\n    entity: vendor ? { id: vendor.id, name: vendor.name, type: 'vendor' } : undefined,\n  });\n  if (!allowEdit) return null\n\n  const {\n    formApi,\n    formValues,\n    formErrors,\n    formIsValid,\n  } = useFormState({\n    ...DefaultVendor,\n  }, VendorValidationSchema)\n\n  useEffect(()=>{\n    if (!vendor) {\n      load()\n    }\n\n  }, []);\n\n  const load = async() => {\n\n    const result: any = await api.endpoints['vendors'].show(vendor_id)\n\n    if (result) {\n      setVendor(result)\n      formApi.setValues({\n        id: result.id,\n        name: result.name,\n      })\n    } else {\n      //@ts-ignore\n      notify(`Unable to load data: ${api.error ? api.error.name : \"\"}`, 'error')\n    }\n\n\n    setLoading(false)\n  }\n\n  const handleCancel = () => {\n    formApi.clearForm();\n\n    navigate({\n        pathname: '/publishing/vendors',\n        search:location.state?.search ?? '',\n      },\n      {replace:false}\n    )\n  }\n\n  const handleSave = () => {\n    if (formApi.validate()) {\n      save()\n    }\n  }\n\n  const save = async() => {\n\n    if (formIsValid) {\n      setSaving(true);\n      const params = {...formValues};\n\n      const result = await api.endpoints.vendors.update(params)\n\n      if (result) {\n        notify(`The vendor has been saved`, 'success')\n        navigate({\n            pathname: '/publishing/vendors',\n            search:location.state?.search ?? '',\n          },\n          {replace:false}\n        )\n      } else {\n        // Could get 'name already exists' error\n        if (api.error.form && api.error.form['name']) {\n          formApi.setError('name', api.error.form['name']);\n          notify(`Unable to save vendor: duplicate vendor name`, 'error')\n        } else {\n          notify(`Unable to save vendor: ${api.error ? api.error.name : \"\"}`, 'error')\n        }\n      }\n      setSaving(false);\n\n    }\n  }\n\n  const crumbs = useMemo(() => {\n    if (vendor) {\n      return [\n        {label: \"Publishing\"},\n        {label: \"Vendors\", to: {\n            pathname: '/publishing/vendors',\n            search:location.state?.search ?? '',\n          }},\n        {label: vendor.name, to: `/publishing/vendors/${vendor.id}`},\n        {label: \"Edit\"},\n      ]\n    }\n    return []\n  }, [vendor, location.state])\n\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Edit Vendor\" />\n      <Breadcrumbs  crumbs={crumbs}/>\n      <PageSection  title=\"Edit Vendor\" subtitle={vendor?.id > 0  && vendor.name}>\n        <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n        <Nav className=\"mb-3 mastodon-tabs\">\n          <TabNav\n            isActive={activeTab === 'details'}\n            setActive={setActiveTab}\n            id=\"details\"\n          >\n            Details\n          </TabNav>\n          <TabNav\n            isActive={activeTab === 'ueids'}\n            setActive={setActiveTab}\n            id=\"ueids\"\n          >\n            UEIDs\n          </TabNav>\n          <TabNav\n            isActive={activeTab === 'returns'}\n            setActive={setActiveTab}\n            id=\"returns\"\n          >\n            Returns\n          </TabNav>\n        </Nav>\n\n        <TabContent activeTab={activeTab}>\n          <TabPane tabId=\"details\">\n            <Row>\n              <Col sm={12} md={6} lg={4}>\n\n                {vendor && (\n                  <VendorForm\n                    values={formValues}\n                    errors={formErrors}\n                    onChange={formApi.handleOnChange}\n                    vendor={vendor}\n                    isValid={formIsValid}\n                  />\n                )}\n\n\n                <div className=\"mt-2\">\n                  <div className=\"d-flex align-items-center justify-content-end\">\n\n                    <Button\n                      color=\"link\"\n                      size=\"sm\"\n                      className=\"me-1\"\n                      onClick={handleCancel}\n                      disabled={saving}\n                    >\n                      Cancel\n                    </Button>\n                    <Button\n                      disabled={!formIsValid  || saving}\n                      color=\"primary\"\n                      className=\"me-2\"\n                      name=\"save\"\n                      size=\"sm\"\n                      onClick={handleSave}\n                    >\n                      Save\n                    </Button>\n\n                  </div>\n                </div>\n\n              </Col>\n            </Row>\n\n\n          </TabPane>\n\n          <TabPane tabId=\"ueids\">\n\n            <Row>\n              <Col sm={12} md={8}>\n\n                {vendor && (\n                  <Ueids vendor={vendor} onUpdateCallback={setVendor} loading={loading} />\n                )}\n\n              </Col>\n            </Row>\n\n          </TabPane>\n\n          <TabPane tabId=\"returns\">\n\n            <Row>\n              <Col sm={12} md={8}>\n\n                {vendor && (\n                  <ReturnIntegration vendor={vendor} />\n                )}\n\n              </Col>\n            </Row>\n\n          </TabPane>\n\n        </TabContent>\n\n      </PageSection>\n    </>\n\n  )\n}\n\nexport default VendorEdit\n","import React, {useState} from \"react\";\nimport {useLocation, useNavigate} from \"react-router-dom\";\nimport {\n  Row,\n  Col,\n  Button,\n} from \"reactstrap\";\nimport PageSection from \"../../../../Layout/PageSection\";\nimport DocTitle from \"../../../../Layout/DocTitle\";\nimport {StandardAlert, notify } from \"@thedmsgroup/mastodon-ui-components\";\nimport useFormState from \"../../../../Hooks/useFormState\";\nimport Breadcrumbs from \"../../../../Layout/Breadcrumbs\";\nimport LoadingBar from \"../../../../Layout/LoadingBar\";\nimport {VendorForm, VendorValidationSchema} from \"./Form\";\nimport usePermission from \"../../../../Hooks/usePermission\";\nimport useApi from \"../../../../Hooks/useApi\";\n\n/*\n * Page for creating a vendor\n *\n * We stay on this page after vendor creation (instead of returning to the list)\n * because we present some server-generated keys that can be copied.\n *\n * Creating UEIDs can be done on the edit page\n */\n\n\nconst DefaultVendor = {\n  id: 0,\n  name: \"\",\n  crypto_key: \"\",\n}\n\n\nconst VendorCreate = () => {\n  const navigate = useNavigate()\n  const location = useLocation()\n  const [saving, setSaving] = useState<boolean>(false)\n  const [vendor, setVendor] = useState<any>()\n\n  const {api} = useApi()\n  const allowEdit = usePermission('vendors.create')\n  if (!allowEdit) return null\n\n\n  const {\n    formApi,\n    formValues,\n    formErrors,\n    formIsValid,\n  } = useFormState({\n    ...DefaultVendor,\n  }, VendorValidationSchema)\n\n\n  const handleCancel = () => {\n    formApi.clearForm();\n\n    navigate({\n        pathname: '/publishing/vendors',\n        search:location.state?.search ?? '',\n      },\n      {replace:false}\n    )\n  }\n\n  const handleSave = () => {\n    if (formApi.validate()) {\n      save()\n    }\n  }\n\n  const save = async() => {\n\n      setSaving(true);\n      const params = {...formValues}\n\n      if (!params.parent_id) {\n        params.parent_id = null\n      }\n\n      params.create_auth_token = true\n      const result = await api.endpoints.vendors.create(params)\n\n      if (result) {\n        setVendor(result)\n        notify(`The vendor has been created`, 'success')\n\n      } else {\n        // Could get 'name already exists' error\n        if (api.error.form && api.error.form['name']) {\n          formApi.setError('name', api.error.form['name']);\n          notify(`Unable to save vendor: duplicate vendor name`, 'error')\n        } else {\n          notify(`Unable to save vendor: ${api.error ? api.error.name : \"\"}`, 'error')\n        }\n\n      }\n      setSaving(false)\n  }\n\n  const returnToList = () => {\n    formApi.clearForm()\n\n    navigate({\n        pathname: '/publishing/vendors',\n        search:location.state?.search ?? '',\n      },\n      {replace:false}\n    )\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Create Vendor\" />\n\n      <Breadcrumbs  crumbs={[\n        {label: \"Publishing\"},\n        {label: \"Vendors\", to: {\n            pathname: '/publishing/vendors',\n            search:location.state?.search ?? '',\n          }},\n        {label: \"Create\"},\n      ]}/>\n\n      <PageSection  title=\"Create Vendor\" subtitle={vendor?.id > 0  && vendor.name}>\n        <LoadingBar />\n\n        {vendor\n          && (\n            <StandardAlert color=\"success\" className=\"my-2 alert\">\n              <div>The vendor was created with the keys below.</div>\n              <Button color=\"link\" size=\"sm\"  onClick={returnToList}>\n                Return to list\n              </Button>\n            </StandardAlert>\n          )}\n\n        <Row>\n          <Col sm={12} md={6} lg={4}>\n            <VendorForm\n              values={formValues}\n              errors={formErrors}\n              onChange={formApi.handleOnChange}\n              isNew={typeof vendor === undefined}\n              vendor={vendor}\n              isValid={formIsValid}\n            />\n\n            <div className=\"mt-2\">\n              <div className=\"d-flex align-items-center justify-content-end\">\n\n                <Button\n                  color=\"link\"\n                  size=\"sm\"\n                  className=\"me-1\"\n                  onClick={handleCancel}\n                  disabled={saving}\n                >\n                  Cancel\n                </Button>\n                <Button\n                  disabled={!formIsValid  || saving || vendor}\n                  color=\"primary\"\n                  className=\"me-2\"\n                  name=\"save\"\n                  size=\"sm\"\n                  onClick={handleSave}\n                >\n                  Save\n                </Button>\n\n              </div>\n            </div>\n\n          </Col>\n\n        </Row>\n      </PageSection>\n    </>\n  )\n}\n\nexport default VendorCreate\n","import React, {useEffect, useState, useMemo} from \"react\";\nimport {useParams, useLocation, useNavigate, Link} from \"react-router-dom\";\nimport {\n  Row,\n  Col,\n  FormGroup,\n  Label,\n  Button,\n} from \"reactstrap\";\nimport PageSection from \"../../../../Layout/PageSection\";\nimport DocTitle from \"../../../../Layout/DocTitle\";\nimport {notify, CopyButton, RelativeTime} from \"@thedmsgroup/mastodon-ui-components\";\nimport Breadcrumbs from \"../../../../Layout/Breadcrumbs\";\nimport LoaderDots from \"../../../../Layout/LoaderDots\";\nimport usePermission from \"../../../../Hooks/usePermission\";\nimport useApi from \"../../../../Hooks/useApi\";\nimport {useChangeTimeline} from '../../../../Hooks/useChangeTimeline';\nimport {UeidTable} from \"./UeidTable\";\n\n/*\n * Display of vendor details\n */\nconst VendorShow = () => {\n  const navigate = useNavigate()\n  const location = useLocation()\n  const {vendor_id} = useParams()\n  const [loading, setLoading] = useState<boolean>(true)\n  const [vendor, setVendor] = useState<any>(null)\n  const {api} = useApi()\n  const allowView = usePermission('vendors.view')\n  const allowEdit = usePermission('vendors.edit')\n  useChangeTimeline({\n    entityTypes: ['vendor'],\n    parentFilters: {},\n    entity: vendor ? { id: vendor.id, name: vendor.name, type: 'vendor' } : undefined,\n  });\n  if (!allowView) return null\n\n\n  useEffect(()=>{\n    if (!vendor) {\n      load()\n    }\n\n  }, []);\n\n  const load = async() => {\n\n    const result: any = await api.endpoints['vendors'].show(vendor_id)\n\n    if (result) {\n      setVendor(result)\n\n    } else {\n      //@ts-ignore\n      notify(`Unable to load data: ${api.error ? api.error.name : \"\"}`, 'error')\n    }\n\n\n    setLoading(false)\n  }\n\n  const handleCancel = () => {\n\n\n    navigate({\n        pathname: '/publishing/vendors',\n        search:location.state?.search ?? '',\n      },\n      {replace:false}\n    )\n  }\n\n\n\n  const crumbs = useMemo(() => {\n    if (vendor) {\n      return [\n        {label: \"Publishing\"},\n        {label: \"Vendors\", to: {\n            pathname: '/publishing/vendors',\n            search:location.state?.search ?? '',\n          }},\n        {label: vendor.name},\n      ]\n    }\n    return []\n  }, [vendor, location.state])\n\n  const authToken = vendor?.auth_tokens?.[0]?.token || ''\n\n  return (\n    <>\n      <DocTitle pageTitle={`Vendor Details - ${vendor?.name ?? ''}`} />\n      <Breadcrumbs  crumbs={crumbs}/>\n      <PageSection\n        title=\"Vendor\"\n        subtitle={vendor?.name ?? ''}\n        tools={allowEdit  ? (\n          <Button size=\"sm\" tag={Link}\n                  to={{\n                    pathname: `/publishing/vendors/${vendor?.id}/edit`,\n                  }}\n                  state={{search: location.state?.search ?? ''}} >\n            Edit\n          </Button>\n        ) : null}\n      >\n        <LoaderDots active={loading} width={120} className=\"my-3\" />\n\n        {vendor && (\n          <Row>\n            <Col sm={12} md={6} lg={4}>\n\n              <FormGroup>\n                <Label>Name</Label>\n                <div>\n                  {vendor.name ?? ''}\n                </div>\n              </FormGroup>\n\n              <div className=\"d-flex gap-4\">\n\n                <FormGroup>\n                  <Label>Created</Label>\n                  <div><RelativeTime date={vendor.inserted_at} showTimezone={true} /></div>\n                </FormGroup>\n                <FormGroup>\n                  <Label>Modified</Label>\n                  <div><RelativeTime date={vendor.modified_at} showTimezone={true} /></div>\n                </FormGroup>\n              </div>\n\n\n              <FormGroup>\n                <Label>API Key</Label>\n                <div>\n\n                  {authToken ? (\n                    <>\n                      {authToken}{' '}\n                      <CopyButton\n                        id={`copy-token`}\n                        textToCopy={authToken}\n                        buttonSize=\"sm\"\n                        className=\"m-0 ms-1 p-0\"\n                      />\n                    </>\n                  ) : (\n                    <i>none</i>\n                  )}\n                </div>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>Crypto Key</Label>\n                <div>\n                  {vendor?.crypto_key ? (\n                    <>\n                      {vendor.crypto_key}{' '}\n                      <CopyButton\n                        id={`copy-crypto`}\n                        textToCopy={vendor.crypto_key}\n                        buttonSize=\"sm\"\n                        className=\"m-0 ms-1 p-0\"\n                      />\n                    </>\n                  ) : (\n                    <i>none</i>\n                  )}\n                </div>\n              </FormGroup>\n\n\n            </Col>\n          </Row>\n        )}\n\n\n        <Row>\n          <Col sm={12} md={8}>\n\n            {vendor && (\n              <>\n                <FormGroup>\n                  <Label>UEIDs</Label>\n                  <div className=\"mt-2\">\n                    {vendor.ueids.length > 0 ? (\n                      <UeidTable ueids={vendor.ueids || []} loading={loading} />\n                    ) : (\n                      <i>None</i>\n                    )}\n                  </div>\n                </FormGroup>\n\n              </>\n            )}\n\n          </Col>\n        </Row>\n\n      </PageSection>\n    </>\n\n  )\n}\n\nexport default VendorShow\n","import React from 'react';\nimport { Routes, Route } from 'react-router-dom';\nimport ChannelList from './Channels/List';\nimport ChannelShow from './Channels/Show';\nimport ChannelEdit from './Channels/Edit';\nimport ChannelCreate from './Channels/Create';\nimport SourceList from './Sources/List';\nimport SourceCreate from './Sources/Create';\nimport SourceEdit from './Sources/Edit';\nimport SourceShow from './Sources/Show';\nimport VendorsList from './Vendors/List';\nimport PhoneNumberList from './PhoneNumbers/List';\nimport SourceTokenList from \"./SourceToken/List\";\nimport SourceTokenEdit from \"./SourceToken/Edit\";\nimport SourceTokenCreate from \"./SourceToken/Create\";\nimport SourceTokenShow from \"./SourceToken/Show\";\nimport {SaleGroupList} from \"./SaleGroup\";\nimport {SaleGroupShow} from \"./SaleGroup/Show\";\nimport {SaleGroupForm} from \"./SaleGroup/Edit\";\nimport {SalesFlowList} from \"./SalesFlows\";\nimport {SalesFlowShow} from \"./SalesFlows/Show\";\nimport {SalesFlowForm} from \"./SalesFlows/Edit\";\nimport VendorEdit from './Vendors/Vendor/Edit';\nimport VendorCreate from './Vendors/Vendor/Create'\nimport VendorShow from './Vendors/Vendor/Show'\nimport ProtectedRoute from '../../Components/ProtectedRoute';\nimport './styles.scss';\nimport NotFoundPage from '../../Layout/NotFoundPage'\n\n/*\n * Entry point to all publishing routes\n */\nconst PublisherManager = () => (\n\n  <Routes>\n\n    <Route path=\"channels\" element={<ProtectedRoute permission=\"channels.view\" />} >\n      <Route index element={<ChannelList />} />\n      <Route path=\":id\" element={<ChannelShow />} />\n    </Route>\n    <Route path=\"channels/:id/edit\" element={<ProtectedRoute permission=\"channels.edit\" />} >\n      <Route index element={<ChannelEdit />} />\n    </Route>\n    <Route path=\"channels/create\" element={<ProtectedRoute permission=\"channels.create\" />} >\n      <Route index element={<ChannelCreate />} />\n    </Route>\n\n    <Route path=\"sources\" element={<ProtectedRoute permission=\"sources.view\" /> } >\n      <Route index element={<SourceList />} />\n      <Route path=\":id/edit\" element={<SourceEdit />} />\n      <Route path=\":id\" element={<SourceShow />} />\n      <Route path=\"create\" element={<SourceCreate />} />\n    </Route>\n\n    <Route path=\"sources/phone-numbers\" element={<ProtectedRoute permission=\"phone_numbers.view\" /> } >\n      <Route index element={<PhoneNumberList />} />\n    </Route>\n\n    <Route path=\"vendors\" element={<ProtectedRoute permission=\"vendors.view\" /> } >\n      <Route index element={<VendorsList />} />\n      <Route path={\":vendor_id/edit\"} element={<VendorEdit />}/>\n      <Route path={\":vendor_id\"} element={<VendorShow />}/>\n      {/*<Route path={\":schema_id\"} element={<InputSchemaShow />}  handle={{crumb:'Show', title:'show'}} />*/}\n      <Route path={\"create\"} element={<VendorCreate />} />\n    </Route>\n\n    <Route path=\"source-tokens\" element={<ProtectedRoute permission=\"source_tokens.view\" />}>\n      <Route index element={<SourceTokenList />} />\n      <Route path=\":id\" element={<SourceTokenShow />} />\n    </Route>\n    <Route path=\"source-tokens/:id/edit\" element={<ProtectedRoute permission=\"source_tokens.edit\" />}>\n      <Route index element={<SourceTokenEdit />} />\n    </Route>\n    <Route path=\"source-tokens/create\" element={<ProtectedRoute permission=\"source_tokens.create\" />}>\n      <Route index element={<SourceTokenCreate />} />\n    </Route>\n\n    <Route path=\"sale-groups\" element={<ProtectedRoute permission=\"sales_groups.view\" />}>\n      <Route index element={<SaleGroupList />} />\n      <Route path=\":id\" element={<SaleGroupShow />} />\n    </Route>\n    <Route path=\"sale-groups/:id/edit\" element={<ProtectedRoute permission=\"sales_groups.edit\" />}>\n      <Route index element={<SaleGroupForm />} />\n    </Route>\n    <Route path=\"sale-groups/create\" element={<ProtectedRoute permission=\"sales_groups.edit\" />}>\n      <Route index element={<SaleGroupForm />} />\n    </Route>\n\n    <Route path=\"sales-flows\" element={<ProtectedRoute permission=\"sales_flows.view\" />}>\n      <Route index element={<SalesFlowList />} />\n      <Route path=\":id\" element={<SalesFlowShow />} />\n    </Route>\n    <Route path=\"sales-flows/:id/edit\" element={<ProtectedRoute permission=\"sales_flows.edit\" />}>\n      <Route index element={<SalesFlowForm />} />\n    </Route>\n    <Route path=\"sales-flows/create\" element={<ProtectedRoute permission=\"sales_flows.edit\" />}>\n      <Route index element={<SalesFlowForm />} />\n    </Route>\n\n    <Route path=\"*\" element={<NotFoundPage />} />\n  </Routes>\n\n);\n\nPublisherManager.displayName = 'PublisherManager';\nexport default PublisherManager;\n","import React from 'react';\n\nconst FilterLabelMap = {\n  channels: 'CHANNEL',\n  verticals: 'VERTICAL',\n  sources: 'SOURCE',\n  states: 'STATE',\n  products: 'PRODUCT',\n  devices: 'DEVICE',\n  accounts: 'ACCOUNT',\n  vendors: 'VENDOR',\n  tags: 'TAG',\n  currentlyInsured: 'INSURED',\n};\n\nconst FilterSummary = ({ summaryData }) => {\n  // TBD:Limit length of each filter. Limit total length.\n  if (!summaryData || Object.keys(summaryData).length === 0) {\n    return (<i>No filters applied. Click to add filters.</i>);\n  }\n\n  return (\n    <span>\n      {Object.entries(summaryData).map(([filterName, val], i) => {\n        if (Array.isArray(val) && val.length > 0) {\n          return (\n            <span key={i}>\n              <strong>\n                {FilterLabelMap[filterName]}\n                :\n              </strong>\n              {val.join(',')}\n            </span>\n          );\n        }\n      }).reduce((prev, curr) => [prev, ', ', curr])}\n    </span>\n  );\n};\n\nexport default FilterSummary;\n","import React, { useRef } from 'react';\nimport {\n  Button, FormGroup, Input, Label,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\n\n/*\n * Warning Prompt for long query times in Aggregate Reports\n */\nconst LoadTimeWarning = ({ onDismiss }) => {\n  const chkRef = useRef();\n\n  const handleCancel = () => {\n    onDismiss(false, chkRef.current.checked);\n  };\n\n  const handleLoad = () => {\n    onDismiss(true, chkRef.current.checked);\n  };\n\n  return (\n    <div id=\"load-warning-container\">\n\n      <div className=\"load-warning text-center\">\n        <div>Longer date ranges will take a while to load. Continue?</div>\n        <div className=\"mt-2 mb-1\">\n          <Button color=\"primary\" onClick={handleLoad} className=\"me-1\">Yes, load it</Button>\n          <Button onClick={handleCancel} outline>Cancel</Button>\n        </div>\n        <FormGroup check>\n          <Label check>\n            <Input\n              type=\"checkbox\"\n              defaultValue={false}\n              innerRef={chkRef}\n            />\n            Do not warn me again\n          </Label>\n        </FormGroup>\n      </div>\n\n    </div>\n  );\n};\n\n/*\nExisting loading element\n<div class=\"-loading active -active\"> //absolute overlay\n  <div>\n    <div role=\"status\" class=\"spinner-border text-secondary\">\n      <span class=\"sr-only\">Loading...</span>\n    </div>\n   </div>\n\n </div>\n */\n\nLoadTimeWarning.propTypes = {\n  onDismiss: PropTypes.func.isRequired,\n};\nexport default LoadTimeWarning;\n","import React, { useState, useEffect } from 'react';\nimport {\n  UncontrolledDropdown, DropdownMenu, DropdownToggle, Spinner,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {\n  subWeeks, subMonths, startOfISOWeek, startOfMonth, endOfISOWeek, endOfMonth, differenceInDays,\n} from 'date-fns';\nimport classnames from 'classnames';\nimport isEqual from 'react-fast-compare';\nimport { Filter, StackedFilter } from '../../Components/Table/Filter';\nimport FilterBar from '../../Components/Table/FilterBar';\nimport { StateChoices, ProductChoices } from '../../Components/Table/FilterChoices';\nimport FilterSummary from './FilterSummary';\nimport usePermission from '../../Hooks/usePermission';\nimport LocalStorageService from '../../Services/LocalStorageService';\nimport LoadTimeWarning from './LoadTimeWarning';\nimport './styles.scss';\nimport RightDateAndControls from '../../Components/Table/RightDateAndControls';\n\nconst LOAD_WARNING_THRESHOLD_DAYS = 29;\nconst DISABLE_LOAD_WARNING_KEY = 'disable_report_load_warning';\n\nconst StaticChoices = {\n  product: ProductChoices,\n  device: [\n    { value: 'Mobile', label: 'Mobile' },\n    { value: 'Desktop', label: 'Desktop' },\n    { value: 'Tablet', label: 'Tablet' },\n    { value: 'Other', label: 'Other' },\n  ],\n  state: StateChoices,\n  boolean: [\n    { value: 'true', label: 'Yes' },\n    { value: 'false', label: 'No' },\n    { value: 'null', label: 'Unknown' },\n  ],\n  advertiser_groupBy: [\n    { value: 'time_day', label: 'Date' },\n    { value: 'time_month', label: 'Month' },\n    { value: 'time_hour', label: 'Hour' },\n    { value: 'account', label: 'Account' },\n    { value: 'ad', label: 'Ad' },\n    { value: 'channel', label: 'Channel' },\n    { value: 'product', label: 'Product' },\n    { value: 'vertical', label: 'Vertical' },\n    { value: 'state', label: 'State' },\n    { value: 'device_type', label: 'Device' },\n    { value: 'tags', label: 'Tags' },\n    { value: 'currently_insured', label: 'Currently Insured' },\n    { value: 'goal_name', label: 'Goal Name' },\n    { value: 'buyer_name', label: 'Buyer Name' },\n  ],\n  vendor_groupBy: [\n    { value: 'time_day', label: 'Date' },\n    { value: 'time_month', label: 'Month' },\n    { value: 'time_hour', label: 'Hour' },\n    { value: 'vendor', label: 'Vendor' },\n    { value: 'source', label: 'Source' },\n    { value: 'product', label: 'Product' },\n    { value: 'vertical', label: 'Vertical' },\n    { value: 'state', label: 'State' },\n    { value: 'device_type', label: 'Device' },\n    { value: 'currently_insured', label: 'Currently Insured' },\n    { value: 'buyer_name', label: 'Buyer Name' },\n  ],\n  pivot: [\n    { value: 'time_day', label: 'Day to Day' },\n    { value: 'time_week', label: 'Week to Week (selected dates)' },\n    { value: 'time_week_v_last', label: 'This Week vs Last Week' },\n    { value: 'time_month', label: 'Month to Month (selected dates)' },\n    { value: 'time_month_v_last', label: 'This Month vs Last Month' },\n  ],\n};\n\n/*\n * A set of filter widgets to modify the query underlying a report.\n * For use with AggregateReport (advertiser, publisher)\n */\nconst ReportsFilters = (props) => {\n  const [choicesLoading, setChoicesLoading] = useState(true);\n  const [choices, setChoices] = useState({});\n  const [summaries, setSummaries] = useState({\n    filterSummary: null,\n    groupBySummary: null,\n    compareSummary: null,\n  });\n  const allowVendorView = usePermission('vendor_reports.view');\n\n  // Pending state pattern: track uncommitted filter changes locally\n  const [pendingSettings, setPendingSettings] = useState(props.settings);\n  const [showLoadWarning, setShowLoadWarning] = useState(false);\n  const [disableLoadWarning] = useState(() => !!LocalStorageService.getLocalItem(DISABLE_LOAD_WARNING_KEY));\n\n  // Sync pendingSettings from parent when filters change externally (back/forward nav)\n  useEffect(() => {\n    if (!isEqual(props.settings, pendingSettings)) {\n      setPendingSettings(props.settings);\n    }\n  }, [props.settings]);\n\n  useEffect(() => {\n    // Wait for all choices (static and from API) to be set in state, then summarize current filters\n\n    const getChoices = async () => {\n      const { choices, defaults } = await props.dataSource.getFilterOptions();\n      const staticChoices = { ...StaticChoices };\n      // staticChoices.advertiser_groupBy = staticChoices.advertiser_groupBy.filter(opt => !opt.version || opt.version === props.version);\n      // staticChoices.vendor_groupBy = staticChoices.vendor_groupBy.filter(opt => !opt.version || opt.version === props.version);\n\n      if (!allowVendorView) {\n        staticChoices.vendor_groupBy = staticChoices.vendor_groupBy.filter((opt) => opt.value !== 'vendor');\n      }\n      // if no permissions for sources, source filter choices are empty. Remove from static groupBy choices.\n      if (choices.sources && choices.sources.length === 0) {\n        staticChoices.vendor_groupBy = staticChoices.vendor_groupBy.filter((opt) => opt.value !== 'source');\n      }\n      setChoicesLoading(false);\n      setChoices({ ...staticChoices, ...choices });\n\n      // Set some default settings derived from choices response\n      let newSettings = {};\n      // Defaults object (expect array if empty)\n      if (defaults && !Array.isArray(defaults) && Object.keys(defaults).length) {\n        newSettings = defaults;\n      }\n      // just one account, preselect\n      if (choices.accounts.length === 1) {\n        newSettings = { accounts: choices.accounts[0].value, ...newSettings };\n      }\n\n      // Merge any defaults into pending settings\n      if (Object.keys(newSettings).length) {\n        setPendingSettings((prev) => ({ ...newSettings, ...prev }));\n      }\n    };\n    if (Object.keys(choices).length === 0) {\n      getChoices();\n    }\n  }, []);\n\n  // Update filter summary\n  useEffect(() => {\n    // choices loaded async\n    if (Object.keys(choices).length > 0) {\n      summarizeFilterSettings();\n    }\n  }, [pendingSettings, choices]);\n\n  const onChangeDate = (selection) => {\n    mergeSettings({\n      startDate: selection.startDate,\n      endDate: selection.endDate,\n    });\n  };\n\n  const onTimezoneChange = (tz) => {\n    mergeSettings({\n      timezone: tz,\n    });\n  };\n\n  const onFilterChange = (filterName, val) => mergeSettings({ [filterName]: val });\n\n  const onCompareFilterChange = (filterName, val) => {\n    let { startDate, endDate } = pendingSettings;\n    const now = new Date();\n    if (val === 'time_week_v_last') {\n      startDate = startOfISOWeek(subWeeks(now, 1));\n      endDate = endOfISOWeek(now);\n    } else if (val === 'time_month_v_last') {\n      startDate = startOfMonth(subMonths(now, 1));\n      endDate = endOfMonth(now);\n    }\n    mergeSettings({ [filterName]: val, startDate, endDate });\n  };\n\n  const summarizeFilterSettings = () => {\n    const filterSummary = {};\n\n    Object.entries(pendingSettings).map(([key, val]) => {\n      switch (key) {\n        case 'accounts':\n          filterSummary[key] = getLabels(choices.accounts, val);\n          break;\n        case 'vendors':\n          filterSummary[key] = getLabels(choices.vendors, val);\n          break;\n        case 'verticals':\n          filterSummary[key] = getLabels(choices.verticals, val);\n          break;\n        case 'channels':\n          filterSummary[key] = getLabels(choices.channels, val);\n          break;\n        case 'sources':\n          filterSummary[key] = getLabels(choices.sources, val);\n          break;\n        case 'products':\n          filterSummary[key] = getLabels(choices.product, val);\n          break;\n        case 'devices':\n          filterSummary[key] = getLabels(choices.device, val);\n          break;\n        case 'states':\n          filterSummary[key] = getLabels(choices.state, val);\n          break;\n        case 'tags':\n          filterSummary[key] = getLabels(choices.tags, val);\n          break;\n        case 'currentlyInsured':\n          filterSummary[key] = getLabels(choices.boolean, val);\n          break;\n      } // key not startDate, endDate, dateRange\n    });\n\n    Object.keys(filterSummary).forEach((key) => (filterSummary[key] == null) && delete filterSummary[key]);\n\n    let groupBySummary = null;\n    if (pendingSettings.groupBy) {\n      groupBySummary = getLabels(choices[`${props.reportType}_groupBy`], pendingSettings.groupBy);\n    }\n\n    let compareSummary = null;\n    if (pendingSettings.pivot) {\n      compareSummary = getLabels(choices.pivot, pendingSettings.pivot);\n    }\n\n    setSummaries({ filterSummary, groupBySummary, compareSummary });\n  };\n\n  const getLabels = (options, values) => {\n    if (values && Array.isArray(options)) {\n      const selected = Array.isArray(values)\n        ? options.filter((opt) => values.includes(opt.value))\n        : options.filter((opt) => opt.value.toString() === values.toString());\n\n      return selected.length ? selected.map((opt) => opt.label) : null;\n    }\n    return null;\n  };\n\n  // Update LOCAL pending state only (not parent)\n  const mergeSettings = (toMerge) => {\n    setPendingSettings({ ...pendingSettings, ...toMerge });\n  };\n\n  // Check if date range exceeds warning threshold\n  const getDateRangeDays = () => {\n    const { startDate, endDate } = pendingSettings;\n    if (startDate && endDate) {\n      return Math.abs(differenceInDays(endDate, startDate));\n    }\n    return 0;\n  };\n\n  // Called when \"View Report\" is clicked\n  const handleExecute = () => {\n    if (!disableLoadWarning && getDateRangeDays() >= LOAD_WARNING_THRESHOLD_DAYS) {\n      setShowLoadWarning(true);\n    } else {\n      commitAndExecute();\n    }\n  };\n\n  // Commit pending filters to parent and trigger load\n  const commitAndExecute = () => {\n    setShowLoadWarning(false);\n    props.onChange(pendingSettings);\n  };\n\n  // Warning dialog handlers\n  const handleWarningConfirm = (noWarn) => {\n    if (noWarn) {\n      LocalStorageService.setLocalItem(DISABLE_LOAD_WARNING_KEY, true);\n    }\n    commitAndExecute();\n  };\n\n  const handleWarningCancel = (noWarn) => {\n    if (noWarn) {\n      LocalStorageService.setLocalItem(DISABLE_LOAD_WARNING_KEY, true);\n    }\n    setShowLoadWarning(false);\n  };\n\n  const onDismissLoadTimeWarning = (doLoad, noWarn) => {\n    if (doLoad) {\n      handleWarningConfirm(noWarn);\n    } else {\n      handleWarningCancel(noWarn);\n    }\n  };\n\n  return (\n    <FilterBar>\n      {showLoadWarning && <LoadTimeWarning onDismiss={onDismissLoadTimeWarning} />}\n\n      <div className=\"d-flex justify-content-between flex-lg-column flex-xl-row position-relative\">\n        <div className={classnames('loading-overlay', { show: props.reportLoading })} />\n        <div className=\"flex-fill\">\n          <div className=\"d-flex\">\n\n            {/* Use of  inNavbar={true} disables popper and allows application of '.dropDown' animation class to menu */}\n            <UncontrolledDropdown inNavbar disabled={choicesLoading} id=\"report-filters\">\n              {/* \"nav\" makes toggle <a> rather than <button> */}\n              <DropdownToggle nav caret className=\"boxed-filter filter-group-dropdown\">\n                <FaIcon icon=\"filter\" size=\"lg\" className=\"fa-icons\" />\n                <span className=\"title d-block\">\n                  Applied Filters\n                  {choicesLoading && <Spinner size=\"sm\" color=\"secondary\" className=\"ms-1\" />}\n                </span>\n                <small>\n                  <FilterSummary summaryData={summaries.filterSummary} />\n                </small>\n              </DropdownToggle>\n\n              <DropdownMenu id=\"reports-filters-dropdown\" className=\"select-filters-dropdown animate dropDown\">\n\n                <div id=\"report-filter-menu-dropdown\" className=\"modal-body\">\n                  {props.reportType === 'advertiser'\n                  && (\n                  <StackedFilter\n                    label=\"Account\"\n                    placeholder=\"Any Account\"\n                    options={choices.accounts || []}\n                    param=\"accounts\"\n                    onChange={onFilterChange}\n                    value={pendingSettings.accounts || []}\n                    isMulti\n                  />\n                  )}\n                  {props.reportType === 'vendor'\n                  && (\n                  <StackedFilter\n                    label=\"Vendor\"\n                    placeholder=\"Any Vendor\"\n                    options={choices.vendors || []}\n                    param=\"vendors\"\n                    onChange={onFilterChange}\n                    value={pendingSettings.vendors || []}\n                    isMulti\n                  />\n                  )}\n                  <StackedFilter\n                    label=\"Vertical\"\n                    options={choices.verticals || []}\n                    param=\"verticals\"\n                    onChange={onFilterChange}\n                    placeholder=\"Any Vertical\"\n                    value={pendingSettings.verticals || []}\n                    isMulti\n                  />\n                  <StackedFilter\n                    label=\"Product\"\n                    placeholder=\"Any Product\"\n                    param=\"products\"\n                    options={choices.product || []}\n                    onChange={onFilterChange}\n                    value={pendingSettings.products || []}\n                    isMulti\n                  />\n\n                  {props.reportType === 'advertiser'\n                  && (\n                  <StackedFilter\n                    label=\"Channel\"\n                    placeholder=\"Any Channel\"\n                    options={choices.channels || []}\n                    param=\"channels\"\n                    value={pendingSettings.channels || []}\n                    onChange={onFilterChange}\n                    isMulti\n                  />\n                  )}\n\n                  {props.reportType === 'vendor'\n                  && (\n                  <StackedFilter\n                    label=\"Source\"\n                    placeholder=\"Any Source\"\n                    options={choices.sources || []}\n                    param=\"sources\"\n                    value={pendingSettings.sources || []}\n                    onChange={onFilterChange}\n                    isMulti\n                  />\n                  )}\n\n                  <StackedFilter\n                    label=\"State\"\n                    placeholder=\"Any State\"\n                    param=\"states\"\n                    options={choices.state || []}\n                    value={pendingSettings.states || []}\n                    onChange={onFilterChange}\n                    isMulti\n                  />\n                  <StackedFilter\n                    label=\"Device\"\n                    placeholder=\"Any Device\"\n                    param=\"devices\"\n                    options={choices.device || []}\n                    value={pendingSettings.devices || []}\n                    onChange={onFilterChange}\n                    isMulti\n                  />\n                  {props.reportType === 'advertiser'\n                  && (\n                  <StackedFilter\n                    label=\"Tags\"\n                    placeholder=\"Any Tag\"\n                    param=\"tags\"\n                    options={choices.tags || []}\n                    value={pendingSettings.tags || []}\n                    onChange={onFilterChange}\n                    isMulti\n                  />\n                  )}\n                  <StackedFilter\n                    label=\"Currently Insured\"\n                    placeholder=\"Any Value\"\n                    param=\"currentlyInsured\"\n                    options={choices.boolean || []}\n                    value={pendingSettings.currentlyInsured || []}\n                    onChange={onFilterChange}\n                    isMulti\n                  />\n                </div>\n\n              </DropdownMenu>\n            </UncontrolledDropdown>\n\n            <UncontrolledDropdown inNavbar className=\"ms-3\" disabled={choicesLoading}>\n              <DropdownToggle nav caret className=\"boxed-filter filter-group-dropdown\">\n                <FaIcon icon=\"th-large\" size=\"lg\" className=\"fa-icons\" />\n                <span className=\"title d-block\">Group Results</span>\n                <small>\n                  <strong>By:</strong>\n                  {' '}\n                  {summaries.groupBySummary ? summaries.groupBySummary.join(',') : <i>No grouping</i>}\n                </small>\n              </DropdownToggle>\n              <DropdownMenu id=\"reports-groupby-dropdown\" className=\"select-filters-dropdown animate dropDown\">\n\n                <div className=\"modal-body\">\n\n                  <Filter\n                    options={choices[`${props.reportType}_groupBy`] || []}\n                    value={pendingSettings.groupBy || []}\n                    param=\"groupBy\"\n                    onChange={onFilterChange}\n                    onApply={null}\n                    menuIsOpen\n                    maxMenuHeight={200}\n                    isMulti\n                  />\n                </div>\n\n              </DropdownMenu>\n            </UncontrolledDropdown>\n\n\n            <UncontrolledDropdown inNavbar className=\"ms-3\" disabled={choicesLoading}>\n              <DropdownToggle nav caret className=\"boxed-filter filter-group-dropdown\">\n                <FaIcon icon=\"columns\" size=\"lg\" className=\"fa-icons\" />\n                <span className=\"title d-block\">Compare</span>\n                <small>\n                  <strong>From:</strong>\n                  {' '}\n                  {summaries.compareSummary ? summaries.compareSummary.join(',') : <i>none</i>}\n                </small>\n              </DropdownToggle>\n              <DropdownMenu id=\"reports-compare-dropdown\" className=\"select-filters-dropdown animate dropDown\">\n\n                <div className=\"modal-body\">\n                  <Filter\n                    options={choices.pivot || []}\n                    value={pendingSettings.pivot || ''}\n                    param=\"pivot\"\n                    onChange={onCompareFilterChange}\n                    onApply={null}\n                    menuIsOpen\n                    maxMenuHeight={200}\n                    isMulti={false}\n                    controlShouldRenderValue\n                    isSearchable={false}\n                    closeMenuOnSelect\n                  />\n                </div>\n\n              </DropdownMenu>\n            </UncontrolledDropdown>\n\n          </div>\n        </div>\n\n        <RightDateAndControls\n          startDate={pendingSettings.startDate}\n          endDate={pendingSettings.endDate}\n          onChangeDate={onChangeDate}\n          onSelectTimezone={onTimezoneChange}\n          timezone={pendingSettings.timezone}\n          defaultTimezone={props.userTimezone}\n          isLoading={props.reportLoading}\n          onExecute={handleExecute}\n          executeLabel=\"View Report\"\n          onReset={props.onClear}\n          className=\"reports\"\n        />\n\n      </div>\n\n    </FilterBar>\n  );\n};\n\nReportsFilters.propTypes = {\n  userTimezone: PropTypes.string,\n  settings: PropTypes.object.isRequired,\n  defaultSettings: PropTypes.object, // need this still?\n  onChange: PropTypes.func.isRequired, // Called when user commits filters (clicks View Report)\n  onClear: PropTypes.func.isRequired,\n  reportType: PropTypes.string.isRequired, // 'advertiser' or 'vendor'\n  reportLoading: PropTypes.bool.isRequired,\n};\n\nReportsFilters.defaultProps = {\n  settings: {},\n  reportLoading: false,\n  defaultSettings: {},\n};\n\nexport default ReportsFilters;\n","// Override column labels from API response\nexport const COLUMN_LABEL_OVERRIDES = {\n  lead_accept_rate: 'Post Accept Rate',\n  total_sales: 'Sales',\n};\n\nexport const HEADER_TIPS = {\n  average_diff_top: 'Difference between this average bid and the top average bid',\n  average_diff_next_bid_up: 'Difference between this average bid and the next average bid up',\n  average_diff_next_bid_down: 'Difference between this average bid and the next average bid down',\n  bid_click_through_rate: 'Click through rate based on bids',\n  impression_click_through_rate: 'Impression click through rate',\n  cost: 'Total advertiser cost across all products (or as filtered)',\n  total_sales: 'Advertiser sale count across all products (or as filtered)',\n  cost_per_call: 'Cost per qualified call',\n  cost_per_call_transfer: 'Calls cost / Call count',\n  lead_accept_rate: 'Sales / Sale Attempts',\n  lead_posts: 'Lead sale attempts',\n  accepted_leads:'Lead sale count'\n};\n","import React from 'react';\nimport {HelpPopper}  from '@thedmsgroup/mastodon-ui-components';\nimport { HEADER_TIPS } from './constants';\n\n/*\n * Wrapper around column header content that will add a tooltip for some columns.\n * (Later, React-table will wrap this with Sorting functionality)\n */\nconst ReportHeader = (props) => {\n\n  return (\n    <div className=\"rpt-header d-flex flex-nowrap\">\n      <div>{props.label}</div>\n      {HEADER_TIPS[props.col] && <div><HelpPopper name={`rpt-head-${props.col}`}>{HEADER_TIPS[props.col]}</HelpPopper></div>}\n    </div>\n  );\n};\n\nexport default ReportHeader;\n","import * as React from 'react';\n\nconst Delta = (props) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    version=\"1.0\"\n    width={props.width}\n    height={props.height}\n    viewBox={props.viewBox}\n    preserveAspectRatio=\"xMidYMid meet\"\n    className=\"delta-icon\"\n  >\n    <metadata>\n      Created by potrace 1.16, written by Peter Selinger 2001-2019\n    </metadata>\n    <g transform=\"translate(0.000000,97.000000) scale(0.100000,-0.100000)\" fill={props.fill} stroke=\"none\">\n      <path d=\"M446 888 c-7 -18 -95 -216 -195 -441 -99 -224 -181 -409 -181 -412 0 -3 185 -5 411 -5 244 0 409 4 407 9 -2 5 -93 205 -202 445 -116 253 -205 436 -213 436 -7 0 -19 -15 -27 -32z m122 -441 c67 -155 122 -285 122 -289 0 -5 -115 -8 -256 -8 -145 0 -254 4 -252 9 21 56 253 571 257 571 3 0 61 -127 129 -283z\" />\n    </g>\n  </svg>\n);\n\nDelta.defaultProps = {\n  viewBox: '0 0 97 97',\n  width: 20,\n  height: 20,\n  fill: '#000000',\n};\n// const Delta = (props) => {\n//   return (\n//     <svg\n//       width={props.width}\n//       xmlns=\"http://www.w3.org/2000/svg\"\n//       version=\"1.0\"\n//   >\n//   <path\n//     fill={props.fill}\n//     d=\"M 20.55086,341.32427 C 20.904411,340.36177 49.415052,275.33687 83.907852,196.82448 L 146.62201,54.074695 L 150.16469,54.074483 L 153.70738,54.074271 L 213.56017,197.82427 C 246.4792,276.88677 273.59905,341.91177 273.8265,342.32427 C 274.05395,342.73677 217.01534,343.07427 147.07404,343.07427 C 26.385345,343.07427 19.940781,342.98513 20.55086,341.32427 z M 222.95534,324.13265 C 220.71825,317.81318 138.51396,119.07517 138.13811,119.07757 C 137.74414,119.08008 64.648702,284.53923 49.914232,318.7815 L 47.206452,325.07427 L 135.24756,325.07427 C 189.87191,325.07427 223.16216,324.71687 222.95534,324.13265 z \"\n//      />\n// </svg>)\n//   }\n//\n// Delta.defaultProps = {\n//   viewBox:\"0 0 290 400\",\n//   width:290,\n//   fill:'#000000'\n// };\n\nexport default Delta;\n","import React from 'react';\nimport classnames from 'classnames';\nimport { format } from 'date-fns';\nimport { VerticalMap, DateFormatter } from '../../Components/Table/Table';\nimport ReportHeader from './ReportHeader';\nimport Delta from '../../Components/Icons/Delta';\nimport { COLUMN_LABEL_OVERRIDES } from './constants';\n\n// Version 2 reports uses 'account_name' instead of 'account' (and other entities)\n// Version 2 also uses 'match_tag' instead of 'tag'\nconst TextColumns = ['account', 'account_name', 'vertical', 'goal_name', 'buyer_name',\n  'month', 'ad', 'ad_name', 'channel', 'channel_name', 'source', 'source_name', 'tag', 'match_tag',\n  'full_name', 'city', 'order_name', 'channel_name', 'purchased_time', 'state', 'currentlyInsured', 'product', 'device',\n  'disposition'];\n\nconst SmallColumns = ['cost', 'state', 'billable', 'currentlyInsured', 'product', 'device'];\n\nconst DateColumns = ['received_time', 'purchased_time'];\n\n// Determine delta value positive, negative, zero/empty\nfunction getDeltaDir(val) {\n  let dir = 0;\n  const zeroVals = ['0', '0.00', '0.00%', '$0.00'];\n  if (val) {\n    if (isNaN(val)) {\n      if (!zeroVals.includes(val)) {\n        if (val.indexOf('($') === 0 || val.indexOf('-') === 0) {\n          dir = -1;\n        } else {\n          dir = 1;\n        }\n      }\n    } else if (parseFloat(val) !== 0) {\n      dir = val > 0 ? 1 : -1;\n    }\n  }\n  return dir;\n}\n\nexport const DeltaCell = ({ value }) => {\n  const dir = getDeltaDir(value);\n  return (<div className={classnames(['delta-value', 'numeric', { negative: dir < 0, positive: dir > 0 }])}>{dir === 0 ? '-' : value}</div>);\n};\n\nexport const DeltaHeader = ({ value }) => {\n  if (value) value = value.replace('Delta', '').trim();\n  return (\n    <span>\n      <Delta width={16} fill=\"#0000cd\" />\n      {' '}\n      {value}\n    </span>\n  );\n};\n\nfunction defineColumns(columns, data, totals, pivot, pivotIndex, displayResolver = {}) {\n  const columnDefinitions = [];\n  if (data.length > 0) {\n    const keys = Object.keys(data[0]);\n    let isFirstKey = true;\n\n    for (const key of keys) {\n      if (pivot && pivotIndex === 0 && key.indexOf('_delta') > 0) {\n        // deltas for 1st pivot are all null, don't show columns\n        continue;\n      }\n\n      const colDef = {\n        dataField: key, // accessor\n        accessor: pivot ? `${pivot}.${key}` : key,\n        id: key,\n        text: key, // header\n        defaultCanSort: true,\n        sortType: 'number',\n        align: 'right',\n        headerAlign: 'right',\n        footerAlign: 'right',\n        footer: '',\n        minWidth: 130,\n        show: true,\n        className: '', // for cells\n        headerClassName: '',\n      };\n\n      if (pivot && isFirstKey) {\n        colDef.className = 'first-pivot-col'; // cell class\n        colDef.headerClassName = 'first-pivot-col';\n      }\n\n      const cellClasses = [key];\n\n      if (isFirstKey) isFirstKey = false;\n\n      if (pivot) {\n        // TODO: might use this for auto-scrolling to next/prev pivot\n        colDef.id += `-${pivot}`;\n      }\n\n      const isDeltaField = key.indexOf('_delta') > 0;\n\n      if (isDeltaField) {\n        // columnDefinition.className = 'delta'; //cell class\n        cellClasses.push('delta');\n        // columnDefinition.Header = (row)=><DeltaHeader value={columns[key].label}/>;\n        colDef.headerClassName = 'delta';\n      }\n\n      if (columns[key]) {\n        if (columns[key].hidden) {\n          colDef.show = false;\n        }\n        if (columns[key].label) {\n          const label = COLUMN_LABEL_OVERRIDES[key] || columns[key].label;\n          colDef.Header = isDeltaField ? <DeltaHeader value={label} /> : <ReportHeader label={label} col={key} />;\n        }\n        if (columns[key].sortable === false) {\n          colDef.disablySortBy = true;\n        }\n        if (columns[key].description) {\n          // Looker does not send this\n          colDef.headerTitle = () => columns[key].description;\n        }\n\n        if (SmallColumns.includes(key)) {\n          colDef.maxWidth = 130;\n          colDef.width = 130;\n        } else if (TextColumns.includes(key)) {\n          colDef.minWidth = 200;\n          colDef.width = 200;\n          colDef.sortType = 'alphanumeric';\n        }\n\n        // Formatters\n        // Looker does most formatting but we adjust some things here\n        if (isDeltaField) {\n          // added formatting for delta field (version 2 pivots)\n          colDef.Cell = (row) => <DeltaCell value={row.value} />;\n        } else {\n          // if(key === 'duration'){\n          //  columnDefinition.Cell = (row)=>DurationFormatter(row.value);\n          if (key === 'vertical') {\n            colDef.Cell = ({ value }) => VerticalMap[value] ?? value;\n            colDef.sortType = 'alphanumeric';\n          } else if (key === 'billable' && displayResolver) {\n            const Cell = displayResolver(key);\n            if (Cell) {\n              colDef.Cell = ({ value }) => <Cell value={value} trueTitle=\"Billable\" falseTitle=\"Not billable\" />;\n            }\n          } else if (DateColumns.includes(key)) {\n            // Dates from Looker are already adjusted from UTC to account timezone, no need for timezone adjustment\n            colDef.Cell = ({ value }) => <DateFormatter value={value} format=\"MMM d, yyyy h:mm aaa\" />;\n            cellClasses.push('date');\n            colDef.minWidth = 200;\n            colDef.width = 200;\n            colDef.sortType = 'datetime';\n          }\n        }\n      }\n\n      if (totals && Object.keys(totals).length && totals[key]) {\n        if (isDeltaField) {\n          // added formatting for delta field (version 2 pivots)\n          colDef.Footer = (row) => <DeltaCell value={totals[key]} />;\n        } else {\n          colDef.Footer = totals[key];\n        }\n      }\n\n      cellClasses.push(TextColumns.includes(key) ? 'text' : 'numeric');\n      colDef.className = cellClasses.join(' ');\n      colDef.headerClassName = colDef.className;\n      columnDefinitions.push(colDef);\n    }\n\n    if (totals && Object.keys(totals).length) {\n      columnDefinitions[0].Footer = 'Total';\n      columnDefinitions[0].footerClassName = 'text';\n    }\n\n    // add unique row id for react key property\n    for (let i = 0; i < data.length; i++) {\n      data[i].row_id = i;\n    }\n  }\n\n  return columnDefinitions;\n}\n\nconst PivotHeader = ({ pivot, value, index }) => {\n  let prefix = '';\n  if (pivot.indexOf('week') > 0) {\n    prefix = 'Week of: ';\n  } else if (pivot.indexOf('month') > 0) {\n    prefix = 'Month: ';\n    value = <DateFormatter value={value} format=\"MMMM, y\" />;\n  }\n  // Maybe don't need index, might use for scroll-to feature\n  return (\n    <div id={`pivot-${index}`}>\n      {prefix}\n      {value}\n    </div>\n  );\n};\n\n// Default metrics to show when user hasn't selected any\nconst DEFAULT_SELECTED_METRICS = ['bids', 'cost', 'calls', 'qualified_calls', 'average_position'];\n\n// Metric categories for organization\nexport const METRIC_CATEGORIES = {\n  performance: { label: 'Performance', metrics: ['matches', 'bids', 'average_position'] },\n  cost: { label: 'Cost', metrics: ['cost', 'lead_cost', 'calls_cost', 'clicks_cost', 'cost_per_call', 'cost_per_qualified_click', 'cost_per_call_transfer'] },\n  calls: { label: 'Calls', metrics: ['calls', 'qualified_calls', 'qualified_calls_rate', 'call_transfer_rate'] },\n  clicks: { label: 'Clicks', metrics: ['impressions', 'qualified_clicks', 'bid_click_through_rate'] },\n  leads: { label: 'Leads', metrics: ['accepted_leads'] },\n};\n\n// Format groupBy field name to human-readable label\nexport function formatGroupByLabel(groupBy) {\n  if (!groupBy) return 'Group';\n\n  // If array, use first value\n  const groupValue = Array.isArray(groupBy) ? groupBy[0] : groupBy;\n\n  // Handle undefined or empty value\n  if (!groupValue) return 'Group';\n\n  // Map common field names to readable labels\n  const labelMap = {\n    account_name: 'Account',\n    account: 'Account',\n    product: 'Product',\n    device: 'Device',\n    vertical: 'Vertical',\n    channel: 'Channel',\n    channel_name: 'Channel',\n    source: 'Source',\n    source_name: 'Source',\n    goal_name: 'Goal',\n    buyer_name: 'Buyer',\n    ad_name: 'Ad',\n  };\n\n  // Return mapped label or capitalize the field name\n  if (labelMap[groupValue]) {\n    return labelMap[groupValue];\n  }\n\n  // Fallback: capitalize and replace underscores with spaces\n  return groupValue\n    .replace(/_/g, ' ')\n    .split(' ')\n    .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n    .join(' ');\n}\n\n/**\n * Build nested hierarchy for multiple groupBy facets in pivot mode (time comparison)\n * Transforms pivot data with time slots into nested structure with subRows at each level\n *\n * @param {Array} pivotData - Array of data rows, each containing time slot objects\n * @param {Array} timeSlots - Array of time slot keys (e.g., [\"2025-10-20\", \"2025-10-27\"])\n * @param {Array} groupByFields - Array of field names to group by (e.g., ['product', 'account_name'])\n * @param {Array} metricsToShow - Array of metric keys to display\n * @param {Object} columns - Column definitions for labels\n * @param {boolean} reverseOrder - Whether to reverse the groupBy order\n * @returns {Array} Nested data structure with subRows\n */\nfunction buildNestedHierarchy(pivotData, timeSlots, groupByFields, metricsToShow, columns, reverseOrder = false) {\n  if (!pivotData || pivotData.length === 0 || !groupByFields || groupByFields.length === 0) {\n    return [];\n  }\n\n  // Reverse group order if requested (for view mode toggle)\n  const orderedGroupByFields = reverseOrder ? [...groupByFields].reverse() : groupByFields;\n\n  // Extract groupBy values from each pivot data row\n  // Each pivot row has time slots, we need to get groupBy values from first time slot\n  const flattenedData = pivotData.map((dataRow, originalIndex) => {\n    const firstSlot = timeSlots[0];\n    const groupByValues = {};\n\n    // Extract all groupBy field values\n    orderedGroupByFields.forEach(field => {\n      groupByValues[field] = dataRow[firstSlot][field];\n    });\n\n    return {\n      ...groupByValues,\n      _originalIndex: originalIndex,  // Keep reference to original pivot data row\n      _pivotRow: dataRow,             // Store the full pivot data for later\n    };\n  });\n\n  /**\n   * Recursive function to build hierarchy level by level\n   * @param {Array} dataSubset - Subset of flattened data to process at this level\n   * @param {number} levelIndex - Current depth level (0 = top level)\n   * @param {string} parentId - Parent row ID for generating unique IDs\n   */\n  function buildLevel(dataSubset, levelIndex, parentId = '') {\n    const currentField = orderedGroupByFields[levelIndex];\n    const isLastGroupLevel = levelIndex === orderedGroupByFields.length - 1;\n\n    // Group data by current field value\n    const grouped = {};\n    dataSubset.forEach(row => {\n      const groupValue = row[currentField];\n      if (!grouped[groupValue]) {\n        grouped[groupValue] = [];\n      }\n      grouped[groupValue].push(row);\n    });\n\n    // Build rows for this level\n    const rows = [];\n    Object.entries(grouped).forEach(([groupValue, groupRows], groupIndex) => {\n      const rowId = parentId ? `${parentId}_sub_${groupIndex}` : `group_${groupIndex}`;\n\n      const groupHeaderRow = {\n        row_id: rowId,\n        rowType: 'group-header',\n        groupValue,\n        label: groupValue,\n        depth: levelIndex,\n        subRows: [],\n      };\n\n      // Add empty time slot fields so react-table renders the row\n      timeSlots.forEach(slot => {\n        const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n        groupHeaderRow[`_${safeSlot}`] = '';\n        groupHeaderRow[`_${safeSlot}_delta`] = '';\n      });\n\n      if (isLastGroupLevel) {\n        // Last groupBy level - add metric rows as children\n        // At this level, groupRows should contain items that all have the same groupBy combo\n        // We need to get the pivot data for these rows\n        metricsToShow.forEach((metricKey, metricIndex) => {\n          const metricRow = {\n            row_id: `${rowId}_metric_${metricIndex}`,\n            rowType: 'metric-value',\n            metricKey,\n            groupValue,\n            label: COLUMN_LABEL_OVERRIDES[metricKey] || columns[metricKey]?.label || metricKey,\n            depth: levelIndex + 1,\n          };\n\n          // Add values for each time slot from the pivot data\n          // All rows in groupRows should reference the same pivot data row\n          const pivotRow = groupRows[0]._pivotRow;\n          timeSlots.forEach(slot => {\n            const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n            metricRow[`_${safeSlot}`] = pivotRow[slot][metricKey];\n            metricRow[`_${safeSlot}_delta`] = pivotRow[slot][`${metricKey}_delta`];\n          });\n\n          groupHeaderRow.subRows.push(metricRow);\n        });\n      } else {\n        // Not last level - recurse to next level\n        groupHeaderRow.subRows = buildLevel(groupRows, levelIndex + 1, rowId);\n      }\n\n      rows.push(groupHeaderRow);\n    });\n\n    return rows;\n  }\n\n  return buildLevel(flattenedData, 0);\n}\n\n// Parse response for transposed aggregate reports (comparison view)\n// Transposes the table so metrics are rows and time periods are columns\nexport function extractColumnsAndDataTransposed(reportResponse, groupOrder = 'account-first', selectedMetrics = null, groupBy = null) {\n  let {\n    columns, data, totals, pivot,\n  } = reportResponse;\n\n  // If no pivot, fall back to standard extraction\n  if (!pivot) {\n    return extractColumnsAndData(reportResponse);\n  }\n\n  if (!data.length) {\n    return { data: [], columns: [], columnChoices: [] };\n  }\n\n  // Get time slot keys (e.g., [\"2025-10-20\", \"2025-10-27\"])\n  const timeSlots = Object.keys(data[0]);\n\n  // Get the first time slot to analyze structure\n  const firstSlotData = data[0][timeSlots[0]];\n\n  // Identify group fields from actual data structure\n  // The groupBy parameter is used as a hint for ordering/count, but we detect actual field names from data\n  // This is important because the groupBy parameter might be \"account\" but the field name might be \"account_name\"\n\n  // First, detect what grouping fields actually exist in the data\n  const detectedGroupFields = Object.keys(firstSlotData).filter(key =>\n    !key.endsWith('_delta') &&\n    !columns[key]?.label?.includes('Delta') &&\n    typeof firstSlotData[key] === 'string' &&\n    isNaN(firstSlotData[key].replace(/[$,%]/g, ''))\n  );\n\n  // Determine which fields to use\n  let groupFields = [];\n\n  if (groupBy && Array.isArray(groupBy) && groupBy.length > 0) {\n    // groupBy provided as array - map to actual field names in data\n    // For each groupBy value, find matching field in detected fields\n    groupFields = groupBy.map(gbField => {\n      // Try exact match first\n      if (detectedGroupFields.includes(gbField)) {\n        return gbField;\n      }\n      // Try common variations (account -> account_name, etc.)\n      const variations = [\n        gbField,\n        `${gbField}_name`,\n        gbField.replace('_name', ''),\n      ];\n      const match = detectedGroupFields.find(df => variations.includes(df));\n      return match || gbField; // Fallback to original if no match found\n    }).filter(Boolean);\n  } else if (groupBy && typeof groupBy === 'string') {\n    // groupBy provided as string - find matching field in data\n    // Try exact match first\n    if (detectedGroupFields.includes(groupBy)) {\n      groupFields = [groupBy];\n    } else {\n      // Try common variations\n      const variations = [\n        groupBy,\n        `${groupBy}_name`,\n        groupBy.replace('_name', ''),\n      ];\n      const match = detectedGroupFields.find(df => variations.includes(df));\n      groupFields = match ? [match] : (detectedGroupFields.length > 0 ? [detectedGroupFields[0]] : []);\n    }\n  } else {\n    // No groupBy parameter - use first detected field\n    groupFields = detectedGroupFields.length > 0 ? [detectedGroupFields[0]] : [];\n  }\n\n  // Backward compatibility: single groupField\n  const groupField = groupFields.length > 0 ? groupFields[0] : null;\n  const hasMultipleGroupBy = groupFields.length > 1;\n\n  // Get all metric keys (excluding ALL group fields and delta fields)\n  const allMetricKeys = Object.keys(firstSlotData).filter(key =>\n    !groupFields.includes(key) && !key.endsWith('_delta')\n  );\n\n  // Determine which metrics to show\n  const metricsToShow = selectedMetrics && selectedMetrics.length > 0\n    ? allMetricKeys.filter(m => selectedMetrics.includes(m))\n    : allMetricKeys;\n\n  // Build column choices for metric selector\n  const columnChoices = allMetricKeys.map(key => ({\n    value: key,\n    label: COLUMN_LABEL_OVERRIDES[key] || columns[key]?.label || key,\n  }));\n\n  // Transform data based on view mode\n  const transformedData = [];\n\n  if (!groupField) {\n    // No grouping - just show metrics as rows with time slots as columns\n    metricsToShow.forEach((metricKey, index) => {\n      const row = {\n        row_id: index,\n        rowType: 'metric',\n        metricKey,\n        label: COLUMN_LABEL_OVERRIDES[metricKey] || columns[metricKey]?.label || metricKey,\n      };\n\n      // Add values for each time slot\n      timeSlots.forEach(slot => {\n        const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n        row[`_${safeSlot}`] = data[0][slot][metricKey];\n        row[`_${safeSlot}_delta`] = data[0][slot][`${metricKey}_delta`];\n      });\n\n      transformedData.push(row);\n    });\n    // No totals needed - totals would be the same as the single metric row\n  } else if (hasMultipleGroupBy) {\n    // Multiple groupBy facets - use nested hierarchy\n    // ViewMode controls group order: 'account-first' = normal order, 'metric-first' = reversed order\n    const reverseGroupOrder = groupOrder === 'metric-first';\n    const nestedData = buildNestedHierarchy(data, timeSlots, groupFields, metricsToShow, columns, reverseGroupOrder);\n    transformedData.push(...nestedData);\n\n    // Add totals row with simple nested structure (TOTALS → Metrics)\n    if (totals) {\n      const totalsHeaderRow = {\n        row_id: 'totals_group',\n        rowType: 'totals-header',\n        groupValue: 'Total',\n        label: 'TOTALS',\n        depth: 0,\n        subRows: [],\n      };\n\n      // Add empty time slot fields\n      timeSlots.forEach(slot => {\n        const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n        totalsHeaderRow[`_${safeSlot}`] = '';\n        totalsHeaderRow[`_${safeSlot}_delta`] = '';\n      });\n\n      // Add metric rows as children\n      metricsToShow.forEach((metricKey, metricIndex) => {\n        const row = {\n          row_id: `totals_metric_${metricIndex}`,\n          rowType: 'totals-value',\n          metricKey,\n          label: COLUMN_LABEL_OVERRIDES[metricKey] || columns[metricKey]?.label || metricKey,\n          depth: 1,\n        };\n\n        // Add values for each time slot\n        timeSlots.forEach(slot => {\n          const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n          row[`_${safeSlot}`] = totals[slot]?.[metricKey] || '-';\n          row[`_${safeSlot}_delta`] = totals[slot]?.[`${metricKey}_delta`] || '';\n        });\n\n        totalsHeaderRow.subRows.push(row);\n      });\n\n      transformedData.push(totalsHeaderRow);\n    }\n  } else {\n    // Single groupBy - create nested rows with existing logic\n    data.forEach((groupRow, groupIndex) => {\n      const groupValue = groupRow[timeSlots[0]][groupField];\n\n      if (groupOrder === 'account-first') {\n        // Add group header row with child rows nested\n        const groupHeaderRow = {\n          row_id: `group_${groupIndex}`,\n          rowType: 'group-header',\n          groupValue,\n          label: groupValue,\n          subRows: [], // Children will be added here\n        };\n\n        // Add empty time slot fields so react-table renders the row\n        timeSlots.forEach(slot => {\n          const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n          groupHeaderRow[`_${safeSlot}`] = '';\n          groupHeaderRow[`_${safeSlot}_delta`] = '';\n        });\n\n        // Add metric rows as children of this group\n        metricsToShow.forEach((metricKey, metricIndex) => {\n          const row = {\n            row_id: `group_${groupIndex}_metric_${metricIndex}`,\n            rowType: 'metric-value',\n            metricKey,\n            groupValue,\n            label: COLUMN_LABEL_OVERRIDES[metricKey] || columns[metricKey]?.label || metricKey,\n          };\n\n          // Add values for each time slot\n          timeSlots.forEach(slot => {\n            const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n            row[`_${safeSlot}`] = groupRow[slot][metricKey];\n            row[`_${safeSlot}_delta`] = groupRow[slot][`${metricKey}_delta`];\n          });\n\n          groupHeaderRow.subRows.push(row);\n        });\n\n        transformedData.push(groupHeaderRow);\n      } else {\n        // metric-first mode handled below\n      }\n    });\n\n    // Add totals row for account-first mode\n    if (groupOrder === 'account-first' && totals) {\n      const totalsHeaderRow = {\n        row_id: 'totals_group',\n        rowType: 'totals-header',\n        groupValue: 'Total',\n        label: 'Total',\n        subRows: [],\n      };\n\n      // Add empty time slot fields\n      timeSlots.forEach(slot => {\n        const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n        totalsHeaderRow[`_${safeSlot}`] = '';\n        totalsHeaderRow[`_${safeSlot}_delta`] = '';\n      });\n\n      // Add metric rows for totals\n      metricsToShow.forEach((metricKey, metricIndex) => {\n        const row = {\n          row_id: `totals_metric_${metricIndex}`,\n          rowType: 'totals-value',\n          metricKey,\n          groupValue: 'Total',\n          label: COLUMN_LABEL_OVERRIDES[metricKey] || columns[metricKey]?.label || metricKey,\n        };\n\n        // Add totals values for each time slot\n        timeSlots.forEach(slot => {\n          const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n          row[`_${safeSlot}`] = totals[slot]?.[metricKey] || '-';\n          row[`_${safeSlot}_delta`] = totals[slot]?.[`${metricKey}_delta`] || '';\n        });\n\n        totalsHeaderRow.subRows.push(row);\n      });\n\n      transformedData.push(totalsHeaderRow);\n    }\n\n    // Handle metric-first mode\n    if (groupOrder === 'metric-first') {\n      const metricGroups = {};\n\n      // Group data by metric first\n      metricsToShow.forEach((metricKey, metricIndex) => {\n        metricGroups[metricKey] = [];\n\n        data.forEach((groupRow, groupIndex) => {\n          const groupValue = groupRow[timeSlots[0]][groupField];\n          const row = {\n            row_id: `metric_${metricIndex}_group_${groupIndex}`,\n            rowType: 'group-value',\n            metricKey,\n            groupValue,\n            label: groupValue,\n          };\n\n          // Add values for each time slot\n          timeSlots.forEach(slot => {\n            const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n            row[`_${safeSlot}`] = groupRow[slot][metricKey];\n            row[`_${safeSlot}_delta`] = groupRow[slot][`${metricKey}_delta`];\n          });\n\n          metricGroups[metricKey].push(row);\n        });\n      });\n\n      // Add to transformedData in metric-first order (using metricsToShow to preserve order)\n      metricsToShow.forEach((metricKey, metricIndex) => {\n        // Add metric header row with child rows nested\n        const metricHeaderRow = {\n          row_id: `metric_header_${metricIndex}`,\n          rowType: 'metric-header',\n          metricKey,\n          label: COLUMN_LABEL_OVERRIDES[metricKey] || columns[metricKey]?.label || metricKey,\n          subRows: [], // Children will be added here\n        };\n\n        // Add empty time slot fields so react-table renders the row\n        timeSlots.forEach(slot => {\n          const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n          metricHeaderRow[`_${safeSlot}`] = '';\n          metricHeaderRow[`_${safeSlot}_delta`] = '';\n        });\n\n        // Add group rows as children of this metric\n        metricHeaderRow.subRows = metricGroups[metricKey];\n\n        // Add totals row at the bottom of this metric group\n        if (totals) {\n          const totalsRow = {\n            row_id: `metric_${metricIndex}_totals`,\n            rowType: 'totals-value',\n            metricKey,\n            groupValue: 'Total',\n            label: 'Total',\n          };\n\n          // Add totals values for each time slot\n          timeSlots.forEach(slot => {\n            const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n            totalsRow[`_${safeSlot}`] = totals[slot]?.[metricKey] || '-';\n            totalsRow[`_${safeSlot}_delta`] = totals[slot]?.[`${metricKey}_delta`] || '';\n          });\n\n          metricHeaderRow.subRows.push(totalsRow);\n        }\n\n        transformedData.push(metricHeaderRow);\n      });\n    }\n  }\n\n  // Build column definitions\n  const columnDefinitions = [];\n\n  // Get human-readable group label\n  const groupLabel = formatGroupByLabel(groupBy);\n\n  // Custom sort function for label column in transposed view\n  // Only sorts parent rows, keeps totals at bottom, preserves subRows\n  const transposedLabelSort = (rowA, rowB, columnId, desc) => {\n    const aRowType = rowA.original.rowType;\n    const bRowType = rowB.original.rowType;\n    const aDepth = rowA.depth !== undefined ? rowA.depth : 0;\n    const bDepth = rowB.depth !== undefined ? rowB.depth : 0;\n\n    // Handle totals rows first (they can be at any depth)\n    const aIsTotals = aRowType === 'totals-header' || aRowType === 'totals-value';\n    const bIsTotals = bRowType === 'totals-header' || bRowType === 'totals-value';\n\n    // If both are at the same depth\n    if (aDepth === bDepth) {\n      // Keep totals at the bottom of their level\n      // Note: React-table inverts return values when desc=true, so we must invert our logic\n      // to counteract that inversion and keep totals at the bottom in both directions\n      if (aIsTotals && !bIsTotals) return desc ? -1 : 1;\n      if (!aIsTotals && bIsTotals) return desc ? 1 : -1;\n      if (aIsTotals && bIsTotals) return 0; // Both totals, maintain order\n\n      // For parent rows (depth 0), perform normal sorting\n      if (aDepth === 0) {\n        const aValue = rowA.values[columnId];\n        const bValue = rowB.values[columnId];\n\n        // Perform alphanumeric comparison\n        if (typeof aValue === 'string' && typeof bValue === 'string') {\n          return aValue.localeCompare(bValue);\n        }\n\n        // Fallback to regular comparison\n        if (aValue < bValue) return -1;\n        if (aValue > bValue) return 1;\n        return 0;\n      }\n\n      // For child rows (depth > 0), maintain original order\n      return 0;\n    }\n\n    // Different depths - shouldn't happen in normal sorting, maintain order\n    return 0;\n  };\n\n  // First column: Group/Metric label with expand/collapse\n  // Generate header label based on number of groupBy fields\n  let headerLabel = 'Metric';\n  if (hasMultipleGroupBy) {\n    // Multiple groupBy: show hierarchy (e.g., \"Product / Account / Metric\")\n    const groupLabels = groupFields.map(field => formatGroupByLabel(field));\n    if (groupOrder === 'metric-first') {\n      // Reversed order\n      headerLabel = [...groupLabels].reverse().join(' / ') + ' / Metric';\n    } else {\n      // Normal order\n      headerLabel = groupLabels.join(' / ') + ' / Metric';\n    }\n  } else if (groupField) {\n    // Single groupBy: use existing logic\n    headerLabel = groupOrder === 'account-first' ? `${groupLabel} / Metric` : `Metric / ${groupLabel}`;\n  }\n\n  columnDefinitions.push({\n    Header: headerLabel,\n    accessor: 'label',\n    id: 'label',\n    text: 'label',\n    align: 'left',\n    headerAlign: 'left',\n    minWidth: 200,\n    width: 200,\n    className: 'text transposed-label-col',\n    headerClassName: 'text transposed-label-col',\n    sortType: transposedLabelSort,\n    Cell: ({ row }) => {\n      const isHeader = row.original.rowType === 'group-header' || row.original.rowType === 'metric-header' || row.original.rowType === 'totals-header';\n      const isTotals = row.original.rowType === 'totals-header' || row.original.rowType === 'totals-value';\n      const depth = row.original.depth !== undefined ? row.original.depth : row.depth || 0;\n\n      if (isHeader && row.canExpand) {\n        // Header row with expand/collapse icon\n        return (\n          <div\n            {...row.getToggleRowExpandedProps()}\n            className={`transposed-group-label expandable depth-${depth} ${isTotals ? 'totals' : ''}`}\n            data-depth={depth}\n            style={{ cursor: 'pointer', display: 'flex', alignItems: 'center' }}\n          >\n            <span style={{ marginRight: '0.5rem', fontSize: '0.8em' }}>\n              {row.isExpanded ? '▼' : '▶'}\n            </span>\n            {row.original.label}\n          </div>\n        );\n      }\n\n      // Determine the appropriate CSS class\n      let className = 'transposed-metric-label';\n      if (isHeader) {\n        className = 'transposed-group-label';\n      }\n      if (isTotals) {\n        className += ' totals';\n      }\n      // Add depth class for styling\n      className += ` depth-${depth}`;\n\n      return (\n        <div className={className}>\n          {row.original.label}\n        </div>\n      );\n    },\n  });\n\n  // Time slot columns\n  timeSlots.forEach((slot, index) => {\n    const safeSlot = slot.replace(/[^a-zA-Z0-9]/g, '_');\n    const slotColumns = [];\n\n    // Value column (first column of each day group)\n    slotColumns.push({\n      Header: '',\n      accessor: `_${safeSlot}`,\n      id: `${safeSlot}`,\n      align: 'right',\n      headerAlign: 'right',\n      minWidth: 130,\n      className: 'numeric day-start',\n      headerClassName: 'numeric day-start',\n      // Disable sorting in account-first mode for metric value rows\n      // (sorting different metrics like \"Matches: 300, Bids: 100\" doesn't make sense)\n      disableSortBy: groupOrder === 'account-first',\n      Cell: ({ row, value }) => {\n        if (row.original.rowType === 'group-header' || row.original.rowType === 'metric-header' || row.original.rowType === 'totals-header') {\n          return <span>&nbsp;</span>;\n        }\n        // Style totals values with bold\n        if (row.original.rowType === 'totals-value') {\n          return <strong>{value || '-'}</strong>;\n        }\n        return value || '-';\n      },\n    });\n\n    // Delta column (if not first time slot)\n    if (index > 0) {\n      slotColumns.push({\n        Header: <DeltaHeader value=\"\" />,\n        accessor: `_${safeSlot}_delta`,\n        id: `${safeSlot}_delta`,\n        align: 'right',\n        headerAlign: 'right',\n        minWidth: 130,\n        className: 'numeric delta',\n        headerClassName: 'numeric delta',\n        // Disable sorting in account-first mode for metric value rows\n        disableSortBy: groupOrder === 'account-first',\n        Cell: ({ row, value }) => {\n          if (row.original.rowType === 'group-header' || row.original.rowType === 'metric-header' || row.original.rowType === 'totals-header') {\n            return <span>&nbsp;</span>;\n          }\n          // Style totals delta values with bold\n          if (row.original.rowType === 'totals-value') {\n            return <strong><DeltaCell value={value} /></strong>;\n          }\n          return <DeltaCell value={value} />;\n        },\n      });\n    }\n\n    columnDefinitions.push({\n      Header: <PivotHeader pivot={pivot} value={slot} index={index} />,\n      headerClassName: index === 0 || index % 2 === 0 ? 'pivot-header even numeric' : 'pivot-header odd numeric',\n      id: `pivot-header-${index}`,\n      columns: slotColumns,\n    });\n  });\n\n  // Calculate initial expanded state based on rules:\n  // 1. First row always open\n  // 2. Totals row always open\n  // 3. If 5 rows or less, all open by default\n  // Note: react-table expects numeric indices (0, 1, 2, etc.) not string IDs\n  const initialExpanded = {};\n\n  if (transformedData.length <= 5) {\n    // 5 or fewer rows - expand all\n    transformedData.forEach((row, index) => {\n      if (row.subRows && row.subRows.length > 0) {\n        initialExpanded[index] = true;\n      }\n    });\n  } else {\n    // More than 5 rows - expand first and totals only\n    transformedData.forEach((row, index) => {\n      const isTotals = row.rowType === 'totals-header';\n      const isFirst = index === 0;\n\n      if ((isFirst || isTotals) && row.subRows && row.subRows.length > 0) {\n        initialExpanded[index] = true;\n      }\n    });\n  }\n\n  return {\n    data: transformedData,\n    columns: columnDefinitions,\n    columnChoices,\n    initialExpanded,\n  };\n}\n\n// Identify grouping fields from data structure\n// Returns array of field names that represent grouping dimensions (e.g., ['product', 'account_name'])\n// Supports multiple groupBy facets\nfunction identifyGroupingFields(data, columns) {\n  if (!data || data.length === 0) return [];\n\n  const firstRow = data[0];\n  const keys = Object.keys(firstRow);\n  const groupingFields = [];\n\n  // Common grouping field patterns (in priority order)\n  const groupingPatterns = [\n    'product', 'account_name', 'account', 'matched_date', 'matched_hour_of_day', 'device',\n    'vertical', 'channel_name', 'source_name', 'goal_name', 'buyer_name',\n    'ad_name', 'match_tag', 'tag'\n  ];\n\n  // First, collect all known grouping fields that exist in the data\n  for (const pattern of groupingPatterns) {\n    if (keys.includes(pattern)) {\n      groupingFields.push(pattern);\n    }\n  }\n\n  // If we found grouping fields, return them\n  if (groupingFields.length > 0) {\n    return groupingFields;\n  }\n\n  // Fallback: find text fields that are not metrics\n  const textFields = keys.filter(key => {\n    const value = firstRow[key];\n    // Skip if it's clearly a numeric metric\n    if (!value || key.endsWith('_delta')) return false;\n\n    // Check if it's a text value (not a formatted number)\n    if (typeof value === 'string') {\n      const stripped = value.replace(/[$,%]/g, '');\n      return isNaN(stripped);\n    }\n    return false;\n  });\n\n  return textFields;\n}\n\n// Legacy wrapper for backward compatibility\n// Returns single field (first grouping field found) or null\nfunction identifyGroupingField(data, columns) {\n  const fields = identifyGroupingFields(data, columns);\n  return fields.length > 0 ? fields[0] : null;\n}\n\n// Parse response for aggregate reports (advertiser or vendor) to produce formatted table column definitions.\n// Handle pivoting.\n// Column choices derived from the defined columns.\nexport function extractColumnsAndData(reportResponse) {\n  let {\n    columns, data, totals, pivot,\n  } = reportResponse;\n\n  let columnDefinitions = [];\n  const columnChoices = [];\n  let groupingField = null;\n  let pivotCols = [];\n\n  if (pivot) {\n    if (data.length) {\n      pivotCols = Object.keys(data[0]);\n\n      if (pivotCols.length) {\n        // Identify grouping fields from the pivot data structure\n        const firstPivotData = data.map((row) => row[pivotCols[0]]);\n        const groupingFields = identifyGroupingFields(firstPivotData, columns);\n\n        // Define each column of the pivot (for example, comparing week to week (time_week), each \"column\" is the data for a week\n        // Even though columns are the same for each pivot, the accessor values must be different,\n        // so we create definitions for each.\n        columnDefinitions = pivotCols.map((pivotCol, i) => {\n          const pivotData = data.map((row) => row[pivotCol]);\n          const pivotTotals = totals[pivotCol];\n          const cols = defineColumns(columns, pivotData, pivotTotals, pivotCol, i);\n\n          // For pivots after the first, replace grouping column headers with empty spacers\n          if (i > 0 && groupingFields.length > 0) {\n            cols.forEach(col => {\n              if (groupingFields.includes(col.dataField)) {\n                col.Header = ''; // Empty spacer header\n              }\n            });\n          }\n\n          return {\n            Header: (props) => <PivotHeader pivot={pivot} value={pivotCol} index={i} />,\n            headerClassName: i === 0 || i % 2 === 0 ? 'pivot-header even numeric' : 'pivot-header odd numeric',\n            id: `pivot-header-${i}`,\n            sortable: false,\n            columns: cols,\n          };\n        });\n\n        if (columnDefinitions.length) {\n          columnDefinitions[0].columns.map((col) => {\n            if (col.dataField.indexOf('delta') === -1 && !groupingFields.includes(col.dataField)) {\n              columnChoices.push({ value: col.dataField, label: col.Header.props.label });\n            }\n          });\n        }\n\n        data = data.map((row) => {\n          const temp = {};\n          Object.entries(row).map(([pCol, pData]) => {\n            temp[pCol] = pData;\n          });\n          return temp;\n        });\n      }\n    }\n  } else {\n    // No pivot - identify grouping fields if present (supports multiple groupBy facets)\n    const groupingFields = identifyGroupingFields(data, columns);\n\n    columnDefinitions = defineColumns(columns, data, totals, null, null);\n\n    if (columnDefinitions.length) {\n      columnDefinitions.map((col) => {\n        // Exclude ALL grouping fields from columnChoices (metrics selector)\n        // Grouping columns should always be visible and not hideable\n        if (!groupingFields.includes(col.dataField)) {\n          let label;\n\n          // Try to extract label from Header component props (safe access)\n          if (col.Header && col.Header.props) {\n            label = col.Header.props.label || col.Header.props.value;\n          }\n\n          // Fallback to text property or dataField\n          label = label || col.text || col.dataField;\n\n          columnChoices.push({ value: col.dataField, label: label });\n        }\n      });\n    }\n\n    return {\n      data,\n      columns: columnDefinitions,\n      columnChoices,\n      groupingFields, // Return array of grouping fields so we can always keep them visible\n      groupingField: groupingFields[0] || null, // Backward compatibility: return first field\n      hasTotals: !!(totals && Object.keys(totals).length > 0), // Indicate if totals exist for footer display\n    };\n  }\n\n  // Pivot mode return\n  // Detect grouping fields from pivot data if they exist\n  let pivotGroupingFields = [];\n  if (data.length && pivotCols && pivotCols.length) {\n    const firstPivotData = data.map((row) => row[pivotCols[0]]);\n    pivotGroupingFields = identifyGroupingFields(firstPivotData, columns);\n  }\n\n  return {\n    data,\n    columns: columnDefinitions,\n    columnChoices,\n    groupingFields: pivotGroupingFields, // Return grouping fields found in pivot data\n    groupingField: pivotGroupingFields[0] || null, // Backward compatibility\n    hasTotals: !!(totals && Object.keys(totals).length > 0),\n  };\n}\n\n// Parse response for Leads and calls reports to produce formatted table column definitions.\n// No pivots. ColumnChoices are from hard coded list defined in report component\n// (Since the API only gives us the columns requested, not all columns)\nexport function extractColumnsAndDataForLeads(reportResponse, displayResolver) {\n  const { columns, data, totals } = reportResponse;\n\n  const columnDefinitions = defineColumns(columns, data, totals, null, null, displayResolver);\n  return {\n    data,\n    columns: columnDefinitions,\n  };\n}\n\n// Set column show property of report based on selected viewColumns\n// export function setViewColumns( reportColumns, filters) {\n//  console.log('api.js:setViewColumns(reportColumns)', reportColumns);\n//  //for pivot, object with {columns:[], reportColumns:[], data:[]\n//   //non-pivot, is array of columns\n//   if(filters.pivot) {\n//     if(reportColumns?.length && typeof reportColumns[0].columns !== 'undefined'){\n//       reportColumns.map( (pivotCol) => {\n//         if(pivotCol.columns){\n//           updateColumnShow(pivotCol.columns, filters.view_cols, filters.groupBy)\n//         }\n//       })\n//     }\n//   } else {\n//     updateColumnShow(reportColumns, filters.view_cols, filters.groupBy)\n//   }\n//\n//   return reportColumns;\n// }\n\n// Remove selected view columns that are not in updated column choices\n// (columns can change between queries)\nexport function validateViewColumns(columnFilters, columnChoices) {\n  columnFilters = typeof columnFilters === 'string' ? [columnFilters] : columnFilters;\n  const choices = columnChoices.map((col) => col.value);\n  return columnFilters ? columnFilters.filter((col) => choices.includes(col)) : [];\n}\n\n// Look for specific groupBy in selected groupBy\nfunction hasGroupByFilter(target, groupByFilters) {\n  if (!target) {\n    return false;\n  } if (Array.isArray(groupByFilters)) {\n    return groupByFilters.includes(target);\n  }\n  return groupByFilters === target;\n}\n\n\nconst formatDateParam = (d) =>\n  // convert to 2021-07-15T00:00:00  (like ISO but no timezone hour diff)\n  // TODO: use toISOString ?\n  format(d, \"yyyy-MM-dd'T'HH:mm:ss\");\n  // return formatISO(d);\n\n\n\nconst FilterToApiMap = {\n  accounts: 'account_ids',\n  orders: 'order_ids',\n  vendors: 'vendor_ids',\n  channels: 'channel_ids',\n  sources: 'source_ids',\n  verticals: 'vertical_ids',\n  currentlyInsured: 'currently_insured',\n  billable: 'qualified',\n  sortBy: 'sort_by',\n  sortDir: 'sort_dir',\n  groupBy: 'group_by',\n  startDate: 'from',\n  endDate: 'to',\n};\n\n// UI-only parameters that should not be sent to the API\nconst UI_ONLY_PARAMS = ['view_cols', 'selected_metrics', 'group_order', 'comparison_view'];\n\n// This function mediates between settings emitted from the filter widget\n// and the params expected by the report generator.\nexport function convertFilterParams(filterSettings, userTimezone = '') {\n  const apiParams = {};\n  Object.entries(filterSettings).map(([key, val], i) => {\n    if (!UI_ONLY_PARAMS.includes(key)) {\n      // UI-only params are client-side only for controlling display\n      const apiKey = FilterToApiMap[key] || key;\n      apiParams[apiKey] = val;\n    }\n  });\n\n  if (apiParams.from) {\n    apiParams.from = formatDateParam(apiParams.from);\n  }\n  if (apiParams.to) {\n    apiParams.to = formatDateParam(apiParams.to);\n  }\n\n  // converted\n  // from: \"2021-08-18T00:00:00\"\n  // to: \"2021-08-18T23:59:59\"\n\n  if (apiParams.fields && Array.isArray(apiParams.fields)) {\n    apiParams.fields = apiParams.fields.join(',');\n  }\n\n  // Phone search must be +1 10 digit\n  if (apiParams.origin_number && !/^\\+1/.test(apiParams.origin_number)) {\n    // add +1 if not set\n    if (apiParams.origin_number.toString().length === 10) {\n      apiParams.origin_number = `+1${apiParams.origin_number}`;\n    } else if (apiParams.origin_number.toString().length === 11) {\n      apiParams.origin_number = `+${apiParams.origin_number}`;\n    }\n  }\n\n  if (apiParams.pivot) {\n    if (apiParams.pivot === 'time_week_v_last') {\n      apiParams.pivot = 'time_week';\n    } else if (apiParams.pivot === 'time_month_v_last') {\n      apiParams.pivot = 'time_month';\n    }\n  }\n\n  // Default sort was removed in version 2 api to enhance performance.\n  // Enforce a default sort for groupBy so report does not return with random order dates, hours, etc\n  if (apiParams.pivot) {\n    // Pivot times, you want earliest first\n    apiParams.sort_by = apiParams.pivot;\n    apiParams.sort_dir = 'asc';\n  } else if (apiParams.group_by && !apiParams.sort_by) {\n    apiParams.sort_by = Array.isArray(apiParams.group_by) ? apiParams.group_by[0] : apiParams.group_by;\n    apiParams.sort_dir = apiParams.group_by.indexOf('time') === 0 ? 'desc' : 'asc';\n  }\n\n  return apiParams;\n}\n\nconst prepSortValue = (val) => {\n  if (typeof val === 'string') {\n    val = val.replace(/[\\$%,]/g, '');\n    return isNaN(val) ? val.toLowerCase() : parseFloat(val);\n  }\n  return val;\n};\n\nexport function defaultSortMethod(a, b, desc) {\n  // force null and undefined to the bottom\n  a = a === null || a === undefined ? -Infinity : a;\n  b = b === null || b === undefined ? -Infinity : b;\n  // force any string values to lowercase\n  a = prepSortValue(a);\n  b = prepSortValue(b);\n  // Return either 1 or -1 to indicate a sort priority\n  if (a > b) {\n    return 1;\n  }\n  if (a < b) {\n    return -1;\n  }\n  // returning 0 or undefined will use any subsequent column sorting methods or the row index as a tiebreaker\n  return 0;\n}\n","import React from 'react';\nimport {\n  UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport  {faChartLine, faSitemap, faUser} from '@fortawesome/free-solid-svg-icons';\nimport { formatGroupByLabel } from './api';\n\n// Type definitions\ntype GroupOrder = 'account-first' | 'metric-first';\n\ntype ViewControlsProps = {\n  groupOrder: GroupOrder;\n  onGroupOrderChange: (mode: GroupOrder) => void;\n  groupBy?: string | string[] | null;\n};\n\nconst ViewControls = ({\n  groupOrder,\n  onGroupOrderChange,\n  groupBy = null,\n}: ViewControlsProps) => {\n  const handleGroupOrderChange = (mode: GroupOrder) => {\n    onGroupOrderChange(mode);\n  };\n\n  // Detect multiple groupBy facets\n  const groupByArray = Array.isArray(groupBy) ? groupBy : (groupBy ? [groupBy] : []);\n  const hasMultipleGroupBy = groupByArray.length > 1;\n\n  // Generate labels based on groupBy structure\n  let groupOrderLabel: string;\n  let option1Label: string;\n  let option2Label: string;\n\n  if (hasMultipleGroupBy) {\n    // Multiple groupBy: show group order toggle\n    const groupLabels = groupByArray.map(field => formatGroupByLabel(field));\n    if (groupOrder === 'account-first') {\n      // Normal order: Product → Account\n      groupOrderLabel = groupLabels.join(' → ');\n      option1Label = groupLabels.join(' → ');\n      option2Label = [...groupLabels].reverse().join(' → ');\n    } else {\n      // Reversed order: Account → Product\n      groupOrderLabel = [...groupLabels].reverse().join(' → ');\n      option1Label = groupLabels.join(' → ');\n      option2Label = [...groupLabels].reverse().join(' → ');\n    }\n  } else {\n    // Single groupBy: show group ↔ metric toggle\n    const groupLabel = formatGroupByLabel(groupBy);\n    groupOrderLabel = groupOrder === 'account-first' ? `${groupLabel} → Metric` : `Metric → ${groupLabel}`;\n    option1Label = `${groupLabel} → Metric`;\n    option2Label = `Metric → ${groupLabel}`;\n  }\n\n  return (\n    <UncontrolledDropdown className=\"me-2\">\n      <DropdownToggle color=\"link\" caret className=\"ms-0 pl-0\">\n        <FaIcon icon=\"eye\" size=\"sm\" className=\"fa-icons me-1\" />\n        <span className=\"title\">\n          View: {groupOrderLabel}\n        </span>\n      </DropdownToggle>\n      <DropdownMenu end>\n        <DropdownItem\n          active={groupOrder === 'account-first'}\n          onClick={() => handleGroupOrderChange('account-first')}\n        >\n          <FaIcon icon={hasMultipleGroupBy ? faSitemap : faUser} className=\"me-2\" />\n          {option1Label}\n        </DropdownItem>\n        <DropdownItem\n          active={groupOrder === 'metric-first'}\n          onClick={() => handleGroupOrderChange('metric-first')}\n        >\n          <FaIcon icon={hasMultipleGroupBy ? faSitemap : faChartLine} className=\"me-2\" />\n          {option2Label}\n        </DropdownItem>\n      </DropdownMenu>\n    </UncontrolledDropdown>\n  );\n};\n\nexport default ViewControls;\n","import React from 'react';\nimport {\n  UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\n// Type definitions\ntype ComparisonView = 'flat' | 'nested';\n\ntype ComparisonViewControlsProps = {\n  comparisonView: ComparisonView;\n  onComparisonViewChange: (view: ComparisonView) => void;\n};\n\nconst ComparisonViewControls = ({\n  comparisonView,\n  onComparisonViewChange,\n}: ComparisonViewControlsProps) => {\n  const handleComparisonViewChange = (view: ComparisonView) => {\n    onComparisonViewChange(view);\n  };\n\n  const viewLabel = comparisonView === 'flat' ? 'Flat' : 'Nested';\n\n  return (\n    <UncontrolledDropdown className=\"me-2\">\n      <DropdownToggle color=\"link\" caret className=\"ms-0 pl-0\">\n        <FaIcon icon=\"columns\" size=\"sm\" className=\"fa-icons me-1\" />\n        <span className=\"title\">\n          Layout: {viewLabel}\n        </span>\n      </DropdownToggle>\n      <DropdownMenu end>\n        <DropdownItem\n          active={comparisonView === 'flat'}\n          onClick={() => handleComparisonViewChange('flat')}\n        >\n          <FaIcon icon={\"columns\"} className=\"me-2\" />\n          Flat (Metrics as Columns)\n        </DropdownItem>\n        <DropdownItem\n          active={comparisonView === 'nested'}\n          onClick={() => handleComparisonViewChange('nested')}\n        >\n          <FaIcon icon={\"stream\"} className=\"me-2\" />\n          Nested (Metrics as Rows)\n        </DropdownItem>\n      </DropdownMenu>\n    </UncontrolledDropdown>\n  );\n};\n\nexport default ComparisonViewControls;\n","// A note about cost metrics\nexport const METRIC_CATEGORIES = {\n  general: {\n    label: 'General',\n    metrics: ['matches', 'average_position', 'bids', 'total_sales', 'cost', 'cost_per_sale', 'lead_posts', 'accepted_leads', 'lead_accept_rate', 'lead_cost'],\n  },\n  calls: {\n    label: 'Calls',\n    metrics: ['calls', 'qualified_calls', 'cost_per_call', 'calls_cost', 'qualified_calls_rate', 'call_transfer_rate', 'cost_per_call_transfer'],\n  },\n  clicks: {\n    label: 'Clicks',\n    metrics: ['impressions', 'qualified_clicks', 'clicks_cost', 'bid_click_through_rate', 'cost_per_qualified_click', 'impression_click_through_rate'],\n  },\n  bidding: {\n    label: 'Bidding',\n    metrics: ['average_diff_next_bid_down', 'average_diff_next_bid_up', 'average_diff_top'],\n  },\n  goals: {\n    label: 'Goals',\n    // Category is hidden until the API returns at least one of these keys in its columns response\n    metrics: ['conversions', 'conversion_rate', 'cost_per_conversion', 'goal_value'],\n  },\n};\n\n/**\n * Get default metrics (general category)\n * @param {Array} columnChoices - Available column choices from the report\n * @returns {Array} Array of metric values that are available and in the general category\n */\nexport const getDefaultMetrics = (columnChoices = []) => {\n  const generalMetrics = METRIC_CATEGORIES.general.metrics;\n  return columnChoices\n    .filter(choice => generalMetrics.includes(choice.value))\n    .map(choice => choice.value);\n};\n\n/**\n * Get available metrics for a category from the report's available columns\n * @param {string} categoryKey - Category key (general, calls, clicks, bidding, goals)\n * @param {Array} availableColumns - Column choices from report\n * @returns {Array} Metric values available in this category\n */\nexport const getMetricsForCategory = (categoryKey, availableColumns = []) => {\n  const category = METRIC_CATEGORIES[categoryKey];\n  if (!category) return [];\n\n  return availableColumns\n    .filter(choice => category.metrics.includes(choice.value))\n    .map(choice => choice.value);\n};\n","import React from 'react';\nimport {\n  UncontrolledDropdown, DropdownToggle, DropdownMenu, FormGroup, Label, Input,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\n\n// Type definitions\ntype AvailableItem = {\n  value: string;\n  label: string;\n};\n\ntype Category = {\n  label: string;\n  metrics: string[];\n};\n\ntype CategorizedMetricSelectorProps = {\n  label: string;\n  icon: IconProp;\n  selectedItems: string[] | null | undefined;\n  availableItems: AvailableItem[];\n  categories: Record<string, Category>;\n  onChange: (items: string[] | null) => void;\n  className?: string;\n};\n\ntype ItemWithAvailability = {\n  value: string;\n  label: string;\n  isAvailable: boolean;\n};\n\n/**\n * Categorized metric/column selector with checkboxes organized in a grid\n * Used for both metrics selector (pivot mode) and columns selector (non-pivot mode)\n */\nconst CategorizedMetricSelector = ({\n  label,\n  icon,\n  selectedItems,\n  availableItems,\n  categories,\n  onChange,\n  className = '',\n}: CategorizedMetricSelectorProps) => {\n  // null = show all items, [] = show none selected yet, ['item'] = specific items selected\n  const showAllItems = selectedItems === null || selectedItems === undefined;\n\n  const handleShowAllChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (e.target.checked) {\n      // Show all items\n      onChange(null);\n    } else {\n      // Show grid with empty selection (user can then select what they want)\n      onChange([]);\n    }\n  };\n\n  const handleItemToggle = (itemValue: string, isAvailable: boolean) => {\n    if (showAllItems || !isAvailable) return;\n\n    const currentItems = selectedItems || [];\n    const isSelected = currentItems.includes(itemValue);\n\n    if (isSelected) {\n      const newItems = currentItems.filter(m => m !== itemValue);\n      // Keep as array even if empty (don't revert to null)\n      onChange(newItems);\n    } else {\n      const newItems = [...currentItems, itemValue];\n\n      // Check if all available items are now selected\n      if (newItems.length === availableItems.length) {\n        onChange(null);  // Convert to \"All\" state\n      } else {\n        onChange(newItems);\n      }\n    }\n  };\n\n  const handleCategoryToggle = (categoryKey: string) => {\n    if (showAllItems) return;\n\n    const category = categories[categoryKey];\n    const currentItems = selectedItems || [];\n\n    // Check if all available items in this category are selected\n    const availableItemsInCategory = category.metrics.filter(m =>\n      availableItems.some(choice => choice.value === m)\n    );\n\n    // Don't toggle if no available items\n    if (availableItemsInCategory.length === 0) return;\n\n    const allSelected = availableItemsInCategory.every(m => currentItems.includes(m));\n\n    if (allSelected) {\n      // Deselect all available items in this category\n      const newItems = currentItems.filter(m => !availableItemsInCategory.includes(m));\n      // Keep as array even if empty (don't revert to null)\n      onChange(newItems);\n    } else {\n      // Select all available items in this category\n      const newItems = [...new Set([...currentItems, ...availableItemsInCategory])];\n\n      // Check if all available items are now selected\n      if (newItems.length === availableItems.length) {\n        onChange(null);  // Convert to \"All\" state\n      } else {\n        onChange(newItems);\n      }\n    }\n  };\n\n  const isItemSelected = (itemValue: string, isAvailable: boolean): boolean => {\n    // When \"Show All\" is enabled, only check available items\n    if (showAllItems) return isAvailable;\n    return selectedItems?.includes(itemValue) || false;\n  };\n\n  const isCategorySelected = (categoryKey: string): boolean => {\n    const category = categories[categoryKey];\n    const availableItemsInCategory = category.metrics.filter(m =>\n      availableItems.some(choice => choice.value === m)\n    );\n\n    // When \"Show All\" is enabled, only check if category has available items\n    if (showAllItems) return availableItemsInCategory.length > 0;\n\n    const currentItems = selectedItems || [];\n    return availableItemsInCategory.length > 0 && availableItemsInCategory.every(m => currentItems.includes(m));\n  };\n\n  // Get only available items for a category (unavailable = not permitted or not in data)\n  const getItemsByCategory = (categoryKey: string): ItemWithAvailability[] => {\n    const category = categories[categoryKey];\n    return category.metrics.reduce<ItemWithAvailability[]>((acc, metricValue) => {\n      const columnChoice = availableItems.find(choice => choice.value === metricValue);\n      if (columnChoice) {\n        acc.push({ value: metricValue, label: columnChoice.label, isAvailable: true });\n      }\n      return acc;\n    }, []);\n  };\n\n  return (\n    <UncontrolledDropdown className={`me-2 ${className}`}>\n      <DropdownToggle color=\"link\" caret className=\"ms-0 pl-0\">\n        <FaIcon icon={icon} size=\"sm\" className=\"fa-icons me-1\" />\n        <span className=\"title\">\n          {label}\n          {!showAllItems && (\n            <span>\n              {' '}\n              ({selectedItems!.length === 0 ? 'All' : `${selectedItems!.length} selected`})\n            </span>\n          )}\n          {showAllItems && (\n            <span>\n              {' '}\n              (All)\n            </span>\n          )}\n        </span>\n      </DropdownToggle>\n      <DropdownMenu end className=\"metrics-dropdown-wide\">\n        <div className=\"modal-body\">\n          <FormGroup check className=\"mb-3\">\n            <Label check>\n              <Input\n                type=\"checkbox\"\n                checked={showAllItems}\n                onChange={handleShowAllChange}\n              />\n              {' '}\n              All {label}\n            </Label>\n          </FormGroup>\n\n          <div className=\"metrics-grid\">\n            {Object.entries(categories).map(([categoryKey, category]) => {\n              const items = getItemsByCategory(categoryKey);\n              if (items.length === 0) return null;\n\n              return (\n                <div key={categoryKey} className=\"metric-category\">\n                  <div\n                    className={`category-header ${showAllItems ? 'disabled' : ''}`}\n                    onClick={() => !showAllItems && handleCategoryToggle(categoryKey)}\n                  >\n                    <Input\n                      type=\"checkbox\"\n                      checked={isCategorySelected(categoryKey)}\n                      disabled={showAllItems}\n                      onChange={() => {}}\n                    />\n                    {category.label}\n                  </div>\n                  <div className=\"category-items\">\n                    {items.map(item => (\n                      <FormGroup check key={item.value}>\n                        <Label check className={showAllItems ? 'disabled' : ''}>\n                          <Input\n                            type=\"checkbox\"\n                            checked={isItemSelected(item.value, true)}\n                            disabled={showAllItems}\n                            onChange={() => handleItemToggle(item.value, true)}\n                          />\n                          {item.label}\n                        </Label>\n                      </FormGroup>\n                    ))}\n                  </div>\n                </div>\n              );\n            })}\n          </div>\n        </div>\n      </DropdownMenu>\n    </UncontrolledDropdown>\n  );\n};\n\nexport default CategorizedMetricSelector;\n","import React, {\n  useEffect, useContext, useReducer, useRef, useMemo, useState,\n} from 'react';\nimport { flushSync } from 'react-dom';\nimport {\n  Alert, Button, ButtonGroup, DropdownMenu, DropdownToggle, DropdownItem, Spinner, UncontrolledDropdown,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { faChartLine } from '@fortawesome/free-solid-svg-icons';\nimport { startOfDay, endOfDay } from 'date-fns';\nimport PropTypes from 'prop-types';\nimport { useRowSelect } from 'react-table';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport qs from 'query-string';\nimport FlexTable from '../../Components/Table/FlexTable';\nimport { filtersToQueryString } from '../../Components/Table/queryString';\nimport { AppContext } from '../../Providers/AppProvider';\nimport ReportsFilters from '../../App/Reports/ReportsFilter';\nimport {\n  extractColumnsAndData,\n  extractColumnsAndDataTransposed,\n  convertFilterParams,\n  validateViewColumns,\n} from './api';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport PageSection from '../../Layout/PageSection';\nimport ViewControls from './ViewControls';\nimport ComparisonViewControls from './ComparisonViewControls';\nimport { METRIC_CATEGORIES, getMetricsForCategory } from './metricConstants';\nimport CategorizedMetricSelector from './CategorizedMetricSelector';\nimport useLocalStorage from '../../Hooks/useLocalStorage';\nimport usePermission from '../../Hooks/usePermission';\nimport usePagedTableState from '../../Hooks/usePagedTableState';\nimport './aggregate_report.scss';\n\n// Date format for URL serialization - must match usePagedTableState option\n// Uses ISO-like format with T separator to preserve time and avoid URL encoding issues\nconst URL_DATE_FORMAT = \"yyyy-MM-dd'T'HH:mm:ss\";\n\nconst NoData = () => <Alert color=\"light\">No results...</Alert>;\n\nconst stateReducer = (state, action) => {\n  const {\n    name, report, hiddenColumns, selectedRows, groupOrder, comparisonView, initialExpanded, rawApiResponse, downloadColumnsMode, lastFilterSettings,\n  } = action;\n  switch (name) {\n    case 'load_report':\n      return {\n        ...state, loading: true, loadError: false, lastFilterSettings,\n      };\n    case 'load_fail':\n      return { ...state, loading: false, loadError: true, report: {}, rawApiResponse: null };\n    case 'load_complete':\n      return {\n        ...state, loading: false, loadError: false, hasLoadedOnce: true, report, hiddenColumns, initialExpanded, rawApiResponse,\n      };\n    case 'download':\n      return { ...state, downloading: true };\n    case 'download_complete':\n      return { ...state, downloading: false };\n    case 'set_view_columns':\n      return { ...state, hiddenColumns };\n    case 'clear_filters':\n      return {\n        ...state, report: {}, rawApiResponse: null,\n      };\n    case 'select_rows':\n      return { ...state, selectedRows };\n    case 'set_group_order':\n      return { ...state, groupOrder };\n    case 'set_comparison_view':\n      return { ...state, comparisonView };\n    case 'set_download_columns_mode':\n      return { ...state, downloadColumnsMode };\n\n    default:\n      return state;\n  }\n};\n\nconst DefaultState = {\n  loading: false,\n  downloading: false,\n  report: {},\n  selectedRows: {},\n  groupOrder: 'account-first',\n  comparisonView: 'nested',\n  rawApiResponse: null, // Stores raw API response for re-transformation without re-querying\n  downloadColumnsMode: 'selected', // 'selected' or 'all' - controls which columns to include in downloads\n  loadError: false, // Tracks if the last load failed\n  lastFilterSettings: null, // Stores last used filter settings for retry functionality\n  hasLoadedOnce: false, // Tracks if we've ever successfully loaded data (for overlay vs spinner)\n};\n\n/*\n * Aggregate report for comparing time periods.\n * Supports transposed view where metrics are rows and time periods are columns.\n */\nconst AggregateReport = ({\n  reportType,\n  csvDefaultName,\n  title,\n\n}) => {\n  const app = useContext(AppContext);\n  const Reporting = React.useMemo(() => app.getApi('reporting'), []);\n  const reportFunc = Reporting.resolveAggregateReportFunc(reportType);\n  const userTimezone = app.user.timezone;\n  const tableInstanceRef = useRef(null);\n\n  // Check permission for expanded report columns\n  const hasExpandedPermission = usePermission('advertiser_reports.view_expanded');\n\n  // Track expand all/collapse all preference in local storage\n  const [expandAllRows, setExpandAllRows] = useLocalStorage(`${reportType}_report_expand_all`, true);\n\n  // For react table - disable initial sorting to preserve row order\n  const getInitialTableState = (initialExpanded) => ({\n    sortBy: [],\n    expanded: expandAllRows ? initialExpanded || {} : {},\n  });\n\n  // Default filter settings including group order, comparison view, and view_cols (for column/metric selection)\n  const defaultFilterSettings = useMemo(() => ({\n    startDate: startOfDay(new Date()),\n    endDate: endOfDay(new Date()),\n    groupBy: ['account'],\n    group_order: 'account-first',\n    comparison_view: 'nested',\n    view_cols: METRIC_CATEGORIES.general.metrics, // Used for both column and metric selection\n  }), []);\n\n  // Use paged table state hook for URL/filter management\n  const {\n    filters,\n    setFilters,\n  } = usePagedTableState(\n    defaultFilterSettings,\n    {},\n    {\n      useQueryString: true,\n      useTableControls: false,\n      updateOnFilterChange: false, // We control when to execute via button\n      ignore: ['group_order', 'comparison_view', 'selected_metrics', 'view_cols'], // Don't trigger navigation or send to API\n      urlDateFormat: URL_DATE_FORMAT,\n      parseOptions: { parseNumbers: false }, // Keep filter values as strings to match original types and prevent double-query\n    }\n  );\n\n  // React Router hooks for navigation and reading URL\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  // Helper to read view_cols from URL (since it's ignored by usePagedTableState)\n  const getViewColsFromUrl = () => {\n    const params = qs.parse(location.search, { arrayFormat: 'comma' });\n    // Handle migration from old selected_metrics parameter\n    const urlViewCols = params.view_cols || params.selected_metrics;\n    if (urlViewCols) {\n      return Array.isArray(urlViewCols) ? urlViewCols : [urlViewCols];\n    }\n    return defaultFilterSettings.view_cols;\n  };\n\n  // Local state for view_cols (managed separately since it's ignored by the hook)\n  const [viewCols, setViewCols] = useState(getViewColsFromUrl);\n\n  // Sync viewCols from URL on navigation (back/forward button)\n  useEffect(() => {\n    const urlViewCols = getViewColsFromUrl();\n    if (JSON.stringify(urlViewCols) !== JSON.stringify(viewCols)) {\n      setViewCols(urlViewCols);\n    }\n  }, [location.search]);\n\n  const [state, dispatch] = useReducer(\n    stateReducer,\n    {\n      ...DefaultState,\n      groupOrder: filters.group_order || 'account-first',\n      comparisonView: filters.comparison_view || 'nested',\n      hiddenColumns: [],\n    },\n  );\n\n  // Load report when filters change\n  // Fires on: initial load, browser back/forward (filters change), or View Report click (filters committed)\n  useEffect(() => {\n    loadReport(filters);\n  }, [filters]);\n\n  // When group order, comparison view, or viewCols change, re-transform the report data.\n  // Used when the data needs to be transformed but does not have to be re-queried from the API.\n  // Skip if currently loading - the load will handle transformation when complete\n  useEffect(() => {\n    if (state.rawApiResponse && !state.loading) {\n      // Re-transform with new view settings (no API call needed)\n      retransformReport();\n    }\n  }, [state.groupOrder, state.comparisonView, viewCols]);\n\n  // Auto-select metrics based on product filter\n  useEffect(() => {\n    // Only run if report is loaded with available columns\n    if (!state.report.columnChoices || state.report.columnChoices.length === 0) {\n      return;\n    }\n\n    // Normalize products to always be an array (query params can be string when single value)\n    let products = filters.products || [];\n    if (typeof products === 'string') {\n      products = [products];\n    }\n\n    if (products.length === 0) return;\n\n    // Map product filter values to metric categories\n    const productToCategoryMap = {\n      'calls': 'calls',\n      'clicks': 'clicks',\n      'leads': 'leads',\n    };\n\n    let metricsToAdd = [];\n    let metricsToRemove = [];\n    const currentMetrics = viewCols || [];\n\n    // Auto-select categories if no metrics from that category are selected\n    products.forEach(product => {\n      const categoryKey = productToCategoryMap[product];\n      if (!categoryKey) return;\n\n      const categoryMetrics = getMetricsForCategory(categoryKey, state.report.columnChoices);\n      const hasAnyMetricFromCategory = categoryMetrics.some(m => currentMetrics.includes(m));\n\n      if (!hasAnyMetricFromCategory) {\n        metricsToAdd.push(...categoryMetrics);\n      }\n    });\n\n    // Exclusive logic: if ONLY one product, remove metrics from other product categories\n    if (products.length === 1) {\n      const selectedProduct = products[0];\n\n      // Remove metrics from all other product categories\n      if (selectedProduct === 'calls') {\n        const clicksMetrics = getMetricsForCategory('clicks', state.report.columnChoices);\n        const leadsMetrics = getMetricsForCategory('leads', state.report.columnChoices);\n        metricsToRemove.push(...clicksMetrics, ...leadsMetrics);\n      } else if (selectedProduct === 'clicks') {\n        const callsMetrics = getMetricsForCategory('calls', state.report.columnChoices);\n        const leadsMetrics = getMetricsForCategory('leads', state.report.columnChoices);\n        metricsToRemove.push(...callsMetrics, ...leadsMetrics);\n      } else if (selectedProduct === 'leads') {\n        const callsMetrics = getMetricsForCategory('calls', state.report.columnChoices);\n        const clicksMetrics = getMetricsForCategory('clicks', state.report.columnChoices);\n        metricsToRemove.push(...callsMetrics, ...clicksMetrics);\n      }\n    }\n\n    // Calculate new metrics\n    const newMetrics = [\n      ...currentMetrics.filter(m => !metricsToRemove.includes(m)),\n      ...metricsToAdd.filter(m => !currentMetrics.includes(m))\n    ];\n\n    // Only update if the metrics actually changed (prevents infinite loop)\n    const sortedNew = [...newMetrics].sort().join(',');\n    const sortedCurrent = [...currentMetrics].sort().join(',');\n    if (sortedNew !== sortedCurrent) {\n      // Skip URL update for auto-selection to avoid replacing history entries\n      // The URL will be updated when user clicks \"View Report\"\n      handleUpdateViewCols(newMetrics, { updateUrl: false });\n    }\n  }, [filters.products, state.report.columnChoices]);\n\n  // Re-display report with new view settings (metrics, groupOrder, comparisonView)\n  // These view settings do not require re-querying the API\n  // Uses cached API response when available to avoid re-querying\n  const retransformReport = () => {\n    if (!state.rawApiResponse) {\n      return;\n    }\n\n    // Re-transform with new settings - no API call, no loading state!\n    const rpt = (state.rawApiResponse.pivot && state.comparisonView === 'nested')\n      ? extractColumnsAndDataTransposed(state.rawApiResponse, state.groupOrder, viewCols, filters.groupBy)\n      : extractColumnsAndData(state.rawApiResponse);\n\n    const initialExpanded = rpt.initialExpanded || {};\n    const hiddenColumns = getHiddenColumns(viewCols, rpt.columns, rpt.groupingFields || [rpt.groupingField]);\n\n    dispatch({\n      name: 'load_complete',\n      report: rpt,\n      hiddenColumns,\n      initialExpanded,\n      rawApiResponse: state.rawApiResponse,\n    });\n  };\n\n  const handleUpdateViewCols = (newViewCols, { updateUrl = true } = {}) => {\n    // Update local state\n    setViewCols(newViewCols);\n\n    // Update URL silently (without triggering React Router navigation detection)\n    // This prevents the usePagedTableState hook from firing navigation events\n    // Skip URL update for auto-selection to avoid replacing history entries\n    if (updateUrl) {\n      const newSettings = {\n        ...filters,\n        view_cols: newViewCols,\n        group_order: state.groupOrder,\n      };\n      const search = filtersToQueryString(newSettings, URL_DATE_FORMAT);\n      // Preserve hash path for hash-based routing (e.g., \"#/reports/advertiser\")\n      const hashPath = window.location.hash.split('?')[0];\n      window.history.replaceState(null, '', hashPath + search);\n    }\n\n    // Update hidden columns in component state\n    dispatch({\n      name: 'set_view_columns',\n      hiddenColumns: getHiddenColumns(newViewCols, state.report.columns, state.report.groupingFields || [state.report.groupingField]),\n    });\n  };\n\n  const getHiddenColumns = (visibleColIds, tableCols, groupingFields = []) => {\n    // null or undefined means show all columns (no hidden columns)\n    if (!visibleColIds || visibleColIds.length === 0) {\n      return [];\n    }\n\n    // Ensure groupingFields is an array (handle legacy single field)\n    const groupingFieldsArray = Array.isArray(groupingFields)\n      ? groupingFields\n      : (groupingFields ? [groupingFields] : []);\n\n    // Return columns that are not in the visible list\n    // EXCEPT grouping fields and the label column, which should always be visible\n    return tableCols.reduce((acc, col) => {\n      if (!visibleColIds.includes(col.id) && !groupingFieldsArray.includes(col.id) && col.id !== 'label') {\n        acc.push(col.id);\n      }\n      return acc;\n    }, []);\n  };\n\n  const onSelectRow = (index) => {\n    const selected = { ...state.selectedRows };\n    if (selected[index]) {\n      selected[index] = !selected[index];\n    } else {\n      selected[index] = true;\n    }\n    dispatch({\n      name: 'select_rows',\n      selectedRows: selected,\n    });\n  };\n\n  const loadReport = async (settings = {}) => {\n    // Use flushSync to ensure loading state is painted before API call\n    // This prevents fast cached responses from \"skipping\" the loading overlay\n    flushSync(() => {\n      dispatch({ name: 'load_report', lastFilterSettings: settings });\n    });\n\n    const params = convertFilterParams(settings, userTimezone);\n    try {\n      const result = await reportFunc(params);\n      if (result) {\n        // Use transposed extraction if pivot exists AND comparisonView is nested\n        // Use flat extraction if comparisonView is flat OR no pivot\n        const rpt = (result.pivot && state.comparisonView === 'nested')\n          ? extractColumnsAndDataTransposed(result, state.groupOrder, viewCols, settings.groupBy)\n          : extractColumnsAndData(result);\n\n        // Extract initialExpanded if present (for transposed view)\n        const initialExpanded = rpt.initialExpanded || {};\n\n        // Validate and use viewCols for hidden columns calculation\n        const validatedViewCols = validateViewColumns(viewCols, rpt.columnChoices);\n        const hiddenColumns = getHiddenColumns(validatedViewCols, rpt.columns, rpt.groupingFields || [rpt.groupingField]);\n\n        // Update viewCols state if validation changed it\n        if (JSON.stringify(validatedViewCols) !== JSON.stringify(viewCols)) {\n          setViewCols(validatedViewCols);\n        }\n\n        dispatch({\n          name: 'load_complete',\n          report: rpt,\n          hiddenColumns,\n          initialExpanded,\n          rawApiResponse: result, // Store raw API response\n        });\n      } else {\n        notify(\"Oops, couldn't load report...\", 'error');\n        dispatch({ name: 'load_fail' });\n      }\n    } catch (err) {\n      notify(\"Oops, couldn't load report...\", 'error');\n      console.error(err);\n      dispatch({ name: 'load_fail' });\n    }\n  };\n\n  const downloadReport = async (format = 'csv') => {\n    if (!csvDefaultName) return;\n    dispatch({ name: 'download' });\n    let settings = { ...filters };\n\n    // Add fields parameter if \"selected columns\" mode is active\n    if (state.downloadColumnsMode === 'selected') {\n      // Use viewCols for both pivot and non-pivot modes\n      const selectedColumns = viewCols;\n\n      // Only add fields if there are selected columns\n      if (selectedColumns && selectedColumns.length > 0) {\n        settings.fields = selectedColumns;\n      }\n    }\n    // If downloadColumnsMode is 'all', don't add fields - API will return all columns\n\n    try {\n      const params = convertFilterParams(settings, userTimezone);\n      const response = await reportFunc(params, format);\n\n      if (response && response.data) {\n        const a = document.createElement('a');\n        document.body.appendChild(a);\n        a.style = 'display: none';\n        const url = window.URL.createObjectURL(response.data);\n        a.href = url;\n        a.download = `${csvDefaultName}.${format}`;\n        a.click();\n        window.URL.revokeObjectURL(url);\n        a.parentNode.removeChild(a);\n      } else {\n        notify(`Oops, couldn't download file (empty data)...`, 'error');\n      }\n    } catch (e) {\n      notify(`Oops, couldn't download file...`, 'error');\n      console.error(e);\n    } finally {\n      dispatch({ name: 'download_complete' });\n    }\n  };\n\n  const handleClearFilters = () => {\n    setFilters(defaultFilterSettings);\n    dispatch({ name: 'clear_filters' });\n    // Update URL after setFilters so state.filters matches when [location.search] effect runs\n    const search = filtersToQueryString(defaultFilterSettings, URL_DATE_FORMAT);\n    navigate(search, { replace: false });\n  };\n\n  const handleChangeFilters = (filterSettings) => {\n    if (Object.keys(filterSettings).length === 0) {\n      filterSettings = { ...defaultFilterSettings };\n    }\n\n    // Merge with current view settings\n    const filtersWithViewSettings = {\n      ...filterSettings,\n      group_order: state.groupOrder,\n    };\n\n    setFilters(filtersWithViewSettings);\n    // Update URL after setFilters so state.filters matches when [location.search] effect runs\n    const search = filtersToQueryString(filtersWithViewSettings, URL_DATE_FORMAT);\n    navigate(search, { replace: false });\n  };\n\n\n  const handleGroupOrderChange = (newOrder) => {\n    // Update URL with new group order (uses replace to avoid adding history entry)\n    // Don't call setFilters - that would trigger the load effect and cause an API call\n    const search = filtersToQueryString({ ...filters, group_order: newOrder }, URL_DATE_FORMAT);\n    navigate(search, { replace: true });\n\n    // Dispatch triggers the retransform effect (no API call)\n    dispatch({ name: 'set_group_order', groupOrder: newOrder });\n  };\n\n  const handleComparisonViewChange = (newView) => {\n    // Update URL with new comparison view (uses replace to avoid adding history entry)\n    // Don't call setFilters - that would trigger the load effect and cause an API call\n    const search = filtersToQueryString({ ...filters, comparison_view: newView }, URL_DATE_FORMAT);\n    navigate(search, { replace: true });\n\n    // Dispatch triggers the retransform effect (no API call)\n    dispatch({ name: 'set_comparison_view', comparisonView: newView });\n  };\n\n  const handleToggleExpandAll = (e) => {\n    e.stopPropagation();\n    const newExpandAll = !expandAllRows;\n    setExpandAllRows(newExpandAll);\n\n    // Toggle all rows in the table\n    if (tableInstanceRef.current) {\n      tableInstanceRef.current.toggleAllRowsExpanded(newExpandAll);\n    }\n  };\n\n  const {\n    loading, downloading, report: { data = [], columns = [], columnChoices = [], hasTotals = false }, loadError,\n  } = state;\n\n  // Filter columnChoices based on permission\n  // These 4 columns require 'advertiser_reports.view_expanded' permission\n  const restrictedColumns = ['impression_click_through_rate', 'average_diff_next_bid_down', 'average_diff_next_bid_up', 'average_diff_top'];\n  const filteredColumnChoices = useMemo(() => {\n    if (hasExpandedPermission) {\n      return columnChoices;\n    }\n    return columnChoices.filter(choice => !restrictedColumns.includes(choice.value));\n  }, [columnChoices, hasExpandedPermission]);\n\n  // Determine if we're in pivot mode (comparison view) with grouping\n  const isPivotMode = filters?.pivot && columns.length > 0;\n  const hasGrouping = !!(filters?.groupBy && filters.groupBy.length > 0);\n\n  // Modify columns to add expand/collapse all toggle in label column header when applicable\n  // Only add toggle in nested mode - flat mode doesn't have expandable rows\n  const columnsWithExpandToggle = React.useMemo(() => {\n    if (!isPivotMode || !hasGrouping || columns.length === 0 || state.comparisonView !== 'nested') {\n      return columns;\n    }\n\n    // Clone the columns array\n    const modifiedColumns = [...columns];\n\n    // Find the label column (should be the first column in pivot mode)\n    if (modifiedColumns.length > 0 && modifiedColumns[0].id === 'label') {\n      const labelColumn = { ...modifiedColumns[0] };\n      const originalHeader = labelColumn.Header;\n\n      // Create a custom header with expand/collapse toggle\n      labelColumn.Header = () => (\n        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n          <span>{originalHeader}</span>\n          <button\n            onClick={handleToggleExpandAll}\n            className=\"expand-toggle-btn\"\n            title={expandAllRows ? 'Collapse all' : 'Expand all'}\n          >\n            <FaIcon icon={expandAllRows ? 'compress-arrows-alt' : 'expand-arrows-alt'} />\n          </button>\n        </div>\n      );\n\n      modifiedColumns[0] = labelColumn;\n    }\n\n    return modifiedColumns;\n  }, [columns, isPivotMode, hasGrouping, expandAllRows, state.comparisonView]);\n\n  return (\n    <>\n      <ReportsFilters\n        reportType={reportType}\n        settings={filters}\n        defaultSettings={defaultFilterSettings}\n        onChange={handleChangeFilters}\n        onClear={handleClearFilters}\n        dataSource={Reporting}\n        userTimezone={userTimezone}\n        reportLoading={loading}\n      />\n      <PageSection\n        title={title}\n        className={`overflow-section${loading ? ' loading' : ''}`}\n      >\n\n        {!loading && columns.length > 0 && (\n          <div className=\"d-flex\">\n            {/* Comparison view toggle - show in pivot mode only */}\n            {isPivotMode && (\n              <ComparisonViewControls\n                comparisonView={state.comparisonView}\n                onComparisonViewChange={handleComparisonViewChange}\n              />\n            )}\n\n            {/* Group order toggle - show in pivot mode only when grouping exists and in nested view */}\n            {isPivotMode && hasGrouping && state.comparisonView === 'nested' && (\n              <ViewControls\n                groupOrder={state.groupOrder}\n                onGroupOrderChange={handleGroupOrderChange}\n                groupBy={filters.groupBy}\n              />\n            )}\n\n            {/* Unified column/metric selector - works for both pivot and non-pivot modes */}\n            <CategorizedMetricSelector\n              label={isPivotMode ? 'Metrics' : 'Columns'}\n              icon={isPivotMode ? faChartLine : 'columns'}\n              selectedItems={viewCols}\n              availableItems={filteredColumnChoices}\n              categories={METRIC_CATEGORIES}\n              onChange={handleUpdateViewCols}\n            />\n\n            {csvDefaultName\n            && (\n            <UncontrolledDropdown>\n              <DropdownToggle\n                color=\"link\"\n                caret\n                disabled={loading || columns.length === 0}\n              >\n                {downloading ? <Spinner size=\"sm\" className=\"me-1\" /> : <FaIcon icon=\"file-download\" className=\"me-1\" />}\n                Download\n              </DropdownToggle>\n              <DropdownMenu style={{ minWidth: '280px', padding: '10px' }}>\n                <div className=\"px-2 pb-2\">\n                  <small className=\"text-muted\">File downloads are restricted to 500 rows</small>\n                </div>\n\n                <div className=\"px-2 pb-2\">\n                  <small className=\"d-block mb-1 fw-bold\">Column Selection:</small>\n                  <ButtonGroup size=\"sm\" className=\"w-100\">\n                    <Button\n                      color=\"primary\"\n                      outline\n                      size=\"sm\"\n                      active={state.downloadColumnsMode === 'selected'}\n                      onClick={() => dispatch({ name: 'set_download_columns_mode', downloadColumnsMode: 'selected' })}\n                    >\n                      {isPivotMode ? 'Selected metrics' : 'Selected columns'}\n                    </Button>\n                    <Button\n                      color=\"primary\"\n                      outline\n                      size=\"sm\"\n                      active={state.downloadColumnsMode === 'all'}\n                      onClick={() => dispatch({ name: 'set_download_columns_mode', downloadColumnsMode: 'all' })}\n                    >\n                      {isPivotMode ? 'All metrics' : 'All columns'}\n                    </Button>\n                  </ButtonGroup>\n                </div>\n\n                <DropdownItem divider />\n\n                <DropdownItem onClick={() => downloadReport('csv')}>\n                  <FaIcon icon=\"file-csv\" className=\"me-2\" />\n                  CSV\n                </DropdownItem>\n                <DropdownItem onClick={() => downloadReport('xlsx')}>\n                  <FaIcon icon=\"file-excel\" className=\"me-2\" />\n                  Excel\n                </DropdownItem>\n              </DropdownMenu>\n            </UncontrolledDropdown>\n            )}\n          </div>\n\n        )}\n\n        {/* Loading overlay */}\n        {loading && (\n          <div className=\"loading-overlay show\">\n            <div className=\"loading-overlay-spinner\">\n              <Spinner color=\"secondary\" />\n              <span className=\"ms-2\">Loading report...</span>\n            </div>\n          </div>\n        )}\n\n        {/* Error state with retry */}\n        {!loading && loadError && (\n          <Alert color=\"warning\" className=\"d-flex align-items-center justify-content-between\">\n            <span>Failed to load report data.</span>\n            <Button color=\"primary\" size=\"sm\" onClick={() => loadReport(state.lastFilterSettings || filters)}>\n              Try Again\n            </Button>\n          </Alert>\n        )}\n\n        {/* No data state */}\n        {!loading && !loadError && columns.length === 0 && <NoData />}\n\n        {/* Table - remains visible during reload with overlay */}\n        {columns.length > 0 && (\n          <FlexTable\n            key={`report-${data.length}-${state.report.initialExpanded ? Object.keys(state.report.initialExpanded).length : 0}`}\n            data={state.report.data}\n            columns={columnsWithExpandToggle}\n            initialState={state.comparisonView === 'nested' ? getInitialTableState(state.report.initialExpanded) : { sortBy: [] }}\n            className=\"reports-table striped agg-report sticky-header\"\n            noDataMessage=\"No rows were found\"\n            hiddenColumns={state.hiddenColumns}\n            onClickRowCallback={onSelectRow}\n            selectedRowIds={state.selectedRows}\n            addinHooks={[useRowSelect]}\n            isStateControlled\n            showFooter={(!isPivotMode || state.comparisonView === 'flat') && hasTotals}\n            getInstanceCallback={(instance) => { tableInstanceRef.current = instance; }}\n          />\n        )}\n\n      </PageSection>\n\n    </>\n\n  );\n};\n\nAggregateReport.propTypes = {\n  reportType: PropTypes.string.isRequired,\n  title: PropTypes.string.isRequired,\n  csvDefaultName: PropTypes.string,\n};\n\nAggregateReport.defaultProps = {\n  csvDefaultName: 'Report',\n};\n\nexport default AggregateReport;\n","import React from 'react';\nimport AggregateReport from './AggregateReport';\nimport DocTitle from '../../Layout/DocTitle';\n\nconst AdvertiserReportV2 = () => {\n  const today = new Date();\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Advertiser Report\" />\n      <AggregateReport\n        reportType=\"advertiser\"\n        title=\"Advertiser Report\"\n        csvDefaultName={`MastodonAdvertiserReport-${today.toISOString().split('T')[0]}`}\n      />\n    </>\n  );\n};\n\nexport default AdvertiserReportV2;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\n/*\n FilterSummary: Produce text summary of selected filters.\n Designed for use in the \"Applied Filters\" dropdown\n */\n\nconst FilterLabelMap = {\n  account: 'ACCOUNT',\n  accounts: 'ACCOUNT',\n  billable: 'BILLABLE',\n  channel: 'CHANNEL',\n  change_action: 'CHANGE ACTION',\n  change_group: 'CHANGE TYPE',\n  currentlyInsured: 'INSURED',\n  device: 'DEVICE',\n  disposition: 'DISPOSITION',\n  entity_type: 'OBJECT',\n  order: 'ORDER',\n  orders: 'ORDER',\n  phase: 'PHASE',\n  product: 'PRODUCT',\n  products: 'PRODUCT',\n  script: 'SCRIPT',\n  sold: 'SOLD',\n  source: 'SOURCE',\n  sources: 'SOURCE',\n  state: 'STATE',\n  status: 'STATUS',\n  tag: 'TAG',\n  vendor: 'VENDOR',\n  vendors: 'VENDOR',\n  vertical: 'VERTICAL',\n  verticals: 'VERTICAL',\n  integration: 'INTEGRATION',\n  integrations: 'INTEGRATIONS',\n  'vertical.name': 'VERTICAL',\n  'include_buyers': 'INCLUDE_BUYERS',\n};\n\n// Map of filter keys to choices keys\nconst FilterChoiceMap = {\n  'vertical.name': 'vertical',\n  vertical: 'verticals',\n  channel_id: 'channel',\n  vertical_id: 'vertical',\n  vendor_id: 'vendor',\n  source_id: 'source',\n  order_id: 'order',\n};\n\nconst FilterSummary = ({ filters, filterKeys = [], choices }) => {\n  // TBD:Limit length of each filter. Limit total length.\n  filters = keepKeys(filters, filterKeys)\n  if (Object.keys(filters).length === 0) {\n    return (<i>No filters applied. Click to add filters.</i>);\n  }\n\n  // keys in selections are going to be 'params'\n  const summary = summarizeFilterSettings(filters, choices);\n\n  if (!Object.keys(summary).length) return (null);\n\n  return (\n    <span>\n      {Object.entries(summary).map(([filterName, val], i) => {\n        if (Array.isArray(val) && val.length > 0) {\n          return (\n            <span key={i}>\n              <strong>{FilterLabelMap[filterName]}:</strong> {val.join(',')}\n            </span>\n          );\n        } else {\n          return (\n            <span key={i}>\n              <strong>{FilterLabelMap[filterName]}:</strong> {val}\n            </span>\n          )\n        }\n      }).reduce((prev, curr) => [prev, ', ', curr])}\n    </span>\n  );\n};\n\nconst keepKeys = (obj, keys) => {\n  obj = { ... obj }\n  Object.keys(obj).map(key => {\n    if (!keys.includes(key)) {\n      delete obj[key]\n    }\n  })\n  return obj\n}\n\nFilterSummary.propTypes = {\n  filters: PropTypes.object,\n  filterKeys: PropTypes.array,\n  choices: PropTypes.object,\n};\n\nexport default FilterSummary;\n\nconst summarizeFilterSettings = (filters, choices) => {\n   // console.log('FilterSummary.js: summarizeFilterSettings', filters, choices);\n  const filterSummary = {};\n  Object.entries(filters).map(([key, val]) => {\n    // console.log('FilterSummary.js: summarizeFilterSettings:', key, val);\n    // Map: param could be vertical.name, but choices is 'vertical'\n    key = FilterChoiceMap[key] || key;\n    if (choices.hasOwnProperty(key)) {\n      const labels = getLabels(choices[key], val);\n      if (labels) {\n        filterSummary[key] = labels;\n      }\n    } else {\n      // todo guard against non-strings\n      filterSummary[key] = val;\n    }\n  });\n  return filterSummary;\n};\n\nconst getLabels = (options, values) => {\n   //console.log('ReportsFilter.js:summarize getLabels', options, values);\n  if (values && Array.isArray(options)) {\n    // options.filter((opt) => values.includes(opt.value))\n    const selected = Array.isArray(values)\n      ? options.filter((opt) => values.some(val => val.toString() === opt.value.toString()))\n      : options.filter((opt) => opt.value.toString() === values.toString());\n\n    const labels = selected.length ? selected.map((opt) => opt.label) : null;\n\n    // console.log('FilterSummary.js:summarize, getLabels: selected, labels:', selected, labels);\n    return labels;\n  }\n  return null;\n};\n","import React, { useState, useEffect } from 'react';\nimport { DropdownMenu, DropdownToggle, UncontrolledDropdown } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { endOfDay } from 'date-fns';\nimport FilterSummary from '../../Components/Table/FilterSummary';\nimport { StackedFilter, TextSearch } from '../../Components/Table/Filter';\nimport {ProductChoices} from '../../Components/Table/FilterChoices'\nimport usePermission from '../../Hooks/usePermission';\nimport RightDateAndControls from '../../Components/Table/RightDateAndControls';\n\nconst StaticChoices = {\n  // note: handle true/false as string\n  products: ProductChoices,\n  billable: [\n    { value: '', label: 'Any' },\n    { value: 'true', label: 'Yes' },\n    { value: 'false', label: 'No' },\n  ],\n  disposition: [\n    { value: 'answered', label: 'Answered' },\n    { value: 'completed', label: 'Completed' },\n    { value: 'failed', label: 'Failed' },\n    { value: 'canceled', label: 'Canceled' },\n    { value: 'no-answer', label: 'No Answer' },\n    { value: 'busy', label: 'Busy' },\n    { value: 'ringing_inbound', label: 'Ringing Inbound' },\n    { value: 'ringing_outbound', label: 'Ringing outbound' },\n  ],\n};\n\nconst ProspectFilters = ({\n  filters, api, userTimezone, reportLoading, onLoadFilters, onChange, onClear, onExecute, prospectType,\n}) => {\n  const [filterChoices, setFilterChoices] = useState({});\n  const allowViewSources = usePermission('sources.view');\n  const allowViewAuctions = usePermission('auctions.view');\n  // const allowViewVendors = usePermission('vendors.view');\n\n  // load choices on mount\n  useEffect(() => {\n    const params = filters.accounts ? { account_ids: filters.accounts } : {};\n    if (!Object.keys(filterChoices).length) loadChoices(params);\n  }, []);\n\n  const loadChoices = async (params = {}) => {\n    const result = await api.getFilterOptions(params, 'calls');\n    if (result) {\n      const { choices, defaults } = result;\n\n      setFilterChoices({ ...StaticChoices, ...choices });\n\n      // set filters with any default choices\n      if (defaults && !Array.isArray(defaults)) {\n        const defaultFilters = {};\n        Object.entries(defaults).map(([prop, val]) => {\n          if (prop === 'accounts' && Array.isArray(val)) {\n            defaultFilters[prop] = val.map(v=>v.toString())\n          } else {\n            defaultFilters[prop] = val.toString();\n          }\n\n\n        })\n        onChange({...defaultFilters, ...filters})\n      }\n      onLoadFilters && onLoadFilters();\n    }\n  };\n\n  const onFilterChange = (filterName, val) => {\n\n    if (filterName === 'accounts') {\n      if (val.length) {\n        // fetch account order choices\n        loadChoices({ account_ids: val });\n      } else {\n        // remove order choices and filter setting\n        setFilterChoices((prev) => {\n          prev.orders = [];\n          return prev;\n        });\n        // mergeFilter({'orders': []})\n        deleteFilter('orders');\n      }\n    }\n\n    if (!val || (Array.isArray(val) && !val.length)) {\n      deleteFilter(filterName);\n    } else {\n      mergeFilter({ [filterName]: val });\n    }\n  };\n\n  const mergeFilter = (toMerge) => {\n    onChange({ ...filters, ...toMerge });\n  };\n\n  const deleteFilter = (filterName) => {\n    const f = { ...filters };\n    delete f[filterName];\n    onChange(f);\n  };\n\n  const onChangeDate = (selection) => {\n    onChange({\n      ...filters,\n      startDate: selection.startDate,\n      endDate: endOfDay(selection.endDate),\n    });\n  };\n\n  const onTimezoneChange = (tz) => {\n    mergeFilter({\n      timezone: tz,\n    });\n  };\n\n  const clearSearch = () => onFilterChange('origin_number', '');\n\n  return (\n    <div className=\"d-flex  justify-content-between\">\n      <div className=\"flex-fill\">\n        <div className=\"d-flex\">\n\n          {prospectType === 'calls' && (\n            <div className=\"boxed-filter search-filter me-3\">\n              <TextSearch\n                value={filters.origin_number || ''}\n                placeholder=\"Origin Phone Number (10 digit)\"\n                onUpdate={(val) => onFilterChange('origin_number', val)}\n                onClear={clearSearch}\n                delay={200}\n              />\n            </div>\n          )}\n\n          {/* Use of  inNavbar={true} disables popper and allows application of '.dropDown' animation class to menu */}\n          <UncontrolledDropdown inNavbar id=\"report-group-menu\" className=\"ms-3\">\n            {/* \"nav\" makes toggle <a> rather than <button> */}\n            <DropdownToggle nav caret className=\"boxed-filter filter-group-dropdown\">\n              <FaIcon icon=\"filter\" size=\"lg\" className=\"fa-icons\" />\n              <span className=\"title d-block\">Applied Filters</span>\n              <small>\n                {/* Expecting object, not array */}\n                <FilterSummary choices={filterChoices} filters={filters} filterKeys={['accounts', 'orders', 'products','verticals', 'vendors', 'sources', 'disposition', 'billable']} />\n              </small>\n\n            </DropdownToggle>\n            <DropdownMenu className=\"select-filters-dropdown animate dropDown\">\n\n              <div className=\"modal-body\">\n\n                <StackedFilter\n                  label=\"Account\"\n                  placeholder=\"Any Account\"\n                  options={filterChoices.accounts || []}\n                  param=\"accounts\"\n                  onChange={onFilterChange}\n                  value={filters.accounts || []}\n                  isMulti\n                />\n\n                <StackedFilter\n                  label=\"Order\"\n                  placeholder={filters?.accounts?.length ? 'Any Order' : 'Select an account'}\n                  options={filterChoices.orders || []}\n                  param=\"orders\"\n                  onChange={onFilterChange}\n                  value={filters.orders || []}\n                  isMulti\n                />\n\n                <StackedFilter\n                  placeholder=\"Any Vendor\"\n                  label=\"Vendor\"\n                  param=\"vendors\"\n                  options={filterChoices.vendors || []}\n                  value={filters.vendors || null}\n                  onChange={onFilterChange}\n                  isMulti\n                />\n\n                {allowViewSources && allowViewAuctions\n                  && (\n                  <StackedFilter\n                    label=\"Source\"\n                    placeholder=\"Any Source\"\n                    options={filterChoices.sources || []}\n                    param=\"sources\"\n                    value={filters.sources || []}\n                    onChange={onFilterChange}\n                    isMulti\n                  />\n                  )}\n\n                <StackedFilter\n                  placeholder=\"Any Vertical\"\n                  label=\"Vertical\"\n                  param=\"verticals\"\n                  options={filterChoices.verticals || []}\n                  value={filters.verticals || null}\n                  onChange={onFilterChange}\n                  isMulti\n                />\n\n                {prospectType === 'calls' && (\n                  <>\n                    <StackedFilter\n                      placeholder=\"Any Disposition\"\n                      label=\"Disposition\"\n                      param=\"disposition\"\n                      options={filterChoices.disposition || []}\n                      value={filters.disposition || null}\n                      onChange={onFilterChange}\n                      isMulti\n                    />\n\n                    <StackedFilter\n                      placeholder=\"Any Billable Status\"\n                      label=\"Billable\"\n                      param=\"billable\"\n                      options={filterChoices.billable || []}\n                      value={filters.billable || null}\n                      onChange={onFilterChange}\n                    />\n                  </>\n                )}\n\n                {/* Leads prospects are usually leads product orders, but may be calls */}\n                {prospectType === 'leads' && (\n                  <StackedFilter\n                    label=\"Product\"\n                    placeholder=\"Any Product\"\n                    param=\"products\"\n                    options={filterChoices.products || []}\n                    onChange={onFilterChange}\n                    value={filters.products || []}\n                    isMulti\n                  />\n                )}\n              </div>\n\n            </DropdownMenu>\n          </UncontrolledDropdown>\n\n\n        </div>\n      </div>\n\n      <RightDateAndControls\n        startDate={filters.startDate}\n        endDate={filters.endDate}\n        onChangeDate={onChangeDate}\n        onSelectTimezone={onTimezoneChange}\n        timezone={filters.timezone}\n        defaultTimezone={userTimezone}\n        isLoading={reportLoading}\n        onExecute={onExecute}\n        executeLabel=\"View Report\"\n        onReset={onClear}\n        className=\"reports\"\n      />\n\n    </div>\n\n  );\n};\n\nProspectFilters.propTypes = {\n  filters: PropTypes.object.isRequired,\n  api: PropTypes.object.isRequired,\n  onLoadFilters: PropTypes.func,\n  onChange: PropTypes.func.isRequired,\n  onClear: PropTypes.func,\n  onExecute: PropTypes.func.isRequired,\n  accountId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  userTimezone: PropTypes.string,\n  reportLoading: PropTypes.bool,\n  prospectType: PropTypes.string,\n};\n\nexport default ProspectFilters;\n","const RETURN_REQUEST_WINDOW_DAYS = 10;\n// getUTCDay(): Sun=0 .. Sat=6\nconst WEEKDAY_WINDOW_HOURS = { 5: 72, 6: 48 }; // Fri, Sat\nconst DEFAULT_WINDOW_HOURS = 24;\n\n/*\n * Mirrors mastodon-matching's withinCallReturnWindow (call_returns.go):\n * a weekday-dependent window (Friday=72h, Saturday=48h, else=24h),\n * evaluated on the UTC weekday the sale was recorded -- not the buying\n * account's local timezone (dropped 2026-08-25, DMS-1467), and not the\n * viewer's browser timezone.\n */\nexport function withinCallReturnWindow(soldAt, now) {\n  const soldAtDate = new Date(soldAt);\n  const windowHours = WEEKDAY_WINDOW_HOURS[soldAtDate.getUTCDay()] || DEFAULT_WINDOW_HOURS;\n  const deadline = soldAtDate.getTime() + windowHours * 60 * 60 * 1000;\n  return new Date(now).getTime() < deadline;\n}\n\n/*\n * Mirrors mastodon-matching's withinReturnRequestWindow\n * (return_request_window.go): a flat 10-calendar-day window, midnight-\n * anchored in UTC (dropped account-local timezone 2026-08-25, DMS-1469),\n * applying to every product -- calls included, on top of their own shorter\n * window above.\n */\nexport function withinReturnRequestWindow(soldAt, now) {\n  const soldAtDate = new Date(soldAt);\n  const nowDate = new Date(now);\n\n  const todayMidnightUtc = Date.UTC(\n    nowDate.getUTCFullYear(), nowDate.getUTCMonth(), nowDate.getUTCDate(),\n  );\n\n  const deadline = todayMidnightUtc - RETURN_REQUEST_WINDOW_DAYS * 24 * 60 * 60 * 1000;\n  return soldAtDate.getTime() > deadline;\n}\n\n/*\n * Combined eligibility gate: every product needs the flat 10-day window;\n * calls additionally need their own shorter window.\n *\n * Deliberately MORE conservative than ProcessReturn (auction.go) on one\n * point, found 2026-08-31: the backend's own idempotency check only blocks\n * resubmitting the exact same status a sale already has (`sale.ReturnStatus\n * == d.Status`) -- a sale that was, say, denied could still accept a fresh\n * \"requested\" transition server-side if still within window. This function\n * instead blocks on ANY existing return_status, so once a sale has any\n * decision on file (requested/approved/denied), the UI never offers the\n * button again, even if the backend would technically still accept a new\n * request. That's a deliberate simplification, not a precise mirror --\n * revisit if product wants buyers/ops to be able to re-request after a\n * denial rather than treating any decision as final in this UI.\n *\n * Destructures the snake_case keys SaleDoc actually serializes as (this is\n * called directly on API response objects, e.g. `isReturnEligible(sale)` in\n * ReturnActionButton.tsx) -- camelCase keys here would silently read as\n * undefined and always fail the eligibility check.\n */\nexport function isReturnEligible({\n  return_status: returnStatus, sold_at: soldAt, product,\n}, now = new Date()) {\n  if (returnStatus) {\n    return false;\n  }\n  if (!soldAt) {\n    return false;\n  }\n  if (!withinReturnRequestWindow(soldAt, now)) {\n    return false;\n  }\n  if (product === 'calls' && !withinCallReturnWindow(soldAt, now)) {\n    return false;\n  }\n  return true;\n}\n","import React from 'react';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { ReturnStatusLabels } from '../Auctions/constants';\nimport { isReturnEligible } from './returnEligibility';\n\ntype Sale = {\n  sale_id?: string;\n  account_id?: number;\n  auction_id?: string;\n  return_status?: string;\n  sold_at?: string;\n  product?: string;\n};\n\ntype ReturnActionButtonProps = {\n  sale?: Sale;\n  allowRequestReturn: boolean;\n  onRequestReturn: (sale: Sale) => void;\n};\n\n/*\n * Shared between the Leads row action and the lead/auction detail view\n * (DMS-1651/DMS-1652) so eligibility never drifts between the two entry\n * points -- both render this, not a copy of its logic.\n */\nconst ReturnActionButton = ({ sale, allowRequestReturn, onRequestReturn }: ReturnActionButtonProps) => {\n  if (!sale || !allowRequestReturn) {\n    return null;\n  }\n\n  const decided = sale.return_status;\n  // isReturnEligible/ReturnStatusLabels are untyped JS (no .d.ts) -- cast at\n  // the boundary rather than converting those files as part of this fix.\n  const withinWindow = isReturnEligible(sale as any);\n\n  let title;\n  if (!withinWindow) {\n    title = decided ? ((ReturnStatusLabels as Record<string, string>)[decided] || decided) : 'Outside the return window, or already requested';\n  } else {\n    title = 'Request Return';\n  }\n\n  return (\n    <Button\n      color=\"link\"\n      className=\"p-0\"\n      title={title}\n      disabled={!withinWindow}\n      onClick={() => onRequestReturn(sale)}\n    >\n      <FaIcon icon={decided ? 'exclamation-triangle' : 'undo'} />\n    </Button>\n  );\n};\n\nexport default ReturnActionButton;\n","import React from 'react';\nimport { Badge } from 'reactstrap';\nimport { ReturnStatusColors, ReturnStatusLabels } from '../Auctions/constants';\n\ntype Sale = {\n  return_status?: string;\n};\n\ntype ReturnStatusBadgeProps = {\n  sale?: Sale;\n};\n\n/*\n * Renders the return state of a sale.\n *\n * Its own component, alongside ReturnActionButton and for the same reason\n * (DMS-1651/DMS-1652): the Leads row and the lead-detail view both show\n * return state, and a second copy of the label/colour mapping is how the\n * two start disagreeing about what \"denied\" looks like.\n *\n * No return on file is the overwhelmingly common case. It renders as an em\n * dash rather than an empty cell so it reads as \"checked, nothing there\"\n * rather than \"column failed to load\" -- those two look identical when the\n * cell is blank, and that ambiguity is precisely what made the stray call\n * columns confusing on this page.\n *\n * A sale with no overlay entry at all (no account filter selected, so no\n * eligibility data was fetched) renders the same way, deliberately: the\n * page cannot distinguish \"no return\" from \"not looked up\" without\n * claiming more than it knows.\n */\nconst ReturnStatusBadge = ({ sale }: ReturnStatusBadgeProps) => {\n  const status = sale?.return_status;\n\n  if (!status) {\n    return <span className=\"text-muted\">&mdash;</span>;\n  }\n\n  const colors = ReturnStatusColors as Record<string, string>;\n  const labels = ReturnStatusLabels as Record<string, string>;\n\n  // Falls through to the raw status rather than rendering nothing: a status\n  // the UI hasn't been taught yet is still information, and silently\n  // dropping it would hide a backend change instead of surfacing it.\n  return (\n    <Badge color={colors[status] || 'secondary'}>\n      {labels[status] || status}\n    </Badge>\n  );\n};\n\nexport default ReturnStatusBadge;\n","import React, {\n  useEffect, useState, Suspense, lazy,\n} from 'react';\nimport {\n  Modal, ModalBody, ModalHeader, Row, Col, Fade, Spinner, Button,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport PropTypes from 'prop-types';\nimport { DateFormatter } from '../../Components/Table/Table';\nimport { titleCase } from '../../utils/string';\nimport ReturnActionButton from './ReturnActionButton';\nimport ReturnStatusBadge from './ReturnStatusBadge';\n\nconst ReactAudioPlayer = lazy(() => import('react-audio-player'));\nconst RECORDING_URL_BASE = 'https://call-recordings.dmsengage.com/recordings?url=';\n// import {DurationFormatter} from \"../../Components/Table/Table\";\n\n/*\nLead data\n\naccount_name: \"Nationwide Health Advisors\"\naddress: \"100 Main Street\"\nauction_id: \"e87ca63b-dc20-4263-8d40-9b72ecd38d7a\"\nbid: \"$2.00\"\ncall_id: 0\nchannel_name: \"UE Health Leads\"\ncity: \"Crowley\"\ncost: \"$2.00\"\ncurrent_company: \"Other\"\ncurrently_insured: \"No\"\ndrivers: null\nemail: \"mistyride1977@gmail.com\"\nfirst_name: \"Misty\"\nfull_name: \"Misty Roberson\"\nhome_owner: \"No\"\nlast_name: \"Roberson\"\nlead_id: \"e5b53a49-e91e-4142-823a-6a4c3c7a7658\"\norder_name: \"NHA Health Leads\"\nphone: \"+12542294898\"\nproduct: \"Leads\"\npurchased_time: \"2020-12-07 22:00:27\"\nsource_name: \"ZQ Health Leads\"\nstate: \"TX\"\ntransaction_id: 1017330\nvehicles: null\nvendor_name: \"ZipQuote\"\nvertical: \"Health Insurance\"\nzipcode: \"76036\"\n\n */\n\nconst DetailHeader = ({\n  loading, fullName, product, billable,\n}) => {\n  const loadingText = product === 'calls' ? 'Call Detail' : 'Lead Detail';\n  let displayText;\n\n  if (fullName) {\n    displayText = fullName;\n  } else if (product === 'calls' && billable === 'No') {\n    displayText = 'Unbillable Call';\n  } else {\n    displayText = loadingText;\n  }\n\n  return (\n    <h5>\n      {loading ? <span>{loadingText}</span> : <span>{displayText}</span>}\n    </h5>\n  );\n};\n\nconst FormatCall = ({ autoPlay, ...data }) => (\n  <Row>\n    <Col sm={12} md={4} className=\"mt-sm-1\">\n      <div className=\"detail-table mb-2\">\n        <DetailRow label=\"Billable\" value={data.billable} />\n        <DetailRow label=\"Disposition\" value={titleCase(data.disposition)} />\n        <DetailRow label=\"Duration\" value={data.duration || <i>Unknown</i>} />\n        <DetailRow label=\"Account Billable Duration\" value={data.account_billable_duration} />\n        {/* <DetailRow label=\"Device\" value={lead.device}/> */}\n        <DetailRow label=\"Call ID\" value={data.call_id} />\n      </div>\n    </Col>\n\n    {data.recording_url\n      && (\n      <Col sm={12} md={8} className=\"mt-sm-1\">\n        <Suspense fallback={<div>Loading</div>}>\n          <ReactAudioPlayer src={RECORDING_URL_BASE + encodeURIComponent(data.recording_url)} controls autoPlay={autoPlay} className=\"w-100\" />\n        </Suspense>\n      </Col>\n      )}\n  </Row>\n);\n\nconst FormatContact = ({\n  fullName, city, country, state, zipcode, address, address2, email, phone, date_of_birth,\n}) => (\n  <div className=\"contact d-flex justify-content-between\">\n    <div className=\"d-flex flex-column\">\n      <div>{fullName ?? <i>Unknown name</i>}</div>\n      <div>\n        {address ?? <i>Unknown address</i>}\n        {address2 && (\n          <span>\n            {' '}\n            (\n            {address2}\n            )\n          </span>\n        ) }\n      </div>\n      <div>\n        {city ?? <i>Unknown city</i>}\n        ,\n        {' '}\n        {state ?? <i>Unknown state</i>}\n        {' '}\n        {zipcode}\n        {' '}\n        {country && country.toLowerCase() !== 'usa' ? country : ''}\n      </div>\n    </div>\n    <div className=\"d-flex flex-column\">\n      {email && (\n        <div>\n          <FaIcon icon=\"envelope\" size=\"sm\" className=\"me-1\" />\n          {email}\n        </div>\n      )}\n      {phone && (\n        <div>\n          <FaIcon icon=\"phone\" size=\"sm\" className=\"me-1\" />\n          {phone}\n        </div>\n      )}\n      {date_of_birth && (\n        <div>\n          D.o.B:\n          {date_of_birth && <DateFormatter value={date_of_birth} format=\"M/dd/y\" />}\n        </div>\n      )}\n      {date_of_birth && (\n        <div>\n          D.o.B (FNS):\n          {date_of_birth && <DateFormatter value={date_of_birth} format=\"MM/dd/y\" />}\n        </div>\n      )}\n    </div>\n  </div>\n);\n\nconst FormatInsurance = ({\n  current_company, currently_insured, medicare_type, denied_coverage, vertical,\n}) => (\n  <div className=\"detail-table\">\n    <DetailRow label=\"Current company\" value={current_company} />\n    <DetailRow label=\"Currently insured\" value={currently_insured ? 'Yes' : 'No'} />\n    {vertical === 'Health Insurance' && (\n      <>\n        <DetailRow label=\"Medicare type\" value={medicare_type || 'N/A'} />\n        <DetailRow label=\"Denied coverage\" value={denied_coverage ? 'Yes' : 'No'} />\n      </>\n    )}\n\n  </div>\n);\n\n// At the moment no health data is returned from Looker\nconst FormatHealth = ({\n  gender, height_inches, weight_pounds, tobacco_user, pregnant, preexisting_conditions, social_security, income, household_size,\n}) => (\n  <div className=\"detail-table\">\n    <DetailRow label=\"Gender\" value={gender || <i>Unknown</i>} />\n    <DetailRow label=\"Height (inches)\" value={height_inches || <i>Unknown</i>} />\n    <DetailRow label=\"Weight (pounds)\" value={weight_pounds || <i>Unknown</i>} />\n    <DetailRow label=\"Tobacco user\" value={tobacco_user || <i>Unknown</i>} />\n    <DetailRow label=\"Pregnant\" value={pregnant || <i> Unknown</i>} />\n    <DetailRow label=\"Pre-existing conditions\" value={preexisting_conditions || <i>Unknown</i>} />\n    <DetailRow label=\"Social security\" value={social_security || <i>Unknown</i>} />\n    <DetailRow label=\"Income\" value={income || <i>Unknown</i>} />\n    <DetailRow label=\"Household size\" value={household_size || <i>Unknown</i>} />\n  </div>\n);\n\nconst FormatAuto = ({ drivers = [], vehicles = [] }) => (\n  <>\n    <div>\n      {drivers?.length > 0 ? (\n        <div className=\"detail-table mb-2\">\n          <h5>Drivers</h5>\n          {drivers.map((drv, i) => (\n            <div className=\"driver mb-1\" key={i}>\n              <span>\n                  {drv.gender === 'M' ? 'Male' : 'Female'}\n                  {' '}\n                  |\n                  {' '}\n                  {drv.marital_status}\n                  {' '}\n                  | D.o.B:\n                  {' '}\n                  {drv.date_of_birth && <DateFormatter value={drv.date_of_birth} format=\"MM/dd/y\" />}\n                </span>\n            </div>\n\n          ))}\n        </div>\n      ) : <span>No driver data</span>}\n    </div>\n    <div>\n      {vehicles?.length > 0 ? (\n        <div className=\"detail-table\">\n          <h5>Vehicles</h5>\n          {vehicles.map((v, i) => (\n            <div className=\"vehicle mb-1\" key={i}>\n              <span>\n                  {v.year}\n                  {' '}\n                  {v.make}\n                  {' '}\n                  {v.model}\n                  {' '}\n                  | miles:\n                  {' '}\n                  {v.annual_mileage}\n                  m | commute:\n                  {' '}\n                  {v.commute_mileage}\n                  m\n                </span>\n            </div>\n          ))}\n        </div>\n      ) : <span>No vehicle data</span>}\n    </div>\n  </>\n);\n\nconst FormatLead = ({\n  lead, cost, product, billable, vendor, vertical,\n}) => (\n  <div className=\"detail-table\">\n    { (product !== 'Calls' || billable === 'Yes') && (\n    <>\n      <DetailRow label=\"Vendor\" value={vendor || <i>Unknown</i>} />\n\n      {lead.tcpa_disclosure !== undefined && <DetailRow label=\"TCPA\" value={lead.tcpa_disclosure ? 'Yes' : 'No'} />}\n      <DetailRow label=\"Vertical\" value={vertical} />\n      <DetailRow label=\"Product\" value={titleCase(lead.product)} />\n      {product === 'calls'\n        ? <DetailRow label=\"Received At\" value={<DateFormatter value={lead.received_time} format=\"PPpp\" />} />\n        : <DetailRow label=\"Purchase Date\" value={<DateFormatter value={lead.purchased_time} format=\"PPpp\" />} />}\n\n      <DetailRow label=\"Cost\" value={cost} />\n      {/* <DetailRow label=\"Bid\" value={lead.bid}/> */}\n      {lead.device && <DetailRow label=\"Device\" value={lead.device || ''} />}\n      {lead.lead_id && <DetailRow label=\"Lead ID\" value={lead.lead_id || ''} />}\n      {/* {lead.source_name && <DetailRow label=\"Lead Source\" value={lead.source_name || ''}/>} */}\n      {lead.channel_name && <DetailRow label=\"Channel\" value={lead.channel_name || ''} />}\n    </>\n    )}\n\n    <DetailRow label=\"Auction ID\" value={lead.auction_id || ''} />\n\n  </div>\n);\n\nconst DetailRow = ({ label, value, children }) => (\n  <div className=\"detail-row\">\n    <label>{label}</label>\n    <div>{value || children}</div>\n  </div>\n);\n/*\n Differences between product leads\n *********************************\n Calls has a data.lead object, Lead does not\n\n home ownership\n    both lead and call have data.home_owner (Yes/No).\n    Call has data.lead.home_ownership (Yes/No)\n\n billable (Yes/No)\n    Call has it, Lead does not\n\n tcpa_url\n    Call has it in data.lead.  Lead does not have it.\n\n date\n    Call is data.received_time, Lead is data.purchased_time\n\n Vertical\n    Call:  has data.vertical=\"Auto Insurance\", and also data.lead.vertical=\"auto-insurance\"\n    Lead:  has data.vertical=\"Auto Insurance\"\n\n Drivers/Vehicles arrays\n    Call has them in both data and data.lead\n    Lead for auto-insurance has them in data\n\n */\n/*\n * Modal for lead detail\n */\nconst ProspectDetailModal = (props) => {\n  // console.log('CallDetailModal.js:props', props);\n  const [fadeIn] = useState(true);\n  const [loading, setLoading] = useState(true);\n  const [data, setData] = useState(null);\n  const [lead, setLead] = useState(null);\n  const [hideNonbillable, setHideNonBillable] = useState(false);\n  const [showHealth, setShowHealth] = useState(false);\n\n  useEffect(() => {\n    if (!data && props.callId) {\n      load();\n    }\n\n    return () => {\n      setData(null);\n      setLead(null);\n      setLoading(true);\n    };\n  }, [props.callId]);\n\n  const load = async () => {\n    const result = await props.loadDetail(props.callId);\n    if (result?.data) {\n      // Calls data has a 'lead' object with some unique data, and some data that is in the parent data.\n      // Leads data does not have a lead object.\n      setData(result.data);\n      setLead(result.data.lead || result.data);\n      setHideNonBillable(props.product === 'calls' && result.data.billable === 'No');\n    } else {\n      // TODO: error notice\n    }\n    setLoading(false);\n  };\n\n\n  if (!props.callId) return (null);\n\n  // Second entry point for the same return-request action as the Leads row\n  // (DMS-1652) -- looked up from the already-fetched overlay by auction_id,\n  // not a separate API call. This view carries no internal financial figure\n  // (Internal Bid, Vendor Bid, Vendor Payout never appear here; only the\n  // account's own Cost, already shown below) -- see DMS-1470/DMS-1652 on why\n  // the ops auction debug page couldn't be reused for this instead.\n  const sale = props.salesByAuction?.[data?.auction_id];\n\n  return (\n    <Modal isOpen={props.isOpen} toggle={props.cancel} size=\"xlg\" className=\"modal-prospect-detail\">\n      <ModalHeader toggle={props.cancel} tag=\"div\">\n        <DetailHeader loading={loading} product={props.product} fullName={data?.full_name} billable={data?.billable} />\n        {data && (\n        <div className=\"subheader d-flex justify-content-between align-items-center\">\n          <b>\n            {data?.account_name}\n            {' '}\n            &gt;\n            {' '}\n            {data?.order_name}\n          </b>\n          <div className=\"d-flex align-items-center gap-2\">\n            {/*\n              * The status reads out here rather than living only in the\n              * action button's tooltip. On the Leads row the button sits in\n              * a Return Status column that already states the answer; opened\n              * on its own, this view had no such column, so a disabled\n              * button was the only signal and \"why can't I click this\" meant\n              * hovering to find out.\n              */}\n            <ReturnStatusBadge sale={sale} />\n            <ReturnActionButton sale={sale} allowRequestReturn={props.allowRequestReturn} onRequestReturn={props.onRequestReturn} />\n          </div>\n        </div>\n        )}\n      </ModalHeader>\n\n      <ModalBody>\n        {loading && <div style={{ marginTop: '150px' }}><Spinner  className=\"m-auto d-block\" color=\"secondary\" /></div>}\n        {data && !loading && (\n\n          <Fade in={fadeIn} exit={false}>\n\n            <Row>\n\n              <Col sm={12} md={6} className=\"mt-sm-1\">\n                <legend>Contact</legend>\n                <FormatContact fullName={data.full_name} {...lead} />\n              </Col>\n\n              <Col sm={12} md={6} className=\"mt-sm-1\">\n                <legend>Insurance</legend>\n                <FormatInsurance {...lead} />\n              </Col>\n\n              <Col sm={12} md={6} className=\"mt-2\">\n                <legend>Lead</legend>\n                {/* tcpa_url={lead.tcpa_url} tcpa_disclosure={lead.tcpa_disclosure} */}\n                <FormatLead\n                  lead={lead}\n                  cost={data.cost}\n                  product={props.product}\n                  billable={data.billable}\n                  vendor={data.vendor_name}\n                  vertical={data.vertical}\n                />\n              </Col>\n\n              <Col sm={12} md={6} className=\"mt-sm-2 mt-md-2\">\n                {data.vertical === 'Auto Insurance' && !hideNonbillable\n                && (\n                <div className=\"mt-2\">\n                  <legend>Driver & Car</legend>\n                  <FormatAuto drivers={lead.drivers} vehicles={lead.vehicles} />\n                </div>\n                )}\n\n                {/* MST-1017 some call leads have a home ownership boolean */}\n                {!hideNonbillable && typeof data.home_owner !== 'undefined'\n                && (\n                <div className=\"mt-2\">\n                  <legend>Home</legend>\n                  <div className=\"detail-table\">\n                    <DetailRow label=\"Home Ownership\" value={data.home_owner} />\n                  </div>\n                </div>\n                )}\n\n                {(data.vertical === 'Health Insurance' || data.vertical === 'Medicare') && !hideNonbillable\n                && (\n                <div className=\"mt-2\">\n                  <legend>\n                    <div>Health</div>\n                    {showHealth ? (\n                      <Button size=\"sm\" color=\"link\" onClick={() => setShowHealth(false)}><FaIcon icon=\"chevron-down\" /></Button>\n                    ) : (\n                      <Button size=\"sm\" color=\"link\" onClick={() => setShowHealth(true)}><FaIcon icon=\"chevron-right\" /></Button>\n                    )}\n                  </legend>\n\n                  {showHealth && <FormatHealth {...lead} />}\n\n                </div>\n                )}\n\n              </Col>\n\n            </Row>\n\n            {props.product === 'calls'\n            && (\n            <Row className=\"mt-2\">\n              <Col>\n                <legend>Call</legend>\n                <FormatCall {...data} autoPlay={props.autoPlayId && data.call_id === props.autoPlayId} />\n              </Col>\n            </Row>\n            )}\n\n          </Fade>\n        )}\n\n      </ModalBody>\n    </Modal>\n  );\n};\n\nProspectDetailModal.propTypes = {\n  loadDetail: PropTypes.func, // may load calls or leads depending on parent component\n  product: PropTypes.string,\n  getDetail: PropTypes.func,\n  isOpen: PropTypes.bool,\n  loading: PropTypes.bool,\n  cancel: PropTypes.func,\n  autoPlayId: PropTypes.number,\n  salesByAuction: PropTypes.object,\n  allowRequestReturn: PropTypes.bool,\n  onRequestReturn: PropTypes.func,\n};\n\nProspectDetailModal.defaultProps = {\n\n};\n\nexport default ProspectDetailModal;\n","const CallColumnChoices = [\n  // {value:'call_id', label:'Call ID'},\n  { value: 'received_time', label: 'Received Time' },\n  { value: 'disposition', label: 'Disposition' },\n  // {value:'phone', label:'Phone'}, //Same as origin_number\n  { value: 'origin_number', label: 'Origin Number' },\n  { value: 'transfer_number', label: 'Transfer Number' },\n  { value: 'destination_number', label: 'Destination Number' },\n  { value: 'billable', label: 'Billable' },\n  { value: 'duration', label: 'Duration' },\n  { value: 'account_billable_duration', label: 'Duration Threshold (account)' },\n  { value: 'vendor_billable_duration', label: 'Duration Threshold (vendor)' },\n  { value: 'cost', label: 'Cost' },\n  { value: 'sales', label: 'Sales' },\n  { value: 'cost_per_sale', label: 'Cost Per Sale' },\n  // Currently revenue mostly the same as cost. We might need to restrict by permission\n  // {value:'revenue', label:'Revenue'},\n  { value: 'account_name', label: 'Account Name' },\n  { value: 'order_name', label: 'Order Name' },\n  { value: 'vertical', label: 'Vertical Name' },\n  { value: 'source_name', label: 'Source Name' },\n  { value: 'channel_name', label: 'Channel Name' },\n  { value: 'vendor_name', label: 'Vendor Name' },\n  { value: 'buyer_name', label: 'Buyer Name' },\n  { value: 'broker_name', label: 'Broker Name' },\n  { value: 'full_name', label: 'Full Name' },\n  { value: 'city', label: 'City' },\n  { value: 'state', label: 'State' },\n];\n\nexport const getCallColumnChoices = (allowViewSource) => (\n  allowViewSource ? CallColumnChoices : CallColumnChoices.filter((c) => c.value !== 'source_name')\n);\n\n// Started life as a copy of CallColumnChoices above, which left three\n// call-routing columns on a page that has no calls. Corrected DMS-1651:\n//\n//  - transfer_number / destination_number are call-leg concepts. A posted\n//    lead has neither, so both were offered in the picker and then rendered\n//    empty for every row -- the \"I selected it and nothing showed up\"\n//    reported on this page.\n//  - origin_number is kept: for a lead it IS the consumer's phone (see the\n//    commented-out `phone` entry in CallColumnChoices, \"Same as\n//    origin_number\"). Relabelled to say so, since \"Origin Number\" only\n//    means anything if you already know it came from the calls report.\nconst LeadColumnChoices = [\n  // {value:'lead_id', label:'Lead ID'},\n  { value: 'purchased_time', label: 'Purchased Time' },\n  { value: 'origin_number', label: 'Phone' },\n  { value: 'cost', label: 'Cost' },\n  { value: 'product', label: 'Product' },\n  // Currently revenue mostly the same as cost. We might need to restrict by permission\n  // {value:'revenue', label:'Revenue'},\n  { value: 'account_name', label: 'Account Name' },\n  { value: 'order_name', label: 'Order Name' },\n  { value: 'vertical', label: 'Vertical Name' },\n  { value: 'source_name', label: 'Source Name' },\n  { value: 'channel_name', label: 'Channel Name' },\n  { value: 'vendor_name', label: 'Vendor Name' },\n  { value: 'buyer_name', label: 'Buyer Name' },\n  { value: 'broker_name', label: 'Broker Name' },\n  { value: 'full_name', label: 'Full name' },\n  { value: 'city', label: 'City' },\n  { value: 'state', label: 'State' },\n];\n\nexport const getLeadColumnChoices = (allowViewSource) => (\n  allowViewSource ? LeadColumnChoices : LeadColumnChoices.filter((c) => c.value !== 'source_name')\n);\n","import React from 'react';\nimport {\n  DropdownMenu, DropdownToggle, Button, UncontrolledDropdown,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport Select from '../../Components/Form/SimpleSelect';\n\nconst CallColumnSelect = (props) => {\n  const findColIndex = (col) => props.choices.findIndex((c) => c.value === col);\n\n  const handleSelectColumn = (cols) => {\n    // The updated columns will NOT necessarily be ordered correctly\n    // so we have to re-order it against the choices array\n    // (Because API returns columns in the order request)\n    const ordered = Array(cols.length);\n    cols.map((col) => {\n      const idx = findColIndex(col);\n      if (idx >= 0) ordered[idx] = col;\n    });\n\n    // filter is for re-indexing\n    props.onUpdate(ordered.filter(Boolean));\n  };\n\n  // TODO special permission to view source\n  return (\n    <UncontrolledDropdown className=\"me-2\" size=\"sm\">\n      <DropdownToggle color=\"link\" caret className=\"ms-0 pl-0\" disabled={props.disabled}>\n        <FaIcon icon=\"columns\" size=\"sm\" className=\"fa-icons me-1\" />\n        <span className=\"title\">\n          Columns\n          {props.selectedCols && props.selectedCols.length > 0 && (\n          <span>\n            {' '}\n            (\n            {props.selectedCols.length}\n            {' '}\n            selected)\n          </span>\n          )}\n        </span>\n      </DropdownToggle>\n      <DropdownMenu id=\"view-columns-dropdown\" className=\"select-filters-dropdown dropDown\">\n\n        <div className=\"modal-body\">\n          <div>\n            <Select\n              autoFocus={false}\n              placeholder=\"Select columns to view...\"\n              classNamePrefix=\"select-filter\"\n              isClearable\n              onChange={handleSelectColumn}\n              options={props.choices}\n              value={props.selectedCols}\n              tabSelectsValue\n              backspaceRemovesValue\n              isSearchable\n              isMulti\n              menuIsOpen\n              controlShouldRenderValue\n              closeMenuOnSelect={false}\n              hideSelectedOptions={false}\n              maxMenuHeight={200}\n            />\n          </div>\n\n          <div className=\"d-flex justify-content-end\">\n            <Button className=\"ms-2\" onClick={props.onApply} size=\"sm\">Apply</Button>\n          </div>\n\n        </div>\n      </DropdownMenu>\n    </UncontrolledDropdown>\n\n  );\n};\n\nCallColumnSelect.propTypes = {\n  choices: PropTypes.array.isRequired,\n  selectedCols: PropTypes.array.isRequired,\n  onUpdate: PropTypes.func.isRequired,\n  onApply: PropTypes.func.isRequired,\n  disabled: PropTypes.bool,\n};\nCallColumnSelect.defaultProps = {\n  selectedCols: [],\n};\n\nexport default CallColumnSelect;\n","import React, {\n  useEffect, useState, useMemo, useContext,\n} from 'react';\nimport { AppContext } from '../../Providers/AppProvider';\nimport PageSection from '../../Layout/PageSection';\nimport DocTitle from '../../Layout/DocTitle';\nimport ProspectFilters from './ProspectFilters';\nimport PagedTable from '../../Components/Table/PagedTable';\nimport FilterBar from '../../Components/Table/FilterBar';\nimport ProspectDetailModal from './ProspectDetailModal';\nimport { getCallColumnChoices } from './ColumnSelectChoices';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport {\n  extractColumnsAndDataForLeads,\n  convertFilterParams,\n} from './api';\nimport './styles.scss';\nimport usePagedTableState from '../../Hooks/usePagedTableState';\nimport { format, startOfDay, endOfDay } from 'date-fns';\nimport { Button } from 'reactstrap';\nimport CallColumnSelect from './CallColumnSelect';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport DownloadFileLink from '../../Components/DownloadFileLink';\nimport usePermission from '../../Hooks/usePermission';\nimport Modal from './../Auctions/Details/Modal';\nimport BooleanIconCell from \"../../Components/Table/BooleanIconCell\";\n\nconst DefaultFilters = {\n  startDate: startOfDay(new Date()),\n  endDate: endOfDay(new Date()),\n};\n\nconst DefaultControls = {\n  limit: 20,\n  sort_by: 'received_time',\n  sort_dir: 'desc',\n  page: 1,\n};\n\n/*\n * Calls List - paged table with filters\n *\n */\nconst Calls = () => {\n  const app = useContext(AppContext);\n  const Reporting = React.useMemo(() => app.getApi('reporting'), []);\n  const userTimezone = app.user.timezone;\n  const csvDefaultName = `Mastodon_Calls_${format(new Date(), 'yyyy-dd')}.csv`;\n  const {\n    filters, setFilters, updateQuery, reset, controls, tableEvent,\n  } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: true, useTableControls: true, updateOnFilterChange: false },\n  );\n  const [loading, setLoading] = useState(true);\n  const [report, setReport] = useState({ data: [], columns: [], columnChoices: [] });\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const [detailId, setDetailId] = useState();\n  const [auctionId, setAuctionId] = useState();\n  const [filtersLoaded, setFiltersLoaded] = useState(false);\n  const allowViewSource = usePermission('sources.view');\n  const allowViewAuction = usePermission('auctions.view');\n  const columnChoices = useMemo(() => getCallColumnChoices(allowViewSource && allowViewAuction), []);\n\n  const initialTableState = useMemo(() => ({\n    // These columns are useful for detail view but we don't show them in the table\n    hiddenColumns: ['auction_id', 'call_id'],\n    sortBy: [\n      { id: controls.sort_by, desc: true },\n    ],\n  }), []);\n\n  useEffect(() => {\n    if (filtersLoaded && !loading && tableEvent && tableEvent !== 'filters') {\n      loadCalls();\n    }\n  }, [tableEvent, controls.sort_by, controls.sort_dir, controls.page, controls.limit]);\n\n  //filters need to load first because sometimes they can adjust\n  useEffect(() => {\n    if (filtersLoaded) {\n      loadCalls();\n    }\n  }, [filtersLoaded]);\n\n  const CellResolver = (colId) => {\n    if (colId === 'billable') {\n      return BooleanIconCell;\n    }\n    return null;\n  };\n\n  const handleClearFilters = () => reset({ fields: filters.fields || [] });\n\n  const handleUpdateColumns = (fields) => setFilters({ ...filters, fields });\n\n  // Accounts filter is provided in detail request.\n  // Rule is: without the explicit pii.view permission, you can only see unmasked PII if you are filtering by your direct (associated with user)\n  // account, not child accounts.\n  const loadDetail = async (id) => await Reporting.getProspectDetail(id, 'calls', filters.accounts ? {account_ids:filters.accounts} : {});\n\n  const toggleDetail = (id) => setDetailId(id);\n  const toggleAuction = (id) => setAuctionId(id);\n\n  const loadCalls = async () => {\n    setLoading(true);\n\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n\n    const apiFilters = convertFilterParams(filters, null);\n\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls;\n\n    const response = await Reporting.getCalls({\n      ...apiFilters,\n      page,\n      sort_by,\n      sort_dir,\n      number_per_page: limit,\n      // fields:'received_time,origin_number,call_id,vertical,source_name,cost,transfer_number,duration,billable,disposition,full_name,city,state'\n    });\n\n    if (response) {\n      const { total, pages_count } = response;\n      setPageCount(pages_count || 1);\n      setTotalRows(total);\n      const rpt = extractColumnsAndDataForLeads(response, CellResolver);\n\n      // For column picker set selected fields if not already selected, based on columns in response.\n      // Filter out hidden columns.\n      if (!filters.fields?.length) {\n        setFilters({ ...filters, fields: rpt.columns.map((c) => c.dataField).filter((c) => !initialTableState.hiddenColumns.includes(c)) });\n      }\n\n      // add in the actions column\n      rpt.columns = [\n        {\n          id: 'actions',\n          Cell: ({ row }) => <ActionCell row={row.original} openDetail={toggleDetail} openDebug={toggleAuction} allowViewAuction={allowViewAuction} />,\n          maxWidth: 100,\n        },\n        ...rpt.columns,\n      ];\n\n      //console.log('Calls.js:on load, report', rpt);\n      setReport(rpt);\n    } else {\n      notify(`Unable to load calls: ${Reporting.error.name}`, 'error');\n    }\n    updateQuery();\n    setLoading(false);\n  };\n\n  const loadCSV = async () => {\n    const apiFilters = convertFilterParams(filters, null);\n\n    const response = await Reporting.getCalls({\n      ...apiFilters,\n    }, 'csv');\n\n    return response;\n  };\n\n  const { data = [], columns = [] } = report;\n\n  return (\n\n    <>\n      <DocTitle pageTitle=\"Calls\" />\n\n      <FilterBar>\n        <ProspectFilters\n          filters={filters}\n          api={Reporting}\n          onLoadFilters={()=>setFiltersLoaded(true)}\n          onChange={setFilters}\n          onExecute={loadCalls}\n          onClear={handleClearFilters}\n          userTimezone={userTimezone}\n          reportLoading={loading}\n          prospectType=\"calls\"\n        />\n      </FilterBar>\n\n      <PageSection title=\"Calls\" className=\"overflow-section\">\n\n        <div className=\"d-flex mb-2\">\n\n          <CallColumnSelect\n            choices={columnChoices}\n            onUpdate={handleUpdateColumns}\n            onApply={loadCalls}\n            selectedCols={filters.fields}\n            disabled={loading || data.length === 0}\n          />\n\n          <DownloadFileLink\n            downloadSource={loadCSV}\n            label=\"Download CSV\"\n            defaultFilename={csvDefaultName}\n            disabled={loading || data.length === 0}\n          />\n        </div>\n\n        <PagedTable\n          data={data}\n          columns={columns}\n          initialState={initialTableState}\n          className=\"reports-table striped\"\n          loading={loading}\n          pageCount={pageCount}\n          totalRows={totalRows}\n          {...controls}\n          noDataMessage=\"No calls were found\"\n        />\n\n      </PageSection>\n\n      <ProspectDetailModal\n        callId={detailId}\n        loadDetail={loadDetail}\n        isOpen={!!detailId}\n        cancel={() => toggleDetail(null)}\n        product=\"calls\"\n        autoPlayId={0}\n      />\n\n      <Modal\n        auctionId={auctionId}\n        isOpen={!!auctionId}\n        cancel={() => toggleAuction(null)}\n      />\n\n    </>\n  );\n};\n\nconst ActionCell = React.memo(({\n  row, openDetail, openDebug, allowViewAuction,\n}) => (\n  <div className=\"row-actions\">\n    {row.billable === 'Yes' && (\n    <Button color=\"link\" className=\"pt-0 pb-0 pr-1\" title=\"Call Detail\" onClick={() => openDetail(row.call_id)}>\n      <FaIcon icon=\"id-card\" />\n    </Button>\n    )}\n    {allowViewAuction && (\n    <Button color=\"link\" className=\"p-0\" title=\"Auction/Delivery Debug\" onClick={() => openDebug(row.auction_id)}>\n      <FaIcon icon=\"comment-dollar\" />\n    </Button>\n    )}\n  </div>\n\n));\n\nexport default Calls;\n","import React, {\n  useEffect, useState, useMemo, useContext,\n} from 'react';\nimport PageSection from '../../Layout/PageSection';\nimport { AppContext } from '../../Providers/AppProvider';\nimport DocTitle from '../../Layout/DocTitle';\nimport ProspectFilters from './ProspectFilters';\nimport PagedTable from '../../Components/Table/PagedTable';\nimport FilterBar from '../../Components/Table/FilterBar';\nimport ProspectDetailModal from './ProspectDetailModal';\nimport { getLeadColumnChoices } from './ColumnSelectChoices';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport {\n  extractColumnsAndDataForLeads,\n  convertFilterParams,\n} from './api';\nimport './styles.scss';\nimport usePagedTableState from '../../Hooks/usePagedTableState';\nimport { format, startOfDay, endOfDay } from 'date-fns';\nimport { Button } from 'reactstrap';\nimport CallColumnSelect from './CallColumnSelect';\n// eslint-disable-next-line import/order\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n//import DownloadFileLink from '../../Components/DownloadFileLink';\nimport usePermission from '../../Hooks/usePermission';\nimport AuctionModal from '../Auctions/Details/Modal';\nimport RequestReturnModal from '../Auctions/Details/RequestReturnModal';\nimport ReturnActionButton from './ReturnActionButton';\nimport ReturnStatusBadge from './ReturnStatusBadge';\n\nconst DefaultFilters = {\n  startDate: startOfDay(new Date()),\n  endDate: endOfDay(new Date()),\n\n};\n\nconst DefaultControls = {\n  limit: 20,\n  sort_by: 'purchased_time',\n  sort_dir: 'desc',\n};\n\n/*\n * Leads List - paged table with filters\n *\n */\nconst Leads = () => {\n  const app = useContext(AppContext);\n  const Reporting = React.useMemo(() => app.getApi('reporting'), []);\n  const userTimezone = app.user.timezone;\n  const _csvDefaultName = `Mastodon_Leads_${format(new Date(), 'yyyy-dd')}.csv`;\n  const {\n    filters, setFilters, updateQuery, controls, tableEvent, reset,\n  } = usePagedTableState(\n    DefaultFilters,\n    DefaultControls,\n    { useQueryString: true, useTableControls: true, updateOnFilterChange: false },\n  );\n  const [loading, setLoading] = useState(true);\n  // const[data, setData] = useState([]);\n  const [report, setReport] = useState({ data: [], columns: [], columnChoices: [] });\n  const [pageCount, setPageCount] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n  const [filtersLoaded, setFiltersLoaded] = useState(false);\n  const [detailId, setDetailId] = useState();\n  const [auctionId, setAuctionId] = useState();\n  const [returnModalSale, setReturnModalSale] = useState(null);\n  // Read on later renders only (detail modal open, re-render after load) --\n  // never within the same loadLeads() call that sets it, which would read\n  // the pre-update value. rpt.columns uses the local salesOverlay instead,\n  // precisely to avoid that.\n  const [salesByAuction, setSalesByAuction] = useState({});\n  const allowViewSource = usePermission('sources.view');\n  const allowViewAuction = usePermission('auctions.view');\n  // sales.view/returns.create, not leads.view: separate from the page-level\n  // permission so this is ready for a buyer/agent grant once that actor\n  // model exists (see DMS-1651) without a UI change.\n  const allowViewSales = usePermission('sales.view');\n  const allowRequestReturn = usePermission('returns.create');\n  const columnChoices = useMemo(() => getLeadColumnChoices(allowViewSource && allowViewAuction), []);\n\n  const initialTableState = useMemo(() => ({\n    // These columns are useful for detail view but we don't show them in the table\n    hiddenColumns: ['auction_id', 'lead_id'],\n    sortBy: [\n      { id: controls.sort_by, desc: true },\n    ],\n  }), []);\n\n  useEffect(() => {\n    if (filtersLoaded && !loading && tableEvent && tableEvent !== 'filters') {\n      loadLeads();\n    }\n  }, [tableEvent, controls.sort_by, controls.sort_dir, controls.page, controls.limit]);\n\n  //filters need to load first because sometimes they can adjust\n  useEffect(() => {\n    if (filtersLoaded) {\n      loadLeads();\n    }\n  }, [filtersLoaded]);\n\n  const handleClearFilters = () => reset({ fields: filters.fields || [] });\n\n  const handleUpdateColumns = (fields) => {\n    setFilters({ ...filters, fields });\n  };\n\n  // Accounts filter is provided in detail request.\n  // Rule is: without the explicit pii.view permission, you can only see unmasked PII if you are filtering by your direct (associated with user)\n  // account, not child accounts.\n  const loadDetail = async (id) => await Reporting.getProspectDetail(id, 'leads', filters.accounts ? {account_ids:filters.accounts} : {});\n\n  const toggleAuction = (id) => setAuctionId(id);\n\n  // Overlays return eligibility onto the existing Looker-backed leads list by\n  // joining on auction_id (present on both responses) rather than replacing\n  // the leads data source -- read-service's /sales carries return_status/\n  // window fields but none of the reporting columns (phone, vertical,\n  // city/state, names) this page already shows.\n  //\n  // account_id stays required (the /sales proxy's own access-scoping check,\n  // DMS-1659) and auction_id narrows to exactly the leads on this page --\n  // NOT a fetch of \"the account's N most recent sales\": that flat window\n  // (sorted sold_at desc, capped at per_page) silently missed matches\n  // outside it for high-volume accounts or an older date filter. Requires\n  // an account filter selected; without one, no eligibility data loads and\n  // no return icon renders.\n  const loadSalesOverlay = async (auctionIds) => {\n    if (!allowViewSales || !filters.accounts?.length || !auctionIds.length) {\n      return {};\n    }\n\n    const response = await app.api.endpoints.sales.list({\n      account_id: filters.accounts,\n      auction_id: auctionIds,\n      per_page: auctionIds.length,\n    });\n\n    const hits = response?.sales?.hits || [];\n    const byAuction = {};\n    hits.forEach((sale) => {\n      // Results arrive sorted newest-first (sold_at desc) -- keep only the\n      // first (newest) sale seen per auction_id. An auction can have more\n      // than one sale (e.g. reversed and resold), and eligibility must be\n      // evaluated against the current one, not overwritten by an older one\n      // processed later in the array.\n      if (sale.auction_id && !byAuction[sale.auction_id]) {\n        byAuction[sale.auction_id] = sale;\n      }\n    });\n    return byAuction;\n  };\n\n  const loadLeads = async () => {\n    setLoading(true);\n    updateQuery();\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n\n    const apiFilters = convertFilterParams(filters, null);\n    const {\n      page, sort_by, sort_dir, limit,\n    } = controls;\n\n    const response = await Reporting.getLeads({\n      ...apiFilters,\n      page,\n      sort_by,\n      sort_dir,\n      number_per_page: limit,\n    });\n\n    if (response) {\n      const { total, pages_count } = response;\n      setPageCount(pages_count || 1);\n      setTotalRows(total);\n      const rpt = extractColumnsAndDataForLeads(response);\n\n      // Sales overlay is fetched after leads resolve, scoped to exactly the\n      // auction_ids on this page -- can't be parallelized with the leads\n      // fetch above since it depends on knowing which auctions are on it.\n      const auctionIds = rpt.data.map((row) => row.auction_id).filter(Boolean);\n      const salesOverlay = await loadSalesOverlay(auctionIds);\n      // Safe to read back later (detail modal open, re-render after load) --\n      // rpt.columns below uses the local salesOverlay instead of this state,\n      // since state updates aren't visible within the same call.\n      setSalesByAuction(salesOverlay);\n\n      // For column picker set selected fields if not already selected, based on columns in response.\n      // Filter out hidden columsn.\n      if (!filters?.fields?.length) {\n        setFilters({ ...filters, fields: rpt.columns.map((c) => c.dataField).filter((c) => !initialTableState.hiddenColumns.includes(c)) });\n      }\n\n      // Add in the action column\n      rpt.columns = [\n        {\n          id: 'actions',\n          Cell: ({ row }) => (\n            <ActionCell\n              row={row.original}\n              openDetail={toggleDetail}\n              openDebug={toggleAuction}\n              allowViewAuction={allowViewAuction}\n              sale={salesOverlay[row.original.auction_id]}\n              allowRequestReturn={allowRequestReturn}\n              onRequestReturn={setReturnModalSale}\n            />\n          ),\n          maxWidth: 100,\n        },\n        // Return Status is NOT in the column picker. The picker's selections\n        // become Looker `fields`, and this value doesn't come from Looker --\n        // it comes from the /sales overlay. Routing it through the picker\n        // would send an unknown field to the report query.\n        //\n        // Gated on the same permission as the overlay itself: without\n        // sales.view there is no overlay to read, so the column would be\n        // empty for every row rather than merely unpopulated.\n        ...(allowViewSales ? [{\n          id: 'return_status',\n          Header: 'Return Status',\n          disableSortBy: true,\n          Cell: ({ row }) => (\n            <ReturnStatusBadge sale={salesOverlay[row.original.auction_id]} />\n          ),\n          minWidth: 130,\n          maxWidth: 150,\n        }] : []),\n        ...rpt.columns,\n      ];\n\n      setReport(rpt);\n    } else {\n      notify(`Unable to load leads: ${Reporting.error.name}`, 'error');\n    }\n    setLoading(false);\n  };\n\n  const _loadCSV = async () => {\n    const apiFilters = convertFilterParams(filters, null);\n\n    const response = await Reporting.getLeads({\n      ...apiFilters,\n    }, 'csv');\n\n    return response;\n  };\n\n  const toggleDetail = (id) => setDetailId(id);\n\n  const { data = [], columns = [] } = report;\n\n  return (\n\n    <>\n      <DocTitle pageTitle=\"Leads\" />\n\n      <FilterBar>\n        <ProspectFilters\n          filters={filters}\n          api={Reporting}\n          onLoadFilters={()=>setFiltersLoaded(true)}\n          onChange={setFilters}\n          onExecute={loadLeads}\n          onClear={handleClearFilters}\n          userTimezone={userTimezone}\n          reportLoading={loading}\n          prospectType=\"leads\"\n        />\n      </FilterBar>\n\n      <PageSection title=\"Leads\" className=\"overflow-section\">\n\n        <div className=\"d-flex mb-2\">\n          <CallColumnSelect choices={columnChoices} onUpdate={handleUpdateColumns} onApply={loadLeads} selectedCols={filters.fields} disabled={loading || data.length === 0} />\n          {/* TEMP DISABLE <DownloadFileLink downloadSource={_loadCSV} label=\"Download CSV\" defaultFilename={_csvDefaultName} disabled={loading || data.length === 0} />*/}\n        </div>\n\n        <PagedTable\n          data={data}\n          columns={columns}\n          initialState={initialTableState}\n          className=\"reports-table striped\"\n          loading={loading}\n          pageCount={pageCount}\n          totalRows={totalRows}\n          {...controls}\n          noDataMessage=\"No leads were found\"\n        />\n\n      </PageSection>\n\n      <ProspectDetailModal\n        callId={detailId}\n        loadDetail={loadDetail}\n        isOpen={!!detailId}\n        cancel={() => toggleDetail(null)}\n        product=\"leads\"\n        autoPlayId={0}\n        salesByAuction={salesByAuction}\n        allowRequestReturn={allowRequestReturn}\n        onRequestReturn={setReturnModalSale}\n      />\n\n      <AuctionModal\n        auctionId={auctionId}\n        isOpen={!!auctionId}\n        cancel={() => toggleAuction(null)}\n      />\n\n      <RequestReturnModal\n        isOpen={!!returnModalSale}\n        accountId={returnModalSale?.account_id}\n        saleId={returnModalSale?.sale_id}\n        product=\"leads\"\n        onCancel={() => setReturnModalSale(null)}\n        onRequested={() => {\n          setReturnModalSale(null);\n          loadLeads();\n        }}\n      />\n\n    </>\n  );\n};\n\nconst ActionCell = React.memo(({\n  row, openDetail, openDebug, allowViewAuction, sale, allowRequestReturn, onRequestReturn,\n}) => {\n  return (\n    <div className=\"row-actions\">\n\n      <Button color=\"link\" className=\"p-0\" title=\"Lead Detail\" onClick={() => openDetail(row.lead_id)}>\n        <FaIcon icon=\"id-card\" />\n      </Button>\n\n      {allowViewAuction && (\n      <Button color=\"link\" className=\"p-0\" title=\"Auction/Delivery Debug\" onClick={() => openDebug(row.auction_id)}>\n        <FaIcon icon=\"comment-dollar\" />\n      </Button>\n      )}\n\n      <ReturnActionButton sale={sale} allowRequestReturn={allowRequestReturn} onRequestReturn={onRequestReturn} />\n    </div>\n  );\n});\nActionCell.displayName = 'ActionCell';\n\nexport default Leads;\n","import React, {useState, useEffect, useRef, useContext} from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams, useNavigate, Link } from 'react-router-dom';\nimport { Input, Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport DocTitle from '../../../Layout/DocTitle';\nimport PageSection from '../../../Layout/PageSection';\nimport Auction from './index';\nimport './styles.scss';\nimport { AppContext } from '../../../Providers/AppProvider';\n\n/*\n * Page view of Auction detail (as opposed to modal view)\n * Wrapped in page section. Gets auction id from route.\n * Has Change Auction functionality.\n */\nconst Page = () => {\n  const app = useContext(AppContext);\n  const userTimezone = app.user.timezone;\n  const navigate = useNavigate();\n  const { auction_id } = useParams();\n  const auctionIdRef = useRef();\n\n\n  const keyHandler = (event) => {\n    if (event.key === 'Enter') {\n      handleGo();\n    }\n  };\n\n  // Focus input on mount (if no auction_id)\n  useEffect(() => {\n    if (!auction_id && auctionIdRef.current) {\n      auctionIdRef.current.select();\n    }\n  }, []);\n\n  const handleGo = () => {\n    if (auctionIdRef.current.value) {\n      navigate(`/reports/auction/${auctionIdRef.current.value}`);\n    }\n  };\n\n  return (\n    <div className=\"auction-page\">\n      <DocTitle pageTitle=\"Auction Detail\" />\n      <PageSection\n        title=\"Auction\"\n        subtitle={<EditableAuctionId auctionId={auction_id} />}\n      >\n\n        {/* Show auction if auction id, else id input */}\n        {auction_id ? (\n          <Auction auction_id={auction_id} timezone={userTimezone} useQueryString />\n        ) : (\n\n          <div className=\"mt-5 d-flex\">\n            <div className=\"flex-fill\">\n              <Input\n                type=\"text\"\n                defaultValue=\"\"\n                placeholder=\"Auction ID\"\n                bsSize=\"sm\"\n                innerRef={auctionIdRef}\n                onKeyDown={keyHandler}\n              />\n            </div>\n\n            <Button className=\"ms-2\" size=\"lg\" color=\"primary\" onClick={handleGo}>Go</Button>\n          </div>\n\n        )}\n\n      </PageSection>\n    </div>\n  );\n};\n\n/*\n * Display of auction ID for page subtitle, toggles to input so you can change the auction id\n */\nconst EditableAuctionId = ({ auctionId }) => {\n  const [inputMode, setInputMode] = useState(false);\n  const inputRef = useRef();\n  const navigate = useNavigate();\n\n  const handleGo = () => {\n    if (inputRef.current.value) {\n      navigate(`/reports/auction/${inputRef.current.value}`);\n      setInputMode(false);\n      inputRef.current.value = '';\n    }\n  };\n\n  const handleCancel = () => setInputMode(false);\n  const handleInputMode = () => setInputMode(true);\n\n  if (!auctionId) return (null);\n\n  return inputMode ? (\n         <div className=\"d-inline-flex\">\n           <Input type=\"text\" bsSize=\"sm\" defaultValue=\"\" placeholder=\"Auction ID\" innerRef={inputRef} style={{ width: '300px' }} />\n           <Button\n             size=\"sm\"\n             className=\"ms-1 teeny\"\n             onClick={handleGo}\n             color=\"primary\"\n           >\n             <FaIcon icon=\"check\" size=\"sm\" />\n           </Button>\n           <Button size=\"sm\" className=\"ms-1 teeny\" color=\"link\" outline onClick={handleCancel} title=\"Change auction\">\n             <FaIcon icon=\"times\" size=\"sm\" />\n           </Button>\n         </div>\n       ) : (\n         <span className=\"modal-subheader\">\n           {auctionId}\n           <Button\n             color=\"link\"\n             size=\"sm\"\n             className=\"ms-2 inline\"\n             onClick={handleInputMode}\n             title=\"Change Auction ID\"\n           >\n             <FaIcon icon=\"pencil-alt\" size=\"sm\" />\n           </Button>\n         </span>\n       );\n};\n\nEditableAuctionId.propTypes = {\n  auctionId: PropTypes.string,\n};\n\nexport default Page;\n","import React from 'react';\nimport {Navigate, Routes, Route} from \"react-router-dom\";\nimport AdvertiserReport from './AdvertiserReport';\n//import PublisherReport from './PublisherReport';\nimport Calls from './Calls';\nimport Leads from './Leads';\nimport ProtectedRoute from '../../Components/ProtectedRoute';\nimport Page from './../Auctions/Details/Page';\n\n// Routes are releative to '/reports'\nconst Landing = () => (\n    <Routes>\n      <Route path=\"advertiser\" element={<ProtectedRoute permission=\"advertiser_reports.view\"/>}>\n        <Route index element={<AdvertiserReport/>}/>\n      </Route>\n\n      {/*  MRK-8107 hide publisher report\n    <Route path=\"publisher\" element={<ProtectedRoute permission=\"publisher_reports.view\" /> } >\n      <Route element={<PublisherReport />} />\n    </Route>*/}\n\n      <Route path=\"calls\" element={<ProtectedRoute permission=\"calls.view\"/>}>\n        <Route index element={<Calls/>}/>\n      </Route>\n\n      <Route path=\"leads\" element={<ProtectedRoute permission=\"leads.view\"/>}>\n        <Route index element={<Leads/>}/>\n      </Route>\n\n      <Route path=\"auction\" element={<ProtectedRoute permission=\"auctions.view\"/>}>\n        <Route index element={<Page/>}/>\n      </Route>\n\n      <Route path=\"auction/:auction_id\" element={<ProtectedRoute permission=\"auctions.view\"/>}>\n        <Route index element={<Page/>}/>\n      </Route>\n\n\n      <Route element={() => <Navigate to=\"/accounts\"/>}/>\n    </Routes>\n  );\n\nexport default Landing;\n","const payloads = [\n  {\n    label: 'Minimal',\n    payload: {\n      data: {\n        zipcode: '92109',\n        ip_address: '127.0.0.1',\n        user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',\n        source_url: 'www.acme.com/signup',\n      },\n    },\n  },\n  // {\n  //     label: \"Medium\",\n  //     payload: {\n  //         source_token: sourceToken,\n  //         visitor: {\n  //             ip_address: \"127.0.0.1\",\n  //             user_agent: \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36\",\n  //         },\n  //         data: {\n  //             zip: \"92109\",\n  //             currently_insured: true,\n  //             drivers: [\n  //                 {\n  //                     birth_date: \"1980-02-22\",\n  //                 },\n  //             ],\n  //             vehicles: [\n  //                 {\n  //                     \"annual_mileage\": 25000,\n  //                 },\n  //             ],\n  //         },\n  //         \"extras\": {\n  //             \"url\": \"www.acme.com\",\n  //         },\n  //     },\n  // },\n  {\n    label: 'LM - Regular',\n    payload: {\n      data: {\n        zipcode: '71601',\n        ip_address: '127.0.0.1',\n        user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',\n        currently_insured: true,\n        drivers: [\n          {\n            birth_date: '1980-02-22',\n          },\n        ],\n        vehicles: [\n          {\n            annual_mileage: 25000,\n          },\n        ],\n        source_url: 'www.acme.com/signup',\n      },\n    },\n  },\n  {\n    label: 'LM - High LTV',\n    payload: {\n      data: {\n        zipcode: '71601',\n        ip_address: '127.0.0.1',\n        user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',\n        currently_insured: true,\n        drivers: [\n          {\n            birth_date: '1980-02-22',\n          },\n        ],\n        vehicles: [\n          {\n            annual_mileage: 25000,\n          },\n          {\n            annual_mileage: 25000,\n          },\n        ],\n        home_ownership: true,\n        source_url: 'www.acme.com/signup',\n      },\n    },\n  },\n  {\n    label: 'Complete',\n    payload: {\n      data: {\n        ip_address: '127.0.0.1',\n        user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36',\n        address: '120 Jenkins Rd',\n        address_2: 'Apt 12',\n        bi_per_incident: 100000,\n        bi_per_person: 50000,\n        contact: 'James S. Silverman',\n        continuous_coverage: 121,\n        coverage_type: 'Standard Protection',\n        current_company: 'Progressive',\n        current_customer: 48,\n        current_policy_expires: 2,\n        currently_insured: 1,\n        drivers: [\n          {\n            bankruptcy: 0,\n            birth_date: '1968-09-12',\n            credit_rating: 'Good',\n            education: 'Associate',\n            first_licensed: 17,\n            gender: 'M',\n            license_state: 'GA',\n            license_status: 'Active',\n            marital_status: 'Married',\n            occupation: 'Other Technical',\n            primary_vehicle: 0,\n            relationship: 'self',\n            sr_22: 0,\n          },\n        ],\n        email: 'silverman@mediaalpha.com',\n        home_length: 121,\n        home_ownership: 1,\n        incidents: [\n          {\n            description: 'More than 10 MPH over',\n            driver: 0,\n            incident_date: '06/2012',\n            type: 'ticket',\n          },\n        ],\n        phone: '2299429943',\n        vehicles: [\n          {\n            alarm: 1,\n            annual_mileage: 25000,\n            auto_warranty: 1,\n            average_mileage: 10,\n            collision: 500,\n            commute_days_per_week: 1,\n            comprehensive: 500,\n            current_mileage: 40000,\n            make: 'HONDA',\n            model: 'CIVIC SI',\n            ownership: 'finance',\n            primary_purpose: 'Commute Work',\n            submodel: 'SEDAN 4 DOOR',\n            vin: 'SHHFC1E50HH000000',\n            year: 2017,\n          },\n        ],\n        zipcode: '90210',\n        source_url: 'www.acme.com/signup',\n      },\n    },\n  },\n];\n\nconst stateZips = {\n  AA: '34002',\n  AE: '09002',\n  AK: '99501',\n  AL: '35004',\n  AP: '96201',\n  AR: '71601',\n  AS: '96799',\n  AZ: '85001',\n  CA: '90001',\n  CO: '80001',\n  CT: '06001',\n  DC: '20001',\n  DE: '19701',\n  FL: '32003',\n  FM: '96941',\n  GA: '30002',\n  GU: '96910',\n  HI: '96701',\n  IA: '50001',\n  ID: '83201',\n  IL: '60001',\n  IN: '46001',\n  KS: '66002',\n  KY: '40003',\n  LA: '70001',\n  MA: '01001',\n  MD: '20588',\n  ME: '03901',\n  MH: '96960',\n  MI: '48001',\n  MN: '55001',\n  MO: '63005',\n  MP: '96950',\n  MS: '38601',\n  MT: '59001',\n  NC: '27006',\n  ND: '58001',\n  NE: '68001',\n  NH: '03031',\n  NJ: '07001',\n  NM: '87001',\n  NV: '88901',\n  NY: '00501',\n  OH: '43001',\n  OK: '73001',\n  OR: '97001',\n  PA: '15001',\n  PR: '00601',\n  PW: '96939',\n  RI: '02801',\n  SC: '29001',\n  SD: '57001',\n  TN: '37010',\n  TX: '73301',\n  UT: '84001',\n  VA: '20101',\n  VI: '00801',\n  VT: '05001',\n  WA: '98001',\n  WI: '53001',\n  WV: '24701',\n  WY: '82001',\n}\n\nconst userAgents = {\n  mobile: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)',\n  desktop: 'Mozilla/5.0 (X11; Linux) AppleWebKit/538.15 (KHTML, like Gecko) Chrome/18.0.1025.133 Safari/538.15 Midori/0.5',\n}\n\nexport {payloads, stateZips, userAgents}\n","import React, {\n  useState, useEffect, useContext, useRef,\n} from 'react';\nimport {\n  TabContent, TabPane, Nav, FormGroup, FormText, Input, Label, Card, Button, Row, Col, Spinner, InputGroup,\n} from 'reactstrap';\nimport PageSection from '../../../Layout/PageSection';\nimport DocTitle from '../../../Layout/DocTitle';\nimport AdDisplay from '../../AdManager/AdDisplay';\nimport {JsonEditorLoadable, notify} from \"@thedmsgroup/mastodon-ui-components\";\nimport useQueryState from \"../../../Hooks/useQueryState\";\nimport Select from \"../../../Components/Form/SimpleSelect\";\nimport './MatchChecker.scss';\nimport { FormTabFlat } from '../../../Components/Form/FormCommon';\nimport AuctionModal from '../../Auctions/Details/Modal';\nimport useApi from '../../../Hooks/useApi';\nimport { ProductChoices, StateChoices } from '../../../Components/Table/FilterChoices';\nimport {payloads, stateZips, userAgents} from './samples';\nimport { AppContext } from '../../../Providers/AppProvider';\nimport {SourceOptionLabel} from \"../../../Components/Form/Select/SourceOptionLabel\";\n\nconst RequestForm = (props) => {\n  const [payload, setPayload] = useState(\n    typeof props.payload === 'object' ? JSON.stringify(props.payload, null, 2) : (props.payload ?? \"\")\n  );\n  const jsonEditorRef = useRef();\n  const { api } = useApi();\n  const [auctionId, setAuctionId] = useState(props.initialAuctionId ?? \"\");\n  const [loadingAuction, setLoadingAuction] = useState(false);\n\n  const onSubmit = () => props.onSubmit && props.onSubmit(payload);\n\n  /* Load an existing auction and populate the payload with its originally\n   * submitted lead data (the 'source' scope) plus its source token. */\n  const loadAuction = async (id) => {\n    const trimmed = String(id ?? \"\").trim();\n    if (!trimmed) return;\n\n    setLoadingAuction(true);\n    const res = await api.endpoints.debug.auctions(trimmed);\n    setLoadingAuction(false);\n\n    if (!res || !res.auction || Array.isArray(res.auction)) {\n      notify(`Unable to load auction ${trimmed}`, \"error\");\n      return;\n    }\n\n    const blocks = Array.isArray(res.auction.lead) ? res.auction.lead : [];\n    const sourceBlocks = blocks.filter((b) => b.scope === \"source\");\n    const usedBlocks = sourceBlocks.length ? sourceBlocks : blocks;\n    const data = Object.assign({}, ...usedBlocks.map((b) => b.data ?? {}));\n\n    if (!sourceBlocks.length && blocks.length) {\n      notify(\"No 'source' scope on this auction; loaded all available lead data.\", \"warning\");\n    }\n\n    // Source token may live on the auction record or inside the lead data.\n    const sourceToken = res.auction.source_token?.token\n      ?? (typeof res.auction.source_token === \"string\" ? res.auction.source_token : null)\n      ?? res.auction.source?.token\n      ?? data.source_token\n      ?? null;\n    delete data.source_token;\n\n    const nextPayload = {\n      ...(sourceToken ? { source_token: sourceToken } : {}),\n      data,\n    };\n\n    setPayload(JSON.stringify(nextPayload, null, 2));\n    notify(`Loaded auction ${trimmed}`, \"success\");\n  };\n\n  // Auto-load when the tool is opened with an ?auction=<id> query param.\n  useEffect(() => {\n    if (props.initialAuctionId) {\n      loadAuction(props.initialAuctionId);\n    }\n  }, []);\n\n  const onSelectSample = (e) => {\n    const sample = payloads.find((p) => p.label === e.target.value)?.payload;\n\n    if (sample) {\n      //setPayload(JSON.stringify(Object.assign({}, payload, sample), null, 2))\n      const objPayload = JSON.parse(payload);\n      setPayload(JSON.stringify({...objPayload, ...sample}, null, 2))\n    } else {\n      setPayload(\"{}\")\n    }\n  };\n\n  const onJsonChange = (val) => {\n    setPayload(val);\n  };\n\n\n  const handleSourceSelection = source => {\n\n    setPayload(JSON.stringify(\n      Object.assign({}, JSON.parse(payload), {source_token: source?.token}),\n      null,\n      2\n      )\n    )\n  }\n\n\n  const handleStateSelection = e => {\n    const zipcode = stateZips[e.target.value]\n    setPayload(\n      JSON.stringify(\n        mergeData(JSON.parse(payload), {zipcode}),\n        null,\n        2\n      )\n    );\n\n  }\n\n  const handleDeviceSelection = e => {\n    const ua = userAgents[e.target.value]\n    setPayload(\n      JSON.stringify(\n        mergeData(JSON.parse(payload), {user_agent: ua}),\n        null,\n        2\n      )\n    )\n  }\n\n  return (\n    <div>\n\n      <Card body className=\"mb-3\">\n        <FormGroup className=\"mb-0\">\n          <Label>Load from Auction</Label>\n          <FormText className=\"d-block mb-2\">\n            Enter an auction ID to populate the form with its originally submitted lead data.\n          </FormText>\n          <InputGroup>\n            <Input\n              placeholder=\"Auction ID\"\n              value={auctionId}\n              onChange={(e) => setAuctionId(e.target.value)}\n              onKeyDown={(e) => { if (e.key === 'Enter') loadAuction(auctionId); }}\n            />\n            <Button\n              color=\"secondary\"\n              onClick={() => loadAuction(auctionId)}\n              disabled={loadingAuction || !auctionId.trim()}\n            >\n              {loadingAuction && <Spinner size=\"sm\" className=\"me-2\" />}\n              Load\n            </Button>\n          </InputGroup>\n        </FormGroup>\n      </Card>\n\n      <SourceSelector onSelect={handleSourceSelection}  />\n\n      <div className=\"d-flex\">\n        <FormGroup className=\"flex-fill me-1\">\n          <Label>Lead Preset</Label>\n          <Input type=\"select\" onChange={onSelectSample} defaultValue=\"Minimal\">\n            <option value=\"\">--</option>\n            {payloads.map((sample) => <option key={sample.label} value={sample.label}>{sample.label}</option>)}\n          </Input>\n        </FormGroup>\n        <FormGroup className=\"flex-fill me-1\">\n          <Label>State</Label>\n          <Input type=\"select\" onChange={handleStateSelection}>\n            <option value=\"\">--</option>\n            {StateChoices.map((state) => <option key={state.label} value={state.value}>{state.label}</option>)}\n          </Input>\n        </FormGroup>\n        <FormGroup className=\"flex-fill\">\n          <Label>Device Type</Label>\n          <Input type=\"select\" onChange={handleDeviceSelection}>\n            <option value=\"\">--</option>\n            {Object.keys(userAgents).map(deviceType => <option key={deviceType} value={deviceType}>{deviceType}</option>)}\n          </Input>\n        </FormGroup>\n      </div>\n\n      <div style={{ height: '100%' }}>\n        <JsonEditorLoadable\n          mode=\"code\"\n          ref={jsonEditorRef}\n          code={payload}\n          onChange={onJsonChange}\n          htmlElementProps={{\n            style: {\n              minHeight: '500px',\n            },\n          }}\n        />\n      </div>\n      <div className=\"d-flex justify-content-end\">\n        <SubmitButton\n          className=\"mt-3\"\n          submitting={props.submitting}\n          color=\"primary\"\n          onClick={onSubmit}\n        >\n          Submit\n        </SubmitButton>\n      </div>\n\n    </div>\n  );\n};\n\nconst mergeData = (original, newData) => {\n  const origData = original.data ?? {}\n  return {...original, data: {...origData, ...newData}}\n}\n\n/* Source picker and a collection of filters that limit source options */\nconst SourceSelector = ({onSelect}) => {\n\n  const { api } = useApi();\n  const [loading, setLoading] = useState(false)\n  const [sources, setSources] = useState([])\n  const [vendors, setVendors] = useState([])\n  const [verticals, setVerticals] = useState([])\n  const [filters, setFilters] = useState({})\n  const [selectedSource, setSelectedSource] = useState(null)\n\n  const onSelectProduct = product => setFilters({...filters, product})\n  const onSelectVertical = vertical_id => setFilters({...filters, vertical:vertical_id})\n  const onSelectVendor = vendor_id => setFilters({ ...filters, vendor:vendor_id})\n\n  const loadOptions = async () => {\n    loadSources(filters)\n\n    const vendors = await api.endpoints.vendors.list({limit:0})\n    if (vendors) {\n      setVendors(vendors.data.map(v=>({value:v.id, label:v.name})))\n    }\n    const verticals = await api.endpoints.verticals.list()\n    if (verticals) {\n      setVerticals(verticals.map(v=>({value:v.id, label:v.display_name})))\n    }\n    // else notify error\n  }\n\n  const loadSources = async (filters) => {\n    setLoading(true)\n\n    const sources = await api.endpoints.sources.list({...filters, limit: 1000})\n    if (sources?.data) {\n      //setSources(sources.data)\n\n      setSources(sources.data.map((s) => {\n        return {\n          id:s.id,\n          value:s.id,\n          label:s.name,\n          status:s.status,\n          token:s.token,\n          vertical: s.vertical,\n          product: s.product\n        };\n      }))\n    }\n\n    setLoading(false)\n    // if no sources, set selected source to nothing\n  }\n\n  const handleSelectSource = (sourceId) => {\n    setSelectedSource(sourceId)\n    const source = sources.find(s=>s.id.toString() === sourceId.toString())\n    if (source && onSelect) {\n\n      onSelect(source);\n    }\n  }\n\n  useEffect(() => {\n    loadSources(filters)\n  }, [filters])\n\n  useEffect(() => {\n    loadOptions()\n  }, [])\n\n  return <div>\n    <Row >\n      <Col sm={12} md={5}>\n        <FormGroup className=\"flex-fill me-1\">\n          <Label>Vendor</Label>\n\n          <Select\n            isClearable\n            isSearchable\n            onChange={onSelectVendor}\n            options={vendors}\n            value={filters.vendor}\n            tabSelectsValue\n            backspaceRemovesValue\n            isMulti={false}\n            controlShouldRenderValue\n            hideSelectedOptions\n            closeMenuOnSelect\n            placeholder=\"Select Vendor\"\n            invalid={false}\n          />\n\n        </FormGroup>\n      </Col>\n\n      <Col sm={12} md={4}>\n        <FormGroup className=\"flex-fill me-1\">\n          <Label>Vertical</Label>\n\n          <Select\n            isClearable\n            isSearchable\n            onChange={onSelectVertical}\n            options={verticals}\n            value={filters.vertical}\n            tabSelectsValue\n            backspaceRemovesValue\n            isMulti={false}\n            controlShouldRenderValue\n            hideSelectedOptions\n            closeMenuOnSelect\n            placeholder=\"Select Vertical\"\n            invalid={false}\n          />\n        </FormGroup>\n      </Col>\n\n\n      <Col sm={12} md={3}>\n        <FormGroup className=\"flex-fill\">\n          <Label>Product</Label>\n          <InputGroup>\n            <Input\n              type=\"select\"\n              onChange={e => onSelectProduct(e.target.value)}\n              value={filters.product}\n            >\n              <option value=\"\">Select Product</option>\n              {ProductChoices.map((obj, i) => <option value={obj.value} key={i}>{obj.label}</option>)}\n            </Input>\n          </InputGroup>\n        </FormGroup>\n      </Col>\n\n    </Row>\n\n    <Row>\n      <Col md={12} lg={9} >\n          <FormGroup>\n            <Label>Source</Label>\n            <FormText className=\"d-block\">Select a source to add a source token to the payload.</FormText>\n\n              <Select\n                isClearable={false}\n                isSearchable\n                onChange={handleSelectSource}\n                options={sources}\n                value={selectedSource}\n                tabSelectsValue\n                backspaceRemovesValue\n                isMulti={false}\n                controlShouldRenderValue\n                hideSelectedOptions\n                closeMenuOnSelect\n                placeholder=\"Select Source (type to search)\"\n                invalid={false}\n                formatOptionLabel={SourceOptionLabel}\n                isLoading={loading}\n              />\n\n          </FormGroup>\n\n      </Col>\n    </Row>\n\n\n  </div>\n}\n\nconst AdResult = ({ ad }) => {\n  // todo AdDisplay standardize parameters?\n  return (\n    <div>\n      <AdDisplay {...ad} image={{ url: ad.image_url }} url_display={ad.display_url} />\n      <div className=\"mt-3\">\n        <SubmitButton className=\"me-2\" size=\"sm\" target=\"_blank\" to={ad.click_url}>Click</SubmitButton>\n      </div>\n      <hr />\n    </div>\n  );\n};\n\nconst ResponseDetails = ({ data: {auction_id, bids} }) => {\n  const [isOpen, setIsOpen] = useState(false)\n\n  return <div>\n\n    <AuctionModal\n      auctionId={auction_id}\n      isOpen={isOpen}\n      cancel={() => setIsOpen(false)}\n    />\n\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">\n        Auction <Button color=\"link\" onClick={() => setIsOpen(true)} className=\"auction-detail-link p-0\">{auction_id}</Button>\n      </div>\n    </div>\n\n    {bids.length > 0\n      ? <div>\n        {bids.map((ad) => <AdResult key={ad.position} ad={ad} />)}\n      </div>\n      : <div>No results.</div>\n    }\n  </div>\n}\n\nconst Results = ({response}) => {\n  const [activeTab, setActiveTab] = useState('results');\n  const jsonViewRef = useRef();\n\n  const toggleTab = (tab) => setActiveTab(tab);\n\n  useEffect(\n    () => {\n      const editor = jsonViewRef && jsonViewRef.current && jsonViewRef.current.jsonEditor;\n      if (editor && response) {\n        editor.update(response);\n        editor.expandAll();\n      }\n    },\n    [response],\n  );\n\n  return (\n    <div>\n\n      <Nav className=\"mastodon-tabs mb-3\">\n\n        <FormTabFlat\n          id=\"results\"\n          label=\"Results\"\n          activeTab={activeTab}\n          setActive={toggleTab}\n        />\n        <FormTabFlat\n          id=\"raw\"\n          label=\"Raw Response (Advanced)\"\n          activeTab={activeTab}\n          setActive={toggleTab}\n        />\n      </Nav>\n\n      <TabContent activeTab={activeTab}>\n        <TabPane tabId=\"results\">\n          <Card body>\n            {response\n              ? <ResponseDetails data={response} />\n              : <div>Submit lead form to review response.</div>}\n          </Card>\n        </TabPane>\n        <TabPane tabId=\"raw\">\n          <Card>\n\n            <JsonEditorLoadable\n              mode=\"view\"\n              value={response}\n              ref={jsonViewRef}\n            />\n\n          </Card>\n        </TabPane>\n      </TabContent>\n    </div>\n  );\n};\n\nconst MatchChecker = () => {\n  const [submitting, setSubmitting] = useState(false);\n  const [response, setResponse] = useState(null);\n  // Supports deep-linking with ?auction=<id> to auto-load an existing auction.\n  const [query,] = useQueryState({source:null, auction:\"\"});\n  const app = useContext(AppContext);\n  const api = app.getApi('matching')\n\n  const submitPayload = async (payload) => {\n    // The JSON editor hands us a string; send a parsed object so axios sets\n    // Content-Type: application/json instead of defaulting to form-urlencoded.\n    let parsed;\n    try {\n      parsed = JSON.parse(payload);\n    } catch (e) {\n      notify('Payload is not valid JSON.', 'error');\n      return;\n    }\n\n    setSubmitting(true);\n\n    const res = await api.runPing(parsed);\n    if (res) {\n      console.log(res)\n      setResponse(res);\n    }\n\n    setSubmitting(false);\n  };\n\n  return (\n    <div>\n      <DocTitle pageTitle=\"Match Checker\" />\n\n      <div>\n        <Row>\n          <Col md={12} lg={6}>\n            <PageSection title=\"Match Tool\">\n              <RequestForm submitting={submitting} onSubmit={submitPayload} payload={payloads[0].payload} initialAuctionId={query.auction} />\n            </PageSection>\n          </Col>\n          <Col md={12} lg={6}>\n            <PageSection>\n              <Results response={response} />\n            </PageSection>\n          </Col>\n        </Row>\n      </div>\n    </div>\n  );\n};\n\nconst SubmitButton = (props) => {\n  props = { ...props, disabled: props.submitting };\n  return (\n    <Button {...props}>\n      {props.submitting && <Spinner color=\"light\" size=\"sm\" className=\"me-2\" />}\n      {props.children}\n    </Button>\n  );\n};\n\nexport default MatchChecker;\n","import React, { useMemo } from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Button } from 'reactstrap';\nimport {ChangeHistoryButton} from '../../../../Providers/ChangeProvider';\nimport PropTypes from 'prop-types';\nimport FlexTable from '../../../../Components/Table/FlexTable';\nimport { titleCaseWord } from '../../../../utils/string';\nimport useTableGlobalFuzzyFilter from '../../../../Hooks/useTableGlobalFuzzyFilter';\nimport { DateFormatter, AnyCell } from '../../../../Components/Table/Table';\n\nconst AttributesTable = ({ data, onSelect, allowEdit, loading }) => {\n  const globalFilterType = useTableGlobalFuzzyFilter(['original.name', 'original.alias']);\n\n  const initialTableState = useMemo(() => ({\n    gridLayout: { columnWidths: ['auto', 'auto', 'auto', 'auto', 'auto', 'auto', 'auto', 'auto'] },\n    sortBy: [{ id: 'name', desc: false }],\n  }), []);\n\n  const columns = useMemo(\n    () => [\n      {\n        Header: 'Name',\n        accessor: 'name',\n      },\n      {\n        Header: 'Alias',\n        accessor: 'alias',\n      },\n      {\n        Header: 'Vertical',\n        //Because the filters work by vertical.id, we have to match up this column id to vertical.id,\n        //instead of using accessor\n        //accessor: 'vertical.display_name',\n        id: 'vertical.id',\n        disableGlobalFilter: true,\n        Cell: ({row}) => row.original.vertical ? row.original.vertical.display_name : <AnyCell />,\n        filter: (rows, colIds, filter) => {\n          if (filter.length) {\n            // vertical may be null!\n            return rows.filter((r) => filter.includes(r.original.vertical?.id ? r.original.vertical.id.toString() : \"\"  ));\n          }\n          return rows;\n        },\n      },\n      {\n        Header: 'Product',\n        accessor: 'product',\n        disableGlobalFilter: true,\n        Cell: (c) => c.value ? titleCaseWord(c.value) : <AnyCell />,\n        defaultCanSort: true,\n      },\n      {\n        Header: 'Input Type',\n        accessor: 'input_type',\n        disableGlobalFilter: true,\n        Cell: ({ value }) => titleCaseWord(value),\n        defaultCanSort: true,\n      },\n      {\n        Header: 'Group',\n        accessor: 'group.name',\n        disableGlobalFilter: true,\n        filter: (rows, colIds, filter) => {\n          if (filter.length) {\n            return rows.filter((r) => filter.includes(r.original.group.id));\n          }\n          return rows;\n        },\n      },\n      {\n        Header: 'Modified',\n        id: 'modified_at',\n        accessor: 'modified_at',\n        defaultCanSort: true,\n        maxWidth: 200,\n        Cell: ({ value }) => <DateFormatter value={value} format=\"yyyy-MM-d h:mm a\" />,\n      },\n      {\n        maxWidth: 50,\n        id: 'actions',\n        disableGlobalFilter: true,\n        disableSortBy: true,\n        Cell: ({ row }) => <ActionCell\n          attribute={row.original}\n          allowEdit={allowEdit}\n          onEditClick={onSelect}\n        />,\n      },\n    ],\n    [],\n  );\n\n  return (\n    <FlexTable\n      columns={columns}\n      initialState={initialTableState}\n      className=\"users-table striped\"\n      data={data}\n      loading={loading}\n      noDataMessage=\"No attributes were found\"\n      filterTypes={globalFilterType}\n      globalFilter=\"globalType\"\n    />\n  );\n};\n\nconst ActionCell = ({ attribute, allowEdit, onEditClick }) => (\n  <div className=\"list-actions\">\n    {allowEdit && (\n      <Button color=\"link\" className=\"action-item inline\" title=\"Edit\" onClick={() => onEditClick(attribute)}>\n        <FaIcon icon=\"pencil-alt\" size=\"1x\" />\n      </Button>\n    )}\n    <ChangeHistoryButton id={attribute.id} name={attribute.name} type=\"attribute\" />\n  </div>\n);\n\nAttributesTable.propTypes = {\n  data: PropTypes.array,\n  allowEdit: PropTypes.bool,\n  loading: PropTypes.bool,\n  handleEditClick: PropTypes.func,\n};\n\nexport default AttributesTable;\n","import React, { useState, useContext, useEffect } from 'react';\nimport classnames from 'classnames';\nimport { LiveFilteringContext } from '../../../../Providers/LiveFilteringProvider';\nimport { Filter, TextSearch } from '../../../../Components/Table/Filter';\nimport { ProductChoices } from '../../../../Components/Table/FilterChoices';\nimport RightDateAndControls from '../../../../Components/Table/RightDateAndControls';\nimport useApiBatch from '../../../../Hooks/useApiBatch';\n\nconst Filters = ({ loading, onRefresh }) => {\n  const [choices, setChoices] = useState({});\n  // const{api} = useApi();\n  const {\n    filters,\n    updateFilter,\n    globalFilter,\n    updateGlobalFilter,\n    resetFilter,\n    resetFilters,\n  } = useContext(LiveFilteringContext);\n\n  const batcher = useApiBatch();\n\n  // load choices\n  useEffect(() => {\n    const getChoices = async () => {\n      const batches = await batcher.fetch([\n        { endpoint: 'verticals', action: 'list' },\n        { endpoint: 'attributes', action: 'groups' },\n      ]);\n      if (batches && batches.length) {\n        const [verticals, groups] = batches;\n        setChoices({\n          product: ProductChoices,\n          vertical: verticals.map((item) => ({ value: item.id, label: item.display_name })),\n          attributeGroups: groups.map((item) => ({ value: item.id, label: item.name })),\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n  return (\n\n    <div className=\"attribute-filters d-flex justify-content-between position-relative\">\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n\n      <div className=\"d-flex\">\n        <div className=\"boxed-filter search-filter me-3\">\n\n          <TextSearch\n            value={globalFilter || ''}\n            placeholder=\"Search by name / alias\"\n            onUpdate={updateGlobalFilter}\n            onClear={() => resetFilter('global')}\n            autofocus\n          />\n\n        </div>\n\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Vertical\"\n            param=\"vertical.id\"\n            options={choices.vertical}\n            value={filters['vertical.id'] || []}\n            onChange={updateFilter}\n            isMulti\n          />\n        </div>\n\n        <div>\n          <Filter\n            placeholder=\"Product\"\n            param=\"product\"\n            options={choices.product}\n            value={filters.product || []}\n            onChange={updateFilter}\n            isMulti\n          />\n        </div>\n\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Group\"\n            param=\"group.name\"\n            options={choices.attributeGroups}\n            value={filters['group.name'] || \"\"}\n            onChange={updateFilter}\n            isMulti={false}\n          />\n        </div>\n\n      </div>\n\n      <RightDateAndControls onRefresh={onRefresh} onReset={resetFilters} />\n\n    </div>\n  );\n};\n\nexport default Filters;\n","import React from 'react';\nimport {\n  FormFeedback, FormGroup, Input, FormText, InputGroup, Label, Row, Col,\n} from 'reactstrap';\nimport {HelpPopper}  from '@thedmsgroup/mastodon-ui-components';\n\nconst OptionTarget = ({\n  choices,\n  label,\n  errors,\n  onChange,\n}) =>\n  // Target has choices and label  (separate component?)\n  (\n    <div className=\"form-section\">\n      <div className=\"form-section-header\">\n        Target\n        <HelpPopper name=\"option-target\" title=\"Target\" iconClass=\"ms-2\">\n          An optional value that targets who or what the attribute applies to. For example, an attribute\n          {' '}\n          <i>drivers.license_status</i>\n          {' '}\n          might have a target &quot;Driver&quot;\n          with choices for &quot;Primary&quot;, &quot;All&quot;, or &quot;Any&quot;\n        </HelpPopper>\n      </div>\n      <p>Choices for refining the targeting. </p>\n      <Row className=\"option-target\">\n        <Col sm={4}>\n          <FormGroup className=\"flex-shrink-1\">\n            <Label for=\"method\">Target Label</Label>\n            <Input type=\"text\" bsSize=\"sm\" name=\"label\" value={label} onChange={onChange} />\n            <FormText>A short label to describe the target (example:&quot;Driver&quot;)</FormText>\n          </FormGroup>\n        </Col>\n\n        <Col sm={8}>\n          <FormGroup className=\"flex-shrink-1\">\n            <Label for=\"method\">Target Choices</Label>\n            <Input type=\"textarea\" name=\"choices\" rows={4} value={choices} onChange={onChange} />\n            <FormText>\n              Add 1 choice per line. Delimit values and labels with a colon (\n              <i>value:label</i>\n              )\n            </FormText>\n          </FormGroup>\n        </Col>\n\n      </Row>\n    </div>\n\n  );\n\nexport default OptionTarget;\n","export const StaticChoiceInputTypes = ['metro_choice', 'state_choice', 'choice', 'multiple_choice'];\nexport const DynamicChoiceInputTypes = ['dynamic_choice', 'dynamic_multiple_choice'];\n\nexport const DynamicSourceMap = {\n  account_id: 'Accounts', source_id: 'Sources', vendor_id: 'Vendors', vertical_id: 'Verticals',\n};\n","import React from 'react';\nimport {\n  FormFeedback, FormGroup, FormText, Input, Label,\n} from 'reactstrap';\nimport {HelpPopper}  from '@thedmsgroup/mastodon-ui-components';\nimport OptionTarget from './OptionTarget';\nimport { StaticChoiceInputTypes, DynamicChoiceInputTypes } from './constants';\nimport IconCheckbox from '../../../../Components/Form/IconCheckbox';\n\nconst Options = ({\n  inputType = '',\n  unknown_data_choice = true,\n  choices = '',\n  target,\n  min = '',\n  max = '',\n  label = '',\n  errors = {},\n  onChange,\n}) => {\n  const handleOnChange = (e) => {\n    const { name, value } = e.target;\n    updateParentForm(name, value);\n  };\n\n  const handleOnCheck = (name, checked) => {\n    updateParentForm(name, checked);\n  };\n\n  const handleOnChangeTarget = (e) => {\n    const { name, value } = e.target;\n    updateParentForm('target', { ...target, [name]: value });\n  };\n\n  const updateParentForm = (field, value) => {\n    const opt = {\n      unknown_data_choice,\n      choices,\n      target,\n      label,\n      min,\n      max,\n    };\n    onChange('options', { ...opt, [field]: value });\n  };\n\n  return (\n    <>\n      <div className=\"form-section attribute-options\">\n        <div className=\"form-section-header\">Options</div>\n\n        {/*\n          If unknown_data_choice is false, the field will not be shown  (assume rejected?)\n          if true (or not set), the field will be shown.\n          allows user to accept or reject unknown data.\n          Controls the 'accept_unknown' matchable field.\n          Example: call_center choices are [parrot, \"double positive\"] and you can accept or reject unknown data.\n\n          */}\n        <IconCheckbox\n          name=\"unknown_data_choice\"\n          value={!!unknown_data_choice}\n          onChange={handleOnCheck}\n          className=\"mt-3 mb-3\"\n        >\n          Unknown Data Choice\n          <HelpPopper name=\"unknown_data_choice\" title=\"Unknown Data Choice\" iconClass=\"ms-2\">\n            If checked, the user will be able to configure targeting to allow or disallow matching against unknown data.\n            If unchecked, this option will not be available when configuring targets, and unknown data will be accepted by default.\n          </HelpPopper>\n        </IconCheckbox>\n\n        <FormGroup className=\"flex-shrink-1\">\n          <Label for=\"method\">\n            Label\n            <HelpPopper name=\"label-option\" title=\"Label\" iconClass=\"ms-2\">\n              A hint for describing the required input. For example, with an integer input for number of accidents:\n              &quot;\n              <i>in the last 3 years</i>\n              &quot;. With zip code input: &quot;\n              <i>A comma-separated list of zip codes</i>\n              &quot;.\n            </HelpPopper>\n          </Label>\n          <Input type=\"text\" bsSize=\"sm\" name=\"label\" value={label} placeholder=\"Brief help text (optional)\" onChange={handleOnChange} />\n        </FormGroup>\n\n        {inputType === 'integer_range' && (\n        <div>\n          <div className=\"d-flex align-items-center\">\n\n            <FormGroup className=\"flex-shrink-1\">\n              <Label for=\"method\">Min Value</Label>\n              <Input type=\"number\" bsSize=\"sm\" className=\"teeny me-2\" name=\"min\" value={min ?? ''} onChange={handleOnChange} />\n            </FormGroup>\n\n            <FormGroup className=\"flex-shrink-1\">\n              <Label for=\"method\">Max Value</Label>\n              <Input type=\"number\" bsSize=\"sm\" className=\"teeny\" name=\"max\" value={max ?? ''} onChange={handleOnChange} />\n            </FormGroup>\n\n            <div className=\"ms-3\">\n              <FormText>Leave blank to allow any value</FormText>\n            </div>\n\n          </div>\n\n        </div>\n        )}\n\n        {StaticChoiceInputTypes.includes(inputType) && (\n          <FormGroup className=\"flex-shrink-1\">\n            <Label for=\"method\">Choices</Label>\n            <Input\n              type=\"textarea\"\n              name=\"choices\"\n              rows={5}\n              value={choices}\n              onChange={handleOnChange}\n              invalid={!!errors['options.choices']}\n            />\n            <FormFeedback>{errors['options.choices']}</FormFeedback>\n            <FormText>\n              Add 1 choice per line. Delimit values and labels with a colon (\n              <i>value:label</i>\n              )\n            </FormText>\n          </FormGroup>\n        )}\n\n        {DynamicChoiceInputTypes.includes(inputType) && (\n          <FormGroup className=\"flex-shrink-1\">\n            <Label for=\"method\">Dynamic Choices</Label>\n            <FormText>Select from dynamic source at left. Values are from database tables.</FormText>\n          </FormGroup>\n        )}\n\n      </div>\n\n      {/* Probably don't show this if input_type is expression, maybe others */}\n      <OptionTarget {...target} onChange={handleOnChangeTarget} />\n    </>\n  );\n};\n\nexport default Options;\n","import React, { useMemo, useContext } from 'react';\nimport {\n  Button, Col, FormFeedback, FormGroup, FormText, Input, InputGroup, Label, Row,\n} from 'reactstrap';\nimport * as Yup from 'yup';\nimport copy from 'fast-copy';\nimport PropTypes from 'prop-types';\nimport LoadingBar from '../../../../Layout/LoadingBar';\nimport {HelpPopper, StandardAlert}  from '@thedmsgroup/mastodon-ui-components';\nimport useFormState from '../../../../Hooks/useFormState';\nimport { Required } from '../../../../Components/Form/FormCommon';\nimport { ProductChoices } from '../../../../Components/Table/FilterChoices';\nimport DynamicSingleSelect from '../../../../Components/Form/DynamicSingleSelect';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport Options from './Options';\nimport { StaticChoiceInputTypes, DynamicSourceMap, DynamicChoiceInputTypes } from './constants';\n\nconst ValidationSchema = Yup.object().shape({\n  name: Yup.string().trim().required('Name is required'),\n  alias: Yup.string().trim().matches(/^[a-z0-9_\\.]+$/, 'Alias must be lower case alphanumeric (underscore and dot allowed)').required('Alias is required'),\n  input_type: Yup.string().required('Enter an input type'),\n  data_type: Yup.string().required('Enter a data type'),\n  group_id: Yup.number().required('Select a group for display'),\n  dynamic_source: Yup.mixed().when('input_type', {\n    is: (t) => DynamicChoiceInputTypes.includes(t),\n    then: Yup.string().required('Dynamic source is required'),\n  }),\n\n  options: Yup.object().shape({\n    // Test for choices if input type is choice-based\n    choices: Yup.string().test('choices_exist', 'Choices are required (verify format)', function (choices) {\n      // Strange way of accessing the parent schema values\n      const { from } = this;\n      const inputType = from[1].value.input_type;\n\n      if (inputType && StaticChoiceInputTypes.includes(inputType)) {\n        const lines = choices.split('\\n');\n        return lines.every((line) => /^.+:.+$/.test(line));\n      }\n      return true;\n    }).nullable(),\n\n  }),\n});\n\nconst initFormValues = (attribute) => {\n  const values = {\n    name: attribute.name,\n    alias: attribute.alias,\n    product: attribute.product || '',\n    vertical_id: attribute.vertical ? attribute.vertical.id : '',\n    group_id: attribute.group ? attribute.group.id : '',\n    input_type: attribute.input_type,\n    data_type: attribute.data_type,\n    scope: attribute.scope || '',\n    options: attribute.options || {},\n    dynamic_source: '',\n  };\n\n  if (Array.isArray(values.options)) {\n    // php will encode empty into array\n    values.options = {};\n  }\n  values.options.choices = choicesToText(values.options.choices);\n  if (!values.options.target) values.options.target = {};\n\n  values.options.target.label = values.options.target.label || '';\n  values.options.target.choices = choicesToText(values.options.target.choices);\n\n  return values;\n};\n\nconst choicesToText = (objChoices) => {\n  if (!objChoices) return '';\n  const lines = Object.entries(objChoices).reduce((acc, [val, label]) => {\n    acc.push(`${val}:${label}`);\n    return acc;\n  }, []);\n\n  return lines.length ? lines.join('\\n') : '';\n};\n\nconst textToChoices = (text) => {\n  if (!text || typeof text !== 'string') return {};\n  const choices = {};\n  text.split('\\n').map((line) => {\n    const [key, value] = line.split(':');\n    choices[key] = value;\n  });\n  return choices;\n};\n\nconst Attribute = ({ attribute, close }) => {\n  const app = useContext(AppContext);\n  const isNew = !attribute.id;\n  const preparedFormValues = useMemo(() => initFormValues(copy(attribute)), [attribute.id]);\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(preparedFormValues, ValidationSchema);\n\n  // Change data_type value depending on input_type\n  const handleChangeInputType = (e) => {\n    const input_type = e.target.value;\n    let { alias, data_type } = formValues;\n    switch (input_type) {\n      case 'boolean':\n        data_type = 'boolean'; break;\n      case 'choice':\n      case 'multiple_choice':\n      case 'zipcode_list':\n      case 'expression':\n        data_type = 'string'; break;\n      case 'integer_range':\n        data_type = 'integer'; break;\n      case 'dynamic_choice':\n      case 'dynamic_multiple_choice':\n        if (!DynamicChoiceInputTypes.includes(alias)) {\n          alias = '';\n        }\n    }\n\n    formApi.setValues({\n      ...formValues, alias, input_type, data_type,\n    });\n  };\n\n  const handleChangeDynamicSource = (e) => {\n    const dynamic_source = e.target.value;\n    const alias = dynamic_source || '';\n    formApi.setValues({ ...formValues, alias, dynamic_source });\n  };\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      save();\n    }\n  };\n\n  const save = async () => {\n    app.showLoader('modal', isNew ? 'Creating attribute' : 'Updating attribute');\n\n    const att = copy(formValues);\n\n    if (att.input_type.indexOf('choice') < 0) {\n      delete att.options.choices;\n    }\n\n    if (att.options.choices) {\n      att.options.choices = textToChoices(att.options.choices);\n    }\n\n    if (att.input_type !== 'integer_range') {\n      delete att.options.min;\n      delete att.options.max;\n    }\n\n    // Remove empty target, or objectify choices\n    if (!att.options.target || Object.keys(att.options.target).length < 2\n       || !att.options.target.label || !att.options.target.choices) {\n      delete att.options.target;\n    } else {\n      att.options.target.choices = textToChoices(att.options.target.choices);\n    }\n\n    // \"dynamic_source\" is not a db field, we just set the alias to the dynamic_source value.\n    if (DynamicChoiceInputTypes.includes(att.input_type)) {\n      delete att.options.choices;\n    }\n\n    delete att.dynamic_source;\n\n    let result = null;\n\n    if (attribute.id) {\n      att.id = attribute.id;\n      result = await app.api.endpoints.attributes.update(att);\n    } else {\n      result = await app.api.endpoints.attributes.create(att);\n    }\n\n    app.showLoader(false);\n\n    if (!result) {\n      // Could get 'alias already exists' error\n      if (app.api.error.form && app.api.error.form['alias.alias']) {\n        notify(`Unable to save attribute: ${app.api.error.form['alias.alias']}`, 'error');\n      } else {\n        notify(`Unable to save attribute: ${app.api.error.name}`, 'error');\n      }\n    } else {\n      notify('The attributed was saved', 'success');\n      close(true);\n    }\n  };\n\n  return (\n    <>\n      <LoadingBar name=\"modal\" />\n\n      {!formIsValid\n      && (\n      <StandardAlert color=\"info\" className=\"validation\">\n        Please correct the errors below before continuing\n      </StandardAlert>\n      )}\n\n      <div className=\"modal-content-background\">\n        <Row>\n          <Col sm={3}>\n\n            <div className=\"form-section\">\n              <FormGroup>\n                <Label>\n                  Name\n                  {' '}\n                  <Required />\n                </Label>\n                <Input\n                  type=\"text\"\n                  bsSize=\"sm\"\n                  name=\"name\"\n                  onChange={formApi.handleOnChange}\n                  value={formValues.name}\n                  invalid={!!formErrors.name}\n                  placeholder=\"The label in the UI\"\n                />\n\n              </FormGroup>\n\n              <FormGroup>\n                <Label>\n                  Alias\n                  {' '}\n                  <Required />\n                  {' '}\n                  <HelpPopper name=\"alias\" title=\"Alias\" iconClass=\"ms-2\">\n                    The attribute&apos;s key used within the matchable definition. Lower case with no spaces. Dots can be used\n                    to indicate categories of attributes, such as\n                    {' '}\n                    <i>properties.num_stories</i>\n                  </HelpPopper>\n                </Label>\n                <Input\n                  type=\"text\"\n                  bsSize=\"sm\"\n                  name=\"alias\"\n                  onChange={formApi.handleOnChange}\n                  value={formValues.alias}\n                  invalid={!!formErrors.alias}\n                  disabled={formValues.input_type.indexOf('dynamic') >= 0}\n                  placeholder={formValues.input_type.indexOf('dynamic') >= 0 ? 'Select a dynamic source' : 'The matchable key'}\n                />\n                {!isNew && <FormText><small>NOTE: Changing the alias will NOT update existing matchables that use it!</small></FormText>}\n              </FormGroup>\n              {/* TODO: if dynamic, alias must be source (vertical_id, account_id, etc) */}\n\n              <FormGroup>\n                <Label>\n                  Vertical\n                </Label>\n\n                <DynamicSingleSelect\n                  onChange={formApi.handleOnChange}\n                  value={formValues.vertical_id}\n                  noSelectionLabel=\"All verticals\"\n                  name=\"vertical_id\"\n                  size=\"sm\"\n                  endpoint=\"verticals\"\n                  invalid={!!formErrors.vertical_id}\n                  labelProperty=\"display_name\"\n                  params={{options:true}}\n                />\n\n                <FormFeedback>{formErrors.vertical_id}</FormFeedback>\n              </FormGroup>\n\n              <FormGroup>\n\n                <Label>\n                  Product\n                </Label>\n                <InputGroup>\n                  <Input\n                    type=\"select\"\n                    bsSize=\"sm\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.product}\n                    name=\"product\"\n                    invalid={!!formErrors.product}\n                  >\n                    <option value=\"\">All products</option>\n                    {ProductChoices.map((p) => <option value={p.value} key={p.value}>{p.label}</option>)}\n                  </Input>\n                </InputGroup>\n                <FormFeedback>{formErrors.product}</FormFeedback>\n              </FormGroup>\n\n              {/* TODO disable depending on input_type ? */}\n              <FormGroup>\n                <Label>\n                  Data Type\n                  {' '}\n                  <Required />\n                </Label>\n                <InputGroup>\n                  <Input\n                    type=\"select\"\n                    bsSize=\"sm\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.data_type}\n                    name=\"data_type\"\n                    invalid={!!formErrors.data_type}\n                  >\n                    <option value=\"\">Select...</option>\n                    <option value=\"boolean\">Boolean</option>\n                    <option value=\"integer\" disabled={formValues.input_type === 'boolean'}>Integer</option>\n                    <option value=\"string\" disabled={formValues.input_type === 'boolean'}>String</option>\n                    <option value=\"array\" disabled={formValues.input_type === 'boolean'}>Array</option>\n                  </Input>\n                </InputGroup>\n                <FormFeedback>{formErrors.data_type}</FormFeedback>\n              </FormGroup>\n\n              <FormGroup>\n                <Label>\n                  Input Type\n                  {' '}\n                  <Required />\n                </Label>\n                <InputGroup>\n                  <Input\n                    type=\"select\"\n                    onChange={handleChangeInputType}\n                    value={formValues.input_type}\n                    name=\"input_type\"\n                    bsSize=\"sm\"\n                    invalid={!!formErrors.input_type}\n                  >\n                    <option value=\"\">Select...</option>\n                    <option value=\"boolean\">Boolean</option>\n                    <option value=\"expression\">Expression</option>\n                    <option value=\"integer_range\">Integer Range</option>\n                    <option value=\"choice\">Choice</option>\n                    <option value=\"multiple_choice\">Multiple Choice</option>\n                    <option value=\"dynamic_choice\">Dynamic Choice</option>\n                    <option value=\"dynamic_multiple_choice\">Dynamic Multiple Choice</option>\n                    <option value=\"list\">List (Freeform Choices)</option>\n                    <option value=\"metro_choice\">Metro Choice</option>\n                    <option value=\"state_choice\">State Choice</option>\n                    <option value=\"county_list\">County List</option>\n                    <option value=\"zipcode_list\">Zipcode List</option>\n\n                  </Input>\n                </InputGroup>\n                <FormFeedback>{formErrors.input_type}</FormFeedback>\n              </FormGroup>\n\n              {DynamicChoiceInputTypes.includes(formValues.input_type) && (\n              <FormGroup>\n                <Label>\n                  Dynamic Source\n                  {' '}\n                  <Required />\n                  {' '}\n                  <HelpPopper name=\"dynamic-source\" title=\"Dynamic Source\" iconClass=\"ms-2\">\n                    Dynamic choice inputs draw their choices from the database. The alias will be set according to chosen source.\n                  </HelpPopper>\n                </Label>\n                <InputGroup>\n                  <Input\n                    type=\"select\"\n                    bsSize=\"sm\"\n                    onChange={handleChangeDynamicSource}\n                    value={formValues.dynamic_source}\n                    name=\"dynamic_source\"\n                    invalid={!!formErrors.dynamic_source}\n                  >\n                    <option value=\"\">Select...</option>\n                    {Object.entries(DynamicSourceMap).map(([val, label], i) => <option key={i} value={val}>{label}</option>)}\n                  </Input>\n                </InputGroup>\n                <FormFeedback>{formErrors.dynamic_source}</FormFeedback>\n              </FormGroup>\n              )}\n\n              <FormGroup>\n                <Label>\n                  Attribute Group\n                  {' '}\n                  <Required />\n                  {' '}\n                  <HelpPopper name=\"group\" title=\"Attribute Group\" iconClass=\"ms-2\">\n                    Attributes are grouped under these headers in the selection dropdown.\n                  </HelpPopper>\n                </Label>\n\n                <DynamicSingleSelect\n                  onChange={formApi.handleOnChange}\n                  value={formValues.group_id}\n                  name=\"group_id\"\n                  size=\"sm\"\n                  endpoint=\"attributes\"\n                  action=\"groups\"\n                  invalid={!!formErrors.group_id}\n                  labelProperty=\"name\"\n                  params={{options:true}}\n                />\n\n                <FormFeedback>{formErrors.group_id}</FormFeedback>\n              </FormGroup>\n\n              {/* TODO: secondary list for dynamic source: vertical_id, account_id, vendor_id */}\n\n              <FormGroup>\n                <Label>\n                  Scope\n                  <HelpPopper name=\"scope\" title=\"Scope\" iconClass=\"ms-2\">\n                    Optionally limit the use of this attribute to routing rules or return rules.\n                    Use Return Rules for data that only exists when a return is decided (e.g. the return decision itself).\n                    If not set, the attribute will be available to all scopes (depending on settings for product and vertical)\n                  </HelpPopper>\n                </Label>\n                <InputGroup>\n                  <Input\n                    type=\"select\"\n                    bsSize=\"sm\"\n                    onChange={formApi.handleOnChange}\n                    value={formValues.scope}\n                    name=\"scope\"\n                    invalid={!!formErrors.scope}\n                  >\n                    <option value=\"\">Any</option>\n                    <option value=\"routing\">Routing Rules</option>\n                    <option value=\"returns\">Return Rules</option>\n                  </Input>\n                </InputGroup>\n                <FormFeedback>{formErrors.scope}</FormFeedback>\n              </FormGroup>\n            </div>\n\n          </Col>\n\n          <Col sm={9}>\n            <Options inputType={formValues.input_type} {...formValues.options} errors={formErrors} onChange={formApi.handleOnChange} />\n          </Col>\n        </Row>\n\n      </div>\n\n      <Row className=\"modal-content-footer\">\n\n        <Col sm={12} className=\"text-end\">\n          <Button\n            onClick={close}\n            color=\"link\"\n            size=\"sm\"\n          >\n            Cancel\n          </Button>\n          <Button\n            onClick={handleSave}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            Save\n          </Button>\n\n\n        </Col>\n      </Row>\n    </>\n  );\n};\n\nAttribute.propTypes = {\n  close: PropTypes.func.isRequired,\n  attribute: PropTypes.object.isRequired,\n};\n\nexport default Attribute;\n","import React, { useState, useEffect } from 'react';\nimport {\n  Button, Modal, ModalHeader, ModalBody,\n} from 'reactstrap';\nimport DocTitle from '../../../../Layout/DocTitle';\nimport PageSection from '../../../../Layout/PageSection';\nimport AttributesTable from './Table';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport FilterBar from '../../../../Components/Table/FilterBar';\nimport Filters from './Filters';\nimport { LiveFilteringProvider } from '../../../../Providers/LiveFilteringProvider';\nimport usePermission from '../../../../Hooks/usePermission';\nimport useApi from '../../../../Hooks/useApi';\nimport Attribute from '../Detail';\nimport {useChangeTimeline} from '../../../../Hooks/useChangeTimeline';\n\nconst ListHeaderTools = ({ allowCreate, buttonClick }) => {\n  if (!allowCreate) return (null);\n  return (\n    <Button\n      onClick={buttonClick}\n      color=\"primary\"\n      size=\"sm\"\n    >\n      New Attribute\n    </Button>\n  );\n};\n\n\n\nconst AttributeList = () => {\n  const [loading, setLoading] = useState(true);\n  const [attributes, setAttributes] = useState([]);\n  const [selectedAttribute, setSelectedAttribute] = useState(null);\n  const [isDetailOpen, setIsDetailOpen] = useState(false);\n  const allowEdit = usePermission('attributes.edit');\n  const allowCreate = usePermission('attributes.create');\n  const { api } = useApi();\n  useChangeTimeline({ entityTypes: ['attribute'], parentFilters: {} });\n\n  if (!allowEdit) return (null);\n\n  const toggleDetail = (refresh = false) => {\n    setIsDetailOpen(!isDetailOpen);\n    if (refresh === true) {\n      load();\n    }\n  };\n\n  const handleCreateNew = () => {\n    handleSelectAttribute(\n      {\n        id: 0,\n        name: '',\n        alias: '',\n        product: '',\n        vertical: null,\n        group_id: null,\n        input_type: '',\n        data_type: '',\n        scope: '',\n        options: {},\n      },\n    );\n  };\n\n  const handleSelectAttribute = (attr) => {\n    if (attr) {\n      setSelectedAttribute(attr);\n      setIsDetailOpen(true);\n    }\n  };\n\n  useEffect(() => {\n    if (!attributes.length) {\n      load();\n    }\n  }, []);\n\n  const load = async (refresh = false) => {\n    if (!refresh) {\n      setLoading(true);\n    }\n\n    const attr = await api.endpoints.attributes.list();\n\n    if (attr === false) {\n      notify(`Unable to load attributes: ${api.error.name}`, 'error');\n    } else {\n      setAttributes(attr);\n    }\n\n    if (!refresh) {\n       setLoading(false);\n    }\n  };\n\n  // TODO: will we have status, or active flag?\n  const handleStatusChange = async (id, status) => {\n    const result = await api.endpoints.attributes.update({ id, status });\n    return result;\n  };\n\n  return (\n\n    <>\n      <DocTitle pageTitle=\"Attributes\" />\n\n      <LiveFilteringProvider filters={{}}>\n\n        <FilterBar>\n          <Filters loading={loading} onRefresh={() => load(true)} />\n        </FilterBar>\n\n        <PageSection\n          title=\"Attributes\"\n          tools={<ListHeaderTools allowCreate={allowCreate} buttonClick={handleCreateNew} />}\n        >\n\n          <AttributesTable\n            loading={loading}\n            data={attributes}\n            onSelect={handleSelectAttribute}\n            onStatusChange={handleStatusChange}\n            allowEdit={allowEdit}\n          />\n\n        </PageSection>\n\n      </LiveFilteringProvider>\n\n      <Modal isOpen={isDetailOpen} toggle={toggleDetail} size=\"xlg\" id=\"edit-attribute-modal\">\n        {selectedAttribute && (\n          <>\n            <ModalHeader toggle={toggleDetail}>\n              {\n              selectedAttribute.id === 0\n                ? 'Create Attribute'\n                : (\n                  <>\n                    Edit Attribute |\n                    <span className=\"modal-subheader\">{selectedAttribute.name}</span>\n                  </>\n                )\n            }\n            </ModalHeader>\n            <ModalBody>\n\n              <Attribute\n                attribute={selectedAttribute}\n                close={toggleDetail}\n              />\n\n            </ModalBody>\n          </>\n        )}\n\n      </Modal>\n    </>\n  );\n};\n\nexport default AttributeList;\n","import React, {FC, useMemo} from \"react\";\nimport FlexTable from \"../../../Components/Table/FlexTable\";\nimport {DateFormatter} from \"../../../Components/Table/Table\";\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {InputSchemaType} from \"../../../types\";\nimport {Button} from \"reactstrap\";\nimport {ChangeHistoryButton} from \"../../../Providers/ChangeProvider\";\nimport {Stack, RowDivider} from \"@thedmsgroup/mastodon-ui-components\";\n\n\ntype InputSchemaTableProps = {\n  data:InputSchemaType[];\n  isLoading:boolean;\n  onViewSchema:(schema:InputSchemaType) => void;\n  onEditSchema:(schema:InputSchemaType) => void;\n}\n\n/*\n * Table that lists Input Schema\n */\nconst InputSchemaTable:FC<InputSchemaTableProps> = ({\n                                                              data,\n                                                              isLoading,\n                                                              onViewSchema,\n                                                              onEditSchema,\n                                                            }) => {\n\n  const columns = useMemo(() =>{\n\n    return [\n      {\n        Header: 'ID',\n        accessor: 'id',\n        maxWidth: 40,\n        filter: 'text',\n        Cell: ({value}:{value:number}) => <EntityId id={value} />\n      },\n      {\n        Header: 'Name',\n        accessor: 'name',\n        minWidth: 250,\n        filter: 'text',\n        Cell: ({row, value}:{row:any, value:string}) =>\n          <div>\n            <div>\n\n              {value}\n            </div>\n            <small>{row.original.description}</small>\n          </div>\n      },\n      /*{\n        Header: 'Description',\n        accessor: 'description',\n        minWidth: 240,\n        filter: 'text',\n      },*/\n      {\n        Header: 'Schema',\n        id:'schema',\n        maxWidth:80,\n        disableSortBy: true,\n        Cell: ({row}:{row:any}) => (\n          <Button\n            color=\"link\"\n            className=\"inline\"\n            onClick={()=>onViewSchema(row.original)}\n          >\n            <FaIcon icon=\"eye\" size=\"sm\" />\n            {' '}View\n          </Button>\n        )\n      },\n      {\n        Header: 'Parent',\n        minWidth: 120,\n        accessor:'parent_id',\n        disableSortBy: true,\n        Cell: ({value, data}:{value:number|null, data:InputSchemaType[]}) => (\n            <div>\n              {value ? (\n                <ParentSchemaCell parentId={value} allSchemas={data} onViewSchema={onViewSchema} />\n              ) : (\n                <span>&mdash;</span>\n              )}\n            </div>\n          )\n      },\n      {\n        Header: 'Extended By',\n        minWidth: 200,\n        accessor:'input_schemas',\n        disableSortBy: true,\n        Cell: ({value}:{value:InputSchemaType[]}) =>  <ExtendedByCell schemas={value} onViewSchema={onViewSchema} />\n\n      },\n      {\n        Header: 'Created',\n        accessor: 'created_at',\n        defaultCanSort: true,\n        width: 130,\n        disableGlobalFilter: true,\n        Cell: ({ value }:{value:string}) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n      {\n        Header: 'Modified',\n        accessor: 'modified_at',\n        defaultCanSort: true,\n        disableGlobalFilter: true,\n        Cell: ({ value }:{value:string}) => <DateFormatter value={value} format=\"MMM do, y\" />,\n      },\n      {\n        Header: '',\n        id: 'actions',\n        maxWidth: 60,\n        defaultCanSort: false,\n        disableGlobalFilter: true,\n        disableSortBy: true,\n        Cell: ({ row }:{row:any}) => <ActionCell\n          schema={row.original}\n          onView={onViewSchema}\n          onEdit={onEditSchema}\n        />\n      },\n    ]\n\n  }, [])\n\n\n  return (\n    <FlexTable\n      columns={columns}\n      initialState={{\n        sortBy: [{id: 'name', desc: false}]\n      }}\n      className=\"input-schema-table striped\"\n      data={data}\n      noDataMessage=\"No schemas found\"\n      loading={isLoading}\n    />\n\n  );\n}\n\nexport default InputSchemaTable;\n\ntype ParentSchemaCellProps = {\n  parentId:number;\n  allSchemas: InputSchemaType[];\n  onViewSchema: (schema:InputSchemaType) => void;\n}\n\nconst ParentSchemaCell = ({parentId, allSchemas, onViewSchema}:ParentSchemaCellProps) => {\n  const parentSchema = allSchemas.find((inp:InputSchemaType) => inp.id === parentId);\n  if (parentSchema) {\n    return (\n      <span>\n        <EntityId id={parentId}/> {parentSchema.name}\n          <Button\n            color=\"link\"\n            className=\"inline ms-1\"\n            onClick={() => onViewSchema(parentSchema)}\n          >\n            <FaIcon icon=\"eye\" size=\"sm\"/>\n          </Button>\n      </span>\n    )\n  }\n  return <i>error: not found</i>\n}\n\ntype ExtendedByCellProps = {\n  schemas:InputSchemaType[];\n  onViewSchema: (schema:InputSchemaType) => void;\n}\nconst ExtendedByCell = ({ schemas, onViewSchema}:ExtendedByCellProps) =>  (\n      <div>\n        {schemas.length > 0 ? (\n          <Stack gap=\"0.35em\" divider={<RowDivider />} >\n            {schemas.map((schema:InputSchemaType, i:number) => (\n              <div className=\"mb-1\" key={i}>\n                <EntityId id={schema.id}/> {schema.name}\n                <Button\n                  color=\"link\"\n                  className=\"inline ms-1\"\n                  onClick={() => onViewSchema(schema)}\n                >\n                  <FaIcon icon=\"eye\" size=\"sm\"/>\n                </Button>\n              </div>\n            ))}\n\n          </Stack>\n        ) : <span>&mdash;</span>\n        }\n\n      </div>\n);\n\n  type SchemaActionCellProps = {\n    schema:InputSchemaType,\n    onView:(schema:InputSchemaType)=>void;\n    onEdit:(schema:InputSchemaType)=>void;\n  }\n\n  const ActionCell = ({ schema, onEdit, onView }:SchemaActionCellProps) => (\n    <div className=\"list-actions\">\n      <Button color=\"link\" className=\"action-item inline\" title=\"Edit\" onClick={() => { onEdit(schema); }}>\n        <FaIcon icon=\"cog\" size=\"1x\" />\n      </Button>\n      <ChangeHistoryButton id={schema.id} name={schema.name} type=\"inputschema\" />\n    </div>\n  );\n\n\n\n","import React, {useEffect, useState} from \"react\";\nimport {\n  Row,\n  Col,\n  FormGroup,\n  Input,\n  Label,\n  Button,\n  FormText,\n  FormFeedback, ModalHeader,\n  Modal,\n  ModalBody,\n  ModalFooter\n} from \"reactstrap\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport useFormState from \"../../../Hooks/useFormState\";\nimport {JsonEditorLoadable} from \"@thedmsgroup/mastodon-ui-components\";\nimport EnhancedSelect from \"../../../Components/Form/EnhancedSelect\";\nimport {InputSchemaOptionLabel} from \"./InputSchemaOptionLabel\";\nimport {InputSchemaType} from \"../../../types\";\nimport InputSchemaApi from \"./InputSchemaApi\";\nimport LoadingBar from \"../../../Layout/LoadingBar\";\n\ntype InputSchemaFormProps = {\n  schema:InputSchemaType;\n  allSchema:InputSchemaType[];\n  isOpen:boolean;\n  close:(refresh?:any|boolean)=>void;\n  onView:(schema:InputSchemaType)=>void;\n}\n/*\n * Form for editing or creating an input schema\n */\nconst InputSchemaForm = ({schema, allSchema, onView, isOpen, close}:InputSchemaFormProps) => {\n  const api = new InputSchemaApi();\n  const[parentChoices, setParentChoices] = useState<any[]>([])\n  const[isValidSchema, setIsValidSchema] = useState<boolean>(true)\n  const[saving, setSaving] = useState(false);\n  const isNew = !schema.id;\n  const {\n    formApi,\n    formValues,\n    formErrors,\n    formIsValid,\n  } = useFormState({\n    id: schema.id,\n    name:schema.name,\n    description:schema.description,\n    parent_id:schema.parent_id,\n    content:JSON.stringify(schema.content, null, 2)\n  });\n\n\n  const updateParentChoices = () => {\n    const choices = allSchema.filter(s => s.id !== schema.id).map(s => {\n      return {value:s.id, label:s.name, description:s.description}\n    });\n    setParentChoices([\n      {\n        value:\"\",\n        label:\"None\",\n        description: \"\",\n      },\n      ...choices\n    ]);\n  }\n\n  const handleViewParent = (id:number) => {\n    const parent = allSchema.find(s => s.id === id);\n    if (parent) {\n      onView(parent);\n    }\n  }\n\n\n  // Parent choices after schema choices are loaded\n  useEffect(()=>{\n    updateParentChoices();\n  }, []);\n\n\n  const editorChanged = (newCode:any, isValid:boolean) => {\n    setIsValidSchema(isValid);\n    formApi.setValue('content', newCode);\n  }\n\n\n  const handleSelectParent = (id:number) => {\n    formApi.setValue(\"parent_id\", id);\n  }\n\n\n  const handleCancel = () => {\n    formApi.clearForm();\n    setIsValidSchema(true);\n    close();\n  }\n\n  const checkValid = () => {\n    if (!formValues.name) {\n      formApi.setError(\"name\", \"Name is required\");\n      return false;\n    }\n\n    if (allSchema.find((s) => s.id !== formValues.id && s.name.toLowerCase() === formValues.name.toLowerCase())) {\n      formApi.setError(\"name\", \"This name is already used for another schema.\");\n      return false;\n    }\n\n    // Editor will do its own syntax and schema validating onChange\n    if (!isValidSchema) {\n      formApi.setError(\"content\", \"Invalid schema\");\n    }\n\n    return true;\n  }\n\n  const handleSave = async() => {\n\n    if (checkValid()) {\n      setSaving(true);\n      const params = {...formValues};\n      params.content = JSON.parse(formValues.content);\n      if (!params.parent_id) {\n        params.parent_id = null;\n      }\n      let result;\n      if (isNew) {\n        delete params.id;\n        result = await api.create(params);\n      } else {\n        result = await api.update(formValues.id, params);\n      }\n\n      if (result) {\n        notify(`The input schema has been saved`, 'success');\n\n        close(true)\n      } else {\n        //@ts-ignore\n        notify(`Unable to save schema: ${api.error ? api.error.name : \"\"}`, 'error');\n      }\n      setSaving(false);\n\n    }\n  }\n\n  return (\n    <Modal isOpen={isOpen} toggle={close} size=\"xlg\" scrollable>\n      <ModalHeader toggle={close}>\n        {schema.id ? \"Edit Schema\" : \"Create New Schema\"}\n      </ModalHeader>\n      {schema.id > 0 && <div className=\"modal-subheader\">{schema.name}</div>}\n      <ModalBody>\n      <LoadingBar name=\"modal\" active={saving} message=\"Saving...\" />\n\n          <div className=\"form-section border\">\n\n            {!formIsValid\n            && (\n              <StandardAlert color=\"warning\" className=\"my-2 alert-form-validation\">\n                Please correct the errors below before continuing\n              </StandardAlert>\n            )}\n\n\n\n            <Row>\n              <Col sm={6}>\n                <FormGroup className=\"flex-shrink-1\">\n                  <Label for=\"method\">Name</Label>\n                  <Input\n                    type=\"text\"\n                    bsSize=\"sm\"\n                    name=\"name\"\n                    value={formValues.name}\n                    onChange={formApi.handleOnChange}\n                    invalid={!!formErrors.name}\n                  />\n                  <FormFeedback>{formErrors.name}</FormFeedback>\n                </FormGroup>\n              </Col>\n            </Row>\n\n            <Row>\n              <Col sm={6}>\n                <FormGroup className=\"flex-shrink-1\">\n                  <Label for=\"method\">Description</Label>\n                  <Input\n                    type=\"text\"\n                    bsSize=\"sm\"\n                    name=\"description\"\n                    value={formValues.description}\n                    onChange={formApi.handleOnChange}\n                    invalid={!!formErrors.description}\n                  />\n                  <FormFeedback>{formErrors.name}</FormFeedback>\n                </FormGroup>\n              </Col>\n            </Row>\n\n            <Row>\n              <Col sm={6}>\n                <FormGroup className=\"flex-shrink-1\">\n                  <Label for=\"method\">Extends</Label>\n                  <div><FormText>Optionally set a base schema. The current schema will inherit the properites of the base definition.</FormText></div>\n                  <div className=\"d-flex justify-content-between align-items-center\">\n                    <div className=\"flex-fill\">\n                      <EnhancedSelect\n                        value={formValues.parent_id ? formValues.parent_id.toString() : \"\"}\n                        options={parentChoices}\n                        controlShouldRenderValue\n                        isMulti={false}\n                        isSearchable\n                        onChange={handleSelectParent}\n                        placeholder=\"None\"\n                        formatOptionLabel={InputSchemaOptionLabel}\n                      />\n                    </div>\n\n                    {formValues.parent_id && <Button color=\"link\" size=\"xs\" className=\"ms-2 inline\" onClick={() => handleViewParent(formValues.parent_id)}>View</Button>}\n                  </div>\n\n\n\n                </FormGroup>\n              </Col>\n            </Row>\n\n            {!isNew && (\n              <Row>\n                <Col sm={6}>\n                  <FormGroup className=\"flex-shrink-1\">\n                    <Label for=\"method\">Extended By</Label>\n                    <div>\n                      {schema.input_schemas.length > 0 ? (\n                        <>\n                          {schema.input_schemas.map((child:InputSchemaType, i:number)=>(\n                            <div key={i} className=\"mb-1\">\n                              {child.name}\n                              <Button color=\"link\" size=\"xs\" className=\"ms-2 inline\" onClick={()=>onView(child)}>View</Button>\n                            </div>\n                          ))}\n                        </>\n                      ) : (\n                        <i>none</i>\n                      )}\n                    </div>\n\n                  </FormGroup>\n                </Col>\n              </Row>\n            )}\n\n\n\n            <Row>\n              <Col>\n                <JsonEditorLoadable\n                  label=\"Schema\"\n                  code={formValues.content}\n                  onChange={editorChanged}\n                  linting={true}\n                  schema={CONTENT_SCHEMA}\n                  isInvalid={!isValidSchema}\n                />\n              </Col>\n            </Row>\n\n          </div>\n\n\n      </ModalBody>\n      <ModalFooter>\n        <div className=\"d-flex align-items-center justify-content-end mb-2\">\n\n          <div>\n            <Button\n              color=\"link\"\n              size=\"sm\"\n              className=\"me-1\"\n              onClick={handleCancel}\n              disabled={saving}\n            >\n              Cancel\n            </Button>\n            <Button\n              disabled={!formIsValid || !isValidSchema || saving}\n              color=\"primary\"\n              className=\"me-2\"\n              name=\"save\"\n              size=\"sm\"\n              onClick={handleSave}\n            >\n              Save\n            </Button>\n          </div>\n        </div>\n      </ModalFooter>\n    </Modal>\n  )\n}\n\nexport default InputSchemaForm;\n\n\nconst CONTENT_SCHEMA = {\n  \"type\": \"object\",\n  \"additionalProperties\": true,\n  \"oneOf\":[\n    {\"$ref\": \"#/definitions/property_def\"}\n  ],\n  \"definitions\": {\n    \"property_def\": {\n      \"type\":\"object\",\n      \"properties\":{\n        \"type\": {\n          \"type\": \"string\"\n        },\n        \"pattern\": {\n          \"type\": \"string\"\n        },\n        \"allow_unknown\": {\n          \"type\": \"boolean\"\n        },\n        \"required\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"enum\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"items\": {\n          \"title\": \"items\",\n          \"anyOf\": [{\n            \"$ref\": \"#\"\n          }, {\n            \"$ref\": \"#/definitions/schema_array\"\n          }],\n          \"default\": true\n        },\n        \"properties\": {\n          \"title\": \"properties\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#\"\n          },\n          \"default\": {}\n        },\n      },\n      \"required\": [\"type\"]\n    },\n    \"schema_array\": {\n      \"title\": \"schemaArray\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"items\": {\n        \"$ref\": \"#\"\n      }\n    },\n\n  }\n}\n","import React, { useContext } from 'react';\nimport classnames from 'classnames';\nimport { LiveFilteringContext } from '../../../Providers/LiveFilteringProvider';\nimport { TextSearch } from '../../../Components/Table/Filter';\n\nconst Filters = (props) => {\n  const { filters, updateFilter, resetFilters } = useContext(LiveFilteringContext);\n\n  return (\n\n    <div className=\"d-flex position-relative\">\n\n      <div className={classnames(['loading-overlay', { show: props.loading }])} />\n\n        <div className=\"boxed-filter search-filter\">\n\n          <TextSearch\n            value={filters.name || []}\n            placeholder=\"Search by name\"\n            onUpdate={(val) => updateFilter('name', val)}\n            onClear={() => resetFilters()}\n          />\n        </div>\n\n    </div>\n  );\n};\n\nexport default Filters;\n","import React, { FC, useEffect, useState } from 'react';\nimport PageSection from '../../../Layout/PageSection';\nimport DocTitle from '../../../Layout/DocTitle';\nimport {\n  Button,\n} from \"reactstrap\";\nimport {InputSchemaType} from \"../../../types\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport InputSchemaTable from \"./InputSchemaTable\";\nimport InputSchemaForm from \"./InputSchemaForm\";\nimport InputSchemaApi from \"./InputSchemaApi\";\nimport Filters from \"./Filters\";\nimport InputSchemaViewModal from \"./InputSchemaViewModal\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport { LiveFilteringProvider} from \"../../../Providers/LiveFilteringProvider\";\nimport FilterBar from \"../../../Components/Table/FilterBar\";\nimport {useChangeTimeline} from \"../../../Hooks/useChangeTimeline\";\n\n\n//import useQueryState from \"../../../Hooks/useQueryState\";\n\n/*\n\n        \"id\": 1,\n        \"name\": \"Charity\",\n        \"description\": \"\",\n        \"content\": {\n        },\n        \"parent_id\": null,\n        \"input_schemas\": [],\n        \"created_at\": \"2023-03-29T17:48:32+00:00\",\n        \"modified_at\": \"2023-03-29T17:48:22+00:00\"\n */\nconst SchemaApi = new InputSchemaApi();\n\n/*\n * Input Schema Editor\n * Permission based on input_schema.edit (component is in a ProtectedRoute)\n */\nconst InputSchema: FC<any> = () => {\n\n // const [query, setQuery] = useQueryState({}, {historyAction:\"replace\"});\n  const[loading, setLoading] = useState<boolean>(true)\n  const[viewSchema, setViewSchema] = useState<InputSchemaType|null>(null)\n  const[editSchema, setEditSchema] = useState<InputSchemaType|null>(null)\n  const[list, setList] = useState<any[]>([])\n  const allowInputSchemaEdit = usePermission('input_schema.edit');\n  useChangeTimeline({ entityTypes: ['inputschema'], parentFilters: {} });\n\n  if (!allowInputSchemaEdit) return null;\n\n  useEffect(() => {\n    load();\n  }, [])\n\n  const load = async() => {\n    const result:any = await SchemaApi.list();\n    if (result) {\n      setList(result);\n    } else {\n      //@ts-ignore\n      notify(`Unable to load data: ${SchemaApi.error ? SchemaApi.error.name : \"\"}`, 'error');\n    }\n    setLoading(false);\n  }\n\n  //May get a click event, or true for refreshing\n  const closeEditModal = (e?:any|boolean) => {\n    setEditSchema(null);\n    if (e === true) {\n      load();\n    }\n  }\n\n  const closeViewSchema = () => setViewSchema(null);\n\n  const handleViewSchemaContent = (inputSchema:InputSchemaType) => {\n    setViewSchema(inputSchema);\n  }\n\n  const handleEditSchema = (schema:InputSchemaType) => {\n    setEditSchema(schema);\n  }\n\n  const handleCreateNew = () => {\n   setEditSchema({\n     id:0,\n     name: \"\",\n     description: \"\",\n     parent_id:null,\n     input_schemas:[],\n     content:{\n       \"type\": \"object\",\n       \"properties\": {}\n     }\n   } as InputSchemaType);\n  }\n\n  return (\n    <div>\n      <DocTitle pageTitle=\"Input Schema\" />\n\n      <LiveFilteringProvider useQueryString filters={{}}>\n\n        <FilterBar>\n          <Filters loading={loading} />\n        </FilterBar>\n\n        <PageSection\n          title=\"Input Schema\"\n          tools={<Button size=\"sm\" onClick={handleCreateNew} >Create</Button>}\n        >\n\n\n          <InputSchemaTable\n            data={list}\n            isLoading={loading}\n            onViewSchema={handleViewSchemaContent}\n            onEditSchema={handleEditSchema}\n          />\n\n\n          <InputSchemaViewModal\n            schema={viewSchema}\n            isOpen={Boolean(viewSchema)}\n            cancel={closeViewSchema}\n          />\n        </PageSection>\n\n      </LiveFilteringProvider>\n\n      {editSchema && <InputSchemaForm\n        schema={editSchema}\n        allSchema={list}\n        isOpen={Boolean(editSchema)}\n        close={closeEditModal}\n        onView={handleViewSchemaContent}\n      />}\n    </div>\n  )\n}\n\nexport default InputSchema;\n","import React from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\nimport Lazify from '../../../utils/Lazify';\nimport './styles.scss';\nimport NotFoundPage from '../../../Layout/NotFoundPage'\n\nconst LazyIntegrationList = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './List'));\nconst LazyDetails = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Details'));\nconst LazyDetailsEdit = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Details/NewRevision'));\n\nconst Integrations = () => (\n    <Routes>\n      <Route index element={<LazyIntegrationList/>}/>\n      <Route path=\":integration_id\" element={<LazyDetails/>}/>\n      <Route path=\":integration_id/:revision/edit\" element={<LazyDetailsEdit/>}/>\n      <Route path=\":integration_id/edit\" element={<LazyDetailsEdit/>}/>\n      <Route path=\"*\" element={<NotFoundPage />} />\n    </Routes>\n)\n\n\nexport default Integrations;\n","import BaseAPI from \"../../../Services/BaseAPI\";\n\nclass RuleSearchApi extends BaseAPI {\n  constructor() {\n    super(process.env.API_URL_CORE);\n  }\n\n  list = (params) => this.makeRequest('get', `${this.url}/rule-search`, params);\n\n}\n\nexport default RuleSearchApi\n","import React, { useState, useEffect } from 'react';\nimport classnames from 'classnames';\nimport {\n  DropdownMenu,\n  DropdownToggle,\n  UncontrolledDropdown\n} from \"reactstrap\";\nimport { StackedFilter } from '../../../../Components/Table/Filter';\nimport { ProductChoices, StatusChoices } from '../../../../Components/Table/FilterChoices';\nimport RightDateAndControls from '../../../../Components/Table/RightDateAndControls';\nimport useApiBatch from '../../../../Hooks/useApiBatch';\nimport TargetSelect from \"../../../../Components/TargetingManager/TargetSelect\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport FilterSummaryTags from \"../../../../Components/Table/FilterSummaryTags\";\nimport {useFilters} from \"../../../../Hooks/useFilters\";\n\nconst Filters = ({ filters, onChange, loading, onRefresh }) => {\n  const {onChangeFilter, clearFilter, reset} = useFilters(filters, onChange);\n  const [choices, setChoices] = useState({});\n\n\n  const batcher = useApiBatch();\n\n  // load choices\n  useEffect(() => {\n    const getChoices = async () => {\n      const batches = await batcher.fetch([\n        { endpoint: 'verticals', action: 'list' },\n        { endpoint: 'attributes', action: 'list', params:{options:true, scope:'routing'} },\n      ]);\n      if (batches && batches.length) {\n        const [verticals, attributes] = batches;\n        setChoices({\n          type: [\n            {value:'order', label:'Order Targeting'},\n            {value:'source', label:'Source Routing'},\n            {value:'channel', label:'Channel Routing'},\n            {value:'vendor', label:'Vendor Routing'},\n          ],\n          vertical: verticals.map((item) => ({ value: item.id.toString(), label: item.display_name })),\n          attribute: attributes,\n          status: StatusChoices,\n          product: ProductChoices,\n        });\n      }\n    };\n\n    if (Object.keys(choices).length === 0) getChoices();\n  }, []);\n\n  const getLabelForTag = {\n    attribute:(value, choices) => {\n            let label = '';\n              if (value && choices) {\n                Object.entries(choices).forEach( ([groupName, group]) => {\n                  const attr = group.find(attr => attr.alias === value);\n                  if (attr) {\n                    label = attr.label;\n                  }\n                })\n              }\n              return label;\n            }\n  }\n\n\n  return (\n  <>\n    <div className=\"attribute-filters d-flex justify-content-between position-relative\">\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n\n      <div className=\"d-flex\">\n        {/* Not sure if we are going to do text search\n        <div className=\"boxed-filter search-filter me-3\">\n          <TextSearch\n            value={filters.search || ''}\n            placeholder=\"Search\"\n            onUpdate={(val) => onChangeFilter('search', val)}\n            onClear={clearSearch}\n            delay={500}\n          />\n        </div>*/}\n\n        <div className=\"new-boxed-filter min-250 me-3\">\n\n            <TargetSelect\n              value={filters.attribute}\n              onChange={(val) => onChangeFilter('attribute', val)}\n              attributeGroups={choices.attribute}\n            />\n\n\n        </div>\n\n        <UncontrolledDropdown  className=\"simple-filters-dropdown me-2\">\n\n          <DropdownToggle  caret className=\"boxed-filter new-boxed-filter filter-group-dropdown\">\n            <FaIcon icon=\"filter\" size=\"1x\" className=\"fa-icons\" />\n          </DropdownToggle>\n\n          <DropdownMenu className=\"select-filters-dropdown animate dropDown\">\n            <div className=\"modal-body\">\n              <StackedFilter\n                placeholder=\"Any Type\"\n                label=\"Rule Type\"\n                param=\"type\"\n                options={choices.type || []}\n                value={filters.type || \"\"}\n                onChange={onChangeFilter}\n                isMulti={false}\n              />\n\n              <StackedFilter\n                placeholder=\"Any Vertical\"\n                label=\"Vertical\"\n                param=\"vertical\"\n                options={choices.vertical || []}\n                value={filters.vertical || \"\"}\n                onChange={onChangeFilter}\n                isMulti={false}\n              />\n              <StackedFilter\n                placeholder=\"Any Product\"\n                label=\"Product\"\n                param=\"product\"\n                options={choices.product || []}\n                value={filters.product || \"\"}\n                onChange={onChangeFilter}\n                isMulti={false}\n              />\n              <StackedFilter\n                placeholder=\"Any Status\"\n                label=\"Status\"\n                param=\"status\"\n                options={choices.status || []}\n                value={filters.status || []}\n                onChange={onChangeFilter}\n                isMulti={true}\n              />\n            </div>\n          </DropdownMenu>\n        </UncontrolledDropdown>\n\n      </div>\n\n      <RightDateAndControls onRefresh={onRefresh} onReset={reset} />\n\n    </div>\n\n    <FilterSummaryTags\n      choices={choices}\n      filters={filters}\n      filterKeys={['attribute', 'type', 'product', 'status', 'vertical']}\n      onRemoveFilter={clearFilter}\n      onClear={reset}\n      isLoading={loading}\n      isPendingApply={false}\n      fnGetLabel={getLabelForTag}\n    />\n  </>\n  );\n};\n\nexport default Filters;\n","import React, { useEffect, useState, useMemo } from 'react';\nimport {\n  Card,  Button, Row, Col\n} from 'reactstrap';\nimport {Link} from 'react-router-dom';\nimport PageSection from '../../../../Layout/PageSection';\nimport DocTitle from '../../../../Layout/DocTitle';\nimport useTableState from \"../../../../Hooks/useTableState\";\nimport useApi from '../../../../Hooks/useApi';\nimport RuleSearchApi from \"../RuleSearchApi\";\nimport {TargetGroupsDescription} from \"../../../../Components/Rules/TargetDescription\";\nimport FilterBar from \"../../../../Components/Table/FilterBar\";\nimport Filters from \"./Filters\";\nimport {titleCase, singularOrPlural} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport {Stack, RowDivider} from \"@thedmsgroup/mastodon-ui-components\";\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport StatusDot from \"../../../../Components/Icons/StatusDot\";\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\nimport './styles.scss';\nimport LoaderDots from \"../../../../Layout/LoaderDots\";\n\nconst RuleSearch = new RuleSearchApi();\n\nconst DefaultFilters = {\n}\n\nconst SearchByTarget = () => {\n  const {api} = useApi();\n  const [isLoading, setIsLoading] = useState(false);\n  const [list, setList] = useState([])\n  const [attributes, setAttributes] = useState([])\n  const {\n    filters, setFilters,  query\n  } = useTableState(\n    DefaultFilters,\n    {},\n    { useQueryString: true, useTableControls: false },\n  );\n\n  useEffect(() => {\n\n      if (query && !isLoading) {\n        load();\n      }\n  }, [query]);\n\n  const load = async() => {\n    setIsLoading(true);\n\n    //First load attributes needed for display\n    if (!attributes.length) {\n      const attrByGroup = await api.endpoints.attributes.list({\n        options: true, scope: 'routing',\n      });\n      if (attrByGroup) {\n        // Ungroup the attributeGroup data and store in attributes\n        const attr = {};\n        Object.entries(attrByGroup).map((group) => {\n          const groupName = group[0];\n          return group[1].map((a) => attr[a.alias] = { ...a, groupName });\n        });\n        setAttributes(attr);\n      }\n    }\n\n    //Load search results\n    const result = await RuleSearch.list(filters);\n    if (result) {\n      setList(result)\n    }\n    setIsLoading(false);\n  }\n\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Rule Search\" />\n\n      <FilterBar>\n        <Filters filters={filters} onChange={setFilters} onRefresh={() => load()} />\n      </FilterBar>\n\n      <PageSection\n        title=\"Rule Search\"\n        subtitle=\"by Target Attribute\"\n        className=\"rule-search-page\"\n      >\n\n      <div className=\"rule-search-container\">\n\n\n\n        {isLoading ? (\n          <div className=\"mt-5\">\n            <LoaderDots active={isLoading} width={120} />\n          </div>\n        ) : (\n          <>\n            {filters.attribute && list.length === 0 && (\n              <StandardAlert color=\"light\" icon=\"alert\" className=\"mb-0\">No rules were found</StandardAlert>\n            )}\n            {!filters.attribute && (\n              <StandardAlert color=\"light\" icon=\"alert\" className=\"mb-0\">Choose a targeting attribute in the target type dropdown</StandardAlert>\n            )}\n\n            {list.length > 0 && (\n              <Row>\n                <Col sm={12} md={9} lg={8}>\n                  {list.map((item, i) => (\n                    <RuleSearchResult\n                      data={item}\n                      attributes={attributes}\n                      filteredAttribute={filters.attribute}\n                      key={i}\n                    />\n                  ))}\n                </Col>\n\n              </Row>\n            )}\n\n          </>\n        )}\n\n      </div>\n      </PageSection>\n    </>\n  )\n}\n\nexport default SearchByTarget\n\n// const RuleTypeDisplayName = {\n//   order: 'Order',\n//   channel: 'Channel Routing',\n//   source: 'Source Routing',\n//   'vendor': 'Vendor Routing'\n// };\n\nconst RuleSearchResult = ({data, attributes, filteredAttribute}) => {\n  const [expanded, setExpanded] = useState (false);\n  const {type, resource, account, rule_matches} = data;\n\n  const toggleExpanded = () => setExpanded(!expanded);\n\n  const entityLink = useMemo(() => {\n    switch (type) {\n      case 'order':\n        return `/accounts/${account.id}/order/${resource.id}/rules`;\n      case 'source':\n        return `/publishing/sources/${resource.id}`\n      case 'channel':\n        return {\n          pathname: '/publishing/channels',\n          search: `search=${resource.id}`\n        }\n      case 'vendor':\n        return {\n          pathname: '/publishing/vendors',\n          search: `name=${resource.name}`\n        }\n    }\n  }, [type])\n\n  return (\n    <Card className=\"rule-search-result mb-3\">\n\n        <div className=\"d-flex\">\n          <div className=\"type-col me-3\">\n            <div className={`type ${type}`}>\n              {titleCase(type)}\n            </div>\n          </div>\n          <div className=\"data-col flex-fill\">\n              <div className=\"title d-flex align-items-center justify-content-between\">\n\n                <Button\n                  tag={Link}\n                  color=\"link\"\n                  className=\"inline\"\n                  to={entityLink}\n                  title={`View ${type}`}\n                  target=\"_blank\"\n                >\n                  {resource.name}\n                </Button>\n                {resource.status && (\n                  <div>\n                    {' '}<StatusDot status={resource.status} /> {titleCase(resource.status)}\n                  </div>\n                )}\n\n              </div>\n              {/* probably don't need subtitle for vendor */}\n              <div className=\"subtitle\">\n                {type === 'order' && account && <span>{account.name} | </span>}\n                {type !== 'vendor' && <span>{resource.vertical.display_name} | </span>}\n                {type !== 'vendor' && <span>{titleCase(resource.product)}</span>}\n              </div>\n            </div>\n\n        </div>\n\n      <div className=\"d-flex mt-1\">\n          <div className=\"type-col me-3\">\n            &nbsp;\n          </div>\n\n          <div className=\"data-col flex-fill\">\n            <Button\n              color=\"link\"\n              className=\"inline\"\n              onClick={toggleExpanded}\n              >\n              {rule_matches.length} {singularOrPlural(rule_matches.length, 'Rule', 'Rules')}\n              <span className=\"ms-1\">\n                <FaIcon icon={expanded ? \"chevron-circle-down\" : \"chevron-circle-right\"} size='sm' style={{color:\"#98a6ad\"}} />\n              </span>\n            </Button>\n\n            {expanded && (\n              <div className=\"rule-matches mt-1\">\n                <Stack divider={<RowDivider/>} >\n                  {rule_matches && rule_matches.map((match,i) => (\n                    <div className=\"match\" key={i}>\n                      <div className=\"mb-1\">\n                        <RuleLink\n                          type={type}\n                          resource={resource}\n                          account={account}\n                          rule={match}\n                        />\n                      </div>\n\n                      <TargetingSummary\n                        attributes={attributes}\n                        conditions={match.match_conditions}\n                        expression={match.match_expression}\n                        highlightAttribute={filteredAttribute}\n                      />\n                    </div>\n                  ))}\n                </Stack>\n\n              </div>\n            )}\n\n          </div>\n      </div>\n\n    </Card>\n  )\n}\n\nconst TargetingSummary = ({conditions, expression, attributes, highlightAttribute}) => {\n  const [expressionMode, setExpressionMode] = useState(false);\n  return(\n    <div className=\"targeting-summary ms-2\">\n      { expressionMode === false ? (\n        <TargetGroupsDescription groups={conditions} attributes={attributes} highlightAttribute={highlightAttribute} />\n      ) : (<div className=\"dont-break-out\">{expression}</div>)}\n\n      { expression && (\n        <div id=\"expression-toggler\">\n          <Button color=\"link\" className=\"inline\" size=\"xs\" onClick={() => setExpressionMode(!expressionMode)}>\n            [\n            {expressionMode === true ? 'Description' : 'Expression'}\n            ]\n          </Button>\n        </div>\n      )}\n    </div>\n  )\n}\nconst RuleLink = ({type, resource, account, rule}) => {\n  const ruleLink = useMemo(() => {\n    switch (type) {\n      case 'order':\n        return {\n          pathname: `/accounts/${account.id}/order/${resource.id}/rules`,\n          search: `tab=targeting&rule=${rule.id}`\n        };\n      case 'source':\n        return {\n          pathname: `/routing/source/${resource.id}/rules`,\n          search: `tab=targeting&rule=${rule.id}`\n        }\n      case 'channel':\n        return {\n          pathname: `/routing/channel/${resource.id}/rules`,\n          search: `tab=targeting&rule=${rule.id}`\n        }\n      case 'vendor':\n        return {\n          pathname: `/routing/vendor/${resource.id}/rules`,\n          search: `tab=targeting&rule=${rule.id}`\n        }\n    }\n  }, [])\n\n  return (\n    <Link\n      target=\"_blank\"\n      className=\"link\"\n      to={ruleLink}\n      title=\"View rule\"\n    >\n      {rule.label}\n    </Link>\n  )\n}\n","import React from 'react';\nimport { Routes, Route } from 'react-router-dom';\nimport Lazify from '../../utils/Lazify';\nimport MatchChecker from './Matching';\nimport AttributeList from './Attributes/List';\nimport InputSchema from \"./InputSchema\";\nimport Integrations from \"./Integrations\";\nimport ProtectedRoute from '../../Components/ProtectedRoute';\nimport SearchByTarget from \"./Rules/SearchByTarget\";\nimport NotFoundPage from '../../Layout/NotFoundPage'\n\n\nconst LazyDnc = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Dnc'));\nconst LazyDba = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Dba'));\nconst LazyPartners = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Partners'));\nconst LazyPermissions = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Permissions'));\nconst LazyPromotions = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Promotions'));\nconst LazyReturnRules = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './ReturnRules'));\nconst LazyRoles = Lazify(() => import(/* webpackChunkName: \"Tools\" */ './Roles'));\n\n\n/*\n * Entry point to all tools routes\n */\nconst Tools = () => (\n\n  <Routes>\n    <Route path=\"matching\" element={<ProtectedRoute permission=\"match_tool.view\" /> } >\n      <Route index element={<MatchChecker />} />\n    </Route>\n\n    <Route path=\"dba\" element={<ProtectedRoute permission=\"dbas.view\" /> } >\n      <Route index element={<LazyDba />} />\n    </Route>\n\n    <Route path=\"dnc\" element={<ProtectedRoute permission=\"dnc.edit\" /> } >\n      <Route index element={<LazyDnc />} />\n    </Route>\n\n    <Route path=\"partners\" element={<ProtectedRoute permission=\"partners.view\" /> } >\n      <Route index element={<LazyPartners />} />\n    </Route>\n\n    <Route path=\"integrations/*\" element={<ProtectedRoute permission=\"integrations.view\" /> } >\n      <Route path=\"*\" element={<Integrations />}/>\n    </Route>\n\n    <Route path=\"inputschema\" element={<ProtectedRoute permission=\"input_schema.edit\" /> } >\n      <Route index element={<InputSchema />} />\n    </Route>\n\n    <Route path=\"attributes\" element={<ProtectedRoute permission=\"attributes.edit\" /> } >\n      <Route index element={<AttributeList />} />\n    </Route>\n\n    <Route path=\"rules\" element={<ProtectedRoute permission=\"rules.search.view\" /> } >\n      <Route index element={<SearchByTarget />} />\n    </Route>\n\n    <Route path=\"permissions\" element={<ProtectedRoute permission=\"permissions.edit\" /> } >\n      <Route index element={<LazyPermissions />} />\n    </Route>\n\n    <Route path=\"promotions/*\" element={<ProtectedRoute permission=\"promotions.view\" /> } >\n      <Route path=\"*\" element={<LazyPromotions />} />\n    </Route>\n\n    <Route path=\"return-rules/*\" element={<ProtectedRoute permission=\"return_rules.view\" /> } >\n      <Route path=\"*\" element={<LazyReturnRules />} />\n    </Route>\n\n    <Route path=\"roles/*\" element={<ProtectedRoute permission=\"roles.edit\" /> } >\n      <Route path=\"*\" element={<LazyRoles />} />\n    </Route>\n\n    <Route path=\"*\" element={<NotFoundPage />} />\n  </Routes>\n\n);\n\nexport default Tools;\n","import React from 'react';\nimport { Navigate, Routes, Route } from 'react-router-dom';\nimport Lazify from '../utils/Lazify';\nimport AdvertiserManager from '../App/AdvertiserManager';\nimport PublisherManager from '../App/PublisherManager';\nimport LoadingBar from './LoadingBar';\nimport ReportsLanding from '../App/Reports/Landing';\nimport Tools from '../App/Tools';\nimport NotFoundPage from './NotFoundPage'\nimport './main_content.scss';\nimport ChangeLog from '../App/ChangeLog'\nimport {ChangeProvider} from '../Providers/ChangeProvider'\nimport ProtectedRoute from '../Components/ProtectedRoute';\nimport '../App/ChangeLog/styles.scss'\n\nconst LazyDashboard = Lazify(() => import(/* webpackChunkName: \"Dashboard\" */ '../App/Dashboard'));\nconst LazyAdManager = Lazify(() => import(/* webpackChunkName: \"AdManager\" */ '../App/AdManager'));\nconst LazyUserManager = Lazify(() => import(/* webpackChunkName: \"UserManager\" */ '../App/UserManager'));\nconst LazyMyProfileModal = Lazify(() => import(/* webpackChunkName: \"UserModals\" */ '../App/UserManager/User/MyProfileModal'));\nconst LazyMyPasswordModal = Lazify(() => import(/* webpackChunkName: \"UserModals\" */ '../App/UserManager/User/MyPasswordModal'));\nconst LazyTwoFactorModal = Lazify(() => import(/* webpackChunkName: \"UserModals\" */ '../App/UserManager/User/TwoFactorModal'));\nconst LazyChangeLog = Lazify(() => import(/* webpackChunkName: \"ChangeLog\" */ '../App/ChangeLog'));\nconst LazyAuctions = Lazify(() => import(/* webpackChunkName: \"Auctions\" */ '../App/Auctions'));\nconst LazyDeliveries = Lazify(() => import(/* webpackChunkName: \"Deliveries\" */ '../App/Deliveries'));\nconst LazyRouting = Lazify(() => import(/* webpackChunkName: \"Routing\" */ '../App/Routing'));\nconst LazyVerticals = Lazify(() => import(/* webpackChunkName: \"Routing\" */ '../App/Verticals'));\nconst LazyPreferences = Lazify(() => import(/* webpackChunkName: \"Preferences\" */ '../App/Preferences'));\nconst LazyNotifications = Lazify(() => import(/* webpackChunkName: \"Notifications\" */ '../App/Notifications'));\n\n/* Component for main content area */\nconst MainContent = () => {\n\n  return (\n    <ChangeProvider>\n    <main id=\"main-content\">\n\n        <LoadingBar name=\"main\" overlay={false} scrollToTop />\n\n        <Routes>\n          <Route index element={<Navigate to=\"/accounts\" />} />\n\n          <Route path=\"/accounts/*\" element={<AdvertiserManager />}  />\n\n          <Route path=\"/accounts/:accountId/ads/*\" element={ <LazyAdManager/>} />\n\n          <Route path=\"/accounts/:accountId/users/*\" element={<LazyUserManager />} />\n\n          <Route path=\"/publishing/*\" element={<PublisherManager/>} />\n\n          <Route path=\"/reports/*\"  element={<ReportsLanding />} />\n\n          <Route path=\"/routing/*\" element={<LazyRouting />} />\n\n          <Route path=\"/tools/*\" element={<Tools />} />\n\n          <Route path=\"/dashboard/*\" element={<LazyDashboard />} />\n\n          <Route path=\"/deliveries/*\" element={<LazyDeliveries />} />\n\n          <Route path=\"/changes/*\" element={<ChangeLog/>} />\n\n          <Route path=\"/auctions/*\" element={<ProtectedRoute permission=\"auctions.view\" /> } >\n            <Route index element={<LazyAuctions />} />\n          </Route>\n\n          <Route path=\"/verticals\" element={<ProtectedRoute permission=\"verticals.edit\" /> } >\n            <Route index element={<LazyVerticals />} />\n          </Route>\n\n          <Route path=\"/preferences/*\" element={<LazyPreferences />} />\n          <Route path=\"/notifications/*\" element={<LazyNotifications />} />\n          <Route path=\"/users/*\" element={<LazyUserManager />} />\n\n          <Route element={() => <Navigate to=\"/accounts\" />} />\n          <Route path=\"*\" element={<NotFoundPage />} />\n\n        </Routes>\n\n        <LazyMyProfileModal />\n        <LazyMyPasswordModal />\n        <LazyTwoFactorModal />\n\n\n      <div className=\"push-footer\" />\n    </main>\n    </ChangeProvider>\n  );\n};\n\nexport default MainContent;\n","import React, { useState, useEffect, useRef, useContext, FormEvent } from 'react';\nimport {\n  Row, Col, Form, FormGroup, Input, Button, Spinner,\n} from 'reactstrap';\nimport { StandardAlert } from '@thedmsgroup/mastodon-ui-components';\nimport OtpCodeInput from '../Components/Form/OtpCodeInput';\nimport { AppContext } from '../Providers/AppProvider';\n\ntype TwoFactorVerifyProps = {\n  pendingToken: string;\n  expiresAt?: string;\n  onVerified: (result: any) => void;\n  onCancel: () => void;\n};\n\nconst getSecondsRemaining = (expiresAt?: string): number => {\n  if (!expiresAt) return 300;\n  const diff = Math.floor((new Date(expiresAt).getTime() - Date.now()) / 1000);\n  return Math.max(diff, 0);\n};\n\nconst TwoFactorVerify = ({ pendingToken, expiresAt, onVerified, onCancel }: TwoFactorVerifyProps) => {\n  const app = useContext(AppContext);\n  const [isPosting, setIsPosting] = useState(false);\n  const [error, setError] = useState('');\n  const [timeRemaining, setTimeRemaining] = useState(() => getSecondsRemaining(expiresAt));\n  const [useRecoveryCode, setUseRecoveryCode] = useState(false);\n  const timerRef = useRef<ReturnType<typeof setInterval>>();\n\n  const toggleMode = () => {\n    setUseRecoveryCode((prev) => !prev);\n    setError('');\n  };\n\n  useEffect(() => {\n    timerRef.current = setInterval(() => {\n      setTimeRemaining((prev) => {\n        if (prev <= 1) {\n          clearInterval(timerRef.current);\n          setError('Your verification session has expired. Please log in again.');\n          return 0;\n        }\n        return prev - 1;\n      });\n    }, 1000);\n\n    return () => clearInterval(timerRef.current);\n  }, []);\n\n  const formatTime = (seconds: number): string => {\n    const mins = Math.floor(seconds / 60);\n    const secs = seconds % 60;\n    return `${mins}:${secs.toString().padStart(2, '0')}`;\n  };\n\n  const handleSubmit = async (code: string) => {\n    if (isPosting || timeRemaining <= 0) return;\n\n    setIsPosting(true);\n    setError('');\n\n    const result = await app.api.verify2fa(pendingToken, code);\n\n    if (!result) {\n      const apiError = app.api.error || {};\n      const errorCode = apiError.error;\n\n      if (errorCode === 'token_expired') {\n        clearInterval(timerRef.current);\n        setTimeRemaining(0);\n        setError('Your verification session has expired. Please log in again.');\n      } else if (errorCode === 'too_many_attempts') {\n        clearInterval(timerRef.current);\n        setError(apiError.message || 'Maximum attempts exceeded. Please log in again.');\n        setTimeout(() => onCancel(), 3000);\n      } else {\n        setError(apiError.message || 'Invalid verification code. Please try again.');\n      }\n\n      setIsPosting(false);\n    } else {\n      onVerified(result);\n    }\n  };\n\n  const handleFormSubmit = (evt: FormEvent<HTMLFormElement>) => {\n    evt.preventDefault();\n    const formEl = evt.target as HTMLFormElement;\n    const code = (formEl.elements.namedItem('code') as HTMLInputElement)?.value?.trim();\n    if (code) {\n      handleSubmit(code);\n    }\n  };\n\n  const expired = timeRemaining <= 0;\n\n  return (\n    <Row>\n      <Col sm={12} md={{ size: 4, offset: 4 }} className=\"entry-form-panel\">\n        <h5 className=\"text-center mb-3\">Two-Factor Authentication</h5>\n        <p className=\"text-center text-muted mb-3\">\n          {useRecoveryCode\n            ? 'Enter one of your saved recovery codes'\n            : 'Enter the 6-digit code from your authenticator app'}\n        </p>\n\n        {error && (\n          <StandardAlert color=\"warning\">{error}</StandardAlert>\n        )}\n\n        <Form onSubmit={handleFormSubmit}>\n          <FormGroup>\n            {useRecoveryCode ? (\n              <Input\n                type=\"text\"\n                name=\"code\"\n                placeholder=\"Recovery code\"\n                autoComplete=\"off\"\n                disabled={isPosting || expired}\n                invalid={!!error}\n                style={{ fontFamily: 'monospace', fontSize: '1.1rem', textAlign: 'center' }}\n              />\n            ) : (\n              <OtpCodeInput\n                onComplete={handleSubmit}\n                disabled={isPosting || expired}\n                invalid={!!error}\n              />\n            )}\n          </FormGroup>\n\n          {!expired && (\n            <p className=\"text-center text-muted small\">\n              Time remaining: {formatTime(timeRemaining)}\n            </p>\n          )}\n\n          <Button type=\"submit\" color=\"primary\" block disabled={isPosting || expired}>\n            {isPosting ? <Spinner color=\"light\" size=\"sm\" /> : <span>Verify</span>}\n          </Button>\n\n          <Button\n            size=\"sm\"\n            color=\"link\"\n            block\n            className=\"mt-1 no-case\"\n            onClick={toggleMode}\n            disabled={isPosting || expired}\n            type=\"button\"\n          >\n            {useRecoveryCode ? 'Use authenticator app instead' : 'Use a recovery code instead'}\n          </Button>\n\n          <Button\n            size=\"sm\"\n            color=\"link\"\n            block\n            className=\"mt-1 no-case\"\n            onClick={onCancel}\n          >\n            Back to Login\n          </Button>\n        </Form>\n      </Col>\n    </Row>\n  );\n};\n\nexport default TwoFactorVerify;\n","import React, { useState, useEffect, useRef, useContext } from 'react';\nimport { Row, Col } from 'reactstrap';\nimport { StandardAlert } from '@thedmsgroup/mastodon-ui-components';\nimport TwoFactorEnrollSteps from './TwoFactorEnrollSteps';\nimport { AppContext } from '../Providers/AppProvider';\n\ntype TwoFactorEnrollProps = {\n  pendingToken: string;\n  expiresAt?: string;\n  onEnrolled: (result: any) => void;\n  onCancel: () => void;\n};\n\nconst getSecondsRemaining = (expiresAt?: string): number => {\n  if (!expiresAt) return 300;\n  const diff = Math.floor((new Date(expiresAt).getTime() - Date.now()) / 1000);\n  return Math.max(diff, 0);\n};\n\nconst formatTime = (seconds: number): string => {\n  const mins = Math.floor(seconds / 60);\n  const secs = seconds % 60;\n  return `${mins}:${secs.toString().padStart(2, '0')}`;\n};\n\nconst TwoFactorEnroll = ({ pendingToken, expiresAt, onEnrolled, onCancel }: TwoFactorEnrollProps) => {\n  const app = useContext(AppContext);\n  const [timeRemaining, setTimeRemaining] = useState(() => getSecondsRemaining(expiresAt));\n  const timerRef = useRef<ReturnType<typeof setInterval>>();\n\n  useEffect(() => {\n    timerRef.current = setInterval(() => {\n      setTimeRemaining((prev) => {\n        if (prev <= 1) {\n          clearInterval(timerRef.current);\n          return 0;\n        }\n        return prev - 1;\n      });\n    }, 1000);\n\n    return () => clearInterval(timerRef.current);\n  }, []);\n\n  const expired = timeRemaining <= 0;\n\n  return (\n    <Row>\n      <Col sm={12} md={{ size: 4, offset: 4 }} className=\"entry-form-panel\">\n        <h5 className=\"text-center mb-3\">Set Up Two-Factor Authentication</h5>\n        <p className=\"text-center text-muted mb-3\">\n          Your account requires two-factor authentication. Please set it up to continue.\n        </p>\n\n        {expired && (\n          <StandardAlert color=\"warning\">\n            Your session has expired. Please log in again.\n          </StandardAlert>\n        )}\n\n        {!expired && (\n          <p className=\"text-center text-muted small mb-3\">\n            Time remaining: {formatTime(timeRemaining)}\n          </p>\n        )}\n\n        <TwoFactorEnrollSteps\n          onEnroll={() => app.api.enrollPending(pendingToken)}\n          onConfirm={(code) => app.api.confirmEnrollPending(pendingToken, code)}\n          onSuccess={onEnrolled}\n          onBack={onCancel}\n          disabled={expired}\n        />\n      </Col>\n    </Row>\n  );\n};\n\nexport default TwoFactorEnroll;\n","import React, {\n  useEffect, useRef, useContext, useReducer,\n} from 'react';\nimport { useNavigate, useLocation, useSearchParams } from 'react-router-dom';\nimport { Link } from 'react-router-dom';\nimport {\n  Row, Col, Form, FormGroup, FormFeedback, Input, Button, Spinner,\n} from 'reactstrap';\n// eslint-disable-next-line import/no-extraneous-dependencies -- installed via @thedmsgroup/mastodon-ui-components\nimport { toast } from 'react-toastify';\nimport PropTypes from 'prop-types';\nimport { formatDuration } from 'date-fns';\nimport PasswordWithToggle from '../Components/Form/PasswordWithToggle';\nimport {notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport DocTitle from '../Layout/DocTitle';\nimport { AppContext } from '../Providers/AppProvider';\nimport TwoFactorVerify from './TwoFactorVerify';\nimport TwoFactorEnroll from './TwoFactorEnroll';\n\nconst loginStateReducer = (state, action) => {\n  switch (action.type) {\n    case 'activated':\n      // for showing activation message\n      return { ...state, activated: true };\n    case 'invalidForm':\n      return {\n        ...state, isPosting: false, isValid: false, formError: action.error, activated: false,\n      };\n    case 'success':\n      return { ...state, isPosting: false, isValid: true };\n    case 'fail':\n      return {\n        ...state, isPosting: false, isValid: false, formError: action.error,\n      };\n    case 'posting':\n      return {\n        ...state, isPosting: true, isValid: true, formError: '', activated: false,\n      };\n    case 'two_factor_required':\n      return {\n        ...state,\n        isPosting: false,\n        isValid: true,\n        formError: '',\n        twoFactorRequired: true,\n        pendingToken: action.pendingToken,\n        expiresAt: action.expiresAt,\n      };\n    case 'two_factor_reset':\n      return {\n        ...state,\n        twoFactorRequired: false,\n        pendingToken: null,\n        expiresAt: null,\n      };\n    case 'two_factor_enrollment_required':\n      return {\n        ...state,\n        isPosting: false,\n        isValid: true,\n        formError: '',\n        twoFactorEnrollmentRequired: true,\n        pendingToken: action.pendingToken,\n        expiresAt: action.expiresAt,\n      };\n    case 'two_factor_enrollment_reset':\n      return {\n        ...state,\n        twoFactorEnrollmentRequired: false,\n        pendingToken: null,\n        expiresAt: null,\n      };\n    default:\n      return state;\n  }\n};\n\nconst Login = () => {\n  const app = useContext(AppContext);\n  const navigate = useNavigate();\n  const location = useLocation();\n  const [searchParams] = useSearchParams();\n\n  const [loginState, dispatch] = useReducer(loginStateReducer, { isPosting: false, isValid: true, formError: '' });\n\n  const inputRef = useRef();\n\n  // Do on mount\n  useEffect(() => {\n\n    if (inputRef.current) {\n      inputRef.current.focus();\n    }\n\n    if (app.authError) {\n      notify(app.authError, 'warning', { autoClose: false, delay: 500 });\n    }\n\n    if (location.state && location.state.activated) {\n      dispatch({ type: 'activated' });\n    }\n\n    // unmount\n    return () => {\n      toast.dismiss();\n    };\n  }, []);\n\n  // Redirect when authorized or if we come here already authorized\n  useEffect(() => {\n    if (app.isAuthorized) {\n      //Check for redir param, location referrer, or go to accounts\n      let redir;\n      if (searchParams.has('redir')) {\n        redir = decodeURIComponent(searchParams.get('redir'));\n        if (!redir || redir === '/' || redir === '/login') {\n          redir = '/accounts';\n        }\n      } else {\n        redir = location.state?.from || '/accounts'\n      }\n\n     // setRedirect(redir);\n      navigate(redir, { replace: true });\n    } else {\n      app.authReady();\n    }\n  }, [app.isAuthorized]);\n\n  const handleChange = () => {\n    toast.dismiss();\n  };\n\n  const handleSubmit = (evt) => {\n    evt.preventDefault();\n    if (loginState.isPosting) return;\n    const email = evt.target.email.value.trim();\n    const password = evt.target.password.value;\n\n    if (!email || !password) {\n      // not validating individual fields\n      dispatch({ type: 'invalidForm', error: 'Email and password are required' });\n    } else {\n      execLogin({email, password});\n    }\n  };\n\n  const execLogin = async (credentials) => {\n    dispatch({ type: 'posting' });\n    const result = await app.api.login(credentials);\n    if (!result) {\n\n      const error = app.api.error ?? {}\n      let errorMessage = error.message ?? 'Invalid email or password. Please try again.'\n\n        // Check if the error is due to account lockout\n        if (error.reason === 'account_locked' && error.lockout_duration_minutes) {\n          const minutes = error.lockout_duration_minutes;\n\n          // Format the duration nicely\n          let duration;\n          if (minutes < 60) {\n            duration = `${minutes} minute${minutes !== 1 ? 's' : ''}`;\n          } else if (minutes === 60) {\n            duration = '1 hour';\n          } else {\n            const hours = Math.floor(minutes / 60);\n            const remainingMinutes = minutes % 60;\n\n            if (remainingMinutes === 0) {\n              duration = `${hours} hour${hours !== 1 ? 's' : ''}`;\n            } else {\n              // Use date-fns formatDuration for complex durations\n              duration = formatDuration(\n                { hours, minutes: remainingMinutes },\n                { format: ['hours', 'minutes'] }\n              );\n            }\n          }\n\n          errorMessage = `Too many login attempts. For security reasons your account has been locked for ${duration}.`;\n        }\n\n\n      if (error.reason === 'password_expired') {\n        errorMessage = 'Your password has expired and must be reset';\n        if (error.token) {\n          navigate(`/reset-password/${error.token}?expired=1`, { replace: true, state:{expired:true} });\n        }\n      }\n\n      dispatch({ type: 'fail', error: errorMessage });\n\n    } else if (result['2fa_required']) {\n      dispatch({\n        type: 'two_factor_required',\n        pendingToken: result.auth_token,\n        expiresAt: result.expires_at,\n      });\n    } else if (result['2fa_enrollment_required']) {\n      dispatch({\n        type: 'two_factor_enrollment_required',\n        pendingToken: result.auth_token,\n        expiresAt: result.expires_at,\n      });\n    } else {\n      dispatch({ type: 'success' });\n      app.onLogin(result);\n\n      return false;\n    }\n  }\n\n  const handleTwoFactorVerified = (result) => {\n    dispatch({ type: 'success' });\n    // verify-2fa returns {auth_token, expiration_date}, not the full /me response.\n    // Set the token and let authorize() fetch the full user data.\n    app.onTwoFactorVerified(result.auth_token);\n  };\n\n  const handleTwoFactorCancel = () => {\n    dispatch({ type: 'two_factor_reset' });\n  };\n\n  const handleEnrolled = (result) => {\n    dispatch({ type: 'success' });\n    app.onTwoFactorVerified(result.auth_token);\n  };\n\n  const handleEnrollmentCancel = () => {\n    dispatch({ type: 'two_factor_enrollment_reset' });\n  };\n\n  if (loginState.twoFactorEnrollmentRequired) {\n    return (\n      <>\n        <DocTitle pageTitle=\"Set Up Two-Factor Authentication\" />\n        <TwoFactorEnroll\n          pendingToken={loginState.pendingToken}\n          expiresAt={loginState.expiresAt}\n          onEnrolled={handleEnrolled}\n          onCancel={handleEnrollmentCancel}\n        />\n      </>\n    );\n  }\n\n  if (loginState.twoFactorRequired) {\n    return (\n      <>\n        <DocTitle pageTitle=\"Two-Factor Authentication\" />\n        <TwoFactorVerify\n          pendingToken={loginState.pendingToken}\n          expiresAt={loginState.expiresAt}\n          onVerified={handleTwoFactorVerified}\n          onCancel={handleTwoFactorCancel}\n        />\n      </>\n    );\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Sign In to Mastodon\" />\n      <Row>\n        <Col sm={12} md={{ size:4, offset:4 }} className=\"entry-form-panel\">\n          <Form onSubmit={handleSubmit}>\n            { loginState.activated && <StandardAlert color=\"success\" icon=\"check\">Your account has been activated. Please sign in.</StandardAlert>}\n\n            { !loginState.isValid && (<StandardAlert color=\"warning\">{loginState.formError}</StandardAlert>)}\n\n            <FormGroup>\n              <Input\n                type=\"text\"\n                name=\"email\"\n                placeholder=\"Email Address\"\n                innerRef={inputRef}\n                onChange={handleChange}\n              />\n              <FormFeedback>Email address is required</FormFeedback>\n            </FormGroup>\n\n            <FormGroup>\n              <PasswordWithToggle\n                name=\"password\"\n                placeholder=\"Password\"\n                onChange={handleChange}\n                error=\"Password is required\"\n              />\n              <FormFeedback>Password is required</FormFeedback>\n            </FormGroup>\n\n            <Button type=\"submit\" color=\"primary\" block disabled={loginState.isPosting}>\n              { loginState.isPosting === true ? (\n                <Spinner color=\"light\" size=\"sm\" />\n              ) : <span>Sign In</span>}\n            </Button>\n\n            <Button size=\"sm\" color=\"link\" tag={Link} to=\"/forgot-password\" block className=\"mt-2 no-case\">Forgot password?</Button>\n\n          </Form>\n        </Col>\n      </Row>\n\n    </>\n\n  );\n};\n\nLogin.propTypes = {\n  location: PropTypes.object,\n};\n\nexport default Login;\n","import React, { useState, useContext } from 'react';\nimport {\n  Row, Col, Form, FormGroup, Input, Button, Spinner,\n} from 'reactstrap';\nimport { Link, Navigate } from 'react-router-dom';\nimport * as Yup from 'yup';\nimport {StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport useFormState from '../Hooks/useFormState';\nimport { AppContext } from '../Providers/AppProvider';\nimport DocTitle from '../Layout/DocTitle';\n\nconst validationSchema = Yup.object().shape({\n  email: Yup.string().trim()\n    .email('The email address is not valid')\n    .required('Please enter an email address'),\n});\n\n/*\n * Component with form that submits email to begin password reset process\n */\nconst ForgotPassword = () => {\n  const app = useContext(AppContext);\n  const [isPosting, setIsPosting] = useState(false);\n  const [submitError, setSubmitError] = useState(false);\n  const [submitSuccess, setSubmitSuccess] = useState(false);\n  const [email, setEmail] = useState('');\n\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState({ email: '' }, validationSchema);\n\n  const handleSubmit = (evt) => {\n    evt.preventDefault();\n    if (isPosting) return;\n    setSubmitError(false);\n    const isValid = formApi.validate();\n    if (isValid) {\n      setEmail(email);\n      setIsPosting(true);\n      submitRequest(email);\n    }\n  };\n\n  const submitRequest = async () => {\n    const result = await app.api.requestPasswordReset(formValues.email.trim());\n    setIsPosting(false);\n    if (result) {\n      setSubmitSuccess(true);\n    } else {\n      // Generic response for bad or unknown email, status 400, name:\"Invalid Request\".\n      // For security purposes we show \"success\" even for unknown email\n      if (app.api.error.status === 400) {\n        setSubmitSuccess(true);\n      } else {\n        // some problem with the network or api\n        setSubmitError(true);\n      }\n    }\n  };\n\n  // We should not be here\n  if (app.isAuthorized) {\n    // or this.props.history.goBack() ?\n    return <Navigate to=\"/accounts\" replace={true} />;\n  }\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Forgot Password\" />\n      <Row>\n        <Col sm={12} md={{ size:4, offset:4 }} className=\"entry-form-panel\">\n          <h4>Forgot your password?</h4>\n          <p>Enter the email address associated with your account to request a password reset.</p>\n          <Form onSubmit={handleSubmit}>\n\n            { formErrors.email && (\n              <StandardAlert color=\"warning\">\n                {formErrors.email}\n              </StandardAlert>\n            )}\n\n            { submitError === true && (\n              <StandardAlert color=\"warning\">\n                There was a problem submitting your request. Please try again.\n              </StandardAlert>\n            )}\n\n            { submitSuccess === true && (\n              <StandardAlert color=\"info\" icon=\"check\">\n                Request received. If a matching account was found, an email was sent to\n                {' '}\n                {email}\n                {' '}\n                to allow you to reset your password.\n              </StandardAlert>\n            ) }\n\n            <FormGroup>\n\n              <Input\n                type=\"text\"\n                name=\"email\"\n                onChange={formApi.handleOnChange}\n                value={formValues.email}\n                placeholder=\"Email Address\"\n                disabled={submitSuccess}\n                bsSize=\"lg\"\n              />\n\n            </FormGroup>\n\n            <Button type=\"submit\" color=\"primary\" size=\"sm\" block disabled={isPosting || submitSuccess}>\n              { isPosting === true ? (\n                <Spinner color=\"light\" size=\"sm\" />\n              ) : <span>Reset Password</span>}\n            </Button>\n            <Button size=\"sm\" color=\"link\" tag={Link} to=\"/login\" block className=\"mt-2 no-case\">\n              Return to sign-in\n            </Button>\n\n          </Form>\n        </Col>\n      </Row>\n\n\n    </>\n\n  );\n};\n\nexport default ForgotPassword;\n","import React, { useState, useContext } from 'react';\nimport { Row, Col, Form, Button, Spinner } from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport { Navigate, useNavigate, useParams, useSearchParams, useLocation } from 'react-router-dom';\nimport * as Yup from 'yup';\nimport {StandardAlert, notify} from \"@thedmsgroup/mastodon-ui-components\";\nimport PasswordEntry from '../Components/Form/PasswordEntry';\nimport PasswordRules from './UserManager/User/PasswordRules';\nimport useFormState from '../Hooks/useFormState';\nimport { AppContext } from '../Providers/AppProvider';\nimport DocTitle from '../Layout/DocTitle';\n\nconst validationSchema = Yup.object().shape({\n  password: Yup.string()\n    .test({\n      name: 'pw-length',\n      message: ({ value }) =>\n        `Password must be at least 15 characters. Current length: ${value ? value.length : 0}`,\n      test: (value) => {\n        if (!value) return true; // Allow empty string if not required elsewhere\n        return value.length >= 15;\n      },\n    })\n    .required('Please enter a new password'),\n  confirm_password: Yup.string()\n    .oneOf([Yup.ref('password'), null], 'Passwords must match (please confirm)'),\n});\n\n// with length checks:  https://www.reactnativeschool.com/build-and-validate-forms-with-formik-and-yup/checking-field-equality-confirm-password\n\nconst ResetPassword = () => {\n  const app = useContext(AppContext);\n  const navigate = useNavigate();\n  const [searchParams] = useSearchParams();\n  const {resetToken:token} = useParams();\n  const location = useLocation();\n  const isPasswordExpiration = ( searchParams.get('expired') || location.state?.expired) ;\n  const initialFormValues = { password: '', confirm_password: '' };\n  const { formApi, formValues, formErrors } = useFormState(initialFormValues, validationSchema);\n  const [isPosting, setIsPosting] = useState(false);\n  const [resetError, setResetError] = useState(false);\n  const [tokenExpiredError, setTokenExpiredError] = useState(false);\n  const [tokenInvalidError, setTokenInvalidError] = useState(false);\n  const [passwordRuleErrors, setPasswordRuleErrors] = useState([]);\n\n  if (app.isAuthorized) {\n    return <Navigate to=\"/accounts\" replace />\n  }\n  if (!token) {\n    return <Navigate to=\"/login\" replace />\n  }\n\n  const submitRequest = async (password) => {\n    const result = await app.api.resetPassword(token, password);\n\n    setIsPosting(false);\n    if (result) {\n      setPasswordRuleErrors([]);\n      notify('Your password has been updated. Please sign in.', 'success', { autoClose: 5000 });\n      navigate('/login', { replace: true });\n    } else {\n      //404 if token not found\n      const err = app.api.error;\n\n      if (err.status === 404) {\n        setTokenInvalidError(true);\n      } else if (err.form) {\n\n          // The token expiration error is in an array and has blank for a key\n          if (Array.isArray(err.form[\"global\"]) && err.form[\"global\"].length) {\n\n            if (err.form[\"global\"][0].indexOf('expired') > 0) {\n              setTokenExpiredError(true);\n            } else if (err.form[\"global\"][0].indexOf('password must be different') > 0) {\n              //This error comes from symfony exception rather than PasswordValidator\n              //but we are treating it as a password rule error\n              setResetError('The new password does not meet security requirements.');\n              setPasswordRuleErrors([err.form[\"global\"][0]]);\n            } else {\n              setResetError(`Unable to update Password: ${err.form[\"global\"][0]}`);\n            }\n          } else if (err.form.password) {\n            setResetError('The new password does not meet security requirements.');\n            setPasswordRuleErrors(err.form.password.split('|'));\n          }\n      } else {\n        setResetError(`Unable to updatePassword: ${err.message}`);\n      }\n\n    }\n  };\n\n  const handleSubmit = (evt) => {\n    evt.preventDefault();\n    if (isPosting) return;\n    setResetError(false);\n    setTokenExpiredError(false);\n    setTokenInvalidError(false);\n    setPasswordRuleErrors([]);\n    const isValid = formApi.validate();\n    if (isValid) {\n      setIsPosting(true);\n      submitRequest(evt.target.password.value);\n    }\n  };\n\n\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Reset Password\" />\n\n      <Row>\n        <Col sm={12} md={{ size:6, offset:3 }} className=\"entry-form-panel\">\n          <h4>Reset Password</h4>\n\n          { !token && (<StandardAlert color=\"warning\">A reset token is required. <Button size=\"sm\" color=\"link\" tag={Link} to=\"/forgot-password\"  className=\"inline\">\n            Request Password Reset\n          </Button></StandardAlert>)}\n\n          { resetError && (\n            <StandardAlert color=\"warning\">\n              {resetError}\n            </StandardAlert>\n          )}\n\n          { tokenExpiredError === true && (\n            <StandardAlert color=\"warning\">\n              We were unable to reset your password. The reset link has expired.\n              Please <Link to=\"/forgot-password\">request another reset</Link>.\n            </StandardAlert>\n          )}\n\n          { tokenInvalidError === true && (\n            <StandardAlert color=\"warning\">\n              We were unable to reset your password. The reset link is invalid.\n              Please <Link to=\"/forgot-password\">request another reset</Link>.\n            </StandardAlert>\n          )}\n\n          {isPasswordExpiration && (\n            <p>Your password has expired and must be changed. This is a security measure\n              {' '} to prevent unauthorized access to your account.</p>\n          )}\n\n          <div className=\"d-flex\">\n\n            <div className=\"flex-grow-1\">\n              <Form onSubmit={handleSubmit}>\n\n                <PasswordEntry\n                  password={formValues.password}\n                  confirmPassword={formValues.confirm_password}\n                  onChange={formApi.handleOnChange}\n                  errors={formErrors}\n                  options={{ noLabel: true }}\n                />\n\n                <Button type=\"submit\" color=\"primary\" block disabled={isPosting} size=\"sm\">\n                  { isPosting === true ? (\n                    <Spinner color=\"light\" size=\"sm\" />\n                  ) : <span>Reset Password</span>}\n                </Button>\n\n                <Button size=\"sm\" color=\"link\" tag={Link} to=\"/login\" block className=\"mt-2 no-case\">\n                  Return to sign-in\n                </Button>\n\n\n              </Form>\n            </div>\n\n            <div className=\"ms-4\">\n              <PasswordRules errors={passwordRuleErrors} isExpiration={isPasswordExpiration}/>\n            </div>\n          </div>\n        </Col>\n      </Row>\n\n\n\n    </>\n\n  );\n};\n\nexport default ResetPassword;\n","import React, {\n  useState, useEffect, useReducer, useContext,\n} from 'react';\nimport { Row, Col, Form, Button, Spinner } from 'reactstrap';\nimport { Link, useParams } from 'react-router-dom';\nimport {Navigate, useNavigate} from \"react-router-dom\";\nimport * as Yup from 'yup';\nimport {StandardAlert, notify} from \"@thedmsgroup/mastodon-ui-components\"\nimport PasswordEntry from '../Components/Form/PasswordEntry';\nimport useFormState from '../Hooks/useFormState';\nimport { AppContext } from '../Providers/AppProvider';\nimport DocTitle from '../Layout/DocTitle';\nimport PasswordRules from './UserManager/User/PasswordRules';\n\nconst validationSchema = Yup.object().shape({\n  password: Yup.string()\n    //disabled strength test for now\n    // .test('passwordStrength', 'Please strengthen your password', function (pw) {\n    //   // return pw ? this.options.context.passwordScore >= 3 : true;\n    //   return true;\n    // })\n    //.min(15, 'Passwords must have 15 or more characters')\n    .test({\n      name: 'pw-length',\n      message: ({ value }) =>\n        `Password must be at least 15 characters. Current length: ${value ? value.length : 0}`,\n      test: (value) => {\n        if (!value) return true; // Allow empty string if not required elsewhere\n        return value.length >= 15;\n      },\n    })\n    .required('Please enter a new password'),\n  confirm_password: Yup.string()\n    .oneOf([Yup.ref('password'), null], 'Passwords must match (please confirm)'),\n});\n\nconst activationStateReducer = (state, action) => {\n  switch (action.type) {\n    // case 'invalidForm':\n    //  return {...state, isPosting:false, isValid:false, formError:action.error};\n    case 'activationUnknown':\n      return { ...state, isPosting: false, status: 'unknown' };\n    case 'activationLoaded':\n      let status = 'pending';\n      if (action.data.user_verified) {\n        status = 'verified';\n      } else if (action.data.is_expired) {\n        status = 'expired';\n      }\n\n       return { ...state, isPosting: false, status };\n    case 'success':\n      return {\n        ...state, isPosting: false, isValid: true, result: 'success', formError: '', passwordRuleErrors: [],\n      };\n    case 'fail': // error from server\n      return {\n        ...state, isPosting: false, isValid: true, result: 'fail', formError: action.error, passwordRuleErrors: [],\n      };\n    case 'password_fail': // error from server about password rules\n      return {\n        ...state, isPosting: false, isValid: true, result: 'password_fail', formError: '', passwordRuleErrors: action.error ? action.error.split('|') : [],\n      };\n    case 'posting':\n      return {\n        ...state, isPosting: true, isValid: true, formError: '', result: '',\n      };\n    default:\n      return state;\n  }\n};\n\nconst ActivateUser = () => {\n\n  const app = useContext(AppContext);\n  const navigate = useNavigate();\n  const {activationToken:token} = useParams();\n  const initialFormValues = { password: '', confirm_password: '' };\n  const [activationState, dispatch] = useReducer(activationStateReducer, {\n    isPosting: false,\n    isValid: true,\n    formError: '',\n    passwordRuleErrors: [],\n    status: 'loading',\n  });\n  const { formApi, formValues, formErrors } = useFormState(initialFormValues, validationSchema);\n  const [activationInfo, setActivationInfo] = useState(null);\n\n  if (app.isAuthorized) {\n    return <Navigate to=\"/accounts\" replace={true} />;\n  }\n  if (!token) {\n    return <Navigate to=\"/login\" replace={true} />;\n  }\n\n  // Get activation on load\n  useEffect(() => {\n    if (!activationInfo) {\n      getActivationInfo();\n    }\n  }, []);\n\n  // When the score changes, update the validation context\n  // (extra data used during validation)\n  // useEffect(() => {\n  //   formApi.setValidationContext({ passwordScore });\n  // }, [passwordScore]);\n\n  const getActivationInfo = async () => {\n    if (token) {\n      const activation = await app.api.endpoints.activations.show(token);\n      if (activation) {\n        setActivationInfo(activation);\n        dispatch({ type: 'activationLoaded', data: activation });\n      } else {\n        dispatch({ type: 'activationUnknown' });\n      }\n    }\n  };\n\n  const submitRequest = async (password) => {\n    dispatch({ type: 'posting' });\n    const result = await app.api.endpoints.activations.update({ id: token, password });\n    if (result) {\n      dispatch({ type: 'success' });\n      notify('Your account has been activated. Please sign in.', 'success', { autoClose: 5000 });\n      navigate('/login', { replace: true, state: { activated: true } });\n    } else {\n      const err = app.api.error;\n      if (err.form.password) {\n        dispatch({ type: 'password_fail', error: err.form.password });\n      } else {\n        dispatch({ type: 'fail', error: 'We were unable to submit your request. Please try again.' });\n      }\n    }\n  };\n\n  const handleSubmit = (evt) => {\n    evt.preventDefault();\n    if (activationState.isPosting) return;\n    const isValid = formApi.validate();\n    if (isValid) {\n      submitRequest(evt.target.password.value);\n    } else {\n      // no special messaging, form fields will show error\n      // dispatch({type:'invalidForm', error:'We '})\n    }\n  };\n\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Activate\" />\n\n      <Row>\n        <Col sm={12} md={{ size: 6, offset: 3 }} className=\"entry-form-panel h-100\">\n          {/* Getting activation info */}\n          {activationState.status === 'loading' && <div className=\"d-flex align-items-center justify-content-center\" style={{ height: '250px' }}>\n            <div>\n              <Spinner color=\"secondary\" size=\"lg\" />\n            </div>\n          </div>\n          }\n\n          {activationState.status === 'verified' && (\n            <>\n              <h5>Welcome</h5>\n              <StandardAlert color=\"warning\">Account Verified</StandardAlert>\n              <p>\n                According to our records, your account has already been verified. Please\n                &nbsp;<Link to=\"/login\">sign in</Link>\n                , or&nbsp;\n                <Link to=\"/forgot-password\">reset your password</Link>\n                {' '}\n                if you have forgotten it.\n              </p>\n            </>\n          )}\n\n          {activationState.status === 'expired' && (\n            <>\n              <h5>Welcome</h5>\n              <StandardAlert color=\"warning\">Activation Link Expired</StandardAlert>\n              <p>\n                We&apos;re sorry, your activation link has expired. Please contact your Mastodon account manager or\n                &nbsp;<a href=\"mailto:support@app.platform.ue.co\">UE.co customer service</a>\n                .\n              </p>\n              <Button size=\"sm\" color=\"link\" tag={Link} to=\"/login\" block className=\"mt-2 no-case\">\n                Return to sign-in\n              </Button>\n            </>\n          )}\n\n          {activationState.status === 'unknown' && (\n            <>\n              <h5>Activate My Account</h5>\n              <StandardAlert color=\"warning\">Unknown Activation</StandardAlert>\n              <p>\n                We&apos;re sorry, we were unable to find your activation record. Please contact your Mastodon account manager or\n                {' '}<a href=\"mailto:support@app.platform.ue.co\">UE.co customer service</a>\n                .\n              </p>\n              <Button size=\"sm\" color=\"link\" tag={Link} to=\"/login\" block className=\"mt-2 no-case\">\n                Return to sign-in\n              </Button>\n            </>\n          )}\n\n          {/* All good, show the form */}\n          {activationState.status === 'pending' && (\n            <>\n              <h4>Welcome</h4>\n              <p className=\"mb-4\">To activate your account, please enter and confirm a password.</p>\n\n              { !activationState.isValid && (<StandardAlert color=\"warning\">{activationState.formError}</StandardAlert>)}\n              { activationState.result === 'fail' && (\n                <StandardAlert color=\"warning\">\n                  We were unable to activate your account.\n                  Please try again, or contact your Mastodon account manager or <a href=\"mailto:support@app.platform.ue.co\">DMS Group customer service</a>.\n                </StandardAlert>\n              )}\n              { activationState.result === 'password_fail' && (\n                <StandardAlert color=\"warning\">\n                  The submitted password does not meet security requirements.\n                </StandardAlert>\n              )}\n\n              <div className=\"d-flex mt-2\">\n                <div className=\"flex-grow-1\">\n                  <Form onSubmit={handleSubmit}>\n\n\n                    <PasswordEntry\n                      password={formValues.password}\n                      confirmPassword={formValues.confirm_password}\n                      onChange={formApi.handleOnChange}\n                      errors={formErrors}\n                      options={{ noLabel: true }}\n                      bsSize=\"lg\"\n                    />\n\n                    <Button type=\"submit\" color=\"primary\" block disabled={activationState.isPosting}>\n                      { activationState.isPosting === true ? (\n                        <Spinner color=\"light\" size=\"sm\" />\n                      ) : <span>Activate My Account</span>}\n                    </Button>\n\n                    <Button size=\"sm\" color=\"link\" tag={Link} to=\"/Login\" block className=\"mt-2 no-case\">\n                      Return to sign-in\n                    </Button>\n\n                  </Form>\n                </div>\n\n                <div className=\"ms-4\">\n                  <PasswordRules errors={activationState.passwordRuleErrors} />\n                </div>\n              </div>\n\n            </>\n          )}\n        </Col>\n      </Row>\n    </>\n  );\n};\n\nexport default ActivateUser;\n","// There are unlikely to change any time soon, so hard-coding\n// for crafting example JSONs are fine.\nconst piiFields = [\n  'first_name',\n  'last_name',\n  'address',\n  'address2',\n  'phone',\n  'email',\n];\n\nconst getPing = (token, schema) => {\n  return {\n    source_token: token,\n    data: schema,\n  }\n}\n\nconst getPingPost = (schema) => {\n  let j = {\n    \"data\": {},\n    \"accepted_bid_ids\": [\n      1,\n    ],\n    \"accepted_buyers\": [\n      \"Acme Enterprises\",\n    ],\n  }\n\n  if (!schema) return j;\n\n  Object.keys(schema).map(key => {\n    if (piiFields.includes(key)) {\n      j.data[key] = schema[key]\n    }\n  })\n\n  // The sample payload only carries the fields the source asks for, which may not\n  // include any of the PII fields above. Showing the whole payload beats showing\n  // an empty one — the step is still about what to send once a bid is accepted.\n  if (!Object.keys(j.data).length) {\n    j.data = schema\n  }\n\n  return j\n};\n\nconst ResponseScenarios = {\n  ping: [\n    {\n      label: 'Ping Success',\n      description: \"\",\n      data: {\n        \"auction_id\": \"1b531973-36d2-44cc-9af2-dd32c1333c64\",\n        \"expires_at\": \"2024-12-19T23:30:50.95226922Z\",\n        \"payout\": 0,\n        \"sold\": null,\n        \"matched\": true,\n        \"bid_amount\": 3.3,\n        \"time_ms\": 324,\n        \"data_issues\": {}\n      }\n    },\n    {\n      label: 'Legs Ping Success',\n      description: `\"Legs\" are sales to multiple buyers. This ping returned 2 bids, one exclusive and one shared. You are free to accept either bid by including the bid_id in the accepted_bids of your POST request. If you don't specify accepted_bids, the bids in default_accepted_bid_ids will be accepted by default. In most cases this is what you want.`,\n      data: {\n        \"auction_id\": \"1b531973-36d2-44cc-9af2-dd32c1333c64\",\n        \"bids\":\n          [\n            {\n              \"bid_id\": 1,\n              \"buyer_name\": \"Acme Enterprises\",\n              \"exclusive\": true,\n              \"bid_amount\": 3.3,\n              \"sold\": null,\n            },\n            {\n              \"bid_id\": 2,\n              \"buyer_name\": \"MegaCorp\",\n              \"exclusive\": false,\n              \"bid_amount\": 1.2,\n              \"sold\": null,\n            }\n          ],\n        \"expires_at\": \"2024-12-19T23:30:50.95226922Z\",\n        \"payout\": 0,\n        \"sold\": null,\n        \"matched\": true,\n        \"bid_amount\": 3.3,\n        \"default_accepted_bid_ids\": [\n          1\n        ],\n        \"time_ms\": 324,\n        \"data_issues\": {}\n      }\n    },\n    {\n      label: 'Ping – Unmatched',\n      description: `This ping did not return any bids. This could mean that there are currently no buyers interested in this lead, or that there is information missing from the lead that our buyers target on. Make sure to submit as much information as possible to increase your chances of matching.`,\n      data: {\n        \"auction_id\": \"1b531973-36d2-44cc-9af2-dd32c1333c64\",\n        \"bids\": [],\n        \"expires_at\": \"2024-12-19T23:30:50.95226922Z\",\n        \"payout\": 0,\n        \"sold\": null,\n        \"matched\": false,\n        \"bid_amount\": 0,\n        \"default_accepted_bid_ids\": [],\n        \"time_ms\": 324,\n        \"data_issues\": {}\n      }\n    },\n    {\n      label: 'Ping – Data Issues',\n      description: `This ping contained data that triggered validation issues.`,\n      data: {\n        \"auction_id\": \"1b531973-36d2-44cc-9af2-dd32c1333c64\",\n        \"bids\": [],\n        \"expires_at\": \"2024-12-19T23:30:50.95226922Z\",\n        \"payout\": 0,\n        \"sold\": null,\n        \"matched\": false,\n        \"bid_amount\": 0,\n        \"default_accepted_bid_ids\": [],\n        \"time_ms\": 324,\n        \"data_issues\": {\n          \"todo\": \"todo\"\n        }\n      }\n    }\n  ],\n  pingpost: [\n    {\n      label: 'Sale',\n      data: {\n        \"auction_id\": \"1b531973-36d2-44cc-9af2-dd32c1333c64\",\n\n        \"expires_at\": \"2024-12-19T23:30:50.95226922Z\",\n        \"payout\": 3.3,\n        \"sold\": true,\n        \"matched\": true,\n        \"bid_amount\": 3.3,\n        \"time_ms\": 324,\n        \"data_issues\": {}\n      }\n    },\n    {\n      label: 'Legs Sale',\n      data: {\n        \"auction_id\": \"1b531973-36d2-44cc-9af2-dd32c1333c64\",\n        \"bids\":\n          [\n            {\n              \"bid_id\": 1,\n              \"buyer_name\": \"Acme Enterprises\",\n              \"exclusive\": true,\n              \"bid_amount\": 3.3,\n              \"sold\": true,\n            },\n            {\n              \"bid_id\": 2,\n              \"buyer_name\": \"MegaCorp\",\n              \"exclusive\": false,\n              \"bid_amount\": 1.2,\n              \"sold\": false,\n            }\n          ],\n        \"expires_at\": \"2024-12-19T23:30:50.95226922Z\",\n        \"payout\": 3.3,\n        \"sold\": true,\n        \"matched\": true,\n        \"bid_amount\": 3.3,\n        \"default_accepted_bid_ids\": [\n          1\n        ],\n        \"time_ms\": 324,\n        \"data_issues\": {}\n      }\n    },\n    {\n      label: 'No Sale',\n      data: {\n        \"auction_id\": \"1b531973-36d2-44cc-9af2-dd32c1333c64\",\n        \"bids\":\n          [\n            {\n              \"bid_id\": 1,\n              \"buyer_name\": \"Acme Enterprises\",\n              \"exclusive\": true,\n              \"bid_amount\": 3.3,\n              \"sold\": false,\n            },\n            {\n              \"bid_id\": 2,\n              \"buyer_name\": \"MegaCorp\",\n              \"exclusive\": false,\n              \"bid_amount\": 1.2,\n              \"sold\": false,\n            }\n          ],\n        \"expires_at\": \"2024-12-19T23:30:50.95226922Z\",\n        \"payout\": 0,\n        \"sold\": false,\n        \"matched\": true,\n        \"bid_amount\": 3.3,\n        \"default_accepted_bid_ids\": [\n          1\n        ],\n        \"time_ms\": 324,\n        \"data_issues\": {}\n      }\n    },\n  ],\n}\n\nexport const pingRequestSchema = {\n  type: \"object\",\n  properties: {\n    source_token: {\n      type: \"string\",\n      description: \"The source token for this traffic type\",\n    },\n    data: {\n      type: \"object\",\n      description: \"The lead data (refer to full schema on the left)\",\n    }\n  }\n}\n\nexport const pingPostRequestSchema = {\n  type: \"object\",\n  properties: {\n    data: {\n      type: \"object\",\n      description: \"The remaining lead data (PII)\",\n    },\n    accepted_bid_ids: {\n      type: \"array\",\n      description: \"(Optional) The ids of the bids you wish to sell to. If left empty, it will default to `default_accepted_bid_ids` from the ping response.\"\n    },\n    accepted_buyers: {\n      type: \"array\",\n      description: \"(Optional) The names of the buyers you wish to sell to, as specified by the `buyer_name` property on each bid. If left empty, sales will be executed according to `default_accepted_bid_ids` from the ping response.\"\n    }\n  }\n}\n\n// also doubles as pingpost/post response schema\nexport const pingResponseSchema = {\n  type: \"object\",\n  properties: {\n    auction_id: {\n      type: \"string\",\n      description: \"The ID of the auction your ping created.\",\n    },\n    bids: {\n      type: \"array\",\n      items: {\n        properties: {\n          bid_id: {\n            type: \"integer\",\n            description: \"The ID of the bid. This is an increment within the auction: 1, 2, 3, etc..\",\n          },\n          buyer_name: {\n            type: \"string\",\n            description: \"The name of the entity who is buying the lead. For TPCA purposes, this is the DBA (doing business as) name.\",\n          },\n          exclusive: {\n            type: \"boolean\",\n            description: \"If true, the buyer is buying the lead exclusively and you cannot sell it to any other party. If false, it is a shared sale, and you are free to sell the lead to other parties. If your platform does not handle bid-level exclusivity, please use the exclusive: true/false flag on the PING to only obtain exclusive or shared leads in the response.\"\n          },\n          bid_amount: {\n            type: \"float\",\n            description: \"The dollar amount of the bid.\"\n          },\n          sold: {\n            type: \"boolean\",\n            description:  \"Whether this bid has successfully been sold to. On the ping response this field has a null value, because no sale decision has been made yet. After the POST, it is either true or false.\"\n          }\n        }\n      }\n    },\n    expires_at: {\n      type: \"string\",\n      description: \"The expiration time of this auction (in RFC3339 format). All posts received after this deadline are rejected.\",\n    },\n    payout: {\n      type: \"float\",\n      description: \"The total dollar payout of this auction. On ping response this is zero, because no sale decision has been made yet. On post this will be the total amount of all sold bids.\",\n    },\n    sold: {\n      type: \"boolean\",\n      description: \"Whether this auction had any sales. On the ping response this field has a null value, because no sale decision has been made yet. After the POST, it is either true or false.\",\n    },\n    matched: {\n      type: \"boolean\",\n      description: \"Whether this auction has any matches. This is a convenience property which is true when there are 1 or more bids, false otherwise.\"\n    },\n    bid_amount: {\n      type: \"float\",\n      description: \"The total dollar bid amount of this auction, corresponding to the default_accepted_bid_ids array. If you specify your own accepted_bid_ids on the POST, this amount can change accordingly.\"\n    },\n    default_accepted_bid_ids: {\n      type: \"array\",\n      description: \"The bid IDs of bids that we recommend selling to. You are free to submit a different bid selection, as long as it does not violate exclusivity constraints.\"\n    },\n    time_ms: {\n      type: \"float\",\n      description: \"The time it took to process your request, in milliseconds. This is measured server-side and excludes time on the network.\"\n    },\n    data_issues: {\n      type: \"object\",\n      description: \"Validation issues with the data you submitted.\",\n      properties: {\n        unexpected_fields: {\n          type: \"array\",\n          description: \"Fields that were submitted that are not part of our lead schema. This should help identify potential spelling mistakes in field names, or interacting with the wrong source.\"\n        },\n        invalid_fields: {\n          type: \"array\",\n          description: \"Fields that had formatting issues (invalid dates, malformed phone numbers..). These fields are removed from the data before we process it.\"\n        },\n        required_fields: {\n          type: \"array\",\n          description: \"Fields that are required but were not submitted. If they were submitted, please check invalid_fields whether they have been removed for formatting issues.\"\n        }\n      }\n    }\n  }\n}\n\n/*\n * CALL TRANSFERS (warm transfer)\n * Calls traffic posts to a different endpoint and returns a transfer_number + billable_duration.\n * The API does not return this content, so examples are hard-coded (same approach as the lead samples above).\n */\nexport const callsPingUrl = \"https://matching.platform.ue.co/ping\";\n\n// Fields that become required when posting calls traffic (highlighted in the schema table).\nexport const callsRequiredFields = ['phone_suffix', 'tcpa_disclosure'];\n\nexport const getCallsPingMin = (token) => ({\n  source_token: token ?? '',\n  data: {\n    phone_suffix: \"1234\",\n    zipcode: \"92109\",\n    trusted_form_certificate_id: \"433cb911f1698abec3a8c3514fad789c2541e823\",\n    tcpa_disclosure: \"By providing your phone number you agree...\",\n  }\n});\n\nexport const getCallsPingRecommended = (token) => ({\n  source_token: token ?? '',\n  data: {\n    phone_suffix: \"1234\",\n    phone: \"5551234567\",\n    first_name: \"Jane\",\n    last_name: \"Doe\",\n    address: \"123 Sunshine Ave\",\n    city: \"Encinitas\",\n    state: \"CA\",\n    zipcode: \"92024\",\n    date_of_birth: \"1985-03-12\",\n    email: \"jane.doe@example.com\",\n    tcpa_disclosure: \"By providing your phone number you agree...\",\n    tcpa_one_to_one_consent: true,\n    utm_source: \"publisher_xyz\",\n    utm_medium: \"inbound_call\",\n    utm_campaign: \"auto_q2_2026\",\n    external_id: \"pub-call-9981273\",\n    form_begin: \"2026-05-21T17:32:10.000Z\",\n    form_submit: \"2026-05-21T17:34:02.000Z\",\n  }\n});\n\nexport const callsPingResponse = {\n  auction_id: \"f924cbe3-1556-4915-9758-558da7645233\",\n  visitor_id: \"f4de448c-5f70-4f61-a85a-0f8add0a91fd\",\n  matched: true,\n  bids: [\n    {\n      bid_id: 1,\n      buyer_name: \"DMS\",\n      bid_amount: 12.42,\n      exclusive: false,\n      sold: null,\n      transfer_number: \"+14344855712\",\n      billable_duration: 120,\n    }\n  ],\n  expires_at: \"2026-05-21T18:27:33.036288916Z\",\n  payout: 0,\n  sold: null,\n  bid_amount: 12.42,\n  default_accepted_bid_ids: [1],\n  time_ms: 1717,\n  data_issues: {}\n};\n\nexport const callsResponseSchema = {\n  type: \"object\",\n  properties: {\n    auction_id: {type: \"string\", description: \"Mastodon ID for this auction.\"},\n    matched: {type: \"boolean\", description: \"If false, do not attempt transfer. No buyer matched.\"},\n    bids: {\n      type: \"array\",\n      items: {\n        properties: {\n          transfer_number: {type: \"string (E.164)\", description: \"The number to warm-transfer the consumer to for this bid.\"},\n          billable_duration: {type: \"integer\", description: \"Minimum call duration in seconds for the call to be marked sold.\"},\n        }\n      }\n    },\n    default_accepted_bid_ids: {type: \"array\", description: \"The bid IDs that will be auto-accepted once the transfer occurs.\"},\n    expires_at: {type: \"datetime\", description: \"Offer expiry. Transfer must be initiated before this timestamp.\"},\n    sold: {type: \"boolean/null\", description: \"null on Ping — set once a transferred call passes billable_duration.\"},\n    data_issues: {type: \"object\", description: \"Map of field-level data quality issues. Empty when none detected.\"},\n  }\n};\n\n/*\n * CALLS PING/POST (optional second step)\n * The PII post uses the same endpoint as leads: POST /pingpost/{auction_id}.\n * For calls the post records PII and fires listeners but does not execute a sale —\n * that still happens when the transferred call arrives — so `sold` stays null here.\n * Its real value: a full `phone` supersedes the ping's `phone_suffix` as the expected\n * call origin, so the inbound call is matched on the whole number instead of 4 digits.\n */\nexport const callsPingPostUrl = \"https://matching.platform.ue.co/pingpost/{auction_id}\";\n\nexport const getCallsPingPostMin = () => ({\n  data: {\n    phone: \"5551234567\",\n  }\n});\n\nexport const getCallsPingPostRecommended = () => ({\n  data: {\n    phone: \"5551234567\",\n    first_name: \"Jane\",\n    last_name: \"Doe\",\n    email: \"jane.doe@example.com\",\n    address: \"123 Sunshine Ave\",\n    address2: \"Apt 4\",\n  },\n  accepted_bid_ids: [1],\n});\n\nexport const callsPingPostResponse = {\n  auction_id: \"f924cbe3-1556-4915-9758-558da7645233\",\n  visitor_id: \"f4de448c-5f70-4f61-a85a-0f8add0a91fd\",\n  matched: true,\n  bids: [\n    {\n      bid_id: 1,\n      buyer_name: \"DMS\",\n      bid_amount: 12.42,\n      exclusive: false,\n      sold: null,\n      transfer_number: \"+14344855712\",\n      billable_duration: 120,\n    }\n  ],\n  expires_at: \"2026-05-21T18:27:33.036288916Z\",\n  payout: 0,\n  sold: null,\n  bid_amount: 12.42,\n  default_accepted_bid_ids: [1],\n  time_ms: 214,\n  data_issues: {}\n};\n\nexport const callsPingPostRequestSchema = {\n  type: \"object\",\n  properties: {\n    data: {\n      type: \"object\",\n      description: \"The remaining consumer data (PII). Sending the full phone is the point of this step: it replaces the 4-digit phone_suffix as the number we expect the transfer to arrive from.\",\n    },\n    accepted_bid_ids: {\n      type: \"array\",\n      description: \"(Optional) The bid you wish to sell to. Call auctions accept at most one bid; sending more than one is rejected. If left empty, default_accepted_bid_ids from the Ping response is used.\",\n    },\n  }\n};\n\n// Post-specific failures. The error body is {\"Error\": \"<message>\"}, so the message itself\n// is the code a vendor can match on.\nexport const callsPingPostErrors = [\n  {http: '404', code: '(empty body)', meaning: 'No auction matched the auction_id in the URL.'},\n  {http: '400', code: 'auction has already closed', meaning: 'The offer expired or the auction was already resolved. Ping again.'},\n  {http: '400', code: 'pii has already been posted', meaning: 'This auction already received a PII post. Post at most once per auction.'},\n  {http: '400', code: 'pii does not match the pii already on file for this auction', meaning: 'The posted consumer differs from the one already recorded on this auction.'},\n  {http: '400', code: 'call auctions can only accept one bid', meaning: 'More than one id was sent in accepted_bid_ids.'},\n];\n\nexport const callsErrors = [\n  {http: '400', code: 'missing_required_field', meaning: 'A required Ping field was missing or empty. phone_suffix is the most common cause.'},\n  {http: '400', code: 'invalid_phone_suffix', meaning: 'phone_suffix failed format validation.'},\n  {http: '401', code: 'unauthorized', meaning: 'Bearer token missing or invalid.'},\n  {http: '403', code: 'source_token_invalid', meaning: 'source_token is not provisioned for calls traffic.'},\n];\n\nexport {getPing, getPingPost, ResponseScenarios};\n","import React, {useState, useEffect} from \"react\";\nimport {HelpPopper, TabNav} from \"@thedmsgroup/mastodon-ui-components\";\nimport {\n  Alert,\n  Row,\n  Col,\n  Button,\n  DropdownMenu,\n  DropdownItem,\n  DropdownToggle,\n  FormGroup,\n  Label,\n  Input,\n  Nav,\n  NavItem,\n  NavLink,\n  Spinner,\n  Table,\n  TabPane,\n  TabContent,\n  UncontrolledButtonDropdown,\n} from \"reactstrap\";\nimport PageSection from \"../../../../Layout/PageSection\";\n\nimport {\n  getPing,\n  getPingPost,\n  pingRequestSchema,\n  ResponseScenarios,\n  pingResponseSchema,\n  pingPostRequestSchema,\n  callsPingUrl,\n  callsRequiredFields,\n  getCallsPingMin,\n  getCallsPingRecommended,\n  callsPingResponse,\n  callsResponseSchema,\n  callsErrors,\n  callsPingPostUrl,\n  getCallsPingPostMin,\n  getCallsPingPostRecommended,\n  callsPingPostResponse,\n  callsPingPostRequestSchema,\n  callsPingPostErrors,\n} from \"./samples\";\n\nimport \"highlight.js/styles/foundation.min.css\";\nimport hljs from 'highlight.js';\nimport {CopyButton} from \"@thedmsgroup/mastodon-ui-components\";\nimport '../../../Public/PublisherPost.scss';\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {faLongArrowAltRight} from \"@fortawesome/free-solid-svg-icons\";\nimport InputWithIcon from '../../../../Components/Form/InputWithIcon'\nimport {useDebouncedCallback} from 'use-debounce'\n\nconst pingUrl = \"https://matching.platform.ue.co/ping\"\nconst pingPostUrl = \"https://matching.platform.ue.co/pingpost/{auction_id}\"\nconst postUrl = \"https://matching.platform.ue.co/post\"\n\nconst wrapSchema = (token, schema) => {\n  return {\n    type: \"object\",\n    properties: {\n      source_token: {\n        type: \"string\",\n        description: \"The source token for this traffic type\",\n        example: token,\n        required: true,\n      },\n      exclusive: {\n        type: \"boolean\",\n        description: \"Whether you want only exclusive bids (true) or shared bids (false). Leave out or pass null to get both types of bids.\",\n        default: null,\n      },\n      data: { ...schema, description: \"The attributes describing the lead\" },\n    }\n  }\n}\n\n/*\n * PUBLISHER POSTING INSTRUCTIONS\n */\nconst PostingInstructions = ({sources, apiKey, isLoading}) => {\n  const [mode, setMode] = useState('pingpost') //pingpost, direct, calls\n  const [pingPostStep, setPingPostStep] = useState('ping') //ping, pingpost\n  const [callsStep, setCallsStep] = useState('ping') //ping, pingpost, transfer\n  const [source, setSource] = useState();\n  const [schema, setSchema] = useState();\n  const [fieldSearch, setFieldSearch] = useState('');\n  const [sourceOptions, setSourceOptions] = useState([]);\n\n  // Calls traffic posts to a different endpoint and adds call-transfer steps.\n  // Primary signal is `product === 'calls'` (must be added to the instructions payload).\n  // Fallback: treat any source whose name contains \"calls\" as a calls source.\n  const callsCapable = source?.product === 'calls' || /calls/i.test(source?.name ?? '');\n\n\n  // const opts = [];\n  // if (sources) {\n  //   opts = [];\n  //   sources.map((src) => {\n  //     if (src.status === 'active') {\n  //       opts.push({value: src.id, label: src.name})\n  //       if (!source)\n  //         setSource(src)\n  //     }\n  //   })\n  // }\n  //\n  useEffect(() => {\n    if (sources) {\n      const activeSources = sources.filter(src => src.status === 'active')\n\n      setSourceOptions(activeSources.map(src => {\n        return {value:src.id, label:src.name}\n      }));\n      if (activeSources.length) {\n        setSource(activeSources[0]);\n        setSchema(wrapSchema(activeSources[0].token, activeSources[0].schema));\n      }\n\n    }\n  }, [sources])\n\n  // Calls sources show only the Call Transfers tab; everything else shows Ping/Post + Direct Post.\n  useEffect(() => {\n    setMode(callsCapable ? 'calls' : 'pingpost');\n  }, [callsCapable])\n\n  const handleFieldSearchDebounced = useDebouncedCallback((val) => {\n    setFieldSearch(val);\n  }, 400);\n\n  const handleSourceTokenChange = (sourceId) => {\n    setSource(old => {\n      const inst = sources.find(s => s.id == sourceId);\n      return inst || old\n    })\n  }\n\n  const exampleJsonPost = {\n    source_token: source?.token ?? '',\n    data: source?.schema_example ?? '',\n  };\n\n  if (!isLoading && !apiKey) {\n    return <div className={\"text-center p-3\"}>\n      <h3>Uh oh</h3>\n      <p>Something went wrong. The link may be invalid.</p>\n    </div>\n  }\n\n  if (isLoading) {\n    return <div className=\"d-flex align-items-center justify-content-center\" style={{height: '250px'}}>\n      <div>\n        <Spinner color=\"secondary\"/>\n      </div>\n    </div>\n  }\n\n  return (\n    <PageSection title=\"Publisher Posting API\" className=\"posting-instructions\">\n\n\n          <Row>\n            <Col sm={12} md={9} lg={7}>\n\n\n             {/*{app.isAuthorized && (\n                <FormGroup row >\n                  <Label sm={2}>\n                    Source\n                  </Label>\n                  <Col sm={10} >\n                      <EnhancedSelect\n                        onChange={handleSourceTokenChange}\n                        options={sourceOptions}\n                        placeholder={\"Select a Source...\"}\n                        value={source?.id}\n                        returnValueAsString={false}\n                        isMulti={false}\n                      />\n                  </Col>\n                </FormGroup>\n                )}*/}\n\n\n              <FormGroup row >\n                <Label sm={2}>\n                  Source Token\n                </Label>\n                <Col sm={10} className=\"d-flex align-items-center\">\n                  <Input readOnly size=\"sm\" value={source?.token ?? \"\"}/>\n                  <CopyButton textToCopy={source?.token} id={\"id-copy-source-token\"}/>\n                </Col>\n              </FormGroup>\n\n              {/*{app.isAuthorized && (\n                <FormGroup row >\n                  <Label sm={2}>\n                    API Key\n                  </Label>\n                  <Col sm={10} className=\"d-flex align-items-center\">\n                    <Input readOnly size=\"sm\" value={apiKey}/>\n                    <CopyButton textToCopy={source?.token} id={\"copy-api-key\"}/>\n                  </Col>\n                </FormGroup>\n              )}*/}\n\n            </Col>\n\n          </Row>\n\n        <hr/>\n\n        <Nav tabs className=\"mb-3 mode-tabs\">\n          {callsCapable ? (\n            <TabNav isActive={true} setActive={setMode} id=\"calls\">Call Transfers</TabNav>\n          ) : (\n            <>\n              <TabNav isActive={mode === 'pingpost'} setActive={setMode} id=\"pingpost\">Ping/Post</TabNav>\n              <TabNav isActive={mode === 'direct'} setActive={setMode} id=\"direct\">Direct Post</TabNav>\n            </>\n          )}\n        </Nav>\n\n        <Row>\n          <Col sm={8}>\n            <h2>Input Schema</h2>\n            {mode === 'calls' ? (\n              <p>Send consumer attributes to request a buyer offer and a transfer number. <strong>phone_suffix</strong> and <strong>tcpa_disclosure</strong> are required for calls traffic.</p>\n            ) : (\n              <p>See below how to send lead information to us via API, and what to expect in return.</p>\n            )}\n\n            <h3>Headers</h3>\n            <div className=\"mb-4\">\n              {/*todo: sticky table header */}\n              <Table size=\"sm\" striped hover>\n                <thead>\n                <tr>\n                  <th>Name</th>\n                  <th>Value</th>\n                </tr>\n                </thead>\n                <tbody>\n                   <tr>\n                     <td>Authorization</td>\n                     <td>Bearer {apiKey}</td>\n                   </tr>\n                   <tr>\n                     <td>Content-Type</td>\n                     <td>application/json</td>\n                   </tr>\n                </tbody>\n              </Table>\n            </div>\n\n            <div className=\"d-flex justify-content-between align-items-center\">\n              <h3 className=\"mb-0\">Params {fieldSearch && <span className=\"filtered\">(Filtered)</span>}</h3>\n              <InputWithIcon\n                icon=\"search\"\n                iconSize=\"sm\"\n                placeholder=\"Search by field\"\n                name=\"search\"\n                containerClass=\"expands\"\n                defaultValue=\"\"\n                onChange={(e) => handleFieldSearchDebounced(e.target.value)}\n                onClear={()=>setFieldSearch('')}\n                className=\"mb-2\"\n              />\n            </div>\n\n            <div>\n              {/*todo: sticky table header */}\n              <Schema\n                schema={schema}\n                search={fieldSearch}\n                requiredFields={mode === 'calls' ? callsRequiredFields : null}\n              />\n            </div>\n          </Col>\n\n          <Col sm={4} className=\"example-col\">\n            {mode === 'pingpost' && (\n              <PingPostMode\n                step={pingPostStep}\n                setStep={setPingPostStep}\n                source={source}\n                apiKey={apiKey}\n              />\n            )}\n            {mode === 'direct' && (\n              <DirectMode request={exampleJsonPost} apiKey={apiKey}/>\n            )}\n            {mode === 'calls' && (\n              <CallsMode\n                step={callsStep}\n                setStep={setCallsStep}\n                source={source}\n                apiKey={apiKey}\n              />\n            )}\n          </Col>\n        </Row>\n\n    </PageSection>\n  )\n};\n\n// Numbered step heading used across modes\nconst StepHeader = ({num, title, children}) => (\n  <div className=\"d-flex align-items-start my-2\">\n    {num && <div className=\"sale-step-num me-2 flex-shrink-0\">{num}</div>}\n    <div>\n      <div className=\"step-title fw-bold\">{title}</div>\n      {children && <div className=\"step-desc\">{children}</div>}\n    </div>\n  </div>\n);\n\nconst RequestUrl = ({url, id}) => (\n  <FormGroup>\n    <Label>Request URL</Label>\n    <div className=\"d-flex align-items-center\">\n      <Input readOnly value={url}/>\n      <CopyButton textToCopy={url} id={id}/>\n    </div>\n  </FormGroup>\n);\n\n// PING/POST mode: two steps (ping, then pingpost)\nconst PingPostMode = ({step, setStep, source, apiKey}) => (\n  <>\n    <Nav tabs>\n      <TabNav isActive={step === 'ping'} setActive={setStep} id=\"ping\">Step 1: Ping</TabNav>\n      <TabNav isActive={step === 'pingpost'} setActive={setStep} id=\"pingpost\">Step 2: PingPost</TabNav>\n    </Nav>\n    <TabContent activeTab={step}>\n      <TabPane tabId=\"ping\">\n        <StepHeader num=\"1\" title=\"Ping — gauge demand, get bids\">\n          Offer lead properties to advertisers without sending PII. Returns bids so you can decide whether, and to whom, to post.\n        </StepHeader>\n        <Alert color=\"info\" className=\"py-2\">\n          Ping is the first of two parts of a sale and is not a complete transaction.\n        </Alert>\n        <RequestUrl url={pingUrl} id=\"copy-ping-url\"/>\n        <hr/>\n        <PhaseExamples\n          request={getPing(source?.token, source?.schema_example)}\n          responses={ResponseScenarios.ping}\n          requestSchema={pingRequestSchema}\n          responseSchema={pingResponseSchema}\n          apiKey={apiKey}\n          url={pingUrl}\n        />\n      </TabPane>\n      <TabPane tabId=\"pingpost\">\n        <StepHeader num=\"2\" title=\"PingPost — final agreement, deliver PII\">\n          Send the remaining contact/PII for the consumer. This completes the sale and is delivered to the end buyer in near real-time.\n        </StepHeader>\n        <RequestUrl url={pingPostUrl} id=\"copy-ping-post-url\"/>\n        <hr/>\n        <PhaseExamples\n          request={getPingPost(source?.schema_example)}\n          responses={ResponseScenarios.pingpost}\n          requestSchema={pingPostRequestSchema}\n          responseSchema={pingResponseSchema}\n          apiKey={apiKey}\n          url={pingPostUrl}\n        />\n      </TabPane>\n    </TabContent>\n  </>\n);\n\n// DIRECT POST mode: single full-lead post\nconst DirectMode = ({request, apiKey}) => (\n  <>\n    <StepHeader title=\"Direct Post\">\n      Send a full lead to be sold immediately — no separate ping required.\n    </StepHeader>\n    <RequestUrl url={postUrl} id=\"copy-post-url\"/>\n    <hr/>\n    <PhaseExamples\n      request={request}\n      responses={ResponseScenarios.pingpost}\n      requestSchema={pingRequestSchema}\n      responseSchema={pingResponseSchema}\n      apiKey={apiKey}\n      url={postUrl}\n    />\n  </>\n);\n\n// CALL TRANSFERS mode: ping over HTTP, an optional PII post over HTTP, then a telephony warm transfer\nconst CallsMode = ({step, setStep, source, apiKey}) => (\n  <>\n    <Nav tabs>\n      <TabNav isActive={step === 'ping'} setActive={setStep} id=\"ping\">Step 1: Ping (HTTP)</TabNav>\n      <TabNav isActive={step === 'pingpost'} setActive={setStep} id=\"pingpost\">Step 2: PingPost (HTTP, optional)</TabNav>\n      <TabNav isActive={step === 'transfer'} setActive={setStep} id=\"transfer\">Step 3: Transfer (Telephony)</TabNav>\n    </Nav>\n    <TabContent activeTab={step}>\n      <TabPane tabId=\"ping\">\n        <StepHeader num=\"1\" title=\"Ping — get a buyer offer and transfer number\">\n          POST consumer attributes. On success you receive a <code>transfer_number</code>, <code>bid_amount</code>, and an <code>expires_at</code> deadline. <strong>phone_suffix is required.</strong>\n        </StepHeader>\n        <RequestUrl url={callsPingUrl} id=\"copy-calls-ping-url\"/>\n        <hr/>\n        <CallsPhaseExamples source={source} apiKey={apiKey}/>\n      </TabPane>\n      <TabPane tabId=\"pingpost\">\n        <StepHeader num=\"2\" title=\"PingPost — deliver PII ahead of the transfer (optional)\">\n          Send the remaining consumer contact data against the <code>auction_id</code> from Step 1. This does <strong>not</strong> complete the sale — the sale is still recorded when the transferred call arrives — so <code>sold</code> stays <code>null</code> on the response.\n        </StepHeader>\n        <Alert color=\"info\" className=\"py-2\">\n          This step is optional. Skip it and go straight to the transfer if you have no PII to send.\n        </Alert>\n        <Alert color=\"success\" className=\"py-2\">\n          Recommended: post the consumer&apos;s full <code>phone</code>. It supersedes the 4-digit <code>phone_suffix</code> from the Ping as the number we expect the transfer to arrive from, so the call is matched on the whole number rather than 4 digits — which matters when several of your calls share a suffix.\n        </Alert>\n        <RequestUrl url={callsPingPostUrl} id=\"copy-calls-pingpost-url\"/>\n        <hr/>\n        <CallsPingPostExamples apiKey={apiKey}/>\n      </TabPane>\n      <TabPane tabId=\"transfer\">\n        <StepHeader num=\"3\" title=\"Transfer — warm-transfer the live call\">\n          Once you have a transfer_number, bridge the consumer to it. The following must hold for the sale to be recorded.\n        </StepHeader>\n        <ul className=\"transfer-rules\">\n          <li>Transfer must be initiated before <code>expires_at</code> on the Ping response.</li>\n          <li>The ANI presented on transfer must contain the same <code>phone_suffix</code> sent on the Ping — this is what matches the inbound call to the offer.</li>\n          <li>CallerID pass-through must be preserved end-to-end from the publisher&apos;s switch through to the destination.</li>\n          <li>The call must remain connected for at least <code>billable_duration</code> seconds for the sale to be recorded.</li>\n          <li>If multiple recent calls share the same <code>phone_suffix</code> under the same <code>source_token</code>, the most recent Ping wins.</li>\n        </ul>\n      </TabPane>\n    </TabContent>\n  </>\n);\n\n// Calls request/response examples: request offers Minimum/Recommended payloads + errors; response shows the offer + schema\nconst CallsPhaseExamples = ({source, apiKey}) => {\n  const [phase, setPhase] = useState('request');\n  const token = source?.token;\n  const requestScenarios = [\n    {label: 'Minimum', data: getCallsPingMin(token)},\n    {label: 'Recommended', data: getCallsPingRecommended(token)},\n  ];\n\n  return (\n    <div className=\"phase-examples\">\n      <Nav>\n        <NavItem>\n          <NavLink active={phase === 'request'} href=\"#\" onClick={()=>setPhase('request')}>Request</NavLink>\n        </NavItem>\n        <NavItem>\n          <NavLink active={phase === 'response'} href=\"#\" onClick={()=>setPhase('response')}>Response</NavLink>\n        </NavItem>\n      </Nav>\n\n      <TabContent activeTab={phase}>\n        <TabPane tabId=\"request\">\n          <ExampleDisplay\n            defaultData={requestScenarios[0].data}\n            scenarios={requestScenarios}\n            apiKey={apiKey}\n            url={callsPingUrl}\n          />\n\n          <ErrorTable errors={callsErrors} idPrefix=\"calls-err\"/>\n\n          <Alert color=\"warning\" className=\"py-2\">\n            When no buyer matches, the API returns <strong>200 with matched: false</strong> and an empty bids array — not an error. Do not attempt transfer.\n          </Alert>\n        </TabPane>\n\n        <TabPane tabId=\"response\">\n          <ExampleDisplay\n            defaultData={callsPingResponse}\n            apiKey={apiKey}\n            url={callsPingUrl}\n          />\n\n          <h3>Response Schema</h3>\n          <ResponseSchema schema={callsResponseSchema}/>\n        </TabPane>\n      </TabContent>\n    </div>\n  );\n};\n\n// Calls PingPost examples: Minimum/Recommended request payloads + errors; response shows the\n// still-open auction (sold stays null until the transferred call is billable).\nconst CallsPingPostExamples = ({apiKey}) => {\n  const [phase, setPhase] = useState('request');\n  const requestScenarios = [\n    {label: 'Minimum', data: getCallsPingPostMin()},\n    {label: 'Recommended', data: getCallsPingPostRecommended()},\n  ];\n\n  return (\n    <div className=\"phase-examples\">\n      <Nav>\n        <NavItem>\n          <NavLink active={phase === 'request'} href=\"#\" onClick={()=>setPhase('request')}>Request</NavLink>\n        </NavItem>\n        <NavItem>\n          <NavLink active={phase === 'response'} href=\"#\" onClick={()=>setPhase('response')}>Response</NavLink>\n        </NavItem>\n      </Nav>\n\n      <TabContent activeTab={phase}>\n        <TabPane tabId=\"request\">\n          <ExampleDisplay\n            defaultData={requestScenarios[0].data}\n            scenarios={requestScenarios}\n            apiKey={apiKey}\n            url={callsPingPostUrl}\n          />\n\n          <h3>Request Schema</h3>\n          <ResponseSchema schema={callsPingPostRequestSchema}/>\n\n          <ErrorTable errors={callsPingPostErrors} idPrefix=\"calls-pingpost-err\"/>\n        </TabPane>\n\n        <TabPane tabId=\"response\">\n          <ExampleDisplay\n            defaultData={callsPingPostResponse}\n            apiKey={apiKey}\n            url={callsPingPostUrl}\n          />\n\n          <Alert color=\"info\" className=\"py-2\">\n            The response is the same shape as the Ping response. <code>sold</code> is still <code>null</code> and <code>payout</code> is still 0 — both are settled by the call, not by this post.\n          </Alert>\n\n          <h3>Response Schema</h3>\n          <ResponseSchema schema={callsResponseSchema}/>\n        </TabPane>\n      </TabContent>\n    </div>\n  );\n};\n\nconst ErrorTable = ({errors, idPrefix}) => (\n  <>\n    <h3>Errors</h3>\n    <Table size=\"sm\" striped hover>\n      <thead>\n      <tr><th>HTTP</th><th>Code</th><th>Meaning</th></tr>\n      </thead>\n      <tbody>\n      {errors.map((e, i) => (\n        <tr key={`${idPrefix}-${i}`}>\n          <td>{e.http}</td>\n          <td><code>{e.code}</code></td>\n          <td>{e.meaning}</td>\n        </tr>\n      ))}\n      </tbody>\n    </Table>\n  </>\n);\n\nconst Schema = ({schema, search, requiredFields}) => {\n  return <Table size=\"sm\" striped hover className=\"param-table\">\n    <thead>\n    <tr>\n      <th className=\"header-field-name\">Field Name</th>\n      <th className=\"text-center\">Data Type</th>\n      <th className=\"text-center\">Required</th>\n      <th>Description</th>\n      <th>Example</th>\n    </tr>\n    </thead>\n    <tbody>\n    {schema && <>\n      {getRows(schema.properties, 0, search, requiredFields)}\n    </>}\n    </tbody>\n  </Table>\n};\n\nfunction getRows(properties, indent = 0, search, requiredFields) {\n  let out = []\n  for (let key of Object.keys(properties)) {\n    let field = properties[key]\n    let example = field.example\n    if (!example) {\n      if (field.enum && field.enum.length > 0) {\n        example = field.enum[0] // todo random?\n      } else  if (field.type === \"boolean\") {\n        example = \"false\"\n      }\n    }\n\n    // Search filtering:\n    // If subfields have a match, show the parent field\n    // else, only show parent field if it matches\n    let subfields\n    if (field.type === 'array' && field.items?.properties) {\n      subfields = getRows(field.items?.properties, indent+1, search, requiredFields)\n    } else if (field.type === 'object' && field.properties) {\n      subfields = getRows(field.properties, indent+1, search, requiredFields)\n    }\n\n    // Calls traffic makes some otherwise-optional fields required (highlighted in orange).\n    const callsRequired = requiredFields?.includes(key)\n\n    if (!search || subfields?.length ||  (search && key.toLowerCase().includes(search.toLowerCase()))) {\n      out.push(<tr key={`prm-${key}-${indent}`} className={`field-row level-${indent}`}>\n        {/*<td className={`field-cell level-${indent}`}>{[...Array(indent)].map((e, i) => <FaIcon fixedWidth={true} icon={faLongArrowAltRight} size='1x'*/}\n        {/*                                              key={`arrow-${key}-${i}-${indent}`} spacing={2}/>)}{key}</td>*/}\n        <td className={`field-cell level-${indent}`}>{indent > 0 && <FaIcon fixedWidth={true} icon={faLongArrowAltRight} size='1x'  spacing={2}/>}{key}</td>\n        <td className=\"text-center\">{field.type}</td>\n        <td className=\"text-center\">{field.required\n          ? <><FaIcon icon='check' size='1x'/>{field.required_lazy && <div className=\"mb-1\"><HelpPopper>\n            This value can be provided on the POST if it is not available at the time of the PING.\n          </HelpPopper></div>}</>\n          : callsRequired\n            ? <FaIcon icon='check' size='1x' className=\"text-warning\"/>\n            : '-'}</td>\n        <td>\n          {field.description}\n          {callsRequired && <div className=\"text-warning small fw-bold\">Required for Call Transfers</div>}\n          {/* Not enforced, but expected often enough to be worth sending — and it is\n              what the sample request is built from, so say so here too. */}\n          {field.recommended && !field.required && (\n            <div className=\"text-muted small fw-bold\">Recommended &mdash; included in the sample request</div>\n          )}\n          {field.enum?.length > 0 && <div><label>Choices:</label>\n            <ul>{field.enum.map((v, i) => <li key={`choice-${key}-${i}`}>{v}</li>)}</ul>\n          </div>}\n        </td>\n        <td>{example != null && (field.type === \"string\" ? '\"' + example + '\"' : example)}</td>\n      </tr>)\n\n      if (subfields) {\n        out = out.concat(subfields)\n      }\n    }\n\n  }\n\n  return out\n}\n\n// Shows examples for request and response\nconst PhaseExamples = ({request, responses, requestSchema, responseSchema, url, apiKey}) => {\n  const [phase, setPhase] = useState('request');\n\n  return (\n    <div className=\"phase-examples\">\n\n      <Nav>\n        <NavItem>\n          <NavLink active={phase === 'request'} href=\"#\" onClick={()=>setPhase('request')}>Request</NavLink>\n        </NavItem>\n        <NavItem>\n          <NavLink active={phase === 'response'} href=\"#\" onClick={()=>setPhase('response')}>Response</NavLink>\n        </NavItem>\n      </Nav>\n\n      <TabContent activeTab={phase}>\n\n        <TabPane tabId=\"request\">\n          <ExampleDisplay\n            defaultData={request}\n            apiKey={apiKey}\n            url={url}\n          />\n\n          <h3>Request Schema</h3>\n          <ResponseSchema schema={requestSchema}/>\n        </TabPane>\n\n        <TabPane tabId=\"response\">\n\n          <ExampleDisplay\n            defaultData={request}\n            scenarios={responses}\n            apiKey={apiKey}\n            url={url}\n          />\n\n          <h3>Response Schema</h3>\n          <ResponseSchema schema={responseSchema} />\n\n        </TabPane>\n\n      </TabContent>\n    </div>\n  )\n}\n\nconst ResponseSchema = ({schema}) => {\n  return <Table size=\"sm\" className=\"schema-table\" striped hover>\n    <thead>\n    <tr>\n      <th className=\"w-25\">Field Name</th>\n      <th className=\"text-center\">Type</th>\n      <th>Description</th>\n    </tr>\n    </thead>\n    <tbody>\n      {getResponseRows(schema.properties)}\n    </tbody>\n  </Table>\n}\n\nfunction getResponseRows(properties, indent = 0) {\n  let out = []\n  for (let key of Object.keys(properties)) {\n    let field = properties[key]\n    //Key: note that same 'key' may exist at different levels so we use indent value to make react keys unique\n    out.push(<tr className=\"field-row\" key={`rsp-${key}-${indent}`}>\n      <td className={`field-cell level-${indent}`}>{indent > 0 && <FaIcon fixedWidth={true} icon={faLongArrowAltRight} size='1x' />}{key}</td>\n      <td className=\"text-center\">{field.type}</td>\n      <td>{field.description}</td>\n    </tr>)\n\n    if (field.type === 'array' && field.items?.properties) {\n      out = out.concat(getResponseRows(field.items?.properties, indent+1))\n    }\n    if (field.type === 'object' && field.properties) {\n      out = out.concat(getResponseRows(field.properties, indent+1))\n    }\n  }\n\n  return out\n}\n\n// This shows request or response, but only response has scenarios\nconst ExampleDisplay = ({defaultData, scenarios=[], apiKey, url}) => {\n  const [currentScenario, setCurrentScenario] = useState(scenarios.length ? scenarios[0] : {data: defaultData})\n  const [dataView, setDataView] = useState('JSON');\n\n  const handleChangeScenario = (scenario) => {\n    if (scenario) {\n      setCurrentScenario(scenario)\n    }\n  }\n\n  return (\n    <div>\n      {scenarios?.length > 1 && (\n        <div className=\"d-flex mb-2\"  >\n\n              {scenarios.map((sc,i) => (\n                <Button\n                  size=\"xs\"\n                  color={currentScenario?.label === sc.label ? 'primary' : 'light' }\n                  onClick={() => handleChangeScenario(sc)}\n                  outline={currentScenario?.label !== sc.label}\n                  className=\"me-1\"\n                  key={`scn-${i}`}\n                >\n                  {sc.label}\n                </Button>\n              ))}\n        </div>\n      )}\n\n      {currentScenario?.description && <div>{currentScenario.description}</div>}\n\n      <div className=\"mb-1 text-end\">\n        <UncontrolledButtonDropdown >\n          <DropdownToggle color=\"transparent\" size=\"xs\" className=\"inline\" caret>\n            {dataView}\n          </DropdownToggle>\n          <DropdownMenu>\n            <DropdownItem onClick={()=>setDataView('JSON')}>JSON</DropdownItem>\n            <DropdownItem onClick={()=>setDataView('Curl')}>Curl</DropdownItem>\n          </DropdownMenu>\n        </UncontrolledButtonDropdown>\n      </div>\n\n      {currentScenario ? (\n        <>\n          {dataView === 'JSON' ? (\n            <JsonExample data={currentScenario.data } scrollable/>\n          ) : (\n            <CurlExample json={currentScenario.data} apiKey={apiKey} url={url} />\n          )}\n        </>\n      ) : (\n        <p><i>No data example found</i></p>\n      )}\n\n    </div>\n  )\n}\n\nconst JsonExample = ({data, scrollable}) => {\n  if (!data) return <></>\n\n  // todo: scrollable\n  if (data instanceof Object)\n    data = JSON.stringify(data, null, 2)\n\n  return (\n    <>\n    <pre>\n      <CopyButton className=\"float-end\" textToCopy={data} id={\"id-json-example\"}/>\n      <div className=\"hljs p-2\" dangerouslySetInnerHTML={{\n        __html: hljs.highlight(data, {language: 'json'}).value\n      }}>\n      </div>\n  </pre>\n    </>\n  );\n};\n\nconst curlExample = (json, apiKey, url) => `curl \\\\\n  --header 'Authorization: Bearer ${apiKey}' \\\\\n  --json '\n  ${JSON.stringify(json, null, 4)}' \\\\\n  ${url}`\n\nconst CurlExample = ({json, apiKey, url}) => {\n  const example = curlExample(json, apiKey, url);\n  return (\n    <div className=\"curl\">\n      <pre>\n      <CopyButton className=\"float-end\" textToCopy={example} id={\"id-json-example\"}/>\n      <div className=\"p-2\" dangerouslySetInnerHTML={{\n        __html: hljs.highlight('$ ' + example, {language: 'bash'}).value\n      }}></div>\n    </pre>\n    </div>\n\n  );\n}\n\nexport default PostingInstructions;\n","import React, {useEffect, useState} from \"react\";\nimport {useParams} from \"react-router-dom\";\nimport DocTitle from \"../../Layout/DocTitle\";\nimport useApi from \"../../Hooks/useApi\";\nimport PostingInstructions from \"../Dashboard/Publishers/PostingInstructions\";\n\nconst PublisherPostDocs = () => {\n  const {api} = useApi();\n  const {sourceToken} = useParams();\n  const [apiKey, setApiKey] = useState('');\n  const [sources, setSources] = useState();\n  const [isLoading, setIsLoading] = useState(true);\n\n  const getPostingInstructions = async () => {\n    try {\n      const postingInstructions = await api.client.get(`/public/publishers/instructions/${sourceToken}`);\n      const {api_key, sources} = postingInstructions;\n      //Hack: rewriting placeholder provided by API. THere is a logged-in dashboard version of these docs,\n      //but for now we are hiding it, we don't want them logged in.\n      setApiKey(api_key === \"<Login to see>\" ? \"<Provided by DMS>\" : api_key);\n      setSources(sources);\n    } catch (exception) {\n      console.error('Error fetching Publisher Posting Instructions:', exception)\n    } finally {\n      setIsLoading(false);\n    }\n\n  }\n\n  useEffect(() => {\n    getPostingInstructions()\n  }, [sourceToken])\n\n  return (\n    <>\n      <DocTitle pageTitle=\"Publisher Documentation\"/>\n       <PostingInstructions apiKey={apiKey} sources={sources} isLoading={isLoading}/>\n    </>\n  );\n};\n\nexport default PublisherPostDocs;\n","import React from 'react';\nimport { Routes, Route } from 'react-router';\nimport {EntryLayout, AuthLayout, PublicLayout} from \"../Layout\";\nimport MainContent from '../Layout/MainContent';\nimport './App.scss';\nimport Login from \"./Login\";\nimport ForgotPassword from \"./ForgotPassword\";\nimport ResetPassword from \"./ResetPassword\";\nimport ActivateUser from \"./ActivateUser\";\nimport PublisherPostDocs from \"./Public/PublisherPostDocs\";\n\n\nconst App = () =>  (\n      <Routes>\n          <Route element={<EntryLayout/>}>\n            <Route path=\"/login\" element={<Login/>} />\n            <Route path=\"/forgot-password\" element={<ForgotPassword/>} />\n            {/*<Route path=\"/reset-password\" element={<ResetPassword/>} />*/}\n            <Route path=\"/reset-password/:resetToken\" element={<ResetPassword/>} />\n            <Route path=\"/activate/:activationToken\" element={<ActivateUser/>} />\n          </Route>\n          <Route element={<PublicLayout/>} >\n            <Route path=\"/publishers/:sourceToken\" element={<PublisherPostDocs/>} />\n          </Route>\n          <Route  element={<AuthLayout/>} >\n            <Route path=\"/*\" element={<MainContent/>} />\n          </Route>\n      </Routes>\n  )\n\n\nexport default App;\n","import React from 'react';\nimport {useRouteError, useLocation, useNavigate} from \"react-router-dom\";\nimport {Button} from \"reactstrap\";\nimport PageSection from \"./PageSection\";\n\n// Using with react-router errorElement\n// <Route path=\"/thing\" element={<Thing/>} errorElement={<ErrorBoundary/> />\n// Note: apparently this does not work inside descendent <Routes> elements, only at the top\nconst ErrorBoundary = () => {\n  let error = useRouteError();\n  const location = useLocation();\n  const navigate = useNavigate();\n\n\n  return (\n    <div id=\"error-boundary\">\n      <PageSection title=\"Something went wrong\" className=\"m-3\">\n\n        <p>Sorry about that.</p>\n\n        {error.message && <pre>{error.message}</pre>}\n\n        <div className=\"d-flex\">\n          <Button size=\"sm\" onClick={()=>navigate(location)}>Reload the page</Button>\n          <Button size=\"sm\" className=\"ms-2\" onClick={()=>navigate(\"/accounts\")}>Home</Button>\n        </div>\n\n\n      </PageSection>\n    </div>\n\n  )\n}\n\nErrorBoundary.displayName = \"ErrorBoundary\";\nexport default ErrorBoundary\n","// Application entry point\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Route, RouterProvider, createHashRouter, createRoutesFromElements } from 'react-router-dom';\nimport {NotificationContainer, NotificationPosition} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\"\nimport App from './App/App';\nimport { AppProvider } from './Providers/AppProvider';\nimport { FaLibrary } from './Layout/FaLibrary';\nimport ErrorBoundary from \"./Layout/ErrorBoundary\";\n// import registerServiceWorker from './registerServiceWorker';\n\n// import(\n//   /* webpackChunkName: \"faLibrary\" */\n//   /* webpackPreload: true */\n//   \"./Layout/FaLibrary\").then((module) => {\n//   if(module){\n//     module.FaLibrary();\n//   }\n// });\n\n\nFaLibrary();\n\nconst AuthUrl = `${process.env.API_URL_CORE}/me`;\nconst AppVersion = `${process.env.REACT_APP_VERSION}`;\nconst AppHash = `${process.env.REACT_APP_HASH}`;\n\nconst router = createHashRouter(\n  createRoutesFromElements(\n    <Route path=\"*\" element={<App/>} errorElement={<ErrorBoundary/>} />\n  )\n)\n\nconst AppRouter = () => (\n  <>\n    <NotificationContainer\n      containerId=\"dms-main-toast\"\n      className=\"dms-toast-container\"\n      toastClassName=\"dms-toast\"\n      bodyClassName=\"dms-toast-body\"\n      position={NotificationPosition.TOP_CENTER}\n      hideProgressBar\n      theme=\"light\"\n    />\n\n    <AppProvider authUrl={AuthUrl} version={AppVersion} buildHash={AppHash}>\n      <RouterProvider router={router} />\n    </AppProvider>\n  </>\n);\n\nReactDOM.render(\n  <AppRouter />,\n  document.getElementById('app'),\n);\n// registerServiceWorker();\n","import React, { useMemo } from 'react';\nimport { Spinner } from 'reactstrap';\n\n//  Wrapper for React.lazy loading\n//  from: https://artemdemo.com/blog/20181125-lazy-load-components-in-react/\n//  usage:\n//  const LazyThing = Lazify( () => import(/* webpackChunkName: \"Stuff\" */ \"./Thing\"));\n//  then: <LazyThing spinner={true}/>  (optional show spinner)\n//  or:\n//  <Route path='/thing' component={LazyThing}/>\n//  (the webpackChunkName is optional but can be useful in dev)\n//\n//  Modified with useMemo\nconst lazify = (loader) => {\n  const Lazified = (props) => {\n    // useMemo: lazy loaded components that rely on query string parameters\n    // tend to remount when parameters change. useMemo hook prevents that.\n    const Component = useMemo(() => React.lazy(loader), [loader]);\n\n    const loadingFallback = (() => {\n      if (React.Children.count(props.children) > 0) {\n        return props.children;\n      }\n      return props.spinner ? (<Spinner size=\"sm\" color=\"primary\" />) : null;\n    })();\n\n    return (\n      <React.Suspense fallback={loadingFallback}>\n        <Component {...props} />\n      </React.Suspense>\n    );\n  };\n  return Lazified;\n};\n\nexport default lazify;\n","export function roundNumber(numberToRound, numberOfDecimalPlaces) {\n  if (numberToRound === 0) {\n    return 0;\n  }\n\n  if (!numberToRound) {\n    return '';\n  }\n\n  const scrubbedNumber = numberToRound.toString().replace('$', '').replace(',', '');\n  return Math.round(scrubbedNumber * 10 ** numberOfDecimalPlaces) / 10 ** numberOfDecimalPlaces;\n}\n\n// adds array of values passed.\nexport function addArray(values) {\n  const total = values.reduce(\n    (previousValue, currentValue) => previousValue + parseInt(convertToPennies(currentValue), 10), // do math in pennies to assure accuracy.\n    0,\n  );\n\n  return total / 100; // convert back into dollars\n}\n\nexport function convertToPennies(value) {\n  if (value === 0) {\n    return 0;\n  }\n\n  let dollarValue = parseFloat(value);\n  dollarValue = roundNumber(dollarValue, 2);\n  const dollarValueContainsDecimal = (dollarValue.toString().indexOf('.') !== -1);\n  return (dollarValueContainsDecimal) ? parseInt(dollarValue.toString().replace('.', ''), 10) : parseInt(dollarValue, 10) * 100;\n}\n\nexport function isNumeric(num) {\n  return !isNaN(parseFloat(num)) && isFinite(num);\n}\n\nexport function getDelta(oldValue, newValue) {\n  return oldValue > 0 ? ((newValue / oldValue) * 100) - 100 : 0;\n}\n","export function titleCaseWord(word) {\n  return word ? word.charAt(0).toUpperCase() + word.slice(1) : word;\n}\n\nexport function titleCase(str) {\n  return str ? str.split(' ').map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(' ') : str;\n}\n\nexport function tokensToString(arrTokens, delim = ', ') {\n  return Array.isArray(arrTokens) ? arrTokens.join(delim) : arrTokens;\n}\n\nexport function tokenToWords(token) {\n  return titleCase(token.replace(/_/g, ' '));\n}\n\nconst parseNumber = (str) => str ? +str : NaN;\n\nexport function idCompare(id1, id2) {\n  const num1 = parseNumber(id1);\n  const num2 = parseNumber(id2);\n  if (isNaN(num1) || isNaN(num2)) {\n    return false;\n  }\n  return num1 === num2;\n}\n\nexport function singularOrPlural(amount, singular, plural) {\n  return amount === 1 ? singular : plural;\n}\n","export function isObject(obj) {\n  return obj != null && obj.constructor.name === 'Object';\n}\n\nexport function isGuid(guid) {\n  return guid.length === 32 // hack for ALM uids\n    || /^[{]?[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}[}]?$/.test(guid);\n}\n","import React from 'react';\nimport './styles.scss';\n\ntype AdDisplayProps = {\n  url: string;\n  url_display: React.ReactNode|string;\n  image_url: string;\n  headline: string;\n  description: string;\n  html_description: React.ReactNode|string;\n  image?: {\n    id:string|number;\n    url:string;\n  };\n  logo?: {\n    id:string|number;\n    url:string;\n  };\n}\n/*\n * For static display of ad in its current state.\n * Used in lists or editor preview\n */\nconst AdDisplay = ({\n    url,\n    url_display,\n    image_url,\n    headline,\n    description,\n    html_description,\n  image,\n  logo\n                   }: AdDisplayProps) => (\n  <div className=\"ad-display\">\n    <div className=\"ad-display-img\">\n      {/* TBD: determine image size, maybe as params in request for ads */}\n      <img className=\"\" src={image?.url ?? image_url} width=\"180\" />\n    </div>\n    <div className=\"ad-display-body flex-fill\">\n      <h5>{headline}</h5>\n\n      <div className=\"d-flex\">\n        <div className=\"ad-display-description flex-fill\" dangerouslySetInnerHTML={{ __html: html_description || description }} />\n        {logo?.id  && (\n          <div className=\"ms-2\">\n            {' '}\n            <img className=\"\" src={logo.url} width=\"175\" />\n          </div>\n        )}\n      </div>\n\n      <div className=\"ad-display-url\">\n        <a href={url} onClick={(e) => e.preventDefault()}>\n          {url_display || url}\n        </a>\n      </div>\n    </div>\n  </div>\n);\n\n\nexport default AdDisplay;\n","import React, {useState} from 'react';\nimport {\n  Modal, ModalHeader, ModalBody, ModalFooter,\n  FormGroup, Label, Input, FormFeedback, Button, Spinner,\n} from 'reactstrap';\nimport {StandardAlert} from '@thedmsgroup/mastodon-ui-components';\nimport useApi from '../../../Hooks/useApi';\nimport {useReturnReasons} from '../../../Hooks/useReturnReasons';\n\ntype RequestReturnModalProps = {\n  isOpen: boolean;\n  accountId?: number | string;\n  saleId?: string;\n  product?: string;\n  onCancel: () => void;\n  onRequested: () => void;\n};\n\nconst RequestReturnModal = ({\n  isOpen,\n  accountId,\n  saleId,\n  product,\n  onCancel,\n  onRequested,\n}: RequestReturnModalProps) => {\n  const {reasons} = useReturnReasons(product);\n  const [reason, setReason] = useState('');\n  const [comment, setComment] = useState('');\n  const [submitted, setSubmitted] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const {api} = useApi();\n\n  const reset = () => {\n    setReason('');\n    setComment('');\n    setSubmitted(false);\n    setError(null);\n  };\n\n  const handleClose = () => {\n    reset();\n    onCancel();\n  };\n\n  const handleSubmit = async () => {\n    setSubmitted(true);\n    if (!reason) {\n      return;\n    }\n\n    setLoading(true);\n    setError(null);\n    const result = await api.endpoints.saleReturns.request({\n      account_id: accountId,\n      sale_id: saleId,\n      reason,\n      comment: comment || undefined,\n    });\n    setLoading(false);\n\n    if (result) {\n      reset();\n      onRequested();\n    } else {\n      setError(api.error?.message || api.error?.name || 'Failed to request return');\n    }\n  };\n\n  return (\n    <Modal isOpen={isOpen} toggle={handleClose} unmountOnClose>\n      <ModalHeader toggle={handleClose}>Request Return</ModalHeader>\n      <ModalBody>\n        <p>\n          The vendor will be notified and will approve or deny the return.\n        </p>\n\n        {error && <StandardAlert color=\"danger\">{error}</StandardAlert>}\n\n        <FormGroup>\n          <Label htmlFor=\"return-reason\">Reason for Return <span className=\"text-danger\">*</span></Label>\n          <Input\n            id=\"return-reason\"\n            type=\"select\"\n            value={reason}\n            onChange={(e) => setReason(e.target.value)}\n            invalid={submitted && !reason}\n          >\n            <option value=\"\">Please select...</option>\n            {reasons.map((r) => <option key={r.name} value={r.name}>{r.label}</option>)}\n          </Input>\n          <FormFeedback>Reason is required</FormFeedback>\n        </FormGroup>\n\n        <FormGroup>\n          <Label htmlFor=\"return-comment\">Additional Comments</Label>\n          <Input\n            id=\"return-comment\"\n            type=\"textarea\"\n            rows={3}\n            value={comment}\n            onChange={(e) => setComment(e.target.value)}\n          />\n        </FormGroup>\n      </ModalBody>\n      <ModalFooter>\n        <Button color=\"link\" onClick={handleClose} disabled={loading}>Cancel</Button>\n        <Button color=\"primary\" onClick={handleSubmit} disabled={loading}>\n          {loading ? <><Spinner size=\"sm\" className=\"me-2\" />Requesting...</> : 'Request Return'}\n        </Button>\n      </ModalFooter>\n    </Modal>\n  );\n};\n\nexport default RequestReturnModal;\n","import React, {\n  useState, useEffect,\n} from 'react';\n\nimport EnhancedSelect from \"../../../../Components/Form/EnhancedSelect\";\nimport { Table, Badge, Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { Link } from 'react-router-dom';\nimport {\n  notify,\n  StandardAlert,\n  //HelpPopper,\n  //MaskedInputGroup,\n  Utils\n} from \"@thedmsgroup/mastodon-ui-components\";\n\nimport useApi from '../../../../Hooks/useApi';\nimport {ChannelSourceRoute} from \"../../../Routing/Rules\";\nimport {SourceOptionLabel} from \"../../../../Components/Form/Select/SourceOptionLabel\";\nimport EntityId from \"../../../../Components/Table/EntityId\";\nimport {Channel, ChannelSource, ProductType} from \"../../../../types\";\n//import IconCheckbox from '../../../Components/Form/IconCheckbox';\n//import StatusToggler from \"../../../Components/Form/StatusToggler\";\n\n\n// We decided to allow distribution to be nullable\n// import * as Yup from \"yup\";\n// const ChannelSourceValidation = (\n//   Yup.addMethod(Yup.mixed, 'validChannelSources', function(message) {\n//     return this.test('test-channel-sources', message,\n//       function(channelSources) {\n//         let valid = true;\n//         channelSources.map( (item) => {\n//           //console.log('ChannelSourceDetail.js:testing', item, parseInt(item.distribution));\n//           if( isNaN(parseInt(item.distribution))){\n//             valid = false;\n//           }\n//         });\n//\n//         return valid;\n//       })\n//   })\n// );\n//\n// const ChannelSourceValidationSchema = Yup.object().shape({\n//   sources: Yup.mixed().validChannelSources('Please check that all dates are filled out, and from/to dates are in the right order'),\n// });\n\n// const PercentMaskOptions = {\n//   mask: Number,\n//   unmask: true,\n//   scale:0,\n//   max:100,\n//   signed: false,\n// }\n\nconst DefaultChannelSource = {\n  id:0,\n  name:\"\",\n  status: \"\",\n  eligibility: {\n    distribution:\"\",\n    fixed_distribution:false,\n    status: \"active\"\n  }\n}\n\n/*\n * Channel Sources\n * Table and inputs for editing \"channel eligibilities\" (sources that distribute on a channel)\n *\n * Note: we are no longer using the distribution, fixed, or status field, though they are still in the data structure\n */\ntype ChannelSourcesProps = {\n  channel:Channel,\n  //product:ProductType,\n // verticalId: number,\n  sources:ChannelSource[],\n  onChange:(sources:ChannelSource[])=>void,\n  onOpenRules:(cs:ChannelSourceRoute)=>void\n}\n\nexport const ChannelSources = ({ channel, sources, onChange, onOpenRules }:ChannelSourcesProps) => {\n\n  const [sourceOptions, setSourceOptions] = useState([]);\n  const [addIndex, setAddIndex] = useState<null|number>(null);\n\n  // We must have channel vertical and product in order to get the source options\n  // (In channel creation mode, user might not have picked these yet)\n  const isReady = channel && channel.product && channel.vertical;\n  //const sortDistributionDesc = (items:any[]) => items.sort((a, b) => (parseInt(a.distribution) < parseInt(b.distribution) ? 1 : -1));\n\n  const { api } = useApi();\n\n  useEffect(() => {\n    if (isReady) {\n      loadSourceOptions()\n    }\n  }, [channel])\n\n  const loadSourceOptions = async() => {\n    const result = await api.endpoints.sources.list({\n      options:true,\n      product:channel.product,\n      vertical_id:channel.vertical.id\n    })\n\n    if (result) {\n\n      setSourceOptions(result.map((s:any )=> {\n        return {\n          value:s.id,\n          label:s.name,\n          status:s.status,\n          vertical:s.vertical,\n          product:s.product\n        }\n      }),)\n    }\n  }\n\n  // const handleChangeDistribution = useCallback((val:string, index:number) => {\n  //   const sources = [...formValues.sources];\n  //\n  //   if (sources[index]) {\n  //     sources[index].eligibility.distribution = val;\n  //     formApi.setValues({ sources });\n  //   }\n  // }, [formValues]);\n\n  // const handleChangeFixed = useCallback((fixed:boolean, index:number) => {\n  //   const sources = [...formValues.sources];\n  //   if (sources[index]) {\n  //     sources[index].eligibility.fixed_distribution = fixed;\n  //\n  //     formApi.setValues({ sources });\n  //   }\n  // }, [formValues]);\n  //\n  // const handleChangeEligibilityStatus = useCallback((status:string, index:number) => {\n  //   const sources = [...formValues.sources];\n  //   if (sources[index]) {\n  //     sources[index].eligibility.status = status;\n  //\n  //     formApi.setValues({ sources });\n  //   }\n  // }, [formValues]);\n\n  const handleChangeSource = (source:ChannelSource, index:number) => {\n    const newSources = [...sources]\n    if (newSources[index]) {\n      newSources[index] = source\n      onChange(newSources)\n    }\n  }\n\n  const handleAddNew = () => {\n    const newSources = removeEmptySources(sources);\n    newSources.push({...DefaultChannelSource})\n    setAddIndex(newSources.length - 1)\n    onChange(newSources)\n  }\n\n  //We're just removing rows without selected sources instead of bothering with validation\n  const removeEmptySources = (arr:any[]) =>  arr.filter(src => src.id)\n\n\n  const handleRemove = (index:number) => {\n    let newSources = [...sources]\n    newSources.splice(index, 1)\n    newSources = removeEmptySources(newSources)\n    onChange(newSources)\n    setAddIndex(null)\n  };\n\n\n  const handleOpenRules = (index:number) => {\n    const source = sources[index]\n\n    if (source) {\n      if (channel.id && source.eligibility.rule_id) {\n        onOpenRules(new ChannelSourceRoute(channel, source))\n      } else {\n        notify('Please save before editing rules', 'info', { containerId: `channel-source-${channel.id}` });\n      }\n    }\n  };\n\n  return isReady ? (\n    <div className=\"channel-sources\">\n\n        <div className=\"source-rows\">\n          {sources.length > 0 ? (\n            <Table>\n              <thead>\n              <tr>\n                <th>Source</th>\n                {/*                <th>\n                  Distribution{' '}\n                  <HelpPopper name=\"source-distribution\" title=\"Distribution\">\n                    Optionally specify a distribution percentage.\n                    The value may be automatically raised to adjust for low volume\n                    in other sources. When fixed, the distribution will not change.\n                  </HelpPopper>\n                </th>\n                <th>Status <HelpPopper name=\"channel-source-status\" title=\"Channel-Source Status\" iconClass=\"ms-1\">\n                  Activate or pause a specific channel source. This does not affect\n                  the status of the channel or source in general.\n                </HelpPopper></th>*/}\n                <th>&nbsp;</th>\n              </tr>\n\n              </thead>\n              <tbody>\n              {sources.map((source:any, i:any) => (\n                <ChannelSourceRow\n                  index={i}\n                  source={source}\n                  sourceOptions={sourceOptions}\n                  isNew={i === addIndex}\n                  onRemove={handleRemove}\n                  onChangeSource={handleChangeSource}\n                  //onChangeDistribution={handleChangeDistribution}\n                  // onChangeFixed={(value:boolean) => handleChangeFixed(value, i)}\n                  //onChangeEligibilityStatus={(status:string) => handleChangeEligibilityStatus(status, i)}\n                  openRules={handleOpenRules}\n                  key={`source-${i}`}\n                />\n              ))}\n              </tbody>\n\n            </Table>\n          ) : (\n            <StandardAlert color=\"light\">No sources are assigned.</StandardAlert>\n          )}\n\n        </div>\n\n        <div className=\"mb-2\">\n          <Button color=\"link\" size=\"sm\" onClick={handleAddNew}  >\n            <FaIcon icon=\"plus\" />{' '}Source\n          </Button>\n        </div>\n\n\n\n    </div>\n  ) : (\n    <StandardAlert icon=\"alert\" color=\"warning\">\n      A vertical and product for the channel must be selected before configuring a channel&apos;s sources\n    </StandardAlert>\n  )\n};\n\n\n\ntype ChannelSourceRowProps = {\n  index:number,\n  isNew:boolean,\n  source:any,\n  onRemove:(index:number) => void,\n  onChangeSource: (source:ChannelSource, index:number)=>any,\n  //onChangeDistribution: (value:string, index:number)=>any,\n  //onChangeFixed: (value:boolean, index:number)=>any,\n  //onChangeEligibilityStatus: (value:string, index:number)=>any,\n  openRules: (index:number)=>any,\n  sourceOptions: any[]\n}\nconst ChannelSourceRow = ({\n  index,\n  isNew,\n  source,\n  onRemove,\n  onChangeSource,\n // onChangeDistribution,\n  //onChangeFixed,\n // onChangeEligibilityStatus,\n  openRules,\n  sourceOptions\n}:ChannelSourceRowProps) => {\n\n  const handleSelectSource = (sourceId:string) => {\n    const source = sourceOptions.find((s) => s.value.toString() === sourceId);\n\n    if ( source ) {\n      onChangeSource({\n        id: source.value,\n        name: source.label,\n        status: source.status,\n        eligibility: {\n          distribution:\"\",\n          fixed_distribution: false,\n          status: \"active\"\n        }\n      } , index);\n    }\n  }\n\n  return (\n    <tr className=\"channel-source-row align-items-center\">\n\n      {isNew ? (\n        <td valign=\"middle\">\n\n            <EnhancedSelect\n              isClearable\n              isSearchable\n              onChange={handleSelectSource}\n              options={sourceOptions}\n              value={source.id.toString()}\n              tabSelectsValue\n              backspaceRemovesValue\n              isMulti={false}\n              controlShouldRenderValue\n              hideSelectedOptions\n              closeMenuOnSelect\n              placeholder=\"Select Source (type to search)\"\n              isInvalid={false}\n              formatOptionLabel={SourceOptionLabel}\n             // menuIsOpen={true}\n            />\n\n        </td>\n      ) : (\n        <td  valign=\"middle\">\n          <Button\n            size=\"sm\"\n            tag={Link}\n            color=\"link\"\n            className=\"inline text-start\"\n            to={`/publishing/sources/${source.id}`}\n            target=\"_blank\"\n          >\n            <EntityId id={source.id}/>\n            {source.name}\n          </Button>\n          {source.status !== \"active\" && <Badge size=\"xs\" color={source.status === 'archived'?'danger':'warning'} className=\"ms-1\">{Utils.titleCase(source.status)}</Badge>}\n        </td>\n      )}\n      <td className=\"\">\n\n      </td>\n      <td className=\"\">\n\n      </td>\n\n{/*      <td className=\" d-flex align-items-center\">\n        <SourceDistributionInput value={source.eligibility.distribution} onChange={(value:string) => onChangeDistribution(value, index)}/>\n\n        <SourceDistributionFixedCheckbox value={!!source.eligibility.fixed_distribution} onChange={(fixed:boolean) => onChangeFixed(fixed, index)}/>\n      </td>\n      <td valign=\"middle\">\n        <div className=\"d-flex flex-nowrap align-items-center\">\n          <StatusToggler\n            status={source.eligibility.status}\n            target={index}\n            onChange={(id, status) => onChangeEligibilityStatus(status, id)}\n            showArchived={false}\n            allowEdit={true}\n          />\n        </div>\n      </td>*/}\n      <td valign=\"middle\" className=\"text-end\">\n        {/* Newly added, unsaved channel sources can't edit rules because they don't have IDs first */}\n        <Button\n          color=\"link\"\n          className=\"inline me-3\"\n          onClick={() => openRules(index)}\n          title=\"Channel-Source routing rules\"\n          disabled={!source.eligibility.rule_id}\n        >\n          <FaIcon icon=\"clipboard-list\" size=\"sm\" />\n          {\" \"}\n          Routing Rules\n        </Button>\n\n        <Button onClick={()=>onRemove(index)} color=\"link\" size=\"sm\" className=\"inline\" title=\"Remove\">\n          <FaIcon icon=\"times\" size=\"sm\" color=\"darkred\"/>\n        </Button>\n      </td>\n\n    </tr>\n  )\n};\n\n\n// type SourceDistributionInputProps = {\n//   value:string|number,\n//   onChange:(value:string) => void\n// }\n// const SourceDistributionInput = ({ value, onChange }:SourceDistributionInputProps) => (\n//\n//   <MaskedInputGroup\n//     className=\"teeny text-end\"\n//     {...PercentMaskOptions}\n//     value={value !== null ? value.toString() : ''}\n//     onAccept={(value) => onChange(value)}\n//     //invalid={!!formErrors.interval}\n//     placeholder={!value && value !== '0' ? 'open' : ''}\n//     suffix=\"%\"\n//   />\n// );\n//\n//\n//\n// type SourceDistributionFixedCheckboxProps = {\n//   value:boolean,\n//   onChange:(value:boolean) => void\n// }\n// const SourceDistributionFixedCheckbox = ({ value, onChange }:SourceDistributionFixedCheckboxProps) => (\n//   <div className=\"ms-3 d-flex flex-nowrap align-items-center\">\n//     <IconCheckbox\n//       name=\"fixed_distribution\"\n//       value={!!value}\n//       onChange={onChange}\n//     >Fixed</IconCheckbox>\n//   </div>\n//);\n\n","import React from \"react\";\nimport {CopyButton, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport {FormFeedback, FormGroup, FormText, Input, Label} from \"reactstrap\";\nimport * as Yup from \"yup\";\n\nexport const VendorValidationSchema = Yup.object().shape({\n  name: Yup.string().trim().required('Vendor name is required'),\n})\n\n\ntype VendorFormProps = {\n  vendor:any;\n  values:Record<string, any>;\n  errors:Record<string, any>;\n  onChange: (e:React.ChangeEvent<HTMLInputElement>) => void;\n  isNew?:boolean;\n  isValid:boolean;\n}\n\nexport const VendorForm = ({\n  vendor,\n  values,\n  errors,\n  onChange,\n  isNew,\n  isValid,\n}:VendorFormProps) => {\n\n  //vendor could have multiple auth tokens but we display only one as the 'api key'\n  const authToken = vendor?.auth_tokens?.[0]?.token || '';\n\n  return (\n    <div className=\"vendor-form\">\n      {!isValid\n        && (\n          <StandardAlert icon=\"alert\" color=\"warning\" className=\"my-2 alert-form-validation\">\n            Please correct the errors below before continuing\n          </StandardAlert>\n       )}\n\n\n      <FormGroup >\n        <Label for=\"method\">Name</Label>\n        <Input\n          type=\"text\"\n          bsSize=\"sm\"\n          name=\"name\"\n          value={values.name}\n          onChange={onChange}\n          invalid={!!errors.name}\n        />\n        <FormFeedback>{errors.name}</FormFeedback>\n      </FormGroup>\n\n\n      <FormGroup>\n        <Label>API Key</Label>\n        <div>\n          {isNew ? (\n            <FormText className=\"mb-2\">An API key will be automatically created</FormText>\n          ) : (\n            <>\n              {authToken ? (\n                <>\n                  {authToken}{' '}\n                  <CopyButton\n                    id={`copy-token`}\n                    textToCopy={authToken}\n                    buttonSize=\"sm\"\n                    className=\"m-0 ms-1 p-0\"\n                  />\n                </>\n              ) : (\n                <i>none</i>\n              )}</>\n          )}\n        </div>\n      </FormGroup>\n\n      <FormGroup>\n        <Label>Crypto Key</Label>\n        <div>\n          {isNew ? (\n            <FormText className=\"mb-2\">A crypto key will be automatically created</FormText>\n          ) : (\n            <>\n              {vendor?.crypto_key ? (\n                <>\n                  {vendor.crypto_key}{' '}\n                  <CopyButton\n                    id={`copy-crypto`}\n                    textToCopy={vendor.crypto_key}\n                    buttonSize=\"sm\"\n                    className=\"m-0 ms-1 p-0\"\n                  />\n                </>\n              ) : (\n                <i>none</i>\n              )}</>\n          )}\n        </div>\n      </FormGroup>\n    </div>\n  )\n}\n","import React, {FC, useRef, useMemo} from \"react\";\nimport {RoutingMap} from \"./index\";\nimport {Button, Modal, ModalBody, ModalHeader, Input} from \"reactstrap\";\nimport {ModalBaseType} from \"../../../types\";\nimport {Link} from \"react-router-dom\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\n\ntype RoutingMapModalPropertiesType = ModalBaseType & {\n  sourceId?:number;\n  channelId?:number;\n  orderId?:number;\n  accountId?:number;\n  vendorId?:number;\n};\n\nconst RoutingMapModal: FC<RoutingMapModalPropertiesType> = ({\n                                                        isOpen,\n                                                        toggle,\n                                                        title=\"Routing Map\",\n  sourceId,\n  channelId,\n  orderId,\n  vendorId,\n  accountId\n}) => {\n  const query = useMemo(()=>{\n    if (sourceId) {\n      return `?source=${sourceId}`;\n    } else if (channelId) {\n      return `?channel=${sourceId}`;\n    } else if (orderId) {\n      return `?account=${accountId}&order=${sourceId}`;\n    }\n  }, [sourceId, channelId, orderId, accountId])\n\n  const copyAreaRef = useRef();\n\n  const handleCopyLink = () => {\n\n    if (copyAreaRef.current) {\n      //@ts-ignore\n      copyAreaRef.current.value = `${location.protocol}//${location.host}/#/routing${query}`;\n      //@ts-ignore\n      copyAreaRef.current.select();\n      document.execCommand('copy');\n      notify('Link copied', 'success', { autoClose: 1000 });\n    }\n\n  };\n\n  return (\n    <Modal isOpen={isOpen} toggle={toggle} size=\"full\" >\n      <ModalHeader toggle={toggle}>{title}</ModalHeader>\n\n      <div className=\"ms-3\">\n        <Link\n          target=\"_blank\"\n          to={{\n          pathname:\"/routing\",\n          search: query\n        }} className=\"link routing-link p-0\">\n          <FaIcon icon=\"external-link-alt\" size=\"sm\" />\n          {' '}\n          Permalink\n        </Link>\n        <Button color=\"link\" size=\"sm\" className=\"inline ms-1\" onClick={handleCopyLink} title=\"Copy routing map link\">\n          <FaIcon icon=\"copy\" size=\"sm\" />\n        </Button>\n      </div>\n\n      {/* Hidden from view, used for copy to clipboard */}\n      <div id=\"copy-url\">\n        <Input\n          type=\"text\"\n          defaultValue=\"\"\n          //@ts-ignore\n          innerRef={copyAreaRef}\n        />\n      </div>\n\n      <ModalBody>\n        <RoutingMap\n          useQuery={false}\n          sourceId={sourceId}\n          channelId={channelId}\n          orderId={orderId}\n          accountId={accountId}\n          vendorId={vendorId}\n        />\n      </ModalBody>\n    </Modal>\n  )\n}\n\nexport default RoutingMapModal;\n","import BaseAPI from \"../../../Services/BaseAPI\";\n\nclass RoutingApi extends BaseAPI {\n  constructor() {\n    super(process.env.API_URL_CORE);\n  }\n\n  sourceRoutes = (id)     => this.makeRequest('get', `${this.url}/routing/source/${id}`);\n  channelRoutes = (id)    => this.makeRequest('get', `${this.url}/routing/channel/${id}`);\n  vendorRoutes = (id, params={})    => this.makeRequest('get', `${this.url}/routing/vendor/${id}`, params);\n  ordersForChannel = (id) => this.makeRequest('get', `${this.url}/orders/channel/${id}`);\n  channelsForOrder = (id) => this.makeRequest('get', `${this.url}/routing/order/${id}`);\n}\n\nexport default RoutingApi\n","import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport EntityId from \"../../Table/EntityId\";\nimport {Badge} from 'reactstrap';\nimport {titleCase} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport React from \"react\";\n\ntype ChannelOptionType = {\n  value:number|string,\n  label:string,\n  status?:string,\n  product?:string,\n  vertical?: {\n    id?:number;\n    name:string;\n    display_name:string;\n  }\n}\n\n/*\n * A function that can be provided as react-select's formatOptionLabel function\n * on a channel selector, to show more channe info than just the name.\n *\n * Value is assumed to be the source id, and label == name\n * Status has to be programmatically added to the option values,\n * if you want to show it\n */\n//TODO: not sure how to get meta type from 'react-select'. Object that has a 'context' string\nexport const ChannelOptionLabel = (\n  option:ChannelOptionType, meta:any,  selected:boolean\n) => (\n\n  <div className=\"d-flex justify-content-between\">\n    <div className=\"d-flex\">\n      {meta.context === 'menu' && <div>{selected && <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\"/>}</div>}\n      <div><EntityId id={option.value} className=\"me-1\"/></div>\n      <div>\n        <div>{option.label}</div>\n        {option.vertical && option.product && meta.context === 'menu' && <div>\n          <small>{titleCase(option.product)} |  {option.vertical.display_name}</small>\n        </div>}\n      </div>\n    </div>\n\n      <div>\n        {/* Just indicating paused or archived (active assumed) */}\n        {option.status && option.status !== 'active' &&\n          <Badge size=\"xs\" className=\"ms-1\" color={option.status === 'archived' ? 'danger' : 'warning'}>{titleCase(option.status)}</Badge>}\n      </div>\n\n  </div>\n);\n\n","import React, {  useState, useEffect } from 'react';\nimport classnames from 'classnames';\nimport {Spinner} from \"reactstrap\";\nimport {Filter} from \"../../../Components/Table/Filter\";\nimport {ProductChoices} from \"../../../Components/Table/FilterChoices\";\nimport useApi from \"../../../Hooks/useApi\";\nimport {SourceOptionLabel} from \"../../../Components/Form/Select/SourceOptionLabel\";\nimport {ChannelOptionLabel} from \"../../../Components/Form/Select/ChannelOptionLabel\";\n\nconst TargetChoices = [\n  { value: 'source', label: 'Source' },\n  { value: 'channel', label: 'Channel' },\n  { value: 'vendor', label: 'Vendor' },\n  { value: 'order', label: 'Order' },\n];\n\nconst Filters = ({filters, loading, onChange}) => {\n\n  const { api } = useApi();\n  const [loadingOrders, setLoadingOrders] = useState(false);\n  const [choices, setChoices] = useState({});\n  const targetFromFilters = () => {\n    if (filters.account) {\n      return \"order\"\n    } else if (filters.channel) {\n      return \"channel\"\n    } else if (filters.vendor) {\n      return \"vendor\"\n    }\n    return \"source\";\n  }\n  const [targetObject, setTargetObject] = useState(targetFromFilters());\n\n\n  // onLoad, get choices\n  useEffect(() => {\n\n      const getChoices = async()=>{\n\n        const requests = [\n          {endpoint:'verticals',action:'list'},\n          {endpoint:'vendors',action:'list', params:{limit:0} },\n          {endpoint:'channels',action:'list', params:{options:true} },\n          {endpoint:'accounts',action:'options'},\n          {endpoint:'sources',action:'list', params:{options:true}}\n        ];\n        if (filters.account) {\n          requests.push({endpoint:'orders',action:'list', params:{account_id:filters.account}})\n        }\n        const batches =  await api.batchGet(requests)\n        if(batches && batches.length){\n          const[verticals, vendors, channels, accounts, sources, orders] = batches;\n          setChoices({\n            target: TargetChoices,\n            product: [{label:\"Any\", value:\"\"}, ...ProductChoices],\n            source: sources.map((s )=> {\n              return {\n                value:s.id,\n                label:s.name,\n                status:s.status,\n                vertical:s.vertical,\n                product:s.product\n              }\n            }),\n            channel: channels.map( item => { return {value:item.id, label:item.name}}),\n            vertical: [{label:\"Any\", value:\"\"}, ...verticals.map( item => { return {value:item.id, label:item.display_name}})],\n            vendor: vendors.data.map( item => { return {value:item.id, label:item.name}}),\n            account: accounts.map( item => { return {value:item.id, label:item.name}}),\n            order: orders ? orders.map( item => { return {value:item.id, label:item.name}}) : []\n          })\n        }\n      };\n\n      if(Object.keys(choices).length === 0) getChoices();\n\n  }, []);\n\n  // Adjust the target if parent changes the filters (example: back button)\n  useEffect(() => {\n    const target = targetFromFilters();\n    if (target !== targetObject) {\n      if (filters.account) {\n        getAccountOrders(filters.account);\n      }\n      setTargetObject(target);\n    }\n  }, [filters])\n\n\n  const handleChangeFilter = (param, value) => {\n   // console.log(\"Filters.js:handleChangeFilter\", param, value, typeof value );\n    // target type vendor: can be combined with product and vertical filters\n    // target type order: requires account and order filter\n    // target type source and channel: no other filters\n    let newFilters;\n    const vendorFilterGroup = ['vendor','product', 'vertical']\n    const orderFilterGroup = ['order','account']\n    if (value) {\n      if ((targetObject === \"vendor\" && vendorFilterGroup.includes(param))\n        || (targetObject === \"order\" && orderFilterGroup.includes(param))\n      ) {\n        //target with multiple filters, allow based on targetObject\n        newFilters = Object.entries(filters).reduce((acc, [key,val]) => {\n          if (targetObject === \"vendor\" && vendorFilterGroup.includes(key) ) {\n            acc[key] = val\n          }else if (targetObject === \"order\" && orderFilterGroup.includes(key) ) {\n            acc[key] = val\n          }\n          return acc\n        }, {})\n        newFilters[param] = value\n\n\n      } else {\n        newFilters = { [param]: value }\n      }\n      onChange(newFilters);\n      if (param === 'account') {\n        getAccountOrders(value);\n      }\n    } else {\n      newFilters = { ...filters }\n      delete newFilters[param];\n      onChange(newFilters);\n    }\n  }\n\n  // target choice is not part of URL params\n  const handleChangeTarget = (param, target) => {\n    setTargetObject(target);\n  }\n\n  //TODO wire up\n  const handleClearFilters = () => {\n    onChange({});\n  }\n\n  const getAccountOrders = async(account_id) => {\n    if (account_id) {\n      setLoadingOrders(true);\n      const orders = await api.endpoints.orders.list({account_id});\n      if (orders) {\n        setChoices(prev => {\n          return {...prev, order: orders.map((o)=> {\n              return {value:o.id, label:o.name}\n            })}\n        })\n\n        if (orders.length === 1 && !filters.order) {\n          handleChangeFilter('order', orders[0].id)\n        }\n      }\n      setLoadingOrders(false);\n    }\n\n  }\n\n  return (\n    <div className=\"d-flex position-relative\">\n      <div className={classnames(['loading-overlay', { show: loading }])} />\n      <div className=\"d-flex\">\n\n\n        <div style={{width:'150px'}}>\n          <Filter\n            label=\"Map from\"\n            placeholder=\"Target\"\n            param=\"target\"\n            options={choices.target ?? []}\n            value={targetObject}\n            onChange={handleChangeTarget}\n            isMulti={false}\n            isClearable={false}\n          />\n        </div>\n\n        {targetObject === \"source\" && (\n          <div style={{width:'400px'}} className=\"min-250\">\n            <Filter\n              label=\"&nbsp;\"\n              placeholder=\"Select source\"\n              param=\"source\"\n              options={choices.source ?? []}\n              value={filters?.source || \"\"}\n              onChange={handleChangeFilter}\n              //getOptionValue={(item)=>item.id.toString()}\n              isMulti={false}\n              isClearable={false}\n              formatOptionLabel={SourceOptionLabel}\n            />\n          </div>\n        )}\n        {targetObject === \"channel\" && (\n          <div style={{width:'400px'}}  className=\"min-250\">\n            <Filter\n              label=\"&nbsp;\"\n              placeholder=\"Select channel\"\n              param=\"channel\"\n              options={choices.channel ?? []}\n              value={filters?.channel || ''}\n              onChange={handleChangeFilter}\n              isMulti={false}\n              isClearable={false}\n              formatOptionLabel={ChannelOptionLabel}\n            />\n          </div>\n        )}\n        {targetObject === \"vendor\" && (\n          <>\n            <div  style={{width:'300px'}} >\n              <Filter\n                label=\"&nbsp;\"\n                placeholder=\"Select vendor\"\n                param=\"vendor\"\n                options={choices.vendor ?? []}\n                value={filters?.vendor || ''}\n                onChange={handleChangeFilter}\n                isMulti={false}\n                isClearable={false}\n                formatOptionLabel={ChannelOptionLabel}\n              />\n            </div>\n            <div style={{width:'180px'}}>\n              <Filter\n                label=\"Product\"\n                placeholder=\"Any\"\n                param=\"product\"\n                options={choices.product || []}\n                value={filters?.product || \"\"}\n                onChange={handleChangeFilter}\n                isMulti={false}\n                isClearable={true}\n              />\n            </div>\n            <div  style={{width:'220px'}}>\n              <Filter\n                label=\"Vertical\"\n                placeholder=\"Any\"\n                param=\"vertical\"\n                options={choices.vertical ?? []}\n                value={filters.vertical || \"\"}\n                onChange={handleChangeFilter}\n                isMulti={false}\n              />\n            </div>\n          </>\n\n\n        )}\n\n        {targetObject === \"order\" && (\n          <>\n            <div style={{width:'300px'}} className=\"min-250\">\n              <Filter\n                label=\"Account\"\n                placeholder=\"Select account\"\n                param=\"account\"\n                options={choices.account ?? []}\n                value={filters?.account || []}\n                onChange={handleChangeFilter}\n                isMulti={false}\n                isClearable={false}\n              />\n            </div>\n\n\n              <div style={{width:'300px'}} className=\"min-250\">\n\n                <Filter\n                  label=\"Select order\"\n                  placeholder={filters.account ?  (choices.order?.length > 0 ? \"Select an order\" : \"No orders found\") : \"Select an account\"}\n                  param=\"order\"\n                  options={choices.order ?? []}\n                  value={filters?.order || []}\n                  onChange={handleChangeFilter}\n                  isMulti={false}\n                  isClearable={false}\n                  loading={loadingOrders}\n                />\n\n              </div>\n\n\n          </>\n\n        )}\n\n\n{/*\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Vertical\"\n            param=\"vertical.name\"\n            options={choices.vertical ?? []}\n            value={filters['vertical.name'] || []}\n            onChange={handleChangeFilter}\n            isMulti={false}\n          />\n        </div>\n\n        <div className=\"min-250\">\n          <Filter\n            placeholder=\"Product\"\n            param=\"product\"\n            options={choices.product ?? []}\n            value={filters['product'] || []}\n            onChange={handleChangeFilter}\n            isMulti={false}\n          />\n        </div>*/}\n\n      </div>\n\n    </div>\n  );\n};\n\nexport default Filters;\n","import type {StatusType} from \"../../../types\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport {Badge} from \"reactstrap\";\nimport React from \"react\";\n\n/*\n * A version of reactstrap badge to indicate archived or paused status\n */\nexport const StatusBadge = ({status}: {status:StatusType}) => {\n  if (!status || status === 'active') return null;\n  return (\n    <Badge title={`Status: ${status}`} className={`status-badge ${status}`}>\n      <FaIcon icon={status === 'archived' ? 'archive':'pause'} size='1x' /> {Utils.titleCase(status)}\n    </Badge>\n  )\n}\n","import React from 'react';\nimport classnames from \"classnames\";\nimport {Button} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {RelativeTime, Utils} from '@thedmsgroup/mastodon-ui-components';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport { Handle } from '@xyflow/react';\nimport {DataRow, DataRows} from \"../../../Components\";\nimport {StatusBadge} from \"./StatusBadge\";\nimport type {FlowNodeProps} from \"./index\";\n\n\ntype SourceNodeProps = FlowNodeProps & {\n  onEdit:(source:any) =>void,\n  onExamine:(sourceId:number) =>void,\n  onOpenRules:(source:any) =>void,\n}\n\n\nexport const SourceNode = (\n  {\n    //Passed by react-flow\n    targetPosition,\n    sourcePosition,\n    data,\n    //Additional properties\n    onEdit,\n    onExamine,\n    onOpenRules,\n\n  }:SourceNodeProps\n) => {\n  const {source, dataView, flowView} = data;\n\n  const handleEdit = (e: any) => {\n    e.stopPropagation();\n    onEdit(source);\n  }\n\n  const handleExamine = (e: any) => {\n    e.stopPropagation();\n    onExamine(source.id);\n  }\n\n  const handleOpenRules = (e: any) => {\n    e.stopPropagation();\n    onOpenRules(source);\n  }\n\n  const  handleGotoAuction = (e: any) => {\n    e.stopPropagation()\n    window.open(`#/auctions?page=1&source=${source.id}`, '_blank')\n  }\n\n  return (\n\n      <div className={classnames(\"node source\", source.status, {'route-focus':flowView === 'source'})} >\n        <StatusBadge status={source.status} />\n        <Handle id=\"target-handle\" type=\"target\" position={targetPosition} />\n        <Handle id=\"source-handle\" type=\"source\" position={sourcePosition} />\n        <div className=\"node-header\">\n          <div className=\"icon-col\">\n            <EntityId id={source.id} title=\"Source ID\" className=\"me-1\"/>\n          </div>\n          <div className=\"node-title flex-fill\">\n              <div>\n                  {source.name}\n              </div>\n              <div className=\"actions\">\n                <Button color=\"link\" size=\"sm\" onClick={handleExamine} title=\"Examine source routes\" disabled={flowView === 'source'}>\n                  <FaIcon icon=\"eye\" size=\"sm\"/>\n                </Button>\n                <Button color=\"link\" size=\"sm\" onClick={handleEdit} title=\"Edit source\">\n                  <FaIcon icon=\"cog\" size=\"sm\"/>\n                </Button>\n                <Button color=\"link\" size=\"sm\" onClick={handleOpenRules} title=\"View/Edit routing rule\">\n                  <FaIcon icon=\"clipboard-list\" size=\"sm\"/>\n                </Button>\n                <Button\n                  color=\"link\"\n                  size=\"sm\"\n                  title=\"View auctions\"\n                  onClick={handleGotoAuction}\n                >\n                  <FaIcon icon=\"comment-dollar\" size=\"sm\"/>\n                </Button>\n              </div>\n            </div>\n\n          </div>\n\n        {/* If mapper is focused on one source, show product/vertical */}\n        {flowView === 'source' && (\n          <div className=\"node-detail d-flex\">\n\n              <div className=\"icon-col\">\n                <FaIcon icon=\"info-circle\" size=\"sm\"/>\n              </div>\n              <DataRows labelWidth=\"60px\" noDivider gap=\"0.1em\" className=\"flex-fill\">\n                <DataRow label=\"Product\">{Utils.titleCase(source.product)}</DataRow>\n                <DataRow label=\"Vertical\">{Utils.titleCase(source.vertical.display_name)}</DataRow>\n              </DataRows>\n\n          </div>\n        )}\n\n          {dataView.includes(\"sales\") && (\n            <div className=\"node-detail d-flex\">\n                <div className=\"icon-col\">\n                  <FaIcon icon=\"calendar\" size=\"sm\"/>\n                </div>\n                <div className=\"flex-fill\">\n                  <div>\n                    <label>Match:</label> <RelativeTime date={source.last_matched_at} uniqueId={`src-${source.id}-match`} showTimezone={true} />\n                  </div>\n                  <div>\n                    <label>Sale:</label> <RelativeTime date={source.last_sold_at} uniqueId={`src-${source.id}-sale`} showTimezone={true} />\n                  </div>\n                </div>\n\n            </div>\n          )}\n\n\n      </div>\n\n\n  )\n}\n\n","import React from 'react';\nimport classnames from \"classnames\";\nimport {Button} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {ChannelSourceRoute} from \"../Rules\";\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport {Handle} from \"@xyflow/react\";\nimport {FlowNodeProps} from \"./index\";\n\n\ntype EligibilityNodeProps = FlowNodeProps & {\n  onLinkSourceToChannel:(source:any) =>void,\n  onOpenRules:(channelSourceRoute:ChannelSourceRoute) =>void,\n  onOpenChannelSources:(channel:any) =>void,\n}\n\n\nexport const EligibilityNode = (\n  {\n    //Passed by react-flow\n    targetPosition,\n    sourcePosition,\n    data,\n    //additional properties\n    onOpenRules,\n    onLinkSourceToChannel,\n    onOpenChannelSources,\n  }:EligibilityNodeProps\n) => {\n\n  const {eligibility, source, channel, alert, dataView} = data;\n\n  if (!eligibility) return null;\n\n\n  const handleOpenRule = (e: any) => {\n    e.stopPropagation();\n    if (data.source && data.channel) {\n      onOpenRules(new ChannelSourceRoute(channel, {...source, eligibility}));\n    }\n  }\n\n  const handleLinkChannelSource = (e:any) => {\n    e.stopPropagation();\n    if (data.source ) {\n      onLinkSourceToChannel(source);\n    }\n  }\n\n  const handleOpenChannelSources = (e:any) => {\n    e.stopPropagation();\n    onOpenChannelSources(channel);\n\n  }\n\n\n  const compositeId = `${source.id}-${channel.id}`\n\n  return (\n    <div className={classnames(\"node eligibility\", {alert})}>\n      <Handle id=\"target-handle\" type=\"target\" position={targetPosition} />\n      <Handle id={'source-handle'} type=\"source\" position={sourcePosition} />\n\n        <div className=\"node-header\">\n          <div className=\"node-title flex-fill\">\n            {channel.id > 0 && source.id > 0 && (\n              <div className=\"fw-normal\">\n                <i>Source eligibility for channel</i>\n              </div>\n            )}\n\n            {(source.id > 0 && !channel.id )&& (\n              <div className=\"alert-message w-100 d-flex flex-nowrap align-items-center\">\n                <div><FaIcon icon=\"exclamation-triangle\" size=\"sm\" className=\"me-1\"/></div>\n                <div className=\"flex-fill\"><i>Source not used by a channel</i></div>\n                <Button color=\"link\" size=\"xs\" onClick={handleLinkChannelSource} title=\"Link a channel to this source\">\n                  <FaIcon icon=\"plus\" size=\"sm\"/> Add\n                </Button>\n              </div>\n            )}\n\n            {(channel.id > 0 && !source.id) && (\n              <div className=\"alert-message w-100 d-flex flex-nowrap\">\n                <div><FaIcon icon=\"exclamation-triangle\" className=\"me-1\" size=\"sm\"/></div>\n                <div className=\"flex-fill\"><i> Channel has no sources</i></div>\n                <Button color=\"link\" size=\"xs\" onClick={handleOpenChannelSources} title=\"Link a source to this channel\">\n                  <FaIcon icon=\"plus\" size=\"sm\"/> Add\n                </Button>\n              </div>\n            )}\n\n\n            {channel.id > 0 && source.id > 0 && (\n              <div className=\"actions\">\n                {/* Removed the modal in favor of editing eligibilities from the channel */}\n                {/*<Button color=\"link\" size=\"sm\" onClick={handleOpenSettings} title=\"Edit eligibility settings\" className=\"me-1\">\n                <FaIcon icon=\"cog\" size=\"sm\"/>\n              </Button>*/}\n                <Button color=\"link\" size=\"sm\" onClick={handleOpenRule} title=\"View/Edit routing rule\">\n                  <FaIcon icon=\"clipboard-list\" size=\"sm\"/>\n                </Button>\n              </div>\n            )}\n\n          </div>\n        </div>\n\n        {channel.id > 0 && dataView.includes(\"sales\") && (\n          <div className=\"node-detail d-flex\">\n              <div className=\"icon-col\">\n                <FaIcon icon=\"calendar\" size=\"sm\"/>\n              </div>\n              <div>\n                <div>\n                  <label>Match:</label> <RelativeTime date={eligibility.last_matched_at} uniqueId={`eg-${compositeId}-match`} showTimezone={true} />\n                </div>\n                <div>\n                  <label>Sale:</label> <RelativeTime date={eligibility.last_sold_at} uniqueId={`eg-${compositeId}-sale`} showTimezone={true} />\n                </div>\n              </div>\n\n          </div>\n        )}\n\n\n    </div>\n  )\n}\n","import React, {FC} from 'react';\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {FlowNodeProps} from \"./index\";\n\ntype InfoNodeData = {\n  message?:string|React.ReactNode,\n  infoIcon?:boolean\n}\ntype InfoNodeProps = FlowNodeProps<InfoNodeData>\n\nexport const InfoNode:FC<InfoNodeProps> = ({data}) => {\n  const {message, infoIcon} = data\n  return (\n    <div className=\"node info d-flex\">\n      {infoIcon && <div className=\"me-1\"><FaIcon icon=\"info-circle\"/></div>}\n      <div>{message}</div>\n    </div>\n  )\n}\n","import React, {FC} from 'react'\nimport {Button} from \"reactstrap\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport classnames from \"classnames\"\n\n\ntype LaneFilterNodeProps = {\n  data: {\n    filters?:string[]\n  },\n  onAdd?:(entity:string)=>void\n}\n\nexport const LaneFilterNode:FC<LaneFilterNodeProps> = ({data}) => {\n  const {filters} = data\n  return (\n    <div className={classnames(\"node filters\")}>\n\n      {filters && filters.length > 0 && (\n        <div><FaIcon icon=\"filter\" size=\"1x\" /> <b>FILTERS:</b> {filters.join(',')}</div>\n      )}\n\n    </div>\n  )\n}\n","import React from 'react'\nimport {Button} from \"reactstrap\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\"\nimport {RelativeTime} from '@thedmsgroup/mastodon-ui-components'\nimport EntityId from \"../../../Components/Table/EntityId\"\nimport { Handle } from '@xyflow/react'\nimport type {FlowNodeProps} from \"./index\";\nimport classnames from \"classnames\"\n\n\ntype VendorNodeProps = FlowNodeProps & {\n  onEdit:(vendor:any) =>void,\n  onExamine:(vendorId:number) =>void,\n  onOpenRules:(vendor:any) =>void,\n}\n\n\nexport const VendorNode = (\n  {\n    //passed by react-flow\n    sourcePosition,\n    data,\n    //Additional Properties\n    onEdit,\n    onExamine,\n    onOpenRules,\n\n  }:VendorNodeProps\n) => {\n  const {vendor, dataView, flowView} = data\n\n\n  const handleExamine = (e: any) => {\n    e.stopPropagation()\n    onExamine(vendor.id)\n  }\n\n  const handleOpenRules = (e: any) => {\n    e.stopPropagation()\n    onOpenRules(vendor)\n  }\n  const handleEdit = (e: any) => {\n    e.stopPropagation()\n    onEdit(vendor)\n  }\n\n  /*\n   * Using window.open here instead of the usual methods\n   * We want to stop the propagation of the click so it doesn't pass the event to the\n   * react-flow handler. And we also want to open in a new tab.\n   * The react-router Link, or useNavigate hook, won't do both.\n   */\n  const handleGotoAuction = (e: any) => {\n    e.stopPropagation()\n    window.open(`#/auctions?page=1&vendor=${vendor.id}`, '_blank')\n  }\n\n\n  return (\n\n    <div className={classnames(\"node vendor\",  {'route-focus':flowView === 'vendor'})} >\n\n      <Handle id={'source-handle'} type=\"source\" position={sourcePosition} />\n\n        <div className=\"node-header\">\n          <div className=\"icon-col\">\n            <EntityId id={vendor.id} title=\"Vendor ID\" className=\"me-1\"/>\n          </div>\n          <div className=\"node-title flex-fill\">\n            {vendor.id ? (\n              <>\n                <div>\n                  {vendor.name}\n                </div>\n                <div className=\"actions\">\n                  <Button color=\"link\" size=\"sm\" onClick={handleExamine} title=\"Examine vendor routes\">\n                    <FaIcon icon=\"eye\" size=\"sm\"/>\n                  </Button>\n                  <Button color=\"link\" size=\"sm\" onClick={handleEdit} title=\"View/Edit Vendor\">\n                    <FaIcon icon=\"cog\" size=\"sm\"/>\n                  </Button>\n                  <Button color=\"link\" size=\"sm\" onClick={handleOpenRules} title=\"View/Edit routing rule\">\n                    <FaIcon icon=\"clipboard-list\" size=\"sm\"/>\n                  </Button>\n                  <Button\n                    color=\"link\"\n                    size=\"sm\"\n                    title=\"View auctions\"\n                    onClick={handleGotoAuction}\n                  >\n                    <FaIcon icon=\"comment-dollar\" size=\"sm\"/>\n                  </Button>\n                </div>\n              </>\n            ) : (\n              <div className=\"no-relation alert\"><i>No Vendor</i></div>\n            )}\n\n          </div>\n\n        </div>\n\n\n\n        {dataView.includes(\"sales\") && vendor.id && (\n          <div className=\"node-detail d-flex\">\n              <div className=\"icon-col\">\n                <FaIcon icon=\"calendar\" size=\"sm\"/>\n              </div>\n              <div>\n                <div>\n                  <label>Match:</label> <RelativeTime date={vendor.last_matched_at} uniqueId={`ven-${vendor.id}-match`} showTimezone={true} />\n                </div>\n                <div>\n                  <label>Sale:</label> <RelativeTime date={vendor.last_sold_at} uniqueId={`ven-${vendor.id}-sale`} showTimezone={true} />\n                </div>\n              </div>\n\n          </div>\n        )}\n\n\n    </div>\n\n\n  )\n}\n\n","import React from 'react';\nimport classnames from \"classnames\";\nimport {Button, UncontrolledTooltip} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {faFileInvoiceDollar} from \"@fortawesome/free-solid-svg-icons\";\nimport { RelativeTime, Utils } from '@thedmsgroup/mastodon-ui-components';\nimport { Handle, Position } from '@xyflow/react';\nimport {DataRows, DataRow} from \"../../../Components\";\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {StatusBadge} from \"./StatusBadge\";\nimport type {FlowNodeProps} from \"./index\";\n\ntype ChannelNodeProps = FlowNodeProps & {\n  onEdit:(channel:any) =>void,\n  onExamine:(channelId:number) =>void,\n  onGetOrders:(channel:any) =>void,\n  onOpenRules:(channel:any) =>void,\n  onOpenChannelSources:(channel:any) =>void,\n}\n\nconst ChannelNode = (\n  {\n    //Passed by react-flow\n    targetPosition,\n    sourcePosition,\n    data,\n    //Additional properties\n    onEdit,\n    onExamine,\n    onGetOrders,\n    onOpenRules,\n    onOpenChannelSources,\n  }:ChannelNodeProps\n) => {\n  const {channel, dataView, flowView} = data;\n  const handleOrderHandleClick = (e:any) => {\n    e.stopPropagation();\n    //TODO clear route highlighting too\n    onGetOrders(channel);\n  }\n\n\n\n  // stop Propagation so clicking buttons does not activate toggle\n  const handleEdit = (e: any) => {\n    e.stopPropagation();\n    onEdit(channel);\n  }\n  const handleExamine = (e: any) => {\n    e.stopPropagation();\n    onExamine(channel.id);\n  }\n  const handleOpenRules = (e: any) => {\n    e.stopPropagation();\n    onOpenRules(channel);\n  }\n  const handleOpenChannelSources = (e: any) => {\n    e.stopPropagation();\n    onOpenChannelSources(channel);\n  }\n\n  const handleGotoAuction = (e: any) => {\n    e.stopPropagation()\n    window.open(`#/auctions?page=1&channel=${channel.id}`, '_blank')\n  }\n\n  return (\n    <div  className={classnames(\"node channel\", channel.status, {'route-focus':flowView==='channel'} )}>\n      <StatusBadge status={channel.status} />\n      <Handle id=\"target-handle\" type=\"target\" position={targetPosition} />\n      {/*<Handle id={'source-handle'} type=\"source\" position={sourcePosition} />*/}\n      <OrderHandle\n        position={sourcePosition}\n        onClick={handleOrderHandleClick}\n        channelId={channel.id}\n      />\n\n        <div className=\"node-header\">\n          <div className=\"icon-col\">\n            <EntityId id={channel.id} title=\"Channel ID\" className=\"me-1\"/>\n          </div>\n          <div className=\"node-title flex-fill\">\n\n            <div>\n              {channel.name}\n            </div>\n\n            <div className=\"actions\">\n              <Button color=\"link\" size=\"sm\" onClick={handleExamine} title=\"Examine channel routes\" disabled={flowView==='channel'}>\n                <FaIcon icon=\"eye\" size=\"sm\"/>\n              </Button>\n              <Button color=\"link\" size=\"sm\" onClick={handleEdit} title=\"Edit Channel\" >\n                <FaIcon icon=\"cog\" size=\"sm\"/>\n              </Button>\n              <Button color=\"link\" size=\"sm\" onClick={handleOpenChannelSources} title=\"View/Edit channel source eligibilities\">\n                <FaIcon icon=\"project-diagram\" size=\"sm\"/>\n              </Button>\n              <Button color=\"link\" size=\"sm\" onClick={handleOpenRules} title=\"View/Edit routing rule\">\n                <FaIcon icon=\"clipboard-list\" size=\"sm\"/>\n              </Button>\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                title=\"View auctions\"\n                onClick={handleGotoAuction}\n              >\n                <FaIcon icon=\"comment-dollar\" size=\"sm\"/>\n              </Button>\n            </div>\n          </div>\n\n        </div>\n\n      {/* If mapper is focused on one channel, show product/vertical */}\n      {flowView === 'channel' && (\n        <div className=\"node-detail d-flex\">\n\n            <div className=\"icon-col\">\n              <FaIcon icon=\"info-circle\" size=\"sm\"/>\n            </div>\n            <DataRows labelWidth=\"60px\" noDivider gap=\"0.1em\">\n              <DataRow label=\"Product\">{Utils.titleCase(channel.product)}</DataRow>\n              <DataRow label=\"Vertical\">{Utils.titleCase(channel.vertical.display_name)}</DataRow>\n            </DataRows>\n\n        </div>\n      )}\n\n        {dataView.includes(\"sales\") && (\n          <div className=\"node-detail d-flex\">\n\n              <div className=\"icon-col\">\n                <FaIcon icon=\"calendar\" size=\"sm\"/>\n              </div>\n\n              <DataRows labelWidth=\"60px\" noDivider gap=\"0.1em\">\n                <DataRow label=\"Match\">\n                  <RelativeTime date={channel.last_matched_at} uniqueId={`src-${channel.id}-match`} showTimezone={true} />\n                </DataRow>\n                <DataRow label=\"Sale\">\n                  <RelativeTime date={channel.last_sold_at} uniqueId={`src-${channel.id}-sale`} showTimezone={true} />\n                </DataRow>\n              </DataRows>\n\n          </div>\n        )}\n\n    </div>\n  )\n}\n\nexport default ChannelNode;\n\n/*\n * Custom handle that shows an icon and allows clicking to get channel's orders\n */\nconst OrderHandle = ({ position, channelId, onClick }: {position:Position, channelId:number, onClick:React.MouseEventHandler}) => (\n  <>\n    <Handle\n      type=\"source\"\n      id=\"source-handle\"\n      position={position}\n      style={{ background: '#fff', right:'-6px '}}\n      className=\"order-handle\"\n      onClick={onClick}\n    >\n      <div className=\"d-inline\" id={`source-handle-${channelId}`}>\n        <FaIcon icon={faFileInvoiceDollar} size=\"sm\"/>\n      </div>\n\n    </Handle>\n    {/*\n    Normally we'd use the Handle as the tooltip target,\n    but react-flow turns Handle id into data-id, and the tooltip can't find the target\n    */}\n    <UncontrolledTooltip\n      target={`source-handle-${channelId}`}\n      className=\"flow-tooltip\"\n      // modifiers don't seem to work well here\n      //@ts-ignore\n      //modifiers={[{name:'offset',options:{offset: '10', enabled: true}}]}\n    >\n      View orders that use this channel\n    </UncontrolledTooltip>\n  </>\n\n)\n\n","import React, {useContext} from 'react';\nimport classnames from \"classnames\";\nimport {Button, UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem} from \"reactstrap\";\nimport {RoutingFlowContext} from \"./index\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {RelativeTime, CopyButton} from '@thedmsgroup/mastodon-ui-components';\nimport { Handle } from '@xyflow/react';\nimport {faKey} from \"@fortawesome/free-solid-svg-icons\";\nimport {StatusBadge} from \"./StatusBadge\";\nimport type {FlowNodeProps} from \"./index\";\n\n\ntype SourceTokenNodeProps = FlowNodeProps & {\n  onEdit:(token:any) =>void,\n  onAddForCurrentVendor:(vendor:any, newSource?:boolean) =>void,\n  onAddForCurrentSource:(source:any) =>void,\n  clearFilters:(vendor:any) => void\n}\n\n\nexport const SourceTokenNode = (\n  {\n    //passed by react-flow\n    sourcePosition,\n    targetPosition,\n    data,\n    //Additional properties\n    onEdit,\n    onAddForCurrentVendor,\n    onAddForCurrentSource,\n\n  }:SourceTokenNodeProps\n) => {\n  const {token, alert, dataView} = data\n  const context = useContext(RoutingFlowContext)\n\n  const handleOpenToken = (e: any) => {\n    e.stopPropagation()\n    onEdit(token)\n  }\n\n  // const handleAddForCurrentVendor = (e: React.MouseEvent<HTMLButtonElement>) => {\n  //   e.stopPropagation()\n  //   onAddForCurrentVendor(context.selectedVendor)\n  // }\n  // const handleAddForCurrentSource = (e: React.MouseEvent<HTMLButtonElement>) => {\n  //   e.stopPropagation()\n  //   if (token.source) {\n  //     onAddForCurrentSource(token.source)\n  //   }\n  //\n  // }\n\n  // Create a token related to a vendor or source\n  const handleAddForTarget = (e:React.MouseEvent<HTMLElement>, forNewSource:boolean=false) => {\n    e.stopPropagation()\n    if (context.selectedVendor) {\n      onAddForCurrentVendor(context.selectedVendor, forNewSource)\n    } else if (token.source) {\n      onAddForCurrentSource(token.source)\n    }\n  }\n\n  return (\n\n    <div  className={classnames(\"node source-token\", token.status ?? 'active', {alert})}>\n\n      <StatusBadge status={token.status} />\n      <Handle id=\"target-handle\" type=\"target\" position={targetPosition} />\n      <Handle id={'source-handle'} type=\"source\" position={sourcePosition} />\n\n        <div className=\"node-header\">\n\n          {token.id > 0 && (\n            <div className=\"icon-col\">\n              <FaIcon icon={alert ? 'exclamation-triangle' : faKey} size=\"sm\"/>\n            </div>\n          )}\n\n          <div className=\"node-title flex-fill\">\n            {token.id > 0 ? (\n              <>\n\n                <div className=\"d-flex align-items-center\">\n                  <div className=\"token\">\n                    {token.token}\n                  </div>\n                </div>\n                <div className=\"actions\">\n                  <CopyButton\n                    id={`copy-token-${token.id}`}\n                    textToCopy={token.token}\n                    buttonSize=\"sm\"\n                  />\n                  <Button color=\"link\" size=\"sm\" onClick={handleOpenToken} title=\"View/Edit Token\">\n                    <FaIcon icon=\"cog\" size=\"sm\"/>\n                  </Button>\n                </div>\n              </>\n            ) : (\n              <div className=\"alert-message w-100 d-flex flex-nowrap\">\n                {/* having no token will only happen during vendor view, when there is one vendor displayed and it has no source tokens */}\n                <div><FaIcon icon=\"exclamation-triangle\" className=\"me-1\" size=\"sm\"/></div>\n                <div className=\"flex-fill\"><i>No token assigned</i></div>\n                {/*<Button color=\"link\" size=\"xs\" onClick={handleAddForTarget} title=\"Add source-token for selected vendor\">\n                  <FaIcon icon=\"plus\" size=\"sm\"/> Add\n                </Button>*/}\n\n                <UncontrolledDropdown>\n                  <DropdownToggle  color=\"link\" className=\"inline\" size=\"sm\" caret>\n                    <FaIcon icon=\"plus\" size=\"xs\"/> Add\n                  </DropdownToggle>\n                  <DropdownMenu end>\n                    <DropdownItem onClick={handleAddForTarget}>Add for existing source</DropdownItem>\n                    <DropdownItem onClick={(e)=>handleAddForTarget(e, true)}>Create a new source</DropdownItem>\n                  </DropdownMenu>\n                </UncontrolledDropdown>\n              </div>\n            )}\n\n          </div>\n\n        </div>\n\n      {token.id > 0 && (token.label || token.description) && (\n        <div className=\"node-detail d-flex\">\n\n            <div className=\"icon-col\">\n              <FaIcon icon={faKey} size=\"sm\"/>\n            </div>\n            <div>\n              {token.label && <div>{token.label}</div>}\n              {token.description && <div><small>{token.description}</small></div>}\n            </div>\n\n        </div>\n      )}\n\n\n        { token.id > 0 && dataView.includes(\"sales\") && (\n          <div className=\"node-detail d-flex\">\n\n              <div className=\"icon-col\">\n                <FaIcon icon=\"calendar\" size=\"sm\"/>\n              </div>\n              <div>\n                <div>\n                  <label>Match:</label> <RelativeTime date={token.last_matched_at} uniqueId={`ven-${token.id}-match`} showTimezone={true} />\n                </div>\n                <div>\n                  <label>Sale:</label> <RelativeTime date={token.last_sold_at} uniqueId={`ven-${token.id}-sale`} showTimezone={true} />\n                </div>\n              </div>\n\n          </div>\n        )}\n\n\n    </div>\n\n\n  )\n}\n\n","import React, { useEffect, useState, useRef } from 'react';\nimport classnames from \"classnames\";\nimport {Button} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {Link} from \"react-router-dom\";\nimport { RelativeTime } from '@thedmsgroup/mastodon-ui-components';\nimport { Handle } from '@xyflow/react';\nimport EntityId from \"../../../Components/Table/EntityId\";\nimport {DataRow, DataRows} from \"../../../Components\";\nimport {StatusBadge} from \"./StatusBadge\";\nimport {FlowNodeProps} from \"./index\";\n\ntype OrderNodeProps = FlowNodeProps & {\n  onExamine:(order:any) =>void,\n  onResize:(order:any) =>void,\n}\n\n\nexport const OrderNode = (\n  {\n    data,\n    targetPosition,\n    onExamine,\n    onResize,\n  }:OrderNodeProps\n) => {\n  const {order, rules, alert, dataView, flowView} = data;\n  const[expanded, setExpanded] = useState<boolean>(false);\n  const resizeRef = useRef(null);\n\n  const toggleExpanded = (e:any) => {\n    e.stopPropagation()\n    setExpanded(!expanded)\n  }\n\n  useEffect(() => {\n    //Resize observer to trigger reflow of entire chart after expanded state updates\n    if (resizeRef.current) {\n      const observer = new ResizeObserver(onResize);\n      observer.observe(resizeRef.current);\n\n      // Cleanup function\n      return () => {\n        observer.disconnect();\n      };\n    }\n  }, []);\n\n\n\n  // stop Propagation so clicking buttons does not activate toggle\n  const handleExamine = (e: any) => {\n    e.stopPropagation();\n    onExamine(order);\n  }\n\n  const handleGotoAuction = (e: any) => {\n    e.stopPropagation()\n    window.open(`#/auctions?page=1&order=${order.id}`, '_blank')\n  }\n\n\n  return (\n    <div\n      className={classnames(\"node order\", order.status, {alert})}\n      ref={resizeRef}\n    >\n      <StatusBadge status={order.status} />\n      <Handle id=\"target-handle\" type=\"target\" position={targetPosition} />\n\n\n        <div className=\"node-header\">\n          <div className=\"icon-col\">\n            <EntityId className=\"id me-1\" id={order.id} title=\"Order ID\"/>\n          </div>\n          <div className=\"node-title flex-fill\">\n            <div>\n              {/*<StatusDot status={order.status} className=\"me-1\"/>*/}\n              <div>{order.name}</div>\n              <div><small>{order.account.name}</small></div>\n            </div>\n            <div className=\"actions\">\n\n                <Button color=\"link\" size=\"sm\" onClick={handleExamine} title=\"Examine order routes\">\n                  <FaIcon icon=\"eye\" size=\"sm\"/>\n                </Button>\n\n              <Button\n                  tag={Link}\n                  color=\"link\"\n                  target=\"_blank\"\n                  to={{\n                    pathname: `/accounts/${order.account.id}/order/${order.id}/rules`,\n                  }}\n                  size=\"sm\"\n                  title=\"View Order\"\n              >\n                <FaIcon icon=\"external-link-alt\" size=\"sm\"/>\n              </Button>\n              <Button\n                color=\"link\"\n                size=\"sm\"\n                title=\"View auctions\"\n                onClick={handleGotoAuction}\n              >\n                <FaIcon icon=\"comment-dollar\" size=\"sm\"/>\n              </Button>\n            </div>\n          </div>\n\n        </div>\n\n\n      <div className=\"node-detail d-flex\">\n        <div className=\"icon-col\">\n          <FaIcon icon=\"clipboard-list\" size=\"sm\"/>\n        </div>\n        <div className=\"flex-fill\">\n          {expanded ? (\n            <div className=\"node-expand\">\n              <Button size=\"sm\" className=\"mb-1 inline\" color=\"link\" onClick={toggleExpanded}>Close</Button>\n              <div className=\"rules\">\n                <div className=\"caption\">Rules with bid modifiers on channels:</div>\n                <div>\n                  {rules && rules.length ? (\n                    <>\n                      {rules.map((rule:any, i:number) => (\n                        <div className=\"rule\" key={i}>\n                          <div className=\"caption\">\n                            <Link\n                              target=\"_blank\"\n                              className=\"link\"\n                              to={{\n                                pathname: `/accounts/${order.account.id}/order/${order.id}/rules`,\n                                search: `rule=${rule.id}`,\n                              }}\n                              title=\"View rule in order rule tree\"\n                            >\n                              {rule.label} <FaIcon icon=\"external-link-alt\" size=\"sm\" className=\"ms-1\"/>\n                            </Link>\n                          </div>\n\n                          {/*{rule.channel_modifiers.length > 0 && (\n                            <>\n                              <DataRows labelWidth=\"160px\"  gap=\"2px\">\n                                {rule.channel_modifiers.map((mod:any, i:number) => (<DataRow label={mod.channel.name} key={i}>\n                                    {mod.bid_modifier}%\n                                  </DataRow>\n                                ))}\n                              </DataRows>\n\n                            </>\n                          )}\n*/}\n\n                          <DataRows labelWidth=\"70px\"  gap=\"2px\">\n                            {rule.bid_modifier && (<DataRow label=\"Bid Modifier\">\n                                {rule.bid_modifier}%\n                              </DataRow>\n                            )}\n                            <DataRow label=\"Match\">\n                              <RelativeTime date={rule.last_matched_at} uniqueId={`rule-${rule.id}-match`} showTimezone={true} />\n                            </DataRow>\n                            <DataRow label=\"Sale\">\n                              <RelativeTime date={rule.last_sold_at} uniqueId={`rle-${rule.id}-sale`} showTimezone={true} />\n                            </DataRow>\n                          </DataRows>\n\n                        </div>\n                      ))}\n                    </>\n                  ) : (\n                    <i>No rules found</i>\n                  )}\n                </div>\n              </div>\n\n\n\n            </div>\n          ) : (\n            <Button size=\"sm\" className=\"inline\" color=\"link\" onClick={toggleExpanded}>View rules with channel</Button>\n          )}\n        </div>\n      </div>\n\n\n\n\n\n        {dataView.includes(\"sales\") && (\n          <div className=\"node-detail d-flex\">\n              <div className=\"icon-col\">\n                <FaIcon icon=\"calendar\" size=\"sm\"/>\n              </div>\n              <div className=\"flex-fill\">\n\n                <DataRows labelWidth=\"60px\" noDivider gap=\"0.1em\">\n                  <DataRow label=\"Match\">\n                    <RelativeTime date={order.last_matched_at} uniqueId={`ord-${order.id}-match`} showTimezone={true} />\n                  </DataRow>\n                  <DataRow label=\"Sale\">\n                    <RelativeTime date={order.last_sold_at} uniqueId={`ord-${order.id}-sale`} showTimezone={true} />\n                  </DataRow>\n                </DataRows>\n              </div>\n          </div>\n        )}\n\n    </div>\n  )\n}\n\n","import React, {FC} from 'react';\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {Handle} from \"@xyflow/react\";\nimport {FlowNodeProps} from \"./index\";\nimport {HelpPopper} from \"@thedmsgroup/mastodon-ui-components\";\n\n\ntype AlertNodeData = {\n  message?:string|React.ReactNode,\n  helpText?:string|React.ReactNode,\n}\ntype AlertNodeProps = FlowNodeProps<AlertNodeData>\n\n\nexport const AlertNode:FC<AlertNodeProps> = ({id, data, targetPosition}) => {\n  const {message, helpText} = data\n  return (\n    <div className=\"node alert d-flex align-items-center\">\n      {targetPosition && <Handle id=\"target-handle\" type=\"target\" position={targetPosition} />}\n      <div className=\"node-header\">\n        <div className=\"node-title flex-fill\">\n          <div><FaIcon icon=\"exclamation-triangle\" className=\"me-1\"/></div>\n          <div className=\"flex-fill\">\n            {message}{helpText && <HelpPopper iconClass=\"ms-2\" name={`alert-help-${id}`}>{helpText}</HelpPopper>}\n          </div>\n        </div>\n      </div>\n\n\n\n    </div>\n  )\n}\n","import React, {FC, useContext} from 'react'\nimport {Button} from \"reactstrap\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport classnames from \"classnames\"\nimport {RoutingFlowContext} from \"./index\";\n\n\ntype FlowHeaderNodeProps = {\n  data: {\n    title:string,\n    helpText?:string,\n    active?:boolean,\n    entity?:string,\n    allowAdd?:boolean,\n    filters?:string[],\n    flowView?:string,\n  },\n  onAdd?:(entity:string)=>void\n  onClearFilters?:(flowView:string, id:number) => void;\n}\n\nexport const FlowHeaderNode:FC<FlowHeaderNodeProps> = ({data, onAdd, onClearFilters}) => {\n  const context = useContext(RoutingFlowContext)\n  const {\n    title,\n    helpText,\n    filters,\n    active,\n    entity,\n    flowView,\n    allowAdd\n  } = data\n\n  const handleClearFilters = (e: any) => {\n    e.stopPropagation()\n    if (onClearFilters && flowView === 'vendor' && context.selectedVendor) {\n      const vendor = context.selectedVendor as any;\n      onClearFilters(flowView, vendor.id as number)\n    }\n\n  }\n\n  return (\n    <>\n      <div className={classnames(\"node flow-header\", {active})}>\n        <div className=\"d-flex align-items-center justify-content-between\">\n          <div className=\"title\">{title}</div>\n          {allowAdd && entity && onAdd && (\n            <Button\n              className=\"inline\"\n              size=\"xxs\"\n              outline\n              onClick={()=>onAdd(entity)}\n            >\n              <FaIcon icon=\"plus\" size=\"sm\" />\n            </Button>\n          )}\n        </div>\n\n\n      </div>\n      {filters && filters.length > 0 && (\n        <div className=\"applied-filters d-flex justify-content-between align-items-center mt-1\">\n          <div>\n            <FaIcon icon=\"filter\" size=\"1x\" /> <b>FILTERS:</b> {filters.join(', ')}\n          </div>\n\n          <div><Button size=\"xs\" onClick={handleClearFilters} color=\"link\" className=\"inline\">\n            <FaIcon icon=\"times\" size=\"sm\" />\n          </Button> </div>\n        </div>\n      )}\n    </>\n\n  )\n}\n","import {createElement} from \"react\";\n\n/*\n * Adds additional properties to an existing component.\n * const MyNewComponent = withProps(ExistingComponent, {someProp})\n */\nexport const withProps = (WrappedComponent, addedProps = {}) =>\n  (props) =>\n    createElement(WrappedComponent, {\n      ...props,\n      ...addedProps\n    });\n","import React, {FC, useState} from 'react'\nimport {Row, Col, Button, Label, Spinner} from 'reactstrap'\nimport useApi from \"../../../../Hooks/useApi\"\nimport usePermission from \"../../../../Hooks/usePermission\"\nimport DynamicEnhancedSelect from \"../../../../Components/Form/DynamicEnhancedSelect\"\nimport {notify, Stack, RowDivider} from \"@thedmsgroup/mastodon-ui-components\";\nimport EntityId from \"../../../../Components/Table/EntityId\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {BodyWrapper, FooterWrapper} from \"../../../../Components/Modal\";\n\ntype SourceTokenStepProps = {\n  source:any;\n  vendors:any[],\n  onSuccess?:(source:any)=>void,\n  cancel:()=>void,\n  isModal?:boolean\n}\nexport const SourceTokenStep:FC<SourceTokenStepProps> = ({\n  source,\n  vendors,\n  onSuccess,\n  cancel,\n  isModal\n}) => {\n  const allowCreateTokens = usePermission('source_tokens.create')\n  if(!source) return null\n  if(!allowCreateTokens) {\n    cancel()\n    return null\n  }\n  const {api} = useApi()\n  const [vendorList, setVendorList] = useState<any[]>(vendors) //state for list\n  const [selectedVendor, setSelectedVendor] = useState<any>() //state for selector\n  const [isSaving, setIsSaving] = useState(false)\n\n  const handleSelectVendor = (selectedId:string, selectedOption:any) => {\n    setSelectedVendor(selectedOption);\n  }\n\n  const handleAddNew = () => {\n\n    if (selectedVendor) {\n      if (!vendorList.find((vendor:any) => vendor.id === selectedVendor.id)) {\n        setVendorList((prev) => [...prev, selectedVendor])\n      }\n    }\n    //clear selector dropdown\n    setSelectedVendor(undefined)\n\n  }\n\n  const handleRemove = (index:number) => {\n    const newVendors = [...vendorList]\n    newVendors.splice(index, 1)\n    setVendorList(newVendors)\n  };\n\n  const save = async() => {\n\n    setIsSaving(true)\n\n    //No batch save on API side\n     let batchResult = true;\n      for (const vendor of vendorList) {\n        const tokenResult = await saveToken(source.id, vendor.id);\n        if (!tokenResult) {\n          batchResult =false\n        }\n        console.log(\"SourceTokenStep.tsx:saving for vendor and source\", source, vendor );\n      }\n\n\n    if (batchResult) {\n      if (vendorList.length > 1) {\n        notify(`The source-tokens have been saved`, 'success')\n      } else {\n        notify(`The source-token has been saved`, 'success')\n      }\n\n      setIsSaving(false)\n      onSuccess && onSuccess(source)\n\n    } else {\n      notify(`Unable to create source token for vendor: ${api.error ? api.error.name : \"\"}`, 'error');\n    }\n    setIsSaving(false)\n\n  }\n\n  const saveToken = async(sourceId:number|string, vendorId:number|string) => {\n\n      const result = await api.endpoints.sourceTokens.create({\n        source_id: sourceId,\n        vendor_id: vendorId,\n        status: 'active'\n      })\n    return Boolean(result);\n  }\n\n  return (\n   <>\n   <BodyWrapper isModal={isModal}  className='source-token-step'>\n\n\n     <p>Optionally add tokens for one or more vendors to use this source.</p>\n     <Button color=\"link\" size=\"xs\" onClick={cancel}>Skip this step</Button>\n\n\n      <Row className=\"my-2\">\n\n        <Col sm={12} md={6} lg={3}>\n          <h5>Source: <EntityId id={source.id} /> {source.name}</h5>\n          {vendorList.length > 0 && <h5>Vendors</h5>}\n          <Stack gap=\"1em\" divider={<RowDivider/>}>\n            {vendorList.map((vendor:any, i:number) => (\n              <div key={i} className=\"selected-vendor d-flex align-items-center justify-content-between\">\n                <div><EntityId id={vendor.id} /> {vendor.name}</div>\n                <Button onClick={()=>handleRemove(i)} color=\"link\" size=\"sm\" className=\"inline\" title=\"Remove\">\n                  <FaIcon icon=\"times\" size=\"sm\" color=\"darkred\"/>\n                </Button>\n              </div>\n            ))}\n          </Stack>\n        </Col>\n\n      </Row>\n      <Row className=\"mt-3\">\n        <Col sm={12} md={6} lg={4}>\n          <Row className=\"align-items-center\">\n            <Col sm={9}>\n              <DynamicEnhancedSelect\n                onChange={handleSelectVendor}\n                value={selectedVendor?.id ?? ''}\n                name=\"vendor\"\n                endpoint=\"vendors\"\n                params={{options:true}}\n                labelProperty=\"name\"\n                className=\"w-100\"\n                placeholder=\"Select vendor...\"\n                returnOption\n                //invalid={!!formErrors.account_id}\n                // invalidFeedback={formErrors.account_id}\n                isClearable\n                isSearchable\n                isMulti={false}\n              />\n            </Col>\n            <Col sm={3}>\n              <div>\n                <Button onClick={handleAddNew}  size=\"sm\" className=\"inline\" title=\"Add\" disabled={!selectedVendor || isSaving}>\n                  <FaIcon icon=\"plus\" size=\"sm\" /> Add\n                </Button>\n              </div>\n\n            </Col>\n          </Row>\n        </Col>\n      </Row>\n      </BodyWrapper>\n\n      <FooterWrapper isModal={isModal}>\n        <Button\n          onClick={cancel}\n          color=\"link\"\n          size=\"sm\"\n        >\n          Cancel\n        </Button>\n        <Button\n          onClick={save}\n          color=\"primary\"\n          size=\"sm\"\n          disabled={!vendorList.length || isSaving}\n        >\n          Save{isSaving && <Spinner size=\"sm\" className=\"ms-1\" /> }\n        </Button>\n\n      </FooterWrapper>\n\n    </>\n  )\n}\n","import React, {useState} from 'react'\nimport {Modal,  ModalHeader} from \"reactstrap\"\nimport {default as SourceForm} from \"./index\"\nimport {SourceTokenStep} from \"./SourceTokenStep\";\n\n\n/*\n * Modal dialog wraps the source form for editing and creating sources\n */\ntype SourceModalProps = {\n  source:any,\n  vendorPreselections?:any[],\n  isOpen:boolean,\n  toggle:()=>void,\n  size?:string,\n  onSuccess?:(source?:any, isNew?:boolean)=>void,\n  tokenStep?:boolean,\n  scrollable?:boolean\n}\n\nexport const SourceModal = ({\n                                   source,\n                                   vendorPreselections=[],\n                                   isOpen,\n                                   toggle,\n                                   onSuccess,\n                                   size='xlg',\n                                   scrollable=false,\n                                 }:SourceModalProps) => {\n\n  if (!source) return null\n\n  const [step, setStep] = useState('')\n  const [newSource, setNewSource] = useState(null)\n  const isNew = !source.id\n\n  const handleSave = (source:any) => {\n\n    if (isNew && source) {\n      setStep('token');\n      setNewSource(source);\n    } else {\n\n      onSuccess && onSuccess(source);\n    }\n  }\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      toggle={toggle}\n      className=\"mst-source-modal\"\n      size={size}\n      scrollable={scrollable}\n    >\n\n      <ModalHeader toggle={toggle}>\n\n            {step === 'token' ? (\n                <span>Add Vendor Tokens for Source</span>\n              ) : (\n                <>\n                  {source.id\n                    ? <>Edit Source | <span className=\"modal-subheader\">{source.name}</span></>\n                    : 'Create Source'\n                  }\n                </>\n            )}\n\n\n      </ModalHeader>\n\n\n        {(step === 'token' && newSource)  ? (\n            <SourceTokenStep\n              source={newSource}\n              vendors={vendorPreselections}\n              onSuccess={onSuccess}\n              cancel={toggle}\n              isModal\n            />\n        ) : (\n          <SourceForm\n            source={source}\n            cancel={toggle}\n            onSuccess={handleSave}\n            isModal\n          />\n        )}\n\n    </Modal>\n  )\n}\n","import React, {useState} from 'react'\nimport {Button, FormGroup, Modal, ModalBody, ModalFooter, ModalHeader} from \"reactstrap\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\"\nimport {ChannelSources} from \"../../Channels/Channel/ChannelSources\"\nimport useApi from \"../../../../Hooks/useApi\"\nimport DynamicEnhancedSelect from \"../../../../Components/Form/DynamicEnhancedSelect\"\nimport {ChannelOptionLabel} from \"../../../../Components/Form/Select/ChannelOptionLabel\"\nimport {notify} from \"@thedmsgroup/mastodon-ui-components\";\nimport {ChannelSource} from \"../../../../types\";\nimport LoadingBar from \"../../../../Layout/LoadingBar\";\nimport EntityId from \"../../../../Components/Table/EntityId\";\n\n/*\n * Modal dialog that lets you link the provided source to a selected channel,\n * via the channel-source connection (the link is saved by updating the channel)\n */\ntype LinkChannelSourcePanelProps = {\n  source:any,\n  isOpen:boolean,\n  close:()=>void,\n  size?:string,\n  onSuccess?:(source?:any)=>void,\n  scrollable?:boolean\n}\n\nexport const LinkChannelSourceModal = ({\n                                   source,\n                                   isOpen,\n                                   close,\n                                   onSuccess,\n                                   size='lg',\n                                   scrollable=false,\n                                 }:LinkChannelSourcePanelProps) => {\n\n  if (!source) return null\n  const {api} = useApi()\n  const [selectedChannelId, setSelectedChannelId] = useState<string>('')\n  const [channel, setChannel] = useState<any>()\n  const [channelSources, setChannelSources] = useState<ChannelSource[]>([])\n  const [isLoading, setIsLoading] = useState(false);\n\n\n  const save = async() => {\n    setIsLoading(true)\n\n    const payload = {\n      id:channel.id,\n      name:channel.name,\n      account_id: channel.account.id,\n      vertical_id: channel.vertical.id,\n      product:channel.product,\n      sources: channelSources.map((src:any) => {\n        return {\n          source_id: src.id,\n          channel_id: channel.id,\n          status: src.eligibility.status,\n          distribution: src.eligibility.distribution,\n          fixed_distribution: src.eligibility.fixed_distribution,\n        }\n      })\n    }\n\n\n    const result = await api.endpoints.channels.update(payload)\n\n\n    if (result) {\n      notify(`The channel has been saved`, 'success')\n      setIsLoading(false)\n      onSuccess && onSuccess()\n      close()\n    } else {\n      notify(`Unable to save channel: ${api.error ? api.error.name : \"\"}`, 'error');\n    }\n    setIsLoading(false)\n  }\n\n  const handleSelectChannel = (channelId:string) => {\n\n    setSelectedChannelId(channelId);\n    if (channelId) {\n      loadChannel(channelId)\n    } else {\n      setSelectedChannelId('')\n    }\n  }\n\n  const unselectChannel = () => {\n    setSelectedChannelId('')\n    setChannel(undefined)\n    setChannelSources([])\n  }\n\n\n  const loadChannel = async(channelId:string) => {\n    const result = await api.endpoints.channels.show(channelId);\n    if(result){\n      setChannel(result)\n      setChannelSources(() => {\n        const sources = result.sources\n        if (!sources.find((s:any) => s.id.toString() === source.id)) {\n\n          sources.push({\n            id: source.id,\n            name: source.name,\n            status:source.status,\n            eligibility: {\n              status:\"active\",\n              distribution:null,\n              fixed_distribution:false,\n              rule_id:0,\n            }\n          });\n        }\n        return sources\n      })\n    }\n  }\n\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      toggle={close}\n      size={size}\n      scrollable={scrollable}\n    >\n\n      <ModalHeader toggle={close} >\n         Create Channel-Source Link\n      </ModalHeader>\n      <ModalBody style={{minHeight:'400px'}}>\n        <LoadingBar name=\"modal\" active={isLoading} />\n        {source.id > 0 && !selectedChannelId && <h5>Source: <EntityId id={source.id}/> {source.name}</h5>}\n        {!channel ? (\n          <div>\n            <p>Select a channel that will be eligible to use this source.</p>\n            <FormGroup>\n              {/*<Label>Select a Channel</Label>*/}\n              <DynamicEnhancedSelect\n                onChange={handleSelectChannel}\n                value={selectedChannelId ?? ''}\n                name=\"channel\"\n                endpoint=\"channels\"\n                params={{options:true, product:source.product, vertical:source.vertical.id}}\n                labelProperty=\"name\"\n                className=\"w-100\"\n                placeholder=\"Select channel...\"\n                formatOptionLabel={ChannelOptionLabel}\n                //invalid={!!formErrors.account_id}\n                // invalidFeedback={formErrors.account_id}\n                isClearable\n                isSearchable\n              />\n            </FormGroup>\n          </div>\n        ) : (\n          <>\n            <div className=\"d-flex mb-2\">\n              <h5 className=\"mb-0\">Channel: {channel.name}</h5>\n              <Button color=\"link\" size=\"xs\" className=\"inline ms-2\" onClick={unselectChannel} >change</Button>\n            </div>\n\n            <p>The source will be added to the selected channel. All of the channel&apos;s eligible sources\n              {' '}are listed below. Click save to complete.</p>\n            <ChannelSources\n              channel={channel}\n              sources={channelSources}\n              onChange={setChannelSources}\n              onOpenRules={() => {}}\n            />\n\n          </>\n\n        )}\n\n      </ModalBody>\n\n      <ModalFooter>\n\n          <div className=\"text-end\">\n            <Button\n              onClick={close}\n              color=\"link\"\n              size=\"sm\"\n            >\n              Cancel\n            </Button>\n\n              <Button\n                onClick={save}\n                color=\"primary\"\n                size=\"sm\"\n                disabled={!channel}\n              >\n                Save\n              </Button>\n          </div>\n\n      </ModalFooter>\n\n\n    </Modal>\n  )\n}\n","import React, {useState} from 'react'\nimport {Button, Card, CardBody,Modal, ModalBody, ModalHeader} from \"reactstrap\"\nimport {SourceTokenForm} from \"./SourceTokenForm\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\"\nimport {SourceToken} from \"../../../types\"\nimport EntityId from \"../../../Components/Table/EntityId\"\nimport {Stack, Utils} from \"@thedmsgroup/mastodon-ui-components\"\nimport usePermission from \"../../../Hooks/usePermission\"\n\ntype SourceTokenModalProps = {\n  token:SourceToken,\n  isOpen:boolean,\n  toggle:()=>void,\n  size?:string,\n  onSuccess?:()=>void,\n  sourcePreselections?:any[]\n  scrollable?:boolean\n}\n\nexport const SourceTokenModal = ({\n     token,\n     isOpen,\n     toggle,\n     onSuccess,\n     sourcePreselections,\n     size='xlg',\n     scrollable=false\n}:SourceTokenModalProps) => {\n  const allowEdit = usePermission('source_tokens.edit');\n  const allowCreate = usePermission('source_tokens.create');\n  if (!token) return null;\n  const isNew = !token.id;\n  const readOnly = isNew ? !allowCreate : !allowEdit;\n  const [showPreselect, setShowPreselect] = useState<boolean>(Boolean(sourcePreselections && sourcePreselections.length))\n  // the token prop, possibly modified with pre-selected source\n  const [formToken, setFormToken] = useState(token);\n\n  const handlePreselection = (source:any|null) => {\n    if (source) {\n      setFormToken((token) => {\n        return {...token, source}\n      })\n    }\n    setShowPreselect(false);\n  }\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      toggle={toggle}\n      className=\"source-token-panel\"\n      size={size}\n      scrollable={scrollable}\n    >\n\n      <ModalHeader toggle={toggle} >\n        <div className=\"d-flex align-items-center\">\n          <Button size=\"sm\" onClick={toggle} className=\"btn-close-white inline\" color=\"link\" >\n            <FaIcon icon=\"times\" className=\"me-2\" />\n          </Button>\n          <div>{`${readOnly ? 'View' : token.id ? 'Edit' : 'Create'}  Source-Token`}</div>\n        </div>\n      </ModalHeader>\n\n\n        {showPreselect && sourcePreselections ? (\n          <ModalBody>\n          <SourcePreselect\n            sources={sourcePreselections}\n            onSelect={handlePreselection}\n            />\n          </ModalBody>\n        ) : (\n          <SourceTokenForm\n            sourceToken={formToken}\n            close={toggle}\n            onSuccess={onSuccess}\n            title={\"\"}\n            isModal={true}\n            readOnly={readOnly}\n          />\n        )}\n\n\n\n    </Modal>\n  )\n}\n\ntype SourcePreselectProps = {\n  sources:any[],\n  onSelect:(source:any|null) => void\n}\nconst SourcePreselect = ({sources, onSelect}:SourcePreselectProps) => {\n  if (!sources.length) return null;\n\n  return (\n    <div>\n        <p>Create a token for {sources.length > 1 ? 'one of the sources' : 'the source'} below?</p>\n        <Stack gap=\"1em\" noDivider >\n          {sources.map((source:any, i:number) => (\n            <Card className=\"source-preselect\" key={`preselect-${i}`}>\n              <CardBody>\n                <div className=\"d-flex justify-content-between\">\n                  <div>\n                    <div><EntityId id={source.id} title=\"Source ID\" className=\"me-1\"/>  <b>{source.name}</b></div>\n                    <div>{Utils.titleCase(source.product)} | {source.vertical.display_name}</div>\n                  </div>\n                  <div>\n                    <Button\n                      size=\"sm\"\n                      outline\n                      onClick={() => onSelect(source)}\n                    >Select</Button>\n                  </div>\n\n                </div>\n              </CardBody>\n\n            </Card>\n          ))}\n      </Stack>\n\n      <Button size=\"sm\" block className=\"mt-3\" onClick={() => onSelect(null)}>\n        No, I&apos;ll select another source <FaIcon icon=\"arrow-right\" />\n      </Button>\n    </div>\n  )\n}\n","import React from 'react'\nimport {Button,Modal, ModalHeader} from \"reactstrap\"\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\"\nimport type {Channel} from \"../../../../types\";\nimport {default as ChannelForm} from \"./index\";\nimport {ChannelSourceRoute} from \"../../../Routing/Rules\";\n\n/*\n * Modal dialog that wraps the channel form for editing and creating channels\n */\ntype ChannelModalProps = {\n  channel:Channel,\n  isOpen:boolean,\n  toggle:()=>void,\n  size?:string,\n  onSuccess?:(channel:any, isNew?:boolean)=>void,\n  onOpenChannelRules?:(channel:any)=>void,\n  onOpenChannelSourceRules?:(channelSource:ChannelSourceRoute)=>void,\n  scrollable?:boolean\n  showSources?:boolean\n}\n\nexport const ChannelModal = ({\n   channel,\n   isOpen,\n   toggle,\n   onSuccess,\n   onOpenChannelRules,\n   onOpenChannelSourceRules,\n   size='lg',\n   scrollable=false,\n   showSources=false\n}:ChannelModalProps) => {\n\n  if (!channel) return null;\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      toggle={toggle}\n      className=\"channel-modal\"\n      size={size}\n      scrollable={scrollable}\n    >\n\n      <ModalHeader toggle={toggle}>\n        <div className=\"d-flex align-items-center\">\n          <Button size=\"sm\" onClick={toggle} className=\"btn-close-white inline\" color=\"link\" >\n            <FaIcon icon=\"times\" className=\"me-2\" />\n          </Button>\n          <div>\n            {channel.id ? 'Edit' : 'Create'} Channel\n            {channel.name && (\n              <>\n                {' '}| <span className=\"modal-subheader\">{channel.name}</span>\n              </>\n            )}\n\n          </div>\n        </div>\n      </ModalHeader>\n\n          <ChannelForm\n            channelId={channel.id}\n            close={toggle}\n            onSuccess={onSuccess}\n            onOpenChannelRules={onOpenChannelRules}\n            onOpenChannelSourceRules={onOpenChannelSourceRules}\n            initialTab={showSources ? 'sources' : undefined}\n            isModal\n          />\n\n\n    </Modal>\n  )\n}\n","import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport EntityId from \"../../Table/EntityId\";\nimport {Badge} from 'reactstrap';\nimport {Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport React from \"react\";\n\ntype SourceTokenOptionType = {\n  id:number|string,\n  label:string,\n  token:string,\n  status?:string,\n  source: {\n    id:number;\n    name:string;\n    product:string;\n    vertical: {\n      id:number;\n      name:string;\n      display_name:string;\n    }\n  }\n}\n\n/*\n * A function that can be provided as react-select's formatOptionLabel function\n * on a source-token selector, to show more  info than just the token.\n *\n *\n */\n\nexport const SourceTokenOptionLabel = (\n  option:SourceTokenOptionType, meta:any,  selected:boolean\n) => (\n\n  <div className=\"d-flex justify-content-between\">\n    <div className=\"d-flex\">\n      {meta.context === 'menu' && <div>{selected && <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\"/>}</div>}\n      <div></div>\n      <div>\n        <div>{option.label}</div>\n        {option.source &&  meta.context === 'menu' && <div>\n          <div><EntityId id={option.source.id} className=\"me-1\"/> {option.source.name}</div>\n          <div><small>{Utils.titleCase(option.source.product)} |  {option.source.vertical.display_name}</small></div>\n          <div><small>{option.token}</small></div>\n        </div>}\n      </div>\n    </div>\n\n      <div>\n        {/* Just indicating paused or archived (active assumed) */}\n        {option.status && option.status !== 'active' &&\n          <Badge size=\"xs\" className=\"ms-1\" color={option.status === 'archived' ? 'danger' : 'warning'}>{Utils.titleCase(option.status)}</Badge>}\n      </div>\n\n  </div>\n);\n\n","import React from 'react';\nimport {Row, Col} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport {Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport EnhancedSelect from \"../../../Components/Form/EnhancedSelect\";\nimport {SourceTokenOptionLabel} from \"../../../Components/Form/Select/SourceTokenOptionLabel\";\n\n/*\n * Message/form that appears in the flow-banner if there are too many source-tokens to display.\n * Presents an alert message and a picker that lets you search in the 'overflow' options by token or source,\n * and results in focusing the routing map on a source.\n *\n */\nexport const TokenOverflow = (\n  {\n    tokens,\n    onSelect,\n  }:any\n) => {\n\n  // const options = useMemo(() => {\n  //   return tokens.map((token:any) => {\n  //     return {value: token.id, label: token.token}\n  //   })\n  // }, [])\n\n  const handleSelect = (sourceId:number|string) => {\n    console.log(\"TokenOverflowNode.tsx:selected\", sourceId )\n    onSelect(sourceId);\n  }\n\n  return (\n\n    <div  className=\"token-overflow\">\n      <Row>\n        <Col sm={12} md={8} lg={7}>\n          <Row className=\"align-items-center\">\n            <Col sm={6}>\n              <div className=\"d-flex align-items-center\">\n                <FaIcon icon=\"exclamation-triangle\" size=\"lg\" className=\"dog d-block me-2\"/>\n                <div>\n                  <small>\n                    There are {Utils.singularOrPlural(tokens.length, 'one', tokens.length)}\n                    {' '} additional source-{Utils.singularOrPlural(tokens.length, 'token', 'tokens')} that could not be displayed here.\n                    {' '} Select one to see routing mapped by source.\n                  </small>\n\n                </div>\n              </div>\n            </Col>\n            <Col sm={6}>\n              <div>\n                <EnhancedSelect\n                  value={''}\n                  options={tokens}\n                  controlShouldRenderValue\n                  isMulti={false}\n                  isSearchable\n                  onChange={handleSelect}\n                  formatOptionLabel={SourceTokenOptionLabel}\n                  getOptionValue={(opt:any) => opt.source.id.toString()}\n                  placeholder=\"Search by source name or token\"\n                  //Match on full token, partial token label, partial source name\n                  filterOption={(option, input) => {\n                    const {data} = option\n                    return (data.label && data.label.toLowerCase().indexOf(input.toLowerCase()) >= 0)\n                      || data.token.toLowerCase() === input.toLowerCase()\n                      || data.source.name.toLowerCase().indexOf(input.toLowerCase()) >= 0\n                  }}\n                />\n              </div>\n            </Col>\n          </Row>\n        </Col>\n      </Row>\n\n\n\n\n\n\n    </div>\n\n  )\n}\n\n","import React, { useContext, useState } from 'react';\nimport {\n  Button, Modal, ModalFooter, ModalBody, ModalHeader, Col, Row,\n} from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport useFormState from '../../../../Hooks/useFormState';\nimport { notify, StandardAlert} from \"@thedmsgroup/mastodon-ui-components\";\nimport LoadingBar from '../../../../Layout/LoadingBar';\nimport { AppContext } from '../../../../Providers/AppProvider';\nimport {VendorForm, VendorValidationSchema} from './Form'\n\n/*\n * Modal wrapper for vendor form\n */\nconst VendorModal = ({ vendor, isOpen, close, onSuccess }) => {\n  if (!vendor) return null\n  const [isNew, setIsNew] = useState(vendor.id === 0)\n  const [confirmationMode, setConfirmationMode] = useState(false);\n  const app = useContext(AppContext)\n\n  const {\n    formApi, formIsValid, formValues, formErrors,\n  } = useFormState(\n    {\n      ...vendor,\n    },\n    VendorValidationSchema,\n    null,\n    null,\n  )\n\n\n  const handleSave = () => {\n    const isValid = formApi.validate();\n    if (isValid) {\n      save()\n    }\n  };\n\n  const save = async () => {\n    app.showLoader('modal', isNew ? 'Creating vendor...' : 'Saving vendor...')\n    let result;\n    const data = { ...formValues }\n\n    data.name = data.name.trim();\n    if (isNew) {\n      data.create_auth_token = true\n      result = await app.api.endpoints.vendors.create(data)\n      if (result) {\n        formApi.setValues({\n          name:result.name,\n          crypto_key:result.crypto_key,\n        })\n        setConfirmationMode(true);\n        setIsNew(false)\n      }\n    } else {\n      result = await app.api.endpoints.vendors.update(data);\n    }\n\n    app.showLoader(false);\n\n    if (result) {\n      // if updating, just close the modal\n      // if we created a vendor, keep modal open to show the new auto-created values\n      if(!isNew) {\n        close(true)\n      }\n\n      notify(`The vendor has been saved`, 'success')\n      onSuccess && onSuccess(result, isNew)\n    } else {\n      // Could get 'name already exists' error\n      if (api.error.form && api.error.form['name']) {\n        formApi.setError('name', api.error.form['name']);\n        notify(`Unable to save vendor: duplicate vendor name`, 'error')\n      } else {\n        notify(`Unable to save vendor: ${api.error ? api.error.name : \"\"}`, 'error')\n      }\n    }\n  };\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      toggle={close}\n    >\n\n      <ModalHeader toggle={close}>\n        { isNew ? 'Create Vendor'\n          : (\n            confirmationMode ? 'Created Vendor' : (\n              <>\n                Edit Vendor | <span className=\"modal-subheader\">{vendor.name}</span>\n              </>\n            )\n          )}\n        {' '}\n      </ModalHeader>\n      <ModalBody>\n        <LoadingBar name=\"modal\" />\n\n        {!formIsValid\n        && (\n          <StandardAlert color=\"warning\">\n            Please correct the errors below before continuing\n          </StandardAlert>\n        )}\n\n        <div className=\"vendor-form\">\n\n          <Row>\n            <Col sm={12} md={10}>\n\n              <VendorForm\n                values={formValues}\n                errors={formErrors}\n                onChange={formApi.handleOnChange}\n                isNew={isNew}\n                vendor={vendor}\n                isValid={formIsValid}\n              />\n\n            </Col>\n          </Row>\n\n\n        </div>\n      </ModalBody>\n\n\n      <ModalFooter>\n        {confirmationMode ? (\n          <Button\n            onClick={() => close(true)}\n            color=\"primary\"\n            size=\"sm\"\n          >\n            close\n          </Button>\n        ) : (\n          <>\n            <Button\n              onClick={close}\n              color=\"link\"\n              size=\"sm\"\n            >\n              Cancel\n            </Button>\n            <Button\n              onClick={handleSave}\n              color=\"primary\"\n              size=\"sm\"\n            >\n              Save\n            </Button>\n          </>\n        )}\n\n      </ModalFooter>\n\n\n    </Modal>\n  );\n};\n\nVendorModal.propTypes = {\n  vendor: PropTypes.object,\n  openModal: PropTypes.func,\n  closeModal: PropTypes.func,\n  names: PropTypes.array,\n};\n\nexport default VendorModal;\n","import React, {FC, useEffect, useMemo, useState, useCallback} from 'react'\nimport ReactDOM from \"react-dom\"\nimport RoutingApi from \"./RoutingApi\"\nimport useQueryState from \"../../../Hooks/useQueryState\"\nimport {useVerticals} from \"../../../Hooks/useVerticals\";\nimport {BlockUI} from 'ns-react-block-ui'\nimport {Button, Spinner} from \"reactstrap\"\nimport Filters from \"./Filters\"\nimport {SourceNode} from \"./SourceNode\"\nimport {EligibilityNode} from \"./EligibilityNode\"\nimport {InfoNode} from \"./InfoNode\"\nimport {LaneFilterNode} from \"./LaneFilterNode\"\nimport {VendorNode} from \"./VendorNode\"\nimport ChannelNode from \"./ChannelNode\"\nimport {SourceTokenNode} from \"./SourceTokenNode\"\nimport {OrderNode} from \"./OrderNode\"\nimport {AlertNode} from \"./AlertNode\"\nimport {FlowHeaderNode} from \"./FlowHeaderNode\"\nimport {withProps} from \"../../../Components/WithProps\"\nimport {\n  //Background,\n  //BackgroundVariant,\n  //Controls,\n  //MiniMap,\n  type Edge,\n  type Node,\n  Position,\n  ReactFlow,\n  ReactFlowProvider,\n  useEdgesState,\n  useNodesState,\n  useNodesInitialized,\n  useReactFlow,\n  useStoreApi,\n  getConnectedEdges,\n  getIncomers,\n  getOutgoers,\n  isNode, NodeTypes, NodeProps\n} from '@xyflow/react'\nimport type {Channel, SourceToken} from \"../../../types\"\nimport {ChannelSourceRoute, Modal as RoutingRulesModal} from \"../Rules\"\nimport {SourceModal} from \"../../PublisherManager/Sources/Source/SourceModal\";\nimport {LinkChannelSourceModal} from \"../../PublisherManager/Sources/Source/LinkChannelSourceModal\";\nimport {SourceTokenModal} from \"../../PublisherManager/SourceToken/SourceTokenModal\"\nimport {ChannelModal} from \"../../PublisherManager/Channels/Channel/ChannelModal\"\nimport {TokenOverflow} from \"./TokenOverflow\";\nimport {default as VendorModal} from \"../../PublisherManager/Vendors/Vendor/Modal\"\nimport {Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport \"./styles.scss\"\nimport '@xyflow/react/dist/style.css'\nimport {faFileInvoiceDollar} from \"@fortawesome/free-solid-svg-icons\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\n\n\nconst routingApi = new RoutingApi()\nconst OriginX = 20\nconst OriginY = 80\nconst NodeVerticalGap = 20\nconst NodeColumnGap = 70\nconst NodeDefaultWidth = 320\n\nexport type FlowNodeProps<NodeDataType=Record<string, any>> = NodeProps & {\n  targetPosition:Position,\n  sourcePosition:Position,\n  data: NodeDataType\n}\ntype RoutingMapPropertiesType = {\n  useQuery?: boolean,\n  sourceId?: number,\n  channelId?: number,\n  vendorId?: number,\n  orderId?: number,\n  accountId?: number,\n};\n\nexport const RoutingMap:FC<RoutingMapPropertiesType>= (props) => {\n\n  return (\n    <ReactFlowProvider>\n      <RoutingMapper {...props} />\n    </ReactFlowProvider>\n  )\n}\n\n// A context where app state can be stored and nodes can access it.\n// Useful because nodeTypes are memoized and callbacks provided to nodes may not have current state.\n// Within the node, import this context, implement the useContext hook.\nexport const RoutingFlowContext = React.createContext({\n  selectedVendor: null,\n  selectedSource: null,\n  selectedChannel: null,\n});\n\n/*\n * Routing Map\n * Show a route map from a selected source, channel, or order.\n */\nconst RoutingMapper: FC<RoutingMapPropertiesType> = ({\n   useQuery = true,\n   sourceId,\n   channelId,\n   vendorId,\n   accountId,\n   orderId\n }) => {\n\n  // If this component is its own page we will use the query string for state,\n  // but if used in a modal on some other page, we use props instead of query string\n  const [query, setQuery] = useQuery\n    ? useQueryState({}, {parseOptions: {parseNumbers: false}})\n    : useState<any>(() => {\n      if (sourceId) {\n        return {source: sourceId.toString()}\n      } else if (channelId) {\n        return {channel: channelId.toString()}\n\n      }  else if (vendorId) {\n        return {vendor: vendorId.toString()}\n      } else if (accountId && orderId) {\n        return {account: accountId.toString(), order: orderId.toString()}\n      }\n    });\n  const [filterRefreshKey, setFilterRefreshKey] = useState(999)\n\n  const [loadingOrders, setLoadingOrders] = useState(false)\n  const [dataView, setDataView] = useState<string[]>([\"sales\"])\n  const [flowView, setFlowView] = useState(()=> {\n    if (query.source){\n      return \"source\"\n    }\n    if (query.channel) {\n      return \"channel\"\n    }\n    if (query.vendor) {\n      return \"vendor\"\n    }\n    return \"\";\n  });\n  const [loading, setLoading] = useState(Boolean(flowView))\n  const {loaded: verticalsLoaded, getDisplayName:getVerticalDisplayName} = useVerticals()\n\n  //Sources\n  const [selectedSource, setSelectedSource] = useState<any | null>() //the source selected by the filters\n  const [editSource, setEditSource] = useState<any | null>(null) //the source we are editing\n  const [sourcePanelOpen, setSourcePanelOpen] = useState(false)\n  const [candidateSources, setCandidateSources] = useState<any[]>([]) // in-view sources that may be applied to a new source token\n  const [linkSource, setLinkSource] = useState<any | null>(null) //the source we want to link to a channel\n  const [linkChannelSourcePanelOpen, setLinkChannelSourcePanelOpen] = useState(false)\n\n  const [rulesPanelOpen, setRulesPanelOpen] = useState(false)\n  const [routingRule, setRoutingRule] = useState<any>(null)\n\n  const [tokenPanelOpen, setTokenPanelOpen] = useState(false)\n  const [editToken, setEditToken] = useState<any|null>(null)\n  const [candidateVendors, setCandidateVendors] = useState<any[]>([]) // in-view vendors that may be applied to a new source (via token)\n\n\n  // Channel and Orders\n  const [selectedChannel, setSelectedChannel] = useState<any | null>() // The channel selected by the filters\n  const [editChannel, setEditChannel] = useState<any | null>(null) //the channel we are editing (details or eligibilities)\n  const [channelPanelOpen, setChannelPanelOpen] = useState(false)\n  const [channelSourcePanelOpen, setChannelSourcePanelOpen] = useState(false)\n  const [selectedOrder, setSelectedOrder] = useState<any | null>()\n  const [orderChannel, setOrderChannel] = useState<any | null>(null) //the channel we are showing orders for\n  const [channelOrders, setChannelOrders] = useState<any>([]); //orders that use a channel as a channel modifier\n\n  //Vendors\n  const [selectedVendor, setSelectedVendor] = useState<any | null>() //the vendor selected by the filters\n  const [editVendor, setEditVendor] = useState<any | null>(null)\n  const [vendorModalOpen, setVendorModalOpen] = useState(false)\n  const [overflowTokens, setOverflowTokens] = useState([]) //for messaging if vendor has too many tokens to show in the flow\n\n  // React-flow states and store\n  const [nodes, setNodes, onNodesChange] = useNodesState<Node>([])\n  const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([])\n  const nodesInitialized = useNodesInitialized({includeHiddenNodes:true})\n  const { setViewport } = useReactFlow()\n  const store = useStoreApi()\n\n  const handleChangeFilters = (filters: any) => setQuery(filters || {})\n\n  //Reflow after initialization (when nodes receive a measurement)\n  useEffect(() => {\n    if (nodesInitialized){\n      window.requestAnimationFrame(()=>reflow())\n    }\n  }, [nodesInitialized])\n\n  // Adjust element position based on content height.\n  // React-flow does not automatically adjust the flow based on element size.\n  // Elements can change size after render due to content wrapping\n  const reflow = () => {\n\n    const {nodes} = store.getState();\n    const previousOfType:Record<string, Node|null> = {\n      vendorNode:null,\n      sourceTokenNode:null,\n      sourceNode:null,\n      eligibilityNode:null,\n      channelNode:null,\n      orderNode:null\n    };\n    //Nodes will be found in the order they were added, with headers added first\n    const newNodes= nodes.map((node:Node) => {\n      node.hidden=false; // ? some trouble with nodes hiding after reflow\n      //some headers may vary in height due to filter display. Add them to 'previous' so next node can be placed correctly.\n      if (node.type === 'headerNode') {\n        switch(node.id) {\n          case 'header-source-token':\n            previousOfType['sourceTokenNode'] = node\n            break\n        }\n      }\n      if (node.type && typeof previousOfType[node.type] !== 'undefined'  ) {\n        const previous = previousOfType[node.type]\n        if (previous && previous.measured?.height) {\n          node.position.y = previous.position.y +  previous.measured.height + NodeVerticalGap\n        }\n        previousOfType[node.type] = node\n\n      }\n      return {...node}\n    })\n\n    setNodes(newNodes)\n    //Sometimes edges don't get rendered so force it by renewing node objects\n    setEdges((prevEdges) => prevEdges.map((edge) => ({...edge})))\n  }\n\n\n  // Note: on dev we get a ResizeObserver error when switching the view\n  // https://github.com/xyflow/xyflow/issues/4792\n  // The devs say you can safely ignore it, but it is annoying due to the dev-server error overlay\n  // See webpack.dev.js for how we block the overlay for this error specifically\n  // Generally the error likely caused by something do a resize while react-flow is resizing, leading to a loop\n  // Solutions or error handling: https://stackoverflow.com/questions/76187282/how-to-fix-resizeobserver-loop-completed-with-undelivered-notifications\n  // https://stackoverflow.com/questions/75774800/how-to-stop-resizeobserver-loop-limit-exceeded-error-from-appearing-in-react-a  (webpack config)\n  const handleSelectDataView = (view:string=\"\") => {\n    console.log(\"index.tsx:select data view\", view, selectedOrder );\n    const newView = dataView.includes(view) ? dataView.filter((v) => v!== view) : [...dataView, view]\n    if (selectedSource) {\n      initSourceView(selectedSource, newView)\n    } else if (selectedChannel) {\n      initChannelView(selectedChannel, channelOrders, newView)\n    } else if (selectedVendor) {\n      initVendorView(selectedVendor, newView)\n    } else if (selectedOrder) {\n      initOrderView(selectedOrder, newView)\n    }\n  }\n\n  const handleGetChannelOrders = (channel: Channel) => {\n    if (channel) {\n      if (!orderChannel || orderChannel.id !== channel.id) {\n        setOrderChannel(channel)\n        loadChannelOrders(channel.id)\n      }\n    }\n  }\n\n  //switch to channel view of specific channel node\n  const handleExamineChannel = (channelId: number|string) => {\n    if ( channelId) {\n      setQuery({channel: channelId})\n    }\n  }\n\n  // switch to source view of specific source node\n  const handleExamineSource = (sourceId: string|number) => {\n    if ( sourceId) {\n      setQuery({source: sourceId})\n    }\n  }\n\n  const openSourceRules = (s:any) => {\n    setRoutingRule({\n      // @ts-ignore\n      entity: s,\n      type: 'source',\n    })\n    setRulesPanelOpen(true)\n  };\n\n  const openChannelRules = (c:any) => {\n    setRoutingRule({\n      entity: c,\n      type: 'channel',\n    })\n    setRulesPanelOpen(true)\n  };\n\n  // switch to vendor view of specific vendor node\n  const handleExamineVendor = (vendorId: any) => {\n    if ( vendorId) {\n      setQuery({vendor: vendorId})\n    }\n  }\n\n  const openVendorRules = (v:any) => {\n    setRoutingRule({\n      entity: v,\n      type: 'vendor',\n    })\n    setRulesPanelOpen(true)\n  };\n\n  const openVendorModal = (v:any) => {\n    setEditVendor(v)\n    setVendorModalOpen(true)\n  };\n\n  const closeVendorModal = () => {\n    setVendorModalOpen(false)\n    setEditVendor(null)\n  };\n\n  const openChannelSourceRules = (route:ChannelSourceRoute) => {\n\n    if (route) {\n      setRoutingRule({\n        entity: route,\n        type: 'channelsource',\n      });\n      setRulesPanelOpen(true)\n    }\n\n  };\n\n  const openTokenPanel = (t:any) => {\n    setEditToken(t)\n    setTokenPanelOpen(true)\n  };\n\n  const closeTokenPanel = () => {\n    setTokenPanelOpen(false)\n    setEditToken(null)\n    setCandidateSources([])\n  };\n\n  const closeRulesPanel = () => {\n    setRulesPanelOpen(false)\n    setRoutingRule(null)\n  }\n\n  const openSourcePanel = (s:any) => {\n    setEditSource(s)\n    setSourcePanelOpen(true)\n  };\n\n  const closeSourcePanel = () => {\n    setSourcePanelOpen(false)\n    setEditSource(null)\n  }\n\n  const openChannelPanel = (c:any) => {\n    setEditChannel(c)\n    setChannelPanelOpen(true)\n  };\n\n  const closeChannelPanel = () => {\n    setChannelPanelOpen(false)\n    setChannelSourcePanelOpen(false)\n    setEditChannel(null)\n  }\n\n\n  const openLinkChannelSourcePanel = (s:any) => {\n    setLinkSource(s)\n    setLinkChannelSourcePanelOpen(true)\n  };\n\n  const closeLinkChannelSourcePanel = () => {\n    setLinkChannelSourcePanelOpen(false)\n    setLinkSource(null)\n  }\n\n  const openChannelSourcePanelFromChannel = (c:any) => {\n    setEditChannel(c)\n    //same panel as Edit Channel, but sources panel is active\n    setChannelSourcePanelOpen(true)\n  };\n\n  const handleAdd = useCallback((entityType:string) => {\n\n    if (entityType === 'source-token') {\n      // The panel will have to know currently mapped source(s)\n      // This would be selectedSource for source view\n      // For channel view it would be selectedChannel.sources\n      setCandidateSources(() => {\n        if (selectedSource) {\n          return [selectedSource]\n        } else if (selectedChannel) {\n          return selectedChannel.sources\n        }\n        return []\n      })\n      setEditToken({\n        id: 0,\n        token: \"\",\n        seed_data: null,\n        status: 'active',\n        source: {id:0, name:''},\n        vendor: {id:0, name:''},\n      })\n      setTokenPanelOpen(true);\n\n    } else if (entityType === 'channel') {\n\n      setEditChannel({\n        id: 0,\n        status:'active',\n        sources:[]\n      })\n      setChannelPanelOpen(true)\n\n    } else if (entityType === 'source') {\n      setCandidateVendors(() => {\n        if (selectedSource) {\n          return getUniqueVendorsFromTokens(selectedSource.tokens)\n        } else if (selectedChannel) {\n          return getUniqueVendorsFromTokens(selectedChannel.sources.reduce((acc:any[], source:any) => [...acc, ...source.tokens], []))\n        }\n        return []\n      })\n      setEditSource({\n        id: 0,\n        status:'active',\n      })\n      //TODO: candidate vendors\n      // channel view: channel has sources => tokens => vendor (id, name, rule_id)\n      // Source view: source => tokens => vendor (id, name, rule_id)\n      setSourcePanelOpen(true)\n    } else if (entityType === 'vendor') {\n      setEditVendor({\n        id: 0,\n      })\n\n      setVendorModalOpen(true)\n    }\n  }, [selectedChannel, selectedSource, selectedVendor]);\n\n\n  /*\n   * In vendor view, vendor has no source-tokens assigned\n   * User can add a token for an existing source, or create a new source\n   * See: SourceTokenNode\n   */\n  const handleAddTokenForCurrentVendor = (vendor:any, newSource?:boolean) => {\n    //should only execute during vendor view\n    if (vendor) {\n      setCandidateVendors([vendor]);\n      if (newSource) {\n        //Open source form. After creating a new source it will prompt for adding a token for this vendor\n        setEditSource({\n          id: 0,\n          status:'active',\n        })\n        //TODO: candidate vendors\n        // channel view: channel has sources => tokens => vendor (id, name, rule_id)\n        // Source view: source => tokens => vendor (id, name, rule_id)\n        setSourcePanelOpen(true)\n      } else {\n        //Open SourceToken form, vendor will be populated\n        setEditToken({\n          id: 0,\n          token: \"\",\n          seed_data: null,\n          status: 'active',\n          source: {id:0, name:''},\n          vendor: {id:vendor.id, name:vendor.name},\n        })\n        setTokenPanelOpen(true);\n      }\n\n    }\n  }\n\n  const handleAddTokenForCurrentSource = (source:any) => {\n    //should only execute during vendor view\n    if (source) {\n      //setCandidateVendors([vendor]);\n      setEditToken({\n        id: 0,\n        token: \"\",\n        seed_data: null,\n        status: 'active',\n        source,\n        vendor: {id:0, name:''},\n      })\n      setTokenPanelOpen(true);\n    }\n  }\n\n  const handleClearFilters = (flowView:any, id:number) => {\n    if (flowView === 'vendor') {\n      setQuery({vendor:id})\n    }\n\n  }\n\n  const getUniqueVendorsFromTokens= (tokens:SourceToken[]) => {\n    const vendors =  tokens.reduce((acc, token) => {\n      if (!acc[token.vendor.id]) {\n        acc[token.vendor.id] = token.vendor;\n      }\n      return acc;\n    }, {} as Record<number,any>)\n    return Object.values(vendors);\n  }\n\n\n  const handleExamineOrder = (order: any) => {\n    if ( order ) {\n      setQuery({account:order.account.id, order: order.id})\n      setSelectedOrder(order);\n    }\n  }\n\n  const handleSaveSourceSuccess = (source:any, isNew:boolean=false) => {\n    closeSourcePanel()\n    // focus on new source with requery, else refresh current view\n    if (source && isNew) {\n      setQuery({vendor:source.id})\n      setFilterRefreshKey(filterRefreshKey + 1) //update filter choices\n    } else {\n      refreshView()\n    }\n  }\n  const handleSaveVendorSuccess = (vendor:any, isNew:boolean=false) => {\n    closeVendorModal()\n    // focus on new vendor with requery, else refresh current view\n    if (vendor && isNew) {\n      setQuery({vendor:vendor.id})\n      setFilterRefreshKey(filterRefreshKey + 1) //update filter choices\n    } else {\n      refreshView()\n    }\n  }\n\n  // CUSTOM NODES\n  // Note: callbacks provided to the custom node will NOT always have the current state of this component\n  // (the app state will no longer be in scope)\n  // https://github.com/xyflow/xyflow/issues/1610\n  // The 'useCallback' hook does not fix this.\n  // One solution is to use relevant state values as a dependency for this nodeTypes memo.\n  // (React-flow does not like this and throws warnings about re-defining nodes, you are not supposed to update nodeTypes)\n  // Another solution is pass current state values into the nodes as node data during flow creation (initSourceView, etc)\n  // We can also use our RoutingFlowContext values within the nodes, which will have the most recent state.\n  const nodeTypes = useMemo(() => (\n    {\n      //Using withProps to add additional props beyond what react-flow provides to its nodes\n      vendorNode: withProps(VendorNode, {\n        onOpenRules: openVendorRules,\n        onExamine: handleExamineVendor,\n        onEdit: openVendorModal\n      }),\n      sourceTokenNode: withProps(SourceTokenNode, {\n        onEdit: openTokenPanel,\n        onAddForCurrentVendor: handleAddTokenForCurrentVendor,\n        onAddForCurrentSource: handleAddTokenForCurrentSource\n      }),\n      sourceNode: withProps(SourceNode, {\n        onExamine: handleExamineSource,\n        onEdit: openSourcePanel,\n        onOpenRules: openSourceRules,\n      }),\n      eligibilityNode: withProps(EligibilityNode, {\n        onOpenRules: openChannelSourceRules,\n        onLinkSourceToChannel: openLinkChannelSourcePanel,\n        onOpenChannelSources: openChannelSourcePanelFromChannel\n      }),\n      channelNode: withProps(ChannelNode, {\n        onGetOrders:handleGetChannelOrders,\n        onExamine: handleExamineChannel,\n        onEdit: openChannelPanel,\n        onOpenRules: openChannelRules,\n        onOpenChannelSources: openChannelSourcePanelFromChannel\n      }),\n\n      orderNode: withProps(OrderNode, {\n        onResize: reflow,\n        onExamine: handleExamineOrder,\n      }),\n\n      headerNode:withProps(FlowHeaderNode, {\n        onAdd: handleAdd, //for any entity, where allowed (see getHeaderNodes)\n        onClearFilters: handleClearFilters\n      }),\n      alertNode: AlertNode,\n      infoNode: InfoNode,\n      laneFilterNode: LaneFilterNode\n    } as NodeTypes\n  ), [])\n\n  // Switch/adjust map view based on query\n  useEffect(() => {\n    // load views if source, query, or order param changes\n    if (verticalsLoaded) {\n      if (query.source) {\n        if (flowView !== \"source\" || !selectedSource || (selectedSource && selectedSource.id !== query.source)) {\n          loadSourceView(query.source)\n        }\n      }\n\n      if (query.channel) {\n        if (flowView !== \"channel\" || !selectedChannel || (selectedChannel && selectedChannel.id !== query.channel)) {\n          loadChannelView(query.channel)\n        }\n\n      }\n      if (query.vendor) {\n        if (flowView !== \"vendor\" || !selectedVendor || (selectedVendor && selectedVendor.id !== query.vendor)) {\n          loadVendorView(query.vendor)\n        }\n\n      }\n      if (query.order) {\n        if (flowView !== \"order\" || !selectedOrder || (selectedOrder && selectedOrder.id !== query.order)) {\n          loadOrderView(query.order)\n        }\n      }\n    }\n  }, [query, verticalsLoaded])\n\n  //TODO: on creation of source/channel/vendor, change flowView to that specific entity\n  const refreshView = () => {\n    if (flowView === \"source\") {\n      loadSourceView(query.source)\n    } else if (flowView === \"channel\") {\n      loadChannelView(query.channel)\n    } else if (flowView === \"vendor\") {\n      loadVendorView(query.vendor)\n    } else if (flowView === \"order\") {\n      loadOrderView(query.order)\n    }\n  }\n\n  //Load routing map from the perspective of one specified source\n  const loadSourceView = async (sourceId:any) => {\n    setViewport({ x: 0, y: 0, zoom: 1 });\n    setLoading(true);\n    const result = await routingApi.sourceRoutes(sourceId);\n    if (result) {\n      initSourceView(result, dataView)\n    }\n\n    setLoading(false)\n  }\n\n  // Load routing map from the perspective of one specified channel\n  const loadChannelView = async (channelId:number) => {\n    //viewport shifted so channel will be in view on load\n    setViewport({ x: -(NodeDefaultWidth + NodeColumnGap), y: 0, zoom: 1 });\n    setLoading(true)\n    const channelRoutes = await routingApi.channelRoutes(channelId)\n    const channelOrders = await routingApi.ordersForChannel(channelId) as any\n    if (channelRoutes) {\n      initChannelView(channelRoutes, channelOrders, dataView)\n    }\n    setLoading(false)\n  }\n\n  // Load routing map from the perspective of one specified vendor\n  // The number of sources per vendor can be huge, so we request a limited number\n  const loadVendorView = async (vendorId:number) => {\n    setViewport({ x: 0, y: 0, zoom: 1 });\n    setLoading(true)\n    const params:any = {source_limit:20};\n    if (query.product) {\n      params.product = query.product\n    }\n    if (query.vertical) {\n      params.vertical_id = query.vertical\n    }\n    const result = await routingApi.vendorRoutes(\n      vendorId,\n      params\n    )\n    if (result) {\n      initVendorView(result, dataView)\n    }\n    setLoading(false)\n  }\n\n  const loadOrderView = async (orderId:any) => {\n    //viewport shifted so order will be in view on load\n    setViewport({ x: -2 * (NodeDefaultWidth ), y: 0, zoom: 1 });\n    setLoading(true);\n    const result = await routingApi.channelsForOrder(orderId);\n    if (result) {\n      initOrderView(result, dataView);\n    }\n\n    setLoading(false)\n  }\n\n\n  // Load the orders that use the specified channel in the rule's channel modifiers\n  const loadChannelOrders = async (channelId:number) => {\n    setLoadingOrders(true);\n    const result = await routingApi.ordersForChannel(channelId) as any\n    if (result) {\n      // TODO: group by account?\n      setChannelOrders(result)\n      const {nodes: orderNodes, edges:orderEdges} = getOrderNodes(result, channelId, true)\n      updateFlowOrders(orderNodes, orderEdges)\n    }\n    setLoadingOrders(false)\n  }\n\n  const getHeaderNodes = (flowView:string, filters:Record<string, string[]>={}) => {\n\n    const baseY = 20\n\n    const nodes:Node[] = [\n      {\n        id:`header-vendor`,\n        data: {\n          title:flowView === 'vendor' ? 'Vendor' : 'Vendors',\n          entity:'vendor',\n          active:flowView==='vendor',\n          flowView,\n          allowAdd: true,\n        },\n        position: {x:OriginX, y:baseY},\n        type:'headerNode',\n        hidden:false\n      },\n      {\n        id:`header-source-token`,\n        data: {\n          title:'Source Tokens',\n          entity:'source-token',\n          flowView,\n          filters:filters.sourceToken,\n          allowAdd: true,\n        },\n        position: {x:OriginX + NodeDefaultWidth + NodeColumnGap , y:baseY},\n        type:'headerNode',\n        hidden:false\n      },\n      {\n        id:`header-source`,\n        data: {\n          title:flowView === 'source' ? 'Source' : 'Sources',\n          entity:'source',\n          active:flowView==='source',\n          flowView,\n          allowAdd: true\n        },\n        position: {x:OriginX +( 2* (NodeDefaultWidth + NodeColumnGap)), y:baseY},\n        type:'headerNode',\n        hidden:false,\n      },\n      {\n        id:`header-eligibility`,\n        data: {\n          title:'Eligibilities',\n          entity:'eligibility',\n          flowView,\n          allowAdd:false\n        },\n        position: {x:OriginX +( 3* (NodeDefaultWidth + NodeColumnGap)), y:baseY},\n        type:'headerNode'\n      },\n      {\n        id:`header-channel`,\n        data: {\n          title:flowView === 'channel' ? 'Channel' : 'Channels',\n          active:flowView==='channel',\n          flowView,\n          entity: 'channel',\n          allowAdd:true\n        },\n        position: {x:OriginX +( 4* (NodeDefaultWidth + NodeColumnGap)), y:baseY},\n        type:'headerNode'\n      },{\n        id:`header-order`,\n        data: {\n          title: flowView === 'orders' ? 'Order' : 'Orders',\n          active: flowView === 'orders',\n          entity: 'orders',\n          allowAdd: false,\n          flowView\n        },\n        position: {x:OriginX +( 5* (NodeDefaultWidth + NodeColumnGap)), y:baseY},\n        type:'headerNode'\n      },\n    ]\n\n    return nodes\n  }\n\n  const columnsX = useMemo(() => {\n    const vendorX = OriginX\n    const sourceTokenX = OriginX + NodeDefaultWidth + NodeColumnGap\n    const sourceX = OriginX + (2 * (NodeDefaultWidth + NodeColumnGap))\n    const eligibilityX = OriginX + (3 * (NodeDefaultWidth + NodeColumnGap))\n    const channelX = OriginX + (4 * (NodeDefaultWidth + NodeColumnGap))\n    const orderX = OriginX + (5 * (NodeDefaultWidth + NodeColumnGap))\n    return {vendorX, sourceTokenX, sourceX, eligibilityX, channelX, orderX}\n  }, []);\n\n  const initSourceView = (source: any, dataView:string[]=[]) => {\n    const nodeHeight = dataView.includes('sales') ? 100 : 50\n    let nodes:Node[] = getHeaderNodes('source')\n\n    let edges:Edge[] = []\n\n    if (source) {\n\n      const {vendorX, sourceX, eligibilityX, channelX} = columnsX\n\n      let channelY = OriginY;\n\n      //Source Node (1)\n      nodes.push({\n        id:`src-${source.id}`,\n        data: {label:source.name, source, dataView, flowView:'source'},\n        position: {x:sourceX, y:OriginY},\n        targetPosition: Position.Left,\n        sourcePosition: Position.Right,\n        type:'sourceNode'\n      })\n\n\n      //SourceToken and order nodes and edges\n      const {nodes:sourceTokenNodes, edges:sourceTokenEdges} = getSourceTokenNodesFromSources([source], dataView)\n      //const {nodes: orderNodes, edges:orderEdges} = getOrderNodes(channelOrders, orderChannel?.id ?? 0, dataView)\n      const {nodes: orderNodes, edges:orderEdges} = getOrderNodes([], 0, source.channels.length > 0, dataView)\n      nodes = [...nodes, ...sourceTokenNodes, ...orderNodes]\n      edges = [...edges, ...sourceTokenEdges, ...orderEdges]\n\n\n      //Channel and Eligibility nodes & edges\n      if (source.channels.length) {\n        source.channels.forEach((c:any) => {\n          nodes.push({\n            id:`elg-${source.id}-${c.id}`,\n            data: {\n              source: source,\n              channel: c,\n              eligibility: c.eligibility,\n              dataView\n            },\n            position: {x:eligibilityX, y:channelY},\n            sourcePosition: Position.Right,\n            targetPosition: Position.Left,\n            type: 'eligibilityNode'\n          })\n\n          edges.push({\n            id:`edge-elg-src-${source.id}-${c.id}`,\n            type:'simplebezier',\n            source:`src-${source.id}`,\n            target: `elg-${source.id}-${c.id}`,\n            sourceHandle: 'source-handle',\n            animated:true\n          })\n\n          // Channel nodes & edges\n          nodes.push({\n            id:`chn-${c.id}`,\n            data: {channel:c, dataView},\n            position: {x:channelX, y:channelY},\n            sourcePosition: Position.Right,\n            targetPosition: Position.Left,\n            type:'channelNode'\n          })\n          edges.push({\n            id:`edge-elg-chn-${c.id}`,\n            type:'simplebezier',\n            source:`elg-${source.id}-${c.id}`,\n            target: `chn-${c.id}`,\n            sourceHandle: 'source-handle',\n            animated:true\n          })\n\n          channelY += nodeHeight + NodeVerticalGap\n        })\n      } else {\n        //No channels use this source\n        //Add alert node in Eligibility column\n        nodes.push({\n          id:`elg-${source.id}-none`,\n          data: {\n            source: source,\n            channel: {},\n            eligibility: {},\n            alert:true,\n            dataView:''\n          },\n          position: {x:eligibilityX, y:channelY},\n          sourcePosition: Position.Right,\n          targetPosition: Position.Left,\n          type: 'eligibilityNode'\n        })\n\n        edges.push({\n          id:`edge-elg-src-${source.id}-none`,\n          type:'simplebezier',\n          source:`src-${source.id}`,\n          target: `elg-${source.id}-none`,\n          sourceHandle: 'source-handle',\n          animated:true\n        })\n      }\n\n\n      //Vendor Nodes\n      let vendorY = OriginY\n      source.vendors.forEach((v:any) => {\n        nodes.push({\n          id: `ven-${v.id}`,\n          data: {\n            vendor: v,\n            dataView\n          },\n          position: {x: vendorX, y: vendorY},\n          sourcePosition: Position.Right,\n          type: 'vendorNode'\n        })\n\n\n        vendorY += nodeHeight + NodeVerticalGap\n      })\n\n      //TODO: could call loadChannelOrders for first channel if we have channels\n      // note: causes spinner to appear twice. We could do this in the sourceLoader function, pass the result to this function\n      // if (source.channels.length) {\n      //   window.setTimeout(() => loadChannelOrders(source.channels[0].id), 1000)\n      // }\n\n      // Batched state updates will be automatic in React 18\n      // Hopefully we can live with \"unstable\"\n      ReactDOM.unstable_batchedUpdates(()=>{\n\n        setNodes(nodes)\n        setEdges(edges)\n        setSelectedSource(source)\n        setSelectedChannel(null)\n        setSelectedOrder(null)\n        setOverflowTokens([])\n        setFlowView(\"source\")\n        setOrderChannel(null)\n        setChannelOrders([])\n        setDataView(dataView)\n      }) // batch state\n\n    }\n  }\n\n  const initChannelView = (channel:any, channelOrders:any[]=[], dataView:string[]=[]) => {\n\n    const nodeHeight = dataView.includes('sales') ? 100 : 50\n\n    let nodes:Node[] = getHeaderNodes('channel')\n    let edges:Edge[] = []\n\n    if (channel) {\n\n      const { vendorX, sourceX, eligibilityX, channelX} = columnsX\n      let sourceY = OriginY\n\n      //Channel Node (1)\n      nodes.push({\n        id: `chn-${channel.id}`,\n        data: {label: channel.name, channel, dataView, flowView:'channel'},\n        position: {x: channelX, y: OriginY},\n        targetPosition: Position.Left,\n        sourcePosition: Position.Right,\n        type: 'channelNode'\n      })\n\n      //Source & Eligibility nodes & edges\n      //NO CHANNEL-SOURCES: set data that causes an alert to show in the Eligibility node\n      if (!channel.sources.length) {\n        nodes.push({\n          id:`elg-src-none-${channel.id}`,\n          data: {\n            source: {id:0},\n            channel: channel,\n            eligibility: {},\n            alert:true,\n            dataView:''\n          },\n          position: {x:eligibilityX, y:sourceY},\n          sourcePosition: Position.Right,\n          type: 'eligibilityNode'\n        })\n\n        //eligibility to channel\n        edges.push({\n          id:`edge-elg-src-none-${channel.id}`,\n          type:'simplebezier',\n          source: `elg-src-none-${channel.id}`,\n          target:`chn-${channel.id}`,\n          sourceHandle: 'source-handle',\n          animated:true\n        })\n      }\n\n\n      channel.sources.forEach((s:any) => {\n        nodes.push({\n          id:`elg-${s.id}-${channel.id}`,\n          data: {\n            source: s,\n            channel: channel,\n            eligibility: s.eligibility,\n            dataView\n          },\n          position: {x:eligibilityX, y:sourceY},\n          sourcePosition: Position.Right,\n          targetPosition: Position.Left,\n          type: 'eligibilityNode'\n        })\n\n        //eligibility to channel\n        edges.push({\n          id:`edge-elg-src-${s.id}-${channel.id}`,\n          type:'simplebezier',\n          source: `elg-${s.id}-${channel.id}`,\n          target:`chn-${channel.id}`,\n          sourceHandle: 'source-handle',\n          animated:true\n        })\n\n        //source to eligibility\n        edges.push({\n          id:`edge-elg-src-${s.id}`,\n          type:'simplebezier',\n          source:`src-${s.id}`,\n          target: `elg-${s.id}-${channel.id}`,\n          sourceHandle: 'source-handle',\n          animated:true\n        })\n\n        // Source nodes\n        nodes.push({\n          id:`src-${s.id}`,\n          data: {source:s, dataView},\n          position: {x:sourceX, y:sourceY},\n          sourcePosition: Position.Right,\n          targetPosition: Position.Left,\n          type:'sourceNode'\n        })\n\n\n        sourceY += nodeHeight + NodeVerticalGap;\n      })\n\n      const {nodes:sourceTokenNodes, edges:sourceTokenEdges} = getSourceTokenNodesFromSources(channel.sources, dataView)\n      //const {nodes: orderNodes, edges:orderEdges} = getOrderNodes(channelOrders, channel.id, true, dataView)\n      const {nodes: orderNodes, edges:orderEdges} = getOrderNodes(channelOrders, channel.id, true, dataView)\n\n      nodes = [...nodes, ...sourceTokenNodes, ...orderNodes]\n      edges = [...edges, ...sourceTokenEdges, ...orderEdges]\n\n      //Vendor Nodes\n      let vendorY = OriginY\n      channel.vendors.forEach((v:any) => {\n        nodes.push({\n          id: `ven-${v.id}`,\n          data: {\n            vendor: v,\n            dataView\n          },\n          position: {x: vendorX, y: vendorY},\n          sourcePosition: Position.Right,\n          // targetPosition: Position.Left,\n          type: 'vendorNode'\n        })\n\n        v.tokens.forEach((token:SourceToken) => {\n          edges.push({\n            id: `edge-src-${token.source.id}-ven-${v.id}`,\n            type: 'simplebezier',\n            source: `ven-${v.id}`,\n            target: `token-src-${token.source.id}-ven-${v.id}`, // `token-src-${src.id}-ven-${token.vendor.id}`\n            sourceHandle: 'source-handle',\n            animated: true\n          })\n        })\n\n        vendorY += nodeHeight + NodeVerticalGap\n      })\n\n      ReactDOM.unstable_batchedUpdates(()=>{\n\n        setNodes(nodes)\n        setEdges(edges)\n        setSelectedChannel(channel)\n        setSelectedSource(null)\n        setSelectedOrder(null)\n        setOverflowTokens([])\n        setFlowView(\"channel\")\n        setDataView(dataView)\n        setOrderChannel(channel)\n        setChannelOrders(channelOrders)\n\n      }) // batch state\n\n\n    }\n  }\n\n  const getFilterValues = ():string[] => {\n    const filterValues:string[] = []\n    console.log(\"index.tsx:getFilterValues query\", query );\n    if ((query.product || query.vertical)) {\n      if (query.product) {\n        filterValues.push(Utils.titleCase(query.product))\n      }\n      if (query.vertical) {\n        filterValues.push(getVerticalDisplayName(query.vertical))\n      }\n    }\n    console.log(\"index.tsx: returning filterValues\", filterValues );\n    return filterValues\n  }\n\n  const initVendorView = (vendor:any, dataView:string[]=[]) => {\n    const nodeHeight = dataView.includes('sales') ? 100 : 50\n\n    const filterValues = {sourceToken:getFilterValues()}\n    const archiveFilter = (item:any) => dataView.includes('archived') ? true : item.status !== 'archived' ;\n\n    let nodes:Node[] = getHeaderNodes('vendor', filterValues)\n    let edges:Edge[] = []\n\n    if (vendor) {\n\n      const { vendorX, sourceX, eligibilityX, channelX} = columnsX\n\n\n      //Vendor Node (1)\n      nodes.push({\n        id:`ven-${vendor.id}`,\n        data: {label:vendor.name, vendor, dataView, flowView:'vendor'},\n        position: {x:vendorX, y:OriginY},\n        sourcePosition: Position.Right,\n        type:'vendorNode'\n      })\n\n      const {nodes:sourceTokenNodes, edges:sourceTokenEdges} = getSourceTokenNodesFromVendor(vendor.tokens, vendor.id, dataView)\n      //const {nodes: orderNodes, edges:orderEdges} = getOrderNodes(channelOrders, orderChannel?.id ?? 0, dataView)\n      const {nodes: orderNodes, edges:orderEdges} = getOrderNodes([], 0, vendor.channels.length > 0, dataView)\n\n      nodes = [...nodes, ...sourceTokenNodes, ...orderNodes]\n      edges = [...edges, ...sourceTokenEdges, ...orderEdges]\n\n      //Source Nodes\n      let sourceY = OriginY\n      let eligibilityY = OriginY\n      vendor.sources.filter(archiveFilter).forEach((source:any) => {\n\n        nodes.push({\n          id: `src-${source.id}`,\n          data: {\n            source,\n            dataView\n          },\n          position: {x: sourceX, y: sourceY},\n          sourcePosition: Position.Right,\n          targetPosition: Position.Left,\n          type: 'sourceNode'\n        })\n\n        //Source & Eligibility nodes & edges\n        if (!source.channels.length) {\n          //No channels: make a fake channel that causes an alert to show\n          source.channels.push({\n            id:0,\n            eligibility:{}\n          })\n        }\n\n        source.channels.forEach((channel:any) => {\n          nodes.push({\n            id: `elg-${source.id}-${channel.id}`,\n            data: {\n              source,\n              channel,\n              eligibility: channel.eligibility,\n              alert: !channel.id,\n              dataView\n            },\n            position: {x: eligibilityX, y: eligibilityY},\n            sourcePosition: Position.Right,\n            targetPosition: Position.Left,\n            type: 'eligibilityNode'\n          })\n\n          //Edge: eligibility to channel\n          if (channel.id) {\n            edges.push({\n              id: `edge-elg-ch-${source.id}-${channel.id}`,\n              type: 'simplebezier',\n              source: `elg-${source.id}-${channel.id}`,\n              target: `chn-${channel.id}`,\n              sourceHandle: 'source-handle',\n              animated: true\n            })\n          }\n\n          //Edge: source to eligibility\n          edges.push({\n            id: `edge-elg-src-${source.id}-${channel.id}`,\n            type: 'simplebezier',\n            source: `src-${source.id}`,\n            target: `elg-${source.id}-${channel.id}`,\n            sourceHandle: 'source-handle',\n            animated: true\n          })\n          eligibilityY += nodeHeight + NodeVerticalGap\n        })\n\n\n        // edge from token to source\n        // edges.push({\n        //   id: `edge-token-${token.id}-src-${token.source.id}`,\n        //   type: 'simplebezier',\n        //   source: `token-src-${token.source.id}-ven-${token.vendor.id}`,\n        //   target: `src-${token.source.id}`,\n        //   sourceHandle: 'source-handle',\n        //   animated: true\n        // })\n        sourceY += nodeHeight + NodeVerticalGap;\n      })\n\n      //Channel Nodes\n      let channelY = OriginY\n      vendor.channels.forEach((channel:any) => {\n\n        nodes.push({\n          id: `chn-${channel.id}`,\n          data: {\n            channel,\n            dataView\n          },\n          position: {x: channelX, y: channelY},\n          sourcePosition: Position.Right,\n          targetPosition: Position.Left,\n          type: 'channelNode'\n        })\n\n        channelY += NodeVerticalGap + nodeHeight;\n      })\n\n      ReactDOM.unstable_batchedUpdates(()=>{\n\n        setNodes(nodes)\n        setEdges(edges)\n        setSelectedVendor(vendor)\n        setSelectedSource(null)\n        setSelectedChannel(null)\n        setSelectedOrder(null)\n        setOverflowTokens(vendor.token_overflow)\n        setFlowView(\"vendor\")\n        setDataView(dataView)\n        setOrderChannel(null)\n        setChannelOrders([])\n\n      }) // batch state\n    }\n  }\n\n  const getSourceTokenNodesFromSources = (sources:any[], dataView:string[]) => {\n\n    const {sourceTokenX} = columnsX\n    let nodeY = OriginY\n    const nodeHeight = dataView ? 140 : 80\n    const nodes:Node[] = []\n    const edges:Edge[] = []\n    const archiveFilter = (item:any) => dataView.includes('archived') ? true : item.status !== 'archived'\n    //when focusing on source, we are processing the tokens of one source\n    //when focusing on channel, we may be processing multiple sources\n    sources.filter(archiveFilter).map((src:any) => {\n      if (src.tokens.length) {\n        src.tokens.filter((token:any)=>token.status!=='archived').forEach((token:any) => {\n          nodes.push({\n            id:`token-${token.id}-src-${src.id}-ven-${token.vendor.id}`,\n            data: {\n              token,\n              dataView\n            },\n            position: {x:sourceTokenX, y:nodeY},\n            sourcePosition: Position.Right,\n            targetPosition: Position.Left,\n            type: 'sourceTokenNode'\n          })\n\n          // edge from token to source\n          edges.push({\n            id:`edge-token-${token.id}-src-${token.source.id}`,\n            type:'simplebezier',\n            source:`token-${token.id}-src-${src.id}-ven-${token.vendor.id}`,\n            target: `src-${token.source.id}`,\n            sourceHandle: 'source-handle',\n            animated:true\n          })\n\n          //edge from token to vendor\n          edges.push({\n            id: `edge-token-${token.id}-ven-${token.vendor.id}`,\n            type: 'simplebezier',\n            source: `ven-${token.vendor.id}`,\n            target: `token-${token.id}-src-${src.id}-ven-${token.vendor.id}`,\n            sourceHandle: 'source-handle',\n            animated: true\n          })\n\n          nodeY += nodeHeight + NodeVerticalGap;\n        })\n\n\n\n      } else {\n        // show SourceTokenNode with warning\n        // The source we are focusing on does not have a source-vendor token\n        nodes.push({\n          id:`token-none`,\n          data: {\n            // unidentified token with a source allows user to add a token to the source\n            token:{id:0, source:src},\n            alert:true,\n            dataView\n          },\n          position: {x:sourceTokenX, y:nodeY},\n          sourcePosition: Position.Right,\n          type: 'sourceTokenNode'\n        })\n\n        edges.push({\n          id:`edge-token-src-none`,\n          type:'simplebezier',\n          source:`token-none`,\n          target: `src-${src.id}`,\n          sourceHandle: 'source-handle',\n          animated:true\n        })\n      }\n    })\n\n    return {nodes, edges}\n\n  }\n\n  const getSourceTokenNodesFromVendor = (tokens:any[], vendorId:number, dataView:string[]) => {\n\n    const {sourceTokenX} = columnsX\n    let nodeY = OriginY\n    const nodeHeight = dataView ? 140 : 80\n    const nodes:Node[] = []\n    const edges:Edge[] = []\n    const archiveFilter = (item:any) => dataView.includes('archived') ? true : item.status !== 'archived' ;\n     // Show filters in their own node (now showing in header node\n      // if (filters) {\n      //   nodes.push({\n      //     id:`filters-token`,\n      //     data: {filters},\n      //     position: {x:sourceTokenX, y:nodeY},\n      //     type:'laneFilterNode'\n      //   })\n      //   nodeY += 60\n      // }\n\n      if (tokens.length) {\n\n        // Notify user that not all items are displayed, can search/pick from overflow\n        // if (token_overflow.length) {\n        //   nodes.push({\n        //     id:`token-overflow-${vendorId}`,\n        //     data: {tokens:token_overflow},\n        //     position: {x:sourceTokenX, y:nodeY},\n        //     type:'tokenOverflowNode'\n        //   })\n        //   nodeY += 250\n        // }\n\n        tokens.filter(archiveFilter).forEach((token:any) => {\n            nodes.push({\n              id:`token-${token.id}-src-${token.source.id}-ven-${token.vendor.id}`,\n              data: {\n                token,\n                dataView\n              },\n              position: {x:sourceTokenX, y:nodeY},\n              sourcePosition: Position.Right,\n              targetPosition: Position.Left,\n              type: 'sourceTokenNode'\n            })\n\n            // edge from token to source\n            edges.push({\n              id:`edge-token-${token.id}-src-${token.source.id}`,\n              type:'simplebezier',\n              source:`token-${token.id}-src-${token.source.id}-ven-${token.vendor.id}`,\n              target: `src-${token.source.id}`,\n              sourceHandle: 'source-handle',\n              animated:true\n            })\n            //edge from vendor to token\n            edges.push({\n              id:`edge-token-${token.id}-ven-${token.vendor.id}`,\n              type:'smoothstep', //could be a lot in vendor view, smoothstep looks better\n              source:`ven-${token.vendor.id}`,\n              target: `token-${token.id}-src-${token.source.id}-ven-${token.vendor.id}`,\n              sourceHandle: 'source-handle',\n              animated:true\n            })\n            nodeY += nodeHeight + NodeVerticalGap;\n\n\n        })\n\n\n\n      } else {\n        // show SourceTokenNode with warning\n        // The vendor we are focusing on does not have a source-vendor token\n        nodes.push({\n          id:`token-none`,\n          data: {\n            token:{},\n            alert:true,\n            dataView\n          },\n          position: {x:sourceTokenX, y:nodeY},\n          targetPosition: Position.Left,\n          type: 'sourceTokenNode'\n        })\n\n        edges.push({\n          id:`edge-token-src-none`,\n          type:'simplebezier',\n          target:`token-none`,\n          source: `ven-${vendorId}`,\n          sourceHandle: 'source-handle',\n          animated:true\n        })\n      }\n\n\n    return {nodes, edges}\n\n  }\n\n  // Creates nodes and edges from orderData (a list of orders that use one specific channel)\n  const getOrderNodes = (orderData:any[], channelId:number, channelsExist:boolean, dataView:string[]=[]) => {\n\n    const nodeHeight = dataView.includes('sales') ? 160 : 68\n\n    const orderNodes: Node[] = []\n    const orderEdges: Edge[] = []\n    const {orderX} = columnsX\n    let nodeY = OriginY\n\n\n    if (orderData.length && channelId) {\n\n      orderData.forEach((orderData:any) => {\n        const {order, rules} = orderData;\n        orderNodes.push({\n          id:`ord-${order.id}`,\n          data: {\n            order,\n            rules,\n            dataView\n          },\n          position: {x:orderX, y:nodeY},\n          targetPosition: Position.Left,\n          type: 'orderNode'\n        })\n\n        orderEdges.push({\n          id:`edge-ord-${order.id}-chn`,\n          type:'smoothstep',\n          source:`chn-${channelId}`,\n          target: `ord-${order.id}`,\n          sourceHandle: `source-handle`,\n          targetHandle: 'target-handle',\n          animated:true\n        })\n        nodeY += nodeHeight + NodeVerticalGap;\n\n      })\n    } else if (!orderData.length) {\n      if (channelId) {\n        //A channel was clicked but no orders were found, show alert node\n        orderNodes.push({\n          id:`ord-alert-chn-${channelId}`,\n          data: {\n            message:\"No orders use this channel.\",\n            helpText:\"To use this channel in an order, add the channel in the Channels tab of any rule of an advertiser order. \" +\n              \"The order must have the same product and vertical as the channel.\"\n          },\n          //TODO: place next to the channel, not at top\n          position: {x:orderX, y:nodeY},\n          targetPosition: Position.Left,\n          type: 'alertNode'\n        })\n\n        orderEdges.push({\n          id:`edge-ord-alert-chn-${channelId}`,\n          type:'smoothstep',\n          source:`chn-${channelId}`,\n          target: `ord-alert-chn-${channelId}`,\n          sourceHandle: 'source-handle',\n          targetHandle: 'target-handle',\n          animated:true\n        })\n      } else if (channelsExist) {\n        //Route has channels but no channel has been selected\n        orderNodes.push({\n          id:`ord-info`,\n          data: {\n            infoIcon:false,\n            message:<span>Click &nbsp; <FaIcon icon={faFileInvoiceDollar} size=\"1x\"/> &nbsp; on a channel to view orders that use the channel</span>\n          },\n          position: {x:orderX, y:nodeY},\n          type: 'infoNode'\n        })\n      }\n\n    }\n\n    return {nodes:orderNodes, edges:orderEdges}\n\n  }\n\n  const initOrderView = (orderData:any, dataView:string[]=[]) => {\n\n    const nodeHeight = dataView.includes('sales') ? 100 : 50\n\n    let nodes: Node[] = getHeaderNodes('orders')\n    let edges: Edge[] = []\n\n    const {order, rules, channels, sources, vendors} = orderData\n\n    if (order) {\n\n      const { vendorX,  sourceX,channelX, eligibilityX, orderX} = columnsX\n\n      //Order Node (1)\n      nodes.push({\n        id: `ord-${order.id}`,\n        data: {\n          label: order.name,\n          order,\n          rules,\n          dataView,\n          flowView: 'order'\n        },\n        position: {x: orderX, y: OriginY},\n        targetPosition: Position.Left,\n        type: 'orderNode'\n      })\n\n      //Channel and Eligibility nodes & edges\n      let channelY = OriginY\n      let eligibilityY = OriginY\n      if (channels.length) {\n        channels.forEach((channel:any) => {\n\n          // Channel nodes & edges\n          nodes.push({\n            id:`chn-${channel.id}`,\n            data: {channel:channel, dataView},\n            position: {x:channelX, y:channelY},\n            sourcePosition: Position.Right,\n            targetPosition: Position.Left,\n            type:'channelNode'\n          })\n          // order to channel\n          edges.push({\n            id:`edge-elg-ord-${order.id}-chn-${channel.id}`,\n            type:'simplebezier',\n            source:`chn-${channel.id}`,\n            target: `ord-${order.id}`,\n            sourceHandle: 'source-handle',\n            animated:true\n          })\n\n\n          //Channel-Source Eligibilities\n          //NO CHANNEL-SOURCES: set data that causes an alert to show in the Eligibility node\n          if (!channel.sources.length) {\n            nodes.push({\n              id:`elg-src-none-${channel.id}`,\n              data: {\n                source: {id:0},\n                channel: channel,\n                eligibility: {},\n                alert:true,\n                dataView\n              },\n              position: {x:eligibilityX, y:eligibilityY},\n              sourcePosition: Position.Right,\n              type: 'eligibilityNode'\n            })\n\n            //eligibility to channel\n            edges.push({\n              id:`edge-elg-src-none-${channel.id}`,\n              type:'simplebezier',\n              source: `elg-src-none-${channel.id}`,\n              target:`chn-${channel.id}`,\n              sourceHandle: 'source-handle',\n              animated:true\n            })\n          }\n\n          channel.sources.forEach((source:any) => {\n            nodes.push({\n              id:`elg-${source.id}-${channel.id}`,\n              data: {\n                source: source,\n                channel: channel,\n                eligibility: source.eligibility,\n                dataView\n              },\n              position: {x:eligibilityX, y:eligibilityY},\n              sourcePosition: Position.Right,\n              targetPosition: Position.Left,\n              type: 'eligibilityNode'\n            })\n            // elg to channel\n            edges.push({\n              id: `edge-elg-chn-${source.id}-${channel.id}`,\n              type: 'simplebezier',\n              source: `elg-${source.id}-${channel.id}`,\n              target: `chn-${channel.id}`,\n              sourceHandle: 'source-handle',\n              animated: true\n            })\n            // source to elg\n            edges.push({\n              id:`edge-elg-src-${source.id}-${channel.id}`,\n              type:'simplebezier',\n              source:`src-${source.id}`,\n              target: `elg-${source.id}-${channel.id}`,\n              sourceHandle: 'source-handle',\n              animated:true\n            })\n            eligibilityY += nodeHeight + NodeVerticalGap\n          })\n\n          channelY += nodeHeight + NodeVerticalGap\n        })\n      } else {\n        //TODO: handle no channels display\n      }\n\n      //SOURCE nodes\n      let sourceY = OriginY\n      if (sources.length) {\n        sources.forEach((source:any) => {\n\n          nodes.push({\n            id: `src-${source.id}`,\n            data: {source, dataView},\n            position: {x: sourceX, y: sourceY},\n            sourcePosition: Position.Right,\n            targetPosition: Position.Left,\n            type: 'sourceNode'\n          })\n\n          sourceY += nodeHeight + NodeVerticalGap\n        })\n      }\n\n      const {nodes:sourceTokenNodes, edges:sourceTokenEdges} = getSourceTokenNodesFromSources(sources, dataView)\n      nodes = [...nodes, ...sourceTokenNodes]\n      edges = [...edges, ...sourceTokenEdges]\n\n      // Vendors\n      let vendorY = OriginY\n      if (vendors.length) {\n        vendors.forEach((vendor:any) => {\n\n          nodes.push({\n            id: `ven-${vendor.id}`,\n            data: {vendor, dataView},\n            position: {x: vendorX, y: vendorY},\n            sourcePosition: Position.Right,\n            targetPosition: Position.Left,\n            type: 'vendorNode'\n          })\n\n          vendorY += nodeHeight + NodeVerticalGap\n        })\n      }\n\n      ReactDOM.unstable_batchedUpdates(()=>{\n\n        setNodes(nodes)\n        setEdges(edges)\n        setSelectedVendor(null)\n        setSelectedOrder(orderData)\n        setOrderChannel(null)\n        setSelectedSource(null)\n        setSelectedChannel(null)\n        setOverflowTokens([])\n        setFlowView(\"order\")\n        setDataView(dataView)\n        setChannelOrders(null)\n\n      }) // batch state\n    }\n  }\n\n  const updateFlowOrders = (orderNodes:Node[], orderEdges:Edge[]) => {\n    const {nodes, edges} = store.getState();\n\n    //Remove existing order nodes & edges if any, add new\n    const newNodes = nodes.filter((node:Node) => node.id.indexOf('ord') < 0 || node.id.indexOf('header') === 0)\n    const newEdges = edges.filter((edge:Edge) => edge.id.indexOf('edge-ord') < 0 )\n\n    setNodes([...newNodes, ...orderNodes])\n    setEdges([...newEdges, ...orderEdges])\n\n  }\n\n  /*\n   * Node Highlighting: highlight route by clicking on them, lower opacity of all other routes\n   * Solution mostly borrowed from: https://github.com/xyflow/xyflow/issues/2418\n   */\n\n  //Recursively get all ancestor aka \"incoming\" nodes for a given node\n  const getAllIncomers = (node:Node, nodes:Node[], edges:Edge[], prevIncomers:Node[] = []) => {\n    const incomers = getIncomers(node, nodes, edges);\n    const result = incomers.reduce(\n      (memo:Node[], incomer) => {\n        memo.push(incomer);\n\n        if ((prevIncomers.findIndex(n => n.id == incomer.id) == -1)) {\n          prevIncomers.push(incomer);\n\n          getAllIncomers(incomer, nodes, edges, prevIncomers).forEach((foundNode:Node) => {\n            memo.push(foundNode);\n\n            if ((prevIncomers.findIndex(n => n.id == foundNode.id) == -1)) {\n              prevIncomers.push(incomer);\n\n            }\n          });\n        }\n        return memo;\n      },\n      []\n    );\n    return result;\n  }\n\n  //Recursively get all descendent aka \"outgoer\" nodes for a given node\n  const getAllOutgoers = (node:Node, nodes:Node[], edges:Edge[], prevOutgoers:Node[] = []) => {\n    const outgoers = getOutgoers(node, nodes, edges);\n    return outgoers.reduce(\n      (memo:Node[], outgoer) => {\n        memo.push(outgoer);\n\n        if ((prevOutgoers.findIndex(n => n.id == outgoer.id) == -1)) {\n          prevOutgoers.push(outgoer);\n\n          getAllOutgoers(outgoer, nodes, edges, prevOutgoers).forEach((foundNode) => {\n            memo.push(foundNode);\n\n            if ((prevOutgoers.findIndex(n => n.id == foundNode.id) == -1)) {\n              prevOutgoers.push(foundNode);\n            }\n          });\n        }\n        return memo;\n      },\n      []\n    )\n  }\n\n  const highlightPath = (node:Node) => {\n    if (node && [...nodes, ...edges]) {\n\n      const allIncomers = getAllIncomers(node, nodes, edges)\n      const allOutgoers = getAllOutgoers(node, nodes, edges)\n\n      const incomerIds = allIncomers.map((i) => i.id)\n      const outgoerIds = allOutgoers.map((o) => o.id)\n      const allIds = [...incomerIds, ...outgoerIds, node.id];\n\n      let connectedEdgeIds:string[] = [];\n\n      // set styles of all edges and nodes according to whether they are on the route (except header nodes)\n      const newNodes = nodes.map((elem) => {\n\n          if (isNode(elem) && (allOutgoers.length > 0 || allIncomers.length > 0) && elem.id.indexOf('header') < 0 ) {\n            const highlight = elem.id === node.id || incomerIds.includes(elem.id) || outgoerIds.includes(elem.id)\n\n            elem.style = {\n              ...elem.style,\n              opacity: highlight ? 1 : 0.4,\n            }\n            if (highlight) {\n              const nodeConnectedEdgeIds = getConnectedEdges([elem], edges)\n              .filter((e:Edge) => allIds.includes(e.target) && allIds.includes(e.source))\n                .map((e) => e.id)\n              connectedEdgeIds = [...connectedEdgeIds, ...nodeConnectedEdgeIds]\n            }\n          }\n\n          return {...elem}\n        })\n\n\n      const newEdges = edges.map((e) => {\n        const isConnected = connectedEdgeIds.includes(e.id);\n        return {\n          ...e,\n          animated: isConnected,\n          style: {\n            ...e.style,\n            stroke: isConnected ? '#147CFF' : '#6C757D', // $primary : $gray-600\n            strokeWidth: isConnected? 3 : 1,\n            opacity: isConnected ? 1 : 0.25\n          },\n        }\n\n      });\n\n      setNodes(newNodes)\n      setEdges(newEdges)\n\n    }\n  }\n\n  // Undo the Highlight styles\n  const resetNodeStyles = () => {\n\n    setNodes((prevElements) => {\n      return prevElements?.map((elem:Node) => {\n        if (isNode(elem)) {\n          elem.style = {\n            ...elem.style,\n            opacity: 1,\n          }\n        }\n\n        return {...elem}\n      })\n    })\n\n    setEdges((prevEdges) => {\n      return prevEdges.map((edge) => ({\n        ...edge,\n        animated: true,\n        style: {\n          ...edge.style,\n          stroke: '#6C757D',\n          strokeWidth: 1,\n          opacity:1,\n        },\n      }))\n    })\n  }\n\n  //For use with MiniMap  https://reactflow.dev/api-reference/components/minimap\n  //const nodeClassName = (node:any) => node.type;\n\n  return (\n    <RoutingFlowContext.Provider value={{\n      selectedVendor,\n      selectedSource,\n      selectedChannel,\n    }}\n    >\n        <div className='routing-mapper'>\n            <div className=\"mb-2\" style={{zIndex:10}}>\n              <Filters filters={query} onChange={handleChangeFilters} loading={false} key={filterRefreshKey}/>\n            </div>\n\n\n\n          <div className=\"d-flex flex-fill justify-content-end\">\n            <div className=\"d-flex align-items-center justify-content-end pb-1\">\n              <div className=\"me-2\">View:</div>\n              <Button\n                size=\"xs\"\n                color=\"rounded\"\n                outline\n                active={dataView.includes('sales')}\n                onClick={() => handleSelectDataView(\"sales\")}\n              >Sales</Button>\n              <Button\n                size=\"xs\"\n                color=\"rounded\"\n                outline\n                active={dataView.includes('archived')}\n                onClick={() => handleSelectDataView(\"archived\")}\n                className=\"ms-1\"\n              >Archived</Button>\n            </div>\n          </div>\n\n\n          {/*{loading && <div className=\"loader-container\">\n            <LoaderDots active={loading} width={160} />\n          </div>}*/}\n\n\n          {/* Flow banner when visible will look like it is part of flow-container */}\n          {overflowTokens.length > 0 && (\n            <div className=\"flow-banner w-100\" >\n                <TokenOverflow tokens={overflowTokens} onSelect={handleExamineSource} />\n            </div>\n          )}\n          <div className=\"flow-container w-100\" style={{  height: '500px' }} >\n            <BlockUI\n              blocking={loading || loadingOrders}\n              mode=\"stretch\"\n              loader={<Spinner color=\"success\" />}\n            >\n\n              <ReactFlow\n                nodes={nodes}\n                edges={edges}\n                onNodesChange={onNodesChange}\n                onEdgesChange={onEdgesChange}\n                nodeTypes={nodeTypes}\n                nodesDraggable={false}\n                nodesConnectable={false}\n                selectNodesOnDrag={false}\n                onNodeClick={(_, node) => highlightPath(node)}\n                //elementsSelectable={true}\n                //onlyRenderVisibleNodes={false}\n                //zoomOnScroll={false}\n                zoomOnDoubleClick={false}\n                draggable\n\n                style={{ maxHeight: \"100%\", overflow: \"scroll\" }}\n                onPaneClick={resetNodeStyles}\n\n              />\n\n            {/*\n            <MiniMap zoomable pannable nodeClassName={nodeClassName}/>\n            <Controls />\n            <Background variant={BackgroundVariant.Dots} gap={12} size={1} />\n            */}\n            </BlockUI>\n          </div>\n\n\n            <RoutingRulesModal\n              entity={routingRule?.entity}\n              entityType={routingRule?.type}\n              isOpen={rulesPanelOpen}\n              close={closeRulesPanel}\n            />\n\n            <SourceTokenModal\n              token={editToken}\n              sourcePreselections={candidateSources}\n              isOpen={tokenPanelOpen}\n              toggle={closeTokenPanel}\n              onSuccess={refreshView}\n              scrollable\n            />\n\n            <SourceModal\n              source={editSource}\n              isOpen={sourcePanelOpen }\n              toggle={closeSourcePanel}\n              onSuccess={handleSaveSourceSuccess}\n              //onOpenSourceRules={openSourceRules}\n              vendorPreselections={candidateVendors}\n              scrollable\n            />\n\n            <ChannelModal\n              channel={editChannel}\n              isOpen={channelPanelOpen || channelSourcePanelOpen}\n              showSources={channelSourcePanelOpen}\n              toggle={closeChannelPanel}\n              onSuccess={refreshView}\n              onOpenChannelRules={openChannelRules}\n              onOpenChannelSourceRules={openChannelSourceRules}\n              scrollable\n            />\n\n          <LinkChannelSourceModal\n            source={linkSource}\n            isOpen={linkChannelSourcePanelOpen}\n            close={closeLinkChannelSourcePanel}\n            onSuccess={refreshView}\n          />\n\n          <VendorModal\n            vendor={editVendor}\n            isOpen={vendorModalOpen}\n            close={closeVendorModal}\n            onSuccess={handleSaveVendorSuccess}\n          />\n\n        </div>\n\n    </RoutingFlowContext.Provider>\n  )\n}\n\n\n","import React from \"react\";\n//import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\ntype InputSchemaOptionChoiceType = {\n  value: number | string,\n  label: string,\n  description: string\n}\n\n/*\n * Styled option for react-select (SimpleSelect) dropdown with list of input schema choices\n * use in the react-select prop: formatOptionLabel={InputSchemaOptionLabel}\n * See react-select docs.\n * \"choice\" will have the choice value and label (and any other data you manually set into the choices)\n * \"meta\" (2nd prop) has context, inputValue, selectValue<array>\n *\n * Checkmark icon assumes that picker is configured as single-select\n */\nexport const InputSchemaOptionLabel = (choice:InputSchemaOptionChoiceType, {selectValue}: any) => {\n return (\n    <div className=\"d-flex\">\n      {/*<div>\n        {selectValue.length > 0 && choice.value && choice.value.toString() === selectValue[0].value.toString() &&\n      <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\"/>}\n      </div>*/}\n      <div>{choice.label}</div>\n      <div className=\"ms-3\" style={{color: \"#666\", fontSize: \"0.9rem\"}}>\n        <small>{choice.description || \"\"}</small>\n      </div>\n\n    </div>\n  )\n};\n","import React from \"react\";\nimport {Modal, ModalBody, ModalHeader, Spinner} from \"reactstrap\";\nimport {JsonEditorLoadable} from \"@thedmsgroup/mastodon-ui-components\";\n\n\n/*\n * Modal for displaying a schema in read only mode\n */\nconst InputSchemaViewModal = ({\n                           schema, isOpen, cancel\n                         }:any) => {\n\n\n  return (\n    <Modal isOpen={isOpen} toggle={cancel} size=\"xlg\" scrollable>\n      <ModalHeader toggle={cancel}>View Schema</ModalHeader>\n      <div className=\"modal-subheader\">{schema && schema.name}</div>\n      <ModalBody>\n        {schema ? (\n          <JsonEditorLoadable\n            code={JSON.stringify(schema.content, null, 2)}\n            onChange={()=>{}}\n            linting={false}\n            isDisabled={true}\n          />\n\n        ) : (\n          <div className=\"text-center my-5\"><Spinner /></div>\n        )}\n\n      </ModalBody>\n    </Modal>\n  );\n};\n\nexport default InputSchemaViewModal;\n","import React, { useState, useEffect, useContext } from 'react';\nimport {\n  FormGroup, Button, Spinner,\n} from 'reactstrap';\nimport { QRCodeSVG } from 'qrcode.react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { StandardAlert, CopyButton } from '@thedmsgroup/mastodon-ui-components';\nimport OtpCodeInput from '../Components/Form/OtpCodeInput';\nimport { AppContext } from '../Providers/AppProvider';\n\ntype EnrollData = {\n  otpauth_uri: string;\n  secret: string;\n  recovery_codes: string[];\n};\n\ntype TwoFactorEnrollStepsProps = {\n  onEnroll: () => Promise<EnrollData | false>;\n  onConfirm: (code: string) => Promise<any>;\n  onSuccess: (result: any) => void;\n  onBack: () => void;\n  disabled?: boolean;\n};\n\ntype EnrollView = 'loading' | 'setup' | 'verify';\n\n/**\n * Shared enrollment UI for the LOADING → SETUP → VERIFY flow.\n * Used by both the login-time enrollment (TwoFactorEnroll) and the in-app enrollment\n * (TwoFactorModal). The caller provides the API calls via callbacks so this component\n * is agnostic to whether a pending token or a full auth token is in use.\n */\nconst TwoFactorEnrollSteps = ({ onEnroll, onConfirm, onSuccess, onBack, disabled = false }: TwoFactorEnrollStepsProps) => {\n  const app = useContext(AppContext);\n  const [view, setView] = useState<EnrollView>('loading');\n  const [enrollData, setEnrollData] = useState<EnrollData | null>(null);\n  const [isPosting, setIsPosting] = useState(false);\n  const [error, setError] = useState('');\n\n  useEffect(() => {\n    const fetchEnrollData = async () => {\n      const result = await onEnroll();\n      if (!result) {\n        const apiError = app.api.error || {};\n        setError(apiError.message || 'Failed to start enrollment. Please try again.');\n        setView('setup');\n      } else {\n        setEnrollData(result as EnrollData);\n        setView('setup');\n      }\n    };\n    fetchEnrollData();\n  }, []);\n\n  const handleConfirm = async (code: string) => {\n    if (isPosting || disabled) return;\n    setIsPosting(true);\n    setError('');\n    const result = await onConfirm(code);\n    if (!result) {\n      const apiError = app.api.error || {};\n      setError(apiError.message || 'Invalid verification code. Please try again.');\n      setIsPosting(false);\n    } else {\n      onSuccess(result);\n    }\n  };\n\n  if (view === 'loading') {\n    return (\n      <div className=\"text-center py-4\">\n        <Spinner />\n      </div>\n    );\n  }\n\n  if (view === 'setup') {\n    return (\n      <div className=\"form-section\">\n        {error && <StandardAlert color=\"warning\">{error}</StandardAlert>}\n\n        {enrollData && (\n          <>\n            <p className=\"mb-3\">\n              Scan this QR code with your authenticator app (Google Authenticator, Authy, 1Password, etc.):\n            </p>\n\n            <div className=\"text-center mb-3\">\n              <QRCodeSVG value={enrollData.otpauth_uri} size={200} />\n            </div>\n\n            <FormGroup>\n              <div className=\"d-flex justify-content-between align-items-center\">\n                <p className=\"mb-0\">Manual Entry Key</p>\n                <CopyButton\n                  id=\"copy-secret\"\n                  textToCopy={enrollData.secret}\n                  buttonSize=\"sm\"\n                  className=\"m-0 p-0\"\n                />\n              </div>\n              <code className=\"d-block p-2 bg-light text-center\" style={{ fontSize: '0.9rem', wordBreak: 'break-all' }}>\n                {enrollData.secret}\n              </code>\n            </FormGroup>\n\n            <FormGroup>\n              <p className=\"mb-1\">Recovery Codes</p>\n              <StandardAlert color=\"warning\" className=\"mb-2\">\n                Save these codes in a safe place. They will not be shown again. Each code can only be used once.\n              </StandardAlert>\n              <div className=\"p-2 bg-light\" style={{ fontFamily: 'monospace', fontSize: '0.85rem' }}>\n                {enrollData.recovery_codes.map((code: string, i: number) => (\n                  <div key={i}>{code}</div>\n                ))}\n              </div>\n              <CopyButton\n                id=\"copy-recovery-codes\"\n                textToCopy={enrollData.recovery_codes.join('\\n')}\n                buttonSize=\"sm\"\n                className=\"mt-2\"\n                outline\n              >\n                Copy\n              </CopyButton>\n            </FormGroup>\n\n            <Button\n              color=\"primary\"\n              size=\"sm\"\n              block\n              className=\"mt-3\"\n              onClick={() => { setView('verify'); setError(''); }}\n              disabled={disabled}\n            >\n              Next: Verify Code <FaIcon icon=\"arrow-right\" className=\"ms-1\" />\n            </Button>\n          </>\n        )}\n\n        <Button\n          size=\"sm\"\n          color=\"link\"\n          block\n          className=\"mt-1\"\n          onClick={onBack}\n        >\n          Back\n        </Button>\n      </div>\n    );\n  }\n\n  // verify view\n  return (\n    <div className=\"form-section\">\n      <p className=\"mb-3\">\n        Enter the 6-digit code from your authenticator app to complete setup:\n      </p>\n\n      {error && <StandardAlert color=\"warning\">{error}</StandardAlert>}\n\n      <FormGroup>\n        <OtpCodeInput\n          onComplete={handleConfirm}\n          disabled={isPosting || disabled}\n          invalid={!!error}\n        />\n      </FormGroup>\n\n      <Button\n        color=\"primary\"\n        size=\"sm\"\n        block\n        disabled={isPosting || disabled}\n        onClick={() => {\n          const input = document.querySelector('input[autocomplete=\"one-time-code\"]') as HTMLInputElement | null;\n          if (input?.value?.length === 6) handleConfirm(input.value);\n        }}\n      >\n        {isPosting ? <Spinner size=\"sm\" /> : 'Verify & Enable'}\n      </Button>\n\n      <Button\n        size=\"sm\"\n        color=\"link\"\n        block\n        className=\"mt-1\"\n        onClick={() => { setView('setup'); setError(''); }}\n      >\n        Back\n      </Button>\n    </div>\n  );\n};\n\nexport default TwoFactorEnrollSteps;\n","import React, { useMemo } from 'react';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\n\nconst RulesMap: Record<string, string> = {\n  lowercase: 'Lowercase letter (a-z)',\n  uppercase: 'Uppercase letter (A-Z)',\n  number: 'Number (0-9)',\n  specialchar: 'Punctuation or other (!@#$%...)',\n  length: 'Minimum 15 characters',\n  blacklist: 'Must not contain your name or email',\n};\n\ntype RuleKey = 'lowercase' | 'uppercase' | 'number' | 'specialchar' | 'length' | 'blacklist' | 'not_new';\n\n/*\nErrors from server:\n\"Password must be at least 15 characters long\"\n\"Password must contain an uppercase letter\"\n\"Password must contain a lowercase letter\"\n\"Password must contain a digit\"\n\"Password must contain a special character\"\n\"Password contains values from user name or email: a, b, c\"\n */\n\ntype PasswordRulesProps = {\n  errors?: string[];\n  isExpiration?: boolean;\n};\n\n/*\n * Presents a bulleted list of password rules applied when setting/resetting a password.\n * Uses icons to indicate which rules have been met if errors are passed in.\n */\nconst PasswordRules = ({ errors = [], isExpiration }: PasswordRulesProps) => {\n\n  // ResultMode: we show bullets on the rules when the page load.\n  // Only when we get errors back from the server do we show check/times icons\n  const resultMode = errors.length > 0;\n\n  // Errors from the server are an array of messages.\n  // To map the messages to the rules and display the right icon,\n  // we have to look at keywords in the messages.\n  const errorToKey = (err: string): RuleKey | '' => {\n    if (err.indexOf('long') > 0) {\n      return 'length';\n    } else if (err.indexOf('uppercase') > 0) {\n      return 'uppercase';\n    } else if (err.indexOf('lowercase') > 0) {\n      return 'lowercase';\n    } else if (err.indexOf('digit') > 0) {\n      return 'number';\n    } else if (err.indexOf('special') > 0) {\n      return 'specialchar';\n    } else if (err.indexOf('contains values') > 0) {\n      return 'blacklist';\n    } else if (err.indexOf('different from') > 0) {\n      return 'not_new';\n    }\n    return '';\n  };\n\n  const resultMap = useMemo(() => {\n    const map: Record<RuleKey, boolean | null> = {\n      lowercase: null,\n      uppercase: null,\n      number: null,\n      specialchar: null,\n      length: null,\n      blacklist: null,\n      not_new: null,\n    };\n\n    if (errors.length) {\n      errors.forEach((err) => {\n        const key = errorToKey(err);\n        if (key) {\n          map[key] = false;\n        }\n      });\n    }\n\n    return map;\n  }, [errors]);\n\n  return (\n    <div id=\"password-rules\">\n      <h5>Password Requirements:</h5>\n      <ul className=\"ps-1\">\n        {Object.entries(RulesMap).map(([ruleKey, ruleText], i) => (\n          <li key={i}>\n            {resultMode ? <RuleCheckIcon passed={resultMap[ruleKey as RuleKey] !== false} /> : <span>&bull;&nbsp;</span>}\n            {ruleText}\n          </li>\n        ))}\n\n        {isExpiration && (\n          <li>\n            {resultMode ? <RuleCheckIcon passed={resultMap['not_new'] !== false} /> : <span>&bull;&nbsp;</span>}\n            New password must be different from the current password\n          </li>\n        )}\n      </ul>\n    </div>\n  );\n};\n\ntype RuleCheckIconProps = {\n  passed: boolean;\n};\n\nconst RuleCheckIcon = ({ passed }: RuleCheckIconProps) => (\n  <FaIcon\n    icon={passed ? 'check-circle' : 'times'}\n    color={passed ? 'green' : 'red'}\n    size=\"sm\"\n    className=\"me-2\"\n  />\n);\n\nexport default PasswordRules;\n","\nexport const DispositionHelp = {\n  abandoned: 'The caller has ended the call before a conference could be established',\n  answered: '',\n  blocked: 'We blocked this call for some reason',\n  busy: 'Call was rejected by destination',\n  canceled: '',\n  cheat: '',\n  completed: '',\n  'double-dial': 'Call received for same origin/destination pair within too short of a time-span.',\n  expired: 'Call received after transfer request has expired',\n  failed: '',\n  gathering: '',\n  'in-progress': 'Alias for answered.',\n  machine: '',\n  'no-answer': '',\n  'pending-analysis': 'The actual disposition is not yet available, but will be shortly',\n  redirected: '',\n  'ringing_inbound': '',\n  'ringing_outbound': '',\n  'transfer_failed': 'We were unable to transfer the call for technical reasons',\n  'unknown-destination':'Call received for an unknown number.',\n} as Record<string, string>;\n\nexport const RECORDING_URL_BASE = 'https://call-recordings.dmsengage.com/recordings?url=';\n","import React, {FC} from 'react';\nimport {ChartIntervalOptions} from \"../Table/FilterChoices\";\nimport {Input, Spinner} from \"reactstrap\";\nimport {HelpPopper} from \"@thedmsgroup/mastodon-ui-components\";\n\ntype AggSelectProps = {\n  value:string;\n  onChange:(interval:string) => void;\n  className?:string;\n  loading?:boolean;\n  scaledTo?:string;\n}\nexport const AggSelect:FC<AggSelectProps> = (\n  {\n    value,\n    onChange,\n    loading,\n    scaledTo,\n    className=\"\"\n  }\n) => {\n\n  const handleIntervalChange = (e:React.ChangeEvent<HTMLInputElement>) => onChange(e.target.value);\n\n  return (\n    <div\n      className={`d-flex align-items-center ${className}`}\n    >\n\n      <div>Aggregate by </div>\n      <Input\n      type=\"select\"\n      value={value}\n      bsSize=\"sm\"\n      name=\"interval-unit\"\n      style={{ width: '140px' }}\n      className=\"ms-2\"\n      onChange={handleIntervalChange}\n      disabled={loading}\n    >\n      {ChartIntervalOptions.map((item, index) => (\n        <option key={index} value={item.value}>\n          {item.label}\n        </option>\n      ))}\n    </Input>\n      {scaledTo && (\n        <span className=\"ms-2\">\n                <HelpPopper\n                  name=\"chart-scale-help\"\n                  iconClass=\"me-1\"\n                >\n                  The selected time interval with the current date range\n                  {' '}produces too many data points to display in the chart.\n                  {' '}It has been scaled back to {scaledTo}\n                </HelpPopper>\n                scaled to {scaledTo}\n              </span>)}\n      {loading && <Spinner size=\"sm\" className=\"ms-1\" />}\n\n    </div>\n  )\n}\n","// @ts-nocheck\nimport React, {FC, useRef, useEffect} from \"react\";\nimport {Bar } from \"react-chartjs-2\";\nimport type { ChartOptions} from 'chart.js';\nimport {AggIntervalToUnit} from \"./chart\";\nimport autocolors from 'chartjs-plugin-autocolors';\nimport annotationPlugin from 'chartjs-plugin-annotation';\nimport zoomPlugin from 'chartjs-plugin-zoom';\n// This crosshair plugin is a forked version that fixes some sync issues\nimport {CrosshairPlugin} from '@tlemur/chartjs-plugin-crosshair'\nimport {\n  Chart as ChartJS,\n  BarController,\n  BarElement,\n  TimeScale,\n  LinearScale,\n  CategoryScale,\n  Legend,\n  Tooltip,\n} from 'chart.js';\nChartJS.register(BarController, BarElement,  TimeScale, LinearScale, CategoryScale, Legend, Tooltip, autocolors, annotationPlugin, zoomPlugin, CrosshairPlugin );\nimport 'chartjs-adapter-date-fns';\nimport {fromUnixTime, roundToNearestMinutes} from \"date-fns\";\n\ntype StackedBarChartProps = {\n  labels:string[];\n  datasets:any[];\n  options:ChartOptions;\n  plugins?:any[];\n  className?:string;\n  styles?:Record<string, any>;\n  title?:string;\n  xLabel?:string;\n  minTime?:string;\n  maxTime?:string;\n  onZoom?:(start:Date, end:Date) => void;\n  showNow?:boolean;\n  showNowLabel?:boolean;\n  aggInterval?:string;\n  loading?:boolean;\n}\n\n/*\n * Uses ChartJS to render a stacked bar graph with multiple data sets, inside of a styled div.\n *\n * We use the autocolors plugin for more color range. The default Colors module has a limited palette,\n * and begins to repeat when there are many datasets.\n *\n * Annotation plugin is for the optional \"now\" indicator line\n *\n * TODO: figure out chart types, they have been difficult to apply\n */\nconst StackedBarChart:FC<StackedBarChartProps> = ({\n                                            labels,\n                                            datasets,\n                                            options,\n                                            plugins = [],\n                                            styles={},\n                                            className= \"\",\n                                            title=\"\",\n                                            xLabel=\"\",\n                                            minTime=\"\",\n                                            maxTime=\"\",\n                                            onZoom,\n                                            showNow=\"\",\n                                            showNowLabel=\"\",\n                                            aggInterval=\"\"\n}) => {\n  const chartRef = useRef<ChartJS<'bar'>>()\n\n  const handleZoomComplete = (chart:any) => {\n\n    // https://github.com/chartjs/chartjs-plugin-zoom/issues/220\n    if (typeof onZoom === 'function' && chart?.chart){\n      const min = roundToNearestMinutes(fromUnixTime(chart.chart.scales.x.min/1000))\n      let max = fromUnixTime(chart.chart.scales.x.max/1000)\n      if(min && max) {\n        const dNow = new Date();\n        if (max > dNow) {\n          max = dNow\n        }\n        onZoom(min, max)\n      }\n    }\n  }\n\n  // Update x scale unit in options if aggregation interval changes\n  useEffect(() => {\n    if (aggInterval && chartRef.current) {\n      const map = AggIntervalToUnit as Record<string, string>\n      const intervalChar = aggInterval.charAt(aggInterval.length - 1)\n      const unit:string|undefined = map[intervalChar]\n      if (unit) {\n        chartRef.current.options.scales.x.time.unit = unit\n      }\n\n      if (xLabel) {\n        chartRef.current.options.scales.x.title.text = xLabel\n      }\n\n      // Use min/max time to make sure the chart time axis does not narrow down\n      // if given limited data in the requested time range (MRK-10573)\n      //https://www.chartjs.org/docs/latest/axes/cartesian/time.html#min-max-configuration\n      if (minTime) {\n        chartRef.current.options.scales.x.min = minTime\n      }\n      if (maxTime) {\n        chartRef.current.options.scales.x.max = maxTime\n      }\n\n\n      if (!chartRef.current.options.plugins) {\n        chartRef.current.options.plugins = {}\n      }\n\n      if (showNow) {\n        const dNow = new Date()\n        const nowLine = {\n            type:\"line\",\n            xMin:dNow,\n            xMax:dNow,\n            borderColor: \"rgb(255, 99, 132)\",\n            borderWidth: 2,\n          init:false\n        } as any\n\n        if (showNowLabel) {\n          nowLine.label = {content:\"Now\", display:true,rotation:-90, padding:3,position:'end',font:{size:'10px'}, backgroundColor:\"rgb(255, 99, 132)\"}\n        }\n\n        chartRef.current.options.plugins.annotation = {\n            annotations: {\n              nowLine\n            }\n        }\n      }\n\n      if (onZoom) {\n        chartRef.current.options.plugins.zoom = {\n\n          zoom: {\n            wheel: {\n              enabled: false,\n            },\n            pinch: {\n              enabled: false\n            },\n            drag: {\n              enabled: true,\n              borderWidth:2,\n              backgroundColor:\t'rgba(65,206,231,0.3)',\n              borderColor:\t'rgba(65,148,231,0.5)'\n            },\n            mode: 'x',\n            onZoomComplete:handleZoomComplete,\n          }\n\n        }\n      }\n\n      chartRef.current.update();\n    }\n  }, [aggInterval, datasets, chartRef.current, xLabel, maxTime, minTime])\n\n  return (\n    <div style={styles} className={className}>\n      {title && <h5>{title}</h5>}\n\n        <Bar\n          ref={chartRef}\n          options={options}\n          data={{labels, datasets}}\n          plugins={[...plugins,autocolors, annotationPlugin]}\n        />\n\n    </div>\n  )\n}\n\nexport default StackedBarChart;\n","import React, {FC} from 'react'\nimport classnames from 'classnames';\nimport \"./DataRow.scss\";\n\n/*\n * A two column row meant for listing key/value data\n *\n * A list of these can be wrapped in the DataRows component,\n * allowing shared props and dividers\n *\n * fieldStyle boolean: displays in column format rather than inline (label above value)\n *\n * Example:\n * <DataRow label=\"Sale ID\">{sale_id}</DataRow>\n */\ntype DataRowProps = {\n  label:string|React.ReactNode;\n  labelWidth?:number;\n  className?:string;\n  children:React.ReactNode;\n  fieldStyle?: boolean;\n}\n\nexport const DataRow:FC<DataRowProps> = ({\n  label,\n  labelWidth='150px',\n  className=\"\",\n  children,\n  fieldStyle\n}) => {\n\n  return (\n    <div className={classnames('mst-data-row', className, {field:fieldStyle})}>\n      <label style={{minWidth:labelWidth}}>{label}</label>\n      <div className=\"value\">\n        {children}\n      </div>\n    </div>\n  )\n}\n","import React from 'react'\nimport {Stack, RowDivider} from \"@thedmsgroup/mastodon-ui-components\";\n\n/*\n * A wrapper for a list of DataRow components.\n * Sets gap and divider between the rows\n * and a minimum label width that apply to all rows\n */\ntype DataRowsProps = {\n  className?:string;\n  children:React.ReactNode;\n  labelWidth?:string;\n  gap?:string;\n  noDivider?:boolean;\n  fieldStyle?: boolean;\n}\n\nexport const DataRows = ({\n           className=\"\",\n           children,\n           labelWidth,\n           gap=\"0.5em\",\n           noDivider,\n           fieldStyle\n         }: DataRowsProps) => {\n\n  return (\n    <div className={`mst-data-rows ${className}`}>\n      <Stack gap={gap} divider={noDivider ? null : <RowDivider />} >\n        {React.Children.map(children, (child) => {\n          if (React.isValidElement(child) && typeof child.type !== 'string') {\n            return React.cloneElement(child as any, { labelWidth, fieldStyle:child.props.fieldStyle ?? fieldStyle });\n          }\n          return child;\n        })}\n      </Stack>\n    </div>\n  )\n}\n","import React, { FC, useState } from 'react';\nimport { Button, Spinner } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {notify} from \"@thedmsgroup/mastodon-ui-components/lib/common/Notify\";\nimport useApi from '../Hooks/useApi';\n\ntype DownloadFileLinkPropsType = {\n  identifier:string|number;\n  downloadSource: (id:string|number)=>any|string;\n  defaultFilename: string;\n  disabled?: boolean;\n  className?: string;\n  label?: string;\n  title?:string;\n  buttonSize?:string;\n}\n/*\n * Button that downloads a file with an async request and a temporary invisible link.\n *\n * We don't have a central download endpoint, so this component requires\n * a property that defines the async getter function. It can be:\n *    - an async function\n *    - a string that names an endpoint in the global API class\n *       (for example, \"datasheets\" will fetch API.endpoints.datasheets.download)\n *\n * Example:\n * Gets \"/datasheets/download/{id}\"\n * <DownloadFileLink identifier={datasheet.file.id} downloadSource=\"datasheets\" defaultFilename={datasheet.file.file_name}/>\n *\n * The expected return value is the entire response from axios, not just the data:\n * {data:Blob, status:200, headers:[], request:{}, config:{}}\n *\n */\nconst DownloadFileLink:FC<DownloadFileLinkPropsType> = ({\n  identifier,\n  downloadSource,\n  defaultFilename,\n  disabled=false,\n  className=\"\",\n  label=\"\",\n  title = \"Download file\",\n  buttonSize=\"sm\"\n}) => {\n  const { api } = useApi();\n  const [isDownloading, setIsDownloading] = useState(false);\n\n  const getData = async (id:string|number) => {\n    let response;\n    if (typeof downloadSource === 'function') {\n      response = await downloadSource(id);\n    } else if (typeof downloadSource === 'string') {\n      // download is an api endpoint\n      if (api.endpoints[downloadSource]) {\n        response = await api.endpoints[downloadSource].download(id);\n      }\n    }\n    return response;\n  };\n\n  const download = async (id:string|number) => {\n    setIsDownloading(true);\n    try {\n      const response = await getData(id);\n      // console.log('DownloadFileLink.js:download response', response);\n      if (response) {\n        if (response.status && response.status !== 200) {\n          notify(`Error downloading file: Status:${response.status}`, 'error');\n        } else if (response.data) {\n          const a = document.createElement('a');\n          document.body.appendChild(a);\n          // @ts-ignore\n          a.style = 'display: none';\n          const url = window.URL.createObjectURL(response.data);\n\n          // File name might be provided in header\n          let filename;\n          if (response.headers && response.headers['content-disposition']) {\n            const matches = /\"([^\"]*)\"/.exec(response.headers['content-disposition']);\n            filename = (matches != null && matches[1] ? matches[1] : '');\n          }\n\n          if (!filename) {\n            filename = defaultFilename || 'file';\n          }\n\n          a.href = url;\n          a.download = filename;\n          a.click();\n          window.URL.revokeObjectURL(url);\n          // @ts-ignore\n          a.parentNode.removeChild(a);\n        }\n      } else {\n        notify('Error downloading file: Empty data.', 'error');\n      }\n    } catch (e) {\n      notify('Error downloading file...', 'error');\n      console.log('Error downloading file ', e);\n    } finally {\n      // Keep spinner going for a bit, sometimes there is a lag while the browser brings up\n      // the spreadsheet app or save dialog\n      window.setTimeout(() => setIsDownloading(false), 1500);\n    }\n  };\n\n  return (\n    <>\n      {isDownloading ? (\n        <Button color=\"link\" className={className} size={buttonSize} disabled>\n          <Spinner size=\"sm\" color=\"primary\" title=\"downloading...\" />\n          {label && <span className=\"ms-1\">{label}</span> }\n        </Button>\n      ) : (\n        <Button color=\"link\" size={buttonSize} className={className} title={title} onClick={() => download(identifier)} disabled={disabled}>\n          <FaIcon icon=\"file-download\" />\n          {label && <span className=\"ms-1\">{label}</span> }\n        </Button>\n      )}\n    </>\n\n  );\n};\n\n\nexport default React.memo(DownloadFileLink);\n","import React, { FC, useState, useEffect } from 'react';\nimport useApi from '../../Hooks/useApi';\nimport EnhancedSelect, {EnhancedSelectPropsType} from \"./EnhancedSelect\";\n\n// All the props of EnhancedSelect except options, plus a few more\ntype DynamicSelectPropsType =  {\n  endpoint:string;  //rest api, \"orders\"\n  action?:string;   // action for endpoint, \"list\" or other\n  params?: Record<string,any>; // parameters that need to be sent in the data query\n  onChange?:(name:string, value:any) => any;\n  labelProperty?: string; //data prop to use as label, eg 'display_name' for vertical (usually 'name')\n  invalid?:boolean;\n  noSelectionLabel?:string\n} & Omit<EnhancedSelectPropsType, 'options'> //omit options prop because those are generated here\n\n\n/*\n * An option picker that fetches choices from the API.\n * Uses EnhandedSelect (react-select) for display.\n */\nconst DynamicSingleSelect:FC<DynamicSelectPropsType>  = ({\n  name,\n  endpoint,\n  action = 'list',\n  params={},\n  value = '',\n  noSelectionLabel = 'Select...',\n  onChange,\n  labelProperty=\"name\",\n  className=\"\",\n  invalid,\n}) => {\n  const [isLoading, setIsLoading] = useState<boolean>(true);\n  const [items, setItems] = useState<any[]>([]); //app.getCache(endpoint));\n  const api = useApi(endpoint, action);\n\n  const load = async () => {\n    const result = await api.fetch(params);\n    if (result) {\n      setItems((result as any[]).map((row: any) => ({\n        value: row.id.toString(),\n        label: row[labelProperty],\n      })));\n    } else {\n      console.log('Unable to load items for select', name, api.error);\n    }\n    setIsLoading(false);\n  };\n\n  useEffect(() => {\n    if (!items.length) {\n      load();\n    } else {\n      setIsLoading(false);\n    }\n  }, []);\n\n\n\n  // Handler provided to this component should receive the name and value as arguments.\n  // (this is the default for formApi.handleOnChange)\n  const handleChange = (val:any) => onChange(name, val);\n\n\n  return (\n    <EnhancedSelect\n      name={name}\n      value={value !== '' && value != null ? value.toString() : ''}\n      options={items}\n      controlShouldRenderValue\n      isMulti={false}\n      isSearchable\n      onChange={handleChange}\n      isLoading={isLoading}\n      placeholder={isLoading ? \"Loading...\" : noSelectionLabel}\n      isInvalid={invalid}\n      className={className}\n    />\n  )\n\n  // return (\n  //   <>\n  //     { isLoading ? (\n  //       <div className=\"inline-loading\">\n  //         <Spinner size=\"sm\" />\n  //         {' '}\n  //         Loading...\n  //       </div>\n  //     ) : (\n  //       <InputGroup>\n  //         <Input\n  //           type=\"select\"\n  //           name={name}\n  //           defaultValue={defaultValue}\n  //           invalid={invalid}\n  //           onChange={onChange}\n  //           bsSize={size}\n  //         >\n  //           <option value=\"\">{noSelectionLabel}</option>\n  //           {items.map((item, i) => (<option value={item.id} key={i}>{item[labelProperty]}</option>))}\n  //         </Input>\n  //       </InputGroup>\n  //     )}\n  //   </>\n  //\n  // );\n};\n\n\n\nexport default DynamicSingleSelect;\n","import React, {useMemo} from 'react';\nimport Select from '../Form/SimpleSelect';\nimport {DefaultReactSelectProps} from \"./const\";\nimport classnames from 'classnames';\nimport './EnhancedSelect.scss';\n\n\nexport type EnhancedSelectPropsType = {\n  onChange:any,\n  options:any[],\n  value?:number|string,\n  name?:string,\n  defaultValue?:number|string,\n  label?:string,\n  className?:string,\n  disabled?:boolean,\n  isInvalid?:boolean,\n  invalidFeedback?:string,\n  placeholder?:string|JSX.Element,\n  // for react-select (this version not typed)\n  getOptionValue?:(opt:any) => any,\n  getOptionLabel?:(opt:any) => string,\n  controlShouldRenderValue?:boolean,\n  hideSelectedOptions?:boolean,\n  closeMenuOnSelect?:boolean,\n  tabSelectsValue?:boolean,\n  backspaceRemovesValue?:boolean,\n  isMulti?:boolean,\n  isSearchable?:boolean,\n  isClearable?:boolean,\n  isLoading?:boolean,\n  isOptionSelected?:(opt:any, selectValue:string) => boolean,\n  isOptionDisabled?:(opt:any) => boolean,\n  loadingMessage?:() => string|JSX.Element,\n  formatOptionLabel?:any,\n  returnValueAsString?:boolean,\n  menuIsOpen?:boolean,\n  filterOption?:(opt:any, input:string) => any\n}\n\n/*\n * Dropdown input that uses react-select (by way of SimpleSelect)\n * for enhanced features like search and multi-select. It uses bootstrap classes for invalid feedback.\n *\n * SimpleSelect allows us to use scalar values for react-select instead of options objects.\n *\n */\nconst EnhancedSelect = ({\n                          onChange,\n                          options = [],\n                          value,\n                          label,\n                          disabled = false,\n                          name=\"\",\n                          className=\"\",\n                          isInvalid,\n                          invalidFeedback,\n                          placeholder,\n                          isLoading,\n                          loadingMessage,\n                          returnValueAsString=true,\n                          isOptionDisabled,\n                          ...rest\n                        }:EnhancedSelectPropsType) =>{\n\n  const selectProps = useMemo(\n    ()=>{\n      const props = { ...DefaultReactSelectProps, ...rest }\n      if (!returnValueAsString) {\n        // @ts-ignore\n        delete props.getOptionValue\n      }\n      return props;\n     },\n    [isLoading, placeholder, loadingMessage]);\n\n  return (\n    <div  className={classnames('enhanced-select', className, {\"is-invalid\":isInvalid})}>\n      <div>\n        {label && <label className=\"form-label\">{label}</label>}\n        <Select\n          classNamePrefix=\"enhanced-select\"\n          isClearable\n          onChange={onChange}\n          options={options}\n          value={value}\n          tabSelectsValue\n          backspaceRemovesValue\n          placeholder={placeholder}\n          isDisabled={disabled}\n          isLoading={isLoading}\n          {...(loadingMessage ? { loadingMessage } : {})}\n          {...(isOptionDisabled ? { isOptionDisabled } : {})}\n          {...selectProps}\n        />\n      </div>\n      {invalidFeedback && <div className=\"invalid-feedback\">{invalidFeedback}</div>}\n    </div>\n  );\n}\n\nexport default EnhancedSelect\n","import React, { useRef, useEffect, ChangeEvent } from 'react';\nimport { Input } from 'reactstrap';\n\ntype OtpCodeInputProps = {\n  onComplete?: (code: string) => void;\n  disabled?: boolean;\n  invalid?: boolean;\n};\n\nconst OtpCodeInput = ({ onComplete, disabled, invalid }: OtpCodeInputProps) => {\n  const inputRef = useRef<HTMLInputElement>(null);\n\n  useEffect(() => {\n    if (inputRef.current) {\n      inputRef.current.focus();\n    }\n  }, []);\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    const value = e.target.value.replace(/[^0-9]/g, '');\n    e.target.value = value;\n\n    if (value.length === 6 && typeof onComplete === 'function') {\n      onComplete(value);\n    }\n  };\n\n  return (\n    <Input\n      type=\"text\"\n      maxLength={6}\n      inputMode=\"numeric\"\n      autoComplete=\"one-time-code\"\n      placeholder=\"000000\"\n      onChange={handleChange}\n      disabled={disabled}\n      invalid={invalid}\n      innerRef={inputRef}\n      style={{\n        fontFamily: 'monospace',\n        fontSize: '1.5rem',\n        textAlign: 'center',\n        letterSpacing: '0.5em',\n      }}\n    />\n  );\n};\n\nexport default OtpCodeInput;\n","import React, { useState, useEffect } from 'react';\nimport { Button, FormText, Spinner, Input, Row, Col } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { faCode } from \"@fortawesome/free-solid-svg-icons\";\nimport KeyValueRow from './KeyValueRow';\nimport TargetSelect from '../TargetingManager/TargetSelect';\nimport TargetValueForm from '../TargetingManager/TargetValueForm';\nimport SimpleSelect from './SimpleSelect';\nimport useApi from '../../Hooks/useApi';\nimport '../TargetingManager/styles.scss';\nimport './SeedData.scss';\nimport { HelpPopper, JsonEditorLoadable, MaskedInput, StandardAlert } from '@thedmsgroup/mastodon-ui-components';\nimport { SeedData } from '../../types';\nimport { SeedDataValidationRule, getRequiredFields } from './SeedDataValidation';\nimport {\n  SeedDataRow,\n  SeedDataRowDisplay,\n  seedDataToRows,\n  rowsToSeedData,\n  sortRows\n} from './SeedDataDisplay';\n\ntype RowType = 'system' | 'custom';\n\ninterface EditForm {\n  key: string;\n  value: any;\n  type: RowType;\n}\n\ninterface Attribute {\n  alias: string;\n  input_type: string;\n  options: {\n    label?: string;\n    [key: string]: any;\n  };\n  groupName?: string;\n  [key: string]: any;\n}\n\ninterface AttributeGroups {\n  [groupName: string]: Attribute[];\n}\n\ninterface Attributes {\n  [alias: string]: Attribute;\n}\n\ninterface SeedDataFormProps {\n  editForm: EditForm;\n  attributes: Attributes;\n  attributeGroups: AttributeGroups;\n  isEditing: boolean;\n  validationRules?: SeedDataValidationRule[];\n  duplicateError?: string | null;\n  onChangeFormType: (type: RowType) => void;\n  onChangeSystemKey: (key: string) => void;\n  onChangeSystemValue: (el: any, inputType: string) => void;\n  onChangeCustomKey: (key: string) => void;\n  onChangeCustomValue: (value: any) => void;\n  onSave: () => void;\n  onCancel: () => void;\n}\n\ninterface SeedDataBuilderProps {\n  seedData?: SeedData | any[];\n  verticalId?: number;\n  product?: string;\n  onUpdate?: (seedData: SeedData) => void;\n  onJsonValidChange?: (isValid: boolean) => void;\n  view?: 'form' | 'json';\n  validationRules?: SeedDataValidationRule[];\n}\n\n/**\n * Mask options for custom key input (query string parameter and JS object prop compatible)\n * Allows lowercase alphanumeric and underscores only\n */\nconst CustomKeyMaskOptions: any = {\n  mask: /^[a-z0-9_]*$/,\n  prepare: function (str: string) {\n    return str.toLowerCase();\n  },\n};\n\n/**\n * Component: Seed data edit/add form\n */\nconst SeedDataForm = ({\n  editForm,\n  attributes,\n  attributeGroups,\n  isEditing,\n  validationRules,\n  duplicateError,\n  onChangeFormType,\n  onChangeSystemKey,\n  onChangeSystemValue,\n  onChangeCustomKey,\n  onChangeCustomValue,\n  onSave,\n  onCancel\n}: SeedDataFormProps) => {\n  const attr = editForm.type === 'system' && editForm.key ? attributes[editForm.key] : null;\n\n  // Detect complex (object/array) values for the fallback editor\n  const isComplexValue = editForm.value !== null && typeof editForm.value === 'object';\n  const [jsonEditCode, setJsonEditCode] = useState('');\n  const [jsonEditValid, setJsonEditValid] = useState(true);\n\n  useEffect(() => {\n    if (isComplexValue) {\n      setJsonEditCode(JSON.stringify(editForm.value, null, 2));\n      setJsonEditValid(true);\n    }\n  }, [editForm.key]);\n\n  // Find configuration for this field (works for both system and custom types)\n  const fieldRule = editForm.key\n    ? validationRules?.find(r => r.field === editForm.key && r.type === editForm.type)\n    : null;\n\n  // Check if validation rules require this field to be a system type\n  const mustBeSystem = editForm.key\n    ? validationRules?.some(r => r.field === editForm.key && r.type === 'system')\n    : false;\n\n  return (\n    <div className=\"seed-data-edit-form p-3 mb-3 border rounded bg-light\">\n      <div className=\"mb-2\">\n        {duplicateError && (\n          <StandardAlert color=\"danger\">{duplicateError}</StandardAlert>\n        )}\n        <label className=\"form-label\">Type:</label>\n        {mustBeSystem ? (\n          <span className=\"ms-2 text-success fw-bold\">SYSTEM</span>\n        ) : (\n          <Input\n            type=\"select\"\n            value={editForm.type}\n            onChange={(e) => onChangeFormType(e.target.value as RowType)}\n            bsSize=\"sm\"\n            className=\"ms-2 d-inline-block w-auto\"\n          >\n            <option value=\"system\">System</option>\n            <option value=\"custom\">Custom</option>\n          </Input>\n        )}\n        {!mustBeSystem && (\n          <HelpPopper name=\"tracking-data-type-help\" title=\"Tracking Data Type\" iconClass=\"ms-1\">\n            System attributes are predefined and have specific input types. Custom attributes can have any key and value.\n          </HelpPopper>\n        )}\n      </div>\n\n      {editForm.type === 'system' ? (\n        // Check if there's a validation rule with custom input config for this system field\n        fieldRule?.inputType === 'select' && fieldRule.options?.choices ? (\n          // Use SimpleSelect for configured system fields with select input\n          <div className=\"mb-2\">\n            <Row>\n              <Col>\n                <MaskedInput\n                  {...CustomKeyMaskOptions}\n                  type=\"text\"\n                  value={editForm.key}\n                  placeholder=\"key\"\n                  readOnly\n                />\n                {(fieldRule.required || fieldRule.requiredWhen) && (\n                  <FormText>This is a required field</FormText>\n                )}\n              </Col>\n              <Col xs=\"auto\" className=\"d-flex align-items-start pt-2\">\n                <b>=</b>\n              </Col>\n              <Col>\n                <SimpleSelect\n                  value={editForm.value || ''}\n                  onChange={onChangeCustomValue}\n                  options={Object.entries(fieldRule.options.choices).map(\n                    ([value, label]) => ({ value, label })\n                  )}\n                  placeholder=\"Select...\"\n                />\n                {fieldRule.options.label && (\n                  <FormText>{fieldRule.options.label}</FormText>\n                )}\n              </Col>\n            </Row>\n          </div>\n        ) : fieldRule ? (\n          // Non-select validation rule for system field (text input)\n          <div className=\"mb-2\">\n            <Row>\n              <Col>\n                <MaskedInput\n                  {...CustomKeyMaskOptions}\n                  type=\"text\"\n                  value={editForm.key}\n                  placeholder=\"key\"\n                  readOnly\n                />\n                {(fieldRule.required || fieldRule.requiredWhen) && (\n                  <FormText>This is a required field</FormText>\n                )}\n              </Col>\n              <Col xs=\"auto\" className=\"d-flex align-items-start pt-2\">\n                <b>=</b>\n              </Col>\n              <Col>\n                <Input\n                  type=\"text\"\n                  value={editForm.value || ''}\n                  placeholder=\"value\"\n                  onChange={(e) => onChangeCustomValue(e.target.value)}\n                />\n                {fieldRule.options?.label && (\n                  <FormText>{fieldRule.options.label}</FormText>\n                )}\n              </Col>\n            </Row>\n          </div>\n        ) : (\n          // Default system attribute picker (no validation rule configured)\n          <>\n            <div className=\"mb-2\">\n              <label className=\"form-label\">Attribute:</label>\n              <TargetSelect\n                value={editForm.key}\n                onChange={onChangeSystemKey}\n                attributeGroups={attributeGroups}\n              />\n            </div>\n\n            {attr ? (\n              <div className=\"mb-2\">\n                <label className=\"form-label\">Value:</label>\n                <TargetValueForm\n                  value={editForm.value}\n                  onChangeValue={(e: any) => onChangeSystemValue((e.target || e), attr.input_type)}\n                  attribute={attr}\n                />\n                {attr.options.label && (\n                  <FormText>{attr.options.label}</FormText>\n                )}\n              </div>\n            ) : editForm.key ? (\n              <div className=\"mb-2\">\n                <label className=\"form-label\">Value:</label>\n                {isComplexValue ? (\n                  <JsonEditorLoadable\n                    code={jsonEditCode}\n                    onChange={(newCode: string, isValid: boolean) => {\n                      setJsonEditCode(newCode);\n                      setJsonEditValid(isValid);\n                      if (isValid) onChangeCustomValue(JSON.parse(newCode));\n                    }}\n                    isInvalid={!jsonEditValid}\n                  />\n                ) : (\n                  <Input\n                    type=\"text\"\n                    value={editForm.value || ''}\n                    placeholder=\"value\"\n                    onChange={(e) => onChangeCustomValue(e.target.value)}\n                  />\n                )}\n              </div>\n            ) : null}\n          </>\n        )\n      ) : (\n        <>\n          {/* Custom field: check if configured as select */}\n          {fieldRule?.inputType === 'select' && fieldRule.options?.choices ? (\n            <div className=\"mb-2\">\n              <Row>\n                <Col>\n                  <MaskedInput\n                    {...CustomKeyMaskOptions}\n                    type=\"text\"\n                    value={editForm.key}\n                    placeholder=\"key\"\n                    onAccept={(value: string) => onChangeCustomKey(value)}\n                    readOnly={!!(fieldRule.required || fieldRule.requiredWhen)}\n                  />\n                  {(fieldRule.required || fieldRule.requiredWhen) && (\n                    <FormText>This is a required field</FormText>\n                  )}\n                </Col>\n                <Col xs=\"auto\" className=\"d-flex align-items-start pt-2\">\n                  <b>=</b>\n                </Col>\n                <Col>\n                  <SimpleSelect\n                    value={editForm.value || ''}\n                    onChange={onChangeCustomValue}\n                    options={Object.entries(fieldRule.options.choices).map(\n                      ([value, label]) => ({ value, label })\n                    )}\n                    placeholder=\"Select...\"\n                  />\n                  {fieldRule.options.label && (\n                    <FormText>{fieldRule.options.label}</FormText>\n                  )}\n                </Col>\n              </Row>\n            </div>\n          ) : (\n            <div className=\"mb-2\">\n              <KeyValueRow\n                attribute={editForm.key}\n                value={editForm.value}\n                onChangeAttribute={onChangeCustomKey}\n                onChangeValue={onChangeCustomValue}\n                allowObjects\n                valueHelpText={fieldRule?.options?.label}\n              />\n            </div>\n          )}\n        </>\n      )}\n\n\n\n      <div className=\"mt-2 text-end\">\n        <Button size=\"sm\" color=\"link\" onClick={onCancel}>\n          Cancel\n        </Button>\n        <Button size=\"sm\" color=\"primary\" onClick={onSave} disabled={!editForm.key || (isComplexValue && !attr && !jsonEditValid)}>\n          {isEditing ? 'Update' : 'Add'}\n        </Button>\n      </div>\n    </div>\n  );\n};\n\n/**\n * Main Component: SeedDataBuilder\n */\nconst SeedDataBuilder = ({\n  seedData = [],\n  verticalId = 0,\n  product = '',\n  onUpdate,\n  onJsonValidChange,\n  view = 'form',\n  validationRules\n}: SeedDataBuilderProps) => {\n  const { api } = useApi();\n  const [jsonViewMode, setJsonViewMode] = useState<boolean>(view === 'json');\n  const [rows, setRows] = useState<SeedDataRow[]>(() => seedDataToRows(seedData, validationRules));\n  const [editingIndex, setEditingIndex] = useState<number | null>(null); // null, -1 (new), or row index\n  const [editForm, setEditForm] = useState<EditForm>({\n    key: '',\n    value: null,\n    type: 'system'\n  });\n  const [attributes, setAttributes] = useState<Attributes | null>(null);\n  const [attributeGroups, setAttributeGroups] = useState<AttributeGroups | null>(null);\n  const [duplicateError, setDuplicateError] = useState<string | null>(null);\n  const [jsonCode, setJsonCode] = useState<string>('');\n  const [jsonValid, setJsonValid] = useState<boolean>(true);\n\n  // Load attributes on mount\n  useEffect(() => {\n    if (!attributes) {\n      load();\n    }\n  }, []);\n\n  // Load attributes on change of vertical\n  useEffect(() => {\n    if (attributes) {\n      load();\n    }\n  }, [verticalId, product]);\n\n  // Auto-add missing required fields\n  useEffect(() => {\n    if (!validationRules || validationRules.length === 0) {\n      return;\n    }\n\n    const currentSeedData = rowsToSeedData(rows);\n    const requiredFields = getRequiredFields(validationRules, currentSeedData);\n    const missingFields: SeedDataRow[] = [];\n\n    requiredFields.forEach(rule => {\n      const exists = rows.some(r => r.key === rule.field && r.type === rule.type);\n      if (!exists) {\n        missingFields.push({\n          key: rule.field,\n          value: null,\n          type: rule.type\n        });\n      }\n    });\n\n    if (missingFields.length > 0) {\n      const newRows = [...rows, ...missingFields];\n      const currentSeedDataForSort = rowsToSeedData(newRows);\n\n      // Sort rows: system first, then custom (required before non-required), then alphabetically\n      const sortedRows = sortRows(newRows, validationRules, currentSeedDataForSort);\n\n      setRows(sortedRows);\n      onUpdate?.(rowsToSeedData(sortedRows));\n    }\n  }, [validationRules, rows, onUpdate]);\n\n  const load = async () => {\n    const result = await api.endpoints.attributes.list({\n      options: true,\n      verticalId,\n      product,\n    });\n    if (result) {\n      setAttributeGroups(result);\n\n      // Ungroup the attributeGroup data and store in attributes\n      const attrList = Object.entries(result).reduce((acc: Attributes, [groupName, group]: [string, any]) => {\n        group.map((attr: Attribute) => {\n          acc[attr.alias] = { ...attr, groupName };\n        });\n        return acc;\n      }, {});\n\n      setAttributes(attrList);\n    }\n  };\n\n  const getTargetValueFromEl = (el: any, inputType: string, currentValue: any): any => {\n    let value = currentValue;\n    const newValue = el && !Array.isArray(el) ? el.value : null;\n    const fieldName = el && !Array.isArray(el) ? el.name : null;\n\n    switch (inputType) {\n      case 'integer':\n      case 'zipcode_list':\n      case 'county_list':\n      case 'expression':\n      case 'text':\n      case 'list':\n        value = newValue;\n        break;\n      case 'integer_range':\n        if (!value || typeof value !== 'object' || Array.isArray(value)) {\n          value = { from: null, to: null };\n        }\n        value[fieldName] = newValue;\n        break;\n      case 'boolean':\n        value = typeof newValue === 'string' ? (newValue === 'true') : !!newValue;\n        break;\n      case 'choice':\n        if (el?.checked) {\n          value = newValue;\n        }\n        break;\n      case 'multiple_choice':\n      case 'dynamic_multiple_choice':\n      case 'metro_choice':\n      case 'state_choice':\n        if (Array.isArray(el)) {\n          value = el;\n        } else {\n          if (!Array.isArray(value)) value = [];\n          if (el?.checked) {\n            value.push(el?.value);\n          } else {\n            value = value.filter((val: any) => val != el?.value);\n          }\n        }\n        break;\n      default:\n        value = newValue;\n        break;\n    }\n\n    return value;\n  };\n\n  const handleStartEdit = (index: number) => {\n    const row = rows[index];\n    setEditForm({\n      key: row.key,\n      value: row.value,\n      type: row.type\n    });\n    setEditingIndex(index);\n  };\n\n  const handleStartAdd = () => {\n    setEditForm({\n      key: '',\n      value: null,\n      type: 'system'\n    });\n    setEditingIndex(-1);\n  };\n\n  const handleCancelEdit = () => {\n    setEditForm({ key: '', value: null, type: 'system' });\n    setEditingIndex(null);\n    setDuplicateError(null);\n  };\n\n  const handleSaveEdit = () => {\n    if (!editForm.key) {\n      return; // Require key\n    }\n\n    // Check for duplicate key within the same type\n    const isDuplicate = rows.some((r, i) => {\n      // Skip the row being edited\n      if (editingIndex !== -1 && i === editingIndex) {\n        return false;\n      }\n      return r.key === editForm.key && r.type === editForm.type;\n    });\n\n    if (isDuplicate) {\n      setDuplicateError(`A ${editForm.type} attribute with key \"${editForm.key}\" already exists.`);\n      return;\n    }\n\n    setDuplicateError(null);\n\n    const newRow: SeedDataRow = {\n      key: editForm.key,\n      value: editForm.value,\n      type: editForm.type\n    };\n\n    let newRows: SeedDataRow[];\n    if (editingIndex === -1) {\n      // Adding new\n      newRows = [...rows, newRow];\n    } else {\n      // Editing existing\n      newRows = rows.map((r, i) => i === editingIndex ? newRow : r);\n    }\n\n    // Sort rows: system first, then custom (required before non-required), then alphabetically\n    const currentSeedDataForSort = rowsToSeedData(newRows);\n    const sortedRows = sortRows(newRows, validationRules, currentSeedDataForSort);\n\n    setRows(sortedRows);\n    handleCancelEdit();\n\n    // Update parent\n    const newSeedData = rowsToSeedData(sortedRows);\n    onUpdate?.(newSeedData);\n  };\n\n  const handleDelete = (index: number) => {\n    const newRows = rows.filter((_, i) => i !== index);\n    setRows(newRows);\n\n    // Update parent\n    const newSeedData = rowsToSeedData(newRows);\n    onUpdate?.(newSeedData);\n  };\n\n  const handleChangeFormType = (type: RowType) => {\n    setEditForm({\n      key: '',\n      value: type === 'system' && editForm.key ? null : editForm.value,\n      type\n    });\n    setDuplicateError(null);\n  };\n\n  const handleChangeSystemKey = (key: string) => {\n    const attr = attributes?.[key];\n    setEditForm({\n      ...editForm,\n      key,\n      value: attr ? getTargetValueFromEl(null, attr.input_type, null) : null\n    });\n    setDuplicateError(null);\n  };\n\n  const handleChangeSystemValue = (el: any, inputType: string) => {\n    setEditForm({\n      ...editForm,\n      value: getTargetValueFromEl(el, inputType, editForm.value)\n    });\n  };\n\n  const handleChangeCustomKey = (key: string) => {\n    setEditForm({\n      ...editForm,\n      key\n    });\n    setDuplicateError(null);\n  };\n\n  const handleChangeCustomValue = (value: any) => {\n    setEditForm({\n      ...editForm,\n      value\n    });\n  };\n\n  const handleToggleJsonMode = () => {\n    if (jsonViewMode && !jsonValid) {\n      // Don't allow switching back to form mode with invalid JSON\n      return;\n    }\n    if (!jsonViewMode) {\n      // Switching to JSON mode: serialize current rows\n      const currentSeedData = rowsToSeedData(rows);\n      setJsonCode(JSON.stringify(currentSeedData, null, 2));\n      setJsonValid(true);\n    } else {\n      // Switching back to form mode: JSON is valid (enforced above)\n      onJsonValidChange?.(true);\n    }\n    setJsonViewMode(!jsonViewMode);\n  };\n\n  const handleJsonEditorChange = (newCode: string, isValid: boolean) => {\n    setJsonValid(isValid);\n    onJsonValidChange?.(isValid);\n    setJsonCode(newCode);\n    if (isValid) {\n      const parsed = JSON.parse(newCode);\n      const newRows = seedDataToRows(parsed, validationRules);\n      setRows(newRows);\n      onUpdate?.(parsed);\n    }\n  };\n\n  if (!attributes) {\n    return (\n      <div>\n        <Spinner size=\"sm\" color=\"secondary\" /> <i>Loading attributes</i>\n      </div>\n    );\n  }\n\n  // Check if there's no seed data\n  const hasNoSeedData = rows.length === 0;\n\n  return (\n    <div className=\"seed-data-builder\">\n      {!hasNoSeedData && (\n        <div>\n          <Button size=\"xs\" color=\"link\" onClick={handleToggleJsonMode} disabled={jsonViewMode && !jsonValid}>\n            {jsonViewMode ? <><FaIcon icon=\"list\" size=\"sm\"/> List</> : <><FaIcon icon={faCode} size=\"sm\"/> JSON</>}\n          </Button>\n          {jsonViewMode && !jsonValid && (\n            <StandardAlert className=\"validation\" color=\"warning\">Fix invalid JSON before switching to List view</StandardAlert>\n          )}\n        </div>\n      )}\n\n      {jsonViewMode ? (\n        <div className=\"form-section\">\n          <JsonEditorLoadable\n            code={jsonCode}\n            onChange={handleJsonEditorChange}\n            isInvalid={!jsonValid}\n          />\n        </div>\n      ) : (\n        <div className=\"seed-data-rows-container\">\n          {/* Row List */}\n          {rows.map((row, index) => (\n            <React.Fragment key={index}>\n              <SeedDataRowDisplay\n                row={row}\n                index={index}\n                showActions={true}\n                onEdit={handleStartEdit}\n                onDelete={handleDelete}\n                validationRules={validationRules}\n                currentSeedData={rowsToSeedData(rows)}\n              />\n\n              {/* Inline edit form below row */}\n              {editingIndex === index && (\n                <SeedDataForm\n                  editForm={editForm}\n                  attributes={attributes}\n                  attributeGroups={attributeGroups!}\n                  isEditing={true}\n                  validationRules={validationRules}\n                  duplicateError={duplicateError}\n                  onChangeFormType={handleChangeFormType}\n                  onChangeSystemKey={handleChangeSystemKey}\n                  onChangeSystemValue={handleChangeSystemValue}\n                  onChangeCustomKey={handleChangeCustomKey}\n                  onChangeCustomValue={handleChangeCustomValue}\n                  onSave={handleSaveEdit}\n                  onCancel={handleCancelEdit}\n                />\n              )}\n            </React.Fragment>\n          ))}\n\n          {/* Add new form at bottom */}\n          {editingIndex === -1 && (\n            <SeedDataForm\n              editForm={editForm}\n              attributes={attributes}\n              attributeGroups={attributeGroups!}\n              isEditing={false}\n              validationRules={validationRules}\n              duplicateError={duplicateError}\n              onChangeFormType={handleChangeFormType}\n              onChangeSystemKey={handleChangeSystemKey}\n              onChangeSystemValue={handleChangeSystemValue}\n              onChangeCustomKey={handleChangeCustomKey}\n              onChangeCustomValue={handleChangeCustomValue}\n              onSave={handleSaveEdit}\n              onCancel={handleCancelEdit}\n            />\n          )}\n\n          {/* Add button */}\n          {editingIndex === null && (\n            <div className={hasNoSeedData ? \"\" : \"text-center\"}>\n              <Button color=\"link\" onClick={handleStartAdd} size=\"sm\">\n                <FaIcon icon=\"plus\" className=\"me-1\" />\n                Add\n              </Button>\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SeedDataBuilder;\n","import React, { useState, useMemo, ReactNode } from 'react';\nimport { Button, Badge } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport { faCode } from '@fortawesome/free-solid-svg-icons';\nimport { JsonDisplay } from '@thedmsgroup/mastodon-ui-components';\nimport { SeedData } from '../../types';\nimport { SeedDataValidationRule, isFieldRequired } from './SeedDataValidation';\nimport './SeedData.scss';\n\ntype RowType = 'system' | 'custom';\n\nexport interface SeedDataRow {\n  key: string;\n  value: any;\n  type: RowType;\n}\n\n/**\n * Helper: Format value for display\n */\nexport const formatValueForDisplay = (value: any): ReactNode => {\n  if (value === null || value === undefined) {\n    return <i>empty</i>;\n  }\n  if (typeof value === 'boolean') {\n    return value ? 'Yes' : 'No';\n  }\n  if (typeof value === 'object') {\n    if (value.from !== undefined && value.to !== undefined) {\n      return `${value.from || '?'} to ${value.to || '?'}`;\n    }\n    if (Array.isArray(value)) {\n      if (value.length === 0) return <i>empty array</i>;\n      if (value.every(v => typeof v !== 'object' || v === null)) {\n        return value.join(', ');\n      }\n    }\n    return <JsonDisplay data={value} scrollable height=\"100px\" />;\n  }\n  return String(value);\n};\n\n/**\n * Helper: Check if a row is required based on validation rules\n */\nexport const isRowRequired = (\n  row: SeedDataRow,\n  validationRules: SeedDataValidationRule[] | undefined,\n  currentSeedData: SeedData | any[]\n): boolean => {\n  if (!validationRules) return false;\n\n  const rule = validationRules.find(r => r.field === row.key && r.type === row.type);\n  if (!rule) return false;\n\n  return isFieldRequired(rule, currentSeedData);\n};\n\n/**\n * Helper: Sort rows with system first, then custom (with required before non-required)\n */\nexport const sortRows = (\n  rows: SeedDataRow[],\n  validationRules?: SeedDataValidationRule[],\n  currentSeedData?: SeedData | any[]\n): SeedDataRow[] => {\n  return [...rows].sort((a, b) => {\n    // 1. System before custom\n    if (a.type !== b.type) {\n      return a.type === 'system' ? -1 : 1;\n    }\n\n    // 2. Within custom: required before non-required\n    if (a.type === 'custom' && validationRules) {\n      const aRequired = isRowRequired(a, validationRules, currentSeedData || {});\n      const bRequired = isRowRequired(b, validationRules, currentSeedData || {});\n\n      if (aRequired !== bRequired) {\n        return aRequired ? -1 : 1;\n      }\n    }\n\n    // 3. Within each group: alphabetically by key\n    return a.key.localeCompare(b.key);\n  });\n};\n\n/**\n * Helper: Transform seedData object to rows array\n */\nexport const seedDataToRows = (\n  seedData: SeedData | any[] | undefined,\n  validationRules?: SeedDataValidationRule[]\n): SeedDataRow[] => {\n  const rows: SeedDataRow[] = [];\n\n  if (!seedData || Array.isArray(seedData)) {\n    return rows;\n  }\n\n  // System attributes (top-level except 'custom')\n  Object.entries(seedData).forEach(([key, value]) => {\n    if (key !== 'custom') {\n      rows.push({ key, value, type: 'system' });\n    }\n  });\n\n  // Custom attributes (under 'custom' property)\n  if (seedData.custom && typeof seedData.custom === 'object') {\n    Object.entries(seedData.custom).forEach(([key, value]) => {\n      rows.push({ key, value, type: 'custom' });\n    });\n  }\n\n  // Sort: system first, then custom (required before non-required), then alphabetically\n  return sortRows(rows, validationRules, seedData);\n};\n\n/**\n * Helper: Transform rows array to seedData object\n */\nexport const rowsToSeedData = (rows: SeedDataRow[]): SeedData => {\n  const obj: Record<string, any> = {};\n  const customObj: Record<string, any> = {};\n\n  rows.forEach(row => {\n    if (!row.key) return;\n\n    if (row.type === 'system') {\n      obj[row.key] = row.value;\n    } else if (row.type === 'custom') {\n      customObj[row.key] = row.value;\n    }\n  });\n\n  if (Object.keys(customObj).length > 0) {\n    obj.custom = customObj;\n  }\n\n  return obj as SeedData;\n};\n\ninterface SeedDataRowDisplayProps {\n  row: SeedDataRow;\n  index: number;\n  showActions?: boolean;\n  onEdit?: (index: number) => void;\n  onDelete?: (index: number) => void;\n  validationRules?: SeedDataValidationRule[];\n  currentSeedData: SeedData | any[];\n}\n\n/**\n * Component: Single seed data row display\n */\nexport const SeedDataRowDisplay = ({\n  row,\n  index,\n  showActions = false,\n  onEdit,\n  onDelete,\n  validationRules,\n  currentSeedData\n}: SeedDataRowDisplayProps) => {\n  const fieldIsRequired = isRowRequired(row, validationRules, currentSeedData);\n\n  return (\n    <div className=\"seed-data-row d-flex align-items-start p-2 mb-2 border rounded\">\n      <Badge color={row.type === 'system' ? 'success' : 'primary'} className=\"me-2\">\n        {row.type.toUpperCase()}\n      </Badge>\n      {fieldIsRequired && (\n        <Badge color=\"danger\" className=\"me-2\" size=\"sm\">\n          REQUIRED\n        </Badge>\n      )}\n      <div className=\"flex-grow-1\" style={{ minWidth: 0, overflow: 'hidden' }}>\n        <strong>{row.key}</strong>: {formatValueForDisplay(row.value)}\n      </div>\n      {showActions && (\n        <div className=\"seed-data-actions\">\n          {onEdit && (\n            <Button color=\"link\" size=\"sm\" onClick={() => onEdit(index)} title=\"Edit\">\n              <FaIcon icon=\"edit\" />\n            </Button>\n          )}\n          {onDelete && !fieldIsRequired && (\n            <Button color=\"link\" size=\"sm\" onClick={() => onDelete(index)} title=\"Delete\" className=\"text-danger\">\n              <FaIcon icon=\"trash\" />\n            </Button>\n          )}\n        </div>\n      )}\n    </div>\n  );\n};\n\ninterface SeedDataDisplayProps {\n  seedData: SeedData | any[];\n  showActions?: boolean;\n  onEdit?: (index: number) => void;\n  onDelete?: (index: number) => void;\n  validationRules?: SeedDataValidationRule[];\n  defaultView?: 'list' | 'json';\n  emptyMessage?: string;\n}\n\n/**\n * Component: Seed data display with list/JSON toggle\n */\nconst SeedDataDisplay = ({\n  seedData,\n  showActions = false,\n  onEdit,\n  onDelete,\n  validationRules,\n  defaultView = 'list',\n  emptyMessage = 'No seed data'\n}: SeedDataDisplayProps) => {\n  const [jsonViewMode, setJsonViewMode] = useState(defaultView === 'json');\n  const rows = useMemo(() => seedDataToRows(seedData, validationRules), [seedData, validationRules]);\n\n  const hasData = rows.length > 0;\n\n  if (!hasData) {\n    return <div className=\"text-muted\"><i>{emptyMessage}</i></div>;\n  }\n\n  return (\n    <div className=\"seed-data-display\">\n      <div className=\"mb-2\">\n        <Button size=\"xs\" color=\"link\" onClick={() => setJsonViewMode(!jsonViewMode)}>\n          {jsonViewMode ? <><FaIcon icon=\"list\" size=\"sm\" /> List</> : <><FaIcon icon={faCode} size=\"sm\" /> JSON</>}\n        </Button>\n      </div>\n\n      {jsonViewMode ? (\n        <div className=\"form-section\">\n          <JsonDisplay data={rowsToSeedData(rows)} />\n        </div>\n      ) : (\n        <div className=\"seed-data-rows-container\">\n          {rows.map((row, index) => (\n            <SeedDataRowDisplay\n              key={index}\n              row={row}\n              index={index}\n              showActions={showActions}\n              onEdit={onEdit}\n              onDelete={onDelete}\n              validationRules={validationRules}\n              currentSeedData={seedData}\n            />\n          ))}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SeedDataDisplay;\n","import { SeedData } from '../../types';\n\nexport type ConditionType = 'equals' | 'not-equals' | 'in-array' | 'not-in-array';\n\nexport interface SeedDataValidationRule {\n  field: string;\n  type: 'system' | 'custom';\n  required?: boolean;\n  requiredWhen?: {\n    field: string;\n    condition: ConditionType;\n    value: any;\n  };\n  errorMessage?: string;\n  // UI configuration properties\n  inputType?: 'select';\n  options?: {\n    choices?: { [value: string]: string };  // { value: label }\n    label?: string;  // Optional help text\n  };\n}\n\n/**\n * Get value of a field from seed data (handles both system and custom fields)\n */\nexport const getFieldValue = (seedData: SeedData | any[], field: string, type: 'system' | 'custom'): any => {\n  if (!seedData || Array.isArray(seedData)) {\n    return undefined;\n  }\n\n  if (type === 'custom') {\n    return seedData.custom?.[field];\n  }\n\n  return seedData[field];\n};\n\n/**\n * Evaluate a condition against a value\n */\nexport const evaluateCondition = (actualValue: any, condition: ConditionType, expectedValue: any): boolean => {\n  switch (condition) {\n    case 'equals':\n      return actualValue === expectedValue;\n\n    case 'not-equals':\n      return actualValue !== expectedValue;\n\n    case 'in-array':\n      if (!Array.isArray(expectedValue)) {\n        return false;\n      }\n      return expectedValue.includes(actualValue);\n\n    case 'not-in-array':\n      if (!Array.isArray(expectedValue)) {\n        return true;\n      }\n      return !expectedValue.includes(actualValue);\n\n    default:\n      return false;\n  }\n};\n\n/**\n * Check if a field is required based on current seed data\n */\nexport const isFieldRequired = (\n  rule: SeedDataValidationRule,\n  currentSeedData: SeedData | any[]\n): boolean => {\n  // Always required\n  if (rule.required) {\n    return true;\n  }\n\n  // Conditionally required\n  if (rule.requiredWhen) {\n    const { field, condition, value } = rule.requiredWhen;\n\n    // Determine the type of the dependent field\n    // Try to find it in the validation rules if available, otherwise assume same type\n    const dependentValue = getFieldValue(currentSeedData, field, rule.type);\n\n    return evaluateCondition(dependentValue, condition, value);\n  }\n\n  return false;\n};\n\n/**\n * Get all currently required fields based on seed data\n */\nexport const getRequiredFields = (\n  validationRules: SeedDataValidationRule[],\n  currentSeedData: SeedData | any[]\n): SeedDataValidationRule[] => {\n  return validationRules.filter(rule => isFieldRequired(rule, currentSeedData));\n};\n\n/**\n * Check if a field has a value\n */\nexport const hasValue = (value: any): boolean => {\n  if (value === null || value === undefined || value === '') {\n    return false;\n  }\n\n  if (Array.isArray(value) && value.length === 0) {\n    return false;\n  }\n\n  if (typeof value === 'object' && Object.keys(value).length === 0) {\n    return false;\n  }\n\n  return true;\n};\n\n/**\n * Validate seed data against validation rules\n * Returns an object with field keys and error messages\n */\nexport const validateSeedData = (\n  seedData: SeedData | any[],\n  validationRules: SeedDataValidationRule[]\n): Record<string, string> => {\n  const errors: Record<string, string> = {};\n\n  const requiredFields = getRequiredFields(validationRules, seedData);\n\n  requiredFields.forEach(rule => {\n    const value = getFieldValue(seedData, rule.field, rule.type);\n\n    if (!hasValue(value)) {\n      const fieldLabel = rule.field.replace(/_/g, ' ');\n      const defaultMessage = `${fieldLabel} is required`;\n      errors[rule.field] = rule.errorMessage || defaultMessage;\n    }\n  });\n\n  return errors;\n};\n\n/**\n * Custom Yup validation method for seed data with conditional dependencies\n *\n * Usage:\n * import * as Yup from 'yup';\n * import { SeedDataValidation } from './SeedDataValidation';\n *\n * seed_data: Yup.mixed().validSeedData([\n *   { field: 'traffic_type', type: 'custom', required: true },\n *   {\n *     field: 'jornaya_entity_code',\n *     type: 'custom',\n *     requiredWhen: { field: 'traffic_type', condition: 'equals', value: 'third_party' }\n *   }\n * ])\n */\nimport * as Yup from 'yup';\n\nexport const SeedDataValidation = (\n  Yup.addMethod(Yup.mixed, 'validSeedData', function (validationRules: SeedDataValidationRule[], customMessage?: string) {\n    return this.test(\n      'valid-seed-data',\n      customMessage || 'Seed data validation failed',\n      function (seedData: SeedData | any[]) {\n        if (!validationRules || validationRules.length === 0) {\n          return true;\n        }\n\n        const errors = validateSeedData(seedData, validationRules);\n\n        if (Object.keys(errors).length === 0) {\n          return true;\n        }\n\n        // Format error messages for display (just the messages, no field names)\n        const errorMessages = Object.values(errors);\n\n        const errorText = errorMessages.join('\\n');\n\n        return this.createError({\n          path: this.path,\n          message: errorText,\n        });\n      }\n    );\n  })\n);\n","import React from \"react\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport type {DbaType} from \"../../../types\";\n\n/*\n * A function that can be provided as react-select's formatOptionLabel function\n * on a DBA selector.\n *\n */\n// type DbaOptionType = {\n//   value:number|string,\n//   label:string,\n//   email?:string,\n//   enabled?:boolean,\n//   account?: {\n//     id:number;\n//     name:string;\n//   }\n// }\n/*\nDbaType = {\n  id:number;\n  name:string;\n  aliases:DbaAliasType[];\n  num_rules?:number;\n  orders?:any;\n  created_at?:string;\n  updated_at?:string;\n  logo?:LogoType;\n}\n */\n\n\nexport const DbaOptionLabel = (\n  option:DbaType, meta:any,  selected:boolean\n) => (\n\n  <div className=\"d-flex justify-content-between\">\n    <div className=\"d-flex\">\n      {meta.context === 'menu' && <div>{selected && <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\"/>}</div>}\n      <div>\n        <div>{option.name}</div>\n        {meta.context === 'menu' && (<div>\n          Aliases:{' '}\n          <small>\n            {option.aliases.length > 0 ? option.aliases.map((a:any)=>a.name).join(', ') : 'None'}\n          </small>\n        </div>)}\n      </div>\n    </div>\n\n  </div>\n\n);\n","import {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport EntityId from \"../../Table/EntityId\";\nimport {Badge} from 'reactstrap';\nimport {Utils} from \"@thedmsgroup/mastodon-ui-components\";\nimport React from \"react\";\n\ntype SourceOptionType = {\n  value:number|string,\n  label:string,\n  status?:string,\n  product?:string,\n  vertical?: {\n    id?:number;\n    name:string;\n    display_name:string;\n  }\n}\n\n/*\n * A function that can be provided as react-select's formatOptionLabel function\n * on a source selector, to show more source info than just the name.\n *\n * Value is assumed to be the source id, and label == name\n * Status has to be programmatically added to the option values,\n * if you want to show it\n */\n//TODO: not sure how to get meta type from 'react-select'. Object that has a 'context' string\nexport const SourceOptionLabel = (\n  option:SourceOptionType, meta:any,  selected:boolean\n) => (\n\n  <div className=\"d-flex justify-content-between\">\n    <div className=\"d-flex\">\n      {meta.context === 'menu' && <div>{selected && <FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\"/>}</div>}\n      <div><EntityId id={option.value} className=\"me-1\"/></div>\n      <div>\n        <div>{option.label}</div>\n        {option.vertical && option.product && meta.context === 'menu' && <div>\n          <small>{Utils.titleCase(option.product)} |  {option.vertical.display_name}</small>\n        </div>}\n      </div>\n    </div>\n\n      <div>\n        {/* Just indicating paused or archived (active assumed) */}\n        {option.status && option.status !== 'active' &&\n          <Badge size=\"xs\" className=\"ms-1\" color={option.status === 'archived' ? 'danger' : 'warning'}>{Utils.titleCase(option.status)}</Badge>}\n      </div>\n\n  </div>\n);\n\n","import React, { FC, useState, useEffect } from 'react';\nimport {\n  UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem, Spinner,\n} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames';\nimport { titleCase } from '../../utils/string';\nimport {StatusType} from \"../../types\";\n\ntype StatusTogglerPropertiesType = {\n  status:StatusType,\n  target?: any,\n  onChange?:(target:any, status:StatusType) => any;\n  onChangeAsync?:(target: any, status:StatusType) => any;\n  allowEdit?: boolean;\n  showArchived?: boolean;\n  className?: string;\n}\n\n/*\n * Widget that toggles a record's status, designed for a table cell.\n * Note: use the class name 'status-cell' on the containing cell. This adjusts some react-table styles.\n *\n * \"target\": could be ID or an object, depending on what the status update callback needs\n */\nconst StatusToggler:FC<StatusTogglerPropertiesType> = ({\n  status,\n  target,\n  onChange,\n  onChangeAsync,\n  allowEdit,\n  showArchived=true,\n  className\n                                                       }) => {\n  // Keeps status in state rather than reading props,\n  // because the containing table can take some time to refresh after the status update.\n  // This can result in this component \"flashing back\" to the old status before showing the new,\n  // if relying on the props\n  const [displayStatus, setDisplayStatus] = useState<string>(status);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const handleStatusChange = (newStatus:StatusType) => {\n    if (newStatus !== displayStatus) {\n     // setIsLoading(true);\n      //window.setTimeout(() => {\n        updateStatus(newStatus);\n     // }, 5000)\n\n    }\n  };\n\n  const updateStatus = async (newStatus:StatusType) => {\n    if (onChangeAsync) {\n      setIsLoading(true);\n      setDisplayStatus(newStatus);\n      const updated = await onChangeAsync(target, newStatus);\n      setIsLoading(false);\n      // TODO: could have alert icon if result false\n      if (!updated) {\n        setDisplayStatus(status);\n      }\n    } else if (onChange) {\n      onChange(target, newStatus);\n      setDisplayStatus(newStatus);\n    }\n\n  };\n\n  // This handles an odd effect when the list that this widget is in gets filtered.\n  // Make sure that state is updated to new prop value\n  useEffect(() => {\n    if (displayStatus !== status) {\n      setDisplayStatus(status);\n    }\n  }, [status]);\n\n  return (\n    <div key={target} className={classnames([\"status-toggler\", className], {enabled: allowEdit})}>\n      {allowEdit ? (\n        <>\n          {!isLoading ? (\n            <UncontrolledDropdown>\n\n              <DropdownToggle tag=\"div\" caret>\n                <FaIcon icon=\"circle\" size=\"xs\" className={classnames(['current-status-icon', displayStatus, 'me-1'])} />\n                <span>{titleCase(displayStatus)}</span>\n\n              </DropdownToggle>\n              <DropdownMenu>\n                <DropdownItem className=\"status-active\" onClick={() => handleStatusChange('active')}>\n                  <FaIcon icon=\"circle\" size=\"xs\" className=\"current-status-icon active\" />\n                  {' '}\n                  Active\n                </DropdownItem>\n                <DropdownItem className=\"status-pause\" onClick={() => handleStatusChange('paused')}>\n                  <FaIcon icon=\"circle\" size=\"xs\" className=\"current-status-icon paused\" />\n                  {' '}\n                  Paused\n                </DropdownItem>\n                {showArchived && (\n                  <DropdownItem className=\"status-archive\" onClick={() => handleStatusChange('archived')}>\n                    <FaIcon icon=\"circle\" size=\"xs\" className=\"current-status-icon archived\" />\n                    {' '}\n                    Archived\n                  </DropdownItem>\n                )}\n\n              </DropdownMenu>\n\n            </UncontrolledDropdown>\n          ) : (\n            <Spinner size=\"sm\" className=\"ms-3\" color=\"primary\" />\n          )}\n        </>\n      ) : (\n        <>\n          <FaIcon icon=\"circle\" size=\"xs\" className={classnames(['current-status-icon', status, 'me-1'])} />\n          <span>{titleCase(displayStatus)}</span>\n        </>\n      )}\n\n    </div>\n\n  );\n};\n\n\nexport default StatusToggler;\n","import React, { useMemo, useState } from 'react';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport {faCode} from \"@fortawesome/free-solid-svg-icons\";\nimport {Link} from \"react-router-dom\";\nimport {singularOrPlural} from \"@thedmsgroup/mastodon-ui-components/lib/utils/string\";\nimport {StandardAlert, HelpPopper, JsonDisplay} from \"@thedmsgroup/mastodon-ui-components\";\nimport {DataRows} from \"../../DataRows\";\nimport {DataRow} from \"../../DataRow\";\nimport {getDeprecatedSettings, getDeprecatedChoices} from \"./utils\";\nimport {IntegrationDefinition, IntegrationConfig} from './types';\nimport {ReactNode} from 'react';\n\ntype IntegrationSettingsViewProps = {\n  label?: ReactNode;\n  index?: number;\n  type?: string;\n  allowControls?: boolean;\n  allowEdit?: boolean;\n  allowDelete?: boolean;\n  allowEditIntegration?: boolean;\n  definitions: IntegrationDefinition[];\n  config: IntegrationConfig;\n  onDelete: (index: number) => void;\n  willDelete?: boolean;\n  setWillDelete?: (index: number | false) => void;\n  setEdit?: (index: number) => void;\n  showCombineSales?: boolean;\n  combineSales?: boolean;\n  showExcludePii?: boolean;\n};\n\n/*\n * Static display of an integration's settings, can be switched to edit mode (IntegrationSettingsEditor component)\n */\nconst IntegrationSettingsView = (props: IntegrationSettingsViewProps) => {\n  const [showJson, setShowJson] = useState(false);\n\n  const definition = useMemo(() => {\n    if (props.config.name) {\n      return props.definitions.find((conf) => conf.name === props.config.name);\n    }\n    return null;\n  }, [props.config.name, props.definitions]);\n\n  const deprecatedKeys = useMemo(\n    () => getDeprecatedSettings(props.config, props.definitions),\n    [props.config, props.definitions]\n  );\n\n  const deprecatedChoices = useMemo(\n    () => getDeprecatedChoices(props.config, props.definitions),\n    [props.config, props.definitions]\n  );\n\n  const getSettingValue = (setting: string): any => {\n    if (props.config?.settings) {\n      return props.config.settings[setting] || '';\n    }\n    return '';\n  };\n\n  const getSettingDisplay = (setting: string): ReactNode => {\n    if (props.config?.settings) {\n      const value = getSettingValue(setting);\n      if (Array.isArray(value)) {\n        // Assuming keyvalue type here, currently the only array type value possible\n        return (\n          <div className=\"key-value-display\">\n            {value.map( (item: any, i: number) => <div className=\"d-flex\" key={i}>\n              {item.key}: {item.value}\n            </div>)}\n          </div>)\n      }\n\n      const def = definition?.supported_settings ? definition.supported_settings.find((d) => d.name === setting) : null;\n      if (def) {\n        if (def.input_type === \"boolean\") {\n          return value ? 'Yes' : 'No';\n        } else if (def.input_type === \"choice\") {\n          const choice = def.choices?.find((c) => c.value === value);\n          if (choice) {\n            return choice.label;\n          }\n          if (value) {\n            return <span className=\"text-danger\"><FaIcon icon=\"exclamation-circle\" className=\"me-1\" />{value}</span>;\n          }\n          return '';\n        }\n        return value || '';\n      }\n\n      return value;\n    }\n    return '';\n  };\n\n  return (\n    <div>\n      <div className=\"d-flex header justify-content-between align-items-center\">\n        <div className=\"integration-settings-label\">{props.label} {' '}\n          {definition && props.allowEditIntegration && <Button\n            tag={Link}\n            color=\"link\"\n            to={{\n              pathname: `/tools/integrations/${definition.id}`,\n            }}\n            title=\"Go to integration\"\n            className=\"inline\"\n            target=\"_blank\"\n          >\n            <FaIcon icon=\"external-link-alt\" size=\"sm\"  />\n          </Button>\n          }\n        </div>\n        {props.allowControls === true && (\n          <div className=\"actions\">\n\n            {props.willDelete === true && (\n              <div className=\"delete-prompt ms-1\">\n                <i>Remove integrations?</i>\n                <Button color=\"success\" size=\"xs\" onClick={() => { props.onDelete(props.index!); }} className=\"ms-2 me-2\">yes</Button>\n                <Button color=\"danger\" size=\"xs\" onClick={() => { props.setWillDelete?.(false); }}>no</Button>\n              </div>\n            )}\n\n            {props.willDelete === false && (\n              <>\n                {props.allowEdit && (\n                  <>\n                    <Button\n                      color=\"link\"\n                      className=\"btn-edit inline me-2\"\n                      size=\"sm\"\n                      onClick={() => props.setEdit?.(props.index!)}\n                      title=\"Edit\"\n                    >\n                      <FaIcon icon=\"edit\" size=\"1x\" />\n                    </Button>\n\n                    {props.allowDelete && (\n                      <Button\n                        color=\"link\"\n                        className=\"btn-trash inline me-2\"\n                        size=\"sm\"\n                        onClick={() => props.setWillDelete?.(props.index!)}\n                        title=\"Delete\"\n                      >\n                        <FaIcon icon=\"trash\" size=\"1x\" />\n                      </Button>\n                    )}\n                  </>\n                )}\n\n                <Button\n                  color=\"link\"\n                  className=\"inline\"\n                  size=\"sm\"\n                  onClick={() => setShowJson(!showJson)}\n                  title={showJson ? \"List view\" : \"JSON view\"}\n                >\n                  <FaIcon icon={showJson ? \"list\" : faCode} size=\"1x\" />\n                </Button>\n              </>\n            )}\n\n          </div>\n        )}\n\n      </div>\n\n      {deprecatedKeys.length > 0 && (\n        <div className=\"deprecated-settings mb-2\">\n          <StandardAlert color=\"warning\" icon=\"alert\">\n            This integration has deprecated settings that must be removed before saving.\n            <HelpPopper name=\"deprecated-settings-help-display\" iconClass=\"ms-1\">\n              The current version of this integration has been updated and no longer has the setting(s) indicated below. Deprecated settings should be removed.\n            </HelpPopper>\n          </StandardAlert>\n        </div>\n      )}\n\n      {deprecatedChoices.length > 0 && (\n        <div className=\"deprecated-settings mb-2\">\n          <StandardAlert color=\"warning\" icon=\"alert\">\n            This integration has settings with choices that are no longer available and must be updated before saving.\n            <HelpPopper name=\"deprecated-choices-help-display\" iconClass=\"ms-1\">\n              The current version of this integration has been updated and some setting choices are no longer available. Please edit this integration and select new values for the indicated settings.\n            </HelpPopper>\n          </StandardAlert>\n        </div>\n      )}\n\n      {definition && (\n        showJson ? (\n          <JsonDisplay data={props.config} scrollable height=\"300px\" />\n        ) : (\n          <DataRows gap=\"0.5rem\" labelWidth=\"200px\">\n            {(definition.supported_settings?.length ?? 0) > 0\n              ? definition.supported_settings!.map((setting, i) => (\n                  <DataRow label={setting.label} key={i}>\n                    {getSettingDisplay(setting.name)}\n                  </DataRow>\n                ))\n              : (\n                <div className=\"mt-1\">\n                  <small><i>This service has no settings</i></small>\n                </div>\n              )\n            }\n\n            {deprecatedKeys.length > 0 && deprecatedKeys.map((key) => (\n              <DataRow\n                label={<span className=\"text-danger\"><FaIcon icon=\"exclamation-circle\" size=\"1x\" className=\"me-1\" /><s>{key}</s></span>}\n                className=\"deprecated\"\n                key={key}\n              >\n                <span className=\"text-muted\">\n                  {typeof props.config.settings[key] === 'object'\n                    ? JSON.stringify(props.config.settings[key])\n                    : String(props.config.settings[key] ?? '')}\n                </span>\n              </DataRow>\n            ))}\n\n            {props.showCombineSales && (\n              <DataRow label=\"Combine Sales\">\n                {props.combineSales ? 'Yes' : 'No'}\n              </DataRow>\n            )}\n\n            {props.config.timeout && (\n              <DataRow label=\"Custom Timeout\">\n                {props.config.timeout} {singularOrPlural(props.config.timeout, 'second', 'seconds')}\n              </DataRow>\n            )}\n\n            {props.showExcludePii && (\n              <DataRow label=\"Exclude PII\">\n                {props.config.exclude_pii ? 'Yes' : 'No'}\n              </DataRow>\n            )}\n          </DataRows>\n        )\n      )}\n\n    </div>\n  );\n};\n\nIntegrationSettingsView.defaultProps = {\n  showExcludePii: true,\n  allowDelete: true,\n};\n\nexport default IntegrationSettingsView;\n","import React, {ChangeEvent} from 'react';\nimport {\n  Input,\n  FormGroup,\n  Label,\n  Col, FormFeedback, FormText,\n} from 'reactstrap';\nimport copy from 'fast-copy';\nimport { useDebouncedCallback } from 'use-debounce';\nimport KeyValueBuilder from '../../Form/KeyValueBuilder';\nimport {IntegrationConfig, IntegrationDefinition, IntegrationSupportedSetting} from './types';\n\ntype SettingsFormProps = {\n  index: number;\n  definition: IntegrationDefinition;\n  config: IntegrationConfig;\n  onUpdate: (config: IntegrationConfig, index: number) => void;\n  errors: Record<string, string>;\n};\n\nconst SettingsForm = (props: SettingsFormProps) => {\n\n  const getNewIntegration = (name: string, value: any): IntegrationConfig => {\n    const intg = copy(props.config);\n    if (!intg.settings || Array.isArray(intg.settings)) {\n      intg.settings = {};\n    }\n    intg.settings[name] = value;\n    return intg;\n  };\n\n  const handleChangeSettingDebounced = useDebouncedCallback((name: string, value: any) => {\n    props.onUpdate(getNewIntegration(name, value), props.index);\n  }, 400);\n\n  // Update by form event\n  const handleChangeSetting = ({ target: { value, name } }: ChangeEvent<HTMLInputElement>) => {\n    props.onUpdate(getNewIntegration(name, value), props.index);\n  };\n\n  const handleChangeSettingByName = (name: string, value: any) => {\n    props.onUpdate(getNewIntegration(name, value), props.index);\n  };\n\n  const getSettingValue = (setting: string): any => {\n    if (props.config && props.config.settings) {\n      return props.config.settings[setting] || '';\n    }\n    return '';\n  };\n\n  return (\n    <div className=\"settings-container\">\n\n      {props.definition.supported_settings?.map((setting, i) => {\n\n        switch (setting.input_type) {\n          case 'text':\n            return (\n              <TextSetting\n                key={i}\n                setting={setting}\n                value={getSettingValue(setting.name)}\n                onChange={(e: ChangeEvent<HTMLInputElement>) => handleChangeSettingDebounced(setting.name, e.target.value)}\n                error={props.errors.integration}\n              />\n            );\n          case 'choice':\n            return (\n              <ChoiceSetting\n                key={i}\n                setting={setting}\n                value={getSettingValue(setting.name)}\n                onChange={handleChangeSetting}\n                error={props.errors.integration}\n              />\n            );\n          case 'boolean':\n            return (\n              <BooleanSetting\n                key={i}\n                setting={setting}\n                value={getSettingValue(setting.name)}\n                onChange={(e: ChangeEvent<HTMLInputElement>) => handleChangeSettingDebounced(setting.name, e.target.checked)}\n              />\n            );\n          case 'keyvalue':\n            return (\n              <FormGroup row key={i}>\n                <Label sm={3} for=\"integration\">{setting.label}</Label>\n                <Col sm={9}>\n                  <KeyValueBuilder\n                    label={setting.name}\n                    onChange={(val: any) => handleChangeSettingByName(setting.name, val)}\n                    values={getSettingValue(setting.name)}\n                  />\n                </Col>\n              </FormGroup>\n            );\n          default:\n            return null;\n        }\n      })}\n\n    </div>\n  );\n};\n\ntype SettingProps = {\n  setting: IntegrationSupportedSetting;\n  value: any;\n  onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n  error?: string;\n};\n\nconst TextSetting = ({ setting, value, onChange, error }: SettingProps) => (\n  <FormGroup row>\n    <Label sm={3} for={setting.name}>{setting.label}</Label>\n    <Col sm={9}>\n      <Input\n        name={setting.name}\n        type=\"text\"\n        defaultValue={value || ''}\n        onChange={onChange}\n        invalid={!!error}\n      />\n      <FormFeedback>{error}</FormFeedback>\n      {setting.help && <FormText>{setting.help}</FormText>}\n    </Col>\n  </FormGroup>\n);\n\nconst BooleanSetting = ({ setting, value, onChange }: Omit<SettingProps, 'error'>) => (\n  <FormGroup row className=\"align-items-center\">\n    <Label sm={3} for={setting.name}>{setting.label}</Label>\n    <Col sm={9}>\n      <Input\n        name={setting.name}\n        type=\"checkbox\"\n        onChange={onChange}\n        defaultChecked={Boolean(value)}\n        className=\"me-2\"\n      />\n\n      {setting.help && <FormText>{setting.help}</FormText>}\n    </Col>\n  </FormGroup>\n);\n\nconst ChoiceSetting = ({ setting, value, onChange, error }: SettingProps) => {\n  const isDeprecatedChoice = value && !setting.choices?.some((c) => c.value === value);\n\n  return (\n    <FormGroup row>\n      <Label sm={3} for={setting.name}>{setting.label}</Label>\n      <Col sm={9}>\n        <Input\n          type=\"select\"\n          name={setting.name}\n          value={value || ''}\n          onChange={onChange}\n          invalid={!!error || isDeprecatedChoice}\n        >\n          <option value=\"\">Select...</option>\n          {isDeprecatedChoice && (\n            <option value={value} disabled>{value} (no longer available)</option>\n          )}\n          {setting.choices?.map((c, i) => <option value={c.value} key={i}>{c.label}</option>)}\n        </Input>\n\n        <FormFeedback>{error || 'This choice is no longer available. Please select a new option.'}</FormFeedback>\n        {setting.help && <FormText>{setting.help}</FormText>}\n      </Col>\n    </FormGroup>\n  );\n};\n\n\nexport default SettingsForm;\n","import React, { useState, useEffect, useMemo, ChangeEvent, ReactNode } from 'react';\nimport {\n  Input,\n  Button,\n  Form,\n  FormGroup,\n  Label,\n  Col, FormText,\n} from 'reactstrap';\nimport copy from 'fast-copy';\nimport IconCheckbox from \"../../Form/IconCheckbox\";\nimport { useDebouncedCallback } from 'use-debounce';\nimport SettingsForm from './SettingsForm';\nimport EnhancedSelect from \"../../Form/EnhancedSelect\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport StatusToggler from \"../../Form/StatusToggler\";\nimport {Utils, StandardAlert, HelpPopper} from \"@thedmsgroup/mastodon-ui-components\";\nimport {getDeprecatedSettings, getDeprecatedChoices} from \"./utils\";\nimport {IntegrationDefinition, IntegrationConfig} from './types';\n\ntype IntegrationSettingsEditorProps = {\n  index?: number;\n  type?: string;\n  allowControls?: boolean;\n  isNew?: boolean;\n  showServiceChooser?: boolean;\n  definitions: IntegrationDefinition[];\n  config: IntegrationConfig;\n  label?: ReactNode;\n  onUpdate: (config: IntegrationConfig, index?: number) => void;\n  onApply?: () => void;\n  onDelete?: (index: number) => void;\n  errors?: Record<string, string>;\n  showCombineSales?: boolean;\n  combineSales?: boolean;\n  onCombineSalesChange?: (val: boolean, index?: number) => void;\n  showExcludePii?: boolean;\n};\n\nconst IntegrationSettingsEditor = (props: IntegrationSettingsEditorProps) => {\n  // The rule loads all possible integration configurations for the vertical/product, so\n  // here we select the config by name\n  const getDefinition = (name: string) => props.definitions.find((conf) => conf.name === name);\n  const [originalData, setOriginalData] = useState<IntegrationConfig>(props.config);\n  const [selectedDefinition, setSelectedDefinition] = useState<IntegrationDefinition | undefined>(() => {\n    // set selected to existing config, or default if only 1 config exists, else no defined selection\n    if (props.config.name) {\n      return getDefinition(props.config.name);\n    }\n    return props.definitions.length === 1 ? props.definitions[0] : undefined;\n  });\n\n  // If using service chooser\n  // Handle changing the integration service, which changes the available settings\n  const handleChangeService = (name: string) => {\n    const def = getDefinition(name);\n    setSelectedDefinition(def);\n\n    if (!def) {\n      props.onUpdate({ name: '', settings: {} }, props.index);\n    } else if (originalData && originalData.name === name) {\n      props.onUpdate(copy(originalData), props.index);\n    } else {\n      const newSettings: Record<string, string> = {};\n      if (def.supported_settings) {\n        def.supported_settings.forEach((s) => { newSettings[s.name] = ''; });\n      }\n\n      const newConfig: IntegrationConfig = { name, settings: newSettings };\n      props.onUpdate(newConfig, props.index);\n    }\n  };\n\n  const handleChangeTimeout = useDebouncedCallback((val: string) => {\n    const newConfig = copy(props.config);\n    newConfig.timeout = Number(val);\n    props.onUpdate(newConfig, props.index);\n  }, 400);\n\n  const handleExcludePii = (_name: string, val: boolean) => {\n    const newConfig = copy(props.config);\n    newConfig.exclude_pii = val;\n    props.onUpdate(newConfig, props.index);\n  };\n\n  const handleCombineSales = (_name: string, val: boolean) => {\n    props.onCombineSalesChange?.(val, props.index);\n  };\n\n  const deprecatedKeys = useMemo(\n    () => getDeprecatedSettings(props.config, props.definitions),\n    [props.config, props.definitions]\n  );\n\n  const deprecatedChoices = useMemo(\n    () => getDeprecatedChoices(props.config, props.definitions),\n    [props.config, props.definitions]\n  );\n\n  const handleRemoveDeprecatedSetting = (key: string) => {\n    const newConfig = copy(props.config);\n    delete newConfig.settings[key];\n    props.onUpdate(newConfig, props.index);\n  };\n\n  const handleRemoveAllDeprecated = () => {\n    const newConfig = copy(props.config);\n    deprecatedKeys.forEach((key) => delete newConfig.settings[key]);\n    props.onUpdate(newConfig, props.index);\n  };\n\n  // on enter edit mode, update parent if config already selected\n  useEffect(() => {\n    if (selectedDefinition) {\n      handleChangeService(selectedDefinition.name);\n    }\n  }, []);\n\n  const handleApply = () => {\n    setOriginalData(props.config);\n    props.onApply?.();\n  };\n\n  const handleCancel = () => {\n    if (props.isNew) {\n      props.onDelete?.(props.index!);\n    } else {\n      if (originalData) {\n        props.onUpdate(copy(originalData), props.index);\n        setSelectedDefinition(getDefinition(originalData.name));\n      }\n      props.onApply?.();\n    }\n  };\n\n  return (\n    <Form>\n      {props.label && (\n        <div className=\"integration-settings-label mb-3\">{props.label}</div>\n      )}\n      {props.showServiceChooser && (\n        <ServiceSelect\n          definitions={props.definitions}\n          value={selectedDefinition ? selectedDefinition.name : ''}\n          onChange={handleChangeService}\n          hasSettings={!!(selectedDefinition && (selectedDefinition.supported_settings?.length ?? 0) > 0)}\n          error={props.errors?.['integration.name']}\n        />\n      )}\n\n\n      {deprecatedKeys.length > 0 && (\n        <div className=\"deprecated-settings mb-3\">\n          <StandardAlert color=\"warning\" icon=\"alert\">\n            This integration has deprecated settings that must be removed before saving.\n            <HelpPopper name=\"deprecated-settings-help-edit\" iconClass=\"ms-1\">\n              The current version of this integration has been updated and no longer has the setting(s) indicated below. Deprecated settings should be removed.\n            </HelpPopper>\n            {deprecatedKeys.length >= 2 && (\n              <Button color=\"warning\" size=\"sm\" className=\"ms-2\" onClick={handleRemoveAllDeprecated}>\n                Remove All\n              </Button>\n            )}\n          </StandardAlert>\n        </div>\n      )}\n\n      {deprecatedChoices.length > 0 && (\n        <div className=\"deprecated-settings mb-3\">\n          <StandardAlert color=\"warning\" icon=\"alert\">\n            This integration has settings with choices that are no longer available. Please select new values for the indicated settings.\n            <HelpPopper name=\"deprecated-choices-help-edit\" iconClass=\"ms-1\">\n              The current version of this integration has been updated and some setting choices are no longer available. Please select new values for the indicated settings.\n            </HelpPopper>\n          </StandardAlert>\n        </div>\n      )}\n\n      {selectedDefinition !== undefined && (\n        <>\n          {Array.isArray(selectedDefinition.supported_settings) && selectedDefinition.supported_settings.length > 0 && (\n            <SettingsForm\n              index={props.index ?? 0}\n              definition={selectedDefinition}\n              config={props.config}\n              onUpdate={props.onUpdate}\n              errors={{}}\n            />\n          )}\n\n          {deprecatedKeys.length > 0 && (\n            <div className=\"deprecated-settings mb-3\">\n              {deprecatedKeys.map((key) => (\n                <FormGroup row key={key} className=\"deprecated-setting align-items-center\">\n                  <Label sm={3} className=\"text-danger\"><FaIcon icon=\"exclamation-circle\" size=\"1x\" className=\"me-1\" /><s>{key}</s></Label>\n                  <Col sm={7}>\n                    <Input\n                      type=\"text\"\n                      disabled\n                      value={typeof props.config.settings[key] === 'object'\n                        ? JSON.stringify(props.config.settings[key])\n                        : String(props.config.settings[key] ?? '')}\n                    />\n                  </Col>\n                  <Col sm={2}>\n                    <Button color=\"danger\" size=\"sm\" onClick={() => handleRemoveDeprecatedSetting(key)}>\n                      Remove\n                    </Button>\n                  </Col>\n                </FormGroup>\n              ))}\n            </div>\n          )}\n\n          {props.showCombineSales && (\n            <FormGroup row>\n              <Label sm={3} for=\"combine_sales\">Combine Sales</Label>\n              <Col sm={9}>\n                <IconCheckbox\n                  name=\"combine_sales\"\n                  value={Boolean(props.combineSales)}\n                  onChange={handleCombineSales}\n                >\n                  Combine Sales\n                </IconCheckbox>\n                <FormText>When enabled, all sales will be sent in one combined request. Otherwise, each sale is sent in a separate request.</FormText>\n              </Col>\n            </FormGroup>\n          )}\n\n          <FormGroup row>\n            <Label sm={3} for=\"settings\">Custom Timeout</Label>\n            <Col sm={9}>\n              <Input\n                type=\"number\"\n                name=\"timeout\"\n                value={props.config.timeout}\n                onChange={(e: ChangeEvent<HTMLInputElement>) => handleChangeTimeout(e.target.value)}\n              />\n              <FormText>\n                In Seconds. Integrations use a sensible default timeout. Only override this carefully!\n                {props.type === 'proxy_bidding' && ' For proxy bidding this only limits the ping; set Post Timeout below for the post.'}\n                {props.type === 'sale_confirmation' && ' Sale confirmations default to 29 seconds and allow up to 50.'}\n              </FormText>\n            </Col>\n          </FormGroup>\n\n          {props.showExcludePii && (\n            <FormGroup row>\n              <Label sm={3} for=\"exclude_pii\">Exclude PII</Label>\n              <Col sm={9}>\n\n                <IconCheckbox\n                  name=\"exclude_pii\"\n                  value={Boolean(props.config.exclude_pii)}\n                  onChange={handleExcludePii}\n                >\n                  Exclude PII\n                </IconCheckbox>\n                <FormText>By checking this box, PII such as phone and email are unavailable to this integration.</FormText>\n              </Col>\n            </FormGroup>\n          )}\n\n        </>\n      )}\n\n\n      {props.allowControls && (\n        <div className=\"d-flex justify-content-end\">\n          {props.isNew === true ? (\n            <>\n              <Button className=\"mt=2 me-2\" size=\"sm\" color=\"link\" onClick={handleCancel} >Cancel</Button>\n              <Button className=\"mt=2 me-2\" size=\"sm\" onClick={handleApply} disabled={!selectedDefinition}>Add</Button>\n            </>\n          ) : (\n            <>\n              {/*  disabled={!props.config.name} */}\n              <Button className=\"mt=2 me-2\" size=\"sm\" color=\"link\" onClick={handleCancel} >Cancel</Button>\n              <Button className=\"mt=2 me-2\" size=\"sm\" onClick={handleApply} disabled={!selectedDefinition}>Apply</Button>\n            </>\n          )}\n        </div>\n      )}\n\n    </Form>\n  );\n};\n\n/*\n * Dropdown for selecting a service (such as for integration), which\n * will change the available settings\n */\ntype ServiceSelectProps = {\n  definitions: IntegrationDefinition[];\n  value: string;\n  hasSettings: boolean;\n  onChange: (name: string) => void;\n  error?: string;\n};\n\nconst ServiceSelect = ({ definitions, value, hasSettings, onChange, error }: ServiceSelectProps) => {\n  if (definitions.length === 0) {\n    return (<span>No integrations are available.</span>);\n  }\n\n  const options = useMemo(() => {\n    return definitions.map(def => {\n      return {\n        value: def.name,\n        label: def.label,\n        type: def.type,\n        status: def.status,\n        product: def.product ? Utils.titleCaseWord(def.product) : '',\n        vertical: def.vertical?.name,\n        account: def.account\n      }\n    })\n  }, [definitions]);\n\n  return (\n    <FormGroup row>\n      <Label sm={3} for=\"integration\">Service</Label>\n      <Col sm={9}>\n\n        <EnhancedSelect\n          value={value}\n          options={options}\n          controlShouldRenderValue\n          isMulti={false}\n          isSearchable\n          onChange={onChange}\n          formatOptionLabel={IntegrationOptionLabel}\n          isInvalid={!!error}\n          invalidFeedback={error}\n          //Archived options shown for BC purposes but won't validate\n          isOptionDisabled={(option: any) => option.status === 'archived'}\n        />\n        {value && hasSettings === false && <FormText>This service has no settings</FormText>}\n\n      </Col>\n    </FormGroup>\n  );\n};\n\n\nconst IntegrationOptionLabel = (option: any, meta: any, selected: boolean) => {\n\n  return (\n    <>\n      <div className=\"d-flex justify-content-between\">\n        <div className=\"d-flex flex-fill\">\n          {meta.context === 'menu' && selected && <div><FaIcon icon=\"check\" size=\"sm\" className=\"me-1\" color=\"green\"/></div>}\n          <div>{option.label}</div>\n        </div>\n        <StatusToggler status={option.status} allowEdit={false} className='me-1'/>\n      </div>\n\n      {meta.context === 'menu' && (\n        <div>\n          <small className=\"text-muted\">\n            {option.value}\n            {option.product && <span> | {option.product}</span>}\n            {option.vertical && <span> | {option.vertical}</span>}\n            {option.account && <span> | {option.account.name}</span>}\n          </small>\n        </div>\n      )}\n    </>\n  )};\n\nIntegrationSettingsEditor.defaultProps = {\n  showExcludePii: true,\n};\n\nexport default IntegrationSettingsEditor;\n","import React from \"react\";\nimport {Badge} from \"reactstrap\";\nimport classnames from \"classnames\";\nimport IntegrationSettingsView from \"./IntegrationSettingsView\";\nimport IntegrationSettingsEditor from \"./IntegrationSettingsEditor\";\nimport {titleCaseWord} from \"../../../utils/string\";\nimport usePermission from \"../../../Hooks/usePermission\";\nimport {IntegrationDefinition, IntegrationConfig} from './types';\nimport {ReactNode} from 'react';\n\ntype IntegrationSettingsProps = {\n  index?: number;\n  type?: string;\n  allowControls?: boolean;\n  editMode?: boolean;\n  isNew?: boolean;\n  showServiceChooser?: boolean;\n  definitions: IntegrationDefinition[];\n  config: IntegrationConfig;\n  onUpdate: (config: IntegrationConfig, index?: number) => void;\n  onDelete: (index: number) => void;\n  errors?: Record<string, string>;\n  willDelete?: boolean;\n  setWillDelete?: (index: number | false) => void;\n  onApply?: () => void;\n  setEdit?: (index: number) => void;\n  allowEdit?: boolean;\n  allowDelete?: boolean;\n  showCombineSales?: boolean;\n  combineSales?: boolean;\n  onCombineSalesChange?: (val: boolean, index?: number) => void;\n  showExcludePii?: boolean;\n};\n\nconst IntegrationSettings = (props: IntegrationSettingsProps) => {\n  const allowEditIntegration = usePermission('integrations.edit');\n\n  const getConfigLabel = (name: string): ReactNode => {\n    const conf = props.definitions.find((c) => c.name === name);\n\n    if (conf) {\n      let label: ReactNode = conf.label;\n      if (conf.status !== \"active\") {\n        label = <span>{label}<Badge color=\"warning\" className=\"ms-1\">{titleCaseWord(conf.status)}</Badge></span>\n      }\n      return label;\n    }\n    return name;\n  };\n\n  return (\n    <div className={classnames(['configuration', 'integration-container', 'flex-fill', props.type], { display: !props.editMode })}>\n      {props.allowEdit && allowEditIntegration && props.editMode ? (\n        <IntegrationSettingsEditor {...props} label={getConfigLabel(props.config.name)} />\n      ) : (\n        <IntegrationSettingsView {...props} label={getConfigLabel(props.config.name)} allowEditIntegration={allowEditIntegration} />\n      )}\n    </div>\n  );\n};\n\nIntegrationSettings.defaultProps = {\n  errors: {},\n  values: {},\n  index: 0,\n  editMode: false,\n  isNew: false,\n  allowControls: true,\n  showServiceChooser: true,\n};\n\nexport default IntegrationSettings;\n","import {IntegrationConfig, IntegrationDefinition, DeprecatedChoice} from './types';\n\n/**\n * Get deprecated settings - keys present in config.settings but not in the\n * matching definition's supported_settings.\n */\nexport const getDeprecatedSettings = (config: IntegrationConfig, definitions: IntegrationDefinition[]): string[] => {\n  if (!config || !config.name || !config.settings || typeof config.settings !== 'object') {\n    return [];\n  }\n\n  if (!Array.isArray(definitions) || definitions.length === 0) {\n    return [];\n  }\n\n  const definition = definitions.find((def) => def.name === config.name);\n  if (!definition) {\n    return [];\n  }\n\n  const supportedNames = Array.isArray(definition.supported_settings)\n    ? definition.supported_settings.map((s) => s.name)\n    : [];\n\n  const configKeys = Object.keys(config.settings);\n\n  return configKeys.filter((key) => !supportedNames.includes(key));\n};\n\n/**\n * Get deprecated choices - choice-type settings where the saved value\n * is no longer among the valid choices in the current definition.\n */\nexport const getDeprecatedChoices = (config: IntegrationConfig, definitions: IntegrationDefinition[]): DeprecatedChoice[] => {\n  if (!config || !config.name || !config.settings || typeof config.settings !== 'object') {\n    return [];\n  }\n\n  if (!Array.isArray(definitions) || definitions.length === 0) {\n    return [];\n  }\n\n  const definition = definitions.find((def) => def.name === config.name);\n  if (!definition || !Array.isArray(definition.supported_settings)) {\n    return [];\n  }\n\n  const deprecated: DeprecatedChoice[] = [];\n\n  definition.supported_settings.forEach((setting) => {\n    if (setting.input_type === 'choice' && Array.isArray(setting.choices)) {\n      const currentValue = config.settings[setting.name];\n      if (currentValue && !setting.choices.some((c) => c.value === currentValue)) {\n        deprecated.push({\n          name: setting.name,\n          label: setting.label,\n          currentValue,\n        });\n      }\n    }\n  });\n\n  return deprecated;\n};\n","import React, {useEffect, useState} from \"react\";\nimport {Button, Tooltip} from \"reactstrap\";\n\n\ntype ApplyOrRefreshButtonProps = {\n  pendingApply:boolean;\n  isLoading:boolean;\n  onRefresh: ()=>void;\n  onApply:()=>void;\n}\n\n/*\n * Button that can toggle between applying a filter change or refreshing current filters.\n * Can show a \"click to apply\" tooltip when it switches to Apply mode.\n *\n * Used for lists with complex filtering or longer load times, where we don't want every\n * filter tweak to trigger data fetch\n */\nconst ApplyOrRefreshButton = ({\n                                pendingApply,\n                                isLoading,\n                                onRefresh,\n                                onApply,\n}:ApplyOrRefreshButtonProps) => {\n  let tooltipTimer:number|null;\n  const[showTip, setShowTip] = useState(false);\n\n  const handleClick = () => {\n    if (pendingApply) {\n      onApply()\n    } else {\n      onRefresh();\n    }\n  }\n\n  useEffect(()=>{\n    if (!isLoading && pendingApply) {\n      setShowTip(true);\n\n      if (tooltipTimer) {\n        tooltipTimer = null;\n      }\n      tooltipTimer = window.setTimeout(()=>setShowTip(false), 5000);\n    } else if (isLoading) {\n      tooltipTimer=null;\n      setShowTip(false);\n    }\n  }, [pendingApply, isLoading])\n\n  // <FaIcon icon=\"sync\" />\n  return (\n    <>\n      <Button size=\"sm\" color=\"primary\" onClick={handleClick} disabled={isLoading} id=\"btn-exec-filters\">\n        {pendingApply ? \"Apply\" : \"Refresh\"}\n      </Button>\n      <Tooltip\n        placement=\"top\"\n        isOpen={showTip}\n        target=\"btn-exec-filters\"\n        // toggle={toggleApplyTip}\n        trigger=\"none\"\n        disabled={!pendingApply}\n      >\n        Click to Apply\n      </Tooltip>\n    </>\n  )\n}\n\nexport default ApplyOrRefreshButton\n","import React, {FC} from 'react';\nimport {Row, Col, UncontrolledDropdown, DropdownToggle,DropdownItem, DropdownMenu} from \"reactstrap\";\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\n\n/*\n * Dropdown selector for picking table columns to be shown\n *\n * (Actually we are managing hidden columns, as that is what react-table wants to know)\n */\nexport type ColumnSelectorDef = {\n  id:string,\n  label:string,\n}\ntype ColumnSelectProps = {\n  columns:ColumnSelectorDef[],\n  hiddenColumns:string[],\n  onChange:any,\n  loading?:boolean\n}\n\nexport const ColumnSelect:FC<ColumnSelectProps> = ({\n  columns,\n  hiddenColumns = [],\n  onChange,\n  loading\n}) => {\n\n  const handleSelect = (colId:string) => {\n\n    if (hiddenColumns.includes(colId)) {\n      onChange(hiddenColumns.filter((c:string) => c !== colId))\n    } else {\n      onChange([...hiddenColumns, colId])\n    }\n\n  }\n\n  return (\n    <UncontrolledDropdown className=\"column-select\">\n      <DropdownToggle color=\"link\" size=\"sm\" caret disabled={loading}>Columns</DropdownToggle>\n      <DropdownMenu>\n        {/* Toggle=false on DropdownItem to prevent menu from closing on pick */}\n        {columns.map((col:ColumnSelectorDef, i:number) => (\n          <DropdownItem key={i} toggle={false} onClick={() => handleSelect(col.id)}>\n            <Row className=\"align-items-center\">\n              <Col sm={2}>\n                {hiddenColumns.includes(col.id) ? '' : <FaIcon icon='check' />}\n              </Col>\n              <Col>\n                {col.label}\n              </Col>\n            </Row>\n\n          </DropdownItem>\n        ))}\n      </DropdownMenu>\n    </UncontrolledDropdown>\n  )\n}\n","import React, {FC} from 'react';\n\n//Small inline display of ID value, usually shown with the entity name\ntype EntityIdProps = {\n  id?:number|string;\n  title?:string;\n  className?:string;\n}\n\nconst EntityId:FC<EntityIdProps> = ({ id, title=\"ID value\", className=\"\" }) => (\n  id ? <span className={`entity-id ${className}`} title={title}>{id}</span> : null\n);\n\nexport default EntityId;\n","import { useContext, useEffect, useCallback, useRef } from 'react';\nimport { ChangeContext } from '../Providers/ChangeProvider';\nimport type { ChangeTimelineEntityType } from '../Providers/ChangeProvider';\n\ntype UseChangeTimelineConfig = {\n  entityTypes: string[];\n  parentFilters?: Record<string, any>;\n  // Pre-filter the timeline to a specific entity (e.g. on Edit/Show pages)\n  entity?: ChangeTimelineEntityType;\n  // Pass false to skip drawer registration (e.g. when component is used as a modal)\n  enabled?: boolean;\n  defaultMode?: 'date_range' | 'most_recent';\n  defaultMostRecent?: number;\n};\n\nexport const useChangeTimeline = (config: UseChangeTimelineConfig) => {\n  const ctx = useContext(ChangeContext);\n  const configRef = useRef(config);\n  configRef.current = config;\n  const prevFiltersJson = useRef<string>('');\n\n  const prevEntityId = useRef<string | number | undefined>(undefined);\n\n  // Register this page's configuration on mount, deregister on unmount\n  useEffect(() => {\n    if (configRef.current.enabled === false) return;\n    const filtersJson = JSON.stringify(configRef.current.parentFilters ?? {});\n    prevFiltersJson.current = filtersJson;\n    prevEntityId.current = configRef.current.entity?.id;\n    ctx.setDrawerConfig({\n      entityTypes: configRef.current.entityTypes,\n      parentFilters: configRef.current.parentFilters ?? {},\n      entity: configRef.current.entity,\n      defaultMode: configRef.current.defaultMode,\n      defaultMostRecent: configRef.current.defaultMostRecent,\n    });\n\n    return () => {\n      ctx.setDrawerConfig(null);\n      ctx.closeDrawer();\n    };\n  }, []);\n\n  // Keep parentFilters in sync when they actually change (deep comparison)\n  const filtersJson = JSON.stringify(config.parentFilters ?? {});\n  useEffect(() => {\n    if (config.enabled === false) return;\n    if (filtersJson === prevFiltersJson.current) return;\n    prevFiltersJson.current = filtersJson;\n    ctx.setDrawerConfig({\n      entityTypes: configRef.current.entityTypes,\n      parentFilters: config.parentFilters ?? {},\n      entity: configRef.current.entity,\n      defaultMode: configRef.current.defaultMode,\n      defaultMostRecent: configRef.current.defaultMostRecent,\n    });\n  }, [filtersJson]);\n\n  // Keep entity in sync when it changes (e.g. async load on Edit/Show pages)\n  useEffect(() => {\n    if (config.enabled === false) return;\n    if (config.entity?.id === prevEntityId.current) return;\n    prevEntityId.current = config.entity?.id;\n    ctx.setDrawerConfig({\n      entityTypes: configRef.current.entityTypes,\n      parentFilters: configRef.current.parentFilters ?? {},\n      entity: config.entity,\n      defaultMode: configRef.current.defaultMode,\n      defaultMostRecent: configRef.current.defaultMostRecent,\n    });\n  }, [config.entity?.id]);\n\n  const openChanges = useCallback((entity?: ChangeTimelineEntityType) => {\n    ctx.openChanges(entity);\n  }, [ctx.openChanges]);\n\n  return {\n    openChanges: config.enabled !== false ? openChanges : () => {},\n    closeChanges: ctx.closeDrawer,\n    isOpen: ctx.isDrawerOpen,\n    allowViewChanges: config.enabled !== false ? ctx.allowViewChanges : false,\n    // Always available — even when enabled:false (e.g. modal components that mutate data)\n    notifyChange: ctx.notifyChange,\n  };\n};\n","\ntype UserFiltersOptions = {\n  defaultFilters?:Record<string, any>,\n  keepFilters?:string[]\n}\n\nexport const useFilters = (\n  filters:Record<string, any>,\n  onChangeCallback:(filters:Record<string, any>) => void,\n  options:UserFiltersOptions={}\n) => {\n\n  const onChangeFilter = (param:string, value:any) => {\n    const newValues = { ...filters };\n    if (Array.isArray(value) && !value.length) value = null;\n\n    if (value) {\n      newValues[param] = value;\n    } else if (param in filters) {\n      delete newValues[param];\n    }\n\n    onChangeCallback(newValues);\n  };\n\n  const clearFilter = (filter:string) => {\n    const newValues = { ...filters };\n    if (typeof newValues[filter] !== undefined) {\n      delete newValues[filter];\n      onChangeCallback(newValues);\n    }\n  };\n  const clearSearch = () => onChangeFilter('search', '');\n\n  const reset = () => {\n    let newFilters:Record<string, any> = {}\n    const defaults = options.defaultFilters ?? {}\n    if (options.keepFilters) {\n      newFilters = { ...defaults }\n      options.keepFilters.forEach((filter) => {\n        if (filters[filter]) newFilters[filter] = filters[filter]\n      })\n    }\n    onChangeCallback(newFilters ?? defaults)\n  }\n\n  return {\n    clearFilter,\n    clearSearch,\n    reset,\n    onChangeFilter\n  }\n}\n\n","import { useState, useEffect, useCallback } from 'react';\nimport isEqual from 'react-fast-compare';\nimport {set} from 'lodash';\nimport {AnySchema, ValidationError} from \"yup\";\n\n/*\n * This type allows errors to be matched to form sections, useful for complicated forms with tabs, etc\n * where error messages need to be placed or tabs activated.\n * Object with form of { sectionName: ['field1', 'field2'] }\n */\ntype FormSectionToFieldMapType = {\n  [key:string]: string[];\n}\n\n\n/*\n * Hook that maintains the state of a form's values,\n * provides change and submit handler, and validation from YUP schema\n * Usage:\n * const{formApi, formIsValid, formValues, formErrors} = useFormState({}, validationSchema);\n *    - optionally provide initial values and validationSchema object\n *    - use handleChange for your form fields, and values for your form values\n *\n * Call validation, optionally provide context data needed for YUP validation\n * const isValid = validate({someExtraData});\n */\nconst useFormState = (\n  initialValues: any = {},\n  schema?: AnySchema,\n  onChangeCallback?: (...args: any[]) => any,\n  formSectionMap?: FormSectionToFieldMapType ,\n  contextData?: any,\n) => {\n  const [isValid, setIsValid] = useState<boolean>(true);\n  const [values, setValues] = useState<any>(initialValues);\n  const [startValues, setStartValues] = useState<any>(initialValues);\n  const [isDirty, setIsDirty] = useState<boolean>(false);\n  // errors: field names and their error messages\n  const [errors, setErrors] = useState<any>({});\n  // errorSections: some forms have tabbed sections and we want to indicate when tab has errored fields\n  // (relies on formSectionMap arg, an object mapping tab ids to arrays of field names)\n  const [errorSections, setErrorSections] = useState<any>([]);\n  // Yup allows 'context' info to be passed, for when field validation depends on external data\n  const [validationContext, setValidationContext] = useState(contextData);\n\n  useEffect(() => {\n    const dirty = !isEqual(values, startValues);\n    setIsDirty(dirty);\n  }, [values]);\n\n  const handleOnSubmit = (event: any) => {\n    if (event) event.preventDefault();\n    return validate();\n  };\n\n  /*\n   * Typically we would get an event,  onChange={handleOnChange}\n   * But some special purpose form widgets have different ideas,\n   * so you can provide the field name and value instead.\n   * onChange={()=>handleOnChange('field_name', val)}\n   *\n   * useCallback to keep reference as it is passed down to subcomponents\n   */\n  const handleOnChange = useCallback((eventOrName: any, value = null) => {\n    let fieldName:string;\n    let fieldValue: any;\n    if (typeof eventOrName === 'string') {\n      // handle as name & value\n      // setValues(values => ({ ...values, [eventOrName]: value }));\n      fieldName = eventOrName;\n      fieldValue = value;\n    } else {\n      // handle as event\n      eventOrName.persist();\n      fieldName = eventOrName.target.name;\n      // fieldValue = (eventOrName.target.type === 'checkbox') ? !!eventOrName.target.checked : eventOrName.target.value;\n      if (eventOrName.target.type === 'checkbox') {\n        fieldValue = !!eventOrName.target.checked\n      } else if (eventOrName.target.type === 'number') {\n        fieldValue = parseInt(eventOrName.target.value)\n      } else {\n        fieldValue = eventOrName.target.value\n      }\n      // setValues(values => ({ ...values, [eventOrName.target.name]: eventOrName.target.value }));\n    }\n    // console.log('useFormState.js: onChange fieldName, fieldValue', fieldName, fieldValue);\n\n    if (fieldName) {\n      //setValues((values: any) => ({ ...values, [fieldName]: fieldValue }));\n      setValues((currentValues:any) => {\n        return set({ ...currentValues }, fieldName, fieldValue);\n      })\n\n      // If field is previously errored just remove the field error. It will be validated later on submit.\n      //\n      // Note: error keys might not match field name, for example,\n      // fieldName could be 'bidding' but errorField from YUP is 'bidding.absolute_bid'.\n      // This is because in this case a group of fields are evaluated as an object.\n      const currentErrors = {};\n      Object.entries(errors).map(([errorField, err]) => {\n        if (errorField.split('.')[0] !== fieldName) {\n          // @ts-ignore\n          currentErrors[errorField] = err;\n        }\n      });\n\n      setErrors(currentErrors);\n      setIsValid(Object.keys(currentErrors).length === 0);\n\n      validateFormSections(Object.keys(currentErrors));\n    }\n\n    if (typeof onChangeCallback === 'function' && fieldName) {\n      // @ts-ignore\n      onChangeCallback(fieldName, fieldValue);\n    }\n  }, [errors]);\n\n  // Alias for onChange, use for setting a value outside of form change events\n  const setValue = (name: string, value: any) =>  handleOnChange(name, value);\n\n  // Set back to original state (or create a new initial value state)\n  const clearForm = (newValues?:any) => {\n    setErrors({});\n    setErrorSections([]);\n    if (newValues) {\n      setStartValues(newValues);\n      setValues(newValues);\n    } else {\n      setValues(startValues);\n    }\n\n    setIsValid(true);\n    setIsDirty(false);\n  };\n\n\n  // Useful for setting errors raised outside of Yup schema\n  const setError = (field: string, message: string) => {\n    setIsValid(false);\n    setErrors((prev: any) => {\n      const updatedErrors = { ...prev, [field]: message };\n      validateFormSections(Object.keys(updatedErrors));\n      return updatedErrors;\n    });\n  };\n\n  // validates all form fields\n  const validate = () => {\n    if (!schema) return true;\n\n    const errors = yupValidate();\n    const isValid = Object.keys(errors).length === 0;\n    setIsValid(isValid);\n    setErrors(errors);\n    validateFormSections(Object.keys(errors));\n\n    return isValid;\n  };\n\n  // Finds the form sections (if defined) that have errored fields\n  const validateFormSections = (errorFields: any) => {\n    if (!formSectionMap) return;\n\n    const ids:string[] = [];\n\n    Object.entries(formSectionMap).map(([section, fields]) => {\n      if (errorFields.some((err: string) => fields.includes(err))) {\n        ids.push(section);\n      }\n    });\n\n    setErrorSections((prev: string[]) => isEqual(prev, ids) ? prev : ids);\n  };\n\n  const isSectionValid = useCallback((section: string) => !errorSections.includes(section), [errorSections]);\n\n  // Do YUP validation\n  const yupValidate = () => {\n    let errors = {};\n    if (schema) {\n      try {\n        // await schema.validate(values, { abortEarly: false }) //ASYNC: add async to validate_yup if  using ths\n        schema.validateSync(values, { abortEarly: false, stripUnknown: true, context: validationContext });\n      } catch (err: any) {\n        // console.log('useFormValidation.js:validate_yup, catch err.inner', err.inner);\n        if (err?.inner) {\n          errors = err.inner.reduce((formError:any, innerError: ValidationError) => ({\n            ...formError,\n            [innerError.path as string]: innerError.message,\n          }), {});\n        }\n      }\n    }\n\n\n    return errors;\n  };\n\n  return {\n    formApi: {\n      handleOnSubmit,\n      handleOnChange,\n      setValidationContext,\n      setValues,\n      setValue,\n      setError,\n      validate,\n      clearForm,\n      isSectionValid,\n    },\n    validationContext,\n    formIsDirty: isDirty,\n    formIsValid: isValid,\n    formValues: values,\n    formErrors: errors,\n    formErrorSections: errorSections,\n  };\n};\n\nexport default useFormState;\n","import {useCallback, useEffect, useState} from 'react';\nimport LocalStorageService from \"../Services/LocalStorageService\";\n\n/*\n * Hook for reading and setting a value in local storage.\n * Handles changes across tabs.\n * Shamelessly inspired by https://synth.app/blog/uselocalstorage-hooks-are-nice\n * and https://github.com/juliencrn/usehooks-ts/blob/master/packages/usehooks-ts/src/useLocalStorage/useLocalStorage.ts\n *\n * Usage:\n * const [mySetting, setMySetting] = useLocalStorage(\"MY_SETTING\", {\"gofish\":true});\n * // If there is an external change to mySetting (such as another tab sets it)\n * // then mySetting will change here (you will need a useEffect watcher to handle it)\n */\nconst useLocalStorage = <T = any>(key: string, initialValue?: T): [T, (val: T) => void] => {\n\n// pull the initial value from local storage if it is already set\n  const [storedValue, setStoredValue] = useState<T>(() => {\n    if(!key) return initialValue as T;\n    const exValue = LocalStorageService.getLocalItem(key)\n    if (typeof exValue === 'undefined') {\n      return typeof initialValue === 'undefined' ? null : initialValue;\n    }\n    return exValue;\n  })\n\n\n  const handleStorageChange = useCallback((evt:StorageEvent|CustomEvent) => {\n    if (key) {\n      if (!(evt as StorageEvent)?.key || (evt as StorageEvent).key !== key) {\n        return\n      }\n      setStoredValue(LocalStorageService.getLocalItem(key))\n    }\n\n  }, []);\n\n  // install the listeners for external changes (such as other tabs)\n  useEffect(() => {\n\n    // \"storage\" event is a special browser event triggered by changes in OTHER tabs, not current\n    window.addEventListener(\"storage\", handleStorageChange)\n    // for current tab, custom event\n    window.addEventListener(\"local-storage\", handleStorageChange)\n\n    // stop listening on unmount\n    return () => {\n      window.removeEventListener(\"storage\", handleStorageChange)\n      window.removeEventListener(\"local-storage\", handleStorageChange)\n    }\n  }, [storedValue])\n\n\n\n  const setValue = (val: T) => {\n    if (key) {\n      LocalStorageService.setLocalItem(key, val);\n      setStoredValue(val);\n      window.dispatchEvent(new Event('local-storage'));\n    } else {\n      setStoredValue(val);\n    }\n\n  }\n\n  return [storedValue, setValue]\n}\n\nexport default useLocalStorage;\n\n","import { useContext } from 'react';\nimport { AppContext } from '../Providers/AppProvider';\n\nconst usePermission = (perm: string): boolean => {\n  const appContext = useContext(AppContext);\n  if (!perm) return false;\n  return appContext.permissions.includes(perm);\n};\n\nexport default usePermission;\n","import { useState, useMemo, useRef } from \"react\";\nimport { parse, stringify } from \"query-string\";\nimport type { ParseOptions, StringifyOptions } from 'query-string';\nimport { useNavigate, useLocation } from \"react-router-dom\";\n\nconst baseParseConfig: ParseOptions = {\n  parseNumbers: true, // \"foo=1\" => {foo:1}\n  parseBooleans: true, // \"foo=true\" => {foo:true}\n};\n\nconst baseStringifyConfig: StringifyOptions = {\n  skipNull: true,\n  skipEmptyString: true,\n};\n\n\ntype useQueryStateOptionsType = {\n  historyAction?: \"push\" | \"replace\";\n  parseOptions?: ParseOptions;\n  stringifyOptions?: StringifyOptions;\n  disableQuery?:boolean;\n}\nexport type useQueryStatePropsType = {\n  initialState: any;\n  options?: useQueryStateOptionsType;\n\n};\n\nconst useQueryState = (\n  initialState: any = {},\n  options: useQueryStateOptionsType = {},\n) => {\n  const [, setFakeState] = useState({}); //forces re-render\n  const initialStateRef = useRef({ ...initialState });\n  const { historyAction = 'push', parseOptions, stringifyOptions } = options;\n  // options like {arrayFormat: 'bracket'}, see https://github.com/sindresorhus/query-string\n  const mergedParseOptions = { ...baseParseConfig, ...parseOptions };\n  const mergedStringifyOptions = { ...baseStringifyConfig, ...stringifyOptions };\n  const navigate = useNavigate();\n  const location = useLocation();\n\n\n  // The current URL query parsed into an object, updates when URL changes\n  // From: https://github.com/alibaba/hooks/blob/master/packages/use-url-state/src/index.ts\n  const queryFromUrl = useMemo(() => {\n    return parse(location.search, mergedParseOptions);\n  }, [location.search]);\n\n  // The query state object, derived from initial state and current URL\n  const query = useMemo(\n\n    () => {\n      return {\n        ...initialStateRef.current,\n        ...queryFromUrl,\n      }\n\n    },\n    [queryFromUrl],\n  );\n\n  const setQuery = (params: any, action:string=historyAction) => {\n    const newQuery = typeof params === 'function' ? params(query) : params;\n    /* If search does not change after setState, update is required to trigger an update.\n    For example, if demo1 directly clicks clear, update is required to trigger the update.\n     The updates of update and history will be merged and will not cause multiple updates */\n    setFakeState({});\n\n\n    // @ts-ignore\n    navigate({\n      replace: action === 'replace',\n      hash: location.hash,\n      search: stringify(newQuery , mergedStringifyOptions) || '?',\n    });\n  };\n\n  return [ query, setQuery ] as const;\n}\n\nexport default useQueryState;\n","import { useState, useEffect } from 'react';\nimport useApi from './useApi';\n\nexport type ReturnReasonType = {\n  name: string;\n  label: string;\n  product: string | null;\n};\n\nexport type ReturnDenyReasonType = {\n  name: string;\n  label: string;\n  disputable: boolean;\n  system_assigned: boolean;\n};\n\ntype ReasonLists = {\n  reasons: ReturnReasonType[];\n  denyReasons: ReturnDenyReasonType[];\n};\n\nlet cached: Promise<ReasonLists | null> | null = null;\n\nconst loadReasonLists = (api: any): Promise<ReasonLists | null> => {\n  if (!cached) {\n    cached = Promise.all([\n      api.endpoints.saleReturns.reasons(),\n      api.endpoints.saleReturns.denyReasons(),\n    ]).then(([reasons, denyReasons]) => {\n      if (!reasons || !denyReasons) {\n        cached = null;\n        return null;\n      }\n      return {reasons, denyReasons};\n    });\n  }\n  return cached;\n};\n\nexport const useReturnReasons = (product?: string) => {\n  const {api} = useApi();\n  const [lists, setLists] = useState<ReasonLists>({reasons: [], denyReasons: []});\n  const [loaded, setLoaded] = useState<boolean>(false);\n\n  useEffect(() => {\n    let active = true;\n    loadReasonLists(api).then((result) => {\n      if (!active) {\n        return;\n      }\n      if (result) {\n        setLists(result);\n      }\n      setLoaded(true);\n    });\n    return () => {\n      active = false;\n    };\n  }, []);\n\n  const reasons = product\n    ? lists.reasons.filter((r) => !r.product || r.product === product)\n    : lists.reasons;\n\n  const getLabel = (name: string) => lists.reasons.find((r) => r.name === name)?.label\n    || lists.denyReasons.find((r) => r.name === name)?.label\n    || name;\n\n  return {\n    loaded,\n    reasons,\n    denyReasons: lists.denyReasons,\n    getLabel,\n  };\n};\n","import { useState, useEffect } from 'react';\nimport {VerticalType} from \"../types\";\nimport useApi from \"./useApi\";\n\n/*\n * Helper to translate a vertical id to name or display name\n */\nexport const useVerticals = () => {\n  const {api} = useApi();\n  const [loaded, setLoaded] = useState<boolean>(false);\n  const [verticals, setVerticals] = useState<VerticalType[]>([])\n\n  useEffect(() => {\n    load();\n  }, [])\n\n  const load = async () => {\n    const result = await api.endpoints.verticals.list();\n    if (result) {\n      setVerticals(result);\n    }\n    setLoaded(true);\n  }\n\n  const getDisplayName = (verticalId:number) => {\n    const vert = verticals.find((v) => v.id.toString() === verticalId.toString())\n    return vert ? vert.display_name : ''\n  }\n\n  const getName = (verticalId:number) => {\n    const vert = verticals.find((v) => v.id.toString() === verticalId.toString())\n    return vert ? vert.name : ''\n  }\n\n\n  return {\n    loaded,\n    verticals,\n    getDisplayName,\n    getName\n  }\n}\n\n\n","import React from \"react\";\nimport {Link} from \"react-router-dom\";\nimport {Breadcrumb, BreadcrumbItem} from 'reactstrap'\nimport type {BreadcrumbData} from \"../types\";\n\ninterface BreadcrumbsProps {\n  crumbs?:BreadcrumbData[]\n}\n\n/*\n * Simple Breadcrumbs component that builds breadcrumb links from an array of link data.\n * Usage:\n * <Breadcrumbs crumbs={[\n *      {label: \"Input Schemas\", to: \"/tools/inputschema\"},\n *      {label: schema.name, to: `/tools/inputschema/${schema.id}`},\n *      {label: isNew ? \"Create\" : \"Edit\"}, //no \"to\" means no link\n *    ]} />\n *  Produces: Input Schemas > Auto Schema > Edit\n *\n * Ideally we would use the react-router-dom's route \"handle\" data, which can define crumbs,\n * along with the \"useMatches\" hook to get the hierarchy.\n * However this doesn't seem to work with our current routing configuration and react-router 6.2.\n * The hook only returns a handle definition from the very top level route (index.js)\n *\n * The problem might be related to wildcards: https://github.com/remix-run/react-router/issues/8903\n */\nconst Breadcrumbs: React.FC<BreadcrumbsProps> = ({ crumbs }) => {\n  if (!crumbs || crumbs.length === 0) {\n    return null;\n  }\n\n  return (\n    <Breadcrumb listTag=\"div\">\n      {crumbs.map((bc, i) => (\n        <React.Fragment key={i}>\n          {bc.to ? (\n            <BreadcrumbItem\n              active={i === crumbs.length-1}\n              tag={Link}\n              to={bc.to}\n              state={bc.state}\n            >\n              {bc.label}\n            </BreadcrumbItem>\n          ) : (\n            <BreadcrumbItem\n              active={i === crumbs.length-1}\n              tag={'span'}\n            >\n              {bc.label}\n            </BreadcrumbItem>\n          )}\n        </React.Fragment>\n\n      ))}\n    </Breadcrumb>\n  );\n};\n\nexport default Breadcrumbs;\n","import React, {FC, useState, useEffect, useRef, useCallback} from 'react'\nimport {Button, UncontrolledTooltip} from 'reactstrap'\nimport {createPortal} from 'react-dom'\nimport useLocalStorage from '../Hooks/useLocalStorage'\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport classnames from 'classnames'\n\nexport const DrawerContext = React.createContext({isOpen:false});\n\ntype DrawerProps = {\n  isOpen: boolean;\n  onClose: () => void;\n  title?: string;\n  className?: string;\n  openerFn?:()=>void;\n  children?: React.ReactNode;\n};\n\n//TODO: while dragging you lose the hover style on the handle because the cursor moves beyond the handle. Maybe apply 'dragging' class\nexport const Drawer:FC<DrawerProps> = ({\n                                         isOpen,\n                                         onClose,\n                                         openerFn,\n                                         className='',\n                                         title='',\n                                         children\n}) => {2\n\n  const [isMounted, setIsMounted] = useState(false);\n  const [panelWidth, setPanelWidth] = useLocalStorage('mst_drawer_panel_width', 480);\n  const drawerRef = useRef<HTMLDivElement>(null);\n  const isResizing = useRef(false);\n\n  useEffect(() => {\n    setIsMounted(true);\n\n    const handleClickOutside = (event: MouseEvent) => {\n\n      if (drawerRef.current && !drawerRef.current.contains(event.target as Node) ) {\n\n        // Also do this more expensive path check. For some reason the svg 'clear' buttons in the react-select filters\n        // are read as outside the drawer, though they don't appear to be.\n        // This cost me hours and I'm very salty about it\n        const path = event.composedPath();\n        if (!path.includes(drawerRef.current)) {\n          // Don't close if the click landed inside a floating element (Popover, DropdownMenu)\n          // portal-rendered to document.body from within the drawer. RangeBoundary's Popover is\n          // the known case: it omits container so Reactstrap portals it outside the drawer DOM.\n          if ((event.target as Element).closest?.('.popover, .dropdown-menu')) return;\n          onClose();\n        }\n      }\n    };\n\n    if(isOpen){\n      document.addEventListener('mousedown', handleClickOutside);\n    }\n    return () => {\n      //document.body.style.overflow = 'unset';\n      document.removeEventListener('mousedown', handleClickOutside);\n      setIsMounted(false);\n    };\n  }, [isOpen, onClose]);\n\n  const handleMouseDown = useCallback((event: React.MouseEvent) => {\n    isResizing.current = true;\n    document.addEventListener('mousemove', handleMouseMove);\n    document.addEventListener('mouseup', handleMouseUp);\n  }, []);\n\n  const handleMouseMove = useCallback((event: MouseEvent) => {\n    if (isResizing.current) {\n      //TODO: set minimum width\n      const newWidth = window.innerWidth - event.clientX;\n      setPanelWidth(newWidth);\n    }\n  }, [setPanelWidth]);\n\n  const handleMouseUp = useCallback(() => {\n    isResizing.current = false;\n    document.removeEventListener('mousemove', handleMouseMove);\n    document.removeEventListener('mouseup', handleMouseUp);\n  }, [handleMouseMove]);\n\n  const drawerContent = (\n    <DrawerContext.Provider value={{isOpen}}>\n\n    <div\n      className={classnames('mst-drawer d-flex flex-nowrap', className, {open:isOpen})}\n      aria-hidden={isOpen ? \"false\" : \"true\"}\n      style={{width: `${panelWidth}px`}}\n      ref={drawerRef}\n      id=\"mst-drawer\"\n    >\n      {/* Optional tab that sits at browser right edge, opens panel on click.  */}\n      {/* TODO: if we have multiple drawers we should have props for tab tooltip text & target, icon, positioning */}\n      {openerFn && (\n        <div className=\"drawer-tab\" id=\"change-tab\">\n          <Button className=\"inline\" color=\"link\" onClick={openerFn}>\n            <FaIcon icon=\"history\" size=\"1x\" />\n          </Button>\n          <UncontrolledTooltip target=\"change-tab\" placement=\"left\">\n            Change History\n          </UncontrolledTooltip>\n        </div>\n      )}\n\n      <div className=\"drawer-handle flex-shrink-1\" onMouseDown={handleMouseDown}>\n        <div className=\"drawer-grip\" />\n      </div>\n\n      <div className=\"drawer-body flex-fill\">\n        <div className=\"drawer-header d-flex justify-content-between align-items-center\">\n          <h4>{title}</h4>\n          <Button onClick={onClose}  className=\"inline\" color=\"link\" size=\"lg\">\n            <FaIcon icon=\"times\" size=\"sm\" />\n          </Button>\n\n        </div>\n\n        <div className=\"drawer-content\">\n          {children}\n        </div>\n      </div>\n    </div>\n    </DrawerContext.Provider>\n  );\n\n  return isMounted  ? createPortal(drawerContent, document.body) : null;\n}\n","import React, {FC, useState, useEffect, useRef} from 'react'\nimport {Button} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames'\n/*\n *  A collapsible panel that hides its children when closed.\n *  Uses the scrollHeight of the children to animate the opening and closing.\n *  Shows a label and toggle button when closed.\n *\n *  There is a controlled and uncontrolled version of this component.\n *  Use the controlled version if the parent needs to control the open state.\n */\ntype BaseHideawayPanelProps = {\n  children: React.ReactNode;\n  label:string|React.ReactNode;\n  className?: string;\n  headerClassName?:string;\n  innerStyle?: React.CSSProperties;\n  disabled?:boolean;\n}\n\ntype UncontrolledHideawayPanelProps = BaseHideawayPanelProps & {\n  startOpen?: boolean;\n}\n\ntype HideawayPanelProps = BaseHideawayPanelProps & {\n  isOpen?: boolean;\n  onToggle: (isOpen:boolean) => void;\n}\n\n\nexport const UncontrolledHideawayPanel:FC<UncontrolledHideawayPanelProps> = (props) => {\n  const {startOpen, children,...restProps} = props\n  const [isOpen, setIsOpen] = useState(startOpen);\n\n  return (\n    <HideawayPanel isOpen={isOpen} onToggle={setIsOpen} {...restProps}>\n      {children}\n    </HideawayPanel>\n  )\n\n}\n\nexport const HideawayPanel:FC<HideawayPanelProps> = ({\n  label,\n  isOpen=false,\n  onToggle,\n  children,\n  className='',\n  headerClassName='',\n  innerStyle={},\n  disabled\n\n}) => {\n  const panelRef = useRef<HTMLDivElement>(null);\n  const [isFirstRender, setIsFirstRender] = useState(true);\n  const [height, setHeight] = useState(isOpen ? 'auto' : '0px');\n\n  // Set content height based on isOpen prop\n  useEffect(() => {\n\n    // We may be at auto height at first, which won't animate. Set to current content height.\n    if (isFirstRender) {\n      setIsFirstRender(false);\n      if (isOpen && panelRef.current) {\n        const panel = panelRef.current;\n        setTimeout(() => setHeight(panel.scrollHeight + \"px\"), 250);\n      }\n    }\n\n    if (panelRef.current && !isFirstRender) {\n      if (isOpen) {\n        setHeight(panelRef.current.scrollHeight + \"px\")\n      } else {\n        setHeight('0px')\n      }\n\n    }\n  }, [isOpen, children]);\n\n  return (\n    <div className={`hideaway-panel ${className}`}>\n      <div className={classnames('hp-header d-flex align-items-center', headerClassName, {\"mb-1\":isOpen})}>\n        {label}\n        <Button color=\"link\" className=\"ms-1 inline hp-toggle\" onClick={()=>onToggle(!isOpen)} disabled={disabled}>\n          <FaIcon icon={isOpen ? 'chevron-circle-up' : 'chevron-circle-down'} />\n        </Button>\n      </div>\n\n      <div\n        className=\"hp-content\"\n        ref={panelRef}\n        style={{height}}\n      >\n        <div className=\"hp-content-inner\" style={innerStyle}>\n        {children}\n        </div>\n      </div>\n\n    </div>\n  );\n}\n","import React from 'react';\nimport {Button} from 'reactstrap';\nimport { FontAwesomeIcon as FaIcon } from '@fortawesome/react-fontawesome';\nimport classnames from 'classnames';\nimport useLocalStorage from \"../Hooks/useLocalStorage\";\n\ntype PageSectionPropsType = {\n  title?:string|React.ReactNode;\n  subtitle?:string|React.ReactNode;\n  className?:string;\n  tools?:any;\n  children: React.ReactNode;\n  sectionNav?: React.ReactNode;\n  storageKey?:string,\n  expandable?:boolean;\n  expanded?:boolean;\n  onToggle?: (expanded:boolean) => void;\n  keepMounted?: boolean;\n}\n\n\n/*\n * Component for Card layout wrapping a unit of content on the page\n * Can have a title, buttons, or tabs\n *\n */\nconst PageSection = ({\n                       title=\"\",\n                       subtitle=\"\",\n                       children,\n                       tools,\n                       sectionNav,\n                       className,\n                       storageKey=\"\",\n                       expandable,\n                       expanded,\n                       onToggle,\n                       keepMounted,\n                     }:PageSectionPropsType) => {\n\n  // Storing expand state in local storage is optional;\n  // If key is empty,hook will act like useState\n  const [isExpanded, setExpanded] = useLocalStorage(storageKey, expandable ? Boolean(expanded) : true);\n  const toggleExpanded = (expanded:boolean) => {\n    setExpanded(expanded)\n    onToggle && onToggle(expanded)\n  }\n\n  return (\n    <div className={classnames([\"page-section\", \"card\", className], {expandable, show:expandable && isExpanded, collapsed:!isExpanded})}>\n\n        {sectionNav !== undefined\n        && (\n          <div className=\"page-section-nav\">\n            {sectionNav}\n          </div>\n        )}\n\n        {title && (\n          <div className={classnames(\"page-section-header d-flex align-items-center justify-content-between\", {\"m-0\": !isExpanded})}>\n\n            <h5 className=\"page-title\">\n              {title}\n              {subtitle && <span className=\"subtitle\">{subtitle}</span>}\n              {expandable &&\n              <Button size=\"1x\"  color=\"link\"  className=\"inline ms-2\" onClick={()=>toggleExpanded(!isExpanded)}>\n                <FaIcon icon={`chevron-circle-${isExpanded ? 'up' : 'down'}`} size=\"1x\"  />\n              </Button>}\n            </h5>\n\n            {tools !== undefined\n            && isExpanded && (\n              <div className=\"page-section-tools\">\n                {tools}\n              </div>\n            )}\n          </div>\n        )}\n\n        {/* keepMounted: keep children in the DOM when collapsed rather than unmounting them.\n            Use for expensive children that should not re-initialize on every expand — e.g.\n            charts with heavy plugin setup or components that fetch data on mount.\n            Without this, every expand triggers a full remount.\n            NOTE: height:0+overflow:hidden (not display:none) is intentional — display:none removes\n            elements from layout and causes Chart.js canvas dimensions to drop to 0, which\n            fires ResizeObserver and triggers a full resize+redraw on every expand. With\n            height:0+overflow:hidden the chart container keeps its layout dimensions, so\n            ResizeObserver never fires and the chart stays rendered while visually hidden. */}\n        {keepMounted\n          ? <div className=\"page-body\" style={isExpanded ? undefined : {height: 0, overflow: 'hidden'}}>{children}</div>\n          : isExpanded && <div className=\"page-body\">{children}</div>\n        }\n\n    </div>\n  )\n};\n//\n//   return (\n//     <div className={classnames([\"page-section\", \"card\", className], {expandable, show:expandable && isExpanded, collapsed:!isExpanded})}>\n//\n//       {isExpanded ? (\n//         <>\n//           {sectionNav !== undefined\n//           && (\n//             <div className=\"page-section-nav\">\n//               {sectionNav}\n//             </div>\n//           )}\n//\n//           {title && (\n//             <div className=\"page-section-header d-flex align-items-center justify-content-between\">\n//\n//               <h5 className=\"page-title\">\n//                 {title}\n//                 {subtitle && <span className=\"subtitle\">{subtitle}</span>}\n//                 {expandable &&\n//                 <Button size=\"1x\"  color=\"link\"  className=\"inline ms-2\" onClick={()=>toggleExpanded(false)}>\n//                   <FaIcon icon=\"chevron-circle-up\" size=\"1x\"  />\n//                 </Button>}\n//               </h5>\n//\n//               {tools !== undefined\n//               && (\n//                 <div className=\"page-section-tools\">\n//                   {tools}\n//                 </div>\n//               )}\n//             </div>\n//           )}\n//\n//           <div className=\"page-body\">\n//             {children}\n//           </div>\n//         </>\n//       ) : (\n//         <div className=\"page-section-header m-0 d-flex align-items-center\">\n//           <h5 className=\"page-title\">\n//             {title}\n//             {subtitle && <span className=\"subtitle\">{subtitle}</span>}\n//           </h5>\n//           {expandable && (\n//             <Button size=\"1x\" color=\"link\" className=\"inline ms-2\" onClick={()=>toggleExpanded(true)}>\n//               <FaIcon icon=\"chevron-circle-down\" size=\"1x\"  />\n//             </Button>\n//           )}\n//\n//         </div>\n//\n//\n//       )}\n//\n//\n//\n//     </div>\n//   )\n// };\n\n\nexport default PageSection;\n","import React, {useState, useEffect, useCallback, useMemo, useRef} from \"react\";\nimport useApi from \"../Hooks/useApi\";\nimport usePermission from \"../Hooks/usePermission\";\nimport {notify} from \"@thedmsgroup/mastodon-ui-components\";\nimport type {TargetingAttribute} from \"../types\";\nimport {Button} from 'reactstrap';\nimport {FontAwesomeIcon as FaIcon} from \"@fortawesome/react-fontawesome\";\nimport lazify from '../utils/Lazify';\nimport {Drawer} from '../Layout/Drawer';\nimport type {ChangeTimelineEntityType} from \"../App/ChangeLog/ChangeTimeline\";\n\nconst LazyChangeTimeline = lazify(() => import(/* webpackChunkName: \"ChangeLog\" */ '../App/ChangeLog/ChangeTimeline'));\n\ntype DrawerConfig = {\n  entityTypes: string[];\n  parentFilters: Record<string, any>;\n  entity?: ChangeTimelineEntityType;\n  defaultMode?: 'date_range' | 'most_recent';\n  defaultMostRecent?: number;\n};\n\ntype ChangeContextType = {\n  attributes: Record<string, TargetingAttribute>;\n  loadAttributes: () => Promise<void>;\n  selectedId?: number;\n  setSelectedId: (id: number) => void;\n\n  // Drawer state\n  isDrawerOpen: boolean;\n  openDrawer: () => void;\n  closeDrawer: () => void;\n  allowViewChanges: boolean;\n\n  // Entity focus\n  entity?: ChangeTimelineEntityType;\n  setEntity: (entity?: ChangeTimelineEntityType) => void;\n\n  // Page configuration (set by useChangeTimeline hook)\n  drawerConfig: DrawerConfig | null;\n  setDrawerConfig: (config: DrawerConfig | null) => void;\n\n  // Convenience for tables: sets entity and opens drawer\n  openChanges: (entity?: ChangeTimelineEntityType) => void;\n\n  // Signal that a mutation occurred; ChangeTimeline will re-fetch or mark stale\n  lastMutatedAt: number;\n  notifyChange: () => void;\n}\n\n// Stable context for table ActionCells — values rarely change, preventing re-renders\n// when drawer state changes. Use this instead of ChangeContext in table row components.\ntype ChangeActionsContextType = {\n  openChanges: (entity?: ChangeTimelineEntityType) => void;\n  allowViewChanges: boolean;\n};\n\nconst ChangeActionsContext = React.createContext<ChangeActionsContextType>({\n  openChanges: () => {},\n  allowViewChanges: false,\n});\n\nconst ChangeContext = React.createContext<ChangeContextType>({\n  attributes: {},\n  loadAttributes: async () => {},\n  selectedId: undefined,\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  setSelectedId: (id: number) => {},\n  isDrawerOpen: false,\n  openDrawer: () => {},\n  closeDrawer: () => {},\n  allowViewChanges: false,\n  entity: undefined,\n  setEntity: () => {},\n  drawerConfig: null,\n  setDrawerConfig: () => {},\n  openChanges: () => {},\n  lastMutatedAt: 0,\n  notifyChange: () => {},\n});\n\ntype ChangeProviderProps = {\n  children: React.ReactNode;\n}\n\nconst ChangeProvider = ({ children }: ChangeProviderProps) => {\n  const [attributes, setAttributes] = useState<Record<string, TargetingAttribute>>({});\n  const [selectedId, setSelectedId] = useState<number | undefined>();\n  const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n  // hasOpened: defers chunk download and attribute loading until the drawer is first opened\n  const [hasOpened, setHasOpened] = useState(false);\n  const [entity, setEntity] = useState<ChangeTimelineEntityType | undefined>();\n  const [drawerConfig, _setDrawerConfig] = useState<DrawerConfig | null>(null);\n  const [lastMutatedAt, setLastMutatedAt] = useState<number>(0);\n  const notifyChange = useCallback(() => setLastMutatedAt(Date.now()), []);\n  const drawerConfigRef = useRef<DrawerConfig | null>(null);\n  const apiAttributes = useApi('attributes', 'list');\n  const allowViewChanges = usePermission('changes.view');\n\n  // Defer attribute loading until the drawer is first opened\n  useEffect(() => {\n    if (hasOpened && allowViewChanges) {\n      loadAttributes();\n    }\n  }, [hasOpened]);\n\n  const loadAttributes = useCallback(async () => {\n    const result = await apiAttributes.fetch({ options: true, scope: 'routing' });\n    if (!result) {\n      notify(`Unable to load attributes:${apiAttributes.error?.name ?? 'unknown error'}`, 'error');\n      return;\n    }\n\n    // Flatten grouped response into alias-keyed lookup for diff rendering\n    const attributes = {} as Record<string, TargetingAttribute>;\n    Object.entries(result).forEach(([groupName, groupAttrs]) => {\n      (groupAttrs as TargetingAttribute[]).forEach((attr) => {\n        attributes[attr.alias] = attr;\n      });\n    });\n\n    setAttributes(attributes);\n  }, []);\n\n  const setDrawerConfig = useCallback((config: DrawerConfig | null) => {\n    drawerConfigRef.current = config;\n    _setDrawerConfig(config);\n    // Sync the default entity whenever config changes\n    if (config?.entity) {\n      setEntity(config.entity);\n    }\n  }, []);\n\n  const openDrawer = useCallback(() => {\n    // Re-apply the page's default entity each time the drawer opens via the tab\n    if (drawerConfigRef.current?.entity) {\n      setEntity(drawerConfigRef.current.entity);\n    }\n    setHasOpened(true);\n    setIsDrawerOpen(true);\n  }, []);\n\n  const closeDrawer = useCallback(() => {\n    setIsDrawerOpen(false);\n    // Reset to the page's default entity (or undefined for list pages)\n    setEntity(drawerConfigRef.current?.entity);\n  }, []);\n\n  const openChanges = useCallback((entity?: ChangeTimelineEntityType) => {\n    if (entity) {\n      setEntity(entity);\n    }\n    setHasOpened(true);\n    setIsDrawerOpen(true);\n  }, []);\n\n  const contextValue = useMemo(() => ({\n    attributes,\n    loadAttributes,\n    selectedId,\n    setSelectedId,\n    isDrawerOpen,\n    openDrawer,\n    closeDrawer,\n    allowViewChanges,\n    entity,\n    setEntity,\n    drawerConfig,\n    setDrawerConfig,\n    openChanges,\n    lastMutatedAt,\n    notifyChange,\n  }), [attributes, loadAttributes, selectedId, isDrawerOpen, allowViewChanges, entity, drawerConfig, openDrawer, closeDrawer, openChanges, lastMutatedAt, notifyChange]);\n\n  // Stable value for ActionCells — only changes if permission changes (effectively never mid-session)\n  const actionsValue = useMemo(() => ({\n    openChanges,\n    allowViewChanges,\n  }), [openChanges, allowViewChanges]);\n\n  return (\n    <ChangeContext.Provider value={contextValue}>\n      <ChangeActionsContext.Provider value={actionsValue}>\n        {children}\n        {allowViewChanges && drawerConfig && (\n          <Drawer\n            isOpen={isDrawerOpen}\n            onClose={closeDrawer}\n            title=\"Change History\"\n            openerFn={openDrawer}\n          >\n            {hasOpened && (\n              <LazyChangeTimeline\n                spinner\n                active={isDrawerOpen}\n                parentFilters={drawerConfig.parentFilters}\n                entityTypes={drawerConfig.entityTypes}\n                entity={entity}\n                onClearEntity={() => setEntity(undefined)}\n                onSetEntity={setEntity}\n                lastMutatedAt={lastMutatedAt}\n                defaultMode={drawerConfig.defaultMode}\n                defaultMostRecent={drawerConfig.defaultMostRecent}\n              />\n            )}\n          </Drawer>\n        )}\n      </ChangeActionsContext.Provider>\n    </ChangeContext.Provider>\n  );\n};\n\n// Reusable button for table ActionCells — consumes ChangeActionsContext internally,\n// so the parent component doesn't need to import the context or handle permissions.\nconst ChangeHistoryButton = ({ id, name, type, children }: {\n  id: number | string;\n  name: string;\n  type: string;\n  children?: React.ReactNode;\n}) => {\n  const { openChanges, allowViewChanges } = React.useContext(ChangeActionsContext);\n  if (!allowViewChanges) return null;\n  return (\n    <Button\n      color='link'\n      className='action-item inline'\n      title='Change history'\n      onClick={() => openChanges({ id, name, type })}\n    >\n      <FaIcon icon='history' size='1x' />{children}\n    </Button>\n  );\n};\n\nexport {ChangeContext, ChangeActionsContext, ChangeProvider, ChangeHistoryButton};\nexport type {ChangeTimelineEntityType};\n","export const statusCodeColor = (status: number) => {\n  if (!status) return 'secondary';\n  if (status < 300) return 'success';\n  if (status < 400) return 'info';\n  if (status < 500) return 'warning';\n  return 'danger';\n};\n"],"names":["LazyTargetingManager","lazify","__webpack_require__","e","then","bind","timingChoices","matching","post_matching","suppression","EnrichmentForm","props","rulesContext","useContext","RulesContext","willDelete","setWillDelete","useState","tempData","setTempData","copy","addOn","allowEditIntegration","usePermission","allowEditOrder","useEffect","editMode","handleApply","onApply","handleCancel","isNew","onDelete","index","onEditMode","priorities","addOnCount","Array","map","item","handleChangeVendorAttributes","useDebouncedCallback","attr","vendor_attributes","hasErrors","Object","keys","errors","length","_jsxs","Card","className","classnames","odd","id","toString","children","_jsx","name","config","find","conf","label","undefined","getIntegrationLabel","integration","Button","color","size","onClick","_Fragment","title","FaIcon","icon","CardBody","StandardAlert","Row","Label","sm","TypeHelp","Col","FormGroup","Input","type","value","timing","onChange","target","invalid","key","FormFeedback","priority","val","i","IntegrationSettings","definitions","allowControls","isMulti","allowEdit","onUpdate","HelpPopper","iconClass","conditions","isArray","suppression_conditions","c","attributes","attributeGroups","TargetGroupsDescription","groups","limit","rows","defaultValue","FormText","JSONPretty","json","JSON","parse","theme","googlecode","IconCheckbox","Boolean","notify","handleChangeNotify","outline","propTypes","PropTypes","isRequired","defaultProps","RulesConfig_EnrichmentForm","NewEnrichment","settings","Enrichments","addOns","loadIntegrations","intConfig","setIntConfig","editIndex","setEditIndex","addIndex","setAddIndex","refreshKey","setRefreshKey","async","ints","_loadIntegrations","newData","temp","changePriority","handleCreate","sc","newPriority","removed","splice","resetPriorities","forEach","handleDelete","disabled","RulesConfig_Enrichments","BiddingScheduleConfig","max","labelInterval","lineInterval","allowHourParting","showBaseline","valueSuffix","dragStep","CapScheduleConfig","allowOpenValue","Modal","auctionId","isOpen","cancel","timezone","defaultTab","permalinkBase","permaLink","permalink","setPermalink","BootstrapModal","toggle","unmountOnClose","ModalHeader","Link","to","CopyButton","textToCopy","buttonSize","ModalBody","Auction","auction_id","onChangeFilters","filters","qs","useQueryString","loading","__WEBPACK_DEFAULT_EXPORT__","Block","React","reason","details","indentClass","compact","Badge","tokenToWords","DataRows","labelWidth","fieldStyle","noDivider","entries","dtKey","DataRow","JsonDisplay","data","scrollable","Details_Block","isHouse","leg","funded_by","isBuyerPool","pool","sumLegs","legs","reduce","total","Number","amount","LegName","promotionNames","canLink","source_id","source","jsx_runtime","jsxs","Fragment","linked","jsx","dist","N_","EntityId","A","LegRow","reverted","sizing","cost","reprice_cost","Table","xZ","reprice_calc","wn","reprice_percent","reprice_cap","Sizing","wallet","credit","credit_amount","cash","cash_amount","walletLabel","auto_funded","refundable","Details_FundingBreakdown","funded","gross","transactionId","grossAmount","buyerPays","n","Math","round","hasBuyerPool","some","classnames_default","funding_account_id","lib","IX","Details_Bid","bid","position","transaction_id","account_bid","vendor_bid","vendor_payout","adjusted_account_bid","blocks","sale","sale_attempt","accountId","product","onReturnRequested","funding_contributions","showReturnModal","setShowReturnModal","canRequestReturn","getLabel","getReasonLabel","useReturnReasons","latestReturn","return_history","requestedReturn","entry","status","reverted_at","gap","MoneyFormatter","FundingBreakdown","Stack","b","_createElement","sale_id","redirect_url","ExpandableSection","UrlDisplayWidget","url","RelativeTime","date","sold_at","reverted_by_name","reverted_by","revert_reason","return_status","ReturnStatusLabels","processed_at","actor_name","actor_id","deny_reason","return_reason","comment","RequestReturnModal","saleId","onCancel","onRequested","handleRequested","public","Details_EntityLinks","entityId","linkPath","linkSearch","openRoutingModal","routingFilter","pathname","search","index_es","g","Explanation","show","setShow","handleToggle","InternalBidModifier","PercentFormatter","Details_Match","Match","match_id","matchable_id","account","order","rule","channel","account_bid_amount","account_bid_explanation","exclusive","tags","buyer_name","broker_name","internal_bid","internal_bid_modifiers","match_delivery_id","onSelectDelivery","onShowRouting","onShowMatchable","resolvedLegs","showResolvedLegs","EntityLinks","filter","indexOf","bm","join","Bid","ad","AdDisplay","match","auto_redirect","HelpText","Alert","ToggleMe","Details_HttpLog","HttpLog","log","traceUrl","traceId","trace_id","test","BigInt","slice","request_id","href","rel","sent_at","response_time","status_code","statusCodeColor","request","RequestLog","requestLog","response","ResponseLog","responseLog","bodyHeight","Deliveries","deliveryOptions","selectedDeliveryId","onSelect","api","useApi","detail","setDetail","selectedRows","setSelectedRows","view","setView","deliveries","setDeliveries","setLoading","rowKeys","row","document","getElementById","scrollIntoView","behavior","block","columns","useMemo","Header","accessor","Cell","toLowerCase","titleCase","maxWidth","version","RejectionCategoryDisplay","category","NumberFormat","displayType","thousandSeparator","suffix","sortType","a","Date","DateFormatter","format","initialTableState","sortBy","desc","findIndex","el","loadDetails","delivery","result","endpoints","debug","assign","timeout","reject_category","prev","newDeliveries","error","scrolling","FlexTable","initialState","onClickRowCallback","selectedRowIds","getRowClassName","original","integration_info","toggleView","delivery_id","cached","notified","height","input_data","api_operations","showIcon","resolved","DeliveryRejectCategoryChoices","cat","Details_Deliveries","LeadValueDisplay","dataKey","ie","state_timezone","pw","ArrayValueDisplay","ObjectValueDisplay","allowJsonView","jsonView","setJsonView","react","Aq","isObject","D6","Components","iy","k","v","x3","string","mk","isObjectElements","Details_Lead","lead","gotoDelivery","searchTerm","setSearchTerm","scopeFilter","setScopeFilter","filteredData","setFilteredData","useLocalStorage","resolveDelivery","useCallback","dv","d","applyFilters","term","scope","match_sorter_esm","Ht","replace","threshold","rankings","CONTAINS","sorter","items","matchedKeys","filteredBlock","fromEntries","blockKey","includes","handleSearchDebounced","handleScopeFilter","newScope","my","currentView","QP","free_solid_svg_icons_index_es","jTw","Filter","iB","placeholder","onClear","description","role","dataVal","ReactAudioPlayer","t","Call","call","ivrCall","ivrLog","CallDetails","occurred_at","transcript","split","disposition","DispositionHelp","origin_number","transfer_number","destination_number","received_at","ended_at","duration","DurationFormatter","seconds","parseInt","recording_url","Suspense","fallback","src","RECORDING_URL_BASE","encodeURIComponent","controls","autoPlay","Details_Call","ucfirst","toUpperCase","substring","Details_Timeline","Timeline","auction","events","push","when","started_at","faConciergeBell","ivr_call","pii","received_call","connected_at","sales","matches","m","final_bid","s","faGavel","sort","auctionToEvents","last","diff","MatchFilters","buyers","brokers","resultCount","buyer","bsSize","broker","clearFilters","Details_MatchFilters","BiddingLog","logs","exclusive_bidding","exclusive_estimate","exclusive_explanation","shared_estimate","shared_explanation","selling","Details_BiddingLog","MatchingLog","orders","candidates","cl","eval_time","CandidateLog","matchable","setMatchable","matchables","matchableId","minimal","rules","adjustLog","Spinner","Tree","node","matchLog","onlyMatched","ruleLog","rule_id","matched","blocked","faThumbsDown","message","dead_end","faSkullCrossbones","dead_end_reasons","Details_MatchingLog","verdictIcon","verdict","DecisionRow","decision","stage","rule_label","RouteRow","route","expanded","setExpanded","hasDecisions","decisions","included","channel_name","channel_id","RoutingTree","routingLog","linear","blockedAt","routes","r","Details_RoutingLog","route_found","source_name","vendor_name","vendor_id","LOG_LABELS","pattern","SOURCE_LABELS","Details_HttpLogs","HttpLogs","setLogs","auctionHttpLogs","http_logs","loadLogs","LoaderDots","active","width","uri","parseRequest","getLogLabel","headers","ua","getLogSource","MatchableModal","loadMatchable","location","protocol","host","setFilters","updateQuery","usePagedTableState","useTableControls","restrict","setAuction","auctionJSON","setAuctionJSON","activeTab","_setActiveTab","httpLogsShown","setHttpLogsShown","filteredMatches","setFilteredMatches","matchFilters","setMatchFilters","setBuyers","setBrokers","routingModalFilters","setRoutingModalFilters","setMatchableId","arbSellingAuctionId","setArbSellingAuctionId","arbSellingLoading","setArbSellingLoading","setPromotionNames","canViewPromotions","setActiveTab","tab","load","auctions","matchBrokers","matchBuyers","arbAuctionId","found","arb_auction_id","loadArbSellingAuction","summarizePromotions","loadPromotionNames","console","started","auctionData","dayMs","auctionsList","parent_auction_id","after","getTime","toISOString","before","page","per_page","hits","options","promotions","o","handleDeliverySelect","CountDisplay","counts","gotoTab","PromotionsPod","vertical","vendor","app_version","feature_flags","flag","include_buyers","exclude_buyers","Nav","AuctionNavItem","tabId","isActive","faBrain","TabContent","TabPane","matchSorter","md","lg","Lead","ivr_log","RoutingLog","routing","RoutingModal","closeRoutingModal","NavItem","NavLink","matchBlocks","bidBlocks","dvFail","bids","displayName","summary","sponsored","house","buyerCredit","bidLegs","matchLegs","totals","Details","requested","approved","denied","ReturnStatusColors","LazyChangeLog","Lazify","LazyChangeDetail","ChangeLog","Routes","Route","path","element","ProtectedRoute","permission","ValidationSchema","Yup","shape","trim","required","vertical_id","transform","isNaN","moreThan","account_id","FormLayout","isModal","Channel","channelId","close","onSuccess","onOpenChannelRules","onOpenChannelSourceRules","initialTab","app","AppContext","setChannel","formApi","formIsValid","formValues","formErrors","useFormState","sources","channels","setValues","save","showLoader","ch","channelSources","eligibility","distribution","fixed_distribution","update","create","cs","formValuesAsChannel","BodyWrapper","TabNav","setActive","Required","handleOnChange","DynamicEnhancedSelect","setValue","endpoint","params","labelProperty","invalidFeedback","isClearable","isSearchable","display_name","InputGroup","ProductChoices","p","Utils","evt","confirm","confirmText","cancelText","archiveConfirm","style","minHeight","ChannelSources","onOpenRules","FooterWrapper","handleSave","validate","EntityOptionLabel","selected","SeedDataValidation","seedDataValidationRules","field","errorMessage","inputType","choices","first_party","third_party","requiredWhen","condition","token","this","context","seed_data","validSeedData","SourceTokenForm","sourceToken","readOnly","vendorChoices","setVendorChoices","sourceChoices","setSourceChoices","isSaving","setIsSaving","selectedSource","setSelectedSource","seedDataJsonValid","setSeedDataJsonValid","post_type","loadChoices","clearForm","list","vendors","stringify","sourceTokens","EnhancedSelect","controlShouldRenderValue","formatOptionLabel","isInvalid","SourceOptionLabel","SeedDataDisplay","seedData","emptyMessage","whiteSpace","SeedDataBuilder","verticalId","obj","onJsonValidChange","validationRules","ClickTags","clickTags","didMount","useDidMount","addItem","removeItem","updateItem","useUniqueKeyArray","tag","PixelForm","pixel","handleRemove","handleChange","Source_ClickTags","currencyMask","createNumberMask","prefix","allowDecimal","decimalLimit","integerLimit","marginMask","phoneCount","phone_numbers","MaskedInput","mask","render","ref","InputWithIcon","innerRef","vendor_margin","iconSide","match_limit","vendor_billable_duration","for","phone","phone_number","titleCaseWord","Source_Details","flattenSchemaFields","schema","parent","properties","localeCompare","flatMap","private","example","RequiredFields","requiredFields","inputSchemaApi","InputSchemaApi","inputSchema","setInputSchema","setVertical","fieldOptions","setFieldOptions","newFields","setNewFields","rejectNew","setRejectNew","lazyNew","setLazyNew","recommendedNew","setRecommendedNew","allowInputSchema","allowVerticals","allowViewInputSchema","loadInputSchema","handleToggleCheckedRow","checked","newRequired","reject","lazy","vert","verticals","input_schema","full","content","enforcementFlagColumn","header","recommended","ReadOnlyFlag","FieldPath","noDataMessage","tabSelectsValue","backspaceRemovesValue","closeMenuOnSelect","RequiredFieldOptionLabel","check","handleAdd","newRequiredFields","fieldName","unDupedExisting","f","at","String","lastIndexOf","splitFieldPath","option","meta","allowEditSource","onMove","Source_EnrichmentForm","handleMove","direction","Source_Enrichments","nullable","Source","required_fields","enrichments","handleSelectTab","channel_eligibilities","form","LoadingBar","FormTabFlat","click_tags","arr","integrations","without_account","int","current_version","Sources_Source","RuleTree","selectedRule","ancestors","ruleComponent","isLoading","treeContext","TreeContext","containerRef","useRef","scrollRef","treeHeight","setTreeHeight","scrollPosition","setScrollPosition","allowIntegration","allowAdvanced","updateTreeHeight","current","containerRect","getBoundingClientRect","top","window","innerHeight","addEventListener","removeEventListener","currentPos","setTimeout","scroll","filterOptions","opt","searchResult","getMatches","setSearch","Sticky","enabled","onStateChange","STATUS_FIXED","ConditionalPageSection","isPage","iconSize","containerClass","clearSearch","SimpleSelect","setFilter","hideSelectedOptions","expandAll","collapse","isFiltered","filteredResultCount","singularOrPlural","onScroll","scrollTop","TreeBranch","level","Rules_RuleTree","PageSection","TreeRule","parentDisabled","bidEditMode","setBidEditMode","currentBidEdit","isSelected","isDisabled","root","flow_control","setSelected","RuleIcons","ruleType","iconSet","RoutingIconSet","BidDisplay","ruleId","bidding","clickHandler","toggleActionsPane","Rules_TreeRule","NavTabs","onSelectTab","isSectionValid","isValid","Rules_NavTabs","setLabel","isLabelUpdating","setIsLabelUpdating","labelEditMode","setLabelEditMode","labelInputRef","allowViewChangeLog","handleChangeLabel","select","inline","Form","updateRule","viewRuleChanges","Rules_Header","RuleSummary","FlowControlSummary","flowControl","BiddingSummary","floor","account_bid_floor","bidRandomizationMin","bid_randomization_min","bidRandomizationMax","bid_randomization_max","TargetingSummary","targets","match_conditions","matchIsRequired","match_is_required","expression","match_expression","BidFalloffSummary","bidFalloff","bid_falloff","SellStrategySummary","sellStrategy","sell_strategy","RoutingCapsSummary","caps","sale_caps","caps_timezone","match_caps","PingDedupeCapsSummary","ping_dedupe","EnrichmentSummary","enrichment_addons","tabName","DestinationSummary","isRouting","postSale","delivery_destinations","AdvancedSummary","internalData","internal_data","SummaryItemWrapper","idea","Rules_RuleSummary","BuyerSelect","selectProps","buyerOptions","setBuyerOptions","setIsLoading","loadBuyers","dbas","DbaOptionLabel","getOptionValue","getOptionLabel","Form_BuyerSelect","BiddingIntegration","biddingIntegration","definitionsRef","getIntegrationDefinitionsByType","collection","willDeleteIndex","addMode","useCollectionTracker","xl","apply","setEdit","edit","setWillDeleteIndex","add","Rules_BiddingIntegration","ValueEstimatorIntegration","valueEstimatorIntegration","Rules_ValueEstimatorIntegration","DurationMaskOptions","unmask","scale","min","signed","PercentMaskOptions","RandomizationPercentMaskOptions","CurrencyMaskOptions","padFractionalZeros","normalizeZeros","radix","thousandsSeparator","flowControlLabels","include","exclude","Settings","bidFloor","valueEstimator","billableCallDuration","isActiveTab","onAccept","onAcceptBillableDuration","useImaskNiceAccept","masked","unmaskedValue","onAcceptBidFalloff","onAcceptBidFloor","onAcceptBidRandomizationMin","onAcceptBidRandomizationMax","BidWidget","MaskedInputGroup","bid_floor","parseFloat","toFixed","defaultChecked","SellStrategyDescriptions","legs_sequential","waterfall","arbitrage","SellStrategyLabels","flexBasis","ValueEstimatorDescriptions","ValueEstimatorLabels","billable_call_duration","Rules_Settings","NumberMaskOptions","CapsType","capsCollection","setCapsCollection","timeframe","cap","capsToObject","addCap","newVal","divider","RowDivider","CapRow","timeframesUsed","onRemove","onChangeCap","handleChangeCap","capValue","onChangeTimeframe","handleChangeTimeframe","hidden","CapTimeframeChoices","sn","Rules_CapsType","isValidKeyExpression","trimmed","startsWith","endsWith","PingDedupeType","dedupeRules","addEntry","key_expression","PingDedupeRow","keyExpression","cacheResponse","cache_response","onChangeKeyExpression","handleChangeKeyExpression","onChangeDuration","handleChangeDuration","onChangeCacheResponse","handleChangeCacheResponse","onAcceptDuration","Rules_PingDedupeType","Caps","capsTimezone","matchCaps","saleCaps","pingDedupes","handleChangeMatchCaps","handleChangeSaleCaps","handleChangePingDedupe","dedupes","TimezoneOptions","zone","z","Rules_Caps","Tracking","Rules_Tracking","LazyBatchRuleModal","ActionHeader","setActionMode","ActionsPanel","actionMode","batchRuleModal","setBatchRuleModal","handleClose","handleAddRule","placement","addRule","open","isRootRule","UncontrolledDropdown","DropdownToggle","allowCreate","caret","DropdownMenu","DropdownItem","onSaveRule","toggleDisabled","disableRule","CopyWidget","MoveWidget","handleDeleteRule","deleteRule","handleDisable","refreshRules","isDirty","onPasteRule","Rules_ActionsPanel","getFormattedNumber","isInt","scrubFormatting","roundedValue","roundNumber","matchExclusivityLabels","shared","buyerFilterModeLabels","Advanced","excludeProfitReporting","ignoreSaleRate","autoRedirect","uniqueLeadKey","qualifiedRateKey","matchLimit","matchTimeout","auctionExpiration","matchExclusivity","includeBuyers","excludeBuyers","buyerFilterMode","setBuyerFilterMode","selectedBuyers","viewBuyerMode","viewBuyers","JsonEditorLoadable","code","handleExcludeProfitReporting","handleIgnoreSaleRate","handleAutoRedirect","mode","values","Rules_Advanced","bid_modifier","is","absolute_bid","validRoutingCaps","validPingDedupeCaps","validTargeting","schedule","validActivitySchedule","PixelValidation","JSONValidation","FormSectionToFieldMap","targeting","tracking","advanced","RulesConfig","initializeRule","formIsDirty","formErrorSections","hasOwnProperty","setIsDirty","deprecatedErrors","checkForDeprecatedSettings","defs","deprecated","getDeprecatedSettings","badChoices","getDeprecatedChoices","setError","saveRule","group","attribute","schedule_type","actionsOpen","isRoot","DeliveryDestinations","destinations","dd","showCombineSales","value_estimator","value_estimator_integration","bidding_integration","exclude_profit_reporting","ignore_sale_rate","unique_lead_key","qualified_rate_key","match_timeout","auction_expiration","match_exclusivity","scrollToTop","scrollTo","attributeLookup","Rules_RulesConfig","NEW_RULE","parent_id","RulesManager","entityRuleId","entityType","entityName","onRefresh","useLocation","navigate","useNavigate","qsData","gotoRuleId","tree","getPrecedingRule","setTree","getRule","addTempRule","addNewRule","swapRule","selectRule","updateRuleTree","useRuleTree","changeEntity","openChanges","notifyChange","useChangeTimeline","entityTypes","parentFilters","entity","setAttributes","setIntegrations","setActionsOpen","setAttributeGroups","updateQueryString","loadRulesTree","loadAttributes","rootRule","routingRules","attrByGroup","groupName","alias","qry","handleSetActiveTab","dirtyRuleConfirm","leaveNewRuleConfirm","acc","intg","concat","rulesAPI","delete","fallbackRule","targetRule","updatedRule","copyRule","copy_from_id","moveRule","maxPriority","parentRule","refresh","ready","Provider","TreeProvider","defaultExpandLevel","user","Rules_EntityInfoBar","allowEditSources","allowEditChannels","allowStatusToggle","allowViewAuctions","routingMap","sourceUpdate","channelUpdate","handleStatusChange","chn","fetch","Notify","me","nx","subtitle","react_router_dom_dist","StatusToggler","onChangeAsync","showArchived","last_matched_at","sR","showTimezone","last_sold_at","Page","sourceId","react_router_dist","setEntity","loadRoutedEntity","Rules_ChannelSourceRoute","DocTitle","pageTitle","WB","RoutingRulesModal","constructor","channelSource","BaseAPI","super","process","_defineProperty","makeRequest","AggIntervalToUnit","h","w","M","q","y","aggregateToMultiDataset","timeBuckets","timeField","dataKeyField","dataCountField","dataBucketPath","dataLabelFormatter","labels","datasets","timeBucket","timeIndex","time","getProperty","Error","dataBucket","dataCount","fill","aggregateToMultiDataset_Object","_hiddenKeys","DefaultStackedChartOptions","responsive","maintainAspectRatio","scales","x","stacked","display","font","weight","clip","offset","grid","ticks","autoSkip","maxRotation","major","ctx","tick","animation","from","easing","plugins","tooltip","intersect","legend","boxWidth","padding","align","autocolors","DefaultLineChartOptions","pointRadius","margin","str","PhoneNumberValidation","ensure","of","doValidation","every","groupIndex","targetIndex","TargetingSchema","validateSync","abortEarly","stripUnknown","err","attrErrors","inner","formError","innerError","input","IntegrationSchema","proxy","ProxyBiddingSchema","prefill","PrefillSchema","post_timeout","integer","SaleConditionsSchema","sales_conditions","ChannelModifiersSchema","modifiers","attrName","input_type","typeError","notRequired","isInteger","toVal","action","returnOption","valueProperty","setItems","opts","RejectedFiles","files","file","filesize","FileDropzone","myFiles","setMyFiles","badFiles","setBadFiles","onDropAccepted","getRootProps","getInputProps","isDragActive","isDragAccept","isDragReject","useDropzone","noKeyboard","noClick","maxSize","multiple","onDropRejected","fileRejections","accept","fileTypes","hint","isUploading","stopPropagation","upload","handleUploadClick","text","asterisk","FormTabMore","errorTabs","selectedItem","setSelectedItem","dropdownOpen","setDropdownOpen","anyInvalid","activeItem","Dropdown","end","handleClick","autofocus","restProps","inputRef","focus","bSize","handleClear","KeyValueBuilder","addRow","KeyValueRow","onChangeAttribute","newValues","onChangeValue","removeRow","pair","KeyMaskOptions","prepare","allowObjects","valueHelpText","keyReadOnly","setIsOpen","valueType","setValueType","currentValue","setCurrentValue","parsed","handleChangeType","ButtonDropdown","toggleDropDown","faFont","onChangeCode","editorCode","PasswordEntry","password","confirmPassword","noLabel","PasswordWithToggle","maxLength","autoComplete","confirm_password","setInputType","visible","InputGroupText","faEye","debouncedCallback","flatten","getValue","getOptVal","simpleVal","defaultGetOptionValue","ReactSelectSimpleValue","simpleDefault","simpleValue","originalOnChange","wrapOnChange","simpleProps","Select","DefaultReactSelectProps","Mastodon","classNames","viewBox","clipPath","xlinkHref","ModalFooter","Outlet","NotAuthorized","numberFormat","Intl","currency","exclusivity","passText","blockedText","isUpdating","currentBidUpdating","formattedBid","zeroBid","modifierUp","ModifierArrow","modifierMask","showExclusivity","originalBidType","originalAbsoluteBid","originalBidModifier","updateBidding","newValue","handleChangeAbsBidDebounced","handleChangeModifierDebounced","absBidError","modifierError","bidTypeLabels","pass","absolute","modifier","exclusivityLabels","strict","optional","BidAlert","defaultMsg","previousBid","previousType","alert","ValueDeltaDisplay","oldValue","inputEl","handleCopyClick","handleUpdate","handleCombineSalesChange","combine_sales","dest","combineSales","onCombineSalesChange","SelectionTree","onSelectTarget","childRule","setPlacement","ButtonGroup","plc","handleIconClick","ruleIcons","showIcons","iconName","RuleIcon","iconData","IconData","UncontrolledTooltip","routing_tab","IntegrationDisplay","ActivityScheduleSummary","range","decimalScale","fixedDecimalScale","ceiling","showBidCeiling","proxyBidding","direct_transfer","BidScheduleSummary","WeekSummarySVG","labelSize","onChangeSelectedDay","selectedDay","TagSummary","fontSize","BudgetSummary","budgets","interval","isStandalone","expressionMode","setExpressionMode","hasTargeting","CallConfigSummary","concurrency","billableDuration","enrichment","destinationNumber","destinationSip","redirectUrl","callStarted","callEnded","hasIntegration","SaleConfirmationSummary","confirmation","AdsSummary","ads","accountAds","override","ruleAds","ChannelSummary","mod","channel_status","getChannelName","highlightAttribute","listLimit","TargetDescription","highlight","FormattedTargetValue","accept_unknown","SingleValueFormat","AttributeChoiceDisplay","IntegerRangeFormat","MultipleChoiceFormat","BooleanFormat","TokenListFormat","subset","LimitValues","ListPhrase","hiddenCount","tokensToString","count","RuleComponent","isSelectedRuleBranch","isAncestorBranch","ancId","expandedRules","hide","hasChildren","closed","child","filteredCount","getRuleIdArray","ids","treeIds","getExpandedRules","targetLevel","Infinity","currentLevel","setCurrentBidEdit","setCurrentBidUpdating","setIsFiltered","setFilteredResultCount","ruleIds","setRuleIds","setExpandedRules","El","handler","event","shiftKey","preventDefault","idx","filterRule","matchCount","filteredRule","isMatch","_matchCount","bid_blocked","bid_schedule","budget","channel_modifiers","datasheets","post_sale","sale_conditions","sale_confirmation","proxy_bidding","sale_match_caps","payout","bid_randomization","simple_ctr","static_ctr","AdvertiserIconSet","BooleanIconCell","trueTitle","falseTitle","showUndetermined","textAlign","param","rest","ButtonToggleFilter","labelOn","labelOff","StackedFilter","classNamePrefix","TextSearch","delay","handleChangeDebounced","onKeyDown","FilterControls","onExecute","onReset","executeLabel","inverse","FilterBar","PlatformChoices","AuctionPlatformChoices","StatusChoices","VerificationChoices","LockedChoices","EnabledChoices","DispositionChoices","StateChoices","ChangeGroupChoices","ChangeActionChoices","ChangeEntityTypeChoices","IntegrationTypeChoices","ChartIntervalOptions","DateRangeRelativeTimePresets","today","start","yesterday","thisdaylastweek","thisweek","last15m","last30m","last1h","last24h","last7d","last30d","LmsVerticalChoices","FilterChoiceMap","order_id","FilterSummaryTags","filterKeys","normalizedKeys","fnGetLabel","fnCustomTags","onRemoveFilter","onClearEntity","isPendingApply","targetFilters","keepKeys","getDisplayFilterName","getValueLabels","summarizeFilterSettings","filterSummary","makeDurationTag","unitLabel","defaultColumn","renderRowSubcomponent","reloadCallback","getInstanceCallback","onSelectRowsCallback","isStateControlled","showFooter","disableFilters","addinHooks","globalFilter","filterTypes","expandedRows","hiddenColumns","FilterContext","LiveFilteringContext","useInstance","instance","defaultHooks","useFlexLayout","useResizeColumns","useFilters","useGlobalFilter","useSortBy","useExpanded","getTableProps","getTableBodyProps","headerGroups","footerGroups","prepareRow","state","setAllFilters","setGlobalFilter","selectedFlatRows","useTable","autoResetGlobalFilter","DefaultTableState","useControlledState","disableSortRemove","disableMultiSort","autoResetExpanded","autoResetSortBy","autoResetFilters","autoResetRowState","hooks","newFilters","setFilteredCount","NoDataComponent","headerGroup","getHeaderGroupProps","getHeaderProps","isSorted","isSortedDesc","getSortByToggleProps","isResizing","getResizerProps","canSort","headerClassName","sortable","asc","getRowProps","cells","cell","getCellProps","column","isExpanded","groupKey","getFooterGroupProps","col","Footer","getFooterProps","footerClassName","initialSort","minWidth","PaginationWidget","visiblePages","setVisiblePages","getVisiblePages","pages","changePage","onPageChange","activePage","totalRows","showPageSize","pageSize","defaultPageSize","onPageSizeChange","PageSummary","totalCapped","jump","Pagination","PaginationItem","PaginationLink","previous","_e","array","next","rowStart","rowEnd","totalPages","filterPages","Table_PaginationWidget","PagedTable","manualPagination","manualSortBy","setSort","setSortDir","noHeader","reload","pageCount","setPage","setLimit","sort_by","sort_dir","Table_PagedTable","TimezoneSelect","defaultTimezone","selectedTimezone","onSelectTimezone","alignRight","TimezoneDisplay","dateFormat","StartOfDay","startOfDay","EndOfToday","endOfDay","InputRanges","startDate","addDays","endDate","widget","getCurrentValue","isSameDay","differenceInCalendarDays","DateRangeDropdown","useEndOfDay","allowFuture","toggleMe","nav","flipVariations","flipVariationsByContent","DateRangePicker","dr","selection","showSelectionPreview","moveRangeOnFirstSelection","preventSnapRefocus","months","ranges","maxDate","inputRanges","Form_DateRangeDropdown","RightDateAndControls","onChangeDate","Table_RightDateAndControls","VerticalMap","autoins","autowarranty","debt","education","healthins","homeins","jobs","legal","lifeins","medicare","mortgage","pathways","rewards","roofing","solar","ssdi","windows","second","minute","hourly","daily","weekly","monthly","annual","AnyCell","displayValue","PhoneFormatter","decimals","dt","isDate","parseJSON","isValidDate","tzDate","utcToZonedTime","formatDateTz","timeZone","formatDate","sec","ceil","minutes","hours","padStart","TableSubcomponent","startDateParams","endDateParams","arrayParams","defaultParseOptions","parseNumbers","forceEndOfDay","queryStringToFilters","queryString","parseOptions","arrayFormat","refDate","startParam","endParam","filtersToQueryString","AttributeSelectStyles","provided","marginLeft","groupHeading","fontWeight","marginBottom","menu","zIndex","TargetSelect","groupAttributes","styles","IntegerMask","includeThousandsSeparator","TargetValueForm","onChangeDebounced","FormOfType","IntegerInput","IntegerRange","TextInput","MultipleChoiceSelect","MultipleChoiceCheck","Choice","BooleanChoice","TextAreaInput","arrChoices","checkAll","checkNone","choiceVal","selectedValues","delta","getDelta","overflow","increase","abs","FaveHeart","isFavorite","localState","setLocalState","updateFavorite","newState","cursor","favorite","resource","appContext","setResult","res","useApiBatch","resources","batches","batchGet","useChartInterval","valueToDate","useDateRangeValue","unitLabels","ms","normalizeDateSelection","nowUTC","getAutoChartInterval","years","weeks","days","intervalToDuration","getScaledInterval","maxBuckets","newInterval","durationSec","differenceInSeconds","intervalSec","intervalToSeconds","scaleIndex","unit","parseInterval","intervalToApi","scaledInterval","getIntervalLabel","showOne","activeIndex","setActiveIndex","setAddMode","newIndex","setDidMount","callback","DefaultControls","DefaultOptions","ignore","updateOnFilterChange","urlDateFormat","TableStateReducer","tableEvent","currentQuery","initialFilters","initialControls","reduceFilters","reduced","dispatch","useReducer","controlsFromQueryString","controlKeys","Set","has","qsFilters","reducedStateFilters","isEqual","diffInMinutes","prop","reset","resetTo","setSortBy","rtSort","query","getDeep","targetId","matchChild","getDisabledAncestor","disabledParent","getAncestorWithProps","funcMap","fn","setDeep","targetItem","addDeep","newItem","removeDeep","Hooks_useRuleTree","initialTree","initialRule","newRuleDefault","setSelectedRule","previousSelectedRule","setPreviousSelectedRule","newSelection","newTree","newRule","ruleTree","selectNew","tempRule","ruleIndex","sibling","getPreceding","findPropAncestors","startRule","useTableGlobalFuzzyFilter","globalFilterFn","colIds","filterValue","autoRemove","globalType","formatToTimezone","strDate","formatTz","timezoneDisplay","updateCallback","nanoid","getValues","addItemBelow","newItems","updateItemProperty","property","siteTitle","titleEl","getElementsByTagName","fullTitle","ReactDOM","FaLibrary","library","faArchive","faBan","faBars","faBullseye","faCalendar","faCheck","faCheckCircle","faTimesCircle","faCheckSquare","faClipboardList","faCog","faCopy","faEdit","faEllipsisH","faEllipsisV","faEnvelope","faExternalLinkAlt","faFileAlt","faFileDownload","faFileExcel","faFlask","faFolder","faFolderOpen","faGripLines","faHandHoldingUsd","faHeart","faIdCard","faImages","faIndent","faList","faLock","faUnlock","faMagic","faMinus","faPaste","faPause","faPencilAlt","faPercent","faPhone","faPiggyBank","faPlay","faPlug","faPlus","faSearch","faShoePrints","faSquare","faStream","faTags","faThumbsUp","faTimes","faTrash","faUsers","faShieldAlt","faAd","faBalanceScale","faClock","faCalendarTimes","faCommentDollar","faCommentSlash","faCompressArrowsAlt","faDollarSign","faExpandArrowsAlt","faFill","faHandPaper","faHourglassHalf","faPaperclip","faPaperPlane","faProjectDiagram","faRandom","faSlidersH","faStar","faStopwatch","faCloudDownloadAlt","faUserCircle","faQuestionCircle","faInfoCircle","faExclamationCircle","faExclamationTriangle","faFrown","faMeh","faSmile","faGrinBeam","faDotCircle","faCircleRegular","faArrowUp","faArrowDown","faArrowsAltH","faArrowsAlt","faArrowRight","faArrowLeft","faChevronUp","faChevronLeft","faChevronRight","faChevronDown","faChevronCircleRight","faChevronCircleDown","faChevronCircleUp","faChevronCircleLeft","faLongArrowAltUp","faLongArrowAltDown","faMousePointer","faColumns","faSync","faHistory","faFilter","faThLarge","faCircle","faFileCsv","faSort","faSortUp","faSortDown","faPlusSquare","faMinusSquare","faHeartOpen","left","ContentLoader","speed","backgroundColor","backgroundOpacity","cx","cy","metadata","github","filename","overlay","fnScrollTo","loader","ProgressBar","useBoxShadow","loaderMessage","NotFoundPage","Services_Authorizer","authUrl","logoutCallback","tabQueryTimer","dispatchEvent","Event","localStorage","setItem","now","storageEvent","sessionStorage","UE_CLICKS_AUTH_TOKEN","clearTimeout","setAuthToken","logout","broadcast","doBroadcast","broadcastLogin","method","Authorization","getAuthToken","broadcastLogout","fetchInfo","broadcastTokenRequest","getRequestOptions","ok","msg","handleBroadcast","CORE_ENDPOINTS","CoreAPI","requestCallback","export","exportChannels","import","bodyType","importChannels","createBatch","saleReturns","reasons","denyReasons","images","formData","updateFile","partners","download","responseType","goalsTracking","returnsTracking","accounts","auctionFields","deliveriesList","callsList","getDeliveryRequest","sendDeliveryRequest","listDeliveryRequest","updateDeliveryRequest","deleteDeliveryRequest","sampleData","listSampleData","getSampleData","createSampleData","updateSampleData","deleteSampleData","listDeliveryQueue","cancelDelivery","bumpDelivery","template","simulate","changes","channelModifiers","users","updatePermissions","unlock","systemUsers","activations","getUserActivation","userId","addUeids","getReturnIntegration","updateReturnIntegration","listRevisions","showRevision","statefarmImports","kind","activity","promotionParticipations","usageSummary","favorites","addOrder","deleteOrder","permissions","roles","assignable","assignableSystem","platforms","orderIds","accounting","transactionsList","entriesList","notifications","send","twoFactor","enroll","confirmEnroll","disable","adminReset","credentials","pendingToken","email","createSpecialMethods","Services_CoreAPI","PrivacyAPI","Services_PrivacyAPI","AccountingAPI","invoice_number","file_type","return_url","cancel_url","card_id","auto_billing_eligible","Services_AccountingAPI","IntegrationsAPI","Services_IntegrationsAPI","ReportingAPI","getAdvertiserReport","getVendorReport","Services_ReportingAPI","MatchingAPI","Services_MatchingAPI","AppStateReducer","isAuthorizing","isAuthorized","currentAccount","authErr","loginAction","logoutAction","globalModal","favorite_orders","accountsMenuVersion","accountsPageVersion","AppProvider","buildHash","appState","authToken","authError","appStateRef","postLogout","authorizer","Authorizer","getApi","apiName","handleCrossTabTokenSuccess","authorize","handleCrossTabTokenFail","makeAuthData","authResult","authorization","verified","two_factor_enabled","two_factor_required","onLogin","onTwoFactorVerified","refreshAuth","authReady","getCache","setCache","updateFavoriteOrders","LiveFilteringProvider","updateFilter","resetFilter","resetFilters","subtableName","skipFilters","subtable","subtableField","searchKeys","reduceRight","results","updateGlobalFilter","subTableKey","baseUrl","endpointNames","kebabCaseToCamel","createEndpoints","arrayOfEntity","createEntity","createEntities","toCreate","toUpdate","promises","requests","Promise","all","clearError","paramsOrData","throwError","requestConfig","client","axios","baseURL","interceptors","use","requestHandler","successHandler","errorHandler","createAll","exception","setLocalItem","serialized","getLocalItem","getItem","setSessionItem","getSessionItem","Hooks_useFavoriteOrder","B","removeOrder","updateUserFavorites","getPathMatch","pathToMatch","router","B6","Hooks_useMatchPath","setAccountId","orderId","setOrderId","setMatchPath","accountMatchPath","orderMatchPath","es","Ik","Yj","ai","AdvertiserManager_Order","accountList","setAccountList","allowEditStatus","skip_accounting","loadAccountListOptions","FormCommon","mg","acct","DynamicSingleSelect","bT","reactstrap_confirm_dist","Order_OrderModal","Icons_StatusDot","menuModifiers","OrderDetails","selectedOrder","gotoRoute","closeMenu","onEditClick","allowViewOrders","allowViewLeads","allowViewCalls","base","Components_AccountMegaMenu","Zp","zy","allAccounts","setAllAccounts","filtered","setFiltered","orderViewSetting","setOrderViewSetting","searchVal","setSearchVal","selectedAccount","setSelectedAccount","setSelectedOrder","editOrder","setEditOrder","orderModalOpen","setOrderModalOpen","inpRef","createRef","routeAccountId","routeOrderId","allowViewUsers","allowViewAds","showLeadsLink","setShowLeadsLink","showCallsLink","setShowCallsLink","favoritesByAccount","hasOrderWithProduct","ord","scrollToAccount","setSelectedFromRoute","targetAccount","routeAccount","routeOrder","isScrolledIntoView","elem","container","bottom","useLayoutEffect","ToolsMegaMenu_menuModifiers","Layout_ToolsMegaMenu","allowAuctions","allowDNC","allowIntegrations","allowMatchTool","allowRuleSearch","allowAttributes","allowPartners","allowDBA","allowPromotions","allowUsers","allowRoles","links","allowed","link","Layout_EnvironmentBadge","Layout_Header","allowAccountsView","allowViewAdvReports","allowViewPubReports","allowChannels","allowRouting","allowSources","allowSaleGroups","allowSalesFlows","allowPhoneNumbers","allowClickArbs","allowVendors","allowNotifications","allowSourceTokens","Navbar","expand","fixed","NavbarBrand","logoImage","alt","EnvironmentBadge","Collapse","navbar","AccountMegaMenu","ToolsMegaMenu","first_name","last_name","openProfileModal","openPasswordModal","openTwoFactorModal","Layout_Footer","require","App_VersionChecker","versionDelayStart","setVersionDelayStart","toggleModal","versionCheckInterval","delayUpdateTimer","setInterval","checkVersion","CHECK_INTERVAL_SEC","clearInterval","isDelayed","remote","cache","Pragma","Expires","catch","hash","hardReload","DELAY_SEC","IdlePrompt","onStillHere","getRemainingTime","remaining","setRemaining","AuthLayout","tz","activate","isPrompted","useIdleTimer","onIdle","toast","dismiss","onActive","onPrompt","onIdlePrompt","handleStillHere","autoClose","promptBeforeIdle","crossTab","syncTimers","eventsThrottle","throttle","excludeRedirect","shouldRedirect","keyword","Navigate","TimezoneContextProvider","VersionChecker","EntryLayout","PublicLayout","OrderList_Filters","Filters","setChoices","onChangeFilter","defaultFilters","search_type","getChoices","OrderLastSold","memo","isStale","stale","AdvertiserManager_OrderLastSold","OrderName","onFavorite","locationSearch","HW","OrderActions","StatusCell","allowEditOrderStatus","updateStatusCallback","OrderList_OrdersSubtable","openOrderModal","favoriteOrderIds","onStatusChange","allowCreateOrder","filteredOrders","disableSortBy","disableGlobalFilter","last_sold_alert","gridLayout","columnWidths","AccountBalances","isLow","hasOrders","lowBal","react_number_format_es","OrderList_AccountBalances","AccountNameCell","allowViewAccounting","cash_balance","credit_balance","low_balance","OrderList_AccountNameCell","OrderList_AccountsTable","defaultCanSort","renderAccountOrderTable","Fk","OrderList_AllAccounts","setList","setPageCount","setTotalRows","apiFilters","order_search","filterParamsToApi","createElement","setFavorite","OrderList_Favorites","setAsFavorite","DefaultFilters","ListHeaderTools","allowCreateAccount","AdvertiserManager_OrderList","hasFilters","setAccount","setOrder","setFavoriteOrderIds","fav","autoChangeTabs","setAutoChangeTabs","orderModal","setOrderModal","allRefreshKey","setAllRefreshKey","handleFavoritesUpdate","newFavorites","existing","tools","T1","flattenTree","nodes","ancestorHasMoreSiblings","isLastChild","highlightMatch","Account_AccountTreePicker","currentAccountId","currentAccountDescendantIds","currentParentId","selectedValue","closeOnClick","accountMap","Map","roots","set","depth","get","parentId","setDepths","flattenedTree","filterText","setFilterText","showFilter","filterResult","matchingIds","findMatches","visibleIds","addAncestors","newPath","displayTree","pruneTree","renderTreeGuides","guides","hasMoreSiblings","isCurrentAccount","isCurrentParent","accountName","EMAIL_RE","AccountDetail_ValidationSchema","compliance_buyer_notifications","initialsFor","charAt","fullNameFor","renderAccountExecutiveOption","background","Account_AccountDetail","onSave","accountsSearch","isParentEditActive","setIsParentEditActive","parentAccounts","setParentAccounts","isLoadingParents","setIsLoadingParents","selectedParentName","setSelectedParentName","dba_id","dba","buyer_group","buyer_contact_display","buyer_contact_display_enabled","account_executive_id","account_executive","hasSelectableAccounts","descendantIds","descendant_ids","buyerContactDisplayHelp","Ww","role_internal","defaultParentId","isDefaultParent","loadParentAccounts","Form_InlineConfirmDelete","InlineConfirmDelete","prompt","justify","Account_Goal","Goal","goal","onSaved","reloadList","setEditMode","deleteConfirm","setDeleteConfirm","setName","setIsUpdating","setErrors","originalGoal","copyTag","toggleDeleteConfirm","newGoal","goals","new","CardTitle","uuid","Account_GoalPostingModal","GoalPostingModal","unique_id","showCopy","Account_Goals","Goals","setGoals","goalPostingModalOpen","setGoalPostingModalOpen","isAdding","setIsAdding","loadGoals","addGoal","handleSaveGoal","itemIndex","removeGoal","onAdd","GoalTrackingUpload","setIsUploading","csvFile","setCsvFile","goalId","setGoalId","note","setNote","isBadFile","setIsBadFile","dedupeSales","setDedupeSales","setFormError","uploadFile","FormData","append","tracking_file","handleChangeGoal","_","goal_id","handleChangeDedupeSales","handleUpload","Account_GoalTrackingUpload","TrackingResultModal","rowErrors","rowNum","asText","Account_TrackingResultModal","GoalTracking","setTracking","uploadModalOpen","setUploadModalOpen","rowErrorModalOpen","setRowErrorModalOpen","setRowErrors","closeUploadModal","FileNameCell","RowErrorCell","numErrors","row_errors","openModal","showRowErrors","DateCell","ActionCell","file_name","deleteTrackingFile","gotoGoals","closeRowErrors","DownloadFileLink","identifier","downloadSource","defaultFilename","Account_GoalTracking","ReturnTrackingUpload","Account_ReturnTrackingUpload","ReturnTracking","Account_ReturnTracking","EditCard","card","updateCard","removeCard","cancelEdit","autoBilling","setAutoBilling","deleteCardConfirm","setDeleteCardConfirm","handleUpdateCard","Accounting_EditCard","Amex","rx","Card_Amex","CardDefault","Card_CardDefault","Diners","Card_Diners","Discover","Card_Discover","Jcb","x1","y1","x2","y2","stopColor","Card_Jcb","Mastercard","Card_Mastercard","Visa","Card_Visa","CardIcon","CardComponent","getComponentFromType","Card_CardIcon","Accounting_CardService","getCardNameFromType","getLast4","num","CardMessage","onDismiss","dismissable","CreditCardMaskedDisplay","last4","CardStateReducer","selectedCard","paymentAmount","Cards","cards","refreshAccount","Accounting","updateState","cardsLoaded","setCardsLoaded","cardsOnFile","setCardsOnFile","editCard","setEditCard","chargeCardConfirm","setChargeCardConfirm","isRedirecting","setIsRedirecting","routerLocation","cardresult","exp","expiration_date","is_expired","isBefore","updateForm","Payment","formatCardNumber","useForAutoPay","updatePriority","toggleEditCard","doManualCharge","payment","chargeToCard","cardName","CardService","last_four","cancelCharge","handleClickSelectCard","handleDismissMessage","BlockUI","blocking","is_default","origin","baseReturn","getCheckoutPage","Accounting_Cards","FundTransferValidationSchema","receiver_account_id","positive","Accounting_TransfersInline","TransfersInline","accountOptions","isTransferring","setIsTransferring","sender_account_id","DefaultMaskOptions","handleTransferFunds","transfer","transferFunds","isEmptyCap","validationSchema","charge_date","monthly_cap","orig","CreditMaskOptions","PlanAmountMaskOptions","IntervalMaskOptions","pickerOptions","enableTime","minDate","altInput","altFormat","initialPlanFormState","BalanceAndPlan","plan","balance","cashBalance","creditBalance","savePlan","addCredit","accountTimezone","transfereeAccountOptions","planEditMode","setPlanEditMode","addCreditMode","setAddCreditMode","transferCashMode","setTransferCashMode","newCreditAmount","setNewCreditAmount","balanceError","setBalanceError","hasCards","setHasCards","hasAutoBillCard","setHasAutoBillCard","useTimezoneDisplay","allowView","allowAddCredit","allowAccountingTransferCreate","toggleAddCredit","toggleEditPlan","CardHeader","amt","toggleTransferCashMode","Flatpickr","newPlan","updatePlan","Accounting_BalanceAndPlan","AccountDefault","credit_cards","payment_plan","Funds","setTransfereeAccountOptions","getAccounting","getAccountingData","getAccount","transferAccounts","updateAccount","addAccountCredit","Accounting_Funds","IncludeUnsoldHolds","TransactionTypeChoices","typeLabel","rxGuid","cents","addLeg","wallet_type","hasRoles","buyerPaid","accountUuid","funding","buyer_cash","buyer_credit","buyer_total","promotionPaid","promotion_cash","promotion_credit","promotion_total","named","promotion_ids","contributions","promotion_id","Activity_ActorLabel","actorId","actor","Activity_LegsTable","transaction","accounting_account_id","accountLabels","esm_Table","colSpan","own","sequence","reversed","Money","Dash","SplitCell","names","Activity_Table","allowAuction","tableProps","getToggleRowExpandedProps","toggleRowExpanded","revision","reverses_transaction_id","reverses","auctionIdFor","short","amount_moved","net","sum","netForAccount","Activity_DefaultFilters","start_date","startOfMonth","end_date","promotion","PromotionBaseChoices","Activity_DefaultControls","Account_Activity","promotionsApi","promotionChoices","setPromotionChoices","DateTimeFormat","resolvedOptions","setRows","common","account_ids","ownAccountUuid","zonedTimeToUtc","types","has_promotion","exclude_reason","apiParams","num_hits","handleChangeFilter","dJ","AccountSettings","setQuery","useQueryState","historyAction","allowAccounting","saveDetails","crumbs","accountsLink","Breadcrumbs","TreeSkeleton","ry","RulesManager_TreeSkeleton","RulesManager_RuleTree","makeNumeric","BidEdit","onBidDelta","onBidWarning","newBid","setNewBid","getFormattedBid","newType","setNewType","isBidChanged","newBidNum","deriveType","keyHandler","updateBid","postChangeBid","onBlur","handleBlur","RulesManager_BidEdit","bidDelta","setBidDelta","bidWarning","setBidWarning","is_standalone","faMale","ExclusiveStarMessage","RulesManager_TreeRule","defaultPros","RulesConfig_Header","Summary","allowEditIntegrations","bid_ceiling","schedule_modifiers","schedule_caps","call_concurrency","billable_duration","destination_sip","call_started_webhooks","call_ended_webhooks","override_parent_ads","RulesConfig_Summary","RulesConfig_ProxyBuyers","proxyBuyers","newBuyerSelection","setNewBuyerSelection","handleChangeBuyer","newBuyers","BuyerRow","onChangeBuyer","l","isOptionDisabled","isOptionSelected","selectValue","no_bid","valign","Rh","handleChangeNoBid","noBid","Hooks_useSimpleAnimation","aniClass","animationFinished","setAnimationFinished","animationClass","setAnimationClass","animate","handleAnimationStart","handleAnimationEnd","copyAreaRef","useSimpleAnimation","handleCopy","execCommand","maxHeight","onAnimationStart","onAnimationEnd","Form_JsonDisplay","ProxyBidding","handleChangeFloorDebounced","handleDedupeTimeframeDebounced","dedupe_timeframe","handlePostTimeoutDebounced","handleChangeVendorAttributesDebounced","ProxyBuyers","buyer_constraints","handleChangeDirectTransfer","RulesConfig_ProxyBidding","numberMask","createNumberMask_default","Rules_SchedulableSettingInput","modal","setModal","hasSchedule","setHasSchedule","clearPrompt","setClearPrompt","thisDayIndex","getDay","setSelectedDay","rh","hideInput","handleClickDay","day","reactTextMask_default","setting","maskProps","scheduleSetting","summaryNote","ZZ","Lo","scheduleTimezone","startDay","Bidding","allowEditIntg","handleChangeCeilingDebounced","handleChangeSchedule","sched","onChangeSchedule","proxyError","SchedulableSettingInput","RulesConfig_Bidding","CapsFormOptions","intervals","BudgetOptions","Budgets","saleAttemptCaps","scheduleSaleAttemptCaps","scheduleSaleAttemptCapsTimezone","CapManager","scheduleConfig","handleChangeCapSchedule","inputPrefix","RulesConfig_Budgets","CallSettings","propAncestors","handleClickDurationAncestor","RulesConfig_CallSettings","MAX_MODIFIER","ChannelStatusChoices","LazyBulkEditChannelsModal","Channels","overrideParentModifiers","allowBidCeiling","allModifiers","setAllModifiers","viewFilter","setViewFilter","bulkEditModal","setBulkEditModal","stateRef","toggleBulkEditModal","cm","handleModifierChange","newModifiers","updateModifiers","doSort","ModifierFilters","channelsCount","modifiersCount","onChangeView","isViewApplied","ModifierTable","onBidChange","onCeilingChange","handleCeilingChange","newList","highlightApplied","onAfterSave","ListCount","allCount","modifierCount","handleChangeView","BidModifierInput","BidCeilingInput","bidCeiling","BidCell","ChannelCell","archived","filterVal","headerClasses","RulesConfig_Channels","Prefill","RulesConfig_Prefill","SipConfig","sip","supported_settings","toggleEdit","showServiceChooser","RulesConfig_SipConfig","Destination","deliveryDefinitionsRef","preTransferDefinitionsRef","debugApi","setRedirectUrl","redirectUrlTemplate","setRedirectUrlTemplate","handleChangeRedirectUrl","handleUrlPreview","TokenTextarea","tokens","onPreview","handleClickDestinationNumberAncestor","callStartedWebhooks","callEndedWebhooks","preTransferIntegrations","deliveryDestinations","twilioTemplate","RulesConfig_Destination","impressionUrls","clickUrls","keyedClickUrls","addClickUrl","removeClickUrl","updateClickUrl","keyedImpUrls","addImpUrl","removeImpUrl","updateImpUrl","impression_urls","px","RulesConfig_Tracking","dbaId","internalBidModifier","qualifyingRateStart","trackQualifyingRate","vendorAttributes","searchableLeads","searchableLeadsEffective","billMissedCalls","maxUnqualifiedCalls","unqualifiedCallsStart","duplicateWindow","defaultRateStart","startOfHour","addHours","allowInput","minuteIncrement","isRangeValid","defaultHour","defaultMinute","onClose","dates","currentdatestring","picker","setDate","dateUpToNow","compareAsc","internal_bid_modifier","qualifying_rate_start","utc","startOfMinute","handleChangeQRResetDate","handleClearQRStartDate","handleQRStartDateNow","handleChangeResetUnqualifiedDate","handleClearUnqualifiedCallsStartDate","handleUnqualifiedCallsStartDateNow","RulesConfig_Advanced","Tag","tagValue","RulesConfig_Tag","Ads","onChangeAds","overrideParent","selectedAds","setSelectedAds","originalRuleAds","handleRemoveAd","adId","handleSelectAll","handleReset","handleSelectAd","RulesConfig_Ads","moreTabs","tabs","valid","RulesConfig_NavTabs","LazyBulkEditModal","LazySettingCopyModal","LazySettingPasteModal","settingCopyModal","setSettingCopyModal","settingPasteModal","setSettingPasteModal","allowOrdersEdit","toggleSettingCopyModal","toggleSettingPasteModal","toggleBatchRuleModal","isDirtyRule","RulesManager_ActionsPanel","RulesConfig_SaleConfirmation","args","SaleConfirmationIntegration","saleConfirmation","LazyActivitySchedule","LazyDatasheets","validSaleConditions","validChannelModifiers","validProxyBidding","testContext","click_urls","validPrefill","calls","setPropAncestors","scrollTargetRef","sale_attempt_caps","strBid","ancestorFuncMap","schedule_affects_siblings","validationContext","ap","setValidationContext","handleChangeSettingSchedule","pre_transfer_integrations","ad_ids","datasheet_ids","ds","scrollMarginTop","accountDatasheets","sheets","dirtyForm","schedule_modifiers_timezone","SaleConfirmation","scheduleType","scheduleAffectsSiblings","onChangeScheduleType","onChangeScheduleAffectsSiblings","schedule_caps_timezone","schedule_sale_attempt_caps","schedule_sale_attempt_caps_timezone","overrideParentChannelModifiers","override_parent_channel_modifiers","redirect_url_template","track_qualifying_rate","searchable_leads","searchable_leads_effective","bill_missed_calls","duplicate_window","max_unqualified_calls","unqualified_calls_start","RulesManager_RulesConfig","RuleSkeleton","RulesManager_RuleSkeleton","RulesConfig_CloneOrderModal","accountOrders","handleCloseModal","createOrder","copy_rules_from_id","newOrder","orderNames","RulesManager_OrderInfoBar","setAccountOrders","allowCloneOrders","allowChangeLog","isCloneOpen","setCloneOpen","getExistingOrders","toggleClone","OrderActionLinks","onClone","gotoOrder","List_RejectionCategorySelect","FilterChoices","o4","List_IntegrationRejectionList","rejectionsByCategory","StackedChartOptions","chart","nr","Deliveries_DeliveryRejectStat","rejectCategory","onChangeRejectCategory","aggInterval","intervalLabel","chartMinTime","chartMaxTime","onZoom","selectedRejectCategory","setSelectedRejectCategory","jl","rejectionCategoryTotals","bkt","doc_count","rejectionsOverTimeByCategory","StackedBarChart","xLabel","minTime","maxTime","showNow","showNowLabel","integrationRejectionTotals","rejectionsOverTimeByIntegration","Hooks_useIntegrationNameLookup","lookup","setLookup","isLoaded","setIsLoaded","apiIntegrations","records","getIntegrationName","CapStats","stats","onSelectRule","RulePathCell","rulePath","segments","RulesManager_OrderDashboard","userTimezone","onToggle","rulesApi","capsApi","isLoadingAuctions","setIsLoadingAuctions","isLoadingCaps","setIsLoadingCaps","isLoadingDeliveries","setIsLoadingDeliveries","deliveryData","setDeliveryData","setAuctionData","capsData","setCapsData","capsDataError","setCapsDataError","isIntegrationsLoaded","valueToISO","agg_interval","agg_reject_category","agg_timezone","zoomReset","setZoomReset","chartMinMaxTime","setChartMinMaxTime","setIntervalLabel","realIntervalRef","isScaledInterval","setIsScaledInterval","isCapsPanelOpen","setIsCapsPanelOpen","apiDeliveries","apiAuctions","loadDeliveries","loadAuctionData","loadCaps","paramsToReadService","agg_buckets","aggregations","agg","reject_categories","buckets","deliveries_over_time","su","delivery_rejects_over_time","integrations_rejected","rejections","overall","expandable","DeliveryDetailFilters","storageKey","esm","KC","FA","num_auctions","contentType","wd3","horizontal","horizontalColor","num_matches","gr3","num_bids","num_vendor_accepted","num_sales","DO5","sum_account_bid","Vpi","HideawayPanel","j","AggSelect","scaledTo","pendingFilters","setPendingFilters","setIsPendingApply","Ot","DI","onChangeRange","isQuickPick","ApplyOrRefreshButton","pendingApply","AdvertiserManager_RulesManager","useParams","searchParams","setSearchParams","useSearchParams","linkedData","setLinkedData","isLoadingTree","setIsLoadingTree","setReady","loadOrder","batchResult","attrGroup","objectsByKeyValue","loadRule","v2","rootRuleId","handleSelectRule","movingRule","refreshAccountDatasheetList","OrderInfoBar","OrderDashboard","scrollY","treeOpen","App_AdvertiserManager","AdvertiserManager","allowChannelsView","OrderList","percentMask","DefaultChannelSource","ChannelSourceDetail","allSources","refreshChannels","selectedChannelSource","setSelectedChannelSource","rulesModalOpen","setRulesModalOpen","allowViewRules","sourceOptions","handleChangeDistribution","handleChangeFixed","handleChangeEligibilityStatus","handleChangeSource","removeEmptySources","containerId","ChannelSourceRow","onChangeSource","onChangeDistribution","onChangeFixed","onChangeEligibilityStatus","openRules","ChannelSourceRoute","handleOpenRules","handleAddNew","newSources","handleCloseRulesModal","distroValue","fixedValue","SourceDistributionInput","SourceDistributionFixedCheckbox","Channel_ChannelSourceDetail","DefaultHiddenColumns","onRulesClick","onRoutingClick","allowEditChannel","allowViewAuction","ChangeHistoryButton","SourceExpander","sourceCount","openChannelRulesModal","openRoutingMapModal","setHiddenColumns","columnPicks","renderDetailSubRow","ColumnSelect","Channels_Table","Channels_Filters","clearFilter","List","ChannelList","setChannels","setAllSources","channelRulesModalOpen","setChannelRulesModalOpen","selectedChannel","setSelectedChannel","routingMapId","setRoutingMapId","loadSources","openChannelSourceRulesModal","closeChannelRulesModal","closeChannelSourceRulesModal","RoutingMapModal","closeRoutingMapModal","Show","allowViewRouting","inserted_at","modified_at","utils_string","Edit","Create","Components_JsonViewModal","react_json_prettify_dist","themes","Table_SeedDataCell","SeedDataCell","showData","setShowData","toggleData","JsonViewModal","NameCell","onVendorClick","allowViewTokens","faKey","ChannelsCell","distribution_fixed","TokensCell","nonArchived","st","openRulesModal","openVendorModal","Sources_Table","SourceTokenTable","onEdit","onArchive","showSource","showVendor","optionalCols","TokenCell","tokenId","disabledGlobalFilter","borderTop","showVendors","showSources","traffic_type","zeroPageIndex","allowedFilters","Hooks_useTableState","useTableState","lastSearch","cleanFilters","stateFromQueryString","filterArray","setState","targetQuery","filtersToArray","old","setPagination","pagination","pageIndex","setSorting","sorting","Source_Vendors","Vendors","allowTokenEdit","allowTokenCreate","setTokens","selectedToken","setSelectedToken","refreshOnClose","setRefreshOnClose","onCloseForm","onCloseModal","handleUpdateTokenSuccess","batcher","Sources_Filters","Sources_List","SourceList","setData","vendorModalOpen","setVendorModalOpen","apiList","apiUpdate","showObject","closeRulesModal","Sources_Create","SourceCreate","handleSuccess","Sources_Edit","SourceEdit","setSource","Sources_Show","SourceShow","Rules_RoutingRuleIconTableCell","RoutingRuleIconTableCell","vendorId","onSourceTokensClick","allowEditVendor","UeidsCell","ueids","ueid","VendorsTable","openSourceTokensModal","Vendors_Table","Vendors_Filters","Vendor_Sources","Sources","Vendors_List","VendorsList","setVendors","sourceTokensModalOpen","setSourceTokensModalOpen","selectedVendor","setSelectedVendor","NumberCell","number","SourceCell","script","PhoneNumbers_Table","scripts","available","PhoneNumbers_Filters","PhoneNumber","script_id","closeModal","scriptsLoading","setScriptsLoading","scriptOptions","setScriptOptions","sourceVertical","setSourceVertical","loadScripts","ueidOptions","u","phoneNumbers","PhoneNumbers_PhoneNumber","PhoneNumbers_List","PhoneNumberList","editModalOpen","setEditModalOpen","selectedNumber","setSelectedNumber","changeLogKey","setChangeLogKey","closeEditModal","openEditModal","SourceToken_List","SourceTokenList","SourceToken_Edit","SourceTokenEdit","setSourceToken","SourceToken_Create","SourceTokenCreate","newSourceToken","SourceToken_Show","SourceTokenShow","SaleGroupTable","SourcesCell","ExemptBuyersCell","SaleGroup_Table_ActionCell","saleGroup","listSearch","ChangeProvider","Hw","BJ","kH","zn","SaleGroupList","saleGroups","setSaleGroups","SaleGroupShow","setSaleGroup","return","shared_sales_limit","exempt_buyers","created_at","updated_at","Edit_ValidationSchema","SaleGroupForm","buyerNameChoices","setBuyerNameChoices","loadSaleGroup","buyerNames","goBack","P","react_select_creatable_esm","inputId","formatCreateLabel","SalesFlowTable","SalesFlows_Table_ActionCell","salesFlowId","SalesFlowList","salesFlows","setSalesFlows","SalesFlowShow","salesFlow","setSalesFlow","is_active","lead_query","sales_script","rate_limit","load_interval","cooldown","SalesFlows_Edit_ValidationSchema","SalesFlowForm","loadSalesFlow","htmlFor","step","UeidTable","UeidValidationSchema","YO","network_name","traffic_source","DefaultUeidConfig","TokenMaskOptions","Ueids","onUpdateCallback","saving","setSaving","newUeids","setNewUeids","ueidError","setUeidError","currentIds","newIds","ueidRecord","Tq","selectedOptions","o1","EMPTY_CONFIG","ReturnIntegration","setDefinitions","configured","setConfigured","setStatus","setConfig","adding","setAdding","definitionsResult","integrationResult","_target","newStatus","allowDelete","showExcludePii","newConfig","definition","payload","integration_id","DefaultVendor","crypto_key","Vendor_Edit","setVendor","Vendor_Form","V","Create_DefaultVendor","Vendor_Create","create_auth_token","Vendor_Show","auth_tokens","i8","PublisherManager","ChannelShow","ChannelEdit","ChannelCreate","VendorEdit","VendorShow","VendorCreate","App_PublisherManager","FilterLabelMap","states","products","devices","currentlyInsured","Reports_FilterSummary","FilterSummary","summaryData","filterName","curr","LoadTimeWarning","chkRef","handleLoad","Reports_LoadTimeWarning","DISABLE_LOAD_WARNING_KEY","StaticChoices","device","boolean","advertiser_groupBy","vendor_groupBy","pivot","ReportsFilters","choicesLoading","setChoicesLoading","summaries","setSummaries","groupBySummary","compareSummary","allowVendorView","pendingSettings","setPendingSettings","showLoadWarning","setShowLoadWarning","disableLoadWarning","LocalStorageService","defaults","dataSource","getFilterOptions","staticChoices","newSettings","onFilterChange","mergeSettings","getLabels","groupBy","reportType","toMerge","commitAndExecute","onDismissLoadTimeWarning","doLoad","noWarn","handleWarningConfirm","handleWarningCancel","reportLoading","inNavbar","menuIsOpen","maxMenuHeight","onCompareFilterChange","startOfISOWeek","subWeeks","endOfISOWeek","subMonths","endOfMonth","handleExecute","getDateRangeDays","differenceInDays","defaultSettings","ReportsFilter","COLUMN_LABEL_OVERRIDES","lead_accept_rate","total_sales","HEADER_TIPS","average_diff_top","average_diff_next_bid_up","average_diff_next_bid_down","bid_click_through_rate","impression_click_through_rate","cost_per_call","cost_per_call_transfer","lead_posts","accepted_leads","Reports_ReportHeader","Delta","xmlns","preserveAspectRatio","stroke","Icons_Delta","TextColumns","SmallColumns","DateColumns","DeltaCell","dir","zeroVals","getDeltaDir","negative","DeltaHeader","defineColumns","pivotIndex","displayResolver","columnDefinitions","isFirstKey","colDef","dataField","headerAlign","footerAlign","footer","cellClasses","isDeltaField","ReportHeader","disablySortBy","headerTitle","row_id","PivotHeader","formatGroupByLabel","groupValue","labelMap","account_name","goal_name","ad_name","word","extractColumnsAndDataTransposed","reportResponse","groupOrder","selectedMetrics","extractColumnsAndData","columnChoices","timeSlots","firstSlotData","detectedGroupFields","groupFields","gbField","variations","df","groupField","hasMultipleGroupBy","allMetricKeys","metricsToShow","transformedData","nestedData","pivotData","groupByFields","reverseOrder","orderedGroupByFields","reverse","buildLevel","dataSubset","levelIndex","currentField","isLastGroupLevel","grouped","groupRows","rowId","groupHeaderRow","rowType","subRows","slot","safeSlot","metricKey","metricIndex","metricRow","pivotRow","_pivotRow","dataRow","originalIndex","firstSlot","groupByValues","_originalIndex","buildNestedHierarchy","totalsHeaderRow","groupRow","metricGroups","metricHeaderRow","totalsRow","groupLabel","headerLabel","groupLabels","transposedLabelSort","rowA","rowB","columnId","aRowType","bRowType","aDepth","aIsTotals","bIsTotals","aValue","bValue","isHeader","isTotals","canExpand","alignItems","marginRight","slotColumns","initialExpanded","identifyGroupingFields","firstRow","groupingFields","groupingPatterns","stripped","pivotCols","groupingField","hasTotals","pivotCol","pivotTotals","cols","pCol","pData","pivotGroupingFields","extractColumnsAndDataForLeads","formatDateParam","FilterToApiMap","billable","sortDir","UI_ONLY_PARAMS","convertFilterParams","filterSettings","fields","group_by","Reports_ViewControls","onGroupOrderChange","handleGroupOrderChange","groupByArray","groupOrderLabel","option1Label","option2Label","FFg","X46","gK3","Reports_ComparisonViewControls","comparisonView","onComparisonViewChange","handleComparisonViewChange","viewLabel","METRIC_CATEGORIES","general","metrics","clicks","getMetricsForCategory","categoryKey","availableColumns","choice","Reports_CategorizedMetricSelector","selectedItems","availableItems","categories","showAllItems","isCategorySelected","availableItemsInCategory","currentItems","metricValue","columnChoice","isAvailable","getItemsByCategory","handleCategoryToggle","itemValue","handleItemToggle","URL_DATE_FORMAT","NoData","stateReducer","report","rawApiResponse","downloadColumnsMode","lastFilterSettings","loadError","hasLoadedOnce","downloading","DefaultState","AggregateReport","csvDefaultName","Reporting","reportFunc","resolveAggregateReportFunc","tableInstanceRef","hasExpandedPermission","expandAllRows","setExpandAllRows","defaultFilterSettings","group_order","comparison_view","view_cols","getViewColsFromUrl","urlViewCols","selected_metrics","viewCols","setViewCols","loadReport","retransformReport","productToCategoryMap","leads","metricsToAdd","metricsToRemove","currentMetrics","categoryMetrics","selectedProduct","clicksMetrics","leadsMetrics","callsMetrics","newMetrics","handleUpdateViewCols","updateUrl","rpt","getHiddenColumns","newViewCols","hashPath","history","replaceState","visibleColIds","tableCols","groupingFieldsArray","flushSync","validatedViewCols","columnFilters","validateViewColumns","downloadReport","selectedColumns","body","appendChild","URL","createObjectURL","click","revokeObjectURL","parentNode","removeChild","handleToggleExpandAll","newExpandAll","toggleAllRowsExpanded","restrictedColumns","filteredColumnChoices","isPivotMode","hasGrouping","columnsWithExpandToggle","modifiedColumns","labelColumn","originalHeader","justifyContent","filtersWithViewSettings","handleClearFilters","ComparisonViewControls","newView","ViewControls","CategorizedMetricSelector","faChartLine","useRowSelect","Reports_AggregateReport","AdvertiserReport","AdvertiserReportV2","change_action","change_group","entity_type","phase","sold","Table_FilterSummary","ProspectFilters","onLoadFilters","prospectType","filterChoices","setFilterChoices","allowViewSources","deleteFilter","mergeFilter","Reports_ProspectFilters","WEEKDAY_WINDOW_HOURS","isReturnEligible","returnStatus","soldAt","soldAtDate","nowDate","deadline","UTC","getUTCFullYear","getUTCMonth","getUTCDate","RETURN_REQUEST_WINDOW_DAYS","withinReturnRequestWindow","windowHours","getUTCDay","withinCallReturnWindow","Reports_ReturnActionButton","allowRequestReturn","onRequestReturn","decided","withinWindow","Auctions_constants","W","Reports_ReturnStatusBadge","colors","H","DetailHeader","fullName","loadingText","displayText","FormatCall","DetailRow","account_billable_duration","call_id","FormatContact","city","country","zipcode","address","address2","date_of_birth","FormatInsurance","current_company","currently_insured","medicare_type","denied_coverage","FormatHealth","gender","height_inches","weight_pounds","tobacco_user","pregnant","preexisting_conditions","social_security","income","household_size","FormatAuto","drivers","vehicles","drv","marital_status","year","make","model","annual_mileage","commute_mileage","FormatLead","tcpa_disclosure","received_time","purchased_time","lead_id","ProspectDetailModal","fadeIn","setLead","hideNonbillable","setHideNonBillable","showHealth","setShowHealth","callId","loadDetail","salesByAuction","full_name","order_name","ReturnStatusBadge","ReturnActionButton","marginTop","Fade","in","exit","home_owner","autoPlayId","getDetail","Reports_ProspectDetailModal","CallColumnChoices","LeadColumnChoices","CallColumnSelect","selectedCols","autoFocus","ordered","findColIndex","Reports_CallColumnSelect","openDetail","openDebug","Reports_Calls","Calls","setReport","detailId","setDetailId","setAuctionId","filtersLoaded","setFiltersLoaded","allowViewSource","getCallColumnChoices","loadCalls","CellResolver","colId","toggleDetail","toggleAuction","getCalls","number_per_page","pages_count","getProspectDetail","Reports_Leads","Leads","returnModalSale","setReturnModalSale","setSalesByAuction","allowViewSales","getLeadColumnChoices","loadLeads","getLeads","auctionIds","salesOverlay","byAuction","loadSalesOverlay","AuctionModal","EditableAuctionId","inputMode","setInputMode","handleGo","handleInputMode","Details_Page","auctionIdRef","Reports_Landing","Landing","payloads","ip_address","user_agent","source_url","birth_date","home_ownership","address_2","bi_per_incident","bi_per_person","contact","continuous_coverage","coverage_type","current_customer","current_policy_expires","bankruptcy","credit_rating","first_licensed","license_state","license_status","occupation","primary_vehicle","relationship","sr_22","home_length","incidents","driver","incident_date","alarm","auto_warranty","average_mileage","collision","commute_days_per_week","comprehensive","current_mileage","ownership","primary_purpose","submodel","vin","stateZips","AA","AE","AK","AL","AP","AR","AS","AZ","CA","CO","CT","DC","DE","FL","FM","GA","GU","HI","IA","ID","IL","IN","KS","KY","LA","MA","MD","ME","MH","MI","MN","MO","MP","MS","MT","NC","ND","NE","NH","NJ","NM","NV","NY","OH","OK","OR","PA","PR","PW","RI","SC","SD","TN","TX","UT","VA","VI","VT","WA","WI","WV","WY","userAgents","mobile","desktop","RequestForm","setPayload","jsonEditorRef","initialAuctionId","loadingAuction","setLoadingAuction","loadAuction","sourceBlocks","usedBlocks","source_token","nextPayload","SourceSelector","sample","objPayload","mergeData","deviceType","htmlElementProps","SubmitButton","submitting","onSubmit","origData","setSources","setVerticals","loadOptions","onSelectProduct","AdResult","image","image_url","url_display","display_url","click_url","ResponseDetails","Results","jsonViewRef","toggleTab","editor","jsonEditor","Matching","MatchChecker","setSubmitting","setResponse","runPing","AttributesTable","globalFilterType","handleEditClick","List_Table","List_Filters","Detail_OptionTarget","OptionTarget","StaticChoiceInputTypes","DynamicChoiceInputTypes","DynamicSourceMap","Detail_Options","Options","unknown_data_choice","updateParentForm","handleOnCheck","data_type","group_id","dynamic_source","line","choicesToText","objChoices","lines","textToChoices","Attribute","preparedFormValues","initFormValues","att","noSelectionLabel","Detail","buttonClick","Attributes_List","AttributeList","selectedAttribute","setSelectedAttribute","isDetailOpen","setIsDetailOpen","handleSelectAttribute","handleCreateNew","InputSchema_InputSchemaTable","onViewSchema","onEditSchema","ParentSchemaCell","allSchemas","ExtendedByCell","schemas","InputSchemaTable_ActionCell","onView","parentSchema","inp","InputSchema_InputSchemaForm","allSchema","parentChoices","setParentChoices","isValidSchema","setIsValidSchema","updateParentChoices","InputSchemaOptionLabel","handleViewParent","input_schemas","Wn","newCode","linting","CONTENT_SCHEMA","additionalProperties","oneOf","$ref","property_def","allow_unknown","enum","anyOf","default","schema_array","minItems","InputSchema_Filters","SchemaApi","Tools_InputSchema","viewSchema","setViewSchema","editSchema","setEditSchema","allowInputSchemaEdit","handleViewSchemaContent","InputSchemaViewModal","LazyIntegrationList","LazyDetails","LazyDetailsEdit","Tools_Integrations","Integrations","RuleSearchApi","Rules_RuleSearchApi","SearchByTarget_Filters","getLabelForTag","RuleSearch","Rules_SearchByTarget","SearchByTarget","RuleSearchResult","filteredAttribute","rule_matches","entityLink","StatusDot","toggleExpanded","RuleLink","ruleLink","LazyDnc","LazyDba","LazyPartners","LazyPermissions","LazyPromotions","LazyReturnRules","LazyRoles","App_Tools","Tools","InputSchema","LazyDashboard","LazyAdManager","LazyUserManager","LazyMyProfileModal","LazyMyPasswordModal","LazyTwoFactorModal","LazyAuctions","LazyDeliveries","LazyRouting","LazyVerticals","LazyPreferences","LazyNotifications","Layout_MainContent","MainContent","ReportsLanding","App_TwoFactorVerify","expiresAt","onVerified","isPosting","setIsPosting","timeRemaining","setTimeRemaining","getSecondsRemaining","useRecoveryCode","setUseRecoveryCode","timerRef","handleSubmit","verify2fa","apiError","errorCode","expired","formEl","elements","namedItem","fontFamily","OtpCodeInput","onComplete","App_TwoFactorEnroll","onEnrolled","TwoFactorEnroll_getSecondsRemaining","TwoFactorEnrollSteps","onEnroll","enrollPending","onConfirm","confirmEnrollPending","onBack","loginStateReducer","activated","twoFactorRequired","twoFactorEnrollmentRequired","Login","loginState","redir","decodeURIComponent","execLogin","login","auth_token","expires_at","lockout_duration_minutes","remainingMinutes","formatDuration","handleTwoFactorVerified","handleTwoFactorCancel","handleEnrolled","handleEnrollmentCancel","TwoFactorEnroll","TwoFactorVerify","App_Login","App_ForgotPassword","ForgotPassword","submitError","setSubmitError","submitSuccess","setSubmitSuccess","setEmail","submitRequest","requestPasswordReset","App_ResetPassword","ResetPassword","resetToken","isPasswordExpiration","resetError","setResetError","tokenExpiredError","setTokenExpiredError","tokenInvalidError","setTokenInvalidError","passwordRuleErrors","setPasswordRuleErrors","resetPassword","PasswordRules","isExpiration","activationStateReducer","user_verified","App_ActivateUser","ActivateUser","activationToken","activationState","activationInfo","setActivationInfo","getActivationInfo","activation","piiFields","getPingPost","accepted_bid_ids","accepted_buyers","ResponseScenarios","ping","bid_amount","time_ms","data_issues","bid_id","default_accepted_bid_ids","todo","pingpost","pingRequestSchema","pingPostRequestSchema","pingResponseSchema","unexpected_fields","invalid_fields","callsPingUrl","callsRequiredFields","getCallsPingMin","phone_suffix","trusted_form_certificate_id","getCallsPingRecommended","tcpa_one_to_one_consent","utm_source","utm_medium","utm_campaign","external_id","form_begin","form_submit","callsPingResponse","visitor_id","callsResponseSchema","callsPingPostUrl","callsPingPostResponse","callsPingPostRequestSchema","callsPingPostErrors","http","meaning","callsErrors","pingUrl","pingPostUrl","postUrl","StepHeader","RequestUrl","PingPostMode","setStep","apiKey","PhaseExamples","schema_example","responses","requestSchema","responseSchema","getPing","DirectMode","CallsMode","CallsPhaseExamples","CallsPingPostExamples","setPhase","requestScenarios","ExampleDisplay","defaultData","scenarios","ErrorTable","idPrefix","ResponseSchema","striped","hover","Schema","getRows","indent","out","subfields","callsRequired","fixedWidth","faLongArrowAltRight","spacing","required_lazy","getResponseRows","currentScenario","setCurrentScenario","dataView","setDataView","scenario","UncontrolledButtonDropdown","JsonExample","CurlExample","dangerouslySetInnerHTML","__html","hljs","language","curlExample","Publishers_PostingInstructions","PostingInstructions","setMode","pingPostStep","setPingPostStep","callsStep","setCallsStep","setSchema","fieldSearch","setFieldSearch","setSourceOptions","callsCapable","activeSources","wrapSchema","handleFieldSearchDebounced","exampleJsonPost","Public_PublisherPostDocs","PublisherPostDocs","setApiKey","postingInstructions","api_key","getPostingInstructions","App_App","App","ErrorBoundary","useRouteError","Layout_ErrorBoundary","createHashRouter","createRoutesFromElements","errorElement","AppRouter","NotificationContainer","toastClassName","bodyClassName","NotificationPosition","TOP_CENTER","hideProgressBar","RouterProvider","Component","loadingFallback","spinner","numberToRound","numberOfDecimalPlaces","scrubbedNumber","arrTokens","delim","singular","plural","isGuid","guid","headline","html_description","logo","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__","_Hooks_useReturnReasons__WEBPACK_IMPORTED_MODULE_14__","setReason","react__WEBPACK_IMPORTED_MODULE_1__","setComment","submitted","setSubmitted","_Hooks_useApi__WEBPACK_IMPORTED_MODULE_13__","reactstrap__WEBPACK_IMPORTED_MODULE_3__","reactstrap__WEBPACK_IMPORTED_MODULE_4__","reactstrap__WEBPACK_IMPORTED_MODULE_5__","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_12__","reactstrap__WEBPACK_IMPORTED_MODULE_8__","reactstrap__WEBPACK_IMPORTED_MODULE_10__","reactstrap__WEBPACK_IMPORTED_MODULE_9__","reactstrap__WEBPACK_IMPORTED_MODULE_7__","reactstrap__WEBPACK_IMPORTED_MODULE_6__","reactstrap__WEBPACK_IMPORTED_MODULE_2__","reactstrap__WEBPACK_IMPORTED_MODULE_11__","isReady","_Hooks_useApi__WEBPACK_IMPORTED_MODULE_9__","loadSourceOptions","_Routing_Rules__WEBPACK_IMPORTED_MODULE_10__","qH","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_8__","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_6__","_Components_Form_EnhancedSelect__WEBPACK_IMPORTED_MODULE_2__","_Components_Form_Select_SourceOptionLabel__WEBPACK_IMPORTED_MODULE_11__","react_router_dom__WEBPACK_IMPORTED_MODULE_7__","_Components_Table_EntityId__WEBPACK_IMPORTED_MODULE_12__","VendorValidationSchema","yup__WEBPACK_IMPORTED_MODULE_7__","VendorForm","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_1__","react_router_dom__WEBPACK_IMPORTED_MODULE_8__","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_9__","_thedmsgroup_mastodon_ui_components_lib_common_Notify__WEBPACK_IMPORTED_MODULE_10__","_index__WEBPACK_IMPORTED_MODULE_2__","T","useQuery","RoutingApi","Mapper_RoutingApi","ChannelOptionLabel","TargetChoices","Mapper_Filters","loadingOrders","setLoadingOrders","targetFromFilters","targetObject","setTargetObject","getAccountOrders","vendorFilterGroup","orderFilterGroup","handleChangeTarget","StatusBadge","SourceNode","targetPosition","sourcePosition","onExamine","flowView","dist_esm","h7","uniqueId","EligibilityNode","onLinkSourceToChannel","onOpenChannelSources","compositeId","Rules","InfoNode","infoIcon","LaneFilterNode","VendorNode","Mapper_ChannelNode","onGetOrders","OrderHandle","right","SourceTokenNode","onAddForCurrentVendor","onAddForCurrentSource","RoutingFlowContext","handleAddForTarget","forNewSource","bMg","OrderNode","onResize","resizeRef","observer","ResizeObserver","observe","disconnect","AlertNode","helpText","FlowHeaderNode","onClearFilters","allowAdd","withProps","WrappedComponent","addedProps","SourceTokenStep","allowCreateTokens","vendorList","setVendorList","saveToken","Components_Modal","newVendors","selectedId","selectedOption","J","SourceModal","vendorPreselections","newSource","setNewSource","LinkChannelSourceModal","selectedChannelId","setSelectedChannelId","setChannelSources","loadChannel","K","SourceTokenModal","sourcePreselections","showPreselect","setShowPreselect","formToken","setFormToken","SourcePreselect","ChannelModal","SourceTokenOptionLabel","TokenOverflow","filterOption","VendorModal","setIsNew","confirmationMode","setConfirmationMode","Vendor_Modal","routingApi","OriginX","OriginY","NodeVerticalGap","RoutingMap","Ln","RoutingMapper","createContext","filterRefreshKey","setFilterRefreshKey","setFlowView","loaded","verticalsLoaded","getDisplayName","getVerticalDisplayName","useVerticals","editSource","setEditSource","sourcePanelOpen","setSourcePanelOpen","candidateSources","setCandidateSources","linkSource","setLinkSource","linkChannelSourcePanelOpen","setLinkChannelSourcePanelOpen","rulesPanelOpen","setRulesPanelOpen","routingRule","setRoutingRule","tokenPanelOpen","setTokenPanelOpen","editToken","setEditToken","candidateVendors","setCandidateVendors","editChannel","setEditChannel","channelPanelOpen","setChannelPanelOpen","channelSourcePanelOpen","setChannelSourcePanelOpen","orderChannel","setOrderChannel","channelOrders","setChannelOrders","editVendor","setEditVendor","overflowTokens","setOverflowTokens","setNodes","onNodesChange","ck","edges","setEdges","onEdgesChange","fM","nodesInitialized","Bu","includeHiddenNodes","setViewport","VH","store","PI","requestAnimationFrame","reflow","getState","previousOfType","vendorNode","sourceTokenNode","sourceNode","eligibilityNode","channelNode","orderNode","newNodes","measured","prevEdges","edge","handleSelectDataView","initSourceView","initChannelView","initVendorView","initOrderView","handleGetChannelOrders","loadChannelOrders","handleExamineChannel","handleExamineSource","openSourceRules","openChannelRules","handleExamineVendor","openVendorRules","closeVendorModal","openChannelSourceRules","openTokenPanel","openSourcePanel","closeSourcePanel","openChannelPanel","openLinkChannelSourcePanel","openChannelSourcePanelFromChannel","getUniqueVendorsFromTokens","handleAddTokenForCurrentVendor","handleAddTokenForCurrentSource","handleExamineOrder","nodeTypes","headerNode","alertNode","infoNode","laneFilterNode","loadSourceView","loadChannelView","loadVendorView","loadOrderView","refreshView","zoom","sourceRoutes","channelRoutes","ordersForChannel","source_limit","vendorRoutes","channelsForOrder","orderNodes","orderEdges","getOrderNodes","updateFlowOrders","getHeaderNodes","baseY","columnsX","vendorX","sourceTokenX","sourceX","eligibilityX","channelX","orderX","nodeHeight","channelY","system_dist_esm","yX","Left","Right","sourceTokenNodes","sourceTokenEdges","getSourceTokenNodesFromSources","sourceHandle","animated","vendorY","react_dom","unstable_batchedUpdates","sourceY","getFilterValues","filterValues","archiveFilter","getSourceTokenNodesFromVendor","eligibilityY","token_overflow","nodeY","orderData","channelsExist","targetHandle","newEdges","getAllIncomers","prevIncomers","FB","incomer","foundNode","getAllOutgoers","prevOutgoers","RM","outgoer","Gc","nodesDraggable","nodesConnectable","selectNodesOnDrag","onNodeClick","allIncomers","allOutgoers","incomerIds","outgoerIds","allIds","connectedEdgeIds","Ll","opacity","nodeConnectedEdgeIds","AX","isConnected","strokeWidth","highlightPath","zoomOnDoubleClick","draggable","onPaneClick","prevElements","aF","reactstrap__WEBPACK_IMPORTED_MODULE_1__","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_5__","_Providers_AppProvider__WEBPACK_IMPORTED_MODULE_9__","enrollData","setEnrollData","fetchEnrollData","handleConfirm","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_7__","qrcode_react__WEBPACK_IMPORTED_MODULE_5__","otpauth_uri","secret","wordBreak","recovery_codes","_Components_Form_OtpCodeInput__WEBPACK_IMPORTED_MODULE_8__","querySelector","RulesMap","lowercase","uppercase","specialchar","blacklist","RuleCheckIcon","passed","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__","resultMode","resultMap","not_new","errorToKey","ruleKey","ruleText","abandoned","answered","busy","canceled","cheat","completed","failed","gathering","machine","redirected","ringing_inbound","ringing_outbound","transfer_failed","_Table_FilterChoices__WEBPACK_IMPORTED_MODULE_1__","IB","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_4__","chart_js__WEBPACK_IMPORTED_MODULE_8__","t1","register","A6","E8","UA","kc","PP","s$","m_","chartjs_plugin_autocolors__WEBPACK_IMPORTED_MODULE_4__","chartjs_plugin_annotation__WEBPACK_IMPORTED_MODULE_5__","chartjs_plugin_zoom__WEBPACK_IMPORTED_MODULE_6__","Ay","_tlemur_chartjs_plugin_crosshair__WEBPACK_IMPORTED_MODULE_7__","SQ","chartRef","handleZoomComplete","date_fns__WEBPACK_IMPORTED_MODULE_11__","date_fns__WEBPACK_IMPORTED_MODULE_10__","dNow","_chart__WEBPACK_IMPORTED_MODULE_3__","Yh","nowLine","xMin","xMax","borderColor","borderWidth","init","rotation","annotation","annotations","wheel","pinch","drag","onZoomComplete","react_chartjs_2__WEBPACK_IMPORTED_MODULE_2__","yP","classnames__WEBPACK_IMPORTED_MODULE_1___default","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_2__","Children","isValidElement","cloneElement","_Hooks_useApi__WEBPACK_IMPORTED_MODULE_6__","isDownloading","setIsDownloading","getData","_thedmsgroup_mastodon_ui_components_lib_common_Notify__WEBPACK_IMPORTED_MODULE_5__","exec","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_4__","_Hooks_useApi__WEBPACK_IMPORTED_MODULE_2__","_EnhancedSelect__WEBPACK_IMPORTED_MODULE_3__","loadingMessage","returnValueAsString","_const__WEBPACK_IMPORTED_MODULE_3__","R","classnames__WEBPACK_IMPORTED_MODULE_4___default","_Form_SimpleSelect__WEBPACK_IMPORTED_MODULE_2__","letterSpacing","CustomKeyMaskOptions","SeedDataForm","editForm","isEditing","duplicateError","onChangeFormType","onChangeSystemKey","onChangeSystemValue","onChangeCustomKey","onChangeCustomValue","isComplexValue","jsonEditCode","setJsonEditCode","jsonEditValid","setJsonEditValid","fieldRule","mustBeSystem","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_15__","xs","_SimpleSelect__WEBPACK_IMPORTED_MODULE_13__","_TargetingManager_TargetSelect__WEBPACK_IMPORTED_MODULE_11__","_TargetingManager_TargetValueForm__WEBPACK_IMPORTED_MODULE_12__","_KeyValueRow__WEBPACK_IMPORTED_MODULE_10__","_Hooks_useApi__WEBPACK_IMPORTED_MODULE_14__","jsonViewMode","setJsonViewMode","_SeedDataDisplay__WEBPACK_IMPORTED_MODULE_17__","KI","editingIndex","setEditingIndex","setEditForm","setDuplicateError","jsonCode","setJsonCode","jsonValid","setJsonValid","currentSeedData","sj","_SeedDataValidation__WEBPACK_IMPORTED_MODULE_16__","TO","missingFields","newRows","currentSeedDataForSort","sortedRows","sN","attrList","getTargetValueFromEl","handleStartEdit","handleCancelEdit","handleSaveEdit","newRow","newSeedData","handleChangeFormType","handleChangeSystemKey","handleChangeSystemValue","handleChangeCustomKey","handleChangeCustomValue","hasNoSeedData","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__","_fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_9__","showActions","formatValueForDisplay","_thedmsgroup_mastodon_ui_components__WEBPACK_IMPORTED_MODULE_6__","isRowRequired","_SeedDataValidation__WEBPACK_IMPORTED_MODULE_7__","Sh","sortRows","aRequired","seedDataToRows","custom","rowsToSeedData","customObj","SeedDataRowDisplay","fieldIsRequired","defaultView","_fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_5__","getFieldValue","isFieldRequired","actualValue","expectedValue","evaluateCondition","getRequiredFields","validateSeedData","hasValue","defaultMessage","yup__WEBPACK_IMPORTED_MODULE_0__","Zg","gl","customMessage","errorText","createError","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_1__","aliases","_Table_EntityId__WEBPACK_IMPORTED_MODULE_2__","displayStatus","setDisplayStatus","updateStatus","updated","classnames__WEBPACK_IMPORTED_MODULE_8___default","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_7__","_utils_string__WEBPACK_IMPORTED_MODULE_9__","IntegrationSettingsView","showJson","setShowJson","deprecatedKeys","utils","deprecatedChoices","S","getSettingDisplay","getSettingValue","def","zQ","exclude_pii","IntegrationSettings_IntegrationSettingsView","TextSetting","help","BooleanSetting","ChoiceSetting","isDeprecatedChoice","IntegrationSettings_SettingsForm","getNewIntegration","fast_copy_default","handleChangeSettingDebounced","handleChangeSetting","handleChangeSettingByName","IntegrationSettingsEditor","getDefinition","originalData","setOriginalData","selectedDefinition","setSelectedDefinition","handleChangeService","handleChangeTimeout","ServiceSelect","hasSettings","handleRemoveDeprecatedSetting","_name","IntegrationOptionLabel","IntegrationSettings_IntegrationSettingsEditor","getConfigLabel","Rules_IntegrationSettings","supportedNames","tooltipTimer","showTip","setShowTip","trigger","handleSelect","react__WEBPACK_IMPORTED_MODULE_0__","_Providers_ChangeProvider__WEBPACK_IMPORTED_MODULE_1__","wb","configRef","prevFiltersJson","prevEntityId","filtersJson","setDrawerConfig","defaultMode","defaultMostRecent","closeDrawer","closeChanges","isDrawerOpen","allowViewChanges","onChangeCallback","keepFilters","initialValues","formSectionMap","contextData","setIsValid","startValues","setStartValues","errorSections","setErrorSections","dirty","react_fast_compare__WEBPACK_IMPORTED_MODULE_1___default","eventOrName","fieldValue","persist","currentValues","lodash__WEBPACK_IMPORTED_MODULE_2__","currentErrors","errorField","validateFormSections","yupValidate","errorFields","section","handleOnSubmit","updatedErrors","initialValue","storedValue","setStoredValue","exValue","_Services_LocalStorageService__WEBPACK_IMPORTED_MODULE_1__","handleStorageChange","perm","_Providers_AppProvider__WEBPACK_IMPORTED_MODULE_1__","baseParseConfig","parseBooleans","baseStringifyConfig","skipNull","skipEmptyString","setFakeState","initialStateRef","stringifyOptions","mergedParseOptions","mergedStringifyOptions","react_router_dom__WEBPACK_IMPORTED_MODULE_2__","queryFromUrl","query_string__WEBPACK_IMPORTED_MODULE_1__","newQuery","_useApi__WEBPACK_IMPORTED_MODULE_1__","lists","setLists","setLoaded","loadReasonLists","getName","listTag","bc","DrawerContext","Drawer","openerFn","isMounted","setIsMounted","panelWidth","setPanelWidth","_Hooks_useLocalStorage__WEBPACK_IMPORTED_MODULE_5__","drawerRef","handleClickOutside","contains","composedPath","closest","handleMouseDown","handleMouseMove","handleMouseUp","newWidth","innerWidth","clientX","drawerContent","classnames__WEBPACK_IMPORTED_MODULE_7___default","onMouseDown","react_dom__WEBPACK_IMPORTED_MODULE_4__","createPortal","innerStyle","panelRef","isFirstRender","setIsFirstRender","setHeight","panel","scrollHeight","_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_3__","sectionNav","keepMounted","_Hooks_useLocalStorage__WEBPACK_IMPORTED_MODULE_4__","classnames__WEBPACK_IMPORTED_MODULE_3___default","collapsed","LazyChangeTimeline","_utils_Lazify__WEBPACK_IMPORTED_MODULE_7__","ChangeActionsContext","ChangeContext","setSelectedId","openDrawer","drawerConfig","lastMutatedAt","setIsDrawerOpen","hasOpened","setHasOpened","_setDrawerConfig","setLastMutatedAt","drawerConfigRef","apiAttributes","_Hooks_usePermission__WEBPACK_IMPORTED_MODULE_3__","groupAttrs","contextValue","actionsValue","_Layout_Drawer__WEBPACK_IMPORTED_MODULE_8__","onSetEntity"],"sourceRoot":""}