From dd99358f8fb33e70dfb72ad01df684713265b876 Mon Sep 17 00:00:00 2001
From: vx3r <vx3r@127-0-0-1.fr>
Date: Thu, 30 Apr 2020 17:11:23 +0900
Subject: [PATCH] issue #27 #38 clients list view and search

---
 auth/oauth2oidc/oauth2oidc.go |   9 -
 ui/src/components/Clients.vue | 316 +++++++++++++++++++++-------------
 2 files changed, 193 insertions(+), 132 deletions(-)

diff --git a/auth/oauth2oidc/oauth2oidc.go b/auth/oauth2oidc/oauth2oidc.go
index b50444a..6976800 100644
--- a/auth/oauth2oidc/oauth2oidc.go
+++ b/auth/oauth2oidc/oauth2oidc.go
@@ -74,15 +74,6 @@ func (o *Oauth2idc) UserInfo(oauth2Token *oauth2.Token) (*model.User, error) {
 		return nil, err
 	}
 
-	type UserInfo struct {
-		Subject       string `json:"sub"`
-		Profile       string `json:"profile"`
-		Email         string `json:"email"`
-		EmailVerified bool   `json:"email_verified"`
-
-		claims []byte
-	}
-
 	// ID Token payload is just JSON
 	var claims map[string]interface{}
 	if err := userInfo.Claims(&claims); err != nil {
diff --git a/ui/src/components/Clients.vue b/ui/src/components/Clients.vue
index 57cd215..6d16b75 100644
--- a/ui/src/components/Clients.vue
+++ b/ui/src/components/Clients.vue
@@ -1,136 +1,195 @@
 <template>
     <v-container>
-        <v-row>
-            <v-col cols="12">
-                <v-card dark>
-                    <v-list-item>
-                        <v-list-item-content>
-                            <v-list-item-title class="headline">Clients</v-list-item-title>
-                        </v-list-item-content>
-                        <v-btn
-                                color="success"
-                                @click="startCreate"
-                        >
-                            Add new client
-                            <v-icon right dark>mdi-account-multiple-plus-outline</v-icon>
-                        </v-btn>
-                    </v-list-item>
+        <v-card>
+            <v-card-title>
+                Clients
+                <v-switch
+                        class="ml-3"
+                        dark
+                        :label="listView ? 'Switch to card view' : 'Switch to list view'"
+                        v-model="listView"
+                />
+                <v-spacer></v-spacer>
+                <v-text-field
+                        v-if="listView"
+                        v-model="search"
+                        append-icon="mdi-magnify"
+                        label="Search"
+                        single-line
+                        hide-details
+                ></v-text-field>
+            </v-card-title>
+            <v-data-table
+                    v-if="listView"
+                    :headers="headers"
+                    :items="clients"
+                    :search="search"
+            >
+                <template v-slot:item.address="{ item }">
+                    <v-chip
+                            v-for="(ip, i) in item.address"
+                            :key="i"
+                            color="indigo"
+                            text-color="white"
+                    >
+                        <v-icon left>mdi-ip-network</v-icon>
+                        {{ ip }}
+                    </v-chip>
+                </template>
+                <template v-slot:item.created="{ item }">
                     <v-row>
-                        <v-col
-                                v-for="(client, i) in clients"
-                                :key="i"
-                                sm12 lg6
+                        <p>At {{ item.created | formatDate }} by {{ item.createdBy }}</p>
+                    </v-row>
+                </template>
+                <template v-slot:item.updated="{ item }">
+                    <v-row>
+                        <p>At {{ item.updated | formatDate }} by {{ item.updatedBy }}</p>
+                    </v-row>
+                </template>
+                <template v-slot:item.action="{ item }">
+                    <v-icon
+                            class="pr-1 pl-1"
+                            @click.stop="startUpdate(item)"
+                    >
+                        mdi-square-edit-outline
+                    </v-icon>
+                    <v-icon
+                            class="pr-1 pl-1"
+                            @click.stop="forceFileDownload(item)"
+                    >
+                        mdi-cloud-download-outline
+                    </v-icon>
+                    <v-icon
+                            class="pr-1 pl-1"
+                            @click.stop="email(item)"
+                    >
+                        mdi-email-send-outline
+                    </v-icon>
+                    <v-icon
+                            class="pr-1 pl-1"
+                            @click="remove(item)"
+                    >
+                        mdi-trash-can-outline
+                    </v-icon>
+                </template>
+
+            </v-data-table>
+            <v-card-text v-else>
+                <v-row>
+                    <v-col
+                            v-for="(client, i) in clients"
+                            :key="i"
+                            sm12 lg6
+                    >
+                        <v-card
+                                :color="client.enable ? '#1F7087' : 'warning'"
+                                class="mx-auto"
+                                raised
+                                shaped
                         >
-                            <v-card
-                                    :color="client.enable ? '#1F7087' : 'warning'"
-                                    class="mx-auto"
-                                    raised
-                                    shaped
-                            >
-                                <v-list-item>
-                                    <v-list-item-content>
-                                        <v-list-item-title class="headline">{{ client.name }}</v-list-item-title>
-                                        <v-list-item-subtitle>{{ client.email }}</v-list-item-subtitle>
-                                        <v-list-item-subtitle>Created: {{ client.created | formatDate }} by {{ client.createdBy }}</v-list-item-subtitle>
-                                        <v-list-item-subtitle>Updated: {{ client.updated | formatDate }} by {{ client.updatedBy }}</v-list-item-subtitle>
-                                    </v-list-item-content>
+                            <v-list-item>
+                                <v-list-item-content>
+                                    <v-list-item-title class="headline">{{ client.name }}</v-list-item-title>
+                                    <v-list-item-subtitle>{{ client.email }}</v-list-item-subtitle>
+                                    <v-list-item-subtitle>Created: {{ client.created | formatDate }} by {{ client.createdBy }}</v-list-item-subtitle>
+                                    <v-list-item-subtitle>Updated: {{ client.updated | formatDate }} by {{ client.updatedBy }}</v-list-item-subtitle>
+                                </v-list-item-content>
 
-                                    <v-list-item-avatar
-                                            tile
-                                            size="150"
-                                    >
-                                        <v-img :src="'data:image/png;base64, ' + getClientQrcode(client.id)"/>
-                                    </v-list-item-avatar>
-                                </v-list-item>
+                                <v-list-item-avatar
+                                        tile
+                                        size="150"
+                                >
+                                    <v-img :src="'data:image/png;base64, ' + getClientQrcode(client.id)"/>
+                                </v-list-item-avatar>
+                            </v-list-item>
 
-                                <v-card-text class="text--primary">
-                                    <v-chip
-                                            v-for="(ip, i) in client.address"
-                                            :key="i"
-                                            color="indigo"
-                                            text-color="white"
-                                    >
-                                        <v-icon left>mdi-ip-network</v-icon>
-                                        {{ ip }}
-                                    </v-chip>
-                                </v-card-text>
-                                <v-card-actions>
-                                    <v-tooltip bottom>
-                                        <template v-slot:activator="{ on }">
-                                            <v-btn
-                                                    text
-                                                    v-on:click="forceFileDownload(client)"
-                                                    v-on="on"
-                                            >
-                                                <span class="d-none d-lg-flex">Download</span>
-                                                <v-icon right dark>mdi-cloud-download-outline</v-icon>
-                                            </v-btn>
-                                        </template>
-                                        <span>Download</span>
-                                    </v-tooltip>
+                            <v-card-text class="text--primary">
+                                <v-chip
+                                        v-for="(ip, i) in client.address"
+                                        :key="i"
+                                        color="indigo"
+                                        text-color="white"
+                                >
+                                    <v-icon left>mdi-ip-network</v-icon>
+                                    {{ ip }}
+                                </v-chip>
+                            </v-card-text>
+                            <v-card-actions>
+                                <v-tooltip bottom>
+                                    <template v-slot:activator="{ on }">
+                                        <v-btn
+                                                text
+                                                v-on:click="forceFileDownload(client)"
+                                                v-on="on"
+                                        >
+                                            <span class="d-none d-lg-flex">Download</span>
+                                            <v-icon right dark>mdi-cloud-download-outline</v-icon>
+                                        </v-btn>
+                                    </template>
+                                    <span>Download</span>
+                                </v-tooltip>
 
-                                    <v-tooltip bottom>
-                                        <template v-slot:activator="{ on }">
-                                            <v-btn
-                                                    text
-                                                    @click.stop="startUpdate(client)"
-                                                    v-on="on"
-                                            >
-                                                <span class="d-none d-lg-flex">Edit</span>
-                                                <v-icon right dark>mdi-square-edit-outline</v-icon>
-                                            </v-btn>
-                                        </template>
-                                        <span>Edit</span>
-                                    </v-tooltip>
+                                <v-tooltip bottom>
+                                    <template v-slot:activator="{ on }">
+                                        <v-btn
+                                                text
+                                                @click.stop="startUpdate(client)"
+                                                v-on="on"
+                                        >
+                                            <span class="d-none d-lg-flex">Edit</span>
+                                            <v-icon right dark>mdi-square-edit-outline</v-icon>
+                                        </v-btn>
+                                    </template>
+                                    <span>Edit</span>
+                                </v-tooltip>
 
-                                    <v-tooltip bottom>
-                                        <template v-slot:activator="{ on }">
-                                            <v-btn
-                                                    text
-                                                    @click="remove(client)"
-                                                    v-on="on"
-                                            >
-                                                <span class="d-none d-lg-flex">Delete</span>
-                                                <v-icon right dark>mdi-trash-can-outline</v-icon>
-                                            </v-btn>
-                                        </template>
-                                        <span>Delete</span>
-                                    </v-tooltip>
+                                <v-tooltip bottom>
+                                    <template v-slot:activator="{ on }">
+                                        <v-btn
+                                                text
+                                                @click="remove(client)"
+                                                v-on="on"
+                                        >
+                                            <span class="d-none d-lg-flex">Delete</span>
+                                            <v-icon right dark>mdi-trash-can-outline</v-icon>
+                                        </v-btn>
+                                    </template>
+                                    <span>Delete</span>
+                                </v-tooltip>
 
-                                    <v-tooltip bottom>
-                                        <template v-slot:activator="{ on }">
-                                            <v-btn
-                                                    text
-                                                    @click="email(client)"
-                                                    v-on="on"
-                                            >
-                                                <span class="d-none d-lg-flex">Send Email</span>
-                                                <v-icon right dark>mdi-email-send-outline</v-icon>
-                                            </v-btn>
-                                        </template>
-                                        <span>Send Email</span>
-                                    </v-tooltip>
-                                    <v-spacer/>
-                                    <v-tooltip right>
-                                        <template v-slot:activator="{ on }">
-                                            <v-switch
-                                                    dark
-                                                    v-on="on"
-                                                    color="success"
-                                                    v-model="client.enable"
-                                                    v-on:change="update(client)"
-                                            />
-                                        </template>
-                                        <span> {{client.enable ? 'Disable' : 'Enable'}} this client</span>
-                                    </v-tooltip>
+                                <v-tooltip bottom>
+                                    <template v-slot:activator="{ on }">
+                                        <v-btn
+                                                text
+                                                @click="email(client)"
+                                                v-on="on"
+                                        >
+                                            <span class="d-none d-lg-flex">Send Email</span>
+                                            <v-icon right dark>mdi-email-send-outline</v-icon>
+                                        </v-btn>
+                                    </template>
+                                    <span>Send Email</span>
+                                </v-tooltip>
+                                <v-spacer/>
+                                <v-tooltip right>
+                                    <template v-slot:activator="{ on }">
+                                        <v-switch
+                                                dark
+                                                v-on="on"
+                                                color="success"
+                                                v-model="client.enable"
+                                                v-on:change="update(client)"
+                                        />
+                                    </template>
+                                    <span> {{client.enable ? 'Disable' : 'Enable'}} this client</span>
+                                </v-tooltip>
 
-                                </v-card-actions>
-                            </v-card>
-                        </v-col>
-                    </v-row>
-                </v-card>
-            </v-col>
-        </v-row>
+                            </v-card-actions>
+                        </v-card>
+                    </v-col>
+                </v-row>
+            </v-card-text>
+        </v-card>
         <v-dialog
                 v-if="client"
                 v-model="dialogCreate"
@@ -332,10 +391,21 @@
     name: 'Clients',
 
     data: () => ({
+      listView: false,
       dialogCreate: false,
       dialogUpdate: false,
       client: null,
       valid: false,
+      search: '',
+      headers: [
+        { text: 'Name', value: 'name', },
+        { text: 'Email', value: 'email', },
+        { text: 'IP addresses', value: 'address', },
+        { text: 'Created', value: 'created', sortable: false, },
+        { text: 'Updated', value: 'updated', sortable: false, },
+        { text: 'Actions', value: 'action', sortable: false, },
+
+      ],
     }),
 
     computed:{
-- 
GitLab