98 lines
5.1 KiB
Vue
98 lines
5.1 KiB
Vue
|
<!--
|
||
|
This example requires some changes to your config:
|
||
|
|
||
|
```
|
||
|
// tailwind.config.js
|
||
|
module.exports = {
|
||
|
// ...
|
||
|
plugins: [
|
||
|
// ...
|
||
|
require('@tailwindcss/forms'),
|
||
|
],
|
||
|
}
|
||
|
```
|
||
|
-->
|
||
|
<template>
|
||
|
<div class="px-4 sm:px-6 lg:px-8">
|
||
|
<div class="sm:flex sm:items-center">
|
||
|
<div class="sm:flex-auto">
|
||
|
<h1 class="text-base font-semibold leading-6 text-gray-900">Users</h1>
|
||
|
<p class="mt-2 text-sm text-gray-700">A list of all the users in your account including their name, title, email and role.</p>
|
||
|
</div>
|
||
|
<div class="mt-4 sm:ml-16 sm:mt-0 sm:flex-none">
|
||
|
<button type="button" class="block rounded-md bg-indigo-600 px-3 py-1.5 text-center text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Add user</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="mt-8 flow-root">
|
||
|
<div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
|
||
|
<div class="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8">
|
||
|
<div class="relative">
|
||
|
<div v-if="selectedPeople.length > 0" class="absolute left-14 top-0 flex h-12 items-center space-x-3 bg-white sm:left-12">
|
||
|
<button type="button" class="inline-flex items-center rounded bg-white px-2 py-1 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-30 disabled:hover:bg-white">Bulk edit</button>
|
||
|
<button type="button" class="inline-flex items-center rounded bg-white px-2 py-1 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-30 disabled:hover:bg-white">Delete all</button>
|
||
|
</div>
|
||
|
<table class="min-w-full table-fixed divide-y divide-gray-300">
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th scope="col" class="relative px-7 sm:w-12 sm:px-6">
|
||
|
<input type="checkbox" class="absolute left-4 top-1/2 -mt-2 h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600" :checked="indeterminate || selectedPeople.length === people.length" :indeterminate="indeterminate" @change="selectedPeople = $event.target.checked ? people.map((p) => p.email) : []" />
|
||
|
</th>
|
||
|
<th scope="col" class="min-w-[12rem] py-3.5 pr-3 text-left text-sm font-semibold text-gray-900">Name</th>
|
||
|
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">Title</th>
|
||
|
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">Email</th>
|
||
|
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">Role</th>
|
||
|
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-3">
|
||
|
<span class="sr-only">Edit</span>
|
||
|
</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tbody class="divide-y divide-gray-200 bg-white">
|
||
|
<tr v-for="person in people" :key="person.email" :class="[selectedPeople.includes(person.email) && 'bg-gray-50']">
|
||
|
<td class="relative px-7 sm:w-12 sm:px-6">
|
||
|
<div v-if="selectedPeople.includes(person.email)" class="absolute inset-y-0 left-0 w-0.5 bg-indigo-600"></div>
|
||
|
<input type="checkbox" class="absolute left-4 top-1/2 -mt-2 h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600" :value="person.email" v-model="selectedPeople" />
|
||
|
</td>
|
||
|
<td :class="['whitespace-nowrap py-4 pr-3 text-sm font-medium', selectedPeople.includes(person.email) ? 'text-indigo-600' : 'text-gray-900']">
|
||
|
{{ person.name }}
|
||
|
</td>
|
||
|
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||
|
{{ person.title }}
|
||
|
</td>
|
||
|
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||
|
{{ person.email }}
|
||
|
</td>
|
||
|
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||
|
{{ person.role }}
|
||
|
</td>
|
||
|
<td class="whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-3">
|
||
|
<a href="#" class="text-indigo-600 hover:text-indigo-900">
|
||
|
Edit<span class="sr-only">, {{ person.name }}</span>
|
||
|
</a>
|
||
|
</td>
|
||
|
</tr>
|
||
|
</tbody>
|
||
|
</table>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script setup>
|
||
|
import { ref, computed } from 'vue'
|
||
|
|
||
|
const people = [
|
||
|
{
|
||
|
name: 'Lindsay Walton',
|
||
|
title: 'Front-end Developer',
|
||
|
email: 'lindsay.walton@example.com',
|
||
|
role: 'Member',
|
||
|
},
|
||
|
// More people...
|
||
|
]
|
||
|
|
||
|
const selectedPeople = ref([])
|
||
|
const checked = ref(false)
|
||
|
const indeterminate = computed(() => selectedPeople.value.length > 0 && selectedPeople.value.length < people.length)
|
||
|
</script>
|