154 lines
6.1 KiB
Vue
154 lines
6.1 KiB
Vue
<template>
|
|
<Dialog :open="open" @update:open="open = $event">
|
|
<DialogTrigger as-child>
|
|
<Button @click="open = true" size="sm" variant="default" class="bg-yellow-600 hover:bg-yellow-700 text-white">
|
|
<Edit class="mr-2 h-4 w-4" />
|
|
Edit
|
|
</Button>
|
|
</DialogTrigger>
|
|
|
|
<DialogContent class="max-h-[90vh] overflow-y-auto">
|
|
<DialogHeader>
|
|
<DialogTitle>Edit User</DialogTitle>
|
|
<DialogDescription> Edit data user. </DialogDescription>
|
|
</DialogHeader>
|
|
|
|
<form @submit.prevent="submit" class="grid gap-4 py-4">
|
|
<div class="flex flex-col gap-2">
|
|
<Label for="name">Nama Lengkap</Label>
|
|
<Input id="name" v-model="form.name" placeholder="Masukkan nama lengkap" />
|
|
<p v-if="form.errors.name" class="mt-1 text-sm text-red-500">
|
|
{{ form.errors.name }}
|
|
</p>
|
|
</div>
|
|
|
|
<div class="flex flex-col gap-2">
|
|
<Label for="email">Email</Label>
|
|
<Input id="email" v-model="form.email" type="email" placeholder="Masukkan email" />
|
|
<p v-if="form.errors.email" class="mt-1 text-sm text-red-500">
|
|
{{ form.errors.email }}
|
|
</p>
|
|
</div>
|
|
|
|
<div class="flex flex-col gap-2">
|
|
<Label for="role">Role</Label>
|
|
<Select v-model="form.role">
|
|
<SelectTrigger class="w-full">
|
|
<SelectValue placeholder="Pilih Role" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="user">User</SelectItem>
|
|
<SelectItem value="admin">Admin</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
<p v-if="form.errors.role" class="mt-1 text-sm text-red-500">
|
|
{{ form.errors.role }}
|
|
</p>
|
|
</div>
|
|
|
|
<div class="flex flex-col gap-2">
|
|
<Label for="password">Password</Label>
|
|
<div class="relative">
|
|
<Input id="password" :type="showPassword ? 'text' : 'password'" v-model="form.password" placeholder="Masukkan password" />
|
|
<Button
|
|
type="button"
|
|
variant="ghost"
|
|
class="absolute right-2 top-1/2 h-auto -translate-y-1/2 p-1"
|
|
@click="showPassword = !showPassword"
|
|
>
|
|
<Eye v-if="!showPassword" class="h-4 w-4" />
|
|
<EyeOff v-else class="h-4 w-4" />
|
|
</Button>
|
|
</div>
|
|
<p v-if="form.errors.password" class="mt-1 text-sm text-red-500">
|
|
{{ form.errors.password }}
|
|
</p>
|
|
</div>
|
|
|
|
<div class="flex flex-col gap-2">
|
|
<Label for="password_confirmation">Konfirmasi Password</Label>
|
|
<div class="relative">
|
|
<Input
|
|
id="password_confirmation"
|
|
:type="showPasswordConfirmation ? 'text' : 'password'"
|
|
v-model="form.password_confirmation"
|
|
placeholder="Konfirmasi password"
|
|
/>
|
|
<Button
|
|
type="button"
|
|
variant="ghost"
|
|
class="absolute right-2 top-1/2 h-auto -translate-y-1/2 p-1"
|
|
@click="showPasswordConfirmation = !showPasswordConfirmation"
|
|
>
|
|
<Eye v-if="!showPasswordConfirmation" class="h-4 w-4" />
|
|
<EyeOff v-else class="h-4 w-4" />
|
|
</Button>
|
|
</div>
|
|
<p v-if="form.errors.password_confirmation" class="mt-1 text-sm text-red-500">
|
|
{{ form.errors.password_confirmation }}
|
|
</p>
|
|
</div>
|
|
|
|
<div class="mt-6 flex justify-end space-x-2">
|
|
<Button type="button" variant="outline" @click="open = false">Batal</Button>
|
|
<Button type="submit" :disabled="form.processing">
|
|
{{ form.processing ? 'Menyimpan...' : 'Simpan User' }}
|
|
</Button>
|
|
</div>
|
|
</form>
|
|
</DialogContent>
|
|
</Dialog>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { Button } from '@/components/ui/button';
|
|
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
|
|
import { Input } from '@/components/ui/input';
|
|
import { Label } from '@/components/ui/label';
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
|
import { useForm } from '@inertiajs/vue3';
|
|
import { Edit, Eye, EyeOff, UserPlus } from 'lucide-vue-next';
|
|
import { computed, ref,watch } from 'vue';
|
|
|
|
|
|
const open = ref(false);
|
|
const showPassword = ref(false);
|
|
const showPasswordConfirmation = ref(false);
|
|
|
|
const props = defineProps<{
|
|
user: {
|
|
id: number;
|
|
name: string;
|
|
email: string;
|
|
role: string;
|
|
};
|
|
}>();
|
|
|
|
const form = useForm({
|
|
name: props.user.name || '',
|
|
email: props.user.email || '',
|
|
role: props.user.role || '',
|
|
password: '',
|
|
password_confirmation: '',
|
|
});
|
|
|
|
watch(open, (value) => {
|
|
if (value) {
|
|
form.name = props.user.name || '';
|
|
form.email = props.user.email || '';
|
|
form.role = props.user.role || '';
|
|
form.password = '';
|
|
form.password_confirmation = '';
|
|
form.clearErrors();
|
|
}
|
|
});
|
|
|
|
const submit = () => {
|
|
form.put(route('admin.users.update', props.user.id), {
|
|
preserveScroll: true,
|
|
onSuccess: () => {
|
|
open.value = false;
|
|
},
|
|
});
|
|
};
|
|
</script> |