Better filtering

This commit is contained in:
Douglas Barone 2022-04-07 08:11:48 -04:00
parent cf76272456
commit 61825de579
10 changed files with 397 additions and 367 deletions

View File

@ -1,12 +1,12 @@
{ {
"name": "ifms-pti-svr", "name": "ifms-pti-svr",
"version": "2.12.4", "version": "2.12.5",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ifms-pti-svr", "name": "ifms-pti-svr",
"version": "2.12.4", "version": "2.12.5",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@prisma/client": "^3.11.0", "@prisma/client": "^3.11.0",

View File

@ -1,6 +1,6 @@
{ {
"name": "ifms-pti-svr", "name": "ifms-pti-svr",
"version": "2.12.4", "version": "2.12.5",
"description": "Servidor do Portal de TI do IFMS", "description": "Servidor do Portal de TI do IFMS",
"main": "src/index.js", "main": "src/index.js",
"scripts": { "scripts": {

View File

@ -1,6 +1,6 @@
import prisma from '../../prisma' import prisma from '../../prisma'
export async function wifiDevices(_, { take = 100, skip = 0, search }) { export async function wifiDevices(parent, { take = 100, skip = 0, search }) {
const mode = 'insensitive' const mode = 'insensitive'
if (search === null) if (search === null)

View File

@ -1,15 +1,44 @@
import prisma from '../../prisma' import prisma from '../../prisma'
// TODO: Add filtering // TODO: Add filtering
export async function wifiUsers() { export async function wifiUsers(parent, { take = 100, skip = 0, search }) {
const wifiUsers = await prisma.user.findMany({ const mode = 'insensitive'
where: { wifiDevices: { some: { id: { not: undefined } } } },
include: { wifiDevices: true }
})
return wifiUsers.sort( if (search === null)
(a, b) => search = undefined
b.wifiDevices.filter(device => device.status == 'ONLINE').length -
a.wifiDevices.filter(device => device.status == 'ONLINE').length return prisma.user.findMany({
) where: {
AND: [
{ wifiDevices: { some: { id: { not: undefined } } } },
{
OR: [
{ wifiDevices: { some: { hostname: { contains: search, mode } } } },
{
wifiDevices: {
some: {
accessPoint: {
OR: [
{ name: { contains: search, mode } },
{ local: { contains: search, mode } },
]
}
}
}
},
{ wifiDevices: { some: { mac: { contains: search, mode } } } },
{ wifiDevices: { some: { ip: { contains: search, mode } } } },
{ displayName: { contains: search, mode } }, ,
{ sAMAccountName: { contains: search, mode } },
]
}
]
},
include: { wifiDevices: true },
orderBy: [
{ wifiDevices: { _count: 'desc' } },
{ displayName: 'asc' }],
take,
skip
})
} }

View File

@ -41,7 +41,10 @@ const typeDefs = gql`
): [WifiDevice]! @auth(roles: ["superAdmin"]) ): [WifiDevice]! @auth(roles: ["superAdmin"])
"Users that uses the Wi-Fi" "Users that uses the Wi-Fi"
wifiUsers: [User]! @auth(roles: ["superAdmin"]) wifiUsers(
search: String = ""
take: Int
skip: Int): [User]! @auth(roles: ["superAdmin"])
"Application Logs" "Application Logs"
logs( logs(

4
web/package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "ifms-pti", "name": "ifms-pti",
"version": "2.12.4", "version": "2.12.5",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ifms-pti", "name": "ifms-pti",
"version": "2.12.4", "version": "2.12.5",
"dependencies": { "dependencies": {
"@mdi/font": "^6.6.96", "@mdi/font": "^6.6.96",
"apollo-link-ws": "^1.0.20", "apollo-link-ws": "^1.0.20",

View File

@ -1,6 +1,6 @@
{ {
"name": "ifms-pti", "name": "ifms-pti",
"version": "2.12.4", "version": "2.12.5",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",

View File

@ -59,18 +59,18 @@ export default {
route: { name: 'wifi-devices' }, route: { name: 'wifi-devices' },
role: 'superAdmin' role: 'superAdmin'
}, },
{
title: 'Access Points',
icon: 'mdi-access-point',
route: { name: 'access-points' },
role: 'superAdmin'
},
{ {
title: 'Usuários Wi-Fi', title: 'Usuários Wi-Fi',
icon: 'mdi-account-voice', icon: 'mdi-account-voice',
route: { name: 'wifi-users' }, route: { name: 'wifi-users' },
role: 'superAdmin' role: 'superAdmin'
}, },
{
title: 'Access Points',
icon: 'mdi-access-point',
route: { name: 'access-points' },
role: 'superAdmin'
},
{ {
title: 'Inspecionar Usuário', title: 'Inspecionar Usuário',
icon: 'mdi-account-search', icon: 'mdi-account-search',

View File

@ -1,16 +1,12 @@
<template> <template>
<div> <v-container fluid>
<v-toolbar height="115" class="align-content-center bottom-border" flat> <v-toolbar class="mb-2" flat outlined>
<v-text-field <v-text-field
v-model="search" v-model="search"
class="mt-6 search"
label="Pesquisar" label="Pesquisar"
hint="MAC/IP/Usuário" prepend-inner-icon="mdi-account-search"
prepend-icon="mdi-magnify"
clearable clearable
outlined hide-details
rounded
style="max-width: 512px"
/> />
<v-tooltip bottom> <v-tooltip bottom>
@ -29,171 +25,172 @@
</template> </template>
</v-tooltip> </v-tooltip>
</v-toolbar> </v-toolbar>
<v-container fluid> <div v-if="wifiDevices && stats" class="text-center my-4">
<div v-if="wifiDevices && stats" class="text-center my-4"> <v-chip color="primary" class="mr-1" dark>
<v-chip color="primary" class="mr-1" dark> {{ stats.onlineWifiDevices }}
{{ stats.onlineWifiDevices }} </v-chip>
</v-chip> online de
online de <v-chip class="mx-1">
<v-chip class="mx-1"> {{ stats.totalWifiDevices }}
{{ stats.totalWifiDevices }} </v-chip>
</v-chip> no total.
no total. </div>
</div> <v-data-iterator
<v-data-iterator :items="computedWifiDevices"
:items="computedWifiDevices" :items-per-page.sync="itemsPerPage"
:items-per-page.sync="itemsPerPage" :page="page"
:page="page" :loading="$apollo.queries.wifiDevices.loading"
:loading="$apollo.queries.wifiDevices.loading" >
> <template #default="{ items }">
<template #default="{ items }"> <v-expansion-panels multiple>
<v-expansion-panels multiple> <v-expansion-panel v-for="device in items" :key="device.mac">
<v-expansion-panel v-for="device in items" :key="device.mac"> <v-expansion-panel-header>
<v-expansion-panel-header> <v-row dense align-content="center" no-gutters>
<v-row dense align-content="center" no-gutters> <v-col class="shrink" align-self="center">
<v-col class="shrink" align-self="center"> <v-badge
<v-badge :color="device.status == 'ONLINE' ? 'green' : 'grey'"
:color="device.status == 'ONLINE' ? 'green' : 'grey'" left
left offset-y="16"
offset-y="16" dot
dot
>
<ap-icon class="mr-4" :controller="device.controller" />
</v-badge>
</v-col>
<v-col align-self="center" cols="3">
{{ device.hostname }}
</v-col>
<v-col
v-if="$vuetify.breakpoint.mdAndUp"
cols="2"
class="grow"
>{{ device.ip }}</v-col
> >
<v-col v-if="$vuetify.breakpoint.mdAndUp" class="grow"> <ap-icon class="mr-4" :controller="device.controller" />
<div> </v-badge>
<avatar left size="24px" :src="device.thumbnailPhoto" />{{ </v-col>
device.displayName <v-col align-self="center" cols="3">
}} {{ device.hostname }}
</div> </v-col>
</v-col> <v-col
</v-row> v-if="$vuetify.breakpoint.mdAndUp"
</v-expansion-panel-header> cols="2"
<v-expansion-panel-content> class="grow"
<v-list dense> >{{ device.ip }}</v-col
<v-list-item v-if="device.status == 'ONLINE'"> >
<v-list-item-action> <v-col v-if="$vuetify.breakpoint.mdAndUp" class="grow">
<v-icon color="green darken-1">mdi-wifi</v-icon> <div>
</v-list-item-action> <avatar left size="24px" :src="device.thumbnailPhoto" />{{
<v-list-item-content> device.displayName
<v-list-item-title> }}
{{ device.essid }} </div>
</v-list-item-title> </v-col>
<v-list-item-subtitle> SSID </v-list-item-subtitle> </v-row>
</v-list-item-content> </v-expansion-panel-header>
</v-list-item> <v-expansion-panel-content>
<v-list dense>
<v-list-item v-if="device.status == 'ONLINE'">
<v-list-item-action>
<v-icon color="green darken-1">mdi-wifi</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.essid }}
</v-list-item-title>
<v-list-item-subtitle> SSID </v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item v-else> <v-list-item v-else>
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-wifi-off</v-icon> <v-icon>mdi-wifi-off</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
{{ device.essid }} {{ device.essid }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle> <v-list-item-subtitle>
Dispositivo off-line Dispositivo off-line
</v-list-item-subtitle> </v-list-item-subtitle>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item> <v-list-item>
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-access-point</v-icon> <v-icon>mdi-access-point</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
{{ device.apName }} {{ device.apName }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle> <v-list-item-subtitle>
Access Point ({{ device.controller }}) Access Point ({{ device.controller }})
</v-list-item-subtitle> </v-list-item-subtitle>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item> <v-list-item>
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-ip-network</v-icon> <v-icon>mdi-ip-network</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
{{ device.ip }} {{ device.ip }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle> <v-list-item-subtitle>
Último endereço IP conhecido Último endereço IP conhecido
</v-list-item-subtitle> </v-list-item-subtitle>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item> <v-list-item>
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-expansion-card-variant</v-icon> <v-icon>mdi-expansion-card-variant</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
{{ device.mac }} {{ device.mac }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle> <v-list-item-subtitle>
{{ device.oui }} {{ device.oui }}
</v-list-item-subtitle> </v-list-item-subtitle>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item> <v-list-item>
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-eye</v-icon> <v-icon>mdi-eye</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
{{ device.lastSeen | dateAndTime }} {{ device.lastSeen | dateAndTime }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle> <v-list-item-subtitle>
Visto pela última vez Visto pela última vez
</v-list-item-subtitle> </v-list-item-subtitle>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item> <v-list-item>
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-check-decagram</v-icon> <v-icon>mdi-check-decagram</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
{{ device.firstSeen | dateAndTime }} {{ device.firstSeen | dateAndTime }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle> <v-list-item-subtitle>
Visto pela primeira vez Visto pela primeira vez
</v-list-item-subtitle> </v-list-item-subtitle>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item> <v-list-item>
<v-list-item-action> <v-list-item-action>
<Avatar :src="device.thumbnailPhoto" size="24px" /> <Avatar :src="device.thumbnailPhoto" size="24px" />
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
{{ device.displayName }} {{ device.displayName }}
</v-list-item-title> </v-list-item-title>
<v-list-item-subtitle> <v-list-item-subtitle>
{{ device.sAMAccountName }} {{ device.sAMAccountName }}
</v-list-item-subtitle> </v-list-item-subtitle>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
</v-list> </v-list>
</v-expansion-panel-content> </v-expansion-panel-content>
</v-expansion-panel> </v-expansion-panel>
</v-expansion-panels> </v-expansion-panels>
</template> </template>
</v-data-iterator> </v-data-iterator>
</v-container> <v-alert type="info" outlined dismissible>
</div> São exibidos apenas os 100 primeiros resultados da pesquisa
</v-alert>
</v-container>
</template> </template>
<script> <script>

View File

@ -1,16 +1,12 @@
<template> <template>
<div> <v-container fluid>
<v-toolbar height="115" class="align-content-center bottom-border" flat> <v-toolbar class="mb-2" flat outlined>
<v-text-field <v-text-field
v-model="search" v-model="search"
class="mt-6 search"
label="Pesquisar" label="Pesquisar"
hint="Nome/conta" prepend-inner-icon="mdi-account-search"
prepend-icon="mdi-account-search"
clearable clearable
outlined hide-details
rounded
style="max-width: 512px"
/> />
<v-tooltip bottom> <v-tooltip bottom>
@ -29,178 +25,178 @@
</template> </template>
</v-tooltip> </v-tooltip>
</v-toolbar> </v-toolbar>
<v-container fluid> <div v-if="stats" class="text-center my-4">
<div v-if="stats" class="text-center my-4"> <v-chip color="primary" class="mr-2" dark>
<v-chip color="primary" class="mr-2" dark> {{ stats.onlineUsers }}
{{ stats.onlineUsers }} </v-chip>
</v-chip> usuários online de
usuários online de <v-chip class="ml-2">
<v-chip class="ml-2"> {{ stats.totalUsers }}
{{ stats.totalUsers }} </v-chip>
</v-chip> </div>
</div> <v-data-iterator
<v-data-iterator :items="sortedWifiUsers"
:items="sortedWifiUsers" :loading="$apollo.queries.wifiUsers.loading"
:loading="$apollo.queries.wifiUsers.loading" >
:search="search" <template #default="{ items }">
> <v-expansion-panels>
<template #default="{ items }"> <v-expansion-panel v-for="user in items" :key="user.sAMAccountName">
<v-expansion-panels> <v-expansion-panel-header>
<v-expansion-panel v-for="user in items" :key="user.sAMAccountName"> <div style="width: 50px">
<v-expansion-panel-header> <avatar size="24" left :src="user.thumbnailPhoto" />
<div style="width: 50px"> {{ user.displayName }} ({{ user.sAMAccountName }})
<avatar size="24" left :src="user.thumbnailPhoto" /> </div>
{{ user.displayName }} ({{ user.sAMAccountName }}) <template #actions>
</div> <v-badge
<template #actions> class="mx-4"
color="grey darken-1"
bottom
offset-y="10"
:content="
user.wifiDevices
.filter(wifiDevice => wifiDevice.status != 'ONLINE')
.length.toString()
"
>
<v-badge <v-badge
class="mx-4" color="green darken-1"
color="grey darken-1" top
bottom
offset-y="10" offset-y="10"
:content=" :content="
user.wifiDevices user.wifiDevices
.filter(wifiDevice => wifiDevice.status != 'ONLINE') .filter(wifiDevice => wifiDevice.status == 'ONLINE')
.length.toString() .length.toString()
" "
> >
<v-badge <v-icon>mdi-cellphone-wireless</v-icon>
color="green darken-1"
top
offset-y="10"
:content="
user.wifiDevices
.filter(wifiDevice => wifiDevice.status == 'ONLINE')
.length.toString()
"
>
<v-icon>mdi-cellphone-wireless</v-icon>
</v-badge>
</v-badge> </v-badge>
</template> </v-badge>
</v-expansion-panel-header> </template>
<v-expansion-panel-content> </v-expansion-panel-header>
<v-expansion-panels accordion> <v-expansion-panel-content>
<v-expansion-panel <v-expansion-panels accordion>
v-for="device in user.wifiDevices" <v-expansion-panel
:key="device.mac" v-for="device in user.wifiDevices"
:key="device.mac"
>
<v-expansion-panel-header>
<div>
<v-icon
left
:color="device.status == 'ONLINE' ? 'green' : ''"
>
mdi-cellphone-wireless
</v-icon>
{{ device.hostname || device.mac }} {{ device.oui }}
</div>
</v-expansion-panel-header>
<v-expansion-panel-content>
<v-list dense>
<v-list-item v-if="device.status == 'ONLINE'">
<v-list-item-action>
<v-icon color="green darken-1">mdi-wifi</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.essid }}
</v-list-item-title>
<v-list-item-subtitle> SSID </v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item v-else>
<v-list-item-action>
<v-icon>mdi-wifi-off</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.essid }}
</v-list-item-title>
<v-list-item-subtitle>
Dispositivo off-line
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-access-point</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.apName }}
</v-list-item-title>
<v-list-item-subtitle>
Access Point ({{ device.controller }})
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-ip-network</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.ip }}
</v-list-item-title>
<v-list-item-subtitle>
Último endereço IP conhecido
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-expansion-card-variant</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.mac }}
</v-list-item-title>
<v-list-item-subtitle>
{{ device.oui }}
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-eye</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.lastSeen | dateAndTime }}
</v-list-item-title>
<v-list-item-subtitle>
Visto pela última vez
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-check-decagram</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.firstSeen | dateAndTime }}
</v-list-item-title>
<v-list-item-subtitle>
Visto pela primeira vez
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</v-list></v-expansion-panel-content
> >
<v-expansion-panel-header> </v-expansion-panel>
<div> </v-expansion-panels>
<v-icon </v-expansion-panel-content>
left </v-expansion-panel>
:color="device.status == 'ONLINE' ? 'green' : ''" </v-expansion-panels>
> </template>
mdi-cellphone-wireless </v-data-iterator>
</v-icon> <v-alert type="info" outlined dismissible>
{{ device.hostname || device.mac }} {{ device.oui }} São exibidos apenas os 100 primeiros resultados da pesquisa
</div> </v-alert>
</v-expansion-panel-header> </v-container>
<v-expansion-panel-content>
<v-list dense>
<v-list-item v-if="device.status == 'ONLINE'">
<v-list-item-action>
<v-icon color="green darken-1">mdi-wifi</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.essid }}
</v-list-item-title>
<v-list-item-subtitle> SSID </v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item v-else>
<v-list-item-action>
<v-icon>mdi-wifi-off</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.essid }}
</v-list-item-title>
<v-list-item-subtitle>
Dispositivo off-line
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-access-point</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.apName }}
</v-list-item-title>
<v-list-item-subtitle>
Access Point ({{ device.controller }})
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-ip-network</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.ip }}
</v-list-item-title>
<v-list-item-subtitle>
Último endereço IP conhecido
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-expansion-card-variant</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.mac }}
</v-list-item-title>
<v-list-item-subtitle>
{{ device.oui }}
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-eye</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.lastSeen | dateAndTime }}
</v-list-item-title>
<v-list-item-subtitle>
Visto pela última vez
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action>
<v-icon>mdi-check-decagram</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ device.firstSeen | dateAndTime }}
</v-list-item-title>
<v-list-item-subtitle>
Visto pela primeira vez
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</v-list></v-expansion-panel-content
>
</v-expansion-panel>
</v-expansion-panels>
</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
</template>
</v-data-iterator>
</v-container>
</div>
</template> </template>
<script> <script>
import gql from 'graphql-tag' import gql from 'graphql-tag'
@ -225,8 +221,8 @@ export default {
wifiUsers: { wifiUsers: {
fetchPolicy: 'cache-and-network', fetchPolicy: 'cache-and-network',
query: gql` query: gql`
query { query wifiUsers($search: String) {
wifiUsers { wifiUsers(search: $search) {
displayName displayName
sAMAccountName sAMAccountName
thumbnailPhoto thumbnailPhoto
@ -244,7 +240,12 @@ export default {
} }
} }
} }
` `,
variables() {
return {
search: this.search
}
}
}, },
stats: { stats: {
query: gql` query: gql`