commit
8b8ca488a7
|
|
@ -274,6 +274,8 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
|
||||||
const [open, setOpen] = React.useState(false);
|
const [open, setOpen] = React.useState(false);
|
||||||
const [columnFilters, setColumnFilters] = React.useState<Record<string, string[]>>({});
|
const [columnFilters, setColumnFilters] = React.useState<Record<string, string[]>>({});
|
||||||
const [columnSorts, setColumnSorts] = React.useState<Record<string, 'asc' | 'desc' | null>>({});
|
const [columnSorts, setColumnSorts] = React.useState<Record<string, 'asc' | 'desc' | null>>({});
|
||||||
|
const [isFooterAnchored, setIsFooterAnchored] = React.useState(false);
|
||||||
|
const footerRef = React.useRef<HTMLDivElement>(null);
|
||||||
const [conditions, setConditions] = React.useState([
|
const [conditions, setConditions] = React.useState([
|
||||||
{ column: "", operator: "contains", value: "" },
|
{ column: "", operator: "contains", value: "" },
|
||||||
]);
|
]);
|
||||||
|
|
@ -628,6 +630,29 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
|
||||||
});
|
});
|
||||||
}, [filteredData, columnSorts]);
|
}, [filteredData, columnSorts]);
|
||||||
|
|
||||||
|
// Detectar se o footer está sendo coberto e ancorá-lo na base da tela
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (!footerRef.current) return;
|
||||||
|
|
||||||
|
const observer = new IntersectionObserver(
|
||||||
|
(entries) => {
|
||||||
|
const [entry] = entries;
|
||||||
|
// Se o footer não está visível (está sendo coberto), ancora na base
|
||||||
|
setIsFooterAnchored(!entry.isIntersecting);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
threshold: 0.1, // Detectar quando 10% do footer está visível
|
||||||
|
rootMargin: '0px 0px -50px 0px' // Margem para detectar antes de ser completamente coberto
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
observer.observe(footerRef.current);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
observer.disconnect();
|
||||||
|
};
|
||||||
|
}, [sortedAndFilteredData.length]); // Re-executar quando os dados mudarem
|
||||||
|
|
||||||
// Calcular totais das colunas de valores (usando dados filtrados)
|
// Calcular totais das colunas de valores (usando dados filtrados)
|
||||||
const columnTotals = React.useMemo(() => {
|
const columnTotals = React.useMemo(() => {
|
||||||
if (!sortedAndFilteredData || sortedAndFilteredData.length === 0) {
|
if (!sortedAndFilteredData || sortedAndFilteredData.length === 0) {
|
||||||
|
|
@ -940,13 +965,14 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
|
||||||
{/* Footer com Totalizadores - Posicionado no lugar do footer nativo */}
|
{/* Footer com Totalizadores - Posicionado no lugar do footer nativo */}
|
||||||
{sortedAndFilteredData.length > 0 && (
|
{sortedAndFilteredData.length > 0 && (
|
||||||
<div
|
<div
|
||||||
className="absolute bottom-0 left-0 right-0 bg-white border-t border-gray-200 px-4 py-2"
|
ref={footerRef}
|
||||||
|
className={`${isFooterAnchored ? 'fixed bottom-0 left-0 right-0 z-50' : 'absolute bottom-0 left-0 right-0'} bg-white border-t border-gray-200 px-4 py-2`}
|
||||||
style={{
|
style={{
|
||||||
height: "48px",
|
height: "48px",
|
||||||
display: "flex",
|
display: "flex",
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
fontSize: "0.75rem",
|
fontSize: "0.75rem",
|
||||||
zIndex: 1
|
zIndex: isFooterAnchored ? 50 : 1
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div className="flex items-center w-full">
|
<div className="flex items-center w-full">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue