From c5ec7b5afce56c511e5a2e9df9c4d5369c8db68e Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 9 Jun 2026 23:35:31 +0700 Subject: [PATCH] Add DataTable component with sorting and filtering capabilities, integrate HR sidebar link, and update package dependencies for @tanstack/vue-table. Introduce new UI components for alert dialogs and empty states. --- package-lock.json | 33 ++++ package.json | 1 + resources/js/components/AppSidebar.vue | 18 ++- .../js/components/data-table/DataTable.vue | 138 +++++++++++++++++ .../data-table/DataTableColumnHeader.vue | 51 ++++++ .../data-table/DataTableToolbar.vue | 146 ++++++++++++++++++ resources/js/components/data-table/index.ts | 3 + .../ui/alert-dialog/AlertDialog.vue | 15 ++ .../ui/alert-dialog/AlertDialogAction.vue | 18 +++ .../ui/alert-dialog/AlertDialogCancel.vue | 25 +++ .../ui/alert-dialog/AlertDialogContent.vue | 44 ++++++ .../alert-dialog/AlertDialogDescription.vue | 23 +++ .../ui/alert-dialog/AlertDialogFooter.vue | 22 +++ .../ui/alert-dialog/AlertDialogHeader.vue | 17 ++ .../ui/alert-dialog/AlertDialogTitle.vue | 21 +++ .../ui/alert-dialog/AlertDialogTrigger.vue | 12 ++ .../js/components/ui/alert-dialog/index.ts | 9 ++ resources/js/components/ui/badge/Badge.vue | 26 ++++ resources/js/components/ui/badge/index.ts | 26 ++++ resources/js/components/ui/empty/Empty.vue | 20 +++ .../js/components/ui/empty/EmptyContent.vue | 20 +++ .../components/ui/empty/EmptyDescription.vue | 20 +++ .../js/components/ui/empty/EmptyHeader.vue | 20 +++ .../js/components/ui/empty/EmptyMedia.vue | 21 +++ .../js/components/ui/empty/EmptyTitle.vue | 17 ++ resources/js/components/ui/empty/index.ts | 26 ++++ .../phone-number-input/PhoneNumberInput.vue | 38 +++++ .../components/ui/phone-number-input/index.ts | 1 + .../js/components/ui/popover/Popover.vue | 19 +++ .../components/ui/popover/PopoverAnchor.vue | 15 ++ .../components/ui/popover/PopoverContent.vue | 45 ++++++ .../components/ui/popover/PopoverTrigger.vue | 15 ++ resources/js/components/ui/popover/index.ts | 4 + .../components/ui/radio-group/RadioGroup.vue | 25 +++ .../ui/radio-group/RadioGroupItem.vue | 40 +++++ .../js/components/ui/radio-group/index.ts | 2 + .../ui/rupiah-input/RupiahInput.vue | 45 ++++++ .../js/components/ui/rupiah-input/index.ts | 1 + resources/js/components/ui/select/Select.vue | 19 +++ .../js/components/ui/select/SelectContent.vue | 51 ++++++ .../js/components/ui/select/SelectGroup.vue | 15 ++ .../js/components/ui/select/SelectItem.vue | 44 ++++++ .../components/ui/select/SelectItemText.vue | 15 ++ .../js/components/ui/select/SelectLabel.vue | 17 ++ .../ui/select/SelectScrollDownButton.vue | 26 ++++ .../ui/select/SelectScrollUpButton.vue | 26 ++++ .../components/ui/select/SelectSeparator.vue | 19 +++ .../js/components/ui/select/SelectTrigger.vue | 33 ++++ .../js/components/ui/select/SelectValue.vue | 15 ++ resources/js/components/ui/select/index.ts | 11 ++ resources/js/components/ui/table/Table.vue | 16 ++ .../js/components/ui/table/TableBody.vue | 17 ++ .../js/components/ui/table/TableCaption.vue | 17 ++ .../js/components/ui/table/TableCell.vue | 22 +++ .../js/components/ui/table/TableEmpty.vue | 34 ++++ .../js/components/ui/table/TableFooter.vue | 17 ++ .../js/components/ui/table/TableHead.vue | 17 ++ .../js/components/ui/table/TableHeader.vue | 17 ++ resources/js/components/ui/table/TableRow.vue | 17 ++ resources/js/components/ui/table/index.ts | 9 ++ resources/js/components/ui/table/utils.ts | 10 ++ .../js/components/ui/textarea/Textarea.vue | 28 ++++ resources/js/components/ui/textarea/index.ts | 1 + resources/js/composables/useDataTableQuery.ts | 85 ++++++++++ resources/js/lib/phone-number.ts | 23 +++ resources/js/lib/rupiah.ts | 13 ++ resources/js/types/data-table.ts | 31 ++++ resources/js/types/employee.ts | 60 +++++++ 68 files changed, 1766 insertions(+), 1 deletion(-) create mode 100644 resources/js/components/data-table/DataTable.vue create mode 100644 resources/js/components/data-table/DataTableColumnHeader.vue create mode 100644 resources/js/components/data-table/DataTableToolbar.vue create mode 100644 resources/js/components/data-table/index.ts create mode 100644 resources/js/components/ui/alert-dialog/AlertDialog.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogAction.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogCancel.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogContent.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogDescription.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogFooter.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogHeader.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogTitle.vue create mode 100644 resources/js/components/ui/alert-dialog/AlertDialogTrigger.vue create mode 100644 resources/js/components/ui/alert-dialog/index.ts create mode 100644 resources/js/components/ui/badge/Badge.vue create mode 100644 resources/js/components/ui/badge/index.ts create mode 100644 resources/js/components/ui/empty/Empty.vue create mode 100644 resources/js/components/ui/empty/EmptyContent.vue create mode 100644 resources/js/components/ui/empty/EmptyDescription.vue create mode 100644 resources/js/components/ui/empty/EmptyHeader.vue create mode 100644 resources/js/components/ui/empty/EmptyMedia.vue create mode 100644 resources/js/components/ui/empty/EmptyTitle.vue create mode 100644 resources/js/components/ui/empty/index.ts create mode 100644 resources/js/components/ui/phone-number-input/PhoneNumberInput.vue create mode 100644 resources/js/components/ui/phone-number-input/index.ts create mode 100644 resources/js/components/ui/popover/Popover.vue create mode 100644 resources/js/components/ui/popover/PopoverAnchor.vue create mode 100644 resources/js/components/ui/popover/PopoverContent.vue create mode 100644 resources/js/components/ui/popover/PopoverTrigger.vue create mode 100644 resources/js/components/ui/popover/index.ts create mode 100644 resources/js/components/ui/radio-group/RadioGroup.vue create mode 100644 resources/js/components/ui/radio-group/RadioGroupItem.vue create mode 100644 resources/js/components/ui/radio-group/index.ts create mode 100644 resources/js/components/ui/rupiah-input/RupiahInput.vue create mode 100644 resources/js/components/ui/rupiah-input/index.ts create mode 100644 resources/js/components/ui/select/Select.vue create mode 100644 resources/js/components/ui/select/SelectContent.vue create mode 100644 resources/js/components/ui/select/SelectGroup.vue create mode 100644 resources/js/components/ui/select/SelectItem.vue create mode 100644 resources/js/components/ui/select/SelectItemText.vue create mode 100644 resources/js/components/ui/select/SelectLabel.vue create mode 100644 resources/js/components/ui/select/SelectScrollDownButton.vue create mode 100644 resources/js/components/ui/select/SelectScrollUpButton.vue create mode 100644 resources/js/components/ui/select/SelectSeparator.vue create mode 100644 resources/js/components/ui/select/SelectTrigger.vue create mode 100644 resources/js/components/ui/select/SelectValue.vue create mode 100644 resources/js/components/ui/select/index.ts create mode 100644 resources/js/components/ui/table/Table.vue create mode 100644 resources/js/components/ui/table/TableBody.vue create mode 100644 resources/js/components/ui/table/TableCaption.vue create mode 100644 resources/js/components/ui/table/TableCell.vue create mode 100644 resources/js/components/ui/table/TableEmpty.vue create mode 100644 resources/js/components/ui/table/TableFooter.vue create mode 100644 resources/js/components/ui/table/TableHead.vue create mode 100644 resources/js/components/ui/table/TableHeader.vue create mode 100644 resources/js/components/ui/table/TableRow.vue create mode 100644 resources/js/components/ui/table/index.ts create mode 100644 resources/js/components/ui/table/utils.ts create mode 100644 resources/js/components/ui/textarea/Textarea.vue create mode 100644 resources/js/components/ui/textarea/index.ts create mode 100644 resources/js/composables/useDataTableQuery.ts create mode 100644 resources/js/lib/phone-number.ts create mode 100644 resources/js/lib/rupiah.ts create mode 100644 resources/js/types/data-table.ts create mode 100644 resources/js/types/employee.ts diff --git a/package-lock.json b/package-lock.json index dfa0ef9..e5738d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "@inertiajs/vue3": "^3.0.0", "@lucide/vue": "^1.17.0", "@tailwindcss/vite": "^4.1.11", + "@tanstack/vue-table": "^8.21.3", "@vitejs/plugin-vue": "^6.0.0", "@vueuse/core": "^14.3.0", "class-variance-authority": "^0.7.1", @@ -1202,6 +1203,19 @@ "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tanstack/virtual-core": { "version": "3.17.0", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.0.tgz", @@ -1212,6 +1226,25 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, + "node_modules/@tanstack/vue-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/vue-table/-/vue-table-8.21.3.tgz", + "integrity": "sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": ">=3.2" + } + }, "node_modules/@tanstack/vue-virtual": { "version": "3.13.28", "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.28.tgz", diff --git a/package.json b/package.json index c521657..f9211bb 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@inertiajs/vue3": "^3.0.0", "@lucide/vue": "^1.17.0", "@tailwindcss/vite": "^4.1.11", + "@tanstack/vue-table": "^8.21.3", "@vitejs/plugin-vue": "^6.0.0", "@vueuse/core": "^14.3.0", "class-variance-authority": "^0.7.1", diff --git a/resources/js/components/AppSidebar.vue b/resources/js/components/AppSidebar.vue index 6ad3e3f..1d11bcb 100644 --- a/resources/js/components/AppSidebar.vue +++ b/resources/js/components/AppSidebar.vue @@ -1,6 +1,6 @@