- **Favicon**: The small icon associated with your application.
-
-
-
-
-
+
+
+
- **Page Title**: This is the text displayed next to the Favicon.
-
-
-
-
-
+
+
+
## Configuration
@@ -42,7 +36,22 @@ To enable white labelling, you'll need to go to the **Settings** from the Dashbo
- **Page Title**: Enter the text you want to display as your application's title. Preferred title length are 50-60 characters.
+
+
-
+
+
+## ToolJet Cloud
+
+If you are using ToolJet Cloud, you can enable white labelling by going to the **Settings** from the Dashboard and clicking on the `White labelling` tab. On the White labelling page, you'll be able to configure the following:
+
+- **Application Logo**: Add the URL of the image you want to use as your application logo. Preferred dimensions of the logo are: width `130px` and height `26px`.
+- **Page Title**: Enter the text you want to display as your application's title. Preferred title length are 50-60 characters.
+- **Favicon**: Enter the URL of the image you want to use as your application's favicon. Preferred dimensions of the favicon are: width `32px` and height `32px` or `16px` and height `16px`.
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/docs/docs/app-builder/import-export-apps.md b/docs/docs/app-builder/import-export-apps.md
new file mode 100644
index 0000000000..adc4eb923e
--- /dev/null
+++ b/docs/docs/app-builder/import-export-apps.md
@@ -0,0 +1,46 @@
+---
+id: importing-exporting-applications
+title: Importing and Exporting Applications
+---
+
+This documentation explains the process of exporting and importing applications in ToolJet.
+
+
+
+## 1. Exporting Applications
+
+- Navigate to the dashboard.
+- Click on the settings icon located in the top right corner of the application.
+- Click on the **Export app** button.
+
+
+
+
+
+- If you select `Export All`, all the versions of the application will be exported in JSON format. If you select `Export selected version`, only the selected version will be exported in JSON format.
+- Ticking the `Export ToolJet table schema` checkbox will also export the related ToolJet Database table schemas with your application. In this case, when you import the application in a workspace, the related ToolJet Database tables will also be created.
+
+
+
+
+
+
+
+
+
+## 2. Importing Applications
+
+- Navigate to the dashboard.
+- Click on the ellipses on the **Create new app** button and select `Import`.
+
+
+
+
+
+- After clicking on `Import`, choose the relevant JSON file that you previously downloaded during the application export process.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/contributing-guide/marketplace/marketplace-setup.md b/docs/docs/contributing-guide/marketplace/marketplace-setup.md
index 4585f13e01..a8f592845c 100644
--- a/docs/docs/contributing-guide/marketplace/marketplace-setup.md
+++ b/docs/docs/contributing-guide/marketplace/marketplace-setup.md
@@ -48,7 +48,7 @@ The use of this environment variable facilitates plugin development by enabling
Please note that the marketplace is not enabled by default. After updating the variable, restart your ToolJet instance.
-For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/category/contributing-guide)**. You can access the marketplace by navigating to the **'/integrations'** route.
+For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/contributing-guide/setup/architecture)**. You can access the marketplace by navigating to the **'/integrations'** route.
### Step 3: Installation of tooljet-cli
diff --git a/docs/docs/contributing-guide/setup/macos.md b/docs/docs/contributing-guide/setup/macos.md
index fa45e3b5e1..a42a7ccbf9 100644
--- a/docs/docs/contributing-guide/setup/macos.md
+++ b/docs/docs/contributing-guide/setup/macos.md
@@ -17,14 +17,14 @@ Follow these steps to setup and run ToolJet on macOS for development purposes. O
```bash
/bin/bash -c "(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
- 1.2 Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.2)
+ 1.2 Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1)
```bash
brew install nvm
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh
nvm install 18.18.2
nvm use 18.18.2
- npm install -g npm@9.8.2
+ npm install -g npm@9.8.1
```
1.3 Install Postgres
diff --git a/docs/docs/data-sources/airtable.md b/docs/docs/data-sources/airtable.md
index ec9b54b6d2..bd18a51bf9 100644
--- a/docs/docs/data-sources/airtable.md
+++ b/docs/docs/data-sources/airtable.md
@@ -5,9 +5,13 @@ title: Airtable
# Airtable
-ToolJet can connect to your Airtable account to read and write data.Airtable Personal Access Token is required to connect to the Airtable data source on ToolJet. You can generate the PAT by visiting [Developer Hub from your Airtable profile](https://support.airtable.com/docs/creating-and-using-api-keys-and-access-tokens#understanding-personal-access-token-basic-actions).
+ToolJet can connect to your Airtable account to read and write data. **Personal Access Token** is required to connect to the Airtable data source on ToolJet. You can generate the Personal Access Token by visiting [Developer Hub from your Airtable profile](https://support.airtable.com/docs/creating-and-using-api-keys-and-access-tokens#understanding-personal-access-token-basic-actions).
-
+
+
+
+
+
:::info
Airtable API has a rate limit, and at the time of writing this documentation, the limit is five(5) requests per second per base. You can read more about rate limits here **[Airtable API](https://airtable.com/api)**.
@@ -15,27 +19,27 @@ Airtable API has a rate limit, and at the time of writing this documentation, th
## Supported Operations
-- **[Listing records](#listing-records)**
-- **[Retrieving a record](#retrieving-a-record)**
-- **[Creating a record](#creating-a-record)**
-- **[Updating a record](#updating-a-record)**
-- **[Deleting a record](#deleting-a-record)**
+- **[List records](#list-records)**
+- **[Retrieve record](#retrieve-record)**
+- **[Create record](#create-record)**
+- **[Update record](#update-record)**
+- **[Delete record](#delete-record)**
-### Listing records
+### List records
-This query lists all the records in a table. The results are paginated and each page can have up to 100 records.
+This operation returns a list of records from the specified table.
#### Required parameters:
-- **Base ID:** To find the Base ID, first visit **airtable.com/api**. Select from the list of bases the base whose ID you'd like to find out. Example Base ID: `appDT3UCPffPiSmFd`
-- **Table name:** Enter the table name whose data you want to fetch.
+- **Base ID:** To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
+
+- **Table name:** The name of the table from which you want to fetch the records.
#### Optional parameters:
-- **Page size:** The number of records returned in each request. Must be less than or equal to 100. Default is 100.
-- **offset:** If there are more records, the response will contain an offset. To fetch the next page of records, include offset in the next request's parameters.
+- **Page size:** The number of records returned in each request. Default is 100 records.
-
+- **offset:** The offset value is used to fetch the next set of records. The offset value is returned in the response of the previous request.
Example response from Airtable:
@@ -71,15 +75,16 @@ Example response from Airtable:
}
```
-### Retrieving a record
+### Retrieve record
#### Required parameters:
-- **Base ID**
-- **Table name**
-- **Record ID**
+- **Base ID**: To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
+
+- **Table name**: The name of the table from which you want to fetch the records.
+
+- **Record ID**: The ID of the record you want to retrieve.
-
Example response from Airtable:
@@ -94,42 +99,36 @@ Example response from Airtable:
}
```
-### Creating a record
+### Create record
#### Required parameters:
-- **Base ID**
-- **Table name**
-- **Records**
+- **Base ID**: To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
-
+- **Table name**: The name of the table from which you want to fetch the records.
-#### Example Records:
+- **Records**: The records you want to create. The records should be in the form of an array of objects. Each object should have a `fields` key, which contains the fields of the record. The field names should be the same as the field names in the Airtable table.
-```json
-[
- {
- "fields": {
- "Notes": "sdfdsf",
- "Name": "dsfdsf"
+ **Example creating two records:**
+
+ ```json title="Records"
+ [
+ {
+ "fields": {
+ "Notes": "sdfdsf",
+ "Name": "dsfdsf"
+ }
+ },
+ {
+ "fields": {
+ "Notes": "note1",
+ "Name": "dsfdsf"
+ }
}
- },
- {
- "fields": {
- "Notes": "note1",
- "Name": "dsfdsf"
- }
- }
-]
-```
+ ]
+ ```
-Click on the `run` button to run the query.
-
-:::info
-NOTE: Query must be saved before running.
-:::
-
-Example response from Airtable:
+Query returns the following response when the records are created successfully:
```json
{
@@ -154,31 +153,28 @@ Example response from Airtable:
}
```
-### Updating a record
+### Update record
#### Required parameters:
-- **Base ID**
-- **Table name**
-- **Record ID**
+- **Base ID**: To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
-
+- **Table name**: The name of the table from which you want to fetch the records.
-#### Example body:
+- **Record ID**: The ID of the record you want to update.
-
+- **Body**: The fields you want to update. The fields should be in the form of an object. The field names should be the same as the field names in the Airtable table.
-
+ **Example updating a record:**
+
+ ```json title="Body"
+ {
+ "Notes": "Example Notes",
+ "Name": "change"
+ }
+ ```
-
-
-Click on the `run` button to run the query.
-
-:::info
-NOTE: Query must be saved before running.
-:::
-
-Example response from Airtable:
+Query returns the following response when the record is updated successfully:
```json
{
@@ -191,7 +187,7 @@ Example response from Airtable:
}
```
-### Deleting a record
+### Delete record
#### Required parameters:
@@ -199,15 +195,7 @@ Example response from Airtable:
- **Table name**
- **Record ID**
-
-
-Click on the `run` button to run the query.
-
-:::info
-NOTE: Query must be saved before running.
-:::
-
-Example response from Airtable:
+Query returns the following response when the record is deleted successfully:
```json
{
diff --git a/docs/docs/data-sources/smtp.md b/docs/docs/data-sources/smtp.md
index 9f09a14ac4..83e5724cca 100644
--- a/docs/docs/data-sources/smtp.md
+++ b/docs/docs/data-sources/smtp.md
@@ -48,10 +48,10 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
-
\ No newline at end of file
+
diff --git a/docs/docs/getting-started/quickstart-guide.md b/docs/docs/getting-started/quickstart-guide.md
index 6017863057..a8221cf576 100644
--- a/docs/docs/getting-started/quickstart-guide.md
+++ b/docs/docs/getting-started/quickstart-guide.md
@@ -79,11 +79,11 @@ Now, create a new table in **[ToolJet’s Database](/docs/tooljet-database/)** t
### 3. Integrate Data
To display employees in the application, we first need to fetch data from the database using a query:
-- Click on the Add button in the **[Query Panel](/docs/app-builder/query-panel/)**, select ToolJet Database
-- Rename the query to `getEmployees`
-- Choose `employees` as Table name, List rows as Operations
-- Toggle Run this query on application load? to automatically run the query when the app starts
-- Click on Run to fetch data
+- Click on the Add button in the **[Query Panel](/docs/app-builder/query-panel/)**, select ToolJet Database.
+- Rename the query to `getEmployees`.
+- Choose `employees` as Table name, List rows as Operations.
+- Toggle Run this query on application load? to automatically run the query when the app starts.
+- Click on Run to fetch data.
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+## Setting up GitSyncing with GitLab
+
+:::caution
+- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos.
+- Only Admins have the permission to configure the GitSync feature on workspace level.
+- The default branch name for the git repository should be `master`.
+:::
+
+
+
+### Step 1: Create a new repository
+
+Create a new repository on GitLab. The repository can be public or private. You can also use an existing repository. **Make sure that the repository is empty**.
+
+
+
+
+
+
+
+
+
+### Step 2: Obtain the repository URL
+
+Obtain the **SSH URL** of the repository. On GitLab, you can obtain the URL by clicking on the **Clone** button and selecting the **SSH** option.
+
+
+
+
+
+
+
+
+
+### Step 3: Configure the GitSync feature on ToolJet
+
+Go to the **Workspace settings**, and click on the **Configure git** tab.
+
+
+
+
+
+Enter the **SSH URL** of the repository (obtained in Step 2) in the **Git repository URL** field. Click on the **Generate SSH key** button, and copy the SSH key that is generated. The SSH key is used to authenticate ToolJet with the gitlab repository.
+
+
+
+
+
+
+
+
+
+### Step 4: Deploy the SSH key to GitLab repository
+
+From the top-left corner, click on the user avatar and select the **Edit Profile** option. Navigate to the **SSH Keys** tab and click on the **Add new key** button.
+
+
+
+
+
+Paste the SSH key that you copied in Step 3 in the **Key** field, enter a title for the SSH key in the **Title** field, set **Usage type** to **Authenticatioin & signing**, and set the ***Expiration date(optional)**. Finally, click on the **Add key** button.
+
+
+
+
+
+
+
+
+
+
+
+### Step 5: Finish the GitSync configuration on ToolJet
+
+Go back to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message.
+
+
+
+
+
+
+
+
+
+
+
+## Enable/Disable GitSync
+
+To enable or disable the GitSync feature, go to the **Configure git** tab on the **Workspace settings** page, and toggle on/off the **Connect** switch. This is only available if the GitSync feature is configured.
+
+**When enabled**
+
+On clicking the GitSync button, the users will be able to commit changes to the git repository.
+
+**When disabled**
+1. For non-admin users: The users will not be able to commit changes to the git repository. They will see a dialogue box that the GitSync feature is not configured and they need to contact the admin to configure it.
+2. For admin users: The users will see a dialogue box with a link to configure the GitSync feature.
+
+
+
+
+
+
+
+
+
+
+
+## Delete GitSync configuration
+
+To delete the GitSync configuration, go to the **Configure git** tab on the **Workspace settings** page, and click on the **Delete configuration** button. This will delete the SSH key from the ToolJet configuration and the GitSync feature will be disabled.
+
+**Note:** Deleting the GitSync configuration will not delete the apps from the git repository. The apps will still be available in the git repository in the same state as they were before the GitSync configuration was deleted.
+
+
+
+
+
+
+
+
+
+## Git repo
+
+Once the initial commit is made, you can see the app files in the git repository. The repository will have the individual app folders and a **.meta** folder. The app folders will be named as the app name and will have the respective **JSON** file of the application. The **.meta** folder will have the `meta.json` file that contains the meta information of each application synced to git repo.
+
+The **meta.json** file holds information about apps such as the **App name**, **last commit message**, **last commit user**, **last commit date**, **version name**, and **version id**.
+
+
+
+
+
+
+
+
+
+## Pushing changes to git repo
+
+Once the GitSync feature is configured, you can start pushing changes to the git repository.
+
+
+
+### App creation
+
+When you create a new app, you will see an option to select the `Commit changes`. If you select the `commit changes` option, the changes will be committed to the git repository.
+
+:::info
+If the app name is same as the name of the existing app in the git repo, it will overwrite the existing app in the git repo.
+:::
+
+
+
+
+
+Selecting the `Commit changes` option will create a new commit in the git repository. The commit message will be `App creation` and the author will be the user who created the app.
+
+
+
+
+
+
+
+
+
+### App rename
+
+Whenever an app is renamed, the changes will be automatically committed to the git repository. The commit message will be `App is renamed` and the author will be the user who renamed the app.
+
+
+
+
+
+
+
+
+
+### App updates
+
+Whenever a user makes a change in an app, they can make a commit to the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to enter the commit message. The user can enter the commit message and click on the **Commit changes** button to commit the changes to the git repository. Along with the commit message, the user can also see the connnected **Git repo URL** and the **last commit details**.
+
+**Last commit details** helps the user to know the last commit message, author, date, and time. This helps the user to know the last commit details and make the commit message accordingly.
+
+
+
+
+
+Once the changes are committed, the user can see the commit message, author, and date in the git repository.
+
+
+
+
+
+
+
+
+
+### App deletion
+
+Whenever a user deleted an app from the workspace, the app will not be deleted from the git repository. The app will be available in the git repository in the same state as it was before the app was deleted.
+
+
+
+
+
+### App version update
+
+When a user creates a new version of an app, there will be an option to select the `Commit changes`. If you select the `commit changes` option, the new version of the app will be committed to the git repository.
+
+
+
+
+
+The **JSON** file in the app folder will be replaced with the new version of the app, the **meta.json** file in the **.meta** folder gets updated with the new version id and version name. The commit message will be `Version creation` and the author will be the user who created the new version of the app.
+
+
+
+
+
+
+
+
+
+
+
+## Pulling changes from git repo
+
+You can configure the GitSync feature on another workspace to pull the changes from the git repository. To configure the GitSync feature on another workspace, follow the steps mentioned in the [Setting up GitSyncing with GitLab](#setting-up-gitsyncing-with-gitlab) section.
+
+Once the GitSync feature is configured, go to the ToolJet dashboard and click on the three dots on the right side of the **Create new app** button. Click on the **Import from git repository** option.
+
+
+
+
+
+On clicking the **Import from git repository** option, a modal will open with the dropdown to select the app to be imported from the git repository. Once the app is selected, the app name and the last commit will be displayed. Click on the **Import app** button to import the app from the git repository.
+
+:::caution
+- The app imported from the git repository cannot be edited.
+- The app imported from the Git repository should have a unique name. If the app's name is the same as that of an existing app in the workspace, the user will need to either rename the existing app or delete it to successfully import another app with the same name.
+- Workspace constants are not synced with the git repository. After pulling the app, if the app throws an error, the user will need to manually add the workspace constants.
+:::
+
+
+
+
+
+
+
+### Checking for updates
+
+You can check for updates in the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to **Check for updates**. Click on the **Check for updates** button to check for updates in the git repository. If there are any updates, you will see the details of the updates such as commit message, author, and the date in the modal. Click on the **Pull changes** button to pull the changes from the git repository.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/how-to/access-users-location.md b/docs/docs/how-to/access-users-location.md
index 1b7cfd7194..02a6bed322 100644
--- a/docs/docs/how-to/access-users-location.md
+++ b/docs/docs/how-to/access-users-location.md
@@ -51,9 +51,9 @@ To protect the user's privacy, Geolocation API requests permission to locate the
- Now, go to the **Advanced** tab and enable the `Run query on page load?` option. Enabling this option will run this javascript query every time the app is opened by the user and the query will return the location
-- **Save** the query and hit the fire button
+- **Save** the query and hit the **Run** button
-- As soon as you hit the fire button, the browser will prompt you to allow the permission to share the location access to ToolJet app. You'll need to **allow** it to return the location data
+- As soon as you hit the **Run** button, the browser will prompt you to allow the permission to share the location access to ToolJet app. You'll need to **allow** it to return the location data
diff --git a/docs/docs/how-to/bulk-update-multiple-rows-in-table.md b/docs/docs/how-to/bulk-update-multiple-rows-in-table.md
index f518b117ac..8026034e79 100644
--- a/docs/docs/how-to/bulk-update-multiple-rows-in-table.md
+++ b/docs/docs/how-to/bulk-update-multiple-rows-in-table.md
@@ -1,66 +1,58 @@
---
id: bulk-update-multiple-rows
-title: Bulk update multiple rows in table
+title: Bulk Update Multiple Rows in Table
---
-# Bulk update multiple rows in table
+For the purpose of this guide, it's presumed that you've already established a successful connection to your data source. We'll use PostgreSQL for this example, but you can adjust the queries based on the SQL database that you are using.
-Currently, the data sources in ToolJet have operation for **bulk update(GUI mode)** but that only works for changes made in the single row. We will soon be adding a new operation for bulk updating the multiple rows but for now we can bulk update multiple rows by creating a Custom JS query.
+## 1. Create a Query to Get the Data
-In this guide, We have assumed that you have successfully connected the data source. For this guide, we will be using the PostgreSQL data source as an example database. Currently, this workaround can be used only for PostgreSQL and MySQL.
-
-## 1. Create a query to get the data from the database
-
-- Create a postgresql query in **SQL mode** and enter
+- Create a PostgreSQL query in SQL mode, rename it to *users* and enter the below code.
```sql
-SELECT * FROM tooljet // replace tooljet with your table name
+SELECT * FROM
// *replace
with your table name*
+```
+- Enable the `Run the query on application load?` option to execute the query automatically when the application starts.
+- Click on the **Run** button to fetch the data from the database.
+
+
+
+
+
+
+## 2. Display the Data on the Table
+
+- Drag and drop a **Table** component onto the canvas from the components library on the right.
+- Click on the Table component to open its properties on the right sidebar.
+- To populate the Table with the data returned by the query, add the below code under the `Data` field of the Table:
+```js
+{{queries.users.data}}
```
-- Hit **Run** to fetch the data from the database
-
-
-
-
+
-## 2. Display the data on the table
+## 3. Make the Columns Editable
-- Go to the **Components** library on the right and drag a **Table** component onto the canvas
-- Click on the handle of the **Table** component to open its properties on the right sidebar
-- Populate the table with the data from the query by entering **`{{queries..data}}`** in the **Data** field
+- Under the Columns accordion, click on the column name that you want to make editable.
+- On clicking the column name, a new section will open. Enable the toggle for `Make editable` to make the column editable.
-
-
-
-
-
-## 3. Make the columns editable
-
-- Under the **Columns** accordion, click on the column name that you want to make editable
-- On clicking the column name, a new section will open. Enable the toggle for **Make editable** to make the column editable
-
-
-
-
-
+
## 4. Enable Multiple Row Selection
-- Under the **Row Selection** accordion, enable the **Allow Selection**, **Highlight Selected Row**, and **Bulk Selection** option
+- Under the Row Selection accordion, enable the `Allow Selection`, `Highlight Selected Row`, and `Bulk Selection` option.
-
-
-
+
## 5. Create a Custom JS query
-- Create a new Run Javascript query and use the code below to generate the SQL query for updating multiple rows.
+- Create a new Run Javascript query and use the code below to generate the SQL query for updating multiple rows. The query will be named as *runjs1* by default.
```js
const uniqueIdentifier = "id"
@@ -80,54 +72,50 @@ const sql = cols.map((column) => {
return sql
```
-:::info
-Here the **Unique identifier** is **id**, this is the column name that is used to identify the row in the database.
-Update the **Unique identifier** if you are using a different column name.
-Update **table1** with the name of the table you are using.
-:::
+
+Here the unique identifier is **id** and Table component's name is **table1**. You can update the unique identifier if you are using a different column as a unique identifier. You can also update the Table name if you have renamed it, the default name is *table1*.
+
-
-
-
+
-## 6. Create an Update query
+## 6. Create an Update Query
-- Create a postgresql query in **SQL mode** and rename it as **update**:
+- Create a PostgreSQL query in SQL mode and rename it to *update*:
```sql
{{queries.runjs1.data.join(' ')}}
```
-- This query will run the SQL query generated by the runjs1 query.
+- This query will run the SQL query generated by the *runjs1* query.
-
-
-
+
-## 7. Adding event handlers to execute queries in sequence
-
-- Edit the **Table** component and add the event handler for **Save Changes** event so that whenever a user will edit the table and hit the **Save Changes** button the runjs1 query will run.
-- Add **loading state** to table so that whenever the **users** or **update** query is running the table will show a loading state.
+## 7. Adding Event Handlers to Execute Queries in Sequence
+- Edit the Table component and add an event handler for `Save Changes` event so that whenever a user will edit the Table and hit the Save Changes button the *runjs1* query will run.
+- Optionally, add loading state to the Table by clicking on `fx` next to the `Loading state` property.
+- Use the below code to show the loading state whenever a query is getting executed.
```js
-{{queries.users.isLoading || queries.update.isLoading}} // add this in the loading state field of the table
+{{queries.users.isLoading || queries.update.isLoading}}
```
-
-
-
+
-- Now, go to the **runjs1** query and add a **Event** to run update query for **Query Success** Event. This will run the update query whenever the runjs1 query will be run.
+- Now, go to the *runjs1* query and add an event to run the *update* query for Query Success event. This will run the *update* query after the *runjs1* query is successfully executed.
-
-
-
+
-- Finally, go to the **update** query and add a **Event** to run the users query for **Query Success** Event. This will refresh the table whenever the update query will be run.
\ No newline at end of file
+The data needs to reload once the *update* query runs since we want the Table component to be populated with the updated data.
+
+- Add a new event handler in the *update* query.
+- Select Query Success as the Event and Run Query as the Action.
+- Select *users* as Query.
+
+This will refresh the table whenever the *update* query will be run.
\ No newline at end of file
diff --git a/docs/docs/how-to/conditionally-format-table.md b/docs/docs/how-to/conditionally-format-table.md
new file mode 100644
index 0000000000..a5d335b648
--- /dev/null
+++ b/docs/docs/how-to/conditionally-format-table.md
@@ -0,0 +1,131 @@
+---
+id: conditionally-format-table
+title: Conditional Formatting in Table
+---
+
+Conditional formatting enhances the visual representation of data by allowing you to dynamically adjust the appearance of cells in table component based on specific conditions. This how-to guide will guide you through the process of implementing advanced conditional formatting for text color and background color in a Table component.
+
+## Create a New Application and Set Up Data Source
+
+1. Create a new application and add a Table component to the canvas.
+
+2. Open the Query Panel at the bottom and click on the `+ Add` button.
+
+3. Choose REST API as your data source and set the method to GET.
+
+4. Enter the following URL as REST API endpoint:
+ ```bash title="REST API Endpoint"
+ https://fakestoreapi.com/products
+ ```
+
+5. Click on the **Preview** button to view the data. Execute the query by clicking on the **Run** button.
+
+
+
+
+
+## Display Data on the Table
+
+1. Hide the Query Panel and click on the Table component to open its configuration panel.
+
+2. Under **Table Data**, enter the following code:
+ ```js title="Table Data"
+ {{queries.restapi1.data}}
+ ```
+
+
+
+
+
+## Enabling Conditional Formatting
+
+1. Go to the **Columns** property of the Table component.
+
+2. Select the column for which you want to enable conditional formatting (e.g., category).
+
+3. If the column type is set to `Default` or `String`, you can set the conditional formatting for **text color** and **cell background color**.
+
+ **Note**: Only `cellValue` and `rowData` can be used as identifiers for conditional formatting.
+
+
+
+
+
+## Conditional Formatting using Cell Value
+
+### Example 1: Changing Text Color Based on Cell Value
+
+1. Select the `Rate` column which has a column type of `Default`/`String`. This column contains the rating of each product on a scale of 1 to 5.
+
+2. Under the **Text Color** propert, enter the following condition:
+
+ ```js
+ {{cellValue < 2 ? 'red' : cellValue > 2 && cellValue < 3 ? 'Orange' : 'green'}}
+ ```
+
+ The above condition will change the text color to red if the cell value is less than 2, orange if the cell value is greater than 2 and less than 3, and green if the cell value is greater than 3.
+
+
+
+
+
+
+### Example 2: Changing Cell Background Color Based on Cell Value
+
+- Select the `Rate` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{cellValue >= 4 ? 'lightgreen' : cellValue >= 3 ? 'lightyellow' : 'lightcoral'}}
+ ```
+
+ The above condition will change the cell background color to lightgreen if the cell value is greater than or equal to 4, lightyellow if the cell value is greater than or equal to 3, and lightcoral if the cell value is less than 3.
+
+
+
+
+
+## Conditional Formatting using Row Data
+
+### Example 1: Changing Text Color Based on Row Data
+
+- Select the `Title` column, enter the following condition under the **Text Color** property:
+
+ ```js
+ {{rowData.price > 50 ? '#D9534F' : (rowData.rating.rate >= 4 ? '#5CB85C' : rowData.rating.rate >= 3 ? '#F0AD4E' : '#D9534F' )}}
+ ```
+
+ The above condition will change the text color of the `Title` based on the value of the `price` and `rating` columns. If the value in the `price` column is greater than 50, the text color will be red. If the value in the `rating` column is greater than or equal to 4, the text color will be green. If the value in the `rating` column is greater than or equal to 3, the text color will be yellow. Otherwise, the text color will be red.
+
+
+
+
+
+### Example 2: Changing Cell Background Color based on Row Data
+
+- In this example, we will change the cell background color of the `Title` column based on the category of the product.
+
+- Select the `Title` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{rowData.category === "electronics" ? 'cyan' : rowData.category === "jewelery" ? 'pink' : 'lightgray'}}
+ ```
+
+ The above condition will change the cell background color of the `Title` column based on the value of the `category` column. If the value in the `category` column is `electronics`, the cell background color will be cyan. If the value in the `category` column is `jewelery`, the cell background color will be pink. Otherwise, the cell background color will be lightgray.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+By following these steps, you can implement advanced conditional formatting for text color and cell background color in your Table component. Experiment with different conditions and color combinations to create visually appealing and informative tables in your applications.
+
diff --git a/docs/docs/how-to/delete-multiple-rows-table.md b/docs/docs/how-to/delete-multiple-rows-table.md
index a14e35bd67..775c961995 100644
--- a/docs/docs/how-to/delete-multiple-rows-table.md
+++ b/docs/docs/how-to/delete-multiple-rows-table.md
@@ -1,63 +1,58 @@
---
id: delete-multiple-rows
-title: Delete multiple rows in table
+title: Delete Multiple Rows in a Table
---
-The table component in the ToolJet has the option for bulk selection of rows that can have various use cases such as **updating** or **deleting** records. However, the datasources does not support bulk delete or bulk update operations.
+This guide explains how to delete multiple rows from a table, assuming you've already connected to a data source. We'll use PostgreSQL for this example, but you can adjust the queries based on the SQL database that you are using.
-In this guide, we will learn how we can delete multiple rows in a table. We have assumed that you have successfully connected the data source. For this guide, we will be using the PostgreSQL data source as an example database, currently, this workaround can be used only for PostgreSQL and MySQL.
+## 1. Create a Query to Fetch the Data from the Database
-## 1. Create a query to fetch the data from the database
+- Create a new query and name it *getRecords*.
+- Select SQL mode and enter the following query:
-Create a new query, name it `getRecords` and use SQL mode:
```sql
SELECT * FROM tooljet // replace tooljet with your table name
```
-
-
-
+- Enable the `Run the query on application load?` option to execute the query automatically when the application starts.
+
+
-Enable the **Run the query on application load?** option. This will ensure that the query is executed when the application is loaded.
+## 2. Populating the Table with Data
-## 2. Load the data on the table
-
-Now, we will load the data on the table. For this, we will use the `getRecords` query that we created in the previous step. Drag the table component from the right sidebar and drop it on the canvas.
-
-On table properties, go to the table data property and set the value to `{{queries.getRecords.data}}`. This will load the data from the `getRecords` query on the table.
-
-Run the query and you should see the data loaded on the table.
-
-
-
-
+- Drag and drop a **Table** component on the canvas.
+- In Table properties, go to the `Data` property and set the value to `{{queries.getRecords.data}}`.
+- Now if you run the *getRecords* query, the returned data will be loaded in the Table component.
+
+
-## 3. Enable bulk row selection on table
+## 3. Enable Bulk Row Selection on Table
-Now, we will enable the bulk row selection on the table. For this, go to the table properties and enable the **Bulk selection** option. Enabling this option will allow you to select multiple rows on the table. This option is disabled by default.
+- Go to the Table properties and enable the `Bulk selection` option.
+- Enabling this option will allow you to select multiple rows on the table.
-
-
-
+
-## 4. Create a custom javascript query
+## 4. Create a Custom JavaScript Query
-Now, we will create a custom javascript query that will **generate a SQL statement** to delete the selected rows from the table component based on a list of selected IDs, assuming the IDs are stored in the **id** column and that the name of the table component is **table1**. The actual database name should be replaced with **tooljet** as indicated in the SQL statemnent in the code below:
+- Create a new Run Javascript code query. It will be named *runjs1* by default.
+- Enter the following code:
```js
const uniqueIdentifier = "id";
+
const idsToDelete = Object.values(components.table1.selectedRows).map(dataUpdate => dataUpdate[uniqueIdentifier]);
const idsString = idsToDelete.map(id => `'${id}'`).join(', ');
@@ -67,85 +62,70 @@ const SQL = `DELETE FROM tooljet WHERE ${uniqueIdentifier} IN (${idsString});`;
return SQL;
```
-If you click on the **Preview** button, you should see the SQL statement generated by the query:
+The above code generates a SQL query that deletes rows from the database table where the `id` field matches the selected IDs in ToolJet's Table component.
-
+- Click on the **Preview** button to see the SQL statement generated by the query.
-
+
+
+
+*If you're using a different column as the unique identifier, feel free to update the code accordingly. You can also update the Table name if you have renamed it, the default name is *table1*.*
+
+- Select a few rows on the Table component and then Preview the SQL query generated by the *runjs1* query.
+
+
+
-Now, let's select a few rows on the table and then preview the SQL query generated by the javascript query:
-
-
-
-
-
-
-
-
-
-## 5. Create a new query to delete the rows
-
-Now, we will create a new query to delete the rows from the table. Create a new query, name it `delete` and use SQL mode:
+## 5. Create a New Query to Delete the Rows
+- Create a new query, name it `delete`, and select SQL mode.
+- Enter the following code:
```sql
-{{queries.runjs1.data}} // replace runjs1 with the name of the javascript query
+{{queries.runjs1.data}}
```
-In this query, we are dynamically loading the SQL statement generated by the javascript query.
-
-
-
-
+In this query, we are dynamically loading the SQL statement generated by the JavaScript query.
+
+
-## 6. Add a button to delete the selected rows
+## 6. Add a Button to Delete the Selected Rows
-Now, we will add a button to delete the selected rows from the table. Drag the button component from the right sidebar and drop it on the canvas. Edit its properties and set the **Button text** to **Delete**.
-
-Add a new **Event** to the button on **On click** event to trigger the **Run Query** action and select the `runjs1` query that we created in the previously.
-
-
-
-
+- Drag and drop a **Button** component on the canvas.
+- Edit its properties and set the `Button text` property to "Delete selected".
+- Add a new **Event** to the button.
+- Select On click as the Event, Run Query as the Action, and *runjs1* as the Query.
+
+
-
-
-Optionally, we can add a loading state to the button whenever the `delete` or `getRecords` query is running:
+- Optionally, we can add a loading state to the Button whenever the *delete* or *getRecords* query is running:
```js
{{queries.delete.isLoading || queries.getRecords.isLoading}}
```
-Now, whenever you click on the button, the javascript query will generate a SQL statement to delete the selected rows from the table but to delete the rows from the database, we need to add event handler to the **runjs1** query to trigger the **delete** query whenever the `runjs1` query is **executed and successfull**.
-
-
-
-
+- Add a new **Event** to the *runjs1* query.
+- Select Query Success as the Event, Run Query as the Action and *delete* as the Query.
+
+
-
+Now, whenever you click on the Button component, the *runjs1* query will run and generate a delete SQL statement with selected rows on the table. Once the *runjs1* query executes, the *delete* query will execute and delete the rows from the database.
-Now, whenever you click on the button, the javascript query will generate a delete SQL statement with selected rows on the table and the `delete` query will delete the rows from the database.
-
-Similarly, you can add an Event to the **delete** query to trigger the **getRecords** query whenever the `delete` query is executed and successful. This will ensure that the table is updated with the latest data from the database.
-
-
-
-
+- Add a new **Event** to the *delete* query.
+- Select Query Success as the Event, Run Query as the Action and *getRecords* as the Query.
+
+
-
-
-## 7. Preview the application
-
-The application is now ready. Click on the **Preview** button on the topbar of the app builder to preview the application.
\ No newline at end of file
+By implementing this, we are ensuring that every time rows are deleted, the Table component will automatically refresh to display the most recent data fetched from the database.
\ No newline at end of file
diff --git a/docs/docs/how-to/import-external-lib-py.md b/docs/docs/how-to/import-external-lib-py.md
index 7c805bcef6..6dc70b740a 100644
--- a/docs/docs/how-to/import-external-lib-py.md
+++ b/docs/docs/how-to/import-external-lib-py.md
@@ -1,98 +1,87 @@
---
id: import-external-libraries-using-runpy
-title: Import external libraries using RunPy
+title: Import External Libraries Using RunPy
---
ToolJet allows you to utilize python packages in your app by importing them using the [RunPy query](/docs/data-sources/run-py).
-In this how-to guide, we will import a few packages and use it in the application.
+In this how-to guide, we will import a few packages and use them in the application.
:::caution Unsupported modules
-The modules that are not currently supported in Pyodide are those that have C or C++ extensions that rely on system libraries. These modules cannot be used in Pyodide because it runs in a web browser, which does not have access to the underlying system libraries that the C or C++ extensions rely on. Additionally, Pyodide uses a version of Python that has been compiled to WebAssembly, which does not support the same system calls as a regular version of Python. Therefore, any module that requires access to system libraries or system calls will not work in Pyodide.
+Modules with C/C++ extensions needing system libraries won't work in Pyodide, as it runs in a web browser without system library access. Pyodide, based on WebAssembly-compiled Python, also doesn't support certain system calls.
:::
-- Create a new application and then create a new RunPy query from the query panel.
-
+- Start by creating a new application in ToolJet.
+- From the Query Panel, add a new RunPy query - it will be named *runpy1* by default.
+
+
-
+- Use micropip to install packages like Pandas and NumPy. **Run** the query to complete installation.
-- Let's write some code for importing packages. We will first import the micropip which is a package installer for Python and then we will install the `Pandas` and `NumPy` using micropip. **Run** the query to install the packages.
- ```python
- import micropip
- await micropip.install('pandas')
- await micropip.install('numpy')
- ```
+```python
+import micropip
+await micropip.install('pandas')
+await micropip.install('numpy')
+```
-
-
+
+
-
-
-:::tip
-Enable the **Run this query on application load?** option to make the packages available throughout the application.
-:::
+- Enable `Run this query on application load?` to make these packages available every time the application loads.
-## Examples
+## Generating Random Numbers with NumPy
-### Array of random numbers of using NumPy
+- Create a RunPy query using NumPy's random module to generate random numbers.
-- Let's create a **RunPy** query that will use **random** module from the **NumPy** package and the query will generate array of random numbers.
- ```python
- from numpy import random
-
- x = random.binomial(n=10, p=0.5, size=10)
-
- print(x)
- ```
-
-
+*You can check the output on the browser's console.*
-:::info
-You can check the output on the browser's console.
-:::
+## Parse CSV data
-### Parse CSV data
+- Create a RunPy query to parse CSV data using `StringIO`, `csv`, and `Pandas` module.
-- Let's create a RunPy query that will parse the data from the csv file. In this query we will use `StringIO`, `csv`, and `Pandas` module.
- ```python
- from io import StringIO
- import csv
- import pandas as pd
+```python
+from io import StringIO
+import csv
+import pandas as pd
- scsv = components.filepicker1.file[0].content
+scsv = components.filepicker1.file[0].content
- f = StringIO(scsv)
- reader = csv.reader(f, delimiter=',')
+f = StringIO(scsv)
+reader = csv.reader(f, delimiter=',')
- df = pd.DataFrame(reader)
+df = pd.DataFrame(reader)
- print(df.info())
- print(df)
- ```
-
-
+print(df.info())
+print(df)
+```
+
+
-
-
-- Add a file picker component on the canvas and set a event handler for **On file loaded** event to **Run Query** that we created for parsing the data.
-
+- Add a **File Picker** component on the canvas
+- Select `On File Loaded` as the Event and Run Query as the Action.
+- Select the query we just created as the Query.
+
+
-
-
-- Finally, let's load a csv file on the file picker and check the output by the RunPy query on the browser console.
-
+- Finally, load a csv file on the File Picker component, **Run** related RunPy query and check the output on the browser console.
+
-
-
+
\ No newline at end of file
diff --git a/docs/docs/how-to/print-multitabs.md b/docs/docs/how-to/print-multitabs.md
new file mode 100644
index 0000000000..750d663b05
--- /dev/null
+++ b/docs/docs/how-to/print-multitabs.md
@@ -0,0 +1,238 @@
+---
+id: print-multi-tabs-report
+title: Print data from multiple tabs
+---
+
+
+In this guide, we will learn how to print data from multiple tabs in ToolJet. This will be useful when you want to print an invoice or a report from your ToolJet application. For example, a tooljet app that has a set of tabs for each invoice and you want to print all the tabs in one go.
+
+
+## UI of the app
+
+Build an app with a set of tabs for each record. Each tab will have a set of fields to display the invoice details. In the example below, we have tabs component and each tab has a set of fields to display the record details.
+
+
+
+**Dropdown**: For selecting a specific patient whose data user want to load in the tabs.
+
+**Tabs**: Each tab represents different type of medical record for the selected patient. For this app, we have 5 tabs for each patient. Each tab has a id starting from 0 to 4.
+
+**Button**: Clicking on the button will print the data from all the tabs. The button has two events, the details for which we will share later in this guide.
+
+
+
+
+
+
+
+## Load data from database
+
+
+
+For this app, we are using tooljet database with table name `patient_data`. We created a query called `getPatientList` to fetch data from the database.
+
+
+
+
+
+
+
+Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step.
+
+## Printing data from multiple tabs
+
+To print data from multiple tabs, we will create few javascript queries. Using event handlers, we will run these javascript queries in a sequence to print data from all the tabs.
+
+
+
+Before we start creating the javascript queries, we need to add a few events to the button component:
+
+| Event | Action | Description |
+|:--- |:--- |:--- |
+| `On click` | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. |
+| `On click` | Run query | Select the query named `viewTabs` to run when the button is clicked. |
+
+**Note**: We will create the `viewTabs` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+### viewTabs query
+
+The `viewTabs` query is a javascript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. he query will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 5.
+
+```js title="viewTabs"
+if ((variables?.tabIndex ?? undefined) == undefined) {
+ await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set
+} else if (parseInt(variables.tabIndex) < 5){
+ await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1
+}
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+For the first Query Success event, we will add a `Control component` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true, i.e. if the tabIndex is less than 5. This action will control the `Tabs` component to `Set current tab` to `{{variables.tabIndex}}`. This will set the current tab to the tab with id stored in the `tabIndex` variable, i.e. it will set the current tab to the tab whose id got recently stored in the tabIndex variable via the viewTabs query.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+For the second Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true. The query for this event handler will be `getTabsHTML`. We will also add a `debounce` of `100` milliseconds to this event handler.
+
+**Note:** we will create the `getTabsHTML` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+For the third Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) === 5}}` is true. The query for this event handler will be `printPDF`. This action will only run when the `tabIndex` is equal to 5, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration.
+
+**Note:** we will create the `printPDF` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+Now that we have created the `viewTabs` query, we can go to the [Download](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs) button and add the `viewTabs` query to the `On click` event handler.
+
+### getTabsHTML query
+
+The `getTabsHTML` is javascript query that will get the html of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the html of all the tabs in the form of an array.
+
+```js title="getTabsHTML"
+actions.setVariable( // set tabsHtml variable
+ "tabsHtml",
+ [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable
+ ((variables?.tabIndex ?? -1) > 0
+ ? `
` // this will help to print data from all the tabs in one go
+ : "") +
+ document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab
+ .innerHTML +
+ "
", // add the html of the current tab to the tabsHtml variable
+ ])
+);
+```
+
+
+
+**This query will have 1 event:**
+
+#### 1. Query Success:
+
+This event will have an action to `Run Query` named `viewTabs`. This will run the `viewTabs` query after the `getTabsHTML` query is successfully executed.
+
+
+
+
+
+
+
+Now that we have created the `getTabsHTML` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#2-query-success) query and add the `getTabsHTML` query to the `Query Success` event handler.
+
+
+
+### printPDF query
+
+The `printPDF` query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs.
+
+```js title="printPDF"
+var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable
+
+var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing
+
+var styles = document.querySelectorAll('link, style');
+var stylesHtml = "";
+for (var i = 0; i < styles.length; i++) {
+ stylesHtml += styles[i].outerHTML;
+} // gather styles from the current page
+
+stylesHtml += ''; // add landscape orientation to the page
+
+winPrint.document.write(
+ "" +
+ stylesHtml +
+ "" +
+ ``
+); // add styles and logo to the page
+
+for (var j = 0; j < printContents.length; j++) {
+ winPrint.document.write(printContents[j]);
+} // add html of all the tabs to the page
+
+winPrint.document.write(""); // Document Finalization and Printing
+winPrint.document.close();
+winPrint.focus();
+winPrint.print();
+winPrint.close();
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsIndex`. This will unset the `tabsIndex` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsHtml`. This will unset the `tabsHtml` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+This event will have an action to `Control component`. This will control the `Tabs` component to `Set current tab` to `{{variables.lastSelectedTab}}` after the `printPDF` query is successfully executed. This will set the current tab to the tab that was selected before the `Download` button was clicked.
+
+
+
+
+
+
+
+
+
+Now that we have created the `printPDF` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#3-query-success) query and add the `printPDF` query to the `Query Success` event handler.
+
+Finally, we can test the app by selecting a patient and clicking on the `Download` button. This will download a PDF document with the data from all the tabs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/how-to/setup-syslog.md b/docs/docs/how-to/setup-syslog.md
new file mode 100644
index 0000000000..9524c0cea5
--- /dev/null
+++ b/docs/docs/how-to/setup-syslog.md
@@ -0,0 +1,90 @@
+---
+id: setup-rsyslog
+title: Setup log file generation (Rsyslog)
+---
+
+The log file serves as a comprehensive record of audit logs, capturing crucial information about various activities within the ToolJet. Follow the guide below to set up and utilize the log file feature effectively.
+
+## Activation and Configuration
+
+### 1. Environment Variable Setup
+
+- To **activate** the log file feature, simply set the environment variable `LOG_FILE_PATH` to specify the desired path for the log file. For instance, if you want to use `rsyslog` as the log file path, set `LOG_FILE_PATH` to `rsyslog`.
+
+ ```bash
+ LOG_FILE_PATH='rsyslog'
+ ```
+
+
+
+
+
+- The log file path is relative to the home directory of the machine. For instance, if the home directory is `/home/tooljet`, the log file path will be `/home/tooljet/rsyslog`.
+
+### 2. Server Restart
+
+- After configuring the log file environment variable, it's essential to **restart the server** to initiate the log file generation process.
+
+- This step ensures that the server recognizes the new configuration and begins recording audit logs.
+
+## Log Rotation and Organization
+
+### 3. Daily Log Rotation
+
+- The log file is designed to rotate on a daily basis, creating a new log file each day. This configuration aids in efficient management and organization of audit data.
+
+### 4. Log File Path Structure
+
+- The log file path is determined by the `LOG_FILE_PATH` variable. It is crucial to understand that this path is relative to the home directory of the machine. For instance, if `LOG_FILE_PATH` is set to `rsyslog`, the resulting log file path will be structured as follows:
+
+ ```bash
+ homepath/rsyslog/{process_id}-{date}/audit.log
+ ```
+
+ - `{process_id}` is a placeholder for the unique process identifier.
+ - `{date}` represents the current date.
+
+ This structured path ensures that audit logs are organized by both process and date, simplifying traceability and analysis.
+
+
+
+
+
+### 5. Example Log Data
+
+The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata.
+
+
+Example Log file data
+
+```bash
+{
+ level: 'info',
+ message: 'PERFORM APP_CREATE OF awdasdawdwd APP',
+ timestamp: '2023-11-02 17:12:40',
+ auditLog: {
+ userId: '0ad48e21-e7a2-4597-9568-c4535aedf687',
+ organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17',
+ resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829',
+ resourceType: 'APP',
+ actionType: 'APP_CREATE',
+ resourceName: 'awdasdawdwd',
+ ipAddress: '::1',
+ metadata: {
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
+ tooljetVersion: '2.22.2-ee2.8.3'
+ }
+ },
+ label: 'APP'
+}
+```
+
+
+
+### 6. Folder Creation:
+
+The log file feature automatically creates a folder in the home path with the specified name (e.g., `rsyslog`). This folder serves as the root directory for the organized storage of audit logs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/how-to/use-axios.md b/docs/docs/how-to/use-axios.md
index a1bd6cc572..3e62a3b72e 100644
--- a/docs/docs/how-to/use-axios.md
+++ b/docs/docs/how-to/use-axios.md
@@ -3,17 +3,13 @@ id: use-axios-in-runjs
title: Use Axios in RunJS
---
-ToolJet allows you to utilize the three [libraries](/docs/data-sources/run-js#libraries) - **Moment.js**, **Lodash**, and **Axios**. In this guide, we will see a few examples on how to use **Axios** library using RunJS query.
+ToolJet supports three libraries: **Moment.js**, **Lodash**, and **Axios**. This guide focuses on using the Axios library with RunJS queries. **[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP client for making requests to your own or external servers. It supports various request types like `GET`, `POST`, `PUT/PATCH`, and `DELETE`.
-**[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP library that lets developers make requests to either their own or a third-party server to fetch data. It offers different ways of making requests such as `GET`, `POST`, `PUT/PATCH`, and `DELETE`.
+## GET Requests
-## Making Axios HTTP requests
+We'll use **[JSONPlaceholder](https://jsonplaceholder.typicode.com/)**, a free API, to demonstrate GET and PUT requests.
-In this section, you will make `GET` and `PUT` requests. You will be using a free “fake” API: **[JSONPlaceholder](https://jsonplaceholder.typicode.com/)**.
-
-### Making a GET request
-
-Create a RunJS query and copy the code below:
+- Create a RunJS query and paste the code below:
```javascript
var url = "https://jsonplaceholder.typicode.com/users/1";
@@ -23,7 +19,7 @@ var data = (await axios.get(url)).data;
return data
```
-In the code snippet, a variable url is declared which is assigned the URL of the JSON API. Then another variable is declared which sends a GET request to the JSON API. Save the query and hit Preview to view the data returned by the API.
+*This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response.*
@@ -31,9 +27,9 @@ In the code snippet, a variable url is declared which is assigned the URL of the
-### Making a POST request
+## POST Requests
-A post request is a little different because you will be passing some data in the request to the server. In the request, you will be creating a user and passing in details for that user. The code snippet for the request will look something like this:
+- Create a RunJS query and paste the code below:
```javascript
var url = "https://jsonplaceholder.typicode.com/users";
@@ -47,7 +43,8 @@ var data = axios.post(url,{
return data
```
-The Axios POST request uses an object after the request URL to define the properties you want to create for your user. Once the operation has been completed, there will be a response from the server. In the screenshot below, you can see the that it return **Status: 201** which means the request has been fulfilled and resulted in a new resource being created.
+This POST request sends user details to the server. The server's response, as shown below, includes **Status: 201** indicating successful resource creation.
+
@@ -55,8 +52,7 @@ The Axios POST request uses an object after the request URL to define the proper
-:::tip
-Check out the tutorial on **[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)** that utilizes the axios library.
-:::
+To see Axios in action in a project, check out this tutorial:
+**[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
diff --git a/docs/docs/marketplace/plugins/github.md b/docs/docs/marketplace/plugins/github.md
index 1bc4284a2d..b01bc0a872 100644
--- a/docs/docs/marketplace/plugins/github.md
+++ b/docs/docs/marketplace/plugins/github.md
@@ -3,7 +3,7 @@ id: marketplace-plugin-github
title: GitHub
---
-ToolJet can connect to GitHub account to read and write data. In order for ToolJet to access and manipulate data on GitHub, a **GitHub Personal Access Toke**n is necessary to authenticate and interact with the GitHub API.
+ToolJet can connect to GitHub account to read and write data. In order for ToolJet to access and manipulate data on GitHub, a **GitHub Personal Access Token** is necessary to authenticate and interact with the GitHub API.
diff --git a/docs/docs/setup/azure-container.md b/docs/docs/setup/azure-container.md
index 0dfb78125a..e5001e4046 100644
--- a/docs/docs/setup/azure-container.md
+++ b/docs/docs/setup/azure-container.md
@@ -79,9 +79,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/client.md b/docs/docs/setup/client.md
index a29cfb1b60..07c1cf93ce 100644
--- a/docs/docs/setup/client.md
+++ b/docs/docs/setup/client.md
@@ -107,8 +107,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/digitalocean.md b/docs/docs/setup/digitalocean.md
index 0df6ca4994..8413df78c5 100644
--- a/docs/docs/setup/digitalocean.md
+++ b/docs/docs/setup/digitalocean.md
@@ -118,8 +118,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/docker.md b/docs/docs/setup/docker.md
index 449e99e14c..322dd71dbf 100644
--- a/docs/docs/setup/docker.md
+++ b/docs/docs/setup/docker.md
@@ -153,9 +153,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
@@ -163,4 +163,3 @@ For specific issues or questions, refer to our **[Slack](https://tooljet.slack.c
-
diff --git a/docs/docs/setup/ec2.md b/docs/docs/setup/ec2.md
index 1c10b0e918..bc06e39740 100644
--- a/docs/docs/setup/ec2.md
+++ b/docs/docs/setup/ec2.md
@@ -96,9 +96,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/ecs.md b/docs/docs/setup/ecs.md
index 9a92e088a7..85fed5cdfd 100644
--- a/docs/docs/setup/ecs.md
+++ b/docs/docs/setup/ecs.md
@@ -237,9 +237,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/google-cloud-run.md b/docs/docs/setup/google-cloud-run.md
index 3034395e2f..98c2ae74b1 100644
--- a/docs/docs/setup/google-cloud-run.md
+++ b/docs/docs/setup/google-cloud-run.md
@@ -163,8 +163,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/docs/setup/helm.md b/docs/docs/setup/helm.md
index ce2632a837..799600e8a7 100644
--- a/docs/docs/setup/helm.md
+++ b/docs/docs/setup/helm.md
@@ -45,8 +45,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/docs/setup/kubernetes-aks.md b/docs/docs/setup/kubernetes-aks.md
index 6fad371369..f08d68dc3b 100644
--- a/docs/docs/setup/kubernetes-aks.md
+++ b/docs/docs/setup/kubernetes-aks.md
@@ -64,8 +64,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/kubernetes-gke.md b/docs/docs/setup/kubernetes-gke.md
index 1cbbf82210..45926f4510 100644
--- a/docs/docs/setup/kubernetes-gke.md
+++ b/docs/docs/setup/kubernetes-gke.md
@@ -90,8 +90,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/kubernetes.md b/docs/docs/setup/kubernetes.md
index 168c2cc926..4461c71e36 100644
--- a/docs/docs/setup/kubernetes.md
+++ b/docs/docs/setup/kubernetes.md
@@ -73,8 +73,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/openshift.md b/docs/docs/setup/openshift.md
index ae8f4e5bf7..553387c83b 100644
--- a/docs/docs/setup/openshift.md
+++ b/docs/docs/setup/openshift.md
@@ -79,8 +79,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/setup/tooljet-subpath.md b/docs/docs/setup/tooljet-subpath.md
index 51c8a438ad..63d557bc41 100644
--- a/docs/docs/setup/tooljet-subpath.md
+++ b/docs/docs/setup/tooljet-subpath.md
@@ -30,9 +30,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/docs/tooljet-concepts/how-to-access-values.md b/docs/docs/tooljet-concepts/access-values.md
similarity index 86%
rename from docs/docs/tooljet-concepts/how-to-access-values.md
rename to docs/docs/tooljet-concepts/access-values.md
index 021eedb41f..9b2f74ff33 100644
--- a/docs/docs/tooljet-concepts/how-to-access-values.md
+++ b/docs/docs/tooljet-concepts/access-values.md
@@ -1,23 +1,24 @@
---
id: how-to-access-values
-title: How to Access Values?
+title: Access Values
---
In ToolJet, double curly braces `{{}}` can be used to retrieve data returned by queries, access values related to components and pass custom code. You can see the list of all accessible values in the **[Inspector](/docs/how-to/use-inspector/)** tab in the left sidebar.
-
-
-
-### Accessing Values
+## Accessing Values
The **queries** keyword can be used to access data returned by queries. For example:`{{queries.getSalesData.data}}`
Similarly, the **components** keyword can be used to access data in the components and other component-related variables. For example: `{{components.table1.selectedRow.id}}`.
+
+
+
+
diff --git a/docs/docs/tooljet-concepts/actions.md b/docs/docs/tooljet-concepts/actions.md
new file mode 100644
index 0000000000..d3ed689c22
--- /dev/null
+++ b/docs/docs/tooljet-concepts/actions.md
@@ -0,0 +1,27 @@
+---
+id: actions
+title: Actions
+---
+
+In ToolJet, actions are versatile functions that can be triggered by events within an app. Based on user interaction, actions can be configured to display alerts, run queries, switch pages, and perform other tasks.
+
+
+
+## Types of Actions
+ToolJet supports a variety of actions. For instance, Show alert action displays a pop-up message, Run query executes data queries you've created, and Open webpage directs to a new webpage. Some of the other actions include navigating to another ToolJet app, managing modals, copying text to the clipboard, setting values in localStorage, and generating downloadable files from application data.
+
+
+
+
+
+
+
+
+
+## Ways to Configure Actions
+
+Actions can be triggered in response to various events, such as button presses or successful query executions. To set up actions, you can establish a **[new event](/docs/tooljet-concepts/what-are-events/)** within the configuration settings of any component or query. Alternatively, for more dynamic interactions, you can utilize a **[RunJS query](/docs/how-to/run-actions-from-runjs/)**. This approach enables action triggering based on user interactions or even at designated time intervals.
+
+
+
+Checkout all the available actions under the **[Actions Reference](/docs/actions/show-alert)** dropdown for more information.
\ No newline at end of file
diff --git a/docs/docs/tooljet-concepts/component-specific-actions.md b/docs/docs/tooljet-concepts/component-specific-actions.md
new file mode 100644
index 0000000000..71a4584e4f
--- /dev/null
+++ b/docs/docs/tooljet-concepts/component-specific-actions.md
@@ -0,0 +1,12 @@
+---
+id: component-specific-actions
+title: Component Specific Actions
+---
+
+Component Specific Actions are specialized actions that are unique to each component, meaning they can perform tasks that are specific only to that component. For instance, the **Text Input** component has its own set of specific actions like `setText` that allows us to set the value of the component. Component Specific Actions actions can be triggered in two ways: through event handlers or by executing RunJS code.
+
+
+
+
+
+Read more about how you can utilize Component Specific Actions **[here](/docs/actions/control-component/)**.
\ No newline at end of file
diff --git a/docs/docs/tooljet-concepts/what-are-components.md b/docs/docs/tooljet-concepts/components.md
similarity index 71%
rename from docs/docs/tooljet-concepts/what-are-components.md
rename to docs/docs/tooljet-concepts/components.md
index 2a3c925ee6..e7d8f185e7 100644
--- a/docs/docs/tooljet-concepts/what-are-components.md
+++ b/docs/docs/tooljet-concepts/components.md
@@ -1,42 +1,53 @@
---
id: what-are-components
-title: What Are Components?
+title: Components
---
-
Components in ToolJet serve as the building blocks for creating applications. They are pre-designed elements that you can drag and drop onto the canvas in the App-Builder. ToolJet comes with 45+ built-in components.
-
+
These components range from basic UI elements like buttons, text fields, and tables, to more complex elements like kanban, charts, and maps. By using components, you can quickly assemble a functional and visually appealing application without having to write code from scratch.
+
+
### Customizing Components
Components are highly customizable and interactive. Once you place a component on the canvas, you can easily modify its properties, styles, and behaviors through the configuration panel on the right side of the App-Builder. This allows you to make your application dynamic and responsive.
-
+
+
+
+
+
### Using Components With Data
In ToolJet, components can be easily connected to various data sources like databases, APIs, and third-party services through **[queries](what-are-queries)**. Once the data is fetched, you can bind it to components like tables, charts, and more.
-
+
+
+
+
+
## Custom Components
ToolJet allows for the creation of custom components using React. This feature is invaluable for developers who require functionalities beyond the 45+ built-in components that ToolJet offers. To create a custom component, you can drag and drop a **[Custom Component](/docs/widgets/custom-component/)** on the canvas and configure its data and code.
-
+
+
+By incorporating custom React components, you can significantly extend the capabilities of your ToolJet applications, allowing for a more tailored and unique user experience.
+
-By incorporating custom React components, you can significantly extend the capabilities of your ToolJet applications, allowing for a more tailored and unique user experience.
To explore the full list of components in ToolJet, go through the **[Component Library](/docs/widgets/bounded-box)**.
diff --git a/docs/docs/tooljet-concepts/what-are-datasources.md b/docs/docs/tooljet-concepts/data-sources.md
similarity index 76%
rename from docs/docs/tooljet-concepts/what-are-datasources.md
rename to docs/docs/tooljet-concepts/data-sources.md
index ef44dee55f..e9122353d6 100644
--- a/docs/docs/tooljet-concepts/what-are-datasources.md
+++ b/docs/docs/tooljet-concepts/data-sources.md
@@ -1,12 +1,10 @@
---
id: what-are-datasources
-title: What Are Data Sources?
+title: Data Sources
---
-
Data sources are pivotal as they enable us to fetch and send data to and from different sources including databases, external APIs, or services. Once a data source is configured, it can be shared across all apps within a workspace.
-
## Types and Management of Data Sources
@@ -14,19 +12,19 @@ Data sources are pivotal as they enable us to fetch and send data to and from di
Apart from its built-in database, ToolJet supports a range of external data sources which can be broadly categorized into databases, external APIs, and services. To manage these data sources, ToolJet provides a data source manager that can be opened by clicking on the **Data Sources** button located on the left-sidebar of the App-Builder.
-
+
-## Adding A Data Source
+## Adding a Data Source
Adding a new data source is as easy as filling out a form; users can click on the Data Sources button in the left-sidebar, navigate to the required data source, click on the corresponding **Add** button and enter the credentials.
-
+
diff --git a/docs/docs/tooljet-concepts/what-are-events.md b/docs/docs/tooljet-concepts/events.md
similarity index 84%
rename from docs/docs/tooljet-concepts/what-are-events.md
rename to docs/docs/tooljet-concepts/events.md
index dcf40febb3..6a446167fe 100644
--- a/docs/docs/tooljet-concepts/what-are-events.md
+++ b/docs/docs/tooljet-concepts/events.md
@@ -1,6 +1,6 @@
---
id: what-are-events
-title: What Are Events?
+title: Events
---
Events are used to run queries, show alerts and other functionalities based on triggers such as button clicks or query completion. Events can be chained together to run a series of logical operations. For example, the completion of one query could trigger another event that runs a second query, and so on. This way, a single user interaction, like clicking a button, could set off a chain of events.
@@ -11,7 +11,7 @@ Events are used to run queries, show alerts and other functionalities based on t
Suppose you have a query that refreshes data when a user clicks on a button, and you also want to display a pop-up alert upon successful data refresh. In ToolJet, you can configure an event to trigger a query upon clicking the button, followed by another event to display a pop-up alert confirming the successful data refresh after the query execution is completed.
-
+
@@ -24,6 +24,8 @@ Setting up event handlers to manage such triggers and responses is a straightfor
+For detailed information about the events related to components, please refer to their respective documentation.
+
diff --git a/docs/docs/tooljet-concepts/exposed-variables.md b/docs/docs/tooljet-concepts/exposed-variables.md
new file mode 100644
index 0000000000..e818528c52
--- /dev/null
+++ b/docs/docs/tooljet-concepts/exposed-variables.md
@@ -0,0 +1,19 @@
+---
+id: exposed-variables
+title: Exposed Variables
+---
+
+Exposed Variables help in accessing and manipulating data within components. These variables are automatically created and updated as users interact with the application. Whether it's capturing text from a text editor or retrieving selections from a dropdown menu, exposed variables are integral for dynamic data handling in ToolJet applications.
+
+
+
+
+
+
+
+## Accessing Exposed Variables
+Each component in ToolJet has its own set of exposed variables, which hold specific data related to that component. For example, in the Text Input component, the `value` variable is used. This variable is updated every time a user enters something in the text editor. It can be dynamically accessed using JavaScript notation: `{{components.textinput1.value}}`. This feature allows developers to easily track and utilize the data entered by users in real-time.
+
+
+
+For detailed information about the exposed variables of the components, please refer to their respective documentation.
\ No newline at end of file
diff --git a/docs/docs/tooljet-concepts/inspector.md b/docs/docs/tooljet-concepts/inspector.md
new file mode 100644
index 0000000000..2b884ccd35
--- /dev/null
+++ b/docs/docs/tooljet-concepts/inspector.md
@@ -0,0 +1,19 @@
+---
+id: inspector
+title: Inspector
+---
+
+ToolJet's Inspector is a valuable feature for viewing data related to various elements of your application. This includes information about queries, components, global variables, page-related variables, user-set variables, and constants.
+
+
+
+## Sections In Inspector
+The Inspector panel is divided into six main sections: **Queries, Components, Globals, Variables, Page,** and **Constants**. In the Queries section, you can check the details of your executed queries. The Components section helps you check properties related to each component in your app. Globals provide important overall information about your app, like user details and settings. The Variables section shows custom variables you've set. In the Page section, you can see properties specific to each page. Lastly, Constants hold fixed values like API keys, ensuring consistency across your application.
+
+
+
+
+
+
+
+To learn more about the Inspector option in the sidebar, go through this **[how-to](/docs/how-to/use-inspector)** guide.
\ No newline at end of file
diff --git a/docs/docs/tooljet-concepts/integrating-data.md b/docs/docs/tooljet-concepts/integrating-data.md
index 0521ba4530..1fdcdb1755 100644
--- a/docs/docs/tooljet-concepts/integrating-data.md
+++ b/docs/docs/tooljet-concepts/integrating-data.md
@@ -1,12 +1,12 @@
---
id: integrating-data
-title: Integrating Data
+title: Queries
---
Queries allows you to interact with various data sources, such as databases, APIs, and third-party services. They act as the bridge between your application's components and the data you wish to display, manipulate, or store.
-
+
These queries are constructed in the Query Panel in the App-Builder, a dedicated section within the ToolJet App-Builder, where you can write low-code or custom SQL statements, API requests, or other data retrieval methods.
@@ -15,7 +15,7 @@ These queries are constructed in the Query Panel in the App-Builder, a dedicated
You can configure queries to run automatically when an application loads, or trigger them based on specific events or user actions. For example, you could set up a query to run when a user clicks a button, fills out a form, or selects an item from a dropdown menu. This enables you to create dynamic, interactive applications.
-
+
diff --git a/docs/docs/tooljet-concepts/pages.md b/docs/docs/tooljet-concepts/pages.md
new file mode 100644
index 0000000000..8a352af474
--- /dev/null
+++ b/docs/docs/tooljet-concepts/pages.md
@@ -0,0 +1,26 @@
+---
+id: pages
+title: Pages
+---
+
+ToolJet allows you to create multi-page applications. By using the **Pages** panel on the left sidebar of the app-builder, you can create, manage and navigate through different pages of your application. The ability to create multiple pages allows for diverse functionalities within a single app.
+
+
+
+## Managing Pages
+The Pages panel provides several options for managing your pages. You can add new pages by clicking the `+` button on the Pages header. Each new page can be named and customized. The Settings option lets you hide the page navigation sidebar. Additionally, the Pages panel also offers various page-specific options like renaming, marking a page as the home page, hiding or duplicating pages, and adding event handlers.
+
+
+
+
+
+
+
+
+
+## Advanced Page Features
+ToolJet's Pages panel also includes advanced features like Page Handle, which is the unique slug at the end of the application URL, and can be customized. Pages can be set as the default landing (home) page, or hidden from the page navigation menu. You can duplicate pages, making exact copies for different uses or even add event handlers. Furthermore, pages can be disabled or deleted, with certain restrictions like the inability to delete a home page.
+
+
+
+To understand each functionality associated with Pages, read this **[document](/docs/tutorial/pages/)**.
\ No newline at end of file
diff --git a/docs/docs/tooljet-concepts/permissions.md b/docs/docs/tooljet-concepts/permissions.md
index dcc0fb8bcf..b363d75db0 100644
--- a/docs/docs/tooljet-concepts/permissions.md
+++ b/docs/docs/tooljet-concepts/permissions.md
@@ -1,11 +1,9 @@
---
id: permissions
-title: Securing Applications Through Permissions
+title: User Groups
---
-ToolJet employs a Role-Based Access Control (RBAC) system to manage security and access to its resources, which include apps, folders, and workspace variables.
-
-In this system, Admins have the authority to invite Users to their workspaces and assign them to specific Groups. Each Group is associated with a set of Permissions that dictate what level of access its members have to various resources.
+ToolJet employs a Role-Based Access Control (RBAC) system to manage security and access to its resources, which include apps, folders, and workspace variables. In this system, Admins have the authority to invite Users to their workspaces and assign them to specific Groups. Each Group is associated with a set of Permissions that dictate what level of access its members have to various resources.
@@ -33,7 +31,6 @@ By default, there are two groups: **All Users**, which contains all workspace me
## Setting Permissions Based on Groups and Permissions
To secure your applications in ToolJet, you can leverage Groups and Permissions. For instance, you could create a custom group named Finance Team and assign it permissions to only access financial apps and variables within the workspace. When you invite new users, you can directly assign them to this group, ensuring they only have access to the resources they need to perform their tasks. You can also make the app public and make it accessible to users without the need to log in.
-By thoughtfully configuring these settings, you can create a secure environment tailored to your organization's needs.
-
+Read more about managing users and groups **[here](/docs/tutorial/manage-users-groups/)**.
\ No newline at end of file
diff --git a/docs/docs/tooljet-concepts/what-are-queries.md b/docs/docs/tooljet-concepts/queries.md
similarity index 81%
rename from docs/docs/tooljet-concepts/what-are-queries.md
rename to docs/docs/tooljet-concepts/queries.md
index 5f15376648..0329b01ad6 100644
--- a/docs/docs/tooljet-concepts/what-are-queries.md
+++ b/docs/docs/tooljet-concepts/queries.md
@@ -1,6 +1,6 @@
---
id: what-are-queries
-title: What Are Queries?
+title: Queries
---
**Queries** act as a bridge between the application and data sources. Queries help interact with data sources like databases or APIs. They fetch or update data based on events like button clicks, making apps dynamic.
@@ -13,7 +13,7 @@ title: What Are Queries?
-
+
@@ -25,7 +25,7 @@ title: What Are Queries?
Queries run when triggered by app events, such as clicking a button. They can fetch new data or change existing data, and the results can be displayed in the app using tables or charts. This makes data interaction in your app straightforward and effective.
-
+
diff --git a/docs/docs/tooljet-concepts/run-js.md b/docs/docs/tooljet-concepts/run-js.md
new file mode 100644
index 0000000000..f9ae1c0052
--- /dev/null
+++ b/docs/docs/tooljet-concepts/run-js.md
@@ -0,0 +1,31 @@
+---
+id: run-js
+title: Run JavaScript code
+---
+
+The **Run JavaScript code** query in ToolJet enables users to write and execute custom JavaScript code within their applications. It provides a flexible way to add custom logic and interact with various components. Whether it’s transforming data, manipulating component properties, or performing actions based on certain conditions, Run JavaScript code significantly enhances the capabilities of your ToolJet applications.
+
+
+
+## Interacting with Components and Actions
+The JavaScript code you write can interact with various components of the ToolJet application. For example, you could attach an event handler to a button so that when it's clicked, it triggers Run Javascript code to run. Additionally, you can construct the JavaScript code to manipulate the properties of other components. This allows for dynamic interactions within your application.
+
+
+
+
+
+
+
+
+
+## Advanced Features and Libraries
+Run JavaScript code also supports advanced functionalities such as setting and unsetting variables, showing or closing modals, copying content to the clipboard, and even logging out users. This is done by using specific syntax and functions. Moreover, you can utilize libraries like Moment, Lodash, and Axios for more complex operations.
+
+
+
+To learn more about Run JavaScript code, go through the below list of documents:
+
+- **[Use Axios in RunJS](/docs/how-to/use-axios-in-runjs/)**
+- **[Run Actions From RunJS](/docs/how-to/run-actions-from-runjs/)**
+- **[Import External Libraries Using RunJS](/docs/how-to/import-external-libraries-using-runjs/)**
+- **[Access a User's Location Using RunJS](/docs/how-to/access-users-location/)**
diff --git a/docs/docs/tooljet-concepts/styling-components.md b/docs/docs/tooljet-concepts/styling-components.md
index 4fcfff421f..03fa0976a6 100644
--- a/docs/docs/tooljet-concepts/styling-components.md
+++ b/docs/docs/tooljet-concepts/styling-components.md
@@ -3,28 +3,27 @@ id: styling-components
title: Styling Components
---
-
+Styling components in ToolJet is a straightforward yet powerful way to enhance the visual appeal and usability of your application. Once you've dragged and dropped a component onto the canvas in the App-Builder, you can access its styling options through the configuration panel on the right side. The **Styles** tab on the configuration panel allows you to modify various visual properties such as colors, fonts, borders, and dimensions. You can also apply conditional styling based on data or user interactions, enabling you to create a more dynamic and responsive user interface.
+
-Styling components in ToolJet is a straightforward yet powerful way to enhance the visual appeal and usability of your application. Once you've dragged and dropped a component onto the canvas in the App-Builder, you can access its styling options through the configuration panel on the right side.
-
-
-
-
-
-The Styles tab on this panel allows you to modify various visual properties such as colors, fonts, borders, and dimensions. You can also apply conditional styling based on data or user interactions, enabling you to create a more dynamic and responsive user interface.
-
-## Intuitive Styling Options
+## Styling Options
The styling options in ToolJet are designed to be intuitive, eliminating the need for extensive CSS or design experience. You can easily change the background color of a button, adjust the font size of a text field, or add padding and margins to layout components. These styling changes are immediately reflected on the canvas, providing real-time feedback as you build your application.
-
+
+
+
+
+
## Custom CSS
-Beyond basic styling, ToolJet also offers advanced customization capabilities. For users who are comfortable with CSS, there's the option to add custom classes. This opens up endless possibilities for fine-tuning the appearance and behavior of your application. Whether you're aiming for a specific brand aesthetic or need to meet particular accessibility standards, ToolJet's styling options give you the flexibility to create an application that not only functions well but also looks great.
+By injecting **Custom CSS**, users can easily override default styles, offering a straightforward and efficient approach to visual customization. To add Custom Styles, users can navigate to the **Custom styles** tab under Workspace Settings in the ToolJet dashboard. For instance, changing the default color of a button involves identifying the component's class and applying the desired CSS changes on the Custom Styles page. This approach ensures that all instances of the app reflect the new styling, like changing button colors, without the need to edit each button individually. This ensures consistent theming across the workspace.
+Continue reading about Custom CSS **[here](/docs/app-builder/customstyles/)**.
+
diff --git a/docs/docs/tooljet-concepts/super-admin.md b/docs/docs/tooljet-concepts/super-admin.md
new file mode 100644
index 0000000000..d5fe67198e
--- /dev/null
+++ b/docs/docs/tooljet-concepts/super-admin.md
@@ -0,0 +1,11 @@
+---
+id: super-admin
+title: Super Admin
+---
+
+The Super Admin in ToolJet plays a critical role in managing the instance by having full access to all workspaces, users, and groups. Super Admins differ significantly from standard Admins, possessing a broader range of privileges. They can manage users in any workspace, including archiving or unarchiving them, and have unrestricted access to all workspaces. This allows Super Admins to create, edit, or delete apps in any user's personal workspace. They also have the authority to access and modify the ToolJet database across all workspaces, an ability not granted to regular Admins.
+
+## Advanced Control and Customization
+Beyond regular management tasks, Super Admins can implement more intricate settings like white labeling, enabling multiplayer editing, and managing instance licenses. They also have the power to restrict personal workspace creation for users, ensuring tighter control over the workspace environment. These advanced capabilities underscore the Super Admin's pivotal role in overseeing the comprehensive management and customization of the ToolJet instance.
+
+Read more about super admins **[here](/docs/enterprise/superadmin/)**.
\ No newline at end of file
diff --git a/docs/docs/tooljet-concepts/workspace-constants.md b/docs/docs/tooljet-concepts/workspace-constants.md
new file mode 100644
index 0000000000..aa245d9791
--- /dev/null
+++ b/docs/docs/tooljet-concepts/workspace-constants.md
@@ -0,0 +1,26 @@
+---
+id: workspace-constants
+title: Workspace Constants
+---
+
+Workspace Constants in ToolJet help in maintaining consistency and security across your applications. These constants are essentially predefined values like tokens, secret keys, or API keys, which remain unaltered during an application's runtime.
+
+
+
+## Environment-Specific Configurations and Security
+One of the key functionalities of Workspace Constants is allowing environment-specific configurations. This is particularly useful for managing sensitive data such as API keys and database credentials securely. The Constants ensure that such critical information is effectively managed across different environments like development, staging, and production. Moreover, to enhance security, Workspace Constants are resolved server-side. This means the actual values of the constants are not sent with network payloads; instead, the server resolves these values, thereby keeping them secure from client-side exposure.
+
+
+
+
+
+
+
+
+
+## Access Control and Usage in Application Development
+Access to creating, updating, or deleting Workspace Constants is restricted to Admins, ensuring tight control over these critical values. All users with editing permissions in the app builder and global datasource connection can utilize these constants, promoting consistent usage across various application components. The syntax for using a Workspace Constant is straightforward: `{{constants.constant_name}}`. This uniform approach simplifies the application building process, making it more efficient and secure.
+
+
+
+For a deep-dive in workspace constants, go through **[this](/docs/org-management/workspaces/workspace_constants/)** documentation.
\ No newline at end of file
diff --git a/docs/docs/user-authentication/sso/openid/setup.md b/docs/docs/user-authentication/sso/openid/setup.md
index 6d71b15c7f..501152e9d0 100644
--- a/docs/docs/user-authentication/sso/openid/setup.md
+++ b/docs/docs/user-authentication/sso/openid/setup.md
@@ -31,14 +31,30 @@ title: Setup
- Find and set **Name**, **Client Id**, **Client Secret**, and **Well Known URL** from your Open Id provider.
-### Exposed User Info
+### Exposed ssoUserInfo
-If OpenID is configured on ToolJet version **`v2.6.2-ee2.1.0`** or above, the ToolJet apps will expose the `ssoUserInfo` property under the `currentUser` variables. Check the **[Inspector](/docs/app-builder/left-sidebar#inspector)** doc to learn more.
+Once the OpenID is configured (on ToolJet version **`v2.6.2-ee2.1.0`** or above), ToolJet will expose the user info returned by the OpenID provider. The user info will be available under the `ssoUserInfo` property of the `currentUser` variable. Check the **[Inspector](/docs/how-to/use-inspector)** doc to learn more.
The exposed user info can be dynamically accessed throughout the apps using JS **`{{globals.currentUser.ssoUserInfo.}}`**
+The following is an example of the user info returned by Google OpenID provider:
+
+| Key | Description | Syntax to access |
+|:--- |:----------- |:------- |
+| **sub** | Subject - Identifier for the End-User at the Issuer. | `{{globals.currentUser.ssoUserInfo.sub}}` |
+| **name** | End-User's full name in displayable form including all name parts, possibly including titles and suffixes, ordered according to the End-User's locale and preferences. | `{{globals.currentUser.ssoUserInfo.name}}` |
+| **given_name** | Given name(s) or first name(s) of the End-User. | `{{globals.currentUser.ssoUserInfo.given_name}}` |
+| **family_name** | Surname(s) or last name(s) of the End-User. | `{{globals.currentUser.ssoUserInfo.family_name}}` |
+| **picture** | URL of the End-User's profile picture. This URL MUST refer to an image file (for example, a PNG, JPEG, or GIF image file), rather than to a Web page containing an image. | `{{globals.currentUser.ssoUserInfo.picture}}` |
+| **email** | End-User's preferred e-mail address. Its value MUST conform to the RFC 5322 [RFC5322] addr-spec syntax. | `{{globals.currentUser.ssoUserInfo.email}}` |
+| **email_verified** | True if the End-User's e-mail address has been verified; otherwise false. | `{{globals.currentUser.ssoUserInfo.email_verified}}` |
+| **locale** | End-User's locale, represented as a BCP47 [RFC5646] language tag. This is typically an ISO 639-1 Alpha-2 [ISO639‑1] language code in lowercase and an ISO 3166-1 Alpha-2 [ISO3166‑1] country code in uppercase, separated by a dash. For example, en-US or fr-CA. As a compatibility note, some implementations have used an underscore as the separator rather than a dash, for example, en_US; Relying Parties MAY choose to accept this locale syntax as well. | `{{globals.currentUser.ssoUserInfo.locale}}` |
+| **hd** | End-User's hosted domain, if any. | `{{globals.currentUser.ssoUserInfo.hd}}` |
+| **access_token** | Access token returned by the OpenID provider. | `{{globals.currentUser.ssoUserInfo.access_token}}` |
+| **id_token** | ID token returned by the OpenID provider. | `{{globals.currentUser.ssoUserInfo.id_token}}` |
+
-
+
\ No newline at end of file
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js
index 7b9495f8d6..47ce16afdb 100644
--- a/docs/docusaurus.config.js
+++ b/docs/docusaurus.config.js
@@ -128,7 +128,10 @@ module.exports = {
customCss: require.resolve('./src/css/custom.css'),
},
sitemap: {
- ignorePatterns: ['/1.x.x/', '/docs/1.x.x/'],
+ changefreq: 'weekly',
+ priority: 0.5,
+ ignorePatterns: ['/docs/1.x.x/**'],
+ filename: 'sitemap.xml',
},
googleTagManager: isProd
? {
diff --git a/docs/sidebars.js b/docs/sidebars.js
index 111c4a4362..7584b4cab5 100644
--- a/docs/sidebars.js
+++ b/docs/sidebars.js
@@ -25,9 +25,18 @@ const sidebars = {
'tooljet-concepts/what-are-components',
'tooljet-concepts/what-are-datasources',
'tooljet-concepts/what-are-queries',
+ 'tooljet-concepts/inspector',
'tooljet-concepts/what-are-events',
+ 'tooljet-concepts/actions',
'tooljet-concepts/how-to-access-values',
+ 'tooljet-concepts/component-specific-actions',
+ 'tooljet-concepts/exposed-variables',
+ 'tooljet-concepts/pages',
+ 'tooljet-concepts/run-js',
+ 'tooljet-concepts/styling-components',
+ 'tooljet-concepts/workspace-constants',
'tooljet-concepts/permissions',
+ 'tooljet-concepts/super-admin',
],
},
{
@@ -57,8 +66,157 @@ const sidebars = {
'setup/v2-migration-guide'
]
},
- 'tooljet-database',
- 'tooljet-copilot',
+ {
+ 'type': 'category',
+ 'label': 'App Builder',
+ 'items': [
+ 'app-builder/overview',
+ 'app-builder/topbar',
+ 'app-builder/share',
+ 'app-builder/canvas',
+ 'app-builder/left-sidebar',
+ 'app-builder/components-library',
+ 'app-builder/query-panel',
+ 'tutorial/pages',
+ 'app-builder/customstyles',
+ 'tutorial/keyboard-shortcuts',
+ 'app-builder/importing-exporting-applications',
+ {
+ 'type': 'category',
+ 'label': 'Components Catalog',
+ 'items': [
+ 'widgets/overview',
+ {
+ 'type': 'category',
+ 'label': 'Components',
+ 'items': [
+ 'widgets/bounded-box',
+ 'widgets/button',
+ 'widgets/button-group',
+ 'widgets/calendar',
+ 'widgets/chart',
+ 'widgets/checkbox',
+ 'widgets/circular-progress-bar',
+ 'widgets/code-editor',
+ 'widgets/color-picker',
+ 'widgets/container',
+ 'widgets/custom-component',
+ 'widgets/date-range-picker',
+ 'widgets/datepicker',
+ 'widgets/divider',
+ 'widgets/dropdown',
+ 'widgets/file-picker',
+ 'widgets/form',
+ 'widgets/html',
+ 'widgets/icon',
+ 'widgets/iframe',
+ 'widgets/image',
+ 'widgets/kanban',
+ 'widgets/link',
+ 'widgets/listview',
+ 'widgets/map',
+ 'widgets/modal',
+ 'widgets/multiselect',
+ 'widgets/number-input',
+ 'widgets/password-input',
+ 'widgets/pdf',
+ 'widgets/pagination',
+ 'widgets/qr-scanner',
+ 'widgets/radio-button',
+ 'widgets/range-slider',
+ 'widgets/rich-text-editor',
+ 'widgets/spinner',
+ 'widgets/star-rating',
+ 'widgets/statistics',
+ 'widgets/steps',
+ 'widgets/svg-image',
+ 'widgets/table',
+ 'widgets/tabs',
+ 'widgets/tags',
+ 'widgets/text-input',
+ 'widgets/text',
+ 'widgets/textarea',
+ 'widgets/timeline',
+ 'widgets/timer',
+ 'widgets/toggle-switch',
+ 'widgets/tree-select',
+ 'widgets/vertical-divider',
+ ],
+ },
+ {
+ 'type': 'category',
+ 'label': 'Actions Reference',
+ 'link': {
+ 'type': 'generated-index',
+ 'title': 'Actions Reference',
+ 'description': 'All the actions that can be performed through event handlers',
+ 'keywords': [
+ 'actions',
+ 'events',
+ ],
+ },
+ 'items': [
+ 'actions/show-alert',
+ 'actions/logout',
+ 'actions/run-query',
+ 'actions/open-webpage',
+ 'actions/go-to-app',
+ 'actions/show-modal',
+ 'actions/close-modal',
+ 'actions/copy-to-clipboard',
+ 'actions/set-localstorage',
+ 'actions/generate-file',
+ 'actions/set-table-page',
+ 'actions/set-variable',
+ 'actions/unset-variable',
+ 'actions/switch-page',
+ 'actions/set-page-variable',
+ 'actions/unset-page-variable',
+ 'actions/control-component',
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ 'type': 'category',
+ 'label': 'How To',
+ 'link': {
+ 'type': 'generated-index',
+ 'title': 'How To Guides',
+ 'description': 'How To Guides for all the things ToolJet',
+ 'keywords': [
+ 'how to',
+ ]
+ },
+ 'items': [
+ 'how-to/setup-rsyslog',
+ 'how-to/use-inspector',
+ 'how-to/use-form-component',
+ 'how-to/access-cellvalue-rowdata',
+ 'how-to/conditionally-format-table',
+ 'how-to/bulk-update-multiple-rows',
+ 'how-to/delete-multiple-rows',
+ 'how-to/use-server-side-pagination',
+ 'how-to/access-currentuser',
+ 'how-to/use-axios-in-runjs',
+ 'how-to/import-external-libraries-using-runpy',
+ 'how-to/import-external-libraries-using-runjs',
+ 'how-to/run-actions-from-runjs',
+ 'how-to/intentionally-fail-js-query',
+ 'how-to/run-query-at-specified-intervals',
+ 'how-to/use-to-py-function-in-runpy',
+ 'how-to/access-users-location',
+ 'how-to/use-s3-signed-url-to-upload-docs',
+ 'how-to/s3-custom-endpoints',
+ 'how-to/upload-files-aws',
+ 'how-to/upload-files-gcs',
+ 'how-to/loading-image-pdf-from-db',
+ 'how-to/use-events-on-chart',
+ 'how-to/print-multi-tabs-report'
+ ],
+ },
{
'type': 'category',
'label': 'Datasource Catalog',
@@ -118,135 +276,21 @@ const sidebars = {
'tutorial/transformations',
],
},
- {
- 'type': 'category',
- 'label': 'Components Catalog',
- 'items': [
- 'widgets/overview',
- {
- 'type': 'category',
- 'label': 'Components library',
- 'items': [
- 'widgets/bounded-box',
- 'widgets/button',
- 'widgets/button-group',
- 'widgets/calendar',
- 'widgets/chart',
- 'widgets/checkbox',
- 'widgets/circular-progress-bar',
- 'widgets/code-editor',
- 'widgets/color-picker',
- 'widgets/container',
- 'widgets/custom-component',
- 'widgets/date-range-picker',
- 'widgets/datepicker',
- 'widgets/divider',
- 'widgets/dropdown',
- 'widgets/file-picker',
- 'widgets/form',
- 'widgets/html',
- 'widgets/icon',
- 'widgets/iframe',
- 'widgets/image',
- 'widgets/kanban',
- 'widgets/link',
- 'widgets/listview',
- 'widgets/map',
- 'widgets/modal',
- 'widgets/multiselect',
- 'widgets/number-input',
- 'widgets/password-input',
- 'widgets/pdf',
- 'widgets/pagination',
- 'widgets/qr-scanner',
- 'widgets/radio-button',
- 'widgets/range-slider',
- 'widgets/rich-text-editor',
- 'widgets/spinner',
- 'widgets/star-rating',
- 'widgets/statistics',
- 'widgets/steps',
- 'widgets/svg-image',
- 'widgets/table',
- 'widgets/tabs',
- 'widgets/tags',
- 'widgets/text-input',
- 'widgets/text',
- 'widgets/textarea',
- 'widgets/timeline',
- 'widgets/timer',
- 'widgets/toggle-switch',
- 'widgets/tree-select',
- 'widgets/vertical-divider',
- ],
- },
- {
- 'type': 'category',
- 'label': 'Actions Reference',
- 'link': {
- 'type': 'generated-index',
- 'title': 'Actions Reference',
- 'description': 'All the actions that can be performed through event handlers',
- 'keywords': [
- 'actions',
- 'events',
- ],
- },
- 'items': [
- 'actions/show-alert',
- 'actions/logout',
- 'actions/run-query',
- 'actions/open-webpage',
- 'actions/go-to-app',
- 'actions/show-modal',
- 'actions/close-modal',
- 'actions/copy-to-clipboard',
- 'actions/set-localstorage',
- 'actions/generate-file',
- 'actions/set-table-page',
- 'actions/set-variable',
- 'actions/unset-variable',
- 'actions/switch-page',
- 'actions/set-page-variable',
- 'actions/unset-page-variable',
- 'actions/control-component',
- ],
- },
- ],
- },
- 'dashboard',
- {
- 'type': 'category',
- 'label': 'App Builder',
- 'items': [
- 'app-builder/overview',
- 'app-builder/topbar',
- 'app-builder/share',
- 'app-builder/canvas',
- 'app-builder/left-sidebar',
- 'app-builder/components-library',
- 'app-builder/query-panel',
- 'tutorial/pages',
- 'app-builder/customstyles',
- 'tutorial/keyboard-shortcuts',
- ],
- },
-
- {
- 'type': 'category',
- 'label': 'Workflows',
- 'items': [
- 'workflows/overview',
- 'workflows/nodes',
- 'workflows/workflow-triggers',
- 'workflows/permissions',
- 'workflows/logs',
- ],
- },
+ 'tooljet-database',
{
'type': 'category',
'label': 'Org Management',
'items': [
+ 'dashboard',
+ {
+ "type": "category",
+ "label": "Workspaces",
+ "items": [
+ "org-management/workspaces/workspace_overview",
+ "org-management/workspaces/workspace-variables",
+ "org-management/workspaces/workspace_constants"
+ ]
+ },
{
'type': 'category',
'label': 'User Authentication',
@@ -283,7 +327,7 @@ const sidebars = {
'azureAD',
],
},
- 'collapsed': false,
+ 'collapsed': true,
'items': [
'user-authentication/sso/openid/setup',
'user-authentication/sso/openid/azuread',
@@ -297,15 +341,6 @@ const sidebars = {
},
],
},
- {
- "type": "category",
- "label": "Workspaces",
- "items": [
- "org-management/workspaces/workspace_overview",
- "org-management/workspaces/workspace-variables",
- "org-management/workspaces/workspace_constants"
- ]
- },
'org-management/permissions',
'tutorial/manage-users-groups',
'Enterprise/audit_logs',
@@ -318,25 +353,25 @@ const sidebars = {
'type': 'category',
'label': 'Release Management',
'items': [
+ 'gitsync',
'release-management/multi-environment',
'tutorial/versioning-and-release',
],
},
- 'gitsync',
+ {
+ 'type': 'category',
+ 'label': 'Workflows',
+ 'items': [
+ 'workflows/overview',
+ 'workflows/nodes',
+ 'workflows/workflow-triggers',
+ 'workflows/permissions',
+ 'workflows/logs',
+ ],
+ },
{
'type': 'category',
'label': 'Marketplace',
- 'link': {
- 'type': 'generated-index',
- 'title': 'Marketplace',
- // 'description': 'ToolJet Marketplace documentation',
- 'keywords': [
- 'Marketplace',
- 'Marketplace for plugins',
- 'Using Marketplace',
- 'Build plugins for marketplace',
- ],
- },
'collapsed': true,
'items': [
'marketplace/marketplace-overview',
@@ -353,54 +388,30 @@ const sidebars = {
},
],
},
+ 'tooljet-copilot',
+ 'security',
+ 'tracking',
{
'type': 'category',
- 'label': 'How To',
- 'link': {
- 'type': 'generated-index',
- 'title': 'How To Guides',
- 'description': 'How To Guides for all the things ToolJet',
- 'keywords': [
- 'how to',
- ]
- },
+ 'label': 'Project Overview',
+ 'collapsed': true,
'items': [
- 'how-to/use-inspector',
- 'how-to/use-form-component',
- 'how-to/access-cellvalue-rowdata',
- 'how-to/bulk-update-multiple-rows',
- 'how-to/delete-multiple-rows',
- 'how-to/use-server-side-pagination',
- 'how-to/access-currentuser',
- 'how-to/use-axios-in-runjs',
- 'how-to/import-external-libraries-using-runpy',
- 'how-to/import-external-libraries-using-runjs',
- 'how-to/run-actions-from-runjs',
- 'how-to/intentionally-fail-js-query',
- 'how-to/run-query-at-specified-intervals',
- 'how-to/use-to-py-function-in-runpy',
- 'how-to/access-users-location',
- 'how-to/use-s3-signed-url-to-upload-docs',
- 'how-to/s3-custom-endpoints',
- 'how-to/upload-files-aws',
- 'how-to/upload-files-gcs',
- 'how-to/loading-image-pdf-from-db',
- 'how-to/use-events-on-chart',
+ {
+ 'type': 'link',
+ 'label': 'Releases',
+ 'href': 'https://github.com/ToolJet/ToolJet/releases',
+ },
+ {
+ 'type': 'link',
+ 'label': 'Roadmap',
+ 'href': 'https://github.com/tooljet/tooljet/milestones',
+ },
],
},
{
'type': 'category',
'label': 'Contributing Guide',
- 'link': {
- 'type': 'generated-index',
- 'title': 'Contributing Guide',
- 'description': 'Guides for contributing to ToolJet',
- 'keywords': [
- 'contribute',
- 'contributing',
- ],
- },
- 'collapsed': false,
+ 'collapsed': true,
'items': [
'contributing-guide/setup/architecture',
{
@@ -437,25 +448,6 @@ const sidebars = {
'contributing-guide/slackcoc',
],
},
- 'security',
- 'tracking',
- {
- 'type': 'category',
- 'label': 'Project Overview',
- 'collapsed': false,
- 'items': [
- {
- 'type': 'link',
- 'label': 'Releases',
- 'href': 'https://github.com/ToolJet/ToolJet/releases',
- },
- {
- 'type': 'link',
- 'label': 'Roadmap',
- 'href': 'https://github.com/tooljet/tooljet/milestones',
- },
- ],
- },
],
};
diff --git a/docs/static/img/datasource-reference/airtable/airtableconnect.gif b/docs/static/img/datasource-reference/airtable/airtableconnect.gif
new file mode 100644
index 0000000000..58bc5923ec
Binary files /dev/null and b/docs/static/img/datasource-reference/airtable/airtableconnect.gif differ
diff --git a/docs/static/img/enterprise/white-label/whitecloud.png b/docs/static/img/enterprise/white-label/whitecloud.png
new file mode 100644
index 0000000000..1f5963204f
Binary files /dev/null and b/docs/static/img/enterprise/white-label/whitecloud.png differ
diff --git a/docs/static/img/gitsync/gitlab/activessh.png b/docs/static/img/gitsync/gitlab/activessh.png
new file mode 100644
index 0000000000..6e28483725
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/activessh.png differ
diff --git a/docs/static/img/gitsync/gitlab/addingssh.png b/docs/static/img/gitsync/gitlab/addingssh.png
new file mode 100644
index 0000000000..f5dfde93e5
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/addingssh.png differ
diff --git a/docs/static/img/gitsync/gitlab/apprename.png b/docs/static/img/gitsync/gitlab/apprename.png
new file mode 100644
index 0000000000..51ce2287fa
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/apprename.png differ
diff --git a/docs/static/img/gitsync/gitlab/author.png b/docs/static/img/gitsync/gitlab/author.png
new file mode 100644
index 0000000000..713b760314
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/author.png differ
diff --git a/docs/static/img/gitsync/gitlab/configfin.png b/docs/static/img/gitsync/gitlab/configfin.png
new file mode 100644
index 0000000000..5c9baca08c
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/configfin.png differ
diff --git a/docs/static/img/gitsync/gitlab/firstcommit.png b/docs/static/img/gitsync/gitlab/firstcommit.png
new file mode 100644
index 0000000000..23c7805e3b
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/firstcommit.png differ
diff --git a/docs/static/img/gitsync/gitlab/gitlabssh.png b/docs/static/img/gitsync/gitlab/gitlabssh.png
new file mode 100644
index 0000000000..b6b4a58fe8
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/gitlabssh.png differ
diff --git a/docs/static/img/gitsync/gitlab/lastcommitmsg.png b/docs/static/img/gitsync/gitlab/lastcommitmsg.png
new file mode 100644
index 0000000000..d3865fc24d
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/lastcommitmsg.png differ
diff --git a/docs/static/img/gitsync/gitlab/message.png b/docs/static/img/gitsync/gitlab/message.png
new file mode 100644
index 0000000000..13c38ac61d
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/message.png differ
diff --git a/docs/static/img/gitsync/gitlab/newversion.png b/docs/static/img/gitsync/gitlab/newversion.png
new file mode 100644
index 0000000000..d6bf2c0844
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/newversion.png differ
diff --git a/docs/static/img/gitsync/gitlab/newversion1.png b/docs/static/img/gitsync/gitlab/newversion1.png
new file mode 100644
index 0000000000..073e1557b8
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/newversion1.png differ
diff --git a/docs/static/img/gitsync/gitlab/repo.png b/docs/static/img/gitsync/gitlab/repo.png
new file mode 100644
index 0000000000..479734d806
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/repo.png differ
diff --git a/docs/static/img/gitsync/gitlab/sshkey.png b/docs/static/img/gitsync/gitlab/sshkey.png
new file mode 100644
index 0000000000..fb19807463
Binary files /dev/null and b/docs/static/img/gitsync/gitlab/sshkey.png differ
diff --git a/docs/static/img/how-to/conditionally-format/cellcv.png b/docs/static/img/how-to/conditionally-format/cellcv.png
new file mode 100644
index 0000000000..d862598a83
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/cellcv.png differ
diff --git a/docs/static/img/how-to/conditionally-format/cellrd.png b/docs/static/img/how-to/conditionally-format/cellrd.png
new file mode 100644
index 0000000000..86ce5e015e
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/cellrd.png differ
diff --git a/docs/static/img/how-to/conditionally-format/column.png b/docs/static/img/how-to/conditionally-format/column.png
new file mode 100644
index 0000000000..d50a24c774
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/column.png differ
diff --git a/docs/static/img/how-to/conditionally-format/query.png b/docs/static/img/how-to/conditionally-format/query.png
new file mode 100644
index 0000000000..a6c237ba81
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/query.png differ
diff --git a/docs/static/img/how-to/conditionally-format/table.png b/docs/static/img/how-to/conditionally-format/table.png
new file mode 100644
index 0000000000..789fd6352a
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/table.png differ
diff --git a/docs/static/img/how-to/conditionally-format/tabledata.png b/docs/static/img/how-to/conditionally-format/tabledata.png
new file mode 100644
index 0000000000..60e419019f
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/tabledata.png differ
diff --git a/docs/static/img/how-to/conditionally-format/textcv.png b/docs/static/img/how-to/conditionally-format/textcv.png
new file mode 100644
index 0000000000..748ee84baf
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/textcv.png differ
diff --git a/docs/static/img/how-to/conditionally-format/textrd.png b/docs/static/img/how-to/conditionally-format/textrd.png
new file mode 100644
index 0000000000..a94dd95c00
Binary files /dev/null and b/docs/static/img/how-to/conditionally-format/textrd.png differ
diff --git a/docs/static/img/how-to/print-multitabs/appui.png b/docs/static/img/how-to/print-multitabs/appui.png
new file mode 100644
index 0000000000..7fa04c2eb8
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/appui.png differ
diff --git a/docs/static/img/how-to/print-multitabs/buttonevents.png b/docs/static/img/how-to/print-multitabs/buttonevents.png
new file mode 100644
index 0000000000..3cd07f7f92
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/buttonevents.png differ
diff --git a/docs/static/img/how-to/print-multitabs/controlcomp2.png b/docs/static/img/how-to/print-multitabs/controlcomp2.png
new file mode 100644
index 0000000000..c91ce8ca67
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/controlcomp2.png differ
diff --git a/docs/static/img/how-to/print-multitabs/data.png b/docs/static/img/how-to/print-multitabs/data.png
new file mode 100644
index 0000000000..e428eccf5f
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/data.png differ
diff --git a/docs/static/img/how-to/print-multitabs/gettabshtml.png b/docs/static/img/how-to/print-multitabs/gettabshtml.png
new file mode 100644
index 0000000000..f9b33e15e1
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/gettabshtml.png differ
diff --git a/docs/static/img/how-to/print-multitabs/q1.png b/docs/static/img/how-to/print-multitabs/q1.png
new file mode 100644
index 0000000000..d7eeaa6914
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/q1.png differ
diff --git a/docs/static/img/how-to/print-multitabs/q2.png b/docs/static/img/how-to/print-multitabs/q2.png
new file mode 100644
index 0000000000..f82f2014ef
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/q2.png differ
diff --git a/docs/static/img/how-to/print-multitabs/q3.png b/docs/static/img/how-to/print-multitabs/q3.png
new file mode 100644
index 0000000000..93f82c6101
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/q3.png differ
diff --git a/docs/static/img/how-to/print-multitabs/unsetvar1.png b/docs/static/img/how-to/print-multitabs/unsetvar1.png
new file mode 100644
index 0000000000..064aa75cb9
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/unsetvar1.png differ
diff --git a/docs/static/img/how-to/print-multitabs/unsetvar2.png b/docs/static/img/how-to/print-multitabs/unsetvar2.png
new file mode 100644
index 0000000000..dc64a29014
Binary files /dev/null and b/docs/static/img/how-to/print-multitabs/unsetvar2.png differ
diff --git a/docs/static/img/how-to/setup-rsyslog/envfile.png b/docs/static/img/how-to/setup-rsyslog/envfile.png
new file mode 100644
index 0000000000..8ec543e746
Binary files /dev/null and b/docs/static/img/how-to/setup-rsyslog/envfile.png differ
diff --git a/docs/static/img/how-to/setup-rsyslog/folder.png b/docs/static/img/how-to/setup-rsyslog/folder.png
new file mode 100644
index 0000000000..3f9010414e
Binary files /dev/null and b/docs/static/img/how-to/setup-rsyslog/folder.png differ
diff --git a/docs/static/img/how-to/setup-rsyslog/timestamp.png b/docs/static/img/how-to/setup-rsyslog/timestamp.png
new file mode 100644
index 0000000000..1463177bf9
Binary files /dev/null and b/docs/static/img/how-to/setup-rsyslog/timestamp.png differ
diff --git a/docs/static/img/sso/openid/ssouserinfon.png b/docs/static/img/sso/openid/ssouserinfon.png
new file mode 100644
index 0000000000..4f255035a0
Binary files /dev/null and b/docs/static/img/sso/openid/ssouserinfon.png differ
diff --git a/docs/static/img/tooljet-concepts/actions/actions-preview.png b/docs/static/img/tooljet-concepts/actions/actions-preview.png
new file mode 100644
index 0000000000..d41bba9205
Binary files /dev/null and b/docs/static/img/tooljet-concepts/actions/actions-preview.png differ
diff --git a/docs/static/img/tooljet-concepts/component-specific-actions/component-specific-actions-preview.png b/docs/static/img/tooljet-concepts/component-specific-actions/component-specific-actions-preview.png
new file mode 100644
index 0000000000..39c6d21b99
Binary files /dev/null and b/docs/static/img/tooljet-concepts/component-specific-actions/component-specific-actions-preview.png differ
diff --git a/docs/static/img/tooljet-concepts/exposed-variables/exposed-variables-preview.png b/docs/static/img/tooljet-concepts/exposed-variables/exposed-variables-preview.png
new file mode 100644
index 0000000000..2082f8850e
Binary files /dev/null and b/docs/static/img/tooljet-concepts/exposed-variables/exposed-variables-preview.png differ
diff --git a/docs/static/img/tooljet-concepts/inspector/inspector-preview.png b/docs/static/img/tooljet-concepts/inspector/inspector-preview.png
new file mode 100644
index 0000000000..2614a88eac
Binary files /dev/null and b/docs/static/img/tooljet-concepts/inspector/inspector-preview.png differ
diff --git a/docs/static/img/tooljet-concepts/pages/pages-preview.png b/docs/static/img/tooljet-concepts/pages/pages-preview.png
new file mode 100644
index 0000000000..c6e53d337f
Binary files /dev/null and b/docs/static/img/tooljet-concepts/pages/pages-preview.png differ
diff --git a/docs/static/img/tooljet-concepts/run-js/run-js-preview.png b/docs/static/img/tooljet-concepts/run-js/run-js-preview.png
new file mode 100644
index 0000000000..ef938c750d
Binary files /dev/null and b/docs/static/img/tooljet-concepts/run-js/run-js-preview.png differ
diff --git a/docs/static/img/tooljet-concepts/workspace-constants/workspace-constants-preview.png b/docs/static/img/tooljet-concepts/workspace-constants/workspace-constants-preview.png
new file mode 100644
index 0000000000..1b268283bb
Binary files /dev/null and b/docs/static/img/tooljet-concepts/workspace-constants/workspace-constants-preview.png differ
diff --git a/docs/static/img/v2-beta/app-builder/import-export-apps/export-app-button.png b/docs/static/img/v2-beta/app-builder/import-export-apps/export-app-button.png
new file mode 100644
index 0000000000..1abee9305b
Binary files /dev/null and b/docs/static/img/v2-beta/app-builder/import-export-apps/export-app-button.png differ
diff --git a/docs/static/img/v2-beta/app-builder/import-export-apps/export-options.png b/docs/static/img/v2-beta/app-builder/import-export-apps/export-options.png
new file mode 100644
index 0000000000..9770dd213a
Binary files /dev/null and b/docs/static/img/v2-beta/app-builder/import-export-apps/export-options.png differ
diff --git a/docs/static/img/v2-beta/app-builder/import-export-apps/import-button.png b/docs/static/img/v2-beta/app-builder/import-export-apps/import-button.png
new file mode 100644
index 0000000000..f0c4370feb
Binary files /dev/null and b/docs/static/img/v2-beta/app-builder/import-export-apps/import-button.png differ
diff --git a/docs/static/img/v2-beta/app-builder/import-export-apps/select-app-to-import.png b/docs/static/img/v2-beta/app-builder/import-export-apps/select-app-to-import.png
new file mode 100644
index 0000000000..0a52e37331
Binary files /dev/null and b/docs/static/img/v2-beta/app-builder/import-export-apps/select-app-to-import.png differ
diff --git a/docs/static/robot.txt b/docs/static/robots.txt
similarity index 100%
rename from docs/static/robot.txt
rename to docs/static/robots.txt
diff --git a/docs/versioned_docs/version-1.x.x/data-sources/smtp.md b/docs/versioned_docs/version-1.x.x/data-sources/smtp.md
index 120f2b1d08..c98bff7ef0 100644
--- a/docs/versioned_docs/version-1.x.x/data-sources/smtp.md
+++ b/docs/versioned_docs/version-1.x.x/data-sources/smtp.md
@@ -42,7 +42,7 @@ To create a query for sending email, you will need to provide the following prop
- **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields.
- **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field.
- For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this.
+ For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to accomplish this.
diff --git a/docs/versioned_docs/version-2.0.0/data-sources/smtp.md b/docs/versioned_docs/version-2.0.0/data-sources/smtp.md
index 120f2b1d08..c98bff7ef0 100644
--- a/docs/versioned_docs/version-2.0.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.0.0/data-sources/smtp.md
@@ -42,7 +42,7 @@ To create a query for sending email, you will need to provide the following prop
- **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields.
- **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field.
- For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this.
+ For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to accomplish this.
diff --git a/docs/versioned_docs/version-2.0.0/getting-started.md b/docs/versioned_docs/version-2.0.0/getting-started.md
index b19e1b2087..a35a2aa2b0 100644
--- a/docs/versioned_docs/version-2.0.0/getting-started.md
+++ b/docs/versioned_docs/version-2.0.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.0.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.1.0/data-sources/smtp.md b/docs/versioned_docs/version-2.1.0/data-sources/smtp.md
index 120f2b1d08..c98bff7ef0 100644
--- a/docs/versioned_docs/version-2.1.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.1.0/data-sources/smtp.md
@@ -42,7 +42,7 @@ To create a query for sending email, you will need to provide the following prop
- **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields.
- **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field.
- For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this.
+ For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to accomplish this.
diff --git a/docs/versioned_docs/version-2.1.0/getting-started.md b/docs/versioned_docs/version-2.1.0/getting-started.md
index b19e1b2087..4b77cb0615 100644
--- a/docs/versioned_docs/version-2.1.0/getting-started.md
+++ b/docs/versioned_docs/version-2.1.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.1.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.10.0/data-sources/smtp.md b/docs/versioned_docs/version-2.10.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.10.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.10.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.10.0/getting-started.md b/docs/versioned_docs/version-2.10.0/getting-started.md
index 2fdb91b39c..205e92d241 100644
--- a/docs/versioned_docs/version-2.10.0/getting-started.md
+++ b/docs/versioned_docs/version-2.10.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.10.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.11.0/data-sources/smtp.md b/docs/versioned_docs/version-2.11.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.11.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.11.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.11.0/getting-started.md b/docs/versioned_docs/version-2.11.0/getting-started.md
index 672f06d5b7..0b9d7bbc76 100644
--- a/docs/versioned_docs/version-2.11.0/getting-started.md
+++ b/docs/versioned_docs/version-2.11.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.11.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.12.0/data-sources/smtp.md b/docs/versioned_docs/version-2.12.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.12.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.12.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.12.0/getting-started.md b/docs/versioned_docs/version-2.12.0/getting-started.md
index 4e248fd0b4..50c7f4a865 100644
--- a/docs/versioned_docs/version-2.12.0/getting-started.md
+++ b/docs/versioned_docs/version-2.12.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.12.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.13.0/data-sources/smtp.md b/docs/versioned_docs/version-2.13.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.13.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.13.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.13.0/getting-started.md b/docs/versioned_docs/version-2.13.0/getting-started.md
index 4e248fd0b4..25a367a00c 100644
--- a/docs/versioned_docs/version-2.13.0/getting-started.md
+++ b/docs/versioned_docs/version-2.13.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.13.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.14.0/data-sources/smtp.md b/docs/versioned_docs/version-2.14.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.14.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.14.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.14.0/getting-started.md b/docs/versioned_docs/version-2.14.0/getting-started.md
index 4e248fd0b4..1d03027498 100644
--- a/docs/versioned_docs/version-2.14.0/getting-started.md
+++ b/docs/versioned_docs/version-2.14.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.14.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.15.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.15.0/contributing-guide/setup/codespaces.md
index 1204d71f63..cc276cbd1c 100644
--- a/docs/versioned_docs/version-2.15.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.15.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.15.0/data-sources/smtp.md b/docs/versioned_docs/version-2.15.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.15.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.15.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.15.0/getting-started.md b/docs/versioned_docs/version-2.15.0/getting-started.md
index 4e248fd0b4..50b880f71f 100644
--- a/docs/versioned_docs/version-2.15.0/getting-started.md
+++ b/docs/versioned_docs/version-2.15.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.15.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.16.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.16.0/contributing-guide/setup/codespaces.md
index 1204d71f63..cc276cbd1c 100644
--- a/docs/versioned_docs/version-2.16.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.16.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.16.0/data-sources/smtp.md b/docs/versioned_docs/version-2.16.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.16.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.16.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.16.0/getting-started.md b/docs/versioned_docs/version-2.16.0/getting-started.md
index 4e248fd0b4..3b80e4501f 100644
--- a/docs/versioned_docs/version-2.16.0/getting-started.md
+++ b/docs/versioned_docs/version-2.16.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.16.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.17.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.17.0/contributing-guide/setup/codespaces.md
index 1204d71f63..cc276cbd1c 100644
--- a/docs/versioned_docs/version-2.17.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.17.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.17.0/data-sources/smtp.md b/docs/versioned_docs/version-2.17.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.17.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.17.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.17.0/getting-started.md b/docs/versioned_docs/version-2.17.0/getting-started.md
index a1caaa8949..a2bd4d505a 100644
--- a/docs/versioned_docs/version-2.17.0/getting-started.md
+++ b/docs/versioned_docs/version-2.17.0/getting-started.md
@@ -462,7 +462,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.17.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.18.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.18.0/contributing-guide/setup/codespaces.md
index 1204d71f63..cc276cbd1c 100644
--- a/docs/versioned_docs/version-2.18.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.18.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.18.0/data-sources/smtp.md b/docs/versioned_docs/version-2.18.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.18.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.18.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.18.0/getting-started.md b/docs/versioned_docs/version-2.18.0/getting-started.md
index a1caaa8949..c85358fe5a 100644
--- a/docs/versioned_docs/version-2.18.0/getting-started.md
+++ b/docs/versioned_docs/version-2.18.0/getting-started.md
@@ -462,7 +462,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.18.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.19.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.19.0/contributing-guide/setup/codespaces.md
index 1204d71f63..cc276cbd1c 100644
--- a/docs/versioned_docs/version-2.19.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.19.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.19.0/data-sources/smtp.md b/docs/versioned_docs/version-2.19.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.19.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.19.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.19.0/getting-started.md b/docs/versioned_docs/version-2.19.0/getting-started.md
index a1caaa8949..d09c59b643 100644
--- a/docs/versioned_docs/version-2.19.0/getting-started.md
+++ b/docs/versioned_docs/version-2.19.0/getting-started.md
@@ -462,7 +462,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.19.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.19.0/how-to/print-multitabs.md b/docs/versioned_docs/version-2.19.0/how-to/print-multitabs.md
new file mode 100644
index 0000000000..750d663b05
--- /dev/null
+++ b/docs/versioned_docs/version-2.19.0/how-to/print-multitabs.md
@@ -0,0 +1,238 @@
+---
+id: print-multi-tabs-report
+title: Print data from multiple tabs
+---
+
+
+In this guide, we will learn how to print data from multiple tabs in ToolJet. This will be useful when you want to print an invoice or a report from your ToolJet application. For example, a tooljet app that has a set of tabs for each invoice and you want to print all the tabs in one go.
+
+
+## UI of the app
+
+Build an app with a set of tabs for each record. Each tab will have a set of fields to display the invoice details. In the example below, we have tabs component and each tab has a set of fields to display the record details.
+
+
+
+**Dropdown**: For selecting a specific patient whose data user want to load in the tabs.
+
+**Tabs**: Each tab represents different type of medical record for the selected patient. For this app, we have 5 tabs for each patient. Each tab has a id starting from 0 to 4.
+
+**Button**: Clicking on the button will print the data from all the tabs. The button has two events, the details for which we will share later in this guide.
+
+
+
+
+
+
+
+## Load data from database
+
+
+
+For this app, we are using tooljet database with table name `patient_data`. We created a query called `getPatientList` to fetch data from the database.
+
+
+
+
+
+
+
+Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step.
+
+## Printing data from multiple tabs
+
+To print data from multiple tabs, we will create few javascript queries. Using event handlers, we will run these javascript queries in a sequence to print data from all the tabs.
+
+
+
+Before we start creating the javascript queries, we need to add a few events to the button component:
+
+| Event | Action | Description |
+|:--- |:--- |:--- |
+| `On click` | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. |
+| `On click` | Run query | Select the query named `viewTabs` to run when the button is clicked. |
+
+**Note**: We will create the `viewTabs` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+### viewTabs query
+
+The `viewTabs` query is a javascript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. he query will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 5.
+
+```js title="viewTabs"
+if ((variables?.tabIndex ?? undefined) == undefined) {
+ await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set
+} else if (parseInt(variables.tabIndex) < 5){
+ await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1
+}
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+For the first Query Success event, we will add a `Control component` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true, i.e. if the tabIndex is less than 5. This action will control the `Tabs` component to `Set current tab` to `{{variables.tabIndex}}`. This will set the current tab to the tab with id stored in the `tabIndex` variable, i.e. it will set the current tab to the tab whose id got recently stored in the tabIndex variable via the viewTabs query.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+For the second Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true. The query for this event handler will be `getTabsHTML`. We will also add a `debounce` of `100` milliseconds to this event handler.
+
+**Note:** we will create the `getTabsHTML` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+For the third Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) === 5}}` is true. The query for this event handler will be `printPDF`. This action will only run when the `tabIndex` is equal to 5, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration.
+
+**Note:** we will create the `printPDF` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+Now that we have created the `viewTabs` query, we can go to the [Download](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs) button and add the `viewTabs` query to the `On click` event handler.
+
+### getTabsHTML query
+
+The `getTabsHTML` is javascript query that will get the html of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the html of all the tabs in the form of an array.
+
+```js title="getTabsHTML"
+actions.setVariable( // set tabsHtml variable
+ "tabsHtml",
+ [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable
+ ((variables?.tabIndex ?? -1) > 0
+ ? `
` // this will help to print data from all the tabs in one go
+ : "") +
+ document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab
+ .innerHTML +
+ "
", // add the html of the current tab to the tabsHtml variable
+ ])
+);
+```
+
+
+
+**This query will have 1 event:**
+
+#### 1. Query Success:
+
+This event will have an action to `Run Query` named `viewTabs`. This will run the `viewTabs` query after the `getTabsHTML` query is successfully executed.
+
+
+
+
+
+
+
+Now that we have created the `getTabsHTML` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#2-query-success) query and add the `getTabsHTML` query to the `Query Success` event handler.
+
+
+
+### printPDF query
+
+The `printPDF` query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs.
+
+```js title="printPDF"
+var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable
+
+var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing
+
+var styles = document.querySelectorAll('link, style');
+var stylesHtml = "";
+for (var i = 0; i < styles.length; i++) {
+ stylesHtml += styles[i].outerHTML;
+} // gather styles from the current page
+
+stylesHtml += ''; // add landscape orientation to the page
+
+winPrint.document.write(
+ "" +
+ stylesHtml +
+ "" +
+ ``
+); // add styles and logo to the page
+
+for (var j = 0; j < printContents.length; j++) {
+ winPrint.document.write(printContents[j]);
+} // add html of all the tabs to the page
+
+winPrint.document.write(""); // Document Finalization and Printing
+winPrint.document.close();
+winPrint.focus();
+winPrint.print();
+winPrint.close();
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsIndex`. This will unset the `tabsIndex` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsHtml`. This will unset the `tabsHtml` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+This event will have an action to `Control component`. This will control the `Tabs` component to `Set current tab` to `{{variables.lastSelectedTab}}` after the `printPDF` query is successfully executed. This will set the current tab to the tab that was selected before the `Download` button was clicked.
+
+
+
+
+
+
+
+
+
+Now that we have created the `printPDF` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#3-query-success) query and add the `printPDF` query to the `Query Success` event handler.
+
+Finally, we can test the app by selecting a patient and clicking on the `Download` button. This will download a PDF document with the data from all the tabs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.2.0/data-sources/smtp.md b/docs/versioned_docs/version-2.2.0/data-sources/smtp.md
index 120f2b1d08..de8aa51392 100644
--- a/docs/versioned_docs/version-2.2.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.2.0/data-sources/smtp.md
@@ -42,7 +42,7 @@ To create a query for sending email, you will need to provide the following prop
- **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields.
- **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field.
- For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.2.0/getting-started.md b/docs/versioned_docs/version-2.2.0/getting-started.md
index b19e1b2087..779b192501 100644
--- a/docs/versioned_docs/version-2.2.0/getting-started.md
+++ b/docs/versioned_docs/version-2.2.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.2.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.22.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.22.0/contributing-guide/setup/codespaces.md
index 1204d71f63..cc276cbd1c 100644
--- a/docs/versioned_docs/version-2.22.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.22.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.22.0/data-sources/smtp.md b/docs/versioned_docs/version-2.22.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.22.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.22.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.22.0/getting-started.md b/docs/versioned_docs/version-2.22.0/getting-started.md
index a1caaa8949..6cec99d7b7 100644
--- a/docs/versioned_docs/version-2.22.0/getting-started.md
+++ b/docs/versioned_docs/version-2.22.0/getting-started.md
@@ -462,7 +462,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.22.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.22.0/how-to/print-multitabs.md b/docs/versioned_docs/version-2.22.0/how-to/print-multitabs.md
new file mode 100644
index 0000000000..750d663b05
--- /dev/null
+++ b/docs/versioned_docs/version-2.22.0/how-to/print-multitabs.md
@@ -0,0 +1,238 @@
+---
+id: print-multi-tabs-report
+title: Print data from multiple tabs
+---
+
+
+In this guide, we will learn how to print data from multiple tabs in ToolJet. This will be useful when you want to print an invoice or a report from your ToolJet application. For example, a tooljet app that has a set of tabs for each invoice and you want to print all the tabs in one go.
+
+
+## UI of the app
+
+Build an app with a set of tabs for each record. Each tab will have a set of fields to display the invoice details. In the example below, we have tabs component and each tab has a set of fields to display the record details.
+
+
+
+**Dropdown**: For selecting a specific patient whose data user want to load in the tabs.
+
+**Tabs**: Each tab represents different type of medical record for the selected patient. For this app, we have 5 tabs for each patient. Each tab has a id starting from 0 to 4.
+
+**Button**: Clicking on the button will print the data from all the tabs. The button has two events, the details for which we will share later in this guide.
+
+
+
+
+
+
+
+## Load data from database
+
+
+
+For this app, we are using tooljet database with table name `patient_data`. We created a query called `getPatientList` to fetch data from the database.
+
+
+
+
+
+
+
+Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step.
+
+## Printing data from multiple tabs
+
+To print data from multiple tabs, we will create few javascript queries. Using event handlers, we will run these javascript queries in a sequence to print data from all the tabs.
+
+
+
+Before we start creating the javascript queries, we need to add a few events to the button component:
+
+| Event | Action | Description |
+|:--- |:--- |:--- |
+| `On click` | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. |
+| `On click` | Run query | Select the query named `viewTabs` to run when the button is clicked. |
+
+**Note**: We will create the `viewTabs` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+### viewTabs query
+
+The `viewTabs` query is a javascript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. he query will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 5.
+
+```js title="viewTabs"
+if ((variables?.tabIndex ?? undefined) == undefined) {
+ await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set
+} else if (parseInt(variables.tabIndex) < 5){
+ await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1
+}
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+For the first Query Success event, we will add a `Control component` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true, i.e. if the tabIndex is less than 5. This action will control the `Tabs` component to `Set current tab` to `{{variables.tabIndex}}`. This will set the current tab to the tab with id stored in the `tabIndex` variable, i.e. it will set the current tab to the tab whose id got recently stored in the tabIndex variable via the viewTabs query.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+For the second Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true. The query for this event handler will be `getTabsHTML`. We will also add a `debounce` of `100` milliseconds to this event handler.
+
+**Note:** we will create the `getTabsHTML` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+For the third Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) === 5}}` is true. The query for this event handler will be `printPDF`. This action will only run when the `tabIndex` is equal to 5, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration.
+
+**Note:** we will create the `printPDF` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+Now that we have created the `viewTabs` query, we can go to the [Download](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs) button and add the `viewTabs` query to the `On click` event handler.
+
+### getTabsHTML query
+
+The `getTabsHTML` is javascript query that will get the html of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the html of all the tabs in the form of an array.
+
+```js title="getTabsHTML"
+actions.setVariable( // set tabsHtml variable
+ "tabsHtml",
+ [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable
+ ((variables?.tabIndex ?? -1) > 0
+ ? `
` // this will help to print data from all the tabs in one go
+ : "") +
+ document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab
+ .innerHTML +
+ "
", // add the html of the current tab to the tabsHtml variable
+ ])
+);
+```
+
+
+
+**This query will have 1 event:**
+
+#### 1. Query Success:
+
+This event will have an action to `Run Query` named `viewTabs`. This will run the `viewTabs` query after the `getTabsHTML` query is successfully executed.
+
+
+
+
+
+
+
+Now that we have created the `getTabsHTML` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#2-query-success) query and add the `getTabsHTML` query to the `Query Success` event handler.
+
+
+
+### printPDF query
+
+The `printPDF` query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs.
+
+```js title="printPDF"
+var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable
+
+var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing
+
+var styles = document.querySelectorAll('link, style');
+var stylesHtml = "";
+for (var i = 0; i < styles.length; i++) {
+ stylesHtml += styles[i].outerHTML;
+} // gather styles from the current page
+
+stylesHtml += ''; // add landscape orientation to the page
+
+winPrint.document.write(
+ "" +
+ stylesHtml +
+ "" +
+ ``
+); // add styles and logo to the page
+
+for (var j = 0; j < printContents.length; j++) {
+ winPrint.document.write(printContents[j]);
+} // add html of all the tabs to the page
+
+winPrint.document.write(""); // Document Finalization and Printing
+winPrint.document.close();
+winPrint.focus();
+winPrint.print();
+winPrint.close();
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsIndex`. This will unset the `tabsIndex` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsHtml`. This will unset the `tabsHtml` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+This event will have an action to `Control component`. This will control the `Tabs` component to `Set current tab` to `{{variables.lastSelectedTab}}` after the `printPDF` query is successfully executed. This will set the current tab to the tab that was selected before the `Download` button was clicked.
+
+
+
+
+
+
+
+
+
+Now that we have created the `printPDF` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#3-query-success) query and add the `printPDF` query to the `Query Success` event handler.
+
+Finally, we can test the app by selecting a patient and clicking on the `Download` button. This will download a PDF document with the data from all the tabs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.23.0/Enterprise/audit_logs.md b/docs/versioned_docs/version-2.23.0/Enterprise/audit_logs.md
index 5681e15ae9..af34d3847d 100644
--- a/docs/versioned_docs/version-2.23.0/Enterprise/audit_logs.md
+++ b/docs/versioned_docs/version-2.23.0/Enterprise/audit_logs.md
@@ -96,6 +96,8 @@ The dropdown will display all the apps associated with your account. Select an a
The file will contain all the data from audit logs. The log file can be created by specifying the path in the [environment variables](/docs/setup/env-vars). The log file is rotated on a daily basis and is updated dynamically every time a new audit log is generated.
+Learn more about **setting up the log file generation** [here](/docs/2.23.0/how-to/setup-rsyslog).
+
#### Log Rotation
The log file is configured to rotate on a daily basis. This means that a new log file will be created every day, ensuring efficient management and organization of audit data.
diff --git a/docs/versioned_docs/version-2.23.0/data-sources/smtp.md b/docs/versioned_docs/version-2.23.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.23.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.23.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.23.0/getting-started.md b/docs/versioned_docs/version-2.23.0/getting-started.md
index a1caaa8949..b2a5b85795 100644
--- a/docs/versioned_docs/version-2.23.0/getting-started.md
+++ b/docs/versioned_docs/version-2.23.0/getting-started.md
@@ -462,7 +462,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.23.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.23.0/how-to/conditionally-format-table.md b/docs/versioned_docs/version-2.23.0/how-to/conditionally-format-table.md
new file mode 100644
index 0000000000..a5d335b648
--- /dev/null
+++ b/docs/versioned_docs/version-2.23.0/how-to/conditionally-format-table.md
@@ -0,0 +1,131 @@
+---
+id: conditionally-format-table
+title: Conditional Formatting in Table
+---
+
+Conditional formatting enhances the visual representation of data by allowing you to dynamically adjust the appearance of cells in table component based on specific conditions. This how-to guide will guide you through the process of implementing advanced conditional formatting for text color and background color in a Table component.
+
+## Create a New Application and Set Up Data Source
+
+1. Create a new application and add a Table component to the canvas.
+
+2. Open the Query Panel at the bottom and click on the `+ Add` button.
+
+3. Choose REST API as your data source and set the method to GET.
+
+4. Enter the following URL as REST API endpoint:
+ ```bash title="REST API Endpoint"
+ https://fakestoreapi.com/products
+ ```
+
+5. Click on the **Preview** button to view the data. Execute the query by clicking on the **Run** button.
+
+
+
+
+
+## Display Data on the Table
+
+1. Hide the Query Panel and click on the Table component to open its configuration panel.
+
+2. Under **Table Data**, enter the following code:
+ ```js title="Table Data"
+ {{queries.restapi1.data}}
+ ```
+
+
+
+
+
+## Enabling Conditional Formatting
+
+1. Go to the **Columns** property of the Table component.
+
+2. Select the column for which you want to enable conditional formatting (e.g., category).
+
+3. If the column type is set to `Default` or `String`, you can set the conditional formatting for **text color** and **cell background color**.
+
+ **Note**: Only `cellValue` and `rowData` can be used as identifiers for conditional formatting.
+
+
+
+
+
+## Conditional Formatting using Cell Value
+
+### Example 1: Changing Text Color Based on Cell Value
+
+1. Select the `Rate` column which has a column type of `Default`/`String`. This column contains the rating of each product on a scale of 1 to 5.
+
+2. Under the **Text Color** propert, enter the following condition:
+
+ ```js
+ {{cellValue < 2 ? 'red' : cellValue > 2 && cellValue < 3 ? 'Orange' : 'green'}}
+ ```
+
+ The above condition will change the text color to red if the cell value is less than 2, orange if the cell value is greater than 2 and less than 3, and green if the cell value is greater than 3.
+
+
+
+
+
+
+### Example 2: Changing Cell Background Color Based on Cell Value
+
+- Select the `Rate` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{cellValue >= 4 ? 'lightgreen' : cellValue >= 3 ? 'lightyellow' : 'lightcoral'}}
+ ```
+
+ The above condition will change the cell background color to lightgreen if the cell value is greater than or equal to 4, lightyellow if the cell value is greater than or equal to 3, and lightcoral if the cell value is less than 3.
+
+
+
+
+
+## Conditional Formatting using Row Data
+
+### Example 1: Changing Text Color Based on Row Data
+
+- Select the `Title` column, enter the following condition under the **Text Color** property:
+
+ ```js
+ {{rowData.price > 50 ? '#D9534F' : (rowData.rating.rate >= 4 ? '#5CB85C' : rowData.rating.rate >= 3 ? '#F0AD4E' : '#D9534F' )}}
+ ```
+
+ The above condition will change the text color of the `Title` based on the value of the `price` and `rating` columns. If the value in the `price` column is greater than 50, the text color will be red. If the value in the `rating` column is greater than or equal to 4, the text color will be green. If the value in the `rating` column is greater than or equal to 3, the text color will be yellow. Otherwise, the text color will be red.
+
+
+
+
+
+### Example 2: Changing Cell Background Color based on Row Data
+
+- In this example, we will change the cell background color of the `Title` column based on the category of the product.
+
+- Select the `Title` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{rowData.category === "electronics" ? 'cyan' : rowData.category === "jewelery" ? 'pink' : 'lightgray'}}
+ ```
+
+ The above condition will change the cell background color of the `Title` column based on the value of the `category` column. If the value in the `category` column is `electronics`, the cell background color will be cyan. If the value in the `category` column is `jewelery`, the cell background color will be pink. Otherwise, the cell background color will be lightgray.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+By following these steps, you can implement advanced conditional formatting for text color and cell background color in your Table component. Experiment with different conditions and color combinations to create visually appealing and informative tables in your applications.
+
diff --git a/docs/versioned_docs/version-2.23.0/how-to/print-multitabs.md b/docs/versioned_docs/version-2.23.0/how-to/print-multitabs.md
new file mode 100644
index 0000000000..750d663b05
--- /dev/null
+++ b/docs/versioned_docs/version-2.23.0/how-to/print-multitabs.md
@@ -0,0 +1,238 @@
+---
+id: print-multi-tabs-report
+title: Print data from multiple tabs
+---
+
+
+In this guide, we will learn how to print data from multiple tabs in ToolJet. This will be useful when you want to print an invoice or a report from your ToolJet application. For example, a tooljet app that has a set of tabs for each invoice and you want to print all the tabs in one go.
+
+
+## UI of the app
+
+Build an app with a set of tabs for each record. Each tab will have a set of fields to display the invoice details. In the example below, we have tabs component and each tab has a set of fields to display the record details.
+
+
+
+**Dropdown**: For selecting a specific patient whose data user want to load in the tabs.
+
+**Tabs**: Each tab represents different type of medical record for the selected patient. For this app, we have 5 tabs for each patient. Each tab has a id starting from 0 to 4.
+
+**Button**: Clicking on the button will print the data from all the tabs. The button has two events, the details for which we will share later in this guide.
+
+
+
+
+
+
+
+## Load data from database
+
+
+
+For this app, we are using tooljet database with table name `patient_data`. We created a query called `getPatientList` to fetch data from the database.
+
+
+
+
+
+
+
+Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step.
+
+## Printing data from multiple tabs
+
+To print data from multiple tabs, we will create few javascript queries. Using event handlers, we will run these javascript queries in a sequence to print data from all the tabs.
+
+
+
+Before we start creating the javascript queries, we need to add a few events to the button component:
+
+| Event | Action | Description |
+|:--- |:--- |:--- |
+| `On click` | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. |
+| `On click` | Run query | Select the query named `viewTabs` to run when the button is clicked. |
+
+**Note**: We will create the `viewTabs` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+### viewTabs query
+
+The `viewTabs` query is a javascript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. he query will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 5.
+
+```js title="viewTabs"
+if ((variables?.tabIndex ?? undefined) == undefined) {
+ await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set
+} else if (parseInt(variables.tabIndex) < 5){
+ await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1
+}
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+For the first Query Success event, we will add a `Control component` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true, i.e. if the tabIndex is less than 5. This action will control the `Tabs` component to `Set current tab` to `{{variables.tabIndex}}`. This will set the current tab to the tab with id stored in the `tabIndex` variable, i.e. it will set the current tab to the tab whose id got recently stored in the tabIndex variable via the viewTabs query.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+For the second Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true. The query for this event handler will be `getTabsHTML`. We will also add a `debounce` of `100` milliseconds to this event handler.
+
+**Note:** we will create the `getTabsHTML` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+For the third Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) === 5}}` is true. The query for this event handler will be `printPDF`. This action will only run when the `tabIndex` is equal to 5, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration.
+
+**Note:** we will create the `printPDF` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+Now that we have created the `viewTabs` query, we can go to the [Download](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs) button and add the `viewTabs` query to the `On click` event handler.
+
+### getTabsHTML query
+
+The `getTabsHTML` is javascript query that will get the html of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the html of all the tabs in the form of an array.
+
+```js title="getTabsHTML"
+actions.setVariable( // set tabsHtml variable
+ "tabsHtml",
+ [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable
+ ((variables?.tabIndex ?? -1) > 0
+ ? `
` // this will help to print data from all the tabs in one go
+ : "") +
+ document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab
+ .innerHTML +
+ "
", // add the html of the current tab to the tabsHtml variable
+ ])
+);
+```
+
+
+
+**This query will have 1 event:**
+
+#### 1. Query Success:
+
+This event will have an action to `Run Query` named `viewTabs`. This will run the `viewTabs` query after the `getTabsHTML` query is successfully executed.
+
+
+
+
+
+
+
+Now that we have created the `getTabsHTML` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#2-query-success) query and add the `getTabsHTML` query to the `Query Success` event handler.
+
+
+
+### printPDF query
+
+The `printPDF` query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs.
+
+```js title="printPDF"
+var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable
+
+var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing
+
+var styles = document.querySelectorAll('link, style');
+var stylesHtml = "";
+for (var i = 0; i < styles.length; i++) {
+ stylesHtml += styles[i].outerHTML;
+} // gather styles from the current page
+
+stylesHtml += ''; // add landscape orientation to the page
+
+winPrint.document.write(
+ "" +
+ stylesHtml +
+ "" +
+ ``
+); // add styles and logo to the page
+
+for (var j = 0; j < printContents.length; j++) {
+ winPrint.document.write(printContents[j]);
+} // add html of all the tabs to the page
+
+winPrint.document.write(""); // Document Finalization and Printing
+winPrint.document.close();
+winPrint.focus();
+winPrint.print();
+winPrint.close();
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsIndex`. This will unset the `tabsIndex` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsHtml`. This will unset the `tabsHtml` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+This event will have an action to `Control component`. This will control the `Tabs` component to `Set current tab` to `{{variables.lastSelectedTab}}` after the `printPDF` query is successfully executed. This will set the current tab to the tab that was selected before the `Download` button was clicked.
+
+
+
+
+
+
+
+
+
+Now that we have created the `printPDF` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#3-query-success) query and add the `printPDF` query to the `Query Success` event handler.
+
+Finally, we can test the app by selecting a patient and clicking on the `Download` button. This will download a PDF document with the data from all the tabs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.23.0/how-to/setup-syslog.md b/docs/versioned_docs/version-2.23.0/how-to/setup-syslog.md
new file mode 100644
index 0000000000..9524c0cea5
--- /dev/null
+++ b/docs/versioned_docs/version-2.23.0/how-to/setup-syslog.md
@@ -0,0 +1,90 @@
+---
+id: setup-rsyslog
+title: Setup log file generation (Rsyslog)
+---
+
+The log file serves as a comprehensive record of audit logs, capturing crucial information about various activities within the ToolJet. Follow the guide below to set up and utilize the log file feature effectively.
+
+## Activation and Configuration
+
+### 1. Environment Variable Setup
+
+- To **activate** the log file feature, simply set the environment variable `LOG_FILE_PATH` to specify the desired path for the log file. For instance, if you want to use `rsyslog` as the log file path, set `LOG_FILE_PATH` to `rsyslog`.
+
+ ```bash
+ LOG_FILE_PATH='rsyslog'
+ ```
+
+
+
+
+
+- The log file path is relative to the home directory of the machine. For instance, if the home directory is `/home/tooljet`, the log file path will be `/home/tooljet/rsyslog`.
+
+### 2. Server Restart
+
+- After configuring the log file environment variable, it's essential to **restart the server** to initiate the log file generation process.
+
+- This step ensures that the server recognizes the new configuration and begins recording audit logs.
+
+## Log Rotation and Organization
+
+### 3. Daily Log Rotation
+
+- The log file is designed to rotate on a daily basis, creating a new log file each day. This configuration aids in efficient management and organization of audit data.
+
+### 4. Log File Path Structure
+
+- The log file path is determined by the `LOG_FILE_PATH` variable. It is crucial to understand that this path is relative to the home directory of the machine. For instance, if `LOG_FILE_PATH` is set to `rsyslog`, the resulting log file path will be structured as follows:
+
+ ```bash
+ homepath/rsyslog/{process_id}-{date}/audit.log
+ ```
+
+ - `{process_id}` is a placeholder for the unique process identifier.
+ - `{date}` represents the current date.
+
+ This structured path ensures that audit logs are organized by both process and date, simplifying traceability and analysis.
+
+
+
+
+
+### 5. Example Log Data
+
+The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata.
+
+
+Example Log file data
+
+```bash
+{
+ level: 'info',
+ message: 'PERFORM APP_CREATE OF awdasdawdwd APP',
+ timestamp: '2023-11-02 17:12:40',
+ auditLog: {
+ userId: '0ad48e21-e7a2-4597-9568-c4535aedf687',
+ organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17',
+ resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829',
+ resourceType: 'APP',
+ actionType: 'APP_CREATE',
+ resourceName: 'awdasdawdwd',
+ ipAddress: '::1',
+ metadata: {
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
+ tooljetVersion: '2.22.2-ee2.8.3'
+ }
+ },
+ label: 'APP'
+}
+```
+
+
+
+### 6. Folder Creation:
+
+The log file feature automatically creates a folder in the home path with the specified name (e.g., `rsyslog`). This folder serves as the root directory for the organized storage of audit logs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.24.0/Enterprise/audit_logs.md b/docs/versioned_docs/version-2.24.0/Enterprise/audit_logs.md
index 5681e15ae9..60d3039ee4 100644
--- a/docs/versioned_docs/version-2.24.0/Enterprise/audit_logs.md
+++ b/docs/versioned_docs/version-2.24.0/Enterprise/audit_logs.md
@@ -96,6 +96,8 @@ The dropdown will display all the apps associated with your account. Select an a
The file will contain all the data from audit logs. The log file can be created by specifying the path in the [environment variables](/docs/setup/env-vars). The log file is rotated on a daily basis and is updated dynamically every time a new audit log is generated.
+Learn more about **setting up the log file generation** [here](/docs/2.24.0/how-to/setup-rsyslog).
+
#### Log Rotation
The log file is configured to rotate on a daily basis. This means that a new log file will be created every day, ensuring efficient management and organization of audit data.
diff --git a/docs/versioned_docs/version-2.24.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.24.0/contributing-guide/setup/codespaces.md
index 1204d71f63..cc276cbd1c 100644
--- a/docs/versioned_docs/version-2.24.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.24.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.24.0/data-sources/smtp.md b/docs/versioned_docs/version-2.24.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.24.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.24.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.24.0/getting-started.md b/docs/versioned_docs/version-2.24.0/getting-started.md
index a1caaa8949..f1b010cfb1 100644
--- a/docs/versioned_docs/version-2.24.0/getting-started.md
+++ b/docs/versioned_docs/version-2.24.0/getting-started.md
@@ -462,7 +462,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.24.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.24.0/gitsync.md b/docs/versioned_docs/version-2.24.0/gitsync.md
index 83dab32851..6a712879c8 100644
--- a/docs/versioned_docs/version-2.24.0/gitsync.md
+++ b/docs/versioned_docs/version-2.24.0/gitsync.md
@@ -3,8 +3,12 @@ id: gitsync
title: GitSync
---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
Available on: Paid plans
+
The GitSync feature enables synchronization of workspace applications with a git repository, streamlining application management and version control on ToolJet.
## Overview
@@ -27,11 +31,17 @@ Facilitating the movement of applications across different ToolJet deployments (
+
+
+
+
+
## Setting up GitSyncing with GitHub
:::caution
- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos.
- Only Admins have the permission to configure the GitSync feature on workspace level.
+- The default branch name for the git repository should be `master`.
:::
### Step 1: Create a new repository on GitHub
@@ -251,4 +261,276 @@ You can check for updates in the git repository by clicking on the **GitSync** b
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+## Setting up GitSyncing with GitLab
+
+:::caution
+- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos.
+- Only Admins have the permission to configure the GitSync feature on workspace level.
+- The default branch name for the git repository should be `master`.
+:::
+
+
+
+### Step 1: Create a new repository
+
+Create a new repository on GitLab. The repository can be public or private. You can also use an existing repository. **Make sure that the repository is empty**.
+
+
+
+
+
+
+
+
+
+### Step 2: Obtain the repository URL
+
+Obtain the **SSH URL** of the repository. On GitLab, you can obtain the URL by clicking on the **Clone** button and selecting the **SSH** option.
+
+
+
+
+
+
+
+
+
+### Step 3: Configure the GitSync feature on ToolJet
+
+Go to the **Workspace settings**, and click on the **Configure git** tab.
+
+
+
+
+
+Enter the **SSH URL** of the repository (obtained in Step 2) in the **Git repository URL** field. Click on the **Generate SSH key** button, and copy the SSH key that is generated. The SSH key is used to authenticate ToolJet with the gitlab repository.
+
+
+
+
+
+
+
+
+
+### Step 4: Deploy the SSH key to GitLab repository
+
+From the top-left corner, click on the user avatar and select the **Edit Profile** option. Navigate to the **SSH Keys** tab and click on the **Add new key** button.
+
+
+
+
+
+Paste the SSH key that you copied in Step 3 in the **Key** field, enter a title for the SSH key in the **Title** field, set **Usage type** to **Authenticatioin & signing**, and set the ***Expiration date(optional)**. Finally, click on the **Add key** button.
+
+
+
+
+
+
+
+
+
+
+
+### Step 5: Finish the GitSync configuration on ToolJet
+
+Go back to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message.
+
+
+
+
+
+
+
+
+
+
+
+## Enable/Disable GitSync
+
+To enable or disable the GitSync feature, go to the **Configure git** tab on the **Workspace settings** page, and toggle on/off the **Connect** switch. This is only available if the GitSync feature is configured.
+
+**When enabled**
+
+On clicking the GitSync button, the users will be able to commit changes to the git repository.
+
+**When disabled**
+1. For non-admin users: The users will not be able to commit changes to the git repository. They will see a dialogue box that the GitSync feature is not configured and they need to contact the admin to configure it.
+2. For admin users: The users will see a dialogue box with a link to configure the GitSync feature.
+
+
+
+
+
+
+
+
+
+
+
+## Delete GitSync configuration
+
+To delete the GitSync configuration, go to the **Configure git** tab on the **Workspace settings** page, and click on the **Delete configuration** button. This will delete the SSH key from the ToolJet configuration and the GitSync feature will be disabled.
+
+**Note:** Deleting the GitSync configuration will not delete the apps from the git repository. The apps will still be available in the git repository in the same state as they were before the GitSync configuration was deleted.
+
+
+
+
+
+
+
+
+
+## Git repo
+
+Once the initial commit is made, you can see the app files in the git repository. The repository will have the individual app folders and a **.meta** folder. The app folders will be named as the app name and will have the respective **JSON** file of the application. The **.meta** folder will have the `meta.json` file that contains the meta information of each application synced to git repo.
+
+The **meta.json** file holds information about apps such as the **App name**, **last commit message**, **last commit user**, **last commit date**, **version name**, and **version id**.
+
+
+
+
+
+
+
+
+
+## Pushing changes to git repo
+
+Once the GitSync feature is configured, you can start pushing changes to the git repository.
+
+
+
+### App creation
+
+When you create a new app, you will see an option to select the `Commit changes`. If you select the `commit changes` option, the changes will be committed to the git repository.
+
+:::info
+If the app name is same as the name of the existing app in the git repo, it will overwrite the existing app in the git repo.
+:::
+
+
+
+
+
+Selecting the `Commit changes` option will create a new commit in the git repository. The commit message will be `App creation` and the author will be the user who created the app.
+
+
+
+
+
+
+
+
+
+### App rename
+
+Whenever an app is renamed, the changes will be automatically committed to the git repository. The commit message will be `App is renamed` and the author will be the user who renamed the app.
+
+
+
+
+
+
+
+
+
+### App updates
+
+Whenever a user makes a change in an app, they can make a commit to the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to enter the commit message. The user can enter the commit message and click on the **Commit changes** button to commit the changes to the git repository. Along with the commit message, the user can also see the connnected **Git repo URL** and the **last commit details**.
+
+**Last commit details** helps the user to know the last commit message, author, date, and time. This helps the user to know the last commit details and make the commit message accordingly.
+
+
+
+
+
+Once the changes are committed, the user can see the commit message, author, and date in the git repository.
+
+
+
+
+
+
+
+
+
+### App deletion
+
+Whenever a user deleted an app from the workspace, the app will not be deleted from the git repository. The app will be available in the git repository in the same state as it was before the app was deleted.
+
+
+
+
+
+### App version update
+
+When a user creates a new version of an app, there will be an option to select the `Commit changes`. If you select the `commit changes` option, the new version of the app will be committed to the git repository.
+
+
+
+
+
+The **JSON** file in the app folder will be replaced with the new version of the app, the **meta.json** file in the **.meta** folder gets updated with the new version id and version name. The commit message will be `Version creation` and the author will be the user who created the new version of the app.
+
+
+
+
+
+
+
+
+
+
+
+## Pulling changes from git repo
+
+You can configure the GitSync feature on another workspace to pull the changes from the git repository. To configure the GitSync feature on another workspace, follow the steps mentioned in the [Setting up GitSyncing with GitLab](#setting-up-gitsyncing-with-gitlab) section.
+
+Once the GitSync feature is configured, go to the ToolJet dashboard and click on the three dots on the right side of the **Create new app** button. Click on the **Import from git repository** option.
+
+
+
+
+
+On clicking the **Import from git repository** option, a modal will open with the dropdown to select the app to be imported from the git repository. Once the app is selected, the app name and the last commit will be displayed. Click on the **Import app** button to import the app from the git repository.
+
+:::caution
+- The app imported from the git repository cannot be edited.
+- The app imported from the Git repository should have a unique name. If the app's name is the same as that of an existing app in the workspace, the user will need to either rename the existing app or delete it to successfully import another app with the same name.
+- Workspace constants are not synced with the git repository. After pulling the app, if the app throws an error, the user will need to manually add the workspace constants.
+:::
+
+
+
+
+
+
+
+### Checking for updates
+
+You can check for updates in the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to **Check for updates**. Click on the **Check for updates** button to check for updates in the git repository. If there are any updates, you will see the details of the updates such as commit message, author, and the date in the modal. Click on the **Pull changes** button to pull the changes from the git repository.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/versioned_docs/version-2.24.0/how-to/conditionally-format-table.md b/docs/versioned_docs/version-2.24.0/how-to/conditionally-format-table.md
new file mode 100644
index 0000000000..a5d335b648
--- /dev/null
+++ b/docs/versioned_docs/version-2.24.0/how-to/conditionally-format-table.md
@@ -0,0 +1,131 @@
+---
+id: conditionally-format-table
+title: Conditional Formatting in Table
+---
+
+Conditional formatting enhances the visual representation of data by allowing you to dynamically adjust the appearance of cells in table component based on specific conditions. This how-to guide will guide you through the process of implementing advanced conditional formatting for text color and background color in a Table component.
+
+## Create a New Application and Set Up Data Source
+
+1. Create a new application and add a Table component to the canvas.
+
+2. Open the Query Panel at the bottom and click on the `+ Add` button.
+
+3. Choose REST API as your data source and set the method to GET.
+
+4. Enter the following URL as REST API endpoint:
+ ```bash title="REST API Endpoint"
+ https://fakestoreapi.com/products
+ ```
+
+5. Click on the **Preview** button to view the data. Execute the query by clicking on the **Run** button.
+
+
+
+
+
+## Display Data on the Table
+
+1. Hide the Query Panel and click on the Table component to open its configuration panel.
+
+2. Under **Table Data**, enter the following code:
+ ```js title="Table Data"
+ {{queries.restapi1.data}}
+ ```
+
+
+
+
+
+## Enabling Conditional Formatting
+
+1. Go to the **Columns** property of the Table component.
+
+2. Select the column for which you want to enable conditional formatting (e.g., category).
+
+3. If the column type is set to `Default` or `String`, you can set the conditional formatting for **text color** and **cell background color**.
+
+ **Note**: Only `cellValue` and `rowData` can be used as identifiers for conditional formatting.
+
+
+
+
+
+## Conditional Formatting using Cell Value
+
+### Example 1: Changing Text Color Based on Cell Value
+
+1. Select the `Rate` column which has a column type of `Default`/`String`. This column contains the rating of each product on a scale of 1 to 5.
+
+2. Under the **Text Color** propert, enter the following condition:
+
+ ```js
+ {{cellValue < 2 ? 'red' : cellValue > 2 && cellValue < 3 ? 'Orange' : 'green'}}
+ ```
+
+ The above condition will change the text color to red if the cell value is less than 2, orange if the cell value is greater than 2 and less than 3, and green if the cell value is greater than 3.
+
+
+
+
+
+
+### Example 2: Changing Cell Background Color Based on Cell Value
+
+- Select the `Rate` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{cellValue >= 4 ? 'lightgreen' : cellValue >= 3 ? 'lightyellow' : 'lightcoral'}}
+ ```
+
+ The above condition will change the cell background color to lightgreen if the cell value is greater than or equal to 4, lightyellow if the cell value is greater than or equal to 3, and lightcoral if the cell value is less than 3.
+
+
+
+
+
+## Conditional Formatting using Row Data
+
+### Example 1: Changing Text Color Based on Row Data
+
+- Select the `Title` column, enter the following condition under the **Text Color** property:
+
+ ```js
+ {{rowData.price > 50 ? '#D9534F' : (rowData.rating.rate >= 4 ? '#5CB85C' : rowData.rating.rate >= 3 ? '#F0AD4E' : '#D9534F' )}}
+ ```
+
+ The above condition will change the text color of the `Title` based on the value of the `price` and `rating` columns. If the value in the `price` column is greater than 50, the text color will be red. If the value in the `rating` column is greater than or equal to 4, the text color will be green. If the value in the `rating` column is greater than or equal to 3, the text color will be yellow. Otherwise, the text color will be red.
+
+
+
+
+
+### Example 2: Changing Cell Background Color based on Row Data
+
+- In this example, we will change the cell background color of the `Title` column based on the category of the product.
+
+- Select the `Title` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{rowData.category === "electronics" ? 'cyan' : rowData.category === "jewelery" ? 'pink' : 'lightgray'}}
+ ```
+
+ The above condition will change the cell background color of the `Title` column based on the value of the `category` column. If the value in the `category` column is `electronics`, the cell background color will be cyan. If the value in the `category` column is `jewelery`, the cell background color will be pink. Otherwise, the cell background color will be lightgray.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+By following these steps, you can implement advanced conditional formatting for text color and cell background color in your Table component. Experiment with different conditions and color combinations to create visually appealing and informative tables in your applications.
+
diff --git a/docs/versioned_docs/version-2.24.0/how-to/print-multitabs.md b/docs/versioned_docs/version-2.24.0/how-to/print-multitabs.md
new file mode 100644
index 0000000000..750d663b05
--- /dev/null
+++ b/docs/versioned_docs/version-2.24.0/how-to/print-multitabs.md
@@ -0,0 +1,238 @@
+---
+id: print-multi-tabs-report
+title: Print data from multiple tabs
+---
+
+
+In this guide, we will learn how to print data from multiple tabs in ToolJet. This will be useful when you want to print an invoice or a report from your ToolJet application. For example, a tooljet app that has a set of tabs for each invoice and you want to print all the tabs in one go.
+
+
+## UI of the app
+
+Build an app with a set of tabs for each record. Each tab will have a set of fields to display the invoice details. In the example below, we have tabs component and each tab has a set of fields to display the record details.
+
+
+
+**Dropdown**: For selecting a specific patient whose data user want to load in the tabs.
+
+**Tabs**: Each tab represents different type of medical record for the selected patient. For this app, we have 5 tabs for each patient. Each tab has a id starting from 0 to 4.
+
+**Button**: Clicking on the button will print the data from all the tabs. The button has two events, the details for which we will share later in this guide.
+
+
+
+
+
+
+
+## Load data from database
+
+
+
+For this app, we are using tooljet database with table name `patient_data`. We created a query called `getPatientList` to fetch data from the database.
+
+
+
+
+
+
+
+Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step.
+
+## Printing data from multiple tabs
+
+To print data from multiple tabs, we will create few javascript queries. Using event handlers, we will run these javascript queries in a sequence to print data from all the tabs.
+
+
+
+Before we start creating the javascript queries, we need to add a few events to the button component:
+
+| Event | Action | Description |
+|:--- |:--- |:--- |
+| `On click` | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. |
+| `On click` | Run query | Select the query named `viewTabs` to run when the button is clicked. |
+
+**Note**: We will create the `viewTabs` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+### viewTabs query
+
+The `viewTabs` query is a javascript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. he query will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 5.
+
+```js title="viewTabs"
+if ((variables?.tabIndex ?? undefined) == undefined) {
+ await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set
+} else if (parseInt(variables.tabIndex) < 5){
+ await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1
+}
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+For the first Query Success event, we will add a `Control component` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true, i.e. if the tabIndex is less than 5. This action will control the `Tabs` component to `Set current tab` to `{{variables.tabIndex}}`. This will set the current tab to the tab with id stored in the `tabIndex` variable, i.e. it will set the current tab to the tab whose id got recently stored in the tabIndex variable via the viewTabs query.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+For the second Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true. The query for this event handler will be `getTabsHTML`. We will also add a `debounce` of `100` milliseconds to this event handler.
+
+**Note:** we will create the `getTabsHTML` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+For the third Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) === 5}}` is true. The query for this event handler will be `printPDF`. This action will only run when the `tabIndex` is equal to 5, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration.
+
+**Note:** we will create the `printPDF` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+Now that we have created the `viewTabs` query, we can go to the [Download](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs) button and add the `viewTabs` query to the `On click` event handler.
+
+### getTabsHTML query
+
+The `getTabsHTML` is javascript query that will get the html of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the html of all the tabs in the form of an array.
+
+```js title="getTabsHTML"
+actions.setVariable( // set tabsHtml variable
+ "tabsHtml",
+ [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable
+ ((variables?.tabIndex ?? -1) > 0
+ ? `
` // this will help to print data from all the tabs in one go
+ : "") +
+ document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab
+ .innerHTML +
+ "
", // add the html of the current tab to the tabsHtml variable
+ ])
+);
+```
+
+
+
+**This query will have 1 event:**
+
+#### 1. Query Success:
+
+This event will have an action to `Run Query` named `viewTabs`. This will run the `viewTabs` query after the `getTabsHTML` query is successfully executed.
+
+
+
+
+
+
+
+Now that we have created the `getTabsHTML` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#2-query-success) query and add the `getTabsHTML` query to the `Query Success` event handler.
+
+
+
+### printPDF query
+
+The `printPDF` query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs.
+
+```js title="printPDF"
+var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable
+
+var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing
+
+var styles = document.querySelectorAll('link, style');
+var stylesHtml = "";
+for (var i = 0; i < styles.length; i++) {
+ stylesHtml += styles[i].outerHTML;
+} // gather styles from the current page
+
+stylesHtml += ''; // add landscape orientation to the page
+
+winPrint.document.write(
+ "" +
+ stylesHtml +
+ "" +
+ ``
+); // add styles and logo to the page
+
+for (var j = 0; j < printContents.length; j++) {
+ winPrint.document.write(printContents[j]);
+} // add html of all the tabs to the page
+
+winPrint.document.write(""); // Document Finalization and Printing
+winPrint.document.close();
+winPrint.focus();
+winPrint.print();
+winPrint.close();
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsIndex`. This will unset the `tabsIndex` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsHtml`. This will unset the `tabsHtml` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+This event will have an action to `Control component`. This will control the `Tabs` component to `Set current tab` to `{{variables.lastSelectedTab}}` after the `printPDF` query is successfully executed. This will set the current tab to the tab that was selected before the `Download` button was clicked.
+
+
+
+
+
+
+
+
+
+Now that we have created the `printPDF` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#3-query-success) query and add the `printPDF` query to the `Query Success` event handler.
+
+Finally, we can test the app by selecting a patient and clicking on the `Download` button. This will download a PDF document with the data from all the tabs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.24.0/how-to/setup-syslog.md b/docs/versioned_docs/version-2.24.0/how-to/setup-syslog.md
new file mode 100644
index 0000000000..9524c0cea5
--- /dev/null
+++ b/docs/versioned_docs/version-2.24.0/how-to/setup-syslog.md
@@ -0,0 +1,90 @@
+---
+id: setup-rsyslog
+title: Setup log file generation (Rsyslog)
+---
+
+The log file serves as a comprehensive record of audit logs, capturing crucial information about various activities within the ToolJet. Follow the guide below to set up and utilize the log file feature effectively.
+
+## Activation and Configuration
+
+### 1. Environment Variable Setup
+
+- To **activate** the log file feature, simply set the environment variable `LOG_FILE_PATH` to specify the desired path for the log file. For instance, if you want to use `rsyslog` as the log file path, set `LOG_FILE_PATH` to `rsyslog`.
+
+ ```bash
+ LOG_FILE_PATH='rsyslog'
+ ```
+
+
+
+
+
+- The log file path is relative to the home directory of the machine. For instance, if the home directory is `/home/tooljet`, the log file path will be `/home/tooljet/rsyslog`.
+
+### 2. Server Restart
+
+- After configuring the log file environment variable, it's essential to **restart the server** to initiate the log file generation process.
+
+- This step ensures that the server recognizes the new configuration and begins recording audit logs.
+
+## Log Rotation and Organization
+
+### 3. Daily Log Rotation
+
+- The log file is designed to rotate on a daily basis, creating a new log file each day. This configuration aids in efficient management and organization of audit data.
+
+### 4. Log File Path Structure
+
+- The log file path is determined by the `LOG_FILE_PATH` variable. It is crucial to understand that this path is relative to the home directory of the machine. For instance, if `LOG_FILE_PATH` is set to `rsyslog`, the resulting log file path will be structured as follows:
+
+ ```bash
+ homepath/rsyslog/{process_id}-{date}/audit.log
+ ```
+
+ - `{process_id}` is a placeholder for the unique process identifier.
+ - `{date}` represents the current date.
+
+ This structured path ensures that audit logs are organized by both process and date, simplifying traceability and analysis.
+
+
+
+
+
+### 5. Example Log Data
+
+The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata.
+
+
+Example Log file data
+
+```bash
+{
+ level: 'info',
+ message: 'PERFORM APP_CREATE OF awdasdawdwd APP',
+ timestamp: '2023-11-02 17:12:40',
+ auditLog: {
+ userId: '0ad48e21-e7a2-4597-9568-c4535aedf687',
+ organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17',
+ resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829',
+ resourceType: 'APP',
+ actionType: 'APP_CREATE',
+ resourceName: 'awdasdawdwd',
+ ipAddress: '::1',
+ metadata: {
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
+ tooljetVersion: '2.22.2-ee2.8.3'
+ }
+ },
+ label: 'APP'
+}
+```
+
+
+
+### 6. Folder Creation:
+
+The log file feature automatically creates a folder in the home path with the specified name (e.g., `rsyslog`). This folder serves as the root directory for the organized storage of audit logs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.24.0/setup/azure-container.md b/docs/versioned_docs/version-2.24.0/setup/azure-container.md
index 0dfb78125a..e5001e4046 100644
--- a/docs/versioned_docs/version-2.24.0/setup/azure-container.md
+++ b/docs/versioned_docs/version-2.24.0/setup/azure-container.md
@@ -79,9 +79,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/client.md b/docs/versioned_docs/version-2.24.0/setup/client.md
index a29cfb1b60..07c1cf93ce 100644
--- a/docs/versioned_docs/version-2.24.0/setup/client.md
+++ b/docs/versioned_docs/version-2.24.0/setup/client.md
@@ -107,8 +107,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/digitalocean.md b/docs/versioned_docs/version-2.24.0/setup/digitalocean.md
index 0df6ca4994..8413df78c5 100644
--- a/docs/versioned_docs/version-2.24.0/setup/digitalocean.md
+++ b/docs/versioned_docs/version-2.24.0/setup/digitalocean.md
@@ -118,8 +118,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/docker.md b/docs/versioned_docs/version-2.24.0/setup/docker.md
index 449e99e14c..6ffa42d9e8 100644
--- a/docs/versioned_docs/version-2.24.0/setup/docker.md
+++ b/docs/versioned_docs/version-2.24.0/setup/docker.md
@@ -153,9 +153,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/ec2.md b/docs/versioned_docs/version-2.24.0/setup/ec2.md
index 1c10b0e918..bc06e39740 100644
--- a/docs/versioned_docs/version-2.24.0/setup/ec2.md
+++ b/docs/versioned_docs/version-2.24.0/setup/ec2.md
@@ -96,9 +96,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/ecs.md b/docs/versioned_docs/version-2.24.0/setup/ecs.md
index 9a92e088a7..85fed5cdfd 100644
--- a/docs/versioned_docs/version-2.24.0/setup/ecs.md
+++ b/docs/versioned_docs/version-2.24.0/setup/ecs.md
@@ -237,9 +237,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/google-cloud-run.md b/docs/versioned_docs/version-2.24.0/setup/google-cloud-run.md
index 3034395e2f..98c2ae74b1 100644
--- a/docs/versioned_docs/version-2.24.0/setup/google-cloud-run.md
+++ b/docs/versioned_docs/version-2.24.0/setup/google-cloud-run.md
@@ -163,8 +163,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.24.0/setup/helm.md b/docs/versioned_docs/version-2.24.0/setup/helm.md
index ce2632a837..799600e8a7 100644
--- a/docs/versioned_docs/version-2.24.0/setup/helm.md
+++ b/docs/versioned_docs/version-2.24.0/setup/helm.md
@@ -45,8 +45,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.24.0/setup/kubernetes-aks.md b/docs/versioned_docs/version-2.24.0/setup/kubernetes-aks.md
index 6fad371369..f08d68dc3b 100644
--- a/docs/versioned_docs/version-2.24.0/setup/kubernetes-aks.md
+++ b/docs/versioned_docs/version-2.24.0/setup/kubernetes-aks.md
@@ -64,8 +64,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/kubernetes-gke.md b/docs/versioned_docs/version-2.24.0/setup/kubernetes-gke.md
index 1cbbf82210..45926f4510 100644
--- a/docs/versioned_docs/version-2.24.0/setup/kubernetes-gke.md
+++ b/docs/versioned_docs/version-2.24.0/setup/kubernetes-gke.md
@@ -90,8 +90,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/kubernetes.md b/docs/versioned_docs/version-2.24.0/setup/kubernetes.md
index 168c2cc926..4461c71e36 100644
--- a/docs/versioned_docs/version-2.24.0/setup/kubernetes.md
+++ b/docs/versioned_docs/version-2.24.0/setup/kubernetes.md
@@ -73,8 +73,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/openshift.md b/docs/versioned_docs/version-2.24.0/setup/openshift.md
index ae8f4e5bf7..553387c83b 100644
--- a/docs/versioned_docs/version-2.24.0/setup/openshift.md
+++ b/docs/versioned_docs/version-2.24.0/setup/openshift.md
@@ -79,8 +79,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.24.0/setup/tooljet-subpath.md b/docs/versioned_docs/version-2.24.0/setup/tooljet-subpath.md
index 51c8a438ad..63d557bc41 100644
--- a/docs/versioned_docs/version-2.24.0/setup/tooljet-subpath.md
+++ b/docs/versioned_docs/version-2.24.0/setup/tooljet-subpath.md
@@ -30,9 +30,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/Enterprise/audit_logs.md b/docs/versioned_docs/version-2.25.0/Enterprise/audit_logs.md
index 5681e15ae9..f4326ce046 100644
--- a/docs/versioned_docs/version-2.25.0/Enterprise/audit_logs.md
+++ b/docs/versioned_docs/version-2.25.0/Enterprise/audit_logs.md
@@ -96,6 +96,8 @@ The dropdown will display all the apps associated with your account. Select an a
The file will contain all the data from audit logs. The log file can be created by specifying the path in the [environment variables](/docs/setup/env-vars). The log file is rotated on a daily basis and is updated dynamically every time a new audit log is generated.
+Learn more about **setting up the log file generation** [here](/docs/2.25.0/how-to/setup-rsyslog).
+
#### Log Rotation
The log file is configured to rotate on a daily basis. This means that a new log file will be created every day, ensuring efficient management and organization of audit data.
diff --git a/docs/versioned_docs/version-2.25.0/contributing-guide/marketplace/marketplace-setup.md b/docs/versioned_docs/version-2.25.0/contributing-guide/marketplace/marketplace-setup.md
index 8d61bd404f..33140403f7 100644
--- a/docs/versioned_docs/version-2.25.0/contributing-guide/marketplace/marketplace-setup.md
+++ b/docs/versioned_docs/version-2.25.0/contributing-guide/marketplace/marketplace-setup.md
@@ -48,7 +48,8 @@ The use of this environment variable facilitates plugin development by enabling
Please note that the marketplace is not enabled by default. After updating the variable, restart your ToolJet instance.
-For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/category/contributing-guide)**. You can access the marketplace by navigating to the **'/integrations'** route.
+For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/2.25.0/contributing-guide/setup/architecture)**. You can access the marketplace by navigating to the **'/integrations'** route.
+
### Step 3: Installation of tooljet-cli
diff --git a/docs/versioned_docs/version-2.25.0/data-sources/smtp.md b/docs/versioned_docs/version-2.25.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.25.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.25.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.25.0/gitsync.md b/docs/versioned_docs/version-2.25.0/gitsync.md
index 9b1100ddb1..6a712879c8 100644
--- a/docs/versioned_docs/version-2.25.0/gitsync.md
+++ b/docs/versioned_docs/version-2.25.0/gitsync.md
@@ -3,6 +3,9 @@ id: gitsync
title: GitSync
---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
Available on: Paid plans
@@ -28,11 +31,17 @@ Facilitating the movement of applications across different ToolJet deployments (
+
+
+
+
+
## Setting up GitSyncing with GitHub
:::caution
- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos.
- Only Admins have the permission to configure the GitSync feature on workspace level.
+- The default branch name for the git repository should be `master`.
:::
### Step 1: Create a new repository on GitHub
@@ -252,4 +261,276 @@ You can check for updates in the git repository by clicking on the **GitSync** b
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+## Setting up GitSyncing with GitLab
+
+:::caution
+- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos.
+- Only Admins have the permission to configure the GitSync feature on workspace level.
+- The default branch name for the git repository should be `master`.
+:::
+
+
+
+### Step 1: Create a new repository
+
+Create a new repository on GitLab. The repository can be public or private. You can also use an existing repository. **Make sure that the repository is empty**.
+
+
+
+
+
+
+
+
+
+### Step 2: Obtain the repository URL
+
+Obtain the **SSH URL** of the repository. On GitLab, you can obtain the URL by clicking on the **Clone** button and selecting the **SSH** option.
+
+
+
+
+
+
+
+
+
+### Step 3: Configure the GitSync feature on ToolJet
+
+Go to the **Workspace settings**, and click on the **Configure git** tab.
+
+
+
+
+
+Enter the **SSH URL** of the repository (obtained in Step 2) in the **Git repository URL** field. Click on the **Generate SSH key** button, and copy the SSH key that is generated. The SSH key is used to authenticate ToolJet with the gitlab repository.
+
+
+
+
+
+
+
+
+
+### Step 4: Deploy the SSH key to GitLab repository
+
+From the top-left corner, click on the user avatar and select the **Edit Profile** option. Navigate to the **SSH Keys** tab and click on the **Add new key** button.
+
+
+
+
+
+Paste the SSH key that you copied in Step 3 in the **Key** field, enter a title for the SSH key in the **Title** field, set **Usage type** to **Authenticatioin & signing**, and set the ***Expiration date(optional)**. Finally, click on the **Add key** button.
+
+
+
+
+
+
+
+
+
+
+
+### Step 5: Finish the GitSync configuration on ToolJet
+
+Go back to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message.
+
+
+
+
+
+
+
+
+
+
+
+## Enable/Disable GitSync
+
+To enable or disable the GitSync feature, go to the **Configure git** tab on the **Workspace settings** page, and toggle on/off the **Connect** switch. This is only available if the GitSync feature is configured.
+
+**When enabled**
+
+On clicking the GitSync button, the users will be able to commit changes to the git repository.
+
+**When disabled**
+1. For non-admin users: The users will not be able to commit changes to the git repository. They will see a dialogue box that the GitSync feature is not configured and they need to contact the admin to configure it.
+2. For admin users: The users will see a dialogue box with a link to configure the GitSync feature.
+
+
+
+
+
+
+
+
+
+
+
+## Delete GitSync configuration
+
+To delete the GitSync configuration, go to the **Configure git** tab on the **Workspace settings** page, and click on the **Delete configuration** button. This will delete the SSH key from the ToolJet configuration and the GitSync feature will be disabled.
+
+**Note:** Deleting the GitSync configuration will not delete the apps from the git repository. The apps will still be available in the git repository in the same state as they were before the GitSync configuration was deleted.
+
+
+
+
+
+
+
+
+
+## Git repo
+
+Once the initial commit is made, you can see the app files in the git repository. The repository will have the individual app folders and a **.meta** folder. The app folders will be named as the app name and will have the respective **JSON** file of the application. The **.meta** folder will have the `meta.json` file that contains the meta information of each application synced to git repo.
+
+The **meta.json** file holds information about apps such as the **App name**, **last commit message**, **last commit user**, **last commit date**, **version name**, and **version id**.
+
+
+
+
+
+
+
+
+
+## Pushing changes to git repo
+
+Once the GitSync feature is configured, you can start pushing changes to the git repository.
+
+
+
+### App creation
+
+When you create a new app, you will see an option to select the `Commit changes`. If you select the `commit changes` option, the changes will be committed to the git repository.
+
+:::info
+If the app name is same as the name of the existing app in the git repo, it will overwrite the existing app in the git repo.
+:::
+
+
+
+
+
+Selecting the `Commit changes` option will create a new commit in the git repository. The commit message will be `App creation` and the author will be the user who created the app.
+
+
+
+
+
+
+
+
+
+### App rename
+
+Whenever an app is renamed, the changes will be automatically committed to the git repository. The commit message will be `App is renamed` and the author will be the user who renamed the app.
+
+
+
+
+
+
+
+
+
+### App updates
+
+Whenever a user makes a change in an app, they can make a commit to the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to enter the commit message. The user can enter the commit message and click on the **Commit changes** button to commit the changes to the git repository. Along with the commit message, the user can also see the connnected **Git repo URL** and the **last commit details**.
+
+**Last commit details** helps the user to know the last commit message, author, date, and time. This helps the user to know the last commit details and make the commit message accordingly.
+
+
+
+
+
+Once the changes are committed, the user can see the commit message, author, and date in the git repository.
+
+
+
+
+
+
+
+
+
+### App deletion
+
+Whenever a user deleted an app from the workspace, the app will not be deleted from the git repository. The app will be available in the git repository in the same state as it was before the app was deleted.
+
+
+
+
+
+### App version update
+
+When a user creates a new version of an app, there will be an option to select the `Commit changes`. If you select the `commit changes` option, the new version of the app will be committed to the git repository.
+
+
+
+
+
+The **JSON** file in the app folder will be replaced with the new version of the app, the **meta.json** file in the **.meta** folder gets updated with the new version id and version name. The commit message will be `Version creation` and the author will be the user who created the new version of the app.
+
+
+
+
+
+
+
+
+
+
+
+## Pulling changes from git repo
+
+You can configure the GitSync feature on another workspace to pull the changes from the git repository. To configure the GitSync feature on another workspace, follow the steps mentioned in the [Setting up GitSyncing with GitLab](#setting-up-gitsyncing-with-gitlab) section.
+
+Once the GitSync feature is configured, go to the ToolJet dashboard and click on the three dots on the right side of the **Create new app** button. Click on the **Import from git repository** option.
+
+
+
+
+
+On clicking the **Import from git repository** option, a modal will open with the dropdown to select the app to be imported from the git repository. Once the app is selected, the app name and the last commit will be displayed. Click on the **Import app** button to import the app from the git repository.
+
+:::caution
+- The app imported from the git repository cannot be edited.
+- The app imported from the Git repository should have a unique name. If the app's name is the same as that of an existing app in the workspace, the user will need to either rename the existing app or delete it to successfully import another app with the same name.
+- Workspace constants are not synced with the git repository. After pulling the app, if the app throws an error, the user will need to manually add the workspace constants.
+:::
+
+
+
+
+
+
+
+### Checking for updates
+
+You can check for updates in the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to **Check for updates**. Click on the **Check for updates** button to check for updates in the git repository. If there are any updates, you will see the details of the updates such as commit message, author, and the date in the modal. Click on the **Pull changes** button to pull the changes from the git repository.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/versioned_docs/version-2.25.0/how-to/conditionally-format-table.md b/docs/versioned_docs/version-2.25.0/how-to/conditionally-format-table.md
new file mode 100644
index 0000000000..a5d335b648
--- /dev/null
+++ b/docs/versioned_docs/version-2.25.0/how-to/conditionally-format-table.md
@@ -0,0 +1,131 @@
+---
+id: conditionally-format-table
+title: Conditional Formatting in Table
+---
+
+Conditional formatting enhances the visual representation of data by allowing you to dynamically adjust the appearance of cells in table component based on specific conditions. This how-to guide will guide you through the process of implementing advanced conditional formatting for text color and background color in a Table component.
+
+## Create a New Application and Set Up Data Source
+
+1. Create a new application and add a Table component to the canvas.
+
+2. Open the Query Panel at the bottom and click on the `+ Add` button.
+
+3. Choose REST API as your data source and set the method to GET.
+
+4. Enter the following URL as REST API endpoint:
+ ```bash title="REST API Endpoint"
+ https://fakestoreapi.com/products
+ ```
+
+5. Click on the **Preview** button to view the data. Execute the query by clicking on the **Run** button.
+
+
+
+
+
+## Display Data on the Table
+
+1. Hide the Query Panel and click on the Table component to open its configuration panel.
+
+2. Under **Table Data**, enter the following code:
+ ```js title="Table Data"
+ {{queries.restapi1.data}}
+ ```
+
+
+
+
+
+## Enabling Conditional Formatting
+
+1. Go to the **Columns** property of the Table component.
+
+2. Select the column for which you want to enable conditional formatting (e.g., category).
+
+3. If the column type is set to `Default` or `String`, you can set the conditional formatting for **text color** and **cell background color**.
+
+ **Note**: Only `cellValue` and `rowData` can be used as identifiers for conditional formatting.
+
+
+
+
+
+## Conditional Formatting using Cell Value
+
+### Example 1: Changing Text Color Based on Cell Value
+
+1. Select the `Rate` column which has a column type of `Default`/`String`. This column contains the rating of each product on a scale of 1 to 5.
+
+2. Under the **Text Color** propert, enter the following condition:
+
+ ```js
+ {{cellValue < 2 ? 'red' : cellValue > 2 && cellValue < 3 ? 'Orange' : 'green'}}
+ ```
+
+ The above condition will change the text color to red if the cell value is less than 2, orange if the cell value is greater than 2 and less than 3, and green if the cell value is greater than 3.
+
+
+
+
+
+
+### Example 2: Changing Cell Background Color Based on Cell Value
+
+- Select the `Rate` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{cellValue >= 4 ? 'lightgreen' : cellValue >= 3 ? 'lightyellow' : 'lightcoral'}}
+ ```
+
+ The above condition will change the cell background color to lightgreen if the cell value is greater than or equal to 4, lightyellow if the cell value is greater than or equal to 3, and lightcoral if the cell value is less than 3.
+
+
+
+
+
+## Conditional Formatting using Row Data
+
+### Example 1: Changing Text Color Based on Row Data
+
+- Select the `Title` column, enter the following condition under the **Text Color** property:
+
+ ```js
+ {{rowData.price > 50 ? '#D9534F' : (rowData.rating.rate >= 4 ? '#5CB85C' : rowData.rating.rate >= 3 ? '#F0AD4E' : '#D9534F' )}}
+ ```
+
+ The above condition will change the text color of the `Title` based on the value of the `price` and `rating` columns. If the value in the `price` column is greater than 50, the text color will be red. If the value in the `rating` column is greater than or equal to 4, the text color will be green. If the value in the `rating` column is greater than or equal to 3, the text color will be yellow. Otherwise, the text color will be red.
+
+
+
+
+
+### Example 2: Changing Cell Background Color based on Row Data
+
+- In this example, we will change the cell background color of the `Title` column based on the category of the product.
+
+- Select the `Title` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{rowData.category === "electronics" ? 'cyan' : rowData.category === "jewelery" ? 'pink' : 'lightgray'}}
+ ```
+
+ The above condition will change the cell background color of the `Title` column based on the value of the `category` column. If the value in the `category` column is `electronics`, the cell background color will be cyan. If the value in the `category` column is `jewelery`, the cell background color will be pink. Otherwise, the cell background color will be lightgray.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+By following these steps, you can implement advanced conditional formatting for text color and cell background color in your Table component. Experiment with different conditions and color combinations to create visually appealing and informative tables in your applications.
+
diff --git a/docs/versioned_docs/version-2.25.0/how-to/print-multitabs.md b/docs/versioned_docs/version-2.25.0/how-to/print-multitabs.md
new file mode 100644
index 0000000000..750d663b05
--- /dev/null
+++ b/docs/versioned_docs/version-2.25.0/how-to/print-multitabs.md
@@ -0,0 +1,238 @@
+---
+id: print-multi-tabs-report
+title: Print data from multiple tabs
+---
+
+
+In this guide, we will learn how to print data from multiple tabs in ToolJet. This will be useful when you want to print an invoice or a report from your ToolJet application. For example, a tooljet app that has a set of tabs for each invoice and you want to print all the tabs in one go.
+
+
+## UI of the app
+
+Build an app with a set of tabs for each record. Each tab will have a set of fields to display the invoice details. In the example below, we have tabs component and each tab has a set of fields to display the record details.
+
+
+
+**Dropdown**: For selecting a specific patient whose data user want to load in the tabs.
+
+**Tabs**: Each tab represents different type of medical record for the selected patient. For this app, we have 5 tabs for each patient. Each tab has a id starting from 0 to 4.
+
+**Button**: Clicking on the button will print the data from all the tabs. The button has two events, the details for which we will share later in this guide.
+
+
+
+
+
+
+
+## Load data from database
+
+
+
+For this app, we are using tooljet database with table name `patient_data`. We created a query called `getPatientList` to fetch data from the database.
+
+
+
+
+
+
+
+Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step.
+
+## Printing data from multiple tabs
+
+To print data from multiple tabs, we will create few javascript queries. Using event handlers, we will run these javascript queries in a sequence to print data from all the tabs.
+
+
+
+Before we start creating the javascript queries, we need to add a few events to the button component:
+
+| Event | Action | Description |
+|:--- |:--- |:--- |
+| `On click` | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. |
+| `On click` | Run query | Select the query named `viewTabs` to run when the button is clicked. |
+
+**Note**: We will create the `viewTabs` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+### viewTabs query
+
+The `viewTabs` query is a javascript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. he query will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 5.
+
+```js title="viewTabs"
+if ((variables?.tabIndex ?? undefined) == undefined) {
+ await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set
+} else if (parseInt(variables.tabIndex) < 5){
+ await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1
+}
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+For the first Query Success event, we will add a `Control component` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true, i.e. if the tabIndex is less than 5. This action will control the `Tabs` component to `Set current tab` to `{{variables.tabIndex}}`. This will set the current tab to the tab with id stored in the `tabIndex` variable, i.e. it will set the current tab to the tab whose id got recently stored in the tabIndex variable via the viewTabs query.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+For the second Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true. The query for this event handler will be `getTabsHTML`. We will also add a `debounce` of `100` milliseconds to this event handler.
+
+**Note:** we will create the `getTabsHTML` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+For the third Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) === 5}}` is true. The query for this event handler will be `printPDF`. This action will only run when the `tabIndex` is equal to 5, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration.
+
+**Note:** we will create the `printPDF` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+Now that we have created the `viewTabs` query, we can go to the [Download](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs) button and add the `viewTabs` query to the `On click` event handler.
+
+### getTabsHTML query
+
+The `getTabsHTML` is javascript query that will get the html of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the html of all the tabs in the form of an array.
+
+```js title="getTabsHTML"
+actions.setVariable( // set tabsHtml variable
+ "tabsHtml",
+ [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable
+ ((variables?.tabIndex ?? -1) > 0
+ ? `
` // this will help to print data from all the tabs in one go
+ : "") +
+ document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab
+ .innerHTML +
+ "
", // add the html of the current tab to the tabsHtml variable
+ ])
+);
+```
+
+
+
+**This query will have 1 event:**
+
+#### 1. Query Success:
+
+This event will have an action to `Run Query` named `viewTabs`. This will run the `viewTabs` query after the `getTabsHTML` query is successfully executed.
+
+
+
+
+
+
+
+Now that we have created the `getTabsHTML` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#2-query-success) query and add the `getTabsHTML` query to the `Query Success` event handler.
+
+
+
+### printPDF query
+
+The `printPDF` query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs.
+
+```js title="printPDF"
+var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable
+
+var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing
+
+var styles = document.querySelectorAll('link, style');
+var stylesHtml = "";
+for (var i = 0; i < styles.length; i++) {
+ stylesHtml += styles[i].outerHTML;
+} // gather styles from the current page
+
+stylesHtml += ''; // add landscape orientation to the page
+
+winPrint.document.write(
+ "" +
+ stylesHtml +
+ "" +
+ ``
+); // add styles and logo to the page
+
+for (var j = 0; j < printContents.length; j++) {
+ winPrint.document.write(printContents[j]);
+} // add html of all the tabs to the page
+
+winPrint.document.write(""); // Document Finalization and Printing
+winPrint.document.close();
+winPrint.focus();
+winPrint.print();
+winPrint.close();
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsIndex`. This will unset the `tabsIndex` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsHtml`. This will unset the `tabsHtml` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+This event will have an action to `Control component`. This will control the `Tabs` component to `Set current tab` to `{{variables.lastSelectedTab}}` after the `printPDF` query is successfully executed. This will set the current tab to the tab that was selected before the `Download` button was clicked.
+
+
+
+
+
+
+
+
+
+Now that we have created the `printPDF` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#3-query-success) query and add the `printPDF` query to the `Query Success` event handler.
+
+Finally, we can test the app by selecting a patient and clicking on the `Download` button. This will download a PDF document with the data from all the tabs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.25.0/how-to/setup-syslog.md b/docs/versioned_docs/version-2.25.0/how-to/setup-syslog.md
new file mode 100644
index 0000000000..9524c0cea5
--- /dev/null
+++ b/docs/versioned_docs/version-2.25.0/how-to/setup-syslog.md
@@ -0,0 +1,90 @@
+---
+id: setup-rsyslog
+title: Setup log file generation (Rsyslog)
+---
+
+The log file serves as a comprehensive record of audit logs, capturing crucial information about various activities within the ToolJet. Follow the guide below to set up and utilize the log file feature effectively.
+
+## Activation and Configuration
+
+### 1. Environment Variable Setup
+
+- To **activate** the log file feature, simply set the environment variable `LOG_FILE_PATH` to specify the desired path for the log file. For instance, if you want to use `rsyslog` as the log file path, set `LOG_FILE_PATH` to `rsyslog`.
+
+ ```bash
+ LOG_FILE_PATH='rsyslog'
+ ```
+
+
+
+
+
+- The log file path is relative to the home directory of the machine. For instance, if the home directory is `/home/tooljet`, the log file path will be `/home/tooljet/rsyslog`.
+
+### 2. Server Restart
+
+- After configuring the log file environment variable, it's essential to **restart the server** to initiate the log file generation process.
+
+- This step ensures that the server recognizes the new configuration and begins recording audit logs.
+
+## Log Rotation and Organization
+
+### 3. Daily Log Rotation
+
+- The log file is designed to rotate on a daily basis, creating a new log file each day. This configuration aids in efficient management and organization of audit data.
+
+### 4. Log File Path Structure
+
+- The log file path is determined by the `LOG_FILE_PATH` variable. It is crucial to understand that this path is relative to the home directory of the machine. For instance, if `LOG_FILE_PATH` is set to `rsyslog`, the resulting log file path will be structured as follows:
+
+ ```bash
+ homepath/rsyslog/{process_id}-{date}/audit.log
+ ```
+
+ - `{process_id}` is a placeholder for the unique process identifier.
+ - `{date}` represents the current date.
+
+ This structured path ensures that audit logs are organized by both process and date, simplifying traceability and analysis.
+
+
+
+
+
+### 5. Example Log Data
+
+The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata.
+
+
+Example Log file data
+
+```bash
+{
+ level: 'info',
+ message: 'PERFORM APP_CREATE OF awdasdawdwd APP',
+ timestamp: '2023-11-02 17:12:40',
+ auditLog: {
+ userId: '0ad48e21-e7a2-4597-9568-c4535aedf687',
+ organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17',
+ resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829',
+ resourceType: 'APP',
+ actionType: 'APP_CREATE',
+ resourceName: 'awdasdawdwd',
+ ipAddress: '::1',
+ metadata: {
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
+ tooljetVersion: '2.22.2-ee2.8.3'
+ }
+ },
+ label: 'APP'
+}
+```
+
+
+
+### 6. Folder Creation:
+
+The log file feature automatically creates a folder in the home path with the specified name (e.g., `rsyslog`). This folder serves as the root directory for the organized storage of audit logs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.25.0/setup/azure-container.md b/docs/versioned_docs/version-2.25.0/setup/azure-container.md
index 0dfb78125a..e5001e4046 100644
--- a/docs/versioned_docs/version-2.25.0/setup/azure-container.md
+++ b/docs/versioned_docs/version-2.25.0/setup/azure-container.md
@@ -79,9 +79,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/client.md b/docs/versioned_docs/version-2.25.0/setup/client.md
index a29cfb1b60..07c1cf93ce 100644
--- a/docs/versioned_docs/version-2.25.0/setup/client.md
+++ b/docs/versioned_docs/version-2.25.0/setup/client.md
@@ -107,8 +107,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/digitalocean.md b/docs/versioned_docs/version-2.25.0/setup/digitalocean.md
index 0df6ca4994..8413df78c5 100644
--- a/docs/versioned_docs/version-2.25.0/setup/digitalocean.md
+++ b/docs/versioned_docs/version-2.25.0/setup/digitalocean.md
@@ -118,8 +118,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/docker.md b/docs/versioned_docs/version-2.25.0/setup/docker.md
index 9239a49390..0a59397342 100644
--- a/docs/versioned_docs/version-2.25.0/setup/docker.md
+++ b/docs/versioned_docs/version-2.25.0/setup/docker.md
@@ -152,9 +152,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/ec2.md b/docs/versioned_docs/version-2.25.0/setup/ec2.md
index 1c10b0e918..bc06e39740 100644
--- a/docs/versioned_docs/version-2.25.0/setup/ec2.md
+++ b/docs/versioned_docs/version-2.25.0/setup/ec2.md
@@ -96,9 +96,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/ecs.md b/docs/versioned_docs/version-2.25.0/setup/ecs.md
index 9a92e088a7..85fed5cdfd 100644
--- a/docs/versioned_docs/version-2.25.0/setup/ecs.md
+++ b/docs/versioned_docs/version-2.25.0/setup/ecs.md
@@ -237,9 +237,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/google-cloud-run.md b/docs/versioned_docs/version-2.25.0/setup/google-cloud-run.md
index 3034395e2f..98c2ae74b1 100644
--- a/docs/versioned_docs/version-2.25.0/setup/google-cloud-run.md
+++ b/docs/versioned_docs/version-2.25.0/setup/google-cloud-run.md
@@ -163,8 +163,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.25.0/setup/helm.md b/docs/versioned_docs/version-2.25.0/setup/helm.md
index ce2632a837..799600e8a7 100644
--- a/docs/versioned_docs/version-2.25.0/setup/helm.md
+++ b/docs/versioned_docs/version-2.25.0/setup/helm.md
@@ -45,8 +45,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.25.0/setup/kubernetes-aks.md b/docs/versioned_docs/version-2.25.0/setup/kubernetes-aks.md
index 6fad371369..f08d68dc3b 100644
--- a/docs/versioned_docs/version-2.25.0/setup/kubernetes-aks.md
+++ b/docs/versioned_docs/version-2.25.0/setup/kubernetes-aks.md
@@ -64,8 +64,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/kubernetes-gke.md b/docs/versioned_docs/version-2.25.0/setup/kubernetes-gke.md
index 1cbbf82210..45926f4510 100644
--- a/docs/versioned_docs/version-2.25.0/setup/kubernetes-gke.md
+++ b/docs/versioned_docs/version-2.25.0/setup/kubernetes-gke.md
@@ -90,8 +90,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/kubernetes.md b/docs/versioned_docs/version-2.25.0/setup/kubernetes.md
index 168c2cc926..4461c71e36 100644
--- a/docs/versioned_docs/version-2.25.0/setup/kubernetes.md
+++ b/docs/versioned_docs/version-2.25.0/setup/kubernetes.md
@@ -73,8 +73,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/openshift.md b/docs/versioned_docs/version-2.25.0/setup/openshift.md
index ae8f4e5bf7..553387c83b 100644
--- a/docs/versioned_docs/version-2.25.0/setup/openshift.md
+++ b/docs/versioned_docs/version-2.25.0/setup/openshift.md
@@ -79,8 +79,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.25.0/setup/tooljet-subpath.md b/docs/versioned_docs/version-2.25.0/setup/tooljet-subpath.md
index 51c8a438ad..63d557bc41 100644
--- a/docs/versioned_docs/version-2.25.0/setup/tooljet-subpath.md
+++ b/docs/versioned_docs/version-2.25.0/setup/tooljet-subpath.md
@@ -30,9 +30,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/Enterprise/audit_logs.md b/docs/versioned_docs/version-2.27.0/Enterprise/audit_logs.md
index 5681e15ae9..43371a8c77 100644
--- a/docs/versioned_docs/version-2.27.0/Enterprise/audit_logs.md
+++ b/docs/versioned_docs/version-2.27.0/Enterprise/audit_logs.md
@@ -3,8 +3,9 @@ id: audit_logs
title: Audit logs
---
+
-
+
The audit log is the report of all the activities done in your ToolJet account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address.
@@ -96,6 +97,8 @@ The dropdown will display all the apps associated with your account. Select an a
The file will contain all the data from audit logs. The log file can be created by specifying the path in the [environment variables](/docs/setup/env-vars). The log file is rotated on a daily basis and is updated dynamically every time a new audit log is generated.
+Learn more about **setting up the log file generation** [here](/docs/how-to/setup-rsyslog).
+
#### Log Rotation
The log file is configured to rotate on a daily basis. This means that a new log file will be created every day, ensuring efficient management and organization of audit data.
diff --git a/docs/versioned_docs/version-2.27.0/Enterprise/superadmin.md b/docs/versioned_docs/version-2.27.0/Enterprise/superadmin.md
index 56911fd192..622461f3bc 100644
--- a/docs/versioned_docs/version-2.27.0/Enterprise/superadmin.md
+++ b/docs/versioned_docs/version-2.27.0/Enterprise/superadmin.md
@@ -3,7 +3,9 @@ id: superadmin
title: Super Admin
---
+
+
A Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance. An instance can have more than one Super Admin. A Super Admin has full control over other users' workspaces and can create users, groups, and other super admins.
diff --git a/docs/versioned_docs/version-2.27.0/Enterprise/white-label.md b/docs/versioned_docs/version-2.27.0/Enterprise/white-label.md
index 3199b55b72..9f1d7b95ad 100644
--- a/docs/versioned_docs/version-2.27.0/Enterprise/white-label.md
+++ b/docs/versioned_docs/version-2.27.0/Enterprise/white-label.md
@@ -11,27 +11,21 @@ With this feature, you gain the ability to rebrand the following key elements:
- **Application Logo**: This includes the logo displayed on the login screen, dashboard, and app-editor.
-
-
-
-
-
+
+
+
- **Favicon**: The small icon associated with your application.
-
-
-
-
-
+
+
+
- **Page Title**: This is the text displayed next to the Favicon.
-
-
-
-
-
+
+
+
## Configuration
@@ -42,7 +36,22 @@ To enable white labelling, you'll need to go to the **Settings** from the Dashbo
- **Page Title**: Enter the text you want to display as your application's title. Preferred title length are 50-60 characters.
+
+
-
+
+
+## ToolJet Cloud
+
+If you are using ToolJet Cloud, you can enable white labelling by going to the **Settings** from the Dashboard and clicking on the `White labelling` tab. On the White labelling page, you'll be able to configure the following:
+
+- **Application Logo**: Add the URL of the image you want to use as your application logo. Preferred dimensions of the logo are: width `130px` and height `26px`.
+- **Page Title**: Enter the text you want to display as your application's title. Preferred title length are 50-60 characters.
+- **Favicon**: Enter the URL of the image you want to use as your application's favicon. Preferred dimensions of the favicon are: width `32px` and height `32px` or `16px` and height `16px`.
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/app-builder/customcss.md b/docs/versioned_docs/version-2.27.0/app-builder/customcss.md
index 870292c51e..e1c4532536 100644
--- a/docs/versioned_docs/version-2.27.0/app-builder/customcss.md
+++ b/docs/versioned_docs/version-2.27.0/app-builder/customcss.md
@@ -3,7 +3,9 @@ id: customstyles
title: Custom Styles
---
+
+
Custom Styles feature enables the implementation of theming on ToolJet apps, allowing users to inject their own CSS styling to override the default app styling. This feature fulfills the requirement of allowing users to easily customize the appearance of their apps.
diff --git a/docs/versioned_docs/version-2.27.0/contributing-guide/marketplace/marketplace-setup.md b/docs/versioned_docs/version-2.27.0/contributing-guide/marketplace/marketplace-setup.md
index 4585f13e01..a8f592845c 100644
--- a/docs/versioned_docs/version-2.27.0/contributing-guide/marketplace/marketplace-setup.md
+++ b/docs/versioned_docs/version-2.27.0/contributing-guide/marketplace/marketplace-setup.md
@@ -48,7 +48,7 @@ The use of this environment variable facilitates plugin development by enabling
Please note that the marketplace is not enabled by default. After updating the variable, restart your ToolJet instance.
-For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/category/contributing-guide)**. You can access the marketplace by navigating to the **'/integrations'** route.
+For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/contributing-guide/setup/architecture)**. You can access the marketplace by navigating to the **'/integrations'** route.
### Step 3: Installation of tooljet-cli
diff --git a/docs/versioned_docs/version-2.27.0/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.27.0/contributing-guide/setup/codespaces.md
index 93d54ed4f9..dddf777fb1 100644
--- a/docs/versioned_docs/version-2.27.0/contributing-guide/setup/codespaces.md
+++ b/docs/versioned_docs/version-2.27.0/contributing-guide/setup/codespaces.md
@@ -97,7 +97,7 @@ npm run build:plugins
```
npm run --prefix server db:create
-npm run --prefix server db:mirgate
+npm run --prefix server db:migrate
```
If at any point you need to reset the database, use this command `npm run --prefix server db:reset`
diff --git a/docs/versioned_docs/version-2.27.0/contributing-guide/setup/macos.md b/docs/versioned_docs/version-2.27.0/contributing-guide/setup/macos.md
index fa45e3b5e1..a42a7ccbf9 100644
--- a/docs/versioned_docs/version-2.27.0/contributing-guide/setup/macos.md
+++ b/docs/versioned_docs/version-2.27.0/contributing-guide/setup/macos.md
@@ -17,14 +17,14 @@ Follow these steps to setup and run ToolJet on macOS for development purposes. O
```bash
/bin/bash -c "(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
- 1.2 Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.2)
+ 1.2 Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1)
```bash
brew install nvm
export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh
nvm install 18.18.2
nvm use 18.18.2
- npm install -g npm@9.8.2
+ npm install -g npm@9.8.1
```
1.3 Install Postgres
diff --git a/docs/versioned_docs/version-2.27.0/copilot.md b/docs/versioned_docs/version-2.27.0/copilot.md
index 8400b47241..818b32e5f3 100644
--- a/docs/versioned_docs/version-2.27.0/copilot.md
+++ b/docs/versioned_docs/version-2.27.0/copilot.md
@@ -3,7 +3,9 @@ id: tooljet-copilot
title: Copilot
---
+
+
:::info BETA
ToolJet Copilot is currently in private beta for **Business** and **Enterprise** users only.
diff --git a/docs/versioned_docs/version-2.27.0/data-sources/airtable.md b/docs/versioned_docs/version-2.27.0/data-sources/airtable.md
index ec9b54b6d2..bd18a51bf9 100644
--- a/docs/versioned_docs/version-2.27.0/data-sources/airtable.md
+++ b/docs/versioned_docs/version-2.27.0/data-sources/airtable.md
@@ -5,9 +5,13 @@ title: Airtable
# Airtable
-ToolJet can connect to your Airtable account to read and write data.Airtable Personal Access Token is required to connect to the Airtable data source on ToolJet. You can generate the PAT by visiting [Developer Hub from your Airtable profile](https://support.airtable.com/docs/creating-and-using-api-keys-and-access-tokens#understanding-personal-access-token-basic-actions).
+ToolJet can connect to your Airtable account to read and write data. **Personal Access Token** is required to connect to the Airtable data source on ToolJet. You can generate the Personal Access Token by visiting [Developer Hub from your Airtable profile](https://support.airtable.com/docs/creating-and-using-api-keys-and-access-tokens#understanding-personal-access-token-basic-actions).
-
+
+
+
+
+
:::info
Airtable API has a rate limit, and at the time of writing this documentation, the limit is five(5) requests per second per base. You can read more about rate limits here **[Airtable API](https://airtable.com/api)**.
@@ -15,27 +19,27 @@ Airtable API has a rate limit, and at the time of writing this documentation, th
## Supported Operations
-- **[Listing records](#listing-records)**
-- **[Retrieving a record](#retrieving-a-record)**
-- **[Creating a record](#creating-a-record)**
-- **[Updating a record](#updating-a-record)**
-- **[Deleting a record](#deleting-a-record)**
+- **[List records](#list-records)**
+- **[Retrieve record](#retrieve-record)**
+- **[Create record](#create-record)**
+- **[Update record](#update-record)**
+- **[Delete record](#delete-record)**
-### Listing records
+### List records
-This query lists all the records in a table. The results are paginated and each page can have up to 100 records.
+This operation returns a list of records from the specified table.
#### Required parameters:
-- **Base ID:** To find the Base ID, first visit **airtable.com/api**. Select from the list of bases the base whose ID you'd like to find out. Example Base ID: `appDT3UCPffPiSmFd`
-- **Table name:** Enter the table name whose data you want to fetch.
+- **Base ID:** To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
+
+- **Table name:** The name of the table from which you want to fetch the records.
#### Optional parameters:
-- **Page size:** The number of records returned in each request. Must be less than or equal to 100. Default is 100.
-- **offset:** If there are more records, the response will contain an offset. To fetch the next page of records, include offset in the next request's parameters.
+- **Page size:** The number of records returned in each request. Default is 100 records.
-
+- **offset:** The offset value is used to fetch the next set of records. The offset value is returned in the response of the previous request.
Example response from Airtable:
@@ -71,15 +75,16 @@ Example response from Airtable:
}
```
-### Retrieving a record
+### Retrieve record
#### Required parameters:
-- **Base ID**
-- **Table name**
-- **Record ID**
+- **Base ID**: To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
+
+- **Table name**: The name of the table from which you want to fetch the records.
+
+- **Record ID**: The ID of the record you want to retrieve.
-
Example response from Airtable:
@@ -94,42 +99,36 @@ Example response from Airtable:
}
```
-### Creating a record
+### Create record
#### Required parameters:
-- **Base ID**
-- **Table name**
-- **Records**
+- **Base ID**: To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
-
+- **Table name**: The name of the table from which you want to fetch the records.
-#### Example Records:
+- **Records**: The records you want to create. The records should be in the form of an array of objects. Each object should have a `fields` key, which contains the fields of the record. The field names should be the same as the field names in the Airtable table.
-```json
-[
- {
- "fields": {
- "Notes": "sdfdsf",
- "Name": "dsfdsf"
+ **Example creating two records:**
+
+ ```json title="Records"
+ [
+ {
+ "fields": {
+ "Notes": "sdfdsf",
+ "Name": "dsfdsf"
+ }
+ },
+ {
+ "fields": {
+ "Notes": "note1",
+ "Name": "dsfdsf"
+ }
}
- },
- {
- "fields": {
- "Notes": "note1",
- "Name": "dsfdsf"
- }
- }
-]
-```
+ ]
+ ```
-Click on the `run` button to run the query.
-
-:::info
-NOTE: Query must be saved before running.
-:::
-
-Example response from Airtable:
+Query returns the following response when the records are created successfully:
```json
{
@@ -154,31 +153,28 @@ Example response from Airtable:
}
```
-### Updating a record
+### Update record
#### Required parameters:
-- **Base ID**
-- **Table name**
-- **Record ID**
+- **Base ID**: To find the Base ID, first visit **airtable.com/api**. Then select the base you want to connect to. The Base ID will be mentioned in the API documentation. Example Base ID: `appDT3UCPffPiSmFd`
-
+- **Table name**: The name of the table from which you want to fetch the records.
-#### Example body:
+- **Record ID**: The ID of the record you want to update.
-
+- **Body**: The fields you want to update. The fields should be in the form of an object. The field names should be the same as the field names in the Airtable table.
-
+ **Example updating a record:**
+
+ ```json title="Body"
+ {
+ "Notes": "Example Notes",
+ "Name": "change"
+ }
+ ```
-
-
-Click on the `run` button to run the query.
-
-:::info
-NOTE: Query must be saved before running.
-:::
-
-Example response from Airtable:
+Query returns the following response when the record is updated successfully:
```json
{
@@ -191,7 +187,7 @@ Example response from Airtable:
}
```
-### Deleting a record
+### Delete record
#### Required parameters:
@@ -199,15 +195,7 @@ Example response from Airtable:
- **Table name**
- **Record ID**
-
-
-Click on the `run` button to run the query.
-
-:::info
-NOTE: Query must be saved before running.
-:::
-
-Example response from Airtable:
+Query returns the following response when the record is deleted successfully:
```json
{
diff --git a/docs/versioned_docs/version-2.27.0/data-sources/smtp.md b/docs/versioned_docs/version-2.27.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.27.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.27.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.27.0/getting-started/quickstart-guide.md b/docs/versioned_docs/version-2.27.0/getting-started/quickstart-guide.md
index 6017863057..a8221cf576 100644
--- a/docs/versioned_docs/version-2.27.0/getting-started/quickstart-guide.md
+++ b/docs/versioned_docs/version-2.27.0/getting-started/quickstart-guide.md
@@ -79,11 +79,11 @@ Now, create a new table in **[ToolJet’s Database](/docs/tooljet-database/)** t
### 3. Integrate Data
To display employees in the application, we first need to fetch data from the database using a query:
-- Click on the Add button in the **[Query Panel](/docs/app-builder/query-panel/)**, select ToolJet Database
-- Rename the query to `getEmployees`
-- Choose `employees` as Table name, List rows as Operations
-- Toggle Run this query on application load? to automatically run the query when the app starts
-- Click on Run to fetch data
+- Click on the Add button in the **[Query Panel](/docs/app-builder/query-panel/)**, select ToolJet Database.
+- Rename the query to `getEmployees`.
+- Choose `employees` as Table name, List rows as Operations.
+- Toggle Run this query on application load? to automatically run the query when the app starts.
+- Click on Run to fetch data.
@@ -178,9 +178,9 @@ Let's continue working on this query. The data needs to reload once this query r
We are now ready with a query that will allow us to add new employee data. Let's link this query to a button.
In the bottom-right corner of the Table component, there is a `+`/Add new row button. Follow the below steps to run the `addEmployee` query on click of the `+`/Add new row button:
-- Click on the Table component, go to Events in configuration panel and add a New event handler
-- Choose Add new rows as Event, Run Query as Action
-- Select `addEmployee` as the Query
+- Click on the Table component, go to Events in configuration panel and add a New event handler.
+- Choose Add new rows as Event, Run Query as Action.
+- Select `addEmployee` as the Query.
diff --git a/docs/versioned_docs/version-2.27.0/gitsync.md b/docs/versioned_docs/version-2.27.0/gitsync.md
index 83dab32851..6a712879c8 100644
--- a/docs/versioned_docs/version-2.27.0/gitsync.md
+++ b/docs/versioned_docs/version-2.27.0/gitsync.md
@@ -3,8 +3,12 @@ id: gitsync
title: GitSync
---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
Available on: Paid plans
+
The GitSync feature enables synchronization of workspace applications with a git repository, streamlining application management and version control on ToolJet.
## Overview
@@ -27,11 +31,17 @@ Facilitating the movement of applications across different ToolJet deployments (
+
+
+
+
+
## Setting up GitSyncing with GitHub
:::caution
- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos.
- Only Admins have the permission to configure the GitSync feature on workspace level.
+- The default branch name for the git repository should be `master`.
:::
### Step 1: Create a new repository on GitHub
@@ -251,4 +261,276 @@ You can check for updates in the git repository by clicking on the **GitSync** b
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+## Setting up GitSyncing with GitLab
+
+:::caution
+- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos.
+- Only Admins have the permission to configure the GitSync feature on workspace level.
+- The default branch name for the git repository should be `master`.
+:::
+
+
+
+### Step 1: Create a new repository
+
+Create a new repository on GitLab. The repository can be public or private. You can also use an existing repository. **Make sure that the repository is empty**.
+
+
+
+
+
+
+
+
+
+### Step 2: Obtain the repository URL
+
+Obtain the **SSH URL** of the repository. On GitLab, you can obtain the URL by clicking on the **Clone** button and selecting the **SSH** option.
+
+
+
+
+
+
+
+
+
+### Step 3: Configure the GitSync feature on ToolJet
+
+Go to the **Workspace settings**, and click on the **Configure git** tab.
+
+
+
+
+
+Enter the **SSH URL** of the repository (obtained in Step 2) in the **Git repository URL** field. Click on the **Generate SSH key** button, and copy the SSH key that is generated. The SSH key is used to authenticate ToolJet with the gitlab repository.
+
+
+
+
+
+
+
+
+
+### Step 4: Deploy the SSH key to GitLab repository
+
+From the top-left corner, click on the user avatar and select the **Edit Profile** option. Navigate to the **SSH Keys** tab and click on the **Add new key** button.
+
+
+
+
+
+Paste the SSH key that you copied in Step 3 in the **Key** field, enter a title for the SSH key in the **Title** field, set **Usage type** to **Authenticatioin & signing**, and set the ***Expiration date(optional)**. Finally, click on the **Add key** button.
+
+
+
+
+
+
+
+
+
+
+
+### Step 5: Finish the GitSync configuration on ToolJet
+
+Go back to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message.
+
+
+
+
+
+
+
+
+
+
+
+## Enable/Disable GitSync
+
+To enable or disable the GitSync feature, go to the **Configure git** tab on the **Workspace settings** page, and toggle on/off the **Connect** switch. This is only available if the GitSync feature is configured.
+
+**When enabled**
+
+On clicking the GitSync button, the users will be able to commit changes to the git repository.
+
+**When disabled**
+1. For non-admin users: The users will not be able to commit changes to the git repository. They will see a dialogue box that the GitSync feature is not configured and they need to contact the admin to configure it.
+2. For admin users: The users will see a dialogue box with a link to configure the GitSync feature.
+
+
+
+
+
+
+
+
+
+
+
+## Delete GitSync configuration
+
+To delete the GitSync configuration, go to the **Configure git** tab on the **Workspace settings** page, and click on the **Delete configuration** button. This will delete the SSH key from the ToolJet configuration and the GitSync feature will be disabled.
+
+**Note:** Deleting the GitSync configuration will not delete the apps from the git repository. The apps will still be available in the git repository in the same state as they were before the GitSync configuration was deleted.
+
+
+
+
+
+
+
+
+
+## Git repo
+
+Once the initial commit is made, you can see the app files in the git repository. The repository will have the individual app folders and a **.meta** folder. The app folders will be named as the app name and will have the respective **JSON** file of the application. The **.meta** folder will have the `meta.json` file that contains the meta information of each application synced to git repo.
+
+The **meta.json** file holds information about apps such as the **App name**, **last commit message**, **last commit user**, **last commit date**, **version name**, and **version id**.
+
+
+
+
+
+
+
+
+
+## Pushing changes to git repo
+
+Once the GitSync feature is configured, you can start pushing changes to the git repository.
+
+
+
+### App creation
+
+When you create a new app, you will see an option to select the `Commit changes`. If you select the `commit changes` option, the changes will be committed to the git repository.
+
+:::info
+If the app name is same as the name of the existing app in the git repo, it will overwrite the existing app in the git repo.
+:::
+
+
+
+
+
+Selecting the `Commit changes` option will create a new commit in the git repository. The commit message will be `App creation` and the author will be the user who created the app.
+
+
+
+
+
+
+
+
+
+### App rename
+
+Whenever an app is renamed, the changes will be automatically committed to the git repository. The commit message will be `App is renamed` and the author will be the user who renamed the app.
+
+
+
+
+
+
+
+
+
+### App updates
+
+Whenever a user makes a change in an app, they can make a commit to the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to enter the commit message. The user can enter the commit message and click on the **Commit changes** button to commit the changes to the git repository. Along with the commit message, the user can also see the connnected **Git repo URL** and the **last commit details**.
+
+**Last commit details** helps the user to know the last commit message, author, date, and time. This helps the user to know the last commit details and make the commit message accordingly.
+
+
+
+
+
+Once the changes are committed, the user can see the commit message, author, and date in the git repository.
+
+
+
+
+
+
+
+
+
+### App deletion
+
+Whenever a user deleted an app from the workspace, the app will not be deleted from the git repository. The app will be available in the git repository in the same state as it was before the app was deleted.
+
+
+
+
+
+### App version update
+
+When a user creates a new version of an app, there will be an option to select the `Commit changes`. If you select the `commit changes` option, the new version of the app will be committed to the git repository.
+
+
+
+
+
+The **JSON** file in the app folder will be replaced with the new version of the app, the **meta.json** file in the **.meta** folder gets updated with the new version id and version name. The commit message will be `Version creation` and the author will be the user who created the new version of the app.
+
+
+
+
+
+
+
+
+
+
+
+## Pulling changes from git repo
+
+You can configure the GitSync feature on another workspace to pull the changes from the git repository. To configure the GitSync feature on another workspace, follow the steps mentioned in the [Setting up GitSyncing with GitLab](#setting-up-gitsyncing-with-gitlab) section.
+
+Once the GitSync feature is configured, go to the ToolJet dashboard and click on the three dots on the right side of the **Create new app** button. Click on the **Import from git repository** option.
+
+
+
+
+
+On clicking the **Import from git repository** option, a modal will open with the dropdown to select the app to be imported from the git repository. Once the app is selected, the app name and the last commit will be displayed. Click on the **Import app** button to import the app from the git repository.
+
+:::caution
+- The app imported from the git repository cannot be edited.
+- The app imported from the Git repository should have a unique name. If the app's name is the same as that of an existing app in the workspace, the user will need to either rename the existing app or delete it to successfully import another app with the same name.
+- Workspace constants are not synced with the git repository. After pulling the app, if the app throws an error, the user will need to manually add the workspace constants.
+:::
+
+
+
+
+
+
+
+### Checking for updates
+
+You can check for updates in the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to **Check for updates**. Click on the **Check for updates** button to check for updates in the git repository. If there are any updates, you will see the details of the updates such as commit message, author, and the date in the modal. Click on the **Pull changes** button to pull the changes from the git repository.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/versioned_docs/version-2.27.0/how-to/access-users-location.md b/docs/versioned_docs/version-2.27.0/how-to/access-users-location.md
index 1b7cfd7194..02a6bed322 100644
--- a/docs/versioned_docs/version-2.27.0/how-to/access-users-location.md
+++ b/docs/versioned_docs/version-2.27.0/how-to/access-users-location.md
@@ -51,9 +51,9 @@ To protect the user's privacy, Geolocation API requests permission to locate the
- Now, go to the **Advanced** tab and enable the `Run query on page load?` option. Enabling this option will run this javascript query every time the app is opened by the user and the query will return the location
-- **Save** the query and hit the fire button
+- **Save** the query and hit the **Run** button
-- As soon as you hit the fire button, the browser will prompt you to allow the permission to share the location access to ToolJet app. You'll need to **allow** it to return the location data
+- As soon as you hit the **Run** button, the browser will prompt you to allow the permission to share the location access to ToolJet app. You'll need to **allow** it to return the location data
diff --git a/docs/versioned_docs/version-2.27.0/how-to/bulk-update-multiple-rows-in-table.md b/docs/versioned_docs/version-2.27.0/how-to/bulk-update-multiple-rows-in-table.md
index f518b117ac..8026034e79 100644
--- a/docs/versioned_docs/version-2.27.0/how-to/bulk-update-multiple-rows-in-table.md
+++ b/docs/versioned_docs/version-2.27.0/how-to/bulk-update-multiple-rows-in-table.md
@@ -1,66 +1,58 @@
---
id: bulk-update-multiple-rows
-title: Bulk update multiple rows in table
+title: Bulk Update Multiple Rows in Table
---
-# Bulk update multiple rows in table
+For the purpose of this guide, it's presumed that you've already established a successful connection to your data source. We'll use PostgreSQL for this example, but you can adjust the queries based on the SQL database that you are using.
-Currently, the data sources in ToolJet have operation for **bulk update(GUI mode)** but that only works for changes made in the single row. We will soon be adding a new operation for bulk updating the multiple rows but for now we can bulk update multiple rows by creating a Custom JS query.
+## 1. Create a Query to Get the Data
-In this guide, We have assumed that you have successfully connected the data source. For this guide, we will be using the PostgreSQL data source as an example database. Currently, this workaround can be used only for PostgreSQL and MySQL.
-
-## 1. Create a query to get the data from the database
-
-- Create a postgresql query in **SQL mode** and enter
+- Create a PostgreSQL query in SQL mode, rename it to *users* and enter the below code.
```sql
-SELECT * FROM tooljet // replace tooljet with your table name
+SELECT * FROM
// *replace
with your table name*
+```
+- Enable the `Run the query on application load?` option to execute the query automatically when the application starts.
+- Click on the **Run** button to fetch the data from the database.
+
+
+
+
+
+
+## 2. Display the Data on the Table
+
+- Drag and drop a **Table** component onto the canvas from the components library on the right.
+- Click on the Table component to open its properties on the right sidebar.
+- To populate the Table with the data returned by the query, add the below code under the `Data` field of the Table:
+```js
+{{queries.users.data}}
```
-- Hit **Run** to fetch the data from the database
-
-
-
-
+
-## 2. Display the data on the table
+## 3. Make the Columns Editable
-- Go to the **Components** library on the right and drag a **Table** component onto the canvas
-- Click on the handle of the **Table** component to open its properties on the right sidebar
-- Populate the table with the data from the query by entering **`{{queries..data}}`** in the **Data** field
+- Under the Columns accordion, click on the column name that you want to make editable.
+- On clicking the column name, a new section will open. Enable the toggle for `Make editable` to make the column editable.
-
-
-
-
-
-## 3. Make the columns editable
-
-- Under the **Columns** accordion, click on the column name that you want to make editable
-- On clicking the column name, a new section will open. Enable the toggle for **Make editable** to make the column editable
-
-
-
-
-
+
## 4. Enable Multiple Row Selection
-- Under the **Row Selection** accordion, enable the **Allow Selection**, **Highlight Selected Row**, and **Bulk Selection** option
+- Under the Row Selection accordion, enable the `Allow Selection`, `Highlight Selected Row`, and `Bulk Selection` option.
-
-
-
+
## 5. Create a Custom JS query
-- Create a new Run Javascript query and use the code below to generate the SQL query for updating multiple rows.
+- Create a new Run Javascript query and use the code below to generate the SQL query for updating multiple rows. The query will be named as *runjs1* by default.
```js
const uniqueIdentifier = "id"
@@ -80,54 +72,50 @@ const sql = cols.map((column) => {
return sql
```
-:::info
-Here the **Unique identifier** is **id**, this is the column name that is used to identify the row in the database.
-Update the **Unique identifier** if you are using a different column name.
-Update **table1** with the name of the table you are using.
-:::
+
+Here the unique identifier is **id** and Table component's name is **table1**. You can update the unique identifier if you are using a different column as a unique identifier. You can also update the Table name if you have renamed it, the default name is *table1*.
+
-
-
-
+
-## 6. Create an Update query
+## 6. Create an Update Query
-- Create a postgresql query in **SQL mode** and rename it as **update**:
+- Create a PostgreSQL query in SQL mode and rename it to *update*:
```sql
{{queries.runjs1.data.join(' ')}}
```
-- This query will run the SQL query generated by the runjs1 query.
+- This query will run the SQL query generated by the *runjs1* query.
-
-
-
+
-## 7. Adding event handlers to execute queries in sequence
-
-- Edit the **Table** component and add the event handler for **Save Changes** event so that whenever a user will edit the table and hit the **Save Changes** button the runjs1 query will run.
-- Add **loading state** to table so that whenever the **users** or **update** query is running the table will show a loading state.
+## 7. Adding Event Handlers to Execute Queries in Sequence
+- Edit the Table component and add an event handler for `Save Changes` event so that whenever a user will edit the Table and hit the Save Changes button the *runjs1* query will run.
+- Optionally, add loading state to the Table by clicking on `fx` next to the `Loading state` property.
+- Use the below code to show the loading state whenever a query is getting executed.
```js
-{{queries.users.isLoading || queries.update.isLoading}} // add this in the loading state field of the table
+{{queries.users.isLoading || queries.update.isLoading}}
```
-
-
-
+
-- Now, go to the **runjs1** query and add a **Event** to run update query for **Query Success** Event. This will run the update query whenever the runjs1 query will be run.
+- Now, go to the *runjs1* query and add an event to run the *update* query for Query Success event. This will run the *update* query after the *runjs1* query is successfully executed.
-
-
-
+
-- Finally, go to the **update** query and add a **Event** to run the users query for **Query Success** Event. This will refresh the table whenever the update query will be run.
\ No newline at end of file
+The data needs to reload once the *update* query runs since we want the Table component to be populated with the updated data.
+
+- Add a new event handler in the *update* query.
+- Select Query Success as the Event and Run Query as the Action.
+- Select *users* as Query.
+
+This will refresh the table whenever the *update* query will be run.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/how-to/conditionally-format-table.md b/docs/versioned_docs/version-2.27.0/how-to/conditionally-format-table.md
new file mode 100644
index 0000000000..a5d335b648
--- /dev/null
+++ b/docs/versioned_docs/version-2.27.0/how-to/conditionally-format-table.md
@@ -0,0 +1,131 @@
+---
+id: conditionally-format-table
+title: Conditional Formatting in Table
+---
+
+Conditional formatting enhances the visual representation of data by allowing you to dynamically adjust the appearance of cells in table component based on specific conditions. This how-to guide will guide you through the process of implementing advanced conditional formatting for text color and background color in a Table component.
+
+## Create a New Application and Set Up Data Source
+
+1. Create a new application and add a Table component to the canvas.
+
+2. Open the Query Panel at the bottom and click on the `+ Add` button.
+
+3. Choose REST API as your data source and set the method to GET.
+
+4. Enter the following URL as REST API endpoint:
+ ```bash title="REST API Endpoint"
+ https://fakestoreapi.com/products
+ ```
+
+5. Click on the **Preview** button to view the data. Execute the query by clicking on the **Run** button.
+
+
+
+
+
+## Display Data on the Table
+
+1. Hide the Query Panel and click on the Table component to open its configuration panel.
+
+2. Under **Table Data**, enter the following code:
+ ```js title="Table Data"
+ {{queries.restapi1.data}}
+ ```
+
+
+
+
+
+## Enabling Conditional Formatting
+
+1. Go to the **Columns** property of the Table component.
+
+2. Select the column for which you want to enable conditional formatting (e.g., category).
+
+3. If the column type is set to `Default` or `String`, you can set the conditional formatting for **text color** and **cell background color**.
+
+ **Note**: Only `cellValue` and `rowData` can be used as identifiers for conditional formatting.
+
+
+
+
+
+## Conditional Formatting using Cell Value
+
+### Example 1: Changing Text Color Based on Cell Value
+
+1. Select the `Rate` column which has a column type of `Default`/`String`. This column contains the rating of each product on a scale of 1 to 5.
+
+2. Under the **Text Color** propert, enter the following condition:
+
+ ```js
+ {{cellValue < 2 ? 'red' : cellValue > 2 && cellValue < 3 ? 'Orange' : 'green'}}
+ ```
+
+ The above condition will change the text color to red if the cell value is less than 2, orange if the cell value is greater than 2 and less than 3, and green if the cell value is greater than 3.
+
+
+
+
+
+
+### Example 2: Changing Cell Background Color Based on Cell Value
+
+- Select the `Rate` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{cellValue >= 4 ? 'lightgreen' : cellValue >= 3 ? 'lightyellow' : 'lightcoral'}}
+ ```
+
+ The above condition will change the cell background color to lightgreen if the cell value is greater than or equal to 4, lightyellow if the cell value is greater than or equal to 3, and lightcoral if the cell value is less than 3.
+
+
+
+
+
+## Conditional Formatting using Row Data
+
+### Example 1: Changing Text Color Based on Row Data
+
+- Select the `Title` column, enter the following condition under the **Text Color** property:
+
+ ```js
+ {{rowData.price > 50 ? '#D9534F' : (rowData.rating.rate >= 4 ? '#5CB85C' : rowData.rating.rate >= 3 ? '#F0AD4E' : '#D9534F' )}}
+ ```
+
+ The above condition will change the text color of the `Title` based on the value of the `price` and `rating` columns. If the value in the `price` column is greater than 50, the text color will be red. If the value in the `rating` column is greater than or equal to 4, the text color will be green. If the value in the `rating` column is greater than or equal to 3, the text color will be yellow. Otherwise, the text color will be red.
+
+
+
+
+
+### Example 2: Changing Cell Background Color based on Row Data
+
+- In this example, we will change the cell background color of the `Title` column based on the category of the product.
+
+- Select the `Title` column, enter the following condition under the **Cell Background Color** property:
+
+ ```js
+ {{rowData.category === "electronics" ? 'cyan' : rowData.category === "jewelery" ? 'pink' : 'lightgray'}}
+ ```
+
+ The above condition will change the cell background color of the `Title` column based on the value of the `category` column. If the value in the `category` column is `electronics`, the cell background color will be cyan. If the value in the `category` column is `jewelery`, the cell background color will be pink. Otherwise, the cell background color will be lightgray.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+By following these steps, you can implement advanced conditional formatting for text color and cell background color in your Table component. Experiment with different conditions and color combinations to create visually appealing and informative tables in your applications.
+
diff --git a/docs/versioned_docs/version-2.27.0/how-to/delete-multiple-rows-table.md b/docs/versioned_docs/version-2.27.0/how-to/delete-multiple-rows-table.md
index a14e35bd67..775c961995 100644
--- a/docs/versioned_docs/version-2.27.0/how-to/delete-multiple-rows-table.md
+++ b/docs/versioned_docs/version-2.27.0/how-to/delete-multiple-rows-table.md
@@ -1,63 +1,58 @@
---
id: delete-multiple-rows
-title: Delete multiple rows in table
+title: Delete Multiple Rows in a Table
---
-The table component in the ToolJet has the option for bulk selection of rows that can have various use cases such as **updating** or **deleting** records. However, the datasources does not support bulk delete or bulk update operations.
+This guide explains how to delete multiple rows from a table, assuming you've already connected to a data source. We'll use PostgreSQL for this example, but you can adjust the queries based on the SQL database that you are using.
-In this guide, we will learn how we can delete multiple rows in a table. We have assumed that you have successfully connected the data source. For this guide, we will be using the PostgreSQL data source as an example database, currently, this workaround can be used only for PostgreSQL and MySQL.
+## 1. Create a Query to Fetch the Data from the Database
-## 1. Create a query to fetch the data from the database
+- Create a new query and name it *getRecords*.
+- Select SQL mode and enter the following query:
-Create a new query, name it `getRecords` and use SQL mode:
```sql
SELECT * FROM tooljet // replace tooljet with your table name
```
-
-
-
+- Enable the `Run the query on application load?` option to execute the query automatically when the application starts.
+
+
-Enable the **Run the query on application load?** option. This will ensure that the query is executed when the application is loaded.
+## 2. Populating the Table with Data
-## 2. Load the data on the table
-
-Now, we will load the data on the table. For this, we will use the `getRecords` query that we created in the previous step. Drag the table component from the right sidebar and drop it on the canvas.
-
-On table properties, go to the table data property and set the value to `{{queries.getRecords.data}}`. This will load the data from the `getRecords` query on the table.
-
-Run the query and you should see the data loaded on the table.
-
-
-
-
+- Drag and drop a **Table** component on the canvas.
+- In Table properties, go to the `Data` property and set the value to `{{queries.getRecords.data}}`.
+- Now if you run the *getRecords* query, the returned data will be loaded in the Table component.
+
+
-## 3. Enable bulk row selection on table
+## 3. Enable Bulk Row Selection on Table
-Now, we will enable the bulk row selection on the table. For this, go to the table properties and enable the **Bulk selection** option. Enabling this option will allow you to select multiple rows on the table. This option is disabled by default.
+- Go to the Table properties and enable the `Bulk selection` option.
+- Enabling this option will allow you to select multiple rows on the table.
-
-
-
+
-## 4. Create a custom javascript query
+## 4. Create a Custom JavaScript Query
-Now, we will create a custom javascript query that will **generate a SQL statement** to delete the selected rows from the table component based on a list of selected IDs, assuming the IDs are stored in the **id** column and that the name of the table component is **table1**. The actual database name should be replaced with **tooljet** as indicated in the SQL statemnent in the code below:
+- Create a new Run Javascript code query. It will be named *runjs1* by default.
+- Enter the following code:
```js
const uniqueIdentifier = "id";
+
const idsToDelete = Object.values(components.table1.selectedRows).map(dataUpdate => dataUpdate[uniqueIdentifier]);
const idsString = idsToDelete.map(id => `'${id}'`).join(', ');
@@ -67,85 +62,70 @@ const SQL = `DELETE FROM tooljet WHERE ${uniqueIdentifier} IN (${idsString});`;
return SQL;
```
-If you click on the **Preview** button, you should see the SQL statement generated by the query:
+The above code generates a SQL query that deletes rows from the database table where the `id` field matches the selected IDs in ToolJet's Table component.
-
+- Click on the **Preview** button to see the SQL statement generated by the query.
-
+
+
+
+*If you're using a different column as the unique identifier, feel free to update the code accordingly. You can also update the Table name if you have renamed it, the default name is *table1*.*
+
+- Select a few rows on the Table component and then Preview the SQL query generated by the *runjs1* query.
+
+
+
-Now, let's select a few rows on the table and then preview the SQL query generated by the javascript query:
-
-
-
-
-
-
-
-
-
-## 5. Create a new query to delete the rows
-
-Now, we will create a new query to delete the rows from the table. Create a new query, name it `delete` and use SQL mode:
+## 5. Create a New Query to Delete the Rows
+- Create a new query, name it `delete`, and select SQL mode.
+- Enter the following code:
```sql
-{{queries.runjs1.data}} // replace runjs1 with the name of the javascript query
+{{queries.runjs1.data}}
```
-In this query, we are dynamically loading the SQL statement generated by the javascript query.
-
-
-
-
+In this query, we are dynamically loading the SQL statement generated by the JavaScript query.
+
+
-## 6. Add a button to delete the selected rows
+## 6. Add a Button to Delete the Selected Rows
-Now, we will add a button to delete the selected rows from the table. Drag the button component from the right sidebar and drop it on the canvas. Edit its properties and set the **Button text** to **Delete**.
-
-Add a new **Event** to the button on **On click** event to trigger the **Run Query** action and select the `runjs1` query that we created in the previously.
-
-
-
-
+- Drag and drop a **Button** component on the canvas.
+- Edit its properties and set the `Button text` property to "Delete selected".
+- Add a new **Event** to the button.
+- Select On click as the Event, Run Query as the Action, and *runjs1* as the Query.
+
+
-
-
-Optionally, we can add a loading state to the button whenever the `delete` or `getRecords` query is running:
+- Optionally, we can add a loading state to the Button whenever the *delete* or *getRecords* query is running:
```js
{{queries.delete.isLoading || queries.getRecords.isLoading}}
```
-Now, whenever you click on the button, the javascript query will generate a SQL statement to delete the selected rows from the table but to delete the rows from the database, we need to add event handler to the **runjs1** query to trigger the **delete** query whenever the `runjs1` query is **executed and successfull**.
-
-
-
-
+- Add a new **Event** to the *runjs1* query.
+- Select Query Success as the Event, Run Query as the Action and *delete* as the Query.
+
+
-
+Now, whenever you click on the Button component, the *runjs1* query will run and generate a delete SQL statement with selected rows on the table. Once the *runjs1* query executes, the *delete* query will execute and delete the rows from the database.
-Now, whenever you click on the button, the javascript query will generate a delete SQL statement with selected rows on the table and the `delete` query will delete the rows from the database.
-
-Similarly, you can add an Event to the **delete** query to trigger the **getRecords** query whenever the `delete` query is executed and successful. This will ensure that the table is updated with the latest data from the database.
-
-
-
-
+- Add a new **Event** to the *delete* query.
+- Select Query Success as the Event, Run Query as the Action and *getRecords* as the Query.
+
+
-
-
-## 7. Preview the application
-
-The application is now ready. Click on the **Preview** button on the topbar of the app builder to preview the application.
\ No newline at end of file
+By implementing this, we are ensuring that every time rows are deleted, the Table component will automatically refresh to display the most recent data fetched from the database.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/how-to/import-external-lib-py.md b/docs/versioned_docs/version-2.27.0/how-to/import-external-lib-py.md
index 7c805bcef6..6dc70b740a 100644
--- a/docs/versioned_docs/version-2.27.0/how-to/import-external-lib-py.md
+++ b/docs/versioned_docs/version-2.27.0/how-to/import-external-lib-py.md
@@ -1,98 +1,87 @@
---
id: import-external-libraries-using-runpy
-title: Import external libraries using RunPy
+title: Import External Libraries Using RunPy
---
ToolJet allows you to utilize python packages in your app by importing them using the [RunPy query](/docs/data-sources/run-py).
-In this how-to guide, we will import a few packages and use it in the application.
+In this how-to guide, we will import a few packages and use them in the application.
:::caution Unsupported modules
-The modules that are not currently supported in Pyodide are those that have C or C++ extensions that rely on system libraries. These modules cannot be used in Pyodide because it runs in a web browser, which does not have access to the underlying system libraries that the C or C++ extensions rely on. Additionally, Pyodide uses a version of Python that has been compiled to WebAssembly, which does not support the same system calls as a regular version of Python. Therefore, any module that requires access to system libraries or system calls will not work in Pyodide.
+Modules with C/C++ extensions needing system libraries won't work in Pyodide, as it runs in a web browser without system library access. Pyodide, based on WebAssembly-compiled Python, also doesn't support certain system calls.
:::
-- Create a new application and then create a new RunPy query from the query panel.
-
+- Start by creating a new application in ToolJet.
+- From the Query Panel, add a new RunPy query - it will be named *runpy1* by default.
+
+
-
+- Use micropip to install packages like Pandas and NumPy. **Run** the query to complete installation.
-- Let's write some code for importing packages. We will first import the micropip which is a package installer for Python and then we will install the `Pandas` and `NumPy` using micropip. **Run** the query to install the packages.
- ```python
- import micropip
- await micropip.install('pandas')
- await micropip.install('numpy')
- ```
+```python
+import micropip
+await micropip.install('pandas')
+await micropip.install('numpy')
+```
-
-
+
+
-
-
-:::tip
-Enable the **Run this query on application load?** option to make the packages available throughout the application.
-:::
+- Enable `Run this query on application load?` to make these packages available every time the application loads.
-## Examples
+## Generating Random Numbers with NumPy
-### Array of random numbers of using NumPy
+- Create a RunPy query using NumPy's random module to generate random numbers.
-- Let's create a **RunPy** query that will use **random** module from the **NumPy** package and the query will generate array of random numbers.
- ```python
- from numpy import random
-
- x = random.binomial(n=10, p=0.5, size=10)
-
- print(x)
- ```
-
-
+*You can check the output on the browser's console.*
-:::info
-You can check the output on the browser's console.
-:::
+## Parse CSV data
-### Parse CSV data
+- Create a RunPy query to parse CSV data using `StringIO`, `csv`, and `Pandas` module.
-- Let's create a RunPy query that will parse the data from the csv file. In this query we will use `StringIO`, `csv`, and `Pandas` module.
- ```python
- from io import StringIO
- import csv
- import pandas as pd
+```python
+from io import StringIO
+import csv
+import pandas as pd
- scsv = components.filepicker1.file[0].content
+scsv = components.filepicker1.file[0].content
- f = StringIO(scsv)
- reader = csv.reader(f, delimiter=',')
+f = StringIO(scsv)
+reader = csv.reader(f, delimiter=',')
- df = pd.DataFrame(reader)
+df = pd.DataFrame(reader)
- print(df.info())
- print(df)
- ```
-
-
+print(df.info())
+print(df)
+```
+
+
-
-
-- Add a file picker component on the canvas and set a event handler for **On file loaded** event to **Run Query** that we created for parsing the data.
-
+- Add a **File Picker** component on the canvas
+- Select `On File Loaded` as the Event and Run Query as the Action.
+- Select the query we just created as the Query.
+
+
-
-
-- Finally, let's load a csv file on the file picker and check the output by the RunPy query on the browser console.
-
+- Finally, load a csv file on the File Picker component, **Run** related RunPy query and check the output on the browser console.
+
-
-
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/how-to/print-multitabs.md b/docs/versioned_docs/version-2.27.0/how-to/print-multitabs.md
new file mode 100644
index 0000000000..750d663b05
--- /dev/null
+++ b/docs/versioned_docs/version-2.27.0/how-to/print-multitabs.md
@@ -0,0 +1,238 @@
+---
+id: print-multi-tabs-report
+title: Print data from multiple tabs
+---
+
+
+In this guide, we will learn how to print data from multiple tabs in ToolJet. This will be useful when you want to print an invoice or a report from your ToolJet application. For example, a tooljet app that has a set of tabs for each invoice and you want to print all the tabs in one go.
+
+
+## UI of the app
+
+Build an app with a set of tabs for each record. Each tab will have a set of fields to display the invoice details. In the example below, we have tabs component and each tab has a set of fields to display the record details.
+
+
+
+**Dropdown**: For selecting a specific patient whose data user want to load in the tabs.
+
+**Tabs**: Each tab represents different type of medical record for the selected patient. For this app, we have 5 tabs for each patient. Each tab has a id starting from 0 to 4.
+
+**Button**: Clicking on the button will print the data from all the tabs. The button has two events, the details for which we will share later in this guide.
+
+
+
+
+
+
+
+## Load data from database
+
+
+
+For this app, we are using tooljet database with table name `patient_data`. We created a query called `getPatientList` to fetch data from the database.
+
+
+
+
+
+
+
+Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step.
+
+## Printing data from multiple tabs
+
+To print data from multiple tabs, we will create few javascript queries. Using event handlers, we will run these javascript queries in a sequence to print data from all the tabs.
+
+
+
+Before we start creating the javascript queries, we need to add a few events to the button component:
+
+| Event | Action | Description |
+|:--- |:--- |:--- |
+| `On click` | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. |
+| `On click` | Run query | Select the query named `viewTabs` to run when the button is clicked. |
+
+**Note**: We will create the `viewTabs` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+### viewTabs query
+
+The `viewTabs` query is a javascript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. he query will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 5.
+
+```js title="viewTabs"
+if ((variables?.tabIndex ?? undefined) == undefined) {
+ await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set
+} else if (parseInt(variables.tabIndex) < 5){
+ await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1
+}
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+For the first Query Success event, we will add a `Control component` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true, i.e. if the tabIndex is less than 5. This action will control the `Tabs` component to `Set current tab` to `{{variables.tabIndex}}`. This will set the current tab to the tab with id stored in the `tabIndex` variable, i.e. it will set the current tab to the tab whose id got recently stored in the tabIndex variable via the viewTabs query.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+For the second Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) < 5}}` is true. The query for this event handler will be `getTabsHTML`. We will also add a `debounce` of `100` milliseconds to this event handler.
+
+**Note:** we will create the `getTabsHTML` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+For the third Query Success event, we will select `Run Query` action which will `Run only if` `{{parseInt(variables.tabIndex) === 5}}` is true. The query for this event handler will be `printPDF`. This action will only run when the `tabIndex` is equal to 5, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration.
+
+**Note:** we will create the `printPDF` query later in this guide, so you will need to add the event to the button after you've created the query.
+
+
+
+
+
+
+
+Now that we have created the `viewTabs` query, we can go to the [Download](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs) button and add the `viewTabs` query to the `On click` event handler.
+
+### getTabsHTML query
+
+The `getTabsHTML` is javascript query that will get the html of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the html of all the tabs in the form of an array.
+
+```js title="getTabsHTML"
+actions.setVariable( // set tabsHtml variable
+ "tabsHtml",
+ [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable
+ ((variables?.tabIndex ?? -1) > 0
+ ? `
` // this will help to print data from all the tabs in one go
+ : "") +
+ document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab
+ .innerHTML +
+ "
", // add the html of the current tab to the tabsHtml variable
+ ])
+);
+```
+
+
+
+**This query will have 1 event:**
+
+#### 1. Query Success:
+
+This event will have an action to `Run Query` named `viewTabs`. This will run the `viewTabs` query after the `getTabsHTML` query is successfully executed.
+
+
+
+
+
+
+
+Now that we have created the `getTabsHTML` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#2-query-success) query and add the `getTabsHTML` query to the `Query Success` event handler.
+
+
+
+### printPDF query
+
+The `printPDF` query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs.
+
+```js title="printPDF"
+var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable
+
+var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing
+
+var styles = document.querySelectorAll('link, style');
+var stylesHtml = "";
+for (var i = 0; i < styles.length; i++) {
+ stylesHtml += styles[i].outerHTML;
+} // gather styles from the current page
+
+stylesHtml += ''; // add landscape orientation to the page
+
+winPrint.document.write(
+ "" +
+ stylesHtml +
+ "" +
+ ``
+); // add styles and logo to the page
+
+for (var j = 0; j < printContents.length; j++) {
+ winPrint.document.write(printContents[j]);
+} // add html of all the tabs to the page
+
+winPrint.document.write(""); // Document Finalization and Printing
+winPrint.document.close();
+winPrint.focus();
+winPrint.print();
+winPrint.close();
+```
+
+
+
+**This query will have 3 events:**
+
+#### 1. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsIndex`. This will unset the `tabsIndex` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 2. Query Success:
+
+This event will have an action to `Unset Variable` named `tabsHtml`. This will unset the `tabsHtml` variable after the `printPDF` query is successfully executed.
+
+
+
+
+
+
+
+
+
+#### 3. Query Success:
+
+This event will have an action to `Control component`. This will control the `Tabs` component to `Set current tab` to `{{variables.lastSelectedTab}}` after the `printPDF` query is successfully executed. This will set the current tab to the tab that was selected before the `Download` button was clicked.
+
+
+
+
+
+
+
+
+
+Now that we have created the `printPDF` query, we can go to the [viewTabs](/docs/how-to/print-multi-tabs-report#3-query-success) query and add the `printPDF` query to the `Query Success` event handler.
+
+Finally, we can test the app by selecting a patient and clicking on the `Download` button. This will download a PDF document with the data from all the tabs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/how-to/setup-syslog.md b/docs/versioned_docs/version-2.27.0/how-to/setup-syslog.md
new file mode 100644
index 0000000000..9524c0cea5
--- /dev/null
+++ b/docs/versioned_docs/version-2.27.0/how-to/setup-syslog.md
@@ -0,0 +1,90 @@
+---
+id: setup-rsyslog
+title: Setup log file generation (Rsyslog)
+---
+
+The log file serves as a comprehensive record of audit logs, capturing crucial information about various activities within the ToolJet. Follow the guide below to set up and utilize the log file feature effectively.
+
+## Activation and Configuration
+
+### 1. Environment Variable Setup
+
+- To **activate** the log file feature, simply set the environment variable `LOG_FILE_PATH` to specify the desired path for the log file. For instance, if you want to use `rsyslog` as the log file path, set `LOG_FILE_PATH` to `rsyslog`.
+
+ ```bash
+ LOG_FILE_PATH='rsyslog'
+ ```
+
+
+
+
+
+- The log file path is relative to the home directory of the machine. For instance, if the home directory is `/home/tooljet`, the log file path will be `/home/tooljet/rsyslog`.
+
+### 2. Server Restart
+
+- After configuring the log file environment variable, it's essential to **restart the server** to initiate the log file generation process.
+
+- This step ensures that the server recognizes the new configuration and begins recording audit logs.
+
+## Log Rotation and Organization
+
+### 3. Daily Log Rotation
+
+- The log file is designed to rotate on a daily basis, creating a new log file each day. This configuration aids in efficient management and organization of audit data.
+
+### 4. Log File Path Structure
+
+- The log file path is determined by the `LOG_FILE_PATH` variable. It is crucial to understand that this path is relative to the home directory of the machine. For instance, if `LOG_FILE_PATH` is set to `rsyslog`, the resulting log file path will be structured as follows:
+
+ ```bash
+ homepath/rsyslog/{process_id}-{date}/audit.log
+ ```
+
+ - `{process_id}` is a placeholder for the unique process identifier.
+ - `{date}` represents the current date.
+
+ This structured path ensures that audit logs are organized by both process and date, simplifying traceability and analysis.
+
+
+
+
+
+### 5. Example Log Data
+
+The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata.
+
+
+Example Log file data
+
+```bash
+{
+ level: 'info',
+ message: 'PERFORM APP_CREATE OF awdasdawdwd APP',
+ timestamp: '2023-11-02 17:12:40',
+ auditLog: {
+ userId: '0ad48e21-e7a2-4597-9568-c4535aedf687',
+ organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17',
+ resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829',
+ resourceType: 'APP',
+ actionType: 'APP_CREATE',
+ resourceName: 'awdasdawdwd',
+ ipAddress: '::1',
+ metadata: {
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
+ tooljetVersion: '2.22.2-ee2.8.3'
+ }
+ },
+ label: 'APP'
+}
+```
+
+
+
+### 6. Folder Creation:
+
+The log file feature automatically creates a folder in the home path with the specified name (e.g., `rsyslog`). This folder serves as the root directory for the organized storage of audit logs.
+
+
+
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/how-to/use-axios.md b/docs/versioned_docs/version-2.27.0/how-to/use-axios.md
index a1bd6cc572..3e62a3b72e 100644
--- a/docs/versioned_docs/version-2.27.0/how-to/use-axios.md
+++ b/docs/versioned_docs/version-2.27.0/how-to/use-axios.md
@@ -3,17 +3,13 @@ id: use-axios-in-runjs
title: Use Axios in RunJS
---
-ToolJet allows you to utilize the three [libraries](/docs/data-sources/run-js#libraries) - **Moment.js**, **Lodash**, and **Axios**. In this guide, we will see a few examples on how to use **Axios** library using RunJS query.
+ToolJet supports three libraries: **Moment.js**, **Lodash**, and **Axios**. This guide focuses on using the Axios library with RunJS queries. **[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP client for making requests to your own or external servers. It supports various request types like `GET`, `POST`, `PUT/PATCH`, and `DELETE`.
-**[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP library that lets developers make requests to either their own or a third-party server to fetch data. It offers different ways of making requests such as `GET`, `POST`, `PUT/PATCH`, and `DELETE`.
+## GET Requests
-## Making Axios HTTP requests
+We'll use **[JSONPlaceholder](https://jsonplaceholder.typicode.com/)**, a free API, to demonstrate GET and PUT requests.
-In this section, you will make `GET` and `PUT` requests. You will be using a free “fake” API: **[JSONPlaceholder](https://jsonplaceholder.typicode.com/)**.
-
-### Making a GET request
-
-Create a RunJS query and copy the code below:
+- Create a RunJS query and paste the code below:
```javascript
var url = "https://jsonplaceholder.typicode.com/users/1";
@@ -23,7 +19,7 @@ var data = (await axios.get(url)).data;
return data
```
-In the code snippet, a variable url is declared which is assigned the URL of the JSON API. Then another variable is declared which sends a GET request to the JSON API. Save the query and hit Preview to view the data returned by the API.
+*This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response.*
@@ -31,9 +27,9 @@ In the code snippet, a variable url is declared which is assigned the URL of the
-### Making a POST request
+## POST Requests
-A post request is a little different because you will be passing some data in the request to the server. In the request, you will be creating a user and passing in details for that user. The code snippet for the request will look something like this:
+- Create a RunJS query and paste the code below:
```javascript
var url = "https://jsonplaceholder.typicode.com/users";
@@ -47,7 +43,8 @@ var data = axios.post(url,{
return data
```
-The Axios POST request uses an object after the request URL to define the properties you want to create for your user. Once the operation has been completed, there will be a response from the server. In the screenshot below, you can see the that it return **Status: 201** which means the request has been fulfilled and resulted in a new resource being created.
+This POST request sends user details to the server. The server's response, as shown below, includes **Status: 201** indicating successful resource creation.
+
@@ -55,8 +52,7 @@ The Axios POST request uses an object after the request URL to define the proper
-:::tip
-Check out the tutorial on **[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)** that utilizes the axios library.
-:::
+To see Axios in action in a project, check out this tutorial:
+**[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
diff --git a/docs/versioned_docs/version-2.27.0/org-management/licensing.md b/docs/versioned_docs/version-2.27.0/org-management/licensing.md
index 0f9204f801..999022f953 100644
--- a/docs/versioned_docs/version-2.27.0/org-management/licensing.md
+++ b/docs/versioned_docs/version-2.27.0/org-management/licensing.md
@@ -3,7 +3,9 @@ id: licensing
title: Licensing
---
+
+
ToolJet's **multi-environment** helps in streamlining workflows, thereby minimizing the chances of errors, and enables effective application management. Using multi-environment ensures that your ToolJet application is rigorously tested before it is made available to users.
diff --git a/docs/versioned_docs/version-2.27.0/setup/azure-container.md b/docs/versioned_docs/version-2.27.0/setup/azure-container.md
index 0dfb78125a..e5001e4046 100644
--- a/docs/versioned_docs/version-2.27.0/setup/azure-container.md
+++ b/docs/versioned_docs/version-2.27.0/setup/azure-container.md
@@ -79,9 +79,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/client.md b/docs/versioned_docs/version-2.27.0/setup/client.md
index a29cfb1b60..07c1cf93ce 100644
--- a/docs/versioned_docs/version-2.27.0/setup/client.md
+++ b/docs/versioned_docs/version-2.27.0/setup/client.md
@@ -107,8 +107,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/digitalocean.md b/docs/versioned_docs/version-2.27.0/setup/digitalocean.md
index 0df6ca4994..8413df78c5 100644
--- a/docs/versioned_docs/version-2.27.0/setup/digitalocean.md
+++ b/docs/versioned_docs/version-2.27.0/setup/digitalocean.md
@@ -118,8 +118,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/docker.md b/docs/versioned_docs/version-2.27.0/setup/docker.md
index 449e99e14c..6ffa42d9e8 100644
--- a/docs/versioned_docs/version-2.27.0/setup/docker.md
+++ b/docs/versioned_docs/version-2.27.0/setup/docker.md
@@ -153,9 +153,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/ec2.md b/docs/versioned_docs/version-2.27.0/setup/ec2.md
index 1c10b0e918..bc06e39740 100644
--- a/docs/versioned_docs/version-2.27.0/setup/ec2.md
+++ b/docs/versioned_docs/version-2.27.0/setup/ec2.md
@@ -96,9 +96,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/ecs.md b/docs/versioned_docs/version-2.27.0/setup/ecs.md
index 9a92e088a7..85fed5cdfd 100644
--- a/docs/versioned_docs/version-2.27.0/setup/ecs.md
+++ b/docs/versioned_docs/version-2.27.0/setup/ecs.md
@@ -237,9 +237,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/google-cloud-run.md b/docs/versioned_docs/version-2.27.0/setup/google-cloud-run.md
index 3034395e2f..98c2ae74b1 100644
--- a/docs/versioned_docs/version-2.27.0/setup/google-cloud-run.md
+++ b/docs/versioned_docs/version-2.27.0/setup/google-cloud-run.md
@@ -163,8 +163,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/setup/helm.md b/docs/versioned_docs/version-2.27.0/setup/helm.md
index ce2632a837..799600e8a7 100644
--- a/docs/versioned_docs/version-2.27.0/setup/helm.md
+++ b/docs/versioned_docs/version-2.27.0/setup/helm.md
@@ -45,8 +45,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/setup/kubernetes-aks.md b/docs/versioned_docs/version-2.27.0/setup/kubernetes-aks.md
index 6fad371369..f08d68dc3b 100644
--- a/docs/versioned_docs/version-2.27.0/setup/kubernetes-aks.md
+++ b/docs/versioned_docs/version-2.27.0/setup/kubernetes-aks.md
@@ -64,8 +64,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/kubernetes-gke.md b/docs/versioned_docs/version-2.27.0/setup/kubernetes-gke.md
index 1cbbf82210..45926f4510 100644
--- a/docs/versioned_docs/version-2.27.0/setup/kubernetes-gke.md
+++ b/docs/versioned_docs/version-2.27.0/setup/kubernetes-gke.md
@@ -90,8 +90,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/kubernetes.md b/docs/versioned_docs/version-2.27.0/setup/kubernetes.md
index 168c2cc926..4461c71e36 100644
--- a/docs/versioned_docs/version-2.27.0/setup/kubernetes.md
+++ b/docs/versioned_docs/version-2.27.0/setup/kubernetes.md
@@ -73,8 +73,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/openshift.md b/docs/versioned_docs/version-2.27.0/setup/openshift.md
index ae8f4e5bf7..553387c83b 100644
--- a/docs/versioned_docs/version-2.27.0/setup/openshift.md
+++ b/docs/versioned_docs/version-2.27.0/setup/openshift.md
@@ -79,8 +79,8 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/setup/tooljet-subpath.md b/docs/versioned_docs/version-2.27.0/setup/tooljet-subpath.md
index 51c8a438ad..63d557bc41 100644
--- a/docs/versioned_docs/version-2.27.0/setup/tooljet-subpath.md
+++ b/docs/versioned_docs/version-2.27.0/setup/tooljet-subpath.md
@@ -30,9 +30,9 @@ If this is a new installation of the application, you may start directly with ve
- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss.
-- Ensure that your current version is v2.23.3-ee2.10.2 before upgrading.
+- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading.
-- Users on versions earlier than v2.23.3-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
+- Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to v2.24.3-ee2.10.2.
For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**.
diff --git a/docs/versioned_docs/version-2.27.0/user-authentication/sso/openid/setup.md b/docs/versioned_docs/version-2.27.0/user-authentication/sso/openid/setup.md
index 6d71b15c7f..501152e9d0 100644
--- a/docs/versioned_docs/version-2.27.0/user-authentication/sso/openid/setup.md
+++ b/docs/versioned_docs/version-2.27.0/user-authentication/sso/openid/setup.md
@@ -31,14 +31,30 @@ title: Setup
- Find and set **Name**, **Client Id**, **Client Secret**, and **Well Known URL** from your Open Id provider.
-### Exposed User Info
+### Exposed ssoUserInfo
-If OpenID is configured on ToolJet version **`v2.6.2-ee2.1.0`** or above, the ToolJet apps will expose the `ssoUserInfo` property under the `currentUser` variables. Check the **[Inspector](/docs/app-builder/left-sidebar#inspector)** doc to learn more.
+Once the OpenID is configured (on ToolJet version **`v2.6.2-ee2.1.0`** or above), ToolJet will expose the user info returned by the OpenID provider. The user info will be available under the `ssoUserInfo` property of the `currentUser` variable. Check the **[Inspector](/docs/how-to/use-inspector)** doc to learn more.
The exposed user info can be dynamically accessed throughout the apps using JS **`{{globals.currentUser.ssoUserInfo.}}`**
+The following is an example of the user info returned by Google OpenID provider:
+
+| Key | Description | Syntax to access |
+|:--- |:----------- |:------- |
+| **sub** | Subject - Identifier for the End-User at the Issuer. | `{{globals.currentUser.ssoUserInfo.sub}}` |
+| **name** | End-User's full name in displayable form including all name parts, possibly including titles and suffixes, ordered according to the End-User's locale and preferences. | `{{globals.currentUser.ssoUserInfo.name}}` |
+| **given_name** | Given name(s) or first name(s) of the End-User. | `{{globals.currentUser.ssoUserInfo.given_name}}` |
+| **family_name** | Surname(s) or last name(s) of the End-User. | `{{globals.currentUser.ssoUserInfo.family_name}}` |
+| **picture** | URL of the End-User's profile picture. This URL MUST refer to an image file (for example, a PNG, JPEG, or GIF image file), rather than to a Web page containing an image. | `{{globals.currentUser.ssoUserInfo.picture}}` |
+| **email** | End-User's preferred e-mail address. Its value MUST conform to the RFC 5322 [RFC5322] addr-spec syntax. | `{{globals.currentUser.ssoUserInfo.email}}` |
+| **email_verified** | True if the End-User's e-mail address has been verified; otherwise false. | `{{globals.currentUser.ssoUserInfo.email_verified}}` |
+| **locale** | End-User's locale, represented as a BCP47 [RFC5646] language tag. This is typically an ISO 639-1 Alpha-2 [ISO639‑1] language code in lowercase and an ISO 3166-1 Alpha-2 [ISO3166‑1] country code in uppercase, separated by a dash. For example, en-US or fr-CA. As a compatibility note, some implementations have used an underscore as the separator rather than a dash, for example, en_US; Relying Parties MAY choose to accept this locale syntax as well. | `{{globals.currentUser.ssoUserInfo.locale}}` |
+| **hd** | End-User's hosted domain, if any. | `{{globals.currentUser.ssoUserInfo.hd}}` |
+| **access_token** | Access token returned by the OpenID provider. | `{{globals.currentUser.ssoUserInfo.access_token}}` |
+| **id_token** | ID token returned by the OpenID provider. | `{{globals.currentUser.ssoUserInfo.id_token}}` |
+
-
+
\ No newline at end of file
diff --git a/docs/versioned_docs/version-2.27.0/workflows/overview.md b/docs/versioned_docs/version-2.27.0/workflows/overview.md
index 5344f79f62..d28b1c5c69 100644
--- a/docs/versioned_docs/version-2.27.0/workflows/overview.md
+++ b/docs/versioned_docs/version-2.27.0/workflows/overview.md
@@ -2,7 +2,9 @@
id: overview
title: Overview
---
+
+
ToolJet Workflows is a visual, node-based platform tailored for data-centric automation tasks. With its intuitive design, users can create detailed queries across diverse data sources, manage conditional flows, and execute custom JavaScript code while making the processes presentable and easy to manage.
diff --git a/docs/versioned_docs/version-2.3.0/data-sources/smtp.md b/docs/versioned_docs/version-2.3.0/data-sources/smtp.md
index 120f2b1d08..de8aa51392 100644
--- a/docs/versioned_docs/version-2.3.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.3.0/data-sources/smtp.md
@@ -42,7 +42,7 @@ To create a query for sending email, you will need to provide the following prop
- **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields.
- **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field.
- For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.3.0/getting-started.md b/docs/versioned_docs/version-2.3.0/getting-started.md
index 0a92901bb3..c33ec03c06 100644
--- a/docs/versioned_docs/version-2.3.0/getting-started.md
+++ b/docs/versioned_docs/version-2.3.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.3.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.4.0/data-sources/smtp.md b/docs/versioned_docs/version-2.4.0/data-sources/smtp.md
index 120f2b1d08..de8aa51392 100644
--- a/docs/versioned_docs/version-2.4.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.4.0/data-sources/smtp.md
@@ -42,7 +42,7 @@ To create a query for sending email, you will need to provide the following prop
- **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields.
- **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field.
- For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.4.0/getting-started.md b/docs/versioned_docs/version-2.4.0/getting-started.md
index b19e1b2087..ac3e15775c 100644
--- a/docs/versioned_docs/version-2.4.0/getting-started.md
+++ b/docs/versioned_docs/version-2.4.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.4.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.5.0/data-sources/smtp.md b/docs/versioned_docs/version-2.5.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.5.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.5.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.5.0/getting-started.md b/docs/versioned_docs/version-2.5.0/getting-started.md
index b02dd32bf8..d674e0a119 100644
--- a/docs/versioned_docs/version-2.5.0/getting-started.md
+++ b/docs/versioned_docs/version-2.5.0/getting-started.md
@@ -230,7 +230,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.5.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.6.0/data-sources/smtp.md b/docs/versioned_docs/version-2.6.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.6.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.6.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.6.0/getting-started.md b/docs/versioned_docs/version-2.6.0/getting-started.md
index 2fdb91b39c..e9c76e8243 100644
--- a/docs/versioned_docs/version-2.6.0/getting-started.md
+++ b/docs/versioned_docs/version-2.6.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.6.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.7.0/data-sources/smtp.md b/docs/versioned_docs/version-2.7.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.7.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.7.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.7.0/getting-started.md b/docs/versioned_docs/version-2.7.0/getting-started.md
index 2fdb91b39c..6b5ca1bfb5 100644
--- a/docs/versioned_docs/version-2.7.0/getting-started.md
+++ b/docs/versioned_docs/version-2.7.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.7.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.8.0/data-sources/smtp.md b/docs/versioned_docs/version-2.8.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.8.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.8.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.8.0/getting-started.md b/docs/versioned_docs/version-2.8.0/getting-started.md
index 2fdb91b39c..4ad68662bd 100644
--- a/docs/versioned_docs/version-2.8.0/getting-started.md
+++ b/docs/versioned_docs/version-2.8.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.8.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.9.0/data-sources/smtp.md b/docs/versioned_docs/version-2.9.0/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.9.0/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.9.0/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
diff --git a/docs/versioned_docs/version-2.9.0/getting-started.md b/docs/versioned_docs/version-2.9.0/getting-started.md
index f379448ca4..42cd6bc9f0 100644
--- a/docs/versioned_docs/version-2.9.0/getting-started.md
+++ b/docs/versioned_docs/version-2.9.0/getting-started.md
@@ -231,7 +231,7 @@ Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**.
## For ToolJet Contributors
-To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**.
+To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/2.9.0/category/contributing-guide)**.
[](https://github.com/ToolJet/ToolJet/contributors)
[](https://github.com/ToolJet/ToolJet/issues)
diff --git a/docs/versioned_docs/version-2.9.4/data-sources/smtp.md b/docs/versioned_docs/version-2.9.4/data-sources/smtp.md
index 9f09a14ac4..5c7ed35a17 100644
--- a/docs/versioned_docs/version-2.9.4/data-sources/smtp.md
+++ b/docs/versioned_docs/version-2.9.4/data-sources/smtp.md
@@ -48,7 +48,7 @@ To create a query for sending an email, follow these steps:
- **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields.
- **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field.
-For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` objects to include attachments.
+For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments.
Duplicate the following parts of the group
@@ -589,6 +593,7 @@ const Field = ({
buttonDisable = false,
tooltipContent = '',
tooltipId = '',
+ darkMode = false,
}) => {
return (