mirror of
https://github.com/ToolJet/ToolJet
synced 2026-05-24 01:18:23 +00:00
handle app version: creation, updates, switching versions from app builder
This commit is contained in:
parent
28d46b9f80
commit
983417386f
3 changed files with 162 additions and 67 deletions
|
|
@ -627,78 +627,78 @@ const EditorComponent = (props) => {
|
|||
};
|
||||
|
||||
//!--------
|
||||
const callBack = async (data, startingPageHandle) => {
|
||||
useAppVersionStore.getState().actions.updateEditingVersion(data.editing_version);
|
||||
useAppVersionStore.getState().actions.updateReleasedVersionId(data.current_version_id);
|
||||
|
||||
const appVersions = await appEnvironmentService.getVersionsByEnvironment(data?.id);
|
||||
setAppVersions(appVersions.appVersions);
|
||||
|
||||
updateState({
|
||||
slug: data.slug,
|
||||
isMaintenanceOn: data?.is_maintenance_on,
|
||||
organizationId: data?.organization_id,
|
||||
isPublic: data?.is_public,
|
||||
appName: data?.name,
|
||||
userId: data?.user_id,
|
||||
appId: data?.id,
|
||||
events: data.events,
|
||||
currentVersionId: data?.editing_version?.id,
|
||||
});
|
||||
|
||||
await fetchDataSources(data.editing_version?.id);
|
||||
await fetchDataQueries(data.editing_version?.id, true, true);
|
||||
|
||||
const appDefData = buildAppDefinition(data);
|
||||
|
||||
const appJson = appDefData;
|
||||
const pages = data.pages;
|
||||
|
||||
const startingPageId = pages.filter((page) => page.handle === startingPageHandle)[0]?.id;
|
||||
const homePageId = !startingPageId || startingPageId === 'null' ? appJson.homePageId : startingPageId;
|
||||
|
||||
const currentpageData = {
|
||||
handle: appJson.pages[homePageId]?.handle,
|
||||
name: appJson.pages[homePageId]?.name,
|
||||
id: homePageId,
|
||||
variables: {},
|
||||
};
|
||||
|
||||
setCurrentPageId(homePageId);
|
||||
|
||||
useCurrentStateStore.getState().actions.setCurrentState({
|
||||
page: currentpageData,
|
||||
});
|
||||
|
||||
updateEditorState({
|
||||
isLoading: false,
|
||||
appDefinition: appJson,
|
||||
});
|
||||
|
||||
//! need to handle
|
||||
|
||||
const currentPageEvents = data.events.filter((event) => event.target === 'page' && event.sourceId === homePageId);
|
||||
|
||||
for (const currentEvent of currentPageEvents ?? []) {
|
||||
await handleEvent(currentEvent.name, currentPageEvents);
|
||||
}
|
||||
};
|
||||
|
||||
//****** */
|
||||
|
||||
const fetchApp = async (startingPageHandle, onMount = false) => {
|
||||
const _appId = props?.params?.id;
|
||||
|
||||
const callBack = async (data) => {
|
||||
useAppVersionStore.getState().actions.updateEditingVersion(data.editing_version);
|
||||
useAppVersionStore.getState().actions.updateReleasedVersionId(data.current_version_id);
|
||||
|
||||
const appVersions = await appEnvironmentService.getVersionsByEnvironment(data?.id);
|
||||
setAppVersions(appVersions.appVersions);
|
||||
|
||||
updateState({
|
||||
slug: data.slug,
|
||||
isMaintenanceOn: data?.is_maintenance_on,
|
||||
organizationId: data?.organization_id,
|
||||
isPublic: data?.is_public,
|
||||
appName: data?.name,
|
||||
userId: data?.user_id,
|
||||
appId: data?.id,
|
||||
events: data.events,
|
||||
currentVersionId: data?.editing_version?.id,
|
||||
});
|
||||
|
||||
await fetchDataSources(data.editing_version?.id);
|
||||
await fetchDataQueries(data.editing_version?.id, true, true);
|
||||
|
||||
const appDefData = buildAppDefinition(data);
|
||||
|
||||
const appJson = appDefData;
|
||||
const pages = data.pages;
|
||||
|
||||
const startingPageId = pages.filter((page) => page.handle === startingPageHandle)[0]?.id;
|
||||
const homePageId = !startingPageId || startingPageId === 'null' ? appJson.homePageId : startingPageId;
|
||||
|
||||
const currentpageData = {
|
||||
handle: appJson.pages[homePageId]?.handle,
|
||||
name: appJson.pages[homePageId]?.name,
|
||||
id: homePageId,
|
||||
variables: {},
|
||||
};
|
||||
|
||||
setCurrentPageId(homePageId);
|
||||
|
||||
useCurrentStateStore.getState().actions.setCurrentState({
|
||||
page: currentpageData,
|
||||
});
|
||||
|
||||
updateEditorState({
|
||||
isLoading: false,
|
||||
appDefinition: appJson,
|
||||
});
|
||||
|
||||
//! need to handle
|
||||
|
||||
const currentPageEvents = data.events.filter((event) => event.target === 'page' && event.sourceId === homePageId);
|
||||
|
||||
for (const currentEvent of currentPageEvents ?? []) {
|
||||
await handleEvent(currentEvent.name, currentPageEvents);
|
||||
}
|
||||
};
|
||||
|
||||
if (!onMount) {
|
||||
await appService.getApp(_appId).then(callBack);
|
||||
await appService.getApp(_appId).then((data) => callBack(data, startingPageHandle));
|
||||
} else {
|
||||
callBack(app);
|
||||
callBack(app, startingPageHandle);
|
||||
}
|
||||
};
|
||||
|
||||
// !--------
|
||||
const setAppDefinitionFromVersion = (version, shouldWeEditVersion = true) => {
|
||||
const setAppDefinitionFromVersion = (appData, shouldWeEditVersion = true) => {
|
||||
const version = appData?.editing_version?.id;
|
||||
if (version?.id !== props.editingVersion?.id) {
|
||||
// !Need to fix this
|
||||
// appDefinitionChanged(defaults(version.definition, defaultDefinition(props.darkMode)), {
|
||||
|
|
@ -712,15 +712,13 @@ const EditorComponent = (props) => {
|
|||
canRedo: false,
|
||||
});
|
||||
}
|
||||
useAppVersionStore.getState().actions.updateEditingVersion(version);
|
||||
|
||||
updateEditorState({
|
||||
isUpdatingEditorStateInProcess: false,
|
||||
isLoading: true,
|
||||
});
|
||||
|
||||
shouldWeEditVersion && saveEditingVersion(true);
|
||||
fetchDataSources(props.editingVersion?.id);
|
||||
fetchDataQueries(props.editingVersion?.id, true);
|
||||
callBack(appData);
|
||||
|
||||
initComponentVersioning();
|
||||
}
|
||||
};
|
||||
|
|
@ -822,7 +820,7 @@ const EditorComponent = (props) => {
|
|||
useAppVersionStore.getState().actions.updateEditingVersion(_editingVersion);
|
||||
|
||||
if (updateDiff?.type === 'components' && updateDiff?.operation === 'delete') {
|
||||
const appEvents = JSON.parse(JSON.stringify(events));
|
||||
const appEvents = Array.isArray(events) && events.length > 0 ? JSON.parse(JSON.stringify(events)) : [];
|
||||
|
||||
const updatedEvents = appEvents.filter((event) => {
|
||||
return !updateDiff?.updateDiff.includes(event.sourceId);
|
||||
|
|
|
|||
|
|
@ -300,7 +300,22 @@ export class AppsController {
|
|||
);
|
||||
}
|
||||
|
||||
return { ...appVersion, data_queries: appVersion.dataQueries };
|
||||
const pagesForVersion = await this.pageService.findPagesForVersion(versionId);
|
||||
const appCurrentEditingVersion = JSON.parse(JSON.stringify(appVersion));
|
||||
|
||||
delete appCurrentEditingVersion['app'];
|
||||
|
||||
const appData = {
|
||||
...app,
|
||||
};
|
||||
|
||||
delete appData['editingVersion'];
|
||||
|
||||
return {
|
||||
...appData,
|
||||
editing_version: camelizeKeys(appCurrentEditingVersion),
|
||||
pages: pagesForVersion,
|
||||
};
|
||||
}
|
||||
|
||||
@UseGuards(JwtAuthGuard)
|
||||
|
|
|
|||
|
|
@ -30,7 +30,11 @@ import { DataSourceScopes } from 'src/helpers/data_source.constants';
|
|||
import { DataBaseConstraints } from 'src/helpers/db_constraints.constants';
|
||||
import { Page } from 'src/entities/page.entity';
|
||||
import { AppVersionUpdateDto } from '@dto/app-version-update.dto';
|
||||
import { Layout } from 'src/entities/layout.entity';
|
||||
|
||||
import { Component } from 'src/entities/component.entity';
|
||||
|
||||
const uuid = require('uuid');
|
||||
@Injectable()
|
||||
export class AppsService {
|
||||
constructor(
|
||||
|
|
@ -371,10 +375,88 @@ export class AppsService {
|
|||
);
|
||||
|
||||
await this.createNewDataSourcesAndQueriesForVersion(manager, appVersion, versionFrom, organizationId);
|
||||
|
||||
if (versionFrom) {
|
||||
(appVersion.showViewerNavigation = versionFrom.showViewerNavigation),
|
||||
(appVersion.globalSettings = versionFrom.globalSettings),
|
||||
await manager.save(appVersion);
|
||||
|
||||
await this.createNewPagesAndComponentsForVersion(manager, appVersion, versionFrom.id, versionFrom.homePageId);
|
||||
}
|
||||
|
||||
return appVersion;
|
||||
}, manager);
|
||||
}
|
||||
|
||||
async createNewPagesAndComponentsForVersion(
|
||||
manager: EntityManager,
|
||||
appVersion: AppVersion,
|
||||
versionFromId: string,
|
||||
prevHomePagePage: string
|
||||
) {
|
||||
const pages = await manager
|
||||
.createQueryBuilder(Page, 'page')
|
||||
.leftJoinAndSelect('page.components', 'component')
|
||||
.leftJoinAndSelect('component.layouts', 'layout')
|
||||
.where('page.appVersionId = :appVersionId', { appVersionId: versionFromId })
|
||||
.getMany();
|
||||
|
||||
let homePageId = prevHomePagePage;
|
||||
|
||||
const newComponents = [];
|
||||
const newComponentLayouts = [];
|
||||
|
||||
for (const page of pages) {
|
||||
const savedPage = await manager.save(
|
||||
manager.create(Page, {
|
||||
name: page.name,
|
||||
handle: page.handle,
|
||||
index: page.index,
|
||||
appVersionId: appVersion.id,
|
||||
})
|
||||
);
|
||||
|
||||
if (page.id === prevHomePagePage) {
|
||||
homePageId = savedPage.id;
|
||||
}
|
||||
|
||||
page.components.forEach(async (component) => {
|
||||
const newComponent = new Component();
|
||||
|
||||
newComponent.id = uuid.v4();
|
||||
newComponent.name = component.name;
|
||||
newComponent.type = component.type;
|
||||
newComponent.pageId = savedPage.id;
|
||||
newComponent.properties = component.properties;
|
||||
newComponent.styles = component.styles;
|
||||
newComponent.validations = component.validations;
|
||||
newComponent.page = savedPage;
|
||||
|
||||
newComponents.push(newComponent);
|
||||
|
||||
component.layouts.forEach((layout) => {
|
||||
const newLayout = new Layout();
|
||||
newLayout.id = uuid.v4();
|
||||
newLayout.type = layout.type;
|
||||
newLayout.top = layout.top;
|
||||
newLayout.left = layout.left;
|
||||
newLayout.width = layout.width;
|
||||
newLayout.height = layout.height;
|
||||
newLayout.componentId = layout.componentId;
|
||||
|
||||
newLayout.component = newComponent;
|
||||
|
||||
newComponentLayouts.push(newLayout);
|
||||
});
|
||||
});
|
||||
|
||||
await manager.save(newComponents);
|
||||
await manager.save(newComponentLayouts);
|
||||
}
|
||||
|
||||
return await manager.update(AppVersion, { id: appVersion.id }, { homePageId });
|
||||
}
|
||||
|
||||
async deleteVersion(app: App, version: AppVersion): Promise<void> {
|
||||
if (app.currentVersionId === version.id) {
|
||||
throw new BadRequestException('You cannot delete a released version');
|
||||
|
|
|
|||
Loading…
Reference in a new issue