|  | @@ -64,13 +64,13 @@ q-page.admin-groups
 | 
	
		
			
				|  |  |            :rows-per-page-options='[0]'
 | 
	
		
			
				|  |  |            :loading='state.loading > 0'
 | 
	
		
			
				|  |  |            )
 | 
	
		
			
				|  |  | -          template(v-slot:body-cell-id='props')
 | 
	
		
			
				|  |  | +          template(#body-cell-id='props')
 | 
	
		
			
				|  |  |              q-td(:props='props')
 | 
	
		
			
				|  |  |                q-icon(name='las la-user', color='primary', size='sm')
 | 
	
		
			
				|  |  | -          template(v-slot:body-cell-name='props')
 | 
	
		
			
				|  |  | +          template(#body-cell-name='props')
 | 
	
		
			
				|  |  |              q-td(:props='props')
 | 
	
		
			
				|  |  |                .flex.items-center
 | 
	
		
			
				|  |  | -                strong {{props.value}}
 | 
	
		
			
				|  |  | +                strong {{ props.value }}
 | 
	
		
			
				|  |  |                  q-icon.q-ml-sm(
 | 
	
		
			
				|  |  |                    v-if='props.row.isSystem'
 | 
	
		
			
				|  |  |                    name='las la-lock'
 | 
	
	
		
			
				|  | @@ -81,10 +81,10 @@ q-page.admin-groups
 | 
	
		
			
				|  |  |                    name='las la-ban'
 | 
	
		
			
				|  |  |                    color='pink'
 | 
	
		
			
				|  |  |                    )
 | 
	
		
			
				|  |  | -          template(v-slot:body-cell-email='props')
 | 
	
		
			
				|  |  | +          template(#body-cell-email='props')
 | 
	
		
			
				|  |  |              q-td(:props='props')
 | 
	
		
			
				|  |  |                em {{ props.value }}
 | 
	
		
			
				|  |  | -          template(v-slot:body-cell-date='props')
 | 
	
		
			
				|  |  | +          template(#body-cell-date='props')
 | 
	
		
			
				|  |  |              q-td(:props='props')
 | 
	
		
			
				|  |  |                i18n-t.text-caption(keypath='admin.users.createdAt', tag='div')
 | 
	
		
			
				|  |  |                  template(#date)
 | 
	
	
		
			
				|  | @@ -96,7 +96,7 @@ q-page.admin-groups
 | 
	
		
			
				|  |  |                  )
 | 
	
		
			
				|  |  |                  template(#date)
 | 
	
		
			
				|  |  |                    strong {{ humanizeDate(props.row.lastLoginAt) }}
 | 
	
		
			
				|  |  | -          template(v-slot:body-cell-edit='props')
 | 
	
		
			
				|  |  | +          template(#body-cell-edit='props')
 | 
	
		
			
				|  |  |              q-td(:props='props')
 | 
	
		
			
				|  |  |                q-btn.acrylic-btn.q-mr-sm(
 | 
	
		
			
				|  |  |                  v-if='!props.row.isSystem'
 | 
	
	
		
			
				|  | @@ -114,11 +114,19 @@ q-page.admin-groups
 | 
	
		
			
				|  |  |                  color='negative'
 | 
	
		
			
				|  |  |                  @click='deleteUser(props.row)'
 | 
	
		
			
				|  |  |                  )
 | 
	
		
			
				|  |  | +      .flex.flex-center.q-mt-lg(v-if='state.totalPages > 1')
 | 
	
		
			
				|  |  | +        q-pagination(
 | 
	
		
			
				|  |  | +          v-model='state.currentPage'
 | 
	
		
			
				|  |  | +          :max='state.totalPages'
 | 
	
		
			
				|  |  | +          :max-pages='9'
 | 
	
		
			
				|  |  | +          boundary-numbers
 | 
	
		
			
				|  |  | +          direction-links
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  |  </template>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <script setup>
 | 
	
		
			
				|  |  |  import gql from 'graphql-tag'
 | 
	
		
			
				|  |  | -import { cloneDeep } from 'lodash-es'
 | 
	
		
			
				|  |  | +import { cloneDeep, debounce } from 'lodash-es'
 | 
	
		
			
				|  |  |  import { DateTime } from 'luxon'
 | 
	
		
			
				|  |  |  import { useI18n } from 'vue-i18n'
 | 
	
		
			
				|  |  |  import { useMeta, useQuasar } from 'quasar'
 | 
	
	
		
			
				|  | @@ -162,7 +170,10 @@ useMeta({
 | 
	
		
			
				|  |  |  const state = reactive({
 | 
	
		
			
				|  |  |    users: [],
 | 
	
		
			
				|  |  |    loading: 0,
 | 
	
		
			
				|  |  | -  search: ''
 | 
	
		
			
				|  |  | +  search: '',
 | 
	
		
			
				|  |  | +  currentPage: 1,
 | 
	
		
			
				|  |  | +  pageSize: 20,
 | 
	
		
			
				|  |  | +  totalPages: 15
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const headers = [
 | 
	
	
		
			
				|  | @@ -214,28 +225,52 @@ watch(() => adminStore.overlay, (newValue, oldValue) => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  watch(() => route.params.id, checkOverlay)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +watch(() => state.search, debounce(() => {
 | 
	
		
			
				|  |  | +  load({ page: 1 })
 | 
	
		
			
				|  |  | +}, 400))
 | 
	
		
			
				|  |  | +watch(() => state.currentPage, (newValue) => {
 | 
	
		
			
				|  |  | +  load({ page: newValue })
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // METHODS
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -async function load () {
 | 
	
		
			
				|  |  | +async function load ({ page } = {}) {
 | 
	
		
			
				|  |  |    state.loading++
 | 
	
		
			
				|  |  |    $q.loading.show()
 | 
	
		
			
				|  |  |    const resp = await APOLLO_CLIENT.query({
 | 
	
		
			
				|  |  |      query: gql`
 | 
	
		
			
				|  |  | -      query getUsers {
 | 
	
		
			
				|  |  | -        users {
 | 
	
		
			
				|  |  | -          id
 | 
	
		
			
				|  |  | -          name
 | 
	
		
			
				|  |  | -          email
 | 
	
		
			
				|  |  | -          isSystem
 | 
	
		
			
				|  |  | -          isActive
 | 
	
		
			
				|  |  | -          createdAt
 | 
	
		
			
				|  |  | -          lastLoginAt
 | 
	
		
			
				|  |  | +      query getUsers(
 | 
	
		
			
				|  |  | +        $page: Int
 | 
	
		
			
				|  |  | +        $pageSize: Int
 | 
	
		
			
				|  |  | +        $filter: String
 | 
	
		
			
				|  |  | +      ) {
 | 
	
		
			
				|  |  | +        users(
 | 
	
		
			
				|  |  | +          page: $page
 | 
	
		
			
				|  |  | +          pageSize: $pageSize
 | 
	
		
			
				|  |  | +          filter: $filter
 | 
	
		
			
				|  |  | +        ) {
 | 
	
		
			
				|  |  | +          total
 | 
	
		
			
				|  |  | +          users {
 | 
	
		
			
				|  |  | +            id
 | 
	
		
			
				|  |  | +            name
 | 
	
		
			
				|  |  | +            email
 | 
	
		
			
				|  |  | +            isSystem
 | 
	
		
			
				|  |  | +            isActive
 | 
	
		
			
				|  |  | +            createdAt
 | 
	
		
			
				|  |  | +            lastLoginAt
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      `,
 | 
	
		
			
				|  |  | -    fetchPolicy: 'network-only'
 | 
	
		
			
				|  |  | +    fetchPolicy: 'network-only',
 | 
	
		
			
				|  |  | +    variables: {
 | 
	
		
			
				|  |  | +      page: page ?? state.currentPage ?? 1,
 | 
	
		
			
				|  |  | +      pageSize: state.pageSize ?? 20,
 | 
	
		
			
				|  |  | +      filter: state.search ?? ''
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    })
 | 
	
		
			
				|  |  | -  state.users = cloneDeep(resp?.data?.users)
 | 
	
		
			
				|  |  | +  state.totalPages = Math.ceil((resp?.data?.users?.total || 1) / state.pageSize)
 | 
	
		
			
				|  |  | +  state.users = cloneDeep(resp?.data?.users?.users)
 | 
	
		
			
				|  |  |    $q.loading.hide()
 | 
	
		
			
				|  |  |    state.loading--
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -281,7 +316,7 @@ function deleteUser (usr) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  onMounted(() => {
 | 
	
		
			
				|  |  |    checkOverlay()
 | 
	
		
			
				|  |  | -  load()
 | 
	
		
			
				|  |  | +  load({ page: 1 })
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // BEFORE UNMOUNT
 |