Merge pull request #12165 from ToolJet/modularisation/v3

Modularisation to main
This commit is contained in:
Midhun G S 2025-03-12 22:41:36 +05:30 committed by GitHub
commit cadb639fac
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2470 changed files with 404699 additions and 297568 deletions

View file

@ -2,6 +2,8 @@
# The application expects a separate .env.test for test environment configuration
# Get detailed information about each variable here: https://docs.tooljet.com/docs/setup/env-vars
# TOOLJET_EDITION=ee
TOOLJET_HOST=http://localhost:8082
LOCKBOX_MASTER_KEY=0000000000000000000000000000000000000000000000000000000000000000
SECRET_KEY_BASE=replace_with_secret_key_base

148
.gitconfig Normal file
View file

@ -0,0 +1,148 @@
[alias]
# This command does a checkout and pull the changes.
checkout-all = "!f() { \
git checkout \"$1\" && git pull; \
git submodule foreach --recursive \" \
if git show-ref --verify --quiet refs/heads/$1; then \
git checkout $1 && git pull; \
else \
echo 'Skipping submodule $(basename $PWD), branch $1 not found.'; \
fi\"; \
}; f"
# This command helps to pull changes for the base and submodule repos.
pull-all = "!f() { \
git pull && \
git submodule foreach 'git pull'; \
}; f"
# This command helps to stage the changes for the base and submodule repos.
add-all = "!f() { \
git add -A && \
git submodule foreach 'git add -A'; \
}; f"
# This command creates custom and pushes a new branch in the base and submodule repos.
create-branch-all = "!f() { \
branch_name=$1; \
if [ -z \"$branch_name\" ]; then \
echo \"Branch name required! Usage: git create-branch-all <branch_name>\"; \
return 1; \
fi; \
echo \"Creating new branch $branch_name in the base repo...\"; \
git checkout -b $branch_name && git push -u origin $branch_name; \
echo \"Creating new branch $branch_name in submodules...\"; \
git submodule foreach --quiet --recursive \"git checkout -b $branch_name && git push -u origin $branch_name\"; \
}; f"
# This command creates and pushes a new branch with the 'feature/' prefix in the base and submodule repos.
create-feature-all = "!f() { \
branch_name=$1; \
if [ -z \"$branch_name\" ]; then \
echo \"Feature name required! Usage: git create-feature-all <feature_name>\"; \
return 1; \
fi; \
feature_branch=\"feature/$branch_name\"; \
echo \"Creating new feature branch $feature_branch in the base repo...\"; \
git checkout -b $feature_branch && git push -u origin $feature_branch; \
echo \"Creating new feature branch $feature_branch in submodules...\"; \
git submodule foreach --quiet --recursive \"git checkout -b $feature_branch && git push -u origin $feature_branch\"; \
}; f"
# This command creates and pushes a new branch with the 'hot-fix/' prefix in the base and submodule repos.
create-hotfix-all = "!f() { \
branch_name=$1; \
if [ -z \"$branch_name\" ]; then \
echo \"Hotfix name required! Usage: git create-hotfix-all <hotfix_name>\"; \
return 1; \
fi; \
hotfix_branch=\"hot-fix/$branch_name\"; \
echo \"Creating new hotfix branch $hotfix_branch in the base repo...\"; \
git checkout -b $hotfix_branch && git push -u origin $hotfix_branch; \
echo \"Creating new hotfix branch $hotfix_branch in submodules...\"; \
git submodule foreach --quiet --recursive \"git checkout -b $hotfix_branch && git push -u origin $hotfix_branch\"; \
}; f"
# This command creates and pushes a new branch with the 'release/' prefix in the base and submodule repos.
create-release-all = "!f() { \
branch_name=$1; \
if [ -z \"$branch_name\" ]; then \
echo \"Release name required! Usage: git create-release-all <release_name>\"; \
return 1; \
fi; \
release_branch=\"release/$branch_name\"; \
echo \"Creating new release branch $release_branch in the base repo...\"; \
git checkout -b $release_branch && git push -u origin $release_branch; \
echo \"Creating new release branch $release_branch in submodules...\"; \
git submodule foreach --quiet --recursive \"git checkout -b $release_branch && git push -u origin $release_branch\"; \
}; f"
# This command creates and pushes a new branch with the 'revamp/' prefix in the base and submodule repos.
create-revamp-all = "!f() { \
branch_name=$1; \
if [ -z \"$branch_name\" ]; then \
echo \"Revamp name required! Usage: git create-revamp-all <revamp_name>\"; \
return 1; \
fi; \
revamp_branch=\"revamp/$branch_name\"; \
echo \"Creating new revamp branch $revamp_branch in the base repo...\"; \
git checkout -b $revamp_branch && git push -u origin $revamp_branch; \
echo \"Creating new revamp branch $revamp_branch in submodules...\"; \
git submodule foreach --quiet --recursive \"git checkout -b $revamp_branch && git push -u origin $revamp_branch\"; \
}; f"
# This command creates and pushes a new branch with the 'sprint/' prefix in the base and submodule repos.
create-sprint-all = "!f() { \
branch_name=$1; \
if [ -z \"$branch_name\" ]; then \
echo \"Sprint name required! Usage: git create-sprint-all <sprint_name>\"; \
return 1; \
fi; \
sprint_branch=\"sprint/$branch_name\"; \
echo \"Creating new sprint branch $sprint_branch in the base repo...\"; \
git checkout -b $sprint_branch && git push -u origin $sprint_branch; \
echo \"Creating new sprint branch $sprint_branch in submodules...\"; \
git submodule foreach --quiet --recursive \"git checkout -b $sprint_branch && git push -u origin $sprint_branch\"; \
}; f"
# This command creates and pushes a new tag in the base and submodule repos.
create-tag-all = "!f() { \
tag_name=$1; \
if [ -z \"$tag_name\" ]; then \
echo \"Tag name required! Usage: git create-tag-all <tag_name>\"; \
return 1; \
fi; \
echo \"Creating and pushing tag $tag_name in the base repo...\"; \
git tag $tag_name && git push origin $tag_name; \
echo \"Creating and pushing tag $tag_name in submodules...\"; \
git submodule foreach --quiet --recursive \"git tag $tag_name && git push origin $tag_name\"; \
}; f"
# This command stages and commits changes for the base and submodule repos.
commit-all = "!f() { \
commit_message=\"$1\"; \
if [ -z \"$commit_message\" ]; then \
echo \"Commit message required! Usage: git commit-all <commit_message>\"; \
return 1; \
fi; \
echo \"Committing changes in the base repo...\"; \
git commit -m \"$commit_message\"; \
echo \"Committing changes in submodules...\"; \
git submodule foreach --quiet --recursive \"git commit -m '$commit_message'\"; \
}; f"
# This command pushes commits for the base and submodule repos.
push-all = "!f() { \
echo \"Pushing changes in the base repo...\"; \
git push; \
echo \"Pushing changes in submodules...\"; \
git submodule foreach --quiet --recursive \"git push\"; \
}; f"
status-all = "!f() { \
echo \"Status of base repo...\"; \
git status; \
echo \"Status of submodules...\"; \
git submodule foreach --quiet --recursive \"git status\"; \
}; f"

View file

@ -14,7 +14,23 @@ jobs:
Cypress-App-Builder:
runs-on: ubuntu-22.04
if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'run-cypress-app-builder' || github.event.label.name == 'run-cypress') }}
if: |
github.event.action == 'labeled' &&
(
github.event.label.name == 'run-cypress' ||
github.event.label.name == 'run-ce-app-builder' ||
github.event.label.name == 'run-ee-app-builder'
)
strategy:
matrix:
edition: >-
${{
contains(github.event.pull_request.labels.*.name, 'run-cypress') && fromJson('["ce", "ee"]') ||
contains(github.event.pull_request.labels.*.name, 'run-ce-app-builder') && fromJson('["ce"]') ||
contains(github.event.pull_request.labels.*.name, 'run-ee-app-builder') && fromJson('["ee"]') ||
fromJson('[]')
}}
steps:
- name: Setup Node.js
@ -22,6 +38,23 @@ jobs:
with:
node-version: 18.18.2
- name: Set up Git authentication for private submodules
run: |
git config --global url."https://x-access-token:${{ secrets.CUSTOM_GITHUB_TOKEN }}@github.com/".insteadOf "https://github.com/"
- name: Checkout with Submodules
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.ref }}
- name: Checking out the correct branch for submodules EE
if: matrix.edition == 'ee'
run: |
git submodule update --init --recursive
git submodule foreach --recursive '
git checkout ${{ env.BRANCH_NAME }} 2>/dev/null || git checkout main'
- name: Set up Docker
uses: docker-practice/actions-setup-docker@master
@ -45,6 +78,7 @@ jobs:
- name: Set up environment variables
run: |
echo "TOOLJET_EDITION=${{ matrix.edition == 'ee' && 'EE' || 'CE' }}" >> .env
echo "TOOLJET_HOST=http://localhost:8082" >> .env
echo "LOCKBOX_MASTER_KEY=cd97331a419c09387bef49787f7da8d2a81d30733f0de6bed23ad8356d2068b2" >> .env
echo "SECRET_KEY_BASE=7073b9a35a15dd20914ae17e36a693093f25b74b96517a5fec461fc901c51e011cd142c731bee48c5081ec8bac321c1f259ef097ef2a16f25df17a3798c03426" >> .env

View file

@ -14,7 +14,23 @@ jobs:
Cypress-Marketplace:
runs-on: ubuntu-22.04
if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'run-cypress-marketplace' || github.event.label.name == 'run-cypress') }}
if: |
github.event.action == 'labeled' &&
(
github.event.label.name == 'run-cypress' ||
github.event.label.name == 'run-ce-cypress-marketplace' ||
github.event.label.name == 'run-ee-cypress-marketplace'
)
strategy:
matrix:
edition: >-
${{
contains(github.event.pull_request.labels.*.name, 'run-cypress') && fromJson('["ce", "ee"]') ||
contains(github.event.pull_request.labels.*.name, 'run-ce-cypress-marketplace') && fromJson('["ce"]') ||
contains(github.event.pull_request.labels.*.name, 'run-ee-cypress-marketplace') && fromJson('["ee"]') ||
fromJson('[]')
}}
steps:
- name: Checkout
@ -46,12 +62,25 @@ jobs:
- name: Set SAFE_BRANCH_NAME
run: echo "SAFE_BRANCH_NAME=$(echo ${{ env.BRANCH_NAME }} | tr '/' '-')" >> $GITHUB_ENV
- name: Build and Push Docker image
- name: Build CE Docker image
uses: docker/build-push-action@v4
with:
context: .
file: docker/production.Dockerfile
push: true
file: docker/ce-production.Dockerfile
push: false
tags: tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Build EE Docker image
if: matrix.edition == 'ee'
uses: docker/build-push-action@v4
with:
context: .
file: docker/ee/ee-production.Dockerfile
push: false
tags: tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}
platforms: linux/amd64
env:
@ -60,6 +89,7 @@ jobs:
- name: Set up environment variables
run: |
echo "TOOLJET_EDITION=${{ matrix.edition == 'ee' && 'EE' || 'CE' }}" >> .env
echo "TOOLJET_HOST=http://localhost:3000" >> .env
echo "LOCKBOX_MASTER_KEY=cd97331a419c09387bef49787f7da8d2a81d30733f0de6bed23ad8356d2068b2" >> .env
echo "SECRET_KEY_BASE=7073b9a35a15dd20914ae17e36a693093f25b74b96517a5fec461fc901c51e011cd142c731bee48c5081ec8bac321c1f259ef097ef2a16f25df17a3798c03426" >> .env

View file

@ -13,9 +13,22 @@ jobs:
Cypress-Platform:
runs-on: ubuntu-22.04
if: |
github.event.action == 'labeled' &&
(github.event.label.name == 'run-cypress-platform' ||
github.event.label.name == 'run-cypress')
github.event.action == 'labeled' &&
(
github.event.label.name == 'run-cypress' ||
github.event.label.name == 'run-ce-cypress-platform' ||
github.event.label.name == 'run-ee-cypress-platform'
)
strategy:
matrix:
edition: >-
${{
contains(github.event.pull_request.labels.*.name, 'run-cypress') && fromJson('["ce", "ee"]') ||
contains(github.event.pull_request.labels.*.name, 'run-ce-cypress-platform') && fromJson('["ce"]') ||
contains(github.event.pull_request.labels.*.name, 'run-ee-cypress-platform') && fromJson('["ee"]') ||
fromJson('[]')
}}
steps:
- name: Setup Node.js
@ -23,11 +36,22 @@ jobs:
with:
node-version: 18.18.2
- name: Checkout
- name: Set up Git authentication for private submodules
run: |
git config --global url."https://x-access-token:${{ secrets.CUSTOM_GITHUB_TOKEN }}@github.com/".insteadOf "https://github.com/"
- name: Checkout with Submodules
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.ref }}
- name: Checking out the correct branch for submodules EE
if: matrix.edition == 'ee'
run: |
git submodule update --init --recursive
git submodule foreach --recursive '
git checkout ${{ env.BRANCH_NAME }} 2>/dev/null || git checkout main'
- name: Set up Docker
uses: docker-practice/actions-setup-docker@master
@ -55,9 +79,10 @@ jobs:
- name: Set up environment variables
run: |
echo "TOOLJET_EDITION=${{ matrix.edition == 'ee' && 'EE' || 'CE' }}" >> .env
echo "TOOLJET_HOST=http://localhost:8082" >> .env
echo "LOCKBOX_MASTER_KEY=cd97331a419c09387bef49787f7da8d2a81d30733f0de6bed23ad8356d2068b2" >> .env
echo "SECRET_KEY_BASE=7073b9a35a15dd20914ae17e36a693093f25b74b96517a5fec461fc901c51e011cd142c731bee48c5081ec8bac321c1f259ef097ef2a16f25df17a3798c03426" >> .env
echo "SECRET_KEY_BASE=7073b9a35a15dd20914ae17e36a693093f25b74b96517a5fec461fc901c51e011cd142c731bee48c5081ec8bac321c1f259ef097ef2a16f25df17a3798c03426" >> .env
echo "PG_DB=tooljet_development" >> .env
echo "PG_USER=postgres" >> .env
echo "PG_HOST=localhost" >> .env
@ -69,7 +94,7 @@ jobs:
echo "TOOLJET_DB_HOST=localhost" >> .env
echo "TOOLJET_DB_PASS=postgres" >> .env
echo "TOOLJET_DB_STATEMENT_TIMEOUT=60000" >> .env
echo "TOOLJET_DB_RECONFIG=true" >> .env
echo "TOOLJET_DB_RECONFIG=true" >> .env
echo "PGRST_JWT_SECRET=r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj" >> .env
echo "PGRST_HOST=localhost:3001" >> .env
echo "PGRST_DB_PRE_CONFIG=postgrest.pre_config" >> .env
@ -77,10 +102,6 @@ jobs:
echo "ENABLE_MARKETPLACE_FEATURE=true" >> .env
echo "ENABLE_MARKETPLACE_DEV_MODE=true" >> .env
echo "ENABLE_PRIVATE_APP_EMBED=true" >> .env
echo "SSO_GOOGLE_OAUTH2_CLIENT_ID=123456789.apps.googleusercontent.com" >> .env
echo "SSO_GOOGLE_OAUTH2_CLIENT_SECRET=ABCGFDNF-FHSDVFY-bskfh6234" >> .env
echo "SSO_GIT_OAUTH2_CLIENT_ID=1234567890" >> .env
echo "SSO_GIT_OAUTH2_CLIENT_SECRET=3346shfvkdjjsfkvxce32854e026a4531ed" >> .env
- name: Set up database
run: |
@ -123,9 +144,10 @@ jobs:
uses: actions/upload-artifact@v4
if: always()
with:
name: screenshots
name: screenshots-${{ matrix.edition }}
path: cypress-tests/cypress/screenshots
Cypress-Platform-Subpath:
runs-on: ubuntu-22.04
if: |

View file

@ -1,39 +0,0 @@
name: Documentation version release
on:
workflow_dispatch:
inputs:
create-branch:
description: "Branch name"
version:
description: "RELEASE_VERSION"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup node 16.14
uses: actions/setup-node@v2
with:
node-version: 16.14
- run: cd docs && yarn install && npm run docusaurus docs:version ${{ github.event.inputs.version }}
- name: Create Pull Request
id: doc
uses: peter-evans/create-pull-request@v5
with:
title: "Creating a new version folder ${{ github.event.version }}"
body: "Created a new version folder for version: ${{ github.event.inputs.version }}"
branch: ${{ github.event.inputs.create-branch }}
base: "develop"
token: ${{ secrets.GITHUB }}
delete-branch : true
labels: versioned-docs, automated pr
commit-message: added new version folder

232
.github/workflows/docker-release.yml vendored Normal file
View file

