List user panel order name

You have to over load the panels UsersView.vue component in a plugin. I think i did something like this on the PHP side…

<?php

Kirby::plugin('custom/users', [
    'areas' => [
      'users' => function () {
        return [
          'views' => [
           
           
            'users' => [
                'pattern' => 'users',
                'action'  => function () {
                    $kirby = kirby();
                    $role  = get('role');
                    $roles = $kirby->roles()->toArray(fn ($role) => [
                        'id'    => $role->id(),
                        'title' => $role->title(),
                    ]);
        
                    return [
                        'component' => 'k-users-view',
                        'props'     => [
                            'role' => function () use ($kirby, $roles, $role) {
                                if ($role) {
                                    return $roles[$role] ?? null;
                                }
                            },
                            'roles' => array_values($roles),
                            'users' => function () use ($kirby, $role) {
                                $users = $kirby->users();
        
                                if (empty($role) === false) {
                                    $users = $users->role($role);
                                }
                                
                                $users = $users->sortBy('name', 'desc', 1);                             
                                

                                $users = $users->paginate([
                                    'limit' => 20,
                                    'page'  => get('page')
                                ]);
        
                                return [
                                    'data' => $users->values(fn ($user) => [
                                        'id'    => $user->id(),
                                        'image' => $user->panel()->image(),
              
                                        'info'  => Escape::html($user->role()->title()),
                                        'link'  => $user->panel()->url(true),
                                        'text'  => Escape::html($user->username())
                                    ]),
                                    'pagination' => $users->pagination()->toArray()
                                ];
                            },
                        ]
                    ];
                }
            ],
          ]
        ];
      }
    ]
  ]);

Which is similar to the way the panel does it with the slight tweak…

$users = $users->sortBy('name', 'desc', 1);
1 Like