Skip to content

[FE] Add "Apply Competencies" entry point to the taxonomy card menu and footer, with a placeholder Competency Management page #663

Description

@thelmick-unicon

Blocked by: #616, "[FE] Add taxonomy type badge to Taxonomies page" (open, unmerged). #616 owns the TaxonomyData field this ticket's conditional-visibility logic keys off — that field does not exist in frontend-app-authoring today. #616 is itself blocked on backend issues #618 and #630 (unmerged). This ticket is ready for development but cannot be implemented, demoed, or tested until #616 lands.

Repo: frontend-app-authoring (Studio MFE). No backend or openedx-core change.

Use Case

As a Studio Admin or Staff user managing a Competency-type taxonomy, I want an "Apply Competencies" action available directly from the Taxonomies page — as an item in the taxonomy card's actions menu, and as a standalone card-footer button — so that I can navigate straight to that taxonomy's Competency Management page in one click, without confusing this action with the taxonomy tag-editing flow that the unchanged card click already opens.

Description

Current state

  1. Log in to Studio as an Admin or Staff user and navigate to the Taxonomies page.
  2. Each imported taxonomy card shows a three-dot (⋮) actions button.
  3. Clicking the three-dot button opens a dropdown with four items, in this order: Re-import, Export, Delete, Manage Organizations.
  4. Clicking the card body anywhere outside the three-dot button navigates to the Taxonomy Editing page (tag browsing/editing) — identical behavior for every taxonomy type.
  5. Taxonomies carry a type (Tag or Competency). The field and its visual badge are being delivered by a separate ticket, [FE] Add taxonomy type badge to Taxonomies page #616, which is currently open and itself blocked on unmerged backend issues [BE] Update Get endpoint to return Taxonomy Type. #618 and [BE][edx-platform] Verify Taxonomy Type passes through TaxonomyOrgSerializer #630.
  6. There is no entry point from a taxonomy card into competency management. Neither the menu nor the card click leads to competency criteria authoring today. No Competency Management page exists anywhere in the MFE.