@ -0,0 +1,232 @@
name: ToolJet Edition docker images builds
on:
release:
types: [published]
jobs:
build-tooljet-image-for-ce-edtion:
runs-on: ubuntu-latest
if: "${{ github.event.release }}"
steps:
- name: Checkout code to main for Beta CE edition
if: "!contains(github.event.release.tag_name, 'ce-lts')"
uses: actions/checkout@v2
with:
ref: refs/heads/main
- name: Checkout code to LTS for CE LTS edition
if: "contains(github.event.release.tag_name, '-ce-lts')"
uses: actions/checkout@v2
with:
ref: refs/heads/lts-4.0
# Create Docker Buildx builder with platform configuration
- name: Set up Docker Buildx
run: |
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/buildx/releases/download/v0.11.0/buildx-v0.11.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker buildx create --name mybuilder --platform linux/arm64,linux/amd64,linux/amd64/v2,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
docker buildx use mybuilder
- name: Set DOCKER_CLI_EXPERIMENTAL
run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV
- name: use mybuilder buildx
run: docker buildx use mybuilder
- name: Docker Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Docker image for Beta tag
if: "!contains(github.event.release.tag_name, '-ce-lts')"
uses: docker/build-push-action@v4
with:
context: .
file: docker/ce-production.Dockerfile
push: true
tags: tooljet/tooljet-ce:${{ github.event.release.tag_name }},tooljet/tooljet-ce:ce-latest
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Docker image for LTS tag
if: "contains(github.event.release.tag_name, '-ce-lts')"
uses: docker/build-push-action@v4
with:
context: .
file: docker/ce-production.Dockerfile
push: true
tags: tooljet/tooljet-ce:${{ github.event.release.tag_name }},tooljet/tooljet-ce:ce-lts-latest
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Send Slack Notification
run: |
if [[ "${{ job.status }}" == "success" ]]; then
message="ToolJet community image published:\n\`tooljet/tooljet-ce:${{ github.event.release.tag_name }}\`"
else
message="Job '${{ env.JOB_NAME }}' failed! tooljet/tooljet-ce:${{ github.event.release.tag_name }}"
fi
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL }}
- name: Send Slack Notification
run: |
if [[ "${{ job.status }}" == "success" ]]; then
message="ToolJet community image published:\n\`tooljet/tooljet-ce:${{ github.event.release.tag_name }}\`"
else
message="Job '${{ env.JOB_NAME }}' failed! tooljet/tooljet-ce:${{ github.event.release.tag_name }}"
fi
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL }}
build-tooljet-image-for-ee-edtion:
runs-on: ubuntu-latest
if: "${{ github.event.release }}"
steps:
- name: Checkout code to main for Beta EE edition
if: "!contains(github.event.release.tag_name, 'ee-lts')"
uses: actions/checkout@v2
with:
ref: refs/heads/main
- name: Checkout code to LTS for EE LTS edition
if: "contains(github.event.release.tag_name, '-ee-lts')"
uses: actions/checkout@v2
with:
ref: refs/heads/lts-4.0
# Create Docker Buildx builder with platform configuration
- name: Set up Docker Buildx
run: |
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/buildx/releases/download/v0.11.0/buildx-v0.11.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker buildx create --name mybuilder --platform linux/arm64,linux/amd64,linux/amd64/v2,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
docker buildx use mybuilder
- name: Set DOCKER_CLI_EXPERIMENTAL
run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV
- name: use mybuilder buildx
run: docker buildx use mybuilder
- name: Docker Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Docker image for Beta tag
if: "!contains(github.event.release.tag_name, '-ee-lts')"
uses: docker/build-push-action@v4
with:
context: .
args: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
file: docker/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 }}
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Docker image for LTS tag
if: "contains(github.event.release.tag_name, '-ee-lts')"
uses: docker/build-push-action@v4
with:
context: .
args: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
file: docker/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 }}
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Send Slack Notification
run: |
if [[ "${{ job.status }}" == "success" ]]; then
message="ToolJet enterprise image published:\n\`tooljet/tooljet-ee:${{ github.event.release.tag_name }}\`\n\`tooljet/tooljet:${{ github.event.release.tag_name }}\`"
else
message="Job '${{ env.JOB_NAME }}' failed! Image built:\n\`tooljet/tooljet-ee:${{ github.event.release.tag_name }}\`\n\`tooljet/tooljet:${{ github.event.release.tag_name }}\`"
fi
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL }}
build-tooljet-image-for-cloud-edtion:
runs-on: ubuntu-latest
if: "${{ github.event.release }}"
steps:
- name: Checkout code to LTS for Cloud LTS edition
if: "contains(github.event.release.tag_name, '-cloud-lts')"
uses: actions/checkout@v2
with:
ref: refs/heads/lts-4.0
# Create Docker Buildx builder with platform configuration
- name: Set up Docker Buildx
run: |
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/buildx/releases/download/v0.11.0/buildx-v0.11.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker buildx create --name mybuilder --platform linux/arm64,linux/amd64,linux/amd64/v2,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
docker buildx use mybuilder
- name: Set DOCKER_CLI_EXPERIMENTAL
run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV
- name: use mybuilder buildx
run: docker buildx use mybuilder
- name: Docker Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Docker image for LTS tag
if: "contains(github.event.release.tag_name, '-cloud-lts')"
uses: docker/build-push-action@v4
with:
context: .
args: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
file: docker/cloud/cloud-server.Dockerfile
push: true
tags: tooljet/saas:${{ github.event.release.tag_name }}
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Send Slack Notification
run: |
if [[ "${{ job.status }}" == "success" ]]; then
message="ToolJet cloud image published:\n\`tooljet/saas:${{ github.event.release.tag_name }}\`"
else
message="Job '${{ env.JOB_NAME }}' failed! Image built:\n\`tooljet/saas:${{ github.event.release.tag_name }}\`"
fi
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL }}

View file

@ -11,13 +11,16 @@ on:
description: "RELEASE_VERSION"
jobs:
packer:
packer-ee:
runs-on: ubuntu-latest
name: packer
name: packer-ee
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Checkout code to lts-4.0
if: contains(github.event.release.tag_name, '-ee-lts')
uses: actions/checkout@v2
with:
ref: refs/heads/lts-4.0
- name: Setting tag
if: "${{ github.event.inputs.version != '' }}"
@ -28,7 +31,7 @@ jobs:
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
@ -40,7 +43,7 @@ jobs:
with:
command: init
target: .
working_directory: deploy/ec2
working_directory: deploy/ec2/ee
# validate templates
- name: Validate Template
@ -49,25 +52,35 @@ jobs:
command: validate
arguments: -syntax-only
target: .
working_directory: deploy/ec2
working_directory: deploy/ec2/ee
# Echo RENDER_GITHUB_PAT
- name: Set PACKER_GITHUB_PAT
run: echo "PACKER_GITHUB_PAT=${{ secrets.PACKER_GITHUB_PAT}}" >> $GITHUB_ENV
# Dynamically update setup_machine.sh with PAT
- name: Validate PAT
run: |
sed -i "s|git config --global url."https://x-access-token:CUSTOM_GITHUB_TOKEN@github.com/".insteadOf "https://github.com/"|git config --global url."https://x-access-token:${ secrets.CUSTOM_GITHUB_TOKEN }@github.com/".insteadOf "https://github.com/"|g" ./deploy/ec2/ee/setup_machine.sh
# build artifact
- name: Build Artifact
uses: hashicorp/packer-github-actions@master
with:
command: build
#The the below argument is specific for building EE AMI image
arguments: -color=false -on-error=abort -var ami_name=tooljet_${{ env.RELEASE_VERSION }}.ubuntu_focal
target: .
working_directory: deploy/ec2
working_directory: deploy/ec2/ee
env:
PACKER_LOG: 1
- name: Send Slack Notification
run: |
if [[ "${{ job.status }}" == "success" ]]; then
message="Job '${{ env.JOB_NAME }}' succeeded! AMI = tooljet_${{ env.RELEASE_VERSION }}.ubuntu_focal"
message="ToolJet enterprise AWS AMI published:\\n\`tooljet_${{ env.RELEASE_VERSION }}.ubuntu_focal\`"
else
message="Job '${{ env.JOB_NAME }}' failed! AMI = tooljet_${{ env.RELEASE_VERSION }}.ubuntu_focal"
message="ToolJet enterprise AWS AMI release failed! \\n\`tooljet_${{ env.RELEASE_VERSION }}.ubuntu_focal\`"
fi
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL }}
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL }}

View file

