diff --git a/src/components/pages/expense/ExpensesTable.tsx b/src/components/pages/expense/ExpensesTable.tsx
index e2e86535..849c1f83 100644
--- a/src/components/pages/expense/ExpensesTable.tsx
+++ b/src/components/pages/expense/ExpensesTable.tsx
@@ -25,6 +25,7 @@ import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWith
import RequirePermission from '@/components/helper/RequirePermission';
import ButtonFilter from '@/components/helper/ButtonFilter';
import ExpensesFilterModal from '@/components/pages/expense/filter/ExpensesFilterModal';
+import ExpenseTableSkeleton from '@/components/pages/expense/skeleton/ExpenseTableSkeleton';
import { Expense } from '@/types/api/expense';
import { ExpenseApi } from '@/services/api/expense';
@@ -692,30 +693,47 @@ const ExpensesTable = () => {
{/* Table Section */}
-
- data={isResponseSuccess(expenses) ? expenses?.data : []}
- columns={expensesColumns}
- pageSize={tableFilterState.pageSize}
- page={isResponseSuccess(expenses) ? expenses?.meta?.page : 0}
- totalItems={
- isResponseSuccess(expenses) ? expenses?.meta?.total_results : 0
- }
- onPageChange={setPage}
- onPageSizeChange={setPageSize}
- isLoading={isLoading}
- sorting={sorting}
- setSorting={setSorting}
- rowSelection={rowSelection}
- setRowSelection={setRowSelection}
- enableRowSelection={tableEnableRowSelectionHandler}
- className={{
- containerClassName: cn('p-3 mb-0', {
- 'w-full':
- isResponseSuccess(expenses) && expenses?.data?.length === 0,
- }),
- headerColumnClassName: 'text-nowrap',
- }}
- />
+ {isLoading ? (
+
+
+
+ ) : !isResponseSuccess(expenses) || expenses.data?.length === 0 ? (
+
+
+ }
+ />
+
+ ) : (
+
+ data={isResponseSuccess(expenses) ? expenses?.data : []}
+ columns={expensesColumns}
+ pageSize={tableFilterState.pageSize}
+ page={isResponseSuccess(expenses) ? expenses?.meta?.page : 0}
+ totalItems={
+ isResponseSuccess(expenses) ? expenses?.meta?.total_results : 0
+ }
+ onPageChange={setPage}
+ onPageSizeChange={setPageSize}
+ isLoading={isLoading}
+ sorting={sorting}
+ setSorting={setSorting}
+ rowSelection={rowSelection}
+ setRowSelection={setRowSelection}
+ enableRowSelection={tableEnableRowSelectionHandler}
+ className={{
+ containerClassName: cn('p-3 mb-0'),
+ headerColumnClassName: 'text-nowrap',
+ }}
+ />
+ )}
diff --git a/src/components/pages/expense/skeleton/ExpenseTableSkeleton.tsx b/src/components/pages/expense/skeleton/ExpenseTableSkeleton.tsx
new file mode 100644
index 00000000..f159a81a
--- /dev/null
+++ b/src/components/pages/expense/skeleton/ExpenseTableSkeleton.tsx
@@ -0,0 +1,37 @@
+import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton';
+import Table from '@/components/Table';
+import { Expense } from '@/types/api/expense';
+import { ColumnDef } from '@tanstack/react-table';
+
+const ExpenseTableSkeleton = ({
+ columns,
+ icon,
+ title = 'No Data Available',
+ subtitle = 'There is no expense data displayed. Enter expense data to get started.',
+}: {
+ columns: ColumnDef[];
+ icon: React.ReactNode;
+ title?: string;
+ subtitle?: string;
+}) => {
+ return (
+
+ );
+};
+
+export default ExpenseTableSkeleton;
diff --git a/src/components/pages/finance/FinanceTable.tsx b/src/components/pages/finance/FinanceTable.tsx
index f8eacd77..100eecb4 100644
--- a/src/components/pages/finance/FinanceTable.tsx
+++ b/src/components/pages/finance/FinanceTable.tsx
@@ -44,6 +44,7 @@ import {
FinanceTableFilterSchema,
FinanceTableFilterValues,
} from '@/components/pages/finance/filter/FinanceFilter';
+import FinanceTableSkeleton from '@/components/pages/finance/skeleton/FinanceTableSkeleton';
const RowOptionsMenu = ({
popoverPosition = 'bottom',
@@ -714,6 +715,20 @@ const FinanceTable = () => {
+ ) : !isResponseSuccess(finances) || finances.data?.length === 0 ? (
+
+
+ }
+ />
+
) : (
data={isResponseSuccess(finances) ? finances.data : []}
@@ -727,10 +742,7 @@ const FinanceTable = () => {
onPageSizeChange={setPageSize}
isLoading={isLoading}
className={{
- containerClassName: cn('p-3 mb-0', {
- 'w-full':
- isResponseSuccess(finances) && finances?.data?.length === 0,
- }),
+ containerClassName: cn('p-3 mb-0'),
headerColumnClassName: 'text-nowrap',
}}
/>
diff --git a/src/components/pages/finance/skeleton/FinanceTableSkeleton.tsx b/src/components/pages/finance/skeleton/FinanceTableSkeleton.tsx
new file mode 100644
index 00000000..ccfbf1f5
--- /dev/null
+++ b/src/components/pages/finance/skeleton/FinanceTableSkeleton.tsx
@@ -0,0 +1,37 @@
+import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton';
+import Table from '@/components/Table';
+import { Finance } from '@/types/api/finance/finance';
+import { ColumnDef } from '@tanstack/react-table';
+
+const FinanceTableSkeleton = ({
+ columns,
+ icon,
+ title = 'No Data Available',
+ subtitle = 'There is no finance data displayed. Enter finance data to get started.',
+}: {
+ columns: ColumnDef[];
+ icon: React.ReactNode;
+ title?: string;
+ subtitle?: string;
+}) => {
+ return (
+
+ );
+};
+
+export default FinanceTableSkeleton;
diff --git a/src/components/pages/marketing/MarketingTable.tsx b/src/components/pages/marketing/MarketingTable.tsx
index de43ba68..540a3eca 100644
--- a/src/components/pages/marketing/MarketingTable.tsx
+++ b/src/components/pages/marketing/MarketingTable.tsx
@@ -31,6 +31,7 @@ import PopoverContent from '@/components/popover/PopoverContent';
import StatusBadge from '@/components/helper/StatusBadge';
import MarketingFilterModal from '@/components/pages/marketing/MarketingFilter';
import ButtonFilter from '@/components/helper/ButtonFilter';
+import MarketingTableSkeleton from '@/components/pages/marketing/skeleton/MarketingTableSkeleton';
const RowsOptionsMenu = ({
props,
@@ -616,28 +617,49 @@ const MarketingTable = () => {
-
+
+ {isLoadingMarketing ? (
+
+
+
+ ) : !isResponseSuccess(marketing) || marketing.data?.length === 0 ? (
+
+
+ }
+ />
+
+ ) : (
+
+ )}
+
[];
+ icon: React.ReactNode;
+ title?: string;
+ subtitle?: string;
+}) => {
+ return (
+
+ );
+};
+
+export default MarketingTableSkeleton;
diff --git a/src/components/pages/purchase/PurchaseTable.tsx b/src/components/pages/purchase/PurchaseTable.tsx
index 87992ad2..e84d56d3 100644
--- a/src/components/pages/purchase/PurchaseTable.tsx
+++ b/src/components/pages/purchase/PurchaseTable.tsx
@@ -17,6 +17,7 @@ import PopoverContent from '@/components/popover/PopoverContent';
import SelectInput, { OptionType } from '@/components/input/SelectInput';
import RequirePermission from '@/components/helper/RequirePermission';
import StatusBadge from '@/components/helper/StatusBadge';
+import PurchaseTableSkeleton from '@/components/pages/purchase/skeleton/PurchaseTableSkeleton';
import { cn, formatDate } from '@/lib/helper';
import { isResponseSuccess } from '@/lib/api-helper';
@@ -441,36 +442,55 @@ const PurchaseTable = () => {
{/* Table Section */}
-
- data={
- isResponseSuccess(purchaseRequests) ? purchaseRequests?.data : []
- }
- columns={purchaseColumns}
- pageSize={tableFilterState.pageSize}
- page={
- isResponseSuccess(purchaseRequests)
- ? purchaseRequests?.meta?.page
- : 0
- }
- totalItems={
- isResponseSuccess(purchaseRequests)
- ? purchaseRequests?.meta?.total_results
- : 0
- }
- onPageChange={setPage}
- onPageSizeChange={setPageSize}
- isLoading={isLoading}
- sorting={sorting}
- setSorting={setSorting}
- className={{
- containerClassName: cn('p-3', {
- 'w-full mb-20':
- isResponseSuccess(purchaseRequests) &&
- purchaseRequests?.data?.length === 0,
- }),
- headerColumnClassName: 'text-nowrap',
- }}
- />
+ {isLoading ? (
+
+
+
+ ) : !isResponseSuccess(purchaseRequests) ||
+ purchaseRequests.data?.length === 0 ? (
+
+ ) : (
+
+ data={
+ isResponseSuccess(purchaseRequests)
+ ? purchaseRequests?.data
+ : []
+ }
+ columns={purchaseColumns}
+ pageSize={tableFilterState.pageSize}
+ page={
+ isResponseSuccess(purchaseRequests)
+ ? purchaseRequests?.meta?.page
+ : 0
+ }
+ totalItems={
+ isResponseSuccess(purchaseRequests)
+ ? purchaseRequests?.meta?.total_results
+ : 0
+ }
+ onPageChange={setPage}
+ onPageSizeChange={setPageSize}
+ isLoading={isLoading}
+ sorting={sorting}
+ setSorting={setSorting}
+ className={{
+ containerClassName: cn('p-3 mb-0'),
+ headerColumnClassName: 'text-nowrap',
+ }}
+ />
+ )}
diff --git a/src/components/pages/purchase/skeleton/PurchaseTableSkeleton.tsx b/src/components/pages/purchase/skeleton/PurchaseTableSkeleton.tsx
new file mode 100644
index 00000000..16d163a1
--- /dev/null
+++ b/src/components/pages/purchase/skeleton/PurchaseTableSkeleton.tsx
@@ -0,0 +1,37 @@
+import DataStateSkeleton from '@/components/helper/skeleton/DataStateSkeleton';
+import Table from '@/components/Table';
+import { Purchase } from '@/types/api/purchase/purchase';
+import { ColumnDef } from '@tanstack/react-table';
+
+const PurchaseTableSkeleton = ({
+ columns,
+ icon,
+ title = 'No Data Available',
+ subtitle = 'There is no purchase data displayed. Enter purchase data to get started.',
+}: {
+ columns: ColumnDef[];
+ icon: React.ReactNode;
+ title?: string;
+ subtitle?: string;
+}) => {
+ return (
+
+ );
+};
+
+export default PurchaseTableSkeleton;