Add new templates and remove old templates (#8490)
* bugfix: airtable plugin support for personal access token (#8295) * fix: airtable plugin support for personal access token * fix: review comments fixed * Add new templates and remove old templates * Change onboarding page templates and fix CSS * Change Job application tracker template images * Implement dark mode for onbarding page templates * Fix templates with query issues * fix template creation * Remove redundant datasource options from templates --------- Co-authored-by: Ganesh Kumar <40178541+ganesh8056@users.noreply.github.com> Co-authored-by: Akshay <akshaysasidharan93@gmail.com>
|
After Width: | Height: | Size: 48 KiB |
BIN
frontend/assets/images/templates/applicant-tracking-system.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
frontend/assets/images/templates/aws-s3-file-explorer-dark.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
frontend/assets/images/templates/aws-s3-file-explorer.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 25 KiB |
BIN
frontend/assets/images/templates/employee-directory-dark.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
frontend/assets/images/templates/employee-directory.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
frontend/assets/images/templates/expense-tracker-admin-dark.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
frontend/assets/images/templates/expense-tracker-admin.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
frontend/assets/images/templates/expense-tracker-portal-dark.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
frontend/assets/images/templates/expense-tracker-portal.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 354 KiB |
|
Before Width: | Height: | Size: 354 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 309 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 44 KiB |
BIN
frontend/assets/images/templates/promo-code-management-dark.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
frontend/assets/images/templates/promo-code-management.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 135 KiB |
|
|
@ -23,9 +23,9 @@ export const BlankPage = function BlankPage({
|
|||
const navigate = useNavigate();
|
||||
|
||||
const staticTemplates = [
|
||||
{ id: 's3-file-explorer', name: 'S3 file explore' },
|
||||
{ id: 'job-application-tracker', name: 'Job application tracker' },
|
||||
{ id: 'whatsapp-and-sms-crm', name: 'Whatsapp and sms crm' },
|
||||
{ id: 'customer-ticketing-form', name: 'Customer ticketing form' },
|
||||
{ id: 'inventory-management-tooljet-db', name: 'Inventory management' },
|
||||
{ id: 'kpi-management-dashboard-tooljet-db', name: 'KPI management dashboard' },
|
||||
];
|
||||
|
||||
const appCreationDisabled = !canCreateApp();
|
||||
|
|
@ -114,7 +114,9 @@ export const BlankPage = function BlankPage({
|
|||
>
|
||||
<div
|
||||
className="img-responsive img-responsive-21x9 card-img-top template-card-img"
|
||||
style={{ backgroundImage: `url(assets/images/templates/${id}.png)` }}
|
||||
style={{
|
||||
backgroundImage: `url(assets/images/templates/${id}${darkMode ? '-dark' : ''}.png)`,
|
||||
}}
|
||||
data-cy={`${name.toLowerCase().replace(/\s+/g, '-')}-app-template-image`}
|
||||
/>
|
||||
<div className="card-body">
|
||||
|
|
|
|||
|
|
@ -9987,8 +9987,9 @@ tbody {
|
|||
.template-card {
|
||||
padding: 16px;
|
||||
gap: 16px;
|
||||
width: 272px;
|
||||
height: 184px;
|
||||
min-width: 280px;
|
||||
max-width: 100%;
|
||||
height: 210px;
|
||||
background: var(--base);
|
||||
border: 1px solid var(--slate3);
|
||||
box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
|
||||
|
|
@ -10001,8 +10002,8 @@ tbody {
|
|||
|
||||
.template-card-img {
|
||||
padding: 0px;
|
||||
width: 240px;
|
||||
height: 112px;
|
||||
width: 100%;
|
||||
height: 77.5%;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,15 @@ export default class AirtableQueryService implements QueryService {
|
|||
|
||||
async run(sourceOptions: SourceOptions, queryOptions: QueryOptions): Promise<QueryResult> {
|
||||
let result = {};
|
||||
let apiToken = '';
|
||||
let response = null;
|
||||
const operation = queryOptions.operation;
|
||||
const baseId = queryOptions.base_id;
|
||||
const tableName = queryOptions.table_name;
|
||||
const apiKey = sourceOptions.api_key;
|
||||
|
||||
// Below condition for API Key is kept for Backward compatibility and needs migration to be removed later on.
|
||||
if (sourceOptions.api_key) apiToken = sourceOptions.api_key;
|
||||
if (sourceOptions.personal_access_token) apiToken = sourceOptions.personal_access_token;
|
||||
|
||||
try {
|
||||
switch (operation) {
|
||||
|
|
@ -25,7 +29,7 @@ export default class AirtableQueryService implements QueryService {
|
|||
`https://api.airtable.com/v0/${baseId}/${tableName}/?pageSize=${pageSize}&offset=${offset}`,
|
||||
{
|
||||
method: 'get',
|
||||
headers: this.authHeader(apiKey),
|
||||
headers: this.authHeader(apiToken),
|
||||
}
|
||||
);
|
||||
|
||||
|
|
@ -37,7 +41,7 @@ export default class AirtableQueryService implements QueryService {
|
|||
const recordId = queryOptions.record_id;
|
||||
|
||||
response = await got(`https://api.airtable.com/v0/${baseId}/${tableName}/${recordId}`, {
|
||||
headers: this.authHeader(apiKey),
|
||||
headers: this.authHeader(apiToken),
|
||||
});
|
||||
|
||||
result = JSON.parse(response.body);
|
||||
|
|
@ -47,7 +51,7 @@ export default class AirtableQueryService implements QueryService {
|
|||
case 'create_record': {
|
||||
response = await got(`https://api.airtable.com/v0/${baseId}/${tableName}`, {
|
||||
method: 'post',
|
||||
headers: this.authHeader(apiKey),
|
||||
headers: this.authHeader(apiToken),
|
||||
json: {
|
||||
records: JSON.parse(queryOptions.body),
|
||||
},
|
||||
|
|
@ -61,7 +65,7 @@ export default class AirtableQueryService implements QueryService {
|
|||
case 'update_record': {
|
||||
response = await got(`https://api.airtable.com/v0/${baseId}/${tableName}`, {
|
||||
method: 'patch',
|
||||
headers: this.authHeader(apiKey),
|
||||
headers: this.authHeader(apiToken),
|
||||
json: {
|
||||
records: [
|
||||
{
|
||||
|
|
@ -82,7 +86,7 @@ export default class AirtableQueryService implements QueryService {
|
|||
|
||||
response = await got(`https://api.airtable.com/v0/${baseId}/${tableName}/${_recordId}`, {
|
||||
method: 'delete',
|
||||
headers: this.authHeader(apiKey),
|
||||
headers: this.authHeader(apiToken),
|
||||
});
|
||||
result = JSON.parse(response.body);
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
"rawData": {}
|
||||
},
|
||||
"options": {
|
||||
"api_key": {
|
||||
"personal_access_token": {
|
||||
"type": "string",
|
||||
"encrypted": true
|
||||
}
|
||||
|
|
@ -20,20 +20,20 @@
|
|||
"customTesting": true
|
||||
},
|
||||
"defaults": {
|
||||
"api_key": {
|
||||
"personal_access_token": {
|
||||
"value": ""
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"api_key": {
|
||||
"label": "API key",
|
||||
"key": "api_key",
|
||||
"personal_access_token": {
|
||||
"label": "Personal access token",
|
||||
"key": "personal_access_token",
|
||||
"type": "password",
|
||||
"description": "Api key for airtable",
|
||||
"helpText": "For generating API key, visit: <a href='https://airtable.com/account' target='_blank' rel='noreferrer'>Airtable account page</a>"
|
||||
"description": "Personal access token for airtable",
|
||||
"helpText": "For generating personal access token, visit: <a href='https://airtable.com/account' target='_blank' rel='noreferrer'>Airtable account page</a>"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"api_key"
|
||||
"personal_access_token"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,4 +1,8 @@
|
|||
export type SourceOptions = { api_key: string };
|
||||
export type SourceOptions = {
|
||||
api_key?: string;
|
||||
personal_access_token?: string;
|
||||
};
|
||||
|
||||
export type QueryOptions = {
|
||||
operation: string;
|
||||
base_id: string;
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ export class LibraryAppCreationService {
|
|||
importDto.organization_id = currentUser.organizationId;
|
||||
importDto.app = templateDefinition.app || templateDefinition.appV2;
|
||||
importDto.tooljet_database = templateDefinition.tooljet_database;
|
||||
importDto.tooljet_version = templateDefinition.tooljet_version;
|
||||
|
||||
if (this.isVersionGreaterThanOrEqual(templateDefinition.tooljet_version, '2.16.0')) {
|
||||
importDto.app[0].appName = appName;
|
||||
|
|
|
|||
40975
server/templates/applicant-tracking-system/definition.json
Normal file
8
server/templates/applicant-tracking-system/manifest.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Applicant tracking system",
|
||||
"description": "Streamline hiring with customizable job posts, candidate profiles, and interview status tracking with this simple yet powerful template.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "ToolJet Database", "id": "tooljetdb" }],
|
||||
"id": "applicant-tracking-system",
|
||||
"category": "operations"
|
||||
}
|
||||
30541
server/templates/aws-s3-file-explorer/definition.json
Normal file
8
server/templates/aws-s3-file-explorer/manifest.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "AWS S3 file explorer",
|
||||
"description": "Navigate Amazon S3 buckets, search, preview, and manage objects with an easy-to-use web explorer for S3 storage.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "AWS S3", "id": "s3" }],
|
||||
"id": "aws-s3-file-explorer",
|
||||
"category": "product-management"
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"name": "Customer dashboard",
|
||||
"description": "Display the list of customers on a table and signups on a chart using data from a PostgreSQL database.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{"name": "PostgreSQL", "id": "postgresql"}],
|
||||
"id": "customer-dashboard",
|
||||
"category": "sales"
|
||||
}
|
||||
|
|
@ -3,10 +3,8 @@
|
|||
"description": "The Customer Support Admin template streamlines support with a Main Dashboard for ticket management and All Contacts for maintaining customer data.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [
|
||||
{
|
||||
"name": "Tooljet Database",
|
||||
"id": "tooljetdb"
|
||||
}
|
||||
{ "name": "ToolJet Database", "id": "tooljetdb" },
|
||||
{ "name": "SMTP", "id": "smtp" }
|
||||
],
|
||||
"id": "customer-support-admin",
|
||||
"category": "operations"
|
||||
|
|
|
|||
|
|
@ -3,10 +3,8 @@
|
|||
"description": "The Customer Ticketing Form optimizes support ticket management, seamlessly gathering customer info and tracking ticket progress with deep integration into Customer Support Admin.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [
|
||||
{
|
||||
"name": "Tooljet Database",
|
||||
"id": "tooljetdb"
|
||||
}
|
||||
{ "name": "ToolJet Database", "id": "tooljetdb" },
|
||||
{ "name": "SMTP", "id": "smtp" }
|
||||
],
|
||||
"id": "customer-ticketing-form",
|
||||
"category": "operations"
|
||||
|
|
|
|||
39015
server/templates/employee-directory/definition.json
Normal file
8
server/templates/employee-directory/manifest.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Employee directory",
|
||||
"description": "Manage employee contact information and profiles in a centralized database built on the ToolJet database.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "ToolJet Database", "id": "tooljetdb" }],
|
||||
"id": "employee-directory",
|
||||
"category": "operations"
|
||||
}
|
||||
37560
server/templates/expense-tracker-admin/definition.json
Normal file
8
server/templates/expense-tracker-admin/manifest.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Expense tracker admin",
|
||||
"description": "Update and manage employee expenses centrally through an admin dashboard built with ToolJet web UI and database.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "ToolJet Database", "id": "tooljetdb" }],
|
||||
"id": "expense-tracker-admin",
|
||||
"category": "operations"
|
||||
}
|
||||
35516
server/templates/expense-tracker-portal/definition.json
Normal file
8
server/templates/expense-tracker-portal/manifest.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Expense tracker portal",
|
||||
"description": "Submit and track personal expenses through an easy portal built with a ToolJet web UI and database.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "ToolJet Database", "id": "tooljetdb" }],
|
||||
"id": "expense-tracker-portal",
|
||||
"category": "operations"
|
||||
}
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
{
|
||||
"name": "Google Cloud Storage Explorer",
|
||||
"description": "A file explorer template that lets you view, download, and upload files in any of your GCS bucket.",
|
||||
"widgets": [
|
||||
"List view",
|
||||
"File Picker",
|
||||
"Dropdown",
|
||||
"Modal"
|
||||
],
|
||||
"sources": [
|
||||
{
|
||||
"name": "GCS",
|
||||
"id": "gcs"
|
||||
}
|
||||
],
|
||||
"id": "gcs-file-explorer",
|
||||
"category": "product-management"
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"name": "GitHub contributors",
|
||||
"description": "Display the list of contributors of a GitHub repository and display profile details on selection.",
|
||||
"widgets": ["Table"],
|
||||
"sources": [{"name": "REST API", "id": "restapi"}],
|
||||
"id": "github-contributors",
|
||||
"category": "product-management"
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"name": "GitHub star history tracker",
|
||||
"description": "Tracks the growth of stargazers in a GitHub repository over time.",
|
||||
"widgets": ["Chart"],
|
||||
"sources": [{"name": "REST API", "id": "restapi"}],
|
||||
"id": "github-star-history-tracker",
|
||||
"category": "product-management"
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"name": "GitHub Star Ranking",
|
||||
"description": "Display the list of repositories having equal or more stars as set the by the user, includes advance search filter like language and minimum forks.",
|
||||
"widgets": ["Table"],
|
||||
"sources": [{"name": "REST API", "id": "restapi"}],
|
||||
"id": "github-star-ranking",
|
||||
"category": "product-management"
|
||||
}
|
||||
30550
server/templates/google-cloud-storage-explorer/definition.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Google cloud storage explorer",
|
||||
"description": "Browse, search, upload, download, and manage objects in Google Cloud Storage buckets through an intuitive ToolJet web interface.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "GCS", "id": "gcs" }],
|
||||
"id": "google-cloud-storage-explorer",
|
||||
"category": "product-management"
|
||||
}
|
||||
38242
server/templates/inventory-management-postgresql/definition.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Inventory management - PostgreSQL",
|
||||
"description": "Track inventory levels, orders, and shipments using a PostgreSQL database to monitor and optimize stock.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "PostgreSQL", "id": "postgresql" }],
|
||||
"id": "inventory-management-postgresql",
|
||||
"category": "operations"
|
||||
}
|
||||
38547
server/templates/inventory-management-tooljet-db/definition.json
Normal file
|
|
@ -1,13 +1,8 @@
|
|||
{
|
||||
"name": "Inventory management",
|
||||
"name": "Inventory management - ToolJet Database",
|
||||
"description": "Easily manage, control, and optimise your inventory with our single-page Inventory Management Template.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [
|
||||
{
|
||||
"name": "Tooljet Database",
|
||||
"id": "tooljetdb"
|
||||
}
|
||||
],
|
||||
"id": "inventory-management",
|
||||
"sources": [{ "name": "ToolJet Database", "id": "tooljetdb" }],
|
||||
"id": "inventory-management-tooljet-db",
|
||||
"category": "operations"
|
||||
}
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"name": "Job Application Tracker",
|
||||
"description": "A dashboard for performing CRUD operations in google sheets.",
|
||||
"widgets": ["Table"],
|
||||
"sources": [{"name": "Google Sheets", "id": "googlesheets"}],
|
||||
"name": "Job application tracker",
|
||||
"description": "Centralize job applications in a Google Sheet with custom columns for position, date applied, status, and notes to streamline tracking.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "Google Sheets", "id": "googlesheets" }],
|
||||
"id": "job-application-tracker",
|
||||
"category": "operations"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
33446
server/templates/kpi-management-dashboard-airtable/definition.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "KPI management dashboard - Airtable",
|
||||
"description": "Monitor essential product metrics with the AARRR pirate metrics framework using dynamic dashboards and Airtable as the backend.",
|
||||
"widgets": ["Table", "Chart"],
|
||||
"sources": [{ "name": "Airtable", "id": "airtable" }],
|
||||
"id": "kpi-management-dashboard-airtable",
|
||||
"category": "data-and-analytics"
|
||||
}
|
||||