@ -11,13 +11,16 @@ permissions:
issues: write
jobs:
create-review-app:
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'create-review-app' }}
# Community Edition
create-ce-review-app:
if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-ce-review-app' || github.event.label.name == 'review-app') }}
runs-on: ubuntu-latest
steps:
- name: Create deployment
id: create-deployment
- name: Creating deployment for CE
id: create-ce-deployment
run: |
export RESPONSE=$(curl --request POST \
--url https://api.render.com/v1/services \
@ -28,11 +31,11 @@ jobs:
{
"autoDeploy": "yes",
"branch": "${{ env.BRANCH_NAME }}",
"name": "ToolJet PR #${{ env.PR_NUMBER }}",
"name": "ToolJet CE PR #${{ env.PR_NUMBER }}",
"notifyOnFail": "default",
"ownerId": "tea-caeo4bj19n072h3dddc0",
"repo": "${{ github.event.pull_request.head.repo.git_url }}",
"slug": "tooljet-pr-${{ env.PR_NUMBER }}",
"repo": "https://github.com/ToolJet/ToolJet",
"slug": "tooljet-ce-pr-${{ env.PR_NUMBER }}",
"suspended": "not_suspended",
"suspenders": [],
"type": "web_service",
@ -55,11 +58,11 @@ jobs:
},
{
"key": "PG_DB",
"value": "${{ env.PR_NUMBER }}"
"value": "${{ env.PR_NUMBER }}-ce"
},
{
"key": "TOOLJET_DB",
"value": "${{ env.PR_NUMBER }}-tjdb"
"value": "${{ env.PR_NUMBER }}-ce-tjdb"
},
{
"key": "TOOLJET_DB_HOST",
@ -68,7 +71,7 @@ jobs:
{
"key": "TOOLJET_DB_USER",
"value": "${{ secrets.RENDER_PG_USER }}"
},
},
{
"key": "TOOLJET_DB_PASS",
"value": "${{ secrets.RENDER_PG_PASS }}"
@ -83,7 +86,7 @@ jobs:
},
{
"key": "PGRST_DB_URI",
"value": "postgres://${{ secrets.RENDER_PG_USER }}:${{ secrets.RENDER_PG_PASS }}@${{ secrets.RENDER_PG_HOST }}/${{ env.PR_NUMBER }}-tjdb"
"value": "postgres://${{ secrets.RENDER_PG_USER }}:${{ secrets.RENDER_PG_PASS }}@${{ secrets.RENDER_PG_HOST }}/${{ env.PR_NUMBER }}-ce-tjdb"
},
{
"key": "PGRST_HOST",
@ -103,7 +106,7 @@ jobs:
},
{
"key": "TOOLJET_HOST",
"value": "https://tooljet-pr-${{ env.PR_NUMBER }}.onrender.com"
"value": "https://tooljet-ce-pr-${{ env.PR_NUMBER }}.onrender.com"
},
{
"key": "DISABLE_TOOLJET_TELEMETRY",
@ -129,6 +132,18 @@ jobs:
"key": "SMTP_PASSWORD",
"value": "${{ secrets.RENDER_SMTP_PASSWORD }}"
},
{
"key": "TEMPORAL_SERVER_ADDRESS",
"value": "https://auto-setup-1-25-1.onrender.com"
},
{
"key": "TEMPORAL_TASK_QUEUE_NAME_FOR_WORKFLOWS",
"value": "tooljet-ce-pr-${{ env.PR_NUMBER }}"
},
{
"key": "TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE",
"value": "default"
},
{
"key": "TOOLJET_MARKETPLACE_URL",
"value": "${{ secrets.MARKETPLACE_BUCKET }}"
@ -140,7 +155,7 @@ jobs:
"envSpecificDetails": {
"dockerCommand": "",
"dockerContext": "./",
"dockerfilePath": "./docker/preview.Dockerfile"
"dockerfilePath": "./docker/ce-preview.Dockerfile"
},
"healthCheckPath": "/api/health",
"numInstances": 1,
@ -151,7 +166,7 @@ jobs:
"plan": "starter",
"pullRequestPreviewsEnabled": "no",
"region": "oregon",
"url": "https://tooljet-pr-${{ env.PR_NUMBER }}.onrender.com"
"url": "https://tooljet-ce-pr-${{ env.PR_NUMBER }}.onrender.com"
}
}')
@ -168,7 +183,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'Deployment: https://tooljet-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}'
body: 'Community Edition:- \n Deployment: https://tooljet-ce-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}'
})
- uses: actions/github-script@v6
@ -179,7 +194,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'create-review-app'
name: 'create-ce-review-app'
})
} catch (e) {
console.log(e)
@ -189,18 +204,18 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['active-review-app']
labels: ['active-ce-review-app']
})
destroy-review-app:
if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'destroy-review-app') || github.event.action == 'closed' }}
destroy-ce-review-app:
if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'destroy-ce-review-app') || github.event.action == 'closed' }}
runs-on: ubuntu-latest
steps:
- name: Delete service
run: |
export SERVICE_ID=$(curl --request GET \
--url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
--url 'https://api.render.com/v1/services?name=ToolJet%20CE%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
jq -r '.[0].service.id')
@ -218,7 +233,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'destroy-review-app'
name: 'destroy-ce-review-app'
})
} catch (e) {
console.log(e)
@ -229,7 +244,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'suspend-review-app'
name: 'suspend-ce-review-app'
})
} catch (e) {
console.log(e)
@ -240,7 +255,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'active-review-app'
name: 'active-ce-review-app'
})
} catch (e) {
console.log(e)
@ -259,8 +274,8 @@ jobs:
PGHOST: ${{ secrets.RENDER_DS_PG_HOST }}
PGPORT: 5432
PGUSER: ${{ secrets.RENDER_DS_PG_USER }}
PGDATABASE: ${{ env.PR_NUMBER }}
PGTJBDATABASE: ${{ env.PR_NUMBER }}-tjdb
PGDATABASE: ${{ env.PR_NUMBER }}-ce
PGTJBDATABASE: ${{ env.PR_NUMBER }}-ce-tjdb
run: |
if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then
echo "Database $PGDATABASE exists, deleting..."
@ -276,8 +291,8 @@ jobs:
echo "Database $PGTJBDATABASE does not exist."
fi
suspend-review-app:
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-review-app' }}
suspend-ce-review-app:
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-ce-review-app' }}
runs-on: ubuntu-latest
steps:
@ -302,14 +317,14 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'active-review-app'
name: 'active-ce-review-app'
})
} catch (e) {
console.log(e)
}
resume-review-app:
if: ${{ github.event.action == 'unlabeled' && github.event.label.name == 'suspend-review-app' }}
resume-ce-review-app:
if: ${{ github.event.action == 'unlabeled' && github.event.label.name == 'suspend-ce-review-app' }}
runs-on: ubuntu-latest
steps:
@ -333,7 +348,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['active-review-app']
labels: ['active-ce-review-app']
})
try {
@ -341,98 +356,23 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'suspend-review-app'
name: 'suspend-ce-review-app'
})
} catch (e) {
console.log(e)
}
recreate-review-app:
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'recreate-review-app' }}
# Enterprise Edition
create-ee-review-app:
if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-ee-review-app' || github.event.label.name == 'review-app') }}
runs-on: ubuntu-latest
steps:
- name: Delete service
run: |
export SERVICE_ID=$(curl --request GET \
--url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
jq -r '.[0].service.id')
curl --request DELETE \
--url https://api.render.com/v1/services/$SERVICE_ID \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
- uses: actions/github-script@v6
with:
script: |
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'destroy-review-app'
})
} catch (e) {
console.log(e)
}
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'suspend-review-app'
})
} catch (e) {
console.log(e)
}
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'active-review-app'
})
} catch (e) {
console.log(e)
}
- name: Install PostgreSQL client
run: |
sudo apt update
sudo apt install postgresql-client -y
- name: Wait after installing PostgreSQL
run: sleep 25
- name: Drop PostgreSQL PR databases
env:
PGHOST: ${{ secrets.RENDER_DS_PG_HOST }}
PGPORT: 5432
PGUSER: ${{ secrets.RENDER_DS_PG_USER }}
PGDATABASE: ${{ env.PR_NUMBER }}
PGTJBDATABASE: ${{ env.PR_NUMBER }}-tjdb
run: |
if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then
echo "Database $PGDATABASE exists, deleting..."
PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;"
else
echo "Database $PGDATABASE does not exist."
fi
if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then
echo "Database $PGTJBDATABASE exists, deleting..."
PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;"
else
echo "Database $PGTJBDATABASE does not exist."
fi
- name: Create deployment
id: create-deployment
- name: Creating deployment for Enterprise Edition
id: create-ee-deployment
run: |
export RESPONSE=$(curl --request POST \
--url https://api.render.com/v1/services \
@ -443,11 +383,11 @@ jobs:
{
"autoDeploy": "yes",
"branch": "${{ env.BRANCH_NAME }}",
"name": "ToolJet PR #${{ env.PR_NUMBER }}",
"name": "ToolJet EE PR #${{ env.PR_NUMBER }}",
"notifyOnFail": "default",
"ownerId": "tea-caeo4bj19n072h3dddc0",
"repo": "https://${{ secrets.RENDER_GITHUB_PAT }}@github.com/ToolJet/tj-ee",
"slug": "tooljet-pr-${{ env.PR_NUMBER }}",
"repo": "https://github.com/ToolJet/ToolJet",
"slug": "tooljet-ee-pr-${{ env.PR_NUMBER }}",
"suspended": "not_suspended",
"suspenders": [],
"type": "web_service",
@ -470,11 +410,11 @@ jobs:
},
{
"key": "PG_DB",
"value": "${{ env.PR_NUMBER }}"
"value": "${{ env.PR_NUMBER }}-ee"
},
{
"key": "TOOLJET_DB",
"value": "${{ env.PR_NUMBER }}-tjdb"
"value": "${{ env.PR_NUMBER }}-ee-tjdb"
},
{
"key": "TOOLJET_DB_HOST",
@ -498,7 +438,7 @@ jobs:
},
{
"key": "PGRST_DB_URI",
"value": "postgres://${{ secrets.RENDER_PG_USER }}:${{ secrets.RENDER_PG_PASS }}@${{ secrets.RENDER_PG_HOST }}/${{ env.PR_NUMBER }}-tjdb"
"value": "postgres://${{ secrets.RENDER_PG_USER }}:${{ secrets.RENDER_PG_PASS }}@${{ secrets.RENDER_PG_HOST }}/${{ env.PR_NUMBER }}-ee-tjdb"
},
{
"key": "PGRST_HOST",
@ -518,7 +458,7 @@ jobs:
},
{
"key": "TOOLJET_HOST",
"value": "https://tooljet-pr-${{ env.PR_NUMBER }}.onrender.com"
"value": "https://tooljet-ee-pr-${{ env.PR_NUMBER }}.onrender.com"
},
{
"key": "DISABLE_TOOLJET_TELEMETRY",
@ -553,12 +493,28 @@ jobs:
"value": "${{ secrets.RENDER_REDIS_PORT }}"
},
{
"key": "LICENSE_KEY",
"value": "${{ secrets.RENDER_LICENSE_KEY }}"
"key": "TEMPORAL_SERVER_ADDRESS",
"value": "https://auto-setup-1-25-1.onrender.com"
},
{
"key": "TEMPORAL_TASK_QUEUE_NAME_FOR_WORKFLOWS",
"value": "tooljet-ee-pr-${{ env.PR_NUMBER }}"
},
{
"key": "TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE",
"value": "default"
},
{
"key": "TOOLJET_MARKETPLACE_URL",
"value": "${{ secrets.MARKETPLACE_BUCKET }}"
},
{
"key": "BRANCH_NAME",
"value": "${{ env.BRANCH_NAME }}"
},
{
"key": "CUSTOM_GITHUB_TOKEN",
"value": "${{ secrets.CUSTOM_GITHUB_TOKEN }}"
}
],
"serviceDetails": {
@ -567,7 +523,7 @@ jobs:
"envSpecificDetails": {
"dockerCommand": "",
"dockerContext": "./",
"dockerfilePath": "./docker/preview.Dockerfile"
"dockerfilePath": "./docker/ee/ee-preview.Dockerfile"
},
"healthCheckPath": "/api/health",
"numInstances": 1,
@ -578,7 +534,7 @@ jobs:
"plan": "starter",
"pullRequestPreviewsEnabled": "no",
"region": "oregon",
"url": "https://tooljet-pr-${{ env.PR_NUMBER }}.onrender.com"
"url": "https://tooljet-ee-pr-${{ env.PR_NUMBER }}.onrender.com"
}
}')
@ -595,7 +551,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'Deployment: https://tooljet-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}'
body: 'Enterpise Edition: \n Deployment: https://tooljet-ee-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}'
})
- uses: actions/github-script@v6
@ -606,7 +562,7 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'create-review-app'
name: 'create-ee-review-app'
})
} catch (e) {
console.log(e)
@ -616,5 +572,526 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['active-review-app']
labels: ['active-ee-review-app']
})
destroy-ee-review-app:
if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'destroy-ee-review-app') || github.event.action == 'closed' }}
runs-on: ubuntu-latest
steps:
- name: Delete service
run: |
export SERVICE_ID=$(curl --request GET \
--url 'https://api.render.com/v1/services?name=ToolJet%20EE%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
jq -r '.[0].service.id')
curl --request DELETE \
--url https://api.render.com/v1/services/$SERVICE_ID \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
- uses: actions/github-script@v6
with:
script: |
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'destroy-ee-review-app'
})
} catch (e) {
console.log(e)
}
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'suspend-ee-review-app'
})
} catch (e) {
console.log(e)
}
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'active-ee-review-app'
})
} catch (e) {
console.log(e)
}
- name: Install PostgreSQL client
run: |
sudo apt update
sudo apt install postgresql-client -y
- name: Wait after installing PostgreSQL
run: sleep 25
- name: Drop PostgreSQL PR databases
env:
PGHOST: ${{ secrets.RENDER_DS_PG_HOST }}
PGPORT: 5432
PGUSER: ${{ secrets.RENDER_DS_PG_USER }}
PGDATABASE: ${{ env.PR_NUMBER }}-ee
PGTJBDATABASE: ${{ env.PR_NUMBER }}-ee-tjdb
run: |
if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then
echo "Database $PGDATABASE exists, deleting..."
PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;"
else
echo "Database $PGDATABASE does not exist."
fi
if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then
echo "Database $PGTJBDATABASE exists, deleting..."
PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;"
else
echo "Database $PGTJBDATABASE does not exist."
fi
suspend-ee-review-app:
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-ee-review-app' }}
runs-on: ubuntu-latest
steps:
- name: Suspend service
run: |
export SERVICE_ID=$(curl --request GET \
--url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
jq -r '.[0].service.id')
curl --request POST \
--url https://api.render.com/v1/services/$SERVICE_ID/suspend \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
- uses: actions/github-script@v6
with:
script: |
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'active-ee-review-app'
})
} catch (e) {
console.log(e)
}
resume-ee-review-app:
if: ${{ github.event.action == 'unlabeled' && github.event.label.name == 'suspend-ee-review-app' }}
runs-on: ubuntu-latest
steps:
- name: Resume service
run: |
export SERVICE_ID=$(curl --request GET \
--url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
jq -r '.[0].service.id')
curl --request POST \
--url https://api.render.com/v1/services/$SERVICE_ID/resume \
--header 'accept: application/json' \
--header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
- uses: actions/github-script@v6
with:
script: |
await github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['active-ee-review-app']
})
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'suspend-ee-review-app'
})
} catch (e) {
console.log(e)
}
# Cloud Edition
# create-cloud-review-app:
# if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-cloud-review-app' || github.event.label.name == 'review-app') }}
# runs-on: ubuntu-latest
# steps:
# - name: Creating deployment for Cloud Edition
# id: create-cloud-deployment
# run: |
# export RESPONSE=$(curl --request POST \
# --url https://api.render.com/v1/services \
# --header 'accept: application/json' \
# --header 'content-type: application/json' \
# --header 'Authorization: Bearer ${{ secrets.RENDER_API_KEY }}' \
# --data '
# {
# "autoDeploy": "yes",
# "branch": "${{ env.BRANCH_NAME }}",
# "name": "ToolJet Cloud PR #${{ env.PR_NUMBER }}",
# "notifyOnFail": "default",
# "ownerId": "tea-caeo4bj19n072h3dddc0",
# "repo": "https://github.com/ToolJet/ToolJet",
# "slug": "tooljet-cloud-pr-${{ env.PR_NUMBER }}",
# "suspended": "not_suspended",
# "suspenders": [],
# "type": "web_service",
# "envVars": [
# {
# "key": "PG_HOST",
# "value": "${{ secrets.RENDER_PG_HOST }}"
# },
# {
# "key": "PG_PORT",
# "value": "5432"
# },
# {
# "key": "PG_USER",
# "value": "${{ secrets.RENDER_PG_USER }}"
# },
# {
# "key": "PG_PASS",
# "value": "${{ secrets.RENDER_PG_PASS }}"
# },
# {
# "key": "PG_DB",
# "value": "${{ env.PR_NUMBER }}-cloud"
# },
# {
# "key": "TOOLJET_DB",
# "value": "${{ env.PR_NUMBER }}-cloud-tjdb"
# },
# {
# "key": "TOOLJET_DB_HOST",
# "value": "${{ secrets.RENDER_PG_HOST }}"
# },
# {
# "key": "TOOLJET_DB_USER",
# "value": "${{ secrets.RENDER_PG_USER }}"
# },
# {
# "key": "TOOLJET_DB_PASS",
# "value": "${{ secrets.RENDER_PG_PASS }}"
# },
# {
# "key": "TOOLJET_DB_PORT",
# "value": "5432"
# },
# {
# "key": "PGRST_DB_PRE_CONFIG",
# "value": "postgrest.pre_config"
# },
# {
# "key": "PGRST_DB_URI",
# "value": "postgres://${{ secrets.RENDER_PG_USER }}:${{ secrets.RENDER_PG_PASS }}@${{ secrets.RENDER_PG_HOST }}/${{ env.PR_NUMBER }}-cloud-tjdb"
# },
# {
# "key": "PGRST_HOST",
# "value": "127.0.0.1:3000"
# },
# {
# "key": "PGRST_JWT_SECRET",
# "value": "r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj"
# },
# {
# "key": "PGRST_LOG_LEVEL",
# "value": "info"
# },
# {
# "key": "PORT",
# "value": "80"
# },
# {
# "key": "TOOLJET_HOST",
# "value": "https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com"
# },
# {
# "key": "DISABLE_TOOLJET_TELEMETRY",
# "value": "true"
# },
# {
# "key": "SMTP_ADDRESS",
# "value": "smtp.mailtrap.io"
# },
# {
# "key": "SMTP_DOMAIN",
# "value": "smtp.mailtrap.io"
# },
# {
# "key": "SMTP_PORT",
# "value": "2525"
# },
# {
# "key": "SMTP_USERNAME",
# "value": "${{ secrets.RENDER_SMTP_USERNAME }}"
# },
# {
# "key": "SMTP_PASSWORD",
# "value": "${{ secrets.RENDER_SMTP_PASSWORD }}"
# },
# {
# "key": "REDIS_HOST",
# "value": "${{ secrets.RENDER_REDIS_HOST }}"
# },
# {
# "key": "REDIS_PORT",
# "value": "${{ secrets.RENDER_REDIS_PORT }}"
# },
# {
# "key": "TEMPORAL_SERVER_ADDRESS",
# "value": "https://auto-setup-1-25-1.onrender.com"
# },
# {
# "key": "TEMPORAL_TASK_QUEUE_NAME_FOR_WORKFLOWS",
# "value": "tooljet-cloud-pr-${{ env.PR_NUMBER }}"
# },
# {
# "key": "TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE",
# "value": "default"
# },
# {
# "key": "TOOLJET_MARKETPLACE_URL",
# "value": "${{ secrets.MARKETPLACE_BUCKET }}"
# },
# {
# "key": "CUSTOM_GITHUB_TOKEN",
# "value": "${{ secrets.CUSTOM_GITHUB_TOKEN }}"
# }
# ],
# "serviceDetails": {
# "disk": null,
# "env": "docker",
# "envSpecificDetails": {
# "dockerCommand": "",
# "dockerContext": "./",
# "dockerfilePath": "./docker/cloud/cloud-preview.Dockerfile"
# },
# "healthCheckPath": "/api/health",
# "numInstances": 1,
# "openPorts": [{
# "port": 80,
# "protocol": "TCP"
# }],
# "plan": "starter",
# "pullRequestPreviewsEnabled": "no",
# "region": "oregon",
# "url": "https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com"
# }
# }')
# echo "response: $RESPONSE"
# export SERVICE_ID=$(echo $RESPONSE | jq -r '.service.id')
# echo "SERVICE_ID=$SERVICE_ID" >> $GITHUB_ENV
# - name: Comment deployment URL
# uses: actions/github-script@v5
# with:
# github-token: ${{secrets.GITHUB_TOKEN}}
# script: |
# github.rest.issues.createComment({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# body: 'Cloud Edition: \n Deployment: https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}'
# })
# - uses: actions/github-script@v6
# with:
# script: |
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'create-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# await github.rest.issues.addLabels({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# labels: ['active-cloud-review-app']
# })
# destroy-cloud-review-app:
# if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'destroy-cloud-review-app') || github.event.action == 'closed' }}
# runs-on: ubuntu-latest
# steps:
# - name: Delete service
# run: |
# export SERVICE_ID=$(curl --request GET \
# --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
# jq -r '.[0].service.id')
# curl --request DELETE \
# --url https://api.render.com/v1/services/$SERVICE_ID \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
# - uses: actions/github-script@v6
# with:
# script: |
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'destroy-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'suspend-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'active-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# - name: Install PostgreSQL client
# run: |
# sudo apt update
# sudo apt install postgresql-client -y
# - name: Wait after installing PostgreSQL
# run: sleep 25
# - name: Drop PostgreSQL PR databases
# env:
# PGHOST: ${{ secrets.RENDER_DS_PG_HOST }}
# PGPORT: 5432
# PGUSER: ${{ secrets.RENDER_DS_PG_USER }}
# PGDATABASE: ${{ env.PR_NUMBER }}-cloud
# PGTJBDATABASE: ${{ env.PR_NUMBER }}-cloud-tjdb
# run: |
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then
# echo "Database $PGDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;"
# else
# echo "Database $PGDATABASE does not exist."
# fi
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then
# echo "Database $PGTJBDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;"
# else
# echo "Database $PGTJBDATABASE does not exist."
# fi
# suspend-cloud-review-app:
# if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-cloud-review-app' }}
# runs-on: ubuntu-latest
# steps:
# - name: Suspend service
# run: |
# export SERVICE_ID=$(curl --request GET \
# --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
# jq -r '.[0].service.id')
# curl --request POST \
# --url https://api.render.com/v1/services/$SERVICE_ID/suspend \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
# - uses: actions/github-script@v6
# with:
# script: |
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'active-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# resume-cloud-review-app:
# if: ${{ github.event.action == 'unlabeled' && github.event.label.name == 'suspend-cloud-review-app' }}
# runs-on: ubuntu-latest
# steps:
# - name: Resume service
# run: |
# export SERVICE_ID=$(curl --request GET \
# --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
# jq -r '.[0].service.id')
# curl --request POST \
# --url https://api.render.com/v1/services/$SERVICE_ID/resume \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
# - uses: actions/github-script@v6
# with:
# script: |
# await github.rest.issues.addLabels({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# labels: ['active-cloud-review-app']
# })
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'suspend-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }

View file

@ -1,65 +0,0 @@
name: Tooljet develop docker image build
on:
push:
branches:
- develop
workflow_dispatch:
inputs:
job-to-run:
description: Enter the job name (tooljet-develop-image)
options: ["tooljet-develop-image"]
required: true
jobs:
tooljet-develop-image:
runs-on: ubuntu-latest
if: |
${{ github.ref == 'refs/heads/develop' }} &&
${{ github.event_name == 'workflow_dispatch' && github.event.inputs.job-to-run == 'tooljet-develop-image' }}
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
ref: refs/heads/develop
# Create Docker Buildx builder with platform configuration
- name: Set up Docker Buildx
run: |
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/buildx/releases/download/v0.11.0/buildx-v0.11.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker buildx create --name mybuilder --platform linux/arm64,linux/amd64,linux/amd64/v2,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
docker buildx use mybuilder
- name: Set DOCKER_CLI_EXPERIMENTAL
run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV
- name: use mybuilder buildx
run: docker buildx use mybuilder
- name: Docker Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Docker image
uses: docker/build-push-action@v4
with:
context: .
file: docker/production.Dockerfile
push: true
tags: tooljet/tooljet-ce:develop
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Send Slack Notification on Failure
if: failure()
run: |
message="Job '${{ env.JOB_NAME }}' failed! tooljet/tooljet-ce:develop"
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL_OPS_CHANNEL }}

View file

