diff --git a/.version b/.version index ed1d600508..a5f3e61bdc 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.26.2 +2.27.0 diff --git a/frontend/.version b/frontend/.version index ed1d600508..a5f3e61bdc 100644 --- a/frontend/.version +++ b/frontend/.version @@ -1 +1 @@ -2.26.2 +2.27.0 diff --git a/server/.version b/server/.version index ed1d600508..a5f3e61bdc 100644 --- a/server/.version +++ b/server/.version @@ -1 +1 @@ -2.26.2 +2.27.0 diff --git a/server/src/helpers/utils.helper.ts b/server/src/helpers/utils.helper.ts index 471b88c52a..3046b33d5e 100644 --- a/server/src/helpers/utils.helper.ts +++ b/server/src/helpers/utils.helper.ts @@ -235,3 +235,11 @@ export function extractMajorVersion(version) { export function isTooljetVersionWithNormalizedAppDefinitionSchem(version) { return semver.satisfies(semver.coerce(version), '>= 2.24.0'); } + +/** + * Checks if a given Tooljet version is compatible with the grid compatibility fix. + */ + +export function shouldApplyGridCompatibilityFix(version) { + return semver.satisfies(semver.coerce(version), '>= 2.24.0 < 2.27.0'); +} diff --git a/server/src/services/app_import_export.service.ts b/server/src/services/app_import_export.service.ts index 5e3cff8659..a5dc429474 100644 --- a/server/src/services/app_import_export.service.ts +++ b/server/src/services/app_import_export.service.ts @@ -17,6 +17,7 @@ import { catchDbException, extractMajorVersion, isTooljetVersionWithNormalizedAppDefinitionSchem, + shouldApplyGridCompatibilityFix, } from 'src/helpers/utils.helper'; import { AppEnvironmentService } from './app_environments.service'; import { convertAppDefinitionFromSinglePageToMultiPage } from '../../lib/single-page-to-and-from-multipage-definition-conversion'; @@ -58,6 +59,10 @@ const DefaultDataSourceNames: DefaultDataSourceName[] = [ ]; const DefaultDataSourceKinds: DefaultDataSourceKind[] = ['restapi', 'runjs', 'runpy', 'tooljetdb', 'workflows']; +function resolveGridPositionForComponent(dimension: number) { + return Math.round((dimension * 43) / 100); +} + @Injectable() export class AppImportExportService { constructor( @@ -228,6 +233,9 @@ export class AppImportExportService { ? true : isTooljetVersionWithNormalizedAppDefinitionSchem(importedAppTooljetVersion); + const shouldUpdateForGridCompatibility: boolean = + !cloning && shouldApplyGridCompatibilityFix(importedAppTooljetVersion); + const importedApp = await this.createImportedAppForUser(this.entityManager, schemaUnifiedAppParams, user); await this.setupImportedAppAssociations( @@ -236,7 +244,8 @@ export class AppImportExportService { schemaUnifiedAppParams, user, externalResourceMappings, - isNormalizedAppDefinitionSchema + isNormalizedAppDefinitionSchema, + shouldUpdateForGridCompatibility ); await this.createAdminGroupPermissions(this.entityManager, importedApp); @@ -314,7 +323,8 @@ export class AppImportExportService { appParams: any, user: User, externalResourceMappings: Record, - isNormalizedAppDefinitionSchema: boolean + isNormalizedAppDefinitionSchema: boolean, + shouldUpdateForGridCompatibility: boolean ) { // Old version without app version // Handle exports prior to 0.12.0 @@ -377,7 +387,8 @@ export class AppImportExportService { importingDefaultAppEnvironmentId, importingPages, importingComponents, - importingEvents + importingEvents, + shouldUpdateForGridCompatibility ); if (!isNormalizedAppDefinitionSchema) { @@ -438,7 +449,7 @@ export class AppImportExportService { const newLayout = new Layout(); newLayout.type = type; newLayout.top = layout.top; - newLayout.left = layout.left; + newLayout.left = resolveGridPositionForComponent(layout.left); newLayout.width = layout.width; newLayout.height = layout.height; newLayout.componentId = appResourceMappings.componentsMapping[componentId]; @@ -574,7 +585,8 @@ export class AppImportExportService { importingDefaultAppEnvironmentId: string, importingPages: Page[], importingComponents: Component[], - importingEvents: EventHandler[] + importingEvents: EventHandler[], + shouldUpdateForGridCompatibility: boolean ): Promise { appResourceMappings = { ...appResourceMappings }; @@ -740,7 +752,9 @@ export class AppImportExportService { const newLayout = new Layout(); newLayout.type = layout.type; newLayout.top = layout.top; - newLayout.left = layout.left; + newLayout.left = shouldUpdateForGridCompatibility + ? resolveGridPositionForComponent(layout.left) + : layout.left; newLayout.width = layout.width; newLayout.height = layout.height; newLayout.component = savedComponent;