Skip to content

Channel cards to unstable#5696

Open
MisRob wants to merge 44 commits intolearningequality:unstablefrom
MisRob:channel-cards
Open

Channel cards to unstable#5696
MisRob wants to merge 44 commits intolearningequality:unstablefrom
MisRob:channel-cards

Conversation

@MisRob
Copy link
Member

@MisRob MisRob commented Feb 10, 2026

Summary

Replaces Vuetify-based implementation by KCard on My Channels, Starred Channels, View-only Channels, and Content Library pages. On this opportunity introduces a new architecture of the related pages and resolves problems with understanding & maintaining monolithic and condition-heavy ChannelList + ChannelItem.

Before After
my-channels-before my-channels-after
starred-channels-before starred-channels-after
view-channels-before view-channels-after
content-library-before content-library-after

References

Closes #5227
Closes #5524
Closes #5525
Closes #5526

Reviewer guidance

Code review:

  • 80% of work are community contributions that were reviewed by myself and some also by @rtibbles. Then I added a final layer of work: abstractions, cleanup, user experience as well as internal architecture optimizations, fixes for few regressions, ... => I think it'd most meaningful to review affected files as a whole.

Local preview:

  • Run pnpm install first
  • Preview My Channels, Starred Channels, and View-only Channels pages
  • Preview Content Library when logged in and logged out

Notes

Before merging, [TODO REVERT] Temporarily install KDS fork commit needs to be reverted and a newly released KDS version with learningequality/kolibri-design-system#1203 installed.

@MisRob MisRob marked this pull request as ready for review February 16, 2026 08:14
@MisRob MisRob changed the title [WIP] Channel cards to unstable Channel cards to unstable Feb 16, 2026
Copy link
Member

@bjester bjester left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some review comments

loading.value = true;
store.dispatch('channel/loadChannelList', { listType }).then(() => {
loading.value = false;
});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this fails to load (like it times out), what happens from the user perspective?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is based on the previous implementation:

this.loadChannelList({ listType }).then(() => {
this.loading = false;
});

but I haven't previewed error states ~ will be good to consider.

I looked into it more now and I feel unclear what is expected behavior and how it should be treated technically. From the code, unless I am missing something, either we didn't have error handling or perhaps there was an intention for the full page error logic to get triggered in case of problems:

<ChannelListAppError
v-if="fullPageError"
:error="fullPageError"
/>

even though I think for that to work we should call handleAxiosError via catch.

In any case, this is just guessing. Do you have any recommendations on how to simulate timeouts or generally backend errors in a straightforward way so I could preview how it behaved before?

I think that snackbar would probably be better than a full page error anyway though. I will discuss with designers. If it'd be fine I would address this as a follow-up.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually sorry, I realized we avoid snackbars for errors. So I think as the most immediate step would be to confirm it works / fix the full page error. Still will appreciate any tips on how to simulate errors.

@MisRob
Copy link
Member Author

MisRob commented Feb 18, 2026

I've just noticed on screenshots that I lost the invitations box being a bit wider than cards. Will fix this ~ is good for visual priority.

Resolved.

Copy link
Member

@akolson akolson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think code is clear and understandable. Thanks Misha for this refactor!

to prevent unnecessary memory usage
and to improve architecture.

Relatedly remove props for configuring
footer in favor of the footer slot to
make communication between the modals
and footer buttons straightforward.
in channel token modal and remove unnecessary
token tracking handlers from components (StudioCopyToken
handles tracking)
@MisRob MisRob requested a review from rtibblesbot March 4, 2026 13:15
Copy link

@rtibblesbot rtibblesbot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well-structured PR that replaces Vuetify-based channel cards with KDS KCard across four pages, with a clean architectural decomposition from monolithic ChannelList+ChannelItem into focused per-page components.

CI passing. Screenshots verified for My Channels, Starred, View-only, and Content Library — all look visually consistent and complete.

Suggestions:

  • Missing notranslate class and dir="auto" on channel description in StudioChannelCard (see inline comment)
  • Missing error handling in useChannelList composable — rejected dispatch leaves loading state stuck (see inline comment)

Praise:

  • Excellent decomposition into StudioMyChannels, StudioStarredChannels, StudioViewOnlyChannels with shared StudioChannelCard and StudioChannelsPage layout
  • Thorough test suites using @testing-library/vue covering dropdown menus, modal flows, navigation, and conditional rendering
  • Good extraction of useChannelList composable for shared channel-loading logic

Note: As mentioned in the PR description, the temporary KDS fork in package.json needs to be reverted before merge.


@rtibblesbot's comments are generated by an LLM, and should be evaluated accordingly

How was this generated?

Reviewed the pull request diff checking for:

  • Correctness: bugs, edge cases, undocumented behavior, resource leaks, hardcoded values
  • Design: unnecessary complexity, naming, readability, comment accuracy, redundant state
  • Architecture: duplicated concerns, minimal interfaces, composition over inheritance
  • Testing: behavior-based assertions, mocks only at hard boundaries, accurate coverage
  • Completeness: missing dependencies, unupdated usages, i18n, accessibility, security
  • Principles: DRY (same reason to change), SRP, Rule of Three (no premature abstraction)
  • Checked CI status and linked issue acceptance criteria
  • For UI changes: inspected screenshots for layout, visual completeness, and consistency

@MisRob MisRob requested a review from rtibblesbot March 4, 2026 13:33
Copy link

@rtibblesbot rtibblesbot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clean follow-up addressing prior feedback. CI pending (linting, frontend build, frontend tests). Screenshots verified — all four pages look visually complete and consistent.

1 prior finding(s) resolved.

Suggestions:

  • Empty-state "No channels found" may not display when a user has zero channels (see inline comment on StudioChannelsPage)

Praise:

  • StudioStarredChannels tests nicely cover both editable and view-only channel behaviors within the same page, testing the conditional dropdown logic thoroughly

@rtibblesbot's comments are generated by an LLM, and should be evaluated accordingly

How was this generated?

Compared the current PR state against findings from a prior review:

  • Retrieved prior bot reviews deterministically via the GitHub API
  • Classified each prior finding as RESOLVED, UNADDRESSED, ACKNOWLEDGED, or CONTESTED
  • Only raised NEW findings for newly introduced code
  • Reviewed the pull request diff checking for correctness, design, architecture, testing, completeness, and adherence to DRY/SRP principles
  • Checked CI status and linked issue acceptance criteria

@MisRob MisRob requested a review from rtibblesbot March 4, 2026 13:48
Copy link

@rtibblesbot rtibblesbot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clean delta — prior feedback addressed.

CI: linting and frontend tests passing; build frontend assets still pending. Screenshots previously verified.

2 prior finding(s) resolved.

Suggestions:

  • None

Reminders:

  • KDS fork in package.json still needs reverting before merge (as noted in PR description)

@rtibblesbot's comments are generated by an LLM, and should be evaluated accordingly

How was this generated?

Compared the current PR state against findings from a prior review:

  • Retrieved prior bot reviews deterministically via the GitHub API
  • Classified each prior finding as RESOLVED, UNADDRESSED, ACKNOWLEDGED, or CONTESTED
  • Only raised NEW findings for newly introduced code
  • Reviewed the pull request diff checking for correctness, design, architecture, testing, completeness, and adherence to DRY/SRP principles
  • Checked CI status and linked issue acceptance criteria

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

Projects

None yet

7 participants