@ -1,40 +0,0 @@
name: LTS Test system deploy
on:
workflow_run:
workflows: ["Tooljet release docker images build"]
types:
- completed
jobs:
Build-and-update-image:
runs-on: ubuntu-22.04
steps:
- name: SSH into GCP VM instance
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_INSTANCE_IP }}
username: ${{ secrets.GCP_USERNAME }}
key: ${{ secrets.EC2_INSTANCE_SSH_KEY }}
script: |
ls -lah
# Stop the Docker containers
sudo docker-compose down
# Remove the existing tooljet/* images
sudo docker images -a | grep 'tooljet/' | awk '{print $3}' | xargs sudo docker rmi -f
# Check remaining images
sudo docker images
# Update docker-compose.yml with the new image for tooljet service
sed -i '/^[[:space:]]*tooljet:/,/^[[:space:]]*[^:]*$/ { /^[[:space:]]*image:[[:space:]]*tooljet\/tj-osv/s|\(image:[[:space:]]*\).*|\1tooljet/tj-osv:'"${{ env.SAFE_BRANCH_NAME }}"'| }' docker-compose.yaml
# Start the Docker containers
cat docker-compose.yaml
sudo docker-compose up -d
#View containers
sudo docker ps

View file

@ -1,132 +0,0 @@
name: Test system deploy
on:
pull_request_target:
types: [labeled, unlabeled, closed]
workflow_dispatch:
env:
PR_NUMBER: ${{ github.event.number }}
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
jobs:
Build-and-update-image:
runs-on: ubuntu-22.04
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'test-system-deploy' }}
steps:
- name: Check authorization
run: |
allowed_user1=${{ secrets.ALLOWED_USER1_USERNAME }}
allowed_user2=${{ secrets.ALLOWED_USER2_USERNAME }}
allowed_user3=${{ secrets.ALLOWED_USER3_USERNAME }}
allowed_user4=${{ secrets.ALLOWED_USER4_USERNAME }}
allowed_user5=${{ secrets.ALLOWED_USER5_USERNAME }}
allowed_user6=${{ secrets.ALLOWED_USER6_USERNAME }}
allowed_user6=${{ secrets.ALLOWED_USER7_USERNAME }}
if [[ "${{ github.actor }}" != "$allowed_user1" && \
"${{ github.actor }}" != "$allowed_user2" && \
"${{ github.actor }}" != "$allowed_user3" && \
"${{ github.actor }}" != "$allowed_user4" && \
"${{ github.actor }}" != "$allowed_user5" && \
"${{ github.actor }}" != "$allowed_user6" && \
"${{ github.actor }}" != "$allowed_user7" ]]; then
echo "User not authorized to trigger this workflow"
exit 1
fi
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.ref }}
# Create Docker Buildx builder with platform configuration
- name: Set up Docker Buildx
run: |
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/buildx/releases/download/v0.11.0/buildx-v0.11.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker buildx create --name mybuilder --platform linux/arm64,linux/amd64,linux/amd64/v2,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
docker buildx use mybuilder
- name: Set DOCKER_CLI_EXPERIMENTAL
run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV
- name: use mybuilder buildx
run: docker buildx use mybuilder
- name: Docker Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set SAFE_BRANCH_NAME
run: echo "SAFE_BRANCH_NAME=$(echo ${{ env.BRANCH_NAME }} | tr '/' '-')" >> $GITHUB_ENV
- name: Build and Push Docker image
uses: docker/build-push-action@v4
with:
context: .
file: docker/production.Dockerfile
push: true
tags: tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}
platforms: linux/amd64
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: SSH into GCP VM instance
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_INSTANCE_IP }}
username: ${{ secrets.GCP_USERNAME }}
key: ${{ secrets.EC2_INSTANCE_SSH_KEY }}
script: |
ls -lah
# Stop the Docker containers
sudo docker-compose down
# Remove the existing tooljet/* images
sudo docker images -a | grep 'tooljet/' | awk '{print $3}' | xargs sudo docker rmi -f
# Check remaining images
sudo docker images
# Update docker-compose.yml with the new image for tooljet service
sed -i '/^[[:space:]]*tooljet:/,/^[[:space:]]*[^:]*$/ { /^[[:space:]]*image:[[:space:]]*tooljet\/tj-osv/s|\(image:[[:space:]]*\).*|\1tooljet/tj-osv:'"${{ env.SAFE_BRANCH_NAME }}"'| }' docker-compose.yaml
# Start the Docker containers
cat docker-compose.yaml
sudo docker-compose up -d
#View containers
sudo docker ps
- uses: actions/github-script@v6
with:
script: |
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'test-system-deploy'
})
} catch (e) {
console.log(e)
}
await github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['test-system-deployed']
})

8
.gitmodules vendored Normal file
View file

@ -0,0 +1,8 @@
[submodule "frontend/ee"]
path = frontend/ee
url = https://github.com/ToolJet/ee-frontend.git
branch = main
[submodule "server/ee"]
path = server/ee
url = https://github.com/ToolJet/ee-server.git
branch = main

View file

@ -1,4 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
#npx lint-staged

View file

@ -1 +1 @@
3.2.2-ce
3.7.0

18
.vscode/launch.json vendored
View file

@ -11,7 +11,21 @@
{
"type": "node",
"request": "launch",
"name": "Server",
"name": "Server (Dev Mode)",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run",
"start:dev"
],
"sourceMaps": true,
"cwd": "${workspaceRoot}/server",
"console": "integratedTerminal",
"skipFiles": ["<node_internals>/**"]
},
{
"type": "node",
"request": "launch",
"name": "Server (Original)",
"args": [
"${workspaceFolder}/server/src/main.ts"
],
@ -49,7 +63,7 @@
"remoteRoot": "/app/server",
"sourceMaps": true,
"skipFiles": ["<node_internals>/**"]
},
}
}
]
}

View file

@ -1,6 +0,0 @@
# you can list packages
libaio1
# or include links to specific .deb files
# or add custom apt repos (only required if using packages outside of the standard Ubuntu APT repositories)

View file

@ -1 +0,0 @@
web: npm run db:migrate && npm run start:prod --prefix server

View file

@ -1,82 +0,0 @@
{
"name": "ToolJet",
"description": "ToolJet is an open-source low-code framework to build and deploy internal tools.",
"website": "https://tooljet.io/",
"repository": "https://github.com/tooljet/tooljet",
"logo": "https://tooljet.com/blue-logo.png",
"success_url": "/",
"scripts": {
"postdeploy": "export NODE_OPTIONS=\"--max_old_space_size=1024\"; npm run db:migrate"
},
"env": {
"NODE_ENV": {
"description": "Environment [production/development]",
"value": "production"
},
"TOOLJET_HOST": {
"description": "Public URL of ToolJet installation. This is usually https://<app-name-in-first-step>.herokuapp.com",
"value": "https://<app-name-in-first-step>.herokuapp.com"
},
"TOOLJET_SERVER_URL": {
"description": "URL of ToolJet server installation. (This is same as the TOOLJET_HOST for Heroku deployments)",
"value": "https://<app-name-in-first-step>.herokuapp.com"
},
"LOCKBOX_MASTER_KEY": {
"description": "Master key for encrypting datasource credentials.",
"value": ""
},
"SECRET_KEY_BASE": {
"description": "Used by ToolJet server as the input secret to the application's key generator.",
"value": ""
},
"NODE_OPTIONS": {
"description": "Node options configured to increase node memory to support app build",
"value": "--max-old-space-size=4096"
},
"DISABLE_SIGNUPS": {
"description": "Disable sign up in login page only applicable if Multi-Workspace feature is turned on",
"value": "false"
},
"ENABLE_TOOLJET_DB": {
"description": "To enable Tooljet Database feature",
"value": "false"
},
"DEPLOYMENT_PLATFORM": {
"description": "Platform ToolJet is deployed on",
"value": "heroku"
}
},
"formation": {
"web": {
"quantity": 1,
"size": "standard-2x"
}
},
"image": "heroku/nodejs",
"addons": [
{
"plan": "heroku-postgresql",
"options": {
"version": "13"
}
}
],
"buildpacks": [
{
"url": "heroku/nodejs"
},
{
"url": "heroku-community/apt"
},
{
"url": "https://github.com/featurist/oracle-client-buildpack.git"
}
],
"environments": {
"test": {
"scripts": {
"test": "npm run test --prefix server && npm run test:e2e --prefix server"
}
}
}
}

View file

@ -35,7 +35,7 @@ then
fi
fi
npm --prefix server run db:setup:prod
TOOLJET_EDTION=ce npm --prefix server run db:setup:prod
if sudo systemctl start nest
then

View file

@ -78,4 +78,4 @@ npm install -g npm@9.8.1
# Building ToolJet app
npm install -g @nestjs/cli
npm run build
TOOLJET_EDTION=ce npm run build

68
deploy/ec2/ee/.env Normal file
View file

@ -0,0 +1,68 @@
# https://docs.tooljet.io/docs/setup/env-vars
TOOLJET_HOST=http://localhost
LOCKBOX_MASTER_KEY=
SECRET_KEY_BASE=
PG_USER=
PG_HOST=
PG_PASS=
PG_DB=tooljet_prod
ORM_LOGGING=true
NODE_ENV=production
DEPLOYMENT_PLATFORM=ec2
# ToolJet Database
TOOLJET_DB=tooljet_db
TOOLJET_DB_USER=
TOOLJET_DB_HOST=
TOOLJET_DB_PASS=
PGRST_HOST=localhost:3001
PGRST_SERVER_PORT=3001
PGRST_JWT_SECRET=
PGRST_DB_URI=
PGRST_DB_PRE_CONFIG=postgrest.pre_config
#Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_USER=default
REDIS_PASSWORD=
# Checks every 24 hours to see if a new version of ToolJet is available
# (Enabled by default. Set 0 to disable)
CHECK_FOR_UPDATES=
# Checks every 24 hours to update app telemetry data to ToolJet hub.
# (Telemetry is enabled by default. Set value to true to disable.)
# DISABLE_APP_TELEMETRY=false
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# EMAIL CONFIGURATION
DEFAULT_FROM_EMAIL=hello@tooljet.io
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_DOMAIN=
SMTP_PORT=
# DISABLE USER SIGNUPS (true or false). Default: true
DISABLE_SIGNUPS=
# OBSERVABILITY
APM_VENDOR=
SENTRY_DNS=
SENTRY_DEBUG=
# FEATURE TOGGLE
COMMENT_FEATURE_ENABLE=true
ENABLE_MULTIPLAYER_EDITING=true
ENABLE_MARKETPLACE_FEATURE=true
#SSO
SSO_DISABLE_SIGNUP=
SSO_RESTRICTED_DOMAIN=
SSO_GOOGLE_OAUTH2_CLIENT_ID=
SSO_GIT_OAUTH2_CLIENT_ID=
SSO_GIT_OAUTH2_CLIENT_SECRET=
SSO_GIT_OAUTH2_HOST=

View file

@ -0,0 +1,17 @@
[Unit]
Description=Nest Server
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/app
Environment="NODE_ENV=production"
EnvironmentFile=/home/ubuntu/app/.env
RestartSec=1
ExecStart=/usr/bin/npm --prefix /home/ubuntu/app run start:prod
Restart=always
[Install]
WantedBy=multi-user.target

View file

@ -0,0 +1,16 @@
[Unit]
Description=PostgREST Server
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/bin
EnvironmentFile=/home/ubuntu/app/.env
RestartSec=1
ExecStart=/bin/postgrest
Restart=always
[Install]
WantedBy=multi-user.target

View file