Requested change

  • Card click behavior is unchanged for all taxonomy types: it continues to route to the Taxonomy Editing page. No "Edit Taxonomy" menu item is added — this was considered during design ([UXD] Create UX designs for taxonomy actions menu with Apply Competencies and Edit Taxonomy options #622) and explicitly rejected in favor of leaving the card click alone.
  • Exactly one new item, "Apply Competencies," is appended to the three-dot menu (final order: Re-import, Export, Delete, Manage Organizations, Apply Competencies), rendered only when the taxonomy's type is Competency. Tag-type taxonomies keep exactly the original four items. The label was deliberately chosen over "Manage Competencies" during [UXD] Create UX designs for taxonomy actions menu with Apply Competencies and Edit Taxonomy options #622's design discussion, to distinguish this action from the tag-editing the existing Taxonomy Editor already does.
  • For Competency-type taxonomies only, the card footer additionally gains a standalone "Apply Competencies" button. Both surfaces navigate to the same destination for the same taxonomy — no additional taxonomy-selection step.
  • A new route, /taxonomy/:taxonomyId/competencies, and a content-empty placeholder page (breadcrumb + title only) are added as the shared destination, so both entry points land somewhere real and testable.
  • Gating uses the existing canTagObject permission — no new permission tier.

Explicitly out of scope

Acceptance Criteria

Scenario: Competency-type taxonomy card shows the new menu item
  Given I am logged in to Studio as an Admin or Staff user
  And a taxonomy of type Competency exists on the Taxonomies page
  When I open the taxonomy card's three-dot actions menu
  Then I see five items in order: Re-import, Export, Delete, Manage Organizations, Apply Competencies

Scenario: Tag-type taxonomy card menu is unaffected
  Given a taxonomy of type Tag exists on the Taxonomies page
  When I open that taxonomy card's three-dot actions menu
  Then I see exactly the original four items
  And "Apply Competencies" does not appear

Scenario: Card click still opens the Taxonomy Editing page, regardless of type
  Given a taxonomy card of either type exists on the Taxonomies page
  When I click the card body outside the three-dot button
  Then I am taken to the Taxonomy Editing page for that taxonomy, unchanged from before this ticket

Scenario: Competency-type card shows a footer "Apply Competencies" button
  Given a taxonomy of type Competency exists
  Then its card footer displays an "Apply Competencies" button
  And a Tag-type taxonomy's card footer displays no such button

Scenario: Menu item navigates to the Competency Management page
  Given a taxonomy of type Competency exists
  When I select "Apply Competencies" from its three-dot menu
  Then I am navigated to /taxonomy/:taxonomyId/competencies for that specific taxonomy, with no extra taxonomy-selection step
  And the page renders a breadcrumb and title; page content beyond that is out of scope for this ticket

Scenario: Footer button reaches the same destination as the menu item
  Given a taxonomy of type Competency exists
  When I click the card-footer "Apply Competencies" button
  Then I land on the same route and taxonomy scope that the menu item would produce

Scenario: User without the required permission
  Given I am logged in as a user without `canTagObject` permission on a Competency-type taxonomy
  When I view that taxonomy's card
  Then "Apply Competencies" does not appear in the menu or as a footer button

Scenario: Small-screen rendering
  Given I view the Taxonomies page on a small screen
  When a Competency-type card renders
  Then the footer button and five-item menu remain usable, consistent with the existing Paragon Card.Footer pattern used elsewhere in this repo (e.g. GalleryCard)

UX Designs

Figma link

Image

Open Questions

Context

  • Design source: openedx-core issue [UXD] Create UX designs for taxonomy actions menu with Apply Competencies and Edit Taxonomy options #622, "[UXD] Create UX designs for taxonomy actions menu with Apply Competencies and Edit Taxonomy options" — in Final Axim Review. Read it for the label rationale ("Apply Competencies" over "Manage Competencies") and the click-pattern decision (card click unchanged for all types).
  • Hard dependency: [FE] Add taxonomy type badge to Taxonomies page #616, "Frontend taxonomy type badge" — open, blocked on backend [BE] Update Get endpoint to return Taxonomy Type. #618 and [BE][edx-platform] Verify Taxonomy Type passes through TaxonomyOrgSerializer #630 (unmerged). Confirmed directly against frontend-app-authoring HEAD: TaxonomyData (src/taxonomy/data/types.ts:2-18) has no type field today.
  • Related, closed: [FE] Add Taxonomy Type dropdown to taxonomy import flow #615, "[FE] Add Taxonomy Type dropdown to taxonomy import flow" — likely origin of the settable taxonomy-type field [FE] Add taxonomy type badge to Taxonomies page #616 surfaces on the frontend.
  • **Frontend conventions:**new strings need defineMessages i18n entries following the course-authoring.taxonomy-menu.<action>.label convention already used in src/taxonomy/taxonomy-menu/messages.ts.
  • Code, confirmed against frontend-app-authoring HEAD:
    • src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx — the existing 4-item menu. Items are a {title, action, show} map (pickBy-filtered), rendered as Dropdown.Items. useNavigate is already imported (line 14) but unused; every existing action currently opens a modal via useToggle. "Apply Competencies" is the first item whose action navigates.
    • src/taxonomy/taxonomy-menu/messages.ts — i18n id convention: course-authoring.taxonomy-menu.<action>.label.
    • src/taxonomy/taxonomy-card/index.jsx — the card: Card.Header carries TaxonomyMenu as actions; Card.Body holds the description. No Card.Footer today.
    • src/taxonomy/taxonomy-detail/TaxonomyDetailPage.jsx — the pattern to mirror for the new placeholder page: useParams → useTaxonomyDetails(taxonomyId) → Loading/ConnectionErrorAlert guards → Breadcrumb + Container.
    • src/taxonomy/TaxonomyLayout.tsx — chrome host (Header, StudioFooterSlot, Toast, TaxonomyContext) via <Outlet/>; any sibling route added under it inherits this chrome for free.
    • src/files-and-videos/generic/table-components/GalleryCard.jsx:80-85 — existing in-repo precedent for Paragon Card.Footer, confirming it's already a supported, used pattern, just not yet in taxonomy-card.
    • src/index.jsx:104-116 — current taxonomy routes, gated by getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true'.

Technical Notes

Files to Create

File Purpose
src/taxonomy/competency-management/index.ts Public interface exporting CompetencyManagementPage, per this feature's module-boundary convention
src/taxonomy/competency-management/CompetencyManagementPage.tsx Placeholder page: breadcrumb (Taxonomies → taxonomy name → Manage & Apply Competencies), fetches the taxonomy via useTaxonomyDetails, empty-state body only — no TreeView/switcher
src/taxonomy/competency-management/messages.ts i18n strings for the placeholder page
src/taxonomy/competency-management/CompetencyManagementPage.test.tsx RTL tests mirroring TaxonomyDetailPage.test.jsx (loading/error/happy path)

Files to Modify

File Nature of modification
src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx Add a 5th menuItems entry, applyCompetencies, after manageOrgs; action calls the already-imported navigate(\/taxonomy/${taxonomy.id}/competencies`); showkeyed off the taxonomy-type field #616 adds (real field name pending — see Open Questions). Extend thetaxonomyPropTypes/JSDocPick<TaxonomyData, …>` to include it.
src/taxonomy/taxonomy-menu/messages.ts Add applyCompetenciesMenu (id: course-authoring.taxonomy-menu.apply-competencies.label, defaultMessage: 'Apply Competencies')
src/taxonomy/taxonomy-menu/TaxonomyMenu.test.tsx Add Competency-type and Tag-type fixtures; assert conditional render and that clicking navigates
src/taxonomy/taxonomy-card/index.jsx Destructure the new type field from original; add <Card.Footer> (after Card.Body) rendered only for Competency-type, containing a Button as={NavLink} to the same route as the menu item
src/taxonomy/taxonomy-card/messages.ts Add applyCompetenciesButton message
src/taxonomy/taxonomy-card/TaxonomyCard.test.jsx Add Competency/Tag fixtures; assert footer button visibility and link target
src/index.jsx Inside the existing ENABLE_TAGGING_TAXONOMY_PAGES block, add <Route path="/taxonomy/:taxonomyId/competencies" element={<CompetencyManagementPage />} /> as a sibling of the existing /taxonomy/:taxonomyId route
src/taxonomy/index.ts Re-export CompetencyManagementPage alongside TaxonomyDetailPage/TaxonomyListPage/TaxonomyLayout

Not modified here: src/taxonomy/data/types.ts — the type field is #616's contract to add; this ticket only consumes it.

Implementation Notes

New sibling route under the existing TaxonomyLayout, inheriting its chrome via the existing <Outlet/>, with a deliberately empty-content page. This was chosen over two alternatives: reusing/stubbing the existing TaxonomyDetailPage route (rejected — #622's whole point was to make editing-a-taxonomy and managing-competencies explicitly separate flows, so folding them back into one route would undo that), and a modal mirroring ManageOrgsModal (rejected — the accepted design is a full page with breadcrumbs and, eventually, a taxonomy switcher and tree; that's page-shaped UI, and the future ticket is already named "Competency Management page").

Add one shared predicate (e.g. isCompetencyTaxonomy(taxonomy)) rather than repeating the type comparison in both TaxonomyMenu and TaxonomyCard. #616 should add this predicate as part of shipping the type field, since it needs the same check internally for its badge; this ticket imports it rather than inventing a second one.

This is MFE-only: no backend or openedx-core change, no .importlinter concern, no cross-feature import — everything stays inside the taxonomy feature and is consumed through its own index.ts. No ADR is warranted; this is UI wiring, not a new contract or data model.

Hard dependency, stated plainly: none of this is implementable, demoable, or testable until #616 lands the type field on TaxonomyData and its backend prerequisites (#618, #630) ship first.

Example Resolution Prompt

Implement the "Apply Competencies" entry points on Studio's Taxonomies page in frontend-app-authoring. Prerequisite: the taxonomy-type field and shared predicate that issue #616 adds to TaxonomyData (src/taxonomy/data/types.ts) must exist first — confirm its real name and import #616's predicate rather than inventing a second one; this prompt uses isCompetencyTaxonomy(taxonomy) as a placeholder name.

  1. In src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx, add a 5th entry to the menuItems object after manageOrgs, keyed applyCompetencies: { title: intl.formatMessage(messages.applyCompetenciesMenu), action: () => navigate(\/taxonomy/${taxonomy.id}/competencies`), show: isCompetencyTaxonomy(taxonomy) }. navigateis already available viauseNavigate()in this file. Extend thetaxonomyPropTypes shape and thePick<TaxonomyData, …>` JSDoc.
  2. In src/taxonomy/taxonomy-menu/messages.ts, add applyCompetenciesMenu (id: course-authoring.taxonomy-menu.apply-competencies.label, defaultMessage: 'Apply Competencies').
  3. In src/taxonomy/taxonomy-card/index.jsx, destructure the type field from original, and add a <Card.Footer> (see src/files-and-videos/generic/table-components/GalleryCard.jsx for the existing in-repo Card.Footer pattern) right after <Card.Body>, rendered only when isCompetencyTaxonomy(original), containing <Button as={NavLink} to={\/taxonomy/${id}/competencies`} variant="primary">{intl.formatMessage(messages.applyCompetenciesButton)}`.
  4. In src/taxonomy/taxonomy-card/messages.ts, add applyCompetenciesButton.
  5. Create src/taxonomy/competency-management/ (index.ts, CompetencyManagementPage.tsx, messages.ts, test file). Mirror src/taxonomy/taxonomy-detail/TaxonomyDetailPage.jsx's data shape (useParams, useTaxonomyDetails(taxonomyId), Loading/ConnectionErrorAlert guards, Breadcrumb). Render only a breadcrumb, a title, and a placeholder body — no TreeView, no taxonomy switcher; those belong to the separate "Competency Management page — initial implementation" ticket.
  6. In src/index.jsx, inside the existing getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true' block, add <Route path="/taxonomy/:taxonomyId/competencies" element={<CompetencyManagementPage />} /> as a sibling of /taxonomy/:taxonomyId; re-export the page from src/taxonomy/index.ts.
  7. Extend TaxonomyMenu.test.tsx and TaxonomyCard.test.jsx with Competency-type and Tag-type fixtures asserting conditional rendering both ways; add CompetencyManagementPage.test.tsx mirroring TaxonomyDetailPage.test.jsx.

Do not touch src/taxonomy/data/types.ts, any backend code, or openedx-core — this ticket only consumes the type field and predicate #616 introduces.

Activity

  1. moved this from Todo to Ready for Community Review in Competency Criteria and Student Progresson Jul 17, 2026
  2. thelmick-unicon commented on Jul 21, 2026

    @thelmick-unicon
    Author

    This will become a subtask of the ticket that will be created to Create the Competency Managment page. Once the page is created, then the buttons/dropdown will be created to link to that page.

  3. thelmick-unicon commented on Jul 24, 2026

    @thelmick-unicon
    Author

    The discussion period for this ticket is now complete, and we appreciate all the feedback. We'll be moving forward with development based on the current ticket pending final Axim sign-off. That said, the conversation doesn't have to stop. If you still have feedback, please continue to add to this ticket. We'll review anything new and determine whether it fits within the current timeline or makes more sense as its own ticket for future work. Thanks again for helping make this better!

    @jmakowski1123 This is ready for your review. Thank you!

  4. moved this from Ready for Community Review to Final Axim Review in Competency Criteria and Student Progresson Jul 24, 2026
  5. jmakowski1123 commented on Aug 7, 2026

    @jmakowski1123

    Is this the story that came out of the design sprint in #622? If so, I left one last comment there.

  6. 7 remaining items

  7. moved this from Next Sprint to In Progress in Competency Criteria and Student Progresson Aug 28, 2026
  8. moved this from In Progress to Code Review in Competency Criteria and Student Progresson Sep 2, 2026
  9. moved this from Unicon Code Review to Community Code Review in Competency Criteria and Student Progresson Sep 3, 2026
  10. moved this from Community Code Review to Ready for QA in Competency Criteria and Student Progresson Sep 22, 2026
  11. dvarenikqaconsultant commented on Sep 23, 2026

    @dvarenikqaconsultant

    Environment: Master Sandbox (https://apps.master.openedx.io/authoring/taxonomies)
    Test users:

    • dmitryvarenikqa (superuser, Global Staff): TC-1 to TC-6 and TC-8
    • test663_663 (Global Staff, not a superuser): TC-7

    Test type: UI testing in Studio (authoring MFE). TC-7 also includes one read-only API check through the browser.
    Result: All cases passed. No bugs found.

    Test data

    Two taxonomies were imported through the Studio import wizard (Taxonomies → Import), with the same tag tree shape and different names so the cards are easy to tell apart:

    • "QA Apply Competencies - Competency Taxonomy", imported with Taxonomy Type = Competency
    • "QA Apply Competencies - Tags Taxonomy", imported with Taxonomy Type = Tags

    Both cards showed the expected type badge after import.

    Results

    ID       Scenario Expected result Actual result Status Attachment
    TC-1 Open the actions menu on a Competency taxonomy card The menu has exactly 5 items in this order: Re-import, Export, Delete, Manage Organizations, Apply Competencies The menu has these 5 items in this order Pass Image
    TC-2 Open the actions menu on a Tags taxonomy card The menu has the original 4 items and no "Apply Competencies" The menu has Re-import, Export, Delete, Manage Organizations, and no "Apply Competencies" Pass Image
    TC-3 Click the card body of each taxonomy type Both types open the tag editing page of that taxonomy, as before The Competency card opened /taxonomy/<id>/ with its tag list, and so did the Tags card Pass
    TC-4a Look at the footer of a Competency taxonomy card The footer has an "Apply Competencies" button The button is present Pass Image
    TC-4b Look at the footer of a Tags taxonomy card The footer has no "Apply Competencies" button The card has no footer button Pass
    TC-5 Choose "Apply Competencies" in the Competency card menu /taxonomy/<id>/competencies of that taxonomy opens directly, with breadcrumbs and a heading /taxonomy/<id>/competencies opened with no taxonomy selection step. The breadcrumbs read "Taxonomies > QA Apply Competencies - Competency Taxonomy", and the heading is the taxonomy name Pass Image
    TC-6 Click the "Apply Competencies" footer button on the same card The same URL and page as in TC-5 open, and the card click does not fire The same page opened. Going back returned straight to /taxonomies, so the card's own navigation to the tag page did not fire Pass
    TC-7 A user who can see a Competency taxonomy card but cannot tag with it "Apply Competencies" is absent from both the menu and the footer Both are absent. See the setup notes below Pass ImageImageImage
    TC-8 Narrow screen (375 px viewport) The footer button is visible and clickable, and the 5-item menu opens without clipping or overlap The menu opened with all 5 items inside the viewport. Both the menu item and the footer button led to /taxonomy/<id>/competencies Pass ImageImage

    TC-7 setup

    The state this case needs, where a card is visible but canTagObject is false, is not reachable through normal UI use. The Taxonomies page requests only enabled taxonomies (?enabled=true), and for any enabled taxonomy a user can see, can_tag_object is already true. The case was reproduced this way:

    1. The Competency test taxonomy was disabled in Django admin.
    2. The check was run as test663_663, a Global Staff user who is not a superuser. A superuser account is not suitable here, because Django grants every permission to an active superuser, so can_tag_object stays true for them even on a disabled taxonomy.
    3. GET /api/content_tagging/v1/taxonomies/<id>/ for that taxonomy returned "enabled": false, "can_tag_object": false, and "taxonomy_type": "competency".
    4. On the Taxonomies page, the browser's list request was rewritten to drop the enabled=true filter, so the disabled taxonomy was returned and rendered as a normal card. The server response itself was not modified.

    With that setup, the card showed the Competency badge, had no "Apply Competencies" footer button, and its actions menu contained only Re-import, Export, Delete, and Manage Organizations. On the same page and for the same user, the enabled Competency taxonomies still showed the footer button. This confirms that the entry points are hidden because of the missing permission and not because of the user's role.

    As an extra check, the actions menu on the taxonomy's own page (/taxonomy/<id>/, opened by direct URL) also had no "Apply Competencies" item, while an enabled Competency taxonomy's page showed it for the same user.

    TC-7, second run: exact AC state with a mocked response

    The run above used a disabled taxonomy. A second run covered the exact state the AC describes: an enabled Competency taxonomy with a visible card and canTagObject false. This state was produced with a mocked response:

    1. The check was run as dmitryvarenikqa. The Competency test taxonomy stayed enabled.
    2. The response to the Taxonomies page's list request (GET /api/content_tagging/v1/taxonomies/?enabled=true) was replaced through Chrome DevTools Local Overrides. The mocked response contained two taxonomies: a Tags taxonomy, and the Competency test taxonomy with "enabled": true, "taxonomy_type": "competency", and "can_tag_object" changed by hand from true to false.

    With that response, the Competency card had no "Apply Competencies" footer button, and its actions menu had no "Apply Competencies" item.

    This run checks frontend behavior only: the value false was set by hand and did not come from the server. The first run confirms that the server does return can_tag_object: false when the user has no permission.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions