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.
Files changed (525) hide show
  1. package/.ci/staging.yml +191 -0
  2. package/.dockerignore +117 -0
  3. package/.env +40 -0
  4. package/.env.staging +38 -0
  5. package/.gitlab-ci.yml +16 -0
  6. package/DEMO_STATUS.md +579 -0
  7. package/Dockerfile +61 -0
  8. package/Influence-MW-AdServer-12-02-2026/client/index.html +17 -0
  9. package/Influence-MW-AdServer-12-02-2026/client/public/favicon.png +0 -0
  10. package/Influence-MW-AdServer-12-02-2026/client/src/App.tsx +91 -0
  11. package/Influence-MW-AdServer-12-02-2026/client/src/components/advanced-map-drawer.tsx +1131 -0
  12. package/Influence-MW-AdServer-12-02-2026/client/src/components/ai-recommendation-panel.tsx +379 -0
  13. package/Influence-MW-AdServer-12-02-2026/client/src/components/app-sidebar.tsx +183 -0
  14. package/Influence-MW-AdServer-12-02-2026/client/src/components/auto-optimize-button.tsx +184 -0
  15. package/Influence-MW-AdServer-12-02-2026/client/src/components/availability-drawer.tsx +385 -0
  16. package/Influence-MW-AdServer-12-02-2026/client/src/components/brand-insights-panel.tsx +87 -0
  17. package/Influence-MW-AdServer-12-02-2026/client/src/components/create-agency-drawer.tsx +198 -0
  18. package/Influence-MW-AdServer-12-02-2026/client/src/components/create-brand-drawer.tsx +275 -0
  19. package/Influence-MW-AdServer-12-02-2026/client/src/components/creative-assignment.tsx +526 -0
  20. package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table-toolbar.tsx +148 -0
  21. package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table.tsx +158 -0
  22. package/Influence-MW-AdServer-12-02-2026/client/src/components/filter-drawer.tsx +356 -0
  23. package/Influence-MW-AdServer-12-02-2026/client/src/components/form-insights-panel.tsx +82 -0
  24. package/Influence-MW-AdServer-12-02-2026/client/src/components/geography-selector.tsx +699 -0
  25. package/Influence-MW-AdServer-12-02-2026/client/src/components/header-user-menu.tsx +178 -0
  26. package/Influence-MW-AdServer-12-02-2026/client/src/components/history-drawer.tsx +313 -0
  27. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-availability-section.tsx +176 -0
  28. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-format-drawer.tsx +173 -0
  29. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-selector.tsx +401 -0
  30. package/Influence-MW-AdServer-12-02-2026/client/src/components/manual-inventory-drawer.tsx +368 -0
  31. package/Influence-MW-AdServer-12-02-2026/client/src/components/mapbox-map.tsx +368 -0
  32. package/Influence-MW-AdServer-12-02-2026/client/src/components/market-insights-panel.tsx +202 -0
  33. package/Influence-MW-AdServer-12-02-2026/client/src/components/media-owner-drawer.tsx +217 -0
  34. package/Influence-MW-AdServer-12-02-2026/client/src/components/metric-card.tsx +58 -0
  35. package/Influence-MW-AdServer-12-02-2026/client/src/components/page-header.tsx +27 -0
  36. package/Influence-MW-AdServer-12-02-2026/client/src/components/player-status-indicator.tsx +137 -0
  37. package/Influence-MW-AdServer-12-02-2026/client/src/components/poi-targeting-drawer.tsx +298 -0
  38. package/Influence-MW-AdServer-12-02-2026/client/src/components/recommendation-score-badge.tsx +102 -0
  39. package/Influence-MW-AdServer-12-02-2026/client/src/components/recommended-inventories-panel.tsx +248 -0
  40. package/Influence-MW-AdServer-12-02-2026/client/src/components/searchable-combobox.tsx +134 -0
  41. package/Influence-MW-AdServer-12-02-2026/client/src/components/signal-visualizations.tsx +407 -0
  42. package/Influence-MW-AdServer-12-02-2026/client/src/components/status-badge.tsx +35 -0
  43. package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-provider.tsx +73 -0
  44. package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-toggle.tsx +37 -0
  45. package/Influence-MW-AdServer-12-02-2026/client/src/components/traffic-slider.tsx +75 -0
  46. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/accordion.tsx +56 -0
  47. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert-dialog.tsx +139 -0
  48. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert.tsx +59 -0
  49. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/aspect-ratio.tsx +5 -0
  50. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/avatar.tsx +51 -0
  51. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/badge.tsx +38 -0
  52. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/breadcrumb.tsx +115 -0
  53. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/button.tsx +62 -0
  54. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/calendar.tsx +68 -0
  55. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/card.tsx +85 -0
  56. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/carousel.tsx +260 -0
  57. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/chart.tsx +365 -0
  58. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/checkbox.tsx +28 -0
  59. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/collapsible.tsx +11 -0
  60. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/command.tsx +151 -0
  61. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/context-menu.tsx +198 -0
  62. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dialog.tsx +122 -0
  63. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/drawer.tsx +118 -0
  64. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dropdown-menu.tsx +198 -0
  65. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/form.tsx +178 -0
  66. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/hover-card.tsx +29 -0
  67. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input-otp.tsx +69 -0
  68. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input.tsx +23 -0
  69. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/label.tsx +24 -0
  70. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/menubar.tsx +256 -0
  71. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/navigation-menu.tsx +128 -0
  72. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/pagination.tsx +117 -0
  73. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/popover.tsx +29 -0
  74. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/progress.tsx +28 -0
  75. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/radio-group.tsx +42 -0
  76. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/resizable.tsx +45 -0
  77. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/scroll-area.tsx +46 -0
  78. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/select.tsx +160 -0
  79. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/separator.tsx +29 -0
  80. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sheet.tsx +140 -0
  81. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sidebar.tsx +727 -0
  82. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/skeleton.tsx +15 -0
  83. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/slider.tsx +26 -0
  84. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/switch.tsx +27 -0
  85. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/table.tsx +117 -0
  86. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tabs.tsx +53 -0
  87. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/textarea.tsx +22 -0
  88. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toast.tsx +127 -0
  89. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toaster.tsx +33 -0
  90. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle-group.tsx +61 -0
  91. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle.tsx +43 -0
  92. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tooltip.tsx +30 -0
  93. package/Influence-MW-AdServer-12-02-2026/client/src/components/vendor-stores-modal.tsx +336 -0
  94. package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-drawer.tsx +359 -0
  95. package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-selector.tsx +436 -0
  96. package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-mobile.tsx +19 -0
  97. package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-toast.ts +191 -0
  98. package/Influence-MW-AdServer-12-02-2026/client/src/index.css +244 -0
  99. package/Influence-MW-AdServer-12-02-2026/client/src/lib/queryClient.ts +57 -0
  100. package/Influence-MW-AdServer-12-02-2026/client/src/lib/utils.ts +39 -0
  101. package/Influence-MW-AdServer-12-02-2026/client/src/lib/venue-taxonomy.ts +532 -0
  102. package/Influence-MW-AdServer-12-02-2026/client/src/main.tsx +5 -0
  103. package/Influence-MW-AdServer-12-02-2026/client/src/pages/assign-creative.tsx +781 -0
  104. package/Influence-MW-AdServer-12-02-2026/client/src/pages/content-hub.tsx +995 -0
  105. package/Influence-MW-AdServer-12-02-2026/client/src/pages/custom-pois.tsx +431 -0
  106. package/Influence-MW-AdServer-12-02-2026/client/src/pages/dashboard.tsx +620 -0
  107. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-detail.tsx +1062 -0
  108. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-form.tsx +1570 -0
  109. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deals.tsx +716 -0
  110. package/Influence-MW-AdServer-12-02-2026/client/src/pages/edit-creative-assignment.tsx +1051 -0
  111. package/Influence-MW-AdServer-12-02-2026/client/src/pages/geotargeting.tsx +675 -0
  112. package/Influence-MW-AdServer-12-02-2026/client/src/pages/integrations.tsx +425 -0
  113. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-creatives.tsx +622 -0
  114. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-form.tsx +3132 -0
  115. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-items.tsx +530 -0
  116. package/Influence-MW-AdServer-12-02-2026/client/src/pages/not-found.tsx +21 -0
  117. package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play-upload.tsx +479 -0
  118. package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play.tsx +880 -0
  119. package/Influence-MW-AdServer-12-02-2026/client/src/pages/reports.tsx +235 -0
  120. package/Influence-MW-AdServer-12-02-2026/client/src/pages/settings.tsx +652 -0
  121. package/Influence-MW-AdServer-12-02-2026/client/src/pages/signal-form.tsx +1117 -0
  122. package/Influence-MW-AdServer-12-02-2026/client/src/pages/signals.tsx +366 -0
  123. package/Influence-MW-AdServer-12-02-2026/client/src/pages/tags.tsx +332 -0
  124. package/Influence-MW-AdServer-12-02-2026/client/src/pages/venues.tsx +381 -0
  125. package/Influence-MW-AdServer-12-02-2026/client/src/types/mapbox-gl-draw.d.ts +37 -0
  126. package/Influence-MW-AdServer-12-02-2026/client/src/types/react-simple-maps.d.ts +57 -0
  127. package/Influence-MW-AdServer-12-02-2026/components.json +20 -0
  128. package/Influence-MW-AdServer-12-02-2026/docs/PRD.md +3373 -0
  129. package/Influence-MW-AdServer-12-02-2026/docs/influence-feature-mapping.csv +498 -0
  130. package/Influence-MW-AdServer-12-02-2026/drizzle.config.ts +14 -0
  131. package/Influence-MW-AdServer-12-02-2026/package-lock.json +9672 -0
  132. package/Influence-MW-AdServer-12-02-2026/package.json +118 -0
  133. package/Influence-MW-AdServer-12-02-2026/postcss.config.js +6 -0
  134. package/Influence-MW-AdServer-12-02-2026/replit.md +91 -0
  135. package/Influence-MW-AdServer-12-02-2026/script/build.ts +67 -0
  136. package/Influence-MW-AdServer-12-02-2026/scripts/create-miro-diagrams.cjs +318 -0
  137. package/Influence-MW-AdServer-12-02-2026/scripts/create-remaining-diagrams.cjs +270 -0
  138. package/Influence-MW-AdServer-12-02-2026/server/index.ts +103 -0
  139. package/Influence-MW-AdServer-12-02-2026/server/recommendation-service.ts +319 -0
  140. package/Influence-MW-AdServer-12-02-2026/server/routes.ts +1890 -0
  141. package/Influence-MW-AdServer-12-02-2026/server/static.ts +19 -0
  142. package/Influence-MW-AdServer-12-02-2026/server/storage.ts +2058 -0
  143. package/Influence-MW-AdServer-12-02-2026/server/vite.ts +58 -0
  144. package/Influence-MW-AdServer-12-02-2026/shared/schema.ts +1595 -0
  145. package/Influence-MW-AdServer-12-02-2026/tailwind.config.ts +107 -0
  146. package/Influence-MW-AdServer-12-02-2026/tsconfig.json +23 -0
  147. package/Influence-MW-AdServer-12-02-2026/vite.config.ts +40 -0
  148. package/LINE_ITEM_BUDGET_FIELD_MAPPING.md +178 -0
  149. package/PCM/.env.example +92 -0
  150. package/PCM/README.md +558 -0
  151. package/PCM/docs/TEST_CASES.md +422 -0
  152. package/PCM/index.js +106 -0
  153. package/PCM/package-lock.json +3282 -0
  154. package/PCM/package.json +32 -0
  155. package/PCM/replit.md +64 -0
  156. package/PCM/schema.sql +495 -0
  157. package/PCM/scripts/export-schema.js +183 -0
  158. package/PCM/scripts/seed-comprehensive.js +631 -0
  159. package/PCM/scripts/seed-production.js +477 -0
  160. package/PCM/src/config/db.js +56 -0
  161. package/PCM/src/config/swagger.js +5975 -0
  162. package/PCM/src/dto/EmailRequestDTO.js +166 -0
  163. package/PCM/src/middleware/errorHandler.js +52 -0
  164. package/PCM/src/middleware/logger.js +26 -0
  165. package/PCM/src/migrations/001_add_campaign_mode_fields.sql +36 -0
  166. package/PCM/src/migrations/002_create_deal_id_counters.sql +22 -0
  167. package/PCM/src/migrations/003_update_publishers_column.sql +15 -0
  168. package/PCM/src/migrations/004_add_direct_dealtype_and_advertiser.sql +5 -0
  169. package/PCM/src/migrations/005_add_programmatic_fields_and_update_enums.sql +31 -0
  170. package/PCM/src/migrations/006_add_line_item_programmatic_fields.sql +12 -0
  171. package/PCM/src/migrations/007_add_line_item_direct_fields.sql +15 -0
  172. package/PCM/src/migrations/008_add_inventory_fields.sql +45 -0
  173. package/PCM/src/migrations/009_move_inventory_fields_to_metadata.sql +32 -0
  174. package/PCM/src/migrations/010_add_draft_status_and_line_items_count.sql +23 -0
  175. package/PCM/src/migrations/011_add_planning_field.sql +21 -0
  176. package/PCM/src/migrations/012_fix_inventory_composite_pk.sql +17 -0
  177. package/PCM/src/migrations/013_make_external_id_optional.sql +3 -0
  178. package/PCM/src/migrations/014_create_change_history.sql +38 -0
  179. package/PCM/src/migrations/016_create_publisher_insertion_orders.sql +33 -0
  180. package/PCM/src/migrations/017_fix_line_item_id_fk_reference.sql +86 -0
  181. package/PCM/src/migrations/018_create_approval_tables.sql +44 -0
  182. package/PCM/src/migrations/019_add_encrypted_token_column.sql +2 -0
  183. package/PCM/src/migrations/020_add_rejection_reason_to_deals.sql +10 -0
  184. package/PCM/src/migrations/021_add_publisher_external_id_to_inventories.sql +12 -0
  185. package/PCM/src/migrations/022_add_line_item_extended_fields.sql +24 -0
  186. package/PCM/src/migrations/023_add_base_price_fields.sql +8 -0
  187. package/PCM/src/migrations/run-migrations.js +46 -0
  188. package/PCM/src/models/ApprovalOTP.js +51 -0
  189. package/PCM/src/models/ApprovalToken.js +79 -0
  190. package/PCM/src/models/ChangeHistory.js +107 -0
  191. package/PCM/src/models/Deal.js +186 -0
  192. package/PCM/src/models/DealIdCounter.js +28 -0
  193. package/PCM/src/models/LineItem.js +227 -0
  194. package/PCM/src/models/LineItemCreative.js +89 -0
  195. package/PCM/src/models/LineItemInventory.js +115 -0
  196. package/PCM/src/models/PublisherInsertionOrder.js +93 -0
  197. package/PCM/src/models/TransactionHistory.js +34 -0
  198. package/PCM/src/models/associations.js +81 -0
  199. package/PCM/src/routes/approval.js +321 -0
  200. package/PCM/src/routes/creatives.js +437 -0
  201. package/PCM/src/routes/deals.js +1638 -0
  202. package/PCM/src/routes/digitalSignage.js +242 -0
  203. package/PCM/src/routes/insertionOrders.js +380 -0
  204. package/PCM/src/routes/lineItems.js +926 -0
  205. package/PCM/src/routes/system.js +384 -0
  206. package/PCM/src/services/ApprovalService.js +885 -0
  207. package/PCM/src/services/CampaignImportConverter.js +631 -0
  208. package/PCM/src/services/CampaignModeService.js +273 -0
  209. package/PCM/src/services/CampaignStatusService.js +395 -0
  210. package/PCM/src/services/ChangeHistoryService.js +316 -0
  211. package/PCM/src/services/DealIdService.js +94 -0
  212. package/PCM/src/services/DealResponseFormatter.js +90 -0
  213. package/PCM/src/services/EmailNotificationService.js +315 -0
  214. package/PCM/src/services/LineItemResponseFormatter.js +122 -0
  215. package/PCM/src/services/LineItemStatusService.js +380 -0
  216. package/PCM/src/tests/comprehensiveTestRunner.js +360 -0
  217. package/PCM/src/tests/comprehensiveTests.js +1277 -0
  218. package/PCM/src/tests/dealTypeUnitTests.js +1058 -0
  219. package/PCM/src/tests/testRunner.js +248 -0
  220. package/PCM/src/utils/caseConverter.js +92 -0
  221. package/PCM/src/utils/dealCalculations.js +206 -0
  222. package/PCM/src/utils/lineItemPayloadNormalizer.js +41 -0
  223. package/PCM/src/utils/payloadNormalizer.js +34 -0
  224. package/PCM/src/utils/sourceNormalizer.js +56 -0
  225. package/PCM/src/validators/creativeValidator.js +27 -0
  226. package/PCM/src/validators/dealValidator.js +203 -0
  227. package/PCM/src/validators/lineItemValidator.js +489 -0
  228. package/PCM/tests/approval-flows.test.js +238 -0
  229. package/PCM/tests/approval-workflow.test.js +291 -0
  230. package/PCM/tests/campaign-import-converter.test.js +543 -0
  231. package/PCM/tests/campaign-import-e2e.test.js +520 -0
  232. package/PCM/tests/campaign-status.test.js +539 -0
  233. package/PCM/tests/direct-publisher-split-reimport.test.js +460 -0
  234. package/PCM/tests/e2e/digital-signage.test.js +145 -0
  235. package/PCM/tests/e2e/search-filter-pagination.test.js +399 -0
  236. package/PCM/tests/e2e-comprehensive.test.js +3446 -0
  237. package/PCM/tests/edge-cases.test.js +340 -0
  238. package/PCM/tests/line-item-status.test.js +340 -0
  239. package/PCM/tests/seller-account-external-ids.test.js +877 -0
  240. package/PCM/tests/source-validation.test.js +324 -0
  241. package/PRD.md +3373 -0
  242. package/README.md +186 -0
  243. package/client/index.html +35 -0
  244. package/client/public/DEMO_STATUS.md +579 -0
  245. package/client/public/img/MW-logo-trans_1754045676555.png +0 -0
  246. package/client/public/locales/ar/approval.json +144 -0
  247. package/client/public/locales/ar/buyer.json +61 -0
  248. package/client/public/locales/ar/campaigns.json +1 -0
  249. package/client/public/locales/ar/common.json +218 -0
  250. package/client/public/locales/ar/contentHub.json +266 -0
  251. package/client/public/locales/ar/creatives.json +79 -0
  252. package/client/public/locales/ar/dashboard.json +57 -0
  253. package/client/public/locales/ar/deals.json +886 -0
  254. package/client/public/locales/ar/dsp.json +131 -0
  255. package/client/public/locales/ar/inventory.json +201 -0
  256. package/client/public/locales/ar/lineItems.json +553 -0
  257. package/client/public/locales/ar/navigation.json +48 -0
  258. package/client/public/locales/ar/wizard.json +1 -0
  259. package/client/public/locales/en/approval.json +144 -0
  260. package/client/public/locales/en/buyer.json +65 -0
  261. package/client/public/locales/en/campaigns.json +1 -0
  262. package/client/public/locales/en/common.json +218 -0
  263. package/client/public/locales/en/contentHub.json +266 -0
  264. package/client/public/locales/en/creatives.json +79 -0
  265. package/client/public/locales/en/dashboard.json +57 -0
  266. package/client/public/locales/en/deals.json +886 -0
  267. package/client/public/locales/en/dsp.json +131 -0
  268. package/client/public/locales/en/inventory.json +201 -0
  269. package/client/public/locales/en/lineItems.json +659 -0
  270. package/client/public/locales/en/navigation.json +48 -0
  271. package/client/public/locales/en/wizard.json +1 -0
  272. package/client/public/locales/ja/approval.json +144 -0
  273. package/client/public/locales/ja/buyer.json +61 -0
  274. package/client/public/locales/ja/campaigns.json +1 -0
  275. package/client/public/locales/ja/common.json +218 -0
  276. package/client/public/locales/ja/contentHub.json +266 -0
  277. package/client/public/locales/ja/creatives.json +79 -0
  278. package/client/public/locales/ja/dashboard.json +57 -0
  279. package/client/public/locales/ja/deals.json +886 -0
  280. package/client/public/locales/ja/dsp.json +131 -0
  281. package/client/public/locales/ja/inventory.json +201 -0
  282. package/client/public/locales/ja/lineItems.json +553 -0
  283. package/client/public/locales/ja/navigation.json +48 -0
  284. package/client/public/locales/ja/wizard.json +1 -0
  285. package/client/public/locales/zh/approval.json +144 -0
  286. package/client/public/locales/zh/buyer.json +61 -0
  287. package/client/public/locales/zh/campaigns.json +1 -0
  288. package/client/public/locales/zh/common.json +218 -0
  289. package/client/public/locales/zh/contentHub.json +266 -0
  290. package/client/public/locales/zh/creatives.json +79 -0
  291. package/client/public/locales/zh/dashboard.json +57 -0
  292. package/client/public/locales/zh/deals.json +886 -0
  293. package/client/public/locales/zh/dsp.json +131 -0
  294. package/client/public/locales/zh/inventory.json +201 -0
  295. package/client/public/locales/zh/lineItems.json +553 -0
  296. package/client/public/locales/zh/navigation.json +48 -0
  297. package/client/public/locales/zh/wizard.json +1 -0
  298. package/client/public/manifest.json +36 -0
  299. package/client/src/App.tsx +464 -0
  300. package/client/src/components/app-sidebar.tsx +312 -0
  301. package/client/src/components/approval/approval-decision-form.test.tsx +294 -0
  302. package/client/src/components/approval/approval-decision-form.tsx +326 -0
  303. package/client/src/components/approval/approval-sheet.tsx +631 -0
  304. package/client/src/components/approval/line-item-details-sheet.tsx +371 -0
  305. package/client/src/components/approval/otp-verification.test.tsx +337 -0
  306. package/client/src/components/approval/otp-verification.tsx +180 -0
  307. package/client/src/components/content-hub/bulk-transcode-dialog.tsx +379 -0
  308. package/client/src/components/content-hub/content-hub-manager-v2.tsx +574 -0
  309. package/client/src/components/content-hub/content-hub-manager.tsx +330 -0
  310. package/client/src/components/content-hub/creative-card.tsx +456 -0
  311. package/client/src/components/content-hub/creative-detail-sheet.tsx +685 -0
  312. package/client/src/components/content-hub/creative-filters.tsx +457 -0
  313. package/client/src/components/content-hub/creative-grid.tsx +329 -0
  314. package/client/src/components/content-hub/creative-selector.tsx +415 -0
  315. package/client/src/components/content-hub/creative-upload.tsx +547 -0
  316. package/client/src/components/content-hub/folder-dialogs.tsx +445 -0
  317. package/client/src/components/content-hub/folder-list.tsx +280 -0
  318. package/client/src/components/content-hub/review-dialogs.tsx +268 -0
  319. package/client/src/components/content-hub/transcode-dialog.tsx +226 -0
  320. package/client/src/components/creative-library/creative-details-view.tsx +446 -0
  321. package/client/src/components/creative-library/creative-filters-panel.tsx +203 -0
  322. package/client/src/components/creative-library/creative-list.tsx +360 -0
  323. package/client/src/components/creative-library/creative-status-badge.tsx +71 -0
  324. package/client/src/components/creative-library/folder-card.tsx +78 -0
  325. package/client/src/components/creative-library/index.ts +27 -0
  326. package/client/src/components/creative-library/new-creative-card.tsx +211 -0
  327. package/client/src/components/creative-library/upload-creative-dialog.tsx +261 -0
  328. package/client/src/components/dashboard-overview.tsx +109 -0
  329. package/client/src/components/deals/approval-history-panel.test.tsx +240 -0
  330. package/client/src/components/deals/approval-history-panel.tsx +156 -0
  331. package/client/src/components/deals/deal-status-badge.tsx +92 -0
  332. package/client/src/components/deals/import-from-planner-dialog.tsx +399 -0
  333. package/client/src/components/deals/market-insights-panel.tsx +237 -0
  334. package/client/src/components/deals/reopen-deal-sheet.tsx +191 -0
  335. package/client/src/components/deals/request-approval-sheet.test.tsx +323 -0
  336. package/client/src/components/deals/request-approval-sheet.tsx +136 -0
  337. package/client/src/components/deals/resend-approval-sheet.tsx +201 -0
  338. package/client/src/components/direct-campaigns/campaign-card.tsx +283 -0
  339. package/client/src/components/direct-campaigns/deal-filter-panel.tsx +325 -0
  340. package/client/src/components/inventory/advanced-filters-panel.tsx +273 -0
  341. package/client/src/components/inventory/csv-upload-modal.tsx +639 -0
  342. package/client/src/components/inventory/inventory-availability-view.tsx +486 -0
  343. package/client/src/components/inventory/inventory-details-sheet.tsx +376 -0
  344. package/client/src/components/inventory/inventory-map-view.tsx +596 -0
  345. package/client/src/components/inventory/inventory-settings-menu.tsx +52 -0
  346. package/client/src/components/language-switcher.tsx +53 -0
  347. package/client/src/components/line-items/campaign-forecast-panel.tsx +138 -0
  348. package/client/src/components/line-items/form-insights.tsx +89 -0
  349. package/client/src/components/line-items/geofencing/LocationCsvUploadDrawer.tsx +100 -0
  350. package/client/src/components/line-items/geofencing/POIDropdown.tsx +379 -0
  351. package/client/src/components/line-items/geofencing/SelectedLocationsSidebar.tsx +436 -0
  352. package/client/src/components/line-items/geofencing/ViewFileLocationDrawer.tsx +199 -0
  353. package/client/src/components/line-items/geofencing/components/ExistingFilesTab.tsx +268 -0
  354. package/client/src/components/line-items/geofencing/components/TemplateDownloadSection.tsx +59 -0
  355. package/client/src/components/line-items/geofencing/components/UploadTab.tsx +215 -0
  356. package/client/src/components/line-items/geofencing-map.tsx +1270 -0
  357. package/client/src/components/line-items/inventory-availability-section.tsx +178 -0
  358. package/client/src/components/line-items/line-item-schedule-manager.tsx +313 -0
  359. package/client/src/components/line-items/manual-inventory-drawer.tsx +346 -0
  360. package/client/src/components/line-items/planner-inventory-card.tsx +495 -0
  361. package/client/src/components/line-items/planner-schedule-grid.tsx +495 -0
  362. package/client/src/components/line-items/schedule-rule-editor.tsx +649 -0
  363. package/client/src/components/line-items/schedule-rule-types.ts +122 -0
  364. package/client/src/components/line-items/steps/creatives-step.tsx +681 -0
  365. package/client/src/components/line-items/steps/inventory-schedule-step.tsx +1596 -0
  366. package/client/src/components/line-items/steps/inventory-step.tsx +1533 -0
  367. package/client/src/components/line-items/steps/line-item-details-step.tsx +916 -0
  368. package/client/src/components/line-items/steps/schedule-step.tsx +273 -0
  369. package/client/src/components/line-items/steps/summary-step.tsx +680 -0
  370. package/client/src/components/line-items/steps/targeting-step.tsx +1708 -0
  371. package/client/src/components/product-switcher.tsx +105 -0
  372. package/client/src/components/protected-route.tsx +49 -0
  373. package/client/src/components/skip-link.tsx +22 -0
  374. package/client/src/components/stat-card.tsx +53 -0
  375. package/client/src/components/status-badge.tsx +96 -0
  376. package/client/src/components/ui/hierarchical-venue-selector.tsx +389 -0
  377. package/client/src/components/ui/toaster.tsx +111 -0
  378. package/client/src/contexts/auth-context.tsx +181 -0
  379. package/client/src/contexts/sidebar-state.tsx +50 -0
  380. package/client/src/contexts/theme-context.tsx +66 -0
  381. package/client/src/data/campaign-data.json +107 -0
  382. package/client/src/data/countries.json +22 -0
  383. package/client/src/hooks/use-approval.ts +366 -0
  384. package/client/src/hooks/use-keyboard-shortcuts.ts +74 -0
  385. package/client/src/hooks/use-media-query.ts +46 -0
  386. package/client/src/hooks/use-mobile.tsx +19 -0
  387. package/client/src/hooks/use-page-title.ts +21 -0
  388. package/client/src/hooks/use-toast.ts +195 -0
  389. package/client/src/index.css +694 -0
  390. package/client/src/lib/__tests__/accessibility.test.ts +104 -0
  391. package/client/src/lib/__tests__/date-utils.test.ts +199 -0
  392. package/client/src/lib/__tests__/dsp-buyer-api.test.ts +127 -0
  393. package/client/src/lib/__tests__/dsp-buyer-integration.test.ts +247 -0
  394. package/client/src/lib/__tests__/storage-utils.test.ts +167 -0
  395. package/client/src/lib/__tests__/utils.test.ts +57 -0
  396. package/client/src/lib/accessibility.ts +141 -0
  397. package/client/src/lib/api-config.ts +9 -0
  398. package/client/src/lib/auth-service.ts +209 -0
  399. package/client/src/lib/campaign-creative-api.ts +82 -0
  400. package/client/src/lib/company-api.ts +61 -0
  401. package/client/src/lib/content-hub-api.ts +407 -0
  402. package/client/src/lib/creative-mapper.ts +61 -0
  403. package/client/src/lib/date-utils.ts +119 -0
  404. package/client/src/lib/deal-helpers.ts +220 -0
  405. package/client/src/lib/dsp-buyer-api.ts +196 -0
  406. package/client/src/lib/geo-import-api.ts +151 -0
  407. package/client/src/lib/google-poi-api.ts +305 -0
  408. package/client/src/lib/i18n/__tests__/formatting.test.ts +202 -0
  409. package/client/src/lib/i18n/formatting.ts +130 -0
  410. package/client/src/lib/i18n/index.ts +8 -0
  411. package/client/src/lib/i18n-compat.ts +76 -0
  412. package/client/src/lib/influence-deals-api.ts +896 -0
  413. package/client/src/lib/inventory-api.ts +399 -0
  414. package/client/src/lib/oauth-service.ts +678 -0
  415. package/client/src/lib/poi-types.ts +75 -0
  416. package/client/src/lib/queryClient.ts +144 -0
  417. package/client/src/lib/recommendation-api.ts +380 -0
  418. package/client/src/lib/storage-utils.ts +104 -0
  419. package/client/src/lib/tolgee.ts +85 -0
  420. package/client/src/lib/utils.ts +0 -0
  421. package/client/src/main.tsx +67 -0
  422. package/client/src/mapbox-draw-modes.d.ts +32 -0
  423. package/client/src/pages/all-folders.tsx +203 -0
  424. package/client/src/pages/auth-callback.tsx +115 -0
  425. package/client/src/pages/buyer-form.tsx +339 -0
  426. package/client/src/pages/buyer-list.tsx +622 -0
  427. package/client/src/pages/content-hub.tsx +1358 -0
  428. package/client/src/pages/create-deal.tsx +2093 -0
  429. package/client/src/pages/creative-assignment-page.tsx +548 -0
  430. package/client/src/pages/creatives.tsx +5 -0
  431. package/client/src/pages/custom-pois.tsx +425 -0
  432. package/client/src/pages/dashboard.tsx +615 -0
  433. package/client/src/pages/deal-history.tsx +434 -0
  434. package/client/src/pages/deal-line-items.tsx +1703 -0
  435. package/client/src/pages/demo-status.tsx +113 -0
  436. package/client/src/pages/direct-campaign-details.tsx +361 -0
  437. package/client/src/pages/direct-campaigns-new.tsx +824 -0
  438. package/client/src/pages/dsp-form.tsx +803 -0
  439. package/client/src/pages/dsp-list.tsx +239 -0
  440. package/client/src/pages/folder-content.tsx +336 -0
  441. package/client/src/pages/integrations.tsx +429 -0
  442. package/client/src/pages/line-item-creatives.tsx +789 -0
  443. package/client/src/pages/line-item-detail-page.tsx +684 -0
  444. package/client/src/pages/line-item-form-page.tsx +3261 -0
  445. package/client/src/pages/line-item-wizard.tsx +1207 -0
  446. package/client/src/pages/login.tsx +154 -0
  447. package/client/src/pages/not-found.tsx +23 -0
  448. package/client/src/pages/proof-of-play.tsx +397 -0
  449. package/client/src/pages/public-approval.tsx +551 -0
  450. package/client/src/pages/reports.tsx +231 -0
  451. package/client/src/pages/settings.tsx +760 -0
  452. package/client/src/pages/signals.tsx +389 -0
  453. package/client/src/pages/tags.tsx +318 -0
  454. package/client/src/pages/test-results.tsx +328 -0
  455. package/client/src/store/hooks.ts +5 -0
  456. package/client/src/store/index.ts +15 -0
  457. package/client/src/store/mapMarkerLocationsSlice.ts +241 -0
  458. package/client/src/styles/design-tokens.css +324 -0
  459. package/client/src/test/setup.ts +261 -0
  460. package/client/src/test/test-utils.tsx +40 -0
  461. package/client/src/types/approval.ts +221 -0
  462. package/client/src/types/content-hub.ts +209 -0
  463. package/client/src/types/geofencing.ts +67 -0
  464. package/client/src/types/transcoding.ts +140 -0
  465. package/client/src/vite-env.d.ts +18 -0
  466. package/components.json +20 -0
  467. package/creative-api.json +1 -0
  468. package/docs/AI_REFERENCE.md +459 -0
  469. package/docs/MWDesign-Prompt.md +132 -0
  470. package/docs/MWDesign-System.md +344 -0
  471. package/docs/test-plan.md +277 -0
  472. package/e2e/AUTONOMOUS-TESTING.md +406 -0
  473. package/e2e/README.md +219 -0
  474. package/e2e/autonomous-flow.spec.ts +308 -0
  475. package/e2e/debug-sso.spec.ts +163 -0
  476. package/e2e/direct-campaigns.spec.ts +219 -0
  477. package/e2e/explore-sso.spec.ts +149 -0
  478. package/e2e/fixtures/auth.ts +26 -0
  479. package/e2e/fixtures/enhanced-test.ts +331 -0
  480. package/e2e/pagination.spec.ts +280 -0
  481. package/e2e/view-toggle.spec.ts +312 -0
  482. package/generated-icon.png +0 -0
  483. package/i18next-scanner.config.cjs +46 -0
  484. package/package.json +141 -0
  485. package/playwright.config.ts +93 -0
  486. package/postcss.config.js +6 -0
  487. package/replit.md +196 -0
  488. package/screenshot-after-login.png +0 -0
  489. package/screenshot-contenthub-grid.png +0 -0
  490. package/screenshot-contenthub-list-fixed.png +0 -0
  491. package/screenshot-contenthub-list.png +0 -0
  492. package/screenshot-create-deal.png +0 -0
  493. package/screenshot-dashboard.png +0 -0
  494. package/screenshot-deals.png +0 -0
  495. package/screenshot-login-filled.png +0 -0
  496. package/screenshot-login.png +0 -0
  497. package/screenshot.mjs +24 -0
  498. package/scripts/deploy-stg.sh +185 -0
  499. package/shared/direct-io-schema.ts +383 -0
  500. package/shared/schema.ts +439 -0
  501. package/shared/screen-types.ts +149 -0
  502. package/springdocDefault.json +1 -0
  503. package/swagger-ui-bundle.js +2 -0
  504. package/swagger-ui-init.js +10316 -0
  505. package/tailwind.config.ts +282 -0
  506. package/terraform/README.md +306 -0
  507. package/terraform/cloudfront.tf +289 -0
  508. package/terraform/ecs.tf +727 -0
  509. package/terraform/environments/dev.tfvars +59 -0
  510. package/terraform/environments/production.tfvars +60 -0
  511. package/terraform/main.tf +47 -0
  512. package/terraform/outputs.tf +145 -0
  513. package/terraform/s3.tf +192 -0
  514. package/terraform/variables.tf +226 -0
  515. package/terraform/waf.tf +165 -0
  516. package/terraform-frontend/.terraform.lock.hcl +25 -0
  517. package/terraform-frontend/README.md +85 -0
  518. package/terraform-frontend/cloudfront.tf +125 -0
  519. package/terraform-frontend/main.tf +31 -0
  520. package/terraform-frontend/outputs.tf +24 -0
  521. package/terraform-frontend/terraform.tfvars +12 -0
  522. package/terraform-frontend/variables.tf +53 -0
  523. package/tsconfig.json +23 -0
  524. package/vite.config.ts +226 -0
  525. package/vitest.config.ts +56 -0