@ -0,0 +1,45 @@
[Unit]
Description=Advanced key-value store
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)
[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
PIDFile=/run/redis/redis-server.pid
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=2755
UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWritePaths=-/var/lib/redis
ReadWritePaths=-/var/log/redis
ReadWritePaths=-/var/run/redis
NoNewPrivileges=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis
[Install]
WantedBy=multi-user.target
Alias=redis-server.service

175
deploy/ec2/ee/setup_app Executable file
View file

@ -0,0 +1,175 @@
#!/bin/bash
# Load the .env file
source .env
# Check if LOCKBOX_MASTER_KEY is present or empty
if [[ -z "$LOCKBOX_MASTER_KEY" ]]; then
# Generate LOCKBOX_MASTER_KEY
LOCKBOX_MASTER_KEY=$(openssl rand -hex 32)
# Update .env file
awk -v key="$LOCKBOX_MASTER_KEY" '
BEGIN { FS=OFS="=" }
/^LOCKBOX_MASTER_KEY=/ { $2=key; found=1 }
1
END { if (!found) print "LOCKBOX_MASTER_KEY="key }
' .env > temp.env && mv temp.env .env
echo "Generated a secure master key for the lockbox"
else
echo "The lockbox master key already exists."
fi
# Check if SECRET_KEY_BASE is present or empty
if [[ -z "$SECRET_KEY_BASE" ]]; then
# Generate SECRET_KEY_BASE
SECRET_KEY_BASE=$(openssl rand -hex 64)
# Update .env file
awk -v key="$SECRET_KEY_BASE" '
BEGIN { FS=OFS="=" }
/^SECRET_KEY_BASE=/ { $2=key; found=1 }
1
END { if (!found) print "SECRET_KEY_BASE="key }
' .env > temp.env && mv temp.env .env
echo "Created a secret key for secure operations."
else
echo "The secret key base is already in place."
fi
# Check if PGRST_JWT_SECRET is present or empty
if [[ -z "$PGRST_JWT_SECRET" ]]; then
# Generate PGRST_JWT_SECRET
PGRST_JWT_SECRET=$(openssl rand -hex 32)
# Update .env file
awk -v key="$PGRST_JWT_SECRET" '
BEGIN { FS=OFS="=" }
/^PGRST_JWT_SECRET=/ { $2=key; found=1 }
1
END { if (!found) print "PGRST_JWT_SECRET="key }
' .env > temp.env && mv temp.env .env
echo "Generated a unique secret for PGRST authentication."
else
echo "The PGRST JWT secret is already generated and in place."
fi
# Function to generate a random password
generate_password() {
openssl rand -base64 12 | tr -d '/+' | cut -c1-16
}
# Check if PG_USER, PG_HOST, PG_PASS, PG_DB are present or empty
if [[ -z "$PG_USER" ]] || [[ -z "$PG_HOST" ]] || [[ -z "$PG_PASS" ]] || [[ -z "$PG_DB" ]]; then
# Prompt user for values
read -p "Enter PostgreSQL database username: " PG_USER
read -p "Enter PostgreSQL database hostname: " PG_HOST
read -p "Enter PostgreSQL database password: " PG_PASS
read -p "Enter PostgreSQL database name: " PG_DB
# Update .env file
awk -v pg_user="$PG_USER" -v pg_host="$PG_HOST" -v pg_pass="$PG_PASS" -v pg_db="$PG_DB" '
BEGIN { FS=OFS="=" }
/^PG_USER=/ { $2=pg_user; found=1 }
/^PG_HOST=/ { $2=pg_host; found=1 }
/^PG_PASS=/ { $2=pg_pass; found=1 }
/^PG_DB=/ { $2=pg_db; found=1 }
1
END {
if (!found) {
print "PG_USER="pg_user
print "PG_HOST="pg_host
print "PG_PASS="pg_pass
print "PG_DB="pg_db
}
}
' .env > temp.env && mv temp.env .env
echo "Successfully updated postgresql database values .env file"
fi
# Copy values from PG to TOOLJET_DB
TOOLJET_DB_USER=$PG_USER
TOOLJET_DB_HOST=$PG_HOST
TOOLJET_DB_PASS=$PG_PASS
# Update .env file for TOOLJET_DB
awk -v tj_user="$TOOLJET_DB_USER" -v tj_host="$TOOLJET_DB_HOST" -v tj_pass="$TOOLJET_DB_PASS" '
BEGIN { FS=OFS="=" }
/^TOOLJET_DB_USER=/ { $2=tj_user; found=1 }
/^TOOLJET_DB_HOST=/ { $2=tj_host; found=1 }
/^TOOLJET_DB_PASS=/ { $2=tj_pass; found=1 }
1
END { if (!found) print "TOOLJET_DB_USER="tj_user ORS "TOOLJET_DB_HOST="tj_host ORS "TOOLJET_DB_PASS="tj_pass }
' .env > temp.env && mv temp.env .env
echo "Successfully updated tooljet database values in the .env file"
# Construct PGRST_DB_URI with user-provided values
PGRST_DB_URI="postgres://$PG_USER:$PG_PASS@$PG_HOST/tooljet_db"
# Update .env file for PGRST_DB_URI
awk -v uri="$PGRST_DB_URI" '
BEGIN { FS=OFS="=" }
/^PGRST_DB_URI=/ { $2=uri; found=1 }
1
END { if (!found) print "PGRST_DB_URI="uri }
' .env > temp.env && mv temp.env .env
echo "Successfully updated PGRST database URI"
if [[ -z $PG_USER || -z $PG_PASS || -z $PG_HOST ]]
then
echo "Please set the required PG_USER, PG_PASS, and PG_HOST values within the .env file"
exit 1
fi
export $(grep -v '^#' .env | xargs)
if psql -d postgresql://$PG_USER:$PG_PASS@$PG_HOST/postgres -c 'select now()' > /dev/null 2>&1
then
echo "Successfully pinged the database!";
else
echo "Can't connect to the database. Kindly check the credenials provided in the .env file!"
exit 1
fi
if sudo systemctl start redis-server && sudo systemctl enable redis-server
then
echo "Successfully started Redis!"
else
echo "Failed to start and enable Redis"
fi
if sudo -E systemctl start openresty
then
echo "Successfully started reverse proxy!"
else
echo "Failed to start reverse proxy"
exit 1
fi
if sudo -E systemctl start postgrest
then
echo "Successfully started PostgREST server!"
else
echo "Failed to start PostgREST server"
exit 1
fi
TOOLJET_EDTION=ee npm --prefix server run db:setup:prod
if sudo -E systemctl start nest
then
echo "The app will be served at ${TOOLJET_HOST}"
else
echo "Failed to start the server!"
exit 1
fi
sudo systemctl restart nest
sudo -E systemctl restart postgrest

View file

@ -0,0 +1,99 @@
#!/bin/bash
set -e
# Setup prerequisite dependencies
sudo apt-get update
sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates apt-utils git curl postgresql-client
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install 18.18.2
sudo ln -s "$(which node)" /usr/bin/node
sudo ln -s "$(which npm)" /usr/bin/npm
sudo npm i -g npm@9.8.1
# Setup openresty
wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
echo "deb http://openresty.org/package/ubuntu bionic main" > openresty.list
sudo mv openresty.list /etc/apt/sources.list.d/
sudo apt-get update
sudo apt-get -y install --no-install-recommends openresty
sudo apt-get install -y curl g++ gcc autoconf automake bison libc6-dev \
libffi-dev libgdbm-dev libncurses5-dev libsqlite3-dev libtool \
libyaml-dev make pkg-config sqlite3 zlib1g-dev libgmp-dev \
libreadline-dev libssl-dev libmysqlclient-dev build-essential \
freetds-dev libpq-dev
sudo apt-get install -y luarocks
sudo luarocks install lua-resty-auto-ssl
sudo mkdir /etc/resty-auto-ssl /var/log/openresty /etc/fallback-certs
sudo chown -R www-data:www-data /etc/resty-auto-ssl
# Oracle db client library setup
sudo apt install -y libaio1
curl -o instantclient-basiclite.zip https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip -SL && \
curl -o instantclient-basiclite-11.zip https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linux.x64-11.2.0.4.0.zip -SL && \
unzip instantclient-basiclite.zip && \
unzip instantclient-basiclite-11.zip && \
sudo mkdir -p /usr/lib/instantclient && sudo mv instantclient*/ /usr/lib/instantclient && \
rm instantclient-basiclite.zip && \
rm instantclient-basiclite-11.zip && \
echo /usr/lib/instantclient/* | sudo tee /etc/ld.so.conf.d/oracle-instantclient.conf > /dev/null && sudo ldconfig
# Set the Instant Client library paths
export LD_LIBRARY_PATH="/usr/lib/instantclient/instantclient_11_2:/usr/lib/instantclient/instantclient_21_10${LD_LIBRARY_PATH}"
# Gen fallback certs
sudo openssl rand -out /home/ubuntu/.rnd -hex 256
sudo chown www-data:www-data /home/ubuntu/.rnd
sudo openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
-subj '/CN=sni-support-required-for-valid-ssl' \
-keyout /etc/fallback-certs/resty-auto-ssl-fallback.key \
-out /etc/fallback-certs/resty-auto-ssl-fallback.crt
# Setup nginx config
export SERVER_HOST="${SERVER_HOST:=localhost}"
export SERVER_USER="${SERVER_USER:=www-data}"
VARS_TO_SUBSTITUTE='$SERVER_HOST:$SERVER_USER'
envsubst "${VARS_TO_SUBSTITUTE}" < /tmp/nginx.conf > /tmp/nginx-substituted.conf
sudo cp /tmp/nginx-substituted.conf /usr/local/openresty/nginx/conf/nginx.conf
# Download and setup postgrest binary
curl -OL https://github.com/PostgREST/postgrest/releases/download/v12.0.2/postgrest-v12.0.2-linux-static-x64.tar.xz
tar xJf postgrest-v12.0.2-linux-static-x64.tar.xz
sudo mv ./postgrest /bin/postgrest
sudo rm postgrest-v12.0.2-linux-static-x64.tar.xz
# Add the Redis APT repository
sudo add-apt-repository ppa:redislabs/redis -y
# Install redis
sudo apt-get update
sudo apt-get install redis-server -y
# Setup app, postgrest and redis as systemd service
sudo cp /tmp/nest.service /lib/systemd/system/nest.service
sudo cp /tmp/postgrest.service /lib/systemd/system/postgrest.service
sudo cp /tmp/redis-server.service /lib/systemd/system/redis-server.service
# Start and enable Redis service
sudo systemctl daemon-reload
# Setup app directory
mkdir -p ~/app
git config --global url."https://x-access-token:CUSTOM_GITHUB_TOKEN@github.com/".insteadOf "https://github.com/"
#The below url will be edited dynamically when actions is triggered
git clone -b main https://github.com/ToolJet/ToolJet.git ~/app && cd ~/app
git submodule update --init --recursive
git submodule foreach 'git checkout main || true'
mv /tmp/.env ~/app/.env
mv /tmp/setup_app ~/app/setup_app
sudo chmod +x ~/app/setup_app
npm install -g npm@9.8.1
# Building ToolJet app
npm install -g @nestjs/cli
TOOLJET_EDTION=ee npm run build

View file

@ -0,0 +1,77 @@
packer {
required_plugins {
amazon = {
version = ">= 0.0.1"
source = "github.com/hashicorp/amazon"
}
}
}
source "amazon-ebs" "ubuntu" {
ami_name = "${var.ami_name}"
instance_type = "${var.instance_type}"
region = "${var.ami_region}"
ami_regions = "${var.ami_regions}"
ami_groups = "${var.ami_groups}"
source_ami_filter {
filters = {
name = "ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["099720109477"]
}
ssh_username = "ubuntu"
ssh_clear_authorized_keys = "true"
shutdown_behavior = "terminate"
force_delete_snapshot = "true"
launch_block_device_mappings {
device_name = "/dev/sda1"
volume_size = 10
delete_on_termination = true
}
}
build {
sources = [
"source.amazon-ebs.ubuntu"
]
provisioner "file" {
source = "nest.service"
destination = "/tmp/nest.service"
}
provisioner "file" {
source = "../../frontend/config/nginx.conf.template"
destination = "/tmp/nginx.conf"
}
provisioner "file" {
source = ".env"
destination = "/tmp/.env"
}
provisioner "file" {
source = "setup_app"
destination = "/tmp/setup_app"
}
provisioner "file" {
source = "postgrest.service"
destination = "/tmp/postgrest.service"
}
provisioner "file" {
source = "redis-server.service"
destination = "/tmp/redis-server.service"
}
provisioner "shell" {
script = "setup_machine.sh"
}
}

View file

@ -0,0 +1,33 @@
variable "ami_name" {
type = string
}
variable "instance_type" {
type = string
default = "t2.medium"
}
variable "ami_region" {
type = string
default = "us-west-2"
}
variable "ami_groups" {
type = list(string)
default = ["all"]
}
variable "ami_regions" {
type = list(string)
default = ["us-west-1","us-east-1", "us-east-2", "eu-central-1", "ap-northeast-1", "ca-central-1"]
}
variable "PACKER_BUILDER_TYPE" {
type = string
default = "amazon-ebs"
}
variable "PACKER_BUILD_NAME" {
type = string
default = "ubuntu"
}

View file

@ -0,0 +1,117 @@
FROM node:18.18.2-buster as builder
# Fix for JS heap limit allocation issue
ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN npm i -g npm@9.8.1
RUN npm install -g @nestjs/cli
RUN mkdir -p /app
WORKDIR /app
ARG CUSTOM_GITHUB_TOKEN
ARG BRANCH_NAME=main
# Clone and checkout the frontend repository
RUN git config --global url."https://x-access-token:${CUSTOM_GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"
RUN git config --global http.version HTTP/1.1
RUN git config --global http.postBuffer 524288000
RUN git clone https://github.com/ToolJet/ToolJet.git .
# The branch name needs to be changed the branch with modularisation in CE repo
RUN git checkout ${BRANCH_NAME}
RUN git submodule update --init --recursive
# Checkout the same branch in submodules if it exists, otherwise stay on default branch
RUN git submodule foreach 'git checkout ${BRANCH_NAME} || true'
COPY ./package.json ./package.json
# Building ToolJet plugins
COPY ./plugins/package.json ./plugins/package-lock.json ./plugins/
RUN npm --prefix plugins install
COPY ./plugins/ ./plugins/
ENV NODE_ENV=production
RUN npm --prefix plugins run build
RUN npm --prefix plugins prune --production
# Building ToolJet server
COPY ./server/package.json ./server/package-lock.json ./server/
RUN npm --prefix server install --only=production
COPY ./server/ ./server/
RUN npm --prefix server run build
FROM debian:11
RUN apt-get update -yq \
&& apt-get install curl gnupg zip -yq \
&& apt-get install -yq build-essential \
&& apt-get clean -y
RUN curl -O https://nodejs.org/dist/v18.18.2/node-v18.18.2-linux-x64.tar.xz \
&& tar -xf node-v18.18.2-linux-x64.tar.xz \
&& mv node-v18.18.2-linux-x64 /usr/local/lib/nodejs \
&& echo 'export PATH="/usr/local/lib/nodejs/bin:$PATH"' >> /etc/profile.d/nodejs.sh \
&& /bin/bash -c "source /etc/profile.d/nodejs.sh" \
&& rm node-v18.18.2-linux-x64.tar.xz
ENV PATH=/usr/local/lib/nodejs/bin:$PATH
ENV NODE_ENV=production
ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN apt-get update && apt-get install -y postgresql-client freetds-dev libaio1 wget
# Install Instantclient Basic Light Oracle and Dependencies
WORKDIR /opt/oracle
RUN wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linuxx64.zip && \
wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \
unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
unzip instantclient-basiclite-linux.x64-11.2.0.4.0.zip && rm -f instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \
cd /opt/oracle/instantclient_21_10 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \
cd /opt/oracle/instantclient_11_2 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \
echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
# Set the Instant Client library paths
ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_11_2:/opt/oracle/instantclient_21_10:${LD_LIBRARY_PATH}"
WORKDIR /
RUN mkdir -p /app
# copy npm scripts
COPY --from=builder /app/package.json ./app/package.json
# copy plugins dependencies
COPY --from=builder /app/plugins/dist ./app/plugins/dist
COPY --from=builder /app/plugins/client.js ./app/plugins/client.js
COPY --from=builder /app/plugins/node_modules ./app/plugins/node_modules
COPY --from=builder /app/plugins/packages/common ./app/plugins/packages/common
COPY --from=builder /app/plugins/package.json ./app/plugins/package.json
# copy server build
COPY --from=builder /app/server/package.json ./app/server/package.json
COPY --from=builder /app/server/.version ./app/server/.version
COPY --from=builder /app/server/entrypoint.sh ./app/server/entrypoint.sh
COPY --from=builder /app/server/node_modules ./app/server/node_modules
COPY --from=builder /app/server/templates ./app/server/templates
COPY --from=builder /app/server/scripts ./app/server/scripts
COPY --from=builder /app/server/dist ./app/server/dist
# Define non-sudo user
RUN useradd --create-home --home-dir /home/appuser appuser \
&& chown -R appuser:0 /app \
&& chown -R appuser:0 /home/appuser \
&& chmod u+x /app \
&& chmod -R g=u /app
# Set npm cache directory
ENV npm_config_cache /home/appuser/.npm
ENV HOME=/home/appuser
USER appuser
WORKDIR /app
# Dependencies for scripts outside nestjs
RUN npm install dotenv@10.0.0 joi@17.4.1
ENTRYPOINT ["./server/entrypoint.sh"]

View file

@ -0,0 +1,122 @@
FROM node:18.18.2-buster AS builder
# Fix for JS heap limit allocation issue
ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN mkdir -p /app
WORKDIR /app
ARG CUSTOM_GITHUB_TOKEN
ARG BRANCH_NAME
# Clone and checkout the frontend repository
RUN git config --global url."https://x-access-token:${CUSTOM_GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"
RUN git config --global http.version HTTP/1.1
RUN git config --global http.postBuffer 524288000
RUN git clone https://github.com/ToolJet/ToolJet.git .
# The branch name needs to be changed the branch with modularisation in CE repo
RUN git checkout ${BRANCH_NAME}
RUN git submodule update --init --recursive
# Checkout the same branch in submodules if it exists, otherwise stay on default branch
RUN git submodule foreach 'git checkout ${BRANCH_NAME} || true'
# Scripts for building
COPY ./package.json ./package.json
# Build plugins
COPY ./plugins/package.json ./plugins/package-lock.json ./plugins/
RUN npm --prefix plugins install
COPY ./plugins/ ./plugins/
RUN NODE_ENV=production npm --prefix plugins run build
RUN npm --prefix plugins prune --production
ENV TOOLJET_EDITION=ee
# Build frontend
COPY ./frontend/package.json ./frontend/package-lock.json ./frontend/
RUN npm --prefix frontend install
COPY ./frontend/ ./frontend/
RUN npm --prefix frontend run build --production
RUN npm --prefix frontend prune --production
ENV NODE_ENV=production
ENV TOOLJET_EDITION=ee
# Build server
COPY ./server/package.json ./server/package-lock.json ./server/
RUN npm --prefix server install
COPY ./server/ ./server/
RUN npm install -g @nestjs/cli
RUN npm --prefix server run build
FROM node:18.18.2-bullseye
RUN apt-get update -yq \
&& apt-get install curl gnupg zip -yq \
&& apt-get install -yq build-essential \
&& apt-get clean -y
# copy postgrest executable
COPY --from=postgrest/postgrest:v12.2.0 /bin/postgrest /bin
ENV NODE_ENV=production
ENV TOOLJET_EDITION=ee
ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN apt-get update && apt-get install -y postgresql-client freetds-dev libaio1 wget supervisor
# Install Instantclient Basic Light Oracle and Dependencies
WORKDIR /opt/oracle
RUN wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linuxx64.zip && \
wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \
unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
unzip instantclient-basiclite-linux.x64-11.2.0.4.0.zip && rm -f instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \
cd /opt/oracle/instantclient_21_10 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \
cd /opt/oracle/instantclient_11_2 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \
echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
# Set the Instant Client library paths
ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_11_2:/opt/oracle/instantclient_21_10:${LD_LIBRARY_PATH}"
WORKDIR /
RUN mkdir -p /app /var/log/supervisor
COPY /deploy/docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# copy npm scripts
COPY --from=builder /app/package.json ./app/package.json
# copy plugins dependencies
COPY --from=builder /app/plugins/dist ./app/plugins/dist
COPY --from=builder /app/plugins/client.js ./app/plugins/client.js
COPY --from=builder /app/plugins/node_modules ./app/plugins/node_modules
COPY --from=builder /app/plugins/packages/common ./app/plugins/packages/common
COPY --from=builder /app/plugins/package.json ./app/plugins/package.json
# copy frontend build
COPY --from=builder /app/frontend/build ./app/frontend/build
# copy server build
COPY --from=builder /app/server/package.json ./app/server/package.json
COPY --from=builder /app/server/.version ./app/server/.version
COPY --from=builder /app/server/ee/keys ./app/server/ee/keys
COPY --from=builder /app/server/entrypoint.sh ./app/server/entrypoint.sh
COPY --from=builder /app/server/node_modules ./app/server/node_modules
COPY --from=builder /app/server/templates ./app/server/templates
COPY --from=builder /app/server/scripts ./app/server/scripts
COPY --from=builder /app/server/dist ./app/server/dist
WORKDIR /app
# ENV defaults
ENV TOOLJET_HOST=http://localhost:80 \
PGRST_HOST=http://localhost:3000 \
PGRST_JWT_SECRET=r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj \
TOOLJET_DB=tooljet_db \
ENABLE_TOOLJET_DB=true \
PORT=80 \
LOCKBOX_MASTER_KEY=replace_with_lockbox_master_key \
SECRET_KEY_BASE=replace_with_secret_key_base \
ORM_LOGGING=all \
TERM=xterm
CMD ["/usr/bin/supervisord"]

View file

@ -0,0 +1,166 @@
FROM node:18.18.2-buster AS builder
# Fix for JS heap limit allocation issue
ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN npm i -g npm@9.8.1
RUN mkdir -p /app
# RUN npm cache clean --force
WORKDIR /app
# Set GitHub token and branch as build arguments
ARG CUSTOM_GITHUB_TOKEN
ARG BRANCH_NAME=main
# Clone and checkout the frontend repository
RUN git config --global url."https://x-access-token:${CUSTOM_GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"
RUN git config --global http.version HTTP/1.1
RUN git config --global http.postBuffer 524288000
RUN git clone https://github.com/ToolJet/ToolJet.git .
# The branch name needs to be changed the branch with modularisation in CE repo
RUN git checkout main
RUN git submodule update --init --recursive
# Checkout the same branch in submodules if it exists, otherwise stay on default branch
RUN git submodule foreach 'git checkout ${BRANCH_NAME} || true'
# Scripts for building
COPY ./package.json ./package.json
# Build plugins
COPY ./plugins/package.json ./plugins/package-lock.json ./plugins/
RUN npm --prefix plugins install
COPY ./plugins/ ./plugins/
RUN NODE_ENV=production npm --prefix plugins run build
RUN npm --prefix plugins prune --production
ENV TOOLJET_EDITION=ee
# Build frontend
COPY ./frontend/package.json ./frontend/package-lock.json ./frontend/
RUN npm --prefix frontend install
COPY ./frontend/ ./frontend/
RUN npm --prefix frontend run build --production
RUN npm --prefix frontend prune --production
ENV NODE_ENV=production
ENV TOOLJET_EDITION=ee
# Build server
COPY ./server/package.json ./server/package-lock.json ./server/
RUN npm --prefix server install
COPY ./server/ ./server/
RUN npm install -g @nestjs/cli
RUN npm --prefix server run build
FROM debian:11
RUN apt-get update -yq \
&& apt-get install curl gnupg zip -yq \
&& apt-get install -yq build-essential \
&& apt-get clean -y
RUN curl -O https://nodejs.org/dist/v18.18.2/node-v18.18.2-linux-x64.tar.xz \
&& tar -xf node-v18.18.2-linux-x64.tar.xz \
&& mv node-v18.18.2-linux-x64 /usr/local/lib/nodejs \
&& echo 'export PATH="/usr/local/lib/nodejs/bin:$PATH"' >> /etc/profile.d/nodejs.sh \
&& /bin/bash -c "source /etc/profile.d/nodejs.sh" \
&& rm node-v18.18.2-linux-x64.tar.xz
ENV PATH=/usr/local/lib/nodejs/bin:$PATH
ENV NODE_ENV=production
ENV TOOLJET_EDITION=ee
ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN apt-get update && \
apt-get install -y postgresql-client freetds-dev libaio1 wget && \
apt-get -o Dpkg::Options::="--force-confold" upgrade -q -y --force-yes && \
apt-get -y autoremove && \
apt-get -y autoclean
# Install Instantclient Basic Light Oracle and Dependencies
WORKDIR /opt/oracle
RUN wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linuxx64.zip && \
wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \
unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
unzip instantclient-basiclite-linux.x64-11.2.0.4.0.zip && rm -f instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \
cd /opt/oracle/instantclient_21_10 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \
cd /opt/oracle/instantclient_11_2 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \
echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
# Set the Instant Client library paths
ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_11_2:/opt/oracle/instantclient_21_10:${LD_LIBRARY_PATH}"
WORKDIR /
RUN mkdir -p /app
# copy npm scripts
COPY --from=builder /app/package.json ./app/package.json
# copy plugins dependencies
COPY --from=builder /app/plugins/dist ./app/plugins/dist
COPY --from=builder /app/plugins/client.js ./app/plugins/client.js
COPY --from=builder /app/plugins/node_modules ./app/plugins/node_modules
COPY --from=builder /app/plugins/packages/common ./app/plugins/packages/common
COPY --from=builder /app/plugins/package.json ./app/plugins/package.json
# copy frontend build
COPY --from=builder /app/frontend/build ./app/frontend/build
# copy server build
COPY --from=builder /app/server/package.json ./app/server/package.json
COPY --from=builder /app/server/.version ./app/server/.version
COPY --from=builder /app/server/ee/keys ./app/server/ee/keys
COPY --from=builder /app/server/entrypoint.sh ./app/server/entrypoint.sh
COPY --from=builder /app/server/node_modules ./app/server/node_modules
COPY --from=builder /app/server/templates ./app/server/templates
COPY --from=builder /app/server/scripts ./app/server/scripts
COPY --from=builder /app/server/dist ./app/server/dist
# Define non-sudo user
RUN useradd --create-home --home-dir /home/appuser appuser \
&& chown -R appuser:0 /app \
&& chown -R appuser:0 /home \
&& chmod u+x /app \
&& chmod u+x /home \
&& chmod -R g=u /app \
&& chmod -R g=u /home
# Create directory /home/appuser and set ownership to appuser (Refer doc for understanding the changes https://app.clickup.com/37484951/v/dc/13qycq-4081)
RUN mkdir -p /home/appuser \
&& chown -R appuser:0 /home/appuser \
&& chmod g+s /home/appuser \
&& chmod -R g=u /home/appuser \
&& npm cache clean --force
# Create directory /tmp/.npm/npm-cache/ and set ownership to appuser (Refer doc for understanding the changes https://app.clickup.com/37484951/v/dc/13qycq-4081)
RUN mkdir -p /tmp/.npm/npm-cache/ \
&& chown -R appuser:0 /tmp/.npm/npm-cache/ \
&& chmod g+s /tmp/.npm/npm-cache/ \
&& chmod -R g=u /tmp/.npm/npm-cache \
&& npm cache clean --force
# Set npm cache directory globally
RUN npm config set cache /tmp/.npm/npm-cache/ --global
ENV npm_config_cache /tmp/.npm/npm-cache/
# Create directory /tmp/.npm/npm-cache/_logs and set ownership to appuser
RUN mkdir -p /tmp/.npm/npm-cache/_logs \
&& chown -R appuser:0 /tmp/.npm/npm-cache/_logs \
&& chmod g+s /tmp/.npm/npm-cache/_logs \
&& chmod -R g=u /tmp/.npm/npm-cache/_logs
ENV HOME=/home/appuser
# Switch back to appuser
USER appuser
WORKDIR /app
# Dependencies for scripts outside nestjs
RUN npm install dotenv@10.0.0 joi@17.4.1
RUN npm cache clean --force
ENTRYPOINT ["./server/entrypoint.sh"]

View file

@ -1 +1 @@
3.2.2-ce
3.7.0

View file

@ -1,2 +1,2 @@
First Name,Last Name,Email,User Role,Group
test,user,test@gmail.com,"Assign each user a role: Admin, Builder or End User. User role value should be exact same","For multiple groups separate using pipe (|) operator e.g. Groups1|Group2 or leave blank if no group assign"
First Name,Last Name,Email,User Role,Group,Metadata
test,user,test@gmail.com,"Assign each user a role: Admin, Builder or End User. User role value should be exact same","For multiple groups separate using pipe (|) operator e.g. Groups1|Group2 or leave blank if no group assign","Metadata is optional and should be uploaded in the form of "{""key"": ""value""...}" separated via commas Eg. "{""apiKey"": ""abc123"", ""apiKey2"": ""xyz123""}"

Can't render this file because it contains an unexpected character in line 2 and column 287.

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="25" viewBox="0 0 28 25" fill="none">
<path d="M13.6044 24.5421C13.1788 24.5421 12.8196 24.3957 12.5268 24.1029C12.2341 23.8102 12.0877 23.451 12.0877 23.0254C12.0877 22.5998 12.2341 22.2406 12.5268 21.9478C12.8196 21.6551 13.1788 21.5087 13.6044 21.5087L22.8819 21.5167V12.0341C22.8819 9.48189 21.9777 7.32549 20.1692 5.56487C18.3608 3.80424 16.1725 2.92393 13.6044 2.92393C11.0363 2.92393 8.84797 3.80424 7.0395 5.56487C5.23105 7.32549 4.32683 9.48189 4.32683 12.0341L4.3667 18.9218C4.37201 19.3474 4.22696 19.7079 3.93153 20.0033C3.63613 20.2987 3.27563 20.4464 2.85003 20.4464H2.81017C2.03432 20.4464 1.372 20.1733 0.8232 19.6272C0.2744 19.0811 0 18.4201 0 17.6442V14.842C0 14.3701 0.114011 13.9272 0.342033 13.5134C0.570055 13.0997 0.889867 12.7626 1.30147 12.5022L1.36957 11.0863C1.50483 9.51138 1.9238 8.05026 2.62647 6.70293C3.32911 5.35558 4.22681 4.18287 5.31957 3.1848C6.41232 2.18673 7.67127 1.40642 9.0964 0.843866C10.5215 0.281288 12.0242 0 13.6044 0C15.1846 0 16.683 0.281288 18.0997 0.843866C19.5163 1.40642 20.7753 2.18251 21.8765 3.17213C22.9777 4.16173 23.8754 5.33153 24.5696 6.68153C25.2638 8.03153 25.687 9.49398 25.8392 11.0689L25.9073 12.4515C26.3242 12.6727 26.6453 12.9887 26.8707 13.3993C27.096 13.8099 27.2087 14.2428 27.2087 14.6978V17.7884C27.2087 18.2648 27.1 18.7202 26.8826 19.1547C26.6652 19.5893 26.3401 19.9198 25.9073 20.1464V21.5167C25.9073 22.351 25.6116 23.0638 25.0203 23.6551C24.429 24.2464 23.7162 24.5421 22.8819 24.5421H13.6044ZM9.70003 15.145C9.31161 15.145 8.98565 15.0132 8.72213 14.7497C8.4586 14.4861 8.32683 14.1628 8.32683 13.7797C8.32683 13.3966 8.4586 13.0733 8.72213 12.8098C8.98565 12.5463 9.31161 12.4145 9.70003 12.4145C10.0884 12.4145 10.4144 12.5463 10.6779 12.8098C10.9414 13.0733 11.0732 13.3966 11.0732 13.7797C11.0732 14.1628 10.9414 14.4861 10.6779 14.7497C10.4144 15.0132 10.0884 15.145 9.70003 15.145ZM17.5087 15.145C17.1203 15.145 16.7943 15.0132 16.5308 14.7497C16.2673 14.4861 16.1355 14.1628 16.1355 13.7797C16.1355 13.3966 16.2673 13.0733 16.5308 12.8098C16.7943 12.5463 17.1203 12.4145 17.5087 12.4145C17.8971 12.4145 18.2231 12.5463 18.4866 12.8098C18.7501 13.0733 18.8819 13.3966 18.8819 13.7797C18.8819 14.1628 18.7501 14.4861 18.4866 14.7497C18.2231 15.0132 17.8971 15.145 17.5087 15.145Z" fill="#3E63DD"/>
<path opacity="0.4" d="M5.62167 12.6559C5.47673 10.3482 6.1998 8.38048 7.79087 6.7527C9.38193 5.12492 11.342 4.31104 13.6709 4.31104C15.6593 4.31104 17.4089 4.92818 18.9195 6.16247C20.4301 7.39678 21.3171 8.98639 21.5804 10.9313C19.606 10.9091 17.7741 10.4032 16.0847 9.41357C14.3953 8.42395 13.0898 7.05257 12.168 5.29944C11.7859 7.01877 11.0107 8.52505 9.8423 9.81827C8.67394 11.1115 7.26707 12.0574 5.62167 12.6559Z" fill="#3E63DD"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,3 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.21745 0.333496H11.2174C12.6902 0.333496 13.8841 1.5274 13.8841 3.00016V11.0002C13.8841 12.4729 12.6902 13.6668 11.2174 13.6668H3.21745C1.74469 13.6668 0.550781 12.4729 0.550781 11.0002V3.00016C0.550781 1.5274 1.74469 0.333496 3.21745 0.333496ZM7.21745 3.8335C7.49359 3.8335 7.71745 4.05735 7.71745 4.3335V6.50016H9.88412C10.1603 6.50016 10.3841 6.72402 10.3841 7.00016C10.3841 7.27631 10.1603 7.50016 9.88412 7.50016H7.71745V9.66683C7.71745 9.94297 7.49359 10.1668 7.21745 10.1668C6.94131 10.1668 6.71745 9.94297 6.71745 9.66683V7.50016H4.55078C4.27464 7.50016 4.05078 7.27631 4.05078 7.00016C4.05078 6.72402 4.27464 6.50016 4.55078 6.50016H6.71745V4.3335C6.71745 4.05735 6.94131 3.8335 7.21745 3.8335Z" fill="#C1C8CD"/>
</svg>

After

Width:  |  Height:  |  Size: 875 B

View file

@ -0,0 +1,4 @@
<svg width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.217773" width="28" height="28" rx="6" fill="#EBF9EB"/>
<path d="M9.71892 13.9045L14.3841 7.65085C14.8437 7.03481 15.7862 7.37573 15.7862 8.15799V11.943C15.7862 12.3974 16.1374 12.7658 16.5706 12.7658H18.0983C18.7521 12.7658 19.1189 13.5557 18.716 14.0959L14.0508 20.3495C13.5912 20.9655 12.6487 20.6246 12.6487 19.8423V16.0574C12.6487 15.6029 12.2975 15.2345 11.8643 15.2345H10.3366C9.68281 15.2345 9.31596 14.4446 9.71892 13.9045Z" fill="#46A758"/>
</svg>

After

Width:  |  Height:  |  Size: 563 B

View file

@ -0,0 +1,6 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="22" height="22" rx="2" fill="#F1F3F5"/>
<path opacity="0.4" d="M9.81465 6.43012C10.3313 5.52329 11.6687 5.52329 12.1853 6.43012L16.6607 14.2856C17.1628 15.1669 16.5093 16.25 15.4754 16.25H6.52459C5.49067 16.25 4.83713 15.1669 5.33925 14.2856L9.81465 6.43012Z" fill="#889096"/>
<path d="M11.5833 13.9154C11.5833 14.2375 11.3222 14.4987 11 14.4987C10.6778 14.4987 10.4167 14.2375 10.4167 13.9154C10.4167 13.5932 10.6778 13.332 11 13.332C11.3222 13.332 11.5833 13.5932 11.5833 13.9154Z" fill="#889096"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11 8.8125C11.2416 8.8125 11.4375 9.00838 11.4375 9.25V12.1667C11.4375 12.4083 11.2416 12.6042 11 12.6042C10.7584 12.6042 10.5625 12.4083 10.5625 12.1667V9.25C10.5625 9.00838 10.7584 8.8125 11 8.8125Z" fill="#889096"/>
</svg>

After

Width:  |  Height:  |  Size: 885 B

View file

@ -0,0 +1,3 @@
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.1535 2.89948C15.593 3.25909 15.6577 3.90693 15.2982 4.34645L8.29337 12.9992C7.23579 14.4161 6.22231 14.0102 5.34746 13.2447L2.54843 10.7955C2.12104 10.4216 2.07773 9.77193 2.4517 9.34455C2.82566 8.91716 3.47528 8.87385 3.90267 9.24782L6.7017 11.697L13.7065 3.04418C14.0661 2.60465 14.7139 2.53987 15.1535 2.89948Z" fill="#4368E3"/>
</svg>

After

Width:  |  Height:  |  Size: 488 B

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.35615 21.1403C8.54711 21.657 9.03969 22 9.59058 22C10.1637 22 10.6709 21.6291 10.8447 21.083L13.214 13.6366C13.2835 13.4181 13.4463 13.2417 13.6585 13.1549L21.1582 10.0868C21.6574 9.88267 21.9834 9.39697 21.9834 8.85775C21.9834 8.28298 21.6136 7.77343 21.0672 7.59524L4.15734 2.08118C3.568 1.88901 2.92069 2.04405 2.48237 2.48237C2.02776 2.93698 1.87929 3.6146 2.10216 4.21765L8.35615 21.1403Z" fill="#ffffff"/>
</svg>

After

Width:  |  Height:  |  Size: 567 B

View file

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.8922 6.726C10.8922 6.88386 10.8295 7.03527 10.7179 7.14689L7.44405 10.4207C7.27381 10.5909 7.01779 10.6419 6.79537 10.5497C6.57294 10.4576 6.42792 10.2406 6.42792 9.99981V7.91647H5.23744C4.57997 7.91647 4.04697 8.44947 4.04697 9.10696V13.5712C4.04697 14.2287 4.57997 14.7617 5.23744 14.7617H14.7613C15.4188 14.7617 15.9517 14.2287 15.9517 13.5712V9.10695C15.9517 8.44947 15.4188 7.91647 14.7613 7.91647H13.8684C13.2109 7.91647 12.6779 7.38348 12.6779 6.726C12.6779 6.06852 13.2109 5.53552 13.8684 5.53552H14.7613C16.7338 5.53552 18.3327 7.13451 18.3327 9.10695V13.5712C18.3327 15.5437 16.7338 17.1426 14.7613 17.1426H5.23744C3.265 17.1426 1.66602 15.5437 1.66602 13.5712V9.10696C1.66602 7.13451 3.265 5.53553 5.23744 5.53553H6.42792V3.45219C6.42792 3.21144 6.57294 2.9944 6.79536 2.90226C7.01779 2.81013 7.27381 2.86106 7.44405 3.03129L10.7179 6.3051C10.8295 6.41673 10.8922 6.56813 10.8922 6.726Z" fill="#F58534"/>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,5 @@
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect y="0.0429688" width="24" height="24" rx="6" fill="#E8F3EB"/>
<path d="M10.875 14.0902C8.93412 14.2567 7.5 14.844 7.5 15.543C7.5 16.3714 9.51472 17.043 12 17.043C14.4853 17.043 16.5 16.3714 16.5 15.543C16.5 14.844 15.0659 14.2567 13.125 14.0902V15.043C13.125 15.6643 12.6213 16.168 12 16.168C11.3787 16.168 10.875 15.6643 10.875 15.043V14.0902Z" fill="#1E823B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.375 9.99571C13.022 9.8292 13.5 9.24191 13.5 8.54297C13.5 7.71454 12.8284 7.04297 12 7.04297C11.1716 7.04297 10.5 7.71454 10.5 8.54297C10.5 9.24191 10.978 9.8292 11.625 9.99571V15.043C11.625 15.2501 11.7929 15.418 12 15.418C12.2071 15.418 12.375 15.2501 12.375 15.043V9.99571Z" fill="#1E823B"/>
</svg>

After

Width:  |  Height:  |  Size: 818 B

View file

@ -0,0 +1,3 @@
<svg width="6" height="6" viewBox="0 0 6 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.207188 5.26573C0.0778095 5.42745 0.10403 5.66343 0.265753 5.79281C0.427476 5.92219 0.663461 5.89597 0.79284 5.73425L2.79284 3.23425C2.90241 3.09729 2.90241 2.90268 2.79284 2.76573L0.79284 0.265726C0.663461 0.104003 0.427476 0.0777821 0.265753 0.207161C0.10403 0.336539 0.0778093 0.572524 0.207188 0.734247L2.01978 2.99999L0.207188 5.26573ZM3.20719 5.26573C3.07781 5.42745 3.10403 5.66343 3.26575 5.79281C3.42748 5.92219 3.66346 5.89597 3.79284 5.73425L5.79284 3.23425C5.9024 3.09729 5.9024 2.90268 5.79284 2.76573L3.79284 0.265726C3.66346 0.104003 3.42748 0.077782 3.26575 0.207161C3.10403 0.336539 3.07781 0.572524 3.20719 0.734247L5.01978 2.99999L3.20719 5.26573Z" fill="#3E63DD"/>
</svg>

After

Width:  |  Height:  |  Size: 835 B

View file

@ -0,0 +1,5 @@
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.535156" y="0.958008" width="24" height="24" rx="6" fill="#E8F3EB"/>
<path d="M11.4102 15.0052C9.46928 15.1718 8.03516 15.7591 8.03516 16.458C8.03516 17.2864 10.0499 17.958 12.5352 17.958C15.0204 17.958 17.0352 17.2864 17.0352 16.458C17.0352 15.7591 15.601 15.1718 13.6602 15.0052V15.958C13.6602 16.5793 13.1565 17.083 12.5352 17.083C11.9138 17.083 11.4102 16.5793 11.4102 15.958V15.0052Z" fill="#1E823B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.9102 10.9108C13.5571 10.7442 14.0352 10.1569 14.0352 9.45801C14.0352 8.62958 13.3636 7.95801 12.5352 7.95801C11.7067 7.95801 11.0352 8.62958 11.0352 9.45801C11.0352 10.1569 11.5132 10.7442 12.1602 10.9108V15.958C12.1602 16.1651 12.328 16.333 12.5352 16.333C12.7423 16.333 12.9102 16.1651 12.9102 15.958V10.9108Z" fill="#1E823B"/>
</svg>

After

Width:  |  Height:  |  Size: 903 B

View file

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 2C2.89543 2 2 2.89543 2 4V6C2 7.10457 2.89543 8 4 8H4.25V16H4C2.89543 16 2 16.8954 2 18V20C2 21.1046 2.89543 22 4 22H6C7.10457 22 8 21.1046 8 20V19.75H16V20C16 21.1046 16.8954 22 18 22H20C21.1046 22 22 21.1046 22 20V18C22 16.8954 21.1046 16 20 16H19.75V8H20C21.1046 8 22 7.10457 22 6V4C22 2.89543 21.1046 2 20 2H18C16.8954 2 16 2.89543 16 4V4.25L8 4.25V4C8 2.89543 7.10457 2 6 2H4ZM8 5.75V6C8 7.10457 7.10457 8 6 8H5.75V16H6C7.10457 16 8 16.8954 8 18V18.25H16V18C16 16.8954 16.8954 16 18 16H18.25V8H18C16.8954 8 16 7.10457 16 6V5.75L8 5.75Z" fill="#6A727C"/>
</svg>

After

Width:  |  Height:  |  Size: 714 B

View file

@ -0,0 +1,5 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="split">
<path id="vector" fill-rule="evenodd" clip-rule="evenodd" d="M10.843 9.23593C11.0522 9.02671 11.0522 8.6875 10.843 8.47829L9.2359 6.87119C9.08268 6.71797 8.85225 6.67214 8.65211 6.75506C8.4519 6.83797 8.3214 7.03331 8.3214 7.24999V8.14285H7.78569C6.60223 8.14285 5.64284 7.18346 5.64284 6C5.64284 4.81653 6.60223 3.85715 7.78569 3.85715H8.3214V4.75C8.3214 4.96667 8.4519 5.16201 8.65211 5.24494C8.85225 5.32785 9.08268 5.28202 9.2359 5.12881L10.843 3.52167C11.0522 3.31246 11.0522 2.97327 10.843 2.76406L9.2359 1.15692C9.08268 1.00371 8.85225 0.957876 8.65211 1.04079C8.4519 1.12371 8.3214 1.31905 8.3214 1.53573V2.42858H7.78569C6.05787 2.42858 4.61662 3.65555 4.28572 5.28571H1.71428C1.3198 5.28571 1 5.60551 1 6C1 6.39448 1.3198 6.71428 1.71428 6.71428H4.28572C4.61662 8.34443 6.05787 9.57143 7.78569 9.57143H8.3214V10.4643C8.3214 10.6809 8.4519 10.8763 8.65211 10.9592C8.85225 11.0421 9.08268 10.9963 9.2359 10.8431L10.843 9.23593Z" fill="#4368E3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,3 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.843 9.23593C11.0522 9.02671 11.0522 8.6875 10.843 8.47829L9.2359 6.87119C9.08268 6.71797 8.85225 6.67214 8.65211 6.75506C8.4519 6.83797 8.3214 7.03331 8.3214 7.24999V8.14285H7.78569C6.60223 8.14285 5.64284 7.18346 5.64284 6C5.64284 4.81653 6.60223 3.85715 7.78569 3.85715H8.3214V4.75C8.3214 4.96667 8.4519 5.16201 8.65211 5.24494C8.85225 5.32785 9.08268 5.28202 9.2359 5.12881L10.843 3.52167C11.0522 3.31246 11.0522 2.97327 10.843 2.76406L9.2359 1.15692C9.08268 1.00371 8.85225 0.957876 8.65211 1.04079C8.4519 1.12371 8.3214 1.31905 8.3214 1.53573V2.42858H7.78569C6.05787 2.42858 4.61662 3.65555 4.28572 5.28571H1.71428C1.3198 5.28571 1 5.60551 1 6C1 6.39448 1.3198 6.71428 1.71428 6.71428H4.28572C4.61662 8.34443 6.05787 9.57143 7.78569 9.57143H8.3214V10.4643C8.3214 10.6809 8.4519 10.8763 8.65211 10.9592C8.85225 11.0421 9.08268 10.9963 9.2359 10.8431L10.843 9.23593Z" fill="#6A727C"/>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle opacity="0.4" cx="12" cy="12" r="10" fill="#46A758"/>
<path d="M13 7C13 7.55228 12.5523 8 12 8C11.4477 8 11 7.55228 11 7C11 6.44772 11.4477 6 12 6C12.5523 6 13 6.44772 13 7Z" fill="#46A758"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.25 10C10.25 9.58579 10.5858 9.25 11 9.25H12C12.4142 9.25 12.75 9.58579 12.75 10V17C12.75 17.4142 12.4142 17.75 12 17.75C11.5858 17.75 11.25 17.4142 11.25 17V10.75H11C10.5858 10.75 10.25 10.4142 10.25 10Z" fill="#46A758"/>
</svg>

After

Width:  |  Height:  |  Size: 578 B

View file

@ -0,0 +1,4 @@
<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.25001 1.58299C5.43547 1.3048 5.74771 1.1377 6.08206 1.1377H7.01169C7.34604 1.1377 7.65828 1.3048 7.84374 1.583L8.29688 2.2627H10.1719C10.379 2.2627 10.5469 2.43059 10.5469 2.6377C10.5469 2.8448 10.379 3.0127 10.1719 3.0127H2.92188C2.71477 3.0127 2.54688 2.8448 2.54688 2.6377C2.54688 2.43059 2.71477 2.2627 2.92188 2.2627H4.79688L5.25001 1.58299Z" fill="#6A727C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.04688 11.1377H5.04688C3.94231 11.1377 3.04688 10.2423 3.04688 9.1377V3.6377H10.0469V9.1377C10.0469 10.2423 9.15144 11.1377 8.04688 11.1377ZM5.54688 5.2627C5.75398 5.2627 5.92188 5.43059 5.92188 5.6377V9.1377C5.92188 9.3448 5.75398 9.5127 5.54688 9.5127C5.33977 9.5127 5.17188 9.3448 5.17188 9.1377L5.17188 5.6377C5.17188 5.43059 5.33977 5.2627 5.54688 5.2627ZM7.54688 5.2627C7.75398 5.2627 7.92188 5.43059 7.92188 5.6377V9.1377C7.92188 9.3448 7.75398 9.5127 7.54688 9.5127C7.33977 9.5127 7.17188 9.3448 7.17188 9.1377V5.6377C7.17188 5.43059 7.33977 5.2627 7.54688 5.2627Z" fill="#6A727C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,29 @@
import React from 'react';
const DatepickerV2 = ({ fill = '#D7DBDF', width = 24, className = '', viewBox = '0 0 49 48' }) => (
<svg
width={width}
height={width}
viewBox={viewBox}
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<path
fill={fill}
d="M4.722 16.476V40.5c0 3.038 2.257 5.5 5.041 5.5h30.25c2.785 0 5.042-2.462 5.042-5.5V16.476H4.722z"
></path>
<path
fill="#3E63DD"
fillRule="evenodd"
d="M14.805 2c1.591 0 2.881 1.407 2.881 3.143v1.571h14.405V5.143c0-1.736 1.29-3.143 2.881-3.143 1.591 0 2.88 1.407 2.88 3.143v1.571h2.161c2.556 0 5.042 2.08 5.042 5.174v4.604H4.722v-4.604c0-3.093 2.485-5.174 5.041-5.174h2.161V5.143c0-1.736 1.29-3.143 2.881-3.143z"
clipRule="evenodd"
></path>
<path
fill="#3E63DD"
d="M13.365 28.148c1.59 0 2.88-1.407 2.88-3.142 0-1.736-1.29-3.143-2.88-3.143-1.591 0-2.881 1.407-2.881 3.143 0 1.735 1.29 3.142 2.88 3.142zM24.888 28.148c1.591 0 2.881-1.407 2.881-3.142 0-1.736-1.29-3.143-2.88-3.143-1.592 0-2.882 1.407-2.882 3.143 0 1.735 1.29 3.142 2.881 3.142zM13.365 40.717c1.59 0 2.88-1.407 2.88-3.143 0-1.736-1.29-3.143-2.88-3.143-1.591 0-2.881 1.407-2.881 3.143 0 1.736 1.29 3.143 2.88 3.143zM24.888 40.717c1.591 0 2.881-1.407 2.881-3.143 0-1.736-1.29-3.143-2.88-3.143-1.592 0-2.882 1.407-2.882 3.143 0 1.736 1.29 3.143 2.881 3.143zM36.413 28.148c1.59 0 2.88-1.407 2.88-3.142 0-1.736-1.29-3.143-2.88-3.143-1.591 0-2.881 1.407-2.881 3.143 0 1.735 1.29 3.142 2.88 3.142z"
></path>
</svg>
);
export default DatepickerV2;

View file

@ -0,0 +1,31 @@
import React from 'react';
const DateTimePickerV2 = ({ fill = '#D7DBDF', width = 24, className = '', viewBox = '0 0 49 48' }) => (
<svg
width={width}
height={width}
viewBox={viewBox}
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<path
d="M4.72192 16.4763V40.5001C4.72192 43.5376 6.97916 46.0001 9.76359 46.0001H40.0136C42.798 46.0001 45.0552 43.5376 45.0552 40.5001V16.4763H4.72192Z"
fill={fill}
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M14.7228 29.9034C14.7228 24.289 19.2742 19.7375 24.8887 19.7375C30.5032 19.7375 35.0546 24.289 35.0546 29.9034C35.0546 35.5178 30.5032 40.0693 24.8887 40.0693C19.2742 40.0693 14.7228 35.5178 14.7228 29.9034ZM26.8437 26.7755C26.8437 25.6958 25.9684 24.8205 24.8887 24.8205C23.809 24.8205 22.9337 25.6958 22.9337 26.7755V30.6854C22.9337 31.5825 23.5442 32.3645 24.4145 32.582L27.5425 33.364C28.59 33.6259 29.6514 32.9891 29.9133 31.9416C30.1751 30.8941 29.5383 29.8327 28.4908 29.5708L26.8437 29.159V26.7755Z"
fill="#4368E3"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M14.8053 2C16.3963 2 17.6862 3.4071 17.6862 5.14286V6.71428H32.0912V5.14286C32.0912 3.4071 33.3811 2 34.9722 2C36.5633 2 37.8531 3.4071 37.8531 5.14286V6.71428H40.0136C42.5696 6.71428 45.0552 8.79479 45.0552 11.8884V14.1352V16.4923H42.8945H6.88264H4.72192V14.1352V11.8884C4.72192 8.79479 7.20766 6.71428 9.76359 6.71428H11.9243V5.14286C11.9243 3.4071 13.2142 2 14.8053 2Z"
fill="#4368E3"
/>
</svg>
);
export default DateTimePickerV2;

View file

@ -11,12 +11,12 @@ import Colorpicker from './colorpicker.jsx';
import Container from './container.jsx';
import Customcomponent from './customcomponent.jsx';
import Datepicker from './datepicker.jsx';
import DateTimePickerV2 from './datetimepickerV2.jsx';
import Daterangepicker from './daterangepicker.jsx';
import Divider from './divider.jsx';
import DividerHorizondal from './dividerhorizontal.jsx';
import Downstatistics from './downstatistics.jsx';
import Dropdown from './dropdown.jsx';
import DropdownV2 from './dropdownV2.jsx';
import Filepicker from './filepicker.jsx';
import Form from './form.jsx';
import Frame from './frame.jsx';
@ -32,14 +32,12 @@ import Listview from './listview.jsx';
import Map from './map.jsx';
import Modal from './modal.jsx';
import Multiselect from './multiselect.jsx';
import MultiselectV2 from './multiselectV2.jsx';
import Numberinput from './numberinput.jsx';
import Pagination from './pagination.jsx';
import Passwordinput from './passwordinput.jsx';
import Pdf from './pdf.jsx';
import Qrscanner from './qrscanner.jsx';
import RadioButton from './radio-button.jsx';
import RadioButtonV2 from './radiobuttonV2.jsx';
import Rangeslider from './rangeslider.jsx';
import Rating from './rating.jsx';
import Spinner from './spinner.jsx';
@ -56,10 +54,11 @@ import Textinput from './textinput.jsx';
import Timeline from './timeline.jsx';
import Timer from './timer.jsx';
import Toggleswitch from './toggleswitch.jsx';
import ToggleSwitchV2 from './toggleswitchV2.jsx';
import Treeselect from './treeselect.jsx';
import Upstatistics from './upstatistics.jsx';
import Verticaldivider from './verticaldivider.jsx';
import TimePicker from './timepicker.jsx';
import DatepickerV2 from './datepickerv2.jsx';
const WidgetIcon = (props) => {
switch (props.name) {
@ -85,8 +84,21 @@ const WidgetIcon = (props) => {
return <Container {...props} />;
case 'customcomponent':
return <Customcomponent {...props} />;
case 'datetimepickerlegacy':
return <Datepicker {...props} />;
case 'datepicker':
return <Datepicker {...props} />;
case 'datepickerv2':
return <DatepickerV2 {...props} />;
case 'timepicker':
return <TimePicker {...props} />;
case 'datetimepicker':
if (props?.version === 'v2') {
return <DateTimePickerV2 {...props} />;
}
return <Datepicker {...props} />;
case 'datetimepickerv2':
return <DateTimePickerV2 {...props} />;
case 'daterangepicker':
return <Daterangepicker {...props} />;
case 'divider':
@ -95,10 +107,9 @@ const WidgetIcon = (props) => {
return <DividerHorizondal {...props} />;
case 'downstatistics':
return <Downstatistics {...props} />;
case 'dropdownlegacy':
case 'dropdown':
case 'dropdownv2':
return <Dropdown {...props} />;
case 'dropdownV2':
return <DropdownV2 {...props} />;
case 'filepicker':
return <Filepicker {...props} />;
case 'form':
@ -126,11 +137,11 @@ const WidgetIcon = (props) => {
case 'map':
return <Map {...props} />;
case 'modal':
case 'modallegacy':
return <Modal {...props} />;
case 'multiselectlegacy':
case 'multiselect':
case 'multiselectv2':
return <Multiselect {...props} />;
case 'multiselectV2':
return <MultiselectV2 {...props} />;
case 'numberinput':
return <Numberinput {...props} />;
case 'pagination':
@ -141,10 +152,9 @@ const WidgetIcon = (props) => {
return <Pdf {...props} />;
case 'qrscanner':
return <Qrscanner {...props} />;
case 'radiobuttonlegacy':
return <RadioButton {...props} />;
case 'radiobutton':
return <RadioButtonV2 {...props} />;
case 'radiobuttonv2':
return <RadioButton {...props} />;
case 'rangeslider':
return <Rangeslider {...props} />;
case 'rating':
@ -177,10 +187,10 @@ const WidgetIcon = (props) => {
return <Timeline {...props} />;
case 'timer':
return <Timer {...props} />;
case 'toggleswitchlegacy':
return <Toggleswitch {...props} />;
case 'toggleswitch':
case 'toggleswitchv2':
return <ToggleSwitchV2 {...props} />;
return <Toggleswitch {...props} />;
case 'treeselect':
return <Treeselect {...props} />;
case 'upstatistics':

View file

@ -0,0 +1,27 @@
import React from 'react';
const TimePicker = ({ fill = '#D7DBDF', width = 24, className = '', viewBox = '0 0 49 48' }) => (
<svg
width={width}
height={width}
viewBox={viewBox}
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M16.8409 3.38078C17.725 2.49668 18.9241 2 20.1744 2H29.6029C30.8532 2 32.0524 2.49668 32.9364 3.38078C33.8205 4.26488 34.3172 5.46396 34.3172 6.71429V8.28571H15.4601V6.71429C15.4601 5.46396 15.9568 4.26488 16.8409 3.38078ZM15.4601 39.7143V41.2857C15.4601 42.5359 15.9568 43.7353 16.8409 44.6193C17.725 45.5034 18.924 46 20.1744 46H29.6029C30.8533 46 32.0524 45.5034 32.9364 44.6193C33.8205 43.7353 34.3172 42.5359 34.3172 41.2857V39.7143H15.4601Z"
fill={fill}
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M9.17438 12.9999C9.17438 10.3963 11.285 8.28564 13.8887 8.28564H35.8887C38.4922 8.28564 40.6029 10.3963 40.6029 12.9999V34.9999C40.6029 37.6035 38.4922 39.7142 35.8887 39.7142H13.8887C11.285 39.7142 9.17438 37.6035 9.17438 34.9999V12.9999ZM27.2458 16.7321C27.2458 15.6473 26.3664 14.7678 25.2815 14.7678C24.1967 14.7678 23.3172 15.6473 23.3172 16.7321V23.8035C23.3172 24.3245 23.5242 24.8241 23.8926 25.1925L28.6068 29.9068C29.374 30.6739 30.6176 30.6739 31.3848 29.9068C32.1519 29.1397 32.1519 27.896 31.3848 27.1289L27.2458 22.9899V16.7321Z"
fill="#4368E3"
/>
</svg>
);
export default TimePicker;

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" fill="none">
<path d="M1.16797 3.49935C1.16797 2.21068 2.21264 1.16602 3.5013 1.16602H10.5013C11.79 1.16602 12.8346 2.21068 12.8346 3.49935V3.64518H1.16797V3.49935Z" fill="#8E4EC6"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.16797 4.52018H12.8346V10.4993C12.8346 11.788 11.79 12.8327 10.5013 12.8327H3.5013C2.21264 12.8327 1.16797 11.788 1.16797 10.4993V4.52018ZM4.3316 6.74246C4.42958 6.52159 4.32996 6.26312 4.10909 6.16514C3.88822 6.06716 3.62974 6.16678 3.53176 6.38765L3.51393 6.42786C2.98975 7.60948 2.96823 8.95337 3.4543 10.1512L3.52629 10.3286C3.61714 10.5525 3.8723 10.6603 4.09619 10.5695C4.32008 10.4786 4.42793 10.2234 4.33707 9.99956L4.26508 9.82215C3.86829 8.84434 3.88586 7.74727 4.31376 6.78267L4.3316 6.74246ZM10.4708 6.38765C10.3729 6.16678 10.1144 6.06716 9.89352 6.16514C9.67265 6.26311 9.57303 6.52159 9.67101 6.74246L9.68884 6.78267C10.1167 7.74727 10.1343 8.84434 9.73752 9.82215L9.66553 9.99956C9.57468 10.2234 9.68252 10.4786 9.90641 10.5695C10.1303 10.6603 10.3855 10.5525 10.4763 10.3286L10.5483 10.1512C11.0344 8.95337 11.0129 7.60948 10.4887 6.42786L10.4708 6.38765ZM6.07314 6.81767C5.90229 6.64681 5.62528 6.64681 5.45442 6.81767C5.28357 6.98852 5.28357 7.26553 5.45442 7.43638L6.38258 8.36454L5.45442 9.2927C5.28357 9.46356 5.28357 9.74057 5.45442 9.91142C5.62528 10.0823 5.90229 10.0823 6.07314 9.91142L7.0013 8.98326L7.92946 9.91142C8.10032 10.0823 8.37733 10.0823 8.54818 9.91142C8.71903 9.74057 8.71903 9.46356 8.54818 9.2927L7.62002 8.36454L8.54818 7.43638C8.71903 7.26553 8.71903 6.98852 8.54818 6.81767C8.37733 6.64681 8.10032 6.64681 7.92946 6.81767L7.0013 7.74582L6.07314 6.81767Z" fill="#8E4EC6"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,5 @@
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle opacity="0.4" cx="10.5208" cy="10.5257" r="8.33333" fill="#E54D2E"/>
<path d="M11.3542 6.35872C11.3542 6.81896 10.9811 7.19206 10.5208 7.19206C10.0606 7.19206 9.6875 6.81896 9.6875 6.35872C9.6875 5.89849 10.0606 5.52539 10.5208 5.52539C10.9811 5.52539 11.3542 5.89849 11.3542 6.35872Z" fill="#E54D2E"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.0625 8.85938C9.0625 8.5142 9.34232 8.23438 9.6875 8.23438H10.5208C10.866 8.23438 11.1458 8.5142 11.1458 8.85938V14.6927C11.1458 15.0379 10.866 15.3177 10.5208 15.3177C10.1757 15.3177 9.89583 15.0379 9.89583 14.6927V9.48438H9.6875C9.34232 9.48438 9.0625 9.20455 9.0625 8.85938Z" fill="#E54D2E"/>
</svg>

After

Width:  |  Height:  |  Size: 761 B

View file

@ -0,0 +1,6 @@
<svg width="30" height="30" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M21.6653 6.00002H19.6655C19.6218 5.99949 19.5785 6.00811 19.5383 6.02533C19.4981 6.04256 19.462 6.068 19.4322 6.10002L13.0795 12.4533C12.0134 11.9656 10.8099 11.868 9.67927 12.1776C8.5486 12.4872 7.56267 13.1843 6.89377 14.1471C6.22487 15.1099 5.91554 16.2771 6.01983 17.4449C6.12412 18.6126 6.63541 19.7065 7.46434 20.5355C8.29327 21.3645 9.38712 21.8759 10.5548 21.9802C11.7224 22.0845 12.8895 21.7751 13.8523 21.1062C14.815 20.4372 15.512 19.4512 15.8216 18.3204C16.1312 17.1897 16.0336 15.9861 15.5459 14.9199L17.0924 13.38L18.379 13.8133C18.4912 13.8538 18.6123 13.8634 18.7296 13.8411C18.8468 13.8188 18.956 13.7655 19.0456 13.6866C19.1318 13.6131 19.1978 13.5188 19.2375 13.4127C19.2772 13.3065 19.2891 13.192 19.2722 13.08L19.0056 11.4666L19.4855 10.98L20.4588 11.4266C20.572 11.477 20.6971 11.4947 20.8199 11.4779C20.9427 11.461 21.0583 11.4103 21.1539 11.3313C21.2494 11.2524 21.3211 11.1484 21.3608 11.031C21.4005 10.9136 21.4067 10.7874 21.3787 10.6666L21.0387 9.45999L21.8986 8.59333C21.9342 8.56064 21.9618 8.52016 21.9791 8.47506C21.9965 8.42996 22.0031 8.38145 21.9986 8.33334V6.33335C21.9986 6.24495 21.9635 6.16017 21.901 6.09765C21.8385 6.03514 21.7537 6.00002 21.6653 6.00002ZM10.6663 18.3333C10.6663 18.531 10.6077 18.7244 10.4978 18.8888C10.388 19.0533 10.2318 19.1814 10.0491 19.2571C9.86638 19.3328 9.66533 19.3526 9.47137 19.314C9.27741 19.2754 9.09924 19.1802 8.9594 19.0404C8.81956 18.9005 8.72433 18.7223 8.68575 18.5283C8.64717 18.3344 8.66697 18.1333 8.74265 17.9506C8.81833 17.7678 8.94649 17.6117 9.11092 17.5018C9.27536 17.3919 9.46868 17.3333 9.66644 17.3333C9.93163 17.3333 10.186 17.4386 10.3735 17.6262C10.561 17.8137 10.6663 18.068 10.6663 18.3333Z"
fill="#D9D9D9"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,6 @@
<svg width="30" height="30" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M21.6653 6.00002H19.6655C19.6218 5.99949 19.5785 6.00811 19.5383 6.02533C19.4981 6.04256 19.462 6.068 19.4322 6.10002L13.0795 12.4533C12.0134 11.9656 10.8099 11.868 9.67927 12.1776C8.5486 12.4872 7.56267 13.1843 6.89377 14.1471C6.22487 15.1099 5.91554 16.2771 6.01983 17.4449C6.12412 18.6126 6.63541 19.7065 7.46434 20.5355C8.29327 21.3645 9.38712 21.8759 10.5548 21.9802C11.7224 22.0845 12.8895 21.7751 13.8523 21.1062C14.815 20.4372 15.512 19.4512 15.8216 18.3204C16.1312 17.1897 16.0336 15.9861 15.5459 14.9199L17.0924 13.38L18.379 13.8133C18.4912 13.8538 18.6123 13.8634 18.7296 13.8411C18.8468 13.8188 18.956 13.7655 19.0456 13.6866C19.1318 13.6131 19.1978 13.5188 19.2375 13.4127C19.2772 13.3065 19.2891 13.192 19.2722 13.08L19.0056 11.4666L19.4855 10.98L20.4588 11.4266C20.572 11.477 20.6971 11.4947 20.8199 11.4779C20.9427 11.461 21.0583 11.4103 21.1539 11.3313C21.2494 11.2524 21.3211 11.1484 21.3608 11.031C21.4005 10.9136 21.4067 10.7874 21.3787 10.6666L21.0387 9.45999L21.8986 8.59333C21.9342 8.56064 21.9618 8.52016 21.9791 8.47506C21.9965 8.42996 22.0031 8.38145 21.9986 8.33334V6.33335C21.9986 6.24495 21.9635 6.16017 21.901 6.09765C21.8385 6.03514 21.7537 6.00002 21.6653 6.00002ZM10.6663 18.3333C10.6663 18.531 10.6077 18.7244 10.4978 18.8888C10.388 19.0533 10.2318 19.1814 10.0491 19.2571C9.86638 19.3328 9.66533 19.3526 9.47137 19.314C9.27741 19.2754 9.09924 19.1802 8.9594 19.0404C8.81956 18.9005 8.72433 18.7223 8.68575 18.5283C8.64717 18.3344 8.66697 18.1333 8.74265 17.9506C8.81833 17.7678 8.94649 17.6117 9.11092 17.5018C9.27536 17.3919 9.46868 17.3333 9.66644 17.3333C9.93163 17.3333 10.186 17.4386 10.3735 17.6262C10.561 17.8137 10.6663 18.068 10.6663 18.3333Z"
fill="#889096"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,6 @@
<svg width="14" height="18" viewBox="0 0 14 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.4167 8.52279V3.93945H13.6667V8.52279C13.6667 8.86796 13.3868 9.14779 13.0417 9.14779C12.6965 9.14779 12.4167 8.86796 12.4167 8.52279Z" fill="#3E63DD"/>
<path d="M10.3333 7.27246V4.77246H3.66666V7.27246C3.66666 9.11341 5.15904 10.6058 6.99999 10.6058C8.84094 10.6058 10.3333 9.11341 10.3333 7.27246Z" fill="#3E63DD"/>
<path d="M0.356695 3.55858L5.98465 1.05727C6.63106 0.769973 7.36893 0.769973 8.01534 1.05727L13.6433 3.55858C13.9732 3.70521 13.9732 4.17346 13.6433 4.32009L8.01534 6.8214C7.36893 7.1087 6.63106 7.1087 5.98465 6.8214L0.356695 4.32009C0.0267722 4.17346 0.0267722 3.70521 0.356695 3.55858Z" fill="#3E63DD"/>
<path d="M8.91629 11.7726L7.59252 13.1112C7.26635 13.441 6.73364 13.441 6.40747 13.1112L5.0837 11.7726C4.8792 11.5658 4.58067 11.4777 4.30166 11.5597C1.96405 12.2471 0.333328 13.8003 0.333328 15.6063C0.333328 16.5268 1.07952 17.273 1.99999 17.273H12C12.9205 17.273 13.6667 16.5268 13.6667 15.6063C13.6667 13.8003 12.0359 12.2471 9.69833 11.5597C9.41932 11.4777 9.12078 11.5658 8.91629 11.7726Z" fill="#3E63DD"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.7 KiB

View file

@ -0,0 +1,3 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.6653 6.00002H19.6655C19.6218 5.99949 19.5785 6.00811 19.5383 6.02533C19.4981 6.04256 19.462 6.068 19.4322 6.10002L13.0795 12.4533C12.0134 11.9656 10.8099 11.868 9.67927 12.1776C8.5486 12.4872 7.56267 13.1843 6.89377 14.1471C6.22487 15.1099 5.91554 16.2771 6.01983 17.4449C6.12412 18.6126 6.63541 19.7065 7.46434 20.5355C8.29327 21.3645 9.38712 21.8759 10.5548 21.9802C11.7224 22.0845 12.8895 21.7751 13.8523 21.1062C14.815 20.4372 15.512 19.4512 15.8216 18.3204C16.1312 17.1897 16.0336 15.9861 15.5459 14.9199L17.0924 13.38L18.379 13.8133C18.4912 13.8538 18.6123 13.8634 18.7296 13.8411C18.8468 13.8188 18.956 13.7655 19.0456 13.6866C19.1318 13.6131 19.1978 13.5188 19.2375 13.4127C19.2772 13.3065 19.2891 13.192 19.2722 13.08L19.0056 11.4666L19.4855 10.98L20.4588 11.4266C20.572 11.477 20.6971 11.4947 20.8199 11.4779C20.9427 11.461 21.0583 11.4103 21.1539 11.3313C21.2494 11.2524 21.3211 11.1484 21.3608 11.031C21.4005 10.9136 21.4067 10.7874 21.3787 10.6666L21.0387 9.45999L21.8986 8.59333C21.9342 8.56064 21.9618 8.52016 21.9791 8.47506C21.9965 8.42996 22.0031 8.38145 21.9986 8.33334V6.33335C21.9986 6.24495 21.9635 6.16017 21.901 6.09765C21.8385 6.03514 21.7537 6.00002 21.6653 6.00002ZM10.6663 18.3333C10.6663 18.531 10.6077 18.7244 10.4978 18.8888C10.388 19.0533 10.2318 19.1814 10.0491 19.2571C9.86638 19.3328 9.66533 19.3526 9.47137 19.314C9.27741 19.2754 9.09924 19.1802 8.9594 19.0404C8.81956 18.9005 8.72433 18.7223 8.68575 18.5283C8.64717 18.3344 8.66697 18.1333 8.74265 17.9506C8.81833 17.7678 8.94649 17.6117 9.11092 17.5018C9.27536 17.3919 9.46868 17.3333 9.66644 17.3333C9.93163 17.3333 10.186 17.4386 10.3735 17.6262C10.561 17.8137 10.6663 18.068 10.6663 18.3333Z" fill="#889096"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Some files were not shown because too many files have changed in this diff Show more