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;