diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index 7afca64ea7..6702780e88 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -21,7 +21,7 @@ jobs: if: "contains(github.event.release.tag_name, '-ce-lts')" uses: actions/checkout@v2 with: - ref: refs/heads/lts-3.6 + ref: refs/heads/lts-3.16 # Create Docker Buildx builder with platform configuration - name: Set up Docker Buildx @@ -108,7 +108,7 @@ jobs: if: "contains(github.event.release.tag_name, '-ee-lts')" uses: actions/checkout@v2 with: - ref: refs/heads/lts-3.6 + ref: refs/heads/lts-3.16 # Create Docker Buildx builder with platform configuration - name: Set up Docker Buildx @@ -155,7 +155,7 @@ jobs: context: . build-args: | CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }} - BRANCH_NAME=lts-3.6 + BRANCH_NAME=lts-3.16 file: docker/ee/ee-production.Dockerfile push: true tags: tooljet/tooljet-ee:${{ github.event.release.tag_name }},tooljet/tooljet-ee:ee-lts-latest,tooljet/tooljet:ee-lts-latest,tooljet/tooljet:${{ github.event.release.tag_name }} @@ -185,7 +185,7 @@ jobs: if: "contains(github.event.release.tag_name, '-cloud-lts')" uses: actions/checkout@v2 with: - ref: refs/heads/lts-3.6 + ref: refs/heads/lts-3.16 # Create Docker Buildx builder with platform configuration - name: Set up Docker Buildx @@ -215,7 +215,7 @@ jobs: context: . build-args: | CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }} - BRANCH_NAME=lts-3.6 + BRANCH_NAME=lts-3.16 file: docker/cloud/cloud-server.Dockerfile push: true tags: tooljet/saas:${{ github.event.release.tag_name }} @@ -247,11 +247,11 @@ jobs: with: ref: refs/heads/main - - name: Checkout code to lts-3.0 + - name: Checkout code to lts-3.16 if: contains(github.event.release.tag_name, '-ee-lts') uses: actions/checkout@v2 with: - ref: refs/heads/lts-3.0 + ref: refs/heads/lts-3.16 # Create Docker Buildx builder with platform configuration - name: Set up Docker Buildx diff --git a/.github/workflows/packer-build.yml b/.github/workflows/packer-build.yml index 7c1dfbb583..2397df3c52 100644 --- a/.github/workflows/packer-build.yml +++ b/.github/workflows/packer-build.yml @@ -16,11 +16,11 @@ jobs: name: packer-ee steps: - - name: Checkout code to lts-3.6 branch + - name: Checkout code to lts-3.16 branch if: contains(github.event.release.tag_name, '-ee-lts') uses: actions/checkout@v2 with: - ref: refs/heads/lts-3.6 + ref: refs/heads/lts-3.16 - name: Setting tag if: "${{ github.event.inputs.version != '' }}" diff --git a/.vscode/settings.json b/.vscode/settings.json index ac6e6079cc..904ccaed80 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,8 +8,8 @@ "typescript", "typescriptreact" ], - "eslint.format.enable": true, - "editor.formatOnSave": true, + "eslint.format.enable": false, + "editor.formatOnSave": false, "json.schemas": [ { "fileMatch": [ diff --git a/frontend/ee b/frontend/ee index 245477ce53..35fb9f4781 160000 --- a/frontend/ee +++ b/frontend/ee @@ -1 +1 @@ -Subproject commit 245477ce5361e7ce2ade3056cb0c17a78a8fc6ec +Subproject commit 35fb9f47811a315c9ab8f3daa1a71cd804ba1215 diff --git a/frontend/src/AppBuilder/_stores/slices/queryPanelSlice.js b/frontend/src/AppBuilder/_stores/slices/queryPanelSlice.js index 47d425a0c0..27052d3603 100644 --- a/frontend/src/AppBuilder/_stores/slices/queryPanelSlice.js +++ b/frontend/src/AppBuilder/_stores/slices/queryPanelSlice.js @@ -34,6 +34,7 @@ const initialState = { showDeleteConfirmation: false, renamingQueryId: null, deletingQueryId: null, + asyncQueryRuns: [], }; export const createQueryPanelSlice = (set, get) => ({ diff --git a/frontend/src/HomePage/AppMenu.jsx b/frontend/src/HomePage/AppMenu.jsx index 6c2a521c57..0bfa96583e 100644 --- a/frontend/src/HomePage/AppMenu.jsx +++ b/frontend/src/HomePage/AppMenu.jsx @@ -94,6 +94,11 @@ export const AppMenu = function AppMenu({ )} + {canUpdateApp && canCreateApp && appType === 'workflow' && ( + <> + + + )} {canDeleteApp && ( this.setState({ showImportAppModal: false }), processApp: this.importFile, show: this.openImportAppModal, - title: 'Import app', - actionButton: 'Import app', + title: `Import ${this.getAppType().toLocaleLowerCase()}`, + actionButton: `Import ${this.getAppType().toLocaleLowerCase()}`, actionLoadingButton: 'Importing', fileContent: fileContent, selectedAppName: fileName, dependentPluginsDetail: dependentPluginsDetail, dependentPlugins: dependentPlugins, + appType: this.props.appType, }, template: { modalType: 'template', @@ -1224,8 +1226,9 @@ class HomePageComponent extends React.Component {
User groups @@ -1301,8 +1304,8 @@ class HomePageComponent extends React.Component { this.props.appType === 'workflow' ? 'homePage.deleteWorkflowAndData' : this.props.appType === 'front-end' - ? 'homePage.deleteAppAndData' - : deleteModuleText, + ? 'homePage.deleteAppAndData' + : deleteModuleText, { appName: appToBeDeleted?.name, } @@ -1567,10 +1570,11 @@ class HomePageComponent extends React.Component { {this.props.appType === 'module' ? 'Create new module' : this.props.t( - `${this.props.appType === 'workflow' ? 'workflowsDashboard' : 'homePage' - }.header.createNewApplication`, - 'Create new app' - )} + `${ + this.props.appType === 'workflow' ? 'workflowsDashboard' : 'homePage' + }.header.createNewApplication`, + 'Create new app' + )} = workflowInstanceLevelLimit.total || - 100 > workflowInstanceLevelLimit.percentage >= 90 || - workflowInstanceLevelLimit.current === workflowInstanceLevelLimit.total - 1 + 100 > workflowInstanceLevelLimit.percentage >= 90 || + workflowInstanceLevelLimit.current === workflowInstanceLevelLimit.total - 1 ? workflowInstanceLevelLimit : workflowWorkspaceLevelLimit } @@ -1726,8 +1730,8 @@ class HomePageComponent extends React.Component { appType={this.props.appType} workflowsLimit={ workflowInstanceLevelLimit.current >= workflowInstanceLevelLimit.total || - 100 > workflowInstanceLevelLimit.percentage >= 90 || - workflowInstanceLevelLimit.current === workflowInstanceLevelLimit.total - 1 + 100 > workflowInstanceLevelLimit.percentage >= 90 || + workflowInstanceLevelLimit.current === workflowInstanceLevelLimit.total - 1 ? workflowInstanceLevelLimit : workflowWorkspaceLevelLimit } diff --git a/frontend/src/modules/common/components/BaseImportAppMenu/BaseImportAppMenu.jsx b/frontend/src/modules/common/components/BaseImportAppMenu/BaseImportAppMenu.jsx index 85a6c25b8d..4808ca46b5 100644 --- a/frontend/src/modules/common/components/BaseImportAppMenu/BaseImportAppMenu.jsx +++ b/frontend/src/modules/common/components/BaseImportAppMenu/BaseImportAppMenu.jsx @@ -17,7 +17,7 @@ const BaseImportAppMenu = ({ const { t } = useTranslation(); return ( - {appType !== 'wzorkflow' && appType !== 'module' && ( + {appType !== 'workflow' && appType !== 'module' && ( { + const schedules = await manager + .createQueryBuilder(WorkflowSchedule, 'workflowSchedule') + .innerJoinAndSelect('workflowSchedule.workflow', 'appVersion') + .where('appVersion.appId = :appId', { appId: id }) + .getMany(); + + // Emit event with schedule IDs for temporal schedule cleanup + if (schedules.length > 0) { + const scheduleIds = schedules.map((schedule) => schedule.id); + this.eventEmitter.emit('app.deleted', { + appId: id, + scheduleIds: scheduleIds, + }); + } + + await manager.delete(App, { id, organizationId }); + }); //APP_DELETE audit RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, { diff --git a/server/src/modules/auth/util.service.ts b/server/src/modules/auth/util.service.ts index db01ee4c0e..ef708cbc6e 100644 --- a/server/src/modules/auth/util.service.ts +++ b/server/src/modules/auth/util.service.ts @@ -7,7 +7,7 @@ import { LicenseUserService } from '@modules/licensing/services/user.service'; import { RolesUtilService } from '@modules/roles/util.service'; import { OrganizationUser } from '../../entities/organization_user.entity'; import { generateNextNameAndSlug } from 'src/helpers/utils.helper'; -const uuid = require('uuid'); +import * as uuid from 'uuid'; import { Organization } from '../../entities/organization.entity'; import { EntityManager } from 'typeorm'; import { @@ -121,7 +121,7 @@ export class AuthUtilService implements IAuthUtilService { try { const signedJwt = this.sessionUtilService.verifyToken(token); return signedJwt; - } catch (err) { + } catch { return null; } } diff --git a/server/src/modules/users/repositories/repository.ts b/server/src/modules/users/repositories/repository.ts index bbc4acaefd..0feacea3d5 100644 --- a/server/src/modules/users/repositories/repository.ts +++ b/server/src/modules/users/repositories/repository.ts @@ -98,8 +98,8 @@ export class UserRepository extends Repository { const existingUser = await manager.findOne(User, { where: { email: user.email } }); if (existingUser) { - Object.assign(existingUser, user); - return manager.update(User, { id: existingUser.id }, user); + await manager.update(User, { id: existingUser.id }, user); + return manager.findOne(User, { where: { id: existingUser.id } }); } else { const newUser = manager.create(User, user); return manager.save(User, newUser); diff --git a/server/src/modules/workflows/listeners/app-deletion.listener.ts b/server/src/modules/workflows/listeners/app-actions.listener.ts similarity index 71% rename from server/src/modules/workflows/listeners/app-deletion.listener.ts rename to server/src/modules/workflows/listeners/app-actions.listener.ts index 302bd36b86..72d28d991e 100644 --- a/server/src/modules/workflows/listeners/app-deletion.listener.ts +++ b/server/src/modules/workflows/listeners/app-actions.listener.ts @@ -4,8 +4,8 @@ import { OnEvent } from '@nestjs/event-emitter'; @Injectable() export class AppsActionsListener { constructor() {} - @OnEvent('beforeAppDelete') + @OnEvent('app.deleted') async handleAppDeletion(args: { appId: string }) { - throw new Error('Method not implemented'); + console.log(`App with ID ${args.appId} has been deleted.`); } }