diff --git a/server/src/modules/apps/services/app-import-export.service.ts b/server/src/modules/apps/services/app-import-export.service.ts index 4a4d0dde56..1e3934c6b9 100644 --- a/server/src/modules/apps/services/app-import-export.service.ts +++ b/server/src/modules/apps/services/app-import-export.service.ts @@ -73,7 +73,11 @@ type NewRevampedComponent = | 'VerticalDivider' | 'Link' | 'DaterangePicker' - | 'TextArea'; + | 'TextArea' + | 'Container' + | 'Tabs' + | 'Form' + const DefaultDataSourceNames: DefaultDataSourceName[] = [ 'restapidefault', @@ -95,6 +99,10 @@ const NewRevampedComponents: NewRevampedComponent[] = [ 'Link', 'DaterangePicker', 'TextArea', + 'Container', + 'Tabs', + 'Form' + ]; @Injectable() @@ -106,7 +114,7 @@ export class AppImportExportService { protected usersUtilService: UsersUtilService, protected componentsService: ComponentsService, protected entityManager: EntityManager - ) {} + ) { } async export(user: User, id: string, searchParams: any = {}): Promise<{ appV2: App }> { // https://github.com/typeorm/typeorm/issues/3857 @@ -218,10 +226,10 @@ export class AppImportExportService { ...page, permissions: groupPermission ? { - permissionGroup: groupPermission.users - .map((user) => user.permissionGroup?.name) - .filter((name): name is string => Boolean(name)), - } + permissionGroup: groupPermission.users + .map((user) => user.permissionGroup?.name) + .filter((name): name is string => Boolean(name)), + } : undefined, }; }); @@ -233,10 +241,10 @@ export class AppImportExportService { ...query, permissions: groupPermission ? { - permissionGroup: groupPermission.users - .map((user) => user.permissionGroup?.name) - .filter((name): name is string => Boolean(name)), - } + permissionGroup: groupPermission.users + .map((user) => user.permissionGroup?.name) + .filter((name): name is string => Boolean(name)), + } : undefined, }; }); @@ -244,16 +252,16 @@ export class AppImportExportService { const components = pages.length > 0 ? await manager - .createQueryBuilder(Component, 'components') - .leftJoinAndSelect('components.layouts', 'layouts') - .leftJoinAndSelect('components.permissions', 'permission') - .leftJoinAndSelect('permission.users', 'componentUser') - .leftJoinAndSelect('componentUser.permissionGroup', 'permissionGroup') - .where('components.pageId IN(:...pageId)', { - pageId: pages.map((v) => v.id), - }) - .orderBy('components.created_at', 'ASC') - .getMany() + .createQueryBuilder(Component, 'components') + .leftJoinAndSelect('components.layouts', 'layouts') + .leftJoinAndSelect('components.permissions', 'permission') + .leftJoinAndSelect('permission.users', 'componentUser') + .leftJoinAndSelect('componentUser.permissionGroup', 'permissionGroup') + .where('components.pageId IN(:...pageId)', { + pageId: pages.map((v) => v.id), + }) + .orderBy('components.created_at', 'ASC') + .getMany() : []; const appModules = components.filter((c) => c.type === 'ModuleViewer' || c.properties?.moduleAppId); @@ -276,10 +284,10 @@ export class AppImportExportService { ...component, permissions: groupPermission ? { - permissionGroup: groupPermission.users - .map((user) => user.permissionGroup?.name) - .filter((name): name is string => Boolean(name)), - } + permissionGroup: groupPermission.users + .map((user) => user.permissionGroup?.name) + .filter((name): name is string => Boolean(name)), + } : undefined, }; }); @@ -334,11 +342,11 @@ export class AppImportExportService { const existingModules = moduleAppNames.length > 0 ? await this.entityManager - .createQueryBuilder(App, 'app') - .where('app.name IN (:...moduleAppNames)', { moduleAppNames }) - .andWhere('app.organizationId = :organizationId', { organizationId: user.organizationId }) - .distinct(true) - .getMany() + .createQueryBuilder(App, 'app') + .where('app.name IN (:...moduleAppNames)', { moduleAppNames }) + .andWhere('app.organizationId = :organizationId', { organizationId: user.organizationId }) + .distinct(true) + .getMany() : []; // Process each module from the import data @@ -402,7 +410,6 @@ export class AppImportExportService { if (typeof appParamsObj !== 'object') { throw new BadRequestException('Invalid params for app import'); } - let appParams = appParamsObj; if (appParams?.appV2) { @@ -1018,9 +1025,9 @@ export class AppImportExportService { const pageComponents = importingComponents.filter((component) => component.pageId === page.id); const newComponentIdsMap = {}; - for (const component of pageComponents) { newComponentIdsMap[component.id] = uuid(); + } for (const component of pageComponents) { @@ -1034,6 +1041,7 @@ export class AppImportExportService { } const isParentTabOrCalendar = isChildOfTabsOrCalendar(component, pageComponents, parentId, true); + const isParentHeaderOrFooter = component?.parent && (component?.parent.includes('header') || component?.parent.includes('footer')); if (isParentTabOrCalendar) { const childTabId = component?.parent ? component.parent?.match(/([a-fA-F0-9-]{36})-(.+)/)?.[2] : null; @@ -1047,6 +1055,11 @@ export class AppImportExportService { const mappedParentId = newComponentIdsMap[_parentId]; parentId = `${mappedParentId}-modal`; + } else if (isParentHeaderOrFooter) { + const _parentId = component?.parent ? component.parent?.match(/([a-fA-F0-9-]{36})-(.+)/)?.[1] : null; + const mappedParentId = newComponentIdsMap[_parentId]; + const headerOrFooter = component.parent?.includes('header') ? 'header' : 'footer'; + parentId = `${mappedParentId}-${headerOrFooter}`; } else { if (component.parent && !newComponentIdsMap[parentId]) { skipComponent = true; @@ -1366,10 +1379,10 @@ export class AppImportExportService { const options = importingDataSource.kind === 'tooljetdb' ? this.replaceTooljetDbTableIds( - importingQuery.options, - externalResourceMappings['tooljet_database'], - organizationId - ) + importingQuery.options, + externalResourceMappings['tooljet_database'], + organizationId + ) : importingQuery.options; const newQuery = manager.create(DataQuery, { @@ -2085,10 +2098,10 @@ export class AppImportExportService { options: dataSourceId == defaultDataSourceIds['tooljetdb'] ? this.replaceTooljetDbTableIds( - query.options, - externalResourceMappings['tooljet_database'], - user?.organizationId - ) + query.options, + externalResourceMappings['tooljet_database'], + user?.organizationId + ) : query.options, }); await manager.save(newQuery); @@ -2323,7 +2336,6 @@ function migrateProperties( const general = { ...component.general }; const validation = { ...component.validation }; const generalStyles = { ...component.generalStyles }; - if (!tooljetVersion) { return { properties, styles, general, generalStyles, validation }; } @@ -2371,6 +2383,14 @@ function migrateProperties( delete properties.maxValue; } } + if (componentType === 'Container') { + properties.showHeader = properties?.showHeader || false; + } + + if (componentType === 'Form') { + properties.showHeader = properties?.showHeader || false; + properties.showFooter = properties?.showFooter || false; + } } return { properties, styles, general, generalStyles, validation }; }