Repository navigation
[FE] Import Competency Framework button on the Competency Management page #706
Description
Activity
- moved this to Needs additional details in Competency Criteria and Student Progress
on Jul 28, 2026 - changed the title
[-][Placeholder for FE] Import Competency Framework button on the Competency Management page[/-][+][FE] Import Competency Framework button on the Competency Management page[/+]on Jul 31, 2026 - moved this from Needs additional details to Ready for Community Review in Competency Criteria and Student Progress
on Jul 31, 2026 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!
- moved this from Ready for Community Review to Final Axim Review in Competency Criteria and Student Progress
on Aug 21, 2026 @jmakowski1123 This is ready for your final review, thank you!
4 remaining items
- moved this to Todo in CBE and Skills Forward Roadmap - High Level
on Aug 26, 2026 Great thanks. This is approved.
- moved this from Final Axim Review to Next Sprint in Competency Criteria and Student Progress
on Sep 1, 2026 - moved this from Next Sprint to In Progress in Competency Criteria and Student Progress
on Sep 3, 2026 - moved this from In Progress to Unicon Code Review in Competency Criteria and Student Progress
on Sep 4, 2026 - moved this from Unicon Code Review to Community Code Review in Competency Criteria and Student Progress
on Sep 15, 2026 Environment: Master Sandbox, https://apps.master.openedx.io/authoring (frontend-app-authoring PR openedx/frontend-app-authoring#3263 deployed)
Test users:dmitryvarenikqa: global Staff, can create taxonomiestest670: no Staff or Org Staff role, cannot create taxonomies
Test type: UI testing in Studio (With the browser DevTools Network view used to count requests and to simulate a slow or failing import request)
Result: All scenarios passed. No bugs found.
Test data
- Source competency taxonomy "QA706 Source Competency Taxonomy" (id 58), imported from the Taxonomies page with Taxonomy Type set to Competency. Most scenarios were run from its Competency Management page,
/taxonomy/58/competencies. - A valid framework file in CSV and JSON formats, with 6 competencies on 3 levels (
FW-ROOT, groupsFW-G1andFW-G2, leavesFW-G1-A,FW-G1-B,FW-G2-A). - Invalid files: a CSV with random text, an empty CSV, a truncated JSON, and a CSV with wrong headers.
- Unsupported files: a
.txtfile and a.pngfile.
Button visibility
User Expected Actual Result dmitryvarenikqa(can create taxonomies)The "Import Competency Framework" button is shown in the top right of the page header. The button is shown in the page header, in the same primary style as the Import button on the Taxonomies page. Pass test670(cannot create taxonomies)The button is not shown. The Competency Management page opens with the taxonomy tree, and the button is not present on the page or in the DOM. Pass Opening the wizard
- The wizard opens directly on the "Upload file" step. There is no Export, Plan, or Confirm step, and no Back button.
- After a valid file is uploaded and Continue is clicked, the "Populate Taxonomy Information" step shows Taxonomy Type preselected as "Competency".
- The Taxonomy Type dropdown stays editable and offers "Competency" and "Tags".
Result: Pass
Successful import
File Taxonomy name Actual Result Valid framework, CSV QA706 Imported Framework One POST /api/content_tagging/v1/taxonomies/import/request returned 201. A success toast was shown, and the user was taken to/taxonomy/59/competencies. The tree shows all 6 competencies with their Competency IDs.Pass Valid framework, JSON QA706 Imported Framework JSON Same behavior. The user was taken to /taxonomy/60/competencieswith the same tree.Pass Both new taxonomies appear on the Taxonomies page with the "Competency taxonomy" badge.
Cancel
The wizard was closed with Cancel on the "Upload file" step and on the "Populate Taxonomy Information" step, and with the close (X) button on the "Upload file" step. In every case the wizard closed, the user stayed on the original Competency Management page, no import request was sent, and no taxonomy was created.
Result: Pass
Import button requires a name and a description
Fields filled Import button Result None Disabled Pass Name only Disabled Pass Description only Disabled Pass Name and description Enabled Pass Unsupported file type
The wizard does not accept the
.txtand.pngfiles. It shows "The file type must be one of CSV, JSON files." under the drop zone, Continue stays disabled, and no request is sent.Result: Pass
No double submission
The import request was delayed by about 5 seconds. After Import was clicked, the button switched to a pending, disabled state. Repeated clicks on Import and pressing Enter in the name field did not send another request: exactly one import request was sent. When the response arrived, the user was taken to the new taxonomy's Competency Management page.
Result: Pass
Import errors
Case Actual Result CSV with random text The file is accepted on upload, and the error appears only after Import is clicked. The server returns 400. Pass Empty CSV Same behavior. The server returns 400 ("The submitted file is empty."). Pass Truncated JSON Same behavior. The server returns 400 (invalid JSON format). Pass CSV with wrong headers Same behavior. The server returns 400 (missing idandvalueheaders).Pass Valid file, request blocked in the browser Same behavior, with a connectivity error. Pass Valid file, server response replaced with 400 Same behavior. Pass In every case the wizard closed, and a dismissible "Import error" alert appeared at the top of the page. The user stayed on the original page, and the URL did not change. No taxonomy was created, and no partially filled taxonomy was left in the taxonomy list.
Retrying after an error
After an error, clicking "Import Competency Framework" again opens the wizard on the "Upload file" step with no file selected. On the next step the name and description are empty, and Taxonomy Type is "Competency" again, even when it was changed to "Tags" before the error. The type can still be changed.
Result: Pass
Additionally tested
- Regression, Import on the Taxonomies page: Taxonomy Type still defaults to "Tags", and it can be changed. After a successful import the user stays on the Taxonomies page, as before. Re-import of an existing taxonomy still starts with the Export step.
- Import again from a newly imported taxonomy: On the Competency Management page of "QA706 Imported Framework", the wizard opens clean with Taxonomy Type "Competency". A second import took the user to the new taxonomy's Competency Management page.
Observation: import with Taxonomy Type changed to "Tags"
If the user changes Taxonomy Type to "Tags" in this wizard, a regular tags taxonomy is created, and the user is taken to that taxonomy's detail page (
/taxonomy/<id>, the page that opens from its card on the Taxonomies page) instead of a Competency Management page. The ticket does not describe this case. The behavior does not contradict the requirements, and it makes sense: a Competency Management page is only meaningful for a competency taxonomy.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsReady for UAT



Use Case
As a curriculum author managing a competency taxonomy on the Competency Management page, I want to import a competency framework from that page with the taxonomy type already set to Competency, so that I don't have to leave for the general Taxonomies list "Import" action.
Acceptance Criteria
Frontend/QA-testable.
Failure cases.
Top right of the header
Description
Current state
Taxonomy import today has two entry points, both opening the same
ImportTagsWizard, branched by areimportboolean the caller supplies (the wizard has no in-modal choice between the two):TaxonomyListPage.tsx): the "Import" button opensImportTagsWizardwith notaxonomyand noreimportprop, runs theupload→populatesteps, and on submit callsuseImportNewTaxonomy()→POST /api/content_tagging/v1/taxonomies/import/. It always creates a brand-new taxonomy. Thepopulatestep collects onlytaxonomyNameandtaxonomyDesc.TaxonomyMenu.jsx): the "Import" item opensImportTagsWizardwithtaxonomyandreimport, runsexport→upload→plan→confirmviauseImportPlan/useImportTags→PUT /api/content_tagging/v1/taxonomies/{id}/tags/import/, and replaces tags in the existing taxonomy (with a warning that non-matching tags are removed).Current failure behavior of the create-new import (the baseline this ticket must match, all in
src/taxonomy/import-tags/ImportTagsWizard.jsx):.csvor.jsonnever reaches the wizard'shandleFileLoad; theDropzone(line 123-126) rejects it and the continue action stays disabled (line 490). The wizard renders no explanatory message for a rejected file.disableDialog()puts a transparent overlay over the whole dialog (line 434-437) and theLoadingButtongoes to its pending state, so the import cannot be double-submitted.importNewTaxonomy'sfinallyblock callsonClose()unconditionally (line 333-336), so the wizard closes and unmounts on error exactly as it does on success.TaxonomyListPage.tsx:39-44mounts it only while the modal flag is set, sofile,taxonomyName,taxonomyDesc, andcurrentStepare all destroyed. The error surfaces as a dismissible page-level ParagonAlerttitled "Import error", rendered byTaxonomyLayout.tsx:27-32above the page, not inside the dialog. There is no fix-and-retry in place: the user reopens the wizard and re-enters everything."Request failed with status code 400"), not the backend's message, becauseuseImportNewTaxonomy(src/taxonomy/data/apiHooks.ts:113-137) does not wrap its errors ingetApiErrorMessagethe way the reimport path'suseImportTags/useImportPlando (apiHooks.ts:149-154,:181-186).AlertErrordumpserror.response.dataas a<pre>JSON block below the title when the response has a body. The existing test atImportTagsWizard.test.jsx:357-365pins this generic-message behavior in place.There is no taxonomy "type" concept in the code today:
TaxonomyData(src/taxonomy/data/types.ts:2-18) has no type field, the populate step renders only name and description controls (ImportTagsWizard.jsx:183-228), anduseImportNewTaxonomy's payload (taxonomy_name,taxonomy_description,file) carries no type. #615 adds that control, and #614 makes the backend accept its value.Requested change
Add an "Import Competency Framework" action to the Competency Management page's header toolbar (following whatever action-toolbar pattern #680 establishes; mirror the
SubHeader+ActionRowconventionTaxonomyDetailPage.jsxuses if #680 hasn't defined its own). Clicking it opens the create-newImportTagsWizardflow — notaxonomy, noreimportprop, the same code path the Taxonomies list "Import" button uses — with the taxonomy-type control (added by #615) pre-selected to "Competency" and locked for this entry point. On success it creates a brand-new Competency-type taxonomy viauseImportNewTaxonomyand navigates the user to that new taxonomy's Competency Management page.Failure handling is parity, not improvement: because this entry point reuses
ImportTagsWizardanduseImportNewTaxonomyunchanged, every failure case behaves exactly as it does from the Taxonomies list, including the rough edges documented above (wizard closes on error, page-level alert, generic error text, no in-place retry). The one difference is where the user lands: the Competency Management page they started on, not the Taxonomies list. Do not "fix" the shared failure behavior here.Explicitly out of scope
TaxonomyData, rendering the type control, and making the backend accept and persist it. This ticket only presets and locks that control once it exists.ImportTagsWizard's existingreimport=true(replace-tags) path, its file parsing, or the import backend/pipeline.Technical Notes
Files to Modify
src/taxonomy/competency-management/CompetencyManagementPage.tsx(placeholder name — confirm against #680)ImportTagsWizardwith notaxonomy/reimportprop plus the locked-type prop below.src/taxonomy/competency-management/messages.ts(placeholder — confirm against #680)defineMessagesentry for the button/menu-item label.src/taxonomy/import-tags/ImportTagsWizard.jsxinitialTaxonomyType+lockTaxonomyType, or equivalent per #615's actual field name) so the populate step's type control, once #615 adds it, can be pre-filled to"competency"and disabled when set by this caller. Existing callers that omit the prop are unaffected. Do not touchimportNewTaxonomy'stry/catch/finally(line 312-337): its failure behavior is the parity baseline.src/taxonomy/import-tags/messages.tssrc/taxonomy/data/apiHooks.tstypethroughuseImportNewTaxonomy'sFormData/payload, add it there. Leave the hook's error handling alone: wrapping it ingetApiErrorMessagewould change the Taxonomies list flow too and break the test atImportTagsWizard.test.jsx:357-365.Example Resolution Prompt
Issue #706. Subtask of #680 (the Competency Management page at
/taxonomy/:taxonomyId/competencies). Frontend,frontend-app-authoring(src/taxonomy/).Blocked by: #614 (BE) and #615 (FE), the pair that introduces a taxonomy type on the create/import path. #614 is what actually makes "import as Competency" stick: presetting the type in the frontend does nothing unless the backend accepts and persists it on
POST /api/content_tagging/v1/taxonomies/import/. #615 adds the Taxonomy Type control to the import wizard's populate step, which is the control this ticket presets and locks. Both are load-bearing. Also #680 (the page this button sits on). Related: #663 (the entry point that reaches #680's page).