@@ -0,0 +1,406 @@
1
+ # Autonomous End-to-End Testing Guide
2
+
3
+ Complete autonomous testing framework with SSO login, screenshots, DOM snapshots, console logs, and network monitoring.
4
+
5
+ ## 🎯 Features
6
+
7
+ ### Full Observability
8
+ - ✅ **Automatic Screenshots** - Captured at every test step
9
+ - ✅ **DOM Snapshots** - HTML saved for offline debugging
10
+ - ✅ **Console Logs** - All browser console output collected
11
+ - ✅ **Network Monitoring** - Complete API request/response logs
12
+ - ✅ **Error Tracking** - Page errors and HTTP failures captured
13
+ - ✅ **SSO Authentication** - Automatic login flow handling
14
+
15
+ ### Test Coverage
16
+ - ✅ Complete Direct Campaigns workflow
17
+ - ✅ Search functionality with debounce
18
+ - ✅ Pagination (MW Planner design)
19
+ - ✅ View toggle (List/Grid)
20
+ - ✅ Row selection
21
+ - ✅ Campaign actions
22
+ - ✅ Navigation flows
23
+ - ✅ State persistence
24
+
25
+ ## 🚀 Quick Start
26
+
27
+ ### 1. Install Playwright Browsers
28
+
29
+ ```bash
30
+ npm run playwright:install
31
+ ```
32
+
33
+ ### 2. Configure Test Credentials (Optional)
34
+
35
+ Copy the example environment file:
36
+
37
+ ```bash
38
+ cp .env.test.example .env.test
39
+ ```
40
+
41
+ Edit `.env.test` with your credentials:
42
+
43
+ ```env
44
+ TEST_EMAIL=your_email@example.com
45
+ TEST_PASSWORD=your_password
46
+ ```
47
+
48
+ ### 3. Run Autonomous Tests
49
+
50
+ **With UI (Recommended)**
51
+ ```bash
52
+ npm run test:e2e:ui
53
+ ```
54
+
55
+ **Headless Mode**
56
+ ```bash
57
+ npm run test:e2e
58
+ ```
59
+
60
+ **Watch Mode with Browser**
61
+ ```bash
62
+ npm run test:e2e:headed
63
+ ```
64
+
65
+ **Debug Mode**
66
+ ```bash
67
+ npm run test:e2e:debug
68
+ ```
69
+
70
+ ## 📊 Test Output
71
+
72
+ ### Directory Structure
73
+
74
+ After running tests, you'll find:
75
+
76
+ ```
77
+ test-results/
78
+ ├── Autonomous_Complete_Flow_Test-should_complete_full_Direct_Campaigns_workflow_with_full_observability/
79
+ │ ├── screenshots/
80
+ │ │ ├── 01-login-page.png
81
+ │ │ ├── 02-after-sso-click.png
82
+ │ │ ├── 03-authenticated-home.png
83
+ │ │ ├── step-01-campaigns-page.png
84
+ │ │ ├── step-02-campaigns-loaded.png
85
+ │ │ ├── step-03-search-results.png
86
+ │ │ ├── step-04-list-view.png
87
+ │ │ ├── step-05-row-selected.png
88
+ │ │ ├── step-06-all-selected.png
89
+ │ │ ├── step-07-next-page.png
90
+ │ │ ├── step-08-actions-menu.png
91
+ │ │ ├── step-09-campaign-details.png
92
+ │ │ ├── step-10-grid-view.png
93
+ │ │ ├── step-11-filter-modal.png
94
+ │ │ ├── step-12-create-button.png
95
+ │ │ └── step-13-final-state.png
96
+ │ └── logs/
97
+ │ ├── console.log
98
+ │ ├── network.json
99
+ │ ├── errors.log (if any)
100
+ │ ├── step-01-campaigns-page.html
101
+ │ ├── step-04-list-view.html
102
+ │ ├── step-09-campaign-details.html
103
+ │ ├── step-10-grid-view.html
104
+ │ └── step-13-final-state.html
105
+ ```
106
+
107
+ ### Console Logs
108
+
109
+ View all browser console output:
110
+
111
+ ```
112
+ test-results/[test-name]/logs/console.log
113
+ ```
114
+
115
+ Example:
116
+ ```
117
+ [log] 🔐 Starting authentication flow...
118
+ [log] 📸 Screenshot: login page
119
+ [log] ✅ Already authenticated, skipping login
120
+ [log] 📍 Step 1: Navigate to Direct Campaigns page
121
+ [log] 🌐 Request: GET /direct-campaigns
122
+ [log] ✅ HTTP 200: GET /api/direct-campaigns?page=1&limit=12
123
+ [log] ✅ Direct Campaigns page loaded
124
+ ...
125
+ ```
126
+
127
+ ### Network Logs
128
+
129
+ View all API requests:
130
+
131
+ ```
132
+ test-results/[test-name]/logs/network.json
133
+ ```
134
+
135
+ Example:
136
+ ```json
137
+ [
138
+ {
139
+ "url": "http://localhost:5000/api/direct-campaigns?page=1&limit=12",
140
+ "status": 200,
141
+ "method": "GET"
142
+ },
143
+ {
144
+ "url": "http://localhost:5000/api/auth/session",
145
+ "status": 200,
146
+ "method": "GET"
147
+ }
148
+ ]
149
+ ```
150
+
151
+ ### Error Logs
152
+
153
+ If any errors occur:
154
+
155
+ ```
156
+ test-results/[test-name]/logs/errors.log
157
+ ```
158
+
159
+ ## 🔐 Authentication Methods
160
+
161
+ The enhanced test fixture supports multiple authentication methods:
162
+
163
+ ### 1. SSO Button (Recommended)
164
+
165
+ Automatically detects and clicks SSO button:
166
+ - Looks for buttons with text: "SSO", "Single Sign", "Login with"
167
+ - Handles redirect flow
168
+ - Waits for authentication completion
169
+
170
+ ### 2. Email/Password Form
171
+
172
+ Falls back to traditional login:
173
+ - Fills email and password from `.env.test`
174
+ - Submits form
175
+ - Waits for navigation
176
+
177
+ ### 3. Already Authenticated
178
+
179
+ Detects if already logged in and skips authentication.
180
+
181
+ ### 4. Dev Mode
182
+
183
+ If no login form is found, assumes dev mode and proceeds.
184
+
185
+ ## 📝 Test Scenarios
186
+
187
+ ### Autonomous Complete Flow
188
+
189
+ The main test covers the entire workflow:
190
+
191
+ 1. **Authentication**
192
+ - SSO login with screenshot
193
+ - Session verification
194
+
195
+ 2. **Navigation**
196
+ - Navigate to Direct Campaigns
197
+ - Wait for data load
198
+
199
+ 3. **Search**
200
+ - Type search query
201
+ - Wait for debounce
202
+ - Verify results
203
+ - Clear search
204
+
205
+ 4. **View Toggle**
206
+ - Switch to List view
207
+ - Verify table columns
208
+ - Switch to Grid view
209
+ - Verify cards
210
+
211
+ 5. **Selection**
212
+ - Select individual rows
213
+ - Select all rows
214
+ - Unselect
215
+
216
+ 6. **Pagination**
217
+ - Verify controls visible
218
+ - Navigate next/previous
219
+ - Test First/Last buttons
220
+
221
+ 7. **Actions**
222
+ - Open actions menu
223
+ - Verify menu items
224
+ - Close menu
225
+
226
+ 8. **Navigation**
227
+ - Click campaign row
228
+ - Navigate to details
229
+ - Go back
230
+
231
+ 9. **Final State**
232
+ - Capture final screenshots
233
+ - Generate summary report
234
+
235
+ ### Additional Tests
236
+
237
+ - **Pagination State Persistence** - Verifies page number maintained across navigation
238
+ - **Empty Search Results** - Tests empty state handling
239
+
240
+ ## 🔧 Advanced Usage
241
+
242
+ ### Custom Test with Enhanced Fixture
243
+
244
+ ```typescript
245
+ import { test, expect, takeScreenshot, saveDOMSnapshot, waitForAPIResponse } from './fixtures/enhanced-test';
246
+
247
+ test('my custom test', async ({ authenticatedPage: page, testInfo }) => {
248
+ // Navigate
249
+ await page.goto('/my-page');
250
+
251
+ // Take screenshot
252
+ await takeScreenshot(page, 'my-step', testInfo);
253
+
254
+ // Save DOM
255
+ await saveDOMSnapshot(page, 'my-dom', testInfo);
256
+
257
+ // Wait for specific API
258
+ const response = await waitForAPIResponse(page, '/api/my-endpoint');
259
+ const data = await response.json();
260
+
261
+ // All console logs, network logs, and errors are automatically captured!
262
+ });
263
+ ```
264
+
265
+ ### Helper Functions
266
+
267
+ #### `takeScreenshot(page, name, testInfo)`
268
+ Captures full-page screenshot with timestamp.
269
+
270
+ #### `saveDOMSnapshot(page, name, testInfo)`
271
+ Saves complete HTML for offline inspection.
272
+
273
+ #### `waitForNetworkIdle(page)`
274
+ Waits for all network requests to complete with logging.
275
+
276
+ #### `waitForAPIResponse(page, urlPattern)`
277
+ Waits for specific API response and logs it.
278
+
279
+ ## 🐛 Debugging
280
+
281
+ ### View Test in Browser
282
+
283
+ ```bash
284
+ npm run test:e2e:headed
285
+ ```
286
+
287
+ ### Step Through Test
288
+
289
+ ```bash
290
+ npm run test:e2e:debug
291
+ ```
292
+
293
+ This opens Playwright Inspector where you can:
294
+ - Step through each action
295
+ - Inspect elements
296
+ - See console logs in real-time
297
+ - View network requests
298
+
299
+ ### View Test Report
300
+
301
+ ```bash
302
+ npm run playwright:report
303
+ ```
304
+
305
+ Opens HTML report with:
306
+ - Test results
307
+ - Screenshots
308
+ - Videos (for failures)
309
+ - Traces
310
+
311
+ ### Check Logs
312
+
313
+ All console and network logs are in:
314
+ ```
315
+ test-results/[test-name]/logs/
316
+ ```
317
+
318
+ ## 🔍 Troubleshooting
319
+
320
+ ### Authentication Failing
321
+
322
+ 1. **Check credentials** in `.env.test`
323
+ 2. **View screenshot** `01-login-page.png`
324
+ 3. **Check console logs** for errors
325
+ 4. **Update selectors** in `enhanced-test.ts` if login form changed
326
+
327
+ ### API Errors
328
+
329
+ 1. **Check network logs** `logs/network.json`
330
+ 2. **Check error log** `logs/errors.log`
331
+ 3. **Verify dev server** is running on port 5000
332
+
333
+ ### Test Timeouts
334
+
335
+ 1. **Increase timeout** in `playwright.config.ts`
336
+ 2. **Check network logs** for slow APIs
337
+ 3. **Verify data** is actually loading
338
+
339
+ ### Screenshots Not Captured
340
+
341
+ 1. **Check permissions** on `test-results/` directory
342
+ 2. **Verify testInfo** is passed to helper functions
343
+ 3. **Run test** with `--headed` to see what's happening
344
+
345
+ ## 📈 Performance Tips
346
+
347
+ ### Parallel Testing
348
+
349
+ Run tests in parallel (default):
350
+ ```bash
351
+ npm run test:e2e -- --workers=4
352
+ ```
353
+
354
+ ### Specific Test File
355
+
356
+ ```bash
357
+ npm run test:e2e autonomous-flow.spec.ts
358
+ ```
359
+
360
+ ### Specific Test
361
+
362
+ ```bash
363
+ npm run test:e2e -- -g "should complete full Direct Campaigns workflow"
364
+ ```
365
+
366
+ ### Disable Screenshots (Faster)
367
+
368
+ Temporarily comment out `takeScreenshot` calls for faster execution during development.
369
+
370
+ ## 🎯 Best Practices
371
+
372
+ 1. **Use Enhanced Fixture** - Always use `authenticatedPage` for automatic logging
373
+ 2. **Take Screenshots** - At each significant step
374
+ 3. **Save DOM** - Before and after major state changes
375
+ 4. **Wait for Network** - Use `waitForNetworkIdle()` after navigation
376
+ 5. **Check Logs** - Always review console and network logs after failures
377
+ 6. **Descriptive Names** - Use clear names for screenshots and DOM snapshots
378
+
379
+ ## 🚦 CI/CD Integration (Future)
380
+
381
+ Currently configured for local development only. To add to CI/CD:
382
+
383
+ 1. **Set up test environment**
384
+ 2. **Add to CI workflow**:
385
+ ```yaml
386
+ - name: Run E2E Tests
387
+ run: npm run test:e2e
388
+ env:
389
+ TEST_EMAIL: ${{ secrets.TEST_EMAIL }}
390
+ TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
391
+ ```
392
+ 3. **Upload artifacts**:
393
+ ```yaml
394
+ - uses: actions/upload-artifact@v3
395
+ if: always()
396
+ with:
397
+ name: playwright-results
398
+ path: test-results/
399
+ ```
400
+
401
+ ## 📚 Resources
402
+
403
+ - [Playwright Documentation](https://playwright.dev)
404
+ - [Test Fixtures](https://playwright.dev/docs/test-fixtures)
405
+ - [Debugging](https://playwright.dev/docs/debug)
406
+ - [Best Practices](https://playwright.dev/docs/best-practices)
package/e2e/README.md ADDED
@@ -0,0 +1,219 @@
1
+ # End-to-End Testing with Playwright
2
+
3
+ This directory contains Playwright E2E tests for the Direct Campaigns application. These tests are designed for **local development only** and are not part of the CI/CD pipeline (the frontend is deployed as a static site).
4
+
5
+ ## Setup
6
+
7
+ ### 1. Install Playwright browsers
8
+
9
+ First time setup:
10
+
11
+ ```bash
12
+ npm run playwright:install
13
+ ```
14
+
15
+ This will install only Chromium browser for testing.
16
+
17
+ ### 2. Ensure dev server is running
18
+
19
+ The tests require the application to be running on `http://localhost:5000`. The Playwright config is set up to automatically start the dev server, but you can also run it manually:
20
+
21
+ ```bash
22
+ npm run dev
23
+ ```
24
+
25
+ ## Running Tests
26
+
27
+ ### Run all tests (headless)
28
+
29
+ ```bash
30
+ npm run test:e2e
31
+ ```
32
+
33
+ ### Run tests with UI mode (recommended for development)
34
+
35
+ ```bash
36
+ npm run test:e2e:ui
37
+ ```
38
+
39
+ This opens the Playwright UI where you can:
40
+ - See all tests
41
+ - Run individual tests
42
+ - Watch tests run in real-time
43
+ - Debug test failures
44
+
45
+ ### Run tests in headed mode (see browser)
46
+
47
+ ```bash
48
+ npm run test:e2e:headed
49
+ ```
50
+
51
+ ### Debug tests step-by-step
52
+
53
+ ```bash
54
+ npm run test:e2e:debug
55
+ ```
56
+
57
+ ### View test report
58
+
59
+ After running tests, view the HTML report:
60
+
61
+ ```bash
62
+ npm run playwright:report
63
+ ```
64
+
65
+ ## Test Structure
66
+
67
+ ### Test Files
68
+
69
+ - **`direct-campaigns.spec.ts`** - Tests for Direct Campaigns listing page
70
+ - Page layout and elements
71
+ - Campaign list display
72
+ - Search functionality
73
+ - Row selection
74
+ - Campaign actions (view, edit, delete)
75
+
76
+ - **`pagination.spec.ts`** - Tests for pagination functionality
77
+ - Pagination visibility
78
+ - Navigation (First, Previous, Next, Last)
79
+ - Data accuracy (item counts, page numbers)
80
+ - Mobile vs desktop pagination
81
+
82
+ - **`view-toggle.spec.ts`** - Tests for view toggle functionality
83
+ - List vs Grid view switching
84
+ - View persistence in localStorage
85
+ - Pagination behavior across views
86
+
87
+ ### Fixtures
88
+
89
+ - **`fixtures/auth.ts`** - Authentication helper (to be configured with actual login)
90
+
91
+ ## Test Coverage
92
+
93
+ ### Direct Campaigns Page
94
+ ✅ Page header and navigation
95
+ ✅ Search with debounce (min 3 characters)
96
+ ✅ Campaign table display
97
+ ✅ Row selection (individual and select all)
98
+ ✅ Campaign actions menu
99
+ ✅ Row click navigation
100
+
101
+ ### Pagination (MW Planner Design)
102
+ ✅ First/Previous/Next/Last buttons
103
+ ✅ Page number display ("Page X of Y")
104
+ ✅ Item count display ("X to Y of Z")
105
+ ✅ Button states (disabled on first/last page)
106
+ ✅ Mobile responsive pagination
107
+ ✅ Data accuracy across pages
108
+
109
+ ### View Toggle
110
+ ✅ Grid view (default)
111
+ ✅ List view (table)
112
+ ✅ View persistence in localStorage
113
+ ✅ Selection clearing on view change
114
+ ✅ Pagination in both views
115
+
116
+ ## Configuration
117
+
118
+ ### playwright.config.ts
119
+
120
+ Key settings:
121
+ - **baseURL**: `http://localhost:5000`
122
+ - **timeout**: 30 seconds per test
123
+ - **retries**: 0 (local), 2 (CI)
124
+ - **webServer**: Auto-starts `npm run dev`
125
+ - **reporter**: HTML report
126
+ - **browsers**: Chromium (default), Firefox and WebKit commented out
127
+
128
+ ### Customization
129
+
130
+ To test on different browsers, uncomment the desired project in `playwright.config.ts`:
131
+
132
+ ```typescript
133
+ projects: [
134
+ { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
135
+ { name: 'firefox', use: { ...devices['Desktop Firefox'] } }, // Uncomment
136
+ { name: 'webkit', use: { ...devices['Desktop Safari'] } }, // Uncomment
137
+ ]
138
+ ```
139
+
140
+ ## Writing New Tests
141
+
142
+ ### Example Test Structure
143
+
144
+ ```typescript
145
+ import { test, expect } from '@playwright/test';
146
+
147
+ test.describe('Feature Name', () => {
148
+ test.beforeEach(async ({ page }) => {
149
+ await page.goto('/your-page');
150
+ await page.waitForLoadState('networkidle');
151
+ });
152
+
153
+ test('should do something', async ({ page }) => {
154
+ // Arrange
155
+ const button = page.getByRole('button', { name: 'Click Me' });
156
+
157
+ // Act
158
+ await button.click();
159
+
160
+ // Assert
161
+ await expect(page.getByText('Success')).toBeVisible();
162
+ });
163
+ });
164
+ ```
165
+
166
+ ### Best Practices
167
+
168
+ 1. **Use data-testid for stability**: Add `data-testid` attributes to important elements
169
+ 2. **Wait for network**: Use `page.waitForLoadState('networkidle')` after navigation
170
+ 3. **Descriptive names**: Use clear, descriptive test names
171
+ 4. **Independent tests**: Each test should be able to run in isolation
172
+ 5. **Clean state**: Reset state in `beforeEach` hooks
173
+ 6. **Avoid hard-coded waits**: Use `waitForSelector` instead of `waitForTimeout` when possible
174
+
175
+ ## Troubleshooting
176
+
177
+ ### Tests failing due to timing issues
178
+
179
+ If tests are flaky due to timing:
180
+ - Increase timeout in `playwright.config.ts`
181
+ - Add explicit waits: `await page.waitForSelector('selector')`
182
+ - Use `waitForLoadState('networkidle')` after navigation
183
+
184
+ ### Authentication issues
185
+
186
+ The auth fixture in `fixtures/auth.ts` needs to be configured with your actual login flow. Update it with:
187
+ - Correct input selectors
188
+ - Valid test credentials
189
+ - Expected redirect URL after login
190
+
191
+ ### Port already in use
192
+
193
+ If port 5000 is already in use:
194
+ - Stop the existing dev server
195
+ - Or change the port in `playwright.config.ts` and your app config
196
+
197
+ ### Browser not installed
198
+
199
+ Run the installation command:
200
+ ```bash
201
+ npm run playwright:install
202
+ ```
203
+
204
+ ## CI/CD Note
205
+
206
+ ⚠️ **Important**: These tests are for local development only. Since the frontend is deployed as a static site, Playwright tests are **not** included in the CI/CD pipeline.
207
+
208
+ If you want to add E2E tests to CI/CD in the future, you would need to:
209
+ 1. Set up a test environment with the backend API
210
+ 2. Add Playwright to your CI workflow
211
+ 3. Configure authentication and test data
212
+ 4. Update the `playwright.config.ts` to handle CI mode
213
+
214
+ ## Resources
215
+
216
+ - [Playwright Documentation](https://playwright.dev)
217
+ - [Best Practices](https://playwright.dev/docs/best-practices)
218
+ - [Debugging Tests](https://playwright.dev/docs/debug)
219
+ - [Test Assertions](https://playwright.dev/docs/test-assertions)