diff --git a/.env.example b/.env.example
index d31e89dd21..bd33d9cdb0 100644
--- a/.env.example
+++ b/.env.example
@@ -34,11 +34,11 @@ SMTP_PASSWORD=
SMTP_DOMAIN=
SMTP_PORT=
-# DISABLE USER SIGNUPS (true or false). only applicable if MULTI_ORGANIZATION=true
+# DISABLE USER SIGNUPS (true or false). only applicable if Multi-Workspace feature is enabled
DISABLE_SIGNUPS=
-# Enables all multi organization features
-MULTI_ORGANIZATION=
+# Disable Multi-Workspace features (true or false)
+DISABLE_MULTI_WORKSPACE=
# OBSERVABILITY
APM_VENDOR=
diff --git a/app.json b/app.json
index 17d25a93c9..703237fcfb 100644
--- a/app.json
+++ b/app.json
@@ -34,11 +34,11 @@
"value": "--max-old-space-size=4096"
},
"DISABLE_SIGNUPS": {
- "description": "Disable sign up in login page only applicable if MULTI_ORGANIZATION=true",
+ "description": "Disable sign up in login page only applicable if Multi-Workspace feature is turned on",
"value": "false"
},
- "MULTI_ORGANIZATION": {
- "description": "Enables multi organization feature",
+ "DISABLE_MULTI_WORKSPACE": {
+ "description": "Disables Multi-Workspace feature",
"value": "false"
}
},
diff --git a/docs/docs/data-sources/minio.md b/docs/docs/data-sources/minio.md
index 44c8a4e40c..052b332eb6 100644
--- a/docs/docs/data-sources/minio.md
+++ b/docs/docs/data-sources/minio.md
@@ -7,6 +7,15 @@ title: MinIO
ToolJet can connect to minio and perform various operation on them.
+## Supported operations
+
+- **Read object**
+- **Put object**
+- **List buckets**
+- **List objects in a bucket**
+- **Presigned url for download**
+- **Presigned url for upload**
+
## Connection
To add a new minio source, click on the **Add or edit datasource** icon on the left sidebar of the app editor and click on `Add datasource` button. Select Minio from the modal that pops up.
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 d4a570432d..e610c3149f 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,6 +1,6 @@
---
-sidebar_position: 1
-sidebar_label: Bulk update multiple rows in table
+id: bulk-update-multiple-rows
+title: Bulk update multiple rows in table
---
# Bulk update multiple rows in table
diff --git a/docs/docs/how-to/upload-files-aws.md b/docs/docs/how-to/upload-files-aws.md
new file mode 100644
index 0000000000..c6101f4ece
--- /dev/null
+++ b/docs/docs/how-to/upload-files-aws.md
@@ -0,0 +1,137 @@
+---
+id: upload-files-aws
+title: Upload files on AWS S3 bucket
+---
+
+# Upload and download files on AWS S3 bucket
+
+This guide will help you in quickly building a basic UI for uploading or downloading files from AWS S3 buckets.
+
+Before building the UI, check out the **[docs for AWS S3 data source](/docs/data-sources/s3)** to learn about setting up AWS S3 and adding the data source.
+
+Once you have successfully added the AWS data source, build a basic UI using the following widgets:
+- **Dropdown**: For selecting a bucket in S3 storage.
+- **Table**: For listing all the objects inside the selected bucket in dropdown.
+- **Text Input**: For getting a path for the file that is to be uploaded.
+- **File picker**: For uploading the file.
+- **Button**: This will be used to fire the upload query.
+
+
+
+
+
+
+
+## Queries
+
+We'll create the following queries:
+
+1. **getBuckets**
+2. **listObjects**
+3. **uploadToS3**
+4. **download**
+
+### getBuckets
+
+This query will fetch the list of all the buckets in your S3. Just create a new query, select AWS S3 data souce, and choose **List buckets** operation. Name the query **getBuckets** and click **Save**.
+
+
+
+
+
+
+
+Now, let's edit the properties of **dropdown** widget.
+
+- **Label**: Set the label as Bucket.
+- **Option values**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. We're mapping the data returned by the query as the returned data is array of abjects.
+- **Option label**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. This will display the same option label as option values.
+
+You can later add an event handler for running the **listObject** query whenever an option is selected from the dropdown.
+
+
+
+
+
+
+
+### listObjects
+
+This query will list all the objects inside the selected Bucket in dropdown. Select **List objects in a bucket** operation, enter `{{components.dropdown1.value}}` in the Bucket field - this will dynamically get the field value from the selected option in dropdown.
+
+
+
+
+
+
+
+Edit the properties of **table** widget:
+- **Table data**: `{{queries.listObjects.data['Contents']}}`
+- **Add Columns**:
+ - **Key**: Set the **Column Name** to `Key` and **Key** to `Key`
+ - **Last Modified**: Set the **Column Name** to `Last Modified` and **Key** to `LastModified`
+ - **Size**: Set the **Column Name** to `Size` and **Key** to `Size`
+- Add a **Action button**: Set button text to **Copy signed URL**, Add a handler to this button for On Click event and Action to Copy to clipboard, in the text field enter `{{queries.download.data.url}}` - this will get the download url from the **download** query that we will create next.
+
+
+
+
+
+
+
+### download
+
+Create a new query and select **Signed URL for download** operation. In the Bucket field, enter `{{components.dropdown1.value}}` and in Key enter `{{components.table1.selectedRow.Key}}`.
+
+
+
+
+
+
+
+Edit the **properites** of the table, add a Event handler for running the `download` query for `Row clicked` event. This will generate a signed url for download every time a row is clicked on the table.
+
+### uploadToS3
+
+Create a new query, select the **Upload object** operation. Enter the following values in their respective fields:
+- **Bucket**: `{{components.dropdown1.value}}`
+- **Key**: {{ components.textinput1.value + '/' +components.filepicker1.file[0].name}}`
+- **Content type**: `{{components.filepicker1.file[0].type}}`
+- **Upload data**: `{{components.filepicker1.file[0].base64Data}}`
+- **Encoding**: `base64`
+
+
+
+
+
+
+
+#### Configure the file picker:
+
+Click on the widget handle to edit the file picker properties:
+
+- Change the **Accept file types** to `{{"application/pdf"}}` for the picker to accept only pdf files or `{{"image/*"}}` for the picker to accept only image files . In the screenshot below, we have set the accepted file type property to `{{"application/pdf"}}` so it will allow to select only pdf files:
+
+
+
+
+
+
+
+- Change the **Max file count** to `{{1}}` as we are only going to upload 1 file at a time.
+
+- Select a pdf file and hold it in the file picker.
+
+:::info
+ File types must be valid **[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)** type according to input element specification or a valid file extension.
+
+ To accept any/all file type(s), set `Accept file types` to an empty value.
+:::
+
+
+
+
+
+
+
+Final steps, go to the **Advanced** tab of the **uploadToS3** query and add a query to run **listObjects** query so that whenever a file is uploaded the tabled is refreshed.
\ No newline at end of file
diff --git a/docs/docs/intro.md b/docs/docs/intro.md
index 901b7cdbda..6e3fd631ea 100644
--- a/docs/docs/intro.md
+++ b/docs/docs/intro.md
@@ -49,6 +49,7 @@ The references for data sources and widgets:
- **[Build a WhatsApp CRM](https://blog.tooljet.com/build-a-whatsapp-crm-using-tooljet-within-10-mins/)**
- **[Build a cryptocurrency dashboard](https://blog.tooljet.com/how-to-build-a-cryptocurrency-dashboard-in-10-minutes/)**
- **[Build a Redis GUI](https://blog.tooljet.com/building-a-redis-gui-using-tooljet-in-5-minutes/)**
+- **[Build a coupon code manager app](https://blog.tooljet.com/build-a-coupon-code-manager-app-in-10-minutes/)**
## Help and Support
- We have extensively documented the features of ToolJet, but in case you are stuck, please feel to e-mail us at **hello@tooljet.com**
diff --git a/docs/docs/password-login/password-login.md b/docs/docs/password-login/password-login.md
index 620ed24ae7..9297925435 100644
--- a/docs/docs/password-login/password-login.md
+++ b/docs/docs/password-login/password-login.md
@@ -5,9 +5,9 @@ sidebar_label: Password Login
# Password Login
-Password login is enabled by default for all organizations. User with admin privilege can enable/disable it.
+Password login is enabled by default for all workspaces. User with admin privilege can enable/disable it.
-Select `Manage SSO` from organization options
+Select `Manage SSO` from workspace options
diff --git a/docs/docs/setup/env-vars.md b/docs/docs/setup/env-vars.md
index 75fc391d5f..5f8e58df4d 100644
--- a/docs/docs/setup/env-vars.md
+++ b/docs/docs/setup/env-vars.md
@@ -73,14 +73,14 @@ You can specify a different server for backend if it is hosted on another server
| -------- | ---------------------- |
| SERVER_HOST | Configure a hostname for the server as a proxy pass. If no value is set, it defaults to `server`. |
-#### Enable multiple organizations ( optional )
+#### Disable Multi-Workspace ( optional )
-If you want to enable multiple environments, set the environment variable `MULTI_ORGANIZATION` to `true`.
+If you want to disable Multi-Workspace feature, set the environment variable `DISABLE_MULTI_WORKSPACE` to `true`.
#### Disabling signups ( optional )
-Sign up is enabled only for multiple organization environment. If you want to restrict the signups and allow new users only by invitations, set the environment variable `DISABLE_SIGNUPS` to `true`.
+Sign up is enabled only if Multi-Workspace is enabled. If you want to restrict the signups and allow new users only by invitations, set the environment variable `DISABLE_SIGNUPS` to `true`.
:::tip
You will still be able to see the signup page but won't be able to successfully submit the form.
@@ -93,7 +93,7 @@ You can set `SERVE_CLIENT` to `true` and the server will attempt to serve the cl
#### SMTP configuration ( optional )
-ToolJet uses SMTP services to send emails ( Eg: invitation email when you add new users to your organization ).
+ToolJet uses SMTP services to send emails ( Eg: invitation email when you add new users to your workspace ).
| variable | description |
| ------------------ | ----------------------------------------- |
diff --git a/docs/docs/sso/general-settings.md b/docs/docs/sso/general-settings.md
index 87c8bc8d87..82436bbad2 100644
--- a/docs/docs/sso/general-settings.md
+++ b/docs/docs/sso/general-settings.md
@@ -5,7 +5,7 @@ sidebar_label: General Settings
# Single Sign-On General Settings
-Select `Manage SSO` from organization options
+Select `Manage SSO` from workspace options
diff --git a/docs/docs/sso/github.md b/docs/docs/sso/github.md
index 1d5aa22e2f..a7faf8bb4c 100644
--- a/docs/docs/sso/github.md
+++ b/docs/docs/sso/github.md
@@ -5,7 +5,7 @@ title: GitHub
# GitHub Single Sign-on
-Select `Manage SSO` from organization options
+Select `Manage SSO` from workspace options
@@ -55,4 +55,4 @@ Go to [GitHub Developer settings](https://github.com/settings/developers) and na
Lastly, enter `Client Id` and `Client Secret` in Git manage SSO page and save.
-The GitHub sign-in button will now be available in your ToolJet login screen if you have not enabled multiple organization.
+The GitHub sign-in button will now be available in your ToolJet login screen if you have not enabled Multi-Workspace.
diff --git a/docs/docs/sso/google.md b/docs/docs/sso/google.md
index b7a1988265..43c25cbe3d 100644
--- a/docs/docs/sso/google.md
+++ b/docs/docs/sso/google.md
@@ -5,7 +5,7 @@ title: Google
# Google Single Sign-on
-Select `Manage SSO` from organization options
+Select `Manage SSO` from workspace options
@@ -45,7 +45,7 @@ Go to [Google cloud console](https://console.cloud.google.com/) and create a pro
-- You'll be asked to select user type in consent screen. To allow only users within your organization, select 'Internal', otherwise,
+- You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise,
select 'External'.
@@ -82,4 +82,4 @@ Set the `Redirect URL` generated at manage SSO `Google` page under Authorised re
Lastly, set the `client id` in google manage SSO page. This value will be available from your [Google cloud console credentials page](https://console.cloud.google.com/apis/credentials)
-The Google sign-in button will now be available in your ToolJet login screen, if you are not enabled multiple organization.
+The Google sign-in button will now be available in your ToolJet login screen, if you are not enabled Multi-Workspace.
diff --git a/docs/docs/tutorial/adding-a-datasource.md b/docs/docs/tutorial/adding-a-datasource.md
index 2d46d1e914..75a1d2be88 100644
--- a/docs/docs/tutorial/adding-a-datasource.md
+++ b/docs/docs/tutorial/adding-a-datasource.md
@@ -6,7 +6,7 @@ title: Adding a data source
# Adding a data source
:::tip
-The data sources are created on app level and not on organization level.
+The data sources are created on app level and not on workspace level.
:::
**Datasource manager** is on the left-sidebar of the app builder. To add a new data source, click on the `Add datasource` button.
diff --git a/docs/docs/tutorial/manage-users-groups.md b/docs/docs/tutorial/manage-users-groups.md
index 9c3bf778ee..f1d62f21e1 100644
--- a/docs/docs/tutorial/manage-users-groups.md
+++ b/docs/docs/tutorial/manage-users-groups.md
@@ -7,7 +7,7 @@ title: Managing Users and Groups
## Managing Users
-Admin of an organization can add users to the organization. To manage the users in your organization, just go to the **Account menu** on top right corner and click on the **Manage Users**.
+Admin of a workspace can add users to the workspace. To manage the users in your workspace, just go to the **Workspace menu** on top right corner and click on the **Manage Users**.
@@ -17,7 +17,7 @@ Admin of an organization can add users to the organization. To manage the users
### Inviting users
-Admins can invite anyone to a ToolJet organization using the email address. To invite a user:
+Admins can invite anyone to a workspace using the email address. To invite a user:
- On the **Manage Users** page click on the `Invite new user` button.
@@ -35,7 +35,7 @@ Admins can invite anyone to a ToolJet organization using the email address. To i
-- An email including the **Invite Link** to join your organization will be send to the created user. The status will turn from **invited** to **active** after the user successfully joins your organization using the invite link.
+- An email including the **Invite Link** to join your workspace will be send to the created user. The status will turn from **invited** to **active** after the user successfully joins your workspace using the invite link.
:::tip
@@ -51,7 +51,7 @@ You can also copy the invitation url by clicking on the copy icon next to `invit
### Disabling a user's access
-You can disable any active user's access to your organization by clicking on the **Archive** and then the status of the user will change from **active** to **archived**.
+You can disable any active user's access to your workspace by clicking on the **Archive** and then the status of the user will change from **active** to **archived**.
@@ -71,7 +71,7 @@ Similar to archiving a user's access, you can enable it again by clicking on **U
## Managing Groups
-On ToolJet, Admins can create groups for users added in an organization and grant them access to particular app(s) with specific permissions. To manage groups, just go to the **Account menu** on top right corner and click on the **Manage Groups**.
+On ToolJet, Admins can create groups for users added in a workspace and grant them access to particular app(s) with specific permissions. To manage groups, just go to the **Account menu** on top right corner and click on the **Manage Groups**.
@@ -115,13 +115,13 @@ Admins can set granular permission like creating/deleting apps or creating folde
:::tip
-All the activities performed by any Admin or any user in a ToolJet organization is logged in `Audit logs` - including any activity related with managing users and groups.
+All the activities performed by any Admin or any user in a workspace is logged in `Audit logs` - including any activity related with managing users and groups.
:::
### Predefined Groups
-By default, every organization will have two User Groups:
+By default, every workspace will have two User Groups:
**1. All Users**
@@ -129,7 +129,7 @@ This group contains all the users and admins.
| Apps | Users | Permissions |
| ----------- | ----------- | ----------- |
-| You can add or remove apps. | Modification is disabled. This group will have all the users and admins added in an organization. | You can edit permissions for all the users globally. |
+| You can add or remove apps. | Modification is disabled. This group will have all the users and admins added in a workspace. | You can edit permissions for all the users globally. |
@@ -143,7 +143,7 @@ This group contains admins by default. Admins can add more admins or remove the
| Apps | Users | Permissions |
| ----------- | ----------- | ----------- |
-| Modification is disabled. By default, this group has `Edit` permission for all the apps in an organization | Admins can add or remove users in this group. | Modification is disabled. By default, all the admins can create and delete apps or create folders. |
+| Modification is disabled. By default, this group has `Edit` permission for all the apps in a workspace | Admins can add or remove users in this group. | Modification is disabled. By default, all the admins can create and delete apps or create folders. |
diff --git a/docs/docs/widgets/custom-component.md b/docs/docs/widgets/custom-component.md
new file mode 100644
index 0000000000..fa9affbee6
--- /dev/null
+++ b/docs/docs/widgets/custom-component.md
@@ -0,0 +1,92 @@
+---
+id: custom-component
+title: Custom Component
+---
+
+# Custom Component
+
+Custom Component can be used to do create your own React component when the needed functionality isn't available in other components.
+
+
+
+## Properties
+
+### Data
+
+The data needs to be an objects which needs to be passed as `data` props to the custom component
+
+**Example:**
+
+```json
+{{{
+ title: "Hi! There",
+ buttonText: "Updated Text",
+ queryName: "runjs1"
+}}}
+```
+
+### Code
+
+This field is used to add a React code for your custom component. The packages for the custom component can be imported from [Skypack](https://www.skypack.dev/). For example, to import `React` package into the custom component it can be imported as `import React from 'https://cdn.skypack.dev/react'`.
+
+Tooljet provides 3 props to interact with the app: `data`, `updateData` and `runQuery`.
+
+- `data` is a shared object between custom component and Tooljet app.
+- `updateData` is a function which accepts a single object used to update the data passed to the custom component.
+- `runQuery` is a function which accepts a query name as a string used to run the query from the custom component.
+
+**Example:**
+
+```json
+import React from "https://cdn.skypack.dev/react";
+import ReactDOM from "https://cdn.skypack.dev/react-dom";
+import { Button, Container, Link } from "https://cdn.skypack.dev/@material-ui/core";
+
+const MyCustomComponent = ({data, updateData, runQuery}) => (
+
+