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,344 @@
1
+ # MWDesign System - Component Reference
2
+
3
+ > **Package**: `@moving-walls/design-system` (npm)
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @moving-walls/design-system
9
+ ```
10
+
11
+ ## Import Pattern
12
+
13
+ ```tsx
14
+ import { Button, Card, Dialog, Sheet } from '@moving-walls/design-system';
15
+ ```
16
+
17
+ ---
18
+
19
+ ## Component Categories
20
+
21
+ | Category | Components |
22
+ |----------|------------|
23
+ | **Form Controls** | Button, Input, Textarea, Checkbox, RadioGroup, Switch, Select, Slider, Calendar |
24
+ | **Display** | Card, Badge, Alert, Avatar, Progress, Skeleton, Separator, Table |
25
+ | **Layout** | Tabs, Accordion, Collapsible, ScrollArea |
26
+ | **Feedback** | Spinner, Toast |
27
+ | **Navigation** | Breadcrumb |
28
+ | **Overlay** | Dialog, Sheet, Popover, DropdownMenu, Tooltip |
29
+
30
+ ---
31
+
32
+ ## Form Controls
33
+
34
+ ### Button
35
+ ```tsx
36
+ import { Button } from '@moving-walls/design-system';
37
+
38
+ <Button variant="default">Primary</Button>
39
+ <Button variant="secondary">Secondary</Button>
40
+ <Button variant="outline">Outline</Button>
41
+ <Button variant="ghost">Ghost</Button>
42
+ <Button variant="destructive">Destructive</Button>
43
+
44
+ <Button size="sm">Small</Button>
45
+ <Button size="default">Default</Button>
46
+ <Button size="lg">Large</Button>
47
+
48
+ <Button disabled>Disabled</Button>
49
+ ```
50
+
51
+ ### Input
52
+ ```tsx
53
+ import { Input } from '@moving-walls/design-system';
54
+
55
+ <Input placeholder="Enter text" />
56
+ <Input type="email" placeholder="Email" />
57
+ <Input type="password" placeholder="Password" />
58
+ <Input disabled />
59
+ ```
60
+
61
+ ### Select
62
+ ```tsx
63
+ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@moving-walls/design-system';
64
+
65
+ <Select value={value} onValueChange={setValue}>
66
+ <SelectTrigger>
67
+ <SelectValue placeholder="Select..." />
68
+ </SelectTrigger>
69
+ <SelectContent>
70
+ <SelectItem value="option1">Option 1</SelectItem>
71
+ <SelectItem value="option2">Option 2</SelectItem>
72
+ </SelectContent>
73
+ </Select>
74
+ ```
75
+
76
+ ### Checkbox
77
+ ```tsx
78
+ import { Checkbox } from '@moving-walls/design-system';
79
+
80
+ <div className="flex items-center space-x-2">
81
+ <Checkbox id="terms" checked={checked} onCheckedChange={setChecked} />
82
+ <label htmlFor="terms">Accept terms</label>
83
+ </div>
84
+ ```
85
+
86
+ ### Switch
87
+ ```tsx
88
+ import { Switch } from '@moving-walls/design-system';
89
+
90
+ <Switch checked={enabled} onCheckedChange={setEnabled} />
91
+ ```
92
+
93
+ ---
94
+
95
+ ## Display Components
96
+
97
+ ### Card
98
+ ```tsx
99
+ import { Card, CardHeader, CardContent, CardFooter, CardTitle, CardDescription } from '@moving-walls/design-system';
100
+
101
+ <Card>
102
+ <CardHeader>
103
+ <CardTitle>Title</CardTitle>
104
+ <CardDescription>Description</CardDescription>
105
+ </CardHeader>
106
+ <CardContent>Content here</CardContent>
107
+ <CardFooter><Button>Action</Button></CardFooter>
108
+ </Card>
109
+ ```
110
+
111
+ ### Badge
112
+ ```tsx
113
+ import { Badge } from '@moving-walls/design-system';
114
+
115
+ <Badge>Default</Badge>
116
+ <Badge variant="secondary">Secondary</Badge>
117
+ <Badge variant="destructive">Error</Badge>
118
+ <Badge variant="outline">Outline</Badge>
119
+ ```
120
+
121
+ ### Alert
122
+ ```tsx
123
+ import { Alert, AlertTitle, AlertDescription } from '@moving-walls/design-system';
124
+
125
+ <Alert>
126
+ <AlertTitle>Heads up!</AlertTitle>
127
+ <AlertDescription>This is an informational alert.</AlertDescription>
128
+ </Alert>
129
+ ```
130
+
131
+ ### Avatar
132
+ ```tsx
133
+ import { Avatar, AvatarImage, AvatarFallback } from '@moving-walls/design-system';
134
+
135
+ <Avatar>
136
+ <AvatarImage src="/user.jpg" alt="User" />
137
+ <AvatarFallback>JD</AvatarFallback>
138
+ </Avatar>
139
+ ```
140
+
141
+ ### Table
142
+ ```tsx
143
+ import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@moving-walls/design-system';
144
+
145
+ <Table>
146
+ <TableHeader>
147
+ <TableRow>
148
+ <TableHead>Name</TableHead>
149
+ <TableHead>Email</TableHead>
150
+ </TableRow>
151
+ </TableHeader>
152
+ <TableBody>
153
+ <TableRow>
154
+ <TableCell>John Doe</TableCell>
155
+ <TableCell>john@example.com</TableCell>
156
+ </TableRow>
157
+ </TableBody>
158
+ </Table>
159
+ ```
160
+
161
+ ---
162
+
163
+ ## Layout Components
164
+
165
+ ### Tabs
166
+ ```tsx
167
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from '@moving-walls/design-system';
168
+
169
+ <Tabs defaultValue="tab1">
170
+ <TabsList>
171
+ <TabsTrigger value="tab1">Overview</TabsTrigger>
172
+ <TabsTrigger value="tab2">Details</TabsTrigger>
173
+ </TabsList>
174
+ <TabsContent value="tab1">Overview content</TabsContent>
175
+ <TabsContent value="tab2">Details content</TabsContent>
176
+ </Tabs>
177
+ ```
178
+
179
+ ### Accordion
180
+ ```tsx
181
+ import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '@moving-walls/design-system';
182
+
183
+ <Accordion type="single" collapsible>
184
+ <AccordionItem value="item-1">
185
+ <AccordionTrigger>Getting Started</AccordionTrigger>
186
+ <AccordionContent>Content here</AccordionContent>
187
+ </AccordionItem>
188
+ </Accordion>
189
+ ```
190
+
191
+ ### ScrollArea
192
+ ```tsx
193
+ import { ScrollArea } from '@moving-walls/design-system';
194
+
195
+ <ScrollArea className="h-96 w-full">
196
+ Long content here...
197
+ </ScrollArea>
198
+ ```
199
+
200
+ ---
201
+
202
+ ## Overlay Components
203
+
204
+ ### Dialog
205
+ ```tsx
206
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogTrigger } from '@moving-walls/design-system';
207
+
208
+ <Dialog>
209
+ <DialogTrigger asChild>
210
+ <Button>Open Dialog</Button>
211
+ </DialogTrigger>
212
+ <DialogContent>
213
+ <DialogHeader>
214
+ <DialogTitle>Title</DialogTitle>
215
+ <DialogDescription>Description</DialogDescription>
216
+ </DialogHeader>
217
+ <div className="py-4">Content</div>
218
+ <DialogFooter>
219
+ <Button variant="outline">Cancel</Button>
220
+ <Button>Confirm</Button>
221
+ </DialogFooter>
222
+ </DialogContent>
223
+ </Dialog>
224
+ ```
225
+
226
+ ### Sheet
227
+ ```tsx
228
+ import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '@moving-walls/design-system';
229
+
230
+ <Sheet>
231
+ <SheetTrigger asChild>
232
+ <Button>Open Sheet</Button>
233
+ </SheetTrigger>
234
+ <SheetContent side="right">
235
+ <SheetHeader>
236
+ <SheetTitle>Settings</SheetTitle>
237
+ </SheetHeader>
238
+ <div>Content</div>
239
+ </SheetContent>
240
+ </Sheet>
241
+ ```
242
+
243
+ ### DropdownMenu
244
+ ```tsx
245
+ import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@moving-walls/design-system';
246
+
247
+ <DropdownMenu>
248
+ <DropdownMenuTrigger asChild>
249
+ <Button variant="outline">Options</Button>
250
+ </DropdownMenuTrigger>
251
+ <DropdownMenuContent>
252
+ <DropdownMenuItem>Edit</DropdownMenuItem>
253
+ <DropdownMenuSeparator />
254
+ <DropdownMenuItem className="text-red-600">Delete</DropdownMenuItem>
255
+ </DropdownMenuContent>
256
+ </DropdownMenu>
257
+ ```
258
+
259
+ ### Popover
260
+ ```tsx
261
+ import { Popover, PopoverTrigger, PopoverContent } from '@moving-walls/design-system';
262
+
263
+ <Popover>
264
+ <PopoverTrigger asChild>
265
+ <Button>Open Popover</Button>
266
+ </PopoverTrigger>
267
+ <PopoverContent>Popover content</PopoverContent>
268
+ </Popover>
269
+ ```
270
+
271
+ ### Tooltip
272
+ ```tsx
273
+ import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@moving-walls/design-system';
274
+
275
+ <TooltipProvider>
276
+ <Tooltip>
277
+ <TooltipTrigger asChild>
278
+ <Button>Hover me</Button>
279
+ </TooltipTrigger>
280
+ <TooltipContent>Helpful tooltip</TooltipContent>
281
+ </Tooltip>
282
+ </TooltipProvider>
283
+ ```
284
+
285
+ ---
286
+
287
+ ## Navigation
288
+
289
+ ### Breadcrumb
290
+ ```tsx
291
+ import { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator, BreadcrumbPage } from '@moving-walls/design-system';
292
+
293
+ <Breadcrumb>
294
+ <BreadcrumbList>
295
+ <BreadcrumbItem>
296
+ <BreadcrumbLink href="/">Home</BreadcrumbLink>
297
+ </BreadcrumbItem>
298
+ <BreadcrumbSeparator />
299
+ <BreadcrumbItem>
300
+ <BreadcrumbPage>Current Page</BreadcrumbPage>
301
+ </BreadcrumbItem>
302
+ </BreadcrumbList>
303
+ </Breadcrumb>
304
+ ```
305
+
306
+ ---
307
+
308
+ ## Icons
309
+
310
+ Use `lucide-react` for icons:
311
+
312
+ ```tsx
313
+ import { Search, Plus, Check, ChevronDown, X, Edit, Trash2 } from 'lucide-react';
314
+
315
+ <Button>
316
+ <Plus className="mr-2 h-4 w-4" /> Add Item
317
+ </Button>
318
+
319
+ <Button variant="ghost" size="icon">
320
+ <X className="h-4 w-4" />
321
+ </Button>
322
+ ```
323
+
324
+ ---
325
+
326
+ ## Styling with Tailwind CSS
327
+
328
+ ```tsx
329
+ // Combining components with Tailwind
330
+ <Card className="border-2 border-blue-500">
331
+ <CardContent className="p-6">
332
+ <div className="flex items-center gap-4">
333
+ <Avatar className="h-12 w-12">
334
+ <AvatarFallback>JD</AvatarFallback>
335
+ </Avatar>
336
+ <div className="flex-1">
337
+ <h3 className="font-semibold">John Doe</h3>
338
+ <p className="text-sm text-gray-500">john@example.com</p>
339
+ </div>
340
+ <Badge variant="secondary">Active</Badge>
341
+ </div>
342
+ </CardContent>
343
+ </Card>
344
+ ```
@@ -0,0 +1,277 @@
1
+ # Influence DOOH AdServer — End-to-End Test Plan
2
+
3
+ ## 1. Authentication & Login
4
+
5
+ | # | Test Case | Steps | Expected Result |
6
+ |---|-----------|-------|-----------------|
7
+ | 1.1 | SSO Login | Navigate to `/login` → Click login button | Redirects to SSO provider, returns with token, lands on Dashboard |
8
+ | 1.2 | OAuth Callback | Complete SSO → return to `/auth/callback` | Access token stored, user profile loaded, redirect to Dashboard |
9
+ | 1.3 | Session Persistence | Login → Close tab → Reopen app | User remains logged in (token in cookies) |
10
+ | 1.4 | Logout | Click profile dropdown → Logout | Tokens cleared, redirected to login page |
11
+ | 1.5 | Protected Routes | Try accessing `/deals` without login | Redirected to `/login` |
12
+
13
+ ---
14
+
15
+ ## 2. Dashboard
16
+
17
+ | # | Test Case | Steps | Expected Result |
18
+ |---|-----------|-------|-----------------|
19
+ | 2.1 | Dashboard Load | Login → Land on `/` | Dashboard displays with key metric cards and charts |
20
+ | 2.2 | Navigation | Click sidebar links | Each link navigates to the correct page |
21
+
22
+ ---
23
+
24
+ ## 3. Deals List Page
25
+
26
+ | # | Test Case | Steps | Expected Result |
27
+ |---|-----------|-------|-----------------|
28
+ | 3.1 | Deals List Load | Navigate to `/deals` | Table loads with deals showing Name, Type (PD/PG/Traditional), Source (Influence/Activate/Planner), Status |
29
+ | 3.2 | Search | Type deal name in search bar | Table filters to matching deals |
30
+ | 3.3 | Type Badges | View deal rows | Correct amber/colored badges for deal type and source |
31
+ | 3.4 | Click Deal Row | Click a deal in the table | Navigates to `/deals/:dealId/line-items` |
32
+ | 3.5 | Create Deal Button | Click "Create Deal" | Navigates to `/deals/create` |
33
+
34
+ ---
35
+
36
+ ## 4. Deal Creation
37
+
38
+ | # | Test Case | Steps | Expected Result |
39
+ |---|-----------|-------|-----------------|
40
+ | 4.1 | Create DIRECT Deal | Fill deal form with DIRECT mode → Submit | Deal created via API, redirected to deal page |
41
+ | 4.2 | Create PROGRAMMATIC Deal | Fill deal form with PROGRAMMATIC mode → Submit | Deal created via API, redirected to deal page |
42
+ | 4.3 | DSP Dropdown | Select DSP from dropdown | Dropdown loads from `getDspDropdownList()` API |
43
+ | 4.4 | Buyer Selection | Select DSP → Select Buyer | Buyer list filters by DSP, seat ID auto-populates |
44
+ | 4.5 | DSP Change Clears Buyer | Select DSP → Select Buyer → Change DSP | Buyer name, seat ID, and buyer ID cleared |
45
+ | 4.6 | Edit Deal | Navigate to `/deals/edit/:dealId` | Form pre-fills with deal data, DSP/Buyer mapped correctly |
46
+ | 4.7 | Edit Mode Buyer Resolution | Edit existing deal with buyer data | DSP name maps to ID, buyerId resolved by seatId or buyerName match |
47
+ | 4.8 | Validation | Submit with required fields empty | Validation errors shown, form not submitted |
48
+
49
+ ---
50
+
51
+ ## 5. Deal Line Items Page
52
+
53
+ | # | Test Case | Steps | Expected Result |
54
+ |---|-----------|-------|-----------------|
55
+ | 5.1 | Line Items List | Navigate to `/deals/:dealId/line-items` | Table shows line items with Name, Status, Budget, Dates |
56
+ | 5.2 | History Button | Click clock icon next to Filter | Navigates to `/deals/:dealId/history` (icon-only button with tooltip) |
57
+ | 5.3 | Click Line Item Row | Click a line item row | Navigates to `/deals/:dealId/line-items/:lineItemId` (detail page) |
58
+ | 5.4 | Create Line Item | Click "New Line Item" | Navigates to line item form/wizard |
59
+ | 5.5 | Filter & Search | Use search bar and filters | Line items filtered accordingly |
60
+
61
+ ---
62
+
63
+ ## 6. Line Item Detail Page
64
+
65
+ | # | Test Case | Steps | Expected Result |
66
+ |---|-----------|-------|-----------------|
67
+ | 6.1 | Detail Page Load | Click line item row → detail page | Full DV360-style detail page loads with breadcrumbs |
68
+ | 6.2 | Summary Cards | View top of page | 4 cards: Budget, Impressions, Revenue, Flight Dates with correct values |
69
+ | 6.3 | Overview Section | View overview card | Shows Status, Priority, Creative Type, Media Type, Dates, Duration, Pacing |
70
+ | 6.4 | Targeting Section | View targeting card | Shows Demographics (age/gender badges), Venue Types, Geography, Signals |
71
+ | 6.5 | Inventory Table | View inventory section | Table with Name, Address, Venue Type, Publisher columns |
72
+ | 6.6 | Creatives Panel | View right sidebar | Shows assigned creatives with thumbnails, or empty state with "Assign Creatives" |
73
+ | 6.7 | Budget & Goals (DIRECT) | View DIRECT line item | Shows Budget Type, Budget Amount, Goal Type, Target Value, Pacing |
74
+ | 6.8 | Programmatic Panel | View PROGRAMMATIC line item | Shows Bid Floor, Net Cost, Impressions, Imp Multiplier |
75
+ | 6.9 | Edit Button | Click "Edit Line Item" | Navigates to `/deals/:dealId/line-items/:lineItemId/edit` |
76
+ | 6.10 | Back Navigation | Click "Back" or breadcrumb | Returns to deals or line items list |
77
+
78
+ ---
79
+
80
+ ## 7. Line Item Form (Create / Edit)
81
+
82
+ ### 7A. Basic Info & Pricing
83
+
84
+ | # | Test Case | Steps | Expected Result |
85
+ |---|-----------|-------|-----------------|
86
+ | 7A.1 | Form Load (Create) | Navigate to new line item form | Empty form with all sections, two-column layout (form + insights sidebar) |
87
+ | 7A.2 | Form Load (Edit) | Navigate to edit existing line item | Form pre-filled with existing data |
88
+ | 7A.3 | DIRECT Pricing | Set deal mode to DIRECT → Enter pricing | CPM, Total Budget, Daily Budget fields visible; `cpmBase` / `estimatedCostBase` stored |
89
+ | 7A.4 | PROGRAMMATIC Pricing | Set deal mode to PROGRAMMATIC → Enter pricing | Bid Floor visible; `bidFloorBase` stored |
90
+ | 7A.5 | Form Validation | Submit with required fields empty | Validation errors displayed per field |
91
+ | 7A.6 | Date Selection | Set start/end dates | Dates properly formatted and validated (end > start) |
92
+
93
+ ### 7B. Targeting Section (Row-Based Design)
94
+
95
+ | # | Test Case | Steps | Expected Result |
96
+ |---|-----------|-------|-----------------|
97
+ | 7B.1 | Media Type Row | View targeting section | Static row showing "DOOH" with checkmark |
98
+ | 7B.2 | Geography Row (Collapsed) | View Geography row | Shows MapPin icon, "Geography" label, "X locations selected ✓" |
99
+ | 7B.3 | Geography Row (Expanded) | Click Geography row | Expands to show "Enter locations" label, comma-separated input, "Advanced Map" button |
100
+ | 7B.4 | Geography Input | Type "New York, London, Tokyo" | Locations parsed and stored as array |
101
+ | 7B.5 | Advanced Map | Click "Advanced Map" button | Side Sheet opens with full GeofencingMap and location sidebar |
102
+ | 7B.6 | Map - Add Location | Draw polygon/point on map | Location added to sidebar list |
103
+ | 7B.7 | Map - Remove Location | Click delete on location card | Location removed from list |
104
+ | 7B.8 | Map - Import CSV | Click "Import Locations" → Upload CSV | Locations parsed and added to map |
105
+ | 7B.9 | Age Groups Row | Click Age Groups row | Expands to 3-column checkbox grid (18-24, 25-34, 35-44, etc.) |
106
+ | 7B.10 | Gender Row | Click Gender row | Expands to checkbox grid (Male, Female, Other) |
107
+ | 7B.11 | POI Targeting | Click POI Targeting row | Side drawer opens with POIs/Categories tabs, search, checkboxes |
108
+ | 7B.12 | POI Drawer - Apply | Select POIs → Click "Apply" | Drawer closes, POI count updated in row |
109
+ | 7B.13 | POI Drawer - Cancel | Select POIs → Click "Cancel" | Drawer closes, selections reverted |
110
+ | 7B.14 | Venue Type | Click Venue Type row | Side drawer opens with search and checkboxes |
111
+ | 7B.15 | Venue Drawer - Apply | Select venues → Click "Apply" | Drawer closes, venue count updated |
112
+
113
+ ### 7C. Signals (Auto-Activate)
114
+
115
+ | # | Test Case | Steps | Expected Result |
116
+ |---|-----------|-------|-----------------|
117
+ | 7C.1 | Signal Toggle | Toggle "Auto-activate Signal" switch ON | Signal dropdown becomes enabled |
118
+ | 7C.2 | Select Signal | Toggle ON → Select signal from dropdown | Signal selected and stored |
119
+ | 7C.3 | Signal Toggle OFF | Toggle "Auto-activate Signal" switch OFF | Signal dropdown disabled, signalId cleared |
120
+ | 7C.4 | Signal in DIRECT Mode | Create DIRECT line item with signal → Submit | `deliveryTargeting.signals` sent as object: `{ signalEnabled: true, signalId: "..." }` |
121
+ | 7C.5 | Signal in PROGRAMMATIC Mode | Create PROGRAMMATIC line item with signal → Submit | `deliveryTargeting.signals` sent as object (same format) |
122
+ | 7C.6 | Signal Edit Mode | Edit line item with existing signal | Signal toggle ON, correct signal pre-selected |
123
+ | 7C.7 | API Validation | Submit line item with signal enabled | No `VALIDATION_ERROR` on `deliveryTargeting.signals` (must be object, not array) |
124
+
125
+ ### 7D. Inventory & Recommendations
126
+
127
+ | # | Test Case | Steps | Expected Result |
128
+ |---|-----------|-------|-----------------|
129
+ | 7D.1 | Fetch Inventory | Click "Fetch Inventory" button | Recommendation API called, loading spinner shown |
130
+ | 7D.2 | Polling Duration | Start recommendation → Wait | Polls every 2 seconds for up to 5 minutes (150 attempts max) |
131
+ | 7D.3 | Polling Progress | Monitor console during polling | Progress logged every 30 seconds |
132
+ | 7D.4 | Recommendation Complete | Wait for completion | Toast shows "Found X available screens", inventory grid populated |
133
+ | 7D.5 | Recommendation Timeout | If API never completes | After 5 minutes, error message: "Recommendation timed out after 5 minutes" |
134
+ | 7D.6 | Select Inventories | Check inventories in grid | Selected IDs stored in form |
135
+
136
+ ### 7E. Form Submission
137
+
138
+ | # | Test Case | Steps | Expected Result |
139
+ |---|-----------|-------|-----------------|
140
+ | 7E.1 | Create Line Item (DIRECT) | Fill all sections → Submit | API called with correct payload including pricing, targeting, deliveryTargeting, inventories |
141
+ | 7E.2 | Create Line Item (PROGRAMMATIC) | Fill all sections → Submit | API called with programmatic payload including bidFloor, deliveryTargeting |
142
+ | 7E.3 | Edit Line Item | Edit existing → Save | API called with updated data, redirected to detail page |
143
+ | 7E.4 | Cancel | Click "Cancel" | Navigates back without saving |
144
+
145
+ ---
146
+
147
+ ## 8. Line Item Creatives Page
148
+
149
+ | # | Test Case | Steps | Expected Result |
150
+ |---|-----------|-------|-----------------|
151
+ | 8.1 | Creatives List Load | Navigate to `/deals/:dealId/line-items/:lineItemId/creatives` | Shows breadcrumbs, 4 metric cards, player status bar, table view |
152
+ | 8.2 | Search & Filter | Use search bar and filter toolbar | Creatives filtered accordingly |
153
+ | 8.3 | Assign Creative Button | Click "Assign Creative" | Full-width side Sheet popover opens (NOT page navigation) |
154
+
155
+ ---
156
+
157
+ ## 9. Creative Assignment (Side Sheet)
158
+
159
+ | # | Test Case | Steps | Expected Result |
160
+ |---|-----------|-------|-----------------|
161
+ | 9.1 | Sheet Opens | Click "Assign Creative" from creatives page | Full-width Sheet overlay opens |
162
+ | 9.2 | Left Panel | View left sidebar | Numbered creative requirements with resolution, duration, type, inventory count, drag-and-drop zones |
163
+ | 9.3 | Right Panel | View right panel | Content Hub with search, filters, grid/list toggle, 4-column card grid |
164
+ | 9.4 | Drag & Drop | Drag creative card from right → Drop on requirement slot | Creative assigned to requirement |
165
+ | 9.5 | Search Content Hub | Type in search field | Creative cards filter by search text |
166
+ | 9.6 | Save Assignment | Click "Save Assignment" | API called, Sheet closes, creatives list updated |
167
+ | 9.7 | Cancel | Click "Cancel" | Sheet closes, no changes saved |
168
+ | 9.8 | Sticky Footer | Scroll down in Sheet | Footer with Cancel / Save buttons remains visible |
169
+
170
+ ---
171
+
172
+ ## 10. Content Hub
173
+
174
+ | # | Test Case | Steps | Expected Result |
175
+ |---|-----------|-------|-----------------|
176
+ | 10.1 | Page Load | Navigate to `/creatives` | Content Hub page loads with grid/list toggle, folder cards, creatives |
177
+ | 10.2 | Grid/List View | Toggle between grid and list | View switches correctly |
178
+ | 10.3 | Folder Navigation | Click folder card | Navigates to folder contents |
179
+ | 10.4 | Creative Preview | Click creative card | Preview sheet opens with tags, status actions, download/transcode/delete |
180
+ | 10.5 | Filter Drawer | Click filter button | Filter drawer opens with filter options |
181
+ | 10.6 | Pagination | Navigate to next page | Next set of creatives loads |
182
+ | 10.7 | Approve Creative | Click approve action on creative | API called, status updated |
183
+ | 10.8 | Reject Creative | Click reject action | API called, status updated |
184
+ | 10.9 | Delete Creative | Click delete action → Confirm | API called, creative removed from list |
185
+ | 10.10 | Create Folder | Click create folder → Enter name | API called, folder created |
186
+
187
+ ---
188
+
189
+ ## 11. DSP & Buyer Management
190
+
191
+ | # | Test Case | Steps | Expected Result |
192
+ |---|-----------|-------|-----------------|
193
+ | 11.1 | DSP List | Navigate to `/dsp` | Read-only list of DSPs from API |
194
+ | 11.2 | Buyer List | Navigate to `/buyers` | List of buyers with CRUD actions |
195
+ | 11.3 | Create Buyer | Click "New Buyer" → Fill form → Save | Buyer created via API |
196
+ | 11.4 | Edit Buyer | Click edit on buyer → Modify → Save | Buyer updated via API |
197
+ | 11.5 | Delete Buyer | Click delete → Confirm | Buyer removed via API |
198
+
199
+ ---
200
+
201
+ ## 12. Deal History
202
+
203
+ | # | Test Case | Steps | Expected Result |
204
+ |---|-----------|-------|-----------------|
205
+ | 12.1 | History Button Location | View deal page | Clock icon button with tooltip next to Filter icon (not in dropdown) |
206
+ | 12.2 | History Page | Click history icon | Navigates to `/deals/:dealId/history` with activity log |
207
+
208
+ ---
209
+
210
+ ## 13. Line Item Wizard (Targeting Step)
211
+
212
+ | # | Test Case | Steps | Expected Result |
213
+ |---|-----------|-------|-----------------|
214
+ | 13.1 | Wizard Load | Create line item via wizard flow | Multi-step wizard loads with targeting step |
215
+ | 13.2 | Flat Row Layout | View targeting step | No tabs — flat collapsible rows: Media Type, Geography, Age Groups, Gender, etc. |
216
+ | 13.3 | Geography in Wizard | Expand Geography row | "Enter locations (comma separated)" input + "Advanced Map" button |
217
+ | 13.4 | Advanced Map in Wizard | Click "Advanced Map" | Map Sheet opens with drawing tools and location sidebar |
218
+ | 13.5 | Recommendation Polling | Complete targeting → Submit | Recommendation submits and polls for up to 5 minutes |
219
+ | 13.6 | Signals in Wizard (DIRECT) | Deal mode = DIRECT → Configure signals | Signal types selectable with weather/traffic/AQI/time-of-day configs |
220
+
221
+ ---
222
+
223
+ ## 14. Navigation & Routing
224
+
225
+ | # | Test Case | Steps | Expected Result |
226
+ |---|-----------|-------|-----------------|
227
+ | 14.1 | Sidebar Navigation | Click each sidebar item | Navigates to correct page: Dashboard, Deals, Content Hub, Inventory, etc. |
228
+ | 14.2 | Deal → Line Items Flow | Deals → Click deal → Line Items list | Correct deal's line items shown |
229
+ | 14.3 | Line Item Detail Flow | Line Items → Click row → Detail page | Full detail page at `/deals/:dealId/line-items/:lineItemId` |
230
+ | 14.4 | Edit Flow | Detail page → Click "Edit" → Form | Line item form pre-filled with data |
231
+ | 14.5 | Creatives Flow | Line Items → Creatives → Assign Creative | Sheet overlay opens (not page nav) |
232
+ | 14.6 | Back Navigation | Use back buttons / breadcrumbs | Correct back navigation at each level |
233
+ | 14.7 | Settings Page | Profile dropdown → Settings | Navigates to in-app `/settings` (not external URL) |
234
+ | 14.8 | 404 Page | Navigate to `/nonexistent` | Not Found page displayed |
235
+
236
+ ---
237
+
238
+ ## 15. Reports, Signals, Integrations & Configuration
239
+
240
+ | # | Test Case | Steps | Expected Result |
241
+ |---|-----------|-------|-----------------|
242
+ | 15.1 | Reports Page | Navigate to `/reports` | Reports page loads with charts and metrics |
243
+ | 15.2 | Signals Page | Navigate to `/signals` | Signals management page loads |
244
+ | 15.3 | Proof of Play | Navigate to `/proof-of-play` | Proof of play page loads |
245
+ | 15.4 | Integrations | Navigate to `/integrations` | SSP/DSP integrations page loads |
246
+ | 15.5 | Settings | Navigate to `/settings` | 11 configuration sections visible |
247
+ | 15.6 | Tags | Navigate to `/tags` | Color-coded tag management page |
248
+ | 15.7 | Custom POIs | Navigate to `/custom-pois` | Geolocation management with upload/create |
249
+
250
+ ---
251
+
252
+ ## 16. Cross-Cutting Concerns
253
+
254
+ | # | Test Case | Steps | Expected Result |
255
+ |---|-----------|-------|-----------------|
256
+ | 16.1 | Internationalization | Switch language (English/Japanese/Chinese/Arabic) | UI text updates, RTL for Arabic |
257
+ | 16.2 | Dark Mode | Toggle dark mode | All pages render correctly in dark theme |
258
+ | 16.3 | Responsive Layout | Resize browser to mobile/tablet | Layout adapts, sidebar collapses, cards stack |
259
+ | 16.4 | API Error Handling | Simulate API failure (network off) | Error toasts shown, no blank screens |
260
+ | 16.5 | Loading States | Slow API response | Skeleton loaders or spinners shown during data fetch |
261
+ | 16.6 | Form Unsaved Changes | Edit form → Navigate away | Confirm dialog if unsaved changes exist |
262
+
263
+ ---
264
+
265
+ ## Test Environment
266
+
267
+ - **URL**: Staging deployment (Replit preview or deployed URL)
268
+ - **Auth**: SSO login with test account (e.g., `jeki@jeki.com` / Administrator role)
269
+ - **API**: Staging APIs at `*-stg.movingwalls.com`
270
+ - **Browser**: Chrome latest (primary), Firefox, Safari (secondary)
271
+
272
+ ## Priority Levels
273
+
274
+ - **P0 (Critical)**: Authentication, Deal CRUD, Line Item CRUD, Signal format (object not array), Recommendation polling (5 min)
275
+ - **P1 (High)**: Targeting section UI, Creative Assignment Sheet, DSP/Buyer management, Navigation flows
276
+ - **P2 (Medium)**: Content Hub operations, Reports, Detail page display, Inventory table
277
+ - **P3 (Low)**: Dark mode, Internationalization, Settings/Tags/Custom POIs, Responsive layout