Merge pull request #13129 from ToolJet/fix-import-export-container-form

Fix Container and form on import adding header and footer by default
This commit is contained in:
Johnson Cherian 2025-07-09 16:54:42 +05:30 committed by GitHub
commit d988b83469
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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 };
}