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 + } + /> +
); };