Skip to content

Conversation

@nucleogenesis
Copy link
Member

@nucleogenesis nucleogenesis commented Oct 3, 2025

Summary

Major Changes

  • New UI/UX layout & spacing applied across all NewUsers, UsersRoot and UsersTrash pages.
  • Consistency of search/filtering options across pages
  • Some changes have been made that impact other parts of the application (see the PaginationActions component & PaginatedListContainerWithBackend component updates and their related changes outside of Facility).

References

Touches #13782 , follows up from #13743

Reviewer guidance

QA

There are no specific Figma references for these updates to reference.

Users Root Table, New Users Table, Deleted Users Table

All of these pages have had similar changes performed on them and there is significant change for regression - so please check the following:

  • All bulk actions available and functioning on each of these pages
  • Do/undo behaviour
  • All filters/search combinations
  • Validate messaging for empty table states

Root Table Specific

  • Test across screen sizes with a focus on the table heading/actions being positioned correctly beneath the top "App bar"
  • When the screen shrinks, the "New user" button folds into the "Options" dropdown now - be sure all dropdown options work as expected
  • Also note that as you shrink the page, the AppBar's buttons might overflow to another row for about 40px at one point in a way that is different than the proper mobile view - be sure that at all screen widths, the heading is positioned correctly

Android & App mode

Test that all content and data is visible when in app mode (where there is a bottom actions bar).

My Downloads

Check this page for regressions, particularly around pagination.

Classes -> Class Details -> Enroll learners

This page also has had some updates to the pagination and should be tested for regressions with a focus on pagination

@github-actions github-actions bot added APP: Facility Re: Facility App (user/class management, facility settings, csv import/export, etc.) DEV: frontend SIZE: large labels Oct 3, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Oct 3, 2025

@nucleogenesis nucleogenesis force-pushed the fullscreen-users-table branch from 67a40dc to 35548a5 Compare October 6, 2025 20:40
</KGrid>

<div class="flex-column">
<div class="flex-column table-content">
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 whole component may no longer be necessary as the business logic has been extracted to just be a kind of widget in PaginationActions.vue that can be slapped anywhere with the given props and will handle the pagination buttons/messaging w/out the opinionated layout enforced.

Copy link
Member

Choose a reason for hiding this comment

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

Seems like with the new changes this component is no longer necessary yes, or at least it should be renamed in the scope of this PR so we can avoid future confusions.

Copy link
Member

Choose a reason for hiding this comment

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

Yes, it feels like it would be better to just defer most of this to the consuming component, until we have a strong use case to generalize again.

Copy link
Member Author

Choose a reason for hiding this comment

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

I'll make a follow-up issue to clean this up a bit as it'll involve updating other areas as well and this PR is growing grey hairs

@nucleogenesis nucleogenesis force-pushed the fullscreen-users-table branch 2 times, most recently from bb6e723 to 082c044 Compare October 6, 2025 22:39
@github-actions github-actions bot added the APP: Learn Re: Learn App (content, quizzes, lessons, etc.) label Oct 6, 2025
AlexVelezLl and others added 5 commits October 6, 2025 15:42
- Created useUsersTableSearch composable for search/query handling
- Created usePagination composable for pagination state management
- Refactored UsersTableToolbar to be a pure layout component
- Updated UsersRootPage to use new composables
- Integrated PaginationActions component for consistent pagination UI
- Cleaned up UsersTable component to remove duplicated logic

This refactoring improves maintainability by:
- Encapsulating search and pagination logic in reusable composables
- Following Vue 2 Composition API patterns used in the codebase
- Creating clear separation of concerns between components
- Providing flexible two-row layout structure for toolbar actions

