212 lines
5.8 KiB
JavaScript
212 lines
5.8 KiB
JavaScript
import React from "react";
|
|
|
|
const SkeletonLine = ({ height = 20, width = "100%", className = "" }) => (
|
|
<div
|
|
className={`skeleton mb-2 ${className}`}
|
|
style={{
|
|
height,
|
|
width,
|
|
}}
|
|
></div>
|
|
);
|
|
|
|
export const PaymentHistorySkeleton = ({ count = 2 }) => {
|
|
return (
|
|
<div className="row text-start">
|
|
{[...Array(count)].map((_, idx) => (
|
|
<div className="col-12 mb-2" key={idx}>
|
|
<div className="p-2 border-start border-warning">
|
|
{/* Top Row: Date + Amount */}
|
|
<div className="d-flex justify-content-between align-items-center">
|
|
<SkeletonLine width="150px" height={18} /> {/* Date */}
|
|
<SkeletonLine width="100px" height={18} /> {/* Amount */}
|
|
</div>
|
|
|
|
<div className="row mt-1">
|
|
{/* Transaction ID */}
|
|
<div className="col-12 col-md-6">
|
|
<SkeletonLine width="80%" height={16} />
|
|
</div>
|
|
|
|
{/* Received By (Avatar + Name) */}
|
|
<div className="col-12 col-md-6 d-flex align-items-center gap-2">
|
|
<SkeletonLine
|
|
width="30px"
|
|
height={30}
|
|
className="rounded-circle"
|
|
/>{" "}
|
|
{/* Avatar */}
|
|
<SkeletonLine width="120px" height={16} /> {/* Name */}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export const CollectionDetailsSkeleton = () => {
|
|
return (
|
|
<div className="container p-3">
|
|
{/* Title */}
|
|
<SkeletonLine height={24} width="200px" className="mx-auto" />
|
|
|
|
{/* Header Row */}
|
|
<div className="row mb-3 px-1">
|
|
<div className="col-10">
|
|
<SkeletonLine height={20} />
|
|
</div>
|
|
<div className="col-2 d-flex justify-content-end">
|
|
<SkeletonLine height={20} width="60px" />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Project */}
|
|
<div className="row mb-3">
|
|
<div className="col-md-6">
|
|
<SkeletonLine width="60%" />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Invoice & E-Invoice */}
|
|
<div className="row mb-3">
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Invoice Date & Client Submitted */}
|
|
<div className="row mb-3">
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Expected Payment & Mark as Completed */}
|
|
<div className="row mb-3">
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
<div className="col-md-6">
|
|
<SkeletonLine width="40%" />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Basic & Tax Amount */}
|
|
<div className="row mb-3">
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Balance & Created At */}
|
|
<div className="row mb-3">
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
<div className="col-md-6">
|
|
<SkeletonLine />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Created By */}
|
|
<div className="row mb-3">
|
|
<div className="col-md-6 d-flex align-items-center">
|
|
<SkeletonLine
|
|
width="40px"
|
|
height={40}
|
|
className="me-2 rounded-circle"
|
|
/>
|
|
<SkeletonLine width="100px" />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Description */}
|
|
<div className="row mb-3">
|
|
<div className="col-12">
|
|
<SkeletonLine height={50} />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Attachments */}
|
|
<div className="row mb-3">
|
|
<div className="col-12 d-flex gap-2 flex-wrap">
|
|
{[...Array(3)].map((_, idx) => (
|
|
<SkeletonLine key={idx} height={60} width="80px" />
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Tabs */}
|
|
<div className="row mb-2">
|
|
<div className="col-12 d-flex gap-2">
|
|
<SkeletonLine height={35} width="120px" />
|
|
<SkeletonLine height={35} width="150px" />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Tab Content (Comments / Payments) */}
|
|
<SkeletonLine height={200} />
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export const CollectionTableSkeleton = () => {
|
|
const columnCount = 8;
|
|
|
|
return (
|
|
<div className="card ">
|
|
<div
|
|
className="card-datatable table-responsive page-min-h"
|
|
id="horizontal-example"
|
|
>
|
|
<div className="dataTables_wrapper no-footer mx-5 pb-2">
|
|
<table className="table dataTable text-nowrap">
|
|
<thead>
|
|
<tr >
|
|
{[...Array(columnCount - 1)].map((_, i) => (
|
|
<th key={i}>
|
|
<SkeletonLine height={15} width="80px" />
|
|
</th>
|
|
))}
|
|
<th className="d-flex justify-content-center">
|
|
<SkeletonLine height={16} width="40px" />
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{[...Array(8)].map((_, rowIdx) => (
|
|
<tr key={rowIdx}>
|
|
{[...Array(columnCount - 1)].map((_, colIdx) => (
|
|
<td key={colIdx}>
|
|
<SkeletonLine height={33} />
|
|
</td>
|
|
))}
|
|
<td className="d-flex justify-content-center">
|
|
<SkeletonLine height={16} width="20px" />
|
|
</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
</table>
|
|
|
|
{/* Pagination Skeleton */}
|
|
<div className="d-flex justify-content-end mt-2">
|
|
<SkeletonLine height={30} width="200px" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|