mirror of https://github.com/nocodb/nocodb
Wing-Kam Wong
2 years ago
64 changed files with 463 additions and 34833 deletions
@ -1,11 +0,0 @@ |
|||||||
/node_modules/ |
|
||||||
#build |
|
||||||
src/**.js |
|
||||||
.idea/* |
|
||||||
|
|
||||||
coverage |
|
||||||
.nyc_output |
|
||||||
*.log |
|
||||||
|
|
||||||
yarn.lock |
|
||||||
/lib/dist/ |
|
@ -1,5 +0,0 @@ |
|||||||
# nc-lib-gui |
|
||||||
|
|
||||||
This package is the build version of ``nc-gui`` which will be used in ``packages/nocodb``. The built files should be located in ``packages/nc-lib-gui/lib/dist/``. |
|
||||||
|
|
||||||
To build the frontend and copy the built files to dist directory, run ``npm run build:copy`` under ``packages/nc-gui/``. |
|
@ -1,30 +0,0 @@ |
|||||||
'use strict'; |
|
||||||
|
|
||||||
const xcToolWeb = require('..'); |
|
||||||
|
|
||||||
describe('xc-tool-web', () => { |
|
||||||
it('needs tests'); |
|
||||||
}); |
|
||||||
|
|
||||||
/** |
|
||||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd |
|
||||||
* |
|
||||||
* @author Naveen MR <oof1lab@gmail.com> |
|
||||||
* @author Pranav C Balan <pranavxc@gmail.com> |
|
||||||
* |
|
||||||
* @license GNU AGPL version 3 or any later version |
|
||||||
* |
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU Affero General Public License as |
|
||||||
* published by the Free Software Foundation, either version 3 of the |
|
||||||
* License, or (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU Affero General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU Affero General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
* |
|
||||||
*/ |
|
@ -1,53 +0,0 @@ |
|||||||
const express = require('express'); |
|
||||||
const path = require('path'); |
|
||||||
|
|
||||||
|
|
||||||
class XcLibGui { |
|
||||||
|
|
||||||
constructor(config) { |
|
||||||
this.config = config; |
|
||||||
} |
|
||||||
|
|
||||||
expressMiddleware() { |
|
||||||
|
|
||||||
const router = express.Router(); |
|
||||||
router.use('/', express.static(path.join(__dirname, 'dist'))); |
|
||||||
return router; |
|
||||||
} |
|
||||||
|
|
||||||
addListener(handler) { |
|
||||||
} |
|
||||||
|
|
||||||
destroy() { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
reInitialize(config) { |
|
||||||
this.config = config; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
module.exports = XcLibGui; |
|
||||||
|
|
||||||
/** |
|
||||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd |
|
||||||
* |
|
||||||
* @author Naveen MR <oof1lab@gmail.com> |
|
||||||
* @author Pranav C Balan <pranavxc@gmail.com> |
|
||||||
* |
|
||||||
* @license GNU AGPL version 3 or any later version |
|
||||||
* |
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU Affero General Public License as |
|
||||||
* published by the Free Software Foundation, either version 3 of the |
|
||||||
* License, or (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU Affero General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU Affero General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
* |
|
||||||
*/ |
|
@ -1,22 +0,0 @@ |
|||||||
/** |
|
||||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd |
|
||||||
* |
|
||||||
* @author Naveen MR <oof1lab@gmail.com> |
|
||||||
* @author Pranav C Balan <pranavxc@gmail.com> |
|
||||||
* |
|
||||||
* @license GNU AGPL version 3 or any later version |
|
||||||
* |
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU Affero General Public License as |
|
||||||
* published by the Free Software Foundation, either version 3 of the |
|
||||||
* License, or (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU Affero General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU Affero General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||||
* |
|
||||||
*/ |
|
@ -1,33 +0,0 @@ |
|||||||
{ |
|
||||||
"name": "nc-lib-gui", |
|
||||||
"version": "0.92.4", |
|
||||||
"description": "> TODO: description", |
|
||||||
"author": "“pranavxc” <pranavxc@gmail.com>", |
|
||||||
"homepage": "https://gitlab.com/xgenecloud-ts/xgenecloud-ts#readme", |
|
||||||
"license": "AGPL-3.0-or-later", |
|
||||||
"main": "lib/XcLibGui.js", |
|
||||||
"directories": { |
|
||||||
"lib": "lib", |
|
||||||
"test": "__tests__" |
|
||||||
}, |
|
||||||
"files": [ |
|
||||||
"lib" |
|
||||||
], |
|
||||||
"repository": { |
|
||||||
"type": "git", |
|
||||||
"url": "git+ssh://git@gitlab.com/xgenecloud-ts/xgenecloud-ts.git" |
|
||||||
}, |
|
||||||
"scripts": { |
|
||||||
"test": "echo \"Error: run tests from root\" && exit 1" |
|
||||||
}, |
|
||||||
"bugs": { |
|
||||||
"url": "https://gitlab.com/xgenecloud-ts/xgenecloud-ts/issues" |
|
||||||
}, |
|
||||||
"dependencies": { |
|
||||||
"axios": "^0.19.2", |
|
||||||
"body-parser": "^1.19.0", |
|
||||||
"dayjs": "^1.10.4", |
|
||||||
"express": "^4.17.1", |
|
||||||
"vuedraggable": "^2.24.3" |
|
||||||
} |
|
||||||
} |
|
@ -1,11 +0,0 @@ |
|||||||
node_modules |
|
||||||
*.iml |
|
||||||
.idea |
|
||||||
*.log* |
|
||||||
.nuxt |
|
||||||
.vscode |
|
||||||
.DS_Store |
|
||||||
coverage |
|
||||||
dist |
|
||||||
sw.* |
|
||||||
.env |
|
@ -1,21 +0,0 @@ |
|||||||
MIT License |
|
||||||
|
|
||||||
Copyright (c) 2021 nocodb |
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|
||||||
of this software and associated documentation files (the "Software"), to deal |
|
||||||
in the Software without restriction, including without limitation the rights |
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
||||||
copies of the Software, and to permit persons to whom the Software is |
|
||||||
furnished to do so, subject to the following conditions: |
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all |
|
||||||
copies or substantial portions of the Software. |
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
||||||
SOFTWARE. |
|
@ -1,3 +0,0 @@ |
|||||||
# NocoDB Documentation (Previous Versions) |
|
||||||
|
|
||||||
We're no longer updating this content regularly. For version `v0.90` onwards, please check out [here](https://docs.nocodb.com/). |
|
@ -1,7 +0,0 @@ |
|||||||
main.container{ |
|
||||||
max-width:100% !important; |
|
||||||
} |
|
||||||
|
|
||||||
footer a[href="https://nuxtjs.org"]{ |
|
||||||
display: none; |
|
||||||
} |
|
@ -1,15 +0,0 @@ |
|||||||
<template> |
|
||||||
<alert type="warning"> |
|
||||||
If you are using NocoDB with version 0.90 onwards, please check out the latest documentation <a href="https://docs.nocodb.com/" target="_blank">here</a> instead. The documentation for previous versions is no longer maintained and will be completely removed on 30 Jun 2022. See <a href="https://github.com/nocodb/nocodb/issues/1564" target="_blank">v0.90 Important Announcement</a> for more. |
|
||||||
</alert> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script> |
|
||||||
export default { |
|
||||||
name: "announcement", |
|
||||||
} |
|
||||||
</script> |
|
||||||
|
|
||||||
<style scoped> |
|
||||||
|
|
||||||
</style> |
|
@ -1,33 +0,0 @@ |
|||||||
<template> |
|
||||||
<div> |
|
||||||
<iframe type="text/html" width="100%" style="height:100%" |
|
||||||
:src="`https://www.youtube.com/embed/${id}`" |
|
||||||
frameborder="0" allowfullscreen></iframe> |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script> |
|
||||||
export default { |
|
||||||
name: "youtube", |
|
||||||
props: { |
|
||||||
id: String |
|
||||||
} |
|
||||||
} |
|
||||||
</script> |
|
||||||
|
|
||||||
<style scoped> |
|
||||||
div { |
|
||||||
background-color: red; |
|
||||||
width: 100%; |
|
||||||
padding-top: min(500px,56%); |
|
||||||
position: relative; |
|
||||||
} |
|
||||||
|
|
||||||
iframe { |
|
||||||
position: absolute; |
|
||||||
top: 0; |
|
||||||
left: 0; |
|
||||||
bottom: 0; |
|
||||||
right: 0; |
|
||||||
} |
|
||||||
</style> |
|
@ -1,70 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'FAQs' |
|
||||||
description: 'FAQs' |
|
||||||
position: 1000000 |
|
||||||
category: 'FAQ' |
|
||||||
fullscreen: true |
|
||||||
menuTitle: 'FAQs' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## How to upgrade NocoDB ? |
|
||||||
- Please see [here](https://docs.nocodb.com/getting-started/upgrading) |
|
||||||
|
|
||||||
## How to export CSV from the grid view ? |
|
||||||
- Available since [0.81.1](https://github.com/nocodb/nocodb/releases/tag/0.81.1) |
|
||||||
|
|
||||||
## How to share the project with read only access ? |
|
||||||
- Either you can invite by email with 'viewer' access control |
|
||||||
- Share the base with publicly accessible link. Available since [0.82.0](https://github.com/nocodb/nocodb/releases/tag/0.82.0) |
|
||||||
|
|
||||||
## How to check my current NocoDB version ? |
|
||||||
- You can hover the NocoDB icon on the top left corner or check ``PackageVersion`` in Project info. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/127765903-3ae876ad-6b46-4520-9d11-679b80eb7b08.png) |
|
||||||
|
|
||||||
## How to check my Project info ? |
|
||||||
- You can click on top right icon and click ``Copy Project Info``. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/127765860-968b0c64-f08d-4674-9ecc-4d5c5a00428b.png) |
|
||||||
|
|
||||||
You should see the similar result as below. |
|
||||||
``` |
|
||||||
Node: **v16.5.0** |
|
||||||
Arch: **x64** |
|
||||||
Platform: **darwin** |
|
||||||
Docker: **false** |
|
||||||
Database: **sqlite3** |
|
||||||
ProjectOnRootDB: **true** |
|
||||||
RootDB: **sqlite3** |
|
||||||
PackageVersion: **0.11.6** |
|
||||||
``` |
|
||||||
|
|
||||||
## What is available in free version ? |
|
||||||
- NocoDB has just one version that is free & open source. |
|
||||||
- In it you will notice advanced features are all available for free. |
|
||||||
- ACL |
|
||||||
- Collaboration |
|
||||||
- Advanced views : Form View, Gallery view, Kanban (coming soon) |
|
||||||
- Share view, |
|
||||||
- Embed view |
|
||||||
- Password protected view, |
|
||||||
- Automations |
|
||||||
- API token support. |
|
||||||
- And we would never move these features from free to an enterprise version of NocoDB. |
|
||||||
- There is no limitations to number of projects, rows or columns either. |
|
||||||
|
|
||||||
|
|
||||||
## Do you plan to have enterprise edition ? |
|
||||||
For features that make sense for enterprises like below - yes |
|
||||||
- SSO, SLA, Organisation wide reports and analytics, |
|
||||||
- Advanced Audit or ACL, |
|
||||||
- Bespoke implementations & integrations, |
|
||||||
- A hosted solution. |
|
||||||
|
|
||||||
And increasing number of our customers are requesting it. |
|
||||||
|
|
||||||
## How do we decide if a feature is enterprise or not ? |
|
||||||
- Depends on the effort and whether the intended users are enterprises. |
|
||||||
|
|
@ -1,49 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Accessing APIs' |
|
||||||
description: 'Accessing APIs' |
|
||||||
position: 1000 |
|
||||||
category: 'Developer Resources' |
|
||||||
menuTitle: 'Accessing APIs' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## REST APIs |
|
||||||
|
|
||||||
- Go to NocoDB Project, click the rightmost button and click ``Copy auth token``. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126187328-745943f2-c780-4109-b967-1b3f1c4a1dcd.png) |
|
||||||
|
|
||||||
- Click the same button and click ``Swagger APIs Doc``. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126187534-32c41de9-f17d-4f95-9acc-88aaed044b36.png) |
|
||||||
|
|
||||||
- Select ``Schemes`` and Click ``Authorize``. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126188482-f3aacabf-dbc5-41a8-a190-9f225347ebd1.png) |
|
||||||
|
|
||||||
- Paste the token you just copy in step 1 and click Authorize |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126188510-b3790348-6809-4182-911a-a4031ace2fd2.png) |
|
||||||
|
|
||||||
## GraphQL APIs |
|
||||||
|
|
||||||
- Go to NocoDB Project, click the rightmost button and click ``Copy auth token``. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126187624-03ee550d-71eb-499f-ad8b-54e32a94f729.png) |
|
||||||
|
|
||||||
- Click the same button and click ``GraphQL APIs`. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126187581-22503b8d-f6dd-4a4e-8b12-a475c27354a2.png) |
|
||||||
|
|
||||||
- Click ``REQUEST HEADERS``. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126188122-1aa7b153-f05a-46fd-953b-751376d708bf.png) |
|
||||||
|
|
||||||
- Paste the token you just copy in step 1. |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"xc-auth": "YOUR_AUTH_TOKEN" |
|
||||||
} |
|
||||||
``` |
|
@ -1,26 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'API Tokens' |
|
||||||
description: 'API Tokens' |
|
||||||
position: 1040 |
|
||||||
category: 'Developer Resources' |
|
||||||
menuTitle: 'API Tokens' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## API Tokens |
|
||||||
NocoDB allows creating API tokens which allow it to be integrated seamlessly with 3rd party apps. |
|
||||||
|
|
||||||
### Which HTTP Header to use ? |
|
||||||
- ```xc-token``` header should be set when invoking the NocoDB APIs with the token. |
|
||||||
|
|
||||||
### How to create a token ? |
|
||||||
|
|
||||||
- ![1](https://user-images.githubusercontent.com/5435402/133734223-49bb1567-6cd2-43e5-bdda-aaccda741070.png) |
|
||||||
- ![2](https://user-images.githubusercontent.com/5435402/133734234-5ca542b1-5843-46f7-b97b-9e686c6bf7ac.png) |
|
||||||
- ![3](https://user-images.githubusercontent.com/5435402/133734238-33d5bdd0-5c97-4dbe-8e49-744193c3ac20.png) |
|
||||||
- ![4](https://user-images.githubusercontent.com/5435402/133734239-7b530235-3352-497b-b23c-3a701290a569.png) |
|
||||||
- ![5](https://user-images.githubusercontent.com/5435402/133734241-0f25bbd0-ab92-430a-9987-cc745d5b1b47.png) |
|
||||||
- ![6](https://user-images.githubusercontent.com/5435402/133734243-6dc8527e-573d-45e2-8cd8-13a8beea0dfa.png) |
|
||||||
|
|
||||||
|
|
@ -1,797 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'GraphQL APIs' |
|
||||||
position: 1020 |
|
||||||
category: 'Developer Resources' |
|
||||||
menuTitle: 'GraphQL APIs' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Features |
|
||||||
|
|
||||||
* Generates GraphQL APIs for **ANY** MySql, Postgres, MSSQL, Sqlite database :fire: |
|
||||||
* Serves GraphQL queries irrespective of naming conventions of primary keys, foreign keys, tables etc :fire: |
|
||||||
* Support for composite primary keys :fire: |
|
||||||
* Usual suspects : CRUD, List, FindOne, Count, Exists, Distinct |
|
||||||
* Pagination |
|
||||||
* Sorting |
|
||||||
* Column filtering - Fields :fire: |
|
||||||
* Row filtering - Where :fire: |
|
||||||
* Bulk insert, Bulk delete, Bulk read :fire: |
|
||||||
* Relations - automatically detected |
|
||||||
* Aggregate functions |
|
||||||
* More |
|
||||||
* Upload single file |
|
||||||
* Upload multiple files |
|
||||||
* Download file |
|
||||||
* Authentication |
|
||||||
* Access Control |
|
||||||
|
|
||||||
|
|
||||||
## API Overview |
|
||||||
|
|
||||||
### Query |
|
||||||
|
|
||||||
| **Resolver** | **Arguments** | **Returns** | **Description** | |
|
||||||
|---|---|---|---| |
|
||||||
| [TableName**List**](#tablenamelist) | where: String, limit: Int, offset: Int, sort: String | [TableName] | List of table rows | |
|
||||||
| [TableName**Read**](#tablenameread) | id:String | TableName | Get row by primary key | |
|
||||||
| [TableName**Exists**](#tablenameexists) | id: String | Boolean | Check row exists by primary key | |
|
||||||
| [TableName**FindOne**](#tablenamefindone) | where: String | TableName | Find row by where conditions | |
|
||||||
| [TableName**Count**](#tablenamecount) | where: String | Int | Get rows count | |
|
||||||
| [TableName**Distinct**](#tablenamedistinct) | columnName: String, where: String, limit: Int, offset: Int, sort: String | [TableName] | Get distinct rows based on provided column names | |
|
||||||
| [TableName**GroupBy**](#tablenamegroupby) | fields: String, having: String, limit: Int, offset: Int, sort: String | [TableNameGroupBy] | Group rows by provided columns | |
|
||||||
| [TableName**Aggregate**](#tablenameaggregate) | columnName: String!, having: String, limit: Int, offset: Int, sort: String, func: String! | [TableNameAggregate] | Do aggregation based on provided column name aggregate function | |
|
||||||
| [TableName**Distribution**](#tablenamedistribution) | min: Int, max: Int, step: Int, steps: String, columnName: String! | [distribution] | Get distributed list | |
|
||||||
|
|
||||||
|
|
||||||
### Mutations |
|
||||||
|
|
||||||
| **Resolver** | **Arguments** | **Returns** | **Description** | |
|
||||||
|---|---|---|---| |
|
||||||
| [TableName**Create**](#tablenamecreate) | data:TableNameInput | TableName | Insert row into table | |
|
||||||
| [TableName**Update**](#tablenameupdate) | id:String,data:TableNameInput | TableName | Update table row using primary key | |
|
||||||
| [TableName**Delete**](#tablenamedelete) | id:String | TableName | Delete table row using primary id | |
|
||||||
| [TableName**CreateBulk**](#tabelenamecreatebulk) | data: [TableNameInput] | [Int] | Bulk row insert | |
|
||||||
| [TableName**UpdateBulk**](#tablenamebulk) | data: [TableNameInput] | [Int] | Bulk row update | |
|
||||||
| [TableName**DeleteBulk**](#tablenamedeletebulk) | data: [TableNameInput] | [Int] | Bulk row delete | |
|
||||||
|
|
||||||
### Query params |
|
||||||
|
|
||||||
| **Param** | **Description** | **Default value** |**Example Value**| |
|
||||||
|---|---|---|---| |
|
||||||
| where | Logical Expression | | `(colName,eq,colValue)~or(colName2,gt,colValue2)` <br />[Usage: Comparison operators](#comparison-operators) <br />[Usage: Logical operators](#logical-operators) | |
|
||||||
| limit | Number of rows to get(SQL limit value) | 10 | 20 | |
|
||||||
| offset | Offset for pagination(SQL offset value) | 0 | 20 | |
|
||||||
| sort | Sort column name, where use `-` as prefix for descending sort | | column_name | |
|
||||||
| fields | Required column names in result | * | column_name_1,column_name_2 | |
|
||||||
|
|
||||||
#### Comparison operators |
|
||||||
|
|
||||||
``` |
|
||||||
eq - '=' - (colName,eq,colValue) |
|
||||||
not - '!=' - (colName,not,colValue) |
|
||||||
gt - '>' - (colName,gt,colValue) |
|
||||||
ge - '>=' - (colName,ge,colValue) |
|
||||||
lt - '<' - (colName,lt,colValue) |
|
||||||
le - '<=' - (colName,le,colValue) |
|
||||||
is - 'is' - (colName,is,true/false/null) |
|
||||||
isnot - 'is not' - (colName,isnot,true/false/null) |
|
||||||
in - 'in' - (colName,in,val1,val2,val3,val4) |
|
||||||
btw - 'between' - (colName,btw,val1,val2) |
|
||||||
nbtw - 'not between'- (colName,nbtw,val1,val2) |
|
||||||
like - 'like' - (colName,like,%name) |
|
||||||
``` |
|
||||||
|
|
||||||
#### Example use of comparison operators - complex example |
|
||||||
``` |
|
||||||
PaymentList(where:"(checkNumber,eq,JM555205)~or((amount,gt,200)~and(amount,lt,2000))") |
|
||||||
``` |
|
||||||
|
|
||||||
#### Logical operators |
|
||||||
|
|
||||||
``` |
|
||||||
~or - 'or' |
|
||||||
~and - 'and' |
|
||||||
~not - 'not' |
|
||||||
``` |
|
||||||
|
|
||||||
## Examples |
|
||||||
|
|
||||||
### TableNameList |
|
||||||
|
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
CountryList { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryList": [ |
|
||||||
{ |
|
||||||
"country_id": 1, |
|
||||||
"country": "Afghanistan", |
|
||||||
"last_update": "1139978640000", |
|
||||||
"CityCount": 1 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country_id": 2, |
|
||||||
"country": "Algeria", |
|
||||||
"last_update": "1139978640000", |
|
||||||
"CityCount": 3 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country_id": 3, |
|
||||||
"country": "American Samoa", |
|
||||||
"last_update": "1139978640000", |
|
||||||
"CityCount": 1 |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
#### List + where |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
CountryList(where:"(country,like,United%)") { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
CityCount |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryList": [ |
|
||||||
{ |
|
||||||
"country_id": 101, |
|
||||||
"country": "United Arab Emirates", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 3 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country_id": 102, |
|
||||||
"country": "United Kingdom", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 8 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country_id": 103, |
|
||||||
"country": "United States", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 35 |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[Usage : comparison operators](#comparison-operators) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### List + where + sort |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
CountryList(where:"(country,like,United%)",sort:"-country") { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
CityCount |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryList": [ |
|
||||||
{ |
|
||||||
"country_id": 103, |
|
||||||
"country": "United States", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 35 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country_id": 102, |
|
||||||
"country": "United Kingdom", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 8 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country_id": 101, |
|
||||||
"country": "United Arab Emirates", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 3 |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
#### List + where + sort + offset |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
CountryList(where:"(country,like,United%)",sort:"-country",offset:1) { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
CityCount |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryList": [ |
|
||||||
{ |
|
||||||
"country_id": 102, |
|
||||||
"country": "United Kingdom", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 8 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country_id": 101, |
|
||||||
"country": "United Arab Emirates", |
|
||||||
"last_update": "1139958840000", |
|
||||||
"CityCount": 3 |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### List + limit |
|
||||||
|
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
CountryList(limit:6) { |
|
||||||
country |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryList": [ |
|
||||||
{ |
|
||||||
"country": "Afghanistan" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country": "Algeria" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country": "American Samoa" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country": "Angola" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country": "Anguilla" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"country": "Argentina" |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameRead |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
CountryRead(id:"1") { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
"data": { |
|
||||||
"CountryRead": { |
|
||||||
"country_id": 1, |
|
||||||
"country": "Afghanistan", |
|
||||||
"last_update": "1139978640000", |
|
||||||
"CityCount": 1 |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameExists |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
CountryExists(id:"1") |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
"data": { |
|
||||||
"CountryExists": true |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameFindOne |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
CountryFindOne(where:"(country_id,eq,1)") { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
CityCount |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
"data": { |
|
||||||
"CountryFindOne": { |
|
||||||
"country_id": 1, |
|
||||||
"country": "Afghanistan", |
|
||||||
"last_update": "1139978640000", |
|
||||||
"CityCount": 1 |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameCount |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
CountryCount |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryCount": 109 |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameDistinct |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
CountryDistinct(columnName:"last_update",limit:3) { |
|
||||||
last_update |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryDistinct": [ |
|
||||||
{ |
|
||||||
"last_update": "1139958840000" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"last_update": "1578323893000" |
|
||||||
}, |
|
||||||
{ |
|
||||||
"last_update": "1578321201000" |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameGroupBy |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
CountryGroupBy(fields:"last_update",limit:1) { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
count |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryGroupBy": [ |
|
||||||
{ |
|
||||||
"country_id": null, |
|
||||||
"country": null, |
|
||||||
"last_update": "1139958840000", |
|
||||||
"count": 109 |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameAggregate |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
PaymentAggregate(columnName:"amount",func:"min,max,avg,count") { |
|
||||||
count |
|
||||||
avg |
|
||||||
min |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"PaymentAggregate": [ |
|
||||||
{ |
|
||||||
"count": 16048, |
|
||||||
"avg": 4.200743, |
|
||||||
"min": 0 |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
[⤴](#query) |
|
||||||
|
|
||||||
### TableNameDistribution |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
{ |
|
||||||
PaymentDistribution (columnName:"amount"){ |
|
||||||
range |
|
||||||
count |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"PaymentDistribution": [ |
|
||||||
{ |
|
||||||
"range": "0-4", |
|
||||||
"count": 8302 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"range": "5-8", |
|
||||||
"count": 3100 |
|
||||||
}, |
|
||||||
{ |
|
||||||
"range": "9-11.99", |
|
||||||
"count": 371 |
|
||||||
} |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
[⤴](#mutations) |
|
||||||
|
|
||||||
### TableNameCreate |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
mutation { |
|
||||||
CountryCreate(data: {country: "test"}) { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
CityCount |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryCreate": { |
|
||||||
"country_id": 10264, |
|
||||||
"country": "test", |
|
||||||
"last_update": null, |
|
||||||
"CityCount": 0 |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
[⤴](#mutations) |
|
||||||
|
|
||||||
### TableNameUpdate |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
mutation { |
|
||||||
CountryUpdate(data: {country: "test_new"}, id: "10264") { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
CityCount |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryUpdate": { |
|
||||||
"country_id": null, |
|
||||||
"country": null, |
|
||||||
"last_update": null, |
|
||||||
"CityCount": null |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
[⤴](#mutations) |
|
||||||
|
|
||||||
### TableNameDelete |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
mutation { |
|
||||||
CountryDelete(id: "10264") { |
|
||||||
country_id |
|
||||||
country |
|
||||||
last_update |
|
||||||
CityCount |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryDelete": { |
|
||||||
"country_id": null, |
|
||||||
"country": null, |
|
||||||
"last_update": null, |
|
||||||
"CityCount": null |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#mutations) |
|
||||||
|
|
||||||
### TableNameCreateBulk |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
mutation { |
|
||||||
CountryCreateBulk(data:[{country:"test 2"},{country:"test 3"}]) |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryCreateBulk": [ |
|
||||||
10265 |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#mutations) |
|
||||||
|
|
||||||
### TableNameUpdateBulk |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
mutation { |
|
||||||
CountryUpdateBulk(data: [{country: "test 2", country_id: 10265}, {country: "test 3", country_id: 10266}]) |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryUpdateBulk": [ |
|
||||||
1, |
|
||||||
1 |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
|
|
||||||
[⤴](#mutations) |
|
||||||
|
|
||||||
### TableNameDeleteBulk |
|
||||||
<code-group> |
|
||||||
<code-block label="Request" active> |
|
||||||
|
|
||||||
``` |
|
||||||
mutation { |
|
||||||
CountryDeleteBulk(data: [{country_id: 10265}, {country_id: 10266}]) |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
<code-block label="Response"> |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"data": { |
|
||||||
"CountryDeleteBulk": [ |
|
||||||
1, |
|
||||||
1 |
|
||||||
] |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,185 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Webhooks" |
|
||||||
description: "Webhooks" |
|
||||||
position: 1030 |
|
||||||
category: "Developer Resources" |
|
||||||
menuTitle: "Webhooks" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Triggers |
|
||||||
|
|
||||||
Webhooks allows user to trigger on certain operations on following database operations |
|
||||||
|
|
||||||
- AFTER INSERT |
|
||||||
- AFTER UPDATE |
|
||||||
- AFTER DELETE |
|
||||||
|
|
||||||
The triggers will trigger asynchronously without blocking the actual operation. |
|
||||||
|
|
||||||
### Applications/services |
|
||||||
|
|
||||||
| Trigger | Details | |
|
||||||
| --------------- | ---------------------------------------------- | |
|
||||||
| Email | Send email to certain email addresses | |
|
||||||
| Slack | Notify via Slack channel | |
|
||||||
| Microsoft Teams | Notify via Microsoft Teams channel | |
|
||||||
| Discord | Notify via Discord channel | |
|
||||||
| Mattermost | Notify via Mattermost channel | |
|
||||||
| Twilio | Send SMS to certain mobile numbers | |
|
||||||
| Whatsapp Twilio | Send Whatsapp messages to numbers using Twilio | |
|
||||||
| URL | Invoke an HTTP API | |
|
||||||
|
|
||||||
|
|
||||||
## Accessing Data: Handlebars |
|
||||||
|
|
||||||
The current row data and other details will be available in the hooks payload so the user can use [handlebar syntax](https://handlebarsjs.com/guide/#simple-expressions) to use data. |
|
||||||
|
|
||||||
> We are using [Handlebars](https://handlebarsjs.com/) library to parse the payload internally. |
|
||||||
|
|
||||||
### Example |
|
||||||
|
|
||||||
For a table with column names (id, title, created_at, updated_at). |
|
||||||
For INSERT/ UPDATE based triggers, use following handlebars to access corresponding **data** fields. |
|
||||||
|
|
||||||
- {{ **data**.id }} |
|
||||||
- {{ **data**.title }} |
|
||||||
- {{ **data**.created_at }} |
|
||||||
- {{ **data**.updated_at }} |
|
||||||
|
|
||||||
Note that, for Update trigger - all the fields in the ROW will be accessible, not just the field updated. |
|
||||||
For DELETE based triggers, **only** {{ data.id }} is accessible representing ID of the column deleted. |
|
||||||
|
|
||||||
For all trigger, following **user** information associated with person trigger can be accessed. |
|
||||||
|
|
||||||
- {{ **user**.id }} : Unique auto incremented NocoDB system value |
|
||||||
- {{ **user**.email }} : User E-mail. |
|
||||||
- {{ **user**.roles }} : User Role amongst [Owner, Creator, Editor, Commenter, Viewer]. |
|
||||||
|
|
||||||
### JSON format |
|
||||||
|
|
||||||
Use {{ json data }} {{ json user }} to dump complete data & user information available in JSON format |
|
||||||
|
|
||||||
### Additional references: |
|
||||||
|
|
||||||
[Handlebar Guide](https://handlebarsjs.com/guide/). |
|
||||||
|
|
||||||
# Application Guide |
|
||||||
|
|
||||||
## Discord |
|
||||||
|
|
||||||
### 1. Create WebHook |
|
||||||
|
|
||||||
- On Discord, open your Server Settings and head into the Integrations tab: |
|
||||||
- Click the "Create Webhook" button to create a new webhook! |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 1 21 59 PM](https://user-images.githubusercontent.com/86527202/155087088-8f9fd762-9ff9-41a6-aed4-0f22add77fe6.png) |
|
||||||
|
|
||||||
- Choose channel to which this webhook will post to. |
|
||||||
- Copy webhook URL |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 1 23 18 PM](https://user-images.githubusercontent.com/86527202/155087126-c2cdd7b2-518a-46a5-82a5-aa90fe51a709.png) |
|
||||||
|
|
||||||
(Sample webhook URL: https://discord.com/api/webhooks/945558283756908644/GNUtiGuzfOky6wZ4ce30XuXc1sbPK3Od7EC-4t6hihh5Fovv6oU9OsdT6mGuoL1QlTzj). |
|
||||||
Detailed procedure for discord webhook described [here](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks). |
|
||||||
|
|
||||||
### 2. Install Plugin |
|
||||||
|
|
||||||
- Open 'App Store' (under Settings), hover over Discord tile. Click 'Install'. |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 11 30 36 AM](https://user-images.githubusercontent.com/86527202/155085257-5bdde1d9-d7b5-471d-bf44-3c3920e7b853.png) |
|
||||||
|
|
||||||
- Provide a name of your choice (not to be confused with Discord Channel name). |
|
||||||
- Paste Discord Webhook URL copied from Step (1.) above. |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 11 31 21 AM](https://user-images.githubusercontent.com/86527202/155085287-f5e45aab-fd33-4138-a7a9-6eddc6dc140b.png) |
|
||||||
|
|
||||||
### 3. Configure |
|
||||||
|
|
||||||
- Open project, associated table. |
|
||||||
- Click 'More' > 'Webhooks'. |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 11 16 18 AM](https://user-images.githubusercontent.com/86527202/155085373-f9b438ed-98c3-4fb1-9209-1bb52736a35d.png) |
|
||||||
|
|
||||||
- Click 'Add New Webhook' |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 11 18 04 AM](https://user-images.githubusercontent.com/86527202/155085629-2c4260c6-6d0c-490d-bd6e-092cbb9faeb5.png) |
|
||||||
|
|
||||||
- Configure |
|
||||||
- **Title**: Name of your choice to identify this Webhook. |
|
||||||
- **Event**: Trigger event. Choose between. |
|
||||||
- After Insert: Trigger event for new ROW insertion. |
|
||||||
- After Update: Trigger event for existing ROW updation. |
|
||||||
- After Delete: Trigger event for ROW deletion |
|
||||||
- **On Condition**: [Optional] Enable if you wish to associate additional condition/constraint with the trigger configured above. |
|
||||||
- **Notification**: Select 'Discord'. |
|
||||||
- **Select Discord Channels**: Select from the drop down list, channel name configured in Step (2). Please click on 'Reload' if drop down list is empty. |
|
||||||
- **Body**: Message to be posted over Discord channel, via webhooks on trigger of configured event. |
|
||||||
- Body can contain plain text & |
|
||||||
- Handlebars {{ }} |
|
||||||
|
|
||||||
|
|
||||||
## Slack |
|
||||||
### 1. Create WebHook |
|
||||||
- Details to create slack webhook are captured [here](https://api.slack.com/messaging/webhooks) |
|
||||||
|
|
||||||
### 2. Install Plugin |
|
||||||
- Procedure remain same as listed for DISCORD channel configuration above |
|
||||||
|
|
||||||
### 3. Configure Webhook |
|
||||||
- Procedure remain same as listed for DISCORD channel configuration above |
|
||||||
|
|
||||||
|
|
||||||
## Microsoft Teams |
|
||||||
### 1. Create WebHook |
|
||||||
|
|
||||||
- On Teams, open your channel, click on three-dots menu (far right) and select 'Connectors' |
|
||||||
|
|
||||||
<img width="319" alt="154971352-6912d53b-cf71-4edd-a319-1c85be85f0c5" src="https://user-images.githubusercontent.com/86527202/155095745-91abd708-834f-4f0e-a33c-ac362e60af0f.png"> |
|
||||||
|
|
||||||
|
|
||||||
- Select incoming webhook & click 'Configure' |
|
||||||
|
|
||||||
<img width="442" alt="154971434-0ced97f7-205a-4e2e-8f88-17092cb7771a" src="https://user-images.githubusercontent.com/86527202/155095741-b23ad6b2-1276-46e3-8ada-0d0a871115bb.png"> |
|
||||||
|
|
||||||
- Create webhook, Copy webhook URL |
|
||||||
|
|
||||||
![154971683-db16be7f-4f07-4447-8f2e-ac50e133bef8](https://user-images.githubusercontent.com/86527202/155095733-c339a914-5d78-408c-8f1e-9cd75a7783e8.png) |
|
||||||
|
|
||||||
|
|
||||||
### 2. Install Plugin |
|
||||||
|
|
||||||
- Open 'App Store' (under Settings), hover over 'Microsoft Teams' tile. Click 'Install'. |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 7 32 52 PM](https://user-images.githubusercontent.com/86527202/155148122-60844b42-7d2a-4c0f-9778-a5bc4f9c0107.png) |
|
||||||
|
|
||||||
|
|
||||||
- Provide a name of your choice (not to be confused with Teams Channel name). |
|
||||||
- Paste MS Teams Webhook URL copied from Step (1.) above. |
|
||||||
|
|
||||||
<img width="414" alt="154971222-7fe2c25a-d8c6-46b0-ba1e-a05ff1cf6537" src="https://user-images.githubusercontent.com/86527202/155095720-ff1c052c-a4a7-4c10-8f30-d779dac336f3.png"> |
|
||||||
|
|
||||||
### 3. Configure |
|
||||||
|
|
||||||
- Open project, associated table. |
|
||||||
- Click 'More' > 'Webhooks'. |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 11 16 18 AM](https://user-images.githubusercontent.com/86527202/155085373-f9b438ed-98c3-4fb1-9209-1bb52736a35d.png) |
|
||||||
|
|
||||||
- Click 'Add New Webhook' |
|
||||||
|
|
||||||
![Screenshot 2022-02-22 at 11 18 04 AM](https://user-images.githubusercontent.com/86527202/155085629-2c4260c6-6d0c-490d-bd6e-092cbb9faeb5.png) |
|
||||||
|
|
||||||
- Configure |
|
||||||
- **Title**: Name of your choice to identify this Webhook. |
|
||||||
- **Event**: Trigger event. Choose between. |
|
||||||
- After Insert: Trigger event for new ROW insertion. |
|
||||||
- After Update: Trigger event for existing ROW updation. |
|
||||||
- After Delete: Trigger event for ROW deletion |
|
||||||
- **On Condition**: [Optional] Enable if you wish to associate additional condition/constraint with the trigger configured above. |
|
||||||
- **Notification**: Select 'Microsoft Teams'. |
|
||||||
- **Select Teams Channels**: Select from the drop down list, channel name configured in Step (2). Please click on 'Reload' if drop down list is empty. |
|
||||||
- **Body**: Message to be posted over Teams channel, via webhooks on trigger of configured event. |
|
||||||
- Body can contain plain text & |
|
||||||
- Handlebars {{ }} |
|
@ -1,63 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Making a release" |
|
||||||
description: "Making a release" |
|
||||||
position: 2000 |
|
||||||
category: "Engineering" |
|
||||||
menuTitle: "Making a release" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
<alert> |
|
||||||
This is exclusive to NocoDB team members only. |
|
||||||
</alert> |
|
||||||
|
|
||||||
<alert types='danger'> |
|
||||||
The version 0.84.8 will be used as an example. Please change it during the release. |
|
||||||
</alert> |
|
||||||
|
|
||||||
## 1. Merge ```develop``` to ```master``` |
|
||||||
- When several features are included in ``develop`` branch and they are ready to be released, make a PR with the title ``0.84.8 Pre-Release`` from `develop` branch to `master` branch. At least one NocoDB team member approval is required. |
|
||||||
|
|
||||||
## 2. Publish frontend |
|
||||||
- Navigate to `packages/nc-gui` and execute following command. |
|
||||||
```bash |
|
||||||
npm run build:copy:jsdeliver |
|
||||||
``` |
|
||||||
## 3. Install frontend |
|
||||||
- Install the latest published version of `nc-lib-gui` in `packages/nocodb`, package version can be extracted from result of step 1 or copy it from `packages/nc-lib-gui/package.json`. While installing, add `-E` to install exact version of the package. |
|
||||||
|
|
||||||
- Example: for latest published version `0.84.8` |
|
||||||
```bash |
|
||||||
npm i -E nc-lib-gui@0.84.8 |
|
||||||
``` |
|
||||||
|
|
||||||
## 4. Publish backend |
|
||||||
- Bump package version in `packages/nocodb/package.json` file. |
|
||||||
- Publish the npm package by running following npm command in `packages/nocodb` folder. |
|
||||||
``` |
|
||||||
npm run obfuscate:build:publish |
|
||||||
``` |
|
||||||
|
|
||||||
## 5. Close all issues |
|
||||||
- Go to Issue page and close all issues with tags ``Fixed`` or ``Resolved``. |
|
||||||
|
|
||||||
## 6. Commit release changes |
|
||||||
- Commit those changes made by previous steps with the commit message ``chore(publish): v0.84.8``. |
|
||||||
|
|
||||||
## 7. Prepare release notes |
|
||||||
- Populate release note by running following github action (on `master` branch) - `Release : Draft Notes`. While running the action you have to provide 2 inputs: |
|
||||||
- **Tag** : Provide current package version |
|
||||||
- **Previous Tag** : Provide previously released tag version |
|
||||||
|
|
||||||
## 8. Publish docker & release |
|
||||||
- Publish docker image by running `Release : Docker` action in github (on `master` branch), where you have to provide the package version/tag. It may take half an hour. Test it locally after it is done. |
|
||||||
|
|
||||||
- Update the populated release (remove issues which is not related to release) draft and publish. In release note you can use `Auto-generate release notes` button to populate release content from commits & PR. |
|
||||||
|
|
||||||
## 9. Sync the changes back to develop branch |
|
||||||
|
|
||||||
- Pull the latest chagnes for both branches to your local |
|
||||||
- Switch to ``develop`` branch |
|
||||||
- Run ``git merge master`` |
|
||||||
- Push the diff to remote repository |
|
@ -1,67 +0,0 @@ |
|||||||
--- |
|
||||||
title: "i18n" |
|
||||||
description: "Contribute to NocoDB's i18n translation" |
|
||||||
position: 2000 |
|
||||||
category: "Engineering" |
|
||||||
menuTitle: "i18n" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
NocoDB supports many foreign languages & we welcome community contributions via an easy to use [google-spreadsheet](https://docs.google.com/spreadsheets/d/1kGp92yLwhs1l7lwwgeor3oN1dFl7JZWuQOa4WSeZ0TE/edit#gid=2076107172). |
|
||||||
Your help in fixing i18n goes a long way supporting NocoDB. Please follow below simple procedure to request corrections to existing translation errors. |
|
||||||
|
|
||||||
## How to contribute ? (for community members) |
|
||||||
|
|
||||||
### 1. How to change a string value ? |
|
||||||
- Make a copy of [Google spreadsheet](https://docs.google.com/spreadsheets/d/1kGp92yLwhs1l7lwwgeor3oN1dFl7JZWuQOa4WSeZ0TE/edit#gid=2076107172) |
|
||||||
<img width="995" alt="Screenshot 2022-02-10 at 1 47 06 PM" src="https://user-images.githubusercontent.com/86527202/153368423-d1d898ef-bdcb-48c4-a772-b75e2c66566d.png"> |
|
||||||
- Find your language code [here](https://developers.google.com/admin-sdk/directory/v1/languages) |
|
||||||
- Go to the column containing your language code. Make necessary changes. Origin text in ENGLISH can be found in `Column B` of master spreadsheet. |
|
||||||
- Create a new [issue in Github](https://github.com/nocodb/nocodb/issues/new?assignees=dstala&labels=i18n+translation&template=i18n-translation-request.md&title=%5Bi18n%5D+Language+support+extension-+%3Clanguage+code%3E) request with a link to your spreadsheet from Step-1 (for us to verify & update master spreadsheet). |
|
||||||
- NocoDB Maintainers will take changes and merge it. |
|
||||||
- It's that simple! |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 2. How to add a new language ? |
|
||||||
|
|
||||||
Your native language not in list, we will be glad to support with your help! Please follow below steps |
|
||||||
|
|
||||||
- Make a copy of [Google spreadsheet](https://docs.google.com/spreadsheets/d/1kGp92yLwhs1l7lwwgeor3oN1dFl7JZWuQOa4WSeZ0TE/edit#gid=2076107172) |
|
||||||
<img width="995" alt="Screenshot 2022-02-10 at 1 47 06 PM" src="https://user-images.githubusercontent.com/86527202/153368423-d1d898ef-bdcb-48c4-a772-b75e2c66566d.png"> |
|
||||||
- Find your language code [here](https://developers.google.com/admin-sdk/directory/v1/languages) |
|
||||||
- Replace cell $AB$1 (rightmost, containing text `en`) with language code obtained above. |
|
||||||
- Google will generate first version translation in column AB. Review. Make changes as you find appropriate for various items listed. Origin text in ENGLISH can be found in `Column B` of master spreadsheet. |
|
||||||
- Create new [issue](https://github.com/nocodb/nocodb/issues/new?assignees=dstala&labels=i18n+translation&template=i18n-translation-request.md&title=%5Bi18n%5D+Language+support+extension-+%3Clanguage+code%3E) request with a link to your spreadsheet from Step-1 (for us to verify & update master spreadsheet). |
|
||||||
|
|
||||||
--- |
|
||||||
|
|
||||||
## How to accept i18n contributions ? (for NocoDB maintainers) |
|
||||||
|
|
||||||
> _This is exclusive to NocoDB maintainers only_ |
|
||||||
|
|
||||||
### 1. Adding / Updating a string |
|
||||||
- Open master [Spreadsheet](https://docs.google.com/spreadsheets/d/1kGp92yLwhs1l7lwwgeor3oN1dFl7JZWuQOa4WSeZ0TE/edit#gid=2076107172) |
|
||||||
- For the string/ text under consideration, look-up in existing sheet if it exists already |
|
||||||
- [New string already exists] Consider re-using it; align string key if required |
|
||||||
- [New string need to be inserted] Insert a new record into appropriate categories as defined below |
|
||||||
- Download spreadsheet as .csv (File > Download > Comma-seperated values (.csv, current sheet) |
|
||||||
- Use noco-i18n-from-cli to generate new language JSON file |
|
||||||
- Copy respective i18n/\*.json files to `nocodb/packages/nc-gui/lang` |
|
||||||
|
|
||||||
### 2. String Categories |
|
||||||
- **General**: simple & common tokens (save, cancel, submit, open, close, home, and such) |
|
||||||
- **Objects**: objects from NocoDB POV (project, table, field, column, view, page, and such) |
|
||||||
- **Title**: screen headers (compact) (menu headers, modal headers) |
|
||||||
- **Lables**: text box/ radio/ field headers (few words) (Labels over textbox, radio buttons, and such) |
|
||||||
- **Activity**/ actions: work items (few words) (Create Project, Delete Table, Add Row, and such) |
|
||||||
- **Tooltip**: additional information associated with work items (usually lengthy) (Additional information provided for activity) |
|
||||||
- **Placeholder**: placeholders associated with various textboxes (Text placeholders) |
|
||||||
- **Msg** |
|
||||||
- Info: general/success category for everything |
|
||||||
- Error: warnings & errors |
|
||||||
- Toast: pop-up toast messages |
|
||||||
|
|
||||||
> Note: string name should be in camelCase. Use above list as priority order in case of ambiguity. |
|
@ -1,14 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Demos' |
|
||||||
description: 'Demos' |
|
||||||
position: 30 |
|
||||||
category: 'Getting started' |
|
||||||
fullscreen: true |
|
||||||
menuTitle: 'Demos' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
Demos are loading from https://nocodb.com (please wait) |
|
||||||
|
|
||||||
<iframe src="https://nocodb.com/demos" style="height:100vh" width="100%"/> |
|
@ -1,324 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Installation' |
|
||||||
description: 'Simple installation - takes about three minutes!' |
|
||||||
position: 10 |
|
||||||
category: 'Getting started' |
|
||||||
menuTitle: 'Installation' |
|
||||||
link: https://codesandbox.io/embed/vigorous-firefly-80kq5?hidenavigation=1&theme=dark |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
Simple installation - takes about three minutes! |
|
||||||
|
|
||||||
## Prerequisites |
|
||||||
|
|
||||||
- __Must haves__ |
|
||||||
* [node.js >= 12](https://nodejs.org/en/download) / [Docker](https://www.docker.com/get-started) |
|
||||||
* [MySql](https://dev.mysql.com/downloads/mysql/) / [Postgres](https://www.postgresql.org/download/) / [SQLserver](https://www.microsoft.com/en-gb/sql-server/sql-server-downloads) / SQLite Database |
|
||||||
- Nice to haves |
|
||||||
- Existing schemas can help to create APIs quickly. |
|
||||||
- An example database schema can be found <a class="grey--text" href="https://github.com/lerocha/chinook-database/tree/master/ChinookDatabase/DataSources"> <u>here</u></a>. |
|
||||||
|
|
||||||
## Quick try |
|
||||||
|
|
||||||
|
|
||||||
### 1-Click Deploy to Heroku |
|
||||||
|
|
||||||
<a href="https://heroku.com/deploy?template=https://github.com/nocodb/nocodb-seed-heroku"> |
|
||||||
<img |
|
||||||
src="https://www.herokucdn.com/deploy/button.svg" |
|
||||||
width="300px" |
|
||||||
alt="Deploy NocoDB to Heroku with 1-Click" |
|
||||||
/> |
|
||||||
</a> |
|
||||||
|
|
||||||
### Node app / Docker |
|
||||||
|
|
||||||
|
|
||||||
<code-group> |
|
||||||
<code-block label="NPX" active> |
|
||||||
|
|
||||||
```bash |
|
||||||
npx create-nocodb-app |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
|
|
||||||
<code-block label="Docker" > |
|
||||||
|
|
||||||
```bash |
|
||||||
docker run -d --name nocodb -p 8080:8080 nocodb/nocodb:latest |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
|
|
||||||
<code-block label="Using Git" > |
|
||||||
|
|
||||||
```bash |
|
||||||
git clone https://github.com/nocodb/nocodb-seed |
|
||||||
cd nocodb-seed |
|
||||||
npm install |
|
||||||
npm start |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
> To persist data in docker you can mount volume at `/usr/app/data/` since 0.10.6. In older version mount at `/usr/src/app`. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Production Setup |
|
||||||
|
|
||||||
NocoDB requires a database to store metadata of spreadsheets views and external databases. |
|
||||||
And connection params for this database can be specified in `NC_DB` environment variable. |
|
||||||
|
|
||||||
### Docker |
|
||||||
|
|
||||||
<code-group> |
|
||||||
<code-block label="MySQL" active> |
|
||||||
|
|
||||||
```bash |
|
||||||
docker run -d -p 8080:8080 \ |
|
||||||
-e NC_DB="mysql2://host.docker.internal:3306?u=root&p=password&d=d1" \ |
|
||||||
-e NC_AUTH_JWT_SECRET="569a1821-0a93-45e8-87ab-eb857f20a010" \ |
|
||||||
nocodb/nocodb:latest |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
|
|
||||||
<code-block label="Postgres"> |
|
||||||
|
|
||||||
```bash |
|
||||||
docker run -d -p 8080:8080 \ |
|
||||||
-e NC_DB="pg://host:port?u=user&p=password&d=database" \ |
|
||||||
-e NC_AUTH_JWT_SECRET="569a1821-0a93-45e8-87ab-eb857f20a010" \ |
|
||||||
nocodb/nocodb:latest |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
|
|
||||||
<code-block label="SQL Server"> |
|
||||||
|
|
||||||
```bash |
|
||||||
docker run -d -p 8080:8080 \ |
|
||||||
-e NC_DB="mssql://host:port?u=user&p=password&d=database" \ |
|
||||||
-e NC_AUTH_JWT_SECRET="569a1821-0a93-45e8-87ab-eb857f20a010" \ |
|
||||||
nocodb/nocodb:latest |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
<alert> |
|
||||||
If you plan to input some special characters, you may need to change the character set and collation yourself when creating the database. Please check out the examples for <a href="https://github.com/nocodb/nocodb/issues/1340#issuecomment-1049481043" target="_blank">MySQL Docker</a> and <a href="https://github.com/nocodb/nocodb/issues/1313#issuecomment-1046625974" target="_blank">MySQL Docker Compose</a>. |
|
||||||
</alert> |
|
||||||
|
|
||||||
### Environment variables |
|
||||||
|
|
||||||
| Variable | Mandatory | Comments | If absent | |
|
||||||
|-------------------------|-----------|----------------------------------------------------------------------------------|--------------------------------------------| |
|
||||||
| NC_DB | Yes | See our database URLs | A local SQLite will be created in root folder | |
|
||||||
| NC_DB_JSON | Yes | Can be used instead of `NC_DB` and value should be valid knex connection JSON | | |
|
||||||
| NC_DB_JSON_FILE | Yes | Can be used instead of `NC_DB` and value should be a valid path to knex connection JSON | | |
|
||||||
| DATABASE_URL | No | JDBC URL Format. Can be used instead of NC_DB. Used in 1-Click Heroku deployment| | |
|
||||||
| DATABASE_URL_FILE | No | path to file containing JDBC URL Format. Can be used instead of NC_DB. Used in 1-Click Heroku deployment| | |
|
||||||
| NC_DASHBOARD_URL | No | Custom dashboard url path | `/dashboard` | |
|
||||||
| NC_TOOL_DIR | No | App directory to keep metadata and app related files | Defaults to current working directory. In docker maps to `/usr/app/data/` for mounting volume. | |
|
||||||
| NC_PUBLIC_URL | Yes | Used for sending Email invitations | Best guess from http request params | |
|
||||||
| NC_AUTH_JWT_SECRET | Yes | JWT secret used for auth and storing other secrets | A Random secret will be generated | |
|
||||||
| NC_JWT_EXPIRES_IN | No | JWT token expiry time | `10h` | |
|
||||||
| NC_CONNECT_TO_EXTERNAL_DB_DISABLED | No | Disable Project creation with external database | | |
|
||||||
| NC_INVITE_ONLY_SIGNUP | No | Allow users to signup only via invite url, value should be any non-empty string. | | |
|
||||||
| NC_BACKEND_URL | No | Custom Backend URL | ``http://localhost:8080`` will be used | |
|
||||||
| NC_REQUEST_BODY_SIZE | No | Request body size [limit](https://expressjs.com/en/resources/middleware/body-parser.html#limit) | `1048576` | |
|
||||||
| NC_EXPORT_MAX_TIMEOUT | No | After NC_EXPORT_MAX_TIMEOUT csv gets downloaded in batches | Default value 5000(in millisecond) will be used | |
|
||||||
| DB_QUERY_LIMIT_DEFAULT | No | Default pagination limit | 25 | |
|
||||||
| DB_QUERY_LIMIT_MAX | No | Maximum allowed pagination limit | 100 | |
|
||||||
| DB_QUERY_LIMIT_MIN | No | Minimum allowed pagination limit | 1 | |
|
||||||
| NC_DISABLE_TELE | No | Disable telemetry | | |
|
||||||
| NC_GOOGLE_CLIENT_ID | No | Google client id to enable google authentication | | |
|
||||||
| NC_GOOGLE_CLIENT_SECRET | No | Google client secret to enable google authentication | | |
|
||||||
| NC_MIGRATIONS_DISABLED | No | Disable NocoDB migration | | |
|
||||||
| NC_ONE_CLICK | No | Used for Heroku one-click deployment | | |
|
||||||
| NC_MIN | No | If set to any non-empty string the default splash screen(initial welcome animation) and matrix screensaver will disable | | |
|
||||||
| PORT | No | For setting app running port | `8080` | |
|
||||||
| NC_SENTRY_DSN | No | For Sentry monitoring | | |
|
||||||
| NC_DISABLE_ERR_REPORT | No | Disable error reporting | | |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Docker Compose |
|
||||||
|
|
||||||
<code-group> |
|
||||||
<code-block label="MySQL" active> |
|
||||||
|
|
||||||
```bash |
|
||||||
git clone https://github.com/nocodb/nocodb |
|
||||||
cd nocodb |
|
||||||
cd docker-compose |
|
||||||
cd mysql |
|
||||||
docker-compose up -d |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
|
|
||||||
<code-block label="Postgres"> |
|
||||||
|
|
||||||
```bash |
|
||||||
git clone https://github.com/nocodb/nocodb |
|
||||||
cd nocodb |
|
||||||
cd docker-compose |
|
||||||
cd pg |
|
||||||
docker-compose up -d |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
|
|
||||||
<code-block label="SQL Server"> |
|
||||||
|
|
||||||
```bash |
|
||||||
git clone https://github.com/nocodb/nocodb |
|
||||||
cd nocodb |
|
||||||
cd docker-compose |
|
||||||
cd mssql |
|
||||||
docker-compose up -d |
|
||||||
``` |
|
||||||
|
|
||||||
</code-block> |
|
||||||
</code-group> |
|
||||||
|
|
||||||
### AWS ECS (Fargate) |
|
||||||
|
|
||||||
#### Create ECS Cluster |
|
||||||
|
|
||||||
``` |
|
||||||
aws ecs create-cluster \ |
|
||||||
--cluster-name <YOUR_ECS_CLUSTER> |
|
||||||
``` |
|
||||||
|
|
||||||
#### Create Log group |
|
||||||
|
|
||||||
``` |
|
||||||
aws logs create-log-group \ |
|
||||||
--log-group-name /ecs/<YOUR_APP_NAME>/<YOUR_CONTAINER_NAME> |
|
||||||
``` |
|
||||||
|
|
||||||
#### Create ECS Task Definiton |
|
||||||
|
|
||||||
Every time you create it, it will add a new version. If it is not existing, the version will be 1. |
|
||||||
|
|
||||||
```bash |
|
||||||
aws ecs register-task-definition \ |
|
||||||
--cli-input-json "file://./<YOUR_TASK_DEF_NAME>.json" |
|
||||||
``` |
|
||||||
|
|
||||||
<alert> |
|
||||||
This json file defines the container specification. You can define secrets such as NC_DB and environment variables here. |
|
||||||
</alert> |
|
||||||
|
|
||||||
Here's the sample Task Definition |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"family": "nocodb-sample-task-def", |
|
||||||
"networkMode": "awsvpc", |
|
||||||
"containerDefinitions": [{ |
|
||||||
"name": "<YOUR_CONTAINER_NAME>", |
|
||||||
"image": "nocodb/nocodb:latest", |
|
||||||
"essential": true, |
|
||||||
"logConfiguration": { |
|
||||||
"logDriver": "awslogs", |
|
||||||
"options": { |
|
||||||
"awslogs-group": "/ecs/<YOUR_APP_NAME>/<YOUR_CONTAINER_NAME>", |
|
||||||
"awslogs-region": "<YOUR_AWS_REGION>", |
|
||||||
"awslogs-stream-prefix": "ecs" |
|
||||||
} |
|
||||||
}, |
|
||||||
"secrets": [{ |
|
||||||
"name": "<YOUR_SECRETS_NAME>", |
|
||||||
"valueFrom": "<YOUR_SECRET_ARN>" |
|
||||||
}], |
|
||||||
"environment": [{ |
|
||||||
"name": "<YOUR_ENV_VARIABLE_NAME>", |
|
||||||
"value": "<YOUR_ENV_VARIABLE_VALUE>" |
|
||||||
}], |
|
||||||
"portMappings": [{ |
|
||||||
"containerPort": 8080, |
|
||||||
"hostPort": 8080, |
|
||||||
"protocol": "tcp" |
|
||||||
}] |
|
||||||
}], |
|
||||||
"requiresCompatibilities": [ |
|
||||||
"FARGATE" |
|
||||||
], |
|
||||||
"cpu": "256", |
|
||||||
"memory": "512", |
|
||||||
"executionRoleArn": "<YOUR_ECS_EXECUTION_ROLE_ARN>", |
|
||||||
"taskRoleArn": "<YOUR_ECS_TASK_ROLE_ARN>" |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
#### Create ECS Service |
|
||||||
|
|
||||||
```bash |
|
||||||
aws ecs create-service \ |
|
||||||
--cluster <YOUR_ECS_CLUSTER> \ |
|
||||||
--service-name <YOUR_SERVICE_NAME> \ |
|
||||||
--task-definition <YOUR_TASK_DEF>:<YOUR_TASK_DEF_VERSION> \ |
|
||||||
--desired-count <DESIRED_COUNT> \ |
|
||||||
--launch-type "FARGATE" \ |
|
||||||
--platform-version <VERSION> \ |
|
||||||
--health-check-grace-period-seconds <GRACE_PERIOD_IN_SECOND> \ |
|
||||||
--network-configuration "awsvpcConfiguration={subnets=["<YOUR_SUBSETS>"], securityGroups=["<YOUR_SECURITY_GROUPS>"], assignPublicIp=ENABLED}" \ |
|
||||||
--load-balancer targetGroupArn=<TARGET_GROUP_ARN>,containerName=<CONTAINER_NAME>,containerPort=<YOUR_CONTAINER_PORT> |
|
||||||
``` |
|
||||||
|
|
||||||
<alert> |
|
||||||
If your service fails to start, you may check the logs in ECS console or in Cloudwatch. Generally it fails due to the connection between ECS container and NC_DB. Make sure the security groups have the correct inbound and outbound rules. |
|
||||||
</alert> |
|
||||||
|
|
||||||
## Development Setup |
|
||||||
|
|
||||||
If you want to modify the source code, |
|
||||||
|
|
||||||
- Start the backend locally |
|
||||||
|
|
||||||
```bash |
|
||||||
cd packages/nocodb |
|
||||||
npm install |
|
||||||
npm run watch:run |
|
||||||
``` |
|
||||||
|
|
||||||
- Start the frontend locally |
|
||||||
|
|
||||||
```bash |
|
||||||
cd packages/nc-gui |
|
||||||
npm install |
|
||||||
npm run dev |
|
||||||
``` |
|
||||||
|
|
||||||
- Open ``localhost:3000/dashboard`` in browser |
|
||||||
|
|
||||||
<alert> |
|
||||||
nocodb/packages/nocodb includes nc-lib-gui which is the built version of nc-gui hosted in npm registry. <br> |
|
||||||
You can visit localhost:8000/dashboard in browser after starting the backend locally if you just want to modify the backend only. |
|
||||||
</alert> |
|
||||||
|
|
||||||
## Sample Demos |
|
||||||
|
|
||||||
### Code Sandbox |
|
||||||
|
|
||||||
<code-sandbox :src="link"></code-sandbox> |
|
||||||
|
|
||||||
### Docker deploying with one command |
|
||||||
|
|
||||||
<youtube id="K-UEecQyiOk"></youtube> |
|
||||||
|
|
||||||
### Using NPX |
|
||||||
|
|
||||||
<youtube id="v6Nn75P1p7I"></youtube> |
|
||||||
|
|
||||||
### Heroku Deployment |
|
||||||
<youtube id="WB7yYXfhocY"></youtube> |
|
@ -1,96 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Upgrading' |
|
||||||
description: 'Upgrading NocoDB : Docker, npm, Heroku!' |
|
||||||
position: 20 |
|
||||||
category: 'Getting started' |
|
||||||
menuTitle: 'Upgrading' |
|
||||||
link: https://codesandbox.io/embed/vigorous-firefly-80kq5?hidenavigation=1&theme=dark |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Docker |
|
||||||
### Find, stop & delete nocodb docker container |
|
||||||
``` |
|
||||||
docker ps |
|
||||||
|
|
||||||
docker stop "YOUR_CONTAINER_ID" |
|
||||||
|
|
||||||
docker rm "YOUR_CONTAINER_ID" |
|
||||||
``` |
|
||||||
|
|
||||||
### Find & remove nocodb docker image |
|
||||||
``` |
|
||||||
docker images |
|
||||||
|
|
||||||
docker rmi YOUR_IMAGE_ID |
|
||||||
``` |
|
||||||
|
|
||||||
### Pull the latest nocodb image with same environment variables |
|
||||||
``` |
|
||||||
docker run -d -p 8080:8080 \ |
|
||||||
-e NC_DB="YOUR_NC_DB_URL" \ |
|
||||||
-e NC_AUTH_JWT_SECRET="YOUR_NC_AUTH_JWT_SECRET_IF_GIVEN" \ |
|
||||||
nocodb/nocodb:latest |
|
||||||
``` |
|
||||||
|
|
||||||
Updating nocodb docker container is similar to updating [any other docker container](https://www.whitesourcesoftware.com/free-developer-tools/blog/update-docker-images/). |
|
||||||
|
|
||||||
### Example docker upgrade |
|
||||||
![Screen Shot 2021-09-16 at 09 23 07](https://user-images.githubusercontent.com/5435402/133578984-53c6b96b-3e8b-4a96-b6c2-36f3c09ffdde.png) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Node |
|
||||||
|
|
||||||
Updating docker container is similar to updating a npm package. |
|
||||||
|
|
||||||
From your root folder |
|
||||||
|
|
||||||
#### Uninstall nocodb package |
|
||||||
```bash |
|
||||||
npm uninstall nocodb |
|
||||||
``` |
|
||||||
#### Install nocodb package |
|
||||||
```bash |
|
||||||
npm install --save nocodb |
|
||||||
``` |
|
||||||
|
|
||||||
|
|
||||||
## Heroku |
|
||||||
|
|
||||||
### Using the Heroku CLI login |
|
||||||
|
|
||||||
``` |
|
||||||
heroku container:login |
|
||||||
docker pull nocodb/nocodb:latest |
|
||||||
docker tag nocodb/nocodb:latest registry.heroku.com/<Heroku App Name>/web |
|
||||||
docker push registry.heroku.com/<Heroku App Name>/web |
|
||||||
heroku container:release -a <Heroku App Name> web |
|
||||||
``` |
|
||||||
|
|
||||||
#### On Apple M1 Chipset |
|
||||||
|
|
||||||
> Please make sure you change Docker's default architecture to `linux/amd64` by running the following command _before_ executing the aforementioned steps |
|
||||||
> |
|
||||||
> ```export DOCKER_DEFAULT_PLATFORM=linux/amd64``` |
|
||||||
> |
|
||||||
> More details [here](https://medium.com/geekculture/from-apple-silicon-to-heroku-docker-registry-without-swearing-36a2f59b30a3). |
|
||||||
|
|
||||||
### Using GitHub |
|
||||||
|
|
||||||
Fork the [nocodb-seed-heroku repository](https://github.com/nocodb/nocodb-seed-heroku) to your GitHub account. |
|
||||||
Login to Heroku, go to your NocoDB app, and head to the "Deploy" tab. |
|
||||||
Select "GitHub" in the "Deployment method" section. |
|
||||||
|
|
||||||
In the "Connect to GitHub" section, search for your forked nocodb-seed-heroku repo. Connect to it: |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/55474996/143479577-e8bdc1f0-99d1-4072-8d95-4879cc54ddb2.png) |
|
||||||
|
|
||||||
In the "Automatic deploys" section, select "Enable Automatic Deploys": |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/55474996/143479705-b5280199-aa31-40db-a5aa-7586eb918c01.png) |
|
||||||
|
|
||||||
Head back to your forked nocodb-seed-heroku repo on your GitHub account. Edit one of your files and make a simple modification (example, add some random characters to the readme.md) and commit the change directly to the main branch. |
|
||||||
|
|
||||||
This will trigger the Heroku deployment. Your app should now be updated to the latest release of NocoDB. |
|
@ -1,88 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'NocoDB Documentation (Previous Versions)' |
|
||||||
description: 'NocoDB Documentation (Previous Versions)' |
|
||||||
position: 0 |
|
||||||
category: 'Welcome' |
|
||||||
menuTitle: 'Introduction' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Welcome! |
|
||||||
|
|
||||||
NocoDB is an open source Airtable alternative. |
|
||||||
|
|
||||||
NocoDB works by connecting to any relational database and transforming them into a smart spreadsheet interface! This allows you to build no-code applications collaboratively with teams. NocoDB currently works with MySQL, PostgreSQL, Microsoft SQL Server, SQLite, Amazon Aurora & MariaDB databases. |
|
||||||
|
|
||||||
Also NocoDB's app store allows you to build business workflows on views with combination of Slack, Microsoft Teams, Discord, Twilio, Whatsapp, Email & any 3rd party APIs too. Plus NocoDB provides programmatic access to APIs so that you can build integrations with Zapier / Integromat and custom applications too. |
|
||||||
|
|
||||||
<img src="https://static.scarf.sh/a.png?x-pxid=c12a77cc-855e-4602-8a0f-614b2d0da56a" /> |
|
||||||
|
|
||||||
## Features |
|
||||||
|
|
||||||
### Rich Spreadsheet Interface |
|
||||||
- ⚡ Search, sort, filter, hide columns with uber ease |
|
||||||
- ⚡ Create Views : Grid, Gallery, Kanban, Form |
|
||||||
- ⚡ Share Views : public & password protected |
|
||||||
- ⚡ Personal & locked Views |
|
||||||
- ⚡ Upload images to cells (Works with S3, Minio, GCP, Azure, DigitalOcean, Linode, OVH, BackBlaze)!! |
|
||||||
- ⚡ Roles : Owner, Creator, Editor, Commenter, Viewer, Commenter, Custom Roles. |
|
||||||
- ⚡ Access Control : Fine-grained access control even at database, table & column level. |
|
||||||
|
|
||||||
### App Store for workflow automations |
|
||||||
- ⚡ Chat : Microsoft Teams, Slack, Discord, Mattermost |
|
||||||
- ⚡ Email : SMTP, SES, Mailchimp |
|
||||||
- ⚡ SMS : Twilio |
|
||||||
- ⚡ Whatsapp |
|
||||||
- ⚡ Any 3rd Party APIs |
|
||||||
|
|
||||||
### Programmatic API access via |
|
||||||
- ⚡ REST APIs (Swagger) |
|
||||||
- ⚡ GraphQL APIs. |
|
||||||
- ⚡ Includes JWT Authentication & Social Auth |
|
||||||
- ⚡ API tokens to integrate with Zapier, Integromat. |
|
||||||
|
|
||||||
## Why are we building this ? 🎯 |
|
||||||
Most internet businesses equip themselves with either spreadsheet or a database to solve their business needs. Spreadsheets are used by a Billion+ humans collaboratively every single day. However, we are way off working at similar speeds on databases which are way more powerful tools when it comes to computing. Attempts to solve this with SaaS offerings has meant horrible access controls, vendor lockin, data lockin, abrupt price changes & most importantly a glass ceiling on what's possible in future. |
|
||||||
|
|
||||||
## Our Mission : ❤ |
|
||||||
Our mission is to provide the most powerful no-code interface for databases which is open source to every single internet business in the world. This would not only democratise access to a powerful computing tool but also bring forth a billion+ people who will have radical tinkering-and-building abilities on internet. |
|
||||||
|
|
||||||
## Architecture - Simple Overview |
|
||||||
|
|
||||||
<img src="architecture.png" style="background: white;border-radius:4px;padding :10px"> |
|
||||||
|
|
||||||
| Project Type | Metadata stored in | Data stored in | |
|
||||||
|---------|-----------|--------| |
|
||||||
| Create new project | NC_DB | NC_DB | |
|
||||||
| Create new project with External Database | NC_DB | External Database | |
|
||||||
| Create new project from Excel | NC_DB | NC_DB | |
|
||||||
|
|
||||||
## NocoDB repository structure |
|
||||||
|
|
||||||
We use ``Lerna`` to manage multi-packages. We have the following [packages](https://github.com/nocodb/nocodb/tree/master/packages). |
|
||||||
|
|
||||||
- ``packages/nc-cli`` : A CLI to create NocoDB app. |
|
||||||
|
|
||||||
- ``packages/nc-common``: A common library package used internally. |
|
||||||
|
|
||||||
- ``packages/nc-gui``: NocoDB Frontend. |
|
||||||
|
|
||||||
- ``packages/nc-lib-gui``: The build version of ``nc-gui`` which will be used in ``packages/nocodb``. |
|
||||||
|
|
||||||
- ``packages/nc-plugin``: Plugin template. |
|
||||||
|
|
||||||
- ``packages/noco-docs``: NocoDB Documentation which will be auto-released to [nocodb/noco-docs](https://github.com/nocodb/noco-docs). |
|
||||||
|
|
||||||
- ``packages/nocodb``: NocoDB Backend, hosted in [NPM](https://www.npmjs.com/package/nocodb). |
|
||||||
|
|
||||||
|
|
||||||
## Contributions |
|
||||||
|
|
||||||
All contributions are welcome. NocoDB projects can be found in the [NocoDB](https://github.com/nocodb) Github organization. Our core uses [The AGPL V3 license](https://github.com/nocodb/nocodb/blob/master/LICENSE) and all contributors should read the [contribution guides](https://github.com/nocodb/nocodb/blob/master/.github/CONTRIBUTING.md) before making your first contribution. |
|
||||||
|
|
||||||
You can also share your thoughts and discuss with our community members via [discord](https://discord.gg/5RgZmkW) or [Github Discussion](https://github.com/nocodb/nocodb/discussions). We also share our [Immediate Roadmap](https://github.com/nocodb/nocodb/projects/1) and all opinions are welcome. |
|
||||||
|
|
||||||
## Support |
|
||||||
|
|
||||||
If you have any issues or questions, you can reach out for help in our [discord](https://discord.gg/5RgZmkW). |
|
@ -1,19 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Audit' |
|
||||||
description: 'Audit log' |
|
||||||
position: 590 |
|
||||||
category: 'Product' |
|
||||||
menuTitle: 'Audit' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
We are keeping all the user operation logs under audits, user can access the audits logs by clicking the `Audit` icon from the left navigation drawer. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
![Screenshot_2021-07-23_at_7_08_22_PM](https://user-images.githubusercontent.com/61551451/126790439-14f4f60e-f125-48f8-a8a5-28f20fab71aa.png) |
|
||||||
|
|
||||||
_Sample audit logs:_ |
|
||||||
|
|
||||||
![Pasted_Image_23_07_21__7_13_PM](https://user-images.githubusercontent.com/61551451/126790664-024f4803-c343-46ca-9b47-c3dfa0b1ad6c.png) |
|
@ -1,77 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Column Operations" |
|
||||||
description: "Column Operations" |
|
||||||
position: 530 |
|
||||||
category: "Product" |
|
||||||
menuTitle: "Column Operations" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Fields |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144435795-7156799c-04de-474d-9125-1b15e07acc3d.png" width="60%"/> |
|
||||||
|
|
||||||
### Re-order Columns |
|
||||||
|
|
||||||
Column positions can be re-ordered. Open `Fields` menu, and re-order fields as needed by drag/drop `drag icon` |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144435838-8cff72eb-eaa2-4268-9749-213283eb8336.png" width="40%"/> |
|
||||||
|
|
||||||
#### Demo |
|
||||||
|
|
||||||
<img src="https://github.com/dstala/nocodb-files/blob/2c4ca2ff31460ee5636262e88ba303e2d436ba54/ColumnReorder.gif" width="100%"/> |
|
||||||
<!-- img src="https://media0.giphy.com/media/z5mYR1XoO85Umd5abh/giphy.gif?cid=790b7611f53d7e966bf9de3ae6b1cd5a7d6380b0ab8a4337&rid=giphy.gif&ct=g" width="60%"/ --> |
|
||||||
|
|
||||||
### Hide/ Unhide Columns |
|
||||||
|
|
||||||
To hide/Unhide columns, open `Fields` menu, tick checkbox to keep column visible, untick checkbox to remove it from view |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144435852-47f87057-f42f-4691-abbd-9592cde50541.png" width="40%"/> |
|
||||||
|
|
||||||
#### Demo |
|
||||||
|
|
||||||
<img src="https://github.com/dstala/nocodb-files/blob/2c4ca2ff31460ee5636262e88ba303e2d436ba54/ColumnHide.gif" width="100%"/> |
|
||||||
<!-- img src="https://media2.giphy.com/media/8NXvWfHDoul72dwLhk/giphy.gif?cid=790b76116fa008b45c79bb91bfe611e324fa38cde21a255a&rid=giphy.gif&ct=g" width="60%"/ --> |
|
||||||
|
|
||||||
## Sort |
|
||||||
|
|
||||||
Sorting allows you to order contents alphabetically (A->Z) / (Z->A) |
|
||||||
(OR) in ascending/ descending order |
|
||||||
NocoDB allows nested sorting. You can choose column fields & order in which to apply nested sorting |
|
||||||
|
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144435903-84ed8e81-64ec-45e5-a045-9a993238c78c.png" width="60%"/> |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144435925-67b995a0-da10-45c9-bf54-9edcc63c5644.png" width="75%"/> |
|
||||||
|
|
||||||
|
|
||||||
#### Demo |
|
||||||
|
|
||||||
<img src="https://github.com/dstala/nocodb-files/blob/2c4ca2ff31460ee5636262e88ba303e2d436ba54/ColumnSort-2.gif" width="100%"/> |
|
||||||
<!-- img src="https://media4.giphy.com/media/ThQ8d42U2zdFyZGeZe/giphy.gif?cid=790b761183da2eb690295c5c25f83ace7acf5212c82569a1&rid=giphy.gif&ct=g" width="60%"/ --> |
|
||||||
|
|
||||||
## Filter |
|
||||||
|
|
||||||
Filters allow you to restrict/organize your data on the view as per your needs. |
|
||||||
NocoDB allows nested filters. You can choose multiple columns and conditions to apply filter. |
|
||||||
Between filters, you can opt for either `and` or `or` mode operation. |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144435944-8498be32-76cb-48d1-883a-8f674f2eb68e.png" width="60%"/> |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144435955-361238d5-ecda-448e-a6de-a47086aeec6e.png" width="75%"/> |
|
||||||
|
|
||||||
### Supported filters |
|
||||||
Each filter can be of type as described below |
|
||||||
| Type | |
|
||||||
|---| |
|
||||||
| is equal | |
|
||||||
| is not equal | |
|
||||||
| is like | |
|
||||||
| is not like | |
|
||||||
| is null | |
|
||||||
| is not null | |
|
||||||
| > | |
|
||||||
| < | |
|
||||||
| >= | |
|
||||||
| <= | |
|
||||||
|
|
||||||
#### Demo |
|
||||||
<img src="https://github.com/dstala/nocodb-files/blob/2c4ca2ff31460ee5636262e88ba303e2d436ba54/ColumnFilter.gif" width="100%"/> |
|
||||||
<!-- img src="https://media4.giphy.com/media/eap5WSJfa05Qk7F3gm/giphy.gif?cid=790b761142dbc95c4f86b23a57fb0a9cb261292a88908e06&rid=giphy.gif&ct=g" width="60%"/ --> |
|
@ -1,422 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Column Types' |
|
||||||
description: 'Column Types' |
|
||||||
position: 520 |
|
||||||
category: 'Product' |
|
||||||
menuTitle: 'Column Types' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Available Column Types |
|
||||||
|
|
||||||
| Type | Description | |
|
||||||
|---|---| |
|
||||||
| [ID](#id) | Primary column of the table | |
|
||||||
| [LinkToAnotherRecord](#linktoanotherrecord) | Has Many or Many To Many columns | |
|
||||||
| [ForeignKey](#foreignkey)| Belongs To relation | |
|
||||||
| [SingleLineText](#singlelinetext) | For short text | |
|
||||||
| [LongText](#longtext) | For lengthy string content | |
|
||||||
| [Attachment](#attachment) | File attachment column | |
|
||||||
| [Checkbox](#checkbox) | Boolean value | |
|
||||||
| [MultiSelect](#multiselect) | Multiple options can be selected once | |
|
||||||
| [SingleSelect](#singleselect) | Single option select | |
|
||||||
| [Date](#date) | Date selector | |
|
||||||
| [Year](#year) | Year selector | |
|
||||||
| [Time](#time) | Time selector | |
|
||||||
| [PhoneNumber](#phonenumber) | Phone number field | |
|
||||||
| [Email](#email) | Email field | |
|
||||||
| [URL](#url) | Valid URL field | |
|
||||||
| [Number](#number) | Any type of number | |
|
||||||
|[Decimal](#decimal)| Fractional number | |
|
||||||
|[Currency](#currency)| Currency value | |
|
||||||
|[Percent](#percent)| Percentage | |
|
||||||
|[Duration](#duration)| Duration | |
|
||||||
|[Rating](#rating)| Rating | |
|
||||||
|[Formula](#formula)| Formula based generated column | |
|
||||||
| [Count](#count) | | |
|
||||||
|[DateTime](#datetime)| Date & Time selector | |
|
||||||
|[CreateTime](#createtime)| | |
|
||||||
|[AutoNumber](#autonumber)| | |
|
||||||
|[Geometry](#geometry)| Geometry column | |
|
||||||
|[SpecificDBType](#specificdbtype)| Custom DB type option | |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Database Types |
|
||||||
|
|
||||||
|
|
||||||
### ID |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|_All types are available_|int| |
|
||||||
|**PostgreSQL**|_All types are available_|int4| |
|
||||||
|**SQL Server**|_All types are available_|int| |
|
||||||
|**SQLite**|_All types are available_|integer| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### LinkToAnotherRecord |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### ForeignKey |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### SingleLineText |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**||| |
|
||||||
|**PostgreSQL**||| |
|
||||||
|**SQL Server**||| |
|
||||||
|**SQLite**||| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### LongText |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|char, varchar, nchar, text, tinytext, mediumtext, longtext|text| |
|
||||||
|**PostgreSQL**|char, character, character varying, text|text| |
|
||||||
|**SQL Server**|char, ntext, text, varchar, nvarchar|text| |
|
||||||
|**SQLite**|character, text, varchar|text| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Attachment |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|json, char, varchar, nchar, text, tinytext, mediumtext, longtext| text | |
|
||||||
|**PostgreSQL**|json, char, character, character varying, text| text | |
|
||||||
|**SQL Server**|char, ntext, text, varchar, nvarchar| text | |
|
||||||
|**SQLite**|character, text, varchar|text| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Checkbox |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|int, smallint, mediumint, bigint, bit, boolean, serial, tinyint|tinyint| |
|
||||||
|**PostgreSQL**|bit, bool, int2, int4, int8, boolean, smallint, int, integer, bigint, bigserial, char, int4range, int8range, serial, serial2, serial8|bool| |
|
||||||
|**SQL Server**|bigint, bit, int, tinyint|tinyint| |
|
||||||
|**SQLite**|int, integer, tinyint, smallint, mediumint, bigint, int2, int8, boolean|| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### MultiSelect |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|set, text, tinytext, mediumtext, longtext|set| |
|
||||||
|**PostgreSQL**|text|text| |
|
||||||
|**SQL Server**|text, ntext|text| |
|
||||||
|**SQLite**|text, varchar|text| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### SingleSelect |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|enum, text, tinytext, mediumtext, longtext|enum| |
|
||||||
|**PostgreSQL**|text| |
|
||||||
|**SQL Server**|text, ntext|text| |
|
||||||
|**SQLite**|text, varchar|text| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Date |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|date, datetime, timestamp, varchar|varchar| |
|
||||||
|**PostgreSQL**||character varying| |
|
||||||
|**SQL Server**||| |
|
||||||
|**SQLite**|date|varchar| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Year |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|year|year| |
|
||||||
|**PostgreSQL**|int|int| |
|
||||||
|**SQL Server**|int|int| |
|
||||||
|**SQLite**|int, integer, tinyint, smallint, mediumint, bigint, int2, int8|| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Time |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|time|time| |
|
||||||
|**PostgreSQL**|time, time without time zone, timestamp, timestamp without time zone, timestamptz, timestamp with time zone, timetz, time with time zone|time| |
|
||||||
|**SQL Server**|time|time| |
|
||||||
|**SQLite**|int, integer, tinyint, smallint, mediumint, bigint, int2, int8|time| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### PhoneNumber |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|varchar|varchar| |
|
||||||
|**PostgreSQL**|character varying|character varying| |
|
||||||
|**SQL Server**|varchar|varchar| |
|
||||||
|**SQLite**|varchar, text|varchar| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Email |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|varchar|varchar| |
|
||||||
|**PostgreSQL**|character varying|character varying| |
|
||||||
|**SQL Server**|varchar|| |
|
||||||
|**SQLite**|varchar, text|varchar| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### URL |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|text, tinytext, mediumtext, longtext, varchar|varchar| |
|
||||||
|**PostgreSQL**|character varying, text|character varying| |
|
||||||
|**SQL Server**|varchar, text|varchar| |
|
||||||
|**SQLite**|varchar, text|varchar| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Number |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|int, smallint, mediumint, bigint, bit, float, decimal, double, serial|int| |
|
||||||
|**PostgreSQL**|int, integer, bigint, bigserial, int2, int4, int8, serial, serial2, serial8, double precision, float4, float8, smallint, smallserial|int8| |
|
||||||
|**SQL Server**|int, bigint, bit, decimal, float, numeric, real, smallint, tinyint|int| |
|
||||||
|**SQLite**|int, integer, tinyint, smallint, mediumint, bigint, int2, int8, numeric, real, double, double precision, float|integer| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Decimal |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|float, decimal, double, serial|decimal| |
|
||||||
|**PostgreSQL**|double precision,float4,float8|decimal| |
|
||||||
|**SQL Server**|decimal, float|decimal| |
|
||||||
|**SQLite**|real, double, double precision, float, numericdecimal| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Currency |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|decimal, float, double, serial', 'int, smallint, mediumint, bigint, bit|decimal| |
|
||||||
|**PostgreSQL**|int, integer, bigint, bigserial, int2, int4, int8, serial, serial2, serial8, double precision, money', 'float4, float8|decimal| |
|
||||||
|**SQL Server**|int, bigint, bit, decimal, float, numeric, real, smallint, tinyint|decimal| |
|
||||||
|**SQLite**|real, double, double precision, float, int, integer, tinyint, smallint, mediumint, bigint, int2, int8, numeric|double precision| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Percent |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|decimal, float, double, serial', 'int, smallint, mediumint, bigint, bit|double| |
|
||||||
|**PostgreSQL**|int, integer, bigint, bigserial, int2, int4, int8, serial, serial2, serial8, double precision, float4, float8, smallint, smallserial|double| |
|
||||||
|**SQL Server**|int, bigint, bit, decimal, float, numeric, real, smallint, tinyint|double| |
|
||||||
|**SQLite**|real, double, double precision, float, int, integer, tinyint, smallint, mediumint, bigint, int2, int8, numeric|double| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Duration |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|decimal, float, double, serial', 'int, smallint, mediumint, bigint, bit|int| |
|
||||||
|**PostgreSQL**|int, integer, bigint, bigserial, int2, int4, int8, serial, serial2, serial8, double precision, float4, float8, smallint, smallserial|int8| |
|
||||||
|**SQL Server**|int, bigint, bit, decimal, float, numeric, real, smallint, tinyint|int| |
|
||||||
|**SQLite**|int, integer, tinyint, smallint, mediumint, bigint, int2, int8|integer| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Rating |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|decimal, float, double, serial', 'int, smallint, mediumint, bigint, bit|float| |
|
||||||
|**PostgreSQL**|int, integer, bigint, bigserial, int2, int4, int8, serial, serial2, serial8, double precision, float4, float8, smallint, smallserial|float8| |
|
||||||
|**SQL Server**|int, bigint, bit, decimal, float, numeric, real, smallint, tinyint|float| |
|
||||||
|**SQLite**|real, double, double precision, float, int, integer, tinyint, smallint, mediumint, bigint, int2, int8, numeric|float| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Formula |
|
||||||
|
|
||||||
|
|
||||||
For more about formula visit [here](./formula) |
|
||||||
|
|
||||||
|
|
||||||
### Count |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|int, smallint, mediumint, bigint, serial|int| |
|
||||||
|**PostgreSQL**|int, integer, bigint, bigserial, int2, int4, int8, serial, serial2, serial8, smallint, smallserial|int8| |
|
||||||
|**SQL Server**|int, bigint, smallint, tinyint|int| |
|
||||||
|**SQLite**|int, integer, tinyint, smallint, mediumint, bigint, int2, int8|integer| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### DateTime |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|datetime, timestamp, varchar|datetime| |
|
||||||
|**PostgreSQL**|timestamp, timestamp without time zone, timestamptz, timestamp with time zone|datetime| |
|
||||||
|**SQL Server**|datetime, datetime2, datetimeoffset|datetime| |
|
||||||
|**SQLite**|datetime, timestamp|datetime| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### CreateTime |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|Database| Types| Default Type| |
|
||||||
|-----|----------|----------| |
|
||||||
|**MySQL**|datetime, timestamp, varchar|datetime| |
|
||||||
|**PostgreSQL**|timestamp, timestamp without time zone, timestamptz, timestamp with time zone|datetime| |
|
||||||
|**SQL Server**|datetime, datetime2, datetimeoffset|datetime| |
|
||||||
|**SQLite**|datetime, timestamp|datetime| |
|
||||||
|
|
||||||
|
|
||||||
### Geometry |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|
|
||||||
|Database| Types| |
|
||||||
|-----|----------| |
|
||||||
|**MySQL**|geometry, point, linestring, polygon, multipoint, multilinestring, multipolygon| |
|
||||||
|**PostgreSQL**|polygon, point, circle, box, line, lseg, path, circle| |
|
||||||
|**SQL Server**|geometry| |
|
||||||
|**SQLite**|text| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### SpecificDBType |
|
||||||
|
|
||||||
#### Available Database Types |
|
||||||
|
|
||||||
|
|
||||||
|Database| Types| |
|
||||||
|-----|----------| |
|
||||||
|**MySQL**|_All types are available_| |
|
||||||
|**PostgreSQL**|_All types are available_| |
|
||||||
|**SQL Server**|_All types are available_| |
|
||||||
|**SQLite**|_All types are available_| |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,90 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Dashboard' |
|
||||||
description: 'Dashboard' |
|
||||||
position: 500 |
|
||||||
category: 'Product' |
|
||||||
menuTitle: 'Dashboard' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Setup your first super admin |
|
||||||
|
|
||||||
Once you have started NocoDB, you can visit the dashboard via `example.com/dashboard`. |
|
||||||
|
|
||||||
Click `Let's Begin` button to sign up. |
|
||||||
<img src="https://user-images.githubusercontent.com/35857179/126597128-f88df6e5-7625-4208-9817-68e9303410ff.png" width="75%"/> |
|
||||||
|
|
||||||
|
|
||||||
Enter your work email and your password. |
|
||||||
|
|
||||||
<alert> |
|
||||||
Your password has at least 8 letters with one uppercase, one number and one special letter |
|
||||||
</alert> |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/35857179/126597144-0343b5ca-c7ca-47a4-926d-4e8df2f8c161.png" width="60%"/> |
|
||||||
|
|
||||||
If you start your application without specifying `NC_DB`. A local SQLite will be created in root folder. Your data will be stored there. |
|
||||||
|
|
||||||
If you are using Docker, it is recommended to mount `/usr/app/data/` for persistent volume (since `v0.10.6`), otherwise your data will be lost after recreating the container. |
|
||||||
|
|
||||||
Example: |
|
||||||
|
|
||||||
``` |
|
||||||
docker run -d -p 8080:8080 --name nocodb -v "$(pwd)"/nocodb:/usr/app/data/ nocodb/nocodb:latest |
|
||||||
``` |
|
||||||
|
|
||||||
## Initialize your first project |
|
||||||
|
|
||||||
Once you have logged into NocoDB, you should see `My Projects`. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126597182-b74cadb4-e165-417e-9e95-9a3cb7dce8e5.png) |
|
||||||
|
|
||||||
To create a project, you can click `New Project`. |
|
||||||
|
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144373314-9146e855-0791-4815-a03f-303e5ffb2a63.png" width="60%"/> |
|
||||||
|
|
||||||
|
|
||||||
### Creating empty project |
|
||||||
|
|
||||||
Click `Create`, you need to specify the project name and API type. A local SQLite will be used. |
|
||||||
<img src="https://user-images.githubusercontent.com/35857179/126597259-b9552c71-d13b-463c-abc2-0f3be31627b2.png" width="60%"/> |
|
||||||
|
|
||||||
|
|
||||||
### Connecting to external database |
|
||||||
|
|
||||||
Click `Create By Connecting To An external Datbase`, you need to specify the project name, API type, and other database parameters. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126597279-c1722d8b-c885-4e9e-9e94-44711102af20.png) |
|
||||||
|
|
||||||
Currently it supports MySQL, Postgres, MSSQL and SQLite. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126597320-fd6b19a9-ed3e-4f4a-80b7-880a79a54a11.png) |
|
||||||
|
|
||||||
You can also configure associated SSL & advanced parameters. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126597342-0c61ab15-a112-4269-8f30-78455fa09081.png) |
|
||||||
|
|
||||||
Click `Test Database Connection` to see if the connection can be established or not. |
|
||||||
|
|
||||||
> NocoDB create's a new **empty database** with specified parameters, if the database doesn't exist. |
|
||||||
|
|
||||||
### Creating project from Excel |
|
||||||
|
|
||||||
Click `Create Project from Excel`, you can either upload/ drag and drop Excel file (OR) specify Excel file URL |
|
||||||
|
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144373863-7ced9315-a70b-4746-9295-325e463dc110.png" width="60%"/> |
|
||||||
|
|
||||||
|
|
||||||
Supported file formats |
|
||||||
|
|
||||||
- Xls |
|
||||||
- Xlsx |
|
||||||
- Xlsm |
|
||||||
- Ods |
|
||||||
- Ots |
|
||||||
|
|
||||||
A local SQLite will be used. |
|
||||||
|
|
@ -1,130 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Formulas" |
|
||||||
description: "Formulas" |
|
||||||
position: 570 |
|
||||||
category: "Product" |
|
||||||
menuTitle: "Formulas" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Adding formula column |
|
||||||
|
|
||||||
![Formula](https://user-images.githubusercontent.com/86527202/144246227-42c44df6-7e3e-4b2c-9bb9-a3c213bcad20.png) |
|
||||||
|
|
||||||
### 1. Click on '+' (Add column) |
|
||||||
|
|
||||||
### 2. Populate column Name |
|
||||||
|
|
||||||
### 3. Select column Type as 'Formula' |
|
||||||
|
|
||||||
### 4. Insert required formula |
|
||||||
|
|
||||||
- Can use column names in equation |
|
||||||
- Can use explicit numberical values/ strings as needed |
|
||||||
- Table below lists supported formula & associated syntax |
|
||||||
- Nested formula (formula equation referring to another formula column) are not supported |
|
||||||
|
|
||||||
### 5. Click on 'Save' |
|
||||||
|
|
||||||
## Available Formula Features |
|
||||||
|
|
||||||
### Numeric Functions |
|
||||||
|
|
||||||
| Name | Syntax | Sample | Output | |
|
||||||
|-------------|----------------------------|----------------------------------|------------------------------------------------------------------| |
|
||||||
| **ABS** | `ABS(value)` | `ABS(Column)` | Absolute value of the input parameter | |
|
||||||
| **ADD** | `ADD(value1,[value2,...])` | `ADD(Column1, Column1)` | Sum of input parameters | |
|
||||||
| **AVG** | `AVG(value1,[value2,...])` | `AVG(Column1, Column1)` | Average of input parameters | |
|
||||||
| **CEILING** | `CEILING(value)` | `CEILING(Column)` | Rounded next largest integer value of input parameter | |
|
||||||
| **EXP** | `EXP(value)` | `EXP(Column)` | Exponential value of input parameter (`e^x`) | |
|
||||||
| **FLOOR** | `FLOOR(value)` | `FLOOR(Column)` | Rounded largest integer less than or equal to input parameter | |
|
||||||
| **INT** | `INT(value)` | `INT(Column)` | Integer value of input parameter | |
|
||||||
| **LOG** | `LOG([base], value)` | `LOG(10, Column)` | Logarithm of input parameter to the base (default = e) specified | |
|
||||||
| **MAX** | `MAX(value1,[value2,...])` | `MAX(Column1, Column2, Column3)` | Maximum value amongst input parameters | |
|
||||||
| **MIN** | `MIN(value1,[value2,...])` | `MIN(Column1, Column2, Column3)` | Minimum value amongst input parameters | |
|
||||||
| **MOD** | `MOD(value1, value2)` | `MOD(Column, 2)` | Remainder after integer division of input parameters | |
|
||||||
| **POWER** | `POWER(base, exponent)` | `POWER(Column, 3)` | `base` to the `exponent` power, as in `base^exponent` | |
|
||||||
| **ROUND** | `ROUND(value)` | `ROUND(Column)` | Nearest integer to the input parameter | |
|
||||||
| **SQRT** | `SQRT(value)` | `SQRT(Column)` | Square root of the input parameter | |
|
||||||
|
|
||||||
|
|
||||||
### Numeric Operators |
|
||||||
|
|
||||||
| Operator | Sample | Description | |
|
||||||
| -------- | ----------------------- | -------------------------------- | |
|
||||||
| `+` | `column1 + column2 + 2` | Addition of numeric values | |
|
||||||
| `-` | `column1 - column2` | Subtraction of numeric values | |
|
||||||
| `*` | `column1 * column2` | Multiplication of numeric values | |
|
||||||
| `/` | `column1 / column2` | Division of numeric values | |
|
||||||
|
|
||||||
> To change order of arithmetic operation, use round bracket parantheses `()` |
|
||||||
> Example: `(column1 + (column2 * column3) / (3 - column4 ))` |
|
||||||
|
|
||||||
|
|
||||||
### String Functions |
|
||||||
|
|
||||||
| Name | Syntax | Sample | Output | |
|
||||||
|-------------|----------------------------------|---------------------------------|---------------------------------------------------------------------------| |
|
||||||
| **CONCAT** | `CONCAT(str1, [str2,...])` | `CONCAT(fName, ' ', lName)` | Concatenated string of input parameters | |
|
||||||
| **LEFT** | `LEFT(str1, [str2,...])` | `LEFT(Column, 3)` | `n` characters from the beginning of input parameter | |
|
||||||
| **LEN** | `LEN(str)` | `LEN(Title)` | Input parameter character length | |
|
||||||
| **LOWER** | `LOWER(str)` | `LOWER(Title)` | Lower case converted string of input parameter | |
|
||||||
| **MID** | `SUBTR(str, position, [count])` | `MID(Column, 3, 2)` | Alias for `SUBSTR` | |
|
||||||
| **REPEAT** | `REPEAT(str, count)` | `REPEAT(Column, 2)` | Specified copies of the input parameter string concatenated together | |
|
||||||
| **REPLACE** | `REPLACE(str, srchStr, rplcStr)` | `REPLACE(Column, 'int', 'num')` | String, after replacing all occurrences of `srchStr` with `rplcStr` | |
|
||||||
| **RIGHT** | `RIGHT(str, count)` | `RIGHT(Column, 3)` | `n` characters from the end of input parameter | |
|
||||||
| **SEARCH** | `SEARCH(str, srchStr)` | `SEARCH(Column, 'str')` | Index of `srchStr` specified if found, 0 otherwise | |
|
||||||
| **SUBSTR** | `SUBTR(str, position, [count])` | `SUBSTR(Column, 3, 2)` | Substring of length 'count' of input string, from the postition specified | |
|
||||||
| **TRIM** | `TRIM(str)` | `TRIM(Title)` | Remove trailing and leading whitespaces from input parameter | |
|
||||||
| **UPPER** | `UPPER(str)` | `UPPER(Title)` | Upper case converted string of input parameter | |
|
||||||
| **URL** | `URL(str)` | `URL(Column)` | Convert to a hyperlink if it is a valid URL | |
|
||||||
|
|
||||||
### Date Functions |
|
||||||
|
|
||||||
| Name | Syntax | Sample | Output | |
|
||||||
|-------------|-----------------------------------------------------------|-------------------------------------------------------|-------------------------------------------------------------------------------------------------------| |
|
||||||
| **DATEADD** | `DATEADD(DATE_COL, 1, 'day')` | `DATEADD(date, 1, 'day')` | Supposing the DATE_COL is 2022-03-14. The result is 2022-03-15. | |
|
||||||
| | `DATEADD(DATE_TIME_COL, 2, 'month')` | `DATEADD(datetime, 2, 'month')` | Supposing the DATE_COL is 2022-03-14 03:14. The result is 2022-05-14 03:14. | |
|
||||||
| | `IF(NOW() < DATE_COL, "true", "false")` | `IF(NOW() < date, "true", "false")` | If current date is less than DATE_COL, it returns true. Otherwise, it returns false. | |
|
||||||
| | `IF(NOW() < DATEADD(DATE_COL,10,'day'), "true", "false")` | `IF(NOW() < DATEADD(date,10,'day'), "true", "false")` | If the current date is less than DATE_COL plus 10 days, it returns true. Otherwise, it returns false. | |
|
||||||
|
|
||||||
### Logical Operators |
|
||||||
|
|
||||||
| Operator | Sample | Description | |
|
||||||
| -------- | -------------------- | ------------------------ | |
|
||||||
| `<` | `column1 < column2` | Less than | |
|
||||||
| `>` | `column1 > column2` | Greater than | |
|
||||||
| `<=` | `column1 <= column2` | Less than or equal to | |
|
||||||
| `>=` | `column1 >= column2` | Greater than or equal to | |
|
||||||
| `==` | `column1 == column2` | Equal to | |
|
||||||
| `!=` | `column1 != column2` | Not equal to | |
|
||||||
|
|
||||||
|
|
||||||
### Conditional Expressions |
|
||||||
|
|
||||||
| Name | Syntax | Sample | Output | |
|
||||||
|------------|------------------------------------------------|---------------------------------------------|-------------------------------------------------------------| |
|
||||||
| **IF** | `IF(expr, successCase, [failCase])` | `IF(Column > 1, Value1, Value2)` | successCase if `expr` evaluates to TRUE, elseCase otherwise | |
|
||||||
| **SWITCH** | `SWITCH(expr, [pattern, value, ..., default])` | `SWITCH(Column1, 1, 'One', 2, 'Two', '--')` | Switch case value based on `expr` output | |
|
||||||
| **AND** | `AND(expr1, [expr2,...])` | `AND(Column > 2, Column < 10)` | TRUE if all `expr` evaluate to TRUE | |
|
||||||
| **OR** | `OR(expr1, [expr2,...])` | `OR(Column > 2, Column < 10)` | TRUE if at least one `expr` evaluates to TRUE | |
|
||||||
|
|
||||||
Logical operators, along with Numerical operators can be used to build conditional `expressions`. |
|
||||||
|
|
||||||
Examples: |
|
||||||
|
|
||||||
```bash |
|
||||||
IF(marksSecured > 80, "GradeA", "GradeB") |
|
||||||
``` |
|
||||||
|
|
||||||
```bash |
|
||||||
SWITCH(quarterNumber, |
|
||||||
1, 'Jan-Mar', |
|
||||||
2, 'Apr-Jun', |
|
||||||
3, 'Jul-Sep', |
|
||||||
4, 'Oct-Dec', |
|
||||||
'INVALID' |
|
||||||
) |
|
||||||
``` |
|
||||||
|
|
@ -1,79 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Link To Another Record" |
|
||||||
description: "Link To Another Record" |
|
||||||
position: 540 |
|
||||||
category: "Product" |
|
||||||
menuTitle: "Link To Another Record" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
### Relationship types: |
|
||||||
|
|
||||||
- One to one |
|
||||||
- A Table record in first table is related to only one record of second table. |
|
||||||
- Example: Country has a capital city |
|
||||||
- One to many |
|
||||||
- A Table record in first table is related to more than one record of second table. But second table record maps to only one entry of first table |
|
||||||
- NocoDB refers to this category of relationship as **has many** |
|
||||||
- For every **has many** relation defined, NocoDB augments **belongs to** relationship column in the other table automatically |
|
||||||
- Example: Country **has many** Cities. (other way mapping > City **belongs to** Country ) |
|
||||||
- Many to many |
|
||||||
- A Table record in first table is related to more than one record of second table; second table record can also map to more than on record of first table. |
|
||||||
- NocoDB refers to this category of relationship as **many to many** |
|
||||||
- For every **many to many** relation defined between tables, NocoDB augments **many to many** relationship column in the other table automatically |
|
||||||
- Example: Film **has many** Actors. Actor **has many** Films (works on many films) |
|
||||||
|
|
||||||
Further details of relationship types can be found [here](https://afteracademy.com/blog/what-are-the-different-types-of-relationships-in-dbms) |
|
||||||
|
|
||||||
Relationships between table records can be established by using **LinkToAnotherRecord** column type. |
|
||||||
Workflow details are captured below |
|
||||||
|
|
||||||
## Adding a relationship |
|
||||||
|
|
||||||
![1](https://user-images.githubusercontent.com/86527202/144224170-43f4194f-83d4-4291-8c91-1f66ea1caeda.png) |
|
||||||
|
|
||||||
### 1. Create column |
|
||||||
|
|
||||||
Click on '+' button at end of column headers |
|
||||||
|
|
||||||
### 2. Update column name |
|
||||||
|
|
||||||
Input name in the text box provided |
|
||||||
|
|
||||||
### 3. Select column type |
|
||||||
|
|
||||||
Select Column type as "LinkToAnotherRecord" from the drop-down menu |
|
||||||
|
|
||||||
### 4. Choose relationship type |
|
||||||
|
|
||||||
'Has Many': corresponds to the 'One-to-many' relationships |
|
||||||
'Many To Many': corresponds to the 'Many-to-many' relationships |
|
||||||
|
|
||||||
### 5. Select child table from drop down menu |
|
||||||
|
|
||||||
### 6. Click on 'Save' |
|
||||||
|
|
||||||
A new column will get created in both the parent table & child table |
|
||||||
|
|
||||||
## Updating linked records |
|
||||||
|
|
||||||
### 1. Open link record tab |
|
||||||
|
|
||||||
Click on the '+' icon in corresponding row - cell |
|
||||||
![2truncate](https://user-images.githubusercontent.com/86527202/144224728-1cba50e3-323e-4578-be48-d2a205fb472c.png) |
|
||||||
|
|
||||||
### 2. Select from the option displayed |
|
||||||
|
|
||||||
Use 'Filter box' to narrow down on search items |
|
||||||
You can opt to insert a new record as well, using "+ New Record" button |
|
||||||
![3](https://user-images.githubusercontent.com/86527202/144224530-a258775f-1eea-4c79-88ed-a377d1e35a26.png) |
|
||||||
|
|
||||||
### 3. Column mapping showing "Has Many" relationship |
|
||||||
|
|
||||||
Country 'has many' City |
|
||||||
|
|
||||||
### 4. Column mapping for "Belongs to" relationship [Automatically updated] |
|
||||||
|
|
||||||
City 'belongs to' Country |
|
||||||
![4](https://user-images.githubusercontent.com/86527202/144224542-d28be060-a077-468a-bdc4-b2e8a783d75f.png) |
|
@ -1,53 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Lookup" |
|
||||||
description: "Lookup" |
|
||||||
position: 550 |
|
||||||
category: "Product" |
|
||||||
menuTitle: "Lookup" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Lookup |
|
||||||
|
|
||||||
#### Sample simple Organization structure: |
|
||||||
|
|
||||||
- 5 verticals, each vertical has a team name & associated team code |
|
||||||
- 5 employees working at different verticals |
|
||||||
- Vertical **has many** Employees : relationship has been defined |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144038845-402d5401-a214-4166-bc07-fcf8dcc8a961.png" width="125%"/> |
|
||||||
|
|
||||||
Now, we can explore how to extract team-code information in Employee table using **"LOOKUP"** columns |
|
||||||
|
|
||||||
## Adding a lookup column |
|
||||||
|
|
||||||
### 1. Add new column |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144230901-11dc69e7-3e4d-481d-b682-b7d73e6352c0.png" width="60%"/> |
|
||||||
Click on '+' icon to the left of column headers in Employee table |
|
||||||
|
|
||||||
### 2. Feed column name |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144230954-40646872-4a05-45fd-9a4f-52b8b00a3a7d.png" width="60%"/> |
|
||||||
|
|
||||||
### 3. Select column type as 'Lookup' |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144230982-37d08274-ce63-4a28-a30a-bd6b41c3b489.png" width="60%"/> |
|
||||||
|
|
||||||
### 4. Choose child table |
|
||||||
|
|
||||||
Table Verticals in our example |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144231016-b277270d-62e4-4607-9aaa-b253621808a0.png" width="60%"/> |
|
||||||
|
|
||||||
### 5. Select child column |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144231774-2bdd9988-d3f8-4933-96c6-5b710d645905.png" width="60%"/> |
|
||||||
|
|
||||||
### 6. Click on 'Save' |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144231320-9e8b3465-a9a4-4cf7-a9fe-65d47ab8b96c.png" width="60%"/> |
|
||||||
|
|
||||||
### 7. Required information is populated in the newly created column |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144231230-0e013684-b11c-4dce-bacf-9feee5546f26.png" width="60%"/> |
|
@ -1,66 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Metadata' |
|
||||||
description: 'Metadata' |
|
||||||
position: 600 |
|
||||||
category: 'Product' |
|
||||||
menuTitle: 'Metadata' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
To go to the Meta Management Portal, click ``Project Metadata`` under ``Settings`` on the leftmost menu. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/126929430-1ad086a8-0611-4f39-8c7f-580637574056.png) |
|
||||||
|
|
||||||
## Project Metadata |
|
||||||
|
|
||||||
The metadata is stored in meta directory in project level, database level, and API level. |
|
||||||
|
|
||||||
Under ``Project Metadata``, you can perform the following operations. |
|
||||||
|
|
||||||
- Export all metadata from the meta tables to meta directory |
|
||||||
|
|
||||||
- Import all metadata from the meta directory to meta tables |
|
||||||
|
|
||||||
- Export project meta to zip file and download |
|
||||||
|
|
||||||
- Import project meta zip file and restart |
|
||||||
|
|
||||||
- Clear all metadata from meta tables |
|
||||||
|
|
||||||
<alert> |
|
||||||
Import won't work with zip files exported from the older version of apps (< 0.11.6). <br> |
|
||||||
Import / Export will only transfer metadata and files related to the project and not any table data in the project. |
|
||||||
</alert> |
|
||||||
|
|
||||||
## Migration example |
|
||||||
### Export metadata |
|
||||||
Source project : Under ``Meta Management`` tab, select ``Export zip``, click ``Submit``. This step extracts project metadata and stores it in compressed (zip) format |
|
||||||
|
|
||||||
![meta-dev](https://user-images.githubusercontent.com/86527202/130780497-89578bd0-a417-468a-92d8-88c5c07a72b0.png "Step-Export") |
|
||||||
|
|
||||||
### Import metadata |
|
||||||
Destination project : Under ``Meta Management`` tab, select ``Import zip``, select ``meta.zip`` file stored in previous step. This step imports project metadata from compressed file (zip) selected and restarts project. |
|
||||||
|
|
||||||
![meta-prod](https://user-images.githubusercontent.com/86527202/130781015-3477e596-b1bc-4189-9853-bfd850157ba8.png) |
|
||||||
|
|
||||||
--- |
|
||||||
|
|
||||||
|
|
||||||
## Database Metadata |
|
||||||
|
|
||||||
Under ``DB Metadata``, You can manage your models. For example, if you do not want to expose some APIs, you can untick those under APIs here. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/127611038-a10ccee5-72ca-42cf-a55b-c8268c9fbe5c.png) |
|
||||||
|
|
||||||
The relations of all tables are listed under ``Relations``. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/127611116-0289f739-bad7-45a0-b2bd-bfd8565f50b8.png) |
|
||||||
|
|
||||||
## UI Access Control |
|
||||||
|
|
||||||
You can control the access to each table and relation by roles. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/127611188-339de6ca-e648-47c0-a358-eee0d03ae9d0.png) |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/35857179/127611237-5c43e194-a8ba-4e33-b473-5b690a38e80d.png) |
|
@ -1,34 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Primary value" |
|
||||||
description: "Primary value" |
|
||||||
position: 575 |
|
||||||
category: "Product" |
|
||||||
menuTitle: "Primary value" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## What is a 'Primary value' ? |
|
||||||
- Primary value as the name stands is the primary or main value within a row of a table that you generally associate that row with. |
|
||||||
- It should be usually associated with a column which is uniquely identifiable. However, this uniqueness is not enforced at the database level. |
|
||||||
|
|
||||||
## What is the use of 'Primary value' ? |
|
||||||
- Within a spreadsheet, primary value are always highlighted so that it is easier to recognise what row we are in. |
|
||||||
- And when LinkToAnotherRecord is created between two tables - it is the primary value that appears in LinkToAnotheRecord column. |
|
||||||
|
|
||||||
#### Example : ```Primary value```highlighted in actor table |
|
||||||
<img width="547" alt="actor" src="https://user-images.githubusercontent.com/5435402/152645708-92b83985-4a0a-42b2-9d01-d26be70fd3aa.png"> |
|
||||||
|
|
||||||
#### Example : ```Primary value``` highlighted in film table |
|
||||||
<img width="1406" alt="film-table" src="https://user-images.githubusercontent.com/5435402/152645713-b4df99b2-4eb7-4fea-85f9-0baf47470ef3.png"> |
|
||||||
|
|
||||||
#### Example : ```Primary value``` associated when ```LinkToAnotherRecord``` is created |
|
||||||
<img width="753" alt="actor-film" src="https://user-images.githubusercontent.com/5435402/152645714-4061c94a-4cfb-44e5-b112-63cf4ed869fe.png"> |
|
||||||
|
|
||||||
|
|
||||||
## How is ```Primary value``` identfied for existing database tables ? |
|
||||||
- It is usually the first column after the primary key which is not a number. |
|
||||||
- If there is no column which is not a number then the column adjacent to primary key is chosen. |
|
||||||
|
|
||||||
## Can I change the ```Primary Value``` to another column within tables ? |
|
||||||
- Yes, you can. Hover over column which you want as primary column and click ```Set as Primary Value``` |
|
@ -1,95 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Share Base" |
|
||||||
description: "Procedure to share a base & generating embedded iframe" |
|
||||||
position: 615 |
|
||||||
category: "Product" |
|
||||||
menuTitle: "Share Base" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## Generate 'Share base' |
|
||||||
|
|
||||||
- Open Project |
|
||||||
- Click on 'Share' button on top right tool bar |
|
||||||
|
|
||||||
![Screenshot 2022-02-19 at 11 11 39 AM](https://user-images.githubusercontent.com/86527202/154789342-11546764-11ac-4ad1-a830-84cb603156b7.png) |
|
||||||
|
|
||||||
- Under 'Shared base link' tab |
|
||||||
- Toggle from 'Disabled Share base' to 'Anyone with the link' |
|
||||||
|
|
||||||
![Screenshot 2022-02-19 at 11 16 02 AM](https://user-images.githubusercontent.com/86527202/154789352-87e65fcc-fbe5-48f0-a1e1-e54dce91a1f3.png) |
|
||||||
|
|
||||||
- Share base link generated is displayed over & can be used to share this project to others in the team [Selection (2) in the image below] |
|
||||||
|
|
||||||
![Screenshot 2022-02-19 at 12 01 58 PM](https://user-images.githubusercontent.com/86527202/154789725-a1194e30-3101-423a-bd5c-25009c361b96.png) |
|
||||||
|
|
||||||
## Modify 'Share base' |
|
||||||
|
|
||||||
Modify 'Share base' will invalidate earlier generated 'Share base' link & generate a new link. |
|
||||||
|
|
||||||
- Open Project base |
|
||||||
- Click on 'Share' button on top right tool bar |
|
||||||
- Under 'Shared base link' tab |
|
||||||
- Click on 'Reload' button |
|
||||||
|
|
||||||
## Disable 'Share base' |
|
||||||
|
|
||||||
Disable 'Share base' will invalidate generated 'Share base' link |
|
||||||
|
|
||||||
- Open Project base |
|
||||||
- Click on 'Share' button on top right tool bar |
|
||||||
- Under 'Shared base link' tab |
|
||||||
- Toggle from 'Anyone with the link' to 'Disable Share base' |
|
||||||
|
|
||||||
## 'Share base' access permissions |
|
||||||
|
|
||||||
Shared base can be configured as |
|
||||||
|
|
||||||
- Viewer: User with the link will get READ ONLY access to the project data |
|
||||||
- Editor: User with the link will get READ WRITE access to the project data |
|
||||||
|
|
||||||
## Embeddable Frame |
|
||||||
|
|
||||||
NocoDB interface can be embedded into existing applications easily by making use of [HTML IFRAME](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe)) attribute. |
|
||||||
|
|
||||||
### Generate embeddable HTML code |
|
||||||
|
|
||||||
- Open Project base |
|
||||||
- Click on 'Share' button on top right tool bar |
|
||||||
- Under 'Shared base link' tab |
|
||||||
- Click on </> button to copy 'Embeddable HTML code' |
|
||||||
|
|
||||||
Sample |
|
||||||
|
|
||||||
```html |
|
||||||
<iframe |
|
||||||
class="nc-embed" |
|
||||||
src="https://nocodb-nocodb-rsyir.ondigitalocean.app/dashboard/#/nc/base/e3bba9df-4fc1-4d11-b7ce-41c4a3ad6810?embed" |
|
||||||
frameborder="0" |
|
||||||
width="100%" |
|
||||||
height="700" |
|
||||||
> |
|
||||||
style="background: transparent; border: 1px solid #ddd"></iframe |
|
||||||
> |
|
||||||
``` |
|
||||||
|
|
||||||
### Embed into application's HTML Body |
|
||||||
|
|
||||||
Sample code with embedded iframe generated above |
|
||||||
|
|
||||||
```html |
|
||||||
<!DOCTYPE html> |
|
||||||
<html> |
|
||||||
<body> |
|
||||||
<iframe |
|
||||||
class="nc-embed" |
|
||||||
src="http://localhost:3000/#/nc/base/7d4b551c-b5e0-41c9-a87b-f3984c21d2c7?embed" |
|
||||||
frameborder="0" |
|
||||||
width="100%" |
|
||||||
height="700" |
|
||||||
style="background: transparent; " |
|
||||||
></iframe> |
|
||||||
</body> |
|
||||||
</html> |
|
||||||
``` |
|
@ -1,30 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Sync Schema' |
|
||||||
description: 'Schema changes made to database from outside nocodb GUI can be synced' |
|
||||||
position: 610 |
|
||||||
category: 'Product' |
|
||||||
menuTitle: 'Sync Schema' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## How to sync schema changes to NocoDB. |
|
||||||
NocoDB allows you to sync schema changes if you have made changes outside NocoDB GUI. However, it has to be noted then you will have to bring your own |
|
||||||
schema migrations for moving from environment to other. |
|
||||||
|
|
||||||
Below are the steps to sync schema changes. |
|
||||||
1. Under `Settings` menubar, click `Project Metadata` |
|
||||||
2. Under `Meta Management` tab, click on `Metadata` sub tab. |
|
||||||
3. Changes carried outside GUI, identified by NocoDB are listed under `Sync state` |
|
||||||
4. Click `Sync Now` to complete Schema sync procedure. |
|
||||||
|
|
||||||
![metasync](https://user-images.githubusercontent.com/86527202/147923717-630f0e0f-7c7a-431c-a50d-8f9376a06eb7.png) |
|
||||||
|
|
||||||
## Note |
|
||||||
1. Column rename operation will be treated like 'column delete' & 'column create' operation |
|
||||||
2. Only table schema changes identified will be listed under `Sync state`; any changes to records are automatically synchronized. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,114 +0,0 @@ |
|||||||
--- |
|
||||||
title: "Table Operations" |
|
||||||
description: "Table Operations" |
|
||||||
position: 510 |
|
||||||
category: "Product" |
|
||||||
menuTitle: "Table Operations" |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
Once you have created a new NocoDB project you can open it, In the browser, the URL would be like `example.com/dashboard/#/nc/project_id`. |
|
||||||
|
|
||||||
## Table |
|
||||||
|
|
||||||
### Table Create |
|
||||||
|
|
||||||
Now you can start creating new tables by simply clicking one of the following options. |
|
||||||
|
|
||||||
![table_create](https://user-images.githubusercontent.com/61551451/126771744-063f22da-6def-43fe-b9ef-1744d104db9d.png) |
|
||||||
|
|
||||||
On click, in modal popup, enter the table name, enable/disable default columns and click `Submit` button. |
|
||||||
|
|
||||||
![table_create_modal](https://user-images.githubusercontent.com/61551451/126772859-5a301c45-d830-4df2-a05a-43b15dd77728.png) |
|
||||||
|
|
||||||
> You can't disable the `id` column since NocoDB need's a primary column for every table. |
|
||||||
|
|
||||||
After the successful submission, the table will be created and open as a new tab. |
|
||||||
|
|
||||||
|
|
||||||
![TableCreated](https://user-images.githubusercontent.com/86527202/144402089-b5e35564-80d5-4105-9e00-7e3e1c4a5030.png) |
|
||||||
|
|
||||||
|
|
||||||
### Table Rename |
|
||||||
|
|
||||||
Right click on Table name on left hand project-tree menu, select `Rename` |
|
||||||
In modal popup, enter new table name and click `Submit` button |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144403447-1b2e4368-eb2b-40c0-901a-54e8adf9a80c.png" width="60%"/> |
|
||||||
|
|
||||||
|
|
||||||
### Table Delete |
|
||||||
|
|
||||||
The table can be deleted using the `delete` icon present in the toolbar within the table tab. |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144403591-5d3d36eb-64b7-4057-9244-56a95b47b97b.png" width="60%"/> |
|
||||||
|
|
||||||
|
|
||||||
## Column |
|
||||||
|
|
||||||
### Column Add |
|
||||||
|
|
||||||
Click the `+` icon on the right corner of the table. |
|
||||||
|
|
||||||
![Pasted_Image_23_07_21__4_39_PM](https://user-images.githubusercontent.com/61551451/126773798-4470d632-69e0-4f5f-803b-e3597715fe22.png) |
|
||||||
|
|
||||||
After the click, it will show a menu and you can enter the column name and choose the column type ([Abstract type](./abstract-types)). |
|
||||||
Click `Save`button to create the new column. |
|
||||||
|
|
||||||
![image](https://user-images.githubusercontent.com/61551451/126774157-ae9af236-e1ad-4a54-adb7-1b96775cae57.png) |
|
||||||
|
|
||||||
& we have new column created as part of our table |
|
||||||
![Pasted_Image_23_07_21__4_43_PM](https://user-images.githubusercontent.com/61551451/126774276-e947f510-2fe1-4595-afc1-a31d2c35a69a.png) |
|
||||||
|
|
||||||
> For more about Abstract type [click here](./abstract-types). |
|
||||||
|
|
||||||
### Column Edit |
|
||||||
To edit column properties, click/hover on down arrow, select `Edit` from the menu. |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144404169-80d8b514-53cf-4bb1-8323-fd3cfda8816b.png" width="50%"/> |
|
||||||
|
|
||||||
You will be able to edit column name & associated datatype using pop-up modal. |
|
||||||
For additional menu options, click `Show more options` |
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144404188-146ab0dc-bd2b-4902-9369-a34253e2fad6.png" width="40%"/> |
|
||||||
|
|
||||||
|
|
||||||
### Column Delete |
|
||||||
|
|
||||||
Column deletion can be done by using the `delete` option from the column header menu. |
|
||||||
|
|
||||||
![Pasted_Image_23_07_21__6_49_PM](https://user-images.githubusercontent.com/61551451/126787679-562aaa22-14b3-4ff8-8057-b8219e057110.png) |
|
||||||
|
|
||||||
## Row |
|
||||||
|
|
||||||
For adding new values to the table we need new rows, new rows can be added in two methods. |
|
||||||
|
|
||||||
### Row Add (Using Form) |
|
||||||
|
|
||||||
- Click the `+` icon in the toolbar of the table tab. |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144405563-50573b1c-1bd3-43ea-8020-357fc7ef9e42.png" width="50%"/> |
|
||||||
- Now it will open a modal Form to enter the values, provide the values and press the save button. |
|
||||||
<img src="https://user-images.githubusercontent.com/61551451/126784347-b82f9dfd-4c6d-4d65-be07-80e051ff19de.png" width="75%"> |
|
||||||
- After saving it will be there on your table. |
|
||||||
![image](https://user-images.githubusercontent.com/61551451/126785340-e9b80ad0-ba06-4a22-8a01-876d829c9673.png) |
|
||||||
|
|
||||||
### Row Add (Using Table Row at bottom of page) |
|
||||||
|
|
||||||
- Click the bottom row of the table which contains `+` icon at the beginning. |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144405773-bb0d00ef-264d-4941-b01f-3b7f0b1fc54d.png" width="40%"/> |
|
||||||
- Now it will add a new row in the table |
|
||||||
|
|
||||||
### Row Edit |
|
||||||
You can start editing by any of the following methods |
|
||||||
- Double click on cell to edit |
|
||||||
- Click on cell and start typing (this way it will clear the previous content) |
|
||||||
- Click on cell and press enter to start editing |
|
||||||
- And it will automatically save on blur event or if inactive. |
|
||||||
|
|
||||||
### Row Delete |
|
||||||
|
|
||||||
Right-click on anywhere in the row and then from the context menu select `Delete Row` option. |
|
||||||
Bulk delete is also possible by selecting multiple rows by using the checkbox in first column and then `Delete Selected Rows` options from the right click context menu. |
|
||||||
<img src="https://user-images.githubusercontent.com/86527202/144406191-ccff1382-e808-44e8-babe-bd937faf1b3d.png" width="40%"/> |
|
||||||
|
|
||||||
|
|
@ -1,109 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Team & Auth' |
|
||||||
description: 'Breakdown of roles & permissions for team user management' |
|
||||||
position: 620 |
|
||||||
category: 'Product' |
|
||||||
menuTitle: 'Team & Auth' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
## How to Add a User |
|
||||||
1. On the left panel, click on "Team & Auth": |
|
||||||
[](https://user-images.githubusercontent.com/55474996/142497814-c52e12e5-5ab5-41e7-ac48-2b6af5f31fdd.png) |
|
||||||
|
|
||||||
2. Make sure you are on the "Users Management" tab. Click on "New User": |
|
||||||
|
|
||||||
[](https://user-images.githubusercontent.com/55474996/142498070-60c5a861-0e8e-49e9-8830-42f54aa1fbf1.png) |
|
||||||
| ![1a](https://user-images.githubusercontent.com/86527202/149292053-e6dfef1e-9627-47a7-98ad-8a3b2f61591b.png) | |
|
||||||
| ------ | |
|
||||||
|
|
||||||
3. Enter the person's `EMAIL` |
|
||||||
4. Select `ROLE` |
|
||||||
5. Click `Invite` |
|
||||||
> You can add multiple comma (,) seperated emails |
|
||||||
[](https://user-images.githubusercontent.com/55474996/142498163-032187e4-d375-4542-8211-e986880a2bb0.png) |
|
||||||
|
|
||||||
| ![2 1](https://user-images.githubusercontent.com/86527202/149291166-d28a65b7-195a-4233-97a9-a3c2259c9fc8.png) | |
|
||||||
| ------ | |
|
||||||
|
|
||||||
If you do not have an SMTP sender configured, make sure to copy the invite link and manually send it to your collaborator: |
|
||||||
[](https://user-images.githubusercontent.com/55474996/142498376-ff52276b-92d8-4aca-8c47-fd7efea50ab6.png) |
|
||||||
|
|
||||||
| ![3](https://user-images.githubusercontent.com/86527202/149291202-967f164b-8ddc-4240-a470-ce8b4e0c2d41.png) | |
|
||||||
| ------ | |
|
||||||
| ![4](https://user-images.githubusercontent.com/86527202/149291223-dfc9e24b-658d-45fb-a0d5-c9773162bfbe.png) | |
|
||||||
|
|
||||||
|
|
||||||
## Explanation of User Role Permissions |
|
||||||
|
|
||||||
### Advanced options & configurations |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
| Audit | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| App Store | ✅ | ❌ | ❌ | ❌ | ❌ | |
|
||||||
| Team & Auth | ✅ | ❌ | ❌ | ❌ | ❌ | |
|
||||||
| Project Metadata | ✅ | ❌ | ❌ | ❌ | ❌ | |
|
||||||
| New user: Add Owner | ✅ | ❌ | ❌ | ❌ | ❌ | |
|
||||||
| New user: Add Creator | ✅ | ❌ | ❌ | ❌ | ❌ | |
|
||||||
| New user: Add Editor | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| New user: Add Commenter | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| New user: Add Viewer | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| View existing users | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| Preview mode | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
|
|
||||||
|
|
||||||
### Schema options |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
| Add table | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| Delete table | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| Modify table | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| Add column | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| Delete column | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| Modify column | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
|
|
||||||
|
|
||||||
### Record options |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
| Add row | ✅ | ✅ | ✅ | ❌ | ❌ | |
|
||||||
| Delete row | ✅ | ✅ | ✅ | ❌ | ❌ | |
|
||||||
| Modify row/ cell | ✅ | ✅ | ✅ | ❌ | ❌ | |
|
||||||
| Expand row | ✅ | ✅ | ✅ | ❌ | ❌ | |
|
||||||
| Right click on cell (add/edit row) | ✅ | ✅ | ✅ | ❌ | ❌ | |
|
||||||
| View table data (cell) contents | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
### Comments |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
| View comments from others | ✅ | ✅ | ✅ | ✅ | ❌ | |
|
||||||
| Add comments | ✅ | ✅ | ✅ | ✅ | ❌ | |
|
||||||
|
|
||||||
### Views |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
| Create new view | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
| Share view | ✅ | ✅ | ❌ | ❌ | ❌ | |
|
||||||
|
|
||||||
### Project generals |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
| Created views access | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
| Filter fields/ Column | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
| Filter fields/ Query | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
| Sort fields | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
| Theme | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
| Auth token | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
| Project Info | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
| Swagger API | ✅ | ✅ | ✅ | ✅ | ✅ | |
|
||||||
|
|
||||||
### Automations |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
|
|
||||||
### App store |
|
||||||
| | Owner | Creator | Editor | Commenter | Viewer | |
|
||||||
| :-- | :-: | :-: | :-: | :-: | :-: | |
|
||||||
|
|
||||||
|
|
@ -1,71 +0,0 @@ |
|||||||
--- |
|
||||||
title: 'Usage Information' |
|
||||||
description: 'Non-sensitive and anonymous usage information' |
|
||||||
position: 900 |
|
||||||
category: 'Product' |
|
||||||
menuTitle: 'Usage Information' |
|
||||||
--- |
|
||||||
|
|
||||||
<announcement></announcement> |
|
||||||
|
|
||||||
NocoDB is a fast growing open source project which is UI heavy and we are committed to providing a solution that exceeds the expectations of the users and community. |
|
||||||
We are also committed to continuing to develop and make NocoDB even better than it is today. |
|
||||||
To that end, NocoDB contains a feature in which anonymous and otherwise non-sensitive data is collected. |
|
||||||
This anonymous and non-sensitive data gives a better understanding of how users are interacting and using the product. |
|
||||||
|
|
||||||
## Context |
|
||||||
We will always continue to do hands-on UI/UX testing, surveys, issue tracking and roadmap. |
|
||||||
Otherwise talk with the Community while striving to understand |
|
||||||
and deliver what is being asked for and what is needed, by any means available. |
|
||||||
|
|
||||||
However, these above actions alone are often insufficient |
|
||||||
- To maintain an overall picture of the product usage. |
|
||||||
- Prioritising the efforts. |
|
||||||
- Impact of any breaking changes. |
|
||||||
- To understand whether UI improvements are helpful to users. |
|
||||||
|
|
||||||
## What we collect ? |
|
||||||
We collect actions made on models (project, table, view, sharedView, user, hook, image, sharedBase etc) periodically with : |
|
||||||
- Unique machine ID (generated with node-machine-id) |
|
||||||
- Environment (dev, staging, production) |
|
||||||
- System information (OS, node version, docker or npm) |
|
||||||
- Failures. |
|
||||||
|
|
||||||
Here is an example : |
|
||||||
``` |
|
||||||
{ |
|
||||||
"machine_id" : "a0885e8e6a38d9fbb5d39e7d04a44da7773d4f", |
|
||||||
"evt_type": "project:created" |
|
||||||
"package_id" : "0.84.15", |
|
||||||
"os_type" : "Linux", |
|
||||||
"os_platform" : "linux", |
|
||||||
"os_release" : "5.10.25-linuxkit", |
|
||||||
"node_version" : "14.18.2", |
|
||||||
"docker" : "true", |
|
||||||
"xc_version" : "0.84.15", |
|
||||||
"env" : "dev", |
|
||||||
} |
|
||||||
|
|
||||||
``` |
|
||||||
|
|
||||||
Our UI Dashboard is a Vuejs-Nuxtjs app. Actions taken on UI with completely anonymized route names are sent as payload. |
|
||||||
|
|
||||||
Here is an example : |
|
||||||
``` |
|
||||||
{ |
|
||||||
"id": "a0885e8e6a38d9fbb5d39e7d04a44da7773d4f", |
|
||||||
"event": "table:create", |
|
||||||
"path": "/nc/:project_id", |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
## What we DO NOT collect ? |
|
||||||
We do not collect any private or sensitive information, such as: |
|
||||||
- Personally identifiable information |
|
||||||
- Credential information (endpoints, ports, DB connections, username/password) |
|
||||||
- User data |
|
||||||
|
|
||||||
|
|
||||||
## Opt-out |
|
||||||
To disable usage information collection please set following environment variable. |
|
||||||
> NC_DISABLE_TELE=true |
|
@ -1,11 +0,0 @@ |
|||||||
{ |
|
||||||
"title": "NocoDB", |
|
||||||
"url": "https://docs.nocodb.com", |
|
||||||
"logo": { |
|
||||||
"light": "/favicon-128.png", |
|
||||||
"dark": "/favicon-128.png" |
|
||||||
}, |
|
||||||
"github": "nocodb/nocodb", |
|
||||||
"defaultDir": "packages/noco-docs", |
|
||||||
"twitter": "@nocodb" |
|
||||||
} |
|
@ -1,11 +0,0 @@ |
|||||||
import theme from '@nuxt/content-theme-docs' |
|
||||||
|
|
||||||
export default theme({ |
|
||||||
docs: { |
|
||||||
primaryColor: '#3282ff' |
|
||||||
}, |
|
||||||
css: [ |
|
||||||
"./assets/main.css" |
|
||||||
] |
|
||||||
}) |
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,15 +0,0 @@ |
|||||||
{ |
|
||||||
"name": "noco-docs-prev", |
|
||||||
"version": "1.0.0", |
|
||||||
"license": "MIT", |
|
||||||
"scripts": { |
|
||||||
"dev": "nuxt", |
|
||||||
"build": "nuxt build", |
|
||||||
"start": "nuxt start", |
|
||||||
"generate": "nuxt generate" |
|
||||||
}, |
|
||||||
"dependencies": { |
|
||||||
"@nuxt/content-theme-docs": "0.7.2", |
|
||||||
"nuxt": "^2.15.2" |
|
||||||
} |
|
||||||
} |
|
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 982 B |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 3.2 KiB |
@ -0,0 +1,178 @@ |
|||||||
|
--- |
||||||
|
title: "Writing Tests" |
||||||
|
description: "Overview to testing" |
||||||
|
position: 3250 |
||||||
|
category: "Engineering" |
||||||
|
menuTitle: "Testing" |
||||||
|
--- |
||||||
|
|
||||||
|
## API Tests |
||||||
|
|
||||||
|
### Pre-requisites |
||||||
|
- MySQL is preferrable - however we fallback to SQLite |
||||||
|
|
||||||
|
### Setup |
||||||
|
``` |
||||||
|
cp scripts/.env.copy scripts/.env |
||||||
|
open scripts/.env |
||||||
|
|
||||||
|
# Edit the following env variables |
||||||
|
# `DB_USER` : mysql username |
||||||
|
# `DB_PASSWORD` : mysql password |
||||||
|
# `DB_HOST` : mysql host |
||||||
|
# `DB_PORT` : mysql port |
||||||
|
``` |
||||||
|
|
||||||
|
### Running tests |
||||||
|
``` |
||||||
|
cd packages/nocodb |
||||||
|
npm run test:unit |
||||||
|
``` |
||||||
|
|
||||||
|
### Notes |
||||||
|
|
||||||
|
#### Key points |
||||||
|
- All individual unit tests are independent of each other. We don't use any shared state between tests. |
||||||
|
- Test environment includes `sakila` sample database and any change to it by a test is reverted before running other tests. |
||||||
|
- While running unit tests, it tries to connect to mysql server running on `localhost:3306` with username `root` and password `password`(which can be configured) and if not found, it will use `sqlite` as a fallback, hence no requirement of any sql server to run tests. |
||||||
|
|
||||||
|
#### Walk through of writing a unit test |
||||||
|
We will create an `Table` test suite as an example. |
||||||
|
|
||||||
|
|
||||||
|
##### Configure test |
||||||
|
|
||||||
|
We will configure `beforeEach` which is called before each test is executed. We will use `init` function from `nocodb/packages/tests/unit/init/index.ts`, which is a helper function which configures the test environment(i.e resetting state, etc.). |
||||||
|
|
||||||
|
`init` does the following things - |
||||||
|
|
||||||
|
- It initializes a `Noco` instance(reused in all tests). |
||||||
|
- Restores `meta` and `sakila` database to its initial state. |
||||||
|
- Creates the root user. |
||||||
|
- Returns `context` which has `auth token` for the created user, node server instance(`app`), and `dbConfig`. |
||||||
|
|
||||||
|
We will use `createProject` and `createProject` factories to create a project and a table. |
||||||
|
|
||||||
|
```typescript |
||||||
|
let context; |
||||||
|
|
||||||
|
beforeEach(async function () { |
||||||
|
context = await init(); |
||||||
|
|
||||||
|
project = await createProject(context); |
||||||
|
table = await createTable(context, project); |
||||||
|
}); |
||||||
|
``` |
||||||
|
|
||||||
|
##### Test case |
||||||
|
|
||||||
|
We will use `it` function to create a test case. We will use `supertest` to make a request to the server. We use `expect`(`chai`) to assert the response. |
||||||
|
|
||||||
|
```typescript |
||||||
|
it('Get table list', async function () { |
||||||
|
const response = await request(context.app) |
||||||
|
.get(`/api/v1/db/meta/projects/${project.id}/tables`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.send({}) |
||||||
|
.expect(200); |
||||||
|
|
||||||
|
expect(response.body.list).to.be.an('array').not.empty; |
||||||
|
}); |
||||||
|
``` |
||||||
|
|
||||||
|
##### Integrating the new test suite |
||||||
|
|
||||||
|
We create a new file `table.test.ts` in `packages/nocodb/tests/unit/rest/tests` directory. |
||||||
|
|
||||||
|
```typescript |
||||||
|
import 'mocha'; |
||||||
|
import request from 'supertest'; |
||||||
|
import init from '../../init'; |
||||||
|
import { createTable, getAllTables } from '../../factory/table'; |
||||||
|
import { createProject } from '../../factory/project'; |
||||||
|
import { defaultColumns } from '../../factory/column'; |
||||||
|
import Model from '../../../../src/lib/models/Model'; |
||||||
|
import { expect } from 'chai'; |
||||||
|
|
||||||
|
function tableTest() { |
||||||
|
let context; |
||||||
|
let project; |
||||||
|
let table; |
||||||
|
|
||||||
|
beforeEach(async function () { |
||||||
|
context = await init(); |
||||||
|
|
||||||
|
project = await createProject(context); |
||||||
|
table = await createTable(context, project); |
||||||
|
}); |
||||||
|
|
||||||
|
it('Get table list', async function () { |
||||||
|
const response = await request(context.app) |
||||||
|
.get(`/api/v1/db/meta/projects/${project.id}/tables`) |
||||||
|
.set('xc-auth', context.token) |
||||||
|
.send({}) |
||||||
|
.expect(200); |
||||||
|
|
||||||
|
expect(response.body.list).to.be.an('array').not.empty; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
export default function () { |
||||||
|
describe('Table', tableTests); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
We can then import the `Table` test suite to `Rest` test suite in `packages/nocodb/tests/unit/rest/index.test.ts` file(`Rest` test suite is imported in the root test suite file which is `packages/nocodb/tests/unit/index.test.ts`). |
||||||
|
|
||||||
|
#### Running test |
||||||
|
|
||||||
|
To run tests, run `npm run test:unit` in `packages/nocodb` directory. |
||||||
|
|
||||||
|
> NOTE: We can also run individual test by using `.only` in `describe` or `it` function and the running the test command. |
||||||
|
|
||||||
|
```typescript |
||||||
|
it.only('Get table list', async () => { |
||||||
|
``` |
||||||
|
|
||||||
|
#### Folder structure |
||||||
|
|
||||||
|
The root folder for unit tests is `packages/tests/unit` |
||||||
|
|
||||||
|
- `rest` folder contains all the test suites for rest apis. |
||||||
|
- `model` folder contains all the test suites for models. |
||||||
|
- `factory` folder contains all the helper functions to create test data. |
||||||
|
- `init` folder contains helper functions to configure test environment. |
||||||
|
- `index.test.ts` is the root test suite file which imports all the test suites. |
||||||
|
- `TestDbMngr.ts` is a helper class to manage test databases (i.e. creating, dropping, etc.). |
||||||
|
|
||||||
|
#### Patterns to follow |
||||||
|
|
||||||
|
- **Factories** |
||||||
|
- Use factories for create/update/delete data. No data should be directly create/updated/deleted in the test. |
||||||
|
- While writing a factory make sure that it can be used with as less parameters as possible and use default values for other parameters. |
||||||
|
- Use named parameters for factories. |
||||||
|
|
||||||
|
``` typescript |
||||||
|
createUser({ email, password}) |
||||||
|
``` |
||||||
|
|
||||||
|
- Use one file per factory. |
||||||
|
|
||||||
|
#### Using sakila db |
||||||
|
To use sakila db use `createSakilaProject` from `factory/project` to create a project. This project will be seeded with `sakila` tables. |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Cypress Tests |
||||||
|
|
||||||
|
### Pre-requisites |
||||||
|
> TODO |
||||||
|
|
||||||
|
### Setup |
||||||
|
> TODO |
||||||
|
|
||||||
|
### Running tests |
||||||
|
> TODO |
||||||
|
|
||||||
|
### Notes |
||||||
|
> TODO |
Loading…
Reference in new issue