mirror of
https://github.com/formbricks/formbricks.git
synced 2025-12-26 00:10:21 -06:00
Compare commits
5 Commits
copilot/su
...
4.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e61aef9873 | ||
|
|
ad59b69c12 | ||
|
|
40203d77ba | ||
|
|
44f5291e0e | ||
|
|
f9835dd5c1 |
6
.github/workflows/formbricks-release.yml
vendored
6
.github/workflows/formbricks-release.yml
vendored
@@ -89,7 +89,7 @@ jobs:
|
||||
- check-latest-release
|
||||
with:
|
||||
IS_PRERELEASE: ${{ github.event.release.prerelease }}
|
||||
MAKE_LATEST: ${{ needs.check-latest-release.outputs.is_latest }}
|
||||
MAKE_LATEST: ${{ needs.check-latest-release.outputs.is_latest == 'true' }}
|
||||
|
||||
docker-build-cloud:
|
||||
name: Build & push Formbricks Cloud to ECR
|
||||
@@ -101,7 +101,7 @@ jobs:
|
||||
with:
|
||||
image_tag: ${{ needs.docker-build-community.outputs.VERSION }}
|
||||
IS_PRERELEASE: ${{ github.event.release.prerelease }}
|
||||
MAKE_LATEST: ${{ needs.check-latest-release.outputs.is_latest }}
|
||||
MAKE_LATEST: ${{ needs.check-latest-release.outputs.is_latest == 'true' }}
|
||||
needs:
|
||||
- check-latest-release
|
||||
- docker-build-community
|
||||
@@ -154,4 +154,4 @@ jobs:
|
||||
release_tag: ${{ github.event.release.tag_name }}
|
||||
commit_sha: ${{ github.sha }}
|
||||
is_prerelease: ${{ github.event.release.prerelease }}
|
||||
make_latest: ${{ needs.check-latest-release.outputs.is_latest }}
|
||||
make_latest: ${{ needs.check-latest-release.outputs.is_latest == 'true' }}
|
||||
|
||||
@@ -19,8 +19,7 @@ export const ENCRYPTION_KEY = env.ENCRYPTION_KEY;
|
||||
// Other
|
||||
export const CRON_SECRET = env.CRON_SECRET;
|
||||
export const DEFAULT_BRAND_COLOR = "#64748b";
|
||||
export const FB_LOGO_URL =
|
||||
"https://s3.eu-central-1.amazonaws.com/listmonk-formbricks/Formbricks-Light-transparent.png";
|
||||
export const FB_LOGO_URL = `${WEBAPP_URL}/logo-transparent.png`;
|
||||
|
||||
export const PRIVACY_URL = env.PRIVACY_URL;
|
||||
export const TERMS_URL = env.TERMS_URL;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
import * as Collapsible from "@radix-ui/react-collapsible";
|
||||
import { Hand } from "lucide-react";
|
||||
import { usePathname } from "next/navigation";
|
||||
import { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { TSurvey, TSurveyQuestionId, TSurveyWelcomeCard } from "@formbricks/types/surveys/types";
|
||||
import { TUserLocale } from "@formbricks/types/user";
|
||||
@@ -38,8 +37,6 @@ export const EditWelcomeCard = ({
|
||||
}: EditWelcomeCardProps) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const [firstRender, setFirstRender] = useState(true);
|
||||
|
||||
const path = usePathname();
|
||||
const environmentId = path?.split("/environments/")[1]?.split("/")[0];
|
||||
|
||||
@@ -138,8 +135,6 @@ export const EditWelcomeCard = ({
|
||||
setSelectedLanguageCode={setSelectedLanguageCode}
|
||||
locale={locale}
|
||||
isStorageConfigured={isStorageConfigured}
|
||||
firstRender={firstRender}
|
||||
setFirstRender={setFirstRender}
|
||||
/>
|
||||
</div>
|
||||
<div className="mt-3">
|
||||
@@ -155,8 +150,6 @@ export const EditWelcomeCard = ({
|
||||
setSelectedLanguageCode={setSelectedLanguageCode}
|
||||
locale={locale}
|
||||
isStorageConfigured={isStorageConfigured}
|
||||
firstRender={firstRender}
|
||||
setFirstRender={setFirstRender}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -177,8 +170,6 @@ export const EditWelcomeCard = ({
|
||||
label={t("environments.surveys.edit.next_button_label")}
|
||||
locale={locale}
|
||||
isStorageConfigured={isStorageConfigured}
|
||||
firstRender={firstRender}
|
||||
setFirstRender={setFirstRender}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -32,16 +32,6 @@ vi.mock("@/lib/styling/constants", () => ({
|
||||
},
|
||||
}));
|
||||
|
||||
// Mock recall utility
|
||||
vi.mock("@/lib/utils/recall", () => ({
|
||||
recallToHeadline: vi.fn((headline) => headline),
|
||||
}));
|
||||
|
||||
// Mock text content extraction
|
||||
vi.mock("@formbricks/types/surveys/validation", () => ({
|
||||
getTextContent: vi.fn((text) => text),
|
||||
}));
|
||||
|
||||
describe("Metadata Utils", () => {
|
||||
// Reset all mocks before each test
|
||||
beforeEach(() => {
|
||||
@@ -183,75 +173,6 @@ describe("Metadata Utils", () => {
|
||||
WEBAPP_URL: "https://test.formbricks.com",
|
||||
}));
|
||||
});
|
||||
|
||||
test("handles welcome card headline with HTML content", async () => {
|
||||
const { getTextContent } = await import("@formbricks/types/surveys/validation");
|
||||
|
||||
const mockSurvey = {
|
||||
id: mockSurveyId,
|
||||
environmentId: mockEnvironmentId,
|
||||
name: "Test Survey",
|
||||
metadata: {},
|
||||
languages: [],
|
||||
welcomeCard: {
|
||||
enabled: true,
|
||||
timeToFinish: false,
|
||||
showResponseCount: false,
|
||||
headline: {
|
||||
default: "<p>Welcome <strong>Headline</strong></p>",
|
||||
},
|
||||
html: {
|
||||
default: "Welcome Description",
|
||||
},
|
||||
} as TSurveyWelcomeCard,
|
||||
} as TSurvey;
|
||||
|
||||
vi.mocked(getSurvey).mockResolvedValue(mockSurvey);
|
||||
vi.mocked(getTextContent).mockReturnValue("Welcome Headline");
|
||||
|
||||
const result = await getBasicSurveyMetadata(mockSurveyId);
|
||||
|
||||
expect(getTextContent).toHaveBeenCalled();
|
||||
expect(result.title).toBe("Welcome Headline");
|
||||
});
|
||||
|
||||
test("handles welcome card headline with recall variables", async () => {
|
||||
const { recallToHeadline } = await import("@/lib/utils/recall");
|
||||
|
||||
const mockSurvey = {
|
||||
id: mockSurveyId,
|
||||
environmentId: mockEnvironmentId,
|
||||
name: "Test Survey",
|
||||
metadata: {},
|
||||
languages: [],
|
||||
welcomeCard: {
|
||||
enabled: true,
|
||||
timeToFinish: false,
|
||||
showResponseCount: false,
|
||||
headline: {
|
||||
default: "Welcome #recall:name/fallback:User#",
|
||||
},
|
||||
html: {
|
||||
default: "Welcome Description",
|
||||
},
|
||||
} as TSurveyWelcomeCard,
|
||||
} as TSurvey;
|
||||
|
||||
vi.mocked(getSurvey).mockResolvedValue(mockSurvey);
|
||||
vi.mocked(recallToHeadline).mockReturnValue({
|
||||
default: "Welcome @User",
|
||||
});
|
||||
|
||||
const result = await getBasicSurveyMetadata(mockSurveyId);
|
||||
|
||||
expect(recallToHeadline).toHaveBeenCalledWith(
|
||||
mockSurvey.welcomeCard.headline,
|
||||
mockSurvey,
|
||||
false,
|
||||
"default"
|
||||
);
|
||||
expect(result.title).toBe("Welcome @User");
|
||||
});
|
||||
});
|
||||
|
||||
describe("getSurveyOpenGraphMetadata", () => {
|
||||
|
||||
@@ -262,22 +262,27 @@ export const ToolbarPlugin = (
|
||||
const root = $getRoot();
|
||||
root.clear();
|
||||
root.append(...nodes);
|
||||
|
||||
editor.registerUpdateListener(({ editorState }) => {
|
||||
editorState.read(() => {
|
||||
const textInHtml = $generateHtmlFromNodes(editor)
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/white-space:\s*pre-wrap;?/g, "");
|
||||
setText.current(textInHtml);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
// Register text-saving update listener - always active for each editor instance
|
||||
useEffect(() => {
|
||||
const unregister = editor.registerUpdateListener(({ editorState }) => {
|
||||
editorState.read(() => {
|
||||
const textInHtml = $generateHtmlFromNodes(editor)
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/white-space:\s*pre-wrap;?/g, "");
|
||||
setText.current(textInHtml);
|
||||
});
|
||||
});
|
||||
|
||||
return unregister;
|
||||
}, [editor]);
|
||||
|
||||
useEffect(() => {
|
||||
return mergeRegister(
|
||||
editor.registerUpdateListener(({ editorState }) => {
|
||||
|
||||
BIN
apps/web/public/logo-transparent.png
Normal file
BIN
apps/web/public/logo-transparent.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
Reference in New Issue
Block a user