From 0443abbd318de00a5fcf6155385cbb63d8372164 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 25 Jun 2026 10:09:21 +0000 Subject: [PATCH] feat: add APPSMITH_HIDE_HELP_BUTTON env var to hide help/support icon Introduces a runtime config flag that, when enabled, hides the help/support button (the "?" menu containing documentation, chat, send-support-info and what's-new) both on the applications home page and inside the app editor. - ce/configs: thread `hideHelpButton` through INJECTED_CONFIGS, getConfigsFromEnvVars and getAppsmithConfigs (mirrors the existing disableIframeWidgetSandbox pattern) - public/index.html: inject APPSMITH_HIDE_HELP_BUTTON into window.APPSMITH_FEATURE_CONFIGS for runtime (no rebuild) configuration - HomepageHeaderAction / HelpButton: gate render on the flag - EnvVariables.java: register the env var so it is manageable server-side - docker.env.sh, helm values/README/snapshot, jest.config: defaults set to false so existing installs are unaffected Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01E72oeKwZBo84Wemo4TXrd2 --- app/client/jest.config.js | 1 + app/client/public/index.html | 1 + app/client/src/ce/configs/index.ts | 8 ++++++++ app/client/src/ce/configs/types.ts | 1 + app/client/src/pages/Editor/HelpButton.tsx | 5 ++++- .../src/pages/common/SearchBar/HomepageHeaderAction.tsx | 4 ++-- .../java/com/appsmith/server/constants/EnvVariables.java | 1 + deploy/docker/fs/opt/appsmith/templates/docker.env.sh | 4 ++++ deploy/helm/README.md | 2 +- .../tests/__snapshot__/defaults_snapshot_test.yaml.snap | 1 + deploy/helm/values.yaml | 2 ++ 11 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/client/jest.config.js b/app/client/jest.config.js index e4074a35c257..70145c31a8ae 100644 --- a/app/client/jest.config.js +++ b/app/client/jest.config.js @@ -116,6 +116,7 @@ module.exports = { disableIframeWidgetSandbox: parseConfig( "__APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX__", ), + hideHelpButton: parseConfig("__APPSMITH_HIDE_HELP_BUTTON__"), }, }, }; diff --git a/app/client/public/index.html b/app/client/public/index.html index 379aea5663a6..75cf81115083 100755 --- a/app/client/public/index.html +++ b/app/client/public/index.html @@ -261,6 +261,7 @@ disableIframeWidgetSandbox: parseConfig( '{{env "APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX"}}', ), + hideHelpButton: parseConfig('{{env "APPSMITH_HIDE_HELP_BUTTON"}}'), customerPortalUrl: parseConfig('{{env "APPSMITH_CUSTOMER_PORTAL_URL"}}') || "https://customer.appsmith.com", diff --git a/app/client/src/ce/configs/index.ts b/app/client/src/ce/configs/index.ts index 2cd34612812f..f398b3f0c021 100644 --- a/app/client/src/ce/configs/index.ts +++ b/app/client/src/ce/configs/index.ts @@ -59,6 +59,7 @@ export interface INJECTED_CONFIGS { googleRecaptchaSiteKey: string; supportEmail: string; disableIframeWidgetSandbox: boolean; + hideHelpButton: boolean; pricingUrl: string; customerPortalUrl: string; } @@ -132,6 +133,9 @@ export const getConfigsFromEnvVars = (): INJECTED_CONFIGS => { .APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX ? process.env.APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX.length > 0 : false, + hideHelpButton: process.env.APPSMITH_HIDE_HELP_BUTTON + ? process.env.APPSMITH_HIDE_HELP_BUTTON.length > 0 + : false, pricingUrl: process.env.REACT_APP_PRICING_URL || "", customerPortalUrl: process.env.REACT_APP_CUSTOMER_PORTAL_URL || "", }; @@ -276,6 +280,10 @@ export const getAppsmithConfigs = (): AppsmithUIConfigs => { ENV_CONFIG.disableIframeWidgetSandbox || APPSMITH_FEATURE_CONFIGS?.disableIframeWidgetSandbox || false, + hideHelpButton: + ENV_CONFIG.hideHelpButton || + APPSMITH_FEATURE_CONFIGS?.hideHelpButton || + false, pricingUrl: ENV_CONFIG.pricingUrl || APPSMITH_FEATURE_CONFIGS?.pricingUrl || "", customerPortalUrl: diff --git a/app/client/src/ce/configs/types.ts b/app/client/src/ce/configs/types.ts index b547542f38bc..3e6998d5c028 100644 --- a/app/client/src/ce/configs/types.ts +++ b/app/client/src/ce/configs/types.ts @@ -58,6 +58,7 @@ export interface AppsmithUIConfigs { }; appsmithSupportEmail: string; disableIframeWidgetSandbox: boolean; + hideHelpButton: boolean; pricingUrl: string; customerPortalUrl: string; } diff --git a/app/client/src/pages/Editor/HelpButton.tsx b/app/client/src/pages/Editor/HelpButton.tsx index dd12c08b25e4..e1cf7125b402 100644 --- a/app/client/src/pages/Editor/HelpButton.tsx +++ b/app/client/src/pages/Editor/HelpButton.tsx @@ -46,7 +46,8 @@ import BetterbugsUtil from "utils/Analytics/betterbugs"; import { isAirgapped } from "ee/utils/airgapHelpers"; import { useBetterbugsMetadata } from "utils/hooks/useBetterbugsMetadata"; -const { appVersion, betterbugs, cloudHosting } = getAppsmithConfigs(); +const { appVersion, betterbugs, cloudHosting, hideHelpButton } = + getAppsmithConfigs(); const HelpFooter = styled.div` display: flex; @@ -227,6 +228,8 @@ function HelpButton() { bootPylon(user); }, [user?.email, user?.emailVerificationHash, user?.name, user?.username]); + if (hideHelpButton) return null; + return ( { diff --git a/app/client/src/pages/common/SearchBar/HomepageHeaderAction.tsx b/app/client/src/pages/common/SearchBar/HomepageHeaderAction.tsx index d33775b8b97d..7edcd5cbdda2 100644 --- a/app/client/src/pages/common/SearchBar/HomepageHeaderAction.tsx +++ b/app/client/src/pages/common/SearchBar/HomepageHeaderAction.tsx @@ -73,7 +73,7 @@ const HomepageHeaderAction = ({ ); const isHomePage = useRouteMatch("/applications")?.isExact; const isAirgappedInstance = isAirgapped(); - const { appVersion } = getAppsmithConfigs(); + const { appVersion, hideHelpButton } = getAppsmithConfigs(); const howMuchTimeBefore = howMuchTimeBeforeText(appVersion.releaseDate); const [showIntercomConsent, setShowIntercomConsent] = useState(false); const isAiAgentInstanceEnabled = useSelector(getIsAiAgentInstanceEnabled); @@ -104,7 +104,7 @@ const HomepageHeaderAction = ({ /> )} - {!isAirgappedInstance && ( + {!isAirgappedInstance && !hideHelpButton && ( { if (open) { diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/constants/EnvVariables.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/constants/EnvVariables.java index e4eb59ba6d5b..a4beeb676898 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/constants/EnvVariables.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/constants/EnvVariables.java @@ -25,6 +25,7 @@ public enum EnvVariables { APPSMITH_CUSTOM_DOMAIN, APPSMITH_ALLOWED_FRAME_ANCESTORS, APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX, + APPSMITH_HIDE_HELP_BUTTON, APPSMITH_NEW_RELIC_ACCOUNT_ENABLE, APPSMITH_VERBOSE_LOGGING_ENABLED } diff --git a/deploy/docker/fs/opt/appsmith/templates/docker.env.sh b/deploy/docker/fs/opt/appsmith/templates/docker.env.sh index 9bf5e3869db7..c3a194f047e3 100644 --- a/deploy/docker/fs/opt/appsmith/templates/docker.env.sh +++ b/deploy/docker/fs/opt/appsmith/templates/docker.env.sh @@ -86,4 +86,8 @@ APPSMITH_ALLOWED_FRAME_ANCESTORS="'self' *" APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX=false +# Set this to true to hide the help/support button (the "?" menu with documentation, +# chat and support options) on the home page and in the app editor. +APPSMITH_HIDE_HELP_BUTTON=false + EOF diff --git a/deploy/helm/README.md b/deploy/helm/README.md index 1e2e66877ac1..489381dd84fb 100644 --- a/deploy/helm/README.md +++ b/deploy/helm/README.md @@ -16,7 +16,7 @@ for prerequisites, step-by-step setup, and platform-specific instructions (EKS, | Key | Type | Default | Description | |-----|------|---------|-------------| | secretName | string | `""` | Name of an existing Secret for APPSMITH_* env vars (empty = chart creates one) | -| applicationConfig | object | `{"APPSMITH_CLIENT_LOG_LEVEL":"","APPSMITH_CUSTOM_DOMAIN":"","APPSMITH_DB_URL":"","APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX":"false","APPSMITH_DISABLE_TELEMETRY":"","APPSMITH_ENCRYPTION_PASSWORD":"","APPSMITH_ENCRYPTION_SALT":"","APPSMITH_FORM_LOGIN_DISABLED":"","APPSMITH_KEYCLOAK_DB_DRIVER":"","APPSMITH_KEYCLOAK_DB_PASSWORD":"","APPSMITH_KEYCLOAK_DB_URL":"","APPSMITH_KEYCLOAK_DB_USERNAME":"","APPSMITH_LICENSE_KEY":"","APPSMITH_MAIL_ENABLED":"","APPSMITH_MAIL_FROM":"","APPSMITH_MAIL_HOST":"","APPSMITH_MAIL_PASSWORD":"","APPSMITH_MAIL_PORT":"","APPSMITH_MAIL_SMTP_AUTH":"","APPSMITH_MAIL_SMTP_TLS_ENABLED":"","APPSMITH_MAIL_USERNAME":"","APPSMITH_OAUTH2_GITHUB_CLIENT_ID":"","APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET":"","APPSMITH_OAUTH2_GOOGLE_CLIENT_ID":"","APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET":"","APPSMITH_RECAPTCHA_ENABLED":"","APPSMITH_RECAPTCHA_SECRET_KEY":"","APPSMITH_RECAPTCHA_SITE_KEY":"","APPSMITH_REDIS_URL":"","APPSMITH_REPLY_TO":"","APPSMITH_SIGNUP_DISABLED":""}` | Map of APPSMITH_* environment variables for the application container | +| applicationConfig | object | `{"APPSMITH_CLIENT_LOG_LEVEL":"","APPSMITH_CUSTOM_DOMAIN":"","APPSMITH_DB_URL":"","APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX":"false","APPSMITH_DISABLE_TELEMETRY":"","APPSMITH_ENCRYPTION_PASSWORD":"","APPSMITH_ENCRYPTION_SALT":"","APPSMITH_FORM_LOGIN_DISABLED":"","APPSMITH_HIDE_HELP_BUTTON":"false","APPSMITH_KEYCLOAK_DB_DRIVER":"","APPSMITH_KEYCLOAK_DB_PASSWORD":"","APPSMITH_KEYCLOAK_DB_URL":"","APPSMITH_KEYCLOAK_DB_USERNAME":"","APPSMITH_LICENSE_KEY":"","APPSMITH_MAIL_ENABLED":"","APPSMITH_MAIL_FROM":"","APPSMITH_MAIL_HOST":"","APPSMITH_MAIL_PASSWORD":"","APPSMITH_MAIL_PORT":"","APPSMITH_MAIL_SMTP_AUTH":"","APPSMITH_MAIL_SMTP_TLS_ENABLED":"","APPSMITH_MAIL_USERNAME":"","APPSMITH_OAUTH2_GITHUB_CLIENT_ID":"","APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET":"","APPSMITH_OAUTH2_GOOGLE_CLIENT_ID":"","APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET":"","APPSMITH_RECAPTCHA_ENABLED":"","APPSMITH_RECAPTCHA_SECRET_KEY":"","APPSMITH_RECAPTCHA_SITE_KEY":"","APPSMITH_REDIS_URL":"","APPSMITH_REPLY_TO":"","APPSMITH_SIGNUP_DISABLED":""}` | Map of APPSMITH_* environment variables for the application container | | image | object | `{"pullPolicy":"IfNotPresent","pullSecrets":"","registry":"index.docker.io","repository":"appsmith/appsmith-ee","tag":"latest"}` | Appsmith container image configuration | | _image | object | `{}` | DEPRECATED: use image instead. Backwards-compatible override merged on top of image. | diff --git a/deploy/helm/tests/__snapshot__/defaults_snapshot_test.yaml.snap b/deploy/helm/tests/__snapshot__/defaults_snapshot_test.yaml.snap index 2ccca26633fb..0652f525c972 100644 --- a/deploy/helm/tests/__snapshot__/defaults_snapshot_test.yaml.snap +++ b/deploy/helm/tests/__snapshot__/defaults_snapshot_test.yaml.snap @@ -14,6 +14,7 @@ APPSMITH_DB_URL: | mongodb+srv://root:password@appsmith-mongodb.NAMESPACE.svc.cluster.local/appsmith?retryWrites=true&authSource=admin&ssl=false APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX: "false" + APPSMITH_HIDE_HELP_BUTTON: "false" APPSMITH_KEYCLOAK_DB_DRIVER: postgresql APPSMITH_KEYCLOAK_DB_PASSWORD: password APPSMITH_KEYCLOAK_DB_URL: RELEASE-NAME-postgresql.NAMESPACE.svc.cluster.local:5432/keycloak diff --git a/deploy/helm/values.yaml b/deploy/helm/values.yaml index 4471dd9e47f7..7cc65b5c7ec1 100644 --- a/deploy/helm/values.yaml +++ b/deploy/helm/values.yaml @@ -62,6 +62,8 @@ applicationConfig: # @schema additionalProperties: {type: [string, boolean, inte # @schema hidden: true APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX: "false" # @schema hidden: true + APPSMITH_HIDE_HELP_BUTTON: "false" + # @schema hidden: true APPSMITH_LICENSE_KEY: "" # @schema hidden: true APPSMITH_KEYCLOAK_DB_DRIVER: ""