Release v3.21.28 beta#16275
Merged
Merged
Conversation
Added CollapseOnHide to Image component
Co-authored-by: johnsoncherian <57667706+johnsoncherian@users.noreply.github.com>
…preview (#15892) * chore: enhance table column context for improved autocomplete and preview resolution * chore: improve base custom variables retrieval logic in SingleLineCodeEditor
* feat: integrate form validation context into various widgets Added the hook to multiple widgets including Checkbox, Datepicker, DropDown, ToggleV2, and others to enhance form validation handling on submission. This change ensures that user interaction states are properly tracked and validation feedback is provided across the form components. * perf: memoize FormValidationContext.Provider value to prevent unnecessary re-renders Agent-Logs-Url: https://github.com/ToolJet/ToolJet/sessions/b274e103-dbff-496d-b75c-2361298610fd Co-authored-by: kavinvenkatachalam <50441969+kavinvenkatachalam@users.noreply.github.com> * fix: reset submit attempt count on component mount and simplify context value --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: kavinvenkatachalam <50441969+kavinvenkatachalam@users.noreply.github.com> Co-authored-by: kavinvenkatachalam <kavin.saratha@gmail.com>
* Added CollapseOnHide to Image component * Added collapseOnHide migration for rest of components
BigQuery Improvements
* refresh token flow * new auth with error standardisation * Sbowflake improvements * Snowflake invoke method made accessible * snowflake improvement update * dev testing bug fixes * removed context file * list tables and columns now use respective users token * Snowflake bearer token field adding empty key value pair while editing * PAT token flow authenticator updated * Username for PAT token flow * snowflake sdk version updated * Updated placeholder for automation * chore: update version to 3.20.152-lts --------- Co-authored-by: Srimanitejas123 <mani@tooljet.com> Co-authored-by: gsmithun4 <gsmithun4@gmail.com>
…ySQL (#16072) * migration for Postgresql and MySQL primary key column variable name update * Batch size updated
Co-authored-by: gsmithun4 <3417097+gsmithun4@users.noreply.github.com>
* feat: add auto-sort feature to AI queries and update related components * feat: add Generate Query button and update selected query handling in data query slice * chore: update subproject commits for frontend and server * support to build modules with prompt * module ai chat bug fix * submodule update * AI message bug fix * module description added in ai metadata * submodule update: update example prompts and icons * submodule update: sync frontend and server submodules to latest commits * submodule update: sync frontend and server submodules to latest commits * submodule update: sync frontend and server submodules to latest commits --------- Co-authored-by: Avinash <vavinash992@gmail.com> Co-authored-by: johnsoncherian <johnsonc.dev@gmail.com>
Co-authored-by: johnsoncherian <johnsonc.dev@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Release bump to v3.21.28-beta, expanding datasource/plugin capabilities (Snowflake + BigQuery), adding new widget properties, and improving Form validation UX and layout reflow behavior.
Changes:
- Added/expanded datasource support and plugin functionality (Snowflake GUI mode + auth options, BigQuery OAuth + GUI/SQL mode, whitelist updates).
- Introduced new widget properties/migrations (MultiselectV2
maxLimit, ImagecollapseWhenHidden) and updated import/export migrations. - Improved frontend builder behavior (Form validation-on-submit context, Accordion reflow handling, editor preview context hints).
Reviewed changes
Copilot reviewed 69 out of 69 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| server/src/modules/data-sources/util.service.ts | Treat BigQuery as a plugin-backed datasource for token fetch flow. |
| server/src/modules/data-sources/service.ts | Pass additional datasource details into plugin execution context. |
| server/src/modules/data-sources/guards/whitelist-plugin.guard.ts | Allow Snowflake (and BigQuery comma fix) in plugin whitelist. |
| server/src/modules/apps/util.service.ts | Include ButtonGroupV2 in array-based property normalization list. |
| server/src/modules/apps/services/widget-config/multiselectV2.js | Add maxLimit property to MultiselectV2 widget config (server-side). |
| server/src/modules/apps/services/widget-config/image.js | Add collapseWhenHidden property to Image widget config (server-side). |
| server/src/modules/apps/services/component.service.ts | Include ButtonGroupV2 in array-based property normalization list. |
| server/src/modules/apps/services/app-import-export.service.ts | Expand dynamic-height component types + migrate new properties during import/export. |
| server/src/entities/app.entity.ts | Add moduleDescription metadata field on App entity options. |
| server/ee | Update EE submodule pointer. |
| server/data-migrations/1777461183598-BackfillMaxLimitForMultiselectV2.ts | Backfill maxLimit for existing MultiselectV2 components. |
| server/data-migrations/1777319937510-BackfillCollapseWhenHiddenForRemainingComponents.ts | Backfill collapseWhenHidden on multiple component types. |
| server/data-migrations/1776977100104-UpdatePostgresqlAndMySQLPrimaryKeyColumnVariableToPrimaryKeyColumns.ts | Rename stored query option primary_key_column → primary_key_columns. |
| server/data-migrations/1776667054251-BackFillBigQueryType.ts | Backfill BigQuery authentication_type to service_account for existing records. |
| server/.version | Bump server version to 3.21.28-beta. |
| plugins/packages/snowflake/package.json | Upgrade snowflake-sdk dependency. |
| plugins/packages/snowflake/lib/types.ts | Add auth fields + introduce GUI mode query option shape. |
| plugins/packages/snowflake/lib/operations.json | Add GUI mode operations + dynamic connection parameter fields. |
| plugins/packages/snowflake/lib/manifest.json | Add bearer token auth, encrypted fields, dynamic connection params toggle, and copy tweaks. |
| plugins/packages/snowflake/lib/index.ts | Implement GUI mode execution, dynamic connection params, token refresh, and method invocations. |
| plugins/packages/common/lib/queryBuilder.ts | Add Snowflake dialect + Snowflake upsert + DEFAULT VALUES insert handling. |
| plugins/packages/bigquery/lib/types.ts | Extend query options for mode + params + bulk operations inputs. |
| plugins/packages/bigquery/lib/operations.json | Add SQL/GUI mode split and new bulk operations UI schema. |
| plugins/packages/bigquery/lib/manifest.json | Move to new manifest structure + add OAuth/service-account credential UI. |
| plugins/packages/bigquery/lib/index.ts | Major rewrite: OAuth support, caching, SQL params, bulk operations, and method invocations. |
| plugins/package.json | Add snowflake-sdk dependency at plugins root. |
| frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx | Treat BigQuery like Sheets for “private key required” UI logic when service account is selected. |
| frontend/src/modules/common/components/DataSourceComponents/index.js | Add Snowflake to “commonly used” datasources and ordering. |
| frontend/src/modules/AiBuilder/components/CreateModuleWithPrompt/index.js | Export CreateModuleWithPrompt component entry point. |
| frontend/src/modules/AiBuilder/components/CreateModuleWithPrompt/CreateModuleWithPrompt.jsx | Add edition-specific wrapper stub for module creation with prompt. |
| frontend/src/HomePage/HomePage.jsx | Render CreateModuleWithPrompt for module appType. |
| frontend/src/AppBuilder/_stores/utils/dynamicHeightReflow.js | Fix Accordion-specific reflow math to respect collapsed height behavior. |
| frontend/src/AppBuilder/_hooks/useAppData.js | Prevent AI conversation initialization in module mode and avoid duplicate prompt sends. |
| frontend/src/AppBuilder/Widgets/TreeSelect/useTreeSelect.js | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/ToggleV2.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/TagsInput/TagsInput.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/NewTable/_components/DataTypes/adapters/ButtonColumnAdapter.jsx | Adjust borderColor assignment logic for table button column rendering. |
| frontend/src/AppBuilder/Widgets/MultiselectV2/MultiselectV2.jsx | Add maxLimit support + validation-on-submit handling. |
| frontend/src/AppBuilder/Widgets/Form/FormValidationContext.jsx | Introduce submit-attempt counter context + hook for child widgets. |
| frontend/src/AppBuilder/Widgets/Form/Form.jsx | Provide FormValidationContext and track submit attempts/reset. |
| frontend/src/AppBuilder/Widgets/FilePicker/hooks/useFilePicker.js | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/DropdownV2/DropdownV2.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/DropDown.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/Datepicker.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/Date/TimePicker.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/Date/DatetimePickerV2.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/Date/DaterangePicker.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/Date/DatePickerV2.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/ColorPicker/ColorPicker.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/Checkbox.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/ButtonGroupV2/ButtonGroupV2.jsx | Show validation errors on form submit via new context hook. |
| frontend/src/AppBuilder/Widgets/BaseComponents/hooks/useInput.js | Integrate validation-on-submit behavior into shared input hook. |
| frontend/src/AppBuilder/WidgetManager/widgets/multiselectV2.js | Add maxLimit to MultiselectV2 widget config (frontend). |
| frontend/src/AppBuilder/WidgetManager/widgets/image.js | Add collapseWhenHidden to Image widget config (frontend). |
| frontend/src/AppBuilder/RightSideBar/Inspector/Components/Table/ColumnManager/TableColumnContext.js | Expand context semantics (tableId + columnKey). |
| frontend/src/AppBuilder/RightSideBar/Inspector/Components/Table/ColumnManager/ColumnPopover.jsx | Provide memoized TableColumnContext value object. |
| frontend/src/AppBuilder/RightSideBar/Inspector/Components/Select.jsx | Render maxLimit control when Multiselect in inspector. |
| frontend/src/AppBuilder/LeftSidebar/LeftSidebar.jsx | Show AI sidebar trigger in module editor mode. |
| frontend/src/AppBuilder/CodeEditor/utils.js | Improve preview resolution for ListView component arrays by flattening to row 0. |
| frontend/src/AppBuilder/CodeEditor/SingleLineCodeEditor.jsx | Improve custom variable resolution for ListView + Table column preview context. |
| frontend/src/AppBuilder/CodeEditor/MultiLineCodeEditor.jsx | Update TableColumnContext consumption to match new value shape. |
| frontend/src/AppBuilder/AppCanvas/Grid/helpers/dragEnd.js | Detect ModuleContainer by walking up DOM ancestors. |
| frontend/src/AppBuilder/AppCanvas/Grid/Grid.jsx | Prioritize “modules cannot be edited inside an app” drag-drop toast. |
| frontend/src/AppBuilder/AppCanvas/Container.jsx | Prevent dropping/hover logic when container is read-only. |
| frontend/ee | Update EE submodule pointer. |
| frontend/.version | Bump frontend version to 3.21.28-beta. |
| cypress-tests/cypress/constants/constants/marketplace/datasources/snowflake.js | Update Snowflake UI placeholder strings to match manifest copy. |
| .version | Bump repo version to 3.21.28-beta. |
| .github/workflows/render-preview-deploy-v2.yml | Add ignore-error on build cache export to reduce workflow failures. |
Comments suppressed due to low confidence (11)
plugins/packages/snowflake/lib/index.ts:1
- The arguments passed to getConnection are mis-ordered: the third parameter is already
checkCache, buttrueis being passed there and the realcheckCacheis being passed asdataSourceId. This will force caching on, corrupt the cache key, and shiftdataSourceId/dataSourceUpdatedAt/contextinto the wrong slots. PasscheckCacheas the 3rd argument and movedataSourceIdto the 4th argument.
server/src/modules/data-sources/service.ts:1 - The new
dataSourceDetailscontract uses inconsistent casing/keys (datasourceId,datasourcekind,datasourceUpdatedAtvsdataSourceOptionsEnvironmentId). This makes plugin consumers brittle and increases the chance of runtime mismatches. Standardize on a single naming convention (e.g.,dataSourceId,dataSourceKind,dataSourceUpdatedAt,dataSourceOptionsEnvironmentId) and keep it consistent across all fields.
plugins/packages/common/lib/queryBuilder.ts:1 - Fix typo in comment: 'Emtpy' → 'Empty'.
plugins/packages/common/lib/queryBuilder.ts:1 - Snowflake upsert treats the row as a MERGE whenever any PK value is present. If only a subset of composite PK columns are provided, the MERGE
ONcondition will include NULL/empty binds for missing PK parts, which will never match and may lead to unintended inserts with NULL PK fields (or constraint failures). Consider enforcing either: (a) all PK values are absent → INSERT, or (b) all PK values are present → MERGE; otherwise throw a QueryBuilderError indicating which PK columns are missing.
plugins/packages/bigquery/lib/index.ts:1 - In the refreshToken catch block,
error.response.statusCodeis accessed without guardingerror.response, which can throw and mask the original failure. Also,OAuthUnauthorizedClientErroris being constructed witherror(an object) where a string message is expected. Use optional chaining/guards forerror.responseand pass a string message (e.g.,error.messageor a formatted response body) consistently.
plugins/packages/bigquery/lib/index.ts:1 - QueryError appears to be constructed as (title, message, details), but the
messageargument is{}here. This will produce an unhelpful message (or a type mismatch) and makes error handling inconsistent. Replace the{}with a descriptive string (e.g., 'BigQuery refresh response did not include access_token').
plugins/packages/bigquery/lib/index.ts:1 - When
oauth_typeistooljet_app, other codepaths (authUrl/accessDetailsFrom/refreshToken) switch to env-based client ID/secret, but buildConnection always usessourceOptions.client_id/client_secret. This can create an OAuth client with missing/incorrect credentials. Align buildConnection with the sameoauth_typebranching to useprocess.env.GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRETfor the ToolJet app flow.
plugins/packages/bigquery/lib/index.ts:1 - When
datasetIdis not provided, this fetches tables for every dataset in parallel and then paginates in-memory. This can be very slow and can hit API rate limits on projects with many datasets/tables. Prefer requiring a datasetId for table listing, or implement server-side pagination (where possible) and/or concurrency limiting (e.g., a small pool) to avoid unbounded parallel requests.
plugins/packages/bigquery/lib/index.ts:1 - This uses global
fetch, which may not be available depending on the Node runtime used for plugins. Since this file already depends ongot, consider usinggothere (or importing a fetch polyfill) to avoid runtime failures in environments without global fetch.
frontend/src/AppBuilder/Widgets/MultiselectV2/MultiselectV2.jsx:1 - With
maxLimitset, selecting the 'Select all' pseudo-option no longer selects all items—it selects only the first N viaapplyLimit(selectOptions), but the UI label still reads 'Select all …'. This is confusing and can lead to incorrect user expectations. Consider disabling the 'Select all' option whenevermaxSelectionLimitis set, or change the label/behavior to clearly indicate it will only select up to the configured limit.
frontend/src/AppBuilder/Widgets/NewTable/_components/DataTypes/adapters/ButtonColumnAdapter.jsx:1 - This change removes the previous defaulting logic for outline buttons (where a default border color was applied when using the default border settings). Now borders will only render if
borderColoris explicitly provided, which can regress styling for outline buttons relying on defaults. Consider restoring the computed default border-color behavior (especially forisOutline) while still honoring an explicitborderColoroverride.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Contributor
✅ License Compliance Check PassedAll new packages added in this PR use permitted licenses (MIT or Apache-2.0).
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.