Initial Claude Prompt: 1) Get a sense of the files I've been working on based on my last git commit and current unstaged changes. 2) Review those changes to get a sense of how the code is structured. 3) The kolibri/plugins/facility/assets/src/views/users/common/UsersTableToolbar.vue and the packages/kolibri-common/components/PaginatedListContainer.vue components have some logic too tightly couple to their scope and aren't used in a way that makes it easy to, for example, know what page we're on. Also, the "query/search" handling in the overall changes I've made reflects to me something that would be easier to use if it were encapsulated somehow, such as into its own composable module. (NOTE: look at files use*.js in the codebase for an example of how we use the Composition API modules in Vue 2). In any case - the changes I'm working on are to rearrange some of the actions that we've put onto the screen. The #topRow and #bottomRow slots in packages/kolibri-common/components/PaginatedListContainerWithBackend.vue demonstrate at least the overall layout I want - basically I need two rows in a flex container (column dir) which each can then have their own flexbox divs w/ their own layout of actions within them and I need to be able to put the Options dropdown, New User button, FilterTextbox (and friends), the "7 users selected" message w/ appropriate count variable passed for the number, and the pagination buttons & messaging all in the same place. 4) Please proceed to make changes to the code base updating it per what I've said here. Ask any questions you have as you proceed.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
@nucleogenesis nucleogenesis force-pushed the fullscreen-users-table branch from 082c044 to 4503c23 Compare October 6, 2025 22:42
Comment on lines 4 to 10
<PaginationActions
v-model="currentPage"
class="top-pagination-actions"
:itemsPerPage="itemsPerPage"
:totalPageNumber="totalPageNumber"
:numFilteredItems="downloadItemListLength"
>
/>
Copy link
Member

Choose a reason for hiding this comment

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

Are we sure we want to change the pagination layout for all pages? 👀 (Seems like a non-trivial design change so just flagging it for all relevant people to aggree/be informed)

Copy link
Member

Choose a reason for hiding this comment

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

(For me, it feels a little bit weird to have them both on the top and the botton of the table)
image

Copy link
Member Author

Choose a reason for hiding this comment

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

Having it top & bottom made more sense when I had a full page of downloads and had to scroll 30 of them to the bottom but when it's empty like that it looks goofy 😅 - I've reverted it to the original.

Copy link
Member

@AlexVelezLl AlexVelezLl left a comment

Choose a reason for hiding this comment

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

Thanks @nucleogenesis! Just a few comments I noticed in a first read through

</KGrid>

<div class="flex-column">
<div class="flex-column table-content">
Copy link
Member

Choose a reason for hiding this comment

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

Seems like with the new changes this component is no longer necessary yes, or at least it should be renamed in the scope of this PR so we can avoid future confusions.

@nucleogenesis
Copy link
Member Author

@pcenov I've updated the PR to address the following:

  • Android bottom bar bug
  • Things scrolling up and over the appbar (sorry about this - I broke this in my last commit before requesting review and didn't catch it)
  • Horizontal scrollbar always visible
  • Better deleted user message view on smaller screens
  • Hide filters & search when no users to filter or search
  • Ultrawide screens look right :)

The following we'll address separately:

  • The "New User" button going into "Options" - this is something I'm discussing w/ Tomiwa
  • Overall weird top section when small - we'll follow-up on this.

@pcenov
Copy link
Member

pcenov commented Oct 10, 2025

Hi @nucleogenesis,

Testing notes on the fixed items:

  1. Android bottom bar bug - NOT FIXED - this one is still extant in the Android app in the latest build
  2. Things scrolling up and over the appbar - FIXED
  3. Horizontal scrollbar always visible - FIXED
  4. Better deleted user message view on smaller screens - it's better now :)
  5. Hide filters & search when no users to filter or search - PARTIALLY FIXED - the filter and search are hidden now, but the icons and pager remain visible?
  6. Ultra-wide screens look right - FIXED

New issues:

  1. All tables - the tooltips are displayed under the table's header:
tooltips.mp4
  1. All tables - the search field disappears completely when there are no matching results:
search.field.disappears.mp4
  1. Search field's width - Shrinking the page results in a very small search field for some resolutions. At the same time it has become too wide at the users and new users tables. It's best to have the same min and max width of the field for all tables, allowing for the entered text to be visible:
search.field.size.mp4
  1. The page numbers are lower than the arrows, should be centered:
