diff --git a/frontend/src/Editor/EditorFunc.jsx b/frontend/src/Editor/EditorFunc.jsx index b382a9a087..14a3c00905 100644 --- a/frontend/src/Editor/EditorFunc.jsx +++ b/frontend/src/Editor/EditorFunc.jsx @@ -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); diff --git a/server/src/controllers/apps.controller.ts b/server/src/controllers/apps.controller.ts index 89b2bb418f..1a9e1f146a 100644 --- a/server/src/controllers/apps.controller.ts +++ b/server/src/controllers/apps.controller.ts @@ -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) diff --git a/server/src/services/apps.service.ts b/server/src/services/apps.service.ts index 197e9e623f..9737cdb35a 100644 --- a/server/src/services/apps.service.ts +++ b/server/src/services/apps.service.ts @@ -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 { if (app.currentVersionId === version.id) { throw new BadRequestException('You cannot delete a released version');