import { useEffect, useMemo } from "react";
import React from "react";
import { Responsive, WidthProvider } from "react-grid-layout";
import { Widget } from "@onvo-ai/js";
import ChartCard from "../Chart/ChartCard";
import { useDashboard } from "../../layouts/Dashboard/useDashboard";
import { useBackend } from "../../layouts/Wrapper";
import { TextWidgetModal } from "../TextWidgetModal";
import { ImageWidgetModal } from "../ImageWidgetModal";
import { EditWidgetModal } from "../EditWidgetModal";
import { useWidgetSuggestionsModal } from "../WidgetSuggestionsModal";
import { Content } from "@radix-ui/react-tabs";
import { DrilldownModal } from "../DrilldownModal";
export const DashboardGrid: React.FC<{ className?: string }> = ({ className }) => {
const { dashboard, widgets: allWidgets, widgetsLoaded } = useDashboard();
const { backend, adminMode } = useBackend();
const { setOpen } = useWidgetSuggestionsModal();
const ResponsiveGridLayout = useMemo(
() => WidthProvider(Responsive) as any,
[]
);
const editable = useMemo(() => {
return adminMode || dashboard?.settings?.can_edit_widget_layout;
}, [adminMode, dashboard]);
const grid_spacing = useMemo(() => {
return dashboard?.settings?.grid_spacing === undefined
? 10
: dashboard?.settings?.grid_spacing;
}, [dashboard]);
const grid_height = useMemo(() => {
return dashboard?.settings?.grid_height === undefined
? 10
: dashboard?.settings?.grid_height;
}, [dashboard]);
useEffect(() => {
if (allWidgets.length === 0 && widgetsLoaded) {
setOpen(true);
}
}, [allWidgets, widgetsLoaded]);
if (!dashboard)
return (
);
if (
allWidgets.length === 0 &&
(dashboard?.settings?.can_create_widgets || adminMode)
) {
return (
);
}
return (
<>
{(dashboard?.tabs && dashboard.tabs.length > 0 ? dashboard.tabs : [{ id: 0, label: "Default" }]).filter(a => !a.hidden).map((currentTab) => {
const filteredWidgets = allWidgets.filter((i: Widget) => {
return i.tab === currentTab.id;
});
const layouts =
filteredWidgets.length === 0
? { lg: [], sm: [] }
: {
lg: filteredWidgets.map((i: Widget) => {
let layouts = i.layouts;
return {
i: i.id,
x: layouts.lg.x,
y: layouts.lg.y,
w: layouts.lg.w,
h: layouts.lg.h,
minH: 4,
};
}),
sm: filteredWidgets.map((i: Widget) => {
let layouts = i.layouts;
return {
i: i.id,
x: layouts.sm?.x || layouts.lg.x,
y: layouts.sm?.y || layouts.lg.y,
w: layouts.sm?.w || layouts.lg.w,
h: layouts.sm?.h || layouts.lg.h,
minH: 4,
};
}),
};
const widgets = (filteredWidgets || []).map((i: Widget) => (
));
return (
{
if (!dashboard || !editable) return;
let newWidgets = allWidgets.filter(b => b.tab === currentTab.id).map((i: any) => {
let lgLayout = {
...allLayouts.lg.find((j: any) => j.i === i.id),
};
let smLayout = {
...allLayouts.sm.find((j: any) => j.i === i.id),
};
return {
...i,
layouts: {
lg: {
...i.layouts.lg,
h: lgLayout.h,
w: lgLayout.w,
x: lgLayout.x,
y: lgLayout.y,
},
sm: {
...i.layouts.sm,
h: smLayout.h,
w: smLayout.w,
x: smLayout.x,
y: smLayout.y,
},
},
};
});
// UPDATE ONLY THE WIDGETS THAT CHANGED
let updatedWidgets = newWidgets.filter((widget) => {
let oldWidget = allWidgets.find((i: any) => i.id === widget.id);
if (!oldWidget) return true;
return (
JSON.stringify(oldWidget.layouts) !==
JSON.stringify(widget.layouts)
);
});
if (dashboard && editable && updatedWidgets.length > 0) {
updatedWidgets.forEach((i) => {
backend?.widgets.update(i.id, {
layouts: i.layouts,
});
});
}
}}
>
{widgets}
);
})}
>
);
};