From 26eaaf6d6601e2a6a8635c746f3440f914bd45ef Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 22 Apr 2026 20:26:20 +0700 Subject: [PATCH] feat: enhance UI consistency by adding consistent icons to action buttons and loaders to save operations across admin modules --- .../js/pages/admin/finance/expense/index.tsx | 22 +++++++++--- .../expense/partials/expense-form-modal.tsx | 10 ++++-- .../js/pages/admin/finance/payroll/index.tsx | 22 +++++++++--- .../payroll/partials/payroll-form-modal.tsx | 14 +++++--- .../js/pages/admin/manage/order/create.tsx | 32 +++++++++++------ .../js/pages/admin/manage/order/edit.tsx | 23 ++++++++---- .../js/pages/admin/manage/order/index.tsx | 24 +++++++++---- .../js/pages/admin/manage/purchase/create.tsx | 14 ++++---- .../js/pages/admin/manage/purchase/edit.tsx | 14 ++++---- .../js/pages/admin/master/category/index.tsx | 22 +++++++++--- .../category/partials/category-form-modal.tsx | 9 +++-- .../js/pages/admin/master/product/create.tsx | 8 +++-- .../js/pages/admin/master/product/edit.tsx | 8 +++-- .../js/pages/admin/master/product/index.tsx | 22 +++++++++--- .../js/pages/admin/master/user/create.tsx | 5 ++- resources/js/pages/admin/master/user/edit.tsx | 3 ++ .../js/pages/admin/master/user/index.tsx | 36 ++++++++++++++----- .../js/pages/admin/system/settings/index.tsx | 7 ++-- 18 files changed, 209 insertions(+), 86 deletions(-) diff --git a/resources/js/pages/admin/finance/expense/index.tsx b/resources/js/pages/admin/finance/expense/index.tsx index 138cff4..fdc8182 100644 --- a/resources/js/pages/admin/finance/expense/index.tsx +++ b/resources/js/pages/admin/finance/expense/index.tsx @@ -2,7 +2,7 @@ import { Head } from '@inertiajs/react'; import type { Expense } from '@/types'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; -import { Trash2, X } from 'lucide-react'; +import { Trash2, X, Plus } from 'lucide-react'; import { DataTable } from '@/components/data-table'; import { AlertDialog, @@ -55,7 +55,8 @@ export default function ExpenseIndex({ expenses }: { expenses: Expense[] }) {

Pengeluaran

- @@ -119,8 +120,14 @@ export default function ExpenseIndex({ expenses }: { expenses: Expense[] }) { - Batal - Hapus + + + Batal + + + + Hapus + @@ -138,11 +145,16 @@ export default function ExpenseIndex({ expenses }: { expenses: Expense[] }) { - Batal + + + Batal + + Hapus diff --git a/resources/js/pages/admin/finance/expense/partials/expense-form-modal.tsx b/resources/js/pages/admin/finance/expense/partials/expense-form-modal.tsx index a2641f9..7504bc3 100644 --- a/resources/js/pages/admin/finance/expense/partials/expense-form-modal.tsx +++ b/resources/js/pages/admin/finance/expense/partials/expense-form-modal.tsx @@ -15,7 +15,7 @@ import { useEffect, useState, useRef } from 'react'; import expenseRoutes from '@/routes/expense'; import { toast } from 'sonner'; import { NumericFormat } from 'react-number-format'; -import { ImagePlus, X } from 'lucide-react'; +import { ImagePlus, X, Save, Loader } from 'lucide-react'; interface ExpenseFormModalProps { isOpen: boolean; @@ -183,8 +183,12 @@ export function ExpenseFormModal({ isOpen, onClose, expense }: ExpenseFormModalP - - + diff --git a/resources/js/pages/admin/finance/payroll/index.tsx b/resources/js/pages/admin/finance/payroll/index.tsx index 4d05d4b..5b4b927 100644 --- a/resources/js/pages/admin/finance/payroll/index.tsx +++ b/resources/js/pages/admin/finance/payroll/index.tsx @@ -2,7 +2,7 @@ import { Head } from '@inertiajs/react'; import type { Payroll } from '@/types'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; -import { Trash2 } from 'lucide-react'; +import { Trash2, Sparkles, Plus, X } from 'lucide-react'; import { DataTable } from '@/components/data-table'; import { AlertDialog, @@ -60,7 +60,8 @@ export default function PayrollIndex({

Penggajian

- @@ -158,8 +159,14 @@ export default function PayrollIndex({ - Batal - Hapus + + + Batal + + + + Hapus + @@ -177,11 +184,16 @@ export default function PayrollIndex({ - Batal + + + Batal + + Hapus diff --git a/resources/js/pages/admin/finance/payroll/partials/payroll-form-modal.tsx b/resources/js/pages/admin/finance/payroll/partials/payroll-form-modal.tsx index d057c21..6a15f36 100644 --- a/resources/js/pages/admin/finance/payroll/partials/payroll-form-modal.tsx +++ b/resources/js/pages/admin/finance/payroll/partials/payroll-form-modal.tsx @@ -16,10 +16,11 @@ import { useForm } from '@inertiajs/react'; import { useEffect } from 'react'; import payrollRoutes from '@/routes/payroll'; import { toast } from 'sonner'; -import { Plus, Trash2 } from 'lucide-react'; +import { Loader, Plus, Trash2 } from 'lucide-react'; import { NumericFormat } from 'react-number-format'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Empty, EmptyDescription, EmptyHeader, EmptyTitle } from '@/components/ui/empty'; +import { X, Save } from 'lucide-react'; interface PayrollFormModalProps { isOpen: boolean; @@ -96,7 +97,8 @@ export function PayrollFormModal({ isOpen, onClose, payroll }: PayrollFormModalP

Bonus & Potongan

-
@@ -180,8 +182,12 @@ export function PayrollFormModal({ isOpen, onClose, payroll }: PayrollFormModalP - - + diff --git a/resources/js/pages/admin/manage/order/create.tsx b/resources/js/pages/admin/manage/order/create.tsx index 4e07da1..dc9f8f0 100644 --- a/resources/js/pages/admin/manage/order/create.tsx +++ b/resources/js/pages/admin/manage/order/create.tsx @@ -9,7 +9,7 @@ import React, { useMemo, useState } from 'react'; import { toast } from 'sonner'; import { Product, ProductPrice } from '@/types'; import { OrderItem } from '@/types/order'; -import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X, Tag } from 'lucide-react'; +import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X, Tag, ArrowLeft, Check, Loader, Save } from 'lucide-react'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { format } from 'date-fns'; import { cn } from '@/lib/utils'; @@ -66,8 +66,8 @@ export default function OrderCreate({ products, cartItems, orderStatus, orderCha const { data, setData, post, processing, errors, transform } = useForm({ invoice_number: '', customer_name: '', - discount: '', - payment: '', + discount: 0, + payment: 0, payment_method: 'cash', order_status: 'delivered', order_channel: 'store', @@ -181,8 +181,8 @@ export default function OrderCreate({ products, cartItems, orderStatus, orderCha return cartItems.reduce((acc, item) => acc + item.total, 0); }, [cartItems]); - const total = subtotal - data.discount; - const change = data.payment - total; + const total = subtotal - (Number(data.discount) || 0); + const change = (Number(data.payment) || 0) - total; const cartTotalItems = cartItems.reduce((a, i) => a + i.qty, 0); const PriceTypeLabel = ({ type }: { type: string }) => { @@ -365,7 +365,7 @@ export default function OrderCreate({ products, cartItems, orderStatus, orderCha autoComplete='off' /> - {change >= 0 && data.payment > 0 && ( + {change >= 0 && (Number(data.payment) || 0) > 0 && (
Kembalian Rp {change.toLocaleString('id-ID')} @@ -383,8 +383,9 @@ export default function OrderCreate({ products, cartItems, orderStatus, orderCha } }} > - - {processing ? 'Menyimpan...' : 'Checkout Pesanan'} + {processing ? : } + {processing ? 'Menyimpan...' : 'Simpan'}
@@ -397,7 +398,10 @@ export default function OrderCreate({ products, cartItems, orderStatus, orderCha

Tambah Pesanan

- +
@@ -616,8 +620,14 @@ export default function OrderCreate({ products, cartItems, orderStatus, orderCha /> - - + + diff --git a/resources/js/pages/admin/manage/order/edit.tsx b/resources/js/pages/admin/manage/order/edit.tsx index 5cae9ce..fae05bc 100644 --- a/resources/js/pages/admin/manage/order/edit.tsx +++ b/resources/js/pages/admin/manage/order/edit.tsx @@ -9,7 +9,7 @@ import React, { useMemo, useState } from 'react'; import { toast } from 'sonner'; import { Product, ProductPrice } from '@/types'; import { Order, OrderItem } from '@/types/order'; -import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X, Tag } from 'lucide-react'; +import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X, Tag, ArrowLeft, Check, Save, Loader } from 'lucide-react'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { format } from 'date-fns'; import { cn } from '@/lib/utils'; @@ -371,7 +371,7 @@ export default function OrderEdit({ order, products, orderStatus, orderChannels, @@ -393,7 +393,10 @@ export default function OrderEdit({ order, products, orderStatus, orderChannels,

Ubah Pesanan

- +
@@ -603,8 +606,14 @@ export default function OrderEdit({ order, products, orderStatus, orderChannels, /> - - + + diff --git a/resources/js/pages/admin/manage/order/index.tsx b/resources/js/pages/admin/manage/order/index.tsx index 7aa2330..2bb1e2a 100644 --- a/resources/js/pages/admin/manage/order/index.tsx +++ b/resources/js/pages/admin/manage/order/index.tsx @@ -3,7 +3,7 @@ import { useCallback } from 'react'; import type { Order } from '@/types/order'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; -import { Trash2, ShoppingBag, Printer, Bluetooth, Usb, Unplug } from 'lucide-react'; +import { Trash2, ShoppingBag, Printer, Bluetooth, Usb, Unplug, Plus, X, ArrowLeft } from 'lucide-react'; import { DataTable } from '@/components/data-table'; import { DropdownMenu, @@ -184,7 +184,8 @@ export default function OrderIndex({ orders }: { orders: Order[] }) { - @@ -220,14 +221,20 @@ export default function OrderIndex({ orders }: { orders: Order[] }) { - Hapus data pesanan? + Hapus pesanan? Tindakan ini tidak dapat dibatalkan. Data pesanan dengan nomor invoice {orderToDelete?.invoice_number} akan dihapus secara permanen dan stok akan dikembalikan. - Batal - Hapus + + + Batal + + + + Hapus + @@ -245,11 +252,16 @@ export default function OrderIndex({ orders }: { orders: Order[] }) { - Batal + + + Batal + + Hapus diff --git a/resources/js/pages/admin/manage/purchase/create.tsx b/resources/js/pages/admin/manage/purchase/create.tsx index e8791f9..0f1f52d 100644 --- a/resources/js/pages/admin/manage/purchase/create.tsx +++ b/resources/js/pages/admin/manage/purchase/create.tsx @@ -8,7 +8,7 @@ import purchaseRoutes from '@/routes/purchase'; import React, { useMemo, useState } from 'react'; import { toast } from 'sonner'; import { Product, ProductPrice } from '@/types'; -import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X } from 'lucide-react'; +import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X, Loader, Save } from 'lucide-react'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Calendar } from '@/components/ui/calendar'; import { format } from 'date-fns'; @@ -300,8 +300,8 @@ export default function PurchaseCreate({ products, cartItems }: { products: Prod } }} > - - {processing ? 'Menyimpan...' : 'Checkout Belanja'} + {processing ? : } + {processing ? 'Menyimpan...' : 'Simpan'} @@ -593,8 +593,8 @@ export default function PurchaseCreate({ products, cartItems }: { products: Prod className="w-full h-10 font-semibold shadow" disabled={processing || cartItems.length === 0} > - - {processing ? 'Menyimpan...' : 'Checkout Belanja'} + {processing ? : } + {processing ? 'Menyimpan...' : 'Simpan'} @@ -769,8 +769,8 @@ export default function PurchaseCreate({ products, cartItems }: { products: Prod disabled={processing || cartItems.length === 0} onClick={() => onSubmit({ preventDefault: () => { } } as any)} > - - {processing ? 'Menyimpan...' : 'Checkout Belanja'} + {processing ? : } + {processing ? 'Menyimpan...' : 'Simpan'} diff --git a/resources/js/pages/admin/manage/purchase/edit.tsx b/resources/js/pages/admin/manage/purchase/edit.tsx index bc02113..e697ede 100644 --- a/resources/js/pages/admin/manage/purchase/edit.tsx +++ b/resources/js/pages/admin/manage/purchase/edit.tsx @@ -8,7 +8,7 @@ import purchaseRoutes from '@/routes/purchase'; import React, { useMemo, useState } from 'react'; import { toast } from 'sonner'; import { Product, ProductPrice, Purchase } from '@/types'; -import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X } from 'lucide-react'; +import { Plus, Trash2, CalendarIcon, Minus, ShoppingCart, Search, ImagePlus, X, Loader, Save } from 'lucide-react'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Calendar } from '@/components/ui/calendar'; import { format } from 'date-fns'; @@ -304,8 +304,8 @@ export default function PurchaseEdit({ purchase, products }: { purchase: Purchas } }} > - - {processing ? 'Menyimpan...' : 'Perbarui Belanja'} + {processing ? : } + {processing ? 'Menyimpan...' : 'Simpan'} @@ -597,8 +597,8 @@ export default function PurchaseEdit({ purchase, products }: { purchase: Purchas className="w-full h-10 font-semibold shadow" disabled={processing || data.items.length === 0} > - - {processing ? 'Menyimpan...' : 'Perbarui Belanja'} + {processing ? : } + {processing ? 'Menyimpan...' : 'Simpan'} @@ -773,8 +773,8 @@ export default function PurchaseEdit({ purchase, products }: { purchase: Purchas disabled={processing || data.items.length === 0} onClick={() => onSubmit({ preventDefault: () => { } } as any)} > - - {processing ? 'Menyimpan...' : 'Perbarui Belanja'} + {processing ? : } + {processing ? 'Menyimpan...' : 'Simpan'} diff --git a/resources/js/pages/admin/master/category/index.tsx b/resources/js/pages/admin/master/category/index.tsx index bc9fee4..1e0cd97 100644 --- a/resources/js/pages/admin/master/category/index.tsx +++ b/resources/js/pages/admin/master/category/index.tsx @@ -2,7 +2,7 @@ import { Head } from '@inertiajs/react'; import type { Category } from '@/types'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; -import { Trash2 } from 'lucide-react'; +import { Trash2, Plus, X } from 'lucide-react'; import { DataTable } from '@/components/data-table'; import { AlertDialog, @@ -52,7 +52,8 @@ export default function CategoryIndex({ categories }: { categories: Category[] }

Kategori

- @@ -108,8 +109,14 @@ export default function CategoryIndex({ categories }: { categories: Category[] } - Batal - Hapus + + + Batal + + + + Hapus + @@ -127,11 +134,16 @@ export default function CategoryIndex({ categories }: { categories: Category[] } - Batal + + + Batal + + Hapus diff --git a/resources/js/pages/admin/master/category/partials/category-form-modal.tsx b/resources/js/pages/admin/master/category/partials/category-form-modal.tsx index 02af08a..d3f3b1a 100644 --- a/resources/js/pages/admin/master/category/partials/category-form-modal.tsx +++ b/resources/js/pages/admin/master/category/partials/category-form-modal.tsx @@ -14,6 +14,7 @@ import { useForm } from '@inertiajs/react'; import { useEffect } from 'react'; import categoryRoutes from '@/routes/category'; import { toast } from 'sonner'; +import { X, Save, Loader } from 'lucide-react'; interface CategoryFormModalProps { isOpen: boolean; @@ -88,8 +89,12 @@ export function CategoryFormModal({ isOpen, onClose, category }: CategoryFormMod
- - + diff --git a/resources/js/pages/admin/master/product/create.tsx b/resources/js/pages/admin/master/product/create.tsx index 5c24d46..ee99f86 100644 --- a/resources/js/pages/admin/master/product/create.tsx +++ b/resources/js/pages/admin/master/product/create.tsx @@ -23,7 +23,7 @@ import { useComboboxAnchor, } from "@/components/ui/combobox" import { NumericFormat } from 'react-number-format'; -import { ImagePlus, X, Upload } from 'lucide-react'; +import { ImagePlus, X, Upload, ArrowLeft, Save, Loader } from 'lucide-react'; export default function ProductCreate({ categories }: { categories: Category[] }) { const { data, setData, post, processing, errors } = useForm<{ @@ -117,7 +117,8 @@ export default function ProductCreate({ categories }: { categories: Category[] }

Tambah Produk

- @@ -401,7 +402,8 @@ export default function ProductCreate({ categories }: { categories: Category[] }
-
diff --git a/resources/js/pages/admin/master/product/edit.tsx b/resources/js/pages/admin/master/product/edit.tsx index f603751..42a0d2e 100644 --- a/resources/js/pages/admin/master/product/edit.tsx +++ b/resources/js/pages/admin/master/product/edit.tsx @@ -23,7 +23,7 @@ import { useComboboxAnchor, } from "@/components/ui/combobox" import { NumericFormat } from 'react-number-format'; -import { ImagePlus, X, Upload } from 'lucide-react'; +import { ImagePlus, X, Upload, ArrowLeft, Save, Loader } from 'lucide-react'; interface ExistingImage { kind: 'existing'; @@ -167,7 +167,8 @@ export default function ProductEdit({ product, categories }: { product: Product,

Ubah Produk

- @@ -469,7 +470,8 @@ export default function ProductEdit({ product, categories }: { product: Product,
-
diff --git a/resources/js/pages/admin/master/product/index.tsx b/resources/js/pages/admin/master/product/index.tsx index e4aa8bc..1af3e46 100644 --- a/resources/js/pages/admin/master/product/index.tsx +++ b/resources/js/pages/admin/master/product/index.tsx @@ -2,7 +2,7 @@ import { Head, Link } from '@inertiajs/react'; import type { Product, Category } from '@/types'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; -import { Trash2 } from 'lucide-react'; +import { Trash2, Plus, X } from 'lucide-react'; import { DataTable } from '@/components/data-table'; import { AlertDialog, @@ -52,7 +52,8 @@ export default function ProductIndex({ products, categories }: { products: Produ

Produk

- @@ -111,8 +112,14 @@ export default function ProductIndex({ products, categories }: { products: Produ - Batal - Hapus + + + Batal + + + + Hapus + @@ -130,11 +137,16 @@ export default function ProductIndex({ products, categories }: { products: Produ - Batal + + + Batal + + Hapus diff --git a/resources/js/pages/admin/master/user/create.tsx b/resources/js/pages/admin/master/user/create.tsx index 9d59413..d0f0992 100644 --- a/resources/js/pages/admin/master/user/create.tsx +++ b/resources/js/pages/admin/master/user/create.tsx @@ -16,6 +16,7 @@ import { PopoverTrigger, } from "@/components/ui/popover" import { NumericFormat } from 'react-number-format'; +import { ArrowLeft, Loader, Save } from 'lucide-react'; export default function UserCreate() { const [isCalendarOpen, setIsCalendarOpen] = React.useState(false); @@ -50,7 +51,8 @@ export default function UserCreate() {

Tambah Pegawai

- @@ -223,6 +225,7 @@ export default function UserCreate() {
diff --git a/resources/js/pages/admin/master/user/edit.tsx b/resources/js/pages/admin/master/user/edit.tsx index e62c16d..b4a1999 100644 --- a/resources/js/pages/admin/master/user/edit.tsx +++ b/resources/js/pages/admin/master/user/edit.tsx @@ -16,6 +16,7 @@ import { PopoverTrigger, } from "@/components/ui/popover" import { NumericFormat } from 'react-number-format'; +import { ArrowLeft, Loader, Save } from 'lucide-react'; export default function UserEdit({ user }: { user: any }) { const [isCalendarOpen, setIsCalendarOpen] = React.useState(false); @@ -52,6 +53,7 @@ export default function UserEdit({ user }: { user: any }) { @@ -224,6 +226,7 @@ export default function UserEdit({ user }: { user: any }) {
diff --git a/resources/js/pages/admin/master/user/index.tsx b/resources/js/pages/admin/master/user/index.tsx index 48e5a1b..503343f 100644 --- a/resources/js/pages/admin/master/user/index.tsx +++ b/resources/js/pages/admin/master/user/index.tsx @@ -2,7 +2,7 @@ import { Head, Link } from '@inertiajs/react'; import type { User } from '@/types'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; -import { Trash2, KeyRound } from 'lucide-react'; +import { Trash2, KeyRound, Plus, X } from 'lucide-react'; import { DataTable } from '@/components/data-table'; import { AlertDialog, @@ -52,7 +52,8 @@ export default function UserIndex({ users, defaultPassword }: { users: User[], d

Pegawai

- @@ -93,8 +94,14 @@ export default function UserIndex({ users, defaultPassword }: { users: User[], d - Batal - Hapus + + + Batal + + + + Hapus + @@ -106,14 +113,20 @@ export default function UserIndex({ users, defaultPassword }: { users: User[], d - Reset password? + Reset kata sandi? - Tindakan ini akan mereset password {userToReset?.name} menjadi {defaultPassword}. Pengguna dapat mengubahnya kembali nanti. + Tindakan ini akan mereset kata sandi {userToReset?.name} menjadi {defaultPassword}. Pengguna dapat mengubahnya kembali nanti. - Batal - Reset + + + Batal + + + + Reset + @@ -131,11 +144,16 @@ export default function UserIndex({ users, defaultPassword }: { users: User[], d - Batal + + + Batal + + Hapus diff --git a/resources/js/pages/admin/system/settings/index.tsx b/resources/js/pages/admin/system/settings/index.tsx index 3b636b0..ef3724a 100644 --- a/resources/js/pages/admin/system/settings/index.tsx +++ b/resources/js/pages/admin/system/settings/index.tsx @@ -9,7 +9,7 @@ import type { GeneralSetting } from '@/types'; import React, { useRef, useState } from 'react'; import { toast } from 'sonner'; import systemRoutes from '@/routes/system'; -import { ImagePlus, X } from 'lucide-react'; +import { ImagePlus, X, Save, Loader } from 'lucide-react'; export default function SettingIndex({ setting }: { setting: GeneralSetting | null }) { const { data, setData, post, processing, errors } = useForm({ @@ -227,8 +227,9 @@ export default function SettingIndex({ setting }: { setting: GeneralSetting | nu
-