Skip to content

Feature: App-specific login and logout flows for shared app URLs - #15716

Merged
gsmithun4 merged 29 commits into
lts-3.16from
feature/app-specific-auth-flows
Apr 14, 2026
Merged

gsmithun4 merged 29 commits into
lts-3.16from
feature/app-specific-auth-flows

Conversation

@akshaysasidrn

@akshaysasidrn akshaysasidrn commented Mar 26, 2026 •

Copy link
Copy Markdown
Collaborator

📝 What this does

When admins share app URLs directly with end-users, all auth flows now stay within the app's context — sign-in, sign-up, logout, and password reset all redirect back to the app instead of the workspace dashboard.

📎 References

Relates to: ToolJet/tj-ee#4408

Sub-issues:

  • ToolJet/tj-ee#4888
  • ToolJet/tj-ee#4889
  • ToolJet/tj-ee#4890
  • ToolJet/tj-ee#4891

🔀 Changes

  • Added app-scoped sign-in page at /applications/:slug/login showing "Sign in to application - <app_name>" with inherited workspace login methods
  • Added app-scoped sign-up page at /applications/:slug/signup with matching app-branded copy
  • Unauthenticated users hitting /applications/:slug now redirect to app login instead of workspace login
  • Logout from app viewer redirects to app sign-in page instead of workspace login
  • Password reset emails include app context in the reset link, redirecting back to the app after reset

🔌 API Reference

Method Route Permission Request Response
GET /api/apps/app-authentication-config/:slug Public (no auth) — { name, slug, isPublic, organizationId }

📸 Screenshots

App sign-in page (/applications/:slug/login)

image

App sign-up page (/applications/:slug/signup)

image

🧪 How to test

  • Create an app, set a custom slug, release it, make it private
  • Open /applications/<slug> in incognito — should redirect to /applications/<slug>/login
  • Sign in — should land on the app, not the dashboard
  • Invalidate session (or logout) — should redirect to /applications/<slug>/login
  • Click "Forgot?" on app login — should go to /applications/<slug>/forgot-password
  • Reset password from app context — email link should include app slug, reset redirects to app login
  • Make app public — /applications/<slug>/login should redirect directly to the app
  • Verify workspace login at /login still works normally

QA Checklist

  • Integration Testing.
  • Smoke Testing.
  • Bug Fixes Verification.
  • Cross browser UI check. (Firefox, safari,chrome)
  • Verify features on Dark and Light mode.
  • Test feature on CE, EE, cloud
  • Platform Automation Testing.
  • Marketplace Automation Testing.
  • Migration testing.
  • Added tested Label for PR
  • Test System Upgrade/Staging Instance(for cloud) (Sanity + Test System Specific. Cases)

When users access a ToolJet app via a direct URL (/applications/:slug),
they now see an app-branded sign-in page ("Sign in to application -
<app_name>") instead of the workspace login. After login, they're
redirected back to the app. Public apps skip the login page entirely.

Backend: new GET /apps/app-authentication-config/:slug endpoint returns
app metadata + organizationId for unauthenticated users.

Frontend: AppLoginPage component lazy-loaded in ViewerApp, with auth
bypass in authorizeWorkspace and narrowed 401 handlers.

Closes ToolJet/tj-ee#4888
New AppSignupPage component at /applications/:slug/signup showing
"Sign up to application - <app_name>" with inherited workspace login
methods. Links back to app sign-in page. After successful sign-up,
redirects to the app.

Closes ToolJet/tj-ee#4889
When a user logs out while viewing an app (/applications/:slug),
they're now redirected to /applications/:slug/login instead of the
workspace login page. Re-login from there returns them to the app.

Closes ToolJet/tj-ee#4890
Forgot-password endpoint now accepts optional appSlug parameter. When
provided, the password reset email link includes the app slug
(/applications/:slug/reset-password/:token). After reset, the user is
redirected to the app sign-in page.

New routes: /applications/:slug/forgot-password and
/applications/:slug/reset-password/:token with lazy-loaded components.

Closes ToolJet/tj-ee#4891
@akshaysasidrn akshaysasidrn added the create-ee-lts-review-app uses ./docker/LTS/ee/ee-preview.Dockerfile label Mar 26, 2026
@akshaysasidrn
akshaysasidrn force-pushed the feature/app-specific-auth-flows branch from 86e0537 to 5c975f1 Compare March 26, 2026 10:55
@github-actions

Copy link
Copy Markdown
Contributor

🚀 EE LTS Review App Deployed!

Resource Link
App URL https://tooljet-ee-lts-pr-15716.onrender.com
Render Dashboard https://dashboard.render.com/web/srv-d72h4iadbo4c73b5qud0

Deployed using DockerHub-based pipeline - LTS Edition

@github-actions github-actions Bot added active-ee-lts-review-app For lts (github action build and deploy on render)) and removed create-ee-lts-review-app uses ./docker/LTS/ee/ee-preview.Dockerfile labels Mar 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔄 EE LTS Review App Rebuilding

New commit 61d8925 pushed. Image updated and deployment triggered.

Using cached layers for faster build

@adishM98 adishM98 added the suspend-ee-lts-review-app For lts (github action build and deploy on render)) label Mar 28, 2026
@github-actions github-actions Bot removed the active-ee-lts-review-app For lts (github action build and deploy on render)) label Mar 28, 2026
@akshaysasidrn akshaysasidrn removed the suspend-ee-lts-review-app For lts (github action build and deploy on render)) label Mar 30, 2026
@github-actions github-actions Bot added the active-ee-lts-review-app For lts (github action build and deploy on render)) label Mar 30, 2026
@adishM98 adishM98 added the suspend-ee-lts-review-app For lts (github action build and deploy on render)) label Mar 31, 2026
@github-actions github-actions Bot removed the active-ee-lts-review-app For lts (github action build and deploy on render)) label Mar 31, 2026
@akshaysasidrn akshaysasidrn removed the suspend-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 1, 2026
@github-actions github-actions Bot added the active-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 1, 2026
When accessing forgot password from an app URL, "Back to Login" and
"Create an Account" links now correctly redirect to the app-scoped
login/signup pages instead of the instance-level pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Apr 1, 2026

Copy link
Copy Markdown
Contributor

🔄 EE LTS Review App Rebuilding

New commit 68f6cbe pushed. Image updated and deployment triggered.

Using cached layers for faster build