page numbers
  1. Small devices and the Android app
  • At Classes page the "New class" button is too close to the table in portrait mode. Also the "Class name" column is too wide so it's almost impossible to view the other columns
  • There's no visible scrollbars in the Android app so the user has to guess that it's possible to scroll and see other columns and rows
  • In landscape mode the tables are not useful at all
small.devices.mp4

@nucleogenesis
Copy link
Member Author

@pcenov I've fixed:

  • Tooltips
  • Search field missing when no results

The others will be addressed in follow-ups - particularly the styles on the mobile screens

@nucleogenesis nucleogenesis added the TODO: needs QA re-review For stale issues that need to be revisited label Oct 13, 2025
@pcenov
Copy link
Member

pcenov commented Oct 13, 2025

@nucleogenesis - I'm not seeing a new build with the new fixes?

@pcenov
Copy link
Member

pcenov commented Oct 14, 2025

Thanks @nucleogenesis - please let me know when you create the follow-up issues so that we can make sure that everything is tracked.
For the latest build I confirm that the issue with the tooltips is fixed.
The issues with the disappearing search field is also fixed, but while regression testing around it I noticed a similar issue - if I apply a filter for which there are no results then the search field disappears along with the link to the applied filter, which leaves only the "Clear filters" option available to the user:

filters.no.search.field.mp4

Didn't observe any other issues caused by the changes made here.

only hiding them if there are no searchterm, filters applied, or users
in the table. honestly an edge case but now it works as expected
Copy link
Member

@rtibbles rtibbles left a comment

Choose a reason for hiding this comment

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

A couple of comments.

I think this is good cleanup of the pagination - and reminds me somewhat of some of the composable work that @AlexVelezLl did in 0.18 for better handling for API requests for content. I think we are feeling our way towards a better, composable based, API resource layer that handles both cursor based (more) and page based pagination styles. Good that we didn't go that far in this PR, but it's moving us in the at direction.

The appBarHeight stuff feels like it could be avoided - I don't know precisely how, but I'd rather look for an alternative, and then clearly document why this was required. I guess the main question is, why isn't the built in paddingTop styling that is applied sufficient? If it's being ignored somehow, shouldn't we just be aiming to apply it in the correct place instead?

</KGrid>

<div class="flex-column">
<div class="flex-column table-content">
Copy link
Member

Choose a reason for hiding this comment

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

Yes, it feels like it would be better to just defer most of this to the consuming component, until we have a strong use case to generalize again.

id="main"
class="main-wrapper"
:style="[wrapperStyles, paddingTop]"
:style="[wrapperStyles]"
Copy link
Member

Choose a reason for hiding this comment

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

Seems like this doesn't even need to be an array any more? Just the wrapperStyles object directly?

* Handles page changes, items per page, and URL query synchronization
*/
export default function usePagination({ usersCount, totalPages } = {}) {
const route = useRoute();
Copy link
Member

Choose a reason for hiding this comment

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

Nice to do this, so as we drop use of vuex, we're not relying on store vuex state for this any more.

@rtibbles
Copy link
Member

So, I think my general feeling after the last few updates is that the smell was coming from under the floorboards. Still good to have reverted the expansion of the API, because I think doing this right will not require the appBarHeight - the small is still there, it's just now masked again!

@nucleogenesis
Copy link
Member Author

@pcenov I've made #13842 #13843 and #13844 to follow-up on the unresolved comments from your reviews.

Also noting that I've created follow-ups for pagination #13841 generalization so we don't miss coming back to the discussion around it down the road.

Copy link
Member

@rtibbles rtibbles left a comment

Choose a reason for hiding this comment

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

All code review and QA comments have been addressed, either in the scope of this PR or in follow up issues.

@rtibbles rtibbles merged commit beae6c5 into learningequality:develop Oct 20, 2025
51 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

APP: Facility Re: Facility App (user/class management, facility settings, csv import/export, etc.) APP: Learn Re: Learn App (content, quizzes, lessons, etc.) DEV: frontend SIZE: large SIZE: very large TODO: needs QA re-review For stale issues that need to be revisited

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants