{
+ const target = event.target as HTMLElement;
+ if (target.closest('[data-slot=select-content]') || target.closest('[data-slot=select-trigger]')) {
+ event.preventDefault();
+ }
+ }"
+ >
Filter
@@ -116,7 +130,7 @@ function resetFilters(): void {
-
+
Semua
diff --git a/resources/js/pages/admin/hr/employees/Index.vue b/resources/js/pages/admin/hr/employees/Index.vue
index d87bf15..31b8b10 100644
--- a/resources/js/pages/admin/hr/employees/Index.vue
+++ b/resources/js/pages/admin/hr/employees/Index.vue
@@ -18,8 +18,13 @@ const props = defineProps<{
search: string;
sort?: string;
direction?: 'asc' | 'desc';
+ role?: string;
+ gender?: string;
employment_status?: string;
+ is_active?: string;
};
+ roles: EnumOption[];
+ genders: EnumOption[];
employmentStatuses: EnumOption[];
}>();
@@ -29,22 +34,46 @@ const search = ref(props.filters.search ?? '');
const { query, setSearch, setSort, setFilter, resetFilters, syncFromServer } = useDataTableQuery({
url: '/admin/hr/employees',
initial: { ...props.filters },
- filterKeys: ['employment_status'],
+ filterKeys: ['role', 'gender', 'employment_status', 'is_active'],
});
useDataTableQuerySync(() => props.filters, syncFromServer);
const filterDefs = computed(() => [
+ {
+ key: 'role',
+ label: 'Role',
+ type: 'select',
+ options: props.roles,
+ },
+ {
+ key: 'gender',
+ label: 'Jenis Kelamin',
+ type: 'select',
+ options: props.genders,
+ },
{
key: 'employment_status',
label: 'Status Kepegawaian',
type: 'select',
options: props.employmentStatuses,
},
+ {
+ key: 'is_active',
+ label: 'Status Akun',
+ type: 'select',
+ options: [
+ { value: '1', label: 'Aktif' },
+ { value: '0', label: 'Nonaktif' },
+ ],
+ },
]);
const filterValues = computed(() => ({
+ role: query.value.role ?? '',
+ gender: query.value.gender ?? '',
employment_status: query.value.employment_status ?? '',
+ is_active: query.value.is_active ?? '',
}));
const currentSort = computed(() => {