From 1094fb14bb5380f22a04fd549770d7502d86a726 Mon Sep 17 00:00:00 2001 From: arpitnath Date: Fri, 22 Dec 2023 12:12:10 +0530 Subject: [PATCH 1/2] fixes: importing apps With Normalized AppDefinition Schem and legacy support --- .version | 2 +- frontend/.version | 2 +- server/.version | 2 +- server/src/helpers/utils.helper.ts | 8 ++++++ .../src/services/app_import_export.service.ts | 26 ++++++++++++++----- 5 files changed, 31 insertions(+), 9 deletions(-) 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; From 853db9e9410cf6fa5049802c7f5dd0da263bc234 Mon Sep 17 00:00:00 2001 From: arpitnath Date: Sat, 23 Dec 2023 12:11:31 +0530 Subject: [PATCH 2/2] adapt to mobile layout grid --- server/src/services/app_import_export.service.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/server/src/services/app_import_export.service.ts b/server/src/services/app_import_export.service.ts index a5dc429474..c8ed40d25e 100644 --- a/server/src/services/app_import_export.service.ts +++ b/server/src/services/app_import_export.service.ts @@ -59,8 +59,9 @@ const DefaultDataSourceNames: DefaultDataSourceName[] = [ ]; const DefaultDataSourceKinds: DefaultDataSourceKind[] = ['restapi', 'runjs', 'runpy', 'tooljetdb', 'workflows']; -function resolveGridPositionForComponent(dimension: number) { - return Math.round((dimension * 43) / 100); +function resolveGridPositionForComponent(dimension: number, type: string) { + const numberOfGrids = type === 'desktop' ? 43 : 12; + return Math.round((dimension * numberOfGrids) / 100); } @Injectable() @@ -449,7 +450,7 @@ export class AppImportExportService { const newLayout = new Layout(); newLayout.type = type; newLayout.top = layout.top; - newLayout.left = resolveGridPositionForComponent(layout.left); + newLayout.left = resolveGridPositionForComponent(layout.left, type); newLayout.width = layout.width; newLayout.height = layout.height; newLayout.componentId = appResourceMappings.componentsMapping[componentId]; @@ -753,7 +754,7 @@ export class AppImportExportService { newLayout.type = layout.type; newLayout.top = layout.top; newLayout.left = shouldUpdateForGridCompatibility - ? resolveGridPositionForComponent(layout.left) + ? resolveGridPositionForComponent(layout.left, layout.type) : layout.left; newLayout.width = layout.width; newLayout.height = layout.height;