@adishM98 adishM98 added the suspend-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 2, 2026
@github-actions github-actions Bot removed the active-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 2, 2026
akshaysasidrn and others added 4 commits April 6, 2026 11:54
authorizeWorkspace CASE-4 was unconditionally redirecting all
unauthenticated /applications/* requests to the app login page,
creating an infinite redirect loop for public apps. Now checks
the app's public status via getAppAuthenticationConfig before
deciding whether to redirect.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
LoginForm had the app redirect URL but wasn't passing it to
SSOAuthModule, so SSO providers (LDAP, OIDC, SAML) couldn't
redirect back to the app after authentication.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The isDesiredStatusCode block (404/422/400 errors) was missing a
return, causing CASE-4 to also run and override the original error
redirect with a login redirect. This broke app preview access and
caused redirect loops after login.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The "Create an account" link in the app-specific login page was
always visible regardless of workspace signup settings. Now gated
behind isSignUpCTAEnabled, matching the behavior of the workspace
login page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@YuktiGoyal02 YuktiGoyal02 added tested and removed run-cypress-marketplace-ee run marketplace cypress for ee suspend-ee-lts-review-app For lts (github action build and deploy on render)) labels Apr 9, 2026
@github-actions github-actions Bot added the active-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 9, 2026
@adishM98 adishM98 added the suspend-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 10, 2026
@github-actions github-actions Bot removed the active-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 10, 2026
@akshaysasidrn
akshaysasidrn force-pushed the feature/app-specific-auth-flows branch from d7f7d42 to e490c23 Compare April 13, 2026 07:05
@adishM98

Copy link
Copy Markdown
Collaborator

🔍 Checking linked submodule PRs for feature/app-specific-auth-flows:

❌ No open PR in ee-server
❌ No open PR in ee-frontend

📝 Note: The submodule PRs will be auto-merged once you merge this base PR-15716 into lts-3.16.

@gsmithun4
gsmithun4 merged commit 8acb818 into lts-3.16 Apr 14, 2026
391 of 395 checks passed
@gsmithun4
gsmithun4 deleted the feature/app-specific-auth-flows branch April 14, 2026 12:30
@github-actions github-actions Bot removed the suspend-ee-lts-review-app For lts (github action build and deploy on render)) label Apr 14, 2026
gsmithun4 added a commit that referenced this pull request Apr 19, 2026
* commit

* commit

* Fix

* feat: add JS Libraries management feature with dynamic loading and setup script execution

* Fix backend part

* Fix mobile menu

* refactor: Unify mobile and desktop canvas rendering logic, center mobile layout, and include canvas header children in inspector.

* fix

* add header object

* commit

* feat: Enable independent toggling of page header visibility for desktop and mobile layouts, and ensure page header properties are initialized with default values.

* update submodule

* refactor: Consolidate page canvas header height constant and dynamically calculate sidebar height based on header visibility and navigation type.

* update ee-diff

* add selection

* fix

* feat: refactor JS Libraries management to use preloaded JavaScript execution

* feat: Add `disable-moveable-line` class and styling to manage canvas behavior during virtual ghost interactions.

* update submodule

* fix: Adjust mobile navigation menu container and pointer events for correct rendering within the canvas.

* update submodule

* fix: decrease page canvas header height.

* update submodule

* Add footer canvas to Main canvas

* Enhance AppCanvas and related components with pages sidebar visibility state management. Updated hooks and styles to accommodate sidebar visibility changes, ensuring proper layout adjustments in mobile and desktop views.

* Refactor AppCanvas layout components to improve structure and maintainability. Introduced DesktopLayout and MobileLayout components, along with CanvasContentTail and PageCanvasHeader for better separation of concerns. Removed unused code and optimized imports for cleaner implementation.

* Enable copy pasting

* Fix modal positioning

* Add licensing support for canvas page header and footer features. Updated the licensing model to include checks for these features, and modified the AddNewPagePopup component to conditionally render tooltips and enable/disable page header options based on the user's license. Improved user feedback for feature access limitations.

* Fix

* fix

* fix

* update submodule

* fix

* Add page footer functionality to AppCanvas, including new PageCanvasFooter component and related styles. Updated layout components to support footer visibility and added necessary state management. Enhanced page settings to include footer options with licensing checks.

* fix autoscroll issue

* Refactor layout styles to use CSS variable for header height in PageCanvasFooter and PagesSidebarNavigation components. Updated Viewer component to define the variable based on release version.

* update submodule

* Refactor PageCanvasFooter to consolidate footer color state retrieval into a single useStore call, improving readability and performance. Commented out unused canvasHeight and canvasWidth props for future consideration.

* Refactor AppImportExportService and PageHelperService to standardize background color property naming for page header and footer, improving consistency across the codebase.

* Update submodule

* Refactor import paths for PagesSidebarNavigation and MobileNavigationHeader components to improve code organization and maintainability.

* update submodule

* Combine migrations

* Implement new layout components for AppCanvas, including DesktopLayout and MobileLayout, and introduce CanvasContentTail for shared content structure. Refactor AppCanvas to use updated import paths for layout components, enhancing code organization. Add PageCanvasHeader and PageCanvasFooter components for improved header and footer functionality.

* Update submodule and refactor PageCanvasHeader and PageCanvasFooter components to use withEditionSpecificComponent, simplifying their structure and improving code organization. Adjust import statements in DesktopLayout and MobileLayout for consistency.

* remove console

* Refactor copy-paste functionality in AppCanvas: move markClipboardAsCopyAfterCutPaste to copyPasteWidgetsUtils, implement resolvePastedComponentName for better name handling, and clean up unused styles in appCanvas.scss.

* feat: add disable row deselection feature and selected row color customization

* update submodule

* Added query folder tables

* Added DB operations, DTO, interfaces and feature checks

* Added CE Fallback

* Submodule update

* Submodule update

* Adding mapping on query creationg and deletion

* feat: add onFieldClick event and lastClickedField variable to key-value pair widget

* Update submodules and refactor parent ID handling in app import/export and page services to preserve virtual container parents (canvas-header, canvas-footer) during remapping.

* Update submodules and enhance gridSlice.js to handle canvas header and footer selections during mouse events.

* Update submodule

* Remove console log from handleCanvasContainerMouseUp in gridSlice.js

* DataQueryFolder service added

* Enhance AppCanvas and layout components to dynamically use header and footer heights from the store. Introduce height adjustment inputs for header and footer styles in the configuration panels. Update import/export service to include default heights for page headers and footers.

* update submodule

* Update RightSidebarToggle and ComponentConfigurationTab to include canvas footer selection handling. Introduce isCanvasFooterSelected state in componentsSlice and gridSlice for improved sidebar functionality. Update submodule reference.

* fix

* QueryFolder slice added

* Query folder tree added

* Wire QueryFolderTree into query panel UI

* Add frontend designs

* Unique folder name logic fix

* fix: prevent folder and query menus from being open simultaneously

* fix: align drag ghost to cursor and highlight folder on drop target

* Bug fixes

* Bug fixes

* Added logic for import export

* fix: add new query inside folder

* Added license

* Added query rename on double click

* Fix design feedback

* Upgrade submodule

* Fix query reordering index

* Sort fix

* Submodule fix

* update spelling

* Implement cleanup of orphaned DataQueryFolder and DataQueryFolderMapping on version deletion

* Shifted inline styles to css classes

* Resolved comments

* Submodule update

* Submodule update

* fix: remove 'Navigation' from IGNORED_ITEMS in constants

* feat: add navItemSize configuration and styling for navigation components

* Query folder sorting added

* Sorting fix

* Update submodule references and modify border color styles in header and footer components to use 'var(--cc-weak-border)' instead of 'var(--cc-default-border)'. Refactor NumberInput component to replace Triangle icons with SolidIcon components for improved consistency.

* fix

* Adjust header height in Viewer component based on layout type for improved responsiveness.

* fix: enhance pagination UI by adding first and last page buttons

* Added app history for query folders

* Add canvas bottom boundary check to prevent widget overflow past footer

* Update submodule reference to latest commit for frontend/ee

* update submodules

* Fixed query folder and app history integration bugs

* Bug fixes

* Folder name must be alphanumeric

* feat: enhance server-side pagination with new rows per page configuration and UI adjustments

* fix(otel): update OpenTelemetry exporters and improve uncaught exception handling

* Bug fixes

* Submodule update

* Delete AUTORESEARCH_PLAN.md

* Disable create, update and delete on saving version

* Css fixes and added empty state

* refactor: remove Navigation widget and related files

- Deleted Navigation component and its associated styles, hooks, and utilities.
- Updated index.js to export a null component wrapped with edition-specific logic.
- Added navigation feature flag to licensing configurations and terms.
- Updated LicenseTooltip to include navigation in the feature list.
- Adjusted withEditionSpecificComponent to support widgets.

* chore: update subproject commit reference in frontend/ee

* Deleting mappings on app delete

* chore: update subproject commit reference in server/ee

* chore: update subproject commit reference in frontend/ee

* refactor: remove unused Navigation widget references and related styles

* refactor: rename navigation feature to componentNavigation across licensing and component manager

* chore: update subproject commit reference in server/ee

* update submodule

* refactor: update componentNavigation feature retrieval method in LicenseBase

* refactor: remove legacy checks for older licenses in LicenseBase class

* update submodule

* fix: update optional chaining in LicenseBase class for canvas page header and footer

* feat: add logging for Navigation component menu items during merge

* chore: update subproject commit reference in server/ee

* Update submodule references

* Merge pull request #15900 from ToolJet/fix/ce-redis

Fix: bundle Redis in CE Docker image and fix oracledb plugin lockfile

* refactor: lazy load MobileLayout and DesktopLayout components in AppCanvas

* feat: enable component navigation feature in LicenseBase

* merge

* Feature: App-specific login and logout flows for shared app URLs (#15716)

* 🚀 chore: update submodules to latest lts-3.16 after auto-merge (#15920)

Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>

* chore: bump version to 3.20.145-lts across all components

* feat: integrate PapaParse for improved CSV processing and remove deprecated line parser

* feat: add license access tests and enhance LicenseBase for component navigation

* Query folder license changes

* refactor: improve license test setup for better readability

* feat: add GitHub Actions workflow for deploying Storybook to Netlify

* feat: update GitHub Actions workflow to deploy Storybook on pull request merge

* Update submodule references

* refactor: remove JSLibraries component and associated styles from GlobalSettings UI

* Update Node.js cache path and install command

* feat: add App Libraries feature to Left Sidebar and update library initialization logic

- Introduced AppLibraries and AppLibrariesIcon components in the LeftSidebar.
- Updated the LeftSidebar to include a new case for rendering AppLibraries.
- Modified library initialization to reference globalSettings.libraries.javascript.
- Enhanced access control for loading JS libraries based on feature access.

* Added environment permission UI and End-user cases (#15776)

* added environment UI and end-user cases

* pushed minor fix

* feat: enhance access control for JS libraries in LeftSidebar and query panel

- Updated LeftSidebar to conditionally render AppLibrariesIcon based on feature access.
- Modified library initialization logic in useAppData and queryPanelSlice to check for JS libraries access before loading libraries.
- Ensured consistent access control across components utilizing JS libraries.

* feat: add support for JS libraries in licensing model

- Introduced appJsLibraries field in LicenseBase and updated related methods.
- Added APP_JS_LIBRARIES constant to LICENSE_FIELD enum.
- Updated BASIC_PLAN_TERMS to include jsLibraries feature.
- Enhanced getLicenseFieldValue function to return appJsLibraries value.
- Modified Terms interface to include jsLibraries property.

* Fix

* Fix: ee-frontend PR comments

* feat: add skipEmptyLines option to CSV processing for improved data handling

* Removed license from Query folders

* fix: update skipEmptyLines option in CSV processing to 'greedy' for better handling of empty lines

* chore: update version to 3.20.146-lts across all components

* fix (#15902)

* feat: implement pagination for module fetching in useAppData hook (#15914)

Port of PR #15619 from main/beta to lts-3.16.
Replaces single-page appsService.getAll call with fetchAllModules
that iterates all pages via meta.total_pages, preventing truncated
module lists when count exceeds one page.

* fix: use TrackedSuspense for lazy layout to prevent premature query execution

The lazy-loaded DesktopLayout/MobileLayout were wrapped in a regular
Suspense boundary inside SuspenseCountProvider. When the layout chunk
wasn't cached, the tracker saw pendingCount=0 and fired onAllResolved
before any widgets mounted, causing on-load queries to run against
empty exposed values.

* chore: update subproject commit reference in frontend/ee

* 🚀 chore: update submodules to latest lts-3.16 after auto-merge (#15940)

Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>

* fix: enable deferCheck to handle nested TrackedSuspense boundaries

With the layout now wrapped in TrackedSuspense, there are nested lazy
boundaries (layout → widgets). React runs cleanup effects before mount
effects in a single commit, so the layout tracker can decrement to 0
before widget trackers increment. deferCheck uses setTimeout to let
widget trackers register before the resolution check runs.

* chore: bump server/ee pointer to new app.components namespace

* 🚀 chore: update submodules to latest lts-3.16 after auto-merge (#15942)

Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>

* Fix/pgsql optional password ssl auth (#15883)

* Fix : Batch logic for Postgresql GUI mode bulk operations (#15908)

* Default render service set to Pro

* Suspend cron runs at 9pm IST everyday

* Enhance Sentry integration by configuring source map uploads and adjusting devtool settings for production builds (#15950)

* fix: refactor layout components to use lazy loading for improved performance

* fix: update subproject commits for frontend and server components

* Feature: Support for Key pair authentication in Snowflake plugin (#15919)

* Key pair authentication for Snowflake

* key must be in pkcs8 format

* fix: wrap PageCanvasHeader and PageCanvasFooter in Suspense for lazy loading

* Update submodule references

* 🚀 chore: update submodules to latest lts-3.16 after auto-merge (#15966)

Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>

* rest api timeout issue (#15891)

* submodule update: add name field to process event payload

* 🚀 chore: update submodules to latest lts-3.16 after auto-merge (#15894)

Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>

* rest api timeout issue

* error standardisation

* Update queryPanelSlice.js

* Bump version to 3.20.147-lts across all components

---------

Co-authored-by: Swathi Hameed <42898362+swathihameed@users.noreply.github.com>
Co-authored-by: Adish M <44204658+adishM98@users.noreply.github.com>
Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>
Co-authored-by: Rudhra Deep Biswas <rudra21ultra@gmail.com>
Co-authored-by: gsmithun4 <gsmithun4@gmail.com>

* feat: query folders (#15871)

* Added query folder tables

* Added DB operations, DTO, interfaces and feature checks

* Added CE Fallback

* Submodule update

* Added mapping on query creation

* DataQueryFolder service added

* Query folder slice added

* Query folder tree added

* Wire QueryFolderTree into query panel UI

* Added frontend designs

* fix: prevent folder and query menus from being open simultaneously

* fix: align drag ghost to cursor and highlight folder on drop target

* Bug fixes

* Bug fixes

* Added logic for import export

* Added license

* Added query rename on double click

* Fix query reordering index

* Sort fix

* Implement cleanup of orphaned DataQueryFolder and DataQueryFolderMapping on version deletion

* Shifted inline styles to css classes

* Resolved comments

* Query folder sorting added

* Added app history for query folders

* Submodule update

* Submodule update

* Fixed query folder and app history integration bugs

* Bug fixes

* Folder name must be alphanumeric

* Bug fixes

* Disable create, update and delete on saving version

* Css fixes and added empty state

* Deleting mappings on app delete

* Add co_relation_id column to data_query_folders and data_query_folder_mappings

* Update subproject commit reference in server/ee

* Query folder license changes

* refactor: remove unused imports in controller and service files

* chore: update subproject commit reference in server/ee

* License fix

* Submodule update

* fix: deduplicate folder mappings to prevent unique constraint violations during import

* update submodules

---------

Co-authored-by: Vijaykant Yadav <vjy239@gmail.com>

* feat: Folder support for modules (#15963)

* feat(modules): enable folder support for modules

- Remove module restriction from Folders sidebar in HomePage
- Remove appType !== 'module' guards from Add/Remove folder menu items
- Fix FolderFilter redirect bug: correctly stay on /modules path when selecting folders
- Fix folder-apps API for modules: fall back to MODULES.APP permissions since ability service stores module permissions under that key

* feat: Folder support for Modules

* chore: submodule update (fix Unable to view modules inside specific folder when git sync is enabled)

---------

Co-authored-by: Shubham Gupta <shubham@Shubhams-MacBook-Air.local>
Co-authored-by: gsmithun4 <gsmithun4@gmail.com>

* Refactor/git sync (#15824)

* feat: Folder permission system

* fix(group-permissions): resolve custom group validation, folder edit check, and UI inconsistencie

* edit folder container && no folder in custom resource

* fix the ui for custom in empty state

* fix: coercion logic for folder permissions

* feat: enhance folder permissions handling in app components

* feat: add folder granular permissions handling in user apps permissions

* feat: implement granular folder permissions in ability guard and service

* feat: improve error handling for folder permissions with specific messages

* feat: enhance EnvironmentSelect component to handle disabled state and improve display logic

* chore: bump ee submodules

* add basic framework to support platform git

* feat: Update permission prop to isEditable in BaseManageGranularAccess component

* chore: bump ee server submodule

* fix: refine folder visibility logic based on user permissions

* feat: enhance MultiValue rendering and styling for "All environments" option

* fix:Uniqueness-of-data-source

* revert folder changes

* fix folder imports

* feat: allow app lazy loading

feat: import all apps of branches

* feat: implement folder ownership checks and enhance app permissions handling

* fix:ui changes

* feat: update WorkspaceGitSyncModal UI

* feat: enhance folder permissions handling for app ownership and actions

* chore: clarify folder creation and deletion permissions in workspace context

* fix: pull commit button & swtich branch visibility

* feat: import app from git repo

* fix: freezed state

* remove reference of activebranchId

* fix linting

* fix: update folder permission labels

* fixed folder permission cases

* fixed css class issue

* fix: datasource UI

* minor fix

* feat: streamline folder permissions handling by removing redundant checks and simplifying access logic

* refactor: made error message consistent

* fix:ui changes and PR fetching on master

* fix: datasource and snapshot creation

* fix: app rendering and stub loading

* fix: add missing permission message for folder deletion action

* refactor: consolidate forbidden messages for folder actions and maintain consistency

* fix: allow pull into current branch

* fix renaming of tags and reload on branch switch

* fix: allow branches import from git

* fix:push or tab removed

* feat: streamline permission handling and improve app visibility logic

* fix: remove default access denial message in AbilityGuard

* fixed all user page functionality falky case

* feat: add workspace-level PR fetch endpoint (returns all repo PRs without app filtering)

* fix: remove app_branch_table

* Fixed profile flaky case

* fixed granular access flaky case

* fix: allow branch creation from tags

* fix: update default branch creation logic to use provider config

* fix: dso and dsv operations on codebase

* fix: constants reloading and refetch org git details on data

* uniquness per branch

* removed comment

* fix: update app version handling and add is_stub column for branch-level tracking

* fix workspace branch backfilling for scoped branches

* added unique constraint - migration

* fix: update app version unique constraint to include branchId for branch-aware handling

* fix: update subproject commit reference in server/ee

* chore: revert package-lock.json

* chore: revert frontend/package-lock.json to main

* removed banner and changed migration

* minor fix

* fix: remove unused import and handle UUID parse error gracefully in AppsUtilService

* fix: update app stub checks to safely access app_versions

* refactor: revert folder operations

* fix: removed branch id logic

* fix: ds migration

* fix encrypted diff logic

* fix: update openCreateAppModal to handle workspace branch lock

* fix: subscriber filtering, freeze priority, meta hash optimization, and co_relation_id backfill

* feat: add script to generate app metadata from app.json files

* fix: meta script

fix: backfilling of co-realtion-ids

* refactor: streamline parameter formatting in workspace git sync adapter methods

* Improves data source handling for workspace git sync

Fixes workspace git sync to properly recognize data sources across branches by improving correlation ID handling and branch-aware data source version creation.

Uses strict equality comparison in deep equal utility to prevent type coercion issues.

Excludes credential_id from data source comparison to prevent unnecessary save button states.

Removes is_active filter from branch data source queries to include all versions for proper synchronization.

* refactor: update branch switching logic and improve error handling for data source creation

* fix: migration order

* 🚀 chore: update submodules to latest main after auto-merge (#15628)

Co-authored-by: gsmithun4 <3417097+gsmithun4@users.noreply.github.com>

* chore: update version to 3.21.8-beta across all components

* fix:import app from device

* fix:ui Edit&launch,folderCopy,branching dropdown in apps and ds

* fix:encrypted helper text on master

* fix: import from git flow

* logs cleanup

* fix:migration-datasource-uniqueness

* fix: app on pull

* chore: update server submodule hash

* fix: corelation-id generation and version naming

* fix: last versions deletion error

fix: no multiple version creation

* fix:ui and toast

* fix: add missing utility services to AppGitModule

* chore: update server submodule hash

* feat: add branch handling for app availability and improve error handling

* fix: update encrypted value handling in DynamicForm and improve workspace constant validation logic

* fix: improve formatting of help text in DynamicForm and enhance error message for adding constants on master branch

* chore: update ee submodules

* refactor(phase-8): add CE stub files for app-git shared utils

Creates empty @Injectable() stubs for GitOperationsUtil,
AppGitFileOperationsUtil, and AppGitOperationsUtil under
server/src/modules/app-git/shared/ so CE builds no longer
crash at NestJS DI startup when AppGitModule loads these paths.

* refactor(phase-9): add GitOperationsUtil.sparseClone()

Updates server/ee submodule to include sparseClone() as a 5th method
on GitOperationsUtil. No changes to CloneOptions, clone(), or any
other existing method.

* refactor(phase-10): update server/ee submodule to phase-10 commit

* refactor(phase-11): update server/ee submodule to phase-11 commit

* fix: correct version creation and pull in default branch

* chore: update server submodule hash

fix: remove logs from other PR

* fix:data source uniquness at workspace level

* fix: update header component logic for path validation and improve version import handling

* chore: update server submodule to latest commit

* fixed folder modal changes

* refactor(phase-3): update server/ee submodule pointer for Phase 3

Points to commit 099abd1 — wire supportsBranching and defaultBranch in all 3 providers.

* refactor(phase-7): register BranchingBusinessUtil in AppGitModule

Create CE stub file shared/branching-business.util.ts and wire
BranchingBusinessUtil into AppGitModule via getProviders path,
destructure, providers array, and exports array so NestJS DI can
inject it into AppGitOperationsUtil (Phase 4) and
HTTPSAppGitUtilityService (Phase 6).

* chore: update server/ee submodule to phase-4 commit

* chore: update server/ee submodule to phase-5 commit

* chore: update server/ee submodule to phase-6+12 refactor commit

* fix:failed to create a query error inside apps

* refactor: extract DataSourceBranchUtil — separate DS branch ops from git branching logic

* docs: add phases 14-16 to REFACTOR_PLAN

Phase 14: Remove supportsBranching from ProviderContext — data-driven dispatch
Phase 15: Extract DataSourceBranchUtil (snapshotDataSources + cloneDataSourceVersions)
Phase 16: Remove snapshotDataSourcesForVersion pass-through from BranchingBusinessUtil

* docs: mark phases 12 and 16 complete in REFACTOR_PLAN

* refactor: add isEnabled getter to OrganizationGitSync entity

Replace the repeated gitSsh/gitHttps/gitLab isEnabled checks with a
single computed getter on the entity. Updates two call sites:
- ExternalApisService.pushVersionToGit
- AppsService.updateApp

* chore: update server/ee pointer to include isEnabled getter usage

* chore: move git-sync-refactor docs to project-context

* feat: add branchId support for data source versioning in app import/export service

* fix: push & pull of tags and versions

* chore: bump server/ee submodule to Phase 17 (dead code cleanup in BaseGitUtilService)

* fix: update subproject commit reference in server/ee

* chore: untrack REFACTOR_PLAN.md (personal dev artifact, gitignored globally)

* fix:removed gitSync logic from module rename

* fix:removed switchbranch modal & allowed renaming from masted module&workflow creation

* chore: Update server submodule hash

* fix: change stub button to edit

* fix:templet app creation

* feat: add optional branchId parameter to create method in IAppsUtilService

* refactor: remove BranchContext module and related services/interfaces

* chore: remove project-context/git-sync-refactor from tracking

Local docs only — not needed in remote branch.

* refactor: remove hardcoded latest main option from CreateBranchModal

* refactor: simplify folder filtering logic in getFolders method

* Added query folder tables

* Added DB operations, DTO, interfaces and feature checks

* Added CE Fallback

* Submodule update

* Added mapping on query creation

* DataQueryFolder service added

* Query folder slice added

* Query folder tree added

* Wire QueryFolderTree into query panel UI

* Added frontend designs

* fix: prevent folder and query menus from being open simultaneously

* fix: align drag ghost to cursor and highlight folder on drop target

* Bug fixes

* Bug fixes

* Added logic for import export

* Added license

* Added query rename on double click

* Fix query reordering index

* Sort fix

* Implement cleanup of orphaned DataQueryFolder and DataQueryFolderMapping on version deletion

* Shifted inline styles to css classes

* Resolved comments

* Query folder sorting added

* Added app history for query folders

* Submodule update

* Submodule update

* Fixed query folder and app history integration bugs

* Bug fixes

* Folder name must be alphanumeric

* Bug fixes

* Disable create, update and delete on saving version

* Css fixes and added empty state

* Deleting mappings on app delete

* Add co_relation_id column to data_query_folders and data_query_folder_mappings

* Update subproject commit reference in server/ee

* Query folder license changes

* chore: update submodule pointers

* refactor: remove unused imports in controller and service files

* chore: update subproject commit reference in server/ee

* License fix

* Submodule update

* fix: deduplicate folder mappings to prevent unique constraint violations during import

---------

Co-authored-by: Vijaykant Yadav <vjy239@gmail.com>
Co-authored-by: gsmithun4 <gsmithun4@gmail.com>
Co-authored-by: Pratush <pratush@Pratushs-MBP.lan>
Co-authored-by: Shantanu Mane <maneshantanu.20@gmail.com>
Co-authored-by: parthy007 <parthadhikari1812@gmail.com>
Co-authored-by: Yukti Goyal <yuktigoyal02@gmail.com>
Co-authored-by: Adish M <44204658+adishM98@users.noreply.github.com>
Co-authored-by: gsmithun4 <3417097+gsmithun4@users.noreply.github.com>
Co-authored-by: Shaurya Sharma <shaurya064@gmail.com>

* Feature: Version control for modules [BETA] (#15857)

* feat: enable version management panel for modules

Move VersionManagerDropdown and RightTopHeaderButtons outside the
isModuleEditor gate so module builders get the same version management
UI as apps — create drafts, save versions, promote, edit details,
and delete. BranchDropdown stays gated (git sync is Phase 2).

Refs: ToolJet/tj-ee#4925

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule for module version pinning

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — version dropdown design fix

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — compact dropdown styling

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: prevent deletion of module versions pinned by consuming apps

Query all ModuleViewer components to check if any app references the
target version via moduleVersionId. If in use, reject deletion with
a list of consuming app names.

Refs: ToolJet/tj-ee#4927

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — version selection fix

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: enable runtime resolution for pinned module versions

When a module component has a pinned versionId, use the version-specific
API (appVersionService.getAppVersionData) to load that version's definition
instead of always loading the module's current/latest version.

Also add versionId to useEffect deps so the module re-fetches when the
user changes the pinned version in the dropdown.

Refs: ToolJet/tj-ee#4926

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address review findings — scoped deletion query, error handling

- Replace full table scan in checkModuleVersionInUse with scoped SQL
  query using JSON extraction (properties::jsonb -> 'moduleVersionId')
  instead of loading all ModuleViewer components into memory
- Add try-catch with user-friendly error message
- Update frontend/ee submodule with error logging and DRAFT fallback fixes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: module deletion guard, import version mapping, and error display

- Prevent deletion of modules referenced by consuming apps (checks
  ModuleViewer components by moduleAppId)
- Fix import version ID remapping: map ALL version IDs instead of only
  editingVersion, and match existing module versions by name
- Fix showViewerNavigation defaulting to true on import (|| → ??)
- Show actual API error message in delete toast instead of generic text
- Clean up error messages: remove em-dash, use multiline format

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: hide Configure Git button in module builder

Git sync for modules is Phase 2. Hide the LifecycleCTAButton when
in module editor context.

Refs: #15857

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: hide freeze banner in module builder to prevent canvas shift

The AppCanvasBanner renders a FreezeVersionInfo banner when a version
is saved (frozen). In the module builder, this banner pushed the canvas
down. Since git sync banners are not applicable to modules (Phase 2),
skip rendering entirely for module editors.

Refs: #15857

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — version dropdown loading state

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — canvas padding fix

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: remove hardcoded 'development' environment for modules

Modules now support environments, so remove the special case that
hardcoded the development environment for module viewer mode. Use
the same appEnvironmentService.getEnvironment call as apps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: freeze editor for promoted module versions

Remove the blanket `if (isModuleEditor) return false` from
getShouldFreeze(). Modules now have environments, so promoted/saved
versions should freeze the editor and query panel just like apps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — version lock banner for modules

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — latest version pre-selection

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — robust latest version sort

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: release gate blocks app release with unreleased modules

Check all ModuleViewer components in the app version being released.
If any pinned module version is not RELEASED, block with error listing
the unreleased modules.

Also updates frontend/ee submodule with env check and status badges.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — debugger integration for env mismatch

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: block app promotion when pinned modules not in target env

Add promote gate in promoteVersion() that checks all ModuleViewer
components. If any pinned module version hasn't been promoted to the
target environment, block with error listing the modules.

Also updates frontend/ee: simplified dropdown badges, removed
env mismatch placeholder (now prevented by this backend gate).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: show actual API error in release and promote toasts

Release button was showing "Oops, something went wrong" and promote
button was showing a generic retry message. Now both show the actual
backend error (e.g., module not released/promoted). Release errors
are also pushed to the app debugger.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use raw table names in release and promote gate queries

TypeORM innerJoin with entity classes generates incorrect SQL when
join conditions use ::text casts. Switch to raw table/column names
(app_versions, apps, app_environments) instead of entity references.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use lowercase aliases and correct enum in gate queries

- Use snake_case aliases (mod_ver, mod_app, mod_env) to avoid
  PostgreSQL case-sensitivity issues with camelCase aliases
- Check for DRAFT status instead of RELEASED (RELEASED doesn't
  exist in the DB version_status_enum)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: release gate checks current_version_id, errors in debugger

- Release gate now checks if pinned module version matches the
  module's current_version_id (actual release mechanism), not just
  DRAFT status
- Promote gate uses APP_TYPES.FRONT_END constant instead of raw string
- Both release and promote errors now show actual API message in toast
  AND push to the app debugger
- Fixed inline ReleaseVersionButton (version panel) error handler

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: debugger log format and version dropdown design language

- Use type 'component' with description field for debugger logs
  so the error message is visible in the debugger panel
- Update frontend/ee submodule: status dots in dropdown, draft
  modules visible in component panel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update server/ee submodule — promote gate in EE override

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: move module guards from CE to EE only

Module-specific guards (deletion, release, promote) belong in EE
since modules are an EE-only feature. CE users who downgrade would
be blocked by stale module references they can't fix.

- Removed module deletion guard from CE apps/service.ts
- Removed release gate from CE apps/service.ts
- Removed dead promote gate from CE versions/service.ts
- All three guards now live in EE overrides only

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: format module names on separate lines in error messages

Each module name now appears on its own line in error toasts for
deletion, release, and promote gates.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update frontend/ee submodule — Released badge in version dropdown

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update server/ee submodule — newline formatting in error messages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: code review findings + design feedback

Review fixes:
- Guard checkModuleVersionInUse with app.type === 'module' to skip
  unnecessary JSONB queries for non-module version deletions
- Exclude self-references in EE deletion guard
- Add DISTINCT to release gate query
- LEFT JOIN on environments in promote gate to catch NULL env IDs

Design feedback (Nechal):
- Remove status dots from version dropdown (clutter in small dropdown)
- Badge hugs the version name with tighter gap

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: code review fixes + module version audit log keys

PR review fixes:
- Move hooks above early return in LifecycleCTAButton (Rules of Hooks)
- Move UI state cleanup before debugger.log in error handlers
- Add missing setShowConfirmation(false) in modules ReleaseVersionButton
- Add fallback mapping for unmatched version IDs on module import
- Add Logger for checkModuleVersionInUse error logging

Audit log event names for module versioning:
- Add MODULE_VERSION_AUDIT_KEYS constants (CREATE/DELETE/SAVE/PROMOTE/RELEASE)
- Interceptor prefers service-set actionType over feature config
- Version/app services set module-specific audit keys when app.type === 'module'
- Add auditLogsKey for module CRUD features (MODULE_CREATE/DELETE/UPDATE)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: revert unrelated review changes + move audit keys to modules

- Revert LifecycleCTAButton hooks reorder (unrelated to this PR)
- Revert ReleaseVersionButton/PromoteConfirmationModal try-catch wrappers
- Move MODULE_VERSION_AUDIT_KEYS from versions/constants to modules/constants

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update server/ee submodule pointer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: skip git sync freeze for modules in version service

Modules are common across all branches — git sync freeze does not apply.
Adds app.type !== 'module' guard in CE prepareResponse.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: scalable error copy for module dependency gates

Frontend catch handlers now extract structured errors — toast shows
generic message, debugger description shows full module list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: read structured error fields correctly in catch handlers

Read rawError.error (not rawError.message) to match the { error, details }
shape from BadRequestException({ message: { error, details } }).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update server/ee submodule — error copy polish

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update server/ee submodule — freeze module after version save

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update server/ee submodule — widen module freeze check

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: module environment derivation, version switch crash, and delete toast

- Derive module environment from parent app's store instead of static
  moduleEnvironmentId property. Ensures constants/secrets/queries
  resolve from the correct environment per the compatibility matrix.

- Remove moduleEnvironmentId from all write/read/import-export paths.
  Existing DB values are inert and harmless.

- Add key={moduleVersionId} to <Viewer> to force clean re-mount on
  version switch, preventing stale state crash (empty canvas).

- Add stale-request cancellation guard in useAppData to prevent
  unmounted component's async callback from overwriting new state.

- Fix delete-version toast: "Cannot delete only version of module"
  instead of "app" when deleting the last module version.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: block app version save when using draft module versions

Saving an app version is now blocked if any ModuleViewer components
reference draft module versions. The draft module is still editable,
so saving the app would break the contract that saved = immutable.

- Added checkDraftModulesInApp() in CE util.service.ts (mirrors
  checkModuleVersionInUse pattern)
- Called from update() before DRAFT→PUBLISHED status transition
- Structured error format: toast shows message, debugger shows
  full module list
- Module saving itself is unaffected (guard checks app.type)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: make checkDraftModulesInApp public (TS2445)

Called from VersionService.update() which is outside the class.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: data migration to promote and release existing module versions

Modules now inherit the parent app's environment for constants and
data sources. Existing modules had current_environment_id pointing
to Development, which would break apps viewing them in Staging or
Production.

This migration promotes the latest version of each module to the
production environment and sets it as released - mirroring the
workflow versioning migration pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: modules in public apps - cache-first load + constantsResp guard

Public app viewers are unauthenticated, so module data fetches via
getAppVersionData (JwtAuthGuard) fail with 401. Two fixes:

1. Try getModuleDefinition() cache before API call. Parent app's
   public response includes module definitions, so the cache hit
   avoids the authenticated endpoint entirely.

2. Guard constantsResp against undefined. When the environment
   fetch fails (401 for public apps), constantsResp was undefined
   causing a TypeError crash on extractEnvironmentConstantsFromConstantsList.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: restrict cache-first module loading to public access only

Cache-first was overly broad - could serve stale definitions in
authenticated editor previews. Now gated on isPublicAccess so
version-pinned API calls are preserved for authenticated flows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: modules with data queries crash in public/released apps

Two issues (ported from PR #15874):

1. Deep-clone cached module definitions before resolving. Zustand/Immer
   returns frozen objects, but normalizeQueryTransformationOptions
   mutates query options in-place causing TypeError on frozen objects.
   Only manifests when modules have data queries.

2. Add id field to CE getBySlug module response. setModuleDefinition
   stores by module.id - without it, getModuleDefinition(appId) cannot
   find the cached definition. EE already had this (line 694).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: allow module query execution in public apps

QueryAuthGuard.findByDataQuery returns the MODULE app (query owner),
not the parent app. Modules aren't marked is_public, so the guard
rejected unauthenticated requests with "Authentication is required."

Added isModuleInPublicApp() check: when the query's owning app is a
module and not public itself, check if it's used in the released
version of any public app. Only checks current_version_id (released)
to prevent unauthorized access via unpublished app versions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Revert "fix: allow module query execution in public apps"

This reverts commit 7917eba.

* fix: modules should not inherit git branching locked state

- Backend: skip git sync freeze for modules in CE getOne, add
  version-status freeze for non-draft module versions
- Frontend: make getShouldFreeze accept and use isModuleEditor param
  (was silently ignored, affecting 20+ UI disable points)

* chore: update submodule pointers

* fix: getShouldFreeze module bypass must check version status not just released

The previous module bypass only checked isVersionReleased, missing
PUBLISHED (saved/promoted) versions. Check selectedVersion.status
directly since isEditorFreezed is shared state contaminated by the
parent app's git sync freeze.

* fix: handle nullable version status in module freeze check

Status column is nullable — null/undefined should be treated as DRAFT
(editable), not frozen. Use AppVersionStatus enum in CE backend.

* chore: update submodule pointers

* chore: update submodule pointers

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update subproject commits and remove unused import in AppsService

* fixed failed cases (#15984)

* fixed failed cases

* config update

* updated config

* revert config changes

* fix:ds import issue (#15937)

* fix: pass branchId in cloneResource for git sync branch context

* fix: app rename from dashboard in feature branch

* fix: stop renaming of stub app in master

* fix: restrict rename inside the folder when in default branch

* fix: restrictions of app-rename

* fix: cloned app visible in dashboard

* fix:reverted chages in apps.subscriber.ts

* fix: disable toggle fields on default branch when git sync is enabled

* chore: update server submodule hash

* fix:restricted stubed app clone and import through git ds issue

* fix:ds import issue

* chore: add submodule

* fix(submodule) updated submodule reference

* fix:removed pop when moving between unchanged data sources

---------

Co-authored-by: Pratush <pratush@Pratushs-MBP.lan>
Co-authored-by: parthy007 <parthadhikari1812@gmail.com>
Co-authored-by: Parth <108089718+parthy007@users.noreply.github.com>

* Fix: Beta bugs 3.0 (#15960)

* chore: update server submodule hash

* chore: update server submodule hash

* fix: dropdown truncation

* fix: truncation of selected value

* fix: tag checking and creation

* Fix: Change version and env dropdown in preview mode (#15975)



* fix: add changes to preview version & env dropdown

---------

Co-authored-by: Nakul Nagargade <nakul@tooljet.com>
Co-authored-by: kavinvenkatachalam <kavin.saratha@gmail.com>
Co-authored-by: Nakul Nagargade <133095394+nakulnagargade@users.noreply.github.com>
Co-authored-by: manishkushare <kushare.manish9@gmail.com>
Co-authored-by: Shaurya Sharma <shaurya064@gmail.com>
Co-authored-by: Vijaykant Yadav <vjy239@gmail.com>
Co-authored-by: Adish M <adish.madhu@gmail.com>
Co-authored-by: Adish M <44204658+adishM98@users.noreply.github.com>
Co-authored-by: devanshu052000 <devanshu.rastogi05@gmail.com>
Co-authored-by: johnsoncherian <johnsonc.dev@gmail.com>
Co-authored-by: Akshay <akshaysasidrn@gmail.com>
Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>
Co-authored-by: Shantanu Mane <maneshantanu.20@gmail.com>
Co-authored-by: YuktiGoyal02 <100783212+YuktiGoyal02@users.noreply.github.com>
Co-authored-by: Rudhra Deep Biswas <98055396+rudeUltra@users.noreply.github.com>
Co-authored-by: Siddharth Pundir <145639697+Siddharthpl@users.noreply.github.com>
Co-authored-by: Ganesh Kumar <40178541+ganesh8056@users.noreply.github.com>
Co-authored-by: Souvik <psouvik260@gmail.com>
Co-authored-by: abhijeet760 <abhijeet@tooljet.com>
Co-authored-by: Swathi Hameed <42898362+swathihameed@users.noreply.github.com>
Co-authored-by: Rudhra Deep Biswas <rudra21ultra@gmail.com>
Co-authored-by: Shaurya Sharma <79473274+shaurya-sharma064@users.noreply.github.com>
Co-authored-by: Nishidh Jain <61869195+NishidhJain@users.noreply.github.com>
Co-authored-by: Shubham Gupta <shubham@Shubhams-MacBook-Air.local>
Co-authored-by: Muhsin Shah C P <muhsinshah21@gmail.com>
Co-authored-by: Pratush <pratush@Pratushs-MBP.lan>
Co-authored-by: parthy007 <parthadhikari1812@gmail.com>
Co-authored-by: Yukti Goyal <yuktigoyal02@gmail.com>
Co-authored-by: gsmithun4 <3417097+gsmithun4@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Akshay Sasidharan <akshaysasidharan93@gmail.com>
Co-authored-by: Pratush Sinha <104584767+Pratush613@users.noreply.github.com>
Co-authored-by: Parth <108089718+parthy007@users.noreply.github.com>
YuktiGoyal02 pushed a commit that referenced this pull request May 19, 2026
The app-scoped branch in redirectToLoginPage hardcoded
/applications/:slug/login with no redirectTo, dropping the env/version
preview params. After re-login, AppLoginPage fell back to
/applications/:slug (released-app viewer URL), which 501s for unreleased
apps and shows "App URL Unavailable".

Mirror the workspace branch's behavior: honor avoidRedirection and
preserve the original URL as redirectTo when false. Update logoutAction
to pass false so the runtime Logout event returns the user to the same
preview view after sign-in.

Regression introduced in #15716.
YuktiGoyal02 pushed a commit that referenced this pull request May 20, 2026
The app-scoped branch in redirectToLoginPage hardcoded
/applications/:slug/login with no redirectTo, dropping the env/version
preview params. After re-login, AppLoginPage fell back to
/applications/:slug (released-app viewer URL), which 501s for unreleased
apps and shows "App URL Unavailable".

Mirror the workspace branch's behavior: honor avoidRedirection and
preserve the original URL as redirectTo when false. Update logoutAction
to pass false so the runtime Logout event returns the user to the same
preview view after sign-in.

Regression introduced in #15716.
gsmithun4 pushed a commit that referenced this pull request May 20, 2026
* fix: preserve original URL on app-scoped logout redirect

The app-scoped branch in redirectToLoginPage hardcoded
/applications/:slug/login with no redirectTo, dropping the env/version
preview params. After re-login, AppLoginPage fell back to
/applications/:slug (released-app viewer URL), which 501s for unreleased
apps and shows "App URL Unavailable".

Mirror the workspace branch's behavior: honor avoidRedirection and
preserve the original URL as redirectTo when false. Update logoutAction
to pass false so the runtime Logout event returns the user to the same
preview view after sign-in.

Regression introduced in #15716.

* chore: update package-lock files after lts-3.16 merge
gsmithun4 pushed a commit that referenced this pull request May 20, 2026
* fix: allow pro plan workspace admins to preview apps

Pro plan has multiEnvironment=false. validateVersionEnvironment blocked any
request with environment_name set — including 'development' — causing a 403
that the frontend mapped to the restricted-preview error page.

Backend: allow 'development' env through even when multi-env is disabled;
only block staging/production to prevent URL manipulation.

Frontend: use featureAccess.multiEnvironment flag in isBasicPlan check
instead of hardcoded plan === 'starter', so pro plan also skips env in the
redirect URL.

* fix: align useAppPreviewLink isBasicPlan check with multiEnvironment flag

Same pattern as AppsRoute — was checking plan === 'starter', missing pro
and basic plans. Now uses !featureAccess.multiEnvironment consistently.

* fix: preserve original URL on app-scoped logout redirect

The app-scoped branch in redirectToLoginPage hardcoded
/applications/:slug/login with no redirectTo, dropping the env/version
preview params. After re-login, AppLoginPage fell back to
/applications/:slug (released-app viewer URL), which 501s for unreleased
apps and shows "App URL Unavailable".

Mirror the workspace branch's behavior: honor avoidRedirection and
preserve the original URL as redirectTo when false. Update logoutAction
to pass false so the runtime Logout event returns the user to the same
preview view after sign-in.

Regression introduced in #15716.

* chore: update package-lock files after lts-3.16 merge

* revert: remove frontend isBasicPlan changes, backend fix is sufficient

Stripping env from the URL on the frontend is the wrong approach — for
multi-env plans, an explicit env param (e.g. staging) must be preserved.
The backend fix (allowing development env through when multi-env is
disabled) is the correct and sufficient fix.

* fix: use multiEnvironment flag to gate env param in preview URLs

Plans without multi-env access (basic, pro, starter) should not include
?env= in preview URLs — it is meaningless for them and was causing the
backend to reject the request.

Plans with multi-env (team, enterprise) preserve the env param so
per-env per-version preview links continue to work correctly.

* fix: use strict equality for multiEnvironment check to preserve env when featureAccess is not yet loaded

---------

Co-authored-by: Akshay Sasidharan <akshaysasidharan93@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants