diff --git a/forms_pro/api/form.py b/forms_pro/api/form.py index 6bb7fae..05e9df9 100644 --- a/forms_pro/api/form.py +++ b/forms_pro/api/form.py @@ -17,6 +17,25 @@ class FormSharedWithResponse(BaseModel): submit: bool +@frappe.whitelist(allow_guest=True) +def is_login_required(route: str) -> bool: + """ + Check if login is enabled for a form. + + args: + route: str - The route of the form to check. + + returns: + bool - True if login is required, False otherwise. + """ + login_enabled = frappe.db.get_value( + doctype="Form", + filters={"route": route}, + fieldname="login_required", + ) + return bool(login_enabled) + + @frappe.whitelist(allow_guest=True) def get_form_by_route(route: str) -> dict: form_id = frappe.db.get_value("Form", {"route": route}, pluck="name") diff --git a/forms_pro/api/settings.py b/forms_pro/api/settings.py new file mode 100644 index 0000000..0233b89 --- /dev/null +++ b/forms_pro/api/settings.py @@ -0,0 +1,13 @@ +import frappe +from frappe.core.doctype.navbar_settings.navbar_settings import get_app_logo + + +@frappe.whitelist(allow_guest=True) +def get_brand_logo() -> str: + """ + Get the brand logo for the form. + + Returns: + str: The brand logo of the website or the default app logo if brand logo is not set. + """ + return str(get_app_logo()) diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 9ec01ed..70baf03 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -22,6 +22,7 @@ declare module 'vue' { FormHeader: typeof import('./src/components/submission/FormHeader.vue')['default'] FormPreviewCard: typeof import('./src/components/dashboard/FormPreviewCard.vue')['default'] FormRenderer: typeof import('./src/components/submission/FormRenderer.vue')['default'] + PageHeader: typeof import('./src/components/submission/PageHeader.vue')['default'] RemoveAccessModal: typeof import('./src/components/form/manage/RemoveAccessModal.vue')['default'] RenderField: typeof import('./src/components/RenderField.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] diff --git a/frontend/src/components/FormBuilderHeader.vue b/frontend/src/components/FormBuilderHeader.vue index 8173302..954b914 100644 --- a/frontend/src/components/FormBuilderHeader.vue +++ b/frontend/src/components/FormBuilderHeader.vue @@ -10,12 +10,21 @@ const router = useRouter(); const editFormStore = useEditForm(); const openFormSubmissionPage = () => { - const routeData = router.resolve({ - name: "Form Submission Page", - params: { - route: editFormStore.originalFormData?.route, - }, - }); + const route = editFormStore.originalFormData?.route; + if (!route) return; + + // Why router.resolve() with named route + params doesn't work: + // Vue Router URL-encodes parameter values when using the params object, + // even with catch-all routes. So a route like "s/something" becomes "s%2Fsomething". + // + // Solution: Get the route definition and construct the path manually, + // then use router.resolve() with the path string (which doesn't get encoded). + // This way, if the path changes in router.ts, this code still works. + const routeRecord = router.getRoutes().find((r) => r.name === "Form Submission Page"); + if (!routeRecord) return; + + const path = routeRecord.path.replace(":route(.*)", route); + const routeData = router.resolve(path); window.open(routeData.href, "_blank"); }; diff --git a/frontend/src/components/RenderField.vue b/frontend/src/components/RenderField.vue index c0e3370..00fb3c2 100644 --- a/frontend/src/components/RenderField.vue +++ b/frontend/src/components/RenderField.vue @@ -1,6 +1,7 @@ -