feat(marketplace): cross-instance browse page + entry points - #8478
Conversation
LWS49
commented
Jul 8, 2026
- add cross-instance listings index (published only, live counts)
- add browse page with title search, adoptions/newest sort, row select
- add sidebar admin entry + /courses/:id/marketplace route
- add "Import Assessments" button on assessments index (from_tab)
- add FE api/operations/types, controller + component specs
cbdd315 to
dd68b1c
Compare
9b44774 to
052b93c
Compare
dd68b1c to
c15d911
Compare
052b93c to
9169fa1
Compare
c15d911 to
eb92f7b
Compare
9169fa1 to
e532cc2
Compare
eb92f7b to
73a9fc5
Compare
e532cc2 to
97c5401
Compare
97c5401 to
2e480cd
Compare
| class Course::AssessmentMarketplaceComponent < SimpleDelegator | ||
| include Course::ControllerComponentHost::Component | ||
|
|
||
| def self.display_name |
There was a problem hiding this comment.
Is this display_name referenced anywhere?
(Just realizing this now, but gradebook component has a similar field that should also probably be removed.)
There was a problem hiding this comment.
Yep, both should be removed. Not removing the gradebook one in this commit so that this branch stays marketplace-only; lmk if you prefer for me to do so instead.
Thought I needed to add it because app/controllers/components/course/controller_component_host.rb has a def display_name; this is meant to override that, but that's old code that is meant to feed the Slim view, which is now fully retired in favour of jbuilder. Component titles now come from course.componentTitles.
There was a problem hiding this comment.
Pull request overview
Adds a new “Assessment Marketplace” feature area under a course, including a cross-instance listings index endpoint, a React browse page (sorting + title search + row selection), new navigation entry points (sidebar + route), and an “Import Assessments” button that deep-links into the marketplace.
Changes:
- Introduces backend marketplace index controller + JSON payload, with controller/component specs.
- Adds frontend marketplace route, page/table, API client + operations/types, and component/page tests.
- Wires new entry points: admin sidebar item,
/courses/:id/marketplaceroute, and an “Import Assessments” button on the assessments index.
Reviewed changes
Copilot reviewed 24 out of 24 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| spec/controllers/course/assessment/marketplace/listings_controller_spec.rb | Controller spec coverage for marketplace listings JSON (published-only + cross-instance visibility). |
| spec/controllers/course/assessment_marketplace_component_spec.rb | Spec coverage for sidebar visibility gating by ability. |
| config/routes.rb | Adds /courses/:id/marketplace and marketplace listings routes. |
| client/locales/zh.json | Adds marketplace/import translations (zh). |
| client/locales/ko.json | Adds marketplace/import translations (ko). |
| client/locales/en.json | Adds marketplace/import translations (en). |
| client/app/routers/course/marketplace.tsx | New course sub-router for marketplace page. |
| client/app/routers/course/index.tsx | Registers marketplace router under course routes. |
| client/app/bundles/course/translations.ts | Adds course component title + sidebar item translation keys. |
| client/app/bundles/course/marketplace/types.ts | Defines MarketplaceListing FE type. |
| client/app/bundles/course/marketplace/translations.ts | Adds marketplace page/table translation messages. |
| client/app/bundles/course/marketplace/pages/MarketplaceIndex/MarketplaceTable.tsx | Implements listings table (sort/search/select + bulk duplicate toolbar). |
| client/app/bundles/course/marketplace/pages/MarketplaceIndex/index.tsx | Marketplace index page that preloads listings and renders the table. |
| client/app/bundles/course/marketplace/pages/MarketplaceIndex/test/index.test.tsx | Tests default sorting, re-sorting, and title filtering behavior. |
| client/app/bundles/course/marketplace/operations.ts | Adds fetchListings operation using the marketplace API. |
| client/app/bundles/course/assessment/translations.ts | Adds “Import Assessments” translation entry for assessments index. |
| client/app/bundles/course/assessment/pages/AssessmentsIndex/index.tsx | Adds Import button alongside New Assessment button. |
| client/app/bundles/course/assessment/pages/AssessmentsIndex/ImportAssessmentsButton.tsx | New button linking to marketplace with from_tab query param. |
| client/app/bundles/course/assessment/pages/AssessmentsIndex/test/ImportAssessmentsButton.test.tsx | Tests the marketplace deep-link and hidden state when disallowed. |
| client/app/api/course/Marketplace.ts | Adds marketplace index() API call + typing for response payload. |
| app/views/course/assessment/marketplace/listings/index.json.jbuilder | Adds listings index JSON response shape for the marketplace page. |
| app/controllers/course/assessment/marketplace/listings_controller.rb | New marketplace listings controller (index + aggregation queries). |
| app/controllers/course/assessment/marketplace/controller.rb | New base controller binding marketplace component. |
| app/controllers/components/course/assessment_marketplace_component.rb | Adds marketplace component + admin sidebar item gate by ability. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
2e480cd to
9eccba7
Compare
- add cross-instance listings index (published only, live counts) - add browse page with title search, adoptions/newest sort, row select - add sidebar admin entry + /courses/:id/marketplace route - add "Import Assessments" button on assessments index (from_tab) - add FE api/operations/types, controller + component specs
9eccba7 to
c1588e3
Compare
936edc8
into
lws49/feat-marketplace-pr1-foundation