diff --git a/src/components/pages/master-data/area/AreasTable.tsx b/src/components/pages/master-data/area/AreasTable.tsx index cc8084d8..1884dca3 100644 --- a/src/components/pages/master-data/area/AreasTable.tsx +++ b/src/components/pages/master-data/area/AreasTable.tsx @@ -11,13 +11,13 @@ import DebouncedTextInput from '@/components/input/DebouncedTextInput'; import Button from '@/components/Button'; import { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; -import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import RequirePermission from '@/components/helper/RequirePermission'; +import AreaTableSkeleton from '@/components/pages/master-data/area/skeleton/AreaTableSkeleton'; import { Area } from '@/types/api/master-data/area'; import { AreaApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -241,26 +241,44 @@ const AreasTable = () => { {/* Table Section */}
- - data={isResponseSuccess(areas) ? areas?.data : []} - columns={areasColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(areas) ? areas?.meta?.page : 0} - totalItems={ - isResponseSuccess(areas) ? areas?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': isResponseSuccess(areas) && areas?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(areas) || areas.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={isResponseSuccess(areas) ? areas?.data : []} + columns={areasColumns} + pageSize={tableFilterState.pageSize} + page={isResponseSuccess(areas) ? areas?.meta?.page : 0} + totalItems={ + isResponseSuccess(areas) ? areas?.meta?.total_results : 0 + } + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={isLoading} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/area/skeleton/AreaTableSkeleton.tsx b/src/components/pages/master-data/area/skeleton/AreaTableSkeleton.tsx new file mode 100644 index 00000000..14e35fb9 --- /dev/null +++ b/src/components/pages/master-data/area/skeleton/AreaTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Area } from '@/types/api/master-data/area'; +import { ColumnDef } from '@tanstack/react-table'; + +const AreaTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no area data displayed. Enter area data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+ +
+ +
+ + ); +}; + +export default AreaTableSkeleton; diff --git a/src/components/pages/master-data/bank/BanksTable.tsx b/src/components/pages/master-data/bank/BanksTable.tsx index 010d6dec..a6a5dbef 100644 --- a/src/components/pages/master-data/bank/BanksTable.tsx +++ b/src/components/pages/master-data/bank/BanksTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import BankTableSkeleton from '@/components/pages/master-data/bank/skeleton/BankTableSkeleton'; import { Bank } from '@/types/api/master-data/bank'; import { BankApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -254,26 +254,44 @@ const BanksTable = () => { {/* Table Section */}
- - data={isResponseSuccess(banks) ? banks?.data : []} - columns={banksColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(banks) ? banks?.meta?.page : 0} - totalItems={ - isResponseSuccess(banks) ? banks?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': isResponseSuccess(banks) && banks?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(banks) || banks.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={isResponseSuccess(banks) ? banks?.data : []} + columns={banksColumns} + pageSize={tableFilterState.pageSize} + page={isResponseSuccess(banks) ? banks?.meta?.page : 0} + totalItems={ + isResponseSuccess(banks) ? banks?.meta?.total_results : 0 + } + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={isLoading} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/bank/skeleton/BankTableSkeleton.tsx b/src/components/pages/master-data/bank/skeleton/BankTableSkeleton.tsx new file mode 100644 index 00000000..7a3a2b38 --- /dev/null +++ b/src/components/pages/master-data/bank/skeleton/BankTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Bank } from '@/types/api/master-data/bank'; +import { ColumnDef } from '@tanstack/react-table'; + +const BankTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no bank data displayed. Enter bank data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default BankTableSkeleton; diff --git a/src/components/pages/master-data/customer/CustomersTable.tsx b/src/components/pages/master-data/customer/CustomersTable.tsx index 58ba6d40..2768daa3 100644 --- a/src/components/pages/master-data/customer/CustomersTable.tsx +++ b/src/components/pages/master-data/customer/CustomersTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import CustomerTableSkeleton from '@/components/pages/master-data/customer/skeleton/CustomerTableSkeleton'; import { Customer } from '@/types/api/master-data/customer'; import { CustomerApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -261,27 +261,42 @@ const CustomersTable = () => { {/* Table Section */}
- - data={isResponseSuccess(customers) ? customers?.data : []} - columns={customersColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(customers) ? customers?.meta?.page : 0} - totalItems={ - isResponseSuccess(customers) ? customers?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(customers) && customers?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(customers) || customers.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={customers?.data} + columns={customersColumns} + pageSize={tableFilterState.pageSize} + page={customers?.meta?.page ?? 0} + totalItems={customers?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/customer/skeleton/CustomerTableSkeleton.tsx b/src/components/pages/master-data/customer/skeleton/CustomerTableSkeleton.tsx new file mode 100644 index 00000000..f498cc60 --- /dev/null +++ b/src/components/pages/master-data/customer/skeleton/CustomerTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Customer } from '@/types/api/master-data/customer'; +import { ColumnDef } from '@tanstack/react-table'; + +const CustomerTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no customer data displayed. Enter customer data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default CustomerTableSkeleton; diff --git a/src/components/pages/master-data/flock/FlocksTable.tsx b/src/components/pages/master-data/flock/FlocksTable.tsx index f7156d55..3550a346 100644 --- a/src/components/pages/master-data/flock/FlocksTable.tsx +++ b/src/components/pages/master-data/flock/FlocksTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import FlockTableSkeleton from '@/components/pages/master-data/flock/skeleton/FlockTableSkeleton'; import { Flock } from '@/types/api/master-data/flock'; import { FlockApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -249,27 +249,42 @@ const FlockTable = () => { {/* Table Section */}
- - data={isResponseSuccess(flocks) ? flocks?.data : []} - columns={flocksColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(flocks) ? flocks?.meta?.page : 0} - totalItems={ - isResponseSuccess(flocks) ? flocks?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(flocks) && flocks?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(flocks) || flocks.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={flocks?.data} + columns={flocksColumns} + pageSize={tableFilterState.pageSize} + page={flocks?.meta?.page ?? 0} + totalItems={flocks?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/flock/skeleton/FlockTableSkeleton.tsx b/src/components/pages/master-data/flock/skeleton/FlockTableSkeleton.tsx new file mode 100644 index 00000000..6a5c034f --- /dev/null +++ b/src/components/pages/master-data/flock/skeleton/FlockTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Flock } from '@/types/api/master-data/flock'; +import { ColumnDef } from '@tanstack/react-table'; + +const FlockTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no flock data displayed. Enter flock data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default FlockTableSkeleton; diff --git a/src/components/pages/master-data/kandang/KandangsTable.tsx b/src/components/pages/master-data/kandang/KandangsTable.tsx index 55604939..63e9fa58 100644 --- a/src/components/pages/master-data/kandang/KandangsTable.tsx +++ b/src/components/pages/master-data/kandang/KandangsTable.tsx @@ -14,10 +14,11 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import KandangTableSkeleton from '@/components/pages/master-data/kandang/skeleton/KandangTableSkeleton'; import { Kandang } from '@/types/api/master-data/kandang'; import { KandangApi } from '@/services/api/master-data'; -import { cn, formatNumber } from '@/lib/helper'; +import { formatNumber } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -258,27 +259,42 @@ const KandangsTable = () => { {/* Table Section */}
- - data={isResponseSuccess(kandangs) ? kandangs?.data : []} - columns={kandangsColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(kandangs) ? kandangs?.meta?.page : 0} - totalItems={ - isResponseSuccess(kandangs) ? kandangs?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(kandangs) && kandangs?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(kandangs) || kandangs.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={kandangs?.data} + columns={kandangsColumns} + pageSize={tableFilterState.pageSize} + page={kandangs?.meta?.page ?? 0} + totalItems={kandangs?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/kandang/skeleton/KandangTableSkeleton.tsx b/src/components/pages/master-data/kandang/skeleton/KandangTableSkeleton.tsx new file mode 100644 index 00000000..65a759ac --- /dev/null +++ b/src/components/pages/master-data/kandang/skeleton/KandangTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Kandang } from '@/types/api/master-data/kandang'; +import { ColumnDef } from '@tanstack/react-table'; + +const KandangTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no kandang data displayed. Enter kandang data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default KandangTableSkeleton; diff --git a/src/components/pages/master-data/location/LocationsTable.tsx b/src/components/pages/master-data/location/LocationsTable.tsx index bea0fcdd..0b619079 100644 --- a/src/components/pages/master-data/location/LocationsTable.tsx +++ b/src/components/pages/master-data/location/LocationsTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import LocationTableSkeleton from '@/components/pages/master-data/location/skeleton/LocationTableSkeleton'; import { Location } from '@/types/api/master-data/location'; import { LocationApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -253,27 +253,42 @@ const LocationsTable = () => { {/* Table Section */}
- - data={isResponseSuccess(locations) ? locations?.data : []} - columns={locationsColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(locations) ? locations?.meta?.page : 0} - totalItems={ - isResponseSuccess(locations) ? locations?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(locations) && locations?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(locations) || locations.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={locations?.data} + columns={locationsColumns} + pageSize={tableFilterState.pageSize} + page={locations?.meta?.page ?? 0} + totalItems={locations?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/location/skeleton/LocationTableSkeleton.tsx b/src/components/pages/master-data/location/skeleton/LocationTableSkeleton.tsx new file mode 100644 index 00000000..c7f1c868 --- /dev/null +++ b/src/components/pages/master-data/location/skeleton/LocationTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Location } from '@/types/api/master-data/location'; +import { ColumnDef } from '@tanstack/react-table'; + +const LocationTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no location data displayed. Enter location data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default LocationTableSkeleton; diff --git a/src/components/pages/master-data/nonstock/NonstocksTable.tsx b/src/components/pages/master-data/nonstock/NonstocksTable.tsx index 6636a697..8f15e529 100644 --- a/src/components/pages/master-data/nonstock/NonstocksTable.tsx +++ b/src/components/pages/master-data/nonstock/NonstocksTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import NonstockTableSkeleton from '@/components/pages/master-data/nonstock/skeleton/NonstockTableSkeleton'; import { Nonstock } from '@/types/api/master-data/nonstock'; import { NonstockApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -258,27 +258,42 @@ const NonstocksTable = () => { {/* Table Section */}
- - data={isResponseSuccess(nonstocks) ? nonstocks?.data : []} - columns={nonstocksColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(nonstocks) ? nonstocks?.meta?.page : 0} - totalItems={ - isResponseSuccess(nonstocks) ? nonstocks?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(nonstocks) && nonstocks?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(nonstocks) || nonstocks.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={nonstocks?.data} + columns={nonstocksColumns} + pageSize={tableFilterState.pageSize} + page={nonstocks?.meta?.page ?? 0} + totalItems={nonstocks?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/nonstock/skeleton/NonstockTableSkeleton.tsx b/src/components/pages/master-data/nonstock/skeleton/NonstockTableSkeleton.tsx new file mode 100644 index 00000000..b3801a75 --- /dev/null +++ b/src/components/pages/master-data/nonstock/skeleton/NonstockTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Nonstock } from '@/types/api/master-data/nonstock'; +import { ColumnDef } from '@tanstack/react-table'; + +const NonstockTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no nonstock data displayed. Enter nonstock data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default NonstockTableSkeleton; diff --git a/src/components/pages/master-data/product-category/ProductCategoryTable.tsx b/src/components/pages/master-data/product-category/ProductCategoryTable.tsx index 3a872b7f..161ebed4 100644 --- a/src/components/pages/master-data/product-category/ProductCategoryTable.tsx +++ b/src/components/pages/master-data/product-category/ProductCategoryTable.tsx @@ -20,10 +20,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import ProductCategoryTableSkeleton from '@/components/pages/master-data/product-category/skeleton/ProductCategoryTableSkeleton'; import { ProductCategory } from '@/types/api/master-data/product-category'; import { ProductCategoryApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; import { useUiStore } from '@/stores/ui/ui.store'; @@ -282,38 +282,43 @@ const ProductCategoryTable = () => { {/* Table Section */}
- - data={ - isResponseSuccess(productCategories) - ? productCategories?.data - : [] - } - columns={productCategoryColumns} - pageSize={tableFilterState.pageSize} - page={ - isResponseSuccess(productCategories) - ? productCategories?.meta?.page - : 0 - } - totalItems={ - isResponseSuccess(productCategories) - ? productCategories?.meta?.total_results - : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(productCategories) && - productCategories?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(productCategories) || + productCategories.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={productCategories?.data} + columns={productCategoryColumns} + pageSize={tableFilterState.pageSize} + page={productCategories?.meta?.page ?? 0} + totalItems={productCategories?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/product-category/skeleton/ProductCategoryTableSkeleton.tsx b/src/components/pages/master-data/product-category/skeleton/ProductCategoryTableSkeleton.tsx new file mode 100644 index 00000000..7ea817ec --- /dev/null +++ b/src/components/pages/master-data/product-category/skeleton/ProductCategoryTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { ProductCategory } from '@/types/api/master-data/product-category'; +import { ColumnDef } from '@tanstack/react-table'; + +const ProductCategoryTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no product category data displayed. Enter product category data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default ProductCategoryTableSkeleton; diff --git a/src/components/pages/master-data/product/ProductTable.tsx b/src/components/pages/master-data/product/ProductTable.tsx index c4a5a87b..08b585f0 100644 --- a/src/components/pages/master-data/product/ProductTable.tsx +++ b/src/components/pages/master-data/product/ProductTable.tsx @@ -14,10 +14,11 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import ProductTableSkeleton from '@/components/pages/master-data/product/skeleton/ProductTableSkeleton'; import { Product } from '@/types/api/master-data/product'; import { ProductApi } from '@/services/api/master-data'; -import { cn, formatCurrency } from '@/lib/helper'; +import { formatCurrency } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -303,27 +304,42 @@ const ProductsTable = () => { {/* Table Section */}
- - data={isResponseSuccess(products) ? products?.data : []} - columns={productsColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(products) ? products?.meta?.page : 0} - totalItems={ - isResponseSuccess(products) ? products?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(products) && products?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(products) || products.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={products?.data} + columns={productsColumns} + pageSize={tableFilterState.pageSize} + page={products?.meta?.page ?? 0} + totalItems={products?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/product/skeleton/ProductTableSkeleton.tsx b/src/components/pages/master-data/product/skeleton/ProductTableSkeleton.tsx new file mode 100644 index 00000000..d0393421 --- /dev/null +++ b/src/components/pages/master-data/product/skeleton/ProductTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Product } from '@/types/api/master-data/product'; +import { ColumnDef } from '@tanstack/react-table'; + +const ProductTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no product data displayed. Enter product data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default ProductTableSkeleton; diff --git a/src/components/pages/master-data/production-standard/ProductionStandardTable.tsx b/src/components/pages/master-data/production-standard/ProductionStandardTable.tsx index 09e83fd1..0ff8b594 100644 --- a/src/components/pages/master-data/production-standard/ProductionStandardTable.tsx +++ b/src/components/pages/master-data/production-standard/ProductionStandardTable.tsx @@ -13,10 +13,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import ProductionStandardTableSkeleton from '@/components/pages/master-data/production-standard/skeleton/ProductionStandardTableSkeleton'; import { ProductionStandard } from '@/types/api/master-data/production-standard'; import { ProductionStandardApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; const RowOptionsMenu = ({ @@ -201,25 +201,38 @@ const ProductionStandardTable = () => { {/* Table Section */}
- - data={ - isResponseSuccess(productionStandards) - ? productionStandards.data - : [] - } - columns={productionStandardColumns} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(productionStandards) && - productionStandards?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(productionStandards) || + productionStandards.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={productionStandards.data} + columns={productionStandardColumns} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/production-standard/skeleton/ProductionStandardTableSkeleton.tsx b/src/components/pages/master-data/production-standard/skeleton/ProductionStandardTableSkeleton.tsx new file mode 100644 index 00000000..590b4479 --- /dev/null +++ b/src/components/pages/master-data/production-standard/skeleton/ProductionStandardTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { ProductionStandard } from '@/types/api/master-data/production-standard'; +import { ColumnDef } from '@tanstack/react-table'; + +const ProductionStandardTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no production standard data displayed. Enter production standard data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default ProductionStandardTableSkeleton; diff --git a/src/components/pages/master-data/supplier/SupplierTable.tsx b/src/components/pages/master-data/supplier/SupplierTable.tsx index e5b225ec..2b6cb227 100644 --- a/src/components/pages/master-data/supplier/SupplierTable.tsx +++ b/src/components/pages/master-data/supplier/SupplierTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import SupplierTableSkeleton from '@/components/pages/master-data/supplier/skeleton/SupplierTableSkeleton'; import { Supplier } from '@/types/api/master-data/supplier'; import { SupplierApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -273,27 +273,42 @@ const SuppliersTable = () => { {/* Table Section */}
- - data={isResponseSuccess(suppliers) ? suppliers?.data : []} - columns={suppliersColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(suppliers) ? suppliers?.meta?.page : 0} - totalItems={ - isResponseSuccess(suppliers) ? suppliers?.meta?.total_results : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(suppliers) && suppliers?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(suppliers) || suppliers.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={suppliers?.data} + columns={suppliersColumns} + pageSize={tableFilterState.pageSize} + page={suppliers?.meta?.page ?? 0} + totalItems={suppliers?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/supplier/skeleton/SupplierTableSkeleton.tsx b/src/components/pages/master-data/supplier/skeleton/SupplierTableSkeleton.tsx new file mode 100644 index 00000000..a205d593 --- /dev/null +++ b/src/components/pages/master-data/supplier/skeleton/SupplierTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Supplier } from '@/types/api/master-data/supplier'; +import { ColumnDef } from '@tanstack/react-table'; + +const SupplierTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no supplier data displayed. Enter supplier data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default SupplierTableSkeleton; diff --git a/src/components/pages/master-data/uom/UomsTable.tsx b/src/components/pages/master-data/uom/UomsTable.tsx index 064dc04e..aeaae276 100644 --- a/src/components/pages/master-data/uom/UomsTable.tsx +++ b/src/components/pages/master-data/uom/UomsTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import UomTableSkeleton from '@/components/pages/master-data/uom/skeleton/UomTableSkeleton'; import { Uom } from '@/types/api/master-data/uom'; import { UomApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -241,24 +241,42 @@ const UomsTable = () => { {/* Table Section */}
- - data={isResponseSuccess(uoms) ? uoms?.data : []} - columns={uomsColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(uoms) ? uoms?.meta?.page : 0} - totalItems={isResponseSuccess(uoms) ? uoms?.meta?.total_results : 0} - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': isResponseSuccess(uoms) && uoms?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(uoms) || uoms.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={uoms?.data} + columns={uomsColumns} + pageSize={tableFilterState.pageSize} + page={uoms?.meta?.page ?? 0} + totalItems={uoms?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/uom/skeleton/UomTableSkeleton.tsx b/src/components/pages/master-data/uom/skeleton/UomTableSkeleton.tsx new file mode 100644 index 00000000..05a42443 --- /dev/null +++ b/src/components/pages/master-data/uom/skeleton/UomTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Uom } from '@/types/api/master-data/uom'; +import { ColumnDef } from '@tanstack/react-table'; + +const UomTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no uom data displayed. Enter uom data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default UomTableSkeleton; diff --git a/src/components/pages/master-data/warehouse/WarehousesTable.tsx b/src/components/pages/master-data/warehouse/WarehousesTable.tsx index 17e1cc5e..c800e8eb 100644 --- a/src/components/pages/master-data/warehouse/WarehousesTable.tsx +++ b/src/components/pages/master-data/warehouse/WarehousesTable.tsx @@ -14,10 +14,10 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; import PopoverButton from '@/components/popover/PopoverButton'; import PopoverContent from '@/components/popover/PopoverContent'; +import WarehouseTableSkeleton from '@/components/pages/master-data/warehouse/skeleton/WarehouseTableSkeleton'; import { Warehouse } from '@/types/api/master-data/warehouse'; import { WarehouseApi } from '@/services/api/master-data'; -import { cn } from '@/lib/helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; @@ -276,30 +276,43 @@ const WarehousesTable = () => { {/* Table Section */}
- - data={isResponseSuccess(warehouses) ? warehouses?.data : []} - columns={warehousesColumns} - pageSize={tableFilterState.pageSize} - page={isResponseSuccess(warehouses) ? warehouses?.meta?.page : 0} - totalItems={ - isResponseSuccess(warehouses) - ? warehouses?.meta?.total_results - : 0 - } - onPageChange={setPage} - onPageSizeChange={setPageSize} - isLoading={isLoading} - sorting={sorting} - setSorting={setSorting} - className={{ - containerClassName: cn('p-3 mb-0', { - 'w-full': - isResponseSuccess(warehouses) && - warehouses?.data?.length === 0, - }), - headerColumnClassName: 'text-nowrap', - }} - /> + {isLoading ? ( +
+ +
+ ) : !isResponseSuccess(warehouses) || + warehouses.data?.length === 0 ? ( +
+ + } + /> +
+ ) : ( + + data={warehouses?.data} + columns={warehousesColumns} + pageSize={tableFilterState.pageSize} + page={warehouses?.meta?.page ?? 0} + totalItems={warehouses?.meta?.total_results ?? 0} + onPageChange={setPage} + onPageSizeChange={setPageSize} + isLoading={false} + sorting={sorting} + setSorting={setSorting} + className={{ + containerClassName: 'p-3 mb-0', + headerColumnClassName: 'text-nowrap', + }} + /> + )}
diff --git a/src/components/pages/master-data/warehouse/skeleton/WarehouseTableSkeleton.tsx b/src/components/pages/master-data/warehouse/skeleton/WarehouseTableSkeleton.tsx new file mode 100644 index 00000000..5de5e66c --- /dev/null +++ b/src/components/pages/master-data/warehouse/skeleton/WarehouseTableSkeleton.tsx @@ -0,0 +1,37 @@ +import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton'; +import Table from '@/components/Table'; +import { Warehouse } from '@/types/api/master-data/warehouse'; +import { ColumnDef } from '@tanstack/react-table'; + +const WarehouseTableSkeleton = ({ + columns, + icon, + title = 'No Data Available', + subtitle = 'There is no warehouse data displayed. Enter warehouse data to get started.', +}: { + columns: ColumnDef[]; + icon: React.ReactNode; + title?: string; + subtitle?: string; +}) => { + return ( +
+
+
+ +
+ + ); +}; + +export default WarehouseTableSkeleton;