diff --git a/apps/nextjs/src/components/board/items/item-select-modal.tsx b/apps/nextjs/src/components/board/items/item-select-modal.tsx
index 5048d0f36..1fc5ffd42 100644
--- a/apps/nextjs/src/components/board/items/item-select-modal.tsx
+++ b/apps/nextjs/src/components/board/items/item-select-modal.tsx
@@ -652,19 +652,47 @@ const WidgetLivePreviewAndConfigPane = ({
}
return (
-
+ (
+
+
+
+
+
+
+
+ Failed to load widget preview
+
+
+ {error instanceof Error ? error.message : String(error)}
+
+
+
+
+
+
+
+
+ )}
+ >
+
+
);
};
@@ -759,8 +787,16 @@ const WidgetLivePreviewAndConfigContent = ({
},
});
- const previewIntegrationIds =
- form.values.integrationIds.length > 0 ? form.values.integrationIds : mockIntegration ? [mockIntegration.id] : [];
+ const validIntegrationIds = useMemo(() => {
+ const compatibleIds = new Set(compatibleIntegrations.map((i) => i.id));
+ return form.values.integrationIds.filter((id) => compatibleIds.has(id));
+ }, [form.values.integrationIds, compatibleIntegrations]);
+
+ const previewIntegrationIds = useMemo(() => {
+ if (validIntegrationIds.length > 0) return validIntegrationIds;
+ if (supportsMock && mockIntegration) return [mockIntegration.id];
+ return [];
+ }, [validIntegrationIds, supportsMock, mockIntegration]);
const { mutateAsync: createMockIntegration, isPending: isCreatingMock } = clientApi.integration.create.useMutation({
async onSuccess(data) {
@@ -862,7 +898,7 @@ const WidgetLivePreviewAndConfigContent = ({
size="sm"
leftSection={}
loading={isAdding}
- onClick={() => onAddWidget(form.values.options, form.values.integrationIds)}
+ onClick={() => onAddWidget(form.values.options, validIntegrationIds)}
>
{t("common.action.add")}
@@ -870,13 +906,13 @@ const WidgetLivePreviewAndConfigContent = ({
- {/* Live Widget Preview Frame (Simulating a 3x3 board widget tile) */}
+ {/* Live Widget Preview Frame (Simulating a 5x3 board widget tile) */}
- Preview (3×3)
+ Preview (5×3)
- {form.values.integrationIds.length === 0 && Boolean(mockIntegration) && hasIntegrationSupport && (
+ {validIntegrationIds.length === 0 && Boolean(mockIntegration) && supportsMock && (
Showing Demo / Mock Data
@@ -892,8 +928,9 @@ const WidgetLivePreviewAndConfigContent = ({
bg="light-dark(var(--mantine-color-body), var(--mantine-color-dark-7))"
style={{
width: "100%",
- maxWidth: 360,
- height: 360,
+ maxWidth: 500,
+ height: 300,
+ aspectRatio: "5 / 3",
overflow: "hidden",
position: "relative",
containerType: "size",
@@ -918,8 +955,8 @@ const WidgetLivePreviewAndConfigContent = ({
utils.integration.all.ensureData()}
- isAdmin={isAdmin}
- canCreateIntegration={canCreateIntegration}
- initialWidgetKind={innerProps.initialWidgetKind}
- initialSearch={
- innerProps.initialWidgetKind
- ? t(`widget.${innerProps.initialWidgetKind}.name`)
- : innerProps.initialIntegrationKind
- ? getIntegrationName(innerProps.initialIntegrationKind)
- : undefined
- }
- />
+ (
+
+
+
+ {t("common.error")}
+
+
+ {error instanceof Error ? error.message : String(error)}
+
+
+
+
+ )}
+ >
+ utils.integration.all.ensureData()}
+ isAdmin={isAdmin}
+ canCreateIntegration={canCreateIntegration}
+ initialWidgetKind={innerProps.initialWidgetKind}
+ initialSearch={
+ innerProps.initialWidgetKind
+ ? t(`widget.${innerProps.initialWidgetKind}.name`)
+ : innerProps.initialIntegrationKind
+ ? getIntegrationName(innerProps.initialIntegrationKind)
+ : undefined
+ }
+ />
+
);
};