Compare commits

...

160 Commits

Author SHA1 Message Date
Piyush Gupta 5267fff6b2 fix: flex alignment 2024-10-01 19:34:44 +05:30
Aashish Anand a6d592307c Merge branch 'main' into fix-dark-mode-3209 2024-10-01 18:07:27 +05:30
Harsh Singh 354ec1b887 fix: remove scrollbar in rich text editor (#3236)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-10-01 12:25:16 +00:00
Aashish Anand d5bc70846e Merge branch 'main' into fix-dark-mode-3209 2024-10-01 17:52:35 +05:30
Dhruwang Jariwala 87c584add8 fix: validations in integrations (#3238) 2024-10-01 11:56:36 +00:00
anandaashish74711 49e0b8fc0f Fix dark mode in demo apps #3209 2024-10-01 17:05:56 +05:30
Anshuman Pandey 5035e3db9d feat: adds contact info question type (#3176)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-10-01 11:11:45 +00:00
Matti Nannt b7f4097508 chore: improve pipeline performance (#3184)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
2024-09-30 14:32:48 +00:00
Piyush Gupta 26591d9b9f feat: Advanced logic editor (#3020)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-09-30 10:25:22 +00:00
Piyush Gupta 655b67c3ad fix: preserve last environment id (#3185) 2024-09-30 06:57:51 +00:00
Piyush Gupta 2dbd7111a9 fix: getMonthlyOrganizationResponseCount for free plan users (#3219) 2024-09-30 06:26:14 +00:00
Johannes 06ddee42a9 Update oss-gg-hack-submission.yml 2024-09-29 13:45:04 -07:00
Johannes 47aa84bf8a Update oss-gg-hack-submission.yml 2024-09-29 13:41:52 -07:00
Johannes 2f7a59817a Update oss-gg-hack-submission.yml 2024-09-29 13:26:46 -07:00
Johannes e7a0228bfa Update oss-gg-hack-submission.yml 2024-09-29 13:25:50 -07:00
Johannes 2367313ff2 feat: adding side quest tracker files (#3189) 2024-09-29 13:02:46 -07:00
Johannes 68e52954e2 docs: add shareable dashboard page (#3188) 2024-09-28 17:16:03 -07:00
Dhruwang Jariwala 59ebde49cf fix: mls missing language toggle (#3143)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-28 05:11:21 +00:00
Dhruwang Jariwala 6ab2560432 fix: 50% scroll (#3174)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-28 04:15:47 +00:00
Dhruwang Jariwala 861d399025 feat: Search bar in persons table (#3169)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-09-27 09:42:44 +00:00
Thomas Sieffert fc3886fafa fix(docs): S3 endpoint was wrong (#3182) 2024-09-27 10:25:58 +02:00
Matti Nannt ddf7ad8475 chore: update ui package structure & add shadcn-ui cli support (#3178)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-26 12:08:21 +00:00
Jonas Höbenreich ad6d5d6c00 fix: small typos (#3179) 2024-09-26 09:03:01 +00:00
Piyush Gupta 315aaac395 fix: product headline (#3173) 2024-09-25 08:56:38 +00:00
Dhruwang Jariwala 01ceaa13ec fix: load more button applies filter (#3167) 2024-09-23 12:37:07 +00:00
Piyush Gupta 25774f6f08 chore: removes stale action docs (#3166) 2024-09-23 04:43:13 +00:00
Dhruwang Jariwala 9a98772210 fix: notion integration (#3162) 2024-09-20 14:17:28 +00:00
Piyush Gupta 59a29dd3d6 feat: Introduce Formbricks CX (#3152)
Co-authored-by: RajuGangitla <gangitlaraju8520@gmail.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-20 09:17:18 +00:00
Dhruwang Jariwala e4fceb2e5e fix: improved person fetching (#3161) 2024-09-20 05:09:22 +00:00
Dhruwang Jariwala 0b553447e0 fix: person loading skeleton (#3160) 2024-09-19 16:44:16 +00:00
Dhruwang Jariwala 6b64367d99 feat: Data table for persons (#3154) 2024-09-19 13:34:25 +00:00
Matti Nannt fe9746ba67 fix: update displays data migration run out of memory on many displays (#3157)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-19 11:00:39 +00:00
Dhruwang Jariwala e4009d5951 chore: Refactor display response relationship (#3100)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-18 10:55:46 +00:00
Sai Suhas Sawant b1ed61c247 fix: Added DialogTitle and DialogDescrtiption components to the dialog. (#3146)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-18 09:53:50 +00:00
Anshuman Pandey 10255aa102 fix: api errors (#3150)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-18 09:52:05 +00:00
mdm317 774c6f19a5 fix: notes not appearing (#3131)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-18 09:37:36 +00:00
Piyush Gupta ebf35ea582 feat: adds auto animate to survey questions (#3147)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-17 09:24:12 +00:00
Anshuman Pandey f13efc954e fix: removes rewrites from next config (#3149) 2024-09-17 09:19:21 +00:00
Matti Nannt 9ee052a229 feat: Make app surveys scalable (#3024)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-17 08:15:19 +00:00
RajuGangitla 152fbede90 feat: info about new formbricks version (#3126)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-17 07:35:19 +00:00
Dhruwang Jariwala c9b8ffa9ef fix: billing tab (#3138)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-16 10:31:54 +00:00
Anshuman Pandey 04e16d44a1 fix: release 2.5.3 (#3139) 2024-09-12 16:07:39 +02:00
Jonas Höbenreich 29131f93c2 fix: increase timeout (#3120)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-12 15:35:12 +02:00
Anshuman Pandey 1e2fe7b066 fix: validation UI (#3137)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-12 11:52:58 +00:00
Johannes 426a0a3847 fix: tweak action UI (#3136) 2024-09-12 11:50:58 +00:00
Jonas Höbenreich 80ef504bef fix: Device Info Overflowing for Long URLs (#3135)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-12 11:44:41 +00:00
Anshuman Pandey 6ab83e25d3 fix: multi lang issue sync (#3132)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-12 10:59:15 +00:00
Jonas Höbenreich 688dc25990 fix: cuid validation 🚨 (#3130) 2024-09-12 10:26:33 +00:00
Johannes c53b58c64f fix: update RN docs (#3127) 2024-09-11 12:00:04 +02:00
Piyush Gupta 61d18edb5d feat: add support for webp file format in file inputs (#3117)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-11 08:53:05 +00:00
Anshuman Pandey 07b5dfe28a fix: trigger (#3125) 2024-09-11 04:31:37 +00:00
Anshuman Pandey f55cad0121 fix: multi lang sync issue (#3121)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-10 12:37:55 +00:00
Dhruwang Jariwala 494299cd89 fix: optional behaviour for matrix question (#3118) 2024-09-10 12:32:42 +00:00
RajuGangitla 5cc071e5a8 fix: Loading Skeleton for survey summary page (#3108)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-09 15:11:56 +00:00
Anshuman Pandey 0532f2744b feat: delete uploaded files with response deletion (#3114) 2024-09-09 12:24:25 +00:00
Anshuman Pandey 43ea26a33a fix: segment update (#3115) 2024-09-09 11:47:38 +00:00
Piyush Gupta ec54e40a8b fix: SSRF vulnerability in unsplash image fetching (#3111)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-09 10:46:07 +00:00
Dhruwang Jariwala 4b508f02e3 fix: added people column to data table (#3110)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-09 04:30:35 +00:00
Johannes eec7e1b62a fix: update docs (#3113) 2024-09-08 15:29:32 +02:00
Johannes 39e87eb8d3 fix: remove description from new questions (#3112) 2024-09-07 14:25:55 +02:00
Dhruwang Jariwala 780115ffb8 fix: infinite loading in survey animation (#3107) 2024-09-06 07:02:57 +00:00
Anshuman Pandey c7c4ba6e49 release 2.5.1 (#3103) 2024-09-05 12:55:29 +02:00
Piyush Gupta b9a7edf1f5 fix: create response via api can change created and updated at (#3091) 2024-09-05 10:34:42 +00:00
Dhruwang Jariwala 86bf2accc9 style: tweak environment switch (#3102) 2024-09-05 10:29:59 +00:00
Anshuman Pandey 954c435404 fix: setAttribute error in the js package (#3099) 2024-09-05 09:23:49 +00:00
Johannes 538c1bd809 feat: add new template to GitHub (#3101) 2024-09-05 11:33:00 +02:00
Johannes e0767881f2 fix: update link to landing page (#3097) 2024-09-05 09:21:09 +02:00
Dhruwang Jariwala 7d0cbad326 feat: one response per email (#3088)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-04 12:43:03 +00:00
Dhruwang Jariwala 0ce7703ab8 fix: data table tweaks (#3095) 2024-09-04 12:40:51 +00:00
Dhruwang Jariwala 4362fdf35a fix: verified email to exports (#3094) 2024-09-04 12:35:29 +00:00
Dhruwang Jariwala 4bcca2daf4 fix: hidden fields in data table (#3087)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-04 08:45:30 +00:00
Piyush Gupta a1d83ac7b9 fix: final bugs in release 2.5 (#3084) 2024-09-03 12:22:28 +00:00
Piyush Gupta 492729baf3 docs: adds data migration guide for formbricks 2.5 release (#3083) 2024-09-03 10:54:25 +00:00
Dhruwang Jariwala 4003d21826 feat: Relevance option for sorting (#2968)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-03 10:43:55 +00:00
Piyush Gupta b10d398728 fix: Summary auto-update also queries when not in focus (#3067)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-03 09:22:18 +00:00
Dhruwang Jariwala 198df84b89 fix: NPS response exported as empty string (#3080)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-03 08:58:48 +00:00
Dhruwang Jariwala 211fc22b2a fix: docs app build (#3081) 2024-09-03 08:30:48 +00:00
Dhruwang Jariwala 4a0a5c9591 feat: Data table view for Responses (#3053)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-03 03:19:58 +00:00
Sai Suhas Sawant 8f51afe198 feat: skeleton loading #3051 (#3057)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-02 15:16:50 +00:00
Dhruwang Jariwala 40b6642ef0 fix: caching issue for resultShareKey (#3063) 2024-09-02 14:35:54 +00:00
Dhruwang Jariwala 0076cbaf54 fix: Validation for callback URL (#3061) 2024-09-02 13:15:57 +00:00
Dhruwang Jariwala 14e0d57091 chore: removed environmentId from language services (#3070) 2024-09-02 12:57:55 +00:00
Johannes 3e79ec9a61 fix: change question type CTA wording (#3076) 2024-08-31 11:22:16 +02:00
Johannes 42cd7d3b77 feat: reword RN docs and tweak for SEO (#3073) 2024-08-30 18:47:56 +02:00
Dhruwang Jariwala 6f4c65c178 fix: tweaked preview (#3072)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-08-30 15:31:38 +00:00
Naitik Kapadia 863424ffd7 feat: Add Ranking Question (#2996)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-08-30 11:21:36 +00:00
Dhruwang Jariwala c35cfbd170 fix: reset survey button (#3069) 2024-08-30 11:00:51 +00:00
Dhruwang Jariwala 22425726d1 fix: other filter not working (#3041)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-29 12:53:15 +00:00
Anshuman Pandey 94e8c1da68 fix: survey cache invalidation in survey-status cron (#3066) 2024-08-29 12:27:35 +00:00
Dhruwang Jariwala 55c305c569 fix: rounded-corner-gap=issue (#3064)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-29 12:26:25 +00:00
Piyush Gupta ad028947e0 fix: new survey button visible to viewers (#3065) 2024-08-29 11:31:39 +00:00
mdm317 212e0753c8 fix: closing survey on mobile falsely positions it (#3004)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-08-27 12:24:47 +00:00
Matti Nannt 711dc83f5c fix: build errors on docs page (#3056) 2024-08-27 10:35:01 +02:00
Matti Nannt 6314eeda0a chore: release js 2.2.0 (#3055) 2024-08-27 10:01:21 +02:00
Anshuman Pandey cf783ea480 fix: s3 file upload (#3050)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-26 14:43:25 +00:00
Filip Gornitzka Abelson 899fbef948 feat: replace emojis in survey editor and survey fetching (#3047)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-26 12:39:41 +00:00
Anshuman Pandey 4a6d7952a7 fix: segment evaluation fix (#3043) 2024-08-26 05:04:37 +00:00
Matti Nannt 5443226e27 chore: increase react-native version number to 1.0.0 (#3046) 2024-08-23 21:31:57 +02:00
ty kerr 89ffe99dcc feat: react native sdk (#2565)
Co-authored-by: tykerr <tykerr@gmail.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-23 12:43:49 +02:00
Dhruwang Jariwala ede306b88e fix: matrix question validation (#3030)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-23 10:05:28 +00:00
Dhruwang Jariwala 0acc49c57d fix: open outbound links in new tab (#3042) 2024-08-23 10:11:22 +02:00
Matti Nannt 2bbeb040c2 fix: use createdAt instead of updatedAt in responseCard (#3040) 2024-08-22 11:14:08 +00:00
Piyush Gupta 5689c36b12 feat: adds management endpoint to generate multiple suId (#3022)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-22 09:55:13 +00:00
Anshuman Pandey f4a367d2de feat: survey variables (#3013)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-22 09:43:39 +00:00
Dhruwang Jariwala afe042ecfc fix: member invite issues (#3028)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-22 08:55:44 +00:00
Anshuman Pandey c108cd4780 fix: js command queue support for late initialization (#2974) 2024-08-21 11:12:30 +00:00
Dhruwang Jariwala d84146fd88 fix: display creation (#3034) 2024-08-21 07:03:34 +00:00
use-tusk[bot] 30e6316e16 feat: Add support for managing path style in S3 compatible service (#3031)
Co-authored-by: use-tusk[bot] <144006087+use-tusk[bot]@users.noreply.github.com>
2024-08-20 10:16:48 +00:00
Dhruwang Jariwala 6835e585b0 fix: missing question type in Add question below menu (#3029) 2024-08-20 08:59:17 +02:00
Matti Nannt 49d4f43652 chore: add address collection to stripe checkout (#3025) 2024-08-19 14:37:22 +00:00
Matti Nannt 70dd9c7724 fix: dismissed inconsistency data migration fails with many entries (#3021) 2024-08-19 12:20:39 +02:00
Piyush Gupta f386e47efa fix: Let CTA and consent question store nothing if dismissed (#2977)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-19 08:50:19 +00:00
Piyush Gupta ec16159497 chore: Move all server action to new authorization approach (#2999) 2024-08-19 07:07:37 +00:00
Vishal Tyagi 5ba2959eb4 feat: Added ColorPicker component to Storybook (#3019) 2024-08-19 06:59:10 +00:00
Saurabh Chaddha e9c5b00628 fix: recall info on thank you card (#3016) 2024-08-16 22:11:15 +02:00
Johannes 8e1f43eb8b fix: update upgrade plan notice (#3018) 2024-08-16 22:10:36 +02:00
Matti Nannt 3788293bc0 chore: npm dependency and version upgrades before release (#3014) 2024-08-15 21:18:05 +02:00
Matti Nannt 89a2e26f25 fix: remove failing prisma migration (#3015) 2024-08-15 16:42:43 +02:00
Piyush Gupta 2c453bd491 fix: Filters do not apply to summary impressions (#2986)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-15 14:02:34 +00:00
Matti Nannt 0aebf234f9 fix: styles get overwritten by loading indicator changes (#3012) 2024-08-15 14:09:29 +02:00
Dhruwang Jariwala 3e25ef4b5a fix: wait for background to load in survey loading indicator (#3011) 2024-08-15 06:53:47 +00:00
Dhruwang Jariwala 3dc3edb83e fix: progress bar on welcome card (#3006) 2024-08-15 06:51:41 +00:00
Piyush Gupta 4ebe144191 feat: Add auto-refresh to the analysis view (#3007)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-15 06:51:26 +00:00
Dhruwang Jariwala 49cd06a9b4 feat: Loading indicator for link surveys (#2982)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-14 16:34:02 +00:00
Anshuman Pandey e0208da0ac fix: sync call in e2e tests (#3010) 2024-08-14 13:06:07 +00:00
Anshuman Pandey 1f41770060 fix: catching errors in integrations (#2989) 2024-08-13 10:26:35 +00:00
Dhruwang Jariwala 3eff06281c fix: surveyEditor issues (#2997) 2024-08-13 10:23:47 +00:00
Matti Nannt 5848dfb4f3 fix: next-config env variables are not unique (#3003) 2024-08-12 17:42:35 +02:00
Piyush Gupta 89f27adce5 fix: adds default weekly summary notification value in signin (#2993)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-12 14:59:53 +00:00
Dhruwang Jariwala bbab7fa672 fix: linting warnings in email package (#2998) 2024-08-12 14:45:50 +00:00
Yuhang fb149796fa docs: add deploy to zeabur button in readme (#3000) 2024-08-12 16:13:10 +02:00
Piyush Gupta 3939013415 fix: setup shell script, removes input case sensitivity (#3002) 2024-08-12 16:09:37 +02:00
Anantesh G 7fe18e99c3 fix: Open external links in a new tab #2994 (#2995) 2024-08-10 11:08:27 +02:00
Anshuman Pandey 6ddfd29be8 fix: embed survey height (#2990) 2024-08-09 11:26:58 +02:00
Piyush Gupta 46efad94db fix: rating question email embed alignment (#2988) 2024-08-09 10:30:47 +02:00
Johannes b7ea073204 fix: sort features, update wording (#2985) 2024-08-09 08:26:14 +02:00
Matti Nannt 0d9c90ceeb fix: docker image permission issue (#2987)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-08-08 17:55:25 +02:00
Johannes 3ba23e1787 fix: fix typo in self-hosting license page (#2980) 2024-08-08 09:46:02 +02:00
Matthias Nannt e365718556 Merge branch 'main' of github.com:formbricks/formbricks 2024-08-07 23:44:27 +02:00
Matthias Nannt d65a49a7e7 fix: data migration type error 2024-08-07 23:40:11 +02:00
Matti Nannt 7960aaf5d5 fix: mls labels not set properly on question create (#2979) 2024-08-07 23:21:59 +02:00
Matti Nannt 32b3a7d1d0 fix: add data-migration fixing invalid jump end jump destination (#2972) 2024-08-07 16:57:13 +02:00
Piyush Gupta 53fb976fb6 feat: adds tls1.2 and 1.3 support, and HSTS config (#2897)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-07 16:52:14 +02:00
Johannes fffe71aa7e fix: add products with channel null to list (#2976) 2024-08-07 11:45:48 +00:00
Anshuman Pandey 75b0a3a407 fix: rename surveys to surveyTriggers (#2975) 2024-08-07 10:36:37 +00:00
Adam Gay 158689672a fix: Entra ID / Azure AD docs formatting and images (#2973)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-07 12:46:36 +02:00
Dhruwang Jariwala 24e43dd1a2 fix: filtering issue (#2971) 2024-08-07 09:15:18 +00:00
Matthias Nannt b34366aaf7 chore: increase formbricks version to 2.4.1 2024-08-06 14:46:20 +02:00
Matti Nannt 2856c8d125 fix: survey validation failing with custom questionId logic (#2969) 2024-08-06 11:18:01 +02:00
Adam Gay 4ac1e1d798 docs: update and improve Microsoft Entra ID / Azure AD app registration steps (#2965)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-06 08:44:15 +00:00
Anshuman Pandey b15d23035c fix: segment delete fix (#2967) 2024-08-06 08:38:05 +00:00
Johannes 8b2ea63ccb chore: tweaking product toggle (#2958) 2024-08-06 08:30:29 +00:00
Matti Nannt b0c65c76e6 chore: add environment created posthog event (#2966) 2024-08-05 20:51:25 +02:00
Smriti Doneria c65c1af023 feat: add ability to copy surveys between different environments of different products (#2832)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-08-05 15:04:58 +00:00
Matti Nannt f10bd9c0d8 chore: improve posthog tracking with survey created event (#2964) 2024-08-05 17:08:36 +02:00
mdm317 a6ac78294b fix: demo app responsive add favicon (#2960)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-05 15:36:33 +02:00
Jonas Höbenreich 04c9ead19d fix: fix typos (#2963) 2024-08-05 12:47:25 +00:00
Dhruwang Jariwala 3c3798ee98 feat: Apply filters from question summary (#2940)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-05 09:24:01 +00:00
Matthias Nannt 8df722ab02 fix: data migration docker image doesnt always get latest tag 2024-08-02 22:05:11 +02:00
Matthias Nannt dbe5ca60cd fix: endings migration type error 2024-08-02 21:51:42 +02:00
1018 changed files with 35966 additions and 12136 deletions
+10 -15
View File
@@ -11,33 +11,26 @@ WEBAPP_URL=http://localhost:3000
# Required for next-auth. Should be the same as WEBAPP_URL # Required for next-auth. Should be the same as WEBAPP_URL
NEXTAUTH_URL=http://localhost:3000 NEXTAUTH_URL=http://localhost:3000
# Set this if you want to have a shorter link for surveys
SHORT_URL_BASE=
# Encryption keys # Encryption keys
# Please set both for now, we will change this in the future # Please set both for now, we will change this in the future
# You can use: `openssl rand -hex 32` to generate one # You can use: `openssl rand -hex 32` to generate one
ENCRYPTION_KEY= ENCRYPTION_KEY=
# @see: https://next-auth.js.org/configuration/options#nextauth_secret
# You can use: `openssl rand -hex 32` to generate a secure one
NEXTAUTH_SECRET=
# API Secret for running cron jobs. (mandatory)
# You can use: `openssl rand -hex 32` to generate a secure one
CRON_SECRET=
############## ##############
# DATABASE # # DATABASE #
############## ##############
DATABASE_URL='postgresql://postgres:postgres@localhost:5432/formbricks?schema=public' DATABASE_URL='postgresql://postgres:postgres@localhost:5432/formbricks?schema=public'
###############
# NEXT AUTH #
###############
# @see: https://next-auth.js.org/configuration/options#nextauth_secret
# You can use: `openssl rand -hex 32` to generate a secure one
NEXTAUTH_SECRET=RANDOM_STRING
# API Secret for running cron jobs. (mandatory)
# You can use: `openssl rand -hex 32` to generate a secure one
CRON_SECRET=RANDOM_STRING
################ ################
# MAIL SETUP # # MAIL SETUP #
################ ################
@@ -77,6 +70,8 @@ S3_BUCKET_NAME=
# Configure a third party S3 compatible storage service endpoint like StorJ leave empty if you use Amazon S3 # Configure a third party S3 compatible storage service endpoint like StorJ leave empty if you use Amazon S3
# e.g., https://gateway.storjshare.io # e.g., https://gateway.storjshare.io
S3_ENDPOINT_URL= S3_ENDPOINT_URL=
# Force path style for S3 compatible storage (0 for disabled, 1 for enabled)
S3_FORCE_PATH_STYLE=0
##################### #####################
# Disable Features # # Disable Features #
@@ -0,0 +1,33 @@
name: oss.gg hack submission 🕹️
description: "Submit your contribution for the for the oss.gg hackathon"
title: "[🕹️]"
labels: 🕹️ oss.gg, player submission, hacktoberfest
assignees: []
body:
- type: textarea
id: contribution-name
attributes:
label: What side quest or challenge are you solving?
description: Add the name of the side quest or challenge.
validations:
required: true
- type: textarea
id: points
attributes:
label: Points
description: How many points are assigned to this contribution?
validations:
required: true
- type: textarea
id: description
attributes:
label: Description
description: What's the task your performed?
validations:
- type: textarea
id: proof
attributes:
label: Provide proof that you've completed the task
description: Screenshots, loom recordings, links to the content you shared or interacted with.
validations:
required: true
+3 -1
View File
@@ -53,10 +53,12 @@ runs:
run: cp .env.example .env run: cp .env.example .env
shell: bash shell: bash
- name: Fill ENCRYPTION_KE, ENTERPRISE_LICENSE_KEY and E2E_TESTING in .env - name: Fill ENCRYPTION_KEY, ENTERPRISE_LICENSE_KEY and E2E_TESTING in .env
run: | run: |
RANDOM_KEY=$(openssl rand -hex 32) RANDOM_KEY=$(openssl rand -hex 32)
sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
sed -i "s/ENTERPRISE_LICENSE_KEY=.*/ENTERPRISE_LICENSE_KEY=${RANDOM_KEY}/" .env sed -i "s/ENTERPRISE_LICENSE_KEY=.*/ENTERPRISE_LICENSE_KEY=${RANDOM_KEY}/" .env
echo "E2E_TESTING=${{ inputs.e2e_testing_mode }}" >> .env echo "E2E_TESTING=${{ inputs.e2e_testing_mode }}" >> .env
shell: bash shell: bash
+25 -25
View File
@@ -2,6 +2,8 @@ name: E2E Tests
on: on:
workflow_call: workflow_call:
workflow_dispatch: workflow_dispatch:
env:
TELEMETRY_DISABLED: 1
jobs: jobs:
build: build:
name: Run E2E Tests name: Run E2E Tests
@@ -25,29 +27,35 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout - uses: ./.github/actions/dangerous-git-checkout
- name: Build & Cache Web Binaries - name: Setup Node.js 20.x
uses: ./.github/actions/cache-build-web uses: actions/setup-node@v3
with: with:
e2e_testing_mode: "1" node-version: 20.x
- name: Check if pnpm is installed
id: pnpm-check
run: |
if pnpm --version; then
echo "pnpm is installed."
echo "PNPM_INSTALLED=true" >> $GITHUB_ENV
else
echo "pnpm is not installed."
echo "PNPM_INSTALLED=false" >> $GITHUB_ENV
fi
- name: Install pnpm - name: Install pnpm
if: env.PNPM_INSTALLED == 'false'
uses: pnpm/action-setup@v4 uses: pnpm/action-setup@v4
- name: Install dependencies - name: Install dependencies
if: env.PNPM_INSTALLED == 'false' run: pnpm install --config.platform=linux --config.architecture=x64
run: pnpm install shell: bash
- name: create .env
run: cp .env.example .env
shell: bash
- name: Fill ENCRYPTION_KEY, ENTERPRISE_LICENSE_KEY and E2E_TESTING in .env
run: |
RANDOM_KEY=$(openssl rand -hex 32)
sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
sed -i "s/ENTERPRISE_LICENSE_KEY=.*/ENTERPRISE_LICENSE_KEY=${RANDOM_KEY}/" .env
echo "E2E_TESTING=1" >> .env
shell: bash
- name: Build App
run: |
pnpm build --filter=@formbricks/web...
- name: Apply Prisma Migrations - name: Apply Prisma Migrations
run: | run: |
@@ -70,15 +78,7 @@ jobs:
sleep 10 sleep 10
done done
- name: Cache Playwright
uses: actions/cache@v3
id: playwright-cache
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install Playwright - name: Install Playwright
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: pnpm exec playwright install --with-deps run: pnpm exec playwright install --with-deps
- name: Run E2E Tests - name: Run E2E Tests
+5 -3
View File
@@ -25,10 +25,12 @@ jobs:
- name: create .env - name: create .env
run: cp .env.example .env run: cp .env.example .env
- name: Generate Random ENCRYPTION_KEY and fill in .env - name: Generate Random ENCRYPTION_KEY, CRON_SECRET & NEXTAUTH_SECRET and fill in .env
run: | run: |
ENCRYPTION_KEY=$(openssl rand -hex 32) RANDOM_KEY=$(openssl rand -hex 32)
sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${ENCRYPTION_KEY}/" .env sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
- name: Lint - name: Lint
run: pnpm lint run: pnpm lint
@@ -1,10 +1,5 @@
name: Docker for Data Migrations name: Docker for Data Migrations
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
on: on:
workflow_dispatch: workflow_dispatch:
push: push:
@@ -12,7 +7,6 @@ on:
- "v*" - "v*"
env: env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io REGISTRY: ghcr.io
IMAGE_NAME: formbricks/data-migrations IMAGE_NAME: formbricks/data-migrations
DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks?schema=public"
@@ -23,8 +17,6 @@ jobs:
permissions: permissions:
contents: read contents: read
packages: write packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write id-token: write
steps: steps:
@@ -50,6 +42,7 @@ jobs:
tags: | tags: |
type=ref,event=tag type=ref,event=tag
type=raw,value=${{ github.ref_name }} type=raw,value=${{ github.ref_name }}
type=raw,value=latest
- name: Build and push Docker image - name: Build and push Docker image
uses: docker/build-push-action@v3 uses: docker/build-push-action@v3
@@ -66,3 +59,4 @@ jobs:
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
run: | run: |
cosign sign --yes ghcr.io/${{ env.IMAGE_NAME }}:${{ github.ref_name }} cosign sign --yes ghcr.io/${{ env.IMAGE_NAME }}:${{ github.ref_name }}
cosign sign --yes ghcr.io/${{ env.IMAGE_NAME }}:latest
@@ -20,6 +20,20 @@ jobs:
id: lint_pr_title id: lint_pr_title
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
fix
feat
chore
docs
style
refactor
perf
test
build
ci
revert
ossgg
- uses: marocchino/sticky-pull-request-comment@v2 - uses: marocchino/sticky-pull-request-comment@v2
# When the previous steps fails, the workflow would stop. By adding this # When the previous steps fails, the workflow would stop. By adding this
+5 -3
View File
@@ -25,10 +25,12 @@ jobs:
- name: create .env - name: create .env
run: cp .env.example .env run: cp .env.example .env
- name: Generate Random ENCRYPTION_KEY and fill in .env - name: Generate Random ENCRYPTION_KEY, CRON_SECRET & NEXTAUTH_SECRET and fill in .env
run: | run: |
ENCRYPTION_KEY=$(openssl rand -hex 32) RANDOM_KEY=$(openssl rand -hex 32)
sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${ENCRYPTION_KEY}/" .env sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
- name: Test - name: Test
run: pnpm test run: pnpm test
+1 -1
View File
@@ -56,5 +56,5 @@ Zone.Identifier
packages/lib/uploads packages/lib/uploads
# Vite Timestamps # Vite Timestamps
vite.config.*.timestamp-* *vite.config.*.timestamp-*
+6
View File
@@ -144,6 +144,12 @@ Or you can also deploy Formbricks on [RepoCloud](https://repocloud.io) using the
[![Deploy on RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploy.png)](https://repocloud.io/details/?app_id=254) [![Deploy on RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploy.png)](https://repocloud.io/details/?app_id=254)
##### Zeabur
Or you can also deploy Formbricks on [Zeabur](https://zeabur.com) using the button below.
[![Deploy to Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/G4TUJL)
<a id="development"></a> <a id="development"></a>
## 👨‍💻 Development ## 👨‍💻 Development
+2
View File
@@ -0,0 +1,2 @@
EXPO_PUBLIC_API_HOST=http://192.168.178.20:3000
EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID=clzr04nkd000bcdl110j0ijyq
+7
View File
@@ -0,0 +1,7 @@
module.exports = {
extends: ["@formbricks/eslint-config/react.js"],
parserOptions: {
project: "tsconfig.json",
tsconfigRootDir: __dirname,
},
};
+35
View File
@@ -0,0 +1,35 @@
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
# dependencies
node_modules/
# Expo
.expo/
dist/
web-build/
# Native
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
# Metro
.metro-health-check*
# debug
npm-debug.*
yarn-debug.*
yarn-error.*
# macOS
.DS_Store
*.pem
# local env files
.env*.local
# typescript
*.tsbuildinfo
View File
+34
View File
@@ -0,0 +1,34 @@
{
"expo": {
"name": "react-native-demo",
"slug": "react-native-demo",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"jsEngine": "hermes",
"assetBundlePatterns": ["**/*"],
"ios": {
"supportsTablet": true,
"infoPlist": {
"NSCameraUsageDescription": "Take pictures for certain activities.",
"NSPhotoLibraryUsageDescription": "Select pictures for certain activities.",
"NSMicrophoneUsageDescription": "Need microphone access for recording videos."
}
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"web": {
"favicon": "./assets/favicon.png"
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

+6
View File
@@ -0,0 +1,6 @@
module.exports = function babel(api) {
api.cache(true);
return {
presets: ["babel-preset-expo"],
};
};
+7
View File
@@ -0,0 +1,7 @@
import { registerRootComponent } from "expo";
import { LogBox } from "react-native";
import App from "./src/app";
registerRootComponent(App);
LogBox.ignoreAllLogs();
+21
View File
@@ -0,0 +1,21 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const path = require("node:path");
const { getDefaultConfig } = require("expo/metro-config");
// Find the workspace root, this can be replaced with `find-yarn-workspace-root`
const workspaceRoot = path.resolve(__dirname, "../..");
const projectRoot = __dirname;
const config = getDefaultConfig(projectRoot);
// 1. Watch all files within the monorepo
config.watchFolders = [workspaceRoot];
// 2. Let Metro know where to resolve packages, and in what order
config.resolver.nodeModulesPaths = [
path.resolve(projectRoot, "node_modules"),
path.resolve(workspaceRoot, "node_modules"),
];
// 3. Force Metro to resolve (sub)dependencies only from the `nodeModulesPaths`
config.resolver.disableHierarchicalLookup = true;
module.exports = config;
+28
View File
@@ -0,0 +1,28 @@
{
"name": "@formbricks/demo-react-native",
"version": "1.0.0",
"main": "./index.js",
"scripts": {
"dev": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web",
"eject": "expo eject",
"clean": "rimraf .turbo node_modules .expo"
},
"dependencies": {
"@formbricks/js": "workspace:*",
"@formbricks/react-native": "workspace:*",
"expo": "^51.0.26",
"expo-status-bar": "~1.12.1",
"react": "^18.2.0",
"react-native": "^0.74.4",
"react-native-webview": "13.8.6"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@types/react": "~18.2.79",
"typescript": "^5.3.3"
},
"private": true
}
+52
View File
@@ -0,0 +1,52 @@
import { StatusBar } from "expo-status-bar";
import { Button, LogBox, StyleSheet, Text, View } from "react-native";
import Formbricks, { track } from "@formbricks/react-native";
LogBox.ignoreAllLogs();
export default function App(): JSX.Element {
if (!process.env.EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID) {
throw new Error("EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID is required");
}
if (!process.env.EXPO_PUBLIC_API_HOST) {
throw new Error("EXPO_PUBLIC_API_HOST is required");
}
const config = {
environmentId: process.env.EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID,
apiHost: process.env.EXPO_PUBLIC_API_HOST,
userId: "random-user-id",
attributes: {
language: "en",
testAttr: "attr-test",
},
};
return (
<View style={styles.container}>
<Text>Formbricks React Native SDK Demo</Text>
<Button
title="Trigger Code Action"
onPress={() => {
track("code").catch((error: unknown) => {
// eslint-disable-next-line no-console -- logging is allowed in demo apps
console.error("Error tracking event:", error);
});
}}
/>
<StatusBar style="auto" />
<Formbricks initConfig={config} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
alignItems: "center",
justifyContent: "center",
},
});
+6
View File
@@ -0,0 +1,6 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true
}
}
+1 -1
View File
@@ -2,4 +2,4 @@
/// <reference types="next/image-types/global" /> /// <reference types="next/image-types/global" />
// NOTE: This file should not be edited // NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information. // see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
+1 -1
View File
@@ -1,6 +1,6 @@
import type { AppProps } from "next/app"; import type { AppProps } from "next/app";
import Head from "next/head"; import Head from "next/head";
import "../styles/globals.css"; import "@formbricks/ui/globals.css";
const App = ({ Component, pageProps }: AppProps) => { const App = ({ Component, pageProps }: AppProps) => {
return ( return (
+3 -3
View File
@@ -60,9 +60,9 @@ const AppPage = ({}) => {
}, []); }, []);
return ( return (
<div className="h-screen bg-white px-12 py-6 dark:bg-slate-800"> <div className="min-h-screen bg-white px-12 py-6 dark:bg-slate-800">
<div className="flex flex-col justify-between md:flex-row"> <div className="flex flex-col justify-between md:flex-row">
<div className="flex items-center gap-2"> <div className="flex flex-col items-center gap-2 sm:flex-row">
<SurveySwitch value="app" formbricks={formbricks} /> <SurveySwitch value="app" formbricks={formbricks} />
<div> <div>
<h1 className="text-2xl font-bold text-slate-900 dark:text-white"> <h1 className="text-2xl font-bold text-slate-900 dark:text-white">
@@ -117,7 +117,7 @@ const AppPage = ({}) => {
</div> </div>
<div className="md:grid md:grid-cols-3"> <div className="md:grid md:grid-cols-3">
<div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-800"> <div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-900">
<h3 className="text-lg font-semibold dark:text-white"> <h3 className="text-lg font-semibold dark:text-white">
Reset person / pull data from Formbricks app Reset person / pull data from Formbricks app
</h3> </h3>
+5 -4
View File
@@ -56,9 +56,9 @@ const AppPage = ({}) => {
}); });
return ( return (
<div className="h-screen bg-white px-12 py-6 dark:bg-slate-800"> <div className="min-h-screen bg-white px-12 py-6 dark:bg-slate-800">
<div className="flex flex-col items-center justify-between md:flex-row"> <div className="flex flex-col justify-between md:flex-row">
<div className="flex items-center gap-2"> <div className="flex flex-col items-center gap-2 sm:flex-row">
<SurveySwitch value="website" formbricks={formbricks} /> <SurveySwitch value="website" formbricks={formbricks} />
<div> <div>
<h1 className="text-2xl font-bold text-slate-900 dark:text-white"> <h1 className="text-2xl font-bold text-slate-900 dark:text-white">
@@ -113,7 +113,7 @@ const AppPage = ({}) => {
</div> </div>
<div className="md:grid md:grid-cols-3"> <div className="md:grid md:grid-cols-3">
<div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-800"> <div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-900">
<h3 className="text-lg font-semibold dark:text-white"> <h3 className="text-lg font-semibold dark:text-white">
Reset person / pull data from Formbricks app Reset person / pull data from Formbricks app
</h3> </h3>
@@ -128,6 +128,7 @@ const AppPage = ({}) => {
}}> }}>
Reset Reset
</button> </button>
<p className="text-xs text-slate-700 dark:text-slate-300"> <p className="text-xs text-slate-700 dark:text-slate-300">
If you made a change in Formbricks app and it does not seem to work, hit &apos;Reset&apos; and If you made a change in Formbricks app and it does not seem to work, hit &apos;Reset&apos; and
try again. try again.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 15 KiB

-26
View File
@@ -1,26 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Example on overriding packages/js colors */
.dark {
--fb-brand-color: red;
--fb-brand-text-color: white;
--fb-border-color: green;
--fb-border-color-highlight: var(--slate-500);
--fb-focus-color: red;
--fb-heading-color: yellow;
--fb-subheading-color: green;
--fb-info-text-color: orange;
--fb-signature-text-color: blue;
--fb-survey-background-color: black;
--fb-accent-background-color: rgb(13, 13, 12);
--fb-accent-background-color-selected: red;
--fb-placeholder-color: white;
--fb-shadow-color: yellow;
--fb-rating-fill: var(--yellow-300);
--fb-rating-hover: var(--yellow-500);
--fb-back-btn-border: currentColor;
--fb-submit-btn-border: transparent;
--fb-rating-selected: black;
}
@@ -8,9 +8,9 @@ import RideHailing from "./ride-hailing.webp";
import UpsellMiro from "./upsell-miro.webp"; import UpsellMiro from "./upsell-miro.webp";
export const metadata = { export const metadata = {
title: "Advanced Targeting in Surveys | Formbricks", title: "Advanced Targeting for In-app Surveys | Formbricks",
description: description:
"Advanced Targeting allows you to show surveys to just the right group of people. You can target surveys based on user attributes, user events, metadata , literally anything! This helps you get more relevant feedback and make data-driven decisions. All of this without writing a single line of code.", "Advanced Targeting allows you to show surveys to just the right group of people. You can target surveys based on user attributes, user events, and metadata. This helps you get more relevant feedback and make data-driven decisions.",
}; };
#### App Surveys #### App Surveys
@@ -32,8 +32,7 @@ Advanced Targeting allows you to show surveys to the right group of people. You
## How to setup Advanced Targeting ## How to setup Advanced Targeting
<Note> <Note>
Advanced Targeting is available on the Pro plan! Don't worry, you just need to enter your credit card Advanced Targeting is available on the Pro plan!
details to start the freemium plan.
</Note> </Note>
1. On the Formbricks dashboard, click on **People** tab from the top navigation bar. 1. On the Formbricks dashboard, click on **People** tab from the top navigation bar.
@@ -72,25 +71,7 @@ Advanced Targeting allows you to show surveys to the right group of people. You
className="max-w-full rounded-lg sm:max-w-3xl" className="max-w-full rounded-lg sm:max-w-3xl"
/> />
3. Target High Value users who have $100k+ in their bank account, own 20+ stocks, and have are an active user. 3. Sneak Peak: How we at Formbricks automate inviting power users to chat with us
<MdxImage
src={Hni}
alt="Target Active High Net Worth Individuals"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
4. Target Germans on mobile phones who have regenerated chatGPT answers frequently in the last quarter and did so today.
<MdxImage
src={GermansGpt}
alt="Target Germans on Mobile Phones who have regenerated chatGPT answers frequently in the last quarter and did so today"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
5. Sneak Peak: How we at Formbricks automate inviting power users to chat with us
<MdxImage <MdxImage
src={PowerUsers} src={PowerUsers}
@@ -31,12 +31,18 @@ const libraries = [
description: "Simply add us to your router change and sit back!", description: "Simply add us to your router change and sit back!",
logo: logoVueJs, logo: logoVueJs,
}, },
{
href: "#react-native",
name: "React Native",
description: "Easily integrate our SDK with your React Native app for seamless survey support!",
logo: logoReactJs,
},
]; ];
export const Libraries = () => { export const Libraries = () => {
return ( return (
<div className="my-16 xl:max-w-none"> <div className="my-16 xl:max-w-none">
<div className="not-prose mt-4 grid grid-cols-1 gap-x-6 gap-y-10 border-slate-900/5 sm:grid-cols-2 xl:max-w-none xl:grid-cols-3 dark:border-white/5"> <div className="not-prose mt-4 grid grid-cols-1 gap-x-6 gap-y-10 border-slate-900/5 xl:max-w-none xl:grid-cols-2 2xl:grid-cols-3 dark:border-white/5">
{libraries.map((library) => ( {libraries.map((library) => (
<a <a
key={library.name} key={library.name}
@@ -346,6 +346,66 @@ router.afterEach((to, from) => {
Refer to our [Example VueJs project](https://github.com/formbricks/examples/tree/main/vuejs) for more help! Now visit the [Validate your Setup](#validate-your-setup) section to verify your setup! Refer to our [Example VueJs project](https://github.com/formbricks/examples/tree/main/vuejs) for more help! Now visit the [Validate your Setup](#validate-your-setup) section to verify your setup!
## React Native
Install the Formbricks React Native SDK using one of the package managers, i.e., npm, pnpm, or yarn.
<Col>
<CodeGroup title="Install Formbricks JS library">
```shell {{ title: 'npm' }}
npm install @formbricks/react-native
```
```shell {{ title: 'pnpm' }}
pnpm add @formbricks/react-native
```
```shell {{ title: 'yarn' }}
yarn add @formbricks/react-native
```
</CodeGroup>
</Col>
Now, update your App.js/App.tsx file to initialize Formbricks:
<Col>
<CodeGroup title="src/App.js">
```js
// other imports
import Formbricks from "@formbricks/react-native";
const config = {
environmentId: "<environment-id>",
apiHost: "<api-host>",
userId: "<user-id>",
};
export default function App() {
return (
<>
{/* Your app content */}
<Formbricks initConfig={config} />
</>
);
}
```
</CodeGroup>
</Col>
### Required customizations to be made
<Properties>
<Property name="environment-id" type="string">
Formbricks Environment ID.
</Property>
<Property name="api-host" type="string">
URL of the hosted Formbricks instance.
</Property>
<Property name="userId" type="string">
User ID of the user who has active session.
</Property>
</Properties>
---
## Validate your setup ## Validate your setup
Once you have completed the steps above, you can validate your setup by checking the **Setup Checklist** in the Settings. Your widget status indicator should go from this: Once you have completed the steps above, you can validate your setup by checking the **Setup Checklist** in the Settings. Your widget status indicator should go from this:
@@ -19,10 +19,12 @@ export const metadata = {
# Quickstart # Quickstart
App surveys have 6-10x better conversion rates than emailed out surveys. This tutorial explains how to run an app survey in your web app in 10 to 15 minutes. Lets go! App surveys have 6-10x better conversion rates than emailed surveys. This tutorial explains how to run a survey in both your web app and mobile app (React Native) in just 10 to 15 minutes. Lets go!
<Note> <Note>
App Surveys are ideal for websites that **have a user authentication** system. If you are looking to run surveys on your public facing website, head over to the [Website Surveys Quickstart Guide](/website-surveys/quickstart). App Surveys are ideal for websites that **have a user authentication** system. If you are looking to run
surveys on your public facing website, head over to the [Website Surveys Quickstart
Guide](/website-surveys/quickstart).
</Note> </Note>
1. **Create a free Formbricks Cloud account**: While you can [self-host](/self-hosting/deployment) Formbricks, but the quickest and easiest way to get started is with the free Cloud plan. Just [sign up here](https://app.formbricks.com/auth/signup) and you'll be guided to our onboarding like below: 1. **Create a free Formbricks Cloud account**: While you can [self-host](/self-hosting/deployment) Formbricks, but the quickest and easiest way to get started is with the free Cloud plan. Just [sign up here](https://app.formbricks.com/auth/signup) and you'll be guided to our onboarding like below:
@@ -35,7 +37,7 @@ App surveys have 6-10x better conversion rates than emailed out surveys. This tu
src={I1} src={I1}
alt="Choose website survey from survey type" alt="Choose website survey from survey type"
quality="100" quality="100"
className="max-w-full rounded-lg sm:max-w-3xl " className="max-w-full rounded-lg sm:max-w-3xl"
/> />
2. **Connect your App/Website**: Once you get through a couple of onboarding steps, youll be asked to connect your app or website. This is where youll find the code snippet for both HTML as well as the npm package which you need to embed in your app: 2. **Connect your App/Website**: Once you get through a couple of onboarding steps, youll be asked to connect your app or website. This is where youll find the code snippet for both HTML as well as the npm package which you need to embed in your app:
@@ -129,10 +129,8 @@ Locate that file. We are using the [Tailwind Template “Syntax”](https://tail
```tsx ```tsx
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useState } from "react"; import { useState } from "react";
import { Button } from "@formbricks/ui/components/Button";
import { Button } from "@formbricks/ui/Button"; import { Popover, PopoverContent, PopoverTrigger } from "@formbricks/ui/components/Popover";
import { Popover, PopoverContent, PopoverTrigger } from "@formbricks/ui/Popover";
import { handleFeedbackSubmit, updateFeedback } from "../../lib/handleFeedbackSubmit"; import { handleFeedbackSubmit, updateFeedback } from "../../lib/handleFeedbackSubmit";
export const DocsFeedback = () => { export const DocsFeedback = () => {
@@ -79,28 +79,6 @@ Promise<{ id: string }, NetworkError | Error>
</CodeGroup> </CodeGroup>
</Col> </Col>
- Update Display
<Col>
<CodeGroup title="Update Display">
```javascript {{ title: 'Update Display Method Call'}}
await api.client.display.update(
displayId: "<your-display-id>",
{
userId: "<your-user-id>", // optional
responseId: "<your-response-id>", // optional
},
);
```
```javascript {{ title: 'Update Display Method Return Type' }}
Promise<{ }, NetworkError | Error]>
```
</CodeGroup>
</Col>
## Responses ## Responses
- Create Response - Create Response
@@ -173,29 +151,6 @@ Promise<{ }, NetworkError | Error]>
</CodeGroup> </CodeGroup>
</Col> </Col>
## Action
- Create Action:
<Note> An environment cannot have 2 actions with the same name. </Note>
<Col>
<CodeGroup title="Create Action">
```javascript {{ title: 'Create Action Method Call'}}
await api.client.action.create({
name: "<your-action-name>", // required
userId: "<your-user-id>", // required
});
```
```javascript {{ title: 'Create Action Method Return Type' }}
Promise<{ }, NetworkError | Error]>
```
</CodeGroup>
</Col>
## Attribute ## Attribute
- Update Attribute - Update Attribute
@@ -7,12 +7,12 @@ import I3 from "./images/3-survey-logs-in-app-survey-popup.webp";
export const metadata = { export const metadata = {
title: "Formbricks App Survey SDK", title: "Formbricks App Survey SDK",
description: description:
"An overview of all available methods & how to integrate Formbricks App Surveys for frontend developers in web applications. Learn the key methods, configuration settings, and best practices.", "Integrate Formbricks App Surveys into your web apps with the Formbricks JS SDK for App Surveys. Learn how to initialize Formbricks, set attributes, track actions, and troubleshoot common issues.",
}; };
#### Developer Docs #### Developer Docs
# SDK: App Survey # SDK: Run Surveys Inside Your Web Apps
### Overview ### Overview
@@ -1,4 +1,9 @@
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@formbricks/ui/Accordion"; import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger,
} from "@formbricks/ui/components/Accordion";
import { FaqJsonLdComponent } from "./FAQPageJsonLd"; import { FaqJsonLdComponent } from "./FAQPageJsonLd";
const FAQ_DATA = [ const FAQ_DATA = [
@@ -94,6 +94,7 @@ cp .env.example .env
4. Generate & set some secret values mandatory for the `ENCRYPTION_KEY`, `NEXTAUTH_SECRET` and `CRON_SECRET` in the .env file. You can use the following command to generate the random string of required length: 4. Generate & set some secret values mandatory for the `ENCRYPTION_KEY`, `NEXTAUTH_SECRET` and `CRON_SECRET` in the .env file. You can use the following command to generate the random string of required length:
- For Linux - For Linux
<Col> <Col>
<CodeGroup title="For Linux"> <CodeGroup title="For Linux">
@@ -106,7 +107,8 @@ sed -i '/^CRON_SECRET=/c\CRON_SECRET='$(openssl rand -hex 32) .env
</CodeGroup> </CodeGroup>
</Col> </Col>
- For Mac - For Mac
<Col> <Col>
<CodeGroup title="For Mac"> <CodeGroup title="For Mac">
@@ -10,11 +10,15 @@ export const metadata = {
Welcome to the Developer Docs section, your comprehensive resource for integrating and utilizing Formbricks SDKs &APIs, as well as contributing to our open source codebase. Here's what you can expect to find in this section: Welcome to the Developer Docs section, your comprehensive resource for integrating and utilizing Formbricks SDKs &APIs, as well as contributing to our open source codebase. Here's what you can expect to find in this section:
### [SDK: App Survey](/developer-docs/app-survey-sdk) ### [SDK: React Native Apps](/developer-docs/react-native-in-app-surveys)
The Formbricks React Native SDK for App Surveys is designed for React Native applications, enabling seamless integration of surveys within your mobile apps. Dive into the documentation to learn how to leverage the SDK for app surveys and engage with your users effectively.
### [SDK: Web Apps](/developer-docs/app-survey-sdk)
The Formbricks JS SDK tailored for App Surveys is designed for applications where users are logged in, allowing for targeted and identified interactions within Formbricks. This SDK is particularly useful for advanced user tracking, enabling deeper insights into user behavior. Learn how to seamlessly integrate Formbricks into your applications and harness valuable insights from your logged-in users. The Formbricks JS SDK tailored for App Surveys is designed for applications where users are logged in, allowing for targeted and identified interactions within Formbricks. This SDK is particularly useful for advanced user tracking, enabling deeper insights into user behavior. Learn how to seamlessly integrate Formbricks into your applications and harness valuable insights from your logged-in users.
### [SDK: Website Survey](/developer-docs/website-survey-sdk) ### [SDK: Public Websites](/developer-docs/website-survey-sdk)
The Formbricks JS SDK for Website Surveys is ideal for public-facing websites without user authentication. It's recommended for pages with high traffic and no authentication walls, facilitating quick and efficient survey collection. Dive into the documentation to discover how to deploy surveys on your website and effectively engage with your audience. The Formbricks JS SDK for Website Surveys is ideal for public-facing websites without user authentication. It's recommended for pages with high traffic and no authentication walls, facilitating quick and efficient survey collection. Dive into the documentation to discover how to deploy surveys on your website and effectively engage with your audience.
@@ -0,0 +1,127 @@
import { MdxImage } from "@/components/MdxImage";
export const metadata = {
title: "React Native: Formbricks App SDK",
description:
"Integrate Formbricks App Surveys into your React Native apps with the Formbricks React Native SDK.",
};
#### Developer Docs
# React Native: In App Surveys
### Overview
The Formbricks React Native SDK can be used for seamlessly integrating App Surveys into your React Native Apps. Here, w'll explore how to leverage the SDK for in app surveys. The SDK is [available on npm.](https://www.npmjs.com/package/@formbricks/react-native)
### Install
<Col>
<CodeGroup title="npm">
```js {{ title: 'npm' }}
npm install @formbricks/react-native
```
```js {{ title: 'yarn' }}
yarn add @formbricks/react-native
```
```js {{ title: 'pnpm' }}
pnpm add @formbricks/react-native
```
</CodeGroup>
</Col>
## Methods
### Initialize Formbricks
In your React Native app, initialize the Formbricks React Native Client for app surveys where you pass the userId (creates a user if not existing in Formbricks) to attribute & target the user based on their actions.
<Col>
<CodeGroup title="Initialize Formbricks">
```javascript
// other imports
import Formbricks from "@formbricks/react-native";
const config = {
environmentId: "<environment-id>",
apiHost: "<api-host>",
userId: "<user-id>",
};
export default function App() {
return (
<>
{/* Your app content */}
<Formbricks initConfig={config} />
</>
);
}
```
</CodeGroup>
</Col>
The moment you initialise Formbricks, your user will start seeing surveys that get triggered on simpler actions such as on New Session.
### Set Attribute
You can set custom attributes for the identified user. This can be helpful for segmenting users based on specific characteristics or properties. To learn how to set custom user attributes, please check out our [User Attributes Guide](/app-surveys/user-identification).
<Col>
<CodeGroup>
```js
formbricks.setAttribute("Plan", "Paid");
```
</CodeGroup>
</Col>
### Track Action
Track user actions to trigger surveys based on user interactions, such as button clicks or scrolling:
<Col>
<CodeGroup>
```js
formbricks.track("Clicked on Claim");
```
</CodeGroup>
</Col>
### Logout
To log out and deinitialize Formbricks, use the formbricks.logout() function. This action clears the current initialization configuration and erases stored frontend information, such as the surveys a user has viewed or completed. It's an important step when a user logs out of your application or when you want to reset Formbricks.
<Col>
<CodeGroup>
```js
formbricks.logout();
```
</CodeGroup>
</Col>
After calling formbricks.logout(), you'll need to reinitialize Formbricks before using any of its features again. Ensure that you properly reinitialize Formbricks to avoid unexpected errors or behavior in your application.
### Reset
Reset the current instance and fetch the latest surveys and state again:
<Col>
<CodeGroup>
```js
formbricks.reset();
```
</CodeGroup>
</Col>
@@ -39,7 +39,7 @@ We currently have the following Management API methods exposed and below is thei
- [Me API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#79e08365-641d-4b2d-aea2-9a855e0438ec) - Retrieve Account Information - [Me API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#79e08365-641d-4b2d-aea2-9a855e0438ec) - Retrieve Account Information
- [People API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#cffc27a6-dafb-428f-8ea7-5165bedb911e) - List and Delete People - [People API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#cffc27a6-dafb-428f-8ea7-5165bedb911e) - List and Delete People
- [Response API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#e544ec0d-8b30-4e33-8d35-2441cb40d676) - List, List by Survey, Update, and Delete Responses - [Response API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#e544ec0d-8b30-4e33-8d35-2441cb40d676) - List, List by Survey, Update, and Delete Responses
- [Survey API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#953189b2-37b5-4429-a7bd-f4d01ceae242) - List, Create, Update, and Delete Surveys - [Survey API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#953189b2-37b5-4429-a7bd-f4d01ceae242) - List, Create, Update, generate multiple suId and Delete Surveys
- [Webhook API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#62e6ec65-021b-42a4-ac93-d1434b393c6c) - List, Create, and Delete Webhooks - [Webhook API](https://documenter.getpostman.com/view/11026000/2sA3Bq5XEh#62e6ec65-021b-42a4-ac93-d1434b393c6c) - List, Create, and Delete Webhooks
## How to Generate an API key ## How to Generate an API key
@@ -4,12 +4,12 @@ import I1 from "./images/1-set-up-website-micro-survey-popup.webp";
export const metadata = { export const metadata = {
title: "Formbricks Website Survey SDK", title: "Formbricks Website Survey SDK",
description: description:
"An overview of all available methods & how to integrate Formbricks Website Surveys for frontend developers in public-facing web applications. Learn the key methods, configuration settings, and best practices.", "Run targeted pop-up surveys on your public websites with the Formbricks JS SDK for Website Surveys. Learn how to integrate the SDK, track user actions, and trigger surveys based on user interactions.",
}; };
#### Developer Docs #### Developer Docs
# SDK: Website Survey # SDK: Run Surveys On Public Websites
### Overview ### Overview
@@ -1,68 +0,0 @@
import { MdxImage } from "@/components/MdxImage";
import StepOne from "./images/StepOne.webp";
import StepThree from "./images/StepThree.webp";
import StepTwo from "./images/StepTwo.webp";
export const metadata = {
title: "Custom Start & End Conditions for Surveys",
description:
"Optimize your survey management with custom Start & End Conditions in Formbricks. This feature allows you to control exactly when your survey is available for responses and when it should close, making it ideal for time-sensitive or number-of-response-limited surveys.",
};
# Custom Start & End Conditions
Optimize your survey management with custom Start & End Conditions in Formbricks. This feature allows you to control exactly when your survey is available for responses and when it should close, making it ideal for time-sensitive or number-of-response-limited surveys.
Configure your surveys to open and close based on specific criteria. Heres how to set up these conditions:
### **Opening a Survey**
**1. Schedule a Start Date:**
- **How to Set**: Open the Survey Editor, switch to the Settings tab. Scroll down to Response Options, Toggle the “Release Survey on Date”.
<MdxImage
src={StepOne}
alt="Choose a link survey template"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl "
/>
- **Details**: Choose the date and time when the survey should become available to respondents. All times follow UTC timezone.
- **Use Case**: This is useful for launching surveys in alignment with events, product releases, or specific marketing campaigns.
### **Closing a Survey**
**1. Limit by Number of Responses:**
- **How to Set**: Open the Survey Editor, switch to the Settings tab. Scroll down to Response Options, Toggle the “Close survey on response limit”.
{" "}
<MdxImage
src={StepTwo}
alt="Choose a link survey template"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl "
/>
- **Details**: Set a specific number of responses after which the survey automatically closes.
- **Use Case**: Perfect for limited offers, exclusive surveys, or when you need a precise sample size for statistical significance.
**2. Schedule an End Date:**
- **How to Set**: Open the Survey Editor, switch to the Settings tab. Scroll down to Response Options, Toggle the “Close survey on date”.
<MdxImage
src={StepThree}
alt="Choose a link survey template"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl "
/>
- **Details**: Define a specific date and time for the survey to close. This also follows UTC timezone. - **Use
Case**: Essential for surveys linked to time-bound events or studies where data collection needs to end at a specific
point.
### **Summary**
Setting up Custom Start & End Conditions in Formbricks allows you to control the availability and duration of your surveys with precision. Whether you are conducting academic research, market analysis, or gathering event feedback, these settings help ensure that your data collection aligns perfectly with your objectives.
---

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,28 @@
import { MdxImage } from "@/components/MdxImage";
import StepOne from "./images/StepOne.webp";
import StepThree from "./images/StepThree.webp";
import StepTwo from "./images/StepTwo.webp";
export const metadata = {
title: "Set a Maximum Number of Submissions for Surveys",
description:
"Limit the number of responses your survey can receive.",
};
# Limit by Number of Submissions
Automatically close your survey after a specific number of responses with Formbricks. This feature is perfect for limited offers, exclusive surveys, or when you need a precise sample size for statistical significance.
- **How to**: Open the Survey Editor, switch to the Settings tab. Scroll down to Response Options, Toggle the “Close survey on response limit”.
{" "}
<MdxImage
src={StepTwo}
alt="Choose a link survey template"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl "
/>
- **Details**: Set a specific number of responses after which the survey automatically closes.
- **Use Case**: Perfect for limited offers, exclusive surveys, or when you need a precise sample size for statistical significance.
---
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

+171
View File
@@ -0,0 +1,171 @@
import { MdxImage } from "@/components/MdxImage";
import ActionCalculateOperators from "./images/action-calculate-operators.webp";
import ActionCalculateValue from "./images/action-calculate-value.webp";
import ActionCalculateVariables from "./images/action-calculate-variables.webp";
import ActionCalculate from "./images/action-calculate.webp";
import ActionJump from "./images/action-jump.webp";
import ActionOptions from "./images/action-options.webp";
import ActionRequire from "./images/action-require.webp";
import AddLogic from "./images/add-logic.webp";
import ConditionChaining from "./images/condition-chaining.webp";
import ConditionOperators from "./images/condition-operators.webp";
import ConditionOptions from "./images/condition-options.webp";
import ConditionValue from "./images/condition-value.webp";
import Conditions from "./images/conditions.webp";
import Editor from "./images/editor.webp";
import QuestionLogic from "./images/question-logic.webp";
export const metadata = {
title: "Logic Editor",
description:
"Create complex survey logic with the Logic Editor. Use conditions, actions, and variables to create a personalized survey experience.",
};
# Logic Editor
Create complex survey logic with the Logic Editor. Use conditions, actions, and variables to create a personalized survey experience.
<MdxImage src={Editor} alt="Logic Editor" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" />
## Terminology
- **Condition**: A rule that determines when an action should be executed.
- **Action**: A task that is executed when a condition is met.
## **Creating Logic**
1. **Add a Logic Block**: Click the `Add logic +` button to add a new logic block.
<MdxImage src={AddLogic} alt="Add Logic" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" />
<Note>
You can add multiple logic blocks to a survey. Logic blocks are executed in the order they are added. You
can rearrange the order of logic blocks.
</Note>
2. **Add Conditions**: Add conditions to the logic block. Conditions are rules that determine when an action should be executed.
<MdxImage
src={Conditions}
alt="Add Conditions"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
Conditons can be based on:
- **Question**: The answer to a question.
- **Variable**: A variable value.
- **Hidden Field**: The value of a hidden field.
2.a **Condition Options**: Choose from a list of available conditions.
<MdxImage
src={ConditionOptions}
alt="Condition Options"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
2.b **Condition Operators**: Choose an operator to compare the condition value.
<MdxImage
src={ConditionOperators}
alt="Condition Operators"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
2.c **Condition Value**: Enter a value to compare the condition against.
Comparisons can be made against a fixed value or a dynamic value.
Dynamic values can be based on a question, variable, or hidden field.
<MdxImage
src={ConditionValue}
alt="Condition Value"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
<Note>
- Conditions can be grouped. - Conditions can be combined using AND or OR operators. You can add multiple
conditions to a logic block. Conditions are evaluated in the order they are added.
</Note>
<MdxImage
src={ConditionChaining}
alt="Condition Chaining"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
3. **Add Actions**: Add actions to the logic block. Actions are tasks that are executed when a condition is met.
<Note>You can add multiple actions to a logic block. Actions are executed in the order they are added.</Note>
- 3.a **Action Options**: Choose from a list of available actions.
<MdxImage
src={ActionOptions}
alt="Add Actions"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
Action is of the following types:
- **Calculate**: Perform a calculation. These variables are then available for use in other questions.
- Calculations can be performed on variables.
- Calculations can be based on fixed values or dynamic values.
<MdxImage
src={ActionCalculateVariables}
alt="Action Calculate Variables"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
<MdxImage
src={ActionCalculateOperators}
alt="Action Calculate Variables"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
<MdxImage
src={ActionCalculateValue}
alt="Action Calculate Variables"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
<MdxImage
src={ActionCalculate}
alt="Action Calculate"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
- **Require Answer**: Make a question required. Only the optional questions can be marked as required while filling the survey.
<MdxImage
src={ActionRequire}
alt="Action Require"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
- **Jump to Question**: Skip to a specific question. The user will be redirected to the specified question based on the condition.
<MdxImage
src={ActionJump}
alt="Action Jump"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
4. **Save Logic**: Click the `Save` button to save the logic block.
# Question Logic
This logic is executed when the user answers the question. Logic can be as simple as showing a follow-up question based on the answer or as complex as calculating a score based on multiple answers.
<MdxImage
src={QuestionLogic}
alt="Question Logic"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,51 @@
import { MdxImage } from "@/components/MdxImage";
import StepOne from "./images/StepOne.webp";
import StepThree from "./images/StepThree.webp";
import StepTwo from "./images/StepTwo.webp";
export const metadata = {
title: "Schedule Start & End Dates for Surveys",
description:
"Automatically release and close surveys based on specific dates.",
};
# Schedule Start & End Dates
Optimize your survey management with custom Start & End Conditions in Formbricks. This feature allows you to control exactly when your survey is available for responses and when it should close, making it ideal for time-sensitive or number-of-response-limited surveys.
Configure your surveys to open and close based on specific criteria. Heres how to set up these conditions:
## **Schedule a Survey Release**
- **How to**: Open the Survey Editor, switch to the Settings tab. Scroll down to Response Options, Toggle the “Release Survey on Date”.
<MdxImage
src={StepOne}
alt="Choose a link survey template"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl "
/>
- **Details**: Choose the date and time when the survey should become available to respondents. All times follow UTC timezone.
- **Use Case**: This is useful for launching surveys in alignment with events, product releases, or specific marketing campaigns.
## **Automatically Closing a Survey**
- **How to**: Open the Survey Editor, switch to the Settings tab. Scroll down to Response Options, Toggle the “Close survey on date”.
<MdxImage
src={StepThree}
alt="Choose a link survey template"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl "
/>
- **Details**: Define a specific date and time for the survey to close. This also follows UTC timezone. - **Use
Case**: Essential for surveys linked to time-bound events or studies where data collection needs to end at a specific
point.
### **Summary**
Setting up Start & End Dates in Formbricks allows you to control the availability and duration of your surveys with precision. Whether you are conducting academic research, market analysis, or gathering event feedback, these settings help ensure that your data collection aligns perfectly with your objectives.
---
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@@ -0,0 +1,75 @@
import { MdxImage } from "@/components/MdxImage";
import StepOne from "./images/1-publish-to-web.webp";
import StepTwo from "./images/2-warning-publish.webp";
import StepThree from "./images/3-share-link.webp";
export const metadata = {
title: "Shareable Dashboards",
description:
"Create shareable links to dashboards of specific surveys.",
};
# Shareable Dashboards
Formbricks allows you to create public, shareable versions of your survey results dashboards. This feature enables you to easily share survey results with stakeholders, team members, or the public without granting access to your Formbricks account.
## How To Publish Survey Results
1. **Go to survey summary**: Choose the survey for which you want to create a shareable dashboard and go to its summary page.
2. **Share results**: Click the "Share results" and then "Publish to web".
<MdxImage
src={StepOne}
alt="Go to survey summary"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
3. **Confirm**: Click "Publish to public web" (it's public).
<MdxImage
src={StepTwo}
alt="Go to survey summary"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
4. **Share link**: Formbricks has generated a unique URL for your public dashboard. Share it around.
<MdxImage
src={StepThree}
alt="Go to survey summary"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
<Note>Whoever has access to the link can access the survey results.</Note>
## How To Unpublish Survey Results
Unpublish is very simple: Go to "Share results" -> "Unpublish from web" -> "Unpublish".
<MdxImage
src={StepThree}
alt="Go to survey summary"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
## Key Features
- **Read-only access**: Viewers can see survey results but cannot modify data or settings.
- **Real-time updates**: The shared dashboard reflects current survey data in real-time.
- **Filters included**: Visitors can access all filters to dissect the data.
- **Revocable access**: You can disable the shared link at any time to restrict access.
## Use Cases
- Share results with clients or stakeholders
- Publish survey findings to your website or blog
- Collaborate with team members without sharing account credentials
- Create transparency by making certain survey results public
Shareable dashboards provide a simple yet powerful way to disseminate survey insights while maintaining control over your Formbricks account and data.
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

+143 -17
View File
@@ -1,3 +1,16 @@
import { MdxImage } from "@/components/MdxImage";
import EntraIDAppReg01 from "./images/entra_app_reg_01.webp";
import EntraIDAppReg02 from "./images/entra_app_reg_02.webp";
import EntraIDAppReg03 from "./images/entra_app_reg_03.webp";
import EntraIDAppReg04 from "./images/entra_app_reg_04.webp";
import EntraIDAppReg05 from "./images/entra_app_reg_05.webp";
import EntraIDAppReg06 from "./images/entra_app_reg_06.webp";
import EntraIDAppReg07 from "./images/entra_app_reg_07.webp";
import EntraIDAppReg08 from "./images/entra_app_reg_08.webp";
import EntraIDAppReg09 from "./images/entra_app_reg_09.webp";
import EntraIDAppReg10 from "./images/entra_app_reg_10.webp";
export const metadata = { export const metadata = {
title: "Configure Formbricks with External auth providers", title: "Configure Formbricks with External auth providers",
description: description:
@@ -25,7 +38,7 @@ These variables are present inside your machines docker-compose file. Restart
| S3_SECRET_KEY | Secret key for S3. | optional | (resolved by the AWS SDK) | | S3_SECRET_KEY | Secret key for S3. | optional | (resolved by the AWS SDK) |
| S3_REGION | Region for S3. | optional | (resolved by the AWS SDK) | | S3_REGION | Region for S3. | optional | (resolved by the AWS SDK) |
| S3_BUCKET_NAME | S3 bucket name for data storage. Formbricks enables S3 storage when this is set. | optional (required if S3 is enabled) | | | S3_BUCKET_NAME | S3 bucket name for data storage. Formbricks enables S3 storage when this is set. | optional (required if S3 is enabled) | |
| S3_ENDPOINT | Endpoint for S3. | optional | (resolved by the AWS SDK) | | S3_ENDPOINT_URL | Endpoint for S3. | optional | (resolved by the AWS SDK) |
| PRIVACY_URL | URL for privacy policy. | optional | | | PRIVACY_URL | URL for privacy policy. | optional | |
| TERMS_URL | URL for terms of service. | optional | | | TERMS_URL | URL for terms of service. | optional | |
| IMPRINT_URL | URL for imprint. | optional | | | IMPRINT_URL | URL for imprint. | optional | |
@@ -48,8 +61,6 @@ These variables are present inside your machines docker-compose file. Restart
| STRIPE_SECRET_KEY | Secret key for Stripe integration. | optional | | | STRIPE_SECRET_KEY | Secret key for Stripe integration. | optional | |
| STRIPE_WEBHOOK_SECRET | Webhook secret for Stripe integration. | optional | | | STRIPE_WEBHOOK_SECRET | Webhook secret for Stripe integration. | optional | |
| TELEMETRY_DISABLED | Disables telemetry if set to 1. | optional | | | TELEMETRY_DISABLED | Disables telemetry if set to 1. | optional | |
| INSTANCE_ID | Instance ID for Formbricks Cloud to be sent to Telemetry. | optional | |
| INTERNAL_SECRET | Internal Secret (Currently we overwrite the value with a random value). | optional | |
| DEFAULT_BRAND_COLOR | Default brand color for your app (Can be overwritten from the UI as well). | optional | #64748b | | DEFAULT_BRAND_COLOR | Default brand color for your app (Can be overwritten from the UI as well). | optional | #64748b |
| DEFAULT_ORGANIZATION_ID | Automatically assign new users to a specific organization when joining | optional | | | DEFAULT_ORGANIZATION_ID | Automatically assign new users to a specific organization when joining | optional | |
| DEFAULT_ORGANIZATION_ROLE | Role of the user in the default organization. | optional | admin | | DEFAULT_ORGANIZATION_ROLE | Role of the user in the default organization. | optional | admin |
@@ -135,26 +146,141 @@ GOOGLE_CLIENT_SECRET=your-client-secret-here
- Navigate to your Docker setup directory where your `docker-compose.yml` file is located. - Navigate to your Docker setup directory where your `docker-compose.yml` file is located.
- Run the following command to bring down your current Docker containers and then bring them back up with the updated environment configuration: - Run the following command to bring down your current Docker containers and then bring them back up with the updated environment configuration:
### Azure SSO OAuth ### Microsoft Entra ID (Azure Active Directory) SSO OAuth
Have an Azure Active Directory (AAD) instance? Integrate it with your Formbricks instance to allow users to log in using their existing AAD credentials. This guide will walk you through the process of setting up Azure SSO for your Formbricks instance. Do you have a Microsoft Entra ID Tenant? Integrate it with your Formbricks instance to allow users to log in using their existing Microsoft credentials. This guide will walk you through the process of setting up an Application Registration for your Formbricks instance.
### Requirements #### Requirements
- An Azure Active Directory (AAD) instance. - A Microsoft Entra ID Tenant populated with users. [Create a tenant as per Microsoft's documentation](https://learn.microsoft.com/en-us/entra/fundamentals/create-new-tenant).
- A Formbricks instance running and accessible. - A Formbricks instance running and accessible.
- The callback URI for your Formbricks instance: `{WEBAPP_URL}/api/auth/callback/azure-ad`
### Steps #### Creating an App Registration
1. Create a new Tenant in Azure Active Directory as per their [official documentation](https://learn.microsoft.com/en-us/entra/fundamentals/create-new-tenant). 1. Login to the [Microsoft Entra admin center](https://entra.microsoft.com/).
2. Add Users & Groups to your AAD instance. 2. Go to **Applications** > **App registrations** in the left menu.
3. Now we need to fill the below environment variables in our Formbricks instance so get them from your AD configuration:
- `AZUREAD_CLIENT_ID` <MdxImage
- `AZUREAD_CLIENT_SECRET` src={EntraIDAppReg01}
- `AZUREAD_TENANT_ID` alt="App Registration Name Field"
4. Update these environment variables in your `docker-compose.yml` or pass it like your other environment variables to the Formbricks container. quality="100"
5. Restart your Formbricks instance. className="max-w-full rounded-lg sm:max-w-3xl"
6. You're all set! Users can now signup & log in using their AAD credentials. />
3. Click the **New registration** button at the top.
<MdxImage
src={EntraIDAppReg02}
alt="App Registration Name Field"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
4. Name your application something descriptive, such as `Formbricks SSO`.
<MdxImage
src={EntraIDAppReg03}
alt="App Registration Name Field"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
5. If you have multiple tenants/organizations, choose the appropriate **Supported account types** option. Otherwise, leave the default option for _Single Tenant_.
<MdxImage
src={EntraIDAppReg04}
alt="Supported Account Types List"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
6. Under **Redirect URI**, select **Web** for the platform and paste your Formbricks callback URI (see Requirements above).
<MdxImage
src={EntraIDAppReg05}
alt="Redirect URI Field"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
7. Click **Register** to create the App registration. You will be redirected to your new app's _Overview_ page after it is created.
8. On the _Overview_ page, under **Essentials**:
- Copy the entry for **Application (client) ID** to populate the `AZUREAD_CLIENT_ID` variable.
- Copy the entry for **Directory (tenant) ID** to populate the `AZUREAD_TENANT_ID` variable.
<MdxImage
src={EntraIDAppReg06}
alt="Client and Tenant ID Fields"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
9. From your App registration's _Overview_ page, go to **Manage** > **Certificates & secrets**.
<MdxImage
src={EntraIDAppReg07}
alt="Certificates & secrets link"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
10. Make sure you have the **Client secrets** tab active, and click **New client secret**.
<MdxImage
src={EntraIDAppReg08}
alt="New Client Secret Tab & Button"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
11. Enter a **Description**, set an **Expires** period, then click **Add**.
<Note>
You will need to create a new client secret using these steps whenever your chosen expiry period ends.
</Note>
<MdxImage
src={EntraIDAppReg09}
alt="Description & Expires Fields"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
12. Copy the entry under **Value** to populate the `AZUREAD_CLIENT_SECRET` variable.
<Note>
Microsoft will only show this value to you immediately after creation, and you will not be able to access it again. If you lose it, simply start from step 9 to create a new secret.
</Note>
<MdxImage
src={EntraIDAppReg10}
alt="Client Secret Value Field"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
13. Update these environment variables in your `docker-compose.yml` or pass it like your other environment variables to the Formbricks container.
<Note>
You must wrap the `AZUREAD_CLIENT_SECRET` value in double quotes (e.g., `"THis~iS4faKe.53CreTvALu3"`) to prevent issues with special characters.
</Note>
An example `.env` for Microsoft Entra ID in Formbricks would look like:
<Col>
<CodeGroup title="Formbricks Env for Microsoft Entra ID SSO">
```yml {{ title: ".env" }}
AZUREAD_CLIENT_ID=a25cadbd-f049-4690-ada3-56a163a72f4c
AZUREAD_TENANT_ID=2746c29a-a3a6-4ea1-8762-37816d4b7885
AZUREAD_CLIENT_SECRET="THis~iS4faKe.53CreTvALu3"
```
</CodeGroup>
</Col>
14. Restart your Formbricks instance.
15. You're all set! Users can now sign up & log in using their Microsoft credentials associated with your Entra ID Tenant.
## OpenID Configuration ## OpenID Configuration
+1 -1
View File
@@ -9,7 +9,7 @@ export const metadata = {
## Overview ## Overview
The Formbricks Core source code is licensed under AGPLv3 and available on GitHub. Additionally, we offer features for bigger organisations & enterprises for self-hostesr under a separate Enterprise License. The Formbricks Core source code is licensed under AGPLv3 and available on GitHub. Additionally, we offer features for bigger organisations & enterprises for self-hosters under a separate Enterprise License.
<Note> <Note>
Want to present a proof of concept? Request a free 30-day Enterprise Edition trial by [filling out the form Want to present a proof of concept? Request a free 30-day Enterprise Edition trial by [filling out the form
@@ -8,6 +8,103 @@ export const metadata = {
# Migration Guide # Migration Guide
## v2.5
Formbricks v2.5 allows you to visualize responses in a data table format. This release also includes a few bug fixes and performance improvements.
<Note>
This release will fix the inconsistency of CTA and consent question values in case of skipping the question.
The value will be set to empty string instead of "dismissed" in order to make it consistent with other
questions.
</Note>
### Steps to Migrate
This guide is for users who are self-hosting Formbricks using our one-click setup. If you are using a different setup, you might adjust the commands accordingly.
To run all these steps, please navigate to the `formbricks` folder where your `docker-compose.yml` file is located.
1. **Backup your Database**: This is a crucial step. Please make sure to backup your database before proceeding with the upgrade. You can use the following command to backup your database:
<Col>
<CodeGroup title="Backup Postgres">
```bash
docker exec formbricks-postgres-1 pg_dump -Fc -U postgres -d formbricks > formbricks_pre_v2.5_$(date +%Y%m%d_%H%M%S).dump
```
</CodeGroup>
</Col>
<Note>
If you run into “No such container”, use `docker ps` to find your container name, e.g.
`formbricks_postgres_1`.
</Note>
<Note>
If you prefer storing the backup as an `*.sql` file remove the `-Fc` (custom format) option. In case of a
restore scenario you will need to use `psql` then with an empty `formbricks` database.
</Note>
2. Pull the latest version of Formbricks:
<Col>
<CodeGroup title="Stop the containers">
```bash
docker compose pull
```
</CodeGroup>
</Col>
3. Stop the running Formbricks instance & remove the related containers:
<Col>
<CodeGroup title="Stop the containers">
```bash
docker compose down
```
</CodeGroup>
</Col>
4. Restarting the containers with the latest version of Formbricks:
<Col>
<CodeGroup title="Restart the containers">
```bash
docker compose up -d
```
</CodeGroup>
</Col>
5. Now let's migrate the data to the latest schema:
<Note>To find your Docker Network name for your Postgres Database, find it using `docker network ls`</Note>
<Col>
<CodeGroup title="Migrate the data">
```bash
docker pull ghcr.io/formbricks/data-migrations:latest && \
docker run --rm \
--network=formbricks_default \
-e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \
-e UPGRADE_TO_VERSION="v2.5" \
ghcr.io/formbricks/data-migrations:latest
```
</CodeGroup>
</Col>
The above command will migrate your data to the latest schema. This is a crucial step to migrate your existing data to the new structure. Only if the script runs successful, changes are made to the database. The script can safely run multiple times.
6. That's it! Once the migration is complete, you can **now access your Formbricks instance** at the same URL as before.
## v2.4 ## v2.4
Formbricks v2.4 allows you to create multiple endings for your surveys and decide which ending the user should see based on logic jumps. This release also includes many bug fixes and performance improvements. Formbricks v2.4 allows you to create multiple endings for your surveys and decide which ending the user should see based on logic jumps. This release also includes many bug fixes and performance improvements.
@@ -91,12 +188,12 @@ docker compose up -d
<CodeGroup title="Migrate the data"> <CodeGroup title="Migrate the data">
```bash ```bash
docker pull ghcr.io/formbricks/data-migrations:latest && \ docker pull ghcr.io/formbricks/data-migrations:v2.4.0 && \
docker run --rm \ docker run --rm \
--network=formbricks_default \ --network=formbricks_default \
-e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \ -e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \
-e UPGRADE_TO_VERSION="v2.4" \ -e UPGRADE_TO_VERSION="v2.4" \
ghcr.io/formbricks/data-migrations:latest ghcr.io/formbricks/data-migrations:v2.4.0
``` ```
</CodeGroup> </CodeGroup>
@@ -191,12 +288,12 @@ docker compose up -d
<CodeGroup title="Migrate the data"> <CodeGroup title="Migrate the data">
```bash ```bash
docker pull ghcr.io/formbricks/data-migrations:latest && \ docker pull ghcr.io/formbricks/data-migrations:v2.3.0 && \
docker run --rm \ docker run --rm \
--network=formbricks_default \ --network=formbricks_default \
-e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \ -e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \
-e UPGRADE_TO_VERSION="v2.3" \ -e UPGRADE_TO_VERSION="v2.3" \
ghcr.io/formbricks/data-migrations:latest ghcr.io/formbricks/data-migrations:v2.3.0
``` ```
</CodeGroup> </CodeGroup>
@@ -286,12 +383,12 @@ docker compose up -d
<CodeGroup title="Migrate the data"> <CodeGroup title="Migrate the data">
```bash ```bash
docker pull ghcr.io/formbricks/data-migrations:latest && \ docker pull ghcr.io/formbricks/data-migrations:v2.2 && \
docker run --rm \ docker run --rm \
--network=formbricks_default \ --network=formbricks_default \
-e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \ -e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \
-e UPGRADE_TO_VERSION="v2.2" \ -e UPGRADE_TO_VERSION="v2.2" \
ghcr.io/formbricks/data-migrations:latest ghcr.io/formbricks/data-migrations:v2.2
``` ```
</CodeGroup> </CodeGroup>
@@ -390,12 +487,12 @@ docker compose up -d
<CodeGroup title="Migrate the data"> <CodeGroup title="Migrate the data">
```bash ```bash
docker pull ghcr.io/formbricks/data-migrations:latest && \ docker pull ghcr.io/formbricks/data-migrations:v2.1.0 && \
docker run --rm \ docker run --rm \
--network=formbricks_default \ --network=formbricks_default \
-e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \ -e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \
-e UPGRADE_TO_VERSION="v2.1" \ -e UPGRADE_TO_VERSION="v2.1" \
ghcr.io/formbricks/data-migrations:latest ghcr.io/formbricks/data-migrations:v2.1.0
``` ```
</CodeGroup> </CodeGroup>
@@ -504,12 +601,12 @@ docker compose up -d
<CodeGroup title="Migrate the data"> <CodeGroup title="Migrate the data">
```bash ```bash
docker pull ghcr.io/formbricks/data-migrations:latest && \ docker pull ghcr.io/formbricks/data-migrations:v2.0.3 && \
docker run --rm \ docker run --rm \
--network=formbricks_default \ --network=formbricks_default \
-e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \ -e DATABASE_URL="postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" \
-e UPGRADE_TO_VERSION="v2.0" \ -e UPGRADE_TO_VERSION="v2.0" \
ghcr.io/formbricks/data-migrations:latest ghcr.io/formbricks/data-migrations:v2.0.3
``` ```
</CodeGroup> </CodeGroup>
+216 -52
View File
@@ -50,9 +50,10 @@ The script will prompt you for the following information:
<CodeGroup title="Docker GPG Keys Overwrite Prompt"> <CodeGroup title="Docker GPG Keys Overwrite Prompt">
```bash ```bash
🧱 Welcome to the Formbricks single instance installer 🚀 Executing default step of installing Formbricks
🧱 Welcome to the Formbricks Setup Script
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 22.04.2 LTS server. 🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🧹 Time to sweep away any old Docker installations. 🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list. 🔄 Updating your package list.
@@ -64,48 +65,21 @@ File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N)
</CodeGroup> </CodeGroup>
</Col> </Col>
2. **Email Address**: Provide your email address for SSL certificate registration with Let's Encrypt. 2. **Domain Name**: You will be asked to enter the domain name where you want to host Formbricks. This domain will be used to generate an SSL certificate.
<Col> <Col>
<CodeGroup title="Email Prompt"> <CodeGroup title="Email Prompt">
```bash ```bash
🧱 Welcome to the Formbricks single instance installer 🚀 Executing default step of installing Formbricks
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 22.04.2 LTS server. 🧱 Welcome to the Formbricks Setup Script
🧹 Time to sweep away any old Docker installations. 🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🔄 Updating your package list.
📦 Installing the necessary dependencies.
🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again.
🐳 Installing Docker.
🚀 Testing your Docker installation.
🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. Youre now ready to run your Formbricks instance!
🚗 Installing Traefik...
📁 Created Formbricks Quickstart directory at ./formbricks.
💡 Please enter your email address for the SSL certificate:
```
</CodeGroup>
</Col>
3. **Domain Name**: Enter the domain name that Traefik will use to create the SSL certificate and forward requests to Formbricks. Please make sure that port 80 and 443 are open in your VM's Security Group to allow Traefik to create the SSL certificate.
<Col>
<CodeGroup title="Domain Name for SSL certificate Prompt">
```bash
🧱 Welcome to the Formbricks single instance installer
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 22.04.2 LTS server.
🧹 Time to sweep away any old Docker installations. 🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list. 🔄 Updating your package list.
📦 Installing the necessary dependencies. 📦 Installing the necessary dependencies.
🔑 Adding Dockers official GPG key and setting up the stable repository. 🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again. 🔄 Updating your package list again.
🐳 Installing Docker. 🐳 Installing Docker.
@@ -113,13 +87,186 @@ File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🎉 Docker is installed! 🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands. 🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance! 🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance!
🚗 Installing Traefik...
📁 Created Formbricks Quickstart directory at ./formbricks. 📁 Created Formbricks Quickstart directory at ./formbricks.
🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)):
```
</CodeGroup>
</Col>
3. **HTTPS Certificate Prompt**: The script will ask if you want to create an HTTPS certificate for your domain. Enter Y to proceed. This is highly recommended for secure access to your Formbricks instance.
<Col>
<CodeGroup>
```bash
🚀 Executing default step of installing Formbricks
🧱 Welcome to the Formbricks Setup Script
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list.
📦 Installing the necessary dependencies.
🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again.
🐳 Installing Docker.
🚀 Testing your Docker installation.
🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance!
📁 Created Formbricks Quickstart directory at ./formbricks.
🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)):
my.hosted.url.com
🔗 Do you want us to set up an HTTPS certificate for you? [Y/n]
```
</CodeGroup>
</Col>
4. **DNS Setup Prompt**: Ensure that your domain's DNS is correctly configured and ports 80 and 443 are open. Confirm this by entering Y. This step is crucial for proper SSL certificate issuance and secure server access.
<Col>
<CodeGroup>
```bash
🚀 Executing default step of installing Formbricks
🧱 Welcome to the Formbricks Setup Script
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list.
📦 Installing the necessary dependencies.
🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again.
🐳 Installing Docker.
🚀 Testing your Docker installation.
🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance!
📁 Created Formbricks Quickstart directory at ./formbricks.
🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)):
my.hosted.url.com
🔗 Do you want us to set up an HTTPS certificate for you? [Y/n]
Y
🔗 Please make sure that the domain points to the server's IP address and that ports 80 & 443 are open in your server's firewall. Is everything set up? [Y/n]
```
</CodeGroup>
</Col>
5. **Email Address**: Provide an email address for SSL certificate registration. This email will be used for notifications regarding your SSL certificate from Let's Encrypt.
<Col>
<CodeGroup title="Email Prompt">
```bash
🚀 Executing default step of installing Formbricks
🧱 Welcome to the Formbricks Setup Script
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list.
📦 Installing the necessary dependencies.
🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again.
🐳 Installing Docker.
🚀 Testing your Docker installation.
🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance!
📁 Created Formbricks Quickstart directory at ./formbricks.
🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)):
my.hosted.url.com
🔗 Do you want us to set up an HTTPS certificate for you? [Y/n]
Y
🔗 Please make sure that the domain points to the server's IP address and that ports 80 & 443 are open in your server's firewall. Is everything set up? [Y/n]
Y
💡 Please enter your email address for the SSL certificate:
```
</CodeGroup>
</Col>
6. **Enforce HTTPS (HSTS) Prompt**: Enforcing HTTPS with HSTS is a good security practice, as it ensures all communication with your server is encrypted. Enter Y to enable this setting.
<Col>
<CodeGroup title="Domain Name for SSL certificate Prompt">
```bash
🚀 Executing default step of installing Formbricks
🧱 Welcome to the Formbricks Setup Script
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list.
📦 Installing the necessary dependencies.
🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again.
🐳 Installing Docker.
🚀 Testing your Docker installation.
🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance!
📁 Created Formbricks Quickstart directory at ./formbricks.
🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)):
my.hosted.url.com
🔗 Do you want us to set up an HTTPS certificate for you? [Y/n]
Y
🔗 Please make sure that the domain points to the server's IP address and that ports 80 & 443 are open in your server's firewall. Is everything set up? [Y/n]
Y
💡 Please enter your email address for the SSL certificate: 💡 Please enter your email address for the SSL certificate:
docs@formbricks.com docs@formbricks.com
💡 Created traefik.yaml file with your provided email address. 🔗 Do you want to enforce HTTPS (HSTS)? [Y/n]
💡 Created acme.json file with correct permissions. ```
</CodeGroup>
</Col>
7. **Email Service Setup Prompt**: The script will ask if you want to set up the email service. Enter `Y` to proceed.(default is `N`). You can skip this step if you don't want to set up the email service. You will still be able to use Formbricks without setting up the email service.
<Col>
<CodeGroup>
```bash
🚀 Executing default step of installing Formbricks
🧱 Welcome to the Formbricks Setup Script
🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list.
📦 Installing the necessary dependencies.
🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again.
🐳 Installing Docker.
🚀 Testing your Docker installation.
🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance!
📁 Created Formbricks Quickstart directory at ./formbricks.
🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)): 🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)):
my.hosted.url.com
🔗 Do you want us to set up an HTTPS certificate for you? [Y/n]
Y
🔗 Please make sure that the domain points to the server's IP address and that ports 80 & 443 are open in your server's firewall. Is everything set up? [Y/n]
Y
💡 Please enter your email address for the SSL certificate:
docs@formbricks.com
🔗 Do you want to enforce HTTPS (HSTS)? [Y/n]
Y
🚗 Configuring Traefik...
💡 Created traefik.yaml and traefik-dynamic.yaml file.
💡 Created acme.json file with correct permissions.
📧 Do you want to set up the email service? You will need SMTP credentials for the same! [y/N]
``` ```
</CodeGroup> </CodeGroup>
@@ -131,39 +278,56 @@ docs@formbricks.com
<CodeGroup title="Successfully setup Formbricks on your Ubuntu machine"> <CodeGroup title="Successfully setup Formbricks on your Ubuntu machine">
```bash ```bash
🧱 Welcome to the Formbricks single instance installer 🚀 Executing default step of installing Formbricks
🧱 Welcome to the Formbricks Setup Script
🛸 Fasten your seatbelts! Were setting up your Formbricks environment on your Ubuntu 22.04.2 LTS server. 🛸 Fasten your seatbelts! We're setting up your Formbricks environment on your Ubuntu 24.04 LTS server.
🧹 Time to sweep away any old Docker installations. 🧹 Time to sweep away any old Docker installations.
🔄 Updating your package list. 🔄 Updating your package list.
📦 Installing the necessary dependencies. 📦 Installing the necessary dependencies.
🔑 Adding Dockers official GPG key and setting up the stable repository. 🔑 Adding Docker's official GPG key and setting up the stable repository.
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
🔄 Updating your package list again. 🔄 Updating your package list again.
🐳 Installing Docker. 🐳 Installing Docker.
🚀 Testing your Docker installation. 🚀 Testing your Docker installation.
🎉 Docker is installed! 🎉 Docker is installed!
🐳 Adding your user to the Docker group to avoid using sudo with docker commands. 🐳 Adding your user to the Docker group to avoid using sudo with docker commands.
🎉 Hooray! Docker is all set and ready to go. Youre now ready to run your Formbricks instance! 🎉 Hooray! Docker is all set and ready to go. You're now ready to run your Formbricks instance!
🚗 Installing Traefik...
📁 Created Formbricks Quickstart directory at ./formbricks. 📁 Created Formbricks Quickstart directory at ./formbricks.
💡 Please enter your email address for the SSL certificate:
docs@formbricks.com
💡 Created traefik.yaml file with your provided email address.
💡 Created acme.json file with correct permissions.
🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)): 🔗 Please enter your domain name for the SSL certificate (🚨 do NOT enter the protocol (http/https/etc)):
my.hosted.url.com my.hosted.url.com
🚙 Updating NEXTAUTH_SECRET in the Formbricks container... 🔗 Do you want us to set up an HTTPS certificate for you? [Y/n]
Y
🔗 Please make sure that the domain points to the server's IP address and that ports 80 & 443 are open in your server's firewall. Is everything set up? [Y/n]
Y
💡 Please enter your email address for the SSL certificate:
docs@formbricks.com
🔗 Do you want to enforce HTTPS (HSTS)? [Y/n]
Y
🚗 Configuring Traefik...
💡 Created traefik.yaml and traefik-dynamic.yaml file.
💡 Created acme.json file with correct permissions.
📧 Do you want to set up the email service? You will need SMTP credentials for the same! [y/N] N
📥 Downloading docker-compose.yml from Formbricks GitHub repository...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6632 100 6632 0 0 24280 0 --:--:-- --:--:-- --:--:-- 24382
🚙 Updating docker-compose.yml with your custom inputs...
🚗 NEXTAUTH_SECRET updated successfully! 🚗 NEXTAUTH_SECRET updated successfully!
🚗 ENCRYPTION_KEY updated successfully!
🚗 CRON_SECRET updated successfully!
[+] Running 4/4 [+] Running 4/4
✔ Network formbricks_default Created 0.1s ✔ Network formbricks_default Created 0.2s
✔ Container formbricks-postgres-1 Started 0.5s ✔ Container formbricks-postgres-1 Started 1.0s
✔ Container formbricks-formbricks-1 Started 0.7s ✔ Container formbricks-formbricks-1 Started 1.6s
✔ Container traefik Started 1.1s ✔ Container traefik Started 2.8s
🔗 To edit more variables and deeper config, go to the formbricks/docker-compose.yml, edit the file, and restart the container!
🚨 Make sure you have set up the DNS records as well as inbound rules for the domain name and IP address of this instance. 🚨 Make sure you have set up the DNS records as well as inbound rules for the domain name and IP address of this instance.
🎉 All done! Check the status of Formbricks & Traefik with 'cd formbricks && sudo docker compose ps.' 🎉 All done! Please setup your Formbricks instance by visiting your domain at https://my.hosted.url.com. You can check the status of Formbricks & Traefik with 'cd formbricks && sudo docker compose ps.'
``` ```
</CodeGroup> </CodeGroup>
+1
View File
@@ -15,6 +15,7 @@ const TopLevelNavItem = ({ href, children }: { href: string; children: React.Rea
<li> <li>
<Link <Link
href={href} href={href}
target="_blank"
className="text-sm leading-5 text-slate-600 transition hover:text-slate-900 dark:text-slate-400 dark:hover:text-white"> className="text-sm leading-5 text-slate-600 transition hover:text-slate-900 dark:text-slate-400 dark:hover:text-white">
{children} {children}
</Link> </Link>
+8 -1
View File
@@ -171,6 +171,13 @@ const NavigationGroup = ({
const isParentOpen = (title: string) => openGroups.includes(title); const isParentOpen = (title: string) => openGroups.includes(title);
const sortedLinks = group.links.map((link) => {
if (link.children) {
link.children.sort((a, b) => a.title.localeCompare(b.title));
}
return link;
});
return ( return (
<li className={clsx("relative mt-6", className)}> <li className={clsx("relative mt-6", className)}>
<motion.h2 layout="position" className="font-semibold text-slate-900 dark:text-white"> <motion.h2 layout="position" className="font-semibold text-slate-900 dark:text-white">
@@ -185,7 +192,7 @@ const NavigationGroup = ({
{isActiveGroup && <ActivePageMarker group={group} pathname={pathname || "/docs"} />} {isActiveGroup && <ActivePageMarker group={group} pathname={pathname || "/docs"} />}
</AnimatePresence> </AnimatePresence>
<ul role="list" className="border-l border-transparent"> <ul role="list" className="border-l border-transparent">
{group.links.map((link) => ( {sortedLinks.map((link) => (
<motion.li key={link.title} layout="position" className="relative"> <motion.li key={link.title} layout="position" className="relative">
{link.href ? ( {link.href ? (
<NavLink <NavLink
+12 -10
View File
@@ -1,15 +1,17 @@
// ResponsiveVideo.js // ResponsiveVideo.tsx
export const ResponsiveVideo = ({ src, title }) => { export const ResponsiveVideo = ({ src, title }) => {
return ( return (
<div className="relative w-full overflow-hidden pt-[56.25%]"> <div className="max-w-[1280px]">
<iframe <div className="relative w-full overflow-hidden pt-[56.25%]">
src={src} <iframe
title={title} src={src}
frameBorder="0" title={title}
className="absolute left-0 top-0 h-full w-full" frameBorder="0"
referrerPolicy="strict-origin-when-cross-origin" className="absolute left-0 top-0 h-full w-full"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerPolicy="strict-origin-when-cross-origin"
allowFullScreen></iframe> allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen></iframe>
</div>
</div> </div>
); );
}; };
+13 -5
View File
@@ -40,9 +40,11 @@ export const navigation: Array<NavGroup> = [
{ title: "User Metadata", href: "/global/metadata" }, // global { title: "User Metadata", href: "/global/metadata" }, // global
{ title: "Custom Styling", href: "/global/overwrite-styling" }, // global { title: "Custom Styling", href: "/global/overwrite-styling" }, // global
{ title: "Conditional Logic", href: "/global/conditional-logic" }, // global { title: "Conditional Logic", href: "/global/conditional-logic" }, // global
{ title: "Custom Start & End Conditions", href: "/global/custom-start-end-conditions" }, // global { title: "Start & End Dates", href: "/global/custom-start-end-conditions" }, // global
{ title: "Limit submissions", href: "/global/limit-submissions" }, // global
{ title: "Recall Functionality", href: "/global/recall" }, // global { title: "Recall Functionality", href: "/global/recall" }, // global
{ title: "Partial Submissions", href: "/global/partial-submissions" }, // global { title: "Partial Submissions", href: "/global/partial-submissions" }, // global
{ title: "Shareable Dashboards", href: "/global/shareable-dashboards" },
], ],
}, },
], ],
@@ -63,9 +65,11 @@ export const navigation: Array<NavGroup> = [
{ title: "User Metadata", href: "/global/metadata" }, // global { title: "User Metadata", href: "/global/metadata" }, // global
{ title: "Custom Styling", href: "/global/overwrite-styling" }, // global { title: "Custom Styling", href: "/global/overwrite-styling" }, // global
{ title: "Conditional Logic", href: "/global/conditional-logic" }, // global { title: "Conditional Logic", href: "/global/conditional-logic" }, // global
{ title: "Custom Start & End Conditions", href: "/global/custom-start-end-conditions" }, // global { title: "Start & End Dates", href: "/global/custom-start-end-conditions" }, // global
{ title: "Limit submissions", href: "/global/limit-submissions" }, // global
{ title: "Recall Functionality", href: "/global/recall" }, // global { title: "Recall Functionality", href: "/global/recall" }, // global
{ title: "Partial Submissions", href: "/global/partial-submissions" }, // global { title: "Partial Submissions", href: "/global/partial-submissions" }, // global
{ title: "Shareable Dashboards", href: "/global/shareable-dashboards" },
], ],
}, },
], ],
@@ -89,7 +93,9 @@ export const navigation: Array<NavGroup> = [
{ title: "User Metadata", href: "/global/metadata" }, { title: "User Metadata", href: "/global/metadata" },
{ title: "Custom Styling", href: "/global/overwrite-styling" }, // global { title: "Custom Styling", href: "/global/overwrite-styling" }, // global
{ title: "Conditional Logic", href: "/global/conditional-logic" }, { title: "Conditional Logic", href: "/global/conditional-logic" },
{ title: "Custom Start & End Conditions", href: "/global/custom-start-end-conditions" }, { title: "Shareable Dashboards", href: "/global/shareable-dashboards" },
{ title: "Start & End Dates", href: "/global/custom-start-end-conditions" },
{ title: "Limit submissions", href: "/global/limit-submissions" }, // global
{ title: "Recall Functionality", href: "/global/recall" }, { title: "Recall Functionality", href: "/global/recall" },
{ title: "Verify Email before Survey", href: "/link-surveys/verify-email-before-survey" }, { title: "Verify Email before Survey", href: "/link-surveys/verify-email-before-survey" },
{ title: "PIN Protected Surveys", href: "/link-surveys/pin-protected-surveys" }, { title: "PIN Protected Surveys", href: "/link-surveys/pin-protected-surveys" },
@@ -103,6 +109,7 @@ export const navigation: Array<NavGroup> = [
links: [ links: [
{ title: "Access Roles", href: "/global/access-roles" }, { title: "Access Roles", href: "/global/access-roles" },
{ title: "Styling Theme", href: "/global/styling-theme" }, { title: "Styling Theme", href: "/global/styling-theme" },
{ title: "Logic Editor", href: "/global/logic-editor" },
], ],
}, },
{ {
@@ -136,8 +143,9 @@ export const navigation: Array<NavGroup> = [
{ title: "Zapier", href: "/developer-docs/integrations/zapier" }, { title: "Zapier", href: "/developer-docs/integrations/zapier" },
], ],
}, },
{ title: "SDK: App Survey", href: "/developer-docs/app-survey-sdk" }, { title: "SDK: Web Apps", href: "/developer-docs/app-survey-sdk" },
{ title: "SDK: Website Survey", href: "/developer-docs/website-survey-sdk" }, { title: "SDK: Public Websites", href: "/developer-docs/website-survey-sdk" },
{ title: "SDK: React Native", href: "/developer-docs/react-native-in-app-surveys" },
{ title: "SDK: Formbricks API", href: "/developer-docs/api-sdk" }, { title: "SDK: Formbricks API", href: "/developer-docs/api-sdk" },
{ title: "REST API", href: "/developer-docs/rest-api" }, { title: "REST API", href: "/developer-docs/rest-api" },
{ title: "Webhooks", href: "/developer-docs/webhooks" }, { title: "Webhooks", href: "/developer-docs/webhooks" },
+6 -6
View File
@@ -1,5 +1,4 @@
import nextMDX from "@next/mdx"; import nextMDX from "@next/mdx";
import { recmaPlugins } from "./mdx/recma.mjs"; import { recmaPlugins } from "./mdx/recma.mjs";
import { rehypePlugins } from "./mdx/rehype.mjs"; import { rehypePlugins } from "./mdx/rehype.mjs";
import { remarkPlugins } from "./mdx/remark.mjs"; import { remarkPlugins } from "./mdx/remark.mjs";
@@ -105,17 +104,18 @@ const nextConfig = {
destination: "/app-surveys/user-identification", destination: "/app-surveys/user-identification",
permanent: true, permanent: true,
}, },
// Global Features
{
source: "/global/custom-start-end-conditions",
destination: "/global/schedule-start-end-dates",
permanent: true,
},
// Integrations // Integrations
{ {
source: "/integrations/:path", source: "/integrations/:path",
destination: "/developer-docs/integrations/:path", destination: "/developer-docs/integrations/:path",
permanent: true, permanent: true,
}, },
{
source: "/global/custom-styling",
destination: "/global/overwrite-styling",
permanent: true,
},
]; ];
}, },
}; };
+12 -12
View File
@@ -19,23 +19,23 @@
"devDependencies": { "devDependencies": {
"@chromatic-com/storybook": "^1.6.1", "@chromatic-com/storybook": "^1.6.1",
"@formbricks/config-typescript": "workspace:*", "@formbricks/config-typescript": "workspace:*",
"@storybook/addon-a11y": "^8.2.7", "@storybook/addon-a11y": "^8.2.9",
"@storybook/addon-essentials": "^8.2.7", "@storybook/addon-essentials": "^8.2.9",
"@storybook/addon-interactions": "^8.2.7", "@storybook/addon-interactions": "^8.2.9",
"@storybook/addon-links": "^8.2.7", "@storybook/addon-links": "^8.2.9",
"@storybook/addon-onboarding": "^8.2.7", "@storybook/addon-onboarding": "^8.2.9",
"@storybook/blocks": "^8.2.7", "@storybook/blocks": "^8.2.9",
"@storybook/react": "^8.2.7", "@storybook/react": "^8.2.9",
"@storybook/react-vite": "^8.2.7", "@storybook/react-vite": "^8.2.9",
"@storybook/test": "^8.2.7", "@storybook/test": "^8.2.9",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-react": "^4.3.1", "@vitejs/plugin-react": "^4.3.1",
"esbuild": "^0.23.0", "esbuild": "^0.23.0",
"eslint-plugin-storybook": "^0.8.0", "eslint-plugin-storybook": "^0.8.0",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"storybook": "^8.2.7", "storybook": "^8.2.9",
"tsup": "^8.2.3", "tsup": "^8.2.4",
"vite": "^5.3.5" "vite": "^5.4.1"
} }
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
import base from "../../packages/config-tailwind/tailwind.config"; import base from "../../packages/ui/tailwind.config";
export default { export default {
...base, ...base,
+1 -1
View File
@@ -87,7 +87,7 @@ RUN PRISMA_VERSION=$(cat prisma_version.txt) && npm install -g prisma@$PRISMA_VE
EXPOSE 3000 EXPOSE 3000
ENV HOSTNAME "0.0.0.0" ENV HOSTNAME "0.0.0.0"
USER nextjs # USER nextjs
# Prepare volume for uploads # Prepare volume for uploads
RUN mkdir -p /home/nextjs/apps/web/uploads/ RUN mkdir -p /home/nextjs/apps/web/uploads/
@@ -9,7 +9,7 @@ import { useEffect } from "react";
import { cn } from "@formbricks/lib/cn"; import { cn } from "@formbricks/lib/cn";
import { TEnvironment } from "@formbricks/types/environment"; import { TEnvironment } from "@formbricks/types/environment";
import { TProductConfigChannel } from "@formbricks/types/product"; import { TProductConfigChannel } from "@formbricks/types/product";
import { Button } from "@formbricks/ui/Button"; import { Button } from "@formbricks/ui/components/Button";
import { OnboardingSetupInstructions } from "./OnboardingSetupInstructions"; import { OnboardingSetupInstructions } from "./OnboardingSetupInstructions";
interface ConnectWithFormbricksProps { interface ConnectWithFormbricksProps {
@@ -82,7 +82,6 @@ export const ConnectWithFormbricks = ({
</div> </div>
<Button <Button
id="finishOnboarding" id="finishOnboarding"
className="text-slate-400 hover:text-slate-700"
variant={widgetSetupCompleted ? "primary" : "minimal"} variant={widgetSetupCompleted ? "primary" : "minimal"}
onClick={handleFinishOnboarding} onClick={handleFinishOnboarding}
EndIcon={ArrowRight}> EndIcon={ArrowRight}>
@@ -7,9 +7,9 @@ import { FormProvider, useForm } from "react-hook-form";
import { toast } from "react-hot-toast"; import { toast } from "react-hot-toast";
import { z } from "zod"; import { z } from "zod";
import { TOrganization } from "@formbricks/types/organizations"; import { TOrganization } from "@formbricks/types/organizations";
import { Button } from "@formbricks/ui/Button"; import { Button } from "@formbricks/ui/components/Button";
import { FormControl, FormError, FormField, FormItem, FormLabel } from "@formbricks/ui/Form"; import { FormControl, FormError, FormField, FormItem, FormLabel } from "@formbricks/ui/components/Form";
import { Input } from "@formbricks/ui/Input"; import { Input } from "@formbricks/ui/components/Input";
interface InviteOrganizationMemberProps { interface InviteOrganizationMemberProps {
organization: TOrganization; organization: TOrganization;
@@ -36,7 +36,12 @@ export const InviteOrganizationMember = ({ organization, environmentId }: Invite
const handleInvite = async (data: TInviteOrganizationMemberDetails) => { const handleInvite = async (data: TInviteOrganizationMemberDetails) => {
try { try {
await inviteOrganizationMemberAction(organization.id, data.email, "developer", data.inviteMessage); await inviteOrganizationMemberAction({
organizationId: organization.id,
email: data.email,
role: "developer",
inviteMessage: data.inviteMessage,
});
toast.success("Invite sent successful"); toast.success("Invite sent successful");
await finishOnboarding(); await finishOnboarding();
} catch (error) { } catch (error) {
@@ -4,10 +4,10 @@ import "prismjs/themes/prism.css";
import { useState } from "react"; import { useState } from "react";
import toast from "react-hot-toast"; import toast from "react-hot-toast";
import { TProductConfigChannel } from "@formbricks/types/product"; import { TProductConfigChannel } from "@formbricks/types/product";
import { Button } from "@formbricks/ui/Button"; import { Button } from "@formbricks/ui/components/Button";
import { CodeBlock } from "@formbricks/ui/CodeBlock"; import { CodeBlock } from "@formbricks/ui/components/CodeBlock";
import { TabBar } from "@formbricks/ui/TabBar"; import { TabBar } from "@formbricks/ui/components/TabBar";
import { Html5Icon, NpmIcon } from "@formbricks/ui/icons"; import { Html5Icon, NpmIcon } from "@formbricks/ui/components/icons";
const tabs = [ const tabs = [
{ id: "html", label: "HTML", icon: <Html5Icon /> }, { id: "html", label: "HTML", icon: <Html5Icon /> },
@@ -5,8 +5,8 @@ import { notFound, redirect } from "next/navigation";
import { authOptions } from "@formbricks/lib/authOptions"; import { authOptions } from "@formbricks/lib/authOptions";
import { getMembershipByUserIdOrganizationId } from "@formbricks/lib/membership/service"; import { getMembershipByUserIdOrganizationId } from "@formbricks/lib/membership/service";
import { getOrganizationByEnvironmentId } from "@formbricks/lib/organization/service"; import { getOrganizationByEnvironmentId } from "@formbricks/lib/organization/service";
import { Button } from "@formbricks/ui/Button"; import { Button } from "@formbricks/ui/components/Button";
import { Header } from "@formbricks/ui/Header"; import { Header } from "@formbricks/ui/components/Header";
interface InvitePageProps { interface InvitePageProps {
params: { params: {
@@ -1,12 +1,10 @@
import { ConnectWithFormbricks } from "@/app/(app)/(onboarding)/environments/[environmentId]/connect/components/ConnectWithFormbricks"; import { ConnectWithFormbricks } from "@/app/(app)/(onboarding)/environments/[environmentId]/connect/components/ConnectWithFormbricks";
import { getCustomHeadline } from "@/app/(app)/(onboarding)/lib/utils";
import { XIcon } from "lucide-react"; import { XIcon } from "lucide-react";
import { notFound } from "next/navigation";
import { WEBAPP_URL } from "@formbricks/lib/constants"; import { WEBAPP_URL } from "@formbricks/lib/constants";
import { getEnvironment } from "@formbricks/lib/environment/service"; import { getEnvironment } from "@formbricks/lib/environment/service";
import { getProductByEnvironmentId } from "@formbricks/lib/product/service"; import { getProductByEnvironmentId } from "@formbricks/lib/product/service";
import { Button } from "@formbricks/ui/Button"; import { Button } from "@formbricks/ui/components/Button";
import { Header } from "@formbricks/ui/Header"; import { Header } from "@formbricks/ui/components/Header";
interface ConnectPageProps { interface ConnectPageProps {
params: { params: {
@@ -26,18 +24,12 @@ const Page = async ({ params }: ConnectPageProps) => {
throw new Error("Product not found"); throw new Error("Product not found");
} }
const channel = product.config.channel; const channel = product.config.channel || null;
const industry = product.config.industry;
if (!channel || !industry) {
return notFound();
}
const customHeadline = getCustomHeadline(channel, industry);
return ( return (
<div className="flex min-h-full flex-col items-center justify-center py-10"> <div className="flex min-h-full flex-col items-center justify-center py-10">
<Header <Header
title={`Let's connect your ${customHeadline} with Formbricks`} title={`Let's connect your product with Formbricks`}
subtitle="It takes less than 4 minutes, pinky promise!" subtitle="It takes less than 4 minutes, pinky promise!"
/> />
<div className="space-y-4 text-center"> <div className="space-y-4 text-center">

Some files were not shown because too many files have changed in this diff Show More