adserver-dashboard 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ci/staging.yml +191 -0
- package/.dockerignore +117 -0
- package/.env +40 -0
- package/.env.staging +38 -0
- package/.gitlab-ci.yml +16 -0
- package/DEMO_STATUS.md +579 -0
- package/Dockerfile +61 -0
- package/Influence-MW-AdServer-12-02-2026/client/index.html +17 -0
- package/Influence-MW-AdServer-12-02-2026/client/public/favicon.png +0 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/App.tsx +91 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/advanced-map-drawer.tsx +1131 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ai-recommendation-panel.tsx +379 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/app-sidebar.tsx +183 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/auto-optimize-button.tsx +184 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/availability-drawer.tsx +385 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/brand-insights-panel.tsx +87 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/create-agency-drawer.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/create-brand-drawer.tsx +275 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/creative-assignment.tsx +526 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table-toolbar.tsx +148 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table.tsx +158 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/filter-drawer.tsx +356 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/form-insights-panel.tsx +82 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/geography-selector.tsx +699 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/header-user-menu.tsx +178 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/history-drawer.tsx +313 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-availability-section.tsx +176 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-format-drawer.tsx +173 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-selector.tsx +401 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/manual-inventory-drawer.tsx +368 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/mapbox-map.tsx +368 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/market-insights-panel.tsx +202 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/media-owner-drawer.tsx +217 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/metric-card.tsx +58 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/page-header.tsx +27 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/player-status-indicator.tsx +137 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/poi-targeting-drawer.tsx +298 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/recommendation-score-badge.tsx +102 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/recommended-inventories-panel.tsx +248 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/searchable-combobox.tsx +134 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/signal-visualizations.tsx +407 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/status-badge.tsx +35 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-provider.tsx +73 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-toggle.tsx +37 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/traffic-slider.tsx +75 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/accordion.tsx +56 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert-dialog.tsx +139 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert.tsx +59 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/aspect-ratio.tsx +5 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/avatar.tsx +51 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/badge.tsx +38 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/breadcrumb.tsx +115 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/button.tsx +62 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/calendar.tsx +68 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/card.tsx +85 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/carousel.tsx +260 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/chart.tsx +365 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/checkbox.tsx +28 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/collapsible.tsx +11 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/command.tsx +151 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/context-menu.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dialog.tsx +122 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/drawer.tsx +118 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dropdown-menu.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/form.tsx +178 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/hover-card.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input-otp.tsx +69 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input.tsx +23 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/label.tsx +24 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/menubar.tsx +256 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/navigation-menu.tsx +128 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/pagination.tsx +117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/popover.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/progress.tsx +28 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/radio-group.tsx +42 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/resizable.tsx +45 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/scroll-area.tsx +46 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/select.tsx +160 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/separator.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sheet.tsx +140 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sidebar.tsx +727 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/skeleton.tsx +15 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/slider.tsx +26 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/switch.tsx +27 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/table.tsx +117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tabs.tsx +53 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/textarea.tsx +22 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toast.tsx +127 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toaster.tsx +33 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle-group.tsx +61 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle.tsx +43 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tooltip.tsx +30 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/vendor-stores-modal.tsx +336 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-drawer.tsx +359 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-selector.tsx +436 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-mobile.tsx +19 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-toast.ts +191 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/index.css +244 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/queryClient.ts +57 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/utils.ts +39 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/venue-taxonomy.ts +532 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/main.tsx +5 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/assign-creative.tsx +781 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/content-hub.tsx +995 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/custom-pois.tsx +431 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/dashboard.tsx +620 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-detail.tsx +1062 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-form.tsx +1570 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deals.tsx +716 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/edit-creative-assignment.tsx +1051 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/geotargeting.tsx +675 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/integrations.tsx +425 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-creatives.tsx +622 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-form.tsx +3132 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-items.tsx +530 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/not-found.tsx +21 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play-upload.tsx +479 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play.tsx +880 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/reports.tsx +235 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/settings.tsx +652 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/signal-form.tsx +1117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/signals.tsx +366 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/tags.tsx +332 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/venues.tsx +381 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/types/mapbox-gl-draw.d.ts +37 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/types/react-simple-maps.d.ts +57 -0
- package/Influence-MW-AdServer-12-02-2026/components.json +20 -0
- package/Influence-MW-AdServer-12-02-2026/docs/PRD.md +3373 -0
- package/Influence-MW-AdServer-12-02-2026/docs/influence-feature-mapping.csv +498 -0
- package/Influence-MW-AdServer-12-02-2026/drizzle.config.ts +14 -0
- package/Influence-MW-AdServer-12-02-2026/package-lock.json +9672 -0
- package/Influence-MW-AdServer-12-02-2026/package.json +118 -0
- package/Influence-MW-AdServer-12-02-2026/postcss.config.js +6 -0
- package/Influence-MW-AdServer-12-02-2026/replit.md +91 -0
- package/Influence-MW-AdServer-12-02-2026/script/build.ts +67 -0
- package/Influence-MW-AdServer-12-02-2026/scripts/create-miro-diagrams.cjs +318 -0
- package/Influence-MW-AdServer-12-02-2026/scripts/create-remaining-diagrams.cjs +270 -0
- package/Influence-MW-AdServer-12-02-2026/server/index.ts +103 -0
- package/Influence-MW-AdServer-12-02-2026/server/recommendation-service.ts +319 -0
- package/Influence-MW-AdServer-12-02-2026/server/routes.ts +1890 -0
- package/Influence-MW-AdServer-12-02-2026/server/static.ts +19 -0
- package/Influence-MW-AdServer-12-02-2026/server/storage.ts +2058 -0
- package/Influence-MW-AdServer-12-02-2026/server/vite.ts +58 -0
- package/Influence-MW-AdServer-12-02-2026/shared/schema.ts +1595 -0
- package/Influence-MW-AdServer-12-02-2026/tailwind.config.ts +107 -0
- package/Influence-MW-AdServer-12-02-2026/tsconfig.json +23 -0
- package/Influence-MW-AdServer-12-02-2026/vite.config.ts +40 -0
- package/LINE_ITEM_BUDGET_FIELD_MAPPING.md +178 -0
- package/PCM/.env.example +92 -0
- package/PCM/README.md +558 -0
- package/PCM/docs/TEST_CASES.md +422 -0
- package/PCM/index.js +106 -0
- package/PCM/package-lock.json +3282 -0
- package/PCM/package.json +32 -0
- package/PCM/replit.md +64 -0
- package/PCM/schema.sql +495 -0
- package/PCM/scripts/export-schema.js +183 -0
- package/PCM/scripts/seed-comprehensive.js +631 -0
- package/PCM/scripts/seed-production.js +477 -0
- package/PCM/src/config/db.js +56 -0
- package/PCM/src/config/swagger.js +5975 -0
- package/PCM/src/dto/EmailRequestDTO.js +166 -0
- package/PCM/src/middleware/errorHandler.js +52 -0
- package/PCM/src/middleware/logger.js +26 -0
- package/PCM/src/migrations/001_add_campaign_mode_fields.sql +36 -0
- package/PCM/src/migrations/002_create_deal_id_counters.sql +22 -0
- package/PCM/src/migrations/003_update_publishers_column.sql +15 -0
- package/PCM/src/migrations/004_add_direct_dealtype_and_advertiser.sql +5 -0
- package/PCM/src/migrations/005_add_programmatic_fields_and_update_enums.sql +31 -0
- package/PCM/src/migrations/006_add_line_item_programmatic_fields.sql +12 -0
- package/PCM/src/migrations/007_add_line_item_direct_fields.sql +15 -0
- package/PCM/src/migrations/008_add_inventory_fields.sql +45 -0
- package/PCM/src/migrations/009_move_inventory_fields_to_metadata.sql +32 -0
- package/PCM/src/migrations/010_add_draft_status_and_line_items_count.sql +23 -0
- package/PCM/src/migrations/011_add_planning_field.sql +21 -0
- package/PCM/src/migrations/012_fix_inventory_composite_pk.sql +17 -0
- package/PCM/src/migrations/013_make_external_id_optional.sql +3 -0
- package/PCM/src/migrations/014_create_change_history.sql +38 -0
- package/PCM/src/migrations/016_create_publisher_insertion_orders.sql +33 -0
- package/PCM/src/migrations/017_fix_line_item_id_fk_reference.sql +86 -0
- package/PCM/src/migrations/018_create_approval_tables.sql +44 -0
- package/PCM/src/migrations/019_add_encrypted_token_column.sql +2 -0
- package/PCM/src/migrations/020_add_rejection_reason_to_deals.sql +10 -0
- package/PCM/src/migrations/021_add_publisher_external_id_to_inventories.sql +12 -0
- package/PCM/src/migrations/022_add_line_item_extended_fields.sql +24 -0
- package/PCM/src/migrations/023_add_base_price_fields.sql +8 -0
- package/PCM/src/migrations/run-migrations.js +46 -0
- package/PCM/src/models/ApprovalOTP.js +51 -0
- package/PCM/src/models/ApprovalToken.js +79 -0
- package/PCM/src/models/ChangeHistory.js +107 -0
- package/PCM/src/models/Deal.js +186 -0
- package/PCM/src/models/DealIdCounter.js +28 -0
- package/PCM/src/models/LineItem.js +227 -0
- package/PCM/src/models/LineItemCreative.js +89 -0
- package/PCM/src/models/LineItemInventory.js +115 -0
- package/PCM/src/models/PublisherInsertionOrder.js +93 -0
- package/PCM/src/models/TransactionHistory.js +34 -0
- package/PCM/src/models/associations.js +81 -0
- package/PCM/src/routes/approval.js +321 -0
- package/PCM/src/routes/creatives.js +437 -0
- package/PCM/src/routes/deals.js +1638 -0
- package/PCM/src/routes/digitalSignage.js +242 -0
- package/PCM/src/routes/insertionOrders.js +380 -0
- package/PCM/src/routes/lineItems.js +926 -0
- package/PCM/src/routes/system.js +384 -0
- package/PCM/src/services/ApprovalService.js +885 -0
- package/PCM/src/services/CampaignImportConverter.js +631 -0
- package/PCM/src/services/CampaignModeService.js +273 -0
- package/PCM/src/services/CampaignStatusService.js +395 -0
- package/PCM/src/services/ChangeHistoryService.js +316 -0
- package/PCM/src/services/DealIdService.js +94 -0
- package/PCM/src/services/DealResponseFormatter.js +90 -0
- package/PCM/src/services/EmailNotificationService.js +315 -0
- package/PCM/src/services/LineItemResponseFormatter.js +122 -0
- package/PCM/src/services/LineItemStatusService.js +380 -0
- package/PCM/src/tests/comprehensiveTestRunner.js +360 -0
- package/PCM/src/tests/comprehensiveTests.js +1277 -0
- package/PCM/src/tests/dealTypeUnitTests.js +1058 -0
- package/PCM/src/tests/testRunner.js +248 -0
- package/PCM/src/utils/caseConverter.js +92 -0
- package/PCM/src/utils/dealCalculations.js +206 -0
- package/PCM/src/utils/lineItemPayloadNormalizer.js +41 -0
- package/PCM/src/utils/payloadNormalizer.js +34 -0
- package/PCM/src/utils/sourceNormalizer.js +56 -0
- package/PCM/src/validators/creativeValidator.js +27 -0
- package/PCM/src/validators/dealValidator.js +203 -0
- package/PCM/src/validators/lineItemValidator.js +489 -0
- package/PCM/tests/approval-flows.test.js +238 -0
- package/PCM/tests/approval-workflow.test.js +291 -0
- package/PCM/tests/campaign-import-converter.test.js +543 -0
- package/PCM/tests/campaign-import-e2e.test.js +520 -0
- package/PCM/tests/campaign-status.test.js +539 -0
- package/PCM/tests/direct-publisher-split-reimport.test.js +460 -0
- package/PCM/tests/e2e/digital-signage.test.js +145 -0
- package/PCM/tests/e2e/search-filter-pagination.test.js +399 -0
- package/PCM/tests/e2e-comprehensive.test.js +3446 -0
- package/PCM/tests/edge-cases.test.js +340 -0
- package/PCM/tests/line-item-status.test.js +340 -0
- package/PCM/tests/seller-account-external-ids.test.js +877 -0
- package/PCM/tests/source-validation.test.js +324 -0
- package/PRD.md +3373 -0
- package/README.md +186 -0
- package/client/index.html +35 -0
- package/client/public/DEMO_STATUS.md +579 -0
- package/client/public/img/MW-logo-trans_1754045676555.png +0 -0
- package/client/public/locales/ar/approval.json +144 -0
- package/client/public/locales/ar/buyer.json +61 -0
- package/client/public/locales/ar/campaigns.json +1 -0
- package/client/public/locales/ar/common.json +218 -0
- package/client/public/locales/ar/contentHub.json +266 -0
- package/client/public/locales/ar/creatives.json +79 -0
- package/client/public/locales/ar/dashboard.json +57 -0
- package/client/public/locales/ar/deals.json +886 -0
- package/client/public/locales/ar/dsp.json +131 -0
- package/client/public/locales/ar/inventory.json +201 -0
- package/client/public/locales/ar/lineItems.json +553 -0
- package/client/public/locales/ar/navigation.json +48 -0
- package/client/public/locales/ar/wizard.json +1 -0
- package/client/public/locales/en/approval.json +144 -0
- package/client/public/locales/en/buyer.json +65 -0
- package/client/public/locales/en/campaigns.json +1 -0
- package/client/public/locales/en/common.json +218 -0
- package/client/public/locales/en/contentHub.json +266 -0
- package/client/public/locales/en/creatives.json +79 -0
- package/client/public/locales/en/dashboard.json +57 -0
- package/client/public/locales/en/deals.json +886 -0
- package/client/public/locales/en/dsp.json +131 -0
- package/client/public/locales/en/inventory.json +201 -0
- package/client/public/locales/en/lineItems.json +659 -0
- package/client/public/locales/en/navigation.json +48 -0
- package/client/public/locales/en/wizard.json +1 -0
- package/client/public/locales/ja/approval.json +144 -0
- package/client/public/locales/ja/buyer.json +61 -0
- package/client/public/locales/ja/campaigns.json +1 -0
- package/client/public/locales/ja/common.json +218 -0
- package/client/public/locales/ja/contentHub.json +266 -0
- package/client/public/locales/ja/creatives.json +79 -0
- package/client/public/locales/ja/dashboard.json +57 -0
- package/client/public/locales/ja/deals.json +886 -0
- package/client/public/locales/ja/dsp.json +131 -0
- package/client/public/locales/ja/inventory.json +201 -0
- package/client/public/locales/ja/lineItems.json +553 -0
- package/client/public/locales/ja/navigation.json +48 -0
- package/client/public/locales/ja/wizard.json +1 -0
- package/client/public/locales/zh/approval.json +144 -0
- package/client/public/locales/zh/buyer.json +61 -0
- package/client/public/locales/zh/campaigns.json +1 -0
- package/client/public/locales/zh/common.json +218 -0
- package/client/public/locales/zh/contentHub.json +266 -0
- package/client/public/locales/zh/creatives.json +79 -0
- package/client/public/locales/zh/dashboard.json +57 -0
- package/client/public/locales/zh/deals.json +886 -0
- package/client/public/locales/zh/dsp.json +131 -0
- package/client/public/locales/zh/inventory.json +201 -0
- package/client/public/locales/zh/lineItems.json +553 -0
- package/client/public/locales/zh/navigation.json +48 -0
- package/client/public/locales/zh/wizard.json +1 -0
- package/client/public/manifest.json +36 -0
- package/client/src/App.tsx +464 -0
- package/client/src/components/app-sidebar.tsx +312 -0
- package/client/src/components/approval/approval-decision-form.test.tsx +294 -0
- package/client/src/components/approval/approval-decision-form.tsx +326 -0
- package/client/src/components/approval/approval-sheet.tsx +631 -0
- package/client/src/components/approval/line-item-details-sheet.tsx +371 -0
- package/client/src/components/approval/otp-verification.test.tsx +337 -0
- package/client/src/components/approval/otp-verification.tsx +180 -0
- package/client/src/components/content-hub/bulk-transcode-dialog.tsx +379 -0
- package/client/src/components/content-hub/content-hub-manager-v2.tsx +574 -0
- package/client/src/components/content-hub/content-hub-manager.tsx +330 -0
- package/client/src/components/content-hub/creative-card.tsx +456 -0
- package/client/src/components/content-hub/creative-detail-sheet.tsx +685 -0
- package/client/src/components/content-hub/creative-filters.tsx +457 -0
- package/client/src/components/content-hub/creative-grid.tsx +329 -0
- package/client/src/components/content-hub/creative-selector.tsx +415 -0
- package/client/src/components/content-hub/creative-upload.tsx +547 -0
- package/client/src/components/content-hub/folder-dialogs.tsx +445 -0
- package/client/src/components/content-hub/folder-list.tsx +280 -0
- package/client/src/components/content-hub/review-dialogs.tsx +268 -0
- package/client/src/components/content-hub/transcode-dialog.tsx +226 -0
- package/client/src/components/creative-library/creative-details-view.tsx +446 -0
- package/client/src/components/creative-library/creative-filters-panel.tsx +203 -0
- package/client/src/components/creative-library/creative-list.tsx +360 -0
- package/client/src/components/creative-library/creative-status-badge.tsx +71 -0
- package/client/src/components/creative-library/folder-card.tsx +78 -0
- package/client/src/components/creative-library/index.ts +27 -0
- package/client/src/components/creative-library/new-creative-card.tsx +211 -0
- package/client/src/components/creative-library/upload-creative-dialog.tsx +261 -0
- package/client/src/components/dashboard-overview.tsx +109 -0
- package/client/src/components/deals/approval-history-panel.test.tsx +240 -0
- package/client/src/components/deals/approval-history-panel.tsx +156 -0
- package/client/src/components/deals/deal-status-badge.tsx +92 -0
- package/client/src/components/deals/import-from-planner-dialog.tsx +399 -0
- package/client/src/components/deals/market-insights-panel.tsx +237 -0
- package/client/src/components/deals/reopen-deal-sheet.tsx +191 -0
- package/client/src/components/deals/request-approval-sheet.test.tsx +323 -0
- package/client/src/components/deals/request-approval-sheet.tsx +136 -0
- package/client/src/components/deals/resend-approval-sheet.tsx +201 -0
- package/client/src/components/direct-campaigns/campaign-card.tsx +283 -0
- package/client/src/components/direct-campaigns/deal-filter-panel.tsx +325 -0
- package/client/src/components/inventory/advanced-filters-panel.tsx +273 -0
- package/client/src/components/inventory/csv-upload-modal.tsx +639 -0
- package/client/src/components/inventory/inventory-availability-view.tsx +486 -0
- package/client/src/components/inventory/inventory-details-sheet.tsx +376 -0
- package/client/src/components/inventory/inventory-map-view.tsx +596 -0
- package/client/src/components/inventory/inventory-settings-menu.tsx +52 -0
- package/client/src/components/language-switcher.tsx +53 -0
- package/client/src/components/line-items/campaign-forecast-panel.tsx +138 -0
- package/client/src/components/line-items/form-insights.tsx +89 -0
- package/client/src/components/line-items/geofencing/LocationCsvUploadDrawer.tsx +100 -0
- package/client/src/components/line-items/geofencing/POIDropdown.tsx +379 -0
- package/client/src/components/line-items/geofencing/SelectedLocationsSidebar.tsx +436 -0
- package/client/src/components/line-items/geofencing/ViewFileLocationDrawer.tsx +199 -0
- package/client/src/components/line-items/geofencing/components/ExistingFilesTab.tsx +268 -0
- package/client/src/components/line-items/geofencing/components/TemplateDownloadSection.tsx +59 -0
- package/client/src/components/line-items/geofencing/components/UploadTab.tsx +215 -0
- package/client/src/components/line-items/geofencing-map.tsx +1270 -0
- package/client/src/components/line-items/inventory-availability-section.tsx +178 -0
- package/client/src/components/line-items/line-item-schedule-manager.tsx +313 -0
- package/client/src/components/line-items/manual-inventory-drawer.tsx +346 -0
- package/client/src/components/line-items/planner-inventory-card.tsx +495 -0
- package/client/src/components/line-items/planner-schedule-grid.tsx +495 -0
- package/client/src/components/line-items/schedule-rule-editor.tsx +649 -0
- package/client/src/components/line-items/schedule-rule-types.ts +122 -0
- package/client/src/components/line-items/steps/creatives-step.tsx +681 -0
- package/client/src/components/line-items/steps/inventory-schedule-step.tsx +1596 -0
- package/client/src/components/line-items/steps/inventory-step.tsx +1533 -0
- package/client/src/components/line-items/steps/line-item-details-step.tsx +916 -0
- package/client/src/components/line-items/steps/schedule-step.tsx +273 -0
- package/client/src/components/line-items/steps/summary-step.tsx +680 -0
- package/client/src/components/line-items/steps/targeting-step.tsx +1708 -0
- package/client/src/components/product-switcher.tsx +105 -0
- package/client/src/components/protected-route.tsx +49 -0
- package/client/src/components/skip-link.tsx +22 -0
- package/client/src/components/stat-card.tsx +53 -0
- package/client/src/components/status-badge.tsx +96 -0
- package/client/src/components/ui/hierarchical-venue-selector.tsx +389 -0
- package/client/src/components/ui/toaster.tsx +111 -0
- package/client/src/contexts/auth-context.tsx +181 -0
- package/client/src/contexts/sidebar-state.tsx +50 -0
- package/client/src/contexts/theme-context.tsx +66 -0
- package/client/src/data/campaign-data.json +107 -0
- package/client/src/data/countries.json +22 -0
- package/client/src/hooks/use-approval.ts +366 -0
- package/client/src/hooks/use-keyboard-shortcuts.ts +74 -0
- package/client/src/hooks/use-media-query.ts +46 -0
- package/client/src/hooks/use-mobile.tsx +19 -0
- package/client/src/hooks/use-page-title.ts +21 -0
- package/client/src/hooks/use-toast.ts +195 -0
- package/client/src/index.css +694 -0
- package/client/src/lib/__tests__/accessibility.test.ts +104 -0
- package/client/src/lib/__tests__/date-utils.test.ts +199 -0
- package/client/src/lib/__tests__/dsp-buyer-api.test.ts +127 -0
- package/client/src/lib/__tests__/dsp-buyer-integration.test.ts +247 -0
- package/client/src/lib/__tests__/storage-utils.test.ts +167 -0
- package/client/src/lib/__tests__/utils.test.ts +57 -0
- package/client/src/lib/accessibility.ts +141 -0
- package/client/src/lib/api-config.ts +9 -0
- package/client/src/lib/auth-service.ts +209 -0
- package/client/src/lib/campaign-creative-api.ts +82 -0
- package/client/src/lib/company-api.ts +61 -0
- package/client/src/lib/content-hub-api.ts +407 -0
- package/client/src/lib/creative-mapper.ts +61 -0
- package/client/src/lib/date-utils.ts +119 -0
- package/client/src/lib/deal-helpers.ts +220 -0
- package/client/src/lib/dsp-buyer-api.ts +196 -0
- package/client/src/lib/geo-import-api.ts +151 -0
- package/client/src/lib/google-poi-api.ts +305 -0
- package/client/src/lib/i18n/__tests__/formatting.test.ts +202 -0
- package/client/src/lib/i18n/formatting.ts +130 -0
- package/client/src/lib/i18n/index.ts +8 -0
- package/client/src/lib/i18n-compat.ts +76 -0
- package/client/src/lib/influence-deals-api.ts +896 -0
- package/client/src/lib/inventory-api.ts +399 -0
- package/client/src/lib/oauth-service.ts +678 -0
- package/client/src/lib/poi-types.ts +75 -0
- package/client/src/lib/queryClient.ts +144 -0
- package/client/src/lib/recommendation-api.ts +380 -0
- package/client/src/lib/storage-utils.ts +104 -0
- package/client/src/lib/tolgee.ts +85 -0
- package/client/src/lib/utils.ts +0 -0
- package/client/src/main.tsx +67 -0
- package/client/src/mapbox-draw-modes.d.ts +32 -0
- package/client/src/pages/all-folders.tsx +203 -0
- package/client/src/pages/auth-callback.tsx +115 -0
- package/client/src/pages/buyer-form.tsx +339 -0
- package/client/src/pages/buyer-list.tsx +622 -0
- package/client/src/pages/content-hub.tsx +1358 -0
- package/client/src/pages/create-deal.tsx +2093 -0
- package/client/src/pages/creative-assignment-page.tsx +548 -0
- package/client/src/pages/creatives.tsx +5 -0
- package/client/src/pages/custom-pois.tsx +425 -0
- package/client/src/pages/dashboard.tsx +615 -0
- package/client/src/pages/deal-history.tsx +434 -0
- package/client/src/pages/deal-line-items.tsx +1703 -0
- package/client/src/pages/demo-status.tsx +113 -0
- package/client/src/pages/direct-campaign-details.tsx +361 -0
- package/client/src/pages/direct-campaigns-new.tsx +824 -0
- package/client/src/pages/dsp-form.tsx +803 -0
- package/client/src/pages/dsp-list.tsx +239 -0
- package/client/src/pages/folder-content.tsx +336 -0
- package/client/src/pages/integrations.tsx +429 -0
- package/client/src/pages/line-item-creatives.tsx +789 -0
- package/client/src/pages/line-item-detail-page.tsx +684 -0
- package/client/src/pages/line-item-form-page.tsx +3261 -0
- package/client/src/pages/line-item-wizard.tsx +1207 -0
- package/client/src/pages/login.tsx +154 -0
- package/client/src/pages/not-found.tsx +23 -0
- package/client/src/pages/proof-of-play.tsx +397 -0
- package/client/src/pages/public-approval.tsx +551 -0
- package/client/src/pages/reports.tsx +231 -0
- package/client/src/pages/settings.tsx +760 -0
- package/client/src/pages/signals.tsx +389 -0
- package/client/src/pages/tags.tsx +318 -0
- package/client/src/pages/test-results.tsx +328 -0
- package/client/src/store/hooks.ts +5 -0
- package/client/src/store/index.ts +15 -0
- package/client/src/store/mapMarkerLocationsSlice.ts +241 -0
- package/client/src/styles/design-tokens.css +324 -0
- package/client/src/test/setup.ts +261 -0
- package/client/src/test/test-utils.tsx +40 -0
- package/client/src/types/approval.ts +221 -0
- package/client/src/types/content-hub.ts +209 -0
- package/client/src/types/geofencing.ts +67 -0
- package/client/src/types/transcoding.ts +140 -0
- package/client/src/vite-env.d.ts +18 -0
- package/components.json +20 -0
- package/creative-api.json +1 -0
- package/docs/AI_REFERENCE.md +459 -0
- package/docs/MWDesign-Prompt.md +132 -0
- package/docs/MWDesign-System.md +344 -0
- package/docs/test-plan.md +277 -0
- package/e2e/AUTONOMOUS-TESTING.md +406 -0
- package/e2e/README.md +219 -0
- package/e2e/autonomous-flow.spec.ts +308 -0
- package/e2e/debug-sso.spec.ts +163 -0
- package/e2e/direct-campaigns.spec.ts +219 -0
- package/e2e/explore-sso.spec.ts +149 -0
- package/e2e/fixtures/auth.ts +26 -0
- package/e2e/fixtures/enhanced-test.ts +331 -0
- package/e2e/pagination.spec.ts +280 -0
- package/e2e/view-toggle.spec.ts +312 -0
- package/generated-icon.png +0 -0
- package/i18next-scanner.config.cjs +46 -0
- package/package.json +141 -0
- package/playwright.config.ts +93 -0
- package/postcss.config.js +6 -0
- package/replit.md +196 -0
- package/screenshot-after-login.png +0 -0
- package/screenshot-contenthub-grid.png +0 -0
- package/screenshot-contenthub-list-fixed.png +0 -0
- package/screenshot-contenthub-list.png +0 -0
- package/screenshot-create-deal.png +0 -0
- package/screenshot-dashboard.png +0 -0
- package/screenshot-deals.png +0 -0
- package/screenshot-login-filled.png +0 -0
- package/screenshot-login.png +0 -0
- package/screenshot.mjs +24 -0
- package/scripts/deploy-stg.sh +185 -0
- package/shared/direct-io-schema.ts +383 -0
- package/shared/schema.ts +439 -0
- package/shared/screen-types.ts +149 -0
- package/springdocDefault.json +1 -0
- package/swagger-ui-bundle.js +2 -0
- package/swagger-ui-init.js +10316 -0
- package/tailwind.config.ts +282 -0
- package/terraform/README.md +306 -0
- package/terraform/cloudfront.tf +289 -0
- package/terraform/ecs.tf +727 -0
- package/terraform/environments/dev.tfvars +59 -0
- package/terraform/environments/production.tfvars +60 -0
- package/terraform/main.tf +47 -0
- package/terraform/outputs.tf +145 -0
- package/terraform/s3.tf +192 -0
- package/terraform/variables.tf +226 -0
- package/terraform/waf.tf +165 -0
- package/terraform-frontend/.terraform.lock.hcl +25 -0
- package/terraform-frontend/README.md +85 -0
- package/terraform-frontend/cloudfront.tf +125 -0
- package/terraform-frontend/main.tf +31 -0
- package/terraform-frontend/outputs.tf +24 -0
- package/terraform-frontend/terraform.tfvars +12 -0
- package/terraform-frontend/variables.tf +53 -0
- package/tsconfig.json +23 -0
- package/vite.config.ts +226 -0
- package/vitest.config.ts +56 -0
package/DEMO_STATUS.md
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
# Ad Server Platform - Demo Status
|
|
2
|
+
|
|
3
|
+
**Last Updated**: February 18, 2026
|
|
4
|
+
**Demo Date**: December 26, 2025
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Executive Summary
|
|
9
|
+
|
|
10
|
+
The Ad Server Platform is ready for demo. The core deal creation workflow, authentication, targeting (including geofencing), inventory selection, **public approval workflow** for DIRECT mode campaigns, **third-party platform integration** via `/deals/import/convert` API, and **DSP/Buyer management modules** are fully functional. Recent updates include a **redesigned Line Item form** with single-page layout, pill-style Ad Duration selection, Sheet-based Media Owner and Inventory Format selectors, dedicated Pacing & Traffic Allocation section, **consistent table styling** across DSP and Buyer list pages, **API payload cleanup** removing UI-only fields, **weather signal targeting** for DIRECT deals, **geofencing coordinate fix**, **side popover pattern** for all targeting sections with real API integrations, **consistent navigation pattern** with left-side back icon across deal pages, **Market Insights Panel** in deal creation sidebar, and **branded authentication loader**.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Recent Development
|
|
15
|
+
|
|
16
|
+
### February 18, 2026
|
|
17
|
+
|
|
18
|
+
| Category | Changes |
|
|
19
|
+
|----------|---------|
|
|
20
|
+
| **Update Deal - Back Button Fix** | Removed duplicate "Back to Deals" button from Update Deal page header; only left-side back arrow icon remains, consistent with line item form navigation pattern |
|
|
21
|
+
| **Navigation Consistency** | Standardized back navigation across deal pages — Update Deal and Direct Campaign Details use icon-only back button on left side; Line Item form uses simplified "Back" text button |
|
|
22
|
+
| **Market Insights Panel** | Added Market Insights sidebar panel to deal creation/edit page showing country demographics, population, available inventories, and estimated impressions |
|
|
23
|
+
| **Auth Callback - Brand Loader** | Authentication callback page now uses `MWBrandLoader` component for branded loading experience during sign-in flow |
|
|
24
|
+
| **Settings - Recommendation Weights** | Settings page includes configurable weight sliders for recommendation algorithm (Measure Fit, Geo Fit, Availability, Budget Fit, Audience Fit, Brand Fit, Quality Fit, Time Fit) |
|
|
25
|
+
| **Non-Billable for Traditional Deals** | Added `nonBillable` checkbox to Traditional (DIRECT) deal creation form; field included in `direct` payload and restored in edit mode |
|
|
26
|
+
|
|
27
|
+
### February 17, 2026
|
|
28
|
+
|
|
29
|
+
| Category | Changes |
|
|
30
|
+
|----------|---------|
|
|
31
|
+
| **API Payload Cleanup** | Removed UI-only fields not in API schema: `unlimitedBudget`, `automatedBidding`, `signalEnabled`, generic Signals section, Billing (billable/non-billable) |
|
|
32
|
+
| **Delivery Targeting Restriction** | `deliveryTargeting` restricted to DIRECT deals only — API rejects it for PROGRAMMATIC; UI section hidden for programmatic line items |
|
|
33
|
+
| **New Payload Fields** | Added `frequencyCap`, `trafficAllocation`, `inventorySource` to line item API payload and builder functions |
|
|
34
|
+
| **Weather Signals (DIRECT)** | New "Delivery Signals" section with weather conditions grid (Sunny, Partly Cloudy, Cloudy, Rainy, Stormy, Snowy, Windy, Foggy, Hazy) and temperature range (min/max with Celsius/Fahrenheit) |
|
|
35
|
+
| **Geofencing Coordinates** | Geofencing payload now sends `lat` and `lng` (required by API); handles Point geometries (search) and Polygon geometries (centroid); edit mode restores `geoLocations` state |
|
|
36
|
+
| **SSP/Exchange Sheet** | Replaced inline Collapsible with Sheet (side popover) for SSP/Exchange selection; real API integration with `/api/v1/companies?is_ssp=true` |
|
|
37
|
+
| **Inventory Type Sheet** | Side popover for inventory type selection; real API integration with `/api/v1/inventory-types`; API queries only fire when drawer is open |
|
|
38
|
+
| **Media Owner Sheet** | Side popover with real API data from companies endpoint |
|
|
39
|
+
| **Inventory Format Sheet** | Side popover for inventory display formats; real API integration with `/api/v1/inventory-display-formats` |
|
|
40
|
+
| **Venue Type Tree** | Recursive tree with unlimited hierarchy depth (API-driven); side drawer with search and checkboxes |
|
|
41
|
+
| **Deal Creation Fixes** | Removed description field from programmatic deals; removed seller field from deal list/filters; fixed impression multiplier type handling; removed status dropdown from deal creation |
|
|
42
|
+
| **Line Item Priority** | Added priority field to line item API payload |
|
|
43
|
+
| **Custom Fees** | Custom fees now included in line item creation payload |
|
|
44
|
+
| **Geography Map** | Map opens directly by clicking the geography row |
|
|
45
|
+
| **Form Validation** | Validation errors shown to user on save |
|
|
46
|
+
| **Traditional Deal Fixes** | Bid Strategy and Auction Type hidden for traditional deals |
|
|
47
|
+
| **DSP/Buyer Real API** | Real API data for DSP (read-only) and Buyer (CRUD) pages; added to side menu |
|
|
48
|
+
| **Sticky Sidebar** | Sidebar navigation stays fixed while scrolling |
|
|
49
|
+
| **Theme Selection** | Theme picker added to profile dropdown |
|
|
50
|
+
| **Custom Toggle** | Custom toggle switch component replacing Switch for better visibility |
|
|
51
|
+
|
|
52
|
+
### February 12, 2026
|
|
53
|
+
|
|
54
|
+
| Category | Changes |
|
|
55
|
+
|----------|---------|
|
|
56
|
+
| **Line Item Form - Status Removed** | Removed Status dropdown from top row; form defaults to Draft status silently |
|
|
57
|
+
| **Ad Duration Pill Buttons** | Replaced checkbox-based duration with pill/chip-style buttons (5s, 10s, 15s, 20s, 30s) with Custom input field |
|
|
58
|
+
| **Pacing & Traffic Allocation** | New dedicated AccordionSection after Budget Options; Pacing (Even/ASAP/Front-loaded) and Traffic Allocation slider (0-100%) moved out of Advanced Options |
|
|
59
|
+
| **Media Owner Sheet Popover** | Side panel with search, Country/Type filter dropdowns, 10 sample media owners (JCDecaux, Clear Channel, Lamar, etc.) with checkbox multi-select |
|
|
60
|
+
| **Inventory Format Sheet Popover** | Side panel grouped by OOH/Transit/Retail categories with "Select All" per group and selection count |
|
|
61
|
+
| **Unlimited Budget Toggle** | Custom toggle button replacing Switch component for reliable rendering |
|
|
62
|
+
| **Advanced Options Simplified** | Contains only Frequency Cap (Ad Plays + Period); Pacing/Traffic removed from this section |
|
|
63
|
+
| **DSP Table Styling** | DSP list table now matches deals list grid: `bg-[#F3F3F3]` header, `text-[11px] uppercase`, `text-[13px]` cells, proper column widths |
|
|
64
|
+
| **Buyer Table Styling** | Buyer list table now matches deals list grid with same header/cell/row styling as DSP and deals pages |
|
|
65
|
+
| **Row Number Formatting** | S.No column in DSP/Buyer tables now zero-padded (01, 02, ...) like deals table |
|
|
66
|
+
|
|
67
|
+
### January 23, 2026
|
|
68
|
+
|
|
69
|
+
| Category | Changes |
|
|
70
|
+
|----------|---------|
|
|
71
|
+
| **i18n 100% Coverage** | Achieved complete internationalization coverage across all 22 pages and 75+ components |
|
|
72
|
+
| **13 Namespaces** | Added 7 new namespaces: contentHub, wizard, campaigns, inventory, lineItems, approval, dashboard |
|
|
73
|
+
| **Content Hub Translations** | Translated creative-grid, creative-filters, folder-dialogs, creative-upload, bulk-transcode, creative-selector |
|
|
74
|
+
| **Line Item Wizard Translations** | Translated all 7 wizard steps: creatives, summary, schedule, targeting, inventory, details, inventory-schedule |
|
|
75
|
+
| **Geofencing Translations** | Translated UploadTab, SelectedLocationsSidebar, geofencing-map, schedule-rule-editor, planner components |
|
|
76
|
+
| **Inventory Translations** | Translated advanced-filters-panel, inventory-details-sheet, map-view, availability-view |
|
|
77
|
+
| **Dashboard Translations** | Translated dashboard overview, quick actions, recent activity, stats sections |
|
|
78
|
+
| **Approval Translations** | Translated OTP verification, approval forms, line-item-details-sheet, public approval page |
|
|
79
|
+
| **Deal Components Translations** | Translated import-from-planner-dialog, deal-filter-panel, hierarchical-venue-selector |
|
|
80
|
+
| **All Languages Synced** | Japanese (formal keigo), Chinese (Simplified), Arabic (Modern Standard with RTL) fully synchronized |
|
|
81
|
+
|
|
82
|
+
### January 22, 2026
|
|
83
|
+
|
|
84
|
+
| Category | Changes |
|
|
85
|
+
|----------|---------|
|
|
86
|
+
| **GUARANTEED Deal Fix** | Added required `thresholdCountPerDay` field to line item payload for GUARANTEED deals (default value: 1) |
|
|
87
|
+
| **Deal Status Transition** | Fixed deal status not transitioning to GENERATED when first line item is created |
|
|
88
|
+
| **saveLineItemOnly Fix** | Updated function to include thresholdCountPerDay for GUARANTEED deal types |
|
|
89
|
+
| **createInitialLineItem Fix** | Updated function to include thresholdCountPerDay for GUARANTEED deal types |
|
|
90
|
+
|
|
91
|
+
### January 21, 2026
|
|
92
|
+
|
|
93
|
+
| Category | Changes |
|
|
94
|
+
|----------|---------|
|
|
95
|
+
| **DSP Management Module** | Complete CRUD functionality for DSP management with list, create, edit, delete operations |
|
|
96
|
+
| **Buyer Management Module** | Complete CRUD functionality for Buyer management linked to DSPs |
|
|
97
|
+
| **DSP List Page** | Paginated table with search, columns: S.No, DSP Name, IP, Country, Email, URL, Created By, Created On, Actions |
|
|
98
|
+
| **DSP Form Page** | Multi-section form with DSP details, contact person, bidder details |
|
|
99
|
+
| **Buyer List Page** | Paginated table with columns: S.No, DSP, Seat ID, Seat Name, Buyer Account ID, Email ID, Actions |
|
|
100
|
+
| **Buyer Form Page** | Form with DSP selection, seat ID, seat name, buyer account ID, email fields |
|
|
101
|
+
| **i18n Integration** | Full translation support for DSP/Buyer modules (en/ja/zh/ar) with `dsp:` and `buyer:` namespaces |
|
|
102
|
+
| **Validation Translations** | Error mapping pattern for Zod validation messages - schemas unchanged, translation at display time |
|
|
103
|
+
| **Sidebar Navigation** | Removed Inventory and Measure menu items from sidebar; expandable sections with sub-items |
|
|
104
|
+
| **Routes Added** | `/dsp`, `/dsp/new`, `/dsp/edit/:id`, `/buyers`, `/buyers/new`, `/buyers/edit/:id` |
|
|
105
|
+
| **Publisher ID** | Added publisher ID to deals list page for logged-in users |
|
|
106
|
+
| **Inventory Management** | New inventory management features and map view capabilities |
|
|
107
|
+
| **Product Switcher** | Moved product switcher to header left with updated design |
|
|
108
|
+
| **Expandable Inventory Cards** | Added ability to expand inventory cards to show more details |
|
|
109
|
+
| **Programmatic Deals** | Updated platform to support programmatic deals with mode-aware line items |
|
|
110
|
+
| **Line Item Wizard** | Separated inventory and schedule into distinct steps |
|
|
111
|
+
| **Campaign Forecast Panel** | Added forecast panel to inventory and schedule tabs |
|
|
112
|
+
| **Planning Data** | Added planning data and capacity details to inventory selection |
|
|
113
|
+
| **Infinite Scroll** | Updated inventory view to use infinite scroll, removed "view all" option |
|
|
114
|
+
| **Smart Recommendation** | Renamed from "AI Smart Recommendation" to "Smart Recommendation" |
|
|
115
|
+
|
|
116
|
+
### January 20, 2026
|
|
117
|
+
|
|
118
|
+
| Category | Changes |
|
|
119
|
+
|----------|---------|
|
|
120
|
+
| **AI Recommendations** | Improved AI recommendations and inventory card display |
|
|
121
|
+
| **Inventory Pagination** | Adjusted pagination to always appear at the bottom |
|
|
122
|
+
| **Inventory Details** | Increased width of inventory details panel/popover |
|
|
123
|
+
| **Reference ID Display** | Added reference ID and estimated cost to inventory recommendation cards |
|
|
124
|
+
| **Recommendation Scoring** | Added recommendation scoring and availability details to inventory cards |
|
|
125
|
+
|
|
126
|
+
### January 14, 2026
|
|
127
|
+
|
|
128
|
+
| Category | Changes |
|
|
129
|
+
|----------|---------|
|
|
130
|
+
| **Recommendation Engine** | Integrated recommendation engine into inventory scheduling flow |
|
|
131
|
+
| **Recommendation API** | Updated API paths, added company identifier from user session, structured demographics |
|
|
132
|
+
| **Recommendation Polling** | Updated to repeatedly use the same submission request with POST status checks |
|
|
133
|
+
| **Line Item Creation** | Create line item earlier to enable AI recommendations |
|
|
134
|
+
| **Reference ID** | Added reference ID from external inventory system for updates |
|
|
135
|
+
| **CPM/eCPM Display** | Updated to display correct currency |
|
|
136
|
+
| **Creatives Tab** | Made sure creatives are visible in the creative tab |
|
|
137
|
+
| **Planner Targeting** | Made planner targeting read-only and restricted schedule edits |
|
|
138
|
+
| **Budget/Target Values** | Allow editing budget and target values for planner campaigns when empty |
|
|
139
|
+
| **Approved Deals Display** | Show full UI for already approved/rejected deals instead of error message |
|
|
140
|
+
| **Campaign Details** | Updated to show correct status and brand information |
|
|
141
|
+
| **OTP Input** | Improved OTP input and UI elements for campaign approval |
|
|
142
|
+
| **Deal History** | Improved deal history page to show detailed approval information |
|
|
143
|
+
| **Approval Sheet** | Improved functionality and user experience |
|
|
144
|
+
| **Agency Endpoint** | Updated endpoint and data handling for improved company information |
|
|
145
|
+
|
|
146
|
+
### January 13, 2026
|
|
147
|
+
|
|
148
|
+
| Category | Changes |
|
|
149
|
+
|----------|---------|
|
|
150
|
+
| **Planner Deal Editing** | Made deal line item fields read-only when restricted |
|
|
151
|
+
| **Edit Button** | Show edit button for planner deals in line item view |
|
|
152
|
+
| **Restricted Edits** | Updated deal editing to allow restricted edits for planner deals |
|
|
153
|
+
| **Resend Approval Emails** | Added functionality to resend approval emails |
|
|
154
|
+
| **Planner Deal Creatives** | Added ability to update planner deal creatives |
|
|
155
|
+
| **Auto-Approval Tests** | Updated request approval sheet test for auto-approval behavior |
|
|
156
|
+
|
|
157
|
+
### January 9, 2026
|
|
158
|
+
|
|
159
|
+
| Category | Changes |
|
|
160
|
+
|----------|---------|
|
|
161
|
+
| **Resend Approval Email** | New "Resend Approval Email" button for PENDING deals - opens sheet to select approvers and resend |
|
|
162
|
+
| **Planner Restricted Edit** | Approved Planner deals can be edited with restricted mode - only pacing and creatives editable, other fields read-only |
|
|
163
|
+
| **Seller/Account Email** | Added editable seller email field in deal add/edit page, auto-populates with logged-in user email |
|
|
164
|
+
| **Auto-Approval Support** | Request Approval button now enabled even without approvers - shows "Auto-approve" for auto-approval flow |
|
|
165
|
+
| **Edit Deal URL Fix** | Fixed navigation from Line Items dropdown - now correctly routes to `/deals/edit/{id}` |
|
|
166
|
+
| **MW Planner Badge** | Added purple "Planner" badge in deals table to identify deals from MW Planner source |
|
|
167
|
+
| **Creative Library Grid** | Improved grid layout showing 2-6 columns responsively with compact 4:3 cards |
|
|
168
|
+
| **Pacing Graph Labels** | Fixed translation keys for chart labels (Projected Pacing Delivery, Goal Percentage, No.of Days) |
|
|
169
|
+
| **Dynamic Cap Labels** | Daily/Hourly cap labels now change based on goal type (Impression/Reach/SOV) |
|
|
170
|
+
| **Deal Creatives Display** | Fixed creative assignments display with proper API field mapping |
|
|
171
|
+
| **Line Item Inventories** | Fixed inventories display with separate API query for inventory details |
|
|
172
|
+
|
|
173
|
+
### January 8, 2026
|
|
174
|
+
|
|
175
|
+
| Category | Changes |
|
|
176
|
+
|----------|---------|
|
|
177
|
+
| **Public Approval Page** | Built comprehensive public approval page for DIRECT mode campaigns with token-based email links |
|
|
178
|
+
| **Approval Stats Display** | Shows Total Approvers, Approved count, Pending count, and Rejected count with visual indicators |
|
|
179
|
+
| **Campaign Header** | Displays Deal ID (full), Country, Budget (currency formatted), and Flight Dates |
|
|
180
|
+
| **Line Items Table** | Implemented table with S.No, Line Item, Inventories, Flight Dates, and Pacing columns |
|
|
181
|
+
| **Line Item Details Sheet** | Created slide-out sheet with 3 tabs: Inventories, Schedule, and Creatives |
|
|
182
|
+
| **Inventories Tab** | Fetches inventories by lineItemId from Inventory API with paginated display |
|
|
183
|
+
| **Schedule Tab** | Shows days of week, hours, validity period, and schedule type/priority |
|
|
184
|
+
| **Creatives Tab** | Displays video player for MP4s with HTML5 `<video>` element controls |
|
|
185
|
+
| **Approval Flow** | Differentiated messages: success on first submission vs "already submitted" warning on return visits |
|
|
186
|
+
| **OTP Verification** | Token-based verification for secure public access without login |
|
|
187
|
+
| **Deal Status Types** | Updated Deal type definition to include all status values (APPROVED, REJECTED, PENDING, etc.) |
|
|
188
|
+
| **Seller Information** | Enabled seller.email, seller.phone, and account object in deal creation payload |
|
|
189
|
+
| **Third-Party Integration** | `/deals/import/convert` API with DIRECT_PUBLISHER_SPLIT payload type for external platforms |
|
|
190
|
+
| **ADS Sync** | ADS request generated only after campaign is APPROVED; complete data sent in approved state |
|
|
191
|
+
| **UTF-8 Encoding** | Fixed name encoding issue - shared message payload now properly encoded in UTF-8 |
|
|
192
|
+
| **seatId Integration** | seatId will be retrieved from company API (scheduled for next deployment) |
|
|
193
|
+
| **Planner Deployment** | Planner migration to `deals-api-stg.movingwalls.com` in progress (replacing legacy endpoint) |
|
|
194
|
+
| **UI Cleanup** | Removed Budget and Status columns from public approval line items table; removed source=influence filter |
|
|
195
|
+
|
|
196
|
+
### January 2, 2026
|
|
197
|
+
|
|
198
|
+
| Category | Changes |
|
|
199
|
+
|----------|---------|
|
|
200
|
+
| **API Error Handling** | Improved validation error display with toast notifications showing specific field errors |
|
|
201
|
+
| **Inventory API** | Fixed inventory payload format to only include `id` field (removed `inventoryId` and extraneous fields) |
|
|
202
|
+
| **Toast Notifications** | Added `<Toaster />` component to App.tsx to properly render toast messages |
|
|
203
|
+
|
|
204
|
+
### December 27-31, 2025
|
|
205
|
+
|
|
206
|
+
| Category | Changes |
|
|
207
|
+
|----------|---------|
|
|
208
|
+
| **Internationalization (i18n)** | Added full i18n support for 4 languages: English, Chinese, Japanese, Arabic (RTL) |
|
|
209
|
+
| **Translation Coverage** | Translated deal creation, line item wizard, navigation, and common UI components |
|
|
210
|
+
| **API Integration** | Updated all APIs to use logged-in user's company ID for content, inventory, and deals |
|
|
211
|
+
| **Inventory Management** | Refactored line item inventory updates to use separate API endpoint |
|
|
212
|
+
|
|
213
|
+
### December 25-26, 2025
|
|
214
|
+
|
|
215
|
+
| Category | Changes |
|
|
216
|
+
|----------|---------|
|
|
217
|
+
| **Testing Infrastructure** | Added Vitest 4.0.16 with @testing-library/react and jsdom |
|
|
218
|
+
| **Test Coverage** | 90 automated tests with 99%+ coverage on utility functions |
|
|
219
|
+
| **AI Reference** | Created AI_REFERENCE.md as canonical coding standards document |
|
|
220
|
+
| **Code Cleanup** | Removed unused campaign wizard, theme toggle, and mock data files |
|
|
221
|
+
| **Error Handling** | Added `APIError` class and `formatAPIErrorForToast` utility for structured error display |
|
|
222
|
+
| **Success Messages** | Added toast notifications for successful line item creation/updates |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Feature Status Checklist
|
|
227
|
+
|
|
228
|
+
### Infrastructure
|
|
229
|
+
|
|
230
|
+
| Feature | Task ID | Status | Notes |
|
|
231
|
+
|---------|---------|--------|-------|
|
|
232
|
+
| AWS Deployment | INF-01 | ✅ Ready | influence.movingwalls.com live on AWS (CloudFront + S3) |
|
|
233
|
+
|
|
234
|
+
### Authentication
|
|
235
|
+
|
|
236
|
+
| Feature | Task ID | Status | Notes |
|
|
237
|
+
|---------|---------|--------|-------|
|
|
238
|
+
| User Login | AUTH-01 | ✅ Working | SSO OAuth 2.0 with PKCE, auto-redirects to login page |
|
|
239
|
+
| Dashboard Redirect | AUTH-02 | ✅ Working | Redirects to `/deals` dashboard after successful login |
|
|
240
|
+
|
|
241
|
+
### Inventory Module
|
|
242
|
+
|
|
243
|
+
| Feature | Task ID | Status | Notes |
|
|
244
|
+
|---------|---------|--------|-------|
|
|
245
|
+
| Create Inventory | INV-01 | ⚠️ N/A | Inventories sourced from external JAD API (read-only) |
|
|
246
|
+
| Edit Inventory | INV-02 | ⚠️ N/A | Managed by JAD system |
|
|
247
|
+
| Toggle Status | INV-03 | ⚠️ N/A | Managed by JAD system |
|
|
248
|
+
| Data Persistence | INV-04 | ✅ Working | Selected inventories persist via Influence Deals API |
|
|
249
|
+
|
|
250
|
+
### Deal Module
|
|
251
|
+
|
|
252
|
+
| Feature | Task ID | Status | Notes |
|
|
253
|
+
|---------|---------|--------|-------|
|
|
254
|
+
| Create Deal | DEAL-01 | ✅ Working | Full 6-step wizard: Deal Details → Line Items → Targeting → Inventory → Creatives → Summary |
|
|
255
|
+
| Line Items | DEAL-02 | ✅ Working | Create, edit, delete line items with budgets, pricing models, and impression goals |
|
|
256
|
+
| Targeting - Demographics | DEAL-03 | ✅ Working | Age, gender, income, interests selectors with API persistence |
|
|
257
|
+
| Targeting - POI | DEAL-04 | ✅ Working | POI search by category, interactive geofencing map with drawing tools |
|
|
258
|
+
| Targeting - Location | DEAL-05 | ✅ Working | Map-based location drawing, CSV upload support, configurable radius circles |
|
|
259
|
+
| Inventory Selection | DEAL-06 | ✅ Working | Search JAD inventories, paginated results (25/50/100 per page), assign to line items |
|
|
260
|
+
| Schedule Customization | DEAL-07 | ✅ Working | Date picker for flight dates, hourly schedule grid per day |
|
|
261
|
+
| Manual Status Change | DEAL-08 | ✅ Working | Change deal status (Draft/Live) from summary step |
|
|
262
|
+
| Stage-Based Editing | DEAL-09 | ✅ Working | Only DRAFT, GENERATED, REOPENED stages allow editing |
|
|
263
|
+
| MW Planner Badge | DEAL-10 | ✅ Working | Purple badge identifies deals from MW Planner source |
|
|
264
|
+
| Seller Email Field | DEAL-11 | ✅ Working | Editable seller email for approval notifications |
|
|
265
|
+
| Dynamic Goal Labels | DEAL-12 | ✅ Working | Daily/Hourly cap labels change based on goal type (Impressions/Reach/SOV) |
|
|
266
|
+
| Pacing Graph | DEAL-13 | ✅ Working | Visual pacing delivery graph with proper translations |
|
|
267
|
+
|
|
268
|
+
### Public Approval Workflow (DIRECT Mode)
|
|
269
|
+
|
|
270
|
+
| Feature | Task ID | Status | Notes |
|
|
271
|
+
|---------|---------|--------|-------|
|
|
272
|
+
| Public Approval Page | APPR-01 | ✅ Working | Token-based access via email links (no login required) |
|
|
273
|
+
| Campaign Summary | APPR-02 | ✅ Working | Shows Deal ID, Country, Budget (formatted), Flight Dates in header |
|
|
274
|
+
| Approval Stats | APPR-03 | ✅ Working | Displays Total/Approved/Pending/Rejected approver counts |
|
|
275
|
+
| Line Items Table | APPR-04 | ✅ Working | S.No, Line Item, Inventories, Flight Dates, Pacing columns |
|
|
276
|
+
| Line Item Details Sheet | APPR-05 | ✅ Working | Slide-out sheet with Inventories, Schedule, Creatives tabs |
|
|
277
|
+
| Inventories Tab | APPR-06 | ✅ Working | Fetches inventories by lineItemId with paginated display |
|
|
278
|
+
| Schedule Tab | APPR-07 | ✅ Working | Shows days, hours, validity, schedule type/priority |
|
|
279
|
+
| Creatives Tab | APPR-08 | ✅ Working | Video player for MP4s with playback controls |
|
|
280
|
+
| OTP Verification | APPR-09 | ✅ Working | Secure token-based verification for public access |
|
|
281
|
+
| Approve/Reject Actions | APPR-10 | ✅ Working | Submit approval decision with differentiated success/warning messages |
|
|
282
|
+
| Already Decided State | APPR-11 | ✅ Working | Shows "already submitted" warning for return visits |
|
|
283
|
+
| MediaOwner Final Approval | APPR-12 | ✅ Working | Only MediaOwner can give final approval on campaigns from Planner |
|
|
284
|
+
| Auto-Approval | APPR-13 | ✅ Working | Deals without approvers can be auto-approved with dedicated button |
|
|
285
|
+
| Seller Email Notifications | APPR-14 | ✅ Working | Seller/account email receives approval/rejection notifications |
|
|
286
|
+
| Resend Approval Email | APPR-15 | ✅ Working | Resend approval emails to selected approvers for PENDING deals |
|
|
287
|
+
| Planner Restricted Edit | APPR-16 | ✅ Working | Edit approved Planner deals with restricted mode (pacing & creatives only) |
|
|
288
|
+
|
|
289
|
+
### Line Item Form Redesign (February 2026)
|
|
290
|
+
|
|
291
|
+
| Feature | Task ID | Status | Notes |
|
|
292
|
+
|---------|---------|--------|-------|
|
|
293
|
+
| Single-Page Form | LIF-01 | ✅ Working | Google Ad Manager style with collapsible accordion sections |
|
|
294
|
+
| Status Removed | LIF-02 | ✅ Working | Status dropdown removed; defaults to Draft silently |
|
|
295
|
+
| Ad Duration Pill Buttons | LIF-03 | ✅ Working | Pill/chip-style buttons (5s, 10s, 15s, 20s, 30s) with Custom input |
|
|
296
|
+
| Pacing & Traffic Section | LIF-04 | ✅ Working | Dedicated section with Pacing dropdown and Traffic Allocation slider |
|
|
297
|
+
| Media Owner Sheet | LIF-05 | ✅ Working | Side panel with search, country/type filters, 10 sample media owners |
|
|
298
|
+
| Inventory Format Sheet | LIF-06 | ✅ Working | Side panel grouped by OOH/Transit/Retail with Select All per group |
|
|
299
|
+
| Unlimited Budget Toggle | LIF-07 | ✅ Working | Custom toggle button for reliable rendering |
|
|
300
|
+
| Advanced Options | LIF-08 | ✅ Working | Simplified to Frequency Cap only (Ad Plays + Period) |
|
|
301
|
+
| Form Insights Sidebar | LIF-09 | ✅ Working | Dynamic tips, Quick Tips, and Campaign Forecast panels |
|
|
302
|
+
| AI Inventory Recommendations | LIF-10 | ✅ Working | AI-powered inventory suggestions based on campaign parameters |
|
|
303
|
+
|
|
304
|
+
### DSP Management
|
|
305
|
+
|
|
306
|
+
| Feature | Task ID | Status | Notes |
|
|
307
|
+
|---------|---------|--------|-------|
|
|
308
|
+
| DSP List | DSP-01 | ✅ Working | Paginated table with search, matching deals list grid styling |
|
|
309
|
+
| View DSP | DSP-02 | ✅ Working | Read-only view of DSP details (no add/delete) |
|
|
310
|
+
| Edit DSP | DSP-03 | ✅ Working | Pre-populated form with existing DSP data |
|
|
311
|
+
| Table Styling | DSP-04 | ✅ Working | Matches deals list: `bg-[#F3F3F3]` header, `text-[11px] uppercase`, proper column widths |
|
|
312
|
+
| i18n Support | DSP-05 | ✅ Working | Full translation support (en/ja/zh/ar) with `dsp:` namespace |
|
|
313
|
+
|
|
314
|
+
### Buyer Management
|
|
315
|
+
|
|
316
|
+
| Feature | Task ID | Status | Notes |
|
|
317
|
+
|---------|---------|--------|-------|
|
|
318
|
+
| Buyer List | BUY-01 | ✅ Working | Paginated table matching deals list grid styling |
|
|
319
|
+
| Create Buyer | BUY-02 | ✅ Working | Form with DSP dropdown from real API, seat ID, seat name, buyer account ID, email |
|
|
320
|
+
| Edit Buyer | BUY-03 | ✅ Working | Pre-populated form with existing Buyer data |
|
|
321
|
+
| Delete Buyer | BUY-04 | ✅ Working | Confirmation dialog before deletion |
|
|
322
|
+
| Table Styling | BUY-05 | ✅ Working | Matches deals list: `bg-[#F3F3F3]` header, `text-[11px] uppercase`, proper column widths |
|
|
323
|
+
| i18n Support | BUY-06 | ✅ Working | Full translation support (en/ja/zh/ar) with `buyer:` namespace |
|
|
324
|
+
|
|
325
|
+
### Third-Party Integration
|
|
326
|
+
|
|
327
|
+
| Feature | Task ID | Status | Notes |
|
|
328
|
+
|---------|---------|--------|-------|
|
|
329
|
+
| Campaign Import API | INT-01 | ✅ Working | `/deals/import/convert` endpoint for external platform integration |
|
|
330
|
+
| PROGRAMMATIC_STANDARD | INT-02 | ✅ Working | Programmatic campaign with line items and inventories |
|
|
331
|
+
| DIRECT_STANDARD | INT-03 | ✅ Working | Direct campaign with line items and inventories |
|
|
332
|
+
| DIRECT_PUBLISHER_SPLIT | INT-04 | ✅ Working | Direct campaign with intelligent inventory grouping by publisher + resolution + duration |
|
|
333
|
+
| Schedule-Based Grouping | INT-05 | ✅ Working | Inventories WITH schedule become individual line items; WITHOUT schedule are grouped |
|
|
334
|
+
| External Platforms | INT-06 | ✅ Working | Supports Broadsign, Vistar, Hivestack, Place Exchange, and custom platforms |
|
|
335
|
+
| Source Permissions | INT-07 | ✅ Working | External sources have limited edit permissions (pacing, budget allocation only) |
|
|
336
|
+
|
|
337
|
+
### ADS Sync Integration
|
|
338
|
+
|
|
339
|
+
| Feature | Task ID | Status | Notes |
|
|
340
|
+
|---------|---------|--------|-------|
|
|
341
|
+
| ADS Request Generation | ADS-01 | ✅ Working | ADS request generated only after campaign is APPROVED |
|
|
342
|
+
| Complete Data Sync | ADS-02 | ✅ Working | Complete campaign data sent only in approved state |
|
|
343
|
+
| UTF-8 Encoding | ADS-03 | ✅ Fixed | Shared message payload properly encoded in UTF-8 |
|
|
344
|
+
| seatId from Company API | ADS-04 | 🔄 Pending | seatId retrieved from company API (next deployment) |
|
|
345
|
+
| Planner API Migration | ADS-05 | 🔄 In Progress | Planner deploying to `deals-api-stg.movingwalls.com` |
|
|
346
|
+
|
|
347
|
+
### Internationalization (i18n)
|
|
348
|
+
|
|
349
|
+
| Feature | Task ID | Status | Notes |
|
|
350
|
+
|---------|---------|--------|-------|
|
|
351
|
+
| Language Support | I18N-01 | ✅ Working | English, Chinese (zh), Japanese (ja), Arabic (ar) |
|
|
352
|
+
| RTL Support | I18N-02 | ✅ Working | Arabic language with RTL layout direction |
|
|
353
|
+
| Translation Files | I18N-03 | ✅ Working | 13 namespace files: common, deals, creatives, navigation, dsp, buyer, contentHub, wizard, campaigns, inventory, lineItems, approval, dashboard |
|
|
354
|
+
| Language Switcher | I18N-04 | ✅ Working | UI component for runtime language switching |
|
|
355
|
+
| 100% Coverage | I18N-05 | ✅ Working | All 22 pages and 75+ components fully translated |
|
|
356
|
+
| Translation Styles | I18N-06 | ✅ Working | Japanese keigo (です/ます), Simplified Chinese, Modern Standard Arabic |
|
|
357
|
+
|
|
358
|
+
### Navigation
|
|
359
|
+
|
|
360
|
+
| Feature | Task ID | Status | Notes |
|
|
361
|
+
|---------|---------|--------|-------|
|
|
362
|
+
| Module Switching | NAV-01 | ✅ Working | Sidebar navigation between Deals, Inventory, Content Hub modules |
|
|
363
|
+
|
|
364
|
+
### Usability
|
|
365
|
+
|
|
366
|
+
| Feature | Task ID | Status | Notes |
|
|
367
|
+
|---------|---------|--------|-------|
|
|
368
|
+
| Basic Error Handling | USAB-01 | ✅ Working | Form validation with Zod schemas, toast notifications for actions |
|
|
369
|
+
| API Error Display | USAB-02 | ✅ Working | Specific validation errors shown in toast notifications |
|
|
370
|
+
| Responsive Design | USAB-03 | ✅ Working | Optimized for desktop browsers (1280px+) |
|
|
371
|
+
|
|
372
|
+
### Testing
|
|
373
|
+
|
|
374
|
+
| Feature | Task ID | Status | Notes |
|
|
375
|
+
|---------|---------|--------|-------|
|
|
376
|
+
| Core Flow Test | TEST-01 | ✅ Ready | Login → Deal creation → Inventory selection flow verified |
|
|
377
|
+
| Unit Testing | TEST-02 | ✅ Working | Vitest with 147 tests across 54+ test suites |
|
|
378
|
+
| Test Commands | TEST-03 | ✅ Working | `npm test`, `npm run test:coverage`, `npm run test:watch` |
|
|
379
|
+
| Test Results Page | TEST-04 | ✅ Working | Live test results at [/test-results](/test-results) |
|
|
380
|
+
| CI/CD Integration | TEST-05 | ✅ Working | GitLab CI pipeline runs tests on every push |
|
|
381
|
+
|
|
382
|
+
### Documentation
|
|
383
|
+
|
|
384
|
+
| Feature | Task ID | Status | Notes |
|
|
385
|
+
|---------|---------|--------|-------|
|
|
386
|
+
| AI Reference | DOC-01 | ✅ Complete | AI_REFERENCE.md with coding standards, patterns, conventions |
|
|
387
|
+
| User Guide | DOC-02 | ❌ Not Started | No user documentation created yet |
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## Additional Features (Beyond Original Scope)
|
|
392
|
+
|
|
393
|
+
| Module | Feature | Status | Notes |
|
|
394
|
+
|--------|---------|--------|-------|
|
|
395
|
+
| Content Hub | Creative Upload | ✅ Working | Upload images/videos with drag-and-drop |
|
|
396
|
+
| Content Hub | Approve/Reject Workflow | ✅ Working | Review creatives with comments |
|
|
397
|
+
| Content Hub | Delete Creatives | ✅ Working | Delete with confirmation dialog |
|
|
398
|
+
| Content Hub | Folder Organization | ✅ Working | Organize creatives into folders |
|
|
399
|
+
| Content Hub | Transcoding | ✅ Working | Transcode videos to multiple formats |
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## Test Accounts
|
|
404
|
+
|
|
405
|
+
| Account | Email | Role | Purpose |
|
|
406
|
+
|---------|-------|------|---------|
|
|
407
|
+
| Agency Account | `planner-admin@ooh-auth.local` | Agency | Campaign setup and configuration |
|
|
408
|
+
| Media Owner Account | `jeki@jeki.com` | Media Owner | Final campaign approval |
|
|
409
|
+
|
|
410
|
+
**Note**: Only MediaOwner can give final approval on campaigns from the Planner. For E2E testing, use the agency account to set up the campaign, then switch to the media owner account for final approval.
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Demo Flow Guide
|
|
415
|
+
|
|
416
|
+
### Test Account Setup
|
|
417
|
+
|
|
418
|
+
Before starting the demo, ensure you have access to:
|
|
419
|
+
- **Agency Account**: `planner-admin@ooh-auth.local` - for campaign setup
|
|
420
|
+
- **Media Owner Account**: `jeki@jeki.com` - for final approval
|
|
421
|
+
|
|
422
|
+
### Recommended Demo Sequence
|
|
423
|
+
|
|
424
|
+
#### Part 1: Campaign Setup (Agency Account)
|
|
425
|
+
|
|
426
|
+
1. **Login as Agency** (1 min)
|
|
427
|
+
- Visit `influence-stg.movingwalls.com`
|
|
428
|
+
- Login with `planner-admin@ooh-auth.local`
|
|
429
|
+
- Auto-redirects to Deals dashboard after authentication
|
|
430
|
+
|
|
431
|
+
2. **Create a New DIRECT Deal** (5 min)
|
|
432
|
+
- Click "New Deal" button
|
|
433
|
+
- Select Mode: **DIRECT**
|
|
434
|
+
- Fill in deal details:
|
|
435
|
+
- Deal Name: "Q1 2026 Brand Campaign"
|
|
436
|
+
- Brand: Enter brand name
|
|
437
|
+
- Client Type: "Direct Advertiser" or "Agency"
|
|
438
|
+
- Country: Select market (e.g., Japan, Malaysia)
|
|
439
|
+
- Currency: Select appropriate currency
|
|
440
|
+
- Budget: Enter total budget amount
|
|
441
|
+
- Flight Dates: Select start and end dates
|
|
442
|
+
|
|
443
|
+
3. **Add Line Items** (5 min)
|
|
444
|
+
- Click "Add Line Item"
|
|
445
|
+
- Configure line item:
|
|
446
|
+
- Name: "Digital Billboards - City Center"
|
|
447
|
+
- Pricing Model: CPM
|
|
448
|
+
- Rate and Budget allocation
|
|
449
|
+
- Goal: Impressions target
|
|
450
|
+
- Set pacing (Even, ASAP, Custom)
|
|
451
|
+
- Add multiple line items to show flexibility
|
|
452
|
+
|
|
453
|
+
4. **Select Inventory** (5 min)
|
|
454
|
+
- Search for billboards by name or location
|
|
455
|
+
- Filter by venue type using taxonomy
|
|
456
|
+
- Select multiple inventories
|
|
457
|
+
- Show pagination (25/50/100 per page)
|
|
458
|
+
- Assign inventories to line items
|
|
459
|
+
|
|
460
|
+
5. **Configure Schedule** (3 min)
|
|
461
|
+
- Set flight dates for each line item
|
|
462
|
+
- Configure hourly schedule grid (days and hours)
|
|
463
|
+
- Set schedule priority and type
|
|
464
|
+
|
|
465
|
+
6. **Assign Creatives** (3 min)
|
|
466
|
+
- Navigate to Creatives step
|
|
467
|
+
- Select or upload creative assets
|
|
468
|
+
- Assign creatives to line items
|
|
469
|
+
|
|
470
|
+
7. **Review & Submit for Approval** (2 min)
|
|
471
|
+
- Review summary of all configured details
|
|
472
|
+
- Add approval emails (include media owner email)
|
|
473
|
+
- Click "Submit for Approval"
|
|
474
|
+
|
|
475
|
+
#### Part 2: Campaign Approval (Media Owner Account)
|
|
476
|
+
|
|
477
|
+
8. **Login as Media Owner** (1 min)
|
|
478
|
+
- Logout from agency account
|
|
479
|
+
- Login with `jeki@jeki.com` (Media Owner)
|
|
480
|
+
|
|
481
|
+
9. **Approve Campaign** (3 min)
|
|
482
|
+
- Navigate to Deals dashboard
|
|
483
|
+
- Find the pending campaign
|
|
484
|
+
- Review campaign details, line items, inventories
|
|
485
|
+
- Click "Approve" to give final approval
|
|
486
|
+
- **Note**: Only MediaOwner can give final approval
|
|
487
|
+
|
|
488
|
+
10. **Verify ADS Sync** (2 min)
|
|
489
|
+
- After approval, ADS request is automatically generated
|
|
490
|
+
- Complete campaign data syncs to ADS in approved state
|
|
491
|
+
|
|
492
|
+
### Optional: Public Approval Flow Demo (5 min)
|
|
493
|
+
|
|
494
|
+
1. Create a DIRECT campaign with approval emails
|
|
495
|
+
2. Open the approval email link (token-based, no login required)
|
|
496
|
+
3. Verify OTP if required
|
|
497
|
+
4. Review campaign details:
|
|
498
|
+
- Campaign summary with Deal ID, Country, Budget, Flight Dates
|
|
499
|
+
- Line items table with inventories, schedule, pacing
|
|
500
|
+
- Click line item to see details sheet (Inventories, Schedule, Creatives tabs)
|
|
501
|
+
5. Approve or Reject the campaign
|
|
502
|
+
6. Show "already submitted" message on return visit
|
|
503
|
+
|
|
504
|
+
### Optional: Third-Party Integration Demo (5 min)
|
|
505
|
+
|
|
506
|
+
1. Use `/deals/import/convert` API endpoint
|
|
507
|
+
2. Select payload type: `DIRECT_PUBLISHER_SPLIT`
|
|
508
|
+
3. Send external platform campaign data (Broadsign, Vistar, etc.)
|
|
509
|
+
4. Show intelligent inventory grouping:
|
|
510
|
+
- Inventories WITH schedule → Individual line items
|
|
511
|
+
- Inventories WITHOUT schedule → Grouped by publisher + resolution + duration
|
|
512
|
+
5. Verify converted deal structure in response
|
|
513
|
+
|
|
514
|
+
### Optional: Content Hub Demo (3 min)
|
|
515
|
+
|
|
516
|
+
1. Navigate to Content Hub
|
|
517
|
+
2. Upload a creative (image or video)
|
|
518
|
+
3. Show the approval workflow
|
|
519
|
+
4. Demonstrate folder organization
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## Pending Items / Known Issues
|
|
524
|
+
|
|
525
|
+
1. **Schedule Discussion**: Flagged challenge with Sanchit in DSM - requires follow-up discussion
|
|
526
|
+
|
|
527
|
+
2. **Inventory Management**: Inventories are read-only from JAD API. The platform does not support creating/editing inventories directly.
|
|
528
|
+
|
|
529
|
+
3. **Signal Targeting**: Weather, traffic, and event triggers are UI-only. Backend integration not yet implemented.
|
|
530
|
+
|
|
531
|
+
4. **Reporting/Analytics**: No reporting dashboard available yet.
|
|
532
|
+
|
|
533
|
+
5. **Mobile Responsiveness**: UI optimized for desktop only. Mobile view may have layout issues.
|
|
534
|
+
|
|
535
|
+
6. **MediaOwner Testing Constraint**: On staging, cannot change inventory mediaOwner to test company. E2E testing requires proper media owner user setup.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## Technical Notes for Demo
|
|
540
|
+
|
|
541
|
+
- **API Endpoints**: All APIs are live and connected
|
|
542
|
+
- **Authentication**: Uses OAuth 2.0 with PKCE for secure login
|
|
543
|
+
- **Data Persistence**: All changes save to Influence Deals API in real-time
|
|
544
|
+
- **Pagination**: Inventory lists use header-based pagination (x-total-count, x-page, etc.)
|
|
545
|
+
- **Error Handling**: API validation errors display specific field/message details in toast notifications
|
|
546
|
+
- **Internationalization**: UI supports 4 languages with RTL for Arabic
|
|
547
|
+
- **ADS Sync**: Campaign data syncs to ADS only after APPROVED status
|
|
548
|
+
- **Planner API**: Deploying to `deals-api-stg.movingwalls.com`
|
|
549
|
+
- **External Platform Integration**: Uses `/deals/import/convert` with payload types: PROGRAMMATIC_STANDARD, DIRECT_STANDARD, DIRECT_PUBLISHER_SPLIT
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
## API Endpoints Reference
|
|
554
|
+
|
|
555
|
+
| Endpoint | Method | Description |
|
|
556
|
+
|----------|--------|-------------|
|
|
557
|
+
| `/deals` | GET | List all deals with pagination and filters |
|
|
558
|
+
| `/deals` | POST | Create a new deal |
|
|
559
|
+
| `/deals/{id}` | GET | Get deal by ID |
|
|
560
|
+
| `/deals/{id}` | PUT | Update deal |
|
|
561
|
+
| `/deals/{id}/line-items` | GET/POST | List/Create line items |
|
|
562
|
+
| `/deals/{id}/line-items/{lineItemId}` | GET/PUT/DELETE | Manage line item |
|
|
563
|
+
| `/deals/{id}/line-items/{lineItemId}/inventories` | GET/PUT | Manage inventories |
|
|
564
|
+
| `/deals/{id}/line-items/{lineItemId}/creatives` | GET/POST | Manage creatives |
|
|
565
|
+
| `/deals/import/convert` | POST | Convert external payload to internal schema |
|
|
566
|
+
| `/deals/import` | POST | Import and persist external campaign |
|
|
567
|
+
| `/api/v1/public/approval/campaign` | GET | Public campaign details (token-based) |
|
|
568
|
+
| `/api/v1/public/approval/verify-otp` | POST | Verify OTP for public approval |
|
|
569
|
+
| `/api/v1/public/approval/submit` | POST | Submit approval decision |
|
|
570
|
+
|
|
571
|
+
---
|
|
572
|
+
|
|
573
|
+
## Contacts
|
|
574
|
+
|
|
575
|
+
For technical issues during the demo:
|
|
576
|
+
- Check browser console for errors
|
|
577
|
+
- Verify network connectivity
|
|
578
|
+
- Confirm user has valid SSO credentials
|
|
579
|
+
- For MediaOwner approval issues, ensure user is on the correct media owner company
|
package/Dockerfile
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Dockerfile for Ad Server Frontend
|
|
2
|
+
# Builds and serves the static React application
|
|
3
|
+
#
|
|
4
|
+
# Note: For production, the app is deployed as a static site to S3/CloudFront.
|
|
5
|
+
# This Dockerfile is provided for local development/testing or alternative deployments.
|
|
6
|
+
|
|
7
|
+
# ================================
|
|
8
|
+
# Stage 1: Build the application
|
|
9
|
+
# ================================
|
|
10
|
+
FROM node:18-alpine AS builder
|
|
11
|
+
|
|
12
|
+
WORKDIR /app
|
|
13
|
+
|
|
14
|
+
# Copy package files
|
|
15
|
+
COPY package*.json ./
|
|
16
|
+
|
|
17
|
+
# Install dependencies
|
|
18
|
+
RUN npm ci --prefer-offline
|
|
19
|
+
|
|
20
|
+
# Copy source code
|
|
21
|
+
COPY . ./
|
|
22
|
+
|
|
23
|
+
# Build the application
|
|
24
|
+
RUN npm run build
|
|
25
|
+
|
|
26
|
+
# Verify build output
|
|
27
|
+
RUN ls -la dist/client/ && echo "Build complete"
|
|
28
|
+
|
|
29
|
+
# ================================
|
|
30
|
+
# Stage 2: Serve with nginx
|
|
31
|
+
# ================================
|
|
32
|
+
FROM nginx:alpine AS runner
|
|
33
|
+
|
|
34
|
+
# Copy nginx configuration for SPA routing
|
|
35
|
+
RUN echo 'server { \
|
|
36
|
+
listen 5000; \
|
|
37
|
+
root /usr/share/nginx/html; \
|
|
38
|
+
index index.html; \
|
|
39
|
+
location / { \
|
|
40
|
+
try_files $uri $uri/ /index.html; \
|
|
41
|
+
} \
|
|
42
|
+
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { \
|
|
43
|
+
expires 1y; \
|
|
44
|
+
add_header Cache-Control "public, immutable"; \
|
|
45
|
+
} \
|
|
46
|
+
gzip on; \
|
|
47
|
+
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; \
|
|
48
|
+
}' > /etc/nginx/conf.d/default.conf
|
|
49
|
+
|
|
50
|
+
# Copy built assets
|
|
51
|
+
COPY --from=builder /app/dist/client /usr/share/nginx/html
|
|
52
|
+
|
|
53
|
+
# Expose port
|
|
54
|
+
EXPOSE 5000
|
|
55
|
+
|
|
56
|
+
# Health check
|
|
57
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
|
|
58
|
+
CMD wget --no-verbose --tries=1 --spider http://localhost:5000/ || exit 1
|
|
59
|
+
|
|
60
|
+
# Start nginx
|
|
61
|
+
CMD ["nginx", "-g", "daemon off;"]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" class="dark">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
|
|
6
|
+
<title>Influence - DOOH Adserver Platform</title>
|
|
7
|
+
<meta name="description" content="Influence is a comprehensive DOOH adserver platform for managing digital out-of-home advertising campaigns, inventory, and programmatic integrations." />
|
|
8
|
+
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=Architects+Daughter&family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=Fira+Code:wght@300..700&family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans:ital,wght@0,100..700;1,100..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&family=Lora:ital,wght@0,400..700;1,400..700&family=Merriweather:ital,opsz,wght@0,18..144,300..900;1,18..144,300..900&family=Montserrat:ital,wght@0,100..900;1,100..900&family=Open+Sans:ital,wght@0,300..800;1,300..800&family=Outfit:wght@100..900&family=Oxanium:wght@200..800&family=Playfair+Display:ital,wght@0,400..900;1,400..900&family=Plus+Jakarta+Sans:ital,wght@0,200..800;1,200..800&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Roboto:ital,wght@0,100..900;1,100..900&family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900&family=Space+Grotesk:wght@300..700&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<div id="root"></div>
|
|
15
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
Binary file
|