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,886 @@
1
+ {
2
+ "deals": {
3
+ "advertiser": "Advertiser",
4
+ "agency": "Agency",
5
+ "brand": "Brand",
6
+ "budget": "Budget",
7
+ "createDeal": "Create Deal",
8
+ "createFirst": "Create your first deal to get started",
9
+ "currency": "Currency",
10
+ "dealName": "Deal Name",
11
+ "dealType": "Deal Type",
12
+ "deleteConfirm": "Are you sure you want to delete this deal?",
13
+ "deleteWarning": "This action cannot be undone. All associated line items will also be deleted.",
14
+ "editDeal": "Edit Deal",
15
+ "endDate": "End Date",
16
+ "flightDates": "Flight Dates",
17
+ "noDeal": "No deals found",
18
+ "startDate": "Start Date",
19
+ "status": "Status",
20
+ "subtitle": "Manage your deals with ease and full efficiency",
21
+ "title": "Deals"
22
+ },
23
+ "createDeal": {
24
+ "createTitle": "Create New Deal",
25
+ "updateTitle": "Update Deal",
26
+ "createSubtitle": "Define the commercial container for your advertising deal.",
27
+ "updateSubtitle": "Modify your advertising deal details.",
28
+ "enterDealName": "Enter deal name",
29
+ "selectBrand": "Select Brand",
30
+ "searchBrands": "Search brands...",
31
+ "loadingBrands": "Loading brands...",
32
+ "noBrandsFound": "No brands found",
33
+ "typeToEnterBrand": "Type to enter a brand name",
34
+ "loading": "Loading...",
35
+ "loadMore": "Load more...",
36
+ "createNewBrand": "Create new brand",
37
+ "countries": "Countries",
38
+ "selectCountries": "Select countries",
39
+ "goalType": "Goal Type",
40
+ "goalValue": "Goal Value",
41
+ "selectGoalType": "Select goal type",
42
+ "enterGoalValue": "Enter goal value",
43
+ "impressions": "Impressions",
44
+ "budget": "Budget",
45
+ "views": "Views",
46
+ "clicks": "Clicks",
47
+ "status": "Status",
48
+ "selectStatus": "Select status",
49
+ "mediaType": "Media Type",
50
+ "selectMediaType": "Select media type",
51
+ "sspPartner": "SSP Partner",
52
+ "selectSspPartner": "Select SSP partner",
53
+ "billable": "Billable",
54
+ "billableDescription": "Include this deal in invoicing",
55
+ "marketInsights": "Market Insights",
56
+ "population": "Population",
57
+ "availableInventories": "Available Inventories",
58
+ "estimatedImpressions": "Est. Impressions",
59
+ "mode": "Mode",
60
+ "traditional": "Traditional",
61
+ "traditionalDesc": "Direct deals with advertisers",
62
+ "programmatic": "Programmatic",
63
+ "programmaticDesc": "DSP-based automated buying",
64
+ "clientType": "Client Type",
65
+ "selectClientType": "Select client type",
66
+ "directAdvertiser": "Direct Advertiser",
67
+ "selectCurrency": "Select currency",
68
+ "currencyForDeal": "Currency for this deal",
69
+ "selectAgency": "Select Agency",
70
+ "searchAgencies": "Search agencies...",
71
+ "loadingAgencies": "Loading agencies...",
72
+ "noAgenciesFound": "No agencies found",
73
+ "approvalEmails": "Approval Emails",
74
+ "enterEmailAddress": "Enter email address",
75
+ "add": "Add",
76
+ "totalBudget": "Total Budget",
77
+ "enterTotalBudget": "Enter total budget",
78
+ "budgetHelpText": "Daily budget caps and pacing are configured at the line item level",
79
+ "selectDealType": "Select deal type",
80
+ "programmaticType": "Programmatic Type",
81
+ "buyers": "Buyers",
82
+ "dsp": "DSP",
83
+ "seatId": "Seat ID",
84
+ "buyerName": "Buyer Name",
85
+ "addBuyer": "Add Buyer",
86
+ "auctionType": "Auction Type",
87
+ "selectAuctionType": "Select auction type",
88
+ "fixedPriceRequired": "Fixed price is required for Guaranteed and Preferred Deals",
89
+ "transactionType": "Transaction Type",
90
+ "selectTransactionType": "Select transaction type",
91
+ "costType": "Cost Type",
92
+ "selectCostType": "Select cost type",
93
+ "formInsights": "Form Insights",
94
+ "insightDealName": "Deal name should be descriptive and unique",
95
+ "insightFlightDates": "Flight dates are calculated automatically from line items",
96
+ "insightBrand": "Selecting a brand helps with targeting recommendations",
97
+ "insightApprovalEmails": "Approval emails will receive notifications for deal approval",
98
+ "insightFixedPrice": "Guaranteed and Preferred deals use fixed price auction",
99
+ "insightCpsNotAvailable": "CPS is not available for Guaranteed deals",
100
+ "quickTips": "Quick Tips",
101
+ "tipTraditional": "Direct deals with advertisers or agencies",
102
+ "tipProgrammatic": "Automated DSP-based buying",
103
+ "tipConfigureLineItems": "You'll configure line items after creating the deal",
104
+ "cancel": "Cancel",
105
+ "updating": "Updating...",
106
+ "creating": "Creating...",
107
+ "successTitle": "Deal created successfully",
108
+ "successDescription": "Redirecting to line items...",
109
+ "errorTitle": "Error creating deal",
110
+ "errorDescription": "Failed to create deal",
111
+ "pleaseWait": "Please wait",
112
+ "loadingAgencyData": "Loading agency data. Please try again in a moment.",
113
+ "nonBillable": "Non Billable",
114
+ "nonBillableDescription": "Mark this deal as non-billable",
115
+ "hardStop": "Hard Stop",
116
+ "hardStopDescription": "Stop delivery when goal is reached",
117
+ "country": "Country",
118
+ "selectCountry": "Select country"
119
+ },
120
+ "updateDeal": {
121
+ "title": "Update Deal",
122
+ "successTitle": "Deal updated successfully",
123
+ "successDescription": "Redirecting to line items...",
124
+ "errorTitle": "Error updating deal",
125
+ "errorDescription": "Failed to update deal"
126
+ },
127
+ "lineItems": {
128
+ "budget": "Budget",
129
+ "createFirst": "Create your first line item for this deal",
130
+ "createLineItem": "Create Line Item",
131
+ "delivery": "Delivery",
132
+ "editLineItem": "Edit Line Item",
133
+ "endDate": "End Date",
134
+ "frequency": "Frequency",
135
+ "impressions": "Impressions",
136
+ "inventories": "Inventories",
137
+ "lineItemName": "Line Item Name",
138
+ "newLineItem": "New Line Item",
139
+ "noLineItems": "No line items found",
140
+ "pacing": "Pacing",
141
+ "priority": "Priority",
142
+ "progress": "Progress",
143
+ "startDate": "Start Date",
144
+ "subtitle": "Manage line items for {{dealName}}",
145
+ "title": "Line Items",
146
+ "totalImpressions": "Total Impressions"
147
+ },
148
+ "pacing": {
149
+ "asap": "ASAP",
150
+ "description": {
151
+ "asap": "Deliver impressions as quickly as possible",
152
+ "even": "Distribute impressions evenly throughout the campaign",
153
+ "frontloaded": "Deliver more impressions at the start of the campaign"
154
+ },
155
+ "even": "Even",
156
+ "frontloaded": "Frontloaded"
157
+ },
158
+ "summary": {
159
+ "budgetSpent": "Budget Spent",
160
+ "creatives": "Creatives",
161
+ "dealHistory": "Deal History",
162
+ "dealSummary": "Deal Summary",
163
+ "daysRemaining": "days remaining",
164
+ "inventories": "Inventories",
165
+ "lineItemPerformances": "Line Item Performances",
166
+ "noPacingData": "No pacing data available",
167
+ "overallDelivery": "Overall Delivery"
168
+ },
169
+ "table": {
170
+ "actions": "Actions",
171
+ "lineItem": "Line Item",
172
+ "sno": "S.No"
173
+ },
174
+ "wizard": {
175
+ "title": "Line Item Wizard",
176
+ "steps": {
177
+ "details": "Details",
178
+ "inventorySchedule": "Inventory & Schedule",
179
+ "targeting": "Targeting",
180
+ "creatives": "Creatives",
181
+ "summary": "Summary"
182
+ },
183
+ "common": {
184
+ "next": "Next",
185
+ "back": "Back",
186
+ "save": "Save",
187
+ "cancel": "Cancel",
188
+ "saving": "Saving...",
189
+ "loading": "Loading...",
190
+ "searchHere": "Search here",
191
+ "selectAll": "Select All",
192
+ "noResults": "No results found",
193
+ "selected": "selected",
194
+ "pageItems": "Page Items",
195
+ "groupBy": "Group by",
196
+ "allInventories": "All Inventories"
197
+ },
198
+ "details": {
199
+ "title": "Line Item Details",
200
+ "subtitle": "Define the basic details for your line item.",
201
+ "name": "Name",
202
+ "lineItemName": "Line Item Name",
203
+ "enterLineItemName": "Enter line item name",
204
+ "flightDates": "Flight Dates",
205
+ "selectFlightDates": "Select flight date range",
206
+ "creativeType": "Creative Type",
207
+ "selectCreativeType": "Select creative type",
208
+ "display": "Display",
209
+ "displayDesc": "Static images and banners",
210
+ "video": "Video",
211
+ "videoDesc": "Video content and animations",
212
+ "audio": "Audio",
213
+ "audioDesc": "Audio advertisements",
214
+ "creativeDuration": "Creative Duration (seconds)",
215
+ "durationPlaceholder": "e.g. 10",
216
+ "durationOfPlayback": "Duration of creative playback",
217
+ "budgetAmount": "Budget Amount",
218
+ "enterAmount": "Enter amount",
219
+ "currencyInherited": "Currency is inherited from the campaign",
220
+ "goalType": "Goal Type",
221
+ "selectGoalType": "Select goal type",
222
+ "impressions": "Impressions",
223
+ "reach": "Reach",
224
+ "shareOfVoice": "Share of Voice",
225
+ "targetValue": "Target Value",
226
+ "enterImpressions": "Enter number of impressions",
227
+ "enterUsers": "Enter number of users",
228
+ "enterPercentage": "Enter percentage (0 - 100)",
229
+ "impressionsDesc": "Total number of impressions to achieve",
230
+ "reachDesc": "Number of unique users to reach",
231
+ "sovDesc": "Percentage of available inventory (0-100%)",
232
+ "pacing": "Pacing",
233
+ "selectPacing": "Select pacing",
234
+ "pacingAsap": "ASAP",
235
+ "pacingAsapDesc": "The allocated budget will be fully used to achieve target quantity as soon as possible at the earliest of the flight date.",
236
+ "pacingEven": "Even (Default)",
237
+ "pacingEvenDesc": "Budget will be distributed evenly across the entire flight duration.",
238
+ "pacingFrontLoaded": "Front-Loaded",
239
+ "pacingFrontLoadedDesc": "Higher budget allocation at the start of the campaign, tapering off towards the end.",
240
+ "pacingBackLoaded": "Back-Loaded",
241
+ "pacingBackLoadedDesc": "Lower budget allocation at the start, increasing towards the end of the campaign.",
242
+ "dailyImpressionCap": "Daily Impression Cap",
243
+ "optionalDailyLimit": "Optional daily limit",
244
+ "maxImpressionsPerDay": "Maximum impressions per day",
245
+ "hourlyImpressionCap": "Hourly Impression Cap",
246
+ "optionalHourlyLimit": "Optional hourly limit",
247
+ "maxImpressionsPerHour": "Maximum impressions per hour",
248
+ "projectedPacingDelivery": "Projected Pacing Delivery",
249
+ "pacingGraphTooltip": "This graph shows the projected delivery pattern based on your selected pacing type.",
250
+ "goalPercentage": "Goal Percentage",
251
+ "numberOfDays": "No.of Days",
252
+ "formInsights": "Form Insights",
253
+ "insightName": "Give your line item a descriptive name",
254
+ "insightDates": "Flight dates define when your ads will run",
255
+ "insightBudget": "Set your budget to control spending",
256
+ "insightGoal": "Choose a goal that aligns with your campaign objectives",
257
+ "tipPacing": "Even pacing distributes delivery evenly for consistent exposure",
258
+ "tipBudget": "Consider your total campaign budget when setting line item budgets"
259
+ },
260
+ "inventory": {
261
+ "title": "Inventories",
262
+ "subtitle": "Choose the inventories suitable",
263
+ "description": "Select screens and set schedule",
264
+ "screens": "Screens",
265
+ "networks": "Networks",
266
+ "packages": "Packages",
267
+ "items": "Items",
268
+ "noScreensFound": "No screens found",
269
+ "noNetworksFound": "No networks found",
270
+ "noPackagesFound": "No packages found",
271
+ "loadingInventories": "Loading inventories...",
272
+ "selectedScreens": "Selected Screens",
273
+ "noScreensSelected": "No screens selected",
274
+ "filterByLocation": "Filter by Location",
275
+ "filterByVenue": "Filter by Venue Type",
276
+ "searchScreens": "Search screens...",
277
+ "listView": "List view",
278
+ "advancedFilter": "Advanced filter",
279
+ "settings": "Settings",
280
+ "scheduleTitle": "Schedule & Forecast",
281
+ "flight": "Flight",
282
+ "schedule": "Schedule",
283
+ "impressions": "Impressions",
284
+ "reach": "Reach",
285
+ "frequency": "Frequency",
286
+ "adPlays": "Ad Plays",
287
+ "sov": "SOV",
288
+ "cpm": "CPM",
289
+ "totalCost": "Total Cost",
290
+ "noInventorySelected": "No inventory selected",
291
+ "selectInventoryForForecast": "Select inventory to see forecast"
292
+ },
293
+ "targeting": {
294
+ "title": "Targeting Options",
295
+ "subtitle": "Configure audience and location targeting",
296
+ "description": "Configure audience and location targeting",
297
+ "demographicsTab": "Demographics",
298
+ "venueTypesTab": "Venue Types",
299
+ "geofencingTab": "Geofencing",
300
+ "signalsTab": "Signals",
301
+ "ageGroups": "Age Groups",
302
+ "selectAgeGroups": "Select age groups",
303
+ "genders": "Genders",
304
+ "selectGenders": "Select genders",
305
+ "male": "Male",
306
+ "female": "Female",
307
+ "other": "Other",
308
+ "incomeGroups": "Income Groups",
309
+ "selectIncomeGroups": "Select income groups",
310
+ "lowIncome": "Low Income",
311
+ "lowerMiddle": "Lower-Middle",
312
+ "middle": "Middle",
313
+ "upperMiddle": "Upper-Middle",
314
+ "highIncome": "High Income",
315
+ "interests": "Interests",
316
+ "selectInterests": "Select interests",
317
+ "sportsFitness": "Sports & Fitness",
318
+ "travel": "Travel",
319
+ "technology": "Technology",
320
+ "foodDining": "Food & Dining",
321
+ "entertainment": "Entertainment",
322
+ "fashion": "Fashion",
323
+ "automotive": "Automotive",
324
+ "audienceBehaviors": "Audience Behaviors",
325
+ "selectBehaviors": "Select behaviors",
326
+ "dailyCommuter": "Daily Commuter",
327
+ "frequentShopper": "Frequent Shopper",
328
+ "weekendShopper": "Weekend Shopper",
329
+ "tourist": "Tourist",
330
+ "student": "Student",
331
+ "businessProfessional": "Business Professional",
332
+ "venueTypes": "Venue Types",
333
+ "selectVenueTypes": "Select venue types",
334
+ "loadingVenues": "Loading venue types...",
335
+ "geofencing": "Geofencing",
336
+ "addGeofence": "Add Geofence",
337
+ "drawOnMap": "Draw on Map",
338
+ "uploadLocations": "Upload Locations",
339
+ "radius": "Radius",
340
+ "includeExclude": "Include/Exclude",
341
+ "includeAll": "Include All",
342
+ "noLocations": "No locations added",
343
+ "addLocationsHint": "Draw on the map or upload locations to define your geofence areas",
344
+ "locationName": "Location Name",
345
+ "locationAddress": "Address",
346
+ "remove": "Remove",
347
+ "addPoi": "Add POI",
348
+ "poiTypes": "POI Types",
349
+ "maxPoisPerLocation": "Maximum {{max}} POIs per location",
350
+ "signals": "Signals",
351
+ "signalsDescription": "Trigger ads based on real-time conditions",
352
+ "weather": "Weather",
353
+ "weatherDescription": "Trigger ads based on weather conditions and temperature",
354
+ "traffic": "Traffic",
355
+ "trafficDescription": "Adjust delivery based on real-time traffic density",
356
+ "airQuality": "Air Quality Index",
357
+ "airQualityDescription": "Target based on air quality levels",
358
+ "timeOfDay": "Time of Day",
359
+ "timeOfDayDescription": "Daypart targeting (morning, afternoon, evening)",
360
+ "weatherConditions": "Weather Conditions",
361
+ "temperature": "Temperature",
362
+ "temperatureMin": "Min Temperature",
363
+ "temperatureMax": "Max Temperature",
364
+ "temperatureUnit": "Temperature Unit",
365
+ "celsius": "Celsius (°C)",
366
+ "fahrenheit": "Fahrenheit (°F)",
367
+ "trafficDensity": "Traffic Density",
368
+ "low": "Low",
369
+ "moderate": "Moderate",
370
+ "high": "High",
371
+ "aqiThreshold": "AQI Threshold",
372
+ "good": "Good",
373
+ "unhealthySensitive": "Unhealthy for Sensitive Groups",
374
+ "unhealthy": "Unhealthy",
375
+ "veryUnhealthy": "Very Unhealthy",
376
+ "hazardous": "Hazardous",
377
+ "dayparts": "Dayparts",
378
+ "morning": "Morning (6AM-12PM)",
379
+ "afternoon": "Afternoon (12PM-6PM)",
380
+ "evening": "Evening (6PM-10PM)",
381
+ "night": "Night (10PM-6AM)",
382
+ "smartSuggestions": "Smart Suggestions",
383
+ "aiPowered": "AI-Powered",
384
+ "basedOnCampaign": "Based on your campaign data, we recommend these targeting options",
385
+ "applySuggestions": "Apply Suggestions",
386
+ "formInsights": "Targeting Insights",
387
+ "insightDemographics": "Refine your audience with demographic targeting",
388
+ "insightVenues": "Select venue types that match your target audience",
389
+ "insightGeofencing": "Use geofencing for location-specific campaigns",
390
+ "insightSignals": "Real-time signals help reach audiences at the right moment",
391
+ "tipCombine": "Combine multiple targeting options for better precision",
392
+ "tipTest": "Start broad and refine based on performance data"
393
+ },
394
+ "creatives": {
395
+ "title": "Creative Assignment",
396
+ "subtitle": "Drag, Drop and assign creative assets to your line items",
397
+ "description": "Assign creatives to this line item",
398
+ "assignCreatives": "Assign Creatives",
399
+ "browseLibrary": "Browse Library",
400
+ "noCreatives": "No creatives assigned",
401
+ "uploadNew": "Upload New",
402
+ "skipStep": "Skip this step",
403
+ "contentHub": "Content Hub Creatives",
404
+ "typeOnly": "Only",
405
+ "showingMatching": "Showing creatives matching inventory resolutions",
406
+ "allowedResolutions": "Allowed",
407
+ "loadingCreatives": "Loading creatives...",
408
+ "noMatchingCreatives": "No matching creatives found",
409
+ "uploadToStart": "Upload files to get started",
410
+ "uploadWithResolution": "Upload files with resolutions",
411
+ "assignedCreatives": "Assigned Creatives",
412
+ "noCreativesAssigned": "No creatives assigned yet",
413
+ "dragDropHint": "Drag and drop the creatives here..",
414
+ "creative": "Creative",
415
+ "creatives": "Creatives",
416
+ "duplicateError": "is already assigned to this line item",
417
+ "formInsights": "Creative Insights",
418
+ "insightMatch": "Creatives are filtered to match your selected inventory",
419
+ "insightResolution": "Resolution compatibility ensures proper display",
420
+ "insightMultiple": "Assign multiple creatives for A/B testing",
421
+ "tipDragDrop": "Drag creatives from the library to the drop zone",
422
+ "tipClick": "Or click on a creative to assign it directly"
423
+ },
424
+ "summary": {
425
+ "title": "Review & Submit",
426
+ "subtitle": "Review all line item details before submission.",
427
+ "description": "Review your line item configuration",
428
+ "lineItemDetails": "Line Item Details",
429
+ "name": "Name",
430
+ "untitledLineItem": "Untitled Line Item",
431
+ "flightDates": "Flight Dates",
432
+ "budget": "Budget",
433
+ "goal": "Goal",
434
+ "pacing": "Pacing",
435
+ "dailyCap": "Daily Cap",
436
+ "hourlyCap": "Hourly Cap",
437
+ "notSet": "Not set",
438
+ "targeting": "Targeting",
439
+ "noTargetingSet": "No targeting set",
440
+ "noTargetingDesc": "No targeting criteria configured. The line item will target all audiences.",
441
+ "ageGroups": "Age Groups",
442
+ "genders": "Genders",
443
+ "incomeGroups": "Income Groups",
444
+ "interests": "Interests",
445
+ "venueTypes": "Venue Types",
446
+ "geofencing": "Geofencing",
447
+ "location": "location",
448
+ "locations": "locations",
449
+ "signals": "Signals",
450
+ "inventories": "Inventories",
451
+ "screen": "screen",
452
+ "screens": "screens",
453
+ "noInventoriesSelected": "No inventories selected.",
454
+ "totalScreens": "Total Screens",
455
+ "resolutions": "Resolutions",
456
+ "selectedScreens": "Selected Screens",
457
+ "more": "more",
458
+ "creatives": "Creatives",
459
+ "creative": "creative",
460
+ "noCreativesAssigned": "No creatives assigned.",
461
+ "estimatedReach": "Estimated Reach",
462
+ "totalBudget": "Total Budget",
463
+ "assignedCreatives": "Assigned Creatives",
464
+ "targetingSettings": "Targeting Settings",
465
+ "reviewDetails": "Review Details"
466
+ }
467
+ },
468
+ "directWizard": {
469
+ "common": {
470
+ "nextStep": "Next Step",
471
+ "previousStep": "Previous Step",
472
+ "loading": "Loading...",
473
+ "saving": "Saving...",
474
+ "creating": "Creating...",
475
+ "updating": "Updating...",
476
+ "creatingCampaign": "Creating Campaign...",
477
+ "updatingCampaign": "Updating Campaign...",
478
+ "createCampaign": "Create Campaign",
479
+ "updateCampaign": "Update Campaign",
480
+ "optional": "Optional",
481
+ "required": "Required",
482
+ "searchHere": "Search here...",
483
+ "createNew": "Create new",
484
+ "selectBrand": "Select Brand",
485
+ "selected": "selected"
486
+ },
487
+ "dealDetails": {
488
+ "title": "Deal Details",
489
+ "subtitle": "Define the commercial container for your deal.",
490
+ "dealName": "Deal Name",
491
+ "dealNamePlaceholder": "Campaign_Sep_08_2025",
492
+ "flightDates": "Flight Dates",
493
+ "selectFlightDateRange": "Select flight date range",
494
+ "brand": "Brand",
495
+ "clientType": "Client Type",
496
+ "directAdvertiser": "Direct Advertiser/Traditional",
497
+ "agency": "Agency",
498
+ "totalBudget": "Total Budget",
499
+ "enterBudgetAmount": "Enter Budget amount",
500
+ "formInsights": "Form Insights",
501
+ "quickTips": "Quick Tips",
502
+ "insightCampaignName": "Campaign name should be descriptive and unique",
503
+ "insightFlightDates": "Set realistic campaign dates for better inventory availability",
504
+ "insightBrand": "Selecting a brand helps with targeting recommendations",
505
+ "tipBrandRecommendations": "Selecting a brand helps with better recommendations",
506
+ "tipBudgetNextStep": "Budget and goals are set in the next step",
507
+ "tipChangeDetails": "You can always change these details later"
508
+ },
509
+ "campaignDetails": {
510
+ "title": "Deal Details",
511
+ "subtitle": "Set up your deal information",
512
+ "dealName": "Deal Name",
513
+ "dealNamePlaceholder": "Deal_Sep_08_2025",
514
+ "dealType": "Deal Type",
515
+ "selectDealType": "Select deal type",
516
+ "programmaticType": "Programmatic Type",
517
+ "guaranteed": "Programmatic Guaranteed",
518
+ "preferredDeal": "Preferred Deal",
519
+ "privateAuction": "Private Auction",
520
+ "evergreenPmp": "Evergreen PMP",
521
+ "dealDates": "Deal Dates",
522
+ "selectDealDateRange": "Select deal date range",
523
+ "brand": "Brand",
524
+ "brandPlaceholder": "Acme Corp",
525
+ "clientType": "Client Type",
526
+ "selectClientType": "Select client type",
527
+ "direct": "Direct",
528
+ "buyer": "Buyer",
529
+ "agency": "Agency",
530
+ "buyerName": "Buyer Name",
531
+ "buyerNamePlaceholder": "Media Buying Corp",
532
+ "agencyName": "Agency Name",
533
+ "agencyNamePlaceholder": "Creative Agency LLC",
534
+ "approvalEmails": "Approval Emails",
535
+ "approvalEmailsPlaceholder": "Enter emails of all approvers with a enter here...",
536
+ "targetCountry": "Target Country",
537
+ "selectCountry": "Select Country",
538
+ "malaysia": "Malaysia",
539
+ "singapore": "Singapore",
540
+ "indonesia": "Indonesia",
541
+ "thailand": "Thailand",
542
+ "philippines": "Philippines",
543
+ "japan": "Japan",
544
+ "unitedStates": "United States",
545
+ "unitedKingdom": "United Kingdom",
546
+ "totalBudget": "Total Budget",
547
+ "enterBudgetAmount": "Enter Budget amount",
548
+ "dailyBudgetCap": "Daily Budget Cap",
549
+ "enterDailyBudgetAmount": "Enter Daily Budget amount"
550
+ },
551
+ "budgetGoal": {
552
+ "title": "Budget & Campaign Goals",
553
+ "subtitle": "Set your campaign budget and define performance objectives",
554
+ "budgetAllocation": "Budget Allocation",
555
+ "country": "Country",
556
+ "selectCountry": "Select country",
557
+ "currency": "Currency",
558
+ "selectCurrency": "Select currency",
559
+ "currencyCodeHelp": "ISO 4217 currency code",
560
+ "totalBudget": "Total Budget",
561
+ "totalBudgetHelp": "Total campaign budget in selected currency",
562
+ "dailyBudget": "Daily Budget",
563
+ "dailyBudgetHelp": "Optional daily spending limit",
564
+ "performanceGoals": "Performance Goals",
565
+ "goalType": "Goal Type",
566
+ "selectGoalType": "Select goal type",
567
+ "targetValue": "Target Value",
568
+ "targetValueHelp": "Target value for the selected goal type",
569
+ "optimizationStrategy": "Optimization Strategy",
570
+ "nextTargeting": "Next: Targeting"
571
+ },
572
+ "inventories": {
573
+ "title": "Inventories",
574
+ "subtitle": "Select the billboard and screen inventories for your campaign",
575
+ "viewSelected": "View Selected",
576
+ "selectedInventories": "Selected Inventories",
577
+ "campaignInventories": "Campaign Inventories",
578
+ "newlySelected": "Newly Selected",
579
+ "noNewInventoriesSelected": "No new inventories selected",
580
+ "noBillboardsSelected": "No Billboards Selected",
581
+ "selectAtLeastOne": "Please select at least one billboard for your campaign.",
582
+ "inventoryRemoved": "Inventory removed",
583
+ "inventoryRemovedDesc": "The inventory has been removed from the campaign.",
584
+ "removeError": "Error",
585
+ "removeErrorDesc": "Failed to remove inventory. Please try again.",
586
+ "nextSchedule": "Next: Schedule"
587
+ },
588
+ "schedule": {
589
+ "title": "Campaign Schedule",
590
+ "subtitle": "Configure when your campaign should run",
591
+ "scheduleType": "Schedule Type",
592
+ "customWeeklySchedule": "Custom Weekly Schedule",
593
+ "presetTemplate": "Preset Template",
594
+ "advancedScheduling": "Advanced Scheduling",
595
+ "apply247": "Apply 24/7",
596
+ "applyBusinessHours": "Apply Business Hours",
597
+ "presetNotImplemented": "Preset schedules are not yet implemented. Please select 'Custom Weekly Schedule'.",
598
+ "advancedNotImplemented": "Advanced scheduling is not yet implemented. Please select 'Custom Weekly Schedule'.",
599
+ "enableAtLeastOneDay": "Please enable at least one day in the schedule.",
600
+ "atLeastOneHourRequired": "At least one hour must be selected for enabled days",
601
+ "presetTemplateHelp": "Preset template selection will be available in advanced configuration.",
602
+ "advancedSchedulingHelp": "Advanced scheduling with seasonal rules and event-based triggers will be available in advanced configuration.",
603
+ "nextCreatives": "Next: Creatives",
604
+ "monday": "Monday",
605
+ "tuesday": "Tuesday",
606
+ "wednesday": "Wednesday",
607
+ "thursday": "Thursday",
608
+ "friday": "Friday",
609
+ "saturday": "Saturday",
610
+ "sunday": "Sunday"
611
+ },
612
+ "pacing": {
613
+ "title": "Step 7 — Pacing & Delivery",
614
+ "subtitle": "Control how your campaign budget and impressions are distributed across time. Define pacing rules to align delivery with screen availability and dayparts.",
615
+ "pacingStrategy": "Pacing Strategy",
616
+ "even": "Even (Default)",
617
+ "evenDesc": "Distribute impressions evenly throughout the campaign",
618
+ "asap": "ASAP",
619
+ "asapDesc": "Deliver as fast as possible (maximize reach quickly)",
620
+ "frontLoaded": "Front-loaded",
621
+ "frontLoadedDesc": "Concentrate delivery early in campaign",
622
+ "backLoaded": "Back-loaded",
623
+ "backLoadedDesc": "Build momentum toward campaign end",
624
+ "timeOfDayAware": "Time-of-Day Aware",
625
+ "timeOfDayAwareDesc": "Adjust pacing based on daypart performance",
626
+ "custom": "Custom",
627
+ "customDesc": "Define your own delivery curve",
628
+ "pacingControls": "Pacing Controls",
629
+ "dailyBudgetCap": "Daily Budget Cap",
630
+ "hourlyImpressionLimit": "Hourly Impression Limit",
631
+ "respectDayparts": "Respect Dayparts",
632
+ "maxDeviation": "Max Deviation %",
633
+ "projectedDelivery": "Projected Delivery",
634
+ "autoAdjustments": "Auto Adjustments",
635
+ "enable": "Enable",
636
+ "autoAdjustmentPlaceholder": "e.g., If delivery < 50% → increase 20%",
637
+ "autoAdjustmentHelp": "Define automatic pacing adjustments based on delivery performance",
638
+ "nextReview": "Next → Review"
639
+ },
640
+ "targeting": {
641
+ "title": "Targeting Options",
642
+ "targetingRecommendations": "Targeting Recommendations",
643
+ "basedOnCampaign": "Based on your campaign details, we recommend the following targeting options",
644
+ "apply": "Apply",
645
+ "demographicsVenue": "Demographics & Venue",
646
+ "geofencing": "Geofencing",
647
+ "signals": "Signals",
648
+ "ageGroups": "Age Groups",
649
+ "genders": "Genders",
650
+ "incomeBrackets": "Income Brackets",
651
+ "interests": "Interests",
652
+ "audienceBehaviors": "Audience Behaviors",
653
+ "venueTypes": "Venue Types",
654
+ "showMore": "Show more",
655
+ "showLess": "Show less",
656
+ "geofencingLocations": "Geofencing Locations",
657
+ "drawOnMap": "Draw on Map",
658
+ "uploadCsv": "Upload CSV",
659
+ "defaultRadius": "Default Radius",
660
+ "km": "km",
661
+ "locations": "Locations",
662
+ "locationsAdded": "locations added",
663
+ "noLocations": "No locations added",
664
+ "drawOrUpload": "Draw on the map or upload locations to define your geofence areas",
665
+ "signalsTitle": "Signal-Based Targeting",
666
+ "addSignal": "Add Signal",
667
+ "searchSignals": "Search signals...",
668
+ "weatherTriggers": "Weather Triggers",
669
+ "searchBehavior": "Search Behavior",
670
+ "footfallPatterns": "Footfall Patterns",
671
+ "timeBased": "Time-Based",
672
+ "targetingPreview": "Targeting Preview",
673
+ "estimatedReach": "Estimated Reach",
674
+ "impressionPotential": "Impression Potential",
675
+ "nextPacing": "Next: Pacing"
676
+ },
677
+ "creatives": {
678
+ "title": "Creative Assets (Optional)",
679
+ "subtitle": "Upload your creative in content hub and assign right creative format as per creative requirements",
680
+ "assignCreative": "Assign Creative",
681
+ "noCreativesAssigned": "No creatives assigned",
682
+ "noCreativesHint": "Upload your creative in content hub and assign right creative format per creative requirements",
683
+ "uploadNew": "Upload new",
684
+ "chooseExisting": "Choose existing",
685
+ "manualEntry": "Manual entry",
686
+ "assignCreativeTitle": "Assign Creative",
687
+ "selectMethodHint": "Select a method to assign creatives",
688
+ "chooseExistingTitle": "Choose Existing",
689
+ "chooseExistingSubtitle": "Find and choose creatives from your media library",
690
+ "manualEntryTitle": "Manual Entry",
691
+ "manualEntrySubtitle": "Choose a URL-based ad, dynamic URL or static content is supported",
692
+ "name": "Name",
693
+ "namePlaceholder": "Advertisement name",
694
+ "assetUrl": "Asset URL",
695
+ "assetUrlPlaceholder": "URL where ad is hosted",
696
+ "thumbnailUrl": "Thumbnail URL (Optional)",
697
+ "thumbnailUrlPlaceholder": "https://cdn.example.com/thumb.jpg",
698
+ "length": "Length",
699
+ "seconds": "seconds",
700
+ "orientation": "Orientation",
701
+ "cancel": "Cancel",
702
+ "saveAndAddCreative": "Save and Add Creative",
703
+ "nameRequired": "Name required",
704
+ "pleaseEnterName": "Please enter a creative name.",
705
+ "assetUrlRequired": "Asset URL required",
706
+ "pleaseEnterAssetUrl": "Please enter an asset URL.",
707
+ "invalidUrl": "Invalid URL",
708
+ "pleaseEnterValidUrl": "Please enter a valid asset URL.",
709
+ "creativeAdded": "Creative added",
710
+ "creativeAddedDesc": "Creative has been added to the campaign.",
711
+ "creativesAssigned": "Creatives assigned",
712
+ "creativesAssignedDesc": "{{count}} creative(s) have been assigned to the campaign.",
713
+ "noValidCreatives": "No valid creatives",
714
+ "noValidCreativesDesc": "Selected creatives are missing required fields (asset URL). Please upload the files first.",
715
+ "someCreativesSkipped": "Some creatives skipped",
716
+ "someCreativesSkippedDesc": "{{count}} creative(s) were skipped because they're missing the asset URL. Please upload the files first.",
717
+ "uploadedAndAssigned": "Creative uploaded and assigned",
718
+ "uploadedAndAssignedDesc": "The creative has been successfully added to the campaign.",
719
+ "removeConfirm": "Are you sure you want to remove this creative?"
720
+ },
721
+ "validate": {
722
+ "title": "Review & Validation",
723
+ "subtitle": "Review validation results and activate your deal.",
724
+ "dealDates": "Deal Dates",
725
+ "budget": "Budget",
726
+ "goal": "Goal",
727
+ "impressions": "Impressions",
728
+ "validation": "Validation",
729
+ "pass": "Pass",
730
+ "warning": "Warning",
731
+ "error": "Error",
732
+ "validationChecks": "Validation Checks",
733
+ "flightDates": "Flight Dates",
734
+ "datesValid": "Deal dates are valid",
735
+ "startDatePast": "Start date is in the past",
736
+ "budgetAllocation": "Budget Allocation",
737
+ "budgetValid": "Line item budgets do not exceed deal total",
738
+ "budgetExceeds": "Line item budgets exceed deal total",
739
+ "lineItems": "Line Items",
740
+ "lineItemsConfigured": "{{count}} line item(s) configured",
741
+ "inventoryAvailability": "Inventory Availability",
742
+ "inventoryMissing": "Some line items are missing inventory",
743
+ "inventoryAssigned": "All line items have inventory assigned",
744
+ "creativeAssignment": "Creative Assignment",
745
+ "creativesAssigned": "{{count}} creative(s) assigned to {{lineItems}} line item(s)",
746
+ "noCreativesAssigned": "No creatives assigned to line items",
747
+ "creativeSpecs": "Creative Specifications",
748
+ "allCreativesMeetSpecs": "All creatives meet specifications",
749
+ "creativesPendingApproval": "{{count}} creative(s) pending approval",
750
+ "saveAsDraft": "Save as Draft",
751
+ "activateDeal": "Activate Deal",
752
+ "activating": "Activating...",
753
+ "dayCap": "/day cap"
754
+ },
755
+ "summary": {
756
+ "title": "Deal Summary",
757
+ "subtitle": "Review your deal configuration before proceeding to validation.",
758
+ "advertiser": "Advertiser",
759
+ "dealDates": "Deal Dates",
760
+ "goal": "Goal",
761
+ "budget": "Budget",
762
+ "dayCap": "/day cap",
763
+ "notSet": "Not set",
764
+ "lineItems": "Line Items",
765
+ "creatives": "Creatives",
766
+ "approved": "Approved",
767
+ "screensTargeted": "Screens targeted",
768
+ "budgetAllocation": "Budget Allocation",
769
+ "lineItemDetails": "Line Item Details",
770
+ "sno": "S.No",
771
+ "name": "Name",
772
+ "inventories": "Inventories",
773
+ "status": "Status",
774
+ "impression": "Impression",
775
+ "planned": "Planned",
776
+ "noLineItemsConfigured": "No line items configured",
777
+ "more": "more",
778
+ "lid": "LID"
779
+ },
780
+ "validation": {
781
+ "dealNameMinLength": "Deal name must be at least 3 characters",
782
+ "dealNameMaxLength": "Deal name must not exceed 100 characters",
783
+ "startDateRequired": "Start date is required",
784
+ "endDateRequired": "End date is required",
785
+ "selectValidClientType": "Please select a valid client type",
786
+ "budgetPositive": "Budget must be a positive number",
787
+ "startDateFuture": "Start date must be today or in the future",
788
+ "endDateAfterStart": "End date must be after start date",
789
+ "buyerNameRequired": "Buyer name is required for buyer client type",
790
+ "agencyNameRequired": "Agency name is required for agency client type"
791
+ }
792
+ },
793
+ "importFromPlanner": {
794
+ "title": "Select a Deal",
795
+ "loading": "Loading deals...",
796
+ "noDeals": "No deals available to import",
797
+ "sno": "S.No",
798
+ "dealName": "Deal Name",
799
+ "brand": "Brand",
800
+ "plannedBy": "Planned by",
801
+ "flightDates": "Flight Dates",
802
+ "status": "Status",
803
+ "inventories": "Inventories",
804
+ "budget": "Budget",
805
+ "totalCost": "Total Cost",
806
+ "approved": "Approved",
807
+ "pending": "Pending",
808
+ "rejected": "Rejected",
809
+ "cid": "CID",
810
+ "daysRemaining": "{{remaining}}/{{total}} days remaining",
811
+ "units": "Units",
812
+ "pageItems": "Page Items",
813
+ "pageInfo": "Page {{current}} of {{total}}",
814
+ "itemsRange": "{{from}} to {{to}} of {{total}}",
815
+ "cancel": "Cancel",
816
+ "proceed": "Proceed"
817
+ },
818
+ "filters": {
819
+ "title": "Deal Filters",
820
+ "status": "Status",
821
+ "mode": "Mode",
822
+ "dealType": "Deal Type",
823
+ "currency": "Currency",
824
+ "brand": "Brand",
825
+ "advertiser": "Advertiser",
826
+ "seller": "Seller",
827
+ "publisher": "Publisher",
828
+ "startDate": "Start Date",
829
+ "endDate": "End Date",
830
+ "sortBy": "Sort By",
831
+ "brandPlaceholder": "Filter by brand name",
832
+ "advertiserPlaceholder": "Filter by advertiser",
833
+ "sellerPlaceholder": "Filter by seller/publisher",
834
+ "publisherPlaceholder": "Filter by publisher",
835
+ "reset": "Reset",
836
+ "applyFilters": "Apply Filters",
837
+ "allStatus": "All Status",
838
+ "draft": "Draft",
839
+ "requested": "Requested",
840
+ "generated": "Generated",
841
+ "pendingCreatives": "Pending Creatives",
842
+ "live": "Live",
843
+ "completed": "Completed",
844
+ "inactive": "Inactive",
845
+ "reopened": "Reopened",
846
+ "archived": "Archived",
847
+ "expired": "Expired",
848
+ "canceled": "Canceled",
849
+ "approved": "Approved",
850
+ "rejected": "Rejected",
851
+ "pending": "Pending",
852
+ "allModes": "All Modes",
853
+ "programmatic": "Programmatic",
854
+ "traditionalDirect": "Traditional (Direct)",
855
+ "allDealTypes": "All Deal Types",
856
+ "guaranteed": "Programmatic Guaranteed",
857
+ "preferredDeal": "Preferred Deal",
858
+ "privateAuction": "Private Auction",
859
+ "evergreenPmp": "Evergreen PMP",
860
+ "direct": "Direct",
861
+ "allCurrencies": "All Currencies",
862
+ "newestFirst": "Newest First",
863
+ "oldestFirst": "Oldest First",
864
+ "nameAZ": "Name (A-Z)",
865
+ "nameZA": "Name (Z-A)",
866
+ "brandAZ": "Brand (A-Z)",
867
+ "brandZA": "Brand (Z-A)",
868
+ "startDateEarly": "Start Date (Early)",
869
+ "startDateLate": "Start Date (Late)"
870
+ },
871
+ "venueSelector": {
872
+ "placeholder": "Select Venue Type",
873
+ "searchPlaceholder": "Search here..",
874
+ "noVenueTypes": "No venue types available",
875
+ "transit": "Transportation & Mobility venues",
876
+ "retail": "Shopping & Commercial venues",
877
+ "outdoor": "Street level & Outdoor advertising",
878
+ "accommodation": "Hotels & Hospitality venues",
879
+ "education": "Schools, Universities & Learning centers",
880
+ "entertainment": "Cinemas, Theaters & Recreation venues",
881
+ "health": "Hospitals, Clinics & Medical facilities",
882
+ "office": "Business & Corporate buildings",
883
+ "residential": "Apartments & Housing complexes",
884
+ "government": "Government & Public buildings"
885
+ }
886
+ }