[Remove Vuetify from Studio] Replace LanguageDropdown VAutocomplete with KDS KMultiSelect
I maintainer di solito rispondono entro 1 giorno
@adibmbrk ci sta già lavorando.
Dal 17/9/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
🙂 Looking for an issue? Welcome! This issue is open for contribution. If this is the first time you’re requesting an issue, please:
- Read Contributing guidelines carefully. Pay extra attention to Using generative AI. Pull requests and comments that don’t follow the guidelines won’t be answered.
- Confirm that you’ve read the guidelines in your comment.
Overview
LanguageDropdown uses the Vuetify component VAutocomplete. Replace it with KMultiSelect from the Kolibri Design System.
Complexity: Medium
Target branch: unstable
Context
File: contentcuration/contentcuration/frontend/shared/views/LanguageDropdown.vue
The component wraps VAutocomplete in DropdownWrapper. It shows a tooltip on each option. It validates with the Vuetify rules prop. It has style overrides that use ::v-deep.
Six files use this component:
| File | What it needs |
|---|---|
channelEdit/components/edit/DetailsTabView.vue |
Shows hint text below the field |
channelEdit/views/files/supplementaryLists/SupplementaryList.vue |
Hides languages with excludeLanguages |
channelEdit/views/ImportFromChannels/SearchFilters.vue |
Selects more than one language |
channelEdit/views/ImportFromChannels/ChannelList.vue |
Selects one language |
shared/views/channel/ChannelModal.vue |
Makes the field required |
administration/pages/Channels/ChannelTable.vue |
Reads the languages list from the component with a template ref |
Key things to know before you start:
KMultiSelectuses the propsinvalidandinvalidText. It does not use the Vuetifyrulesprop.- A Vuetify
VFormcannot validate aKMultiSelect.ChannelModalneeds a language, so it needs another way to validate the field. Studio already has a pattern for this. The field adds a publicvalidate()method, and the parent calls it.ExpandableSelect.vueandMasteryCriteriaGoal.vueboth do this.CompletionOptions/index.vueis an example of how a parent calls it. - The
languageTextmethod returns early for arrays. A comment explains why. This works around aVAutocompletebehavior.
The tests in shared/views/__tests__/languageDropdown.spec.js use @vue/test-utils, but Studio no longer writes new tests with it.
The Change
LanguageDropdownrendersKMultiSelect. It keeps the propsvalue,required,excludeLanguagesandmultiple, so the six files change as little as possible.- Search must still find a language by its native name, its English name or its code. Use the
searchKeysprop. - The accessibility strings in
messagescome fromshared/strings/commonStrings.js. Add a string to$trsonly when no shared string exists. - Remove
DropdownWrapper, the tooltip template and the::v-deepstyles. Set the field width withappearanceOverrides. LanguageDropdowngets a publicvalidate()method that returns the error text, andChannelModalcalls it next tothis.$refs.detailsform.validate(). A user must not save a channel without a language.- Remove the early return for arrays in
languageTextand its comment. - Remove the Vuetify props from the six files, such as
box,hide-details,persistent-hintanddropAbove.KMultiSelecthas no hint prop, soDetailsTabViewneeds another way to show its hint text.
How to Get There
- Required field: Channel list, open a channel, Edit channel details. Clear the language and save.
- Hint text: Channel editor, select a resource, Edit, Details tab, Audience, Language.
- More than one language: Channel editor, Add, Import from channels, Search filters, Language.
- Hidden languages: Channel editor, select a video or audio resource, Edit, Files, add a caption file.
- Filter: Administration, Channels, Language filter.
Out of Scope
- The other Vuetify components in the six files.
- The
VForminChannelModaland inDetailsTabView. Only the language field changes.
Acceptance Criteria
General
-
LanguageDropdown.vuerendersKMultiSelect. It has noVAutocomplete, noVTooltipand noDropdownWrapper. - Single selection and multiple selection both work. The
inputevent sends the same value as before in all six files. -
excludeLanguagesstill hides languages. -
ChannelModaldoes not save a channel when the language is empty, and the field shows the error text. - The language filter in
ChannelTablestill shows its options. - The six files no longer pass Vuetify props to the component.
-
DetailsTabViewstill shows its hint text. - The early return for arrays in
languageTextis gone.
Accessibility and i18n
-
messageshas every key thatKMultiSelectneeds. Shared strings come fromcommonStrings.js. - Every new text string goes through
$trsor a shared translator. - A keyboard user can open the list, type to filter it, move through the options, select an option and clear the field.
- All colors come from theme tokens.
Testing
-
languageDropdown.spec.jsuses Vue Testing Library. - A test covers the empty language error in
ChannelModal. -
pnpm testpasses. -
pre-commit run --all-filespasses.
References
- KMultiSelect documentation
contentcuration/contentcuration/frontend/channelList/views/Channel/components/LanguageFilter.vue
AI usage
I used Claude Code to draft this issue. It read the component and listed the files that use it. I reviewed the file references and edited the text.
- Lingua principale
- Python
- Stelle
- 191
- Fork
- 308
- Merge medio
- 2g 6h
- PR unite (30g)
- 65
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di learningequality/studio
-
Set unpublishable: true on PublishedChange by construction to simplify handleMaxRevs predicateApertaDEV: frontend P3 - low
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
learningequality/studio#5868 ·
I maintainer di solito rispondono entro 1 giorno
-
TAG: tech update / debt
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
learningequality/studio#2245 ·
I maintainer di solito rispondono entro 1 giorno
-
[QTI] Text entry answers are merged and reordered when the first answer has surrounding spaceApertabug DEV: frontend
Difficoltà 2/5 1-3 ore Idoneità per principianti 15/100
learningequality/studio#6309 ·
I maintainer di solito rispondono entro 1 giorno
-
bug DEV: frontend
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
learningequality/studio#6308 ·
I maintainer di solito rispondono entro 1 giorno
-
bug DEV: frontend
Difficoltà 3/5 1-2 giorni Idoneità per principianti 20/100
learningequality/studio#6307 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di learningequality/studio
Issue simili
-
area: desktop area: website priority: P2 type: feature
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
appandflow/stim#3411 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 Meno di un'ora Idoneità per principianti 88/100
baptistehamon/lsapy#185 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
PolicyEngine/policyengine-us#10073 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
syedhamidali/radarx#277 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
Arekkazu/sgpmp-backend#549 ·
I maintainer di solito rispondono entro 